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
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)
m_frameMenuBar = menu_bar;
menu_bar->Attach(this);
+#endif
}
void wxFrame::InternalSetMenuBar()
// 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() )
)
{
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);
}
// ----------------------------------------------------------------------------