]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/frame.cpp
more backwards compatible kbd handling in wxScrolledWindow
[wxWidgets.git] / src / msw / frame.cpp
index aa75762ebc54e6ad1072eaa888fbd8680157d6b1..1b2f3db2e9bde5d9046ab42e18b87a8d4c059083 100644 (file)
 
 extern wxWindowList wxModelessWindows;
 extern wxList WXDLLEXPORT wxPendingDelete;
-extern wxChar wxFrameClassName[];
+extern const wxChar *wxFrameClassName;
 extern wxMenu *wxCurrentPopupMenu;
 
 // ----------------------------------------------------------------------------
 // event tables
 // ----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARY
 BEGIN_EVENT_TABLE(wxFrame, wxFrameBase)
     EVT_ACTIVATE(wxFrame::OnActivate)
     EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged)
 END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
-#endif
 
 // ============================================================================
 // implementation
@@ -407,6 +405,38 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar)
         return;
     }
 
+    m_frameMenuBar = NULL;
+
+    // Can set a menubar several times.
+    // TODO: how to prevent a memory leak if you have a currently-unattached
+    // menubar? wxWindows assumes that the frame will delete the menu (otherwise
+    // there are problems for MDI).
+    if (menu_bar->GetHMenu())
+    {
+        m_hMenu = menu_bar->GetHMenu();
+    }
+    else
+    {
+        menu_bar->Detach();
+
+        m_hMenu = menu_bar->Create();
+
+        if ( !m_hMenu )
+            return;
+    }
+
+    InternalSetMenuBar();
+
+    m_frameMenuBar = menu_bar;
+    menu_bar->Attach(this);
+
+#if 0 // Old code that assumes only one call of SetMenuBar per frame.
+    if (!menu_bar)
+    {
+        DetachMenuBar();
+        return;
+    }
+
     wxCHECK_RET( !menu_bar->GetFrame(), wxT("this menubar is already attached") );
 
     if (m_frameMenuBar)
@@ -421,6 +451,7 @@ void wxFrame::SetMenuBar(wxMenuBar *menu_bar)
 
     m_frameMenuBar = menu_bar;
     menu_bar->Attach(this);
+#endif
 }
 
 void wxFrame::InternalSetMenuBar()
@@ -528,6 +559,15 @@ bool wxFrame::MSWCreate(int id, wxWindow *parent, const wxChar *wclass, wxWindow
 // subwindow found.
 void wxFrame::OnActivate(wxActivateEvent& event)
 {
+    if ( !event.GetActive() )
+    {
+        event.Skip();
+
+        return;
+    }
+
+    wxLogTrace(_T("focus"), _T("wxFrame %08x activated."), m_hWnd);
+
     for ( wxWindowList::Node *node = GetChildren().GetFirst();
           node;
           node = node->GetNext() )
@@ -548,60 +588,9 @@ void wxFrame::OnActivate(wxActivateEvent& event)
            )
         {
             child->SetFocus();
-            return;
-        }
-    }
-}
-
-// ----------------------------------------------------------------------------
-// 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
-// ----------------------------------------------------------------------------
-
-// Checks if there is a toolbar, and returns the first free client position
-wxPoint wxFrame::GetClientAreaOrigin() const
-{
-    wxPoint pt(0, 0);
-    if (GetToolBar())
-    {
-        int w, h;
-        GetToolBar()->GetSize(& w, & h);
-
-        if (GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL)
-        {
-            pt.x += w;
-        }
-        else
-        {
-            pt.y += h;
+            break;
         }
     }
-    return pt;
-}
-
-void wxFrame::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 wxFrame::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);
 }
 
 // ----------------------------------------------------------------------------