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_
// ---------------------------------------------------------------------------
extern wxChar* wxBuffer;
-extern wxList* wxWinHandleList;
extern wxList WXDLLEXPORT wxPendingDelete;
extern wxCursor* g_globalCursor;
// 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.
// TODO: ::DeleteObject( wxDisableButtonBrush );
}
- if (wxWinHandleList)
- delete wxWinHandleList;
+ delete wxWinHandleHash;
+ wxWinHandleHash = NULL;
// Delete Message queue
if (wxTheApp->m_hMq)
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())
//
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
{
// 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
//
wxMenuItem* pItem = NULL;
- for ( wxMenuItemList::Node *node = m_items.GetFirst();
+ for ( wxMenuItemList::compatibility_iterator node = m_items.GetFirst();
node && !pItem;
node = node->GetNext() )
{
}
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;
//
// 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);
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);
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);
#endif // wxUSE_ACCEL
Refresh();
}
- m_titles.Remove(nPos);
+ m_titles.RemoveAt(nPos);
return pMenu;
} // end of wxMenuBar::Remove
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)
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
) 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
*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
*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
//
// 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)
{
}
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
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
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 ...
//
// ...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)
//
// ... 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
);
#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);
// ----------------------------------------------------------------------------
IMPLEMENT_ABSTRACT_CLASS(wxTimer, wxEvtHandler)
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxTimer class
+// ----------------------------------------------------------------------------
+
void wxTimer::Init()
{
m_ulId = 0;
wxTimer::~wxTimer()
{
wxTimer::Stop();
-
- wxTimerList.DeleteObject(this);
}
void wxTimer::Notify()
wxCHECK_MSG( m_milli > 0L, FALSE, wxT("invalid value for timer") );
- wxTimerList.DeleteObject(this);
-
wxWindow* pWin = NULL;
if (m_owner)
);
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
{
}
else
::WinStopTimer(m_Hab, NULLHANDLE, m_ulId);
- wxTimerList.DeleteObject(this);
+
+ TimerMap().erase(m_ulId);
}
m_ulId = 0L;
}
, 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;
}
//
// 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())
{
if (pTool->GetHeight() > nMaxToolHeight)
nMaxToolHeight = pTool->GetHeight();
}
- pNode = pNode->GetNext();
+ node = node->GetNext();
}
wxCoord vTbWidth = 0L;
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())
{
if (m_vLastY > m_maxHeight)
m_maxHeight = m_vLastY;
- pNode = pNode->GetNext();
+ node = node->GetNext();
}
if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
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);
,&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())
{
return pTool;
}
}
- pNode = pNode->GetNext();
+ node = node->GetNext();
}
return (wxToolBarToolBase *)NULL;
} // end of wxToolBar::FindToolForPosition
)
{
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;
}
)
{
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;
wxMenu* wxCurrentPopupMenu = NULL;
#endif // wxUSE_MENUS_NATIVE
-wxList* wxWinHandleList = NULL;
-
// ---------------------------------------------------------------------------
// private functions
// ---------------------------------------------------------------------------
}
#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
, 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.
#endif // wxUSE_CONTROLS
)
{
- wxWindow* pItem = pCurrent->GetData();
+ wxWindow* pItem = current->GetData();
if (pItem->GetHWND() == hWnd)
return(pItem);
return(pItem);
}
}
- pCurrent = pCurrent->GetNext();
+ current = current->GetNext();
}
return(NULL);
} // end of wxWindowOS2::FindItemByHWND
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)
{
m_pChildrenDisabled->Append(pChild);
}
}
- pNode = pNode->GetNext();
+ node = node->GetNext();
}
if (bEnable && m_pChildrenDisabled)
{
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(
}
else if (!pOldWin)
{
- wxWinHandleList->Append( (long)hWnd
- ,pWin
- );
+ wxWinHandleHash->Put( (long)hWnd
+ ,(wxWindow *)pWin
+ );
}
} // end of wxAssociateWinWithHandle
wxWindowOS2* pWin
)
{
- wxWinHandleList->DeleteObject(pWin);
+ wxWinHandleHash->Delete((long)pWin->GetHWND());
} // end of wxRemoveHandleAssociation
//
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())
{
rEvent.m_eventObject = pWin;
pWin->GetEventHandler()->ProcessEvent(vEvent);
}
- pNode = pNode->GetNext();
+ node = node->GetNext();
}
} // end of wxWindowOS2::OnSysColourChanged
{
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
if (pWinUnderMouse)
{
- wxWindowList::Node* pCurrent = pWinUnderMouse->GetChildren().GetFirst();
+ wxWindowList::compatibility_iterator current = pWinUnderMouse->GetChildren().GetFirst();
wxWindow* pGrandChild = NULL;
RECTL vRect;
POINTL vPoint2;
//
// 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;
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;
pWinUnderMouse = pGrandChild;
break;
}
- pCurrent2 = pCurrent2->GetNext();
+ current2 = current2->GetNext();
}
if (pGrandChild)
break;
if (rcVisible && rcEnabled)
break;
}
- pCurrent = pCurrent->GetNext();
+ current = current->GetNext();
}
}
}