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 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
27 #if wxUSE_MDI && !defined(__WXUNIVERSAL__)
34 #include "wx/dialog.h"
36 #include "wx/statusbr.h"
38 #include "wx/settings.h"
41 #include "wx/toolbar.h"
45 #include "wx/palmos/private.h"
47 #if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR
48 #include "wx/palmos/statbr95.h"
53 // ---------------------------------------------------------------------------
55 // ---------------------------------------------------------------------------
57 extern wxMenu
*wxCurrentPopupMenu
;
59 extern const wxChar
*wxMDIFrameClassName
; // from app.cpp
60 extern const wxChar
*wxMDIChildFrameClassName
;
61 extern const wxChar
*wxMDIChildFrameClassNameNoRedraw
;
62 extern void wxAssociateWinWithHandle(HWND hWnd
, wxWindow
*win
);
63 extern void wxRemoveHandleAssociation(wxWindow
*win
);
66 // ---------------------------------------------------------------------------
68 // ---------------------------------------------------------------------------
70 static const int IDM_WINDOWTILE
= 4001;
71 static const int IDM_WINDOWTILEHOR
= 4001;
72 static const int IDM_WINDOWCASCADE
= 4002;
73 static const int IDM_WINDOWICONS
= 4003;
74 static const int IDM_WINDOWNEXT
= 4004;
75 static const int IDM_WINDOWTILEVERT
= 4005;
76 static const int IDM_WINDOWPREV
= 4006;
78 // This range gives a maximum of 500 MDI children. Should be enough :-)
79 static const int wxFIRST_MDI_CHILD
= 4100;
80 static const int wxLAST_MDI_CHILD
= 4600;
82 // Status border dimensions
83 static const int wxTHICK_LINE_BORDER
= 3;
84 static const int wxTHICK_LINE_WIDTH
= 1;
86 // ---------------------------------------------------------------------------
88 // ---------------------------------------------------------------------------
90 // set the MDI menus (by sending the WM_MDISETMENU message) and update the menu
91 // of the parent of win (which is supposed to be the MDI client window)
92 static void MDISetMenu(wxWindow
*win
, HMENU hmenuFrame
, HMENU hmenuWindow
);
94 // insert the window menu (subMenu) into menu just before "Help" submenu or at
95 // the very end if not found
96 static void InsertWindowMenu(wxWindow
*win
, WXHMENU menu
, HMENU subMenu
);
98 // Remove the window menu
99 static void RemoveWindowMenu(wxWindow
*win
, WXHMENU menu
);
101 // is this an id of an MDI child?
102 inline bool IsMdiCommandId(int id
)
104 return (id
>= wxFIRST_MDI_CHILD
) && (id
<= wxLAST_MDI_CHILD
);
107 // unpack the parameters of WM_MDIACTIVATE message
108 static void UnpackMDIActivate(WXWPARAM wParam
, WXLPARAM lParam
,
109 WXWORD
*activate
, WXHWND
*hwndAct
, WXHWND
*hwndDeact
);
111 // return the HMENU of the MDI menu
112 static inline HMENU
GetMDIWindowMenu(wxMDIParentFrame
*frame
)
114 wxMenu
*menu
= frame
->GetWindowMenu();
115 return menu
? GetHmenuOf(menu
) : 0;
118 // ===========================================================================
120 // ===========================================================================
122 // ---------------------------------------------------------------------------
124 // ---------------------------------------------------------------------------
126 IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame
, wxFrame
)
127 IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame
, wxFrame
)
128 IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow
, wxWindow
)
130 BEGIN_EVENT_TABLE(wxMDIParentFrame
, wxFrame
)
131 EVT_SIZE(wxMDIParentFrame::OnSize
)
134 BEGIN_EVENT_TABLE(wxMDIChildFrame
, wxFrame
)
135 EVT_IDLE(wxMDIChildFrame::OnIdle
)
138 BEGIN_EVENT_TABLE(wxMDIClientWindow
, wxWindow
)
139 EVT_SCROLL(wxMDIClientWindow::OnScroll
)
142 // ===========================================================================
143 // wxMDIParentFrame: the frame which contains the client window which manages
145 // ===========================================================================
147 wxMDIParentFrame::wxMDIParentFrame()
151 bool wxMDIParentFrame::Create(wxWindow
*parent
,
153 const wxString
& title
,
157 const wxString
& name
)
162 wxMDIParentFrame::~wxMDIParentFrame()
166 #if wxUSE_MENUS_NATIVE
168 void wxMDIParentFrame::InternalSetMenuBar()
172 #endif // wxUSE_MENUS_NATIVE
174 void wxMDIParentFrame::SetWindowMenu(wxMenu
* menu
)
178 void wxMDIParentFrame::OnSize(wxSizeEvent
&)
182 // Returns the active MDI child window
183 wxMDIChildFrame
*wxMDIParentFrame::GetActiveChild() const
188 // Create the client window class (don't Create the window, just return a new
190 wxMDIClientWindow
*wxMDIParentFrame::OnCreateClient()
192 return new wxMDIClientWindow
;
195 WXHICON
wxMDIParentFrame::GetDefaultIcon() const
197 // we don't have any standard icons (any more)
201 // ---------------------------------------------------------------------------
203 // ---------------------------------------------------------------------------
205 void wxMDIParentFrame::Cascade()
209 void wxMDIParentFrame::Tile()
213 void wxMDIParentFrame::ArrangeIcons()
217 void wxMDIParentFrame::ActivateNext()
221 void wxMDIParentFrame::ActivatePrevious()
225 // ---------------------------------------------------------------------------
226 // the MDI parent frame window proc
227 // ---------------------------------------------------------------------------
229 WXLRESULT
wxMDIParentFrame::MSWWindowProc(WXUINT message
,
236 WXLRESULT
wxMDIParentFrame::MSWDefWindowProc(WXUINT message
,
243 bool wxMDIParentFrame::MSWTranslateMessage(WXMSG
* msg
)
248 // ===========================================================================
250 // ===========================================================================
252 void wxMDIChildFrame::Init()
256 bool wxMDIChildFrame::Create(wxMDIParentFrame
*parent
,
258 const wxString
& title
,
262 const wxString
& name
)
267 wxMDIChildFrame::~wxMDIChildFrame()
271 // Set the client size (i.e. leave the calculation of borders etc.
273 void wxMDIChildFrame::DoSetClientSize(int width
, int height
)
277 void wxMDIChildFrame::DoGetPosition(int *x
, int *y
) const
281 void wxMDIChildFrame::InternalSetMenuBar()
285 WXHICON
wxMDIChildFrame::GetDefaultIcon() const
287 // we don't have any standard icons (any more)
291 // ---------------------------------------------------------------------------
293 // ---------------------------------------------------------------------------
295 void wxMDIChildFrame::Maximize(bool maximize
)
299 void wxMDIChildFrame::Restore()
303 void wxMDIChildFrame::Activate()
307 // ---------------------------------------------------------------------------
308 // MDI window proc and message handlers
309 // ---------------------------------------------------------------------------
311 WXLRESULT
wxMDIChildFrame::MSWWindowProc(WXUINT message
,
318 bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate
),
325 bool wxMDIChildFrame::HandleWindowPosChanging(void *pos
)
330 // ---------------------------------------------------------------------------
331 // MDI specific message translation/preprocessing
332 // ---------------------------------------------------------------------------
334 WXLRESULT
wxMDIChildFrame::MSWDefWindowProc(WXUINT message
, WXWPARAM wParam
, WXLPARAM lParam
)
339 bool wxMDIChildFrame::MSWTranslateMessage(WXMSG
* msg
)
344 // ---------------------------------------------------------------------------
346 // ---------------------------------------------------------------------------
348 void wxMDIChildFrame::MSWDestroyWindow()
352 // Change the client window's extended style so we don't get a client edge
353 // style when a child is maximised (a double border looks silly.)
354 bool wxMDIChildFrame::ResetWindowStyle(void *vrect
)
359 // ===========================================================================
360 // wxMDIClientWindow: the window of predefined (by Windows) class which
361 // contains the child frames
362 // ===========================================================================
364 bool wxMDIClientWindow::CreateClient(wxMDIParentFrame
*parent
, long style
)
369 // Explicitly call default scroll behaviour
370 void wxMDIClientWindow::OnScroll(wxScrollEvent
& event
)
375 void wxMDIClientWindow::DoSetSize(int x
, int y
, int width
, int height
, int sizeFlags
)
379 void wxMDIChildFrame::OnIdle(wxIdleEvent
& event
)
384 // ---------------------------------------------------------------------------
385 // non member functions
386 // ---------------------------------------------------------------------------
388 static void MDISetMenu(wxWindow
*win
, HMENU hmenuFrame
, HMENU hmenuWindow
)
392 static void InsertWindowMenu(wxWindow
*win
, WXHMENU menu
, HMENU subMenu
)
396 static void RemoveWindowMenu(wxWindow
*win
, WXHMENU menu
)
400 static void UnpackMDIActivate(WXWPARAM wParam
, WXLPARAM lParam
,
401 WXWORD
*activate
, WXHWND
*hwndAct
, WXHWND
*hwndDeact
)
405 #endif // wxUSE_MDI && !defined(__WXUNIVERSAL__)