]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/tabg.cpp
Don't crash in wxGridCellAutoWrapStringRenderer when the column is hidden.
[wxWidgets.git] / src / generic / tabg.cpp
index d1b044d937946fc250e28bbc41521094b6eb0a6b..7d4dbdf09b500de35524e7e1fa62c9cef9466d81 100644 (file)
@@ -1,39 +1,35 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        tabg.cpp
-// Purpose:     Generic tabbed dialogs
+// Name:        src/generic/tabg.cpp
+// Purpose:     Generic tabbed dialogs; used by wxMotif's wxNotebook
 // Author:      Julian Smart
 // Modified by:
 // Created:     01/02/97
-// RCS-ID:      $Id$
 // Copyright:   (c)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "tabg.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
-#if wxUSE_TAB_DIALOG
-
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/intl.h"
     #include "wx/dcclient.h"
+    #include "wx/math.h"
 #endif
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
-#include <math.h>
 
-#include "wx/tab.h"
+#include "wx/generic/tabg.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)
 {
   m_view = v;
-  m_isSelected = FALSE;
+  m_isSelected = false;
   m_offsetX = 0;
   m_offsetY = 0;
   m_width = 0;
@@ -86,7 +82,8 @@ void wxTabControl::OnDraw(wxDC& dc, bool lastInRow)
   // Draw grey background
   if (m_view->GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
   {
-    dc.SetBrush(*m_view->GetBackgroundBrush());
+    if(m_view->GetBackgroundBrush())
+      dc.SetBrush(*m_view->GetBackgroundBrush());
 
     // Add 1 because the pen is transparent. Under Motif, may be different.
 #ifdef __WXMOTIF__
@@ -207,7 +204,7 @@ void wxTabControl::OnDraw(wxDC& dc, bool lastInRow)
   wxColour col(m_view->GetTextColour());
   dc.SetTextForeground(col);
   dc.SetBackgroundMode(wxTRANSPARENT);
-  long textWidth, textHeight;
+  wxCoord textWidth, textHeight;
   dc.GetTextExtent(GetLabel(), &textWidth, &textHeight);
 
   int textX = (int)(tabX + (GetWidth() - textWidth)/2.0);
@@ -499,9 +496,9 @@ bool wxTabControl::HitTest(int x, int y) const
   int tabY2 = tabY1 + GetHeight();
 
   if (x >= tabX1 && y >= tabY1 && x <= tabX2 && y <= tabY2)
-    return TRUE;
+    return true;
   else
-    return FALSE;
+    return false;
 }
 
 IMPLEMENT_DYNAMIC_CLASS(wxTabView, wxObject)
@@ -524,20 +521,19 @@ wxTabView::wxTabView(long style)
   m_tabViewRect.x = 300;
   m_highlightColour = *wxWHITE;
   m_shadowColour = wxColour(128, 128, 128);
-  m_backgroundColour = *wxLIGHT_GREY;
+  // m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
   m_textColour = *wxBLACK;
   m_highlightPen = wxWHITE_PEN;
   m_shadowPen = wxGREY_PEN;
-  m_backgroundPen = wxLIGHT_GREY_PEN;
-  m_backgroundBrush = wxLIGHT_GREY_BRUSH;
+  // SetBackgroundColour(m_backgroundColour);
   m_tabFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
   m_tabSelectedFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
-  m_window = (wxWindow *) NULL;
+  m_window = NULL;
 }
 
 wxTabView::~wxTabView()
 {
-  ClearTabs(TRUE);
+  ClearTabs(true);
 }
 
 // Automatically positions tabs
@@ -547,7 +543,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 +552,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 +567,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;
@@ -582,7 +578,7 @@ wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *exi
   tabControl->SetRowPosition(tabLayer->GetCount());
   tabControl->SetColPosition(layer);
 
-  wxTabControl *lastTab = (wxTabControl *) NULL;
+  wxTabControl *lastTab = NULL;
   if (lastTabNode)
     lastTab = (wxTabControl *)lastTabNode->GetData();
 
@@ -610,11 +606,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,27 +619,27 @@ 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
         LayoutTabs();
-        return TRUE;
+        return true;
       }
       tabNode = tabNode->GetNext();
     }
     layerNode = layerNode->GetNext();
   }
-  return FALSE;
+  return false;
 }
 
 bool wxTabView::SetTabText(int id, const wxString& label)
 {
     wxTabControl* control = FindTabControlForId(id);
     if (!control)
-      return FALSE;
+      return false;
     control->SetLabel(label);
-    return TRUE;
+    return true;
 }
 
 wxString wxTabView::GetTabText(int id) const
@@ -661,11 +657,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 +679,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,31 +709,31 @@ 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;
   }
 
-  wxTabControl *lastTab = (wxTabControl *) NULL;
+  wxTabControl *lastTab = NULL;
 
   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();
@@ -754,7 +750,7 @@ void wxTabView::LayoutTabs(void)
      {
        currentLayer = new wxTabLayer;
        m_layers.Append(currentLayer);
-       lastTab = (wxTabControl *) NULL;
+       lastTab = NULL;
      }
     }
 
@@ -799,7 +795,8 @@ void wxTabView::Draw(wxDC& dc)
     if (GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
     {
         dc.SetPen(*wxTRANSPARENT_PEN);
-        dc.SetBrush(*GetBackgroundBrush());
+        if(GetBackgroundBrush())
+            dc.SetBrush(*GetBackgroundBrush());
 
         // Add 1 because the pen is transparent. Under Motif, may be different.
         dc.DrawRectangle(
@@ -811,15 +808,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();
         }
 
@@ -874,30 +871,30 @@ void wxTabView::Draw(wxDC& dc)
 #endif
 }
 
-// Process mouse event, return FALSE if we didn't process it
+// Process mouse event, return false if we didn't process it
 bool wxTabView::OnEvent(wxMouseEvent& event)
 {
   if (!event.LeftDown())
-    return FALSE;
+    return false;
 
   wxCoord x, y;
   event.GetPosition(&x, &y);
 
-  wxTabControl *hitControl = (wxTabControl *) NULL;
+  wxTabControl *hitControl = 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();
@@ -908,16 +905,16 @@ bool wxTabView::OnEvent(wxMouseEvent& event)
   }
 
   if (!hitControl)
-    return FALSE;
+    return false;
 
   wxTabControl *currentTab = FindTabControlForId(m_tabSelection);
 
   if (hitControl == currentTab)
-    return FALSE;
+    return false;
 
   ChangeTab(hitControl);
 
-  return TRUE;
+  return true;
 }
 
 bool wxTabView::ChangeTab(wxTabControl *control)
@@ -928,28 +925,28 @@ bool wxTabView::ChangeTab(wxTabControl *control)
     oldTab = currentTab->GetId();
 
   if (control == currentTab)
-    return TRUE;
+    return true;
 
   if (m_layers.GetCount() == 0)
-    return FALSE;
+    return false;
 
   if (!OnTabPreActivate(control->GetId(), oldTab))
-    return FALSE;
+    return false;
 
   // Move the tab to the bottom
   MoveSelectionTab(control);
 
   if (currentTab)
-    currentTab->SetSelected(FALSE);
+    currentTab->SetSelected(false);
 
-  control->SetSelected(TRUE);
+  control->SetSelected(true);
   m_tabSelection = control->GetId();
 
   OnTabActivate(control->GetId(), oldTab);
 
   // Leave window refresh for the implementing window
 
-  return TRUE;
+  return true;
 }
 
 // Move the selected tab to the bottom layer, if necessary,
@@ -957,7 +954,7 @@ bool wxTabView::ChangeTab(wxTabControl *control)
 bool wxTabView::MoveSelectionTab(wxTabControl *control)
 {
   if (m_layers.GetCount() == 0)
-    return FALSE;
+    return false;
 
   wxTabLayer *firstLayer = (wxTabLayer *)m_layers.GetFirst()->GetData();
 
@@ -967,16 +964,16 @@ 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);
+      return false;
+    wxList::compatibility_iterator otherNode = firstLayer->Item(col);
     if (!otherNode)
-      return FALSE;
+      return false;
 
     // If this is already in the bottom layer, return now
     if (otherNode == thisNode)
-      return TRUE;
+      return true;
 
     wxTabControl *otherTab = (wxTabControl *)otherNode->GetData();
 
@@ -1000,7 +997,7 @@ bool wxTabView::MoveSelectionTab(wxTabControl *control)
     thisNode->SetData(otherTab);
     otherNode->SetData(control);
   }
-  return TRUE;
+  return true;
 }
 
 // Called when a tab is activated
@@ -1011,22 +1008,26 @@ void wxTabView::OnTabActivate(int /*activateId*/, int /*deactivateId*/)
 void wxTabView::SetHighlightColour(const wxColour& col)
 {
   m_highlightColour = col;
-  m_highlightPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
+  m_highlightPen = wxThePenList->FindOrCreatePen(col);
 }
 
 void wxTabView::SetShadowColour(const wxColour& col)
 {
   m_shadowColour = col;
-  m_shadowPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
+  m_shadowPen = wxThePenList->FindOrCreatePen(col);
 }
 
 void wxTabView::SetBackgroundColour(const wxColour& col)
 {
   m_backgroundColour = col;
-  m_backgroundPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
-  m_backgroundBrush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
+  m_backgroundPen = wxThePenList->FindOrCreatePen(col);
+  m_backgroundBrush = wxTheBrushList->FindOrCreateBrush(col);
 }
 
+// this may be called with sel = zero (which doesn't match any page)
+// when wxMotif deletes a page
+// so return the first tab...
+
 void wxTabView::SetTabSelection(int sel, bool activateTool)
 {
   if ( sel==m_tabSelection )
@@ -1034,6 +1035,7 @@ void wxTabView::SetTabSelection(int sel, bool activateTool)
 
   int oldSel = m_tabSelection;
   wxTabControl *control = FindTabControlForId(sel);
+  if (sel == 0) sel=control->GetId();
   wxTabControl *oldControl = FindTabControlForId(m_tabSelection);
 
   if (!OnTabPreActivate(sel, oldSel))
@@ -1048,7 +1050,7 @@ void wxTabView::SetTabSelection(int sel, bool activateTool)
   }
 
   if (oldControl)
-    oldControl->SetSelected(FALSE);
+    oldControl->SetSelected(false);
 
   m_tabSelection = sel;
 
@@ -1060,47 +1062,49 @@ void wxTabView::SetTabSelection(int sel, bool activateTool)
 }
 
 // Find tab control for id
+// this may be called with zero (which doesn't match any page)
+// so return the first control...
 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();
-      if (control->GetId() == id)
+      if (control->GetId() == id || id == 0)
         return control;
       node2 = node2->GetNext();
     }
     node1 = node1->GetNext();
   }
-  return (wxTabControl *) NULL;
+  return NULL;
 }
 
 // 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;
+    return NULL;
   wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
-  wxNode *node2 = tabLayer->Item(position);
+  wxList::compatibility_iterator node2 = tabLayer->Item(position);
   if (!node2)
-    return (wxTabControl *) NULL;
+    return 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 +1118,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)
@@ -1145,7 +1149,7 @@ wxTabbedDialog::wxTabbedDialog(wxWindow *parent, wxWindowID id,
     long windowStyle, const wxString& name):
    wxDialog(parent, id, title, pos, size, windowStyle, name)
 {
-  m_tabView = (wxTabView *) NULL;
+  m_tabView = NULL;
 }
 
 wxTabbedDialog::~wxTabbedDialog(void)
@@ -1187,7 +1191,7 @@ wxTabbedPanel::wxTabbedPanel(wxWindow *parent, wxWindowID id, const wxPoint& pos
    const wxSize& size, long windowStyle, const wxString& name):
    wxPanel(parent, id, pos, size, windowStyle, name)
 {
-  m_tabView = (wxTabView *) NULL;
+  m_tabView = NULL;
 }
 
 wxTabbedPanel::~wxTabbedPanel(void)
@@ -1214,14 +1218,15 @@ 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;
+  m_currentWindow = NULL;
 
-  if (m_panel->IsKindOf(CLASSINFO(wxTabbedDialog)))
+  if (m_panel->IsKindOf(wxCLASSINFO(wxTabbedDialog)))
     ((wxTabbedDialog *)m_panel)->SetTabView(this);
-  else if (m_panel->IsKindOf(CLASSINFO(wxTabbedPanel)))
+  else if (m_panel->IsKindOf(wxCLASSINFO(wxTabbedPanel)))
     ((wxTabbedPanel *)m_panel)->SetTabView(this);
 
   SetWindow(m_panel);
@@ -1229,7 +1234,7 @@ wxPanelTabView::wxPanelTabView(wxPanel *pan, long style): wxTabView(style), m_ta
 
 wxPanelTabView::~wxPanelTabView(void)
 {
-  ClearWindows(TRUE);
+  ClearWindows(true);
 }
 
 // Called when a tab is activated
@@ -1242,9 +1247,9 @@ void wxPanelTabView::OnTabActivate(int activateId, int deactivateId)
   wxWindow *newWindow = GetTabWindow(activateId);
 
   if (oldWindow)
-    oldWindow->Show(FALSE);
+    oldWindow->Show(false);
   if (newWindow)
-    newWindow->Show(TRUE);
+    newWindow->Show(true);
 
   m_panel->Refresh();
 }
@@ -1252,24 +1257,22 @@ void wxPanelTabView::OnTabActivate(int activateId, int deactivateId)
 
 void wxPanelTabView::AddTabWindow(int id, wxWindow *window)
 {
-  m_tabWindows.Append((long)id, window);
-  window->Show(FALSE);
+  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)
@@ -1278,9 +1281,8 @@ void wxPanelTabView::ShowWindowForTab(int id)
   if (newWindow == m_currentWindow)
     return;
   if (m_currentWindow)
-    m_currentWindow->Show(FALSE);
-  newWindow->Show(TRUE);
+    m_currentWindow->Show(false);
+  newWindow->Show(true);
   newWindow->Refresh();
 }
 
-#endif // wxUSE_TAB_DIALOG