]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/framecmn.cpp
fix for assert when setting tooltip for a readonly combo
[wxWidgets.git] / src / common / framecmn.cpp
index e07790dfd87ac880ca0b33cbeb44aa5cce056f22..3cc2dff527d745502ad526e86202dea0702c1870 100644 (file)
@@ -117,6 +117,61 @@ void wxFrameBase::DeleteAllBars()
 #endif // wxUSE_TOOLBAR
 }
 
+// ----------------------------------------------------------------------------
+// wxFrame size management: we exclude the areas taken by menu/status/toolbars
+// from the client area, so the client area is what's really available for the
+// frame contents
+// ----------------------------------------------------------------------------
+
+// get the origin of the client area in the client coordinates
+wxPoint wxFrameBase::GetClientAreaOrigin() const
+{
+    wxPoint pt(0, 0);
+
+#if wxUSE_TOOLBAR
+    if ( GetToolBar() && GetToolBar()->IsShown() )
+    {
+        int w, h;
+        GetToolBar()->GetSize(& w, & h);
+
+        if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
+        {
+            pt.x += w;
+        }
+        else
+        {
+            pt.y += h;
+        }
+    }
+#endif // wxUSE_TOOLBAR
+
+    return pt;
+}
+
+void wxFrameBase::DoScreenToClient(int *x, int *y) const
+{
+    wxWindow::DoScreenToClient(x, y);
+
+    // We may be faking the client origin.
+    // So a window that's really at (0, 30) may appear
+    // (to wxWin apps) to be at (0, 0).
+    wxPoint pt(GetClientAreaOrigin());
+    *x -= pt.x;
+    *y -= pt.y;
+}
+
+void wxFrameBase::DoClientToScreen(int *x, int *y) const
+{
+    // We may be faking the client origin.
+    // So a window that's really at (0, 30) may appear
+    // (to wxWin apps) to be at (0, 0).
+    wxPoint pt1(GetClientAreaOrigin());
+    *x += pt1.x;
+    *y += pt1.y;
+
+    wxWindow::DoClientToScreen(x, y);
+}
+
 // ----------------------------------------------------------------------------
 // misc
 // ----------------------------------------------------------------------------
@@ -141,15 +196,17 @@ bool wxFrameBase::ProcessCommand(int id)
     if ( !bar )
         return FALSE;
 
+    wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id);
+    commandEvent.SetEventObject(this);
+
     wxMenuItem *item = bar->FindItem(id);
     if ( item && item->IsCheckable() )
     {
         item->Toggle();
-    }
 
-    wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id);
-    commandEvent.SetInt(id);
-    commandEvent.SetEventObject(this);
+        // use the new value
+        commandEvent.SetInt(item->IsChecked());
+    }
 
     return GetEventHandler()->ProcessEvent(commandEvent);
 }
@@ -160,7 +217,7 @@ bool wxFrameBase::ProcessCommand(int id)
 
 // default resizing behaviour - if only ONE subwindow, resize to fill the
 // whole client area
-void wxFrameBase::OnSize(wxSizeEvent& event)
+void wxFrameBase::OnSize(wxSizeEvent& WXUNUSED(event))
 {
     // if we're using constraints - do use them
 #if wxUSE_CONSTRAINTS
@@ -210,9 +267,9 @@ void wxFrameBase::OnSize(wxSizeEvent& event)
             // for whatever reasons, wxGTK wants to have a small offset - it
             // probably looks better with it?
 #ifdef __WXGTK__
-            static const int ofs = 0;
-#else
             static const int ofs = 1;
+#else
+            static const int ofs = 0;
 #endif
 
             child->SetSize(ofs, ofs, clientW - 2*ofs, clientH - 2*ofs);
@@ -221,7 +278,7 @@ void wxFrameBase::OnSize(wxSizeEvent& event)
 }
 
 // The default implementation for the close window event.
-void wxFrameBase::OnCloseWindow(wxCloseEvent& event)
+void wxFrameBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
 {
     Destroy();
 }
@@ -229,29 +286,7 @@ void wxFrameBase::OnCloseWindow(wxCloseEvent& event)
 void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
 {
 #if wxUSE_STATUSBAR
-    if ( GetStatusBar() )
-    {
-        // if no help string found, we will clear the status bar text
-        wxString helpString;
-
-        int menuId = event.GetMenuId();
-        if ( menuId != wxID_SEPARATOR && menuId != -2 /* wxID_TITLE */ )
-        {
-            wxMenuBar *menuBar = GetMenuBar();
-            if ( menuBar )
-            {
-                // it's ok if we don't find the item because it might belong
-                // to the popup menu
-                wxMenuItem *item = menuBar->FindItem(menuId);
-                if ( item )
-                    helpString = item->GetHelp();
-            }
-        }
-
-        // set status text even if the string is empty - this will at least
-        // remove the string from the item which was previously selected
-        SetStatusText(helpString);
-    }
+    (void)ShowMenuHelp(GetStatusBar(), event.GetMenuId());
 #endif // wxUSE_STATUSBAR
 }
 
@@ -283,20 +318,18 @@ wxStatusBar *wxFrameBase::OnCreateStatusBar(int number,
                                             wxWindowID id,
                                             const wxString& name)
 {
-    wxStatusBar *statusBar = new wxStatusBar(this, id,
-                                             wxPoint(0, 0), wxSize(100, 20),
-                                             style, name);
+    wxStatusBar *statusBar = new wxStatusBar(this, id, style, name);
 
     // Set the height according to the font and the border size
     wxClientDC dc(statusBar);
     dc.SetFont(statusBar->GetFont());
 
-    long y;
+    wxCoord y;
     dc.GetTextExtent( "X", NULL, &y );
 
     int height = (int)( (11*y)/10 + 2*statusBar->GetBorderY());
 
-    statusBar->SetSize( -1, -1, 100, height );
+    statusBar->SetSize( -1, -1, -1, height );
 
     statusBar->SetFieldsCount(number);
 
@@ -319,6 +352,34 @@ void wxFrameBase::SetStatusWidths(int n, const int widths_field[] )
     PositionStatusBar();
 }
 
+bool wxFrameBase::ShowMenuHelp(wxStatusBar *statbar, int menuId)
+{
+    if ( !statbar )
+        return FALSE;
+
+    // if no help string found, we will clear the status bar text
+    wxString helpString;
+
+    if ( menuId != wxID_SEPARATOR && menuId != -2 /* wxID_TITLE */ )
+    {
+        wxMenuBar *menuBar = GetMenuBar();
+        if ( menuBar )
+        {
+            // it's ok if we don't find the item because it might belong
+            // to the popup menu
+            wxMenuItem *item = menuBar->FindItem(menuId);
+            if ( item )
+                helpString = item->GetHelp();
+        }
+    }
+
+    // set status text even if the string is empty - this will at least
+    // remove the string from the item which was previously selected
+    statbar->SetStatusText(helpString);
+
+    return !helpString.IsEmpty();
+}
+
 #endif // wxUSE_STATUSBAR
 
 // ----------------------------------------------------------------------------
@@ -366,18 +427,23 @@ void wxFrameBase::DoMenuUpdates()
 {
     wxMenuBar* bar = GetMenuBar();
 
+#ifdef __WXMSW__
+    wxWindow* focusWin = wxFindFocusDescendant((wxWindow*) this);
+#else
+    wxWindow* focusWin = (wxWindow*) NULL;
+#endif
     if ( bar != NULL )
     {
         int nCount = bar->GetMenuCount();
         for (int n = 0; n < nCount; n++)
-            DoMenuUpdates(bar->GetMenu(n), (wxWindow*) NULL);
+            DoMenuUpdates(bar->GetMenu(n), focusWin);
     }
 }
 
 // update a menu and all submenus recursively
-void wxFrameBase::DoMenuUpdates(wxMenu* menu, wxWindow* WXUNUSED(focusWin))
+void wxFrameBase::DoMenuUpdates(wxMenu* menu, wxWindow* focusWin)
 {
-    wxEvtHandler* evtHandler = GetEventHandler();
+    wxEvtHandler* evtHandler = focusWin ? focusWin->GetEventHandler() : GetEventHandler();
     wxMenuItemList::Node* node = menu->GetMenuItems().GetFirst();
     while (node)
     {