Well, I ended up going a different direction and using codebehind to do what I wanted. Here's what I ended up with.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
var loadPage = function(tabPanel, node) {
var tab = tabPanel.getItem(node.id);
if (!tab) {
tab = tabPanel.add({
id: node.id,
title: node.text,
closable: true,
autoLoad: {
showMask: true,
url: node.attributes.href,
mode: 'iframe',
maskMsg: 'Loading ' + node.attributes.href + '...'
}
});
}
tabPanel.setActiveTab(tab);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<ext:ScriptManager ID="ScriptManager2" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<ext:ViewPort ID="ViewPort1" runat="server">
<Body>
<ext:BorderLayout ID="BorderLayout1" runat="server">
<North Collapsible="True" Split="True">
<ext:Panel ID="Panel1" runat="server" Height="100" Title="North">
<Body>
</Body>
</ext:Panel>
</North>
<East Collapsible="true" Split="true">
<ext:Panel ID="Panel2" runat="server" Title="East" Width="175">
<Body>
<ext:FitLayout ID="FitLayout1" runat="server">
<ext:TabPanel ID="TabPanel1" runat="server" ActiveTabIndex="0" Border="false" TabPosition="Bottom"
Title="Title">
<Tabs>
<ext:Tab ID="Tab1" runat="server" Title="Tab 1">
<Body>
</Body>
</ext:Tab>
<ext:Tab ID="Tab2" runat="server" Title="Tab 2">
<Body>
</Body>
</ext:Tab>
</Tabs>
</ext:TabPanel>
</ext:FitLayout>
</Body>
</ext:Panel>
</East>
<South Collapsible="true" Split="true">
<ext:Panel ID="Panel3" runat="server" Height="100" Title="South">
<Body>
</Body>
</ext:Panel>
</South>
<West Collapsible="true" Split="true">
<ext:Panel ID="pnlWest" runat="server" Title="West" Width="175">
</ext:Panel>
</West>
<Center>
<ext:Panel ID="CenterPanel" runat="server" Title="Center">
<Body>
<ext:FitLayout ID="FitLayout2" runat="server">
<ext:TabPanel ID="Pages" runat="server" ActiveTabIndex="0" Border="false" Title="Center">
<Tabs>
<ext:Tab ID="Tab3" runat="server" Closable="true" Title="Tab 1">
<Body>
</Body>
</ext:Tab>
<ext:Tab ID="Tab4" runat="server" Title="Tab 2">
<Body>
</Body>
</ext:Tab>
</Tabs>
</ext:TabPanel>
</ext:FitLayout>
</Body>
</ext:Panel>
</Center>
</ext:BorderLayout>
</Body>
</ext:ViewPort>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />
</form>
</body>
</html>
protected void Page_Load(object sender, EventArgs e)
{
SiteMapNode siteMapRoot = SiteMap.RootNode;
Accordion accordion = new Accordion();
SiteMapNodeCollection children = siteMapRoot.ChildNodes;
if (children != null && children.Count > 0)
{
foreach (SiteMapNode mapNode in siteMapRoot.ChildNodes)
{
accordion.Items.Add(this.CreateTree(mapNode));
}
}
pnlWest.BodyControls.Add(accordion);
}
private TreePanel CreateTree (SiteMapNode siteMapNode)
{
TreePanel tree = new TreePanel();
tree.Title = siteMapNode.Title;
tree.RootVisible = false;
tree.Listeners.Click.Handler = "if(node.attributes.href){e.stopEvent();loadPage(#{Pages}, node);}";
Coolite.Ext.Web.TreeNode root = new Coolite.Ext.Web.TreeNode();
root.NodeID = "root";
tree.Root.Add(root);
SiteMapNodeCollection children = siteMapNode.ChildNodes;
if (children != null && children.Count > 0)
{
foreach (SiteMapNode mapNode in siteMapNode.ChildNodes)
{
Coolite.Ext.Web.TreeNode node1 = new Coolite.Ext.Web.TreeNode();
node1.NodeID = mapNode.Key;
node1.Text = mapNode.Title;
node1.Icon = (Icon)Enum.Parse(typeof(Icon), mapNode.Description);
node1.Href = mapNode.Url;
root.Nodes.Add(node1);
}
}
return tree;
}