]> git.saurik.com Git - wxWidgets.git/commitdiff
Added support for compiling with wxUSE_STL set to 1.
authorStefan Neis <Stefan.Neis@t-online.de>
Sun, 28 Nov 2004 18:39:30 +0000 (18:39 +0000)
committerStefan Neis <Stefan.Neis@t-online.de>
Sun, 28 Nov 2004 18:39:30 +0000 (18:39 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/os2/window.h
src/os2/app.cpp
src/os2/menu.cpp
src/os2/menuitem.cpp
src/os2/nativdlg.cpp
src/os2/radiobut.cpp
src/os2/timer.cpp
src/os2/toolbar.cpp
src/os2/utilsgui.cpp
src/os2/window.cpp

index f89b382262db273b455bc1d745c4a2cabff0eb10..925b345a8c8f19de60d976a15b22ca1b1e0cb4c4 100644 (file)
@@ -575,5 +575,19 @@ WXDLLEXPORT int wxCharCodeOS2ToWX(int nKeySym);
 WXDLLEXPORT int wxCharCodeWXToOS2( int   nId
                                   ,bool* pbIsVirtual
                                  );
+
+// ----------------------------------------------------------------------------
+// global objects
+// ----------------------------------------------------------------------------
+
+// notice that this hash must be defined after wxWindow declaration as it
+// needs to "see" its dtor and not just forward declaration
+#include "wx/hash.h"
+
+// pseudo-template HWND <-> wxWindow hash table
+WX_DECLARE_HASH(wxWindowOS2, wxWindowList, wxWinHashTable);
+
+extern wxWinHashTable *wxWinHandleHash;
+
 #endif
     // _WX_WINDOW_H_
index 52aebcb4b8958e34fb1e971f5cb6481c30188a24..faf14e9be7eb7363e3fcdb80a9b4c87562accb6c 100644 (file)
@@ -82,7 +82,6 @@ extern "C" int _System bsdselect(int,
 // ---------------------------------------------------------------------------
 
 extern wxChar*                      wxBuffer;
-extern wxList*                      wxWinHandleList;
 extern wxList WXDLLEXPORT           wxPendingDelete;
 extern wxCursor*                    g_globalCursor;
 
@@ -240,7 +239,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     //    wxRedirectIOToConsole();
 #endif
 
-    wxWinHandleList = new wxList(wxKEY_INTEGER);
+    wxWinHandleHash = new wxWinHashTable(wxKEY_INTEGER, 100);
 
     // This is to foil optimizations in Visual C++ that throw out dummy.obj.
     // PLEASE DO NOT ALTER THIS.
@@ -419,8 +418,8 @@ void wxApp::CleanUp()
 // TODO:        ::DeleteObject( wxDisableButtonBrush );
     }
 
-    if (wxWinHandleList)
-        delete wxWinHandleList;
+    delete wxWinHandleHash;
+    wxWinHandleHash = NULL;
 
     // Delete Message queue
     if (wxTheApp->m_hMq)
index ca8af4aa8e39287bbb6751d70f10733184312863..ccb4be42512ae2669bbadb1fb340756d15e2052f 100644 (file)
@@ -179,12 +179,12 @@ void wxMenu::UpdateAccel(
     if (pItem->IsSubMenu())
     {
         wxMenu*                     pSubmenu = pItem->GetSubMenu();
-        wxMenuItemList::Node*       pNode = pSubmenu->GetMenuItems().GetFirst();
+        wxMenuItemList::compatibility_iterator node = pSubmenu->GetMenuItems().GetFirst();
 
-        while (pNode)
+        while (node)
         {
-            UpdateAccel(pNode->GetData());
-            pNode = pNode->GetNext();
+            UpdateAccel(node->GetData());
+            node = node->GetNext();
         }
     }
     else if (!pItem->IsSeparator())
@@ -416,11 +416,11 @@ wxMenuItem* wxMenu::DoAppend(
             //
             pItem->SetRadioGroupStart(m_nStartRadioGroup);
 
-            wxMenuItemList::Node*   pNode = GetMenuItems().Item(m_nStartRadioGroup);
+            wxMenuItemList::compatibility_iterator node = GetMenuItems().Item(m_nStartRadioGroup);
 
-            if (pNode)
+            if (node)
             {
-                pNode->GetData()->SetRadioGroupEnd(nCount);
+                node->GetData()->SetRadioGroupEnd(nCount);
             }
             else
             {
@@ -470,19 +470,19 @@ wxMenuItem* wxMenu::DoRemove(
     // We need to find the items position in the child list
     //
     size_t                          nPos;
-    wxMenuItemList::Node*           pNode = GetMenuItems().GetFirst();
+    wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
 
-    for (nPos = 0; pNode; nPos++)
+    for (nPos = 0; node; nPos++)
     {
-        if (pNode->GetData() == pItem)
+        if (node->GetData() == pItem)
             break;
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
     //
     // DoRemove() (unlike Remove) can only be called for existing item!
     //
-    wxCHECK_MSG(pNode, NULL, wxT("bug in wxMenu::Remove logic"));
+    wxCHECK_MSG(node, NULL, wxT("bug in wxMenu::Remove logic"));
 
 #if wxUSE_ACCEL
     //
@@ -641,7 +641,7 @@ wxMenuItem* wxMenu::FindItem(
 
     wxMenuItem*                     pItem = NULL;
 
-    for ( wxMenuItemList::Node *node = m_items.GetFirst();
+    for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst();
           node && !pItem;
           node = node->GetNext() )
     {
@@ -772,9 +772,9 @@ WXHMENU wxMenuBar::Create()
     }
     else
     {
-        size_t                      nCount = GetMenuCount();
-
-        for (size_t i = 0; i < nCount; i++)
+        size_t                      nCount = GetMenuCount(), i;
+       wxMenuList::iterator it;
+        for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
         {
             APIRET                  rc;
             ERRORID                 vError;
@@ -784,8 +784,8 @@ WXHMENU wxMenuBar::Create()
             //
             // Set the parent and owner of the submenues to be the menubar, not the desktop
             //
-            hSubMenu = m_menus[i]->m_vMenuData.hwndSubMenu;
-            if (!::WinSetParent(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu, FALSE))
+            hSubMenu = (*it)->m_vMenuData.hwndSubMenu;
+            if (!::WinSetParent((*it)->m_vMenuData.hwndSubMenu, m_hMenu, FALSE))
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
@@ -793,7 +793,7 @@ WXHMENU wxMenuBar::Create()
                 return NULLHANDLE;
             }
 
-            if (!::WinSetOwner(m_menus[i]->m_vMenuData.hwndSubMenu, m_hMenu))
+            if (!::WinSetOwner((*it)->m_vMenuData.hwndSubMenu, m_hMenu))
             {
                 vError = ::WinGetLastError(vHabmain);
                 sError = wxPMErrorToStr(vError);
@@ -801,9 +801,9 @@ WXHMENU wxMenuBar::Create()
                 return NULLHANDLE;
             }
 
-            m_menus[i]->m_vMenuData.iPosition = i;
+            (*it)->m_vMenuData.iPosition = i;
 
-            rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&m_menus[i]->m_vMenuData, (MPARAM)m_titles[i].c_str());
+            rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].c_str());
             if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR)
             {
                 vError = ::WinGetLastError(vHabmain);
@@ -1051,7 +1051,7 @@ wxMenu* wxMenuBar::Remove(
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    m_titles.Remove(nPos);
+    m_titles.RemoveAt(nPos);
     return pMenu;
 } // end of wxMenuBar::Remove
 
@@ -1065,10 +1065,10 @@ void wxMenuBar::RebuildAccelTable()
     size_t                          nAccelCount = 0;
     size_t                          i;
     size_t                          nCount = GetMenuCount();
-
-    for (i = 0; i < nCount; i++)
+    wxMenuList::iterator it;
+    for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
     {
-        nAccelCount += m_menus[i]->GetAccelCount();
+        nAccelCount += (*it)->GetAccelCount();
     }
 
     if (nAccelCount)
@@ -1076,9 +1076,9 @@ void wxMenuBar::RebuildAccelTable()
         wxAcceleratorEntry*         pAccelEntries = new wxAcceleratorEntry[nAccelCount];
 
         nAccelCount = 0;
-        for (i = 0; i < nCount; i++)
+        for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
         {
-            nAccelCount += m_menus[i]->CopyAccels(&pAccelEntries[nAccelCount]);
+            nAccelCount += (*it)->CopyAccels(&pAccelEntries[nAccelCount]);
         }
         m_vAccelTable = wxAcceleratorTable( nAccelCount
                                            ,pAccelEntries
@@ -1128,14 +1128,14 @@ int wxMenuBar::FindMenuItem(
 ) const
 {
     wxString                        sMenuLabel = wxStripMenuCodes(rMenuString);
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; i < nCount; i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
     {
         wxString                    sTitle = wxStripMenuCodes(m_titles[i]);
 
         if (rMenuString == sTitle)
-            return m_menus[i]->FindItem(rItemString);
+            return (*it)->FindItem(rItemString);
     }
     return wxNOT_FOUND;
 } // end of wxMenuBar::FindMenuItem
@@ -1149,13 +1149,13 @@ wxMenuItem* wxMenuBar::FindItem(
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; !pItem && (i < nCount); i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++)
     {
-        pItem = m_menus[i]->FindItem( nId
-                                     ,ppItemMenu
-                                    );
+        pItem = (*it)->FindItem( nId
+                                ,ppItemMenu
+                               );
     }
     return pItem;
 } // end of wxMenuBar::FindItem
@@ -1170,14 +1170,14 @@ wxMenuItem* wxMenuBar::FindItem(
         *ppItemMenu = NULL;
 
     wxMenuItem*                     pItem = NULL;
-    size_t                          nCount = GetMenuCount();
-
-    for (size_t i = 0; !pItem && (i < nCount); i++)
+    size_t                          nCount = GetMenuCount(), i;
+    wxMenuList::const_iterator it;
+    for (i = 0, it = m_menus.begin(); !pItem && (i < nCount); i++, it++)
     {
-        pItem = m_menus[i]->FindItem( nId
-                                     ,hItem
-                                     ,ppItemMenu
-                                    );
+        pItem = (*it)->FindItem( nId
+                                ,hItem
+                                ,ppItemMenu
+                               );
     }
     return pItem;
 } // end of wxMenuBar::FindItem
index d5417f8a0daacb40afc4053d3e69f14848c37429..a3180a5ae8fe14940d49019eee9c7be3c9203d4b 100644 (file)
@@ -321,9 +321,9 @@ void wxMenuItem::Check(
         //
         // Also uncheck all the other items in this radio group
         //
-        wxMenuItemList::Node*       pNode = rItems.Item(nStart);
+        wxMenuItemList::compatibility_iterator node = rItems.Item(nStart);
 
-        for (int n = nStart; n <= nEnd && pNode; n++)
+        for (int n = nStart; n <= nEnd && node; n++)
         {
             if (n == nPos)
             {
@@ -335,14 +335,14 @@ void wxMenuItem::Check(
             }
             if (n != nPos)
             {
-                pNode->GetData()->m_isChecked = FALSE;
+                node->GetData()->m_isChecked = FALSE;
                 ::WinSendMsg( hMenu
                              ,MM_SETITEMATTR
                              ,MPFROM2SHORT(n, TRUE)
                              ,MPFROM2SHORT(MIA_CHECKED, FALSE)
                             );
             }
-            pNode = pNode->GetNext();
+            node = node->GetNext();
         }
     }
     else // check item
index fa5280660855e1401a4e1400318c4b530baa5668..16c829462076a7a019465b65ed7d903b2d337e09 100644 (file)
@@ -137,17 +137,17 @@ wxWindow* wxWindow::GetWindowChild1 (
     if (m_windowId == vId)
         return this;
 
-    wxWindowList::Node*             pNode = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
 
-    while (pNode)
+    while (node)
     {
-        wxWindow*                   pChild = pNode->GetData();
+        wxWindow*                   pChild = node->GetData();
         wxWindow*                   pWin   = pChild->GetWindowChild1(vId);
 
         if (pWin)
             return pWin;
 
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
     return NULL;
 } // end of wxWindow::GetWindowChild1
index 8d1b543ad8f108ad4aec8d4cc4cedc22cfc55434..e0eaed2b65785f6dd8b8ee460c050b0574dcd9de 100644 (file)
@@ -223,9 +223,9 @@ void wxRadioButton::SetValue(
     if (bValue)
     {
         const wxWindowList&         rSiblings = GetParent()->GetChildren();
-        wxWindowList::Node*         pNodeThis = rSiblings.Find(this);
+        wxWindowList::compatibility_iterator nodeThis = rSiblings.Find(this);
 
-        wxCHECK_RET(pNodeThis, _T("radio button not a child of its parent?"));
+        wxCHECK_RET(nodeThis, _T("radio button not a child of its parent?"));
 
         //
         // If it's not the first item of the group ...
@@ -235,11 +235,11 @@ void wxRadioButton::SetValue(
             //
             // ...turn off all radio buttons before this one
             //
-            for ( wxWindowList::Node* pNodeBefore = pNodeThis->GetPrevious();
-                  pNodeBefore;
-                  pNodeBefore = pNodeBefore->GetPrevious() )
+            for ( wxWindowList::compatibility_iterator nodeBefore = nodeThis->GetPrevious();
+                  nodeBefore;
+                  nodeBefore = nodeBefore->GetPrevious() )
             {
-                wxRadioButton*      pBtn = wxDynamicCast( pNodeBefore->GetData()
+                wxRadioButton*      pBtn = wxDynamicCast( nodeBefore->GetData()
                                                          ,wxRadioButton
                                                         );
                 if (!pBtn)
@@ -265,11 +265,11 @@ void wxRadioButton::SetValue(
         //
         // ... and all after this one
         //
-        for (wxWindowList::Node* pNodeAfter = pNodeThis->GetNext();
-             pNodeAfter;
-             pNodeAfter = pNodeAfter->GetNext())
+        for (wxWindowList::compatibility_iterator nodeAfter = nodeThis->GetNext();
+             nodeAfter;
+             nodeAfter = nodeAfter->GetNext())
         {
-            wxRadioButton*          pBtn = wxDynamicCast( pNodeAfter->GetData()
+            wxRadioButton*          pBtn = wxDynamicCast( nodeAfter->GetData()
                                                          ,wxRadioButton
                                                         );
 
index 1aebce5ee143222539b25e8c9eb994e45cc0517b..7aa78227b3db7311cb004190db8fc8ad07e6ff92 100644 (file)
 #include <sys/types.h>
 
 #include <sys/timeb.h>
+
+// ----------------------------------------------------------------------------
+// private globals
+// ----------------------------------------------------------------------------
+
+// define a hash containing all the timers: it is indexed by timer id and
+// contains the corresponding timer
+WX_DECLARE_HASH_MAP(unsigned long, wxTimer *, wxIntegerHash, wxIntegerEqual,
+                    wxTimerMap);
+
+// instead of using a global here, wrap it in a static function as otherwise it
+// could have been used before being initialized if a timer object were created
+// globally
+static wxTimerMap& TimerMap()
+{
+    static wxTimerMap s_timerMap;
+
+    return s_timerMap;
+}
+
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
 
-wxList wxTimerList(wxKEY_INTEGER);
+// timer callback used for all timers
 ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG);
 
 // ----------------------------------------------------------------------------
@@ -48,6 +68,14 @@ ULONG wxTimerProc(HWND hwnd, ULONG, int nIdTimer, ULONG);
 
 IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler)
 
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxTimer class
+// ----------------------------------------------------------------------------
+
 void wxTimer::Init()
 {
     m_ulId = 0;
@@ -56,8 +84,6 @@ void wxTimer::Init()
 wxTimer::~wxTimer()
 {
     wxTimer::Stop();
-
-    wxTimerList.DeleteObject(this);
 }
 
 void wxTimer::Notify()
@@ -87,8 +113,6 @@ bool wxTimer::Start(
 
     wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") );
 
-    wxTimerList.DeleteObject(this);
-
     wxWindow*                       pWin = NULL;
 
     if (m_owner)
@@ -108,10 +132,23 @@ bool wxTimer::Start(
                                 );
     if (m_ulId > 0L)
     {
-        wxTimerList.Append( m_ulId
-                           ,this
-                          );
-        return(TRUE);
+        // check that SetTimer() didn't reuse an existing id: according to
+        // the MSDN this can happen and this would be catastrophic to us as
+        // we rely on ids uniquely identifying the timers because we use
+        // them as keys in the hash
+        if ( TimerMap().find(m_ulId) != TimerMap().end() )
+        {
+            wxLogError(_("Timer creation failed."));
+
+            ::WinStopTimer(m_Hab, pWin?(pWin->GetHWND()):NULL, m_ulId);
+            m_ulId = 0;
+
+            return false;
+        }
+
+        TimerMap()[m_ulId] = this;
+
+        return true;
     }
     else
     {
@@ -133,7 +170,8 @@ void wxTimer::Stop()
         }
         else
             ::WinStopTimer(m_Hab, NULLHANDLE, m_ulId);
-        wxTimerList.DeleteObject(this);
+
+        TimerMap().erase(m_ulId);
     }
     m_ulId = 0L;
 }
@@ -165,11 +203,11 @@ ULONG wxTimerProc(
 , ULONG
 )
 {
-    wxNode*                         pNode = wxTimerList.Find((ULONG)nIdTimer);
+    wxTimerMap::iterator node = TimerMap().find((ULONG)nIdTimer);
 
-    wxCHECK_MSG(pNode, 0, wxT("bogus timer id in wxTimerProc") );
-    if (pNode)
-      wxProcessTimer(*(wxTimer *)pNode->GetData());
+    wxCHECK_MSG(node != TimerMap().end(), 0,
+                wxT("bogus timer id in wxTimerProc") );
+    wxProcessTimer(*(node->second));
     return 0;
 }
 
index 82dd46c560bf6b6d7d4c365519254c2e19a0b067..56ab55267781c55d6a6e077bfe7e1f86d5c40299 100644 (file)
@@ -445,11 +445,11 @@ bool wxToolBar::Realize()
     //
     // Find the maximum tool width and height
     //
-    wxToolBarToolsList::Node*       pNode = m_tools.GetFirst();
+    wxToolBarToolsList::compatibility_iterator     node = m_tools.GetFirst();
 
-    while (pNode )
+    while (node )
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
         if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsEmpty())
         {
@@ -470,7 +470,7 @@ bool wxToolBar::Realize()
             if (pTool->GetHeight() > nMaxToolHeight)
                 nMaxToolHeight = pTool->GetHeight();
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
     wxCoord                         vTbWidth = 0L;
@@ -497,10 +497,10 @@ bool wxToolBar::Realize()
 
     int                             nSeparatorSize = m_toolSeparation;
 
-    pNode = m_tools.GetFirst();
-    while (pNode)
+    node = m_tools.GetFirst();
+    while (node)
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
         if (pTool->IsSeparator())
         {
@@ -567,7 +567,7 @@ bool wxToolBar::Realize()
         if (m_vLastY > m_maxHeight)
             m_maxHeight = m_vLastY;
 
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
     if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
@@ -603,11 +603,11 @@ void wxToolBar::OnPaint (
     nCount++;
 
     ::WinFillRect(vDc.GetHPS(), &vDc.m_vRclPaint, GetBackgroundColour().GetPixel());
-    for ( wxToolBarToolsList::Node* pNode = m_tools.GetFirst();
-          pNode;
-          pNode = pNode->GetNext() )
+    for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
+          node;
+          node = node->GetNext() )
     {
-        wxToolBarTool*              pTool = (wxToolBarTool*)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool*)node->GetData();
 
         if (pTool->IsButton() )
             DrawTool(vDc, pTool);
@@ -976,10 +976,10 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition(
             ,&vTBarHeight
            );
     vY = vTBarHeight - vY;
-    wxToolBarToolsList::Node* pNode = m_tools.GetFirst();
-    while (pNode)
+    wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
+    while (node)
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
         if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsNull())
         {
@@ -1001,7 +1001,7 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition(
                 return pTool;
             }
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
     return (wxToolBarToolBase *)NULL;
 } // end of wxToolBar::FindToolForPosition
index fd710bbc2020136929e43efe0bef30c712d87459..a48d2a09369511990a0a8d185dfaa199895e5015 100644 (file)
@@ -515,10 +515,12 @@ wxString WXDLLEXPORT wxGetWindowText(
 )
 {
     wxString                        vStr;
-    long                            lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1;
 
-    ::WinQueryWindowText((HWND)hWnd, lLen, vStr.GetWriteBuf((int)lLen));
-    vStr.UngetWriteBuf();
+    if ( hWnd )
+    {
+       long                lLen = ::WinQueryWindowTextLength((HWND)hWnd) + 1;
+       ::WinQueryWindowText((HWND)hWnd, lLen, wxStringBuffer(vStr, lLen));
+    }
 
     return vStr;
 }
@@ -528,22 +530,24 @@ wxString WXDLLEXPORT wxGetWindowClass(
 )
 {
     wxString                        vStr;
-    int                             nLen = 256; // some starting value
-
-    for ( ;; )
+    if ( hWnd )
     {
-        int                         nCount = ::WinQueryClassName((HWND)hWnd, nLen, vStr.GetWriteBuf(nLen));
-
-        vStr.UngetWriteBuf();
-        if (nCount == nLen )
-        {
-            // the class name might have been truncated, retry with larger
-            // buffer
-            nLen *= 2;
-        }
-        else
-        {
-            break;
+        int                         nLen = 256; // some starting value
+
+       for ( ;; )
+       {
+           int                     nCount = ::WinQueryClassName((HWND)hWnd, nLen, wxStringBuffer(vStr, nLen));
+
+           if (nCount == nLen )
+           {
+               // the class name might have been truncated, retry with larger
+               // buffer
+               nLen *= 2;
+           }
+           else
+           {
+               break;
+           }
         }
     }
     return vStr;
index 08b942a31243a61e5760f271edf828361d4670a5..0db6e081e7fd00ee22571df606fda815580d9997 100644 (file)
@@ -128,8 +128,6 @@ QMSG                      s_currentMsg;
 wxMenu*                   wxCurrentPopupMenu = NULL;
 #endif // wxUSE_MENUS_NATIVE
 
-wxList*                   wxWinHandleList = NULL;
-
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
@@ -218,17 +216,17 @@ wxWindow* wxWindowOS2::FindItem(
     }
 #endif // wxUSE_CONTROLS
 
-    wxWindowList::Node*             pCurrent = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator  current = GetChildren().GetFirst();
 
-    while (pCurrent)
+    while (current)
     {
-        wxWindow*                   pChildWin = pCurrent->GetData();
+        wxWindow*                   pChildWin = current->GetData();
         wxWindow*                   pWnd = pChildWin->FindItem(lId);
 
         if (pWnd)
             return pWnd;
 
-        pCurrent = pCurrent->GetNext();
+        current = current->GetNext();
     }
     return(NULL);
 } // end of wxWindowOS2::FindItem
@@ -241,11 +239,11 @@ wxWindow* wxWindowOS2::FindItemByHWND(
 , bool                              bControlOnly
 ) const
 {
-    wxWindowList::Node*             pCurrent = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator current = GetChildren().GetFirst();
 
-    while (pCurrent)
+    while (current)
     {
-        wxWindow*                   pParent = pCurrent->GetData();
+        wxWindow*                   pParent = current->GetData();
 
         //
         // Do a recursive search.
@@ -261,7 +259,7 @@ wxWindow* wxWindowOS2::FindItemByHWND(
 #endif // wxUSE_CONTROLS
             )
         {
-            wxWindow*               pItem = pCurrent->GetData();
+            wxWindow*               pItem = current->GetData();
 
             if (pItem->GetHWND() == hWnd)
                 return(pItem);
@@ -271,7 +269,7 @@ wxWindow* wxWindowOS2::FindItemByHWND(
                     return(pItem);
             }
         }
-        pCurrent = pCurrent->GetNext();
+        current = current->GetNext();
     }
     return(NULL);
 } // end of wxWindowOS2::FindItemByHWND
@@ -506,11 +504,11 @@ bool wxWindowOS2::Enable(
     if (IsTopLevel())
         return TRUE;
 
-    wxWindowList::Node*             pNode = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator     node = GetChildren().GetFirst();
 
-    while (pNode)
+    while (node)
     {
-        wxWindow*                   pChild = pNode->GetData();
+        wxWindow*                   pChild = node->GetData();
 
         if (bEnable)
         {
@@ -540,7 +538,7 @@ bool wxWindowOS2::Enable(
                 m_pChildrenDisabled->Append(pChild);
             }
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
     if (bEnable && m_pChildrenDisabled)
     {
@@ -3006,15 +3004,17 @@ MRESULT wxWindowOS2::OS2WindowProc(
     return mResult;
 } // end of wxWindowOS2::OS2WindowProc
 
+// ----------------------------------------------------------------------------
+// wxWindow <-> HWND map
+// ----------------------------------------------------------------------------
+
+wxWinHashTable *wxWinHandleHash = NULL;
+
 wxWindow* wxFindWinFromHandle(
   WXHWND                            hWnd
 )
 {
-    wxNode*                         pNode = wxWinHandleList->Find((long)hWnd);
-
-    if (!pNode)
-        return NULL;
-    return (wxWindow *)pNode->GetData();
+    return (wxWindow *)wxWinHandleHash->Get((long)hWnd);
 } // end of wxFindWinFromHandle
 
 void wxAssociateWinWithHandle(
@@ -3042,9 +3042,9 @@ void wxAssociateWinWithHandle(
     }
     else if (!pOldWin)
     {
-        wxWinHandleList->Append( (long)hWnd
-                                ,pWin
-                               );
+        wxWinHandleHash->Put( (long)hWnd
+                             ,(wxWindow *)pWin
+                            );
     }
 } // end of wxAssociateWinWithHandle
 
@@ -3052,7 +3052,7 @@ void wxRemoveHandleAssociation(
   wxWindowOS2*                      pWin
 )
 {
-    wxWinHandleList->DeleteObject(pWin);
+    wxWinHandleHash->Delete((long)pWin->GetHWND());
 } // end of wxRemoveHandleAssociation
 
 //
@@ -3660,14 +3660,14 @@ void wxWindowOS2::OnSysColourChanged(
   wxSysColourChangedEvent&          rEvent
 )
 {
-    wxWindowListNode*               pNode = GetChildren().GetFirst();
+    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
 
-    while (pNode)
+    while (node)
     {
         //
         // Only propagate to non-top-level windows
         //
-        wxWindow*                   pWin = (wxWindow *)pNode->GetData();
+        wxWindow*                   pWin = (wxWindow *)node->GetData();
 
         if (pWin->GetParent())
         {
@@ -3676,7 +3676,7 @@ void wxWindowOS2::OnSysColourChanged(
             rEvent.m_eventObject = pWin;
             pWin->GetEventHandler()->ProcessEvent(vEvent);
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 } // end of wxWindowOS2::OnSysColourChanged
 
@@ -4412,11 +4412,11 @@ void wxWindowOS2::MoveChildren(
     {
         SWP                         vSwp;
 
-        for (wxWindowList::Node* pNode = GetChildren().GetFirst();
-             pNode;
-             pNode = pNode->GetNext())
+        for (wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
+             node;
+             node = node->GetNext())
         {
-            wxWindow*               pWin = pNode->GetData();
+            wxWindow*               pWin = node->GetData();
 
             ::WinQueryWindowPos( GetHwndOf(pWin)
                                 ,&vSwp
@@ -5311,7 +5311,7 @@ wxWindowOS2* FindWindowForMouseEvent(
 
         if (pWinUnderMouse)
         {
-            wxWindowList::Node*     pCurrent = pWinUnderMouse->GetChildren().GetFirst();
+            wxWindowList::compatibility_iterator current = pWinUnderMouse->GetChildren().GetFirst();
             wxWindow*               pGrandChild = NULL;
             RECTL                   vRect;
             POINTL                  vPoint2;
@@ -5320,9 +5320,9 @@ wxWindowOS2* FindWindowForMouseEvent(
             //
             // Find a child window mouse might be under
             //
-            while (pCurrent)
+            while (current)
             {
-                wxWindow*                   pChild = pCurrent->GetData();
+                wxWindow*                   pChild = current->GetData();
 
                 vPoint2.x = vPoint.x;
                 vPoint2.y = vPoint.y;
@@ -5333,11 +5333,11 @@ wxWindowOS2* FindWindowForMouseEvent(
                     if (pChild->IsTopLevel())
                     {
                         POINTL                  vPoint3;
-                        wxWindowList::Node*     pCurrent2 =pChild->GetChildren().GetFirst();
+                        wxWindowList::compatibility_iterator current2 =pChild->GetChildren().GetFirst();
 
-                        while (pCurrent2)
+                        while (current2)
                         {
-                            wxWindow*           pGrandChild = pCurrent2->GetData();
+                            wxWindow*           pGrandChild = current2->GetData();
 
                             vPoint3.x = vPoint2.x;
                             vPoint3.y = vPoint2.y;
@@ -5353,7 +5353,7 @@ wxWindowOS2* FindWindowForMouseEvent(
                                 pWinUnderMouse = pGrandChild;
                                 break;
                             }
-                            pCurrent2 = pCurrent2->GetNext();
+                            current2 = current2->GetNext();
                         }
                         if (pGrandChild)
                             break;
@@ -5365,7 +5365,7 @@ wxWindowOS2* FindWindowForMouseEvent(
                     if (rcVisible && rcEnabled)
                         break;
                 }
-                pCurrent = pCurrent->GetNext();
+                current = current->GetNext();
             }
         }
     }