/* * Xailer source code: * * TabsFolder.prg * Clase TTabsFolder * * Copyright 2003, 2016 Ignacio Ortiz de Zuñiga * Copyright 2003, 2016 José Giménez * Copyright 2003, 2016 Xailer.com * All rights reserved * */ #include "Xailer.ch" //------------------------------------------------------------------------------ CLASS XTabsFolder FROM TTabs PUBLISHED: PROPERTY nIndex INIT 0 WRITE METHOD SetIndex PUBLIC: PROPERTY aItems INIT {} AS TTabsFolderPage[] WRITE INLINE ::SetItems( Value ) METHOD Create( oParent ) CONSTRUCTOR METHOD AddItem( cText, nImage, cTooltip, nSize, nAlignment,; nBmpAlignment, lVisible, lEnabled ) ; INLINE ::InsertItem( Nil, cText, nImage, cTooltip, nSize,; nAlignment, nBmpAlignment, lVisible, lEnabled ) // --> oTabItem METHOD InsertItem( nItem, cText, nImage, cTooltip, nSize, nAlignment,; nBmpAlignment, lVisible, lEnabled ) // --> oTabFolderPage METHOD SetIndex( nIndex, lTriggerOnChange ) METHOD DeleteItem( nItem ) // --> Nil METHOD WMSize() METHOD WMEraseBkgnd() INLINE 1 METHOD WMPaint() EXTERN XWinControl_WMEraseBkgnd() RESERVED: PROPERTY cBalloon PROPERTY cTooltip PROPERTY cTooltipTitle PROPERTY nTooltipIcon PROTECTED: METHOD SetItems EXTERN XTabs_SetItems METHOD CreateItem( nItem, cText, nImage, cTooltip, nSize, nAlignment,; nBmpAlignment, lVisible, lEnabled ) ENDCLASS //-------------------------------------------------------------------------- METHOD Create( oParent ) CLASS XTabsFolder LOCAL nItem ::Super:Create( oParent ) IF ::lVisible ::SendMsg( WM_SETREDRAW, .F. ) ENDIF FOR nItem := 1 TO Len( ::aItems ) WITH OBJECT ::aItems[ nItem ] :SetBounds( 0, 0, ::nClientWidth, ::nClientHeight ) :TScrollingWinControl:Create() END NEXT IF ::lVisible .AND. ::FlRedraw ::SendMsg( WM_SETREDRAW, .T. ) ENDIF ::SetShortCuts() ::SetIndex( ::FnIndex, .F. ) ::Refresh( .t. ) RETURN Self //------------------------------------------------------------------------------ METHOD CreateItem( nItem, cText, nImage, cTooltip, nSize, nAlignment,; nBmpAlignment, lVisible, lEnabled ) CLASS XTabsFolder RETURN TTabsFolderPage():Create( Self, nItem, cText, nImage, cTooltip, ; nSize, nAlignment, nBmpAlignment, lVisible, lEnabled ) //------------------------------------------------------------------------------ METHOD InsertItem( nItem, cText, nImage, cTooltip, nSize, nAlignment,; nBmpAlignment, lVisible, lEnabled ) CLASS XTabsFolder LOCAL oItem oItem := ::CreateItem( nItem, cText, nImage, cTooltip, nSize,; nAlignment, nBmpAlignment, lVisible, lEnabled ) IF ::nIndex == 0 ::nIndex := oItem:nItem ENDIF RETURN oItem //-------------------------------------------------------------------------- METHOD DeleteItem( nItem ) CLASS XTabsFolder LOCAL nUpd, nLen DEFAULT nItem TO ::nIndex nLen := Len( ::aItems ) IF nItem > 0 .AND. nItem <= nLen ::aItems[ nItem ]:End() ADel( ::aItems, nItem ) ASize( ::aItems, nLen - 1 ) nLen-- nUpd := nItem IF ! Empty( ::Handle ) ::SetShortCuts() ENDIF WHILE nUpd <= nLen ::aItems[ nUpd ]:nItem := ::aItems[ nUpd ]:nItem - 1 nUpd ++ ENDDO IF ::nStartTab > 1 ::nStartTab := 1 ::CalcItemsRect() ENDIF IF nItem <= ::nIndex ::nIndex := Max( ::nIndex - 1, 1 ) ENDIF ::Refresh( .T. ) RETURN .T. ENDIF RETURN .F. //------------------------------------------------------------------------------ METHOD SetIndex( nIndex, lTriggerOnChange ) CLASS XTabsFolder LOCAL nFromTab := ::nIndex LOCAL nFor LOCAL lFull := .F. DEFAULT nIndex TO ::FnIndex DEFAULT lTriggerOnChange TO .T. ::FnIndex := nIndex IF nIndex > 0 .AND. nIndex <= Len( ::aItems ) IF !Empty( ::Handle ) IF nFromTab > 0 .AND. nFromTab <= Len( ::aItems ) ::aItems[ nFromTab ]:Hide() ENDIF IF nIndex < ::nStartTab ::nStartTab := nIndex ::CalcItemsRect() lFull := .T. ELSE DO WHILE !::aItems[ nIndex ]:lCanShow .AND. ::nStartTab <= Len( ::aItems ) ::nStartTab ++ ::CalcItemsRect() lFull := .T. ENDDO ENDIF ::Refresh( lFull ) WITH OBJECT ::aItems[ nIndex ] :Show() IF :nLeft != 0 .OR. :nTop != 0 .OR. :nWidth != ::nClientWidth .OR. ; :nHeight != ::nClientHeight :SetBounds( 0, 0, ::nClientWidth, ::nClientHeight ) ENDIF IF lTriggerOnChange .AND. !::lTabStop :SetFocus() ENDIF END FOR nFor := 1 TO Len( ::aItems ) IF nFor != nIndex ::aItems[ nFor ]:Hide() ENDIF NEXT IF lTriggerOnChange ::Changed( nIndex, nFromTab ) ENDIF ENDIF ENDIF RETURN nIndex //------------------------------------------------------------------------------ METHOD WMSize( nWParam, nLParam ) CLASS XTabsFolder ::UpdateClientRect() IF !Empty( ::Handle ) .AND. ::nIndex > 0 .AND. ::nIndex <= Len( ::aItems ) ::aItems[ ::nIndex ]:SetBounds( 0, 0, ::nClientWidth, ::nClientHeight ) ENDIF RETURN 0