From 4410d619c5a29e025b3ee5cd2363d8795aaf841c Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Wed, 13 Aug 2003 21:28:56 +0000 Subject: [PATCH] wxMotif STL-ification. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22822 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/tabg.h | 23 +++++---- src/generic/tabg.cpp | 98 ++++++++++++++++++++------------------- src/motif/timer.cpp | 18 +++---- 3 files changed, 74 insertions(+), 65 deletions(-) diff --git a/include/wx/generic/tabg.h b/include/wx/generic/tabg.h index effb98ce4c..c26b524d08 100644 --- a/include/wx/generic/tabg.h +++ b/include/wx/generic/tabg.h @@ -18,10 +18,11 @@ #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; @@ -86,13 +87,14 @@ protected: 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 @@ -104,7 +106,7 @@ public: ~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; } @@ -197,7 +199,7 @@ public: 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); @@ -210,7 +212,7 @@ public: protected: // List of layers, from front to back. - wxList m_layers; + wxTabLayerList m_layers; // Selected tab int m_tabSelection; @@ -321,6 +323,9 @@ protected: DECLARE_EVENT_TABLE() }; +WX_DECLARE_HASH_MAP(int, wxWindow*, wxIntegerHash, wxIntegerEqual, + wxIntToWindowHashMap); + class WXDLLEXPORT wxPanelTabView: public wxTabView { DECLARE_DYNAMIC_CLASS(wxPanelTabView) @@ -338,14 +343,14 @@ public: 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 diff --git a/src/generic/tabg.cpp b/src/generic/tabg.cpp index 89cd65ab64..6c6ffa0120 100644 --- a/src/generic/tabg.cpp +++ b/src/generic/tabg.cpp @@ -34,6 +34,9 @@ #include #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) @@ -41,7 +44,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxTabControl, wxObject) -IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList) +// IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList) wxTabControl::wxTabControl(wxTabView *v) { @@ -547,7 +550,7 @@ wxTabView::~wxTabView() 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; @@ -556,7 +559,7 @@ wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *exi // 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(); @@ -571,7 +574,7 @@ wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *exi { tabLayer = new wxTabLayer; m_layers.Append(tabLayer); - lastTabNode = (wxNode *) NULL; + lastTabNode = wxList::compatibility_iterator(); } } int layer = m_layers.GetCount() - 1; @@ -610,11 +613,11 @@ wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *exi // 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(); @@ -623,7 +626,7 @@ bool wxTabView::RemoveTab(int id) if (id == m_tabSelection) m_tabSelection = -1; delete tab; - delete tabNode; + layer->Erase(tabNode); m_noTabs --; // The layout has changed @@ -661,11 +664,11 @@ int wxTabView::GetTotalTabHeight() { 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(); @@ -683,23 +686,23 @@ int wxTabView::GetTotalTabHeight() 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; @@ -713,22 +716,22 @@ void wxTabView::LayoutTabs(void) // 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; } @@ -737,7 +740,7 @@ void wxTabView::LayoutTabs(void) 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(); @@ -811,15 +814,15 @@ void wxTabView::Draw(wxDC& dc) } // 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(); } @@ -885,19 +888,19 @@ bool wxTabView::OnEvent(wxMouseEvent& event) 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(); @@ -967,10 +970,10 @@ bool wxTabView::MoveSelectionTab(wxTabControl *control) { // 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; @@ -1062,11 +1065,11 @@ void wxTabView::SetTabSelection(int sel, bool activateTool) // 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(); @@ -1082,25 +1085,25 @@ wxTabControl *wxTabView::FindTabControlForId(int id) const // 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(); @@ -1114,7 +1117,7 @@ wxNode *wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const } node1 = node1->GetNext(); } - return (wxNode *) NULL; + return wxList::compatibility_iterator(); } int wxTabView::CalculateTabWidth(int noTabs, bool adjustView) @@ -1214,7 +1217,8 @@ void wxTabbedPanel::OnPaint(wxPaintEvent& WXUNUSED(event) ) 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; @@ -1252,24 +1256,22 @@ void wxPanelTabView::OnTabActivate(int activateId, int deactivateId) 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) diff --git a/src/motif/timer.cpp b/src/motif/timer.cpp index fdc59712e6..f4ef797df6 100644 --- a/src/motif/timer.cpp +++ b/src/motif/timer.cpp @@ -15,7 +15,7 @@ #include "wx/timer.h" #include "wx/app.h" -#include "wx/list.h" +#include "wx/hashmap.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -27,14 +27,16 @@ #include "wx/motif/private.h" -IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxObject); -static wxList wxTimerList(wxKEY_INTEGER); +WX_DECLARE_VOIDPTR_HASH_MAP(wxTimer*, wxTimerHashMap); + +static wxTimerHashMap s_timers; void wxTimerCallback (wxTimer * timer) { // Check to see if it's still on - if (!wxTimerList.Find((long)timer)) + if (s_timers.find(timer) == s_timers.end()) return; if (timer->m_id == 0) @@ -59,8 +61,8 @@ void wxTimer::Init() wxTimer::~wxTimer() { - wxTimer::Stop(); - wxTimerList.DeleteObject(this); + Stop(); + s_timers.erase(this); } bool wxTimer::Start(int milliseconds, bool mode) @@ -69,8 +71,8 @@ bool wxTimer::Start(int milliseconds, bool mode) (void)wxTimerBase::Start(milliseconds, mode); - if (!wxTimerList.Find((long)this)) - wxTimerList.Append((long)this, this); + if (s_timers.find(this) == s_timers.end()) + s_timers[this] = this; m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), m_milli, -- 2.45.2