1///////////////////////////////////////////////////////////////////////////// 2// Name: src/palmos/mdi.cpp 3// Purpose: MDI classes for wx 4// Author: William Osborne - minimal working wxPalmOS port 5// Modified by: 6// Created: 10/13/04 7// RCS-ID: $Id: mdi.cpp 39646 2006-06-09 09:51:39Z ABX $ 8// Copyright: (c) William Osborne 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// =========================================================================== 13// declarations 14// =========================================================================== 15 16// --------------------------------------------------------------------------- 17// headers 18// --------------------------------------------------------------------------- 19 20// For compilers that support precompilation, includes "wx.h". 21#include "wx/wxprec.h" 22 23#ifdef __BORLANDC__ 24 #pragma hdrstop 25#endif 26 27#if wxUSE_MDI 28 29#include "wx/mdi.h" 30 31#ifndef WX_PRECOMP 32 #include "wx/frame.h" 33 #include "wx/menu.h" 34 #include "wx/app.h" 35 #include "wx/utils.h" 36 #include "wx/dialog.h" 37 #include "wx/statusbr.h" 38 #include "wx/settings.h" 39 #include "wx/intl.h" 40 #include "wx/log.h" 41 #include "wx/toolbar.h" 42#endif 43 44#include "wx/palmos/private.h" 45 46#if wxUSE_STATUSBAR && wxUSE_NATIVE_STATUSBAR 47 #include "wx/palmos/statbr95.h" 48#endif 49 50#include <string.h> 51 52// --------------------------------------------------------------------------- 53// global variables 54// --------------------------------------------------------------------------- 55 56extern wxMenu *wxCurrentPopupMenu; 57 58extern const wxChar *wxMDIFrameClassName; // from app.cpp 59extern const wxChar *wxMDIChildFrameClassName; 60extern const wxChar *wxMDIChildFrameClassNameNoRedraw; 61extern void wxAssociateWinWithHandle(HWND hWnd, wxWindow *win); 62extern void wxRemoveHandleAssociation(wxWindow *win); 63 64 65// --------------------------------------------------------------------------- 66// constants 67// --------------------------------------------------------------------------- 68 69static const int IDM_WINDOWTILE = 4001; 70static const int IDM_WINDOWTILEHOR = 4001; 71static const int IDM_WINDOWCASCADE = 4002; 72static const int IDM_WINDOWICONS = 4003; 73static const int IDM_WINDOWNEXT = 4004; 74static const int IDM_WINDOWTILEVERT = 4005; 75static const int IDM_WINDOWPREV = 4006; 76 77// This range gives a maximum of 500 MDI children. Should be enough :-) 78static const int wxFIRST_MDI_CHILD = 4100; 79static const int wxLAST_MDI_CHILD = 4600; 80 81// Status border dimensions 82static const int wxTHICK_LINE_BORDER = 3; 83static const int wxTHICK_LINE_WIDTH = 1; 84 85// --------------------------------------------------------------------------- 86// private functions 87// --------------------------------------------------------------------------- 88 89// set the MDI menus (by sending the WM_MDISETMENU message) and update the menu 90// of the parent of win (which is supposed to be the MDI client window) 91static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow); 92 93// insert the window menu (subMenu) into menu just before "Help" submenu or at 94// the very end if not found 95static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu); 96 97// Remove the window menu 98static void RemoveWindowMenu(wxWindow *win, WXHMENU menu); 99 100// is this an id of an MDI child? 101inline bool IsMdiCommandId(int id) 102{ 103 return (id >= wxFIRST_MDI_CHILD) && (id <= wxLAST_MDI_CHILD); 104} 105 106// unpack the parameters of WM_MDIACTIVATE message 107static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam, 108 WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact); 109 110// return the HMENU of the MDI menu 111static inline HMENU GetMDIWindowMenu(wxMDIParentFrame *frame) 112{ 113 wxMenu *menu = frame->GetWindowMenu(); 114 return menu ? GetHmenuOf(menu) : 0; 115} 116 117// =========================================================================== 118// implementation 119// =========================================================================== 120 121// --------------------------------------------------------------------------- 122// wxWin macros 123// --------------------------------------------------------------------------- 124 125IMPLEMENT_DYNAMIC_CLASS(wxMDIParentFrame, wxFrame) 126IMPLEMENT_DYNAMIC_CLASS(wxMDIChildFrame, wxFrame) 127IMPLEMENT_DYNAMIC_CLASS(wxMDIClientWindow, wxWindow) 128 129BEGIN_EVENT_TABLE(wxMDIParentFrame, wxFrame) 130 EVT_SIZE(wxMDIParentFrame::OnSize) 131END_EVENT_TABLE() 132 133BEGIN_EVENT_TABLE(wxMDIChildFrame, wxFrame) 134 EVT_IDLE(wxMDIChildFrame::OnIdle) 135END_EVENT_TABLE() 136 137BEGIN_EVENT_TABLE(wxMDIClientWindow, wxWindow) 138 EVT_SCROLL(wxMDIClientWindow::OnScroll) 139END_EVENT_TABLE() 140 141// =========================================================================== 142// wxMDIParentFrame: the frame which contains the client window which manages 143// the children 144// =========================================================================== 145 146wxMDIParentFrame::wxMDIParentFrame() 147{ 148} 149 150bool wxMDIParentFrame::Create(wxWindow *parent, 151 wxWindowID id, 152 const wxString& title, 153 const wxPoint& pos, 154 const wxSize& size, 155 long style, 156 const wxString& name) 157{ 158 return false; 159} 160 161wxMDIParentFrame::~wxMDIParentFrame() 162{ 163} 164 165#if wxUSE_MENUS_NATIVE 166 167void wxMDIParentFrame::InternalSetMenuBar() 168{ 169} 170 171#endif // wxUSE_MENUS_NATIVE 172 173void wxMDIParentFrame::SetWindowMenu(wxMenu* menu) 174{ 175} 176 177void wxMDIParentFrame::OnSize(wxSizeEvent&) 178{ 179} 180 181// Returns the active MDI child window 182wxMDIChildFrame *wxMDIParentFrame::GetActiveChild() const 183{ 184 return NULL; 185} 186 187// Create the client window class (don't Create the window, just return a new 188// class) 189wxMDIClientWindow *wxMDIParentFrame::OnCreateClient() 190{ 191 return new wxMDIClientWindow; 192} 193 194WXHICON wxMDIParentFrame::GetDefaultIcon() const 195{ 196 // we don't have any standard icons (any more) 197 return (WXHICON)0; 198} 199 200// --------------------------------------------------------------------------- 201// MDI operations 202// --------------------------------------------------------------------------- 203 204void wxMDIParentFrame::Cascade() 205{ 206} 207 208void wxMDIParentFrame::Tile() 209{ 210} 211 212void wxMDIParentFrame::ArrangeIcons() 213{ 214} 215 216void wxMDIParentFrame::ActivateNext() 217{ 218} 219 220void wxMDIParentFrame::ActivatePrevious() 221{ 222} 223 224// --------------------------------------------------------------------------- 225// the MDI parent frame window proc 226// --------------------------------------------------------------------------- 227 228WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message, 229 WXWPARAM wParam, 230 WXLPARAM lParam) 231{ 232 return 0; 233} 234 235WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message, 236 WXWPARAM wParam, 237 WXLPARAM lParam) 238{ 239 return 0; 240} 241 242bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg) 243{ 244 return false; 245} 246 247// =========================================================================== 248// wxMDIChildFrame 249// =========================================================================== 250 251void wxMDIChildFrame::Init() 252{ 253} 254 255bool wxMDIChildFrame::Create(wxMDIParentFrame *parent, 256 wxWindowID id, 257 const wxString& title, 258 const wxPoint& pos, 259 const wxSize& size, 260 long style, 261 const wxString& name) 262{ 263 return false; 264} 265 266wxMDIChildFrame::~wxMDIChildFrame() 267{ 268} 269 270// Set the client size (i.e. leave the calculation of borders etc. 271// to wxWidgets) 272void wxMDIChildFrame::DoSetClientSize(int width, int height) 273{ 274} 275 276void wxMDIChildFrame::DoGetPosition(int *x, int *y) const 277{ 278} 279 280void wxMDIChildFrame::InternalSetMenuBar() 281{ 282} 283 284WXHICON wxMDIChildFrame::GetDefaultIcon() const 285{ 286 // we don't have any standard icons (any more) 287 return (WXHICON)0; 288} 289 290// --------------------------------------------------------------------------- 291// MDI operations 292// --------------------------------------------------------------------------- 293 294void wxMDIChildFrame::Maximize(bool maximize) 295{ 296} 297 298void wxMDIChildFrame::Restore() 299{ 300} 301 302void wxMDIChildFrame::Activate() 303{ 304} 305 306// --------------------------------------------------------------------------- 307// MDI window proc and message handlers 308// --------------------------------------------------------------------------- 309 310WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message, 311 WXWPARAM wParam, 312 WXLPARAM lParam) 313{ 314 return 0; 315} 316 317bool wxMDIChildFrame::HandleMDIActivate(long WXUNUSED(activate), 318 WXHWND hwndAct, 319 WXHWND hwndDeact) 320{ 321 return false; 322} 323 324bool wxMDIChildFrame::HandleWindowPosChanging(void *pos) 325{ 326 return false; 327} 328 329// --------------------------------------------------------------------------- 330// MDI specific message translation/preprocessing 331// --------------------------------------------------------------------------- 332 333WXLRESULT wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) 334{ 335 return 0; 336} 337 338bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg) 339{ 340 return false; 341} 342 343// --------------------------------------------------------------------------- 344// misc 345// --------------------------------------------------------------------------- 346 347void wxMDIChildFrame::MSWDestroyWindow() 348{ 349} 350 351// Change the client window's extended style so we don't get a client edge 352// style when a child is maximised (a double border looks silly.) 353bool wxMDIChildFrame::ResetWindowStyle(void *vrect) 354{ 355 return false; 356} 357 358// =========================================================================== 359// wxMDIClientWindow: the window of predefined (by Windows) class which 360// contains the child frames 361// =========================================================================== 362 363bool wxMDIClientWindow::CreateClient(wxMDIParentFrame *parent, long style) 364{ 365 return false; 366} 367 368// Explicitly call default scroll behaviour 369void wxMDIClientWindow::OnScroll(wxScrollEvent& event) 370{ 371 event.Skip(); 372} 373 374void wxMDIClientWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags) 375{ 376} 377 378void wxMDIChildFrame::OnIdle(wxIdleEvent& event) 379{ 380 event.Skip(); 381} 382 383// --------------------------------------------------------------------------- 384// non member functions 385// --------------------------------------------------------------------------- 386 387static void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow) 388{ 389} 390 391static void InsertWindowMenu(wxWindow *win, WXHMENU menu, HMENU subMenu) 392{ 393} 394 395static void RemoveWindowMenu(wxWindow *win, WXHMENU menu) 396{ 397} 398 399static void UnpackMDIActivate(WXWPARAM wParam, WXLPARAM lParam, 400 WXWORD *activate, WXHWND *hwndAct, WXHWND *hwndDeact) 401{ 402} 403 404#endif // wxUSE_MDI 405