]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/mdi.h
Post size events to the event handler and not window itself.
[wxWidgets.git] / interface / wx / mdi.h
index 6e37b9af788a3f3bcc21e4bbf955c57e6797522d..35334c364f67b2a078e17274aa0df89adfe83166 100644 (file)
@@ -3,19 +3,15 @@
 // Purpose:     interface of wxMDIClientWindow
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /**
     @class wxMDIClientWindow
-    @wxheader{mdi.h}
 
     An MDI client window is a child of wxMDIParentFrame, and manages zero or
     more wxMDIChildFrame objects.
 
-    @library{wxcore}
-    @category{managedwnd}
-
     @remarks
 
     The client window is the area where MDI child windows exist. It doesn't have to
     be overridden in order to give an opportunity to use a different class of client
     window.
 
-    Under Windows 95, the client window will automatically have a sunken border style
+    Under wxMSW, the client window will automatically have a sunken border style
     when the active child is not maximized, and no border style when a child is maximized.
 
+    @library{wxcore}
+    @category{managedwnd}
+
     @see wxMDIChildFrame, wxMDIParentFrame, wxFrame
 */
 class wxMDIClientWindow : public wxWindow
 {
 public:
-
     /**
         Default constructor.
-    */
+
+        Objects of this class are only created by wxMDIParentFrame which uses
+        the default constructor and calls CreateClient() immediately
+        afterwards.
+     */
     wxMDIClientWindow();
 
     /**
-        Constructor, creating the window.
+        Called by wxMDIParentFrame immediately after creating the client
+        window.
+
+        This function may be overridden in the derived class but the base class
+        version must usually be called first to really create the window.
 
         @param parent
             The window parent.
         @param style
-            The window style. Currently unused.
+            The window style. Only wxHSCROLL and wxVSCROLL bits are meaningful
+            here.
 
-        @remarks This constructor is called within wxMDIParentFrame::OnCreateClient().
-
-        @see wxMDIParentFrame::wxMDIParentFrame(), wxMDIParentFrame::OnCreateClient()
-    */
-    wxMDIClientWindow(wxMDIParentFrame* parent, long style = 0);
-
-    /**
-        Destructor.
     */
-    ~wxMDIClientWindow();
-
-    /**
-        Used in two-step frame construction. See wxMDIClientWindow()
-        for further details.
-    */
-    bool CreateClient(wxMDIParentFrame* parent, long style = 0);
+    virtual bool CreateClient(wxMDIParentFrame* parent, long style = 0);
 };
 
 
 
 /**
     @class wxMDIParentFrame
-    @wxheader{mdi.h}
 
-    An MDI (Multiple Document Interface) parent frame is a window which can contain
-    MDI child frames in its own 'desktop'. It is a convenient way to avoid window
-    clutter, and is used in many popular Windows applications, such as Microsoft Word(TM).
+    An MDI (Multiple Document Interface) parent frame is a window which can
+    contain MDI child frames in its client area which emulates the full
+    desktop.
+
+    MDI is a user-interface model in which all the window reside inside the
+    single parent window as opposed to being separate from each other. It
+    remains popular despite dire warnings from Microsoft itself (which
+    popularized this model in the first model) that MDI is obsolete.
+
+    An MDI parent frame always has a wxMDIClientWindow associated with it,
+    which is the parent for MDI child frames. In the simplest case, the client
+    window takes up the entire parent frame area but it is also possible to
+    resize it to be smaller in order to have other windows in the frame, a
+    typical example is using a sidebar along one of the window edges.
+
+    The appearance of MDI applications differs between different ports. The
+    classic MDI model, with child windows which can be independently moved,
+    resized etc, is only available under MSW, which provides native support for
+    it. In Mac ports, multiple top level windows are used for the MDI children
+    too and the MDI parent frame itself is invisible, to accommodate the native
+    look and feel requirements. In all the other ports, a tab-based MDI
+    implementation (sometimes called TDI) is used and so at most one MDI child
+    is visible at any moment (child frames are always maximized).
 
     @remarks
 
-    There may be multiple MDI parent frames in a single application, but this probably
-    only makes sense within programming development environments.
-
-    Child frames may be of class wxMDIChildFrame (contained within the parent frame)
-    or wxFrame (shown as a top-level frame).
-
-    An MDI parent frame always has a wxMDIClientWindow associated with it, which is the
-    parent for MDI child frames. This client window may be resized to accommodate non-MDI
-    windows, as seen in Microsoft Visual C++ (TM) and Microsoft Publisher (TM), where
-    a documentation window is placed to one side of the workspace.
+    Although it is possible to have multiple MDI parent frames, a typical MDI
+    application has a single MDI parent frame window inside which multiple MDI
+    child frames, i.e. objects of class wxMDIChildFrame, can be created.
 
-    MDI remains popular despite dire warnings from Microsoft itself that MDI is an obsolete
-    user interface style.
 
-    The implementation is native in Windows, and simulated under Motif. Under Motif, the
-    child window frames will often have a different appearance from other frames because
-    the window decorations are simulated.
+    @beginStyleTable
 
+    There are no special styles for this class, all wxFrame styles apply to it
+    in the usual way. The only exception is that wxHSCROLL and wxVSCROLL styles
+    apply not to the frame itself but to the client window, so that using them
+    enables horizontal and vertical scrollbars for this window and not the
+    frame.
 
-    @beginStyleTable
-    @style{wxCAPTION}
-           Puts a caption on the frame.
-    @style{wxDEFAULT_FRAME_STYLE}
-           Defined as @c wxMINIMIZE_BOX | @c wxMAXIMIZE_BOX | @c wxTHICK_FRAME |
-           @c wxSYSTEM_MENU | @c wxCAPTION.
-    @style{wxHSCROLL}
-           Displays a horizontal scrollbar in the client window, allowing the
-           user to view child frames that are off the current view.
-    @style{wxICONIZE}
-           Display the frame iconized (minimized) (Windows only).
-    @style{wxMAXIMIZE}
-           Displays the frame maximized (Windows only).
-    @style{wxMAXIMIZE_BOX}
-           Displays a maximize box on the frame (Windows and Motif only).
-    @style{wxMINIMIZE}
-           Identical to @c wxICONIZE.
-    @style{wxMINIMIZE_BOX}
-           Displays a minimize box on the frame (Windows and Motif only).
-    @style{wxRESIZE_BORDER}
-           Displays a resizeable border around the window (Motif only; for
-           Windows, it is implicit in @c wxTHICK_FRAME).
-    @style{wxSTAY_ON_TOP}
-           Stay on top of other windows (Windows only).
-    @style{wxSYSTEM_MENU}
-           Displays a system menu (Windows and Motif only).
-    @style{wxTHICK_FRAME}
-           Displays a thick frame around the window (Windows and Motif only).
-    @style{wxVSCROLL}
-           Displays a vertical scrollbar in the client window, allowing the
-           user to view child frames that are off the current view.
-    @style{wxFRAME_NO_WINDOW_MENU}
-           Under Windows, removes the Window menu that is normally added
-           automatically.
     @endStyleTable
 
     @library{wxcore}
@@ -147,35 +119,47 @@ public:
 
     /**
         Default constructor.
+
+        Use Create() for the objects created using this constructor.
     */
     wxMDIParentFrame();
 
     /**
         Constructor, creating the window.
 
+        Notice that if you override virtual OnCreateClient() method you
+        shouldn't be using this constructor but the default constructor and
+        Create() as otherwise your overridden method is never going to be
+        called because of the usual C++ virtual call resolution rules.
+
         @param parent
-            The window parent. This should be @NULL.
+            The window parent. Usually is @NULL.
         @param id
-            The window identifier. It may take a value of -1 to indicate a default
-            value.
+            The window identifier. It may take a value of @c wxID_ANY to
+            indicate a default value.
         @param title
             The caption to be displayed on the frame's title bar.
         @param pos
-            The window position. The value @c wxDefaultPosition indicates a default position,
-            chosen by either the windowing system or wxWidgets, depending on platform.
+            The window position. The value ::wxDefaultPosition indicates a
+            default position, chosen by either the windowing system or
+            wxWidgets, depending on platform.
         @param size
-            The window size. The value @c wxDefaultSize indicates a default size, chosen by
-            either the windowing system or wxWidgets, depending on platform.
+            The window size. The value ::wxDefaultSize indicates a default
+            size, chosen by either the windowing system or wxWidgets, depending
+            on platform.
         @param style
-            The window style. See wxMDIParentFrame.
+            The window style. Default value includes wxHSCROLL and wxVSCROLL
+            styles.
         @param name
             The name of the window. This parameter is used to associate a name
-            with the item, allowing the application user to set Motif resource values
-            for individual windows.
+            with the item, allowing the application user to set Motif resource
+            values for individual windows.
 
-        @remarks During the construction of the frame, the client window will be
-                 created. To use a different class from wxMDIClientWindow, override
-                 OnCreateClient().
+        @remarks
+
+        Under wxMSW, the client window will automatically have a sunken
+        border style when the active child is not maximized, and no border
+        style when a child is maximized.
 
         @see Create(), OnCreateClient()
     */
@@ -184,229 +168,201 @@ public:
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& size = wxDefaultSize,
                      long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
-                     const wxString& name = "frame");
+                     const wxString& name = wxFrameNameStr);
 
     /**
-        Destructor. Destroys all child windows and menu bar if present.
+        Destructor.
+
+        Destroys all child windows and menu bar if present.
     */
-    ~wxMDIParentFrame();
+    virtual ~wxMDIParentFrame();
 
     /**
         Activates the MDI child following the currently active one.
 
+        The MDI children are maintained in an ordered list and this function
+        switches to the next element in this list, wrapping around the end of
+        it if the currently active child is the last one.
+
         @see ActivatePrevious()
     */
-    void ActivateNext();
+    virtual void ActivateNext();
 
     /**
         Activates the MDI child preceding the currently active one.
 
         @see ActivateNext()
     */
-    void ActivatePrevious();
+    virtual void ActivatePrevious();
 
     /**
         Arranges any iconized (minimized) MDI child windows.
 
+        This method is only implemented in MSW MDI implementation and does
+        nothing under the other platforms.
+
         @see Cascade(), Tile()
     */
-    void ArrangeIcons();
+    virtual void ArrangeIcons();
 
     /**
         Arranges the MDI child windows in a cascade.
 
+        This method is only implemented in MSW MDI implementation and does
+        nothing under the other platforms.
+
         @see Tile(), ArrangeIcons()
     */
-    void Cascade();
+    virtual void Cascade();
 
     /**
-        Used in two-step frame construction. See wxMDIParentFrame()
-        for further details.
+        Used in two-step frame construction.
+
+        See wxMDIParentFrame() for further details.
     */
-    bool Create(wxWindow* parent, wxWindowID id,
+    bool Create(wxWindow* parent,
+                wxWindowID id,
                 const wxString& title,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxDEFAULT_FRAME_STYLE | wxVSCROLL | wxHSCROLL,
-                const wxString& name = "frame");
+                const wxString& name = wxFrameNameStr);
 
     /**
         Returns a pointer to the active MDI child, if there is one.
-    */
-    wxMDIChildFrame* GetActiveChild() const;
-
-    /**
-        This gets the size of the frame 'client area' in pixels.
-
-        @param width
-            Receives the client width in pixels.
-        @param height
-            Receives the client height in pixels.
 
-        @remarks
-
-        The client area is the area which may be drawn on by the programmer, excluding
-        title bar, border, status bar, and toolbar if present.
-
-        If you wish to manage your own toolbar (or perhaps you have more than one),
-        provide an @b OnSize event handler. Call GetClientSize() to find how much space
-        there is for your windows and don't forget to set the size and position of
-        the MDI client window as well as your toolbar and other windows (but not the
-        status bar).
-
-        If you have set a toolbar with wxMDIParentFrame::SetToolbar(), the client size
-        returned will have subtracted the toolbar height. However, the available positions
-        for the client window and other windows of the frame do not start at zero - you
-        must add the toolbar height.
-
-        The position and size of the status bar and toolbar (if known to the frame) are
-        always managed by wxMDIParentFrame, regardless of what behaviour is defined in
-        your @b OnSize event handler. However, the client window position and size are always
-        set in @b OnSize, so if you override this event handler, make sure you deal with the
-        client window.
-
-        You do not have to manage the size and position of MDI child windows, since they
-        are managed automatically by the client window.
-
-        @see GetToolBar(), SetToolBar(), wxMDIClientWindow
-
-        @beginWxPythonOnly
-        The wxPython version of this method takes no arguments and returns a tuple containing
-        width and height.
-        @endWxPythonOnly
+        If there are any children at all this function returns a non-@NULL
+        pointer.
     */
-    virtual void GetClientSize(int* width, int* height) const;
+    virtual wxMDIChildFrame* GetActiveChild() const;
 
     /**
         Returns a pointer to the client window.
 
         @see OnCreateClient()
     */
-    wxMDIClientWindow* GetClientWindow() const;
+    wxMDIClientWindowBase* GetClientWindow() const;
 
     /**
-        Returns the window being used as the toolbar for this frame.
+        Returns the current MDI Window menu.
+
+        Unless wxFRAME_NO_WINDOW_MENU style was used, a default menu listing
+        all the currently active children and providing the usual operations
+        (tile, cascade, ...) on them is created automatically by the library
+        and this function can be used to retrieve it. Notice that the default
+        menu can be replaced by calling SetWindowMenu().
 
-        @see SetToolBar()
+        This function is currently not available under OS X.
+
+        @return The current Window menu or @NULL.
     */
-    virtual wxWindow* GetToolBar() const;
+    wxMenu *GetWindowMenu() const;
 
     /**
-        Returns the current Window menu (added by wxWidgets to the menubar). This
-        function
-        is available under Windows only.
-    */
-    wxMenu* GetWindowMenu() const;
+        Returns whether the MDI implementation is tab-based.
+
+        Currently only the MSW port uses the real MDI. In Mac ports the usual
+        SDI is used, as common under this platforms, and all the other ports
+        use TDI implementation.
+
+        TDI-based MDI applications have different appearance and functionality
+        (e.g. child frames can't be minimized and only one of them is visible
+        at any given time) so the application may need to adapt its interface
+        somewhat depending on the return value of this function.
+     */
+    static bool IsTDI();
 
     /**
-        Override this to return a different kind of client window. If you override this
-        function, you must create your parent frame in two stages, or your function will
-        never be called, due to the way C++ treats virtual functions called from constructors.
-        For example:
+        Override this to return a different kind of client window.
+
+        If you override this function, you must create your parent frame in two
+        stages, or your function will never be called, due to the way C++
+        treats virtual functions called from constructors. For example:
 
         @code
         frame = new MyParentFrame;
-        frame->Create(parent, myParentFrameId, wxT("My Parent Frame"));
+        frame->Create(parent, myParentFrameId, "My Parent Frame");
         @endcode
 
         @remarks
 
-        You might wish to derive from wxMDIClientWindow in order to implement different
-        erase behaviour, for example, such as painting a bitmap on the background.
+        You might wish to derive from wxMDIClientWindow in order to implement
+        different erase behaviour, for example, such as painting a bitmap on
+        the background.
 
         Note that it is probably impossible to have a client window that scrolls
         as well as painting a bitmap or pattern, since in @b OnScroll, the scrollbar
-        positions always return zero. (Solutions to: julian.smart@btopenworld.com).
+        positions always return zero.
 
         @see GetClientWindow(), wxMDIClientWindow
     */
     virtual wxMDIClientWindow* OnCreateClient();
 
     /**
-        Sets the window to be used as a toolbar for this
-        MDI parent window. It saves the application having to manage the positioning
-        of the toolbar MDI client window.
-
-        @param toolbar
-            Toolbar to manage.
-
-        @remarks
-
-        When the frame is resized, the toolbar is resized to be the width of the frame
-        client area, and the toolbar height is kept the same.
-
-        When the frame is resized, the toolbar is resized to be the width of the frame
-        client area, and the toolbar height is kept the same.
-
-        The parent of the toolbar must be this frame.
-
-        If you wish to manage your own toolbar (or perhaps you have more than one),
-        don't call this function, and instead manage your subwindows and the MDI client
-        window by providing an @b OnSize event handler. Call wxMDIParentFrame::GetClientSize()
-        to find how much space there is for your windows.
-
-        Note that SDI (normal) frames and MDI child windows must always have their toolbars
-        managed by the application.
-
-        @see GetToolBar(), GetClientSize()
+        Replace the current MDI Window menu.
+
+        Ownership of the menu object passes to the frame when you call this
+        function, i.e. the menu will be deleted by it when it's no longer
+        needed (usually when the frame itself is deleted or when
+        SetWindowMenu() is called again).
+
+        To remove the window completely, you can use the wxFRAME_NO_WINDOW_MENU
+        window style but this function also allows to do it by passing @NULL
+        pointer as @a menu.
+
+        The menu may include the items with the following standard identifiers
+        (but may use arbitrary text and help strings and bitmaps for them):
+            - @c wxID_MDI_WINDOW_CASCADE
+            - @c wxID_MDI_WINDOW_TILE_HORZ
+            - @c wxID_MDI_WINDOW_TILE_VERT
+            - @c wxID_MDI_WINDOW_ARRANGE_ICONS
+            - @c wxID_MDI_WINDOW_PREV
+            - @c wxID_MDI_WINDOW_NEXT
+        All of which are handled by wxMDIParentFrame itself. If any other
+        commands are used in the menu, the derived frame should handle them.
+
+        This function is currently not available under OS X.
+
+        @param menu
+            The menu to be used instead of the standard MDI Window menu or @NULL.
     */
-    virtual void SetToolBar(wxWindow* toolbar);
+    virtual void SetWindowMenu(wxMenu* menu);
 
     /**
-        Call this to change the current Window menu. Ownership of the menu object
-        passes to the frame when you call this function.
-
-        This call is available under Windows only.
-
-        To remove the window completely, use the @c wxFRAME_NO_WINDOW_MENU window style.
-    */
-    void SetWindowMenu(wxMenu* menu);
+        Tiles the MDI child windows either horizontally or vertically depending
+        on whether @a orient is @c wxHORIZONTAL or @c wxVERTICAL.
 
-    /**
-        Tiles the MDI child windows either horizontally or vertically depending on
-        whether @a orient is @c wxHORIZONTAL or @c wxVERTICAL.
+        This method is only implemented in MSW MDI implementation and does
+        nothing under the other platforms.
 
-        Currently only implemented for MSW, does nothing under the other platforms.
     */
-    void Tile(wxOrientation orient = wxHORIZONTAL);
+    virtual void Tile(wxOrientation orient = wxHORIZONTAL);
 };
 
 
 
 /**
     @class wxMDIChildFrame
-    @wxheader{mdi.h}
 
-    An MDI child frame is a frame that can only exist on a wxMDIClientWindow,
-    which is itself a child of wxMDIParentFrame.
+    An MDI child frame is a frame that can only exist inside a
+    wxMDIClientWindow, which is itself a child of wxMDIParentFrame.
 
     @beginStyleTable
-    @style{wxCAPTION}
-           Puts a caption on the frame.
-    @style{wxDEFAULT_FRAME_STYLE}
-           Defined as @c wxMINIMIZE_BOX | @c wxMAXIMIZE_BOX | @c wxTHICK_FRAME |
-           @c wxSYSTEM_MENU | @c wxCAPTION.
-    @style{wxICONIZE}
-           Display the frame iconized (minimized) (Windows only).
-    @style{wxMAXIMIZE}
-           Displays the frame maximized (Windows only).
-    @style{wxMAXIMIZE_BOX}
-           Displays a maximize box on the frame (Windows and Motif only).
-    @style{wxMINIMIZE}
-           Identical to @c wxICONIZE.
-    @style{wxMINIMIZE_BOX}
-           Displays a minimize box on the frame (Windows and Motif only).
-    @style{wxRESIZE_BORDER}
-           Displays a resizeable border around the window (Motif only; for
-           Windows, it is implicit in @c wxTHICK_FRAME).
-    @style{wxSTAY_ON_TOP}
-           Stay on top of other windows (Windows only).
-    @style{wxSYSTEM_MENU}
-           Displays a system menu (Windows and Motif only).
-    @style{wxTHICK_FRAME}
-           Displays a thick frame around the window (Windows and Motif only).
+    All of the standard wxFrame styles can be used but most of them are ignored
+    by TDI-based MDI implementations.
     @endStyleTable
 
+    @remarks
+    Although internally an MDI child frame is a child of the MDI client window,
+    in wxWidgets you create it as a child of wxMDIParentFrame. In fact, you can
+    usually forget that the client window exists. MDI child frames are clipped
+    to the area of the MDI client window, and may be iconized on the client
+    window. You can associate a menubar with a child frame as usual, although
+    an MDI child doesn't display its menubar under its own title bar. The MDI
+    parent frame's menubar will be changed to reflect the currently active
+    child frame. If there are currently no children, the parent frame's own
+    menubar will be displayed.
+
     @library{wxcore}
     @category{managedwnd}
 
@@ -415,7 +371,6 @@ public:
 class wxMDIChildFrame : public wxFrame
 {
 public:
-
     /**
         Default constructor.
     */
@@ -432,10 +387,10 @@ public:
         @param title
             The caption to be displayed on the frame's title bar.
         @param pos
-            The window position. The value @c wxDefaultPosition indicates a default position,
+            The window position. The value ::wxDefaultPosition indicates a default position,
             chosen by either the windowing system or wxWidgets, depending on platform.
         @param size
-            The window size. The value @c wxDefaultSize indicates a default size, chosen by
+            The window size. The value ::wxDefaultSize indicates a default size, chosen by
             either the windowing system or wxWidgets, depending on platform.
         @param style
             The window style. See wxMDIChildFrame.
@@ -451,41 +406,66 @@ public:
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = wxDEFAULT_FRAME_STYLE,
-                    const wxString& name = "frame");
+                    const wxString& name = wxFrameNameStr);
 
     /**
         Destructor. Destroys all child windows and menu bar if present.
     */
-    ~wxMDIChildFrame();
+    virtual ~wxMDIChildFrame();
 
     /**
         Activates this MDI child frame.
 
         @see Maximize(), Restore()
     */
-    void Activate();
+    virtual void Activate();
 
     /**
-        Used in two-step frame construction. See wxMDIChildFrame()
-        for further details.
+        Used in two-step frame construction.
+        See wxMDIChildFrame() for further details.
     */
-    bool Create(wxWindow* parent, wxWindowID id,
-                const wxString& title,
+    bool Create(wxMDIParentFrame* parent, wxWindowID id, const wxString& title,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxDEFAULT_FRAME_STYLE,
-                const wxString& name = "frame");
+                const wxString& name = wxFrameNameStr);
+
+    /**
+        Returns the MDI parent frame containing this child.
+
+        Notice that this may return a different object than GetParent() as the
+        child frames may be created as children of the client window
+        internally.
+     */
+    wxMDIParentFrame *GetMDIParent() const;
+
+    /**
+        Returns true for MDI children in TDI implementations.
+
+        TDI-based implementations represent MDI children as pages in a
+        wxNotebook and so they are always maximized and can't be restored or
+        iconized.
+
+        @see wxMDIParentFrame::IsTDI().
+     */
+    virtual bool IsAlwaysMaximized() const;
 
     /**
         Maximizes this MDI child frame.
 
+        This function doesn't do anything if IsAlwaysMaximized() returns @true.
+
         @see Activate(), Restore()
     */
-    void Maximize(bool maximize);
+    virtual void Maximize(bool maximize = true);
 
     /**
         Restores this MDI child frame (unmaximizes).
+
+        This function doesn't do anything if IsAlwaysMaximized() returns @true.
+
+        @see Activate(), Maximize()
     */
-    void Restore();
+    virtual void Restore();
 };