104
Fullfit the caption on the element's width

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElement := oSwimLane:Elements():Add("<solidline><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;properties>+</a><br><solidline>+ balance: Currency = 0</solidline><br>+ deposit(amount: Currency)<r><a 2;methods>+</a><br>+ withdraw(amount: Currency)")
			oElement:CaptionSingleLine := 1/*exCaptionBreakWrap*/
			oElement:SetProperty("BackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 248,248,248 } )  , .F. ))
			oElement:AutoSize := .F.
			oElement:Width := 194
			oElement:Height := 76
			oElement:CaptionAlign := 4/*0x4+*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
103
Wrap the caption by <br> or "\r\n" sequence only

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElement := oSwimLane:Elements():Add("<solidline><b>Bank Account</b></solidline><br>+ owner: String <r><a 1;properties>+</a><br><solidline>+ balance: Currency = 0</solidline><br>+ deposit(amount: Currency)<r><a 2;methods>+</a><br>+ withdraw(amount: Currency)")
			oElement:CaptionSingleLine := 1/*exCaptionBreakWrap*/
			oElement:SetProperty("BackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 248,248,248 } )  , .F. ))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
102
Display a custom tooltip
PROCEDURE OnMouseMove(oSwimLane,Button,Shift,X,Y)
	oSwimLane:ShowToolTip("new content","",,"+8","+8")
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:MouseMove := {|Button,Shift,X,Y| OnMouseMove(oSwimLane,Button,Shift,X,Y)} /*Occurs when the user moves the mouse.*/


	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
101
Shows the tooltip of the object moved relative to its default position
PROCEDURE OnMouseMove(oSwimLane,Button,Shift,X,Y)
	oSwimLane:ShowToolTip("<null>","<null>",,"+8","+8")
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:MouseMove := {|Button,Shift,X,Y| OnMouseMove(oSwimLane,Button,Shift,X,Y)} /*Occurs when the user moves the mouse.*/

		oSwimLane:Elements():Add("Element with a Tooltip"):ToolTip := "This is a bit of text that should be displayed when cursor hovers the element."

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
100
Add a pool to cover all visible-elements

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Pools():Add():SetProperty("HeaderSize",0/*exHeaderLeft*/,24)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
99
How can I ensure that a specified pool fits the surface's visible area
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPattern
	LOCAL oPools
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oPools := oSwimLane:Pools()
			oPattern := oPools:Add():Pattern()
				oPattern:Type := 6/*exPatternBDiagonal*/
				oPattern:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 224,224,224 } )  , .F. ))
			oPools:Add(2000):EnsureVisible()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
98
No property for the pool can be saved/restored through Undo/Redo feature

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLane
	LOCAL oPool
	LOCAL oSwimLane
	LOCAL l

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AllowUndoRedo := .T.
		oPool := oSwimLane:Pools():Add(-54,-47,244,112)
			l := oPool:StartUpdatePool()
			oLane := oPool:Lane(1/*exLaneVertical*/)
				oLane:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 240,240,240 } )  , .F. ))
				oLane:Children():Count := 2
			oPool:EndUpdatePool(l)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
97
Rename Undo/Redo commands into the control's toolbar

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:ToolBarFormat := "-1,100,102,101,|,103,104"
		oSwimLane:SetProperty("ToolBarCaption",103,"Anuleaza <img>4</img>")
		oSwimLane:SetProperty("ToolBarCaption",104,"<img>5</img>Reface")
		oSwimLane:SetProperty("ToolBarToolTip",103,"Anuleaza ultima actiune UI. Pentru a anula o actiune apasati Ctrl+Z.")
		oSwimLane:SetProperty("ToolBarToolTip",104,"Inverseaza cea mai recenta operatie de anulare. Pentru a reface o actiune apasati Ctrl+Y.")
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
96
Add Undo/Redo commands to control's toolbar

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:ToolBarFormat := "-1,100,102,101,|,103,104"
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
95
Clear Undo/Redo queue (method 2)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane
	LOCAL c

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		c := oSwimLane:UndoRedoQueueLength()
		oSwimLane:UndoRedoQueueLength := 0
		oSwimLane:UndoRedoQueueLength := c
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
94
Clear Undo/Redo queue (method 1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:AllowUndoRedo := .T.
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
93
Removes Redo operations

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Undo()
		oSwimLane:RedoRemoveAction(10)
		DevOut( oSwimLane:RedoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
92
Removes Undo operations

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:UndoRemoveAction(10)
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
91
Record the UI operations as a block of undo/redo operations

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:StartBlockUndoRedo()
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:EndBlockUndoRedo()
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
90
Groups the next to current Undo/Redo Actions in a single block

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:GroupUndoRedoActions(3)
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
89
Limits the number of entries within the Undo/Redo queue

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:UndoRedoQueueLength := 1
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
88
Lists the Redo actions that can be performed on the surface

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Undo()
		DevOut( oSwimLane:RedoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
87
Lists the Undo actions that can be performed on the surface

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		DevOut( oSwimLane:UndoListAction() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
86
Checks whether the Undo operation is possible

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Undo()
		DevOut( "CanRedo" )
		DevOut( Transform(oSwimLane:CanRedo(),"") )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
85
Call Redo by code

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Undo()
		oSwimLane:Redo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
84
Checks whether the Undo operation is possible

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		DevOut( "CanUndo" )
		DevOut( Transform(oSwimLane:CanUndo(),"") )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
83
Call Undo by code

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:Undo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
82
Save the element's properties for Undo/Redo operations, by code

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oSwimLane
	LOCAL h

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:StartBlockUndoRedo()
		oLink := oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			h := oLink:StartUpdateLink()
			oLink:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 255,0,0 } )  , .F. ))
			oLink:Width := 2
			oLink:ShowDir := .F.
			oLink:ShowLinkType := 2/*exLinkStraight*/
			oLink:EndUpdateLink(h)
		oSwimLane:EndBlockUndoRedo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
81
No color is restored for the link when Undo/Redo operation is executed

PROCEDURE OnAddElement(oSwimLane,Element)
	/*Element.ShowCheckBox = True*/
	/*Element.CheckBoxAlign = 2*/

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oSwimLane
	LOCAL h

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddElement := {|Element| OnAddElement(oSwimLane,Element)} /*A new element has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oElements := oSwimLane:Elements()
			oElements:Add("Check <b>1",-64,-64)
			oElements:Add("Check <b>2"):Checked := 1/*exChecked*/
		oSwimLane:StartBlockUndoRedo()
		oLink := oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			h := oLink:StartUpdateLink()
			oLink:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 255,0,0 } )  , .F. ))
			oLink:Width := 2
			oLink:ShowDir := .F.
			oLink:ShowLinkType := 2/*exLinkStraight*/
			oLink:EndUpdateLink(h)
		oSwimLane:EndBlockUndoRedo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
80
Save the element's properties for Undo/Redo operations, by code

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane
	LOCAL h

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Elements():Add("Item <b>1",-64,-64)
		oSwimLane:StartBlockUndoRedo()
		oElement := oSwimLane:Elements():Add("Item <b>2")
			h := oElement:StartUpdateElement()
			oElement:SetProperty("BackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 0,0,0 } )  , .F. ))
			oElement:SetProperty("ForeColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
			oElement:SetProperty("BorderColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,0,0 } )  , .F. ))
			oElement:EndUpdateElement(h)
		oSwimLane:EndBlockUndoRedo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
79
No color is restored for the element when Undo/Redo operation is executed

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane
	LOCAL h

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Elements():Add("Item <b>1",-64,-64)
		oSwimLane:StartBlockUndoRedo()
		oElement := oSwimLane:Elements():Add("Item <b>2")
			h := oElement:StartUpdateElement()
			oElement:SetProperty("BackColor",AutomationTranslateColor( GraMakeRGBColor  ( { 0,0,0 } )  , .F. ))
			oElement:SetProperty("ForeColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
			oElement:SetProperty("BorderColor",AutomationTranslateColor( GraMakeRGBColor  ( { 255,0,0 } )  , .F. ))
			oElement:EndUpdateElement(h)
		oSwimLane:EndBlockUndoRedo()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
78
How can I ensure that a specified element fits the surface's visible area

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oPattern
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oPattern := oElements:Add("Element A",-100):Pattern()
				oPattern:Type := 6/*exPatternBDiagonal*/
				oPattern:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 224,224,224 } )  , .F. ))
			oElements:Add("Element B",2000):EnsureVisible()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
77
LayoutEndChanging(exUndo), LayoutEndChanging(exRedo) or LayoutEndChanging(exUndoRedoUpdate) notifiy your application once a Undo/Redo operation is executed (CTRL+Z, CTRL+Y) or updated
PROCEDURE OnLayoutEndChanging(oSwimLane,Operation)
	DevOut( "LayoutEndChanging" )
	DevOut( Transform(Operation,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:LayoutEndChanging := {|Operation| OnLayoutEndChanging(oSwimLane,Operation)} /*Notifies your application once the control's layout has been changed.*/

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
76
Turn on the Undo/Redo feature

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowUndoRedo := .T.
		oSwimLane:Pools():Add(-154,-82,244,122)
		oElements := oSwimLane:Elements()
			oElements:Add("Item <b>1",-64,-64)
			oElements:Add("Item <b>2")
		oSwimLane:Links():Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
75
ImageSize property on 32 (specifies the size of control' icons/images/check-boxes/radio-buttons)

PROCEDURE OnAddElement(oSwimLane,Element)
	/*Element.ShowCheckBox = True*/

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oAppearance
	LOCAL oElement
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddElement := {|Element| OnAddElement(oSwimLane,Element)} /*A new element has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oSwimLane:ImageSize := 32
		oSwimLane:Font():Size := 16
		oSwimLane:ContextMenuFont():Size := 16
		oSwimLane:Images("gBJJgBAIDAAEg4AEEKAD/hz/EMNh8TIRNGwAjEZAEXjAojKAjMLjABhkaABAk0plUrlktl0vmExmUzmk1m03nE5nU7nk9miAoE+oVDolFo1HpFJpU5h8Sf9OqFNqUOqNUqdPq9VrFWrlbr1QpdhAFAkFis1ntFptVrtkrpszrNvmVxqk3uVtm1kmF3sdBvF/wGBmV+j9BYGHwWJulfxdax2NyFdx2JlV6l9Nw7AAGZymdz2Cy2GxErvWcz9ivlwyV21cuxugwktzGIzmvwtl0+53U5y0a0Wazmmyu/3dCyOMyXHx/J5nIr9q3uyqnBxFN3G46ma4vb7mD2Ng4nZze00fDkHC7t7us2rOX5tguetpHRlmz4HVqnXk1PjHO+CMPo9MBMC+j2vC8j7wS8cFNI4kBo05UIvfCT/NsnsApU+0Fqg/T+oy/kPxC0sEQfErKQK96+w28UWRI8UGvO8sTLS9r2PWmsMJTDTask3CsIbIEQRA3shOXEEAO/GclJ9" +;
		"FEKrrA8FRbKMXRIlb0JxCkjS1LMswhCcvuel0cv26cSMa8Ufx+2sQwhEUoSXOCjSbLcnxjKc7sdKUVyq28NtVI71P9P7JxtQEapjQ6fzfM8zPfNE2PhIsLL63E40slk5y7N89LcyU9SvMb3SdUc6VJLj5VLVLfO/PS9KzNFHUa/0XyBD0dxlS9cxhMlTRSoNXypPErWDPyfNS+MwprRNO0FD8wVVZ1AI08URwVRjtJ1WCn21QkkUrXVLVPQS/XIkFgTxT9iONZ9xVTdq+L1eKg3kkF6Upe68XtfV51/MtrVjBlwYFL1ev8y1/P6/lyzzYl02wntj0RVFmS1Qa+M5as93QxEUW9e993rfmQ2+vy65M/mL1lhl/2bj2ByVduMtNhCJT9hdz41nN14Ld12Z9UjfI/oUAaGseiw6+uFLLhcVabJOS5RqOE0BHlZ5VnEr5fOMs3st+aa/bbRzrJGV51Y0b0DbqaWXZD90hIsPbjWu52+6Wyadpe66hhO+P/Xi" +;
		"oW5rD8ZbrUZuVg6n1dsE/cXmewu1m9PVwnd35/nueXho/NaJzmjc61W76esuT77eG8pTquy9TwWH8LEzG8RDfFalx3Gcfvna9rvG/cptGLd9tuI6TZOP5Fiqi99vea+X4VRcBq/JZZtVQ9cwSs5lsXE372+a9z7PbfB3VVqHyvMctLto8uob6eV0m/cD6MN2v+T33t6sBut42vdv2bJ8a997x2maFJfK+qArbGJPEKE+1qTflMsIdW/GCJX17KcT6/czr/X+u1g29B7j/4BQfWkkx4zIHisjhPCmE0K4SwtXM+d4BvHRwNZOoBph9IJvPek9d40FoMJxf691jj2ywQQcHEWET4XJwkTszlVqm2GokewxtBT1DpQjRxDN0rUVDNKdC3lb6tzNOwh6upMSSYfv4YBCl/bsn9PxiFCEo7SI6Obc9HeOrnY8x4jtHtdpN4GRbaorhsbu18Pph5CiHymI0RpSXGJ/z2oUOxYxG858AyiI+bfJtuTcG5yelBJy" +;
		"T8okhqFd4a5yxL0rvulYtKCsZiWxWkc1s1cRoxxwhA31DLE0mR9l9HqX8fJgTDmFMVH0MIsRzVYnwnMi1dyzmhLt2kS2pxIiU62Wj5ptQGlSYFakLonTUJNLKaM5WzlffEkuFkk5wTrhVO2eE7G6lJhxFFYUZ55zmn0WuBCD4pzhirFCKkbomsOoIYmZx5p90LoYWGPdD5g0QmJRKYxbZ6zYoVQ2jVGylSak7KSkFH6RSjpHKFuU+YMyNo5SulkC6I0vonTCitMXPoEpVS2H5FQfEqp2R1opIgAEkJISYARTCukOhmPNI5Ex/wzGHUsicMwA1LHgQ90Y/KpoQHAD+pB/R4NzIaMAB9Xaw1gqaAOsh/A/ptIkWUfhGK1kZH8RgH5GqvgArqRmt4AAPrTroRofBGADkqr6Rmu4D7CEaHARiwpJrEEZsXXwlVjyMWRsaRqwdkLGNBABZmytmyMnaINZqyVpLR2ftKAAAdd6h2osbaskdiq4EZtgSmyNcbVW" +;
		"RJNXe3AA7REar3b0stlAAXBtoRmvJGLjEYAHUWsFcwCD/rnaop9aEICMAPdK5hT6xpeuzdOtAgKuJeGfdq6ggEbkTvAP+p9UCHXrvKkcgIA==")
		oAppearance := oSwimLane:VisualAppearance()
			oAppearance:Add(1,"gBFLBCJwBAEHhEJAAEhABfICg6AADACAxRDgMQBQKAAzQFAYbhkGCGAAGMZxRgmFgAQhFcZQSKUOQTDKMIziaQAGgkNQwCSLIwjNIsBxPFKVQChEYxSjKA40SJNUgyj6CCY+QLIE5PfQgAL9I6eJABCCSQKkYx0HScRiwPBIbAZAYhCZqaKhWgkKI/WBQIABRDVLx5ESiLRtKy7Mq2bpvXBcNxXHalaztO68LxvKyqHb5fJ/PpgL4YHgmC4NQ7EMRwF6rfbyfZ7Xg/ORPTijZ4sdzMHTzJyscx3HqfaBoOaZU5eMLceTUMofHIndxCcasPbsOatVqjG5sYjcGC3La9cz3Pq/bpuDCbMxuaK1TrYXr1TTrcofBDldAxXRKDxRDWVhLnYOw9i6XxzjuXprCaOoKB6EwbiCZZCGOdZYlcT4xHmbhMnwNxtn+G5bmqdZ7n4Pw/i+X5zm+dQ9g4CAFjsfAJheOI8HsDoWDWTB/lwSAQkmA5PEgRYoDyDwYFY" +;
		"FoFmGCBmBqBphDgRJ0gOTIYBGRB/lyRh0iSCZbjYWJzgWDwIjYLoLmMCJGDKDJjBgWgqG6YhyhGHRzA2aJ1mCABOAiOJvhCZBJBYRoRmSCQmEqEQimkAZgg8TZnDCV4UkmCUmBKZYJGYWoWCUUhiFMNZckNUh2GENoaGaGZmgmJhqhqZpGGIEx2GYIxSGGGJdggWJth2Z4JmYeoemeSZ2H6H4hGmQhihyTRHGYLg7CiCgmgqIpokoNoOiOaJ4jqAochqaZGgaCxpAoZoaiaaJqEmWIcGgShcnCJwqEqFoR3YOoFlgchflqNouiuawHmWSYqGkWZQhcatzmaOoumuSp2j6L5bBaKo0GQKRnGGCxqiyCwmkqMpsksNpOGUGI7A0ew1G0Rxlg0PptgsZuDG2Sx2l6N5tnYNZZjUDRXDCVo5l2FoymqOpukuNpujubwLjmWY5k0ZwxkaFxYlWdp6j6b5Lnafo/nABQdg2FxcUsY5BkmXAkmeQpckwNRrkKTh" +;
		"8CSHZBk4NwyC4KxxgMDwakOMZDn8GgwnGAo2C4cwthMcwmCcMoHBMHRehwTIghySYNksZwcH4HBMEsHx5hyPItiweYxnwSZEH4Mozn0fR+DMAo7EYJ50gkdZelKdNql2UgJn0GIukwH4HicQRai2GI4mSVpNl0dZGledgNgcYpYDWUx3FsOQi5YV5anaTY3G6W53A2RxylydxFjiaxEFCCgBBAQ==")
			oAppearance:Add(2,"gBFLBCJwBAEHhEJAAEhABcoFg6AADACAxRDgMQBQKAAzQFAYbhkGCGAAGMZxRgmFgAQhFcZQSKUOQTDKMIziaQAGgkNQwCSLIwjNIsBxPFKVQChEYxSjKA40SJNUgyj6CCY+QLIE5PfQgAL9I6eJABCCSQKkYx0HScRiwPBIbAZAYhCZqaKhWgkKI/WBQIABRDVLx5ESiLRtKy7Mq2bpvXBcNxXHalaztO68LxvKyqHb5fJ/PpgL4YHgmC4NQ7EMRwF6rfbyfZ7Xg/ORPTijZ4sdzMHTzJyscx3HqfaBoOaZU5eMLceTUMofHIndxCcasPbsLpOS5LNKsaxmWLYdhFdTxQi6LpvfA8BwXC6JY7heRYRbFbYxRjGNi1TS7G4nGKd5WGuL4UHwI4VkaYxii8V4pgQMgVBQdQ5iCTYGi8T4vlWbJ3nuPg+l+H5AlSCg6ByPBoE8Ap3jqYxhBido5g0OgOGOGI4CsSpCCAcgcAuEokiEN5NCKfJ9DyTRjnS" +;
		"cg1CEYxOBmBpPCgagdgcIZoHoGIFA4AxQkCAxKAgKBwgGSpIBCZhjF2E5UnQPQMiMCJBCIBwxkSQgsgo+JtDKT4ziiQw+k6EwAnsOgLnkHI+yCQ4iEuE4klkPhShEJBpAoPgymOMoaDgHBjFMBgyD0HYTiCZSZhIIIGC4ChiHSew5kwM5omILZPiOBI0hwZw5kodIdA+M4Uj4PxOmMSJ9DuTQzmyZgviceZagaHVfj4awwmaAh2GUIYmCOEZZDaDRDFGdwcg4EwyHMN4LBOaJbCoaZqgKH8qkMfIyD8DozDyfA7A0Coui0OpMmOZJdCsahKg6NooioChwmEMxLEoXJbDUTRXGSUgykyMgQG0GpPHMdI3D4TRCgSeQ0kmaw+lGNAtCOZJVCiT5DhyRQwAqMg0EoDBBGEGAsASC5yiSCw+k4Mp6lWNQuksTpRjMTxDGzJwGmGMpDDKXYTECSAxl6Q5olkK4PgMMIVkASRMBMBgzEkaZEjsNALhIZA6AeQB" +;
		"gk0ZJEgAAJ0CIAgODMNIsD6DRih9uYwFyAwfCUb5ijmbI+gwdxkk8MZMGeMpPCkDxzBiC5MHMPJLDSSROFMLIoBEQogEMFJPnENYQGgE4DCOaJfC7tYkhGTQ0kyWwykuXpMiyRpKjKR4wngM4JmOWJACCdYtHMWw+Eych4nINYLAEYA8AgdAEEsQZajaQoog4GxPiMVIolcdxNG8XZVkmNoRwWRVBlFeFEeAZQJgnFiHgHwcAhjhHgGMSI5xki2CyA4EQsA3i0HkBsLwKRFgAHcPkHopBJBcBeDUYI7xyDOHqKkWo2hLCsDIBIY4qQ5A8DoMMYwOAqCSBGKgU4yB2iDBwIgB4hxQgAAWNgBoAgsBdEcBUQ4sQ9A/HqD0JI8RpBzH2OYVgahLBHFiJQJweQiDhDUE4SAARQAzFsG0EQwA6AOWSBkFgVAIBCHeGERQFQiCQHeFkC4vkiB8DyB4F4QxVDvGMNEOQexMjlBeOAKQiQLgfDA7QEAaRiBdEkH8" +;
		"TI7AZiFBAGYBIABWjYBiGACioQ4C1A+AMMgWhfgxHgPsT4URIB0COKgPgjRwiAB8AYUArxBgCF6J4GY5hrAOCAPAAoGRRCsCIMEXATXfgAF8BMJwURuEQDgD4Q4OBoAeHGFgLIwQrC2D0JoSQ+QvhrHoSgQI8AbDFGID8C4Ah6BQAQAASACwgCYCMAUMARAvCKAiAMCAokeCKBEOAKgCBoDaHuMsEAqwJDiACDURg8R6gPCyDofYWAhgoDIJ4ZAuhoiGAYGgRoQw/A0GMMga4GwxiEDeIYYInATCDBQAoBAwAoDlA0KMBoVRGiDGwDQUYIRsgaGGDgM4LAwDWB8EcIA1APhjEgGQVwgRIgjFIIQHokgZA+CSEkLIKQSjHAwMsCwDAsAEB2ABTIwRwD6A8CMToSxkAxE4HYIw+BsgbBEDAHYBwojCBoIYFgXSjABE4MsHIbQWhlGILQS4UhvBdAUKEEwHgxDAAABQQQUAhgKHiDwE4JS4A7BGLQZwCR4g" +;
		"aBEMUYAqgKApHgGwVAIRNgvBMMQXImwZDtE4I8UIyAZCDCAE8AwrhgAdEEBACQLRCg4FEB4AYtA7CdEiPQMoJAMDNCkOMCAXAFDhH0D0Q4EgfAaGSK4NYzRUj9BuCgAgswOBjB4Fqpw8B2ADAwE4A4Qx2DAE6JIaQPQGhAGKBcIQ5B5gHByKIFARwADbAyKUfgdBKBBGyEcVIAB/ijHoIoSA0gdBNl+OATYERZgBGSDYWIWAUCEGKA4FAhR7CIBtYQGYZg4CMAiKEcAOwkBjHWE8Z4lQgA+DkBoTohwwCeAaMEEgBQCCABgHMRwQRhhMEWFQd4HwZgwDqFESItAbAGEANCpINAzANCCJkK4ah+heFYBURwsQrS2CsMYMoWGBhYDWI0EInQgiApXaOVI1QFDsC8MUNoMBMA1HMJga4eh+BeAWOgNNowGjYzCGAAwax+iJBeBVT4gxoBIAGFsJFBxgBiGKFkKQ7g5DFFQEcAo4AzDDACKEQQLgCiJDYB0M" +;
		"gRBCCQAgQEA==")
			oAppearance:Add(3,"gBFLBCJwBAEHhEJAAEhABQ4Fg6AADACAxRDgMQBQKAAzQFAYbhkGCGAAGMZxRgmFgAQhFcZQSKUOQTDKMIziaQAGgkNQwCSLIwjNIsBxPFKVQChEYxSjKA40SJNUgyj6CCY+QLIE5PfQgAL9I6eJABCCSQKkYx0HScRiwPBIbAZAYhCZqaKhWgkKI/WBQIABRDVLx5ESiLRtKy7Mq2bpvXBcNxXHalaztO68LxvKyqHb5fJ/PpgL4YHgmC4NQ7EMRwF6rfbyfZ7Xg/ORPTijZ4sdzMHTzJyscx3HqfaBoOaZU5eMLceTUMofHIndxCcasPbsLpOS5LNKsaxmWLYdhFdTxQi6LpvfA8BwXC6JY7heRYRbFbYxRjGNi1TS7G4nGKd5WGuL4UHwI4VkaYxii8V4pgQMgVBQdQ5iCTYGi8T4vlWbJ3nuPg+l+H5AlSCg6ByPBoE8Ap3jqYxhBido5g0OgOGOGI4CsSpCCAcgcAuEosiYN5NHMOJ+D4TpTnS" +;
		"eQ7CEY4uBmBpPhgagdgcIZoHibIEyUBJZDQIJShoCgcCAcoyAQOYYlcZJ1D0DxDCiQgwEiAZMHEMJLFKPJ9D2DoDnidQ4k+Y5QmKEROBkIhKD0JIZDIS4TGUCQuEeEJjnOIg8CuY4RkYNgwGMM5RllGpThDRYIGKZIpCkJFUH0PINyWcQ3CaaZCG+HBnEOTJhD8Tx4GoeQ/GcaZSHOH5nCmQhshoZhihYYwhiYA4RlkNoNEMUZ3ByDjwEsPxOnMaJ9DuDR6F6GYmCmKh0nANtMioP4Gg8aoSiIO5NhodociqaY6GaFYkEyOg8lsNRNTaUgykyMgQG0GpPiONJbD8DpDEyfA6k0KwOkWMQsGsAJU0SagwkoJQJDIPISCQCJTGSUwyGaM4KkmMgtksHpFjAZ4TGCBAbgaSpcksdhNAMIJHHsD5TjSWWMAMOpwjyLwbk6cAz0KRJiDkDYzESCwiggcgcgYIQwCIEINCMCITj6TVxkMXp2j0cQLlCTo7E2F4" +;
		"ymkMZdhMPJHDGHpLAyVg+k4UwrCCSIyByDJ8DuDY8CiWY0kiXAXC6QJwFKGIjCeJpjgyezjlyDw6klHx5myRoMGwZwbkcToTEiew4kwbQfEmUgPkOKJUD4DpTHSHQmgkXI/ASTA1g0XIEDMTBimyfI7jSLYHEiUoPk0Fw/kadAsHGao8A0A5smEMJ2mNyg5gzJZwDgCpChyIZVyIZwFCMJEPASRkBqE+IcHInRcDxA2H4bIsx0AtDsIBpwZwYicD6BscwDwUBgHCIYaIfgtiVH2O4WgUwJjEFeAEQA7y4hMCiBMS4aRdB9A4CYE4LxljyBMHcDItBxinDCLcTYmgejBFQ9UTg9gFBOEmAQTI7A4iZGMGkQAWQ7jYA2HIL8BRAjDG4HcCwARbjZHiNoDw1nLDnGyNINQ+wjCpBMEgcovQUgICQJEcgWRuBvAyJ4d4ugpCUAINcHogxIgnDiM4N4axzD3F2JMTY/hRqYF6FsWIxhYAGGoAALQYgYirBwBE" +;
		"BwpAjBEAAIEIYsA2gOHCMAGgXAACIDmMITAUgFABH0D0I4WwvhNFGMAOIvxRD2GKNcMA8gjAPDCPwBogRPAxA8PgRwZRICYDED8RAXQEghEAN8DIgwIBdB4JYWwMgtiQHoFQKAiRFguFKGwGQhglDsEOVwEQQRkCKBwOIHgSREDRBYHEXQcQdD7GIGARQHRxipBrMobgewDCUCADsEYWAzgMHKHQDQxxsDzA6EMfAeQHB4GQDkUYPA0iECiKoGgRhcDdA2GMQA8AOCjDSPgHI4QnApAKBICwHg1A+BcAwcYsgbjGGQNkCIgRsA6EcBEWANADjsB0B8YYzQQDIGSBcEYZBCCPEkFIHQSgkgZAwG4IwBAbAYGGAgL4Ch4g8BOCQAA2KKC0GcAke4AAXAFCoHkDw4xbBFEcJkE4JRSiEFeJYKQVRMgJHODwX4xAgC/AsIIZAeAHDRG0HYI40RKCLEGDUI4jAghwBWIceA+whCpHMFYZYOQxglDMHMBQGxYj" +;
		"VHiAoBIPgfgHGwPsHYJRSB6A0IERQLhCjJHMA4OQoAoCOACLYGYSx8DpBQIMWQdRnDRH+DsE4fB3CeAmM67kAAXBFEIDYDI7wLBtEoEIfYNwjiUGGJQYQMAjCHEAO0C4zxW29CoCgfIxR9AKA6J8BgUAIhDGMIoJ40hqgwCgKETgnBhhqCGI0AIqgZhGDANQDIlBDCRGkCoJISR0g1BSKQOgfAzBRG0DYHARh4DeDAOwANuw8ApCKKkYg/RPhjBsH0J4yg5hPGWN0GwFBHQBFaDoQIURljFAoB4GgzRVzbBECQFQRQoguHGHANwDRdCKy8CgSIGwhhoDYJYYI1giBICSAEgI=")
			oAppearance:Add(4,"gBFLBCJwBAEHhEJAAEhABUYCg6AADACAxRDgMQBQKAAzQFAYbhkGCGAAGMZxRgmFgAQhFcZQSKUOQTDKMIziYBYfgkMIgSbJUgDGAkRRdDSOYDmGQYDiCIoRShOMIjHLUXxtDaIZwhEAoJb+RgAUY/cTzaAEUwHHiTKInaCQShsFYJUJAdRURQ9EwvCIZBpEWwLChENQwWLCNj2TScBwjCyqbale45ViqdoDU5EUiXJJ8ZxnECfYyrGjaMpCeKBUrGYTVRBIMxLLSia5oeJqMrnBpNVrIUgXCAGFwHK6BcauXIIDp6XoWWRbAAWDpVVzNNC3YzkCIceADHKiXxmVz4JLdGZ1QTGID2XaYaxWK4oZjsVSc4KDHbETbHFi9Fo3NaaxGisew+GYc4HlCR5NAAAIIEkQJSGMOgdE4RhYDwJJsAaAYQgmPpolCWgSCiBJzjcEIAkQXIBm8d5UhOQgCDUIBDDJDhgggJgKgKYJIDSVoDk8KBFF4OohEMZgWDs" +;
		"YYDj4GoGmGSB2B6B5iAiBgYDsYRjGSbIJo4RgqDuIpIAoLoLmMCJGDKDJjJiLA7xqUAAgGTwYnYPoPmQCQGEKEJkEkFg9gGY44BoRoSmSSQ2EKEggHgRhShSZRJFYVoVmWCRmFKFAgGOTheheZgJgYYoYmYSYWGaF4lkMMJ0hqZpJjYbobmcCZGHKHJmjmJh0h2Z4JmYcIaE8WZ2H6H5oAoBoCiCaBKBYfdjGoJoKiKaJKDaDojmkChGgmIgpCoVoWiWaJZiSd4mmmSh2h6J5qAqBoiiiaY5iSeIpmqComiqKpqkqNouiuah6hqMIsmsSpWiuGhP1kOoumuSp2j6L5sAsBo54gKwWkaMZsgsJpKjKbJLDaRYxYWRpSjSbIZiSe41m2CxmlqNptksdpejebR5iSfI4m4S4W16boLiaao6m5fJ9jubwLkaco8m8S5WnaPZunuOp4j6b5Lnac4SA0PAGlgP4wEwFwGkGcIMCcCpCnCCxiA8NYAAmMJfkSbh" +;
		"FCcFpFnGDBnBqRpUhuEwTDeZ5lHCfw6HIQxLCaAxygyJwqgGcATE4FA6hWY4tjEAAQBAgIA==")
		oSwimLane:SetProperty("Background",70/*exCheckBoxState0*/,0x1000000)
		oSwimLane:SetProperty("Background",71/*exCheckBoxState1*/,0x2000000)
		oSwimLane:SetProperty("Background",72/*exCheckBoxState2*/,0x3000000)
		oSwimLane:SetProperty("Background",102/*exContextMenuSelBackColor*/,0x4000000)
		oSwimLane:SetProperty("Background",104/*exContextMenuSelForeColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 1,0,0 } )  , .F. ))
		oElements := oSwimLane:Elements()
			oElement := oElements:Add("Element Check 2")
				oElement:Checked := 1/*exChecked*/
				oElement:Pictures := "1,2"
		oSwimLane:Home()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
74
ImageSize property on 16 (default) (specifies the size of control' icons)

PROCEDURE OnAddElement(oSwimLane,Element)
	/*Element.ShowCheckBox = True*/

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddElement := {|Element| OnAddElement(oSwimLane,Element)} /*A new element has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oSwimLane:ImageSize := 16
		oSwimLane:Images("gBJJgBAIDAAEg4ACEKAD/hz/EMNh8TIRNGwAjEZAEXjAojJAjMLjABAAgjUYkUnlUrlktl0vmExmUzmk1m03nE5nU7nkrQCAntBoVDolFo1HoM/ADAplLptImdMYFOqdSqlXq1QrVbrlGpVWsFNrNdnNjsk7pQAtNroFnt0sh8Yr9iulTuNxs1Eu8OiT/vsnsNVutXlk/oGGtVKxGLxWNtsZtN8iUYuNvy0Zvd+xNYwdwvl4p870GCqc8vOeuVttmp1knyOayWVy+WzN/ze1wOElenm+12WUz/Bv2/3UyyWrzeutux2GSyGP2dQ33C1ur3GD3M4zUNzHdlWjq/E3nGzVpjWv4HA7fRy/Tv2IrN8rPW6nZ3ve7mUlfu20Z8acvQyb+vY9jasYoDwMm+LytVBDqKG3z8O3Cb8P+mkAuY9cCQ2uL4KaxDKvkp8RNLEjqugnrwQo/UWPzFyeQw5sNLZFENrI4kOqU66pw8uzmOKvTqNqjULJvGL1JO48GtT" +;
		"GsbLdEL3scxLlyiw8dQeoUVxdLTtyKmUjwGlslRPJsnK1HbAKbKCrsQo8uQk/CeP44iaR/ATnTNPLvyxPU+z9P9AUDQVBowiofJXQ6Oo+kKMpIkjztE4TKn4P6JowfgPnwD5/nAjB8AOeAPo0eAA1IAFH07UhAIMpYAVIYFHqBUhwVjV1S1EtQAHxW65V0AZwAeuQAnwB5gAPYViEDVhwAHTQBkCjB4gOhwDmCyhH0sACAg==")
		oElements := oSwimLane:Elements()
			oElement := oElements:Add("Element Check 2")
				oElement:Checked := 1/*exChecked*/
				oElement:Pictures := "1,2"
		oSwimLane:Home()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
73
We want to have option to start/end connectors at the middle of each side of the elements
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:ShowLinks := -1/*exShowLinks*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
72
How can I determine the position the user clicks within the element's boundaries (Click event)

PROCEDURE OnClick(oSwimLane)
	LOCAL X,Y,e
	e := oSwimLane:ElementFromPoint(-1,-1)
	X := -1
	Y := -1
	oSwimLane:PointToPosition(X,Y)
	DevOut( Transform(e,"") )
	DevOut( Transform(X,"") )
	DevOut( Transform(Y,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:Click := {|| OnClick(oSwimLane)} /*Occurs when the user presses and then releases the left mouse button over the control.*/

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElements:Add("Element 1")
			oElements:Add("Element 2",128,64)
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
71
How can I determine the position the user clicks within the element's boundaries (MouseMove event)

PROCEDURE OnMouseMove(oSwimLane,Button,Shift,X,Y)
	LOCAL e
	e := oSwimLane:ElementFromPoint(X,Y)
	oSwimLane:PointToPosition(X,Y)
	DevOut( Transform(e,"") )
	DevOut( Transform(X,"") )
	DevOut( Transform(Y,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:MouseMove := {|Button,Shift,X,Y| OnMouseMove(oSwimLane,Button,Shift,X,Y)} /*Occurs when the user moves the mouse.*/

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElements:Add("Element 1")
			oElements:Add("Element 2",128,64)
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
70
How can I convert the screen position (mouse) to surface position

PROCEDURE OnMouseMove(oSwimLane,Button,Shift,X,Y)
	DevOut( "Point " )
	DevOut( Transform(X,"") )
	DevOut( Transform(Y,"") )
	oSwimLane:PointToPosition(X,Y)
	DevOut( "Position " )
	DevOut( Transform(X,"") )
	DevOut( Transform(Y,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:MouseMove := {|Button,Shift,X,Y| OnMouseMove(oSwimLane,Button,Shift,X,Y)} /*Occurs when the user moves the mouse.*/

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
		oSwimLane:FitToClient()
		oSwimLane:AxisStyle := 192/*exLinesSolid*/
		oSwimLane:SetProperty("AxisColor",AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
69
Is is possible to show just the positive coordinates

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:Coord := 17/*exAllowPositiveOnly+exCartesian*/
		oSwimLane:SetProperty("AxisColor",AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
		oSwimLane:AxisStyle := 259/*exLinesThick+exLinesDot*/
		oSwimLane:ShowLinks := -1/*exShowLinks*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
68
Cartesian coordinates (positive coordinates are shown top-right to the origin)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:Coord := 1/*exCartesian*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
67
Default coordinates (positive coordinates are shown bottom-right to the origin)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:Coord := 0/*exDefCoord*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
66
Is it possible to customize the path of the links orthogonally similar with Microsoft Visio tool

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowLinkControlPoint := 31/*exOrthoArrange+exMiddleControlPoint+exControlPoint+exEndControlPoint+exStartControlPoint*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>1")
			oElements:Add("Element <sha ;;0>2",164,64)
			oElements:Add("Element <sha ;;0>3",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
		oSwimLane:Zoom := 200
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
65
Does your control supports OLE Drag and Drop
PROCEDURE OnOLEDragDrop(oSwimLane,Data,Effect,Button,Shift,X,Y)
	DevOut( Transform(Data,"") )
RETURN

PROCEDURE OnOLEStartDrag(oSwimLane,Data,AllowedEffects)
	/*Data.SetData("some data to drag")*/

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oElements
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:OLEDragDrop := {|Data,Effect,Button,Shift,X,Y| OnOLEDragDrop(oSwimLane,Data,Effect,Button,Shift,X,Y)} /*Occurs when a source component is dropped onto a target component when the source component determines that a drop can occur.*/
		oSwimLane:OLEStartDrag := {|Data,AllowedEffects| OnOLEStartDrag(oSwimLane,Data,AllowedEffects)} /*Occurs when the OLEDrag method is called.*/

		oSwimLane:BeginUpdate()
		oSwimLane:OLEDropMode := 1/*exOLEDropManual*/
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 2
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 1
		oElements := oSwimLane:Elements()
			oElement := oElements:Add("Click the Element wait for .5 second until + cursor is shown, to start <b>OLE Drag and Drop</b>")
				oElement:CaptionSingleLine := 0/*exCaptionWordWrap*/
				oElement:AutoSize := .F.
				oElement:X := -125
				oElement:Y := -105
				oElement:Width := 256
				oElement:Height := 56
			oElement1 := oElements:Add("Click the Element wait for .5 second until + cursor is shown, to start <b>OLE Drag and Drop</b>")
				oElement1:CaptionSingleLine := 0/*exCaptionWordWrap*/
				oElement1:AutoSize := .F.
				oElement1:X := -125
				oElement1:Width := 256
				oElement1:Height := 56
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
64
Is it possible to disable customizing the path of a specified link

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowLinkControlPoint := -1/*0xffffffe0+exOrthoArrange+exMiddleControlPoint+exControlPoint+exEndControlPoint+exStartControlPoint*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",164,64)
			oElements:Add("Element <sha ;;0>B",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2)):CustomPath := "0.5,0.25,0.5,.75"
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2)):CustomPath := "0.5,0.25,0.5,.75"
			oLink := oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
				oLink:ShowLinkType := 3/*exLinkRound*/
				oLink:StartPos := 0/*LeftAlignment*/
				oLink:SetProperty("Color",AutomationTranslateColor( GraMakeRGBColor  ( { 128,128,128 } )  , .F. ))
				oLink:AllowControlPoint := 0/*exNoControlPoint*/
		oSwimLane:Zoom := 200
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
63
How do I let user customizes the link's path

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowLinkControlPoint := -1/*0xffffffe0+exOrthoArrange+exMiddleControlPoint+exControlPoint+exEndControlPoint+exStartControlPoint*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",164,64)
			oElements:Add("Element <sha ;;0>B",0,132)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2)):CustomPath := "0.5,0.25,0.5,.75"
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(2)):CustomPath := "0.5,0.25,0.5,.75"
			oLink := oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(1))
				oLink:ShowLinkType := 3/*exLinkRound*/
				oLink:StartPos := 0/*LeftAlignment*/
		oSwimLane:Zoom := 200
		oSwimLane:FitToClient()
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
62
How can I generate a picture/image/graph from my diagram
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane
	LOCAL var_CopyTo

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
			oElements:Add("Element E"):ID := "E"
			oElements:Add("Element E"):ID := "F"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("E"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("F"))
		oSwimLane:SetProperty("DefArrange",4/*exDefArrangeCompact*/,.F.)
		oSwimLane:Arrange()
		var_CopyTo := oSwimLane:CopyTo("c:/temp/xtest.jpg")
		DevOut( "!!!check the file c:/temp/xtest.jpg!!!" )

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
61
How can I generate a picture/image/graph from my diagram
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oPrint
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
			oElements:Add("Element E"):ID := "E"
			oElements:Add("Element E"):ID := "F"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("E"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("F"))
		oSwimLane:SetProperty("DefArrange",4/*exDefArrangeCompact*/,.F.)
		oSwimLane:Arrange()
		oPrint := CreateObject("Exontrol.Print")
			oPrint:PrintExt := oSwimLane
			oPrint:CopyTo("c:/temp/xtest.jpg")
		DevOut( "!!!check the file c:/temp/xtest.jpg!!!" )

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
60
How can I print the component
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oElements
	LOCAL oPrint
	LOCAL oLink,oLink1,oLink2
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",0,76)
			oElement := oElements:Add("Element <sha ;;0>C",-76,32)
				oElement:AutoSize := .F.
				oElement:Height := 32
			oElement1 := oElements:Add("Element <sha ;;0>D",76,32)
				oElement1:AutoSize := .F.
				oElement1:Height := 32
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 1/*CenterAlignment*/
				oLink:EndPos := 1/*CenterAlignment*/
			oLink1 := oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(1))
				oLink1:StartPos := 1/*CenterAlignment*/
				oLink1:EndPos := 1/*CenterAlignment*/
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(4))
			oLink2 := oLinks:Add(oSwimLane:Elements:Item(4),oSwimLane:Elements:Item(3))
				oLink2:StartPos := 0/*LeftAlignment*/
				oLink2:EndPos := 2/*RightAlignment*/
		oPrint := CreateObject("Exontrol.Print")
			oPrint:PrintExt := oSwimLane
			oPrint:Preview()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
59
How can I show direct-links

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ShowLinksType := 1/*exLinkDirect*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B",128,64):ID := "B"
			oElements:Add("Element C",128,-64):ID := "C"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
58
How can I show straight-links

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ShowLinksType := 2/*exLinkStraight*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B",128,64):ID := "B"
			oElements:Add("Element C",128,-64):ID := "C"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
57
How can I show round-links

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ShowLinksType := 3/*exLinkRound*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B",128,64):ID := "B"
			oElements:Add("Element C",128,-64):ID := "C"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
56
I've tried to insert a "<br>" in the Caption property text and it just ignores it

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElement := oElements:Add("caption")
				oElement:CaptionSingleLine := 0/*exCaptionWordWrap*/
				oElement:Caption := "first caption<br>second caption<br>third caption"
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
55
How do I align the extra-caption

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElement := oElements:Add("caption")
				oElement:CaptionAlign := 0/*exTopLeft*/
				oElement:AutoSize := .F.
				oElement:Width := 128
				oElement:Height := 64
				oElement:ExtraCaption := "extra-caption"
				oElement:ExtraCaptionAlign := 34/*exBottomRight*/
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
54
How can I add an extra caption

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oElements := oSwimLane:Elements()
			oElements:Add("caption"):ExtraCaption := "extra-caption"
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
53
I am using the reserve-neighbors feature, the question is how to shift left/right the neighbors instead of up/down
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowMoveNeighbors := 2/*exMoveNeighborsHorizontally*/
		oSwimLane:SetProperty("DefArrange",0/*exDefArrangeDir*/,1)
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B ( move it )",16,32)
			oElements:Add("Element <sha ;;0>C",128,0)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
52
I am using the reserve-neighbors feature, the question is if possible to specify the distance between neighbors
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowMoveNeighbors := 1/*exMoveNeighborsVertically*/
		oSwimLane:SetProperty("DefArrange",1/*exDefArrangeDX*/,0)
		oSwimLane:SetProperty("DefArrange",2/*exDefArrangeDY*/,0)
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B ( move it )",0,32)
			oElements:Add("Element <sha ;;0>C",0,64)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
51
How do I enable the reserve-neighbors feature
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowMoveNeighbors := 1/*exMoveNeighborsVertically*/
		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B ( move it )",0,32)
			oElements:Add("Element <sha ;;0>C",0,64)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
50
I've noticed that recently, the elements get compacted once the Arrange method is performed. How can I prevent that

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
			oElements:Add("Element E"):ID := "E"
			oElements:Add("Element E"):ID := "F"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("E"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("F"))
		oSwimLane:SetProperty("DefArrange",4/*exDefArrangeCompact*/,.F.)
		oSwimLane:Arrange()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
49
How can I move an element to a specified lane/phase/pool

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:SetProperty("DefPoolHeaderCaptionFormat",.T.,"<fgcolor 808080>Faza <off -4><b><font ;6>%i")
		oSwimLane:SetProperty("DefPoolHeaderCaptionFormat",.F.,"<fgcolor 808080>Culoar <off -4><b><font ;6>%i")
		oPool := oSwimLane:Pools():Add(-100,-100,250,180)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 3
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 3
			oPool:Lane(1/*exLaneVertical*/):Children():Item(1):Header():Caption := "<fgcolor FF0000><b>NEW"
		oElement := oSwimLane:Elements():Add("element 1",200,200)
			oElement:SetProperty("LaneID",.T.,"0:H.0,0:V.0")
		oElement1 := oSwimLane:Elements():Add("element 2",200,200)
			oElement1:SetProperty("LaneID",.T.,"0:H.2,0:V.2")
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
48
Is it possible to add a link to show from bottom/down to top/up, rather that right to left (method-2)

PROCEDURE OnAddLink(oSwimLane,Link)

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddLink := {|Link| OnAddLink(oSwimLane,Link)} /*A new link has been added to the links collection.*/

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",48,48)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
47
Is it possible to add a link to show from bottom/down to top/up, rather that right to left (method-1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",48,48)
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 4/*DownAlignment*/
				oLink:EndPos := 3/*UpAlignment*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
46
How do I enable the cross link support ( mixed )

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oElements
	LOCAL oLink,oLink1,oLink2
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",0,76)
			oElement := oElements:Add("Element <sha ;;0>C",-76,32)
				oElement:AutoSize := .F.
				oElement:Height := 32
			oElement1 := oElements:Add("Element <sha ;;0>D",76,32)
				oElement1:AutoSize := .F.
				oElement1:Height := 32
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 1/*CenterAlignment*/
				oLink:EndPos := 1/*CenterAlignment*/
			oLink1 := oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(1))
				oLink1:StartPos := 1/*CenterAlignment*/
				oLink1:EndPos := 1/*CenterAlignment*/
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(4))
			oLink2 := oLinks:Add(oSwimLane:Elements:Item(4),oSwimLane:Elements:Item(3))
				oLink2:StartPos := 0/*LeftAlignment*/
				oLink2:EndPos := 2/*RightAlignment*/
		oSwimLane:ShowLinks := 97/*exShowCrossLinksMixt+exShowExtendedLinks*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
45
How do I enable the cross link support ( triangular )

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oElements
	LOCAL oLink,oLink1,oLink2
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",0,76)
			oElement := oElements:Add("Element <sha ;;0>C",-76,32)
				oElement:AutoSize := .F.
				oElement:Height := 32
			oElement1 := oElements:Add("Element <sha ;;0>D",76,32)
				oElement1:AutoSize := .F.
				oElement1:Height := 32
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 1/*CenterAlignment*/
				oLink:EndPos := 1/*CenterAlignment*/
			oLink1 := oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(1))
				oLink1:StartPos := 1/*CenterAlignment*/
				oLink1:EndPos := 1/*CenterAlignment*/
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(4))
			oLink2 := oLinks:Add(oSwimLane:Elements:Item(4),oSwimLane:Elements:Item(3))
				oLink2:StartPos := 0/*LeftAlignment*/
				oLink2:EndPos := 2/*RightAlignment*/
		oSwimLane:ShowLinks := 65/*exShowCrossLinksTriangle+exShowExtendedLinks*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
44
How do I enable the cross link support ( rectangular )

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement,oElement1
	LOCAL oElements
	LOCAL oLink,oLink1,oLink2
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",0,76)
			oElement := oElements:Add("Element <sha ;;0>C",-76,32)
				oElement:AutoSize := .F.
				oElement:Height := 32
			oElement1 := oElements:Add("Element <sha ;;0>D",76,32)
				oElement1:AutoSize := .F.
				oElement1:Height := 32
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 1/*CenterAlignment*/
				oLink:EndPos := 1/*CenterAlignment*/
			oLink1 := oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(1))
				oLink1:StartPos := 1/*CenterAlignment*/
				oLink1:EndPos := 1/*CenterAlignment*/
			oLinks:Add(oSwimLane:Elements:Item(3),oSwimLane:Elements:Item(4))
			oLink2 := oLinks:Add(oSwimLane:Elements:Item(4),oSwimLane:Elements:Item(3))
				oLink2:StartPos := 0/*LeftAlignment*/
				oLink2:EndPos := 2/*RightAlignment*/
		oSwimLane:ShowLinks := 33/*exShowCrossLinksRect+exShowExtendedLinks*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
43
How do I show a link frmo bottom to top, or reverse, not from left to right

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLink
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",0,64)
		oLinks := oSwimLane:Links()
			oLink := oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
				oLink:StartPos := 1/*CenterAlignment*/
				oLink:EndPos := 1/*CenterAlignment*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
42
Is it possible to control the links, so that they are always centered

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
		oSwimLane:ShowLinks := -1/*exShowLinks*/
		oSwimLane:SetProperty("DefArrange",0/*exDefArrangeDir*/,1)
		oSwimLane:Arrange()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
41
What options to align the elements do I have if I use Arrange method

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane
	LOCAL h1,h2,h3

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:ShowGridLines := .T.
		oElements := oSwimLane:Elements()
			h1 := oElements:Add("Top Alignment"):ID()
			oElements:Add("Element")
			oElements:Add("Element")
			oElements:Add("Element")
			h2 := oElements:Add("Center Alignment",,96):ID()
			oElements:Add("Element",,96)
			oElements:Add("Element",,96)
			oElements:Add("Element",,96)
			h3 := oElements:Add("Bottom Alignment",,178):ID()
			oElements:Add("Element",,192)
			oElements:Add("Element",,192)
			oElements:Add("Element",,192)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(3))
			oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(4))
			oLinks:Add(oSwimLane:Elements:Item(2),oSwimLane:Elements:Item(3))
			oLinks:Add(oSwimLane:Elements:Item(5),oSwimLane:Elements:Item(6))
			oLinks:Add(oSwimLane:Elements:Item(5),oSwimLane:Elements:Item(7))
			oLinks:Add(oSwimLane:Elements:Item(6),oSwimLane:Elements:Item(8))
			oLinks:Add(oSwimLane:Elements:Item(6),oSwimLane:Elements:Item(7))
			oLinks:Add(oSwimLane:Elements:Item(9),oSwimLane:Elements:Item(10))
			oLinks:Add(oSwimLane:Elements:Item(9),oSwimLane:Elements:Item(11))
			oLinks:Add(oSwimLane:Elements:Item(10),oSwimLane:Elements:Item(12))
			oLinks:Add(oSwimLane:Elements:Item(10),oSwimLane:Elements:Item(11))
		oSwimLane:SetProperty("DefArrange",3/*exDefArrangeAlign*/,0)
		oSwimLane:Arrange(h1)
		oSwimLane:SetProperty("DefArrange",3/*exDefArrangeAlign*/,1)
		oSwimLane:Arrange(h2)
		oSwimLane:SetProperty("DefArrange",3/*exDefArrangeAlign*/,2)
		oSwimLane:Arrange(h3)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
40
Is there an auto-arrange feature that will display the flow-chart centered and zoomed correctly after we are finished building it

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
		oSwimLane:Arrange()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
39
Is it possible to change the distance between elements, when calling the Arrange method

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
		oSwimLane:SetProperty("DefArrange",1/*exDefArrangeDX*/,0)
		oSwimLane:SetProperty("DefArrange",2/*exDefArrangeDY*/,0)
		oSwimLane:Arrange()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
38
How do I organize vertically the elements

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element A"):ID := "A"
			oElements:Add("Element B"):ID := "B"
			oElements:Add("Element C"):ID := "C"
			oElements:Add("Element D"):ID := "D"
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("B"))
			oLinks:Add(oSwimLane:Elements:Item("A"),oSwimLane:Elements:Item("C"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("D"))
			oLinks:Add(oSwimLane:Elements:Item("B"),oSwimLane:Elements:Item("C"))
		oSwimLane:ShowLinksType := 2/*exLinkStraight*/
		oSwimLane:SetProperty("DefArrange",0/*exDefArrangeDir*/,1)
		oSwimLane:Arrange()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
37
How can I add programatically a link

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",96,24)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
36
How do I get the link from the cursor
PROCEDURE OnMouseMove(oSwimLane,Button,Shift,X,Y)
	LOCAL l
	l := oSwimLane:LinkFromPoint(-1,-1)
	DevOut( Transform(l,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:MouseMove := {|Button,Shift,X,Y| OnMouseMove(oSwimLane,Button,Shift,X,Y)} /*Occurs when the user moves the mouse.*/

		oElements := oSwimLane:Elements()
			oElements:Add("Element <sha ;;0>A")
			oElements:Add("Element <sha ;;0>B",96,24)
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(2))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
35
Is there a way to create a link which has the same start and end element

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElements
	LOCAL oLinks
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oElements := oSwimLane:Elements()
			oElements:Add("Element")
		oLinks := oSwimLane:Links()
			oLinks:Add(oSwimLane:Elements:Item(1),oSwimLane:Elements:Item(1))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
34
How can I show the pool's caption not-rotated or mirrored

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowDesignHeader := 4/*exDesignHeaderSingle*/
		oPool := oSwimLane:Pools():Add(-150,-150,300,150)
			oPool:HeaderCaptionSupportRotate := .F.
			oPool:SetProperty("HeaderSize",0/*exHeaderLeft*/,48)
			oPool:SetProperty("HeaderSize",2/*exHeaderRight*/,48)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 3
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
33
How can I prevent creating sub-lanes or sub-phases

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:AllowDesignHeader := 4/*exDesignHeaderSingle*/
		oPool := oSwimLane:Pools():Add(-150,-150,300,150)
			oPool:SetProperty("HeaderSize",0/*exHeaderLeft*/,32)
			oPool:SetProperty("HeaderSize",2/*exHeaderRight*/,32)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 3
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
32
How do I show a complete frame/border around the header

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLanes
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-150,-150,300,150)
			oPool:SetProperty("HeaderSize",1/*exHeaderTop*/,32)
			oPool:SetProperty("HeaderSize",3/*exHeaderBottom*/,32)
			oLanes := oPool:Lane(1/*exLaneVertical*/):Children()
				oLanes:Count := 3
				oLanes:Item(1):Header():Pattern():Type := 768/*exPatternFrameThick*/
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
31
How do I show a complete frame/border around the lane

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLanes
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-150,-150,300,150)
			oPool:SetProperty("HeaderSize",1/*exHeaderTop*/,32)
			oPool:SetProperty("HeaderSize",3/*exHeaderBottom*/,32)
			oLanes := oPool:Lane(1/*exLaneVertical*/):Children()
				oLanes:Count := 3
				oLanes:Item(1):Pattern():Type := 768/*exPatternFrameThick*/
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
30
How can I define sub-lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLanes
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-150,-150,300,250)
			oPool:SetProperty("HeaderSize",1/*exHeaderTop*/,32)
			oPool:SetProperty("HeaderSize",3/*exHeaderBottom*/,32)
			oLanes := oPool:Lane(1/*exLaneVertical*/):Children()
				oLanes:Count := 3
				oLanes:Item(1):Children():Count := 2
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
29
How can I add default lanes when the user creates a new pool
PROCEDURE OnAddPool(oSwimLane,Pool)
	/*Pool.HeaderSize(1) = 24*/
	/*Pool.HeaderVisible(0) = False*/
	/*Pool.HeaderVisible(1) = True*/
	/*Pool.HeaderVisible(2) = False*/
	/*Pool.HeaderVisible(3) = False*/
	/*Pool.Lane(1).Children.Count = 2*/

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddPool := {|Pool| OnAddPool(oSwimLane,Pool)} /*A new pool has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oSwimLane:Pools():Add(-100,-100,250,250)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
28
How do I prevent showing headers when the user creates new pools

PROCEDURE OnAddPool(oSwimLane,Pool)

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddPool := {|Pool| OnAddPool(oSwimLane,Pool)} /*A new pool has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oSwimLane:Pools():Add(-100,-100,250,250):Lane(0/*exLaneHorizontal*/):Children():Count := 3
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
27
How can I display icons on headers

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLanes
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:Images("gBJJgBAIDAAGAAEAAQhYAf8Pf4hh0QihCJo2AEZjQAjEZFEaIEaEEaAIAkcbk0olUrlktl0vmExmUzmk1m03nE5nU7nk9n0/oFBoVDolFo1HpFJpVLplNp1PqFRqVTqlVq1XrFZrVbrldr1fsFhsVjslls1ntFptVrtltt1vuFxuVzul1u13vF5vV7vl9v1/wGBwWDwmFw2HxGJxWLxmNx0xiFdyOTh8Tf9ZymXx+QytcyNgz8r0OblWjyWds+m0ka1Vf1ta1+r1mos2xrG2xeZ0+a0W0qOx3GO4NV3WeyvD2XJ5XL5nN51aiw+lfSj0gkUkAEllHanHI5j/cHg8EZf7w8vl8j4f/qfEZeB09/vjLAB30+kZQAP/P5/H6/yNAOAEAwCjMBwFAEDwJBMDwLBYAP2/8Hv8/gAGAD8LQs9w/nhDY/oygIA=")
		oPool := oSwimLane:Pools():Add(-100,-100,250,250)
			oPool:SetProperty("HeaderVisible",0/*exHeaderLeft*/,.F.)
			oPool:SetProperty("HeaderVisible",2/*exHeaderRight*/,.F.)
			oPool:SetProperty("HeaderVisible",3/*exHeaderBottom*/,.F.)
			oPool:SetProperty("HeaderSize",1/*exHeaderTop*/,24)
			oLanes := oPool:Lane(1/*exLaneVertical*/):Children()
				oLanes:Count := 3
				oLanes:Item(0):Header():Caption := "<img>1</img> A"
				oLanes:Item(1):Header():Caption := "<img>2</img> B"
				oLanes:Item(2):Header():Caption := "<img>3</img> C"
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
26
How do I change the Lane and Phase strings being displayed on the lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:SetProperty("DefPoolHeaderCaptionFormat",.T.,"<fgcolor 808080>Faza <off -4><b><font ;6>%i")
		oSwimLane:SetProperty("DefPoolHeaderCaptionFormat",.F.,"<fgcolor 808080>Culoar <off -4><b><font ;6>%i")
		oPool := oSwimLane:Pools():Add(-100,-100,250,250)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 3
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 3
			oPool:Lane(1/*exLaneVertical*/):Children():Item(1):Header():Caption := "<fgcolor FF0000><b>NEW"
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
25
How can I enlarge the node while AutoSize property is True (method 2)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oElement := oSwimLane:Elements():Add("Element",0,0):CallMethod("Copy",)
			oElement:Caption := "Enlarged Element"
			oElement:InflateSize := 16

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
24
How can I enlarge the node while AutoSize property is True (method 1)

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oElement := oSwimLane:Elements():Add("Element",0,0):CallMethod("Copy",)
			oElement:Caption := "Enlarged Element"
			oElement:SetProperty("Padding",-1/*exPaddingAll*/,16)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
23
How can I get the lane of the element

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oSwimLane
	LOCAL lane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oSwimLane:Pools():Add(-150,-150,500,250):Lane(0/*exLaneHorizontal*/):Children():Count := 3
		oElement := oSwimLane:Elements():Add("Element")
			oElement:CenterOnLane(.F.)
			lane := oElement:LaneID(.F.)
			DevOut( oSwimLane:LaneByID(lane):Header():Caption() )
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
22
How can I define a different shape for elements

PROCEDURE OnAddElement(oSwimLane,Element)

RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oAppearance
	LOCAL oElement,oElement1,oElement2,oElement3,oElement4
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:AddElement := {|Element| OnAddElement(oSwimLane,Element)} /*A new element has been added to the surface.*/

		oSwimLane:BeginUpdate()
		oAppearance := oSwimLane:VisualAppearance()
			oAppearance:Add(1,"gBFLBCJwBAEHhEJAAChABAQDg6AADACAxRDQNABQKAAzQFAYahuHKGAAGEaBYgmFgAQhFcZQSKUOQTDKMIziYBYJhEMQwDiAUIjIK8IhkGIcZAGIBJCjWGodQLOEgwHIERQjEyUJAGGYqEjaO41SpAdI0PCxUScACnDQiegJRgmQ4cTJSchSAKENx1JaeYReewwAqNd5TRwNIiydZUIhqGC1YRte4ZWiCWoJVzSVDLfbgAT4X60IIlCi5Mi6MIgDZJFDUNLUdRBMKNJ7qagaWoWOaQRbmAQQTRYLQ/TiEXZDQRAAyLJIWVRQWTAAKVbw1LiEcznGCcejzIIDaZpOh4DplWzTOgALjta4IRpvNwAbIAF4gBqsLyXXLcdQyORMiwbxZgSDhgnQbJFC6F5JhECA8CADwIgMeQnmoQJlh0eAfGcXYZjwccOHiWx/moAJ6jed4DC2dJnnmQRxBcKABBoWAcHULZLHyV4mmGOx0FmdpZAMAgQhEQBpBiRxBlQ" +;
		"cgZFUdAMEYAxQDECBNgaUYglkCQKBGZANk0QgBgQXAQgcGI0FwJAHA6WI+DGDAjCiVg0g2Yw4mYNg7E0eJ1H+DpkAiYhBg6JApBYRMvDkJhGhKJIImEA4QledZ8H+FJlEEQhWBAJa8loRoCgkdhYBAExZHQKIXmUYRCFQI5mgWfZ4hMJpJC4boTGcCY0m0QJVBAIh2EIZZ5H4VIVAqeZ1H8M5oAmSg7g8TR1n4fQrmUQZCgqF5eEmYhYBgKQJiCD4PmaegKhWJZnAQDZkhqaYKFocYnGadZ8h+KJoiGQhfEIURAmKEAYAgeo1H8OZrAoeoyhGKYngaHInmuCpOjmKAkHMHo+iiSZxmKQoXkGCwWigRQlnqLh7jKSh7DYUYzm0CgAk+DIrFCAo3i6LYKnKWYuk6Wp4keKIqDsLh7BYLhJmaZo5mcYAijAOZtFsXpajubZLG6co8CSShtnYeJrGeVpzjwbxLnafI/mcK5ZnmPgtGuap+j6cIMB8CocDAK4" +;
		"3AaQAwjwJwQkSaZsDcBI7jETBHBqRhxkibwWkCMQsgcG5Ii2TB+nkN5yEyJwjkqcJMh8DpKDKTIrB2TBmnyGwFkwMw8mcMpOmQbJbBiTwziyUxBDsc5sD8QJRnQKprEWTg0g0DxNlKMpsF8RpSHUTQ7BuUp0n0VxZi4MxrDSJ40DYDYHGKWJ2E2FxmyADYnGqMRBgeYh0FOLh9kccpcncJsVw7RdjvA2M4eovRmCSFkMwQIoAQEBA")
			oAppearance:Add(2,"gBFLBCJwBAEHhEJAAChABAIDg6AADACAxRDQNABQKAAzQFAYaBmG6GAAGEaBYgmFgAQhFcZQSKUOQTDKMIziYBYJhEMQ1DAAUIjKLMIhmGAYJAGIBJCjWGodQLOEgwHIERQjEyUpIyVAkYw5HqNaQjICoJoSOwAU47IaCIAFJSpCygKKgSjhRpoAAyU5IUgVPC4XSbD6zYDqapaTheEQyDSJNr3DCMUTlFYYLrmaQKMhqZJhWjbFSWXUpJ4pSrLMIyfTwZRJGzIK7jabLIjaP6GUDhVaYbRUL46CiEb5AAJsVpCCZrYRJOYVdQeDYbQCNLDhHQIDqaA6kZRAdQ2bpMBznPSvbovDgLWhGYqhbLCNibRC+d4HNrCYIlCjpMw3CYGIOHOMRsm0OxFjSZppneHQNFcSwRAOaprjqY4dgYe4VgGWwADucRuHYCpdByYROH8AAOC8D4NgEXwYBWEZyGAWoHg2MRCECBAkFAGhGDGUB1ByBhQkUIAPgCRAMEI" +;
		"ExhIuNhCEKBAlnAcwQgAYQXAIIRWEUFwJAGQ42CiCoihiLgugsYwDjSZ4MkICJWCaDZjgiZg6EIQQInSV4PmKeIyEKEBkBQDhEgwZBzjSd4SlEQJgk+E5khkRhIhSZA5FIUoVGWCQkl+FpkliTJnhXSYaFaGJOlEIhmC2ZoJgIZIaiWGYuG62IpDyT4TGSM5eGyCpmCnPIcCeQg+H6HZmnoAh6iAaBDjSL4hkUCgmgKHhlHmeIPh8BwKAqEohGkOgOHCI4pAmMoMhUKByj6CQUCkWoGhSKJpGkJoQiOJR6G4cYTmcSQuiKKRqEqPovhmBIJiCN4YEACQGFsN5lliToyiwbAKkKQoSGcWQ2HKERrhiJJvjLUR8leL5sDsBpQiUZZpDaO4eAACZWh+LYtDsSpejQbmJnIEAuEsLJvECRgLiSH46m2W4Gl+OxpFqWo0ECSR7lQaI9m8C4+nqO4uAIHp+B4MAJmcAAeC+YgenmPwwHwHInkKRYMDaWIQGmeh" +;
		"3AmPpxDsCJHkWbhBAIdZDmMGZXBmRZMHwVwikUIwam0MAMC4awiEmOYyHsXwkkIMp5jMLBMDKaRiiqEBsmkNwpkwc5MyiHRrEKfxCiobIaFsQgvmsTBvD2SJuAwNBYkKSh6GsRYbDUDQ7EyVZmEwDwFiKdQ6BQf5XnYDRjD6IIujIfppBgKRcl6BZZnYXYLBWLYpn0KpglqLAtAIZoOneBsZw9RJjnQ+AYQAgCAg=")
			oAppearance:Add(3,"gBFLBCJwBAEHhEJAAChABQsMACAADACAxRDQNABQKAAzQFAYawLBgABhGUZoJhUAIIRZGMIjFDcEwxC6NIpAWCYQgUNQCQiNAzxAKQchhD4ZAIkGY4ZhyA42SBAcbyDCEShoGqPRhmCg5UjmM4oQLSFDULC0fSBBIYaSGEY5QoqIYfArGQYQTRUPyUdoOBIACwLChWLA1CTZdowSKoYTXBq3IgqerIapmSYaV7YNh3VY1IR/JSVJYlaYJDoyNI4ThHc5xVLtfSfAiiJrxOKcTAAFJ0QKFUbRUz+OgBTpvaZxagaSpSG5WRpWEI5PAdN4zTa7YDsS67FiSG5oWpEFq2eAGdzlVLMMqhG5gAxqNKzbLfMCXfJIbyrBIcYLoXItCqFYskMTwxlgAY+haFZRlQZQ4HwHR3AoMx5jEch2lMfZGl8eY+jYXBvBsAAHFeRQDmuRR8nsSI2CoEgIEIRQBiQYwdAcUZIGUUIQhGGAGECRAhDYChGFERAMCgQheEc" +;
		"GQgHkEAwkICx2BCFoAj+B5iAiBgigiYhIgid4JkIQBwm2ChijiKgsguYpokYLYMmKQIiDYDgjgEAg6g6Y5InYPoPmOIAiEKEJFgkFIvhGYwIlIMoSTmAhOGgJJJC4UoSiUSIcncKZlp8WoOAOAxeF6FBlEkNhPGcZgJhYU4ZiMMweGoDAmkGfhuhWJoJDgIIUCYeZWGGHYkhkWhuB+ZYhEIcIUmcKZSHeIJmgoFgyCeaIBgKCoYCgGYSHiI5oEoQgsiKBgKCCH4SOAfoGiQaZKPmJ5jGCIJniiZgpk6DonGkKomgOHpnjqFoCiaawKioSYXg0eoGi6KZrBqIo6hgEIal6GosiwCpuDIBgsEqDJniYa4bVuFYkDqepKjCLQJiiR4XCyawGk+JpGgsZIXjabRbEKV4disSYwDCH5OlsIpWjmaA5HKUomCYOp+l6OgkhoUoWiMLpbH6bw7G0KRynOHYuGuXobhWB4MAaaoaimO52naB4hnkYInhERYLBAGA" +;
		"hnECw+H2BwhkmSg7kMMIqHyb49hAECAg=")
			oAppearance:Add(4,"gBFLBCJwBAEHhEJAAChABOIDg6AADACAxRDQNABQKAAzQFAYaBqGCGAAGEZRSgmFgAQhFcZQTCsBw7DCEYxjOAwFgmEQxDIOIBQSKYcwiGQaRrkIYgEiONoaR7HchSFIcIxPFKRBhkKYocjyG5GRoBcIyXAcRSYAB2Q4ESoKShePw5UDTcCzHR8RxEDKNRLpOQbDgOUZTWbVUaDKIsXzZCKHbZhG4YRp6CZKRpYEB1bYtKTRKqLKrpeTbOoSHolTbiIATTYlG4THyEZQrDIaDjOSIXZaGFzwSDWGgBJ60bRwHIaAxGWoHRxfEZVfBONQHMSBc5xa64JyHAImWrcUbWfaYYZ0AC6MRkK8cXABPQANixKZsCizE4DDbTYzjRheC2F4nnEOJRG0BRXEWOICEocByiyCJTiQOJVGYIQ8gofpDgsG5uF+ah6D2Xp+GGP5gkCfwRHofwOnuSB2heVpZnIUZQhAIQJBQBoRgwdAdEcIYVEIQhGGAMQDBCBJYEU" +;
		"GgNhCEMcHsXIkCIAAMIILQWAkAZDjYJIJiIWIeCqCRMHiNI/guYwIkYMoMmMSJWDaDZjgiTIzg6Yo4iIPoPGIdAmECChiFKXhGAQJIAmISgQCSSQ2E6E5lAkRhShSZRJFQOoVkCaRkAqFpQhIPhehCY54hYQoRCOYo+GaExOnmJhghqZhJjIYYbmaaJ0l+HJkiCYgtDGY5RkIegfmeSY6GOD4MnoBh1D2aBJkYbYhmcCgigaIhOloEJ3h0aATD4bgWCkQoehaGAnniHhNgwKI6HaConmiSYCF4I5niGQoLDmaoAiKKoaE6eJ2H+HZnFoeohigKwqCwGItmqA4ejIHgrkIHo+iuEA4h6PGMmIHo1i0LIKk6SoMCSWwcm2LAkisAAAgmQgLFYcw3myaxmkmG4GgsdIXjebYjjaVQIC0eQFAONADguBpqjaaIKlwGIuG4GwOkWOYAAqDoljqbIrmIJ41m4O5iGYK5FAwBp0ikag7mqbI+GoCwyEyPgpBCQw" +;
		"Oj0KRBGKFgpnAbAjXWMQ8EaeIuG6a5SHWHZxFyBoIjEbA8FQCJJmiZAmmOORwHyCwXgkbwqn8LYoDKOZNAmJpinyOzTm8aZrBWH5QhGAxCCedBMm8L5Fi+fAEFCPgvksVp0h8NQBn8RpLi7NQKBALxLHyF43EaDRPDOMoxkqXp4kYaRLlMTQIDWbQeguR5iluBxCBgNBCH6dIJnaSZjF+LQZgGQSh5DOFEa4dQsi5GILsaA8ReBuHoEYZ4ZwkDFFwJEYo2grjcHOFUAoFA7gJFqFEDYrQyilC+PwNgyRBBLH4C8FIzxiD8CeBYEgUQ9CtAiEwYgtQyDqDWPUTjBhXBrCmAcKoJQ6iGF6DEMA8BpieA4BgMQdxDg9GSOkLQgRCjhHiDMV4Ewfh3AoGULIiBujRAuJ0c4+gEi4ASOkRAfhWgjCKKEFACCAg")
			oAppearance:Add(5,"gBFLBCJwBAEHhEJAAChABGgDg6AADACAxRDQNABQKAAzQFAYZBwGiGAAGEaRWgmFgAQhFcZQSKUOQTDKMIziYBYJAKCQ3DTJUBjIKcIhiGsgAzAJIUaw1DqGY7nKZoRioAIoSAMM7DCKUQSLGyQZqBSCQGjsAI+OyHAiABSNJwtHygIRoKqqHg2PoiSAEUZhdRlHShKSqLQiaIRSDUJZsW5EIyjBZ8EznOqbJApOKrCgOTYaWbUdSxPTEUwTFiXJgmKRKIoiOAAY7IEgSFLsThrIKha5yDI4bxyAwXQjeYABbY0E4HQarcqzCrKGp/HYJXyAGgQHYkB5JAaQMBtGpoJrCeKQXDdVyXFwdET1BLZQA2HeUTTRVCScqnaTMZh8DgGxniKfYbngAxFkmVJAnSdougwDhRlMGZ1GEPR9HQapDGWWhyCMe4ugQDx9naYRvm6cQfAUJ47m8cofBYAZOGCHg2mETgCBCERAGkGJHEGVByBkUwUCSIgChAMQIE2" +;
		"BJRiQVQDAoEIWlWIxOgGBBcGyBQYlQXAkAcDpYh4KYKCKKI2CyC5ijONJvgySZ4lQWINkKCJmCWDpjkQaJPg+UA4joMYQiQI4eEYHAkgAYhKBgJJCh43JlAkEgwhSJA5E4VoVE6UQCFoL5lkkBhXhUCR5gYOQKAieYUneGZlEmJhfhqZYJFIWgQCWQp+F6GxigmHJ3BoJ4JmYMw7maKZSH6HxoAiQhvhwZ1VHYFAogmBIXiAZ55jKDIQgeChGG+G5BAoVJHiWaBYkIecznoOoeiMZYCj6IoYmcGhckeCophONoKh4aZagKLYrGkEZggeLJkCmThGDmZg5m6L4nmuOoCHaGJNnsBooAAIopCAcIZEiep2kqLwpnqCIviIBQLA4dolEECZakuK4sksYhYAgLZLOsQJLHuBBIjibR7haWYfGwawhAOJpmBuGpajuJRJkYbxAmgORynCOZvgqApejcAgIG4OYUA0e5em+PhokQXhKAYKx8AsCo+FEcJDA6D5" +;
		"MnwLwDkTWJulQQJuDEIphC2cQsHYbJEDCYJBAOLBrDIHwekUMBIiITgpmMcRhAOKYDgyRwnkyYwMjcK4cnAfAnCmSgzkoGhnkGZ45k6SIxjMTPIFCZOZEKSBxA0Fpui2b5LFoKIqGoaY/FKUY1gmdpQjOKxbBIV4zi0DQ6nmOhmFkUophCLILEMV5YiWCZkH+W5nl2HxfiiMwQmMTZOmqLhaLsx9iUH6JAMI1hCDjECFQawhghjBG2DseoGQzhNHwDwTAMAsgTEeCUZI1Q5jFHyLodYmWxB8GsPEVIPwxhSD6Awb4dgJD2HsAQQIoAQEB")
		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oElements := oSwimLane:Elements()
			oElements:Add("Rectangular",0,0):Shape := 0/*exShapeRectangular*/
			oElements:Add("Round",82,0):Shape := 1/*exShapeRound*/
			oElements:Add("Rhomb",138,0):Shape := 2/*exShapeRhomb*/
			oElements:Add("Circle",196,0):Shape := 3/*exShapeCircle*/
			oElement := oElements:Add("EBN 1",0,36)
				oElement:SetProperty("BackColor",0x1000000)
				oElement:Border := -1/*exNoLines*/
			oElement1 := oElements:Add("EBN 2",54,36)
				oElement1:SetProperty("BackColor",0x2000000)
				oElement1:Border := -1/*exNoLines*/
			oElement2 := oElements:Add("EBN 3",108,36)
				oElement2:SetProperty("BackColor",0x3000000)
				oElement2:Border := -1/*exNoLines*/
			oElement3 := oElements:Add("EBN 4   ",160,36)
				oElement3:SetProperty("BackColor",0x4000000)
				oElement3:Border := -1/*exNoLines*/
			oElement4 := oElements:Add("EBN 5 ",220,36)
				oElement4:SetProperty("BackColor",0x5000000)
				oElement4:MinHeight := 64
				oElement4:MinWidth := 64
				oElement4:Border := -1/*exNoLines*/
		oSwimLane:SetProperty("ScrollPos",.F.,-160)
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
21
Is it possible to add an inner control on the surface

PROCEDURE OnOleEvent(oSwimLane,Element,Ev)
	DevOut( Transform(Ev,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oElement
	LOCAL oElements
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:OleEvent := {|Element,Ev| OnOleEvent(oSwimLane,Element,Ev)} /*Occurs once an inside control fires an event.*/

		oElements := oSwimLane:Elements()
			oElement := oElements:Add("activex hosting")
				oElement:Type := 2/*exElementHostControl*/
				oElement:Control := "Forms.CommandButton.1"
				oElement:Caption := "Command Button"
				oElement:Height := 64
				oElement:Width := 128
				oElement:ElementFormat := "14;" + CHR(34) + "caption" + CHR(34) + "/" + CHR(34) + "client" + CHR(34) + ""
				oElement:CaptionAlign := 1/*exTopCenter*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
20
How can I create a copy of the element
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oSwimLane:Elements():Add("Element 1",0,0):CallMethod("Copy",):Caption := "Aka"

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
19
How can I define an opaque background for elements

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oSwimLane:Elements():Add("Element 1",0,0)
		oSwimLane:Elements():Add("Element 2",16,16)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
18
How can I show a different context-menu for all elements
PROCEDURE OnActionContextMenu(oSwimLane,Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel)
	DevOut( Transform(Action,"") )
	DevOut( Transform(ObjectID,"") )
	DevOut( Transform(CommandID,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ActionContextMenu := {|Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel| OnActionContextMenu(oSwimLane,Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel)} /*Occurs when the user selects an item from the object's context menu.*/

		oSwimLane:SetProperty("ContextMenu",4/*exContextMenuElement*/,"Item 1[id=1000],Item 2[id=2000]")
		oSwimLane:SetProperty("Background",90/*exElementBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oSwimLane:Elements():Add("Element 1",0,0)
		oSwimLane:Elements():Add("Element 2",16,16)

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
17
How can I show a different context-menu for element
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		DevOut( Transform(oSwimLane:Elements:Add("Element",0,0):InvokeContextMenu("Item 1[id=1000],Item 2[id=2000]"),"") )

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
16
How can I change the design-modes being shown on the control's toolbar

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:DesignModes := "Read-Only#0,Allow Any#3,Only-Element#1,Only-Pool#2"

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
15
How can I change the default header's background color

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 4
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 4
		oSwimLane:SetProperty("Background",120/*exPoolHorizontalHeaderBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 0,255,0 } )  , .F. ))
		oSwimLane:SetProperty("Background",124/*exPoolVerticalHeaderBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 0,192,0 } )  , .F. ))
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
14
How can I remove the Design item from the control's toolbar, to be locked ( no-design )

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ToolBarFormat := "-1,100,101"
		oSwimLane:DesignMode := 0/*exDesignLock*/

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
13
How can I remove/disable the Color and Display-Grid from the surface's context menu

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("ContextMenu",24/*exContextMenuSurface*/,"Delete[id=-32004](All[id=-32000][ttp=Deletes all the objects from the surface],[sep],Elements[id=-32001][ttp=Deletes all elements from the surface],Links[id=-32002][ttp=Deletes all links from the surface],Pools[id=-32003][ttp=Deletes all pools from the surface])")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
12
How can I change the element's context-menu when the user right-clicks the element

PROCEDURE OnActionContextMenu(oSwimLane,Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel)
	/*ContextMenuObjectFromID(ObjectType,ObjectID).BackColor = RGB(255,255,0)*/
	DevOut( Transform(Action,"") )
	DevOut( Transform(CommandCaption,"") )
RETURN

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:ActionContextMenu := {|Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel| OnActionContextMenu(oSwimLane,Action,ObjectType,ObjectID,CommandID,CommandChecked,CommandCaption,CommandValue,Cancel)} /*Occurs when the user selects an item from the object's context menu.*/

		oSwimLane:BeginUpdate()
		oSwimLane:Elements():Add("element",0,0)
		oSwimLane:SetProperty("ContextMenu",4/*exContextMenuElement*/,"Simple,Value[edit=123],[sep],Popup(Check 1[chk],Check 2[chk=1])")
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
11
How do I prevent showing the context-menu when user right-clicks the surface
#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("ContextMenu",24/*exContextMenuSurface*/,"")

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
10
How do I create parent-child (tree) lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oLanes,oLanes1
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:SetProperty("HeaderSize",1/*exHeaderTop*/,32)
			oPool:SetProperty("HeaderVisible",3/*exHeaderBottom*/,.F.)
			oLanes := oPool:Lane(1/*exLaneVertical*/):Children()
				oLanes:Count := 2
				oLanes1 := oLanes:Item(0):Children()
					oLanes1:Count := 2
					oLanes1:Item(0):Header():Caption := "Phase <b>1.1"
					oLanes1:Item(1):Header():Caption := "Phase <b>1.2"
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
9
How do I create a pool with horizontal and lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 4
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 4
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
8
How do I add programatically a pool with horizontal lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:Lane(0/*exLaneHorizontal*/):Children():Count := 4
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
7
How do I add programatically a pool with vertical lanes

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oPool
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:BeginUpdate()
		oPool := oSwimLane:Pools():Add(-250,-150,500,250)
			oPool:Lane(1/*exLaneVertical*/):Children():Count := 4
		oSwimLane:EndUpdate()

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
6
How can I change the toolbar's visual appearance

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:VisualAppearance():Add(1,"c:\exontrol\images\normal.ebn")
		oSwimLane:SetProperty("Background",148/*exToolBarAppearance*/,0x1000000)
		oSwimLane:SetProperty("Background",149/*exToolBarBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))
		oSwimLane:SetProperty("Background",150/*exToolBarForeColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 40,40,40 } )  , .F. ))
		oSwimLane:SetProperty("Background",153/*exToolBarButtonDownBackColor*/,0x1606060)
		oSwimLane:SetProperty("Background",154/*exToolBarButtonDownForeColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 240,240,240 } )  , .F. ))
		oSwimLane:SetProperty("Background",155/*exToolBarButtonHotBackColor*/,0x1a0a0a0)
		oSwimLane:SetProperty("Background",156/*exToolBarButtonHotForeColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN
5
How can I change the toolbar's background color

#include "AppEvent.ch"
#include "ActiveX.ch"

PROCEDURE Main
 	LOCAL oForm
	LOCAL nEvent := 0, mp1 := NIL, mp2 := NIL, oXbp := NIL
	LOCAL oSwimLane

	oForm := XbpDialog():new( AppDesktop() )
	oForm:drawingArea:clipChildren := .T.
	oForm:create( ,,{100,100}, {640,480},, .F. )
	oForm:close  := {|| PostAppEvent( xbeP_Quit )}

	oSwimLane := XbpActiveXControl():new( oForm:drawingArea )
	oSwimLane:CLSID  := "Exontrol.SwimLane.1" /*{AFA73FCE-6609-4062-AE6A-4BAD6D96A025}*/
	oSwimLane:create(,, {10,60},{610,370} )

		oSwimLane:SetProperty("Background",149/*exToolBarBackColor*/,AutomationTranslateColor( GraMakeRGBColor  ( { 255,255,255 } )  , .F. ))

	oForm:Show()
	DO WHILE nEvent != xbeP_Quit
		nEvent := AppEvent( @mp1, @mp2, @oXbp )
		oXbp:handleEvent( nEvent, mp1, mp2 )
	ENDDO 
RETURN