Listing 1: Adding the Library Items

/* Name: of_ShowLibraryItems
Parameters: 
treeview atv_disp
long al_Parent
string as_Library
Returns: (none)
*/
string ls_Entries, ls_Obj, ls_Type
long ll_Tot, ll_Row
datastore lds_Sort
treeviewitem ll_TviObj

// Get Entries
ls_Entries=LibraryDirectoryEx(as_Library,DirAll!)
ls_Entries=ls_Entries+"~n" // Add NewLine at the end

// Use datastore to sort the objects
lds_Sort=CREATE datastore
lds_Sort.DataObject="d_libobj"
lds_Sort.ImportString(ls_Entries)
lds_Sort.Sort()

// Loop through all entries
ll_Tot=lds_Sort.RowCount()
FOR ll_Row=1 TO ll_Tot
   ls_Obj=lds_Sort.GetItemString(ll_Row,"objname")
   ls_Type=lds_Sort.GetItemString(ll_Row,"objtype")
	
   CHOOSE CASE ls_Type 
      CASE "Application"
         ll_TviObj.PictureIndex=PICT_APPLICATION
      CASE "Function"
         ll_TviObj.PictureIndex=PICT_FUNCTION
      CASE "Window"
          ll_TviObj.PictureIndex=PICT_WINDOW
      CASE "Menu"
         ll_TviObj.PictureIndex=PICT_MENU
      CASE "Structure"
         ll_TviObj.PictureIndex=PICT_STRUCTURE
      CASE "UserObject"
         ll_TviObj.PictureIndex=PICT_USEROBJECT
      CASE ELSE
         ll_TviObj.PictureIndex=0
   END CHOOSE
   // use classes from above only
   IF ll_TviObj.PictureIndex>0 THEN
      ll_TviObj.Label=ls_Obj
      ll_TviObj.SelectedPictureIndex=ll_TviObj.PictureIndex
      ll_TviObj.Children=TRUE
      atv_Disp.InsertItemLast( al_Parent, ll_TviObj)
   END IF
NEXT
DESTROY lds_Sort

RETURN

Listing 2: Translating Enumerated Values

/* Name: of_ValueString
Parameters: 
string  as_Type
any aa_Data
Returns: string
*/
string	ls_Ret

ls_Ret = as_Type + Char(9)

CHOOSE CASE as_Type
CASE "CallingConvention"
   ArgCallingConvention lcca_Temp
   lcca_Temp=aa_Data
   CHOOSE CASE lcca_Temp
   CASE ByReferenceArgument!
         ls_Ret=ls_Ret+": ByReferenceArgument!"
   CASE ByValueArgument!
         ls_Ret=ls_Ret+": ByValueArgument!"
   CASE ReadOnlyArgument!
         ls_Ret=ls_Ret+": ReadOnlyArgument!"
   CASE VarListArgument!
         ls_Ret=ls_Ret+": VarListArgument!"
   END CHOOSE


CASE "Cardinality"
   VariableCardinalityDefinition lvcd_Temp
   lvcd_Temp = aa_Data
   CHOOSE CASE lvcd_Temp.Cardinality
   CASE ScalarType!
      ls_Ret = ls_Ret + ": ScalarType!"
   CASE UnboundedArray!
      ls_Ret = ls_Ret + ": UnboundedArray!"
   CASE BoundedArray!
      ls_Ret = ls_Ret + ": BoundedArray!"
END CHOOSE

CASE "VariableKind"
   VariableKind lvk_Temp
   lvk_Temp = aa_Data
   CHOOSE CASE lvk_Temp
   CASE VariableGlobal!
      ls_Ret=ls_Ret+": VariableGlobal!"
   CASE VariableShared!
      ls_Ret= ls_Ret+": VariableShared!"
   CASE VariableInstance!
      ls_Ret=ls_Ret+": VariableInstance!"
   CASE VariableArgument!
      ls_Ret=ls_Ret+": VariableArguement"
   CASE VariableLocal!
      ls_Ret=ls_Ret+": VariableLocal!"
   END CHOOSE

CASE "ScriptKind"
   /* Is 0/1 instead of the following
   ScriptKind lsk_Temp
   lsk_Temp = aa_Data
   CHOOSE CASE lsk_Temp
   CASE ScriptEvent!
      ls_Ret=ls_Ret+": ScriptEvent!"
   CASE ScriptFunction!
      ls_Ret= ls_Ret+": ScriptFunction!"
END CHOOSE
*/
ls_Ret=ls_Ret +": " + String( aa_Data )

CASE  "ReadAccess", "WriteAccess","Access"
   VarAccess lva_Temp
   lva_Temp=aa_Data
   CHOOSE CASE lva_Temp
   CASE Private!
      ls_Ret=ls_Ret+": Private!"
   CASE Public!
      ls_Ret=ls_Ret+": Public!"
   CASE Protected!
       ls_Ret=ls_Ret+": Protected!"
   CASE System!
      ls_Ret=ls_Ret+": System!"
   CASE ELSE
      ls_Ret=ls_Ret+":"
END CHOOSE

CASE "Category"
   TypeCategory ltc_Temp
   ltc_Temp=aa_Data
   CHOOSE CASE ltc_Temp
   CASE SimpleType!
      ls_Ret=ls_Ret+": SimpleType!"
   CASE EnumeratedType!
      ls_Ret=ls_Ret+ ": EnumeratedType!"
   CASE ClassOrStructureType!
      ls_Ret=ls_Ret+": ClassOrStructureType!"
END CHOOSE

CASE "InitialValue"
   IF NOT IsNull( String( aa_Data ) ) THEN
      ls_Ret=ls_Ret+": "+ String( aa_Data )
   END IF

CASE "DataTypeOf"
   TypeDefinition ltd_Temp
   EnumerationDefinition led_Temp
   EnumerationItemDefinition lei_Temp[]
   integer li_Counter
   ls_Ret=ls_Ret+": "+String(aa_Data)

   ltd_Temp=FindTypeDefinition(aa_Data)
   IF ltd_Temp.Category=EnumeratedType! THEN
      led_Temp=ltd_Temp
      lei_Temp=led_Temp.Enumeration
      FOR li_Counter=1 TO UpperBound(lei_Temp)
         ls_Ret=ls_Ret+"~r~n~t"+"- "+ &
         lei_Temp[li_Counter].Name+": "	+ &
         String( lei_Temp[ li_Counter ].Value)
      NEXT
   END IF

CASE ELSE
   IF NOT IsNull( String( aa_Data ) ) THEN
      ls_Ret=ls_Ret+": "+ String(aa_Data)
   END IF
END CHOOSE

RETURN ls_Ret

Listing 3: Format Information

/* Name: of_FormatInfo
Parameters: 
classdefinitionobject acdo_Temp
returns: string
*/
string 	ls_Ret
ClassDefinition lcd_Temp
VariableDefinition lvd_Temp
ScriptDefinition	lsd_Temp

CHOOSE CASE acdo_Temp.TypeOf()
	CASE ClassDefinition!
		lcd_Temp = acdo_Temp
		ls_Ret = This.of_ValueString( "Category", lcd_Temp.Category) + "~r~n" + &
			This.of_ValueString( "IsAutoinstantiate", lcd_Temp.IsAutoinstantiate) + "~r~n" + &
			This.of_ValueString( "IsStructure", lcd_Temp.IsStructure) + "~r~n" + &
			This.of_ValueString( "IsSystemType", lcd_Temp.IsSystemType) + "~r~n" + &
			This.of_ValueString( "IsVariableLength", lcd_Temp.IsVariableLength) + "~r~n" + &
			This.of_ValueString( "IsVisualType", lcd_Temp.IsVisualType) + "~r~n" + &
			This.of_ValueString( "LibraryName", lcd_Temp.LibraryName)

	CASE VariableDefinition!
		lvd_Temp = acdo_Temp
		ls_Ret = This.of_ValueString( "CallingConvention", lvd_Temp.CallingConvention ) + "~r~n" + &
			This.of_ValueString( "Cardinality", lvd_Temp.Cardinality ) + "~r~n"
			IF Lower( lvd_Temp.name ) <> "imemode" AND lvd_Temp.TypeInfo.DataTypeOf <> "string" 
			THEN
			// Crash otherwise e.g. string s = 'crash'
			ls_Ret = ls_Ret + This.of_ValueString( "InitialValue", lvd_Temp.InitialValue) + "~r~n"
			END IF
			ls_Ret = ls_Ret + This.of_ValueString( "IsConstant", lvd_Temp.IsConstant) + "~r~n" + &
			This.of_ValueString( "IsControl", lvd_Temp.IsControl) + "~r~n" + &
			This.of_ValueString( "IsUserDefined", lvd_Temp.IsUserDefined) + "~r~n" + &
			This.of_ValueString( "VariableKind", lvd_Temp.Kind) + "~r~n" + &
			This.of_ValueString( "OverridesAncestorValue", lvd_Temp.OverridesAncestorValue) + "~r~n" + &
			This.of_ValueString( "ReadAccess", lvd_Temp.ReadAccess) + "~r~n" + &
			This.of_ValueString( "WriteAccess", lvd_Temp.WriteAccess) + "~r~n" + & "~r~nTypeInfo~r~n" + & 
			 This.of_ValueString( "Category", lvd_Temp.TypeInfo.Category) + "~r~n" + & 
			 This.of_ValueString( "DataTypeOf", lvd_Temp.TypeInfo.DataTypeOf) + "~r~n" + &
			 This.of_ValueString( "IsStructure", lvd_Temp.TypeInfo.IsStructure) + "~r~n" + &
			 This.of_ValueString( "IsSystemType", lvd_Temp.TypeInfo.IsSystemType) + "~r~n" + &
			 This.of_ValueString( "IsVariableLength", lvd_Temp.TypeInfo.IsVariableLength) + "~r~n" +&
			 This.of_ValueString( "IsVisualType", lvd_Temp.TypeInfo.IsVisualType) + "~r~n" +&
			 This.of_ValueString( "LibraryName", lvd_Temp.TypeInfo.LibraryName) + "~r~n" +&
			 This.of_ValueString( "Name", lvd_Temp.TypeInfo.Name)

	CASE ScriptDefinition!
		lsd_Temp = acdo_Temp
 		ls_Ret = This.of_ValueString( "Access", lsd_Temp.Access ) + "~r~n" + &
		This.of_ValueString( "AliasName", lsd_Temp.AliasName) + "~r~n" + &
		This.of_ValueString( "EventId", lsd_Temp.EventID ) + "~r~n" + &
		This.of_ValueString( "EventIdName", lsd_Temp.EventID ) + "~r~n" + &
		This.of_ValueString( "ExternalUserFunction", lsd_Temp.EventID ) + "~r~n" + &
		This.of_ValueString( "IsExternalEvent", lsd_Temp.IsExternalEvent ) + "~r~n" + &
		This.of_ValueString( "IsLocallyDefined", lsd_Temp.IsLocallyDefined ) + "~r~n" + &
		This.of_ValueString( "IsLocallyScripted", lsd_Temp.IsLocallyScripted ) + "~r~n" + &
		This.of_ValueString( "IsRPCFunction", lsd_Temp.IsRPCFunction ) + "~r~n" + &
		This.of_ValueString( "IsScripted", lsd_Temp.IsScripted ) + "~r~n" + &
		This.of_ValueString( "ScriptKind", lsd_Temp.Kind ) + "~r~n" + &
		This.of_ValueString( "SystemFunction", lsd_Temp.SystemFunction ) 
			IF IsValid( lsd_Temp.ReturnType ) THEN
				ls_Ret = ls_Ret + "~r~n" + & "~r~nReturnType~r~n" + & 
		This.of_ValueString( "Category", lsd_Temp.ReturnType.Category ) + "~r~n" + & 
		This.of_ValueString( "DataTypeOf", lsd_Temp.ReturnType.DataTypeOf) + "~r~n" + &
		This.of_ValueString( "IsStructure", lsd_Temp.ReturnType.IsStructure) + "~r~n" + &
		This.of_ValueString( "IsSystemType", lsd_Temp.ReturnType.IsSystemType) + "~r~n" + &
		This.of_ValueString( "IsVariableLength", lsd_Temp.ReturnType.IsVariableLength) + "~r~n" +&
		This.of_ValueString( "IsVisualType", lsd_Temp.ReturnType.IsVisualType) + "~r~n" +&
		This.of_ValueString( "LibraryName", lsd_Temp.ReturnType.LibraryName) + "~r~n" +&
		This.of_ValueString( "Name", lsd_Temp.ReturnType.Name) 
					END IF
	CASE ELSE
		ls_Ret = "Missing " + ClassName( acdo_Temp	)
END CHOOSE
RETURN ls_Ret

Listing 4: Show ClassDefinition

/* Name: of_ShowClassDefinition
Parameters: 
treeview atv_Disp
long al_Parent
classdefinition acd_Data
returns: (none)
*/
integer	li_Counter
treeviewitem ltvi_Temp
long	 ll_Handle
classdefinition	lcd_Parent

	// Show Varables. No Controls
	ll_Handle = atv_disp.InsertItemLast( al_Parent, "Variables", PICT_VARIABLES)
	FOR li_Counter = 1 TO UpperBound( acd_Data.VariableList )
		IF NOT acd_Data.VariableList[li_Counter].IsControl THEN
			of_ShowVariable( atv_Disp, ll_Handle, acd_Data.VariableList[li_Counter])
		END IF
	NEXT

	// Add Scripts
	ll_Handle = atv_disp.InsertItemLast( al_Parent, "Scripts",PICT_FUNCTION)
	FOR li_Counter = 1 TO UpperBound( acd_Data.ScriptList )
		of_ShowScript( atv_Disp, ll_Handle, acd_Data.ScriptList[li_Counter] )
	NEXT

	// All the Nested classes
	ll_Handle = atv_disp.InsertItemLast( al_Parent, "Nested Classes", PICT_NESTED )
	FOR li_Counter = 1 TO UpperBound( acd_Data.nestedclasslist )
		// Checking the parent prevents showing of nested classes from an ancestor
		and recursive information e.g. on structures
		lcd_Parent  = acd_Data.nestedclasslist[li_Counter].ParentClass
		IF NOT IsNull( lcd_Parent ) THEN
			IF lcd_Parent.Name = acd_Data.Name THEN
				ltvi_Temp.Label = acd_Data.nestedclasslist[li_Counter].name
				ltvi_Temp.Children = TRUE
				ltvi_Temp.PictureIndex = PICT_USEROBJECT
				ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
				atv_disp.InsertItemLast( ll_Handle, ltvi_Temp )
			END IF
		END IF
	NEXT

	// Show ancestor entry
	IF NOT IsNull( acd_Data.Ancestor ) THEN
		ltvi_Temp.Label = acd_Data.Ancestor.Name
		ltvi_Temp.Children = TRUE
		// Get same picture as parent item
		treeviewitem	ltvi_Parent
		atv_disp.GetItem( al_Parent, ltvi_Parent)
		ltvi_Temp.PictureIndex = ltvi_Parent.PictureIndex
		ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
		atv_disp.InsertItemLast( al_Parent, ltvi_Temp )
	END IF


RETURN


Listing 5: Show Variable

/* Name: of_ShowVariable
Parameters: 
treeview atv_Disp
long al_Parent
variabledefinition avd_Data
returns: (none)
*/
treeviewitem	ltvi_Temp

ltvi_Temp.Label = avd_Data.Name
ltvi_Temp.Data  = This.of_FormatInfo( avd_Data )

// Get picture depending of kind of variable and user defined or not
CHOOSE CASE avd_Data.Kind
CASE VariableGlobal!
		ltvi_Temp.PictureIndex=PICT_VARGLOBAL
	CASE VariableInstance!
		ltvi_Temp.PictureIndex=PICT_VARINSTANCE
		 IF avd_Data.IsUserDefined THEN
			ltvi_Temp.OverlayPictureIndex = 1
		END IF
	CASE Variableshared!
		ltvi_Temp.PictureIndex=PICT_VARSHARED
	CASE VariableArgument!
		ltvi_Temp.PictureIndex= PICT_VARARGUMENT
	CASE VariableLocal!
		ltvi_Temp.PictureIndex=PICT_VARLOCAL
END CHOOSE

ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex	
atv_disp.InsertItemLast( al_Parent, ltvi_Temp )

RETURN

Listing 6: Show Script

/* Name: of_ShowScript
Parameters: 
treeview atv_Disp
long al_Parent
scriptdefinition asd_Data
returns: (none)
*/
treeviewitem	ltvi_Temp
long ll_Handle, ll_Handle2
integer	li_Counter

ltvi_Temp.Label = asd_Data.Name
ltvi_Temp.Data = This.of_FormatInfo( asd_Data )
IF asd_Data.IsLocallyScripted	 THEN
	ltvi_Temp.OverlayPictureIndex = 1
ELSE
	ltvi_Temp.OverlayPictureIndex = 0
END IF
IF asd_Data.IsScripted THEN
	ltvi_Temp.PictureIndex = PICT_SCRIPTYES
ELSE
	ltvi_Temp.PictureIndex = PICT_SCRIPTNO
END IF
ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
ll_Handle = atv_disp.InsertItemLast( al_Parent, ltvi_Temp )

// Use Picture index and overlay index from parent
ltvi_Temp.Label = "Source"
ltvi_Temp.Data = asd_Data.Source
ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
atv_disp.InsertItemLast( ll_Handle, ltvi_Temp )

ltvi_Temp.OverlayPictureIndex = 0
ltvi_Temp.Label= "ArgumentList"
SetNull( ltvi_Temp.Data )
ltvi_Temp.PictureIndex=PICT_VARARGUMENT
ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
ll_Handle2 = atv_disp.InsertItemLast( ll_Handle, ltvi_Temp )
variabledefinition	lvd_Temp[]
lvd_Temp = asd_Data.ArgumentList
FOR li_Counter = 1 TO UpperBound( lvd_Temp )
	This.of_ShowVariable( atv_disp, ll_Handle2,lvd_Temp[li_Counter] )
NEXT

ltvi_Temp.Label= "LocalVariableList"
SetNull( ltvi_Temp.Data )
ltvi_Temp.PictureIndex=PICT_VARLOCAL
ltvi_Temp.SelectedPictureIndex = ltvi_Temp.PictureIndex
ll_Handle2 = atv_disp.InsertItemLast( ll_Handle, ltvi_Temp )
lvd_Temp = asd_Data.LocalVariableList
FOR li_Counter = 1 TO UpperBound(lvd_Temp )
	This.of_ShowVariable( atv_disp, ll_Handle2, lvd_Temp[li_Counter] )
NEXT

RETURN