bool NotifyClicked(Button button, int x, int y, Modifiers mods)
{
- if(curTab == (Tab)(intptr)button.id)
+ if(curTab == (Tab)(intptr)button.id && curTab.created)
return true;
//curButton.Activate();
curButton.MakeActive();
- if(curTab.Destroy(0))
+ if(!curTab || curTab == (Tab)(intptr)button.id || curTab.Destroy(0))
{
curButton.checked = false;
button.checked = true;
public void AddTab(Tab tab)
{
- tab.parent = this;
+ if(tab.parent != this)
+ {
+ tab.parent = this;
+ return;
+ }
tab.autoCreate = false;
tab.id = numTabs;
- tab.button = TabButton
+ if(!tab.button)
{
- parent = tabButtons,
- master = this, stayDown = true,
- text = tab.text, id = (int64)(intptr)tab, NotifyClicked = NotifyClicked,
- tab = tab,
- background = background;
- };
- incref tab.button;
+ tab.button = TabButton
+ {
+ parent = tabButtons,
+ master = this, stayDown = true,
+ text = tab.text, id = (int64)(intptr)tab, NotifyClicked = NotifyClicked,
+ tab = tab,
+ background = background;
+ };
+ incref tab.button;
+ }
if(created)
{
tab.button.Create();
- incref tab;
+ // This was causing leaks with RemoveTab / AddTab usage in Cartographer...
+ // RemoveTab() does not dec'ref...
+ // incref tab;
}
numTabs++;
{
Window child;
Tab fallbackTab = null;
- tab.parent = null;
+ // tab.parent = null;
for(child = tabButtons.children.first; child; child = child.next)
{
if(child._class == class(TabButton))
if(button.id == (int64)(intptr)tab)
{
if(button.created)
+ {
button.Destroy(0);
+ numTabs--;
+ }
break;
}
- else
+ else if(button.created)
fallbackTab = button.tab;
}
}
- if(curTab == tab)
+ if(curTab == tab && curTab.created)
{
if(!fallbackTab)
fallbackTab = tabButtons.children.first ? ((TabButton)tabButtons.children.first).tab : null;
- if(fallbackTab)
+ if(fallbackTab && fallbackTab.button.created)
fallbackTab.SelectTab();
+ else
+ {
+ curTab.Destroy(0);
+ curTab = null;
+ }
/*curTab = fallbackTab;
curButton = curTab.button;
curButton.checked = true;
curTab.autoCreate = true;*/
}
- numTabs--;
}
~TabControl()
button.NotifyClicked(button.master, button, 0, 0, 0);
}
+ public property bool isAdded
+ {
+ get { return button && button.created; }
+ }
+
watch(caption)
{
if(button)