1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/palmos/mdi.cpp
3 // Purpose: MDI classes for wx
4 // Author: William Osborne - minimal working wxPalmOS port
8 // Copyright: (c) William Osborne
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation "mdi.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
31 #if wxUSE_MDI && !defined(__WXUNIVERSAL__)
39 #include "wx/dialog.h"
41 #include "wx/statusbr.h"
43 #include "wx/settings.h"
49 #include "wx/palmos/private.h"
51 #if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
52 #include "wx/palmos/statbr95.h"
56 #include "wx/toolbar.h"
57 #endif // wxUSE_TOOLBAR
61 // ---------------------------------------------------------------------------
63 // ---------------------------------------------------------------------------
65 extern wxMenu
*wxCurrentPopupMenu
;
67 extern const wxChar
*wxMDIFrameClassName
; // from app.cpp
68 extern const wxChar
*wxMDIChildFrameClassName
;
69 extern const wxChar
*wxMDIChildFrameClassNameNoRedraw
;
70 extern void wxAssociateWinWithHandle(HWND hWnd
, wxWindow
*win
);
71 extern void wxRemoveHandleAssociation(wxWindow
*win
);
74 // ---------------------------------------------------------------------------
76 // ---------------------------------------------------------------------------
78 static const int IDM_WINDOWTILE
= 4001;
79 static const int IDM_WINDOWTILEHOR
= 4001;
80 static const int IDM_WINDOWCASCADE
= 4002;
81 static const int IDM_WINDOWICONS
= 4003;
82 static const int IDM_WINDOWNEXT
= 4004;
83 static const int IDM_WINDOWTILEVERT
= 4005;
84 static const int IDM_WINDOWPREV
= 4006;
86 // This range gives a maximum of 500 MDI children. Should be enough :-)
87 static const int wxFIRST_MDI_CHILD
= 4100;
88 static const int wxLAST_MDI_CHILD
= 4600;
90 // Status border dimensions
91 static const int wxTHICK_LINE_BORDER
= 3;
92 static const int wxTHICK_LINE_WIDTH
= 1;
94 // ---------------------------------------------------------------------------
96 // ---------------------------------------------------------------------------
98 // set the MDI menus (by sending the WM_MDISETMENU message) and update the menu
99 // of the parent of win (which is supposed to be the MDI client window)
100 static void MDISetMenu(wxWindow
*win
, HMENU hmenuFrame
, HMENU hmenuWindow
);
102 // insert the window menu (subMenu) into menu just before "Help" submenu or at
103 // the very end if not found
104 static void InsertWindowMenu(wxWindow
*win
, WXHMENU menu
, HMENU subMenu
);
106 // Remove the window menu
107 static void RemoveWindowMenu(wxWindow
*win
, WXHMENU menu
);
109 // is this an id of an MDI child?
110 inline bool IsMdiCommandId(int id
)
112 return (id
>= wxFIRST_MDI_CHILD
) && (id
<= wxLAST_MDI_CHILD
);
115 // unpack the parameters of WM_MDIACTIVATE message
116 static void UnpackMDIActivate(WXWPARAM wParam
, WXLPARAM lParam
,
117 WXWORD
*activate
, WXHWND
*hwndAct
, WXHWND
*hwndDeact
);
119 // return the HMENU of the MDI menu
120 static inline HMENU
GetMDIWindowMenu(wxMDIParentFrame
*frame
)
122 wxMenu
*menu
= frame
->GetWindowMenu();
123 return menu
? GetHmenuOf(menu
) : 0;
126 // ===========================================================================
128 // ===========================================================================
130 // ---------------------------------------------------------------------------
132 // ---------------------------------------------------------------------------
134 IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame
, wxFrame
)
135 IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame
, wxFrame
)
136 IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow
, wxWindow
)
138 BEGIN_EVENT_TABLE(wxMDIParentFrame
, wxFrame
)
139 EVT_SIZE(wxMDIParentFrame::OnSize
)
142 BEGIN_EVENT_TABLE(wxMDIChildFrame
, wxFrame
)
143 EVT_IDLE(wxMDIChildFrame::OnIdle
)
146 BEGIN_EVENT_TABLE(wxMDIClientWindow
, wxWindow
)
147 EVT_SCROLL(wxMDIClientWindow::OnScroll
)
150 // ===========================================================================
151 // wxMDIParentFrame: the frame which contains the client window which manages
153 // ===========================================================================
155 wxMDIParentFrame::wxMDIParentFrame()
159 bool wxMDIParentFrame::Create(wxWindow
*parent
,
161 const wxString
& title
,
165 const wxString
& name
)
170 wxMDIParentFrame::~wxMDIParentFrame()
174 #if wxUSE_MENUS_NATIVE
176 void wxMDIParentFrame::InternalSetMenuBar()
180 #endif // wxUSE_MENUS_NATIVE
182 void wxMDIParentFrame::SetWindowMenu(wxMenu
* menu
)
186 void wxMDIParentFrame::OnSize(wxSizeEvent
&)
190 // Returns the active MDI child window
191 wxMDIChildFrame
*wxMDIParentFrame::GetActiveChild() const
196 // Create the client window class (don't Create the window, just return a new
198 wxMDIClientWindow
*wxMDIParentFrame::OnCreateClient()
200 return new wxMDIClientWindow
;
203 WXHICON
wxMDIParentFrame::GetDefaultIcon() const
205 // we don't have any standard icons (any more)
209 // ---------------------------------------------------------------------------
211 // ---------------------------------------------------------------------------
213 void wxMDIParentFrame::Cascade()
217 void wxMDIParentFrame::Tile()
221 void wxMDIParentFrame::ArrangeIcons()
225 void wxMDIParentFrame::ActivateNext()
229 void wxMDIParentFrame::ActivatePrevious()
233 // ---------------------------------------------------------------------------
234 // the MDI parent frame window proc
235 // ---------------------------------------------------------------------------
237 WXLRESULT
wxMDIParentFrame::MSWWindowProc(WXUINT message
,
244 WXLRESULT
wxMDIParentFrame::MSWDefWindowProc(WXUINT message
,
251 bool wxMDIParentFrame::MSWTranslateMessage(WXMSG
* msg
)
256 // ===========================================================================
258 // ===========================================================================
260 void wxMDIChildFrame::Init()
264 bool wxMDIChildFrame::Create(wxMDIParentFrame
*parent
,
266 const wxString
& title
,
270 const wxString
& name
)
275 wxMDIChildFrame::~wxMDIChildFrame()
279 // Set the client size (i.e. leave the calculation of borders etc.
281 void wxMDIChildFrame::DoSetClientSize(int width
, int height
)
285 void wxMDIChildFrame::DoGetPosition(int *x
, int *y
) const
289 void wxMDIChildFrame::InternalSetMenuBar()
293 WXHICON
wxMDIChildFrame::GetDefaultIcon() const
295 // we don't have any standard icons (any more)
299 // ---------------------------------------------------------------------------
301 // ---------------------------------------------------------------------------
303 void wxMDIChildFrame::Maximize(bool maximize
)
307 void wxMDIChildFrame::Restore()
311 void wxMDIChildFrame::Activate()
315 // ---------------------------------------------------------------------------
316 // MDI window proc and message handlers
317 // ---------------------------------------------------------------------------
319 WXLRESULT
wxMDIChildFrame::MSWWindowProc(WXUINT message
,
326 bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate
),
333 bool wxMDIChildFrame::HandleWindowPosChanging(void *pos
)
338 // ---------------------------------------------------------------------------
339 // MDI specific message translation/preprocessing
340 // ---------------------------------------------------------------------------
342 WXLRESULT
wxMDIChildFrame::MSWDefWindowProc(WXUINT message
, WXWPARAM wParam
, WXLPARAM lParam
)
347 bool wxMDIChildFrame::MSWTranslateMessage(WXMSG
* msg
)
352 // ---------------------------------------------------------------------------
354 // ---------------------------------------------------------------------------
356 void wxMDIChildFrame::MSWDestroyWindow()
360 // Change the client window's extended style so we don't get a client edge
361 // style when a child is maximised (a double border looks silly.)
362 bool wxMDIChildFrame::ResetWindowStyle(void *vrect
)
367 // ===========================================================================
368 // wxMDIClientWindow: the window of predefined (by Windows) class which
369 // contains the child frames
370 // ===========================================================================
372 bool wxMDIClientWindow::CreateClient(wxMDIParentFrame
*parent
, long style
)
377 // Explicitly call default scroll behaviour
378 void wxMDIClientWindow::OnScroll(wxScrollEvent
& event
)
383 void wxMDIClientWindow::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
387 void wxMDIChildFrame::OnIdle(wxIdleEvent
& event
)
392 // ---------------------------------------------------------------------------
393 // non member functions
394 // ---------------------------------------------------------------------------
396 static void MDISetMenu(wxWindow
*win
, HMENU hmenuFrame
, HMENU hmenuWindow
)
400 static void InsertWindowMenu(wxWindow
*win
, WXHMENU menu
, HMENU subMenu
)
404 static void RemoveWindowMenu(wxWindow
*win
, WXHMENU menu
)
408 static void UnpackMDIActivate(WXWPARAM wParam
, WXLPARAM lParam
,
409 WXWORD
*activate
, WXHWND
*hwndAct
, WXHWND
*hwndDeact
)
413 #endif // wxUSE_MDI && !defined(__WXUNIVERSAL__)