*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="explorerbar.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS explorerbar AS container 
 	*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />

	*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 
	*< OBJECTDATA: ObjPath="imgBackground" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="Ctl32_Scrollbar" UniqueID="" Timestamp="" />

	*<DefinedPropArrayMethod>
		*m: changetheme		&& Occurs when theme change.
		*m: initthemedcontrol
		*m: reposition		&& Reposition groups after collapse/expand a group.
		*m: scroll		&& Move the ScrollBar to show the current group.
		*p: custombuilder
		*p: version		&& ExplorerBar version.
		*p: _memberdata		&& XML Metadata for customizable properties
	*</DefinedPropArrayMethod>

	PROTECTED Init,Resize
	*<PropValue>
		Anchor = 7
		BorderWidth = 0
		custombuilder = Double click here to open Builder
		Height = 208
		Name = "explorerbar"
		version = 3.5.0
		Width = 267
		_memberdata = <VFPData>
			<memberdata name="changetheme" type="method" display="ChangeTheme"/>
			<memberdata name="version" type="property" display="Version"/>
			<memberdata name="reposition" type="method" display="Reposition"/>
			<memberdata name="scroll" type="method" display="Scroll"/>
			<memberdata name="custombuilder" type="property" display="CustomBuilder" script="Local lnControls, laObjects[1]&#xA;m.lnControls = Aselobj(m.laObjects)&#xA;If m.lnControls # 0&#xA;   Local loObject, lcClassLib, loBuilder&#xA;   m.loObject = m.laObjects[1]&#xA;   m.lcClassLib = Addbs(Justpath(m.loObject.ClassLibrary))+&quot;ThemedControlsBuilders.vcx&quot;&#xA;   Set Classlib To (m.lcClassLib) Additive&#xA;   m.loBuilder = Createobject(&quot;ExplorerBarBuilder&quot;, m.loObject)&#xA;   m.loBuilder.Show()&#xA;Endif"/>
			<memberdata name="initthemedcontrol" type="method" display="InitThemedControl"/>
		</VFPData>
	*</PropValue>

	ADD OBJECT 'Ctl32_Scrollbar' AS ctl32_scrollbar WITH ;
		ctlorientation = 1, ;
		Height = 0, ;
		Left = 249, ;
		Name = "Ctl32_Scrollbar", ;
		Top = -1, ;
		Width = 18, ;
		lblname.Name = "lblname", ;
		ctlTextBox.Name = "ctlTextBox"
		*< END OBJECT: ClassLib="ctl32.vcx" BaseClass="container" />

	ADD OBJECT 'imgBackground' AS image WITH ;
		Height = 0, ;
		Name = "imgBackground", ;
		Stretch = 2, ;
		Top = -1, ;
		Width = 249
		*< END OBJECT: BaseClass="image" />
	
	PROCEDURE changetheme		&& Occurs when theme change.
		This.imgBackground.Picture = _Screen.ThemesManager.GetMember("ExplorerBar.Background.Picture")
	ENDPROC

	PROTECTED PROCEDURE Init
		This.InitThemedControl()
		This.Reposition(.T.)
	ENDPROC

	HIDDEN PROCEDURE initthemedcontrol
		If Not Vartype(_Screen.ThemesManager)=="O"
		   _Screen.Newobject("ThemesManager","ThemesManager","ThemedControls.vcx")
		Endif
		This.ChangeTheme()
	ENDPROC

	PROCEDURE reposition		&& Reposition groups after collapse/expand a group.
		Lparameters llMove
		Local lnTop, lnHeight, loGroup
		With This.Ctl32_Scrollbar
		   m.lnTop = .ctlMinimum - .ctlValue
		Endwith
		m.lnHeight = 0
		For Each loGroup In This.Controls
		   With m.loGroup
		      If Not Inlist(Upper(.Name),;
		            "IMGBACKGROUND","CTL32_SCROLLBAR")
		         If m.llMove
		            .Top = m.lnTop
		            .Left = 4
		         Endif
		         m.lnTop = .Top + .Height
		         m.lnHeight = m.lnHeight + .Height
		      Endif
		   Endwith
		Endfor
		m.loGroup = Null
		*
		With This
		   Local llScrollBar
		   llScrollBar = (m.lnHeight > .Height)
		   With .Ctl32_Scrollbar
		      If llScrollBar
		         .ctlMaximum = m.lnHeight
		         .ctlLargeChange = .Height
		      Else
		         If Not .ctlValue==.ctlMinimum
		            .ctlValue = .ctlMinimum
		         Endif
		      Endif
		      .ctlVisible = llScrollBar
		   Endwith
		Endwith
	ENDPROC

	PROTECTED PROCEDURE Resize
		With This
			Store 0 To ;
				.imgBackground.Top, ;
				.Ctl32_Scrollbar.Top
			Store .Height To ;
				.imgBackground.Height, ;
				.Ctl32_Scrollbar.Height
			.imgBackground.Width = .Width
			.Reposition(.F.)
		Endwith
		* The following code ensures that focus rectangle is visible
		Try
			Local loObject
			m.loObject = This.ActiveControl
			With m.loObject
				If Upper(.Name)=="CMDFOCUS"
					This.Scroll(.Parent.Top,.Parent.Height)
					.Visible = .F.
					.Visible = .T.
				Endif
			Endwith
			m.loObject = Null
		Catch
		Endtry
	ENDPROC

	PROCEDURE scroll		&& Move the ScrollBar to show the current group.
		Lparameters lnTop, lnHeight
		With This.Ctl32_ScrollBar
		   If .ctlVisible
		      .ctlValue = (m.lnTop + m.lnHeight + 1 + .ctlValue) - This.Height
		   Endif
		Endwith
	ENDPROC

	PROCEDURE Ctl32_Scrollbar.ctlvaluechanged
		This.Parent.Reposition(.T.)
	ENDPROC

ENDDEFINE

DEFINE CLASS explorergroup AS container 
 	*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />

	*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 
	*< OBJECTDATA: ObjPath="imgBackground" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="linBottomBorder" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="linLeftBorder" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="linRightBorder" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="cntUserControls" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="imgTitle" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="cmdFocus" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="lblTitle" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="imgPicture" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="shpMouseHandler" UniqueID="" Timestamp="" />

	*<DefinedPropArrayMethod>
		*m: activate		&& Occurs when group receive the focus.
		*m: changetheme		&& Occurs when theme change.
		*m: clicked		&& Occurs when shpMouseHandler or cmdFocus are clicked.
		*m: collapse		&& Occurs when group is collapsed.
		*m: expand		&& Occurs when group is expanded.
		*m: highlightheader		&& Occurs when header receive focus.
		*m: initthemedcontrol
		*p: custombuilder
		*p: imgcollapsehighlighted		&& Path and name of the button's image displayed when group is collapsed and highlighted.
		*p: imgcollapsenothighlighted		&& Path and name of the button's image displayed when group is collapsed and not highlighted.
		*p: imgexpandhighlighted		&& Path and name of the button's image displayed when group is expanded and highlighted.
		*p: imgexpandnothighlighted		&& Path and name of the button's image displayed when group is expanded and highlighted.
		*p: initialheight		&& Initial group height.
		*p: lblhighlight		&& Highlighted group font color.
		*p: lblnothighlight		&& Not highlighted group font color.
		*p: state		&& Specify if the group is expanded (0) or collapsed (1).
		*p: type		&& Specify if group type is normal (0) or special (1).
		*p: _memberdata		&& XML Metadata for customizable properties
	*</DefinedPropArrayMethod>

	HIDDEN initialheight
	PROTECTED GotFocus,Init,Resize
	*<PropValue>
		BackStyle = 0
		BorderWidth = 0
		custombuilder = Double click here to open Builder
		Height = 200
		imgcollapsehighlighted = ("")
		imgcollapsenothighlighted = ("")
		imgexpandhighlighted = ("")
		imgexpandnothighlighted = ("")
		initialheight = 0
		lblhighlight = 0
		lblnothighlight = 0
		Name = "explorergroup"
		state = 0
		type = 0
		Width = 241
		_memberdata = <VFPData>
			<memberdata name="changetheme" type="method" display="ChangeTheme"/>
			<memberdata name="collapse" type="method" display="Collapse"/>
			<memberdata name="expand" type="method" display="Expand"/>
			<memberdata name="highlightheader" type="method" display="HighlightHeader"/>
			<memberdata name="state" type="property" display="State"/>
			<memberdata name="type" type="property" display="Type"/>
			<memberdata name="initialheight" type="method" display="InitialHeight"/>
			<memberdata name="clicked" type="method" display="Clicked"/>
			<memberdata name="imgcollapsehighlighted" type="property" display="ImgCollapseHighlighted"/>
			<memberdata name="imgcollapsenothighlighted" type="property" display="ImgCollapseNotHighlighted"/>
			<memberdata name="imgexpandhighlighted" type="property" display="ImgExpandHighlighted"/>
			<memberdata name="imgexpandnothighlighted" type="property" display="ImgExpandNotHighlighted"/>
			<memberdata name="lblhighlight" type="property" display="LblHighlight"/>
			<memberdata name="lblnothighlight" type="property" display="LblNotHighlight"/>
			<memberdata name="custombuilder" type="property" display="CustomBuilder" script="Local lnControls, laObjects[1]&#xA;m.lnControls = Aselobj(m.laObjects)&#xA;If m.lnControls # 0&#xA;   Local loObject, lcClassLib, loBuilder&#xA;   m.loObject = m.laObjects[1]&#xA;   m.lcClassLib = Addbs(Justpath(m.loObject.ClassLibrary))+&quot;ThemedControlsBuilders.vcx&quot;&#xA;   Set Classlib To (m.lcClassLib) Additive&#xA;   m.loBuilder = Createobject(&quot;ExplorerGroupBuilder&quot;, m.loObject)&#xA;   m.loBuilder.Show()&#xA;ENDIF"/>
			<memberdata name="initthemedcontrol" type="method" display="InitThemedControl"/>
			<memberdata name="activate" type="method" display="Activate"/>
		</VFPData>
	*</PropValue>

	ADD OBJECT 'cmdFocus' AS commandbutton WITH ;
		Caption = "Command1", ;
		Height = 21, ;
		Left = 3, ;
		Name = "cmdFocus", ;
		Style = 1, ;
		TabIndex = 2, ;
		Top = 14, ;
		Width = 235
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'cntUserControls' AS container WITH ;
		Height = 159, ;
		Left = 0, ;
		Name = "cntUserControls", ;
		TabIndex = 3, ;
		Top = 37, ;
		Width = 241
		*< END OBJECT: BaseClass="container" />

	ADD OBJECT 'imgBackground' AS image WITH ;
		BackStyle = 0, ;
		Height = 159, ;
		Left = 0, ;
		Name = "imgBackground", ;
		Stretch = 2, ;
		Themes = .F., ;
		Top = 37, ;
		Width = 241
		*< END OBJECT: BaseClass="image" />

	ADD OBJECT 'imgPicture' AS image WITH ;
		BackStyle = 0, ;
		Height = 32, ;
		Left = 0, ;
		Name = "imgPicture", ;
		Stretch = 2, ;
		Top = 4, ;
		Width = 32
		*< END OBJECT: BaseClass="image" />

	ADD OBJECT 'imgTitle' AS image WITH ;
		BackStyle = 0, ;
		Height = 25, ;
		Left = 0, ;
		Name = "imgTitle", ;
		Stretch = 2, ;
		Top = 12, ;
		Width = 241
		*< END OBJECT: BaseClass="image" />

	ADD OBJECT 'lblTitle' AS label WITH ;
		Caption = "Label1", ;
		FontBold = .T., ;
		FontSize = 8, ;
		Height = 17, ;
		Left = 37, ;
		Name = "lblTitle", ;
		TabIndex = 1, ;
		Top = 16, ;
		Width = 176
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'linBottomBorder' AS line WITH ;
		Height = 0, ;
		Left = 0, ;
		Name = "linBottomBorder", ;
		Top = 196, ;
		Width = 241
		*< END OBJECT: BaseClass="line" />

	ADD OBJECT 'linLeftBorder' AS line WITH ;
		Height = 160, ;
		Left = 0, ;
		Name = "linLeftBorder", ;
		Top = 37, ;
		Width = 0
		*< END OBJECT: BaseClass="line" />

	ADD OBJECT 'linRightBorder' AS line WITH ;
		Height = 160, ;
		Left = 240, ;
		Name = "linRightBorder", ;
		Top = 37, ;
		Width = 0
		*< END OBJECT: BaseClass="line" />

	ADD OBJECT 'shpMouseHandler' AS shape WITH ;
		BackStyle = 0, ;
		BorderStyle = 0, ;
		Height = 33, ;
		Left = 0, ;
		MousePointer = 15, ;
		Name = "shpMouseHandler", ;
		Top = 4, ;
		Width = 241
		*< END OBJECT: BaseClass="shape" />
	
	PROCEDURE activate		&& Occurs when group receive the focus.
	ENDPROC

	PROCEDURE changetheme		&& Occurs when theme change.
		With _Screen.ThemesManager
		   Store .GetMember("ExplorerBar.Bordercolor") To ;
		      This.linLeftBorder.BorderColor, ;
		      This.linRightBorder.BorderColor, ;
		      This.linBottomBorder.BorderColor
		   If This.Type==0
		      This.ImgCollapseHighlighted = .GetMember("ExplorerBar.NormalGroupCollapseHighlight.Picture")
		      This.ImgCollapseNotHighlighted = .GetMember("ExplorerBar.NormalGroupCollapseNotHighlight.Picture")
		      This.ImgExpandHighlighted = .GetMember("ExplorerBar.NormalGroupExpandHighlight.Picture")
		      This.ImgExpandNotHighlighted = .GetMember("ExplorerBar.NormalGroupExpandNotHighlight.Picture")
		      This.lblHighlight = .GetMember("ExplorerBar.NormalGroupHighlight.Forecolor")
		      This.lblNotHighlight = .GetMember("ExplorerBar.NormalGroupNotHighlight.Forecolor")
		      This.imgBackground.Picture = .GetMember("ExplorerBar.NormalGroupBackground.Picture")
		   Else
		      This.ImgCollapseHighlighted = .GetMember("ExplorerBar.SpecialGroupCollapseHighlight.Picture")
		      This.ImgCollapseNotHighlighted = .GetMember("ExplorerBar.SpecialGroupCollapseNotHighlight.Picture")
		      This.ImgExpandHighlighted = .GetMember("ExplorerBar.SpecialGroupExpandHighlight.Picture")
		      This.ImgExpandNotHighlighted = .GetMember("ExplorerBar.SpecialGroupExpandNotHighlight.Picture")
		      This.lblHighlight = .GetMember("ExplorerBar.SpecialGroupHighlight.Forecolor")
		      This.lblNotHighlight = .GetMember("ExplorerBar.SpecialGroupNotHighlight.Forecolor")
		      This.imgBackground.Picture = .GetMember("ExplorerBar.SpecialGroupBackground.Picture")
		   Endif
		   This.HighlightHeader(.F.)
		Endwith
	ENDPROC

	PROCEDURE clicked		&& Occurs when shpMouseHandler or cmdFocus are clicked.
		With This
		   If .State==0
		      .Collapse()
		   Else
		      .Expand()
		   Endif
		   .cmdFocus.SetFocus()
		   .Parent.Scroll(.Top,.Height)
		   * The following code must not be placed in Collapse
		   * and Expand methods because I must call Collapse
		   * in the Init when group must be start collapsed.
		   Local loObject
		   loObject = Sys(1270)
		   If Vartype(loObject)=="O"
		      If Upper(loObject.Name)==Upper(This.Name)
		         .HighlightHeader(.T.)
		      Else
		         .HighlightHeader(.F.)
		      Endif
		   Endif
		Endwith
	ENDPROC

	PROCEDURE collapse		&& Occurs when group is collapsed.
		Local lnHeight
		With This
		   .State = 1
		   *For m.lnHeight=.Height-1 To 37 Step -1
		   *   .Height = m.lnHeight
		   *   .Parent.Reposition(.T.)
		   *Endfor
		   .Height = 37
		   .Parent.Reposition(.T.)
		   .cntUserControls.Visible = .F.
		Endwith
	ENDPROC

	PROCEDURE expand		&& Occurs when group is expanded.
		Local lnHeight
		With This
		   .State = 0
		   *For m.lnHeight=.Height+1 To .InitialHeight
		   *   .Height = m.lnHeight
		   *   .Parent.Reposition(.T.)
		   *Endfor
		   .Height = .InitialHeight
		   .Parent.Reposition(.T.)
		   .cntUserControls.Visible = .T.
		Endwith
	ENDPROC

	PROTECTED PROCEDURE GotFocus
		With This
		   .Parent.Scroll(.Top,.Height)
		   .Activate()
		Endwith
	ENDPROC

	PROCEDURE highlightheader		&& Occurs when header receive focus.
		Lparameters llHighlight
		With This
		   If m.llHighlight
		      .lblTitle.ForeColor = .lblHighlight
		      .imgTitle.Picture = Iif(.State==0,.ImgCollapseHighlighted,.ImgExpandHighlighted)
		   Else
		      .lblTitle.ForeColor = .lblNotHighlight
		      .imgTitle.Picture = Iif(.State==0,.ImgCollapseNotHighlighted,.ImgExpandNotHighlighted)
		   Endif
		   * The following code ensures that focus rectangle is visible.
		   With .cmdFocus
		      .Visible = .F.
		      .Visible = .T.
		   Endwith
		Endwith
	ENDPROC

	PROTECTED PROCEDURE Init
		With This
			.InitialHeight = .Height
			If Empty(.imgPicture.Picture)
				Local lnWidth
				With .imgPicture
					m.lnWidth = .Width
					.Visible = .F.
				Endwith
				With .lblTitle
					.Left = .Left - m.lnWidth
					.Width = .Width + m.lnWidth
				Endwith
			Endif
			.lblTitle.BackStyle = 0
			.cntUserControls.BorderWidth = 0
			.cntUserControls.BackStyle = 0
			If .State==1
				.Collapse()
			Endif
			*
			.InitThemedControl()
		Endwith
	ENDPROC

	HIDDEN PROCEDURE initthemedcontrol
		If Not Vartype(_Screen.ThemesManager)=="O"
		   _Screen.Newobject("ThemesManager","ThemesManager","ThemedControls.vcx")
		Endif
		This.ChangeTheme()
	ENDPROC

	PROTECTED PROCEDURE Resize
		With This
		   Store Max(0,.Height - .shpMouseHandler.Height - 8) To ;
		      .linLeftBorder.Height, ;
		      .linRightBorder.Height, ;
		      .imgBackground.Height, ;
		      .cntUserControls.Height
		   .linBottomBorder.Top = (.imgBackground.Top + .imgBackground.Height)
		   .linBottomBorder.Visible = (.State==0)
		Endwith
	ENDPROC

	PROCEDURE cmdFocus.KeyPress
		Lparameters nKeyCode, nShiftAltCtrl
		If nKeyCode==13
		   Nodefault
		   This.Parent.Clicked()
		Endif
	ENDPROC

	PROCEDURE shpMouseHandler.Click
		This.Parent.Clicked()
	ENDPROC

	PROCEDURE shpMouseHandler.MouseEnter
		Lparameters nButton, nShift, nXCoord, nYCoord
		This.Parent.HighlightHeader(.T.)
	ENDPROC

	PROCEDURE shpMouseHandler.MouseLeave
		Lparameters nButton, nShift, nXCoord, nYCoord
		This.Parent.HighlightHeader(.F.)
	ENDPROC

ENDDEFINE
