#include "wx/statusbr.h"
#endif
+// FIXME - temporary hack in absence of wxTLW in all ports!
+#ifndef wxTopLevelWindowNative
+ #define wxTopLevelWindow wxTopLevelWindowBase
+#endif
+
// ----------------------------------------------------------------------------
// event table
// ----------------------------------------------------------------------------
-BEGIN_EVENT_TABLE(wxFrameBase, wxWindow)
+BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow)
EVT_IDLE(wxFrameBase::OnIdle)
- EVT_CLOSE(wxFrameBase::OnCloseWindow)
EVT_MENU_HIGHLIGHT_ALL(wxFrameBase::OnMenuHighlight)
- EVT_SIZE(wxFrameBase::OnSize)
END_EVENT_TABLE()
// ============================================================================
#endif // wxUSE_STATUSBAR
}
-bool wxFrameBase::Destroy()
-{
- // delayed destruction: the frame will be deleted during the next idle
- // loop iteration
- if ( !wxPendingDelete.Member(this) )
- wxPendingDelete.Append(this);
-
- return TRUE;
-}
-
wxFrame *wxFrameBase::New(wxWindow *parent,
wxWindowID id,
const wxString& title,
// get the origin of the client area in the client coordinates
wxPoint wxFrameBase::GetClientAreaOrigin() const
{
- wxPoint pt(0, 0);
+ wxPoint pt = wxTopLevelWindow::GetClientAreaOrigin();
#if wxUSE_TOOLBAR
- if ( GetToolBar() && GetToolBar()->IsShown() )
+ wxToolBar *toolbar = GetToolBar();
+ if ( toolbar && toolbar->IsShown() )
{
int w, h;
- GetToolBar()->GetSize(& w, & h);
+ toolbar->GetSize(&w, &h);
- if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
+ if ( toolbar->GetWindowStyleFlag() & wxTB_VERTICAL )
{
pt.x += w;
}
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
// ----------------------------------------------------------------------------
-// make the window modal (all other windows unresponsive)
-void wxFrameBase::MakeModal(bool modal)
-{
- if ( modal )
- {
- wxEnableTopLevelWindows(FALSE);
- Enable(TRUE); // keep this window enabled
- }
- else
- {
- wxEnableTopLevelWindows(TRUE);
- }
-}
-
bool wxFrameBase::ProcessCommand(int id)
{
#if wxUSE_MENUS
commandEvent.SetEventObject(this);
wxMenuItem *item = bar->FindItem(id);
- if ( item && item->IsCheckable() )
+ if (item)
{
- item->Toggle();
+ if (!item->IsEnabled())
+ return TRUE;
- // use the new value
- commandEvent.SetInt(item->IsChecked());
+ if (item->IsCheckable())
+ {
+ item->Toggle();
+ // use the new value
+ commandEvent.SetInt(item->IsChecked());
+ }
}
return GetEventHandler()->ProcessEvent(commandEvent);
// event handlers
// ----------------------------------------------------------------------------
-// default resizing behaviour - if only ONE subwindow, resize to fill the
-// whole client area
-void wxFrameBase::OnSize(wxSizeEvent& WXUNUSED(event))
-{
- // if we're using constraints - do use them
-#if wxUSE_CONSTRAINTS
- if ( GetAutoLayout() )
- {
- Layout();
- }
- else
-#endif // wxUSE_CONSTRAINTS
- {
- // do we have _exactly_ one child?
- wxWindow *child = (wxWindow *)NULL;
- for ( wxWindowList::Node *node = GetChildren().GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *win = node->GetData();
-
- // 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() && !IsOneOfBars(win) )
- {
- if ( child )
- {
- return; // it's our second subwindow - nothing to do
- }
-
- child = win;
- }
- }
-
- // do we have any children at all?
- if ( child )
- {
- // exactly one child - set it's size to fill the whole frame
- int clientW, clientH;
- DoGetClientSize(&clientW, &clientH);
-
- // for whatever reasons, wxGTK wants to have a small offset - it
- // probably looks better with it?
-#ifdef __WXGTK__
- static const int ofs = 1;
-#else
- static const int ofs = 0;
-#endif
-
- child->SetSize(ofs, ofs, clientW - 2*ofs, clientH - 2*ofs);
- }
- }
-}
-
-// The default implementation for the close window event.
-void wxFrameBase::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
-{
- Destroy();
-}
-
void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
{
#if wxUSE_STATUSBAR
#endif // wxUSE_STATUSBAR
}
-bool wxFrameBase::SendIconizeEvent(bool iconized)
+void wxFrameBase::OnIdle(wxIdleEvent& WXUNUSED(event) )
{
- wxIconizeEvent event(GetId(), iconized);
- event.SetEventObject(this);
-
- return GetEventHandler()->ProcessEvent(event);
+#if wxUSE_MENUS
+ DoMenuUpdates();
+#endif // wxUSE_MENUS
}
// ----------------------------------------------------------------------------
{
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());
-
- wxCoord y;
- dc.GetTextExtent( "X", NULL, &y );
-
- int height = (int)( (11*y)/10 + 2*statusBar->GetBorderY());
-
- statusBar->SetSize( -1, -1, -1, height );
-
statusBar->SetFieldsCount(number);
return statusBar;
bool wxFrameBase::ShowMenuHelp(wxStatusBar *statbar, int menuId)
{
+#if wxUSE_MENUS
if ( !statbar )
return FALSE;
statbar->SetStatusText(helpString);
return !helpString.IsEmpty();
+#else // !wxUSE_MENUS
+ return FALSE;
+#endif // wxUSE_MENUS/!wxUSE_MENUS
}
#endif // wxUSE_STATUSBAR
#endif // wxUSE_TOOLBAR
// ----------------------------------------------------------------------------
-// Menu UI updating
+// menus
// ----------------------------------------------------------------------------
-void wxFrameBase::OnIdle(wxIdleEvent& WXUNUSED(event) )
-{
-#if wxUSE_MENUS
- DoMenuUpdates();
-#endif // wxUSE_MENUS
-}
-
#if wxUSE_MENUS
// update all menus
}
}
+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