// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
+// ===========================================================================
+// declarations
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// headers
+// ---------------------------------------------------------------------------
+
#ifdef __GNUG__
-#pragma implementation "mdi.h"
+ #pragma implementation "mdi.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#ifndef WX_PRECOMP
-#include "wx/setup.h"
-#include "wx/frame.h"
-#include "wx/menu.h"
-#include "wx/app.h"
-#include "wx/utils.h"
-#include "wx/dialog.h"
-#include "wx/statusbr.h"
-#include "wx/settings.h"
+ #include "wx/setup.h"
+ #include "wx/frame.h"
+ #include "wx/menu.h"
+ #include "wx/app.h"
+ #include "wx/utils.h"
+ #include "wx/dialog.h"
+ #include "wx/statusbr.h"
+ #include "wx/settings.h"
#endif
#include "wx/mdi.h"
#include "wx/msw/private.h"
-#if USE_NATIVE_STATUSBAR
-#include <wx/msw/statbr95.h>
+#if wxUSE_NATIVE_STATUSBAR
+ #include <wx/msw/statbr95.h>
#endif
#include <string.h>
-extern wxList wxModelessWindows;
+// ---------------------------------------------------------------------------
+// global variables
+// ---------------------------------------------------------------------------
-#define IDM_WINDOWTILE 4001
-#define IDM_WINDOWCASCADE 4002
-#define IDM_WINDOWICONS 4003
-#define IDM_WINDOWNEXT 4004
-// This range gives a maximum of 500
-// MDI children. Should be enough :-)
-#define wxFIRST_MDI_CHILD 4100
-#define wxLAST_MDI_CHILD 4600
-
-// Status border dimensions
-#define wxTHICK_LINE_BORDER 3
-#define wxTHICK_LINE_WIDTH 1
+extern wxWindowList wxModelessWindows; // from dialog.cpp
+extern wxMenu *wxCurrentPopupMenu;
extern char wxMDIFrameClassName[];
extern char wxMDIChildFrameClassName[];
-extern wxWindow *wxWndHook;
+extern wxWindow *wxWndHook; // from window.cpp
+
+extern wxList *wxWinHandleList;
+
+// ---------------------------------------------------------------------------
+// constants
+// ---------------------------------------------------------------------------
+
+static const int IDM_WINDOWTILE = 4001;
+static const int IDM_WINDOWCASCADE = 4002;
+static const int IDM_WINDOWICONS = 4003;
+static const int IDM_WINDOWNEXT = 4004;
+
+// This range gives a maximum of 500 MDI children. Should be enough :-)
+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;
+
+// ===========================================================================
+// implementation
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// wxWin macros
+// ---------------------------------------------------------------------------
#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame)
-IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame)
-IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
+ IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame)
+ IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame)
+ IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow)
+#endif // USE_SHARED_LIBRARY
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)
END_EVENT_TABLE()
BEGIN_EVENT_TABLE(wxMDIClientWindow, wxWindow)
- EVT_SCROLL(wxMDIClientWindow::OnScroll)
+ EVT_SCROLL(wxMDIClientWindow::OnScroll)
END_EVENT_TABLE()
-#endif
+// ---------------------------------------------------------------------------
+// wxMDIParentFrame
+// ---------------------------------------------------------------------------
-wxMDIParentFrame::wxMDIParentFrame(void)
+wxMDIParentFrame::wxMDIParentFrame()
{
m_clientWindow = NULL;
m_currentChild = NULL;
m_windowMenu = 0;
m_parentFrameActive = TRUE;
- m_frameToolBar = NULL ;
}
bool wxMDIParentFrame::Create(wxWindow *parent,
- wxWindowID id,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name)
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
{
m_defaultIcon = (WXHICON) (wxSTD_MDIPARENTFRAME_ICON ? wxSTD_MDIPARENTFRAME_ICON : wxDEFAULT_MDIPARENTFRAME_ICON);
- m_frameToolBar = NULL ;
m_clientWindow = NULL;
m_currentChild = NULL;
m_windowMenu = 0;
m_windowMenu = (WXHMENU) ::LoadMenu(wxGetInstance(), "wxWindowMenu");
-#if DEBUG > 1
- wxDebugMsg("Loaded m_windowMenu %d\n", m_windowMenu);
-#endif
-
DWORD msflags = WS_OVERLAPPED ;
if (style & wxMINIMIZE_BOX)
msflags |= WS_MINIMIZEBOX;
return TRUE;
}
-wxMDIParentFrame::~wxMDIParentFrame(void)
+wxMDIParentFrame::~wxMDIParentFrame()
{
DestroyChildren();
m_windowMenu = 0;
if (m_clientWindow->MSWGetOldWndProc())
- m_clientWindow->UnsubclassWin();
+ m_clientWindow->UnsubclassWin();
- m_clientWindow->m_hWnd = 0;
+ m_clientWindow->SetHWND(0);
delete m_clientWindow;
}
-// Get size *available for subwindows* i.e. excluding menu bar.
-void wxMDIParentFrame::GetClientSize(int *x, int *y) const
-{
- RECT rect;
- GetClientRect((HWND) GetHWND(), &rect);
-
- int cwidth = rect.right;
- int cheight = rect.bottom;
-/*
- if (m_frameToolBar)
- {
- int tw, th;
- m_frameToolBar->GetSize(&tw, &th);
- cheight -= th;
- }
-*/
- if ( GetStatusBar() )
- {
- int sw, sh;
- GetStatusBar()->GetSize(&sw, &sh);
- cheight -= sh;
- }
-
- *x = cwidth;
- *y = cheight;
-}
-
void wxMDIParentFrame::SetMenuBar(wxMenuBar *menu_bar)
{
if (!menu_bar)
m_frameMenuBar = NULL;
return;
}
-
- if (menu_bar->m_menuBarFrame)
- return;
- int i;
- HMENU menu = CreateMenu();
+ if ( menu_bar->IsAttached() )
+ return;
- for (i = 0; i < menu_bar->m_menuCount; i ++)
- {
- HMENU popup = (HMENU)menu_bar->m_menus[i]->m_hMenu;
- //
- // After looking Bounds Checker result, it seems that all
- // menus must be individually destroyed. So, don't reset m_hMenu,
- // to allow ~wxMenu to do the job.
- //
- menu_bar->m_menus[i]->m_savehMenu = (WXHMENU) popup;
- // Uncommenting for the moment... JACS
- menu_bar->m_menus[i]->m_hMenu = (WXHMENU) NULL;
- AppendMenu(menu, MF_POPUP | MF_STRING, (UINT)popup, menu_bar->m_titles[i]);
- }
+ m_hMenu = menu_bar->Create();
- menu_bar->m_hMenu = (WXHMENU)menu;
if (m_frameMenuBar)
delete m_frameMenuBar;
- this->m_hMenu = (WXHMENU) menu;
-
// MDI parent-specific code follows
HMENU subMenu = GetSubMenu((HMENU) m_windowMenu, 0);
// Try to insert Window menu in front of Help, otherwise append it.
+ HMENU menu = (HMENU)m_hMenu;
int N = GetMenuItemCount(menu);
bool success = FALSE;
- for (i = 0; i < N; i++)
+ for (int i = 0; i < N; i++)
{
char buf[100];
int chars = GetMenuString(menu, i, buf, 100, MF_BYPOSITION);
DrawMenuBar((HWND) GetHWND());
m_frameMenuBar = menu_bar;
- menu_bar->m_menuBarFrame = this;
+ menu_bar->Attach(this);
}
void wxMDIParentFrame::OnSize(wxSizeEvent& event)
{
-#if USE_CONSTRAINTS
- if (GetAutoLayout())
- Layout();
-#endif
+#if wxUSE_CONSTRAINTS
+ if ( GetAutoLayout() )
+ {
+ Layout();
+ return;
+ }
+#endif // wxUSE_CONSTRAINTS
+
int x = 0;
int y = 0;
int width, height;
GetClientSize(&width, &height);
- if ( GetToolBar() )
- {
- int wt, ht;
- GetToolBar()->GetSize(&wt, &ht);
- height -= ht;
- y += ht;
- GetToolBar()->SetSize(0, 0, width, ht);
- }
if ( GetClientWindow() )
GetClientWindow()->SetSize(x, y, width, height);
-
- // forward WM_SIZE to status bar control
-#if USE_NATIVE_STATUSBAR
- if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95)))
- ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event);
-#endif
}
void wxMDIParentFrame::OnActivate(wxActivateEvent& event)
{
- // Do nothing
+ // Do nothing
}
-#if WXWIN_COMPATIBILITY
-/*
-void wxMDIParentFrame::OldOnSize(int x, int y)
-{
-#if WXWIN_COMPATIBILITY == 1
- wxSizeEvent event(wxSize(x, y), m_windowId);
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
-#else
-
-#if USE_CONSTRAINTS
- if (GetAutoLayout())
- Layout();
-#endif
- int x = 0;
- int y = 0;
- int width, height;
- GetClientSize(&width, &height);
- if ( GetToolBar() )
- {
- int wt, ht;
- GetToolBar()->GetSize(&wt, &ht);
- height -= ht;
- y += ht;
- }
-
- if ( GetClientWindow() )
- GetClientWindow()->SetSize(x, y, width, height);
-
-#endif
-}
-
-// Default activation behaviour - nothing.
-// Default activation behaviour - override dedault wxFrame behaviour
-void wxMDIParentFrame::OldOnActivate(bool flag)
-{
-#if WXWIN_COMPATIBILITY == 1
- wxActivateEvent event(wxEVT_ACTIVATE, flag, m_windowId);
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
-#else
-#endif
-}
-*/
-
-#endif
-
// Returns the active MDI child window
-wxMDIChildFrame *wxMDIParentFrame::GetActiveChild(void) const
+wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const
{
-// HWND hWnd = (HWND)LOWORD(SendMessage((HWND) GetClientWindow()->GetHWND(), WM_MDIGETACTIVE, 0, 0L));
- HWND hWnd = (HWND)SendMessage((HWND) GetClientWindow()->GetHWND(), WM_MDIGETACTIVE, 0, 0L);
- if (hWnd == 0)
- return NULL;
- else
- return (wxMDIChildFrame *)wxFindWinFromHandle((WXHWND) hWnd);
+ HWND hWnd = (HWND)::SendMessage(GetWinHwnd(GetClientWindow()),
+ WM_MDIGETACTIVE, 0, 0L);
+ if ( hWnd == 0 )
+ return NULL;
+ else
+ return (wxMDIChildFrame *)wxFindWinFromHandle((WXHWND) hWnd);
}
-// Create the client window class (don't Create the window,
-// just return a new class)
-wxMDIClientWindow *wxMDIParentFrame::OnCreateClient(void)
+// Create the client window class (don't Create the window, just return a new
+// class)
+wxMDIClientWindow *wxMDIParentFrame::OnCreateClient()
{
- return new wxMDIClientWindow ;
+ return new wxMDIClientWindow;
}
// Responds to colour changes, and passes event on to children.
}
// MDI operations
-void wxMDIParentFrame::Cascade(void)
+void wxMDIParentFrame::Cascade()
{
- ::SendMessage( (HWND) GetClientWindow()->GetHWND(), WM_MDICASCADE, 0, 0);
+ ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDICASCADE, 0, 0);
}
-void wxMDIParentFrame::Tile(void)
+void wxMDIParentFrame::Tile()
{
- ::SendMessage( (HWND) GetClientWindow()->GetHWND(), WM_MDITILE, MDITILE_HORIZONTAL, 0);
+ ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDITILE, MDITILE_HORIZONTAL, 0);
}
-void wxMDIParentFrame::ArrangeIcons(void)
+void wxMDIParentFrame::ArrangeIcons()
{
- ::SendMessage( (HWND) GetClientWindow()->GetHWND(), WM_MDIICONARRANGE, 0, 0);
+ ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDIICONARRANGE, 0, 0);
}
-void wxMDIParentFrame::ActivateNext(void)
+void wxMDIParentFrame::ActivateNext()
{
- ::SendMessage( (HWND) GetClientWindow()->GetHWND(), WM_MDINEXT, 0, 0);
+ ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDINEXT, 0, 0);
}
-void wxMDIParentFrame::ActivatePrevious(void)
+void wxMDIParentFrame::ActivatePrevious()
{
- ::SendMessage( (HWND) GetClientWindow()->GetHWND(), WM_MDINEXT, 0, 1);
+ ::SendMessage(GetWinHwnd(GetClientWindow()), WM_MDINEXT, 0, 1);
}
-
-/*
-// Returns a style for the client window - usually 0
-// or, for example, wxHSCROLL | wxVSCROLL
-long wxMDIParentFrame::GetClientStyle(void) const
+// the MDI parent frame window proc
+long wxMDIParentFrame::MSWWindowProc(WXUINT message,
+ WXWPARAM wParam,
+ WXLPARAM lParam)
{
- return wxHSCROLL | wxVSCROLL ;
-}
-*/
+ long rc = 0;
+ bool processed = FALSE;
-bool wxMDIParentFrame::MSWOnDestroy(void)
-{
- return FALSE;
-}
+ switch ( message )
+ {
+ case WM_CREATE:
+ m_clientWindow = OnCreateClient();
+ // Uses own style for client style
+ if ( !m_clientWindow->CreateClient(this, GetWindowStyleFlag()) )
+ {
+ wxLogMessage(_("Failed to create MDI parent frame."));
-void wxMDIParentFrame::MSWOnCreate(WXLPCREATESTRUCT WXUNUSED(cs))
-{
- m_clientWindow = new wxMDIClientWindow;
- // Uses own style for client style
- m_clientWindow->CreateClient(this, GetWindowStyleFlag());
-}
+ rc = -1;
+ }
-void wxMDIParentFrame::MSWOnSize(int x, int y, WXUINT id)
-{
- switch (id)
- {
- case SIZEFULLSCREEN:
- case SIZENORMAL:
- m_iconized = FALSE;
- break;
- case SIZEICONIC:
- m_iconized = TRUE;
- break;
- }
+ processed = TRUE;
+ break;
- if (!m_iconized)
- {
- // forward WM_SIZE to status bar control
-#if USE_NATIVE_STATUSBAR
- if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95)))
- {
- wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId());
- event.SetEventObject( m_frameStatusBar );
+ case WM_ERASEBKGND:
+ processed = TRUE;
- ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event);
- }
+ // we erase background ourselves
+ rc = TRUE;
+ break;
+
+ case WM_MENUSELECT:
+ {
+ WORD item = (WORD)wParam;
+#ifdef __WIN32__
+ WORD flags = HIWORD(wParam);
+ HMENU menu = (HMENU)lParam;
+#else
+ WORD flags = LOWORD(lParam);
+ HMENU menu = (HMENU)HIWORD(lParam);
#endif
+ if ( m_parentFrameActive )
+ {
+ processed = HandleMenuSelect(item, flags, (WXHMENU)menu);
+ }
+ else if (m_currentChild)
+ {
+ processed = m_currentChild->
+ HandleMenuSelect(item, flags, (WXHMENU)menu);
+ }
+ }
+ break;
+ }
- PositionStatusBar();
+ if ( !processed )
+ rc = wxFrame::MSWWindowProc(message, wParam, lParam);
- wxSizeEvent event(wxSize(x, y), m_windowId);
- event.SetEventObject( this );
- if (!GetEventHandler()->ProcessEvent(event))
- Default();
- }
+ return rc;
}
bool wxMDIParentFrame::MSWOnActivate(int state, bool minimized, WXHWND activate)
{
- wxWindow::MSWOnActivate(state, minimized, activate);
+ bool processed = FALSE;
+
+ if ( wxWindow::MSWOnActivate(state, minimized, activate) )
+ {
+ // already processed
+ processed = TRUE;
+ }
// If this window is an MDI parent, we must also send an OnActivate message
// to the current child.
- if ((m_currentChild != NULL) && ((state == WA_ACTIVE) || (state == WA_CLICKACTIVE)))
- {
+ if ( (m_currentChild != NULL) &&
+ ((state == WA_ACTIVE) || (state == WA_CLICKACTIVE)) )
+ {
wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_currentChild->GetId());
event.SetEventObject( m_currentChild );
- m_currentChild->GetEventHandler()->ProcessEvent(event);
+ if ( m_currentChild->GetEventHandler()->ProcessEvent(event) )
+ processed = TRUE;
}
- return 0;
+
+ return processed;
}
bool wxMDIParentFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control)
{
- if (cmd == 0)
+// if (cmd == 0) // Why did I do this test?
{
// In case it's e.g. a toolbar.
wxWindow *win = wxFindWinFromHandle(control);
if (win)
return win->MSWCommand(cmd, id);
+/*
+ if (wxCurrentPopupMenu)
+ {
+ wxMenu *popupMenu = wxCurrentPopupMenu;
+ wxCurrentPopupMenu = NULL;
+ if (!popupMenu->MSWCommand(cmd, id))
+ return TRUE;
+ }
+*/
+
switch (id)
{
case IDM_WINDOWCASCADE:
}
if (id >= 0xF000)
{
-#if DEBUG > 1
- wxDebugMsg("wxMDIFrame::OnCommand %d: system command: calling default window proc\n", GetHWND());
-#endif
return FALSE; // Get WndProc to call default proc
}
-
+
if (m_parentFrameActive && (id < wxFIRST_MDI_CHILD || id > wxLAST_MDI_CHILD))
{
ProcessCommand(id);
}
else if (m_currentChild && (id < wxFIRST_MDI_CHILD || id > wxLAST_MDI_CHILD))
{
-#if DEBUG > 1
- wxDebugMsg("wxMDIFrame::MSWOnCommand %d: calling child OnCommand\n", GetHWND());
-#endif
return m_currentChild->MSWOnCommand(id, cmd, control);
}
}
if (id >= wxFIRST_MDI_CHILD && id <= wxLAST_MDI_CHILD)
{
- wxNode* node = GetChildren()->First();
+ wxNode* node = GetChildren().First();
while (node)
{
wxWindow* child = (wxWindow*) node->Data();
*/
}
- return FALSE;
-}
-
-void wxMDIParentFrame::MSWOnMenuHighlight(WXWORD nItem, WXWORD nFlags, WXHMENU hSysMenu)
-{
- if (m_parentFrameActive)
- {
- if (nFlags == 0xFFFF && hSysMenu == (WXHMENU) NULL)
- {
- wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, -1);
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
- }
- else if (nFlags != MF_SEPARATOR)
- {
- wxMenuEvent event(wxEVT_MENU_HIGHLIGHT, nItem);
- event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
- }
- }
- else if (m_currentChild)
- {
- m_currentChild->MSWOnMenuHighlight(nItem, nFlags, hSysMenu);
- }
+ return wxWindow::MSWOnCommand(id, cmd, control);
}
long wxMDIParentFrame::MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
{
- WXHWND clientWnd;
- if ( GetClientWindow() )
- clientWnd = GetClientWindow()->GetHWND();
- else
- clientWnd = 0;
+ WXHWND clientWnd;
+ if ( GetClientWindow() )
+ clientWnd = GetClientWindow()->GetHWND();
+ else
+ clientWnd = 0;
- return DefFrameProc((HWND) GetHWND(), (HWND) clientWnd, message, wParam, lParam);
+ return DefFrameProc(GetHwnd(), (HWND)clientWnd, message, wParam, lParam);
}
bool wxMDIParentFrame::MSWProcessMessage(WXMSG* msg)
{
- MSG *pMsg = (MSG *)msg;
+ return m_currentChild && m_currentChild->GetHWND() &&
+ m_currentChild->MSWProcessMessage(msg);
+}
- if ((m_currentChild != (wxWindow *)NULL) && (m_currentChild->GetHWND() != (WXHWND) NULL) && m_currentChild->MSWProcessMessage(msg))
- return TRUE;
-
- if (m_acceleratorTable != (WXHANDLE) NULL &&
- ::TranslateAccelerator((HWND) GetHWND(), (HANDLE) m_acceleratorTable, pMsg))
- return TRUE;
+bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg)
+{
+ MSG *pMsg = (MSG *)msg;
- if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN)
- {
- if (::TranslateMDISysAccel((HWND) GetClientWindow()->GetHWND(), pMsg))
- return TRUE;
- }
+ if ( m_currentChild && m_currentChild->GetHWND() &&
+ m_currentChild->MSWTranslateMessage(msg) )
+ {
+ return TRUE;
+ }
- return FALSE;
-}
+ if ( m_acceleratorTable.Ok() &&
+ ::TranslateAccelerator(GetHwnd(),
+ GetTableHaccel(&m_acceleratorTable),
+ pMsg) )
+ {
+ return TRUE;
+ }
-bool wxMDIParentFrame::MSWOnEraseBkgnd(WXHDC WXUNUSED(pDC))
-{
- return TRUE;
+ if ( pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN )
+ {
+ if ( ::TranslateMDISysAccel(GetWinHwnd(GetClientWindow()), pMsg))
+ return TRUE;
+ }
+
+ return FALSE;
}
-extern wxWindow *wxWndHook;
-extern wxList *wxWinHandleList;
+// ---------------------------------------------------------------------------
+// wxMDIChildFrame
+// ---------------------------------------------------------------------------
-wxMDIChildFrame::wxMDIChildFrame(void)
+wxMDIChildFrame::wxMDIChildFrame()
{
-// m_active = FALSE;
+// m_active = FALSE;
}
bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
- wxWindowID id,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name)
+ wxWindowID id,
+ const wxString& title,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
{
m_defaultIcon = (WXHICON) (wxSTD_MDICHILDFRAME_ICON ? wxSTD_MDICHILDFRAME_ICON : wxDEFAULT_MDICHILDFRAME_ICON);
int height = size.y;
MDICREATESTRUCT mcs;
-
+
mcs.szClass = wxMDIChildFrameClassName;
mcs.szTitle = title;
mcs.hOwner = wxGetInstance();
mcs.lParam = 0;
DWORD Return = SendMessage((HWND) parent->GetClientWindow()->GetHWND(),
- WM_MDICREATE, 0, (LONG)(LPSTR)&mcs);
+ WM_MDICREATE, 0, (LONG)(LPSTR)&mcs);
//handle = (HWND)LOWORD(Return);
// Must be the DWORRD for WIN32. And in 16 bits, HIWORD=0 (says Microsoft)
return TRUE;
}
-wxMDIChildFrame::~wxMDIChildFrame(void)
+wxMDIChildFrame::~wxMDIChildFrame()
{
- MSWDestroyWindow();
+ MSWDestroyWindow();
ResetWindowStyle(NULL);
}
// 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)
{
HWND hWnd = (HWND) GetHWND();
RECT rect;
- GetClientRect(hWnd, &rect);
+ ::GetClientRect(hWnd, &rect);
RECT rect2;
GetWindowRect(hWnd, &rect2);
if (GetStatusBar())
{
- int sx, sy;
- GetStatusBar()->GetSize(&sx, &sy);
+ int sx, sy;
+ GetStatusBar()->GetSize(&sx, &sy);
actual_height += sy;
}
GetEventHandler()->ProcessEvent(event);
}
-void wxMDIChildFrame::GetPosition(int *x, int *y) const
+void wxMDIChildFrame::DoGetPosition(int *x, int *y) const
{
RECT rect;
GetWindowRect((HWND) GetHWND(), &rect);
m_frameMenuBar = NULL;
return;
}
-
- if (menu_bar->m_menuBarFrame)
- return;
- int i;
- HMENU menu = CreateMenu();
+ if ( menu_bar->IsAttached() )
+ return;
- for (i = 0; i < menu_bar->m_menuCount; i ++)
- {
- HMENU popup = (HMENU)menu_bar->m_menus[i]->m_hMenu;
- //
- // After looking Bounds Checker result, it seems that all
- // menus must be individually destroyed. So, don't reset m_hMenu,
- // to allow ~wxMenu to do the job.
- //
- menu_bar->m_menus[i]->m_savehMenu = (WXHMENU) popup;
- // Uncommenting for the moment... JACS
- menu_bar->m_menus[i]->m_hMenu = 0;
- ::AppendMenu((HMENU) menu, MF_POPUP | MF_STRING, (UINT)popup, menu_bar->m_titles[i]);
- }
+ m_hMenu = menu_bar->Create();
- menu_bar->m_hMenu = (WXHMENU)menu;
if (m_frameMenuBar)
delete m_frameMenuBar;
- this->m_hMenu = (WXHMENU) menu;
-
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
parent->m_parentFrameActive = FALSE;
- HMENU subMenu = GetSubMenu((HWND) parent->GetWindowMenu(), 0);
+ HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0);
// Try to insert Window menu in front of Help, otherwise append it.
+ HMENU menu = (HMENU)m_hMenu;
int N = GetMenuItemCount(menu);
bool success = FALSE;
- for (i = 0; i < N; i++)
+ for (int i = 0; i < N; i++)
{
char buf[100];
int chars = GetMenuString(menu, i, buf, 100, MF_BYPOSITION);
DrawMenuBar((HWND) parent->GetHWND());
m_frameMenuBar = menu_bar;
- menu_bar->m_menuBarFrame = this;
+ menu_bar->Attach(this);
}
// MDI operations
-void wxMDIChildFrame::Maximize(void)
+void wxMDIChildFrame::Maximize()
{
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
if ( parent && parent->GetClientWindow() )
::SendMessage( (HWND) parent->GetClientWindow()->GetHWND(), WM_MDIMAXIMIZE, (WPARAM) (HWND) GetHWND(), 0);
}
-void wxMDIChildFrame::Restore(void)
+void wxMDIChildFrame::Restore()
{
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
if ( parent && parent->GetClientWindow() )
::SendMessage( (HWND) parent->GetClientWindow()->GetHWND(), WM_MDIRESTORE, (WPARAM) (HWND) GetHWND(), 0);
}
-void wxMDIChildFrame::Activate(void)
+void wxMDIChildFrame::Activate()
{
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
if ( parent && parent->GetClientWindow() )
}
static HWND invalidHandle = 0;
-void wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id)
+bool wxMDIChildFrame::MSWOnSize(int x, int y, WXUINT id)
{
- if (!GetHWND()) return;
-
- if (invalidHandle == (HWND) GetHWND())
- {
-#if DEBUG > 1
- wxDebugMsg("wxMDIChildFrame::OnSize %d: invalid, so returning.\n", GetHWND());
-#endif
- return;
- }
-
- (void)MSWDefWindowProc(m_lastMsg, m_lastWParam, m_lastLParam);
-
- switch (id)
- {
- case SIZEFULLSCREEN:
- case SIZENORMAL:
- m_iconized = FALSE;
- break;
- case SIZEICONIC:
- m_iconized = TRUE;
- break;
- }
-
- if (!m_iconized)
- {
- // forward WM_SIZE to status bar control
-#if USE_NATIVE_STATUSBAR
- if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95)))
+ HWND hwnd = GetHwnd();
+
+ if ( !hwnd || hwnd == invalidHandle )
{
- wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId());
- event.SetEventObject( m_frameStatusBar );
-
- ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event);
+ return FALSE;
}
+
+ switch (id)
+ {
+ case SIZEFULLSCREEN:
+ case SIZENORMAL:
+ m_iconized = FALSE;
+ break;
+
+ case SIZEICONIC:
+ m_iconized = TRUE;
+ break;
+ }
+
+ if (!m_iconized)
+ {
+ // forward WM_SIZE to status bar control
+#if wxUSE_NATIVE_STATUSBAR
+ if (m_frameStatusBar && m_frameStatusBar->IsKindOf(CLASSINFO(wxStatusBar95)))
+ {
+ wxSizeEvent event(wxSize(x, y), m_frameStatusBar->GetId());
+ event.SetEventObject( m_frameStatusBar );
+
+ ((wxStatusBar95 *)m_frameStatusBar)->OnSize(event);
+ }
#endif
-
- PositionStatusBar();
-
- wxWindow::MSWOnSize(x, y, id);
- }
+
+ PositionStatusBar();
+ PositionToolBar();
+
+ return wxWindow::MSWOnSize(x, y, id);
+ }
+ else
+ {
+ return FALSE;
+ }
}
bool wxMDIChildFrame::MSWOnCommand(WXWORD id, WXWORD cmd, WXHWND control)
{
-#if DEBUG > 1
- wxDebugMsg("wxMDIChildFrame::MSWOnCommand %d\n", GetHWND());
-#endif
- if ((cmd == 0) && GetHWND())
+// if ((cmd == 0) && GetHWND())
+ if (GetHWND())
{
// In case it's e.g. a toolbar.
wxWindow *win = wxFindWinFromHandle(control);
if (win)
return win->MSWCommand(cmd, id);
+ if (wxCurrentPopupMenu)
+ {
+ wxMenu *popupMenu = wxCurrentPopupMenu;
+ wxCurrentPopupMenu = NULL;
+ if (popupMenu->MSWCommand(cmd, id))
+ return TRUE;
+ }
+
if (GetMenuBar() && GetMenuBar()->FindItemForId(id))
{
ProcessCommand(id);
return TRUE;
}
else
- return FALSE;
+ return wxWindow::MSWOnCommand(id, cmd, control);
}
long wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXUINT wParam, WXLPARAM lParam)
}
bool wxMDIChildFrame::MSWProcessMessage(WXMSG *msg)
+{
+ return FALSE;
+}
+
+bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg)
{
MSG *pMsg = (MSG *)msg;
- if (m_acceleratorTable && GetHWND())
+ if (m_acceleratorTable.Ok())
{
wxFrame *parent = (wxFrame *)GetParent();
HWND parent_hwnd = (HWND) parent->GetHWND();
- return (::TranslateAccelerator(parent_hwnd, (HANDLE) m_acceleratorTable, pMsg) != 0);
+ return (::TranslateAccelerator(parent_hwnd, (HACCEL) m_acceleratorTable.GetHACCEL(), pMsg) != 0);
}
+
return FALSE;
}
-long wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHWND WXUNUSED(two))
+bool wxMDIChildFrame::MSWOnMDIActivate(long activate, WXHWND WXUNUSED(one), WXHWND WXUNUSED(two))
{
wxMDIParentFrame *parent = (wxMDIParentFrame *)GetParent();
HMENU parent_menu = (HMENU) parent->GetWinMenu();
-#if DEBUG > 1
- wxDebugMsg("Parent menu is %d\n", parent_menu);
-#endif
HMENU child_menu = (HMENU) GetWinMenu();
-#if DEBUG > 1
- wxDebugMsg("Child menu is %d\n", child_menu);
-#endif
if (activate)
{
{
parent->m_parentFrameActive = FALSE;
HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0);
-#if DEBUG > 1
- wxDebugMsg("Window submenu is %d\n", subMenu);
-#endif
-// HMENU subMenu = 0;
#ifdef __WIN32__
::SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDISETMENU,
(WPARAM)child_menu,
}
wxActivateEvent event(wxEVT_ACTIVATE, TRUE, m_windowId);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
+ return GetEventHandler()->ProcessEvent(event);
}
else
{
wxActivateEvent event(wxEVT_ACTIVATE, FALSE, m_windowId);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
+ if ( GetEventHandler()->ProcessEvent(event) )
+ return TRUE;
// m_active = FALSE;
if (parent_menu)
{
parent->m_parentFrameActive = TRUE;
HMENU subMenu = GetSubMenu((HMENU) parent->GetWindowMenu(), 0);
-#if DEBUG > 1
- wxDebugMsg("Window submenu is %d\n", subMenu);
-#endif
-// HMENU subMenu = 0;
#ifdef __WIN32__
::SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDISETMENU,
(WPARAM)parent_menu,
bool flag = (activate != 0);
wxActivateEvent event(wxEVT_ACTIVATE, flag, m_windowId);
event.SetEventObject( this );
- GetEventHandler()->ProcessEvent(event);
-
-#if DEBUG > 1
- wxDebugMsg("Finished (de)activating\n");
-#endif
- return 0;
+ return GetEventHandler()->ProcessEvent(event);
}
-void wxMDIChildFrame::MSWDestroyWindow(void)
+void wxMDIChildFrame::MSWDestroyWindow()
{
MSWDetachWindowMenu();
invalidHandle = (HWND) GetHWND();
// destroyed.
HWND oldHandle = (HWND)GetHWND();
-#if DEBUG > 1
- wxDebugMsg("*** About to DestroyWindow MDI child %d\n", oldHandle);
-#endif
#ifdef __WIN32__
SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (WPARAM)oldHandle, (LPARAM)0);
#else
SendMessage((HWND) parent->GetClientWindow()->GetHWND(), WM_MDIDESTROY, (HWND)oldHandle, 0);
-#endif
-#if DEBUG > 1
- wxDebugMsg("*** Finished DestroyWindow MDI child %d\n", oldHandle);
#endif
invalidHandle = 0;
{
#if defined(__WIN95__)
RECT *rect = (RECT *)vrect;
- wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent();
- wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild();
- if (!pChild || (pChild == this))
- {
- DWORD dwStyle = ::GetWindowLong((HWND) pFrameWnd->GetClientWindow()->GetHWND(), GWL_EXSTYLE);
+ wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent();
+ wxMDIChildFrame* pChild = pFrameWnd->GetActiveChild();
+ if (!pChild || (pChild == this))
+ {
+ DWORD dwStyle = ::GetWindowLong((HWND) pFrameWnd->GetClientWindow()->GetHWND(), GWL_EXSTYLE);
DWORD dwThisStyle = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE);
- DWORD dwNewStyle = dwStyle;
- if (pChild != NULL && (dwThisStyle & WS_MAXIMIZE))
- dwNewStyle &= ~(WS_EX_CLIENTEDGE);
- else
- dwNewStyle |= WS_EX_CLIENTEDGE;
-
- if (dwStyle != dwNewStyle)
- {
- ::RedrawWindow((HWND) pFrameWnd->GetClientWindow()->GetHWND(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
- ::SetWindowLong((HWND) pFrameWnd->GetClientWindow()->GetHWND(), GWL_EXSTYLE, dwNewStyle);
- ::SetWindowPos((HWND) pFrameWnd->GetClientWindow()->GetHWND(), NULL, 0, 0, 0, 0,
- SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOCOPYBITS);
- if (rect)
- ::GetClientRect((HWND) pFrameWnd->GetClientWindow()->GetHWND(), rect);
- return TRUE;
- }
- }
- return FALSE;
+ DWORD dwNewStyle = dwStyle;
+ if (pChild != NULL && (dwThisStyle & WS_MAXIMIZE))
+ dwNewStyle &= ~(WS_EX_CLIENTEDGE);
+ else
+ dwNewStyle |= WS_EX_CLIENTEDGE;
+
+ if (dwStyle != dwNewStyle)
+ {
+ ::RedrawWindow((HWND) pFrameWnd->GetClientWindow()->GetHWND(), NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
+ ::SetWindowLong((HWND) pFrameWnd->GetClientWindow()->GetHWND(), GWL_EXSTYLE, dwNewStyle);
+ ::SetWindowPos((HWND) pFrameWnd->GetClientWindow()->GetHWND(), NULL, 0, 0, 0, 0,
+ SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOCOPYBITS);
+ if (rect)
+ ::GetClientRect((HWND) pFrameWnd->GetClientWindow()->GetHWND(), rect);
+ return TRUE;
+ }
+ }
+ return FALSE;
#else
return FALSE;
#endif
}
-void wxMDIChildFrame::MSWOnWindowPosChanging(void *pos)
+bool wxMDIChildFrame::MSWOnWindowPosChanging(void *pos)
{
WINDOWPOS *lpPos = (WINDOWPOS *)pos;
#if defined(__WIN95__)
if (!(lpPos->flags & SWP_NOSIZE))
- {
- RECT rectClient;
- DWORD dwExStyle = ::GetWindowLong((HWND) GetHWND(), GWL_EXSTYLE);
+ {
+ RECT rectClient;
+ DWORD dwExStyle = ::GetWindowLong((HWND) GetHWND(), GWL_EXSTYLE);
DWORD dwStyle = ::GetWindowLong((HWND) GetHWND(), GWL_STYLE);
- if (ResetWindowStyle((void *) & rectClient) && (dwStyle & WS_MAXIMIZE))
- {
- ::AdjustWindowRectEx(&rectClient, dwStyle, FALSE, dwExStyle);
- lpPos->x = rectClient.left;
+ if (ResetWindowStyle((void *) & rectClient) && (dwStyle & WS_MAXIMIZE))
+ {
+ ::AdjustWindowRectEx(&rectClient, dwStyle, FALSE, dwExStyle);
+ lpPos->x = rectClient.left;
lpPos->y = rectClient.top;
- lpPos->cx = rectClient.right - rectClient.left;
+ lpPos->cx = rectClient.right - rectClient.left;
lpPos->cy = rectClient.bottom - rectClient.top;
- }
- wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent();
+ }
+ wxMDIParentFrame* pFrameWnd = (wxMDIParentFrame *)GetParent();
if (pFrameWnd && pFrameWnd->GetToolBar())
{
pFrameWnd->GetToolBar()->Refresh();
}
- }
+ }
#endif
- Default();
+
+ return FALSE;
}
// Client window
-wxMDIClientWindow::wxMDIClientWindow(void)
+wxMDIClientWindow::wxMDIClientWindow()
{
m_scrollX = 0;
m_scrollY = 0;
}
-wxMDIClientWindow::~wxMDIClientWindow(void)
+wxMDIClientWindow::~wxMDIClientWindow()
{
}
CLIENTCREATESTRUCT ccs;
m_windowStyle = style;
- m_windowParent = parent;
-
+ m_parent = parent;
+
ccs.hWindowMenu = (HMENU) parent->GetWindowMenu();
ccs.idFirstChild = wxFIRST_MDI_CHILD;
DWORD msStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN ;
if ( parent->GetWindowStyleFlag() & wxHSCROLL )
- msStyle |= WS_HSCROLL;
+ msStyle |= WS_HSCROLL;
if ( parent->GetWindowStyleFlag() & wxVSCROLL )
- msStyle |= WS_VSCROLL ;
+ msStyle |= WS_VSCROLL ;
#if defined(__WIN95__)
DWORD exStyle = WS_EX_CLIENTEDGE;
long wxMDIClientWindow::MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
- if ( MSWGetOldWndProc() != 0)
- return ::CallWindowProc(CASTWNDPROC (FARPROC) MSWGetOldWndProc(), (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
- else
- return ::DefWindowProc((HWND) m_hWnd, (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
+ if ( MSWGetOldWndProc() != 0)
+ return ::CallWindowProc(CASTWNDPROC MSWGetOldWndProc(), (HWND) GetHWND(), (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
+ else
+ return ::DefWindowProc((HWND) m_hWnd, (UINT) nMsg, (WPARAM) wParam, (LPARAM) lParam);
}
// Explicitly call default scroll behaviour
else
m_scrollY = event.GetPosition(); // Always returns zero!
- Default();
-}
-
-// Should hand the message to the default proc
-long wxMDIClientWindow::MSWOnMDIActivate(long bActivate, WXHWND, WXHWND)
-{
- return Default();
+ Default();
}
-