]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/tbar95.cpp
fixed client area origin handling in wxGTK
[wxWidgets.git] / src / msw / tbar95.cpp
index 46ab1c4fe25744aae16976962088527fd54fa044..3c1a1b65321ef56c8aaac73ce4df601465d3338c 100644 (file)
@@ -196,6 +196,8 @@ void wxToolBar::Init()
 
     m_defaultWidth = DEFAULTBITMAPX;
     m_defaultHeight = DEFAULTBITMAPY;
+
+    m_pInTool = 0;
 }
 
 bool wxToolBar::Create(wxWindow *parent,
@@ -264,11 +266,8 @@ wxToolBar::~wxToolBar()
 {
     // we must refresh the frame size when the toolbar is deleted but the frame
     // is not - otherwise toolbar leaves a hole in the place it used to occupy
-    //
-    // NB: a frame is being deleted only if it is not any longer in
-    //     wxTopLevelWindows list
     wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
-    if ( frame && wxTopLevelWindows.Find(frame) )
+    if ( frame && !frame->IsBeingDeleted() )
     {
         frame->SendSizeEvent();
     }
@@ -869,20 +868,24 @@ wxSize wxToolBar::GetToolSize() const
     }
 }
 
-static wxToolBarToolBase *GetItemSkippingDummySpacers( const wxToolBarToolsList& tools, size_t index )
+static
+wxToolBarToolBase *GetItemSkippingDummySpacers(const wxToolBarToolsList& tools,
+                                               size_t index )
 {
     wxToolBarToolsList::Node* current = tools.GetFirst();
 
-    for( ; current != 0; current = current->GetNext() )
+    for ( ; current != 0; current = current->GetNext() )
     {
-        if( index == 0 )
+        if ( index == 0 )
             return current->GetData();
-        size_t separators = ((wxToolBarTool*)current->GetData())->GetSeparatorsCount();
-        // if it is a normal button, sepcount == 0, so skip 1
-        // item ( the button )
-        // otherwise, skip as many items as the separator count,
-        // plus the control itself
-        index -= separators ? separators + 1: 1;
+
+        wxToolBarTool *tool = (wxToolBarTool *)current->GetData();
+        size_t separators = tool->GetSeparatorsCount();
+
+        // if it is a normal button, sepcount == 0, so skip 1 item (the button)
+        // otherwise, skip as many items as the separator count, plus the
+        // control itself
+        index -= separators ? separators + 1 : 1;
     }
 
     return 0;
@@ -894,26 +897,25 @@ wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
     pt.x = x;
     pt.y = y;
     int index = (int)::SendMessage(GetHwnd(), TB_HITTEST, 0, (LPARAM)&pt);
-    if ( index < 0 )
+    // MBN: when the point ( x, y ) is close to the toolbar border
+    //      TB_HITTEST returns m_nButtons ( not -1 )
+    if ( index < 0 || (size_t)index >= m_nButtons )
     {
         // it's a separator or there is no tool at all there
         return (wxToolBarToolBase *)NULL;
     }
 
-    // if comctl32 version < 4.71
-    // wxToolBar95 adds dummy spacers
+    // if comctl32 version < 4.71 wxToolBar95 adds dummy spacers
 #if defined(_WIN32_IE) && (_WIN32_IE >= 0x400 )
     if ( wxTheApp->GetComCtl32Version() >= 471 )
     {
         return m_tools.Item((size_t)index)->GetData();
     }
     else
+#endif
     {
         return GetItemSkippingDummySpacers( m_tools, (size_t) index );
     }
-#else
-    return GetItemSkippingDummySpacers( m_tools, (size_t) index );
-#endif
 }
 
 void wxToolBar::UpdateSize()