#define WXTAB_VERSION 1.1
-#include "wx/hash.h"
+#include "wx/hashmap.h"
#include "wx/string.h"
#include "wx/dialog.h"
#include "wx/panel.h"
+#include "wx/list.h"
class WXDLLEXPORT wxTabView;
class WXDLLEXPORT wxTabLayer: public wxList
{
- DECLARE_DYNAMIC_CLASS(wxTabLayer)
};
/*
* The wxTabView controls and draws the tabbed object
*/
+WX_DECLARE_LIST(wxTabLayer, wxTabLayerList);
+
#define wxTAB_STYLE_DRAW_BOX 1 // Draws 3D boxes round tab layers
#define wxTAB_STYLE_COLOUR_INTERIOR 2 // Colours interior of tabs, otherwise draws outline
~wxTabView();
inline int GetNumberOfLayers() const { return m_layers.GetCount(); }
- inline wxList& GetLayers() { return m_layers; }
+ inline wxList& GetLayers() { return (wxList&)m_layers; }
inline void SetWindow(wxWindow* wnd) { m_window = wnd; }
inline wxWindow* GetWindow(void) const { return m_window; }
inline wxFont *GetSelectedTabFont() const { return (wxFont*) & m_tabSelectedFont; }
inline void SetSelectedTabFont(const wxFont& f) { m_tabSelectedFont = f; }
// Find the node and the column at which this control is positioned.
- wxNode *FindTabNodeAndColumn(wxTabControl *control, int *col) const ;
+ wxList::compatibility_iterator FindTabNodeAndColumn(wxTabControl *control, int *col) const ;
// Do the necessary to change to this tab
virtual bool ChangeTab(wxTabControl *control);
protected:
// List of layers, from front to back.
- wxList m_layers;
+ wxTabLayerList m_layers;
// Selected tab
int m_tabSelection;
DECLARE_EVENT_TABLE()
};
+WX_DECLARE_HASH_MAP(int, wxWindow*, wxIntegerHash, wxIntegerEqual,
+ wxIntToWindowHashMap);
+
class WXDLLEXPORT wxPanelTabView: public wxTabView
{
DECLARE_DYNAMIC_CLASS(wxPanelTabView)
inline wxWindow *GetCurrentWindow() const { return m_currentWindow; }
void ShowWindowForTab(int id);
- inline wxList& GetWindows() const { return (wxList&) m_tabWindows; }
+ // inline wxList& GetWindows() const { return (wxList&) m_tabWindows; }
protected:
// List of panels, one for each tab. Indexed
// by tab ID.
- wxList m_tabWindows;
- wxWindow* m_currentWindow;
- wxPanel* m_panel;
+ wxIntToWindowHashMap m_tabWindows;
+ wxWindow* m_currentWindow;
+ wxPanel* m_panel;
};
#endif
#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)
{
wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab)
{
// First, find which layer we should be adding to.
- wxNode *node = m_layers.GetLast();
+ 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->GetData();
- wxNode *lastTabNode = tabLayer->GetLast();
+ wxList::compatibility_iterator lastTabNode = tabLayer->GetLast();
if (lastTabNode)
{
wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData();
{
tabLayer = new wxTabLayer;
m_layers.Append(tabLayer);
- lastTabNode = (wxNode *) NULL;
+ lastTabNode = wxList::compatibility_iterator();
}
}
int layer = m_layers.GetCount() - 1;
// Remove the tab without deleting the window
bool wxTabView::RemoveTab(int id)
{
- wxNode *layerNode = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
- wxNode *tabNode = layer->GetFirst();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (id == m_tabSelection)
m_tabSelection = -1;
delete tab;
- delete tabNode;
+ layer->Erase(tabNode);
m_noTabs --;
// The layout has changed
{
int minY = 0;
- wxNode *layerNode = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
- wxNode *tabNode = layer->GetFirst();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
wxTabControl *tab = (wxTabControl *)tabNode->GetData();
void wxTabView::ClearTabs(bool deleteTabs)
{
- wxNode *layerNode = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
- wxNode *tabNode = layer->GetFirst();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (deleteTabs)
delete tab;
- wxNode *next = tabNode->GetNext();
- delete tabNode;
+ wxList::compatibility_iterator next = tabNode->GetNext();
+ layer->Erase(tabNode);
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->GetNext();
+ wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext();
delete layer;
- delete layerNode;
+ m_layers.Erase(layerNode);
layerNode = nextLayerNode;
}
m_noTabs = 0;
// Make a list of the tab controls, deleting the wxTabLayers.
wxList controls;
- wxNode *layerNode = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode)
{
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
- wxNode *tabNode = layer->GetFirst();
+ wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode)
{
wxTabControl *tab = (wxTabControl *)tabNode->GetData();
controls.Append(tab);
- wxNode *next = tabNode->GetNext();
- delete tabNode;
+ wxList::compatibility_iterator next = tabNode->GetNext();
+ layer->Erase(tabNode);
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->GetNext();
+ 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.GetFirst();
+ wxList::compatibility_iterator node = controls.GetFirst();
while (node)
{
wxTabControl *tabControl = (wxTabControl *)node->GetData();
}
// Draw layers in reverse order
- wxNode *node = m_layers.GetLast();
+ wxTabLayerList::compatibility_iterator node = m_layers.GetLast();
while (node)
{
wxTabLayer *layer = (wxTabLayer *)node->GetData();
- wxNode *node2 = layer->GetFirst();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *control = (wxTabControl *)node2->GetData();
- control->OnDraw(dc, (node2->GetNext() == NULL));
+ control->OnDraw(dc, (!node2->GetNext()));
node2 = node2->GetNext();
}
wxTabControl *hitControl = (wxTabControl *) NULL;
- wxNode *node = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator node = m_layers.GetFirst();
while (node)
{
wxTabLayer *layer = (wxTabLayer *)node->GetData();
- wxNode *node2 = layer->GetFirst();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
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->GetNext();
{
// 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->Item(col);
+ wxList::compatibility_iterator otherNode = firstLayer->Item(col);
if (!otherNode)
return FALSE;
// Find tab control for id
wxTabControl *wxTabView::FindTabControlForId(int id) const
{
- wxNode *node1 = m_layers.GetFirst();
+ wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
wxTabLayer *layer = (wxTabLayer *)node1->GetData();
- wxNode *node2 = layer->GetFirst();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *control = (wxTabControl *)node2->GetData();
// Find tab control for layer, position (starting from zero)
wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const
{
- wxNode *node1 = m_layers.Item(layer);
+ wxTabLayerList::compatibility_iterator node1 = m_layers.Item(layer);
if (!node1)
return (wxTabControl *) NULL;
wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
- wxNode *node2 = tabLayer->Item(position);
+ wxList::compatibility_iterator node2 = tabLayer->Item(position);
if (!node2)
return (wxTabControl *) NULL;
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.GetFirst();
+ wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
wxTabLayer *layer = (wxTabLayer *)node1->GetData();
int c = 0;
- wxNode *node2 = layer->GetFirst();
+ wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *cnt = (wxTabControl *)node2->GetData();
}
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->GetData();
+ 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)