]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/framecmn.cpp
speed up font list processing
[wxWidgets.git] / src / common / framecmn.cpp
index c7678d5b5f55afd743a4735ff53594202680a002..318b662f28f77703de453322573db475a7c858d4 100644 (file)
     #pragma hdrstop
 #endif
 
-#include "wx/frame.h"
-#include "wx/menu.h"
-#include "wx/menuitem.h"
-#include "wx/dcclient.h"
+#ifndef WX_PRECOMP
+    #include "wx/frame.h"
+    #include "wx/menu.h"
+    #include "wx/menuitem.h"
+    #include "wx/dcclient.h"
+#endif // WX_PRECOMP
 
 #if wxUSE_TOOLBAR
     #include "wx/toolbar.h"
@@ -60,7 +62,9 @@ END_EVENT_TABLE()
 
 wxFrameBase::wxFrameBase()
 {
+#if wxUSE_MENUS
     m_frameMenuBar = NULL;
+#endif // wxUSE_MENUS
 
 #if wxUSE_TOOLBAR
     m_frameToolBar = NULL;
@@ -94,11 +98,13 @@ wxFrame *wxFrameBase::New(wxWindow *parent,
 
 void wxFrameBase::DeleteAllBars()
 {
+#if wxUSE_MENUS
     if ( m_frameMenuBar )
     {
         delete m_frameMenuBar;
         m_frameMenuBar = (wxMenuBar *) NULL;
     }
+#endif // wxUSE_MENUS
 
 #if wxUSE_STATUSBAR
     if ( m_frameStatusBar )
@@ -117,6 +123,26 @@ void wxFrameBase::DeleteAllBars()
 #endif // wxUSE_TOOLBAR
 }
 
+bool wxFrameBase::IsOneOfBars(const wxWindow *win) const
+{
+#if wxUSE_MENUS
+    if ( win == GetMenuBar() )
+        return TRUE;
+#endif // wxUSE_MENUS
+
+#if wxUSE_STATUSBAR
+    if ( win == GetStatusBar() )
+        return TRUE;
+#endif // wxUSE_STATUSBAR
+
+#if wxUSE_TOOLBAR
+    if ( win == GetToolBar() )
+        return TRUE;
+#endif // wxUSE_TOOLBAR
+
+    return FALSE;
+}
+
 // ----------------------------------------------------------------------------
 // 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
@@ -192,6 +218,7 @@ void wxFrameBase::MakeModal(bool modal)
 
 bool wxFrameBase::ProcessCommand(int id)
 {
+#if wxUSE_MENUS
     wxMenuBar *bar = GetMenuBar();
     if ( !bar )
         return FALSE;
@@ -209,6 +236,9 @@ bool wxFrameBase::ProcessCommand(int id)
     }
 
     return GetEventHandler()->ProcessEvent(commandEvent);
+#else // !wxUSE_MENUS
+    return FALSE;
+#endif // wxUSE_MENUS/!wxUSE_MENUS
 }
 
 // ----------------------------------------------------------------------------
@@ -226,7 +256,7 @@ void wxFrameBase::OnSize(wxSizeEvent& WXUNUSED(event))
         Layout();
     }
     else
-#endif
+#endif // wxUSE_CONSTRAINTS
     {
         // do we have _exactly_ one child?
         wxWindow *child = (wxWindow *)NULL;
@@ -239,14 +269,7 @@ void wxFrameBase::OnSize(wxSizeEvent& WXUNUSED(event))
             // exclude top level and managed windows (status bar isn't
             // currently in the children list except under wxMac anyhow, but
             // it makes no harm to test for it)
-            if ( !win->IsTopLevel()
-#if wxUSE_STATUSBAR
-                    && (win != GetStatusBar())
-#endif // wxUSE_STATUSBAR
-#if wxUSE_TOOLBAR
-                    && (win != GetToolBar())
-#endif // wxUSE_TOOLBAR
-               )
+            if ( !win->IsTopLevel() && !IsOneOfBars(win) )
             {
                 if ( child )
                 {
@@ -290,6 +313,21 @@ void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
 #endif // wxUSE_STATUSBAR
 }
 
+bool wxFrameBase::SendIconizeEvent(bool iconized)
+{
+    wxIconizeEvent event(GetId(), iconized);
+    event.SetEventObject(this);
+
+    return GetEventHandler()->ProcessEvent(event);
+}
+
+void wxFrameBase::OnIdle(wxIdleEvent& WXUNUSED(event) )
+{
+#if wxUSE_MENUS
+    DoMenuUpdates();
+#endif // wxUSE_MENUS
+}
+
 // ----------------------------------------------------------------------------
 // status bar stuff
 // ----------------------------------------------------------------------------
@@ -354,6 +392,7 @@ void wxFrameBase::SetStatusWidths(int n, const int widths_field[] )
 
 bool wxFrameBase::ShowMenuHelp(wxStatusBar *statbar, int menuId)
 {
+#if wxUSE_MENUS
     if ( !statbar )
         return FALSE;
 
@@ -378,6 +417,9 @@ bool wxFrameBase::ShowMenuHelp(wxStatusBar *statbar, int menuId)
     statbar->SetStatusText(helpString);
 
     return !helpString.IsEmpty();
+#else // !wxUSE_MENUS
+    return FALSE;
+#endif // wxUSE_MENUS/!wxUSE_MENUS
 }
 
 #endif // wxUSE_STATUSBAR
@@ -414,31 +456,33 @@ wxToolBar* wxFrameBase::OnCreateToolBar(long style,
 #endif // wxUSE_TOOLBAR
 
 // ----------------------------------------------------------------------------
-// Menu UI updating
+// menus
 // ----------------------------------------------------------------------------
 
-void wxFrameBase::OnIdle(wxIdleEvent& WXUNUSED(event) )
-{
-    DoMenuUpdates();
-}
+#if wxUSE_MENUS
 
 // update all menus
 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)
     {
@@ -465,3 +509,36 @@ void wxFrameBase::DoMenuUpdates(wxMenu* menu, wxWindow* WXUNUSED(focusWin))
         node = node->GetNext();
     }
 }
+
+void wxFrameBase::DetachMenuBar()
+{
+    if ( m_frameMenuBar )
+    {
+        m_frameMenuBar->Detach();
+        m_frameMenuBar = NULL;
+    }
+}
+
+void wxFrameBase::AttachMenuBar(wxMenuBar *menubar)
+{
+    if ( menubar )
+    {
+        m_frameMenuBar = menubar;
+        menubar->Attach((wxFrame *)this);
+    }
+}
+
+void wxFrameBase::SetMenuBar(wxMenuBar *menubar)
+{
+    if ( menubar == GetMenuBar() )
+    {
+        // nothing to do
+        return;
+    }
+
+    DetachMenuBar();
+
+    AttachMenuBar(menubar);
+}
+
+#endif // wxUSE_MENUS