//***************************************************************************************** // Copyright (c) 2000 Michael Kurz // All rights reserved. // If you want to use this source in your applications conatct: // // $FileName : cTreeViewEx.pkg // $ProjectName : Shared Classes // $Author : Michael Kurz // $Created : 03-13-2001 @ 19:00 // // Contents: // An extended TreeView class which allows to add items with bitmaps direct by bmp name // and with an dynamic_update_state that is working. // Also is implemented setting and getting of the ScrollPosition. // // $Rev History // //***************************************************************************************** Use DFTreeVw.Pkg Use GlobalFunctionsProcedures.pkg Use cJsonObject.pkg Define TVM_SETBKCOLOR For (TV_FIRST + 29) Define TVM_SETTEXTCOLOR For (TV_FIRST + 30) #IFDEF GET_GetScrollPos #ELSE external_function GetScrollPos "GetScrollPos" USER32.DLL Handle hwnd Integer iBar Returns Integer #ENDIF #IFDEF GET_SetScrollPos #ELSE external_function SetScrollPos "SetScrollPos" USER32.DLL Handle hwnd Integer iBar Integer iPos Integer iRedraw Returns Integer #ENDIF Use cImageListEx.Pkg Class cTreeViewEx Is a TreeView Procedure Construct_Object Forward Send Construct_Object // Set External_Class_Name 'cTreeViewEx' To 'SysTreeView32' Property Integer piRedrawState True Property Integer Floating_Menu_Object 0 End_Procedure // Sorts the items of a treeview. Procedure SortItems Integer hBaseNode Integer iRecursive Integer iRet Move (SendMessage(Window_Handle(Self),TVM_SORTCHILDREN,iRecursive,hBaseNode)) To iRet End_Procedure // Set Current Item when mouse down. (Useful when Drag Items) Procedure Mouse_Down Integer iT Forward Send Mouse_Down iT Set CurrentTreeItem To (ItemHitTest(Self)) End_Procedure // Set Current Item when mouse down. // And Start PopupMenu when entered. Procedure Mouse_Down2 Integer iT Forward Send Mouse_Down2 iT Set CurrentTreeItem To (ItemHitTest(Self)) If (Floating_Menu_Object(Self)) Send Popup To (Floating_Menu_Object(Self)) End_Procedure // Inserts a TreeItem to this parent after hAfter. // ToDo: We can use normal InsertTreeItem from DfTreeVw.pkg, but be careful // that parameters hAfter and hParent are swapped! Function InsertTreeItem String sValue Handle hAfter Handle hParent Integer iItemData Integer iImage Integer iSelImage Returns Handle Pointer pszValue tWinTvInsertStruct TvInsertStruct #IF (!@ >= 200) WString wsValue Move (sValue+Character(0)) To wsValue Move (AddressOf(wsValue)) To pszValue #ELSE Move (sValue+Character(0)) To sValue Move (ToANSI(sValue)) To sValue Move (AddressOf(sValue)) To pszValue #ENDIF Move (TVIF_TEXT + TVIF_PARAM +TVIF_IMAGE+TVIF_SELECTEDIMAGE) To TvInsertStruct.TvItemEx.mask Move hAfter To TvInsertStruct.hInsertAfter Move pszValue To TvInsertStruct.TvItemEx.pszText Move iItemData To TvInsertStruct.TvItemEx.lParam Move iImage To TvInsertStruct.TvItemEx.iImage Move iSelImage To TvInsertStruct.TvItemEx.iSelectedImage Move hParent To TvInsertStruct.hParent Function_Return (WindowsMessage(TVM_INSERTITEM, 0, AddressOf(TvInsertStruct))) End_Function // Delivers the Item Nr of an Image. Function BmpToImageNr String sBmp Returns Integer Integer hoImgLst iRet Get ImageListObject To hoImgLst Get Msg_ImageListEx_Add Of hoImgLst sBmp To iRet Function_Return iRet End_Function // Sets the ItemImage via a Bitmap string. Procedure Set ItemBitmap Integer iItem String sBmp Integer iImg Get BmpToImageNr sBmp To iImg Set ItemImage iItem To iImg End_Procedure // Sets the ItemImage via a Bitmap string. Procedure Set ItemSelectedBitmap Integer iItem String sBmp Integer iImg Get BmpToImageNr sBmp To iImg Set ItemSelectedImage iItem To iImg End_Procedure // Adding Items with Images by Name. (Which are automatically inserted // into the ImageList (need to be a cImageListEx) Function InsertTreeItemEx String sLabel Integer hAfter Integer hParent Integer iUserInfo String sBmp String sBmpSel Returns Integer Integer hoImgLst iBmp iBmpSel Get ImageListObject To hoImgLst Move -1 To iBmp Move -1 To iBmpSel If hoImgLst Begin If sBmp Ne "" Get Msg_ImageListEx_Add Of hoImgLst sBmp To iBmp If sBmpSel Ne "" Get Msg_ImageListEx_Add Of hoImgLst sBmpSel To iBmpSel End Function_Return (InsertTreeItem(Self,sLabel,hAfter,hParent,iUserInfo,iBmp,iBmpSel)) End_Function // Adds a item with the ability to use the BMP as string. Function AddTreeItemEx String sLabel Integer hParent Integer iUserInfo String sBmp String sBmpSel Returns Integer Function_Return (InsertTreeItemEx(Self,sLabel,TVI_LAST,hParent,iUserInfo,sBmp,sBmpSel)) End_Function // Set and get the scrollposition. Function CurrScrollPos Integer iBar Returns Integer Function_Return (GetScrollPos(Window_Handle(Self),iBar)) End_Function Procedure Set CurrScrollPos Integer iPos Integer iBar Integer iRet Move (SetScrollPos(Window_Handle(Self),iBar,iPos,True)) To iRet End_Procedure // Implementing Dyn.Update.State with using WM_SETREDRAW Procedure Page Integer iFlag Set Window_Style TVS_DISABLEDRAGDROP To False Forward Send Page iFlag End_Procedure // // Code written by Vincent, see // https://support.dataaccess.com/Forums/showthread.php?70312-YAFR-Export-contents-of-Tree-Views&p=385302#post385302 // Procedure AddDataToJson Handle hItem Handle hoJSON Integer iRecurseLevel Handle hoJSONTreeNode hChildItem hoJSONTreeNodeChild String sItemLabel Integer iItemData iItemImage iItemSelectedImage Boolean bItemBold bItemHasCheckbox bItemChecked bItemExpanded Get ItemLabel hItem to sItemLabel Get ItemData hItem to iItemData Get ItemImage hItem to iItemImage Get ItemBold hItem to bItemBold Get ItemExpandedState hItem to bItemExpanded Get ItemSelectedImage hItem to iItemSelectedImage Get ItemCheckBox hItem to bItemHasCheckbox If (bItemHasCheckbox) Begin Get ItemChecked hItem to bItemChecked End Get Create (RefClass(cJsonObject)) to hoJSONTreeNode Send InitializeJsonType of hoJSONTreeNode jsonTypeObject Send SetMemberValue of hoJSONTreeNode "Item" jsonTypeInteger hItem Send SetMemberValue of hoJSONTreeNode "ItemLabel" jsonTypeString sItemLabel Send SetMemberValue of hoJSONTreeNode "ItemData" jsonTypeInteger iItemData Send SetMemberValue of hoJSONTreeNode "ItemImage" jsonTypeInteger iItemImage Send SetMemberValue of hoJSONTreeNode "ItemSelectedImage" jsonTypeInteger iItemSelectedImage Send SetMemberValue of hoJSONTreeNode "ItemBold" jsonTypeBoolean bItemBold Send SetMemberValue of hoJSONTreeNode "ItemHasCheckbox" jsonTypeBoolean bItemHasCheckbox Send SetMemberValue of hoJSONTreeNode "ItemChecked" jsonTypeBoolean bItemChecked Send SetMemberValue of hoJSONTreeNode "ItemExpanded" jsonTypeBoolean bItemExpanded Send AddMember of hoJson hoJSONTreeNode Get ChildItem hItem to hChildItem If (hChildItem <> 0) Begin Get Create (RefClass (cJsonObject)) to hoJSONTreeNodeChild Send InitializeJsonType of hoJSONTreeNodeChild jsonTypeArray Send SetMember of hoJSONTreeNode "Children" hoJSONTreeNodeChild While (hChildItem > 0) Send AddDataToJson hChildItem hoJSONTreeNodeChild (iRecurseLevel + 1) Get NextSiblingItem hChildItem to hChildItem Loop Send Destroy of hoJSONTreeNodeChild End Send Destroy of hoJSONTreeNode End_Procedure // // Code written by Vincent, see // https://support.dataaccess.com/Forums/showthread.php?70312-YAFR-Export-contents-of-Tree-Views&p=385302#post385302 // Procedure CreateTreeNodes Handle hoJson Handle hRootItem Integer iRecurseLevel Integer iMembers iMember eJsonType iItemData iItemImage iItemSelectedImage Handle hoJsonMember hItem hoChildrenMember String sItemLabel Boolean bItemBold bItemHasCheckbox bItemChecked bHasChildrenMember bItemExpanded Get MemberCount of hoJson to iMembers If (iMembers > 0) Begin Decrement iMembers For iMember from 0 to iMembers Move 0 to hItem Get MemberByIndex of hoJson iMember to hoJsonMember If (hoJsonMember <> 0) Begin Get JsonType of hoJsonMember to eJsonType If (eJsonType = jsonTypeObject) Begin Get MemberValue of hoJsonMember "ItemLabel" to sItemLabel Get MemberValue of hoJsonMember "ItemData" to iItemData Get MemberValue of hoJsonMember "ItemImage" to iItemImage Get MemberValue of hoJsonMember "ItemSelectedImage" to iItemSelectedImage Get MemberValue of hoJsonMember "ItemHasCheckbox" to bItemHasCheckbox Get MemberValue of hoJsonMember "ItemChecked" to bItemChecked Get MemberValue of hoJsonMember "ItemBold" to bItemBold Get MemberValue of hoJsonMember "ItemExpanded" to bItemExpanded Get AddTreeItem sItemLabel hRootItem iItemData iItemImage iItemSelectedImage to hItem If (hItem <> 0) Begin Set ItemBold hItem to bItemBold Get HasMember of hoJsonMember "Children" to bHasChildrenMember If (bHasChildrenMember) Begin Get Member of hoJsonMember "Children" to hoChildrenMember Send CreateTreeNodes hoChildrenMember hItem (iRecurseLevel + 1) End If (bItemExpanded) Begin Send DoExpandItem hItem End End End End Loop End End_Procedure // // Code written by Vincent, see // https://support.dataaccess.com/Forums/showthread.php?70312-YAFR-Export-contents-of-Tree-Views&p=385302#post385302 // Procedure LoadFromJson String sJson Handle hoJson Boolean bOk Integer eJsonType Get Create (RefClass (cJsonObject)) to hoJSON Get ParseString of hoJson sJson to bOk If (bOk) Begin Send ClearAll Get JsonType of hoJson to eJsonType If (eJsonType = jsonTypeArray) Begin Send CreateTreeNodes hoJson 0 0 End End End_Procedure // // Code written by Vincent, see // https://support.dataaccess.com/Forums/showthread.php?70312-YAFR-Export-contents-of-Tree-Views&p=385302#post385302 // Function ConvertToJSON Returns Handle Handle hoJSON hRootItem Get Create (RefClass (cJsonObject)) to hoJSON Send InitializeJsonType of hoJson jsonTypeArray Get RootItem to hRootItem While (hRootItem > 0) Send AddDataToJson hRootItem hoJSON 0 Get NextSiblingItem hRootItem to hRootItem Loop Function_Return hoJSON End_Function End_Class