// Win32 TreeView support
#include "FiveWin.ch"
#include "Constant.ch"
#define TV_FIRST 聽 聽 聽 聽 聽 聽 聽 聽4352 聽 聽//0x1100
#define TVM_GETEDITCONTROL 聽 聽 聽( TV_FIRST + 15 )
#define TVM_EDITLABELA 聽 聽 聽 聽 聽( TV_FIRST + 14 )
#define TVM_EDITLABELW 聽 聽 聽 聽 聽( TV_FIRST + 65 )
#ifdef UNICODE
#define TVN_BEGINLABELEDITW 聽 聽 ( TVN_FIRST - 59 )
#define TVN_ENDLABELEDITW 聽 聽 聽 ( TVN_FIRST - 60 )
#define TVM_EDITLABEL 聽 聽 聽 聽 聽 TVM_EDITLABELW
#define TVN_BEGINLABELEDIT 聽 聽 聽TVN_BEGINLABELEDITW
#define TVN_ENDLABELEDIT 聽 聽 聽 聽TVN_ENDLABELEDITW
#else
#define TVN_BEGINLABELEDITA 聽 聽 ( TVN_FIRST - 10 )
#define TVN_ENDLABELEDITA 聽 聽 聽 ( TVN_FIRST - 11 )
#define TVM_EDITLABEL 聽 聽 聽 聽 聽 TVM_EDITLABELA
#define TVN_BEGINLABELEDIT 聽 聽 聽TVN_BEGINLABELEDITA
#define TVN_ENDLABELEDIT 聽 聽 聽 聽TVN_ENDLABELEDITA
#endif
#define TVN_FIRST 聽 聽 聽 聽 聽 聽 聽 -400
#define TVN_ITEMEXPANDED 聽 聽 聽 聽(TVN_FIRST-6)
#define COLOR_WINDOW 聽 聽 聽 聽 聽 聽5
#define COLOR_WINDOWTEXT 聽 聽 聽 聽8
#define COLOR_BTNFACE 聽 聽 聽 聽 聽 15
#define COLOR_BTNSHADOW 聽 聽 聽 聽 16
#define COLOR_BTNHIGHLIGHT 聽 聽 聽20
#define FD_BORDER 聽 聽 聽 聽 聽 聽 聽 8
#define FD_HEIGHT 聽 聽 聽 聽 聽 聽 聽 22
#define DT_CENTER 聽 聽 聽 聽 聽 聽 聽 1
#define DT_VCENTER 聽 聽 聽 聽 聽 聽 聽4
#define WINDING 聽 聽 聽 聽 聽 聽 聽 聽 2
#define SC_KEYMENU 聽 聽 聽 聽 聽 聽 聽61696 // 聽0xF100
#define TVS_HASBUTTONS 聽 聽 聽 聽 聽1
#define TVS_HASLINES 聽 聽 聽 聽 聽 聽2
#define TVS_LINESATROOT 聽 聽 聽 聽 4
#define TVS_SHOWSELALWAYS 聽 聽 聽 32 // 聽0x0020
#define TVS_DISABLEDRAGDROP 聽 聽 16 // 聽0x0010
#define TVS_CHECKBOXES 聽 聽 聽 聽 聽256 // 聽0x0100
#define TVS_EDITLABELS 聽 聽 聽 聽 聽8
#define CTRL_NAME "SysTreeView32"
//----------------------------------------------------------------------------//
CLASS TTreeView FROM TControl
聽 聽DATA 聽 aItems
聽 聽DATA 聽 oImageList
聽 聽DATA 聽 bChanged
聽 聽DATA 聽 bExpanded
聽 聽DATA 聽 hEdit
聽 聽CLASSDATA aProperties ;
聽 聽 聽 INIT { "aItems", "cTitle", "cVarName", "l3D", "nClrText",;
聽 聽 聽 聽 聽 聽 聽"nClrPane", "nAlign", "nTop", "nLeft",;
聽 聽 聽 聽 聽 聽 聽"nWidth", "nHeight", "oFont", "Cargo" }
聽 聽METHOD New( nTop, nLeft, oWnd, nClrFore,;
聽 聽 聽 聽 聽 聽 聽 聽nClrBack, lPixel, lDesign, nWidth, nHeight,;
聽 聽 聽 聽 聽 聽 聽 聽cMsg, lCheckBoxes, bChange, lEditable ) CONSTRUCTOR
聽 聽METHOD ReDefine( nId, oWnd, nClrFore, nClrBack, lDesign, cMsg ) CONSTRUCTOR
聽 聽METHOD Add( cPrompt, nImage, nValue )
聽 聽METHOD VScroll( nWParam, nLParam ) VIRTUAL 聽 // standard behavior requested
聽 聽METHOD HScroll( nWParam, nLParam ) VIRTUAL
聽 聽METHOD CollapseAll( oItem ) INLINE ScanItems( ::aItems, .f. ),;
聽 聽 聽 oItem := ::GetSelected(), if( oItem <> nil, oItem:MakeVisible(), nil )
聽 聽METHOD CollapseBranch( oItem ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(),), ;
聽 聽 聽 If( oItem != nil, ( oItem:Collapse(), ScanItems( oItem:aItems, .f. ), oItem:MakeVisible() ),)
聽 聽METHOD EditLabel( oItem ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(),), ;
聽 聽 聽 If( oItem != nil, oItem:Edit(),)
聽 聽METHOD Expand() INLINE AEval( ::aItems, { | oItem | oItem:Expand() } )
聽 聽METHOD ExpandAll( oItem ) INLINE ScanItems( ::aItems, .t. ),;
聽 聽 聽 oItem := ::GetSelected(), if( oItem <> nil, oItem:MakeVisible(), nil )
聽 聽METHOD ExpandBranch( oItem ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(), nil ), ;
聽 聽 聽 If( oItem != nil, ( oItem:Expand(), ScanItems( oItem:aItems, .t. ), oItem:MakeVisible() ), nil )
聽 聽METHOD GetEditControl() INLINE TVGetEditControl( ::hWnd )
聽 聽METHOD GetSelected()
聽 聽METHOD GetItem( hItem )
聽 聽METHOD GetItemPos( oItem )
聽 聽METHOD InsertAfter( oItemParent, cPrompt, nImage, nValue ) 聽
聽 聽METHOD Select( oItem ) INLINE TVSelect( ::hWnd, oItem:hItem )
聽 聽METHOD GetSelText() INLINE TVGetSelText( ::hWnd )
聽 聽METHOD GoNext()
聽 聽METHOD GoPrev()
聽 聽METHOD GoTop() INLINE If( Len( ::aItems ) > 0, ::Select( ::aItems[ 1 ] ),)
聽 聽METHOD GoBottom()
聽 聽METHOD SelChanged() INLINE If( ::bChanged != nil, Eval( ::bChanged, Self ), nil )
聽 聽METHOD SetImageList( oImageList )
聽 聽METHOD DeleteAll() INLINE ( TVDelAllItems( ::hWnd ), ::aItems := {} )
聽 聽METHOD HitTest( nRow, nCol )
聽 聽METHOD HandleEvent( nMsg, nWParam, nLParam )
聽 聽METHOD Initiate( hDlg ) INLINE ::Super:Initiate( hDlg ), ::SetColor( ::nClrText, ::nClrPane )
聽 聽METHOD cToChar() INLINE ::Super:cToChar( CTRL_NAME )
聽 聽METHOD SetColor( nClrText, nClrPane ) INLINE ;
聽 聽 聽 ::Super:SetColor( nClrText, nClrPane ), TVSetColor( ::hWnd, nClrText, nClrPane )
聽 聽METHOD SwapUp()
聽 聽METHOD SwapDown() 聽
聽 聽METHOD Toggle() INLINE AEval( ::aItems, { | oItem | oItem:Toggle() } )
聽 聽METHOD ToggleAll( oItem ) INLINE ScanItems( ::aItems, , .t. ), ;
聽 聽 聽 oItem := ::GetSelected(), If( oItem <> nil, oItem:MakeVisible(), nil )
聽 聽METHOD ToggleBranch( oItem ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(), nil ), ;
聽 聽 聽 If( oItem != nil, ( oItem:Toggle(), ScanItems( oItem:aItems, , .t. ), oItem:MakeVisible() ), nil )
聽 聽METHOD GetCheck( oItem ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(), nil ), ;
聽 聽 聽 TVGetCheck( ::hWnd, oItem:hItem )
聽 聽METHOD SetCheck( oItem, lOnOff ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(), nil ), ;
聽 聽 聽 TVSetCheck( ::hWnd, oItem:hItem, lOnOff )
聽 聽METHOD SetItems( aItems )
聽 聽METHOD GenMenu( lPopup )
聽 聽METHOD LoadFromMenu( oMenu )
聽 聽METHOD Notify( nIdCtrl, nPtrNMHDR )
聽 聽METHOD Scan( bAction )
聽 聽METHOD SetItemImage( oItem, nImage ) INLINE ;
聽 聽 聽 If( oItem == nil, oItem := ::GetSelected(), nil ), ;
聽 聽 聽 TVSetItemImage( ::hWnd, oItem:hItem, nImage )
聽 聽METHOD SetItemHeight( nHeight ) INLINE TvSetItemHeight( ::hWnd, nHeight )
聽 聽METHOD SetSelText( cText ) INLINE ::GetSelected():SetText( cText )
聽 聽METHOD Len() INLINE Len( ::aItems )
聽 聽METHOD Count() 聽
ENDCLASS
//----------------------------------------------------------------------------//
METHOD LoadFromMenu( oMenu ) CLASS TTreeView
聽 聽local n
聽 聽::DeleteAll()
聽 聽for n = 1 to Len( oMenu:aItems )
聽 聽 聽 ::Add( oMenu:aItems[ n ]:cPrompt )
聽 聽 聽 if ValType( oMenu:aItems[ n ]:bAction ) == "O"
聽 聽 聽 聽 聽AddSubItems( ATail( ::aItems ), oMenu:aItems[ n ]:bAction )
聽 聽 聽 endif
聽 聽next
return nil
//----------------------------------------------------------------------------//
static function AddSubItems( oItem, oSubMenu )
聽 聽local n
聽 聽for n = 1 to Len( oSubMenu:aItems )
聽 聽 聽 oItem:Add( oSubMenu:aItems[ n ]:cPrompt )
聽 聽 聽 if ValType( oSubMenu:aItems[ n ]:bAction ) == "O"
聽 聽 聽 聽 聽AddSubItems( ATail( oItem:aItems ), oSubMenu:aItems[ n ]:bAction )
聽 聽 聽 endif
聽 聽next
return nil
//----------------------------------------------------------------------------//
METHOD New( nTop, nLeft, oWnd, nClrFore,;
聽 聽 聽 聽 聽 聽 nClrBack, lPixel, lDesign, nWidth, nHeight, cMsg, lCheckBoxes, bChange, lEditable ) CLASS TTreeView
聽 聽DEFAULT nTop 聽 聽 聽 聽:= 0, nLeft := 0,;
聽 聽 聽 聽 聽 聽oWnd 聽 聽 聽 聽:= GetWndDefault(),;
聽 聽 聽 聽 聽 聽nClrFore 聽 聽:= oWnd:nClrText,;
聽 聽 聽 聽 聽 聽nClrBack 聽 聽:= GetSysColor( COLOR_WINDOW ),;
聽 聽 聽 聽 聽 聽lPixel 聽 聽 聽:= .f.,;
聽 聽 聽 聽 聽 聽lDesign 聽 聽 := .f.,;
聽 聽 聽 聽 聽 聽nWidth 聽 聽 聽:= 150,;
聽 聽 聽 聽 聽 聽nHeight 聽 聽 := 150,;
聽 聽 聽 聽 聽 聽lCheckBoxes := .F.,;
聽 聽 聽 聽 聽 聽lEditable 聽 := .F.
聽 聽 ::lUnicode聽 = FW_SetUnicode()
聽 聽::nStyle 聽 聽= nOR( WS_CHILD, WS_VISIBLE, CS_VREDRAW, CS_HREDRAW,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lDesign, WS_CLIPSIBLINGS, 0 ), WS_TABSTOP,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 TVS_HASBUTTONS, TVS_HASLINES, TVS_LINESATROOT, TVS_SHOWSELALWAYS, TVS_DISABLEDRAGDROP,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lCheckBoxes, TVS_CHECKBOXES, 0 ),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 If( lEditable, TVS_EDITLABELS, 0 ) )
聽 聽::nId 聽 聽 聽 = ::GetNewId()
聽 聽::oWnd 聽 聽 聽= oWnd
聽 聽::cMsg 聽 聽 聽= cMsg
聽 聽::nTop 聽 聽 聽= If( lPixel, nTop, nTop * SAY_CHARPIX_H )
聽 聽::nLeft 聽 聽 = If( lPixel, nLeft, nLeft * SAY_CHARPIX_W )
聽 聽::nBottom 聽 = ::nTop + nHeight - 1
聽 聽::nRight 聽 聽= ::nLeft + nWidth - 1
聽 聽::lDrag 聽 聽 = lDesign
聽 聽::lCaptured = .f.
聽 聽::nClrText 聽= nClrFore
聽 聽::nClrPane 聽= nClrBack
聽 聽::aItems 聽 聽= {}
聽 聽::bChanged 聽= bChange
聽 聽if ! Empty( oWnd:hWnd )
聽 聽 聽 ::Create( CTRL_NAME )
聽 聽 聽 oWnd:AddControl( Self )
聽 聽 聽 ::SetColor( nClrFore, nClrBack )
聽 聽else
聽 聽 聽 oWnd:DefControl( Self )
聽 聽endif
聽 聽::Default()
聽 聽::lDrag = lDesign
聽 聽if lDesign
聽 聽 聽 ::CheckDots()
聽 聽endif
return Self
//----------------------------------------------------------------------------//
METHOD ReDefine( nId, oWnd, nClrFore, nClrBack, lDesign, cMsg, bChange ) CLASS TTreeView
聽 聽DEFAULT oWnd 聽 聽 := GetWndDefault(),;
聽 聽 聽 聽 聽 聽nClrFore := oWnd:nClrText,;
聽 聽 聽 聽 聽 聽nClrBack := oWnd:nClrPane,; // GetSysColor( COLOR_WINDOW ),;
聽 聽 聽 聽 聽 聽lDesign 聽:= .f.
聽 聽 ::lUnicode聽 = FW_SetUnicode()
聽 聽::nId 聽 聽 聽= nId
聽 聽::oWnd 聽 聽 = oWnd
聽 聽::aItems 聽 = {}
聽 聽::nClrText = nClrFore
聽 聽::nClrPane = nClrBack
聽 聽::bChanged = bChange
聽 聽::Register( nOR( CS_VREDRAW, CS_HREDRAW, TVS_HASBUTTONS, TVS_HASLINES, TVS_LINESATROOT ) )
聽 聽oWnd:DefControl( Self )
return Self
//----------------------------------------------------------------------------//
METHOD Add( cPrompt, nImage, nValue ) CLASS TTreeView
聽 聽local oItem
聽 聽oItem := TTVItem():New( TVInsertItem( ::hWnd, cPrompt,, nImage, nValue ), Self )
聽 聽oItem:cPrompt := cPrompt
聽 聽oItem:nImage 聽:= nImage
聽 聽AAdd( ::aItems, oItem )
return oItem
//----------------------------------------------------------------------------//
METHOD Count() CLASS TTreeView
聽 聽local nItems := 0, bAction := { | oItem | nItems++, .F. }
聽 聽::Scan( bAction )
return nItems
//----------------------------------------------------------------------------//
METHOD InsertAfter( oItem, cPrompt, nImage, nValue ) CLASS TTreeView
聽 聽local oNewItem, nAt, oLastItem
聽 聽oNewItem := TTVItem():New( TVInsertItem( ::hWnd, cPrompt, oItem:oParent:hItem, nImage, nValue, oItem:hItem ), Self )
聽 聽oNewItem:cPrompt := cPrompt
聽 聽oNewItem:nImage 聽:= nImage
聽 聽oNewItem:oParent := oItem:oParent
聽 聽if ( nAt := AScan( oItem:oParent:aItems, { | oIt | oItem:hItem == oIt:hItem } ) ) != 0
聽 聽 聽 oLastItem = ATail( oItem:oParent:aItems )
聽 聽 聽 AIns( oItem:oParent:aItems, nAt + 1 )
聽 聽 聽 AAdd( oItem:oParent:aItems, oLastItem )
聽 聽 聽 oItem:oParent:aItems[ nAt + 1 ] = oNewItem
聽 聽 聽 // XBrowse( oItem:oParent:aItems )
聽 聽endif
return oNewItem
//----------------------------------------------------------------------------//
static function ScanItems( aItems, lExpand, lToggle )
聽 聽local oItem, i
聽 聽DEFAULT lExpand := .t., lToggle := .f.
聽 聽for i := 1 to Len( aItems )
聽 聽 聽 聽oItem = aItems[ i ]
聽 聽 聽 聽if lToggle
聽 聽 聽 聽 聽 oItem:Toggle()
聽 聽 聽 聽elseif lExpand
聽 聽 聽 聽 聽 oItem:Expand()
聽 聽 聽 聽else
聽 聽 聽 聽 聽 oItem:Collapse()
聽 聽 聽 聽endif
聽 聽 聽 聽if Len( oItem:aItems ) != 0
聽 聽 聽 聽 聽 ScanItems( oItem:aItems, lExpand, lToggle )
聽 聽 聽 聽endif
聽 聽next
return nil
//----------------------------------------------------------------------------//
static function ScanItemsBlock( aItems, bAction )
聽 聽local oItem, n := 1, oItemFound
聽 聽while n <= Len( aItems ) .and. oItemFound == nil
聽 聽 聽 oItem = aItems[ n ]
聽 聽 聽 if Eval( bAction, oItem, n )
聽 聽 聽 聽 聽return oItem
聽 聽 聽 else
聽 聽 聽 聽 聽if Len( oItem:aItems ) > 0
聽 聽 聽 聽 聽 聽 oItemFound = ScanItemsBlock( oItem:aItems, bAction )
聽 聽 聽 聽 聽endif
聽 聽 聽 endif
聽 聽 聽 n++
聽 聽end
return oItemFound
//----------------------------------------------------------------------------//
METHOD GenMenu( lPopup ) CLASS TTreeView
聽 聽local oMenu
聽 聽DEFAULT lPopup := .T.
聽 聽if Len( ::aItems ) > 0
聽 聽 聽 if lPopup
聽 聽 聽 聽 聽MENU oMenu POPUP
聽 聽 聽 else
聽 聽 聽 聽 聽MENU oMenu
聽 聽 聽 endif
聽 聽 聽 GenMenuItems( ::aItems )
聽 聽 聽 ENDMENU
聽 聽endif
return oMenu
//----------------------------------------------------------------------------//
static function GenMenuItems( aItems )
聽 聽local n
聽 聽for n = 1 to Len( aItems )
聽 聽 聽 MENUITEM aItems[ n ]:GetText()
聽 聽 聽 if Len( aItems[ n ]:aItems ) > 0
聽 聽 聽 聽 聽MENU
聽 聽 聽 聽 聽 聽 GenMenuItems( aItems[ n ]:aItems )
聽 聽 聽 聽 聽ENDMENU
聽 聽 聽 endif
聽 聽next
return nil
//----------------------------------------------------------------------------//
METHOD GetSelected() CLASS TTreeView
return SearchItem( ::aItems, TVGetSelected( ::hWnd ) )
//----------------------------------------------------------------------------//
METHOD GetItem( hItem ) CLASS TTreeView
return SearchItem( ::aItems, hItem )
//----------------------------------------------------------------------------//
METHOD GetItemPos( oItem ) CLASS TTreeView
return AScan( ::aItems, { | o | o == oItem } )
//----------------------------------------------------------------------------//
METHOD GoBottom() CLASS TTreeView
聽 聽local oLastItem
聽 聽::Scan( { | oItem | oLastItem := oItem, .F. } )
聽 聽::Select( oLastItem )
return nil 聽
//----------------------------------------------------------------------------//
METHOD GoPrev() CLASS TTreeView
聽 聽local oSelItem, oPrevItem
聽 聽if ( oSelItem := ::GetSelected() ) != nil
聽 聽 聽 ::Scan( { | oItem | If( oItem:hItem != oSelItem:hItem, oPrevItem := oItem,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 oItem:hItem == oSelItem:hItem } )
聽 聽 聽 if oPrevItem != nil
聽 聽 聽 聽 聽::Select( oPrevItem )
聽 聽 聽 else
聽 聽 聽 聽 聽::GoBottom()
聽 聽 聽 endif
聽 聽endif
聽 聽
return nil 聽
//----------------------------------------------------------------------------//
METHOD GoNext() CLASS TTreeView
聽 聽local oSelItem := ::GetSelected(), lStop := .F., oNextItem
聽 聽::Scan( { | oItem | If( oItem:hItem == oSelItem:hItem, lStop := .T.,),;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽If( lStop .and. oItem:hItem != oSelItem:hItem, ( oNextItem := oItem, .T. ), .F. ) } )
聽 聽if oNextItem != nil 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽
聽 聽 聽 ::Select( oNextItem )
聽 聽else
聽 聽 聽 ::GoTop()
聽 聽endif 聽 聽 聽
聽 聽
return nil 聽
//----------------------------------------------------------------------------//
METHOD HitTest( nRow, nCol ) CLASS TTreeView
聽 聽local hItem
聽 聽hItem := TVHitTest( ::hWnd, nRow, nCol )
聽 聽If hItem > 0
聽 聽 聽 return ::GetItem( hItem )
聽 聽Endif
return nil
//----------------------------------------------------------------------------//
METHOD Notify( nIdCtrl, nPtrNMHDR ) CLASS TTreeView
聽 聽local nCode := GetNMHDRCode( nPtrNMHDR )
聽 聽do case
聽 聽 聽 case nCode == TVN_ITEMEXPANDED
聽 聽 聽 聽 聽 聽if ! Empty( ::bExpanded )
聽 聽 聽 聽 聽 聽 聽 if NMTREEVIEWAction( nPtrNMHDR ) == 2 // Expanded
聽 聽 聽 聽 聽 聽 聽 聽 聽Eval( ::bExpanded, NMTREEVIEWItemNew( nPtrNMHDR ) ) // hItem
聽 聽 聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 聽endif
聽 聽 聽 case nCode == TVN_BEGINLABELEDIT
聽 聽 聽 聽 聽 聽::hEdit 聽:= SendMessage( ::hWnd, TVM_GETEDITCONTROL, 0, 0 )
聽 聽 聽 聽 聽 聽return 0 聽 聽 聽
聽 聽 聽 case nCode == TVN_ENDLABELEDIT
聽 聽 聽 聽 聽 聽::SetSelText( GetWindowText( ::hEdit ) )
聽 聽 聽 聽 聽 聽::hEdit := nil
聽 聽endcase
return nil
//----------------------------------------------------------------------------//
METHOD Scan( bAction ) CLASS TTreeView
return ScanItemsBlock( ::aItems, bAction )
//----------------------------------------------------------------------------//
METHOD SetImageList( oImageList ) CLASS TTreeView
聽 聽::oImageList = oImageList
聽 聽TVSetImageList( ::hWnd, oImageList:hImageList, 0 )
return nil
//----------------------------------------------------------------------------//
METHOD SwapDown() CLASS TTreeView
聽 聽local oSelItem := ::GetSelected(), cPrompt := oSelItem:cPrompt
聽 聽::GoNext()
聽 聽oSelItem:End()
聽 聽::Select( ::InsertAfter( ::GetSelected(), cPrompt ) )
聽 聽
return nil
//----------------------------------------------------------------------------//
METHOD SwapUp() CLASS TTreeView
聽 聽local oSelItem := ::GetSelected(), cPrompt := oSelItem:cPrompt
聽 聽::GoPrev()
聽 聽::GoPrev()
聽 聽oSelItem:End()
聽 聽::Select( ::InsertAfter( ::GetSelected(), cPrompt ) )
聽 聽
return nil
//----------------------------------------------------------------------------//
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TTreeView
聽 聽local oItem
聽 聽do case
聽 聽 聽 case nMsg == WM_CHAR
聽 聽 聽 聽 聽 聽if nWParam == VK_RETURN
聽 聽 聽 聽 聽 聽 聽 return 1
聽 聽 聽 聽 聽 聽endif
聽 聽endcase
return ::Super:HandleEvent( nMsg, nWParam, nLParam )
//----------------------------------------------------------------------------//
METHOD SetItems( aItems ) CLASS TTreeView
聽 聽local n
聽 聽for n = 1 to Len( aItems )
聽 聽 聽 ::Add( aItems[ n ] )
聽 聽next
return nil
//----------------------------------------------------------------------------//
static function SearchItem( aItems, hItem )
聽 聽local n, oItem
聽 聽for n = 1 to Len( aItems )
聽 聽 聽 if Len( aItems[ n ]:aItems ) > 0
聽 聽 聽 聽 聽if ( oItem := SearchItem( aItems[ n ]:aItems, hItem ) ) != nil
聽 聽 聽 聽 聽 聽 return oItem
聽 聽 聽 聽 聽endif
聽 聽 聽 endif
聽 聽 聽 if aItems[ n ]:hItem == hItem
聽 聽 聽 聽 聽return aItems[ n ]
聽 聽 聽 endif
聽 聽next
return nil
//----------------------------------------------------------------------------//
// Win95 Class TTreeView items support ( TTVItem --> TreeViewItem )
#include "FiveWin.ch"
#define TV_FIRST 聽 聽 聽 聽 聽4352 聽 // 0x1100
#define TVM_EXPAND 聽 聽 聽 聽TV_FIRST + 2
#define TVE_COLLAPSE 聽 聽 聽1
#define TVE_EXPAND 聽 聽 聽 聽2
#define TVE_TOGGLE 聽 聽 聽 聽3
#define TVM_ENSUREVISIBLE TV_FIRST + 20
#define TVM_GETITEMSTATE 聽TV_FIRST + 39
//item state
#define TVIS_SELECTED 聽 聽 聽 聽 聽 0x0002
#define TVIS_CUT 聽 聽 聽 聽 聽 聽 聽 聽0x0004
#define TVIS_DROPHILITED 聽 聽 聽 聽0x0008
#define TVIS_BOLD 聽 聽 聽 聽 聽 聽 聽 0x0010
#define TVIS_EXPANDED 聽 聽 聽 聽 聽 0x0020
#define TVIS_EXPANDEDONCE 聽 聽 聽 0x0040
//----------------------------------------------------------------------------//
CLASS TTVItem
聽 聽DATA 聽 oParent
聽 聽DATA 聽 hItem
聽 聽DATA 聽 oTree
聽 聽DATA 聽 aItems
聽 聽DATA 聽 cPrompt
聽 聽DATA 聽 nImage
聽 聽DATA 聽 Cargo
聽 聽DATA 聽 lBold 聽 INIT .F.
聽 聽METHOD New( hItem, oTree, Cargo ) CONSTRUCTOR
聽 聽METHOD Add( cPrompt, nImage, Cargo )
聽 聽METHOD Bold() INLINE TVSetItemBold( ::oTree:hWnd, ::hItem, .T. ) 聽
聽 聽 聽
聽 聽METHOD Normal() INLINE TVSetItemBold( ::oTree:hWnd, ::hItem, .F. ) 聽
聽 聽METHOD DeleteBranches()
聽 聽METHOD DelItemPos( nPos )
聽 聽METHOD Edit() INLINE TVEditLabel( ::oTree:hWnd, ::hItem ) 聽
聽 聽METHOD Expand() INLINE ;
聽 聽 聽 SendMessage( ::oTree:hWnd, TVM_EXPAND, TVE_EXPAND, ::hItem )
聽 聽METHOD Collapse() INLINE ;
聽 聽 聽 SendMessage( ::oTree:hWnd, TVM_EXPAND, TVE_COLLAPSE, ::hItem )
聽 聽METHOD GetItemPos( oItem )
聽 聽METHOD GetParent() INLINE ;
聽 聽 聽 ::oTree:GetItem( TVGetParent( ::oTree:hWnd, ::hItem ) )
聽 聽METHOD IsExpanded() INLINE nAnd( ::GetState(), TVIS_EXPANDED ) > 0
聽 聽METHOD IsSelected() INLINE nAnd( ::GetState(), TVIS_SELECTED ) > 0
聽 聽METHOD ItemLevel( nPrevLevel )
聽 聽METHOD SetText( cText ) INLINE ;
聽 聽 聽 TVSetItemText( ::oTree:hWnd, ::hItem, cText )
聽 聽METHOD Set( cText, nImage )
聽 聽METHOD Toggle() INLINE ;
聽 聽 聽 SendMessage( ::oTree:hWnd, TVM_EXPAND, TVE_TOGGLE, ::hItem )
聽 聽METHOD MakeVisible() INLINE ;
聽 聽 聽 SendMessage( ::oTree:hWnd, TVM_ENSUREVISIBLE, 0, ::hItem )
聽 聽METHOD SetCheck( lOnOff ) INLINE ::oTree:SetCheck( Self, lOnOff )
聽 聽METHOD GetCheck() INLINE ::oTree:GetCheck( Self )
聽 聽METHOD GetState() INLINE SendMessage( ::oTree:hWnd, TVM_GETITEMSTATE, ::hItem, 0 )
聽 聽METHOD GetText() INLINE TVGetText( ::oTree:hWnd, ::hItem )
聽 聽METHOD SetText( cText ) INLINE TVSetItemText( ::oTree:hWnd, ::hItem, cText ) 聽
聽 聽ACCESS cPrompt INLINE TVGetText( ::oTree:hWnd, ::hItem )
聽 聽
聽 聽ASSIGN cPrompt( cText ) INLINE TVSetItemText( ::oTree:hWnd, ::hItem, cText ) 聽 聽 聽
聽 聽METHOD End()
聽 聽METHOD Len() INLINE Len( ::aItems )
聽 聽 聽
聽 聽METHOD Count() 聽 聽
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( hItem, oTree, Cargo, cPrompt, nImage, oParent ) CLASS TTVItem
聽 聽::aItems 聽= {}
聽 聽::hItem 聽 = hItem
聽 聽::oTree 聽 = oTree
聽 聽::Cargo 聽 = Cargo
聽 聽::cPrompt = cPrompt
聽 聽::nImage 聽= nImage
聽 聽::oParent = oParent
return Self
//----------------------------------------------------------------------------//
METHOD Add( cPrompt, nImage, Cargo ) CLASS TTVItem
聽 聽local oItem := TTVItem():New( TVInsertItem( ::oTree:hWnd, cPrompt,;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::hItem, nImage ), ::oTree, Cargo, cPrompt, nImage, Self )
聽 聽AAdd( ::aItems, oItem )
聽 聽oItem:oParent = Self
return oItem
//----------------------------------------------------------------------------//
METHOD Count() CLASS TTVItem
聽 聽local oItem, nItems := 1
聽 聽for each oItem in ::aItems
聽 聽 聽 nItems += 1 + If( ! Empty( oItem:aItems ), ( oItem:Count() - 1 ), 0 )
聽 聽next
聽 聽
return nItems 聽
//----------------------------------------------------------------------------//
METHOD DeleteBranches() CLASS TTVItem
聽 聽AEval( ::aItems, { | o | TVDeleteItem( ::oTree:hWnd, o:hItem ) } )
聽 聽::aItems 聽= {}
return nil
//----------------------------------------------------------------------------//
METHOD DelItemPos( nPos ) CLASS TTVItem
聽 聽if nPos > 0 .and. nPos <= Len( ::aItems )
聽 聽 聽 TVDeleteItem( ::oTree:hWnd, ::aItems[ nPos ]:hItem )
聽 聽 聽 ADel( ::aItems, nPos )
聽 聽 聽 ASize( ::aItems, Len( ::aItems ) - 1 )
聽 聽endif
return nil
//----------------------------------------------------------------------------//
METHOD End() CLASS TTVItem
聽 聽local nAt := 0
聽 聽if ! Empty( ::oParent )
聽 聽 聽 nAt := AScan( ::oParent:aItems, { | o | o == Self } )
聽 聽endif
聽 聽if nAt != 0
聽 聽 聽 if ::oParent:IsKindOf( "TTREEVIEW" )
聽 聽 聽 聽 聽ADel( ::oTree:aItems, nAt )
聽 聽 聽 聽 聽ASize( ::oTree:aItems, Len( ::oTree:aItems ) - 1 )
聽 聽 聽 else
聽 聽 聽 聽 聽ADel( ::oParent:aItems, nAt )
聽 聽 聽 聽 聽ASize( ::oParent:aItems, Len( ::oParent:aItems ) - 1 )
聽 聽 聽 endif
聽 聽endif
聽 聽TVDeleteItem( ::oTree:hWnd, ::hItem )
return nil
//----------------------------------------------------------------------------//
METHOD GetItemPos( oItem ) CLASS TTVItem
return AScan( ::aItems, { | o | o == oItem } )
//----------------------------------------------------------------------------//
METHOD ItemLevel( nPrevLevel ) CLASS TTVItem
聽 聽DEFAULT nPrevLevel := 0
聽 聽if ::oParent != NIL
聽 聽 聽 ++nPrevLevel
聽 聽 聽 ::oParent:ItemLevel( @nPrevLevel )
聽 聽endif
RETURN nPrevLevel
//----------------------------------------------------------------------------//
METHOD Set( cPrompt, nImage ) CLASS TTVItem
聽 聽DEFAULT cPrompt := ::cPrompt, nImage := ::nImage
聽 聽TVSetTextImage( ::oTree:hWnd, ::hItem, cPrompt, nImage )
return nil
//----------------------------------------------------------------------------//
// Windows 95 TreeView control support C routines
#define UNICODE
#define _UNICODE
#define NONAMELESSUNION
#define _WIN32_IE 0x0500
#include <Windows.h>
#include <CommCtrl.h>
#include <hbapi.h>
#ifdef _MSC_VER
聽 聽#define TVM_GETITEMSTATE 聽(TV_FIRST + 39)
#endif
#ifdef __GNUC__
聽 聽#define TreeView_SetCheckState(hwndTV, hti, fCheck) TreeView_SetItemState(hwndTV, hti, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), TVIS_STATEIMAGEMASK)
聽 聽#define TreeView_GetCheckState(hwndTV, hti) ((((UINT)(SNDMSG((hwndTV), TVM_GETITEMSTATE, (WPARAM)(hti), TVIS_STATEIMAGEMASK))) >> 12) -1)
#endif
#ifndef _WIN64
#define fw_parH( i ) 聽 ( (HANDLE) hb_parnl( i ) )
#define fw_retnll( l ) 聽hb_retnl( (LONG) l )
#else
#define fw_parH( i ) 聽 ( (HANDLE) hb_parnll( i ) )
#define fw_retnll( l ) 聽hb_retnll( (LONGLONG) l )
#endif
LPWSTR fw_parWide( int iParam );
LPSTR UTF16toSTR8( LPWSTR utf16, int iLen );
size_t wcslen( const wchar_t* wcs );
//-------------------------------------------------------------------------//
HB_FUNC( TVINSERTITEM ) // ( hWnd, cItemText, hItem, nImage, nValue, hItem )
{
聽 聽TV_INSERTSTRUCT is;
聽 聽HTREEITEM hItem;
聽 聽memset( ( char * ) &is, 0, sizeof( TV_INSERTSTRUCT ) );
聽 聽#ifndef _WIN64
聽 聽 聽 is.hParent 聽 聽 聽= ( HTREEITEM ) hb_parnl( 3 );
聽 聽#else
聽 聽 聽 is.hParent 聽 聽 聽= ( HTREEITEM ) hb_parnll( 3 );
聽 聽#endif
// 聽 聽#if (_WIN32_IE >= 0x0400)
#ifdef __BORLANDC__
聽 聽#if __BORLANDC__ <= 1410
聽 聽 聽 is.DUMMYUNIONNAME.item.pszText = fw_parWide( 2 ); //hb_parc( 2 );
聽 聽 聽 is.DUMMYUNIONNAME.item.mask 聽 聽= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
聽 聽 聽 is.DUMMYUNIONNAME.item.iImage 聽= hb_parnl( 4 );
聽 聽 聽 is.DUMMYUNIONNAME.item.iSelectedImage = hb_parnl( 4 );
聽 聽 聽 is.DUMMYUNIONNAME.item.lParam = hb_parnl( 5 );
聽 聽#else
聽 聽 聽 is.item.pszText = fw_parWide( 2 ); //hb_parc( 2 );
聽 聽 聽 is.item.mask 聽 聽= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
聽 聽 聽 is.item.iImage 聽= hb_parnl( 4 );
聽 聽 聽 is.item.iSelectedImage = hb_parnl( 4 );
聽 聽 聽 is.item.lParam 聽= hb_parnl( 5 );
聽 聽#endif
#else
聽 聽 聽 is.u.item.pszText = fw_parWide( 2 ); //hb_parc( 2 );
聽 聽 聽 is.u.item.mask 聽 聽= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
聽 聽 聽 is.u.item.iImage 聽= hb_parnl( 4 );
聽 聽 聽 is.u.item.iSelectedImage = hb_parnl( 4 );
聽 聽 聽 is.u.item.lParam 聽= hb_parnl( 5 );
#endif
聽 聽if( ( hb_pcount() > 5 ) && ( hItem = ( HTREEITEM ) hb_parnll( 6 ) ) )
聽 聽{
聽 聽 聽 is.hInsertAfter = hItem;
聽 聽}
聽 聽#ifndef _WIN64
聽 聽 聽 hb_retnl( SendMessage( ( HWND ) hb_parnl( 1 ), TVM_INSERTITEM, 0,
聽 聽 聽 聽 聽 聽( LPARAM )( LPTV_INSERTSTRUCT )( &is ) ) );
聽 聽#else
聽 聽 聽 hb_retnll( SendMessage( ( HWND ) hb_parnll( 1 ), TVM_INSERTITEM, 0,
聽 聽 聽 聽 聽 聽( LPARAM )( LPTV_INSERTSTRUCT )( &is ) ) );
聽 聽#endif
#ifdef __BORLANDC__
聽 聽#if __BORLANDC__ <= 1410
聽 聽 聽 hb_xfree( ( void * ) is.DUMMYUNIONNAME.item.pszText );
聽 聽#else
聽 聽 聽 hb_xfree( ( void * ) is.item.pszText );
聽 聽#endif
#else
聽 聽 聽 hb_xfree( ( void * ) is.u.item.pszText );
#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETIMAGELIST ) // ( hWnd, hImageList, nType )
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retnl( ( LONG ) TreeView_SetImageList( ( HWND ) hb_parnl( 1 ),
聽 聽 聽 聽 聽 聽 ( HIMAGELIST ) hb_parnl( 2 ), hb_parnl( 3 ) ) );
聽 聽#else
聽 聽 聽 hb_retnll( ( LONGLONG ) TreeView_SetImageList( ( HWND ) hb_parnll( 1 ),
聽 聽 聽 聽 聽 聽 ( HIMAGELIST ) hb_parnll( 2 ), hb_parnl( 3 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETSELTEXT ) // ( hWnd ) --> cText
{
聽 聽#ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽#endif
聽 聽HTREEITEM hItem = TreeView_GetSelection( hWnd );
聽 聽TV_ITEM tvi;
聽 聽BYTE buffer[ 200 ];
聽 聽LPSTR szRet;
聽 聽if( hItem )
聽 聽{
聽 聽 聽 tvi.mask 聽 聽 聽 = TVIF_TEXT;
聽 聽 聽 tvi.hItem 聽 聽 聽= hItem;
聽 聽 聽 tvi.pszText 聽 聽= (LPWSTR) buffer; //( char * ) buffer;
聽 聽 聽 tvi.cchTextMax = 100;
聽 聽 聽 TreeView_GetItem( hWnd, &tvi );
// 聽 聽 聽hb_retc( tvi.pszText );
聽 聽 聽 szRet = UTF16toSTR8( (LPWSTR) buffer, wcslen( (LPWSTR) buffer ) );
聽 聽 聽 hb_retc( szRet );
聽 聽 聽 hb_xfree( ( void * ) szRet );
聽 聽}
聽 聽else
聽 聽 聽 hb_retc( "" );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETTEXT ) // ( hWnd, hItem ) --> cText
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽TV_ITEM tvi;
聽 聽BYTE buffer[ 200 ];
聽 聽LPSTR szRet;
聽 聽tvi.mask 聽 聽 聽 = TVIF_TEXT;
聽 聽tvi.hItem 聽 聽 聽= hItem;
聽 聽tvi.pszText 聽 聽= (LPWSTR) buffer; //( char * ) buffer;
聽 聽tvi.cchTextMax = 100;
聽 聽#ifndef _WIN64
聽 聽 聽 TreeView_GetItem( ( HWND ) hb_parnl( 1 ), &tvi );
聽 聽#else
聽 聽 聽 TreeView_GetItem( ( HWND ) hb_parnll( 1 ), &tvi );
聽 聽#endif
// 聽 hb_retc( tvi.pszText );
聽 聽szRet 聽 聽= UTF16toSTR8( (LPWSTR) buffer, wcslen( (LPWSTR) buffer ) );
聽 聽hb_retc( szRet );
聽 聽hb_xfree( ( void * ) szRet );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETITEMTEXT ) // ( hWnd, hItem, cText )
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽#endif
聽 聽TV_ITEM tvi;
聽 聽BOOL bResult;
聽 聽BYTE buffer[ 200 ];
聽 聽#ifndef _WIN64
聽 聽 聽 tvi.hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 tvi.hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽tvi.mask 聽 聽 聽 = TVIF_TEXT;
聽 聽tvi.pszText 聽 聽= (LPWSTR) buffer; 聽//( char * ) buffer;
聽 聽tvi.cchTextMax = 100; //sizeof( buffer );
聽 聽bResult = TreeView_GetItem( hWnd, &tvi );
聽 聽if( bResult )
聽 聽{
聽 聽 聽 tvi.mask 聽 聽 聽 = TVIF_TEXT;
聽 聽 聽 #ifndef _WIN64
聽 聽 聽 聽 聽tvi.hItem 聽 聽 聽= ( HTREEITEM ) hb_parnl( 2 );
聽 聽 聽 #else
聽 聽 聽 聽 聽tvi.hItem 聽 聽 聽= ( HTREEITEM ) hb_parnll( 2 );
聽 聽 聽 #endif
聽 聽 聽 tvi.pszText 聽 聽= fw_parWide( 3 ); //( LPSTR ) hb_parc( 3 );
聽 聽 聽 tvi.cchTextMax = wcslen( tvi.pszText ); //hb_parclen( 3 );
聽 聽 聽 TreeView_SetItem( hWnd, &tvi );
聽 聽 聽 hb_xfree( ( void * ) tvi.pszText );
聽 聽}
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETSELECTED ) // ( hWnd ) --> hItem
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retnl( ( LONG ) TreeView_GetSelection( ( HWND ) hb_parnl( 1 ) ) );
聽 聽#else
聽 聽 聽 hb_retnll( ( LONGLONG ) TreeView_GetSelection( ( HWND ) hb_parnll( 1 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVDELALLITEMS ) // ( hWnd ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retl( ( BOOL ) TreeView_DeleteAllItems( ( HWND ) hb_parnl( 1 ) ) );
聽 聽#else
聽 聽 聽 hb_retl( ( BOOL ) TreeView_DeleteAllItems( ( HWND ) hb_parnll( 1 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVHITTEST ) // ( hWnd, nRow, nCol ) --> hItem
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽#endif
聽 聽TV_HITTESTINFO lpht;
聽 聽HTREEITEM hItem;
聽 聽lpht.pt.x = hb_parnl( 3 );
聽 聽lpht.pt.y = hb_parnl( 2 );
聽 聽hItem = TreeView_HitTest( hWnd, &lpht );
聽 聽if( ( hItem != NULL ) && ( lpht.flags & TVHT_ONITEM ) )
聽 聽 #ifndef _WIN64
聽 聽 聽 聽hb_retnl( ( LONG ) hItem );
聽 聽 #else
聽 聽 聽 聽hb_retnll( ( LONGLONG ) hItem );
聽 聽 #endif
聽 聽else
聽 聽 hb_retnl( ( LONG ) 0 );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSELECT ) // ( hWnd, hItem ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽hb_retl( ( BOOL ) TreeView_Select( hWnd, hItem, TVGN_CARET ) );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVDELETEITEM ) // ( hWnd, hItem ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽hb_retl( TreeView_DeleteItem( hWnd, hItem ) );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVEDITLABEL ) // ( hWnd, hItem ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽SetFocus( hWnd );
聽 聽TreeView_EditLabel( hWnd, hItem );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETPARENT ) // ( hWnd, hItem ) --> hParentItem
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽#ifndef _WIN64
聽 聽 聽 hb_retnl( ( unsigned long ) TreeView_GetParent( hWnd, hItem ) );
聽 聽#else
聽 聽 聽 hb_retnll( ( LONGLONG ) TreeView_GetParent( hWnd, hItem ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETTEXTIMAGE ) // ( hWnd, hItem, cText, nImage )
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽 聽 HTREEITEM hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽TV_ITEM tvi;
聽 聽tvi.hItem 聽 = hItem;
聽 聽tvi.mask 聽 聽= TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
聽 聽tvi.pszText = fw_parWide( 3 ); //( LPSTR ) hb_parc( 3 );
聽 聽tvi.iImage 聽= hb_parnl( 4 );
聽 聽tvi.iSelectedImage = hb_parnl( 4 );
聽 聽TreeView_SetItem( hWnd, &tvi );
聽 聽hb_xfree( ( void * ) tvi.pszText );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETCOLOR ) // hWnd, nClrFore, nClrBack
{
聽 聽 #ifndef _WIN64
聽 聽 聽 COLORREF clr = TreeView_SetBkColor( ( HWND ) hb_parnl( 1 ), hb_parnl( 3 ) );
聽 聽 聽 COLORREF clr2 = TreeView_SetTextColor( ( HWND ) hb_parnl( 1 ), hb_parnl( 2 ) );
聽 聽#else
聽 聽 聽 COLORREF clr = TreeView_SetBkColor( ( HWND ) hb_parnll( 1 ), hb_parnl( 3 ) );
聽 聽 聽 COLORREF clr2 = TreeView_SetTextColor( ( HWND ) hb_parnll( 1 ), hb_parnl( 2 ) );
聽 聽#endif
聽 聽HB_SYMBOL_UNUSED( clr );
聽 聽HB_SYMBOL_UNUSED( clr2 );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETCHECK ) // hTreeView, hItem, lOnOff
{
聽 聽 #ifndef _WIN64
聽 聽 聽 TreeView_SetCheckState( ( HWND ) hb_parnl( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( HTREEITEM ) hb_parnl( 2 ), hb_parl( 3 ) );
聽 聽#else
聽 聽 聽 TreeView_SetCheckState( ( HWND ) hb_parnll( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ( HTREEITEM ) hb_parnll( 2 ), hb_parl( 3 ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETCHECK ) // hTreeView, hItem --> lOnOff
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retl( TreeView_GetCheckState( ( HWND ) hb_parnl( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽( HTREEITEM ) hb_parnl( 2 ) ) );
聽 聽#else
聽 聽 聽 hb_retl( TreeView_GetCheckState( ( HWND ) hb_parnll( 1 ),
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽( HTREEITEM ) hb_parnll( 2 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVGETEDITCONTROL ) // hTreeView --> hEdit
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retnl( ( HB_ULONG ) TreeView_GetEditControl( ( HWND ) hb_parnl( 1 ) ) );
聽 聽#else
聽 聽 聽 hb_retnll( ( HB_LONGLONG ) TreeView_GetEditControl( ( HWND ) hb_parnll( 1 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVIPARAM ) // hItem --> nLParam
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retnl( ( ( TV_ITEM * ) hb_parnl( 1 ) )->lParam );
聽 聽#else
聽 聽 聽 hb_retnll( ( ( TV_ITEM * ) hb_parnll( 1 ) )->lParam );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETITEMIMAGE ) // ( hWnd, hItem, iImage ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnl( 1 );
聽 聽#else
聽 聽 聽 HWND hWnd = ( HWND ) hb_parnll( 1 );
聽 聽#endif
聽 聽UINT iImage = hb_parni( 3 ) + 1;
聽 聽TV_ITEM pitem;
聽 聽#ifndef _WIN64
聽 聽 聽 pitem.hItem = ( HTREEITEM ) hb_parnl( 2 );
聽 聽#else
聽 聽 聽 pitem.hItem = ( HTREEITEM ) hb_parnll( 2 );
聽 聽#endif
聽 聽pitem.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE;
聽 聽pitem.iImage = iImage;
聽 聽pitem.iSelectedImage = iImage;
聽 聽hb_retl( TreeView_SetItem( hWnd, ( LPTV_ITEM )( &pitem ) ) );
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETITEMHEIGHT )// ( hWnd, cyItemn ) --> lSuccess
{
聽 聽 #ifndef _WIN64
聽 聽 聽 hb_retl( TreeView_SetItemHeight( ( HWND ) hb_parnl( 1 ), hb_parni( 2 ) ) );
聽 聽#else
聽 聽 聽 hb_retl( TreeView_SetItemHeight( ( HWND ) hb_parnll( 1 ), hb_parni( 2 ) ) );
聽 聽#endif
}
//-------------------------------------------------------------------------//
HB_FUNC( TVSETITEMBOLD ) // ( hWnd, hTreeItem, lBold ) --> lSuccess
{
聽 聽UINT uiMask1, uiMask2 = 0, bBold = hb_parl( 3 );
聽 聽#ifndef _WIN64
聽 聽 聽 hb_retl( TreeView_GetItemState( ( HWND ) hb_parnl( 1 ), ( HTREEITEM ) hb_parnl( 2 ), &uiMask1 ) );
聽 聽#else
聽 聽 聽 hb_retl( TreeView_GetItemState( ( HWND ) hb_parnll( 1 ), ( HTREEITEM ) hb_parnll( 2 ), &uiMask1 ) );
聽 聽#endif
聽 聽if( bBold )
聽 聽 聽 uiMask2 = TVIS_BOLD;
聽 聽else
聽 聽 聽 uiMask1 = uiMask1 ^ TVIS_BOLD;
聽 聽#ifndef _WIN64
聽 聽 聽 TreeView_SetItemState( ( HWND ) hb_parnl( 1 ), ( HTREEITEM ) hb_parnl( 2 ), uiMask1, uiMask2 );
聽 聽#else
聽 聽 聽 TreeView_SetItemState( ( HWND ) hb_parnll( 1 ), ( HTREEITEM ) hb_parnll( 2 ), uiMask1, uiMask2 );
聽 聽#endif
聽 聽hb_retl( uiMask1 & TVIS_BOLD );
}
//-------------------------------------------------------------------------//