// headers
// ---------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "mdi.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/log.h"
#endif
+#include "wx/stockitem.h"
#include "wx/mdi.h"
#include "wx/msw/private.h"
// constants
// ---------------------------------------------------------------------------
-static const int IDM_WINDOWTILE = 4001;
static const int IDM_WINDOWTILEHOR = 4001;
static const int IDM_WINDOWCASCADE = 4002;
static const int IDM_WINDOWICONS = 4003;
static const int wxFIRST_MDI_CHILD = 4100;
static const int wxLAST_MDI_CHILD = 4600;
-// Status border dimensions
-static const int wxTHICK_LINE_BORDER = 3;
-static const int wxTHICK_LINE_WIDTH = 1;
-
// ---------------------------------------------------------------------------
// private functions
// ---------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame)
EVT_SIZE(wxMDIParentFrame::OnSize)
+ EVT_ICONIZE(wxMDIParentFrame::OnIconized)
EVT_SYS_COLOUR_CHANGED(wxMDIParentFrame::OnSysColourChanged)
END_EVENT_TABLE()
{
int nCount = bar->GetMenuCount();
for (int n = 0; n < nCount; n++)
- bar->GetMenu(n)->UpdateUI(source);
+ bar->GetMenu(n)->UpdateUI(source);
}
}
}
}
}
-void wxMDIParentFrame::OnSize(wxSizeEvent&)
+void wxMDIParentFrame::UpdateClientSize()
{
if ( GetClientWindow() )
{
}
}
+void wxMDIParentFrame::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+ UpdateClientSize();
+
+ // do not call event.Skip() here, it somehow messes up MDI client window
+}
+
+void wxMDIParentFrame::OnIconized(wxIconizeEvent& event)
+{
+ event.Skip();
+
+ if ( !event.Iconized() )
+ {
+ UpdateClientSize();
+ }
+}
+
// Returns the active MDI child window
wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const
{
break;
case WM_SIZE:
- // as we don't (usually) resize the MDI client to exactly fit the
- // client area (we put it below the toolbar, above statusbar &c),
- // we should not pass this one to DefFrameProc
+ // though we don't (usually) resize the MDI client to exactly fit the
+ // client area we need to pass this one to DefFrameProc to allow the children to show
break;
}
return win->MSWCommand(cmd, id);
}
+ if (wxCurrentPopupMenu)
+ {
+ wxMenu *popupMenu = wxCurrentPopupMenu;
+ wxCurrentPopupMenu = NULL;
+ if (popupMenu->MSWCommand(cmd, id))
+ return true;
+ }
+
// is it one of standard MDI commands?
WXWPARAM wParam = 0;
WXLPARAM lParam = 0;
bool wxMDIChildFrame::Show(bool show)
{
m_needsInitialShow = false;
- return wxFrame::Show(show);
+
+ if (!wxFrame::Show(show))
+ return false;
+
+ // KH: Without this call, new MDI children do not become active.
+ // This was added here after the same BringWindowToTop call was
+ // removed from wxTopLevelWindow::Show (November 2005)
+ if ( show )
+ ::BringWindowToTop(GetHwnd());
+
+ return true;
}
// Set the client size (i.e. leave the calculation of borders etc.
wxMDIParentFrame *mdiParent = (wxMDIParentFrame *)GetParent();
::ScreenToClient((HWND) mdiParent->GetClientWindow()->GetHWND(), &point);
- *x = point.x;
- *y = point.y;
+ if (x)
+ *x = point.x;
+ if (y)
+ *y = point.y;
}
void wxMDIChildFrame::InternalSetMenuBar()
parent->m_parentFrameActive = false;
}
+void wxMDIChildFrame::DetachMenuBar()
+{
+ RemoveWindowMenu(NULL, m_hMenu);
+ wxFrame::DetachMenuBar();
+}
+
WXHICON wxMDIChildFrame::GetDefaultIcon() const
{
// we don't have any standard icons (any more)
bool wxMDIChildFrame::HandleWindowPosChanging(void *pos)
{
WINDOWPOS *lpPos = (WINDOWPOS *)pos;
-#if defined(__WIN95__)
+
if (!(lpPos->flags & SWP_NOSIZE))
{
RECT rectClient;
}
#endif
}
-#endif // Win95
return false;
}
minHeight = GetMinHeight();
// but allow GetSizeHints() to set the min size
- if ( minWidth != -1 )
+ if ( minWidth != wxDefaultCoord )
{
info->ptMinTrackSize.x = minWidth;
processed = true;
}
- if ( minHeight != -1 )
+ if ( minHeight != wxDefaultCoord )
{
info->ptMinTrackSize.y = minHeight;
// style when a child is maximised (a double border looks silly.)
bool wxMDIChildFrame::ResetWindowStyle(void *vrect)
{
-#if defined(__WIN95__)
RECT *rect = (RECT *)vrect;
wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent();
wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild();
+
if (!pChild || (pChild == this))
{
HWND hwndClient = GetWinHwnd(pFrameWnd->GetClientWindow());
return true;
}
}
-#endif // Win95
return false;
}
if ( style & wxVSCROLL )
msStyle |= WS_VSCROLL;
-#if defined(__WIN95__)
DWORD exStyle = WS_EX_CLIENTEDGE;
-#else
- DWORD exStyle = 0;
-#endif
wxWindowCreationHook hook(this);
m_hWnd = (WXHWND)::CreateWindowEx
// (see OGL studio sample). So check if the position is changed and if so,
// redraw the MDI child frames.
- wxPoint oldPos = GetPosition();
+ const wxPoint oldPos = GetPosition();
- wxWindow::DoSetSize(x, y, width, height, sizeFlags);
+ wxWindow::DoSetSize(x, y, width, height, sizeFlags | wxSIZE_FORCE);
- wxPoint newPos = GetPosition();
+ const wxPoint newPos = GetPosition();
if ((newPos.x != oldPos.x) || (newPos.y != oldPos.y))
{
continue;
}
- if ( wxStripMenuCodes(wxString(buf)).IsSameAs(_("Help")) )
+ wxString strBuf(buf);
+ if ( wxStripMenuCodes(strBuf) == wxGetStockLabel(wxID_HELP,false) )
{
success = true;
::InsertMenu(hmenu, i, MF_BYPOSITION | MF_POPUP | MF_STRING,
}
#endif // wxUSE_MDI && !defined(__WXUNIVERSAL__)
-