// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "tabg.h"
#endif
#pragma hdrstop
#endif
+#if wxUSE_TAB_DIALOG
+
#ifndef WX_PRECOMP
-#include "wx/wx.h"
+ #include "wx/settings.h"
+ #include "wx/intl.h"
+ #include "wx/dcclient.h"
#endif
#include <stdio.h>
#include <math.h>
#include "wx/tab.h"
+#include "wx/listimpl.cpp"
+
+WX_DEFINE_LIST(wxTabLayerList);
// not defined: use old, square tab implementation (fills in tabs)
// defined: use new, rounded tab implementation (doesn't colour in tabs)
IMPLEMENT_DYNAMIC_CLASS(wxTabControl, wxObject)
-IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList)
+// IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList)
wxTabControl::wxTabControl(wxTabView *v)
{
int topY = m_view->GetViewRect().y - m_view->GetTopMargin();
- int maxPositions = ((wxTabLayer *)m_view->GetLayers().Nth(0)->Data())->Number();
+ int maxPositions = ((wxTabLayer *)m_view->GetLayers().Item(0)->GetData())->GetCount();
// Only down to the bottom of the tab, not to the top of the view
if ( GetRowPosition() < (maxPositions - 1) )
// TAB is not selected - just draw TAB outline and RH edge
// if the TAB is the last in the row
- int maxPositions = ((wxTabLayer*)m_view->GetLayers().Nth(0)->Data())->Number();
+ int maxPositions = ((wxTabLayer*)m_view->GetLayers().Item(0)->GetData())->GetCount();
wxTabControl* tabBelow = 0;
wxTabControl* tabBelowRight = 0;
if (GetColPosition() > 0)
m_shadowPen = wxGREY_PEN;
m_backgroundPen = wxLIGHT_GREY_PEN;
m_backgroundBrush = wxLIGHT_GREY_BRUSH;
- m_tabFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
- m_tabSelectedFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+ m_tabFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ m_tabSelectedFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
m_window = (wxWindow *) NULL;
}
wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab)
{
// First, find which layer we should be adding to.
- wxNode *node = m_layers.Last();
+ wxTabLayerList::compatibility_iterator node = m_layers.GetLast();
if (!node)
{
wxTabLayer *newLayer = new wxTabLayer;
}
// Check if adding another tab control would go off the
// right-hand edge of the layer.
- wxTabLayer *tabLayer = (wxTabLayer *)node->Data();
- wxNode *lastTabNode = tabLayer->Last();
+ wxTabLayer *tabLayer = (wxTabLayer *)node->GetData();
+ wxList::compatibility_iterator lastTabNode = tabLayer->GetLast();
if (lastTabNode)
{
- wxTabControl *lastTab = (wxTabControl *)lastTabNode->Data();
+ wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData();
// Start another layer (row).
// Tricky choice: can't just check if will be overlapping the edge, because
// this happens anyway for 2nd and subsequent rows.
// Should check this for 1st row, and then subsequent rows should not exceed 1st
// in length.
- if (((tabLayer == m_layers.First()->Data()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
+ if (((tabLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
> GetViewRect().width)) ||
- ((tabLayer != m_layers.First()->Data()) && (tabLayer->Number() == ((wxTabLayer *)m_layers.First()->Data())->Number())))
+ ((tabLayer != m_layers.GetFirst()->GetData()) && (tabLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount())))
{
tabLayer = new wxTabLayer;
m_layers.Append(tabLayer);
- lastTabNode = (wxNode *) NULL;
+ lastTabNode = wxList::compatibility_iterator();
}
}
- int layer = m_layers.Number() - 1;
+ int layer = m_layers.GetCount() - 1;
wxTabControl *tabControl = existingTab;
if (!existingTab)
tabControl = OnCreateTabControl();
- tabControl->SetRowPosition(tabLayer->Number());
+ tabControl->SetRowPosition(tabLayer->GetCount());
tabControl->SetColPosition(layer);
wxTabControl *lastTab = (wxTabControl *) NULL;
if (lastTabNode)
- lastTab = (wxTabControl *)lastTabNode->Data();
+ lastTab = (wxTabControl *)lastTabNode->GetData();
// Top of new tab
int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight());
// Remove the tab without deleting the window
bool wxTabView::RemoveTab(int id)
{
- wxNode *layerNode = m_layers.First();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (tab->GetId() == id)
{
if (id == m_tabSelection)
m_tabSelection = -1;
delete tab;
- delete tabNode;
+ layer->Erase(tabNode);
m_noTabs --;
// The layout has changed
LayoutTabs();
return TRUE;
}
- tabNode = tabNode->Next();
+ tabNode = tabNode->GetNext();
}
- layerNode = layerNode->Next();
+ layerNode = layerNode->GetNext();
}
return FALSE;
}
{
int minY = 0;
- wxNode *layerNode = m_layers.First();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (tab->GetY() < minY)
minY = tab->GetY();
- tabNode = tabNode->Next();
+ tabNode = tabNode->GetNext();
}
- layerNode = layerNode->Next();
+ layerNode = layerNode->GetNext();
}
return - minY;
void wxTabView::ClearTabs(bool deleteTabs)
{
- wxNode *layerNode = m_layers.First();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (deleteTabs)
delete tab;
- wxNode *next = tabNode->Next();
- delete tabNode;
+ wxList::compatibility_iterator next = tabNode->GetNext();
+ layer->Erase(tabNode);
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->Next();
+ wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext();
delete layer;
- delete layerNode;
+ m_layers.Erase(layerNode);
layerNode = nextLayerNode;
}
m_noTabs = 0;
+ m_tabSelection = -1;
}
// Make a list of the tab controls, deleting the wxTabLayers.
wxList controls;
- wxNode *layerNode = m_layers.First();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
controls.Append(tab);
- wxNode *next = tabNode->Next();
- delete tabNode;
+ wxList::compatibility_iterator next = tabNode->GetNext();
+ layer->Erase(tabNode);
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->Next();
+ wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext();
delete layer;
- delete layerNode;
+ m_layers.Erase(layerNode);
layerNode = nextLayerNode;
}
wxTabLayer *currentLayer = new wxTabLayer;
m_layers.Append(currentLayer);
- wxNode *node = controls.First();
+ wxList::compatibility_iterator node = controls.GetFirst();
while (node)
{
- wxTabControl *tabControl = (wxTabControl *)node->Data();
+ wxTabControl *tabControl = (wxTabControl *)node->GetData();
if (lastTab)
{
// Start another layer (row).
// this happens anyway for 2nd and subsequent rows.
// Should check this for 1st row, and then subsequent rows should not exceed 1st
// in length.
- if (((currentLayer == m_layers.First()->Data()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
+ if (((currentLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
> GetViewRect().width)) ||
- ((currentLayer != m_layers.First()->Data()) && (currentLayer->Number() == ((wxTabLayer *)m_layers.First()->Data())->Number())))
+ ((currentLayer != m_layers.GetFirst()->GetData()) && (currentLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount())))
{
currentLayer = new wxTabLayer;
m_layers.Append(currentLayer);
}
}
- int layer = m_layers.Number() - 1;
+ int layer = m_layers.GetCount() - 1;
- tabControl->SetRowPosition(currentLayer->Number());
+ tabControl->SetRowPosition(currentLayer->GetCount());
tabControl->SetColPosition(layer);
// Top of new tab
currentLayer->Append(tabControl);
lastTab = tabControl;
- node = node->Next();
+ node = node->GetNext();
}
// Move the selected tab to the bottom
}
// Draw layers in reverse order
- wxNode *node = m_layers.Last();
+ wxTabLayerList::compatibility_iterator node = m_layers.GetLast();
while (node)
{
- wxTabLayer *layer = (wxTabLayer *)node->Data();
- wxNode *node2 = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)node->GetData();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *control = (wxTabControl *)node2->Data();
- control->OnDraw(dc, (node2->Next() == NULL));
- node2 = node2->Next();
+ wxTabControl *control = (wxTabControl *)node2->GetData();
+ control->OnDraw(dc, (!node2->GetNext()));
+ node2 = node2->GetNext();
}
- node = node->Previous();
+ node = node->GetPrevious();
}
wxTabControl *hitControl = (wxTabControl *) NULL;
- wxNode *node = m_layers.First();
+ wxTabLayerList::compatibility_iterator node = m_layers.GetFirst();
while (node)
{
- wxTabLayer *layer = (wxTabLayer *)node->Data();
- wxNode *node2 = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)node->GetData();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *control = (wxTabControl *)node2->Data();
+ wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->HitTest((int)x, (int)y))
{
hitControl = control;
- node = (wxNode *) NULL;
- node2 = (wxNode *) NULL;
+ node = wxTabLayerList::compatibility_iterator();
+ node2 = wxList::compatibility_iterator();
}
else
- node2 = node2->Next();
+ node2 = node2->GetNext();
}
if (node)
- node = node->Next();
+ node = node->GetNext();
}
if (!hitControl)
if (control == currentTab)
return TRUE;
- if (m_layers.Number() == 0)
+ if (m_layers.GetCount() == 0)
return FALSE;
if (!OnTabPreActivate(control->GetId(), oldTab))
// without calling app activation code
bool wxTabView::MoveSelectionTab(wxTabControl *control)
{
- if (m_layers.Number() == 0)
+ if (m_layers.GetCount() == 0)
return FALSE;
- wxTabLayer *firstLayer = (wxTabLayer *)m_layers.First()->Data();
+ wxTabLayer *firstLayer = (wxTabLayer *)m_layers.GetFirst()->GetData();
// Find what column this tab is at, so we can swap with the one at the bottom.
// If we're on the bottom layer, then no need to swap.
{
// Do a swap
int col = 0;
- wxNode *thisNode = FindTabNodeAndColumn(control, &col);
+ wxList::compatibility_iterator thisNode = FindTabNodeAndColumn(control, &col);
if (!thisNode)
return FALSE;
- wxNode *otherNode = firstLayer->Nth(col);
+ wxList::compatibility_iterator otherNode = firstLayer->Item(col);
if (!otherNode)
return FALSE;
if (otherNode == thisNode)
return TRUE;
- wxTabControl *otherTab = (wxTabControl *)otherNode->Data();
+ wxTabControl *otherTab = (wxTabControl *)otherNode->GetData();
// We now have pointers to the tab to be changed to,
// and the tab on the first layer. Swap tab structures and
void wxTabView::SetTabSelection(int sel, bool activateTool)
{
+ if ( sel==m_tabSelection )
+ return;
+
int oldSel = m_tabSelection;
wxTabControl *control = FindTabControlForId(sel);
wxTabControl *oldControl = FindTabControlForId(m_tabSelection);
// Find tab control for id
wxTabControl *wxTabView::FindTabControlForId(int id) const
{
- wxNode *node1 = m_layers.First();
+ wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
- wxTabLayer *layer = (wxTabLayer *)node1->Data();
- wxNode *node2 = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)node1->GetData();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *control = (wxTabControl *)node2->Data();
+ wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->GetId() == id)
return control;
- node2 = node2->Next();
+ node2 = node2->GetNext();
}
- node1 = node1->Next();
+ node1 = node1->GetNext();
}
return (wxTabControl *) NULL;
}
// Find tab control for layer, position (starting from zero)
wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const
{
- wxNode *node1 = m_layers.Nth(layer);
+ wxTabLayerList::compatibility_iterator node1 = m_layers.Item(layer);
if (!node1)
return (wxTabControl *) NULL;
- wxTabLayer *tabLayer = (wxTabLayer *)node1->Data();
- wxNode *node2 = tabLayer->Nth(position);
+ wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
+ wxList::compatibility_iterator node2 = tabLayer->Item(position);
if (!node2)
return (wxTabControl *) NULL;
- return (wxTabControl *)node2->Data();
+ return (wxTabControl *)node2->GetData();
}
// Find the node and the column at which this control is positioned.
-wxNode *wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const
+wxList::compatibility_iterator wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const
{
- wxNode *node1 = m_layers.First();
+ wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
- wxTabLayer *layer = (wxTabLayer *)node1->Data();
+ wxTabLayer *layer = (wxTabLayer *)node1->GetData();
int c = 0;
- wxNode *node2 = layer->First();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *cnt = (wxTabControl *)node2->Data();
+ wxTabControl *cnt = (wxTabControl *)node2->GetData();
if (cnt == control)
{
*col = c;
return node2;
}
- node2 = node2->Next();
+ node2 = node2->GetNext();
c ++;
}
- node1 = node1->Next();
+ node1 = node1->GetNext();
}
- return (wxNode *) NULL;
+ return wxList::compatibility_iterator();
}
int wxTabView::CalculateTabWidth(int noTabs, bool adjustView)
IMPLEMENT_CLASS(wxPanelTabView, wxTabView)
-wxPanelTabView::wxPanelTabView(wxPanel *pan, long style): wxTabView(style), m_tabWindows(wxKEY_INTEGER)
+wxPanelTabView::wxPanelTabView(wxPanel *pan, long style)
+ : wxTabView(style)
{
m_panel = pan;
m_currentWindow = (wxWindow *) NULL;
void wxPanelTabView::AddTabWindow(int id, wxWindow *window)
{
- m_tabWindows.Append((long)id, window);
+ wxASSERT(m_tabWindows.find(id) == m_tabWindows.end());
+ m_tabWindows[id] = window;
window->Show(FALSE);
}
wxWindow *wxPanelTabView::GetTabWindow(int id) const
{
- wxNode *node = m_tabWindows.Find((long)id);
- if (!node)
- return (wxWindow *) NULL;
- return (wxWindow *)node->Data();
+ wxIntToWindowHashMap::const_iterator it = m_tabWindows.find(id);
+ return it == m_tabWindows.end() ? NULL : it->second;
}
void wxPanelTabView::ClearWindows(bool deleteWindows)
{
if (deleteWindows)
- m_tabWindows.DeleteContents(TRUE);
- m_tabWindows.Clear();
- m_tabWindows.DeleteContents(FALSE);
+ WX_CLEAR_HASH_MAP(wxIntToWindowHashMap, m_tabWindows);
+ m_tabWindows.clear();
}
void wxPanelTabView::ShowWindowForTab(int id)
newWindow->Refresh();
}
+#endif // wxUSE_TAB_DIALOG