Skip to content
Snippets Groups Projects
FXMDIChild.h 11.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • /********************************************************************************
    *                                                                               *
    *          M u l t i p l e   D o c u m e n t   C h i l d   W i n d o w          *
    *                                                                               *
    *********************************************************************************
    * Copyright (C) 1998,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
    *********************************************************************************
    * This library is free software; you can redistribute it and/or                 *
    * modify it under the terms of the GNU Lesser General Public                    *
    * License as published by the Free Software Foundation; either                  *
    * version 2.1 of the License, or (at your option) any later version.            *
    *                                                                               *
    * This library is distributed in the hope that it will be useful,               *
    * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
    * Lesser General Public License for more details.                               *
    *                                                                               *
    * You should have received a copy of the GNU Lesser General Public              *
    * License along with this library; if not, write to the Free Software           *
    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
    *********************************************************************************
    * $Id: FXMDIChild.h 2344 2006-02-12 21:19:36Z lyle $                        *
    ********************************************************************************/
    #ifndef FXMDICHILD_H
    #define FXMDICHILD_H
    
    #ifndef FXCOMPOSITE_H
    #include "FXComposite.h"
    #endif
    
    namespace FX {
    
    
    class FXMDIClient;
    class FXMenuButton;
    class FXButton;
    class FXFont;
    
    
    /// MDI Child Window styles
    enum {
      MDI_NORMAL    = 0,                /// Normal display mode
      MDI_MAXIMIZED = 0x00001000,       /// Window appears maximized
      MDI_MINIMIZED = 0x00002000,       /// Window is iconified or minimized
      MDI_TRACKING  = 0x00004000        /// Track continuously during dragging
      };
    
    
    
    /**
    * The MDI child window contains the application work area in a Multiple Document
    * Interface application.  GUI Controls are connected to the MDI child via delegation
    * through the MDI client, which forwards messages it receives to the active MDI child.
    * The MDI child itself tries to further delegate messages to its single content window,
    * and if not handled there, to its target object.
    * When the MDI child is maximized, it sends a SEL_MAXIMIZE message; when the MDI
    * child is minimized, it sends a SEL_MINIMIZE message.  When it is restored, it
    * sends a SEL_RESTORE message to its target.  The MDI child also notifies its
    * target when it becomes the active MDI child, via the SEL_SELECTED message.
    * The void* in the SEL_SELECTED message refers to the previously active MDI child,
    * if any.  When an MDI child ceases to be the active one, a SEL_DESELECTED message
    * is sent.  The void* in the SEL_DESELECTED message refers to the newly activated
    * MDI child, if any.  Thus, interception of SEL_SELECTED and SEL_DESELECTED allows
    * the target object to determine whether the user switched between MDI windows of
    * the same document (target) or between MDI windows belonging to the same document.
    * When the MDI child is closed, it sends a SEL_CLOSE message to its target.
    * The target has an opportunity to object to the closing; if the MDI child should
    * not be closed, it should return 1 (objection). If the MDI child should be closed,
    * the target can either just return 0 or simply not handle the SEL_CLOSE message.
    * The SEL_UPDATE message can be used to modify the MDI child's title (via
    * ID_SETSTRINGVALUE), and window icon (via ID_SETICONVALUE).
    */
    class FXAPI FXMDIChild : public FXComposite {
      FXDECLARE(FXMDIChild)
    protected:
      FXString      title;                  // Window title
      FXMenuButton *windowbtn;              // Window button
      FXButton     *minimizebtn;            // Minimize button
      FXButton     *restorebtn;             // Restore button
      FXButton     *maximizebtn;            // Maximize buton
      FXButton     *deletebtn;              // Close button
      FXFont       *font;                   // Title font
      FXColor       baseColor;              // Colors
      FXColor       hiliteColor;
      FXColor       shadowColor;
      FXColor       borderColor;
      FXColor       titleColor;
      FXColor       titleBackColor;
      FXint         iconPosX;               // Saved icon position
      FXint         iconPosY;
      FXint         iconWidth;
      FXint         iconHeight;
      FXint         normalPosX;             // Saved normal position
      FXint         normalPosY;
      FXint         normalWidth;
      FXint         normalHeight;
      FXint         spotx;                  // Grab-spot of mouse on window
      FXint         spoty;
      FXint         xoff;                   // Mouse offset to add
      FXint         yoff;
      FXint         newx;                   // New location of window
      FXint         newy;
      FXint         neww;
      FXint         newh;
      FXuchar       mode;                   // Dragging mode
    protected:
      FXMDIChild();
      void drawRubberBox(FXint x,FXint y,FXint w,FXint h);
      void animateRectangles(FXint ox,FXint oy,FXint ow,FXint oh,FXint nx,FXint ny,FXint nw,FXint nh);
      FXuchar where(FXint x,FXint y);
      void changeCursor(FXint x,FXint y);
      void revertCursor();
    protected:
      enum {
        DRAG_NONE        = 0,
        DRAG_TOP         = 1,
        DRAG_BOTTOM      = 2,
        DRAG_LEFT        = 4,
        DRAG_RIGHT       = 8,
        DRAG_TOPLEFT     = (DRAG_TOP|DRAG_LEFT),
        DRAG_TOPRIGHT    = (DRAG_TOP|DRAG_RIGHT),
        DRAG_BOTTOMLEFT  = (DRAG_BOTTOM|DRAG_LEFT),
        DRAG_BOTTOMRIGHT = (DRAG_BOTTOM|DRAG_RIGHT),
        DRAG_INVERTED    = 16,
        DRAG_TITLE       = 32
        };
    private:
      FXMDIChild(const FXMDIChild&);
      FXMDIChild &operator=(const FXMDIChild&);
    public:
      long onPaint(FXObject*,FXSelector,void*);
      long onFocusSelf(FXObject*,FXSelector,void*);
      long onFocusIn(FXObject*,FXSelector,void*);
      long onFocusOut(FXObject*,FXSelector,void*);
      long onRightBtnPress(FXObject*,FXSelector,void*);
      long onRightBtnRelease(FXObject*,FXSelector,void*);
      long onLeftBtnPress(FXObject*,FXSelector,void*);
      long onLeftBtnRelease(FXObject*,FXSelector,void*);
      long onMiddleBtnPress(FXObject*,FXSelector,void*);
      long onMiddleBtnRelease(FXObject*,FXSelector,void*);
      long onMotion(FXObject*,FXSelector,void*);
      long onSelected(FXObject*,FXSelector,void*);
      long onDeselected(FXObject*,FXSelector,void*);
      long onCmdClose(FXObject*,FXSelector,void*);
      long onUpdClose(FXObject*,FXSelector,void*);
      long onCmdRestore(FXObject*,FXSelector,void*);
      long onUpdRestore(FXObject*,FXSelector,void*);
      long onUpdMaximize(FXObject*,FXSelector,void*);
      long onUpdMinimize(FXObject*,FXSelector,void*);
      long onCmdMaximize(FXObject*,FXSelector,void*);
      long onCmdMinimize(FXObject*,FXSelector,void*);
      long onUpdWindow(FXObject*,FXSelector,void*);
      long onUpdMenuRestore(FXObject*,FXSelector,void*);
      long onUpdMenuMinimize(FXObject*,FXSelector,void*);
      long onUpdMenuClose(FXObject*,FXSelector,void*);
      long onUpdMenuWindow(FXObject*,FXSelector,void*);
      long onCmdSetStringValue(FXObject*,FXSelector,void*);
      long onCmdGetStringValue(FXObject*,FXSelector,void*);
      long onCmdSetIconValue(FXObject*,FXSelector,void*);
      long onCmdGetIconValue(FXObject*,FXSelector,void*);
      virtual long onDefault(FXObject*,FXSelector,void*);
    public:
    
      /// Construct MDI Child window with given name and icon
      FXMDIChild(FXMDIClient* p,const FXString& name,FXIcon* ic=NULL,FXPopup* pup=NULL,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0);
    
      /// Create window
      virtual void create();
    
      /// Detach window
      virtual void detach();
    
      /// Perform layout
      virtual void layout();
    
      /// Return the default width of this window
      virtual FXint getDefaultWidth();
    
      /// Return the default height of this window
      virtual FXint getDefaultHeight();
    
      /// Move the focus to this window
      virtual void setFocus();
    
      /// MDI Child can receive focus
      virtual bool canFocus() const;
    
      /// Move this window to the specified position in the parent's coordinates
      virtual void move(FXint x,FXint y);
    
      /// Resize this window to the specified width and height
      virtual void resize(FXint w,FXint h);
    
      /// Move and resize this window in the parent's coordinates
      virtual void position(FXint x,FXint y,FXint w,FXint h);
    
      /// Change normal (restored) position
      void setNormalX(FXint x){ normalPosX=x; }
      void setNormalY(FXint y){ normalPosY=y; }
      void setNormalWidth(FXint w){ normalWidth=w; }
      void setNormalHeight(FXint h){ normalHeight=h; }
    
      /// Return normal (restored) position
      FXint getNormalX() const { return normalPosX; }
      FXint getNormalY() const { return normalPosY; }
      FXint getNormalWidth() const { return normalWidth; }
      FXint getNormalHeight() const { return normalHeight; }
    
      /// Change iconified position
      void setIconX(FXint x){ iconPosX=x; }
      void setIconY(FXint y){ iconPosY=y; }
      void setIconWidth(FXint w){ iconWidth=w; }
      void setIconHeight(FXint h){ iconHeight=h; }
    
      /// Return iconified position
      FXint getIconX() const { return iconPosX; }
      FXint getIconY() const { return iconPosY; }
      FXint getIconWidth() const { return iconWidth; }
      FXint getIconHeight() const { return iconHeight; }
    
      /// Return content window
      FXWindow *contentWindow() const;
    
      /// Change MDI Child's title
      void setTitle(const FXString& name);
    
      /// Get current title
      FXString getTitle() const { return title; }
    
      /// Get colors
      FXColor getHiliteColor() const { return hiliteColor; }
      FXColor getShadowColor() const { return shadowColor; }
      FXColor getBaseColor() const { return baseColor; }
      FXColor getBorderColor() const { return borderColor; }
      FXColor getTitleColor () const { return titleColor; }
      FXColor getTitleBackColor() const { return titleBackColor; }
    
      /// Change colors
      void setHiliteColor(FXColor clr);
      void setShadowColor(FXColor clr);
      void setBaseColor(FXColor clr);
      void setBorderColor(FXColor clr);
      void setTitleColor(FXColor clr);
      void setTitleBackColor(FXColor clr);
    
      /// Maximize MDI window, return TRUE if maximized
      virtual FXbool maximize(FXbool notify=FALSE);
    
      /// Minimize/iconify MDI window, return TRUE if minimized
      virtual FXbool minimize(FXbool notify=FALSE);
    
      /// Restore MDI window to normal, return TRUE if restored
      virtual FXbool restore(FXbool notify=FALSE);
    
      /// Close MDI window, return TRUE if actually closed
      virtual FXbool close(FXbool notify=FALSE);
    
      /// Return TRUE if maximized
      FXbool isMaximized() const;
    
      /// Return TRUE if minimized
      FXbool isMinimized() const;
    
      /// Get window icon
      FXIcon *getIcon() const;
    
      /// Set window icon
      void setIcon(FXIcon* icon);
    
      /// Get window menu
      FXPopup* getMenu() const;
    
      /// Set window menu
      void setMenu(FXPopup* menu);
    
      /// Set tracking instead of just outline
      void setTracking(FXbool tracking=TRUE);
    
      /// Return true if tracking
      FXbool getTracking() const;
    
      /// Set title font
      void setFont(FXFont *fnt);
    
      /// Get title font
      FXFont* getFont() const { return font; }
    
      /// Save to stream
      virtual void save(FXStream& store) const;
    
      /// Load from stream
      virtual void load(FXStream& store);
    
      /// Destroy
      virtual ~FXMDIChild();
      };
    
    }
    
    #endif