wxMotif STL-ification.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22822 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mattia Barbon
2003-08-13 21:28:56 +00:00
parent 7bd54b688e
commit 4410d619c5
3 changed files with 74 additions and 65 deletions

View File

@@ -18,10 +18,11 @@
#define WXTAB_VERSION 1.1 #define WXTAB_VERSION 1.1
#include "wx/hash.h" #include "wx/hashmap.h"
#include "wx/string.h" #include "wx/string.h"
#include "wx/dialog.h" #include "wx/dialog.h"
#include "wx/panel.h" #include "wx/panel.h"
#include "wx/list.h"
class WXDLLEXPORT wxTabView; class WXDLLEXPORT wxTabView;
@@ -86,13 +87,14 @@ protected:
class WXDLLEXPORT wxTabLayer: public wxList class WXDLLEXPORT wxTabLayer: public wxList
{ {
DECLARE_DYNAMIC_CLASS(wxTabLayer)
}; };
/* /*
* The wxTabView controls and draws the tabbed object * 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_DRAW_BOX 1 // Draws 3D boxes round tab layers
#define wxTAB_STYLE_COLOUR_INTERIOR 2 // Colours interior of tabs, otherwise draws outline #define wxTAB_STYLE_COLOUR_INTERIOR 2 // Colours interior of tabs, otherwise draws outline
@@ -104,7 +106,7 @@ public:
~wxTabView(); ~wxTabView();
inline int GetNumberOfLayers() const { return m_layers.GetCount(); } 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 void SetWindow(wxWindow* wnd) { m_window = wnd; }
inline wxWindow* GetWindow(void) const { return m_window; } inline wxWindow* GetWindow(void) const { return m_window; }
@@ -197,7 +199,7 @@ public:
inline wxFont *GetSelectedTabFont() const { return (wxFont*) & m_tabSelectedFont; } inline wxFont *GetSelectedTabFont() const { return (wxFont*) & m_tabSelectedFont; }
inline void SetSelectedTabFont(const wxFont& f) { m_tabSelectedFont = f; } inline void SetSelectedTabFont(const wxFont& f) { m_tabSelectedFont = f; }
// Find the node and the column at which this control is positioned. // 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 // Do the necessary to change to this tab
virtual bool ChangeTab(wxTabControl *control); virtual bool ChangeTab(wxTabControl *control);
@@ -210,7 +212,7 @@ public:
protected: protected:
// List of layers, from front to back. // List of layers, from front to back.
wxList m_layers; wxTabLayerList m_layers;
// Selected tab // Selected tab
int m_tabSelection; int m_tabSelection;
@@ -321,6 +323,9 @@ protected:
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
WX_DECLARE_HASH_MAP(int, wxWindow*, wxIntegerHash, wxIntegerEqual,
wxIntToWindowHashMap);
class WXDLLEXPORT wxPanelTabView: public wxTabView class WXDLLEXPORT wxPanelTabView: public wxTabView
{ {
DECLARE_DYNAMIC_CLASS(wxPanelTabView) DECLARE_DYNAMIC_CLASS(wxPanelTabView)
@@ -338,12 +343,12 @@ public:
inline wxWindow *GetCurrentWindow() const { return m_currentWindow; } inline wxWindow *GetCurrentWindow() const { return m_currentWindow; }
void ShowWindowForTab(int id); void ShowWindowForTab(int id);
inline wxList& GetWindows() const { return (wxList&) m_tabWindows; } // inline wxList& GetWindows() const { return (wxList&) m_tabWindows; }
protected: protected:
// List of panels, one for each tab. Indexed // List of panels, one for each tab. Indexed
// by tab ID. // by tab ID.
wxList m_tabWindows; wxIntToWindowHashMap m_tabWindows;
wxWindow* m_currentWindow; wxWindow* m_currentWindow;
wxPanel* m_panel; wxPanel* m_panel;
}; };

View File

@@ -34,6 +34,9 @@
#include <math.h> #include <math.h>
#include "wx/tab.h" #include "wx/tab.h"
#include "wx/listimpl.cpp"
WX_DEFINE_LIST(wxTabLayerList);
// not defined: use old, square tab implementation (fills in tabs) // not defined: use old, square tab implementation (fills in tabs)
// defined: use new, rounded tab implementation (doesn't colour 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(wxTabControl, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList) // IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList)
wxTabControl::wxTabControl(wxTabView *v) wxTabControl::wxTabControl(wxTabView *v)
{ {
@@ -547,7 +550,7 @@ wxTabView::~wxTabView()
wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab) wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab)
{ {
// First, find which layer we should be adding to. // First, find which layer we should be adding to.
wxNode *node = m_layers.GetLast(); wxTabLayerList::compatibility_iterator node = m_layers.GetLast();
if (!node) if (!node)
{ {
wxTabLayer *newLayer = new wxTabLayer; 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 // Check if adding another tab control would go off the
// right-hand edge of the layer. // right-hand edge of the layer.
wxTabLayer *tabLayer = (wxTabLayer *)node->GetData(); wxTabLayer *tabLayer = (wxTabLayer *)node->GetData();
wxNode *lastTabNode = tabLayer->GetLast(); wxList::compatibility_iterator lastTabNode = tabLayer->GetLast();
if (lastTabNode) if (lastTabNode)
{ {
wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData(); wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData();
@@ -571,7 +574,7 @@ wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *exi
{ {
tabLayer = new wxTabLayer; tabLayer = new wxTabLayer;
m_layers.Append(tabLayer); m_layers.Append(tabLayer);
lastTabNode = (wxNode *) NULL; lastTabNode = wxList::compatibility_iterator();
} }
} }
int layer = m_layers.GetCount() - 1; 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 // Remove the tab without deleting the window
bool wxTabView::RemoveTab(int id) bool wxTabView::RemoveTab(int id)
{ {
wxNode *layerNode = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode) while (layerNode)
{ {
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
wxNode *tabNode = layer->GetFirst(); wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode) while (tabNode)
{ {
wxTabControl *tab = (wxTabControl *)tabNode->GetData(); wxTabControl *tab = (wxTabControl *)tabNode->GetData();
@@ -623,7 +626,7 @@ bool wxTabView::RemoveTab(int id)
if (id == m_tabSelection) if (id == m_tabSelection)
m_tabSelection = -1; m_tabSelection = -1;
delete tab; delete tab;
delete tabNode; layer->Erase(tabNode);
m_noTabs --; m_noTabs --;
// The layout has changed // The layout has changed
@@ -661,11 +664,11 @@ int wxTabView::GetTotalTabHeight()
{ {
int minY = 0; int minY = 0;
wxNode *layerNode = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode) while (layerNode)
{ {
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
wxNode *tabNode = layer->GetFirst(); wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode) while (tabNode)
{ {
wxTabControl *tab = (wxTabControl *)tabNode->GetData(); wxTabControl *tab = (wxTabControl *)tabNode->GetData();
@@ -683,23 +686,23 @@ int wxTabView::GetTotalTabHeight()
void wxTabView::ClearTabs(bool deleteTabs) void wxTabView::ClearTabs(bool deleteTabs)
{ {
wxNode *layerNode = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode) while (layerNode)
{ {
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
wxNode *tabNode = layer->GetFirst(); wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode) while (tabNode)
{ {
wxTabControl *tab = (wxTabControl *)tabNode->GetData(); wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (deleteTabs) if (deleteTabs)
delete tab; delete tab;
wxNode *next = tabNode->GetNext(); wxList::compatibility_iterator next = tabNode->GetNext();
delete tabNode; layer->Erase(tabNode);
tabNode = next; tabNode = next;
} }
wxNode *nextLayerNode = layerNode->GetNext(); wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext();
delete layer; delete layer;
delete layerNode; m_layers.Erase(layerNode);
layerNode = nextLayerNode; layerNode = nextLayerNode;
} }
m_noTabs = 0; m_noTabs = 0;
@@ -713,22 +716,22 @@ void wxTabView::LayoutTabs(void)
// Make a list of the tab controls, deleting the wxTabLayers. // Make a list of the tab controls, deleting the wxTabLayers.
wxList controls; wxList controls;
wxNode *layerNode = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator layerNode = m_layers.GetFirst();
while (layerNode) while (layerNode)
{ {
wxTabLayer *layer = (wxTabLayer *)layerNode->GetData(); wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
wxNode *tabNode = layer->GetFirst(); wxList::compatibility_iterator tabNode = layer->GetFirst();
while (tabNode) while (tabNode)
{ {
wxTabControl *tab = (wxTabControl *)tabNode->GetData(); wxTabControl *tab = (wxTabControl *)tabNode->GetData();
controls.Append(tab); controls.Append(tab);
wxNode *next = tabNode->GetNext(); wxList::compatibility_iterator next = tabNode->GetNext();
delete tabNode; layer->Erase(tabNode);
tabNode = next; tabNode = next;
} }
wxNode *nextLayerNode = layerNode->GetNext(); wxTabLayerList::compatibility_iterator nextLayerNode = layerNode->GetNext();
delete layer; delete layer;
delete layerNode; m_layers.Erase(layerNode);
layerNode = nextLayerNode; layerNode = nextLayerNode;
} }
@@ -737,7 +740,7 @@ void wxTabView::LayoutTabs(void)
wxTabLayer *currentLayer = new wxTabLayer; wxTabLayer *currentLayer = new wxTabLayer;
m_layers.Append(currentLayer); m_layers.Append(currentLayer);
wxNode *node = controls.GetFirst(); wxList::compatibility_iterator node = controls.GetFirst();
while (node) while (node)
{ {
wxTabControl *tabControl = (wxTabControl *)node->GetData(); wxTabControl *tabControl = (wxTabControl *)node->GetData();
@@ -811,15 +814,15 @@ void wxTabView::Draw(wxDC& dc)
} }
// Draw layers in reverse order // Draw layers in reverse order
wxNode *node = m_layers.GetLast(); wxTabLayerList::compatibility_iterator node = m_layers.GetLast();
while (node) while (node)
{ {
wxTabLayer *layer = (wxTabLayer *)node->GetData(); wxTabLayer *layer = (wxTabLayer *)node->GetData();
wxNode *node2 = layer->GetFirst(); wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2) while (node2)
{ {
wxTabControl *control = (wxTabControl *)node2->GetData(); wxTabControl *control = (wxTabControl *)node2->GetData();
control->OnDraw(dc, (node2->GetNext() == NULL)); control->OnDraw(dc, (!node2->GetNext()));
node2 = node2->GetNext(); node2 = node2->GetNext();
} }
@@ -885,19 +888,19 @@ bool wxTabView::OnEvent(wxMouseEvent& event)
wxTabControl *hitControl = (wxTabControl *) NULL; wxTabControl *hitControl = (wxTabControl *) NULL;
wxNode *node = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator node = m_layers.GetFirst();
while (node) while (node)
{ {
wxTabLayer *layer = (wxTabLayer *)node->GetData(); wxTabLayer *layer = (wxTabLayer *)node->GetData();
wxNode *node2 = layer->GetFirst(); wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2) while (node2)
{ {
wxTabControl *control = (wxTabControl *)node2->GetData(); wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->HitTest((int)x, (int)y)) if (control->HitTest((int)x, (int)y))
{ {
hitControl = control; hitControl = control;
node = (wxNode *) NULL; node = wxTabLayerList::compatibility_iterator();
node2 = (wxNode *) NULL; node2 = wxList::compatibility_iterator();
} }
else else
node2 = node2->GetNext(); node2 = node2->GetNext();
@@ -967,10 +970,10 @@ bool wxTabView::MoveSelectionTab(wxTabControl *control)
{ {
// Do a swap // Do a swap
int col = 0; int col = 0;
wxNode *thisNode = FindTabNodeAndColumn(control, &col); wxList::compatibility_iterator thisNode = FindTabNodeAndColumn(control, &col);
if (!thisNode) if (!thisNode)
return FALSE; return FALSE;
wxNode *otherNode = firstLayer->Item(col); wxList::compatibility_iterator otherNode = firstLayer->Item(col);
if (!otherNode) if (!otherNode)
return FALSE; return FALSE;
@@ -1062,11 +1065,11 @@ void wxTabView::SetTabSelection(int sel, bool activateTool)
// Find tab control for id // Find tab control for id
wxTabControl *wxTabView::FindTabControlForId(int id) const wxTabControl *wxTabView::FindTabControlForId(int id) const
{ {
wxNode *node1 = m_layers.GetFirst(); wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1) while (node1)
{ {
wxTabLayer *layer = (wxTabLayer *)node1->GetData(); wxTabLayer *layer = (wxTabLayer *)node1->GetData();
wxNode *node2 = layer->GetFirst(); wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2) while (node2)
{ {
wxTabControl *control = (wxTabControl *)node2->GetData(); wxTabControl *control = (wxTabControl *)node2->GetData();
@@ -1082,25 +1085,25 @@ wxTabControl *wxTabView::FindTabControlForId(int id) const
// Find tab control for layer, position (starting from zero) // Find tab control for layer, position (starting from zero)
wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const
{ {
wxNode *node1 = m_layers.Item(layer); wxTabLayerList::compatibility_iterator node1 = m_layers.Item(layer);
if (!node1) if (!node1)
return (wxTabControl *) NULL; return (wxTabControl *) NULL;
wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData(); wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
wxNode *node2 = tabLayer->Item(position); wxList::compatibility_iterator node2 = tabLayer->Item(position);
if (!node2) if (!node2)
return (wxTabControl *) NULL; return (wxTabControl *) NULL;
return (wxTabControl *)node2->GetData(); return (wxTabControl *)node2->GetData();
} }
// Find the node and the column at which this control is positioned. // 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) while (node1)
{ {
wxTabLayer *layer = (wxTabLayer *)node1->GetData(); wxTabLayer *layer = (wxTabLayer *)node1->GetData();
int c = 0; int c = 0;
wxNode *node2 = layer->GetFirst(); wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2) while (node2)
{ {
wxTabControl *cnt = (wxTabControl *)node2->GetData(); wxTabControl *cnt = (wxTabControl *)node2->GetData();
@@ -1114,7 +1117,7 @@ wxNode *wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const
} }
node1 = node1->GetNext(); node1 = node1->GetNext();
} }
return (wxNode *) NULL; return wxList::compatibility_iterator();
} }
int wxTabView::CalculateTabWidth(int noTabs, bool adjustView) int wxTabView::CalculateTabWidth(int noTabs, bool adjustView)
@@ -1214,7 +1217,8 @@ void wxTabbedPanel::OnPaint(wxPaintEvent& WXUNUSED(event) )
IMPLEMENT_CLASS(wxPanelTabView, wxTabView) 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_panel = pan;
m_currentWindow = (wxWindow *) NULL; m_currentWindow = (wxWindow *) NULL;
@@ -1252,24 +1256,22 @@ void wxPanelTabView::OnTabActivate(int activateId, int deactivateId)
void wxPanelTabView::AddTabWindow(int id, wxWindow *window) 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); window->Show(FALSE);
} }
wxWindow *wxPanelTabView::GetTabWindow(int id) const wxWindow *wxPanelTabView::GetTabWindow(int id) const
{ {
wxNode *node = m_tabWindows.Find((long)id); wxIntToWindowHashMap::const_iterator it = m_tabWindows.find(id);
if (!node) return it == m_tabWindows.end() ? NULL : it->second;
return (wxWindow *) NULL;
return (wxWindow *)node->GetData();
} }
void wxPanelTabView::ClearWindows(bool deleteWindows) void wxPanelTabView::ClearWindows(bool deleteWindows)
{ {
if (deleteWindows) if (deleteWindows)
m_tabWindows.DeleteContents(TRUE); WX_CLEAR_HASH_MAP(wxIntToWindowHashMap, m_tabWindows);
m_tabWindows.Clear(); m_tabWindows.clear();
m_tabWindows.DeleteContents(FALSE);
} }
void wxPanelTabView::ShowWindowForTab(int id) void wxPanelTabView::ShowWindowForTab(int id)

View File

@@ -15,7 +15,7 @@
#include "wx/timer.h" #include "wx/timer.h"
#include "wx/app.h" #include "wx/app.h"
#include "wx/list.h" #include "wx/hashmap.h"
#ifdef __VMS__ #ifdef __VMS__
#pragma message disable nosimpint #pragma message disable nosimpint
@@ -27,14 +27,16 @@
#include "wx/motif/private.h" #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) void wxTimerCallback (wxTimer * timer)
{ {
// Check to see if it's still on // Check to see if it's still on
if (!wxTimerList.Find((long)timer)) if (s_timers.find(timer) == s_timers.end())
return; return;
if (timer->m_id == 0) if (timer->m_id == 0)
@@ -59,8 +61,8 @@ void wxTimer::Init()
wxTimer::~wxTimer() wxTimer::~wxTimer()
{ {
wxTimer::Stop(); Stop();
wxTimerList.DeleteObject(this); s_timers.erase(this);
} }
bool wxTimer::Start(int milliseconds, bool mode) bool wxTimer::Start(int milliseconds, bool mode)
@@ -69,8 +71,8 @@ bool wxTimer::Start(int milliseconds, bool mode)
(void)wxTimerBase::Start(milliseconds, mode); (void)wxTimerBase::Start(milliseconds, mode);
if (!wxTimerList.Find((long)this)) if (s_timers.find(this) == s_timers.end())
wxTimerList.Append((long)this, this); s_timers[this] = this;
m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(), m_id = XtAppAddTimeOut((XtAppContext) wxTheApp->GetAppContext(),
m_milli, m_milli,