X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2d120f8391920145647ec10e84629bc21fa9f1bb..8d813b20f78c6e24d7e0f3b8dbe8de4cb3689db4:/src/motif/mdi.cpp?ds=sidebyside diff --git a/src/motif/mdi.cpp b/src/motif/mdi.cpp index 642a441daa..f8aa8af3f0 100644 --- a/src/motif/mdi.cpp +++ b/src/motif/mdi.cpp @@ -6,17 +6,25 @@ // Created: 17/09/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation "mdi.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#define XtWindow XTWINDOW +#endif + #include "wx/mdi.h" #include "wx/menu.h" #include "wx/settings.h" +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include #include #include @@ -27,34 +35,36 @@ #include #include #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/motif/private.h" extern wxList wxModelessWindows; // Implemented in frame.cpp -extern void wxFrameFocusProc(Widget workArea, XtPointer clientData, +extern void wxFrameFocusProc(Widget workArea, XtPointer clientData, XmAnyCallbackStruct *cbs); #define wxID_NOTEBOOK_CLIENT_AREA wxID_HIGHEST + 100 -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame) IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxNotebook) BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame) -EVT_SIZE(wxMDIParentFrame::OnSize) -EVT_ACTIVATE(wxMDIParentFrame::OnActivate) -EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged) + EVT_SIZE(wxMDIParentFrame::OnSize) + EVT_ACTIVATE(wxMDIParentFrame::OnActivate) + EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged) + EVT_MENU_HIGHLIGHT_ALL(wxMDIParentFrame::OnMenuHighlight) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxMDIClientWindow, wxNotebook) -EVT_SCROLL(wxMDIClientWindow::OnScroll) -EVT_NOTEBOOK_PAGE_CHANGED(wxID_NOTEBOOK_CLIENT_AREA, wxMDIClientWindow::OnPageChanged) + EVT_SCROLL(wxMDIClientWindow::OnScroll) + EVT_NOTEBOOK_PAGE_CHANGED(wxID_NOTEBOOK_CLIENT_AREA, wxMDIClientWindow::OnPageChanged) END_EVENT_TABLE() -#endif // Parent frame @@ -76,19 +86,19 @@ bool wxMDIParentFrame::Create(wxWindow *parent, m_clientWindow = (wxMDIClientWindow*) NULL; m_activeChild = (wxMDIChildFrame*) NULL; m_activeMenuBar = (wxMenuBar*) NULL; - + bool success = wxFrame::Create(parent, id, title, pos, size, style, name); if (success) { // TODO: app cannot override OnCreateClient since // wxMDIParentFrame::OnCreateClient will still be called // (we're in the constructor). How to resolve? - + m_clientWindow = OnCreateClient(); - + // Uses own style for client style m_clientWindow->CreateClient(this, GetWindowStyleFlag()); - + int w, h; GetClientSize(& w, & h); m_clientWindow->SetSize(0, 0, w, h); @@ -102,27 +112,21 @@ wxMDIParentFrame::~wxMDIParentFrame() { // Make sure we delete the client window last of all RemoveChild(m_clientWindow); - + DestroyChildren(); - + delete m_clientWindow; m_clientWindow = NULL; } -// Get size *available for subwindows* i.e. excluding menu bar. -void wxMDIParentFrame::GetClientSize(int *x, int *y) const -{ - wxFrame::GetClientSize(x, y); -} - void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar) { m_frameMenuBar = menu_bar; - + SetChildMenuBar((wxMDIChildFrame*) NULL); } -void wxMDIParentFrame::OnSize(wxSizeEvent& event) +void wxMDIParentFrame::OnSize(wxSizeEvent& WXUNUSED(event)) { #if wxUSE_CONSTRAINTS if (GetAutoLayout()) @@ -132,12 +136,17 @@ void wxMDIParentFrame::OnSize(wxSizeEvent& event) int y = 0; int width, height; GetClientSize(&width, &height); - + if ( GetClientWindow() ) GetClientWindow()->SetSize(x, y, width, height); } -void wxMDIParentFrame::OnActivate(wxActivateEvent& event) +void wxMDIParentFrame::DoGetClientSize(int *width, int *height) const +{ + wxFrame::DoGetClientSize(width, height); +} + +void wxMDIParentFrame::OnActivate(wxActivateEvent& WXUNUSED(event)) { // Do nothing } @@ -159,14 +168,14 @@ wxMDIClientWindow *wxMDIParentFrame::OnCreateClient() void wxMDIParentFrame::SetChildMenuBar(wxMDIChildFrame* child) { wxMenuBar* oldMenuBar = m_activeMenuBar; - + if (child == (wxMDIChildFrame*) NULL) // No child: use parent frame { if (GetMenuBar() && (GetMenuBar() != m_activeMenuBar)) { // if (m_activeMenuBar) // m_activeMenuBar->DestroyMenuBar(); - + m_activeMenuBar = GetMenuBar(); m_activeMenuBar->CreateMenuBar(this); /* @@ -175,7 +184,7 @@ void wxMDIParentFrame::SetChildMenuBar(wxMDIChildFrame* child) */ if (oldMenuBar && oldMenuBar->GetMainWidget()) XtUnmapWidget((Widget) oldMenuBar->GetMainWidget()); - + } } else if (child->GetMenuBar() == (wxMenuBar*) NULL) // No child menu bar: use parent frame @@ -200,7 +209,7 @@ void wxMDIParentFrame::SetChildMenuBar(wxMDIChildFrame* child) { // if (m_activeMenuBar) // m_activeMenuBar->DestroyMenuBar(); - + m_activeMenuBar = child->GetMenuBar(); m_activeMenuBar->CreateMenuBar(this); /* @@ -220,28 +229,40 @@ bool wxMDIParentFrame::ProcessEvent(wxEvent& event) static wxEventType inEvent = wxEVT_NULL; if (inEvent == event.GetEventType()) return FALSE; - + inEvent = event.GetEventType(); - + bool res = FALSE; if (m_activeChild && event.IsKindOf(CLASSINFO(wxCommandEvent))) { res = m_activeChild->GetEventHandler()->ProcessEvent(event); } - + if (!res) res = GetEventHandler()->wxEvtHandler::ProcessEvent(event); - + inEvent = wxEVT_NULL; - + return res; } +void wxMDIParentFrame::DoSetSize(int x, int y, + int width, int height, + int sizeFlags) +{ + wxWindow::DoSetSize(x, y, width, height, sizeFlags); +} + +void wxMDIParentFrame::DoSetClientSize(int width, int height) +{ + wxWindow::DoSetClientSize(width, height); +} + // Responds to colour changes, and passes event on to children. void wxMDIParentFrame::OnSysColourChanged(wxSysColourChangedEvent& event) { // TODO - + // Propagate the event to the non-top-level children wxFrame::OnSysColourChanged(event); } @@ -272,6 +293,30 @@ void wxMDIParentFrame::ActivatePrevious() // TODO } +// Default menu selection behaviour - display a help string +void wxMDIParentFrame::OnMenuHighlight(wxMenuEvent& event) +{ + if (GetStatusBar()) + { + if (event.GetMenuId() == -1) + SetStatusText(""); + else + { + wxMenuBar *menuBar = (wxMenuBar*) NULL; + if (GetActiveChild()) + menuBar = GetActiveChild()->GetMenuBar(); + else + menuBar = GetMenuBar(); + if (menuBar) + { + wxString helpString(menuBar->GetHelpString(event.GetMenuId())); + if (helpString != "") + SetStatusText(helpString); + } + } + } +} + // Child frame wxMDIChildFrame::wxMDIChildFrame() @@ -288,31 +333,32 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, const wxString& name) { SetName(name); - + SetWindowStyleFlag(style); + m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE); m_foregroundColour = *wxBLACK; - m_windowFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT); - + m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT); + if ( id > -1 ) m_windowId = id; else m_windowId = (int)NewControlId(); - + wxMDIClientWindow* clientWindow = parent->GetClientWindow(); - + wxASSERT_MSG( (clientWindow != (wxWindow*) NULL), "Missing MDI client window."); - + if (clientWindow) clientWindow->AddChild(this); - + SetMDIParentFrame(parent); - - int x = pos.x; int y = pos.y; - int width = size.x; int height = size.y; + + int width = size.x; + int height = size.y; if (width == -1) width = 200; // TODO: give reasonable default if (height == -1) height = 200; // TODO: give reasonable default - + // We're deactivating the old child wxMDIChildFrame* oldActiveChild = parent->GetActiveChild(); if (oldActiveChild) @@ -321,13 +367,13 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, event.SetEventObject( oldActiveChild ); oldActiveChild->GetEventHandler()->ProcessEvent(event); } - + // This is the currently active child parent->SetActiveChild((wxMDIChildFrame*) this); - + // This time we'll try a bog-standard bulletin board for // the 'frame'. A main window doesn't seem to work. - + m_mainWidget = (WXWidget) XtVaCreateWidget("client", xmBulletinBoardWidgetClass, (Widget) clientWindow->GetTopWidget(), XmNmarginWidth, 0, @@ -340,22 +386,25 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, */ XmNresizePolicy, XmRESIZE_NONE, NULL); - + + XtAddEventHandler((Widget) m_mainWidget, ExposureMask,FALSE, + wxUniversalRepaintProc, (XtPointer) this); + SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); - - ChangeBackgroundColour(); - + + ChangeBackgroundColour(); + XtManageChild((Widget) m_mainWidget); - + SetTitle(title); - + clientWindow->AddPage(this, title, TRUE); clientWindow->Refresh(); - + // Positions the toolbar and status bar -- but we don't have any. // PreResize(); - + wxModelessWindows.Append(this); return TRUE; } @@ -363,18 +412,22 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, wxMDIChildFrame::~wxMDIChildFrame() { + if (m_mainWidget) + XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask,FALSE, + wxUniversalRepaintProc, (XtPointer) this); + if (GetMDIParentFrame()) { wxMDIParentFrame* parentFrame = GetMDIParentFrame(); - + if (parentFrame->GetActiveChild() == this) parentFrame->SetActiveChild((wxMDIChildFrame*) NULL); wxMDIClientWindow* clientWindow = parentFrame->GetClientWindow(); - + // Remove page if still there if (clientWindow->RemovePage(this)) clientWindow->Refresh(); - + // Set the selection to the first remaining page if (clientWindow->GetPageCount() > 0) { @@ -397,14 +450,14 @@ void wxMDIChildFrame::OnRaise() wxMDIParentFrame* parentFrame = (wxMDIParentFrame*) GetParent() ; wxMDIChildFrame* oldActiveChild = parentFrame->GetActiveChild(); parentFrame->SetActiveChild(this); - + if (oldActiveChild) { wxActivateEvent event(wxEVT_ACTIVATE, FALSE, oldActiveChild->GetId()); event.SetEventObject( oldActiveChild ); oldActiveChild->GetEventHandler()->ProcessEvent(event); } - + wxActivateEvent event(wxEVT_ACTIVATE, TRUE, this->GetId()); event.SetEventObject( this ); this->GetEventHandler()->ProcessEvent(event); @@ -414,7 +467,7 @@ void wxMDIChildFrame::OnLower() { wxMDIParentFrame* parentFrame = (wxMDIParentFrame*) GetParent() ; wxMDIChildFrame* oldActiveChild = parentFrame->GetActiveChild(); - + if (oldActiveChild == this) { wxActivateEvent event(wxEVT_ACTIVATE, FALSE, oldActiveChild->GetId()); @@ -429,29 +482,29 @@ void wxMDIChildFrame::OnLower() // Set the client size (i.e. leave the calculation of borders etc. // to wxWindows) -void wxMDIChildFrame::SetClientSize(int width, int height) +void wxMDIChildFrame::DoSetClientSize(int width, int height) { - wxWindow::SetClientSize(width, height); + wxWindow::DoSetClientSize(width, height); } -void wxMDIChildFrame::GetClientSize(int* width, int* height) const +void wxMDIChildFrame::DoGetClientSize(int* width, int* height) const { - wxWindow::GetSize(width, height); + wxWindow::DoGetSize(width, height); } -void wxMDIChildFrame::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxMDIChildFrame::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - wxWindow::SetSize(x, y, width, height, sizeFlags); + wxWindow::DoSetSize(x, y, width, height, sizeFlags); } -void wxMDIChildFrame::GetSize(int* width, int* height) const +void wxMDIChildFrame::DoGetSize(int* width, int* height) const { - wxWindow::GetSize(width, height); + wxWindow::DoGetSize(width, height); } -void wxMDIChildFrame::GetPosition(int *x, int *y) const +void wxMDIChildFrame::DoGetPosition(int *x, int *y) const { - wxWindow::GetPosition(x, y); + wxWindow::DoGetPosition(x, y); } bool wxMDIChildFrame::Show(bool show) @@ -465,7 +518,7 @@ void wxMDIChildFrame::SetMenuBar(wxMenuBar *menuBar) // Don't create the underlying menubar yet; need to recreate // it every time the child is activated. m_frameMenuBar = menuBar; - + // We make the assumption that if you're setting the menubar, // this is the currently active child. GetMDIParentFrame()->SetChildMenuBar(this); @@ -477,7 +530,7 @@ void wxMDIChildFrame::SetIcon(const wxIcon& icon) m_icon = icon; if (m_icon.Ok()) { - // Not appropriate since there are no icons in + // Not appropriate since there are no icons in // a tabbed window } } @@ -497,7 +550,7 @@ void wxMDIChildFrame::Maximize() // TODO } -void wxMDIChildFrame::Iconize(bool iconize) +void wxMDIChildFrame::Iconize(bool WXUNUSED(iconize)) { // TODO } @@ -559,15 +612,17 @@ wxMDIClientWindow::~wxMDIClientWindow() // By the time this destructor is called, the child frames will have been // deleted and removed from the notebook/client window. DestroyChildren(); - + m_mainWidget = (WXWidget) 0; } bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) { + SetWindowStyleFlag(style); + // m_windowParent = parent; // m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE); - + bool success = wxNotebook::Create(parent, wxID_NOTEBOOK_CLIENT_AREA, wxPoint(0, 0), wxSize(100, 100), 0); if (success) { @@ -583,35 +638,35 @@ bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) return FALSE; } -void wxMDIClientWindow::SetSize(int x, int y, int width, int height, int sizeFlags) +void wxMDIClientWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) { - wxWindow::SetSize(x, y, width, height, sizeFlags); + wxWindow::DoSetSize(x, y, width, height, sizeFlags); } -void wxMDIClientWindow::SetClientSize(int width, int height) +void wxMDIClientWindow::DoSetClientSize(int width, int height) { - wxWindow::SetClientSize(width, height); + wxWindow::DoSetClientSize(width, height); } -void wxMDIClientWindow::GetClientSize(int *width, int *height) const +void wxMDIClientWindow::DoGetClientSize(int *width, int *height) const { - wxWindow::GetClientSize(width, height); + wxWindow::DoGetClientSize(width, height); } -void wxMDIClientWindow::GetSize(int *width, int *height) const +void wxMDIClientWindow::DoGetSize(int *width, int *height) const { - wxWindow::GetSize(width, height); + wxWindow::DoGetSize(width, height); } -void wxMDIClientWindow::GetPosition(int *x, int *y) const +void wxMDIClientWindow::DoGetPosition(int *x, int *y) const { - wxWindow::GetPosition(x, y); + wxWindow::DoGetPosition(x, y); } -// Explicitly call default scroll behaviour void wxMDIClientWindow::OnScroll(wxScrollEvent& event) { - Default(); // Default processing + // Default(); // Default processing: OBSOLETE FUNCTION + event.Skip(); } void wxMDIClientWindow::OnPageChanged(wxNotebookEvent& event) @@ -635,7 +690,7 @@ void wxMDIClientWindow::OnPageChanged(wxNotebookEvent& event) wxActivateEvent event(wxEVT_ACTIVATE, TRUE, activeChild->GetId()); event.SetEventObject( activeChild ); activeChild->GetEventHandler()->ProcessEvent(event); - + if (activeChild->GetMDIParentFrame()) { activeChild->GetMDIParentFrame()->SetActiveChild(activeChild);