From 1c4f8f8d180afa03110f52eb95f9b083088f5c03 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 1 Dec 1999 15:23:56 +0000 Subject: [PATCH] 1. wxMotif::wxFrame derives from wxFrameBase now 2. wxFrame::GetClientAreaOrigin() made common to all ports and documented git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4785 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/frame.tex | 23 +- include/wx/frame.h | 9 + include/wx/gtk/frame.h | 2 +- include/wx/gtk1/frame.h | 2 +- include/wx/motif/frame.h | 150 +++--------- include/wx/msw/frame.h | 7 - samples/toolbar/test.cpp | 7 +- src/common/framecmn.cpp | 55 +++++ src/motif/frame.cpp | 483 +++++++-------------------------------- src/motif/menu.cpp | 6 +- src/msw/frame.cpp | 51 ----- 11 files changed, 212 insertions(+), 583 deletions(-) diff --git a/docs/latex/wx/frame.tex b/docs/latex/wx/frame.tex index 7c8c2895a8..ba58e1fe8c 100644 --- a/docs/latex/wx/frame.tex +++ b/docs/latex/wx/frame.tex @@ -1,12 +1,14 @@ \section{\class{wxFrame}}\label{wxframe} -A frame is a window whose size and position can (usually) be changed by the user. It usually has -thick borders and a title bar, and can optionally contain a menu bar, toolbar and -status bar. A frame can contain any window that is not a frame or dialog. +A frame is a window whose size and position can (usually) be changed by the +user. It usually has thick borders and a title bar, and can optionally contain +a menu bar, toolbar and status bar. A frame can contain any window that is not +a frame or dialog. -A frame that has a status bar and toolbar created via the CreateStatusBar/CreateToolBar functions -manages these windows, and adjusts the value returned by GetClientSize to reflect -the remaining size available to application windows. +A frame that has a status bar and toolbar created via the +CreateStatusBar/CreateToolBar functions manages these windows, and adjusts the +value returned by GetClientSize to reflect the remaining size available to +application windows. \wxheading{Derived from} @@ -37,7 +39,7 @@ the remaining size available to application windows. \twocolitem{\windowstyle{wxFRAME\_FLOAT\_ON\_PARENT}}{Causes the frame to be above the parent window in the z-order and not shown in the taskbar. Without this style, frames are created as top-level windows that may be obscured by the parent window, and frame titles are shown in the taskbar. Windows only. } -\twocolitem{\windowstyle{wxFRAME\_TOOL\_WINDOW}}Causes a frame with a small titlebar to be created; +\twocolitem{\windowstyle{wxFRAME\_TOOL\_WINDOW}}{Causes a frame with a small titlebar to be created; the frame title does not appear in the taskbar. Windows only. } \end{twocollist} @@ -214,6 +216,13 @@ reflect the available space for application windows. \helpref{wxFrame::SetToolBar}{wxframesettoolbar},\rtfsp \helpref{wxFrame::GetToolBar}{wxframegettoolbar} +\membersection{wxFrame::GetClientAreaOrigin}\label{wxframegetclientareaorigin} + +\constfunc{wxPoint}{GetClientAreaOrigin}{\void} + +Returns the origin of the frame client area (in client coordinates). It may be +different from (0, 0) if the frame has a toolbar. + \membersection{wxFrame::GetMenuBar}\label{wxframegetmenubar} \constfunc{wxMenuBar*}{GetMenuBar}{\void} diff --git a/include/wx/frame.h b/include/wx/frame.h index 831e122705..b8308307e4 100644 --- a/include/wx/frame.h +++ b/include/wx/frame.h @@ -85,6 +85,10 @@ public: // make the window modal (all other windows unresponsive) virtual void MakeModal(bool modal = TRUE); + // get the origin of the client area (which may be different from (0, 0) + // if the frame has a toolbar) in client coordinates + virtual wxPoint GetClientAreaOrigin() const; + // menu bar functions // ------------------ @@ -190,6 +194,11 @@ protected: wxToolBar *m_frameToolBar; #endif // wxUSE_TOOLBAR + // the frame client to screen translation should take account of the + // toolbar which may shift the origin of the client area + virtual void DoClientToScreen(int *x, int *y) const; + virtual void DoScreenToClient(int *x, int *y) const; + // the frame icon wxIcon m_icon; diff --git a/include/wx/gtk/frame.h b/include/wx/gtk/frame.h index 97cec7f13b..bb8dd7b0d5 100644 --- a/include/wx/gtk/frame.h +++ b/include/wx/gtk/frame.h @@ -109,7 +109,7 @@ protected: // common part of all ctors void Init(); - // override wxWindow methods to take into account tool/menu/statusbars + // override wxWindow methods to take into account tool/menu/statusbars virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); diff --git a/include/wx/gtk1/frame.h b/include/wx/gtk1/frame.h index 97cec7f13b..bb8dd7b0d5 100644 --- a/include/wx/gtk1/frame.h +++ b/include/wx/gtk1/frame.h @@ -109,7 +109,7 @@ protected: // common part of all ctors void Init(); - // override wxWindow methods to take into account tool/menu/statusbars + // override wxWindow methods to take into account tool/menu/statusbars virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); diff --git a/include/wx/motif/frame.h b/include/wx/motif/frame.h index 1e932f95f3..7eef0ba08b 100644 --- a/include/wx/motif/frame.h +++ b/include/wx/motif/frame.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: frame.h +// Name: wx/motif/frame.h // Purpose: wxFrame class // Author: Julian Smart // Modified by: @@ -9,30 +9,17 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef _WX_FRAME_H_ -#define _WX_FRAME_H_ +#ifndef _WX_MOTIF_FRAME_H_ +#define _WX_MOTIF_FRAME_H_ #ifdef __GNUG__ -#pragma interface "frame.h" + #pragma interface "frame.h" #endif -#include "wx/window.h" -#include "wx/toolbar.h" -#include "wx/accel.h" -#include "wx/icon.h" - -WXDLLEXPORT_DATA(extern const char*) wxFrameNameStr; -WXDLLEXPORT_DATA(extern const char*) wxToolBarNameStr; - -class WXDLLEXPORT wxMenuBar; -class WXDLLEXPORT wxStatusBar; - -class WXDLLEXPORT wxFrame : public wxWindow +class WXDLLEXPORT wxFrame : public wxFrameBase { -DECLARE_DYNAMIC_CLASS(wxFrame) - public: - wxFrame(); + wxFrame() { Init(); } wxFrame(wxWindow *parent, wxWindowID id, const wxString& title, @@ -41,126 +28,75 @@ public: long style = wxDEFAULT_FRAME_STYLE, const wxString& name = wxFrameNameStr) { + Init(); + Create(parent, id, title, pos, size, style, name); } - ~wxFrame(); - bool Create(wxWindow *parent, - wxWindowID id, - const wxString& title, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxDEFAULT_FRAME_STYLE, - const wxString& name = wxFrameNameStr); + wxWindowID id, + const wxString& title, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxDEFAULT_FRAME_STYLE, + const wxString& name = wxFrameNameStr); - virtual bool Destroy(); - - void ClientToScreen(int *x, int *y) const; - wxPoint ClientToScreen(const wxPoint& pt) const { return wxWindow::ClientToScreen(pt); } - - void ScreenToClient(int *x, int *y) const; - wxPoint ScreenToClient(const wxPoint& pt) const { return wxWindow::ScreenToClient(pt); } - - void OnSize(wxSizeEvent& event); - void OnMenuHighlight(wxMenuEvent& event); - void OnActivate(wxActivateEvent& event); - void OnIdle(wxIdleEvent& event); - void OnCloseWindow(wxCloseEvent& event); + virtual ~wxFrame(); bool Show(bool show); // Set menu bar void SetMenuBar(wxMenuBar *menu_bar); - virtual wxMenuBar *GetMenuBar() const ; // Set title void SetTitle(const wxString& title); wxString GetTitle() const { return m_title; } - virtual bool IsTopLevel() const { return TRUE; } - - void Centre(int direction = wxBOTH); - - // Call this to simulate a menu command - virtual void Command(int id); - virtual void ProcessCommand(int id); - // Set icon virtual void SetIcon(const wxIcon& icon); - // Create status line - virtual wxStatusBar* CreateStatusBar(int number=1, long style = wxST_SIZEGRIP, wxWindowID id = 0, - const wxString& name = "statusBar"); - wxStatusBar *GetStatusBar() const { return m_frameStatusBar; } +#if wxUSE_STATUSBAR virtual void PositionStatusBar(); - virtual wxStatusBar *OnCreateStatusBar(int number, long style, wxWindowID id, - const wxString& name); +#endif // wxUSE_STATUSBAR // Create toolbar #if wxUSE_TOOLBAR virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER|wxTB_HORIZONTAL, wxWindowID id = -1, const wxString& name = wxToolBarNameStr); - virtual wxToolBar *OnCreateToolBar(long style, wxWindowID id, const wxString& name); - // If made known to the frame, the frame will manage it automatically. - virtual void SetToolBar(wxToolBar *toolbar) ; - virtual wxToolBar *GetToolBar() const ; virtual void PositionToolBar(); #endif // wxUSE_TOOLBAR - // Set status line text - virtual void SetStatusText(const wxString& text, int number = 0); - - // Set status line widths - virtual void SetStatusWidths(int n, const int widths_field[]); - - // Hint to tell framework which status bar to use - // TODO: should this go into a wxFrameworkSettings class perhaps? - static void UseNativeStatusBar(bool useNative) { m_useNativeStatusBar = useNative; }; - static bool UsesNativeStatusBar() { return m_useNativeStatusBar; }; - - // Fit frame around subwindows - virtual void Fit(); - // Iconize virtual void Iconize(bool iconize); - virtual bool IsIconized() const ; - - // Compatibility - bool Iconized() const { return IsIconized(); } + virtual bool IsIconized() const; // Is the frame maximized? Returns FALSE under Motif (but TRUE for // wxMDIChildFrame due to the tabbed implementation). - virtual bool IsMaximized(void) const ; + virtual bool IsMaximized() const; virtual void Maximize(bool maximize); - // Responds to colour changes - void OnSysColourChanged(wxSysColourChangedEvent& event); - - // Query app for menu item updates (called from OnIdle) - void DoMenuUpdates(); - void DoMenuUpdates(wxMenu* menu, wxWindow* focusWin); - - // Checks if there is a toolbar, and returns the first free client position - virtual wxPoint GetClientAreaOrigin() const; - virtual void Raise(); virtual void Lower(); - virtual void CaptureMouse(); - virtual void ReleaseMouse(); + virtual void Restore(); + + // Implementation only from now on + // ------------------------------- + + void OnSysColourChanged(wxSysColourChangedEvent& event); + void OnActivate(wxActivateEvent& event); - // Implementation virtual void ChangeFont(bool keepOriginalSize = TRUE); virtual void ChangeBackgroundColour(); virtual void ChangeForegroundColour(); - WXWidget GetMenuBarWidget() const ; + WXWidget GetMenuBarWidget() const; WXWidget GetShellWidget() const { return m_frameShell; } WXWidget GetWorkAreaWidget() const { return m_workArea; } WXWidget GetClientAreaWidget() const { return m_clientArea; } WXWidget GetTopWidget() const { return m_frameShell; } - WXWidget GetMainWindowWidget() const { return m_frameWidget; } + + virtual WXWidget GetMainWidget() const { return m_frameWidget; } // The widget that can have children on it WXWidget GetClientWidget() const; @@ -169,40 +105,30 @@ public: bool PreResize(); protected: - void DoGetClientSize(int *width, int *height) const; - void DoGetSize(int *width, int *height) const ; - void DoGetPosition(int *x, int *y) const ; - -protected: - wxMenuBar * m_frameMenuBar; - wxStatusBar * m_frameStatusBar; - wxIcon m_icon; - bool m_iconized; - static bool m_useNativeStatusBar; - -#if wxUSE_TOOLBAR - wxToolBar * m_frameToolBar ; -#endif // wxUSE_TOOLBAR + // common part of all ctors + void Init(); //// Motif-specific - WXWidget m_frameShell; WXWidget m_frameWidget; WXWidget m_workArea; WXWidget m_clientArea; - // WXWidget m_menuBarWidget; - bool m_visibleStatus; wxString m_title; + bool m_visibleStatus; + bool m_iconized; + virtual void DoGetClientSize(int *width, int *height) const; + virtual void DoGetSize(int *width, int *height) const; + virtual void DoGetPosition(int *x, int *y) const; virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); - virtual void DoSetClientSize(int width, int height); private: DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxFrame) }; #endif - // _WX_FRAME_H_ + // _WX_MOTIF_FRAME_H_ diff --git a/include/wx/msw/frame.h b/include/wx/msw/frame.h index 81f12ec2bc..4294359921 100644 --- a/include/wx/msw/frame.h +++ b/include/wx/msw/frame.h @@ -94,10 +94,6 @@ public: WXHMENU GetWinMenu() const { return m_hMenu; } - // Returns the origin of client area (may be different from (0,0) if the - // frame has a toolbar) - virtual wxPoint GetClientAreaOrigin() const; - // event handlers bool HandlePaint(); bool HandleSize(int x, int y, WXUINT flag); @@ -128,9 +124,6 @@ protected: virtual void DoSetClientSize(int width, int height); - virtual void DoClientToScreen(int *x, int *y) const; - virtual void DoScreenToClient(int *x, int *y) const; - // helper void DetachMenuBar(); diff --git a/samples/toolbar/test.cpp b/samples/toolbar/test.cpp index 43bd0d143c..75481427fd 100644 --- a/samples/toolbar/test.cpp +++ b/samples/toolbar/test.cpp @@ -349,7 +349,7 @@ void MyFrame::OnToolLeftClick(wxCommandEvent& event) { DoToggleHelp(); } - + if (event.GetId() == wxID_PRINT) { DoDeletePrint(); @@ -373,8 +373,9 @@ void MyFrame::DoEnablePrint() void MyFrame::DoDeletePrint() { wxToolBar *tb = GetToolBar(); - // Not implemented in MSW -#ifdef __WXMSW__ + + // only implemented in wxGTK for now +#ifndef __WXGTK__ wxMessageBox("Sorry, wxToolBar::DeleteTool is not implemented under Windows."); #else tb->DeleteTool( wxID_PRINT ); diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp index e07790dfd8..39055b4afb 100644 --- a/src/common/framecmn.cpp +++ b/src/common/framecmn.cpp @@ -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() ) + { + 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 // ---------------------------------------------------------------------------- diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index d0f167c9bb..6f3126fefd 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: frame.cpp +// Name: motif/frame.cpp // Purpose: wxFrame // Author: Julian Smart // Modified by: @@ -9,8 +9,16 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + #ifdef __GNUG__ -#pragma implementation "frame.h" + #pragma implementation "frame.h" #endif #include "wx/frame.h" @@ -25,18 +33,19 @@ #include "wx/utils.h" #ifdef __VMS__ -#pragma message disable nosimpint + #pragma message disable nosimpint #endif + #if defined(__ultrix) || defined(__sgi) -#include + #include #endif #include #include #if XmVersion >= 1002 -#include + #include #else -#include + #include #endif #include #include @@ -48,20 +57,29 @@ #include #include #if XmVersion > 1000 -#include + #include #endif + #ifdef __VMS__ -#pragma message enable nosimpint + #pragma message enable nosimpint #endif #include "wx/motif/private.h" -void wxCloseFrameCallback(Widget, XtPointer, XmAnyCallbackStruct *cbs); -void wxFrameFocusProc(Widget workArea, XtPointer clientData, - XmAnyCallbackStruct *cbs); +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static void wxCloseFrameCallback(Widget, XtPointer, XmAnyCallbackStruct *cbs); +static void wxFrameFocusProc(Widget workArea, XtPointer clientData, + XmAnyCallbackStruct *cbs); static void wxFrameMapProc(Widget frameShell, XtPointer clientData, XCrossingEvent * event); +// ---------------------------------------------------------------------------- +// globals +// ---------------------------------------------------------------------------- + extern wxList wxModelessWindows; extern wxList wxPendingDelete; @@ -69,35 +87,29 @@ extern wxList wxPendingDelete; // top frame static bool wxTopLevelUsed = FALSE; +// ---------------------------------------------------------------------------- +// wxWin macros +// ---------------------------------------------------------------------------- + #if !USE_SHARED_LIBRARY -BEGIN_EVENT_TABLE(wxFrame, wxWindow) - EVT_SIZE(wxFrame::OnSize) - EVT_ACTIVATE(wxFrame::OnActivate) - EVT_MENU_HIGHLIGHT_ALL(wxFrame::OnMenuHighlight) - EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) - EVT_IDLE(wxFrame::OnIdle) - EVT_CLOSE(wxFrame::OnCloseWindow) +BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) + EVT_ACTIVATE(wxFrame::OnActivate) + EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) #endif -#if wxUSE_NATIVE_STATUSBAR -bool wxFrame::m_useNativeStatusBar = TRUE; -#else -bool wxFrame::m_useNativeStatusBar = FALSE; -#endif - -wxFrame::wxFrame() -{ -#if wxUSE_TOOLBAR - m_frameToolBar = NULL ; -#endif // wxUSE_TOOLBAR +// ============================================================================ +// implementation +// ============================================================================ - m_frameMenuBar = NULL; - m_frameStatusBar = NULL; +// ---------------------------------------------------------------------------- +// frame construction +// ---------------------------------------------------------------------------- - m_parent = NULL; +void wxFrame::Init() +{ m_iconized = FALSE; //// Motif-specific @@ -106,7 +118,6 @@ wxFrame::wxFrame() m_workArea = (WXWidget) NULL;; m_clientArea = (WXWidget) NULL;; m_visibleStatus = TRUE; - m_title = ""; } bool wxFrame::Create(wxWindow *parent, @@ -117,25 +128,16 @@ bool wxFrame::Create(wxWindow *parent, long style, const wxString& name) { - if (!parent) + if ( parent ) + AddChild(this); + else wxTopLevelWindows.Append(this); + wxModelessWindows.Append(this); + SetName(name); m_windowStyle = style; - m_frameMenuBar = NULL; -#if wxUSE_TOOLBAR - m_frameToolBar = NULL ; -#endif // wxUSE_TOOLBAR - m_frameStatusBar = NULL; - - //// Motif-specific - m_frameShell = (WXWidget) NULL; - m_frameWidget = (WXWidget) NULL;; - m_workArea = (WXWidget) NULL;; - m_clientArea = (WXWidget) NULL;; - m_visibleStatus = TRUE; - m_title = ""; m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE); m_foregroundColour = *wxBLACK; @@ -146,10 +148,6 @@ bool wxFrame::Create(wxWindow *parent, else m_windowId = (int)NewControlId(); - if (parent) parent->AddChild(this); - - wxModelessWindows.Append(this); - int x = pos.x, y = pos.y; int width = size.x, height = size.y; @@ -177,6 +175,7 @@ bool wxFrame::Create(wxWindow *parent, if (y < 10) y = 10; } + // VZ: what does this do?? if (wxTopLevelUsed) { // Change suggested by Matthew Flatt @@ -204,9 +203,9 @@ bool wxFrame::Create(wxWindow *parent, XmNiconic, (style & wxICONIZE) ? TRUE : FALSE, NULL); - if (!title.IsNull()) + if (!title.IsEmpty()) XtVaSetValues((Widget) m_frameShell, - XmNtitle, (const char*) title, + XmNtitle, title.c_str(), NULL); m_frameWidget = (WXWidget) XtVaCreateManagedWidget("main_window", @@ -230,7 +229,8 @@ bool wxFrame::Create(wxWindow *parent, // XmNresizePolicy, XmRESIZE_ANY, NULL); - wxLogDebug("Created frame (0x%08x) with work area 0x%08x and client " + wxLogTrace(wxTRACE_Messages, + "Created frame (0x%08x) with work area 0x%08x and client " "area 0x%08x", m_frameWidget, m_workArea, m_clientArea); XtAddEventHandler((Widget) m_clientArea, ExposureMask,FALSE, @@ -245,7 +245,7 @@ bool wxFrame::Create(wxWindow *parent, wxAddWindowToTable((Widget) m_workArea, this); - XtTranslations ptr ; + XtTranslations ptr; XtOverrideTranslations((Widget) m_workArea, ptr = XtParseTranslationTable(": resize()")); @@ -276,9 +276,9 @@ bool wxFrame::Create(wxWindow *parent, // This patch comes from Torsten Liermann lier@lier1.muc.de if (XmIsMotifWMRunning( (Widget) m_frameShell )) { - int decor = 0 ; + int decor = 0; if (style & wxRESIZE_BORDER) - decor |= MWM_DECOR_RESIZEH ; + decor |= MWM_DECOR_RESIZEH; if (style & wxSYSTEM_MENU) decor |= MWM_DECOR_MENU; if ((style & wxCAPTION) || @@ -293,7 +293,7 @@ bool wxFrame::Create(wxWindow *parent, decor |= MWM_DECOR_MINIMIZE; if (style & wxMAXIMIZE_BOX) decor |= MWM_DECOR_MAXIMIZE; - XtVaSetValues((Widget) m_frameShell,XmNmwmDecorations,decor,NULL) ; + XtVaSetValues((Widget) m_frameShell,XmNmwmDecorations,decor,NULL); } // This allows non-Motif window managers to support at least the // no-decorations case. @@ -355,23 +355,13 @@ wxFrame::~wxFrame() wxModelessWindows.DeleteObject(this); if (m_frameStatusBar) + { delete m_frameStatusBar; + m_frameStatusBar = NULL; + } DestroyChildren(); - /* - int i; - for (i = 0; i < wxMAX_STATUS; i++) - if (statusTextWidget[i]) - XtDestroyWidget (statusTextWidget[i]); - - if (statusLineForm) - XtDestroyWidget (statusLineForm); - - if (statusLineWidget) - XtDestroyWidget (statusLineWidget); - */ - if (m_workArea) { wxDeleteWindowFromTable((Widget) m_workArea); @@ -402,7 +392,6 @@ wxFrame::~wxFrame() wxTheApp->ExitMainLoop(); } } - } // Get size *available for subwindows* i.e. excluding menu bar, toolbar etc. @@ -572,13 +561,18 @@ void wxFrame::Iconize(bool iconize) XtVaSetValues((Widget) m_frameShell, XmNiconic, (Boolean)iconize, NULL); } -// Equivalent to maximize/restore in Windows +void wxFrame::Restore() +{ + if ( m_frameShell ) + XtVaSetValues((Widget) m_frameShell, XmNiconic, FALSE, NULL); +} + void wxFrame::Maximize(bool maximize) { Show(TRUE); - if (maximize && m_frameShell) - XtVaSetValues((Widget) m_frameShell, XmNiconic, FALSE, NULL); + if ( maximize ) + Restore(); } bool wxFrame::IsIconized() const @@ -592,7 +586,7 @@ bool wxFrame::IsIconized() const } // Is it maximized? -bool wxFrame::IsMaximized(void) const +bool wxFrame::IsMaximized() const { // No maximizing in Motif (?) return FALSE; @@ -607,8 +601,8 @@ void wxFrame::SetTitle(const wxString& title) if (!title.IsNull()) XtVaSetValues((Widget) m_frameShell, - XmNtitle, (const char*) title, - XmNiconName, (const char*) title, + XmNtitle, title.c_str(), + XmNiconName, title.c_str(), NULL); } @@ -625,62 +619,6 @@ void wxFrame::SetIcon(const wxIcon& icon) XtVaSetValues((Widget) m_frameShell, XtNiconPixmap, icon.GetPixmap(), NULL); } -wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id, - const wxString& name) -{ - wxStatusBar *statusBar = NULL; - - statusBar = new wxStatusBar(this, id, wxPoint(0, 0), wxSize(100, 20), - style, name); - - // Set the height according to the font and the border size - wxClientDC dc(statusBar); - dc.SetFont(statusBar->GetFont()); - - long x, y; - dc.GetTextExtent("X", &x, &y); - - int height = (int)( (y * 1.1) + 2* statusBar->GetBorderY()); - - statusBar->SetSize(-1, -1, 100, height); - - statusBar->SetFieldsCount(number); - return statusBar; -} - -wxStatusBar* wxFrame::CreateStatusBar(int number, long style, wxWindowID id, - const wxString& name) -{ - // Calling CreateStatusBar twice is an error. - wxCHECK_MSG( m_frameStatusBar == NULL, FALSE, - "recreating status bar in wxFrame" ); - - m_frameStatusBar = OnCreateStatusBar(number, style, id, - name); - if ( m_frameStatusBar ) - { - PositionStatusBar(); - return m_frameStatusBar; - } - else - return NULL; -} - -void wxFrame::SetStatusText(const wxString& text, int number) -{ - wxCHECK_RET( m_frameStatusBar != NULL, "no statusbar to set text for" ); - - m_frameStatusBar->SetStatusText(text, number); -} - -void wxFrame::SetStatusWidths(int n, const int widths_field[]) -{ - wxCHECK_RET( m_frameStatusBar != NULL, "no statusbar to set widths for" ); - - m_frameStatusBar->SetStatusWidths(n, widths_field); - PositionStatusBar(); -} - void wxFrame::PositionStatusBar() { if (!m_frameStatusBar) @@ -725,35 +663,6 @@ void wxFrame::SetMenuBar(wxMenuBar *menuBar) m_frameMenuBar->CreateMenuBar(this); } -void wxFrame::Fit() -{ - // Work out max. size - wxNode *node = GetChildren().First(); - int max_width = 0; - int max_height = 0; - while (node) - { - // Find a child that's a subwindow, but not a dialog box. - wxWindow *win = (wxWindow *)node->Data(); - - if (!win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog))) - { - int width, height; - int x, y; - win->GetSize(&width, &height); - win->GetPosition(&x, &y); - - if ((x + width) > max_width) - max_width = x + width; - if ((y + height) > max_height) - max_height = y + height; - } - node = node->Next(); - } - SetClientSize(max_width, max_height); -} - // Responds to colour changes, and passes event on to children. void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { @@ -771,49 +680,6 @@ void wxFrame::OnSysColourChanged(wxSysColourChangedEvent& event) wxWindow::OnSysColourChanged(event); } -// Default resizing behaviour - if only ONE subwindow, -// resize to client rectangle size -void wxFrame::OnSize(wxSizeEvent& WXUNUSED(event)) -{ - // if we're using constraints - do use them -#if wxUSE_CONSTRAINTS - if ( GetAutoLayout() ) { - Layout(); - return; - } -#endif - - // do we have _exactly_ one child? - wxWindow *child = NULL; - for ( wxNode *node = GetChildren().First(); node; node = node->Next() ) - { - wxWindow *win = (wxWindow *)node->Data(); - if ( !win->IsKindOf(CLASSINFO(wxFrame)) && - !win->IsKindOf(CLASSINFO(wxDialog)) && - (win != GetStatusBar()) -#if wxUSE_TOOLBAR - && (win != GetToolBar()) -#endif // wxUSE_TOOLBAR - ) - { - if ( child ) - return; // it's our second subwindow - nothing to do - child = win; - } - } - - if ( child ) { - // we have exactly one child - set it's size to fill the whole frame - int clientW, clientH; - GetClientSize(&clientW, &clientH); - - int x = 0; - int y = 0; - - child->SetSize(x, y, clientW, clientH); - } -} - // Default activation behaviour - set the focus for the first child // subwindow found. void wxFrame::OnActivate(wxActivateEvent& event) @@ -834,190 +700,27 @@ void wxFrame::OnActivate(wxActivateEvent& event) } } -// The default implementation for the close window event. -// OnClose for backward compatibility. - -void wxFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) -{ - this->Destroy(); -} - -#ifdef __VMS__ -// I added this function because I got missing symbols when linking -// Maybe it should be included on all platforms. But what should it do? -void wxFrame::OnIdle(wxIdleEvent& WXUNUSED(event)) -{ -} -#endif - -// Destroy the window (delayed, if a managed window) -bool wxFrame::Destroy() -{ - if (!wxPendingDelete.Member(this)) - wxPendingDelete.Append(this); - return TRUE; -} - -// Default menu selection behaviour - display a help string -void wxFrame::OnMenuHighlight(wxMenuEvent& event) -{ - if (GetStatusBar()) - { - if (event.GetMenuId() == -1) - SetStatusText(""); - else - { - wxMenuBar *menuBar = GetMenuBar(); - if (menuBar) - { - wxString helpString(menuBar->GetHelpString(event.GetMenuId())); - if (helpString != "") - SetStatusText(helpString); - } - } - } -} - -wxMenuBar *wxFrame::GetMenuBar() const -{ - return m_frameMenuBar; -} - -void wxFrame::Centre(int direction) -{ - int display_width, display_height, width, height, x, y; - wxDisplaySize(&display_width, &display_height); - - GetSize(&width, &height); - GetPosition(&x, &y); - - if (direction & wxHORIZONTAL) - x = (int)((display_width - width)/2); - if (direction & wxVERTICAL) - y = (int)((display_height - height)/2); - - SetSize(x, y, width, height); -} - -// Call this to simulate a menu command -void wxFrame::Command(int id) -{ - ProcessCommand(id); -} - -void wxFrame::ProcessCommand(int id) -{ - wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); - commandEvent.SetInt( id ); - commandEvent.SetEventObject( this ); - - wxMenuBar *bar = GetMenuBar() ; - if (!bar) - return; - -/* TODO: check the menu item if required - wxMenuItem *item = bar->FindItemForId(id) ; - if (item && item->IsCheckable()) - { - bar->Check(id,!bar->Checked(id)) ; - } -*/ - - wxEvtHandler* evtHandler = GetEventHandler(); - - evtHandler->ProcessEvent(commandEvent); -} - -// Checks if there is a toolbar, and returns the first free client position -wxPoint wxFrame::GetClientAreaOrigin() const -{ - wxPoint pt(0, 0); #if wxUSE_TOOLBAR - if (GetToolBar()) - { - 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 wxFrame::ScreenToClient(int *x, int *y) const -{ - wxWindow::ScreenToClient(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::ClientToScreen(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::ClientToScreen(x, y); -} - -#if wxUSE_TOOLBAR -wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID id, const wxString& name) +wxToolBar* wxFrame::CreateToolBar(long style, + wxWindowID id, + const wxString& name) { - wxCHECK_MSG( m_frameToolBar == NULL, FALSE, - "recreating toolbar in wxFrame" ); - - wxToolBar* toolBar = OnCreateToolBar(style, id, name); - if (toolBar) + if ( wxFrameBase::CreateToolBar(style, id, name) ) { - SetToolBar(toolBar); PositionToolBar(); - return toolBar; - } - else - { - return NULL; } -} -wxToolBar* wxFrame::OnCreateToolBar(long style, wxWindowID id, const wxString& name) -{ - return new wxToolBar(this, id, wxPoint(0, 0), wxSize(100, 24), style, name); -} - -void wxFrame::SetToolBar(wxToolBar *toolbar) -{ - m_frameToolBar = toolbar; -} - -wxToolBar *wxFrame::GetToolBar() const -{ return m_frameToolBar; } void wxFrame::PositionToolBar() { - int cw, ch; - - GetClientSize(& cw, &ch); - if (GetToolBar()) { + int cw, ch; + GetClientSize(& cw, &ch); + int tw, th; GetToolBar()->GetSize(& tw, & th); @@ -1037,27 +740,7 @@ void wxFrame::PositionToolBar() } #endif // wxUSE_TOOLBAR -void wxFrame::CaptureMouse() -{ - if (m_winCaptured) - return; - - if (GetMainWidget()) - XtAddGrab((Widget) m_frameShell, TRUE, FALSE); - m_winCaptured = TRUE; -} - -void wxFrame::ReleaseMouse() -{ - if (!m_winCaptured) - return; - - if (GetMainWidget()) - XtRemoveGrab((Widget) m_frameShell); - m_winCaptured = FALSE; -} - -void wxFrame::Raise(void) +void wxFrame::Raise() { Window parent_window = XtWindow((Widget) m_frameShell), next_parent = XtWindow((Widget) m_frameShell), @@ -1074,7 +757,7 @@ void wxFrame::Raise(void) XRaiseWindow(XtDisplay((Widget) m_frameShell), parent_window); } -void wxFrame::Lower(void) +void wxFrame::Lower() { Window parent_window = XtWindow((Widget) m_frameShell), next_parent = XtWindow((Widget) m_frameShell), @@ -1131,7 +814,11 @@ bool wxFrame::PreResize() #if wxUSE_TOOLBAR PositionToolBar(); #endif // wxUSE_TOOLBAR + +#if wxUSE_STATUSBAR PositionStatusBar(); +#endif // wxUSE_STATUSBAR + return TRUE; } diff --git a/src/motif/menu.cpp b/src/motif/menu.cpp index 4b69ef18e4..192264a201 100644 --- a/src/motif/menu.cpp +++ b/src/motif/menu.cpp @@ -363,7 +363,7 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent) { if (m_mainWidget) { - XtVaSetValues((Widget) parent->GetMainWindowWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); + XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); /* if (!XtIsManaged((Widget) m_mainWidget)) XtManageChild((Widget) m_mainWidget); @@ -372,7 +372,7 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent) return TRUE; } - Widget menuBarW = XmCreateMenuBar ((Widget) parent->GetMainWindowWidget(), "MenuBar", NULL, 0); + Widget menuBarW = XmCreateMenuBar ((Widget) parent->GetMainWidget(), "MenuBar", NULL, 0); m_mainWidget = (WXWidget) menuBarW; size_t menuCount = GetMenuCount(); @@ -403,7 +403,7 @@ bool wxMenuBar::CreateMenuBar(wxFrame* parent) SetForegroundColour(m_foregroundColour); SetFont(m_font); - XtVaSetValues((Widget) parent->GetMainWindowWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); + XtVaSetValues((Widget) parent->GetMainWidget(), XmNmenuBar, (Widget) m_mainWidget, NULL); XtRealizeWidget ((Widget) menuBarW); XtManageChild ((Widget) menuBarW); SetMenuBarFrame(parent); diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 0472a949b6..14b25e89b8 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -586,57 +586,6 @@ void wxFrame::OnActivate(wxActivateEvent& event) } } -// ---------------------------------------------------------------------------- -// 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; - } - } - 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); -} - // ---------------------------------------------------------------------------- // tool/status bar stuff // ---------------------------------------------------------------------------- -- 2.45.2