home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 16 / CD_ASCQ_16_0994.iso / news / 4611 / fw16d.ins / SOURCE / CLASSES / MDICLIEN.PRG < prev    next >
Text File  |  1994-06-12  |  6KB  |  192 lines

  1. #include "FiveWin.ch"
  2.  
  3. #define MDIS_ALLCHILDSTYLES   1
  4.  
  5. #define WM_MDICREATE        544   // 0x0220
  6. #define WM_MDIDESTROY       545   // 0x0221
  7. #define WM_MDIACTIVATE      546   // 0x0222
  8. #define WM_MDIRESTORE       547   // 0x0223
  9. #define WM_MDINEXT          548   // 0x0224
  10. #define WM_MDIMAXIMIZE      549   // 0x0225
  11. #define WM_MDITILE          550   // 0x0226
  12. #define WM_MDICASCADE       551   // 0x0227
  13. #define WM_MDIICONARRANGE   552   // 0x0228
  14. #define WM_MDIGETACTIVE     553   // 0x0229
  15. #define WM_MDISETMENU       554   // 0x0230
  16. #define WM_SYSCOMMAND       274   // 0x0112
  17.  
  18. #define SC_CLOSE          61536   // 0xF060
  19. #define SC_NEXT           61504
  20.  
  21. //----------------------------------------------------------------------------//
  22.  
  23. CLASS TMdiClient FROM TWindow
  24.  
  25.    DATA   aWnd
  26.  
  27.    METHOD New( oWnd, nSubMenu, nIdChildFirst, oBrush, lVScroll, lHScroll ) ;
  28.                                                                  CONSTRUCTOR
  29.  
  30.    METHOD Tile( lHor )   INLINE  lHor := If( lHor == nil, .f., lHor ),;
  31.                                  ::SendMsg( WM_MDITILE, If( lHor, 1, 0 ) )
  32.  
  33.    METHOD Cascade()      INLINE  ::SendMsg( WM_MDICASCADE )
  34.    METHOD ArrangeIcons() INLINE  ::SendMsg( WM_MDIICONARRANGE )
  35.    METHOD NextWindow()   INLINE  ::SendMsg( WM_MDINEXT )
  36.    METHOD GetActive()
  37.    METHOD Add( oWnd )    INLINE AAdd( ::aWnd, oWnd )
  38.  
  39.    METHOD ChildNew( nTop, nLeft, nBottom, nRight, cTitle, nStyle )
  40.  
  41.    METHOD ChildActivate( oWnd ) INLINE ::SendMsg( WM_MDIACTIVATE, oWnd:hWnd )
  42.  
  43.    METHOD ChildMaximize( oWnd ) INLINE ::SendMsg( WM_MDIMAXIMIZE, oWnd:hWnd )
  44.  
  45.    METHOD ChildRestore( oWnd )  INLINE ::SendMsg( WM_MDIRESTORE, oWnd:hWnd )
  46.  
  47.    METHOD ChildClose( oWnd )
  48.  
  49.    METHOD ChildNext( oWnd, lPrev ) INLINE ;
  50.                            lPrev := If( lPrev == nil, .f., lPrev ),;
  51.                            ::SendMsg( WM_MDINEXT, oWnd:hWnd, If( lPrev, 1, 0 ) )
  52.  
  53.    // This method fixes some resizing bugs we had !
  54.  
  55.    METHOD ReSize( nSizeType, nWidth, nHeigh ) VIRTUAL
  56.  
  57.    METHOD lCloseAll()
  58.  
  59.    METHOD IconizeAll() INLINE AEval( ::aWnd, { | oWnd | oWnd:Iconize() } )
  60.  
  61.    MESSAGE Select METHOD _Select( nWindow )
  62.  
  63.    METHOD  KeyDown( nKey, nFlags )
  64.  
  65.    METHOD  MouseMove( nRow, nCol, nFlags ) INLINE ::oWnd:SetMsg(),;
  66.                         Super:MouseMove( nRow, nCol, nFlags )
  67.  
  68. ENDCLASS
  69.  
  70. //----------------------------------------------------------------------------//
  71.  
  72. METHOD New( oWnd, nSubMenu, nIdChildFirst, oBrush, lVscroll, lHScroll ) CLASS TMdiClient
  73.  
  74.    local cClientCreateStruct := ;
  75.       I2Bin( GetSubMenu( oWnd:oMenu:hMenu, nSubMenu - 1 ) ) + ;
  76.       I2Bin( nIdChildFirst )
  77.  
  78.    DEFAULT lVScroll := .f., lHScroll := .f.
  79.  
  80.    ::nStyle = nOr( WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS, WS_CLIPCHILDREN,;
  81.                    If( lVScroll, WS_VSCROLL, 0 ),;
  82.                    If( lHScroll, WS_HSCROLL, 0 ) )
  83.  
  84.    ::aWnd    = {}
  85.    ::oWnd    = oWnd
  86.    ::oBrush  = oBrush
  87.    ::nTop    = 0
  88.    ::nLeft   = 0
  89.    ::nBottom = 0
  90.    ::nRight  = 0
  91.    ::hWnd    = CreateWindow( "MDICLIENT", "", ::nStyle,;
  92.                              0, 0, 0, 0, oWnd:hWnd, 1, cClientCreateStruct )
  93.    ::Link()
  94.    ::lVisible    = .t.
  95.    ::lValidating = .f.
  96.  
  97.    if lVScroll .or. lHScroll
  98.       SysRefresh()  // We give Windows some time to stabilize so
  99.    endif            // Some ScrollBar notifications get done!
  100.  
  101.    if lVScroll
  102.       DEFINE SCROLLBAR ::oVScroll VERTICAL RANGE 1, 10 PAGESTEP 1 OF Self
  103.    endif
  104.  
  105.    if lHScroll
  106.       DEFINE SCROLLBAR ::oHScroll HORIZONTAL RANGE 1, 10 PAGESTEP 1 OF Self
  107.    endif
  108.  
  109. return nil
  110.  
  111. //----------------------------------------------------------------------------//
  112.  
  113. METHOD ChildNew( nTop, nLeft, nBottom, nRight, cTitle, nStyle ) CLASS TMdiClient
  114.  
  115.    AAdd( ::aWnd, TMdiChild():New( nTop, nLeft, nBottom, nRight, cTitle,;
  116.                                   nStyle,, ::oWnd ) )
  117. return ATail( ::aWnd )
  118.  
  119. //----------------------------------------------------------------------------//
  120.  
  121. METHOD GetActive() CLASS TMdiClient
  122.  
  123.    local hWndAt := nLoWord( ::SendMsg( WM_MDIGETACTIVE ) )
  124.    local oWnd, nAt
  125.  
  126.    if hWndAt != 0
  127.       if ( nAt := AScan( ::aWnd, { | oWnd | oWnd:hWnd == hWndAt } ) ) != 0
  128.          oWnd = ::aWnd[ nAt ]
  129.       endif
  130.    endif
  131.  
  132. return oWnd
  133.  
  134. //----------------------------------------------------------------------------//
  135.  
  136. METHOD ChildClose( oWnd ) CLASS TMdiClient
  137.  
  138.    local nAt := AScan( ::aWnd, { | oChild | oChild:hWnd == oWnd:hWnd } )
  139.  
  140.    if nAt != 0
  141.       ::SendMsg( WM_MDIDESTROY, oWnd:hWnd )
  142.       ADel( ::aWnd, nAt )
  143.       ASize( ::aWnd, Len( ::aWnd ) - 1 )
  144.    endif
  145.  
  146. return nil
  147.  
  148. //----------------------------------------------------------------------------//
  149.  
  150. METHOD lCloseAll() CLASS TMdiClient
  151.  
  152.    while Len( ::aWnd ) > 0 .and. ATail( ::aWnd ):End()
  153.    end
  154.  
  155. return Len( ::aWnd ) == 0
  156.  
  157. //----------------------------------------------------------------------------//
  158.  
  159. METHOD _Select( nWindow ) CLASS TMdiClient
  160.  
  161.    DEFAULT nWindow := 0
  162.  
  163.    if ! Empty( ::aWnd ) .and. nWindow > 1 .and. nWindow <= Len( ::aWnd )
  164.       ::SendMsg( WM_MDIACTIVATE, ::aWnd[ nWindow ]:hWnd )
  165.    else
  166.       ::SendMsg( WM_MDIACTIVATE, 0 )
  167.    endif
  168.  
  169. return nil
  170.  
  171. //----------------------------------------------------------------------------//
  172.  
  173. METHOD KeyDown( nKey, nFlags ) CLASS TMdiClient
  174.  
  175.    // When the MdiChilds are iconized, they don't receive WM_KEYDOWN messages.
  176.    // MdiClient receives those messages and there is no a standard behavior
  177.    // so we have to process them !
  178.  
  179.    if nKey == VK_F4 .and. GetKeyState( VK_CONTROL )
  180.       SendMessage( ::SendMsg( WM_MDIGETACTIVE ), WM_SYSCOMMAND, SC_CLOSE )
  181.       return 0
  182.    endif
  183.  
  184.    if nKey == VK_F6 .and. GetKeyState( VK_CONTROL )
  185.       SendMessage( ::SendMsg( WM_MDIGETACTIVE ), WM_SYSCOMMAND, SC_NEXT )
  186.       return 0
  187.    endif
  188.  
  189. return Super:KeyDown( nKey, nFlags )
  190.  
  191. //----------------------------------------------------------------------------//
  192.