Listing 1

//Instance variables
Long il_filter[]

//Function declarations
public function integer of_AddItem (string as_type, string as_text, integer ai_parent,
 string as_picture)
public function integer of_Resize (integer ai_width)
public function integer of_Reset ()
private function integer of_AddParentToFilter (integer ai_parent)
private function string of_GetParentFilter ()
private function integer of_RemoveParentFromFilter (integer ai_parent)

//of_AddItem (string as_type, string as_text, integer ai_parent, string as_picture)
Long ll_row

IF Lower(as_type) = 'header' THEN THIS.of_AddItem('space','',0, '')

ll_row = THIS.InsertRow(0)

CHOOSE CASE Lower(as_type)
   CASE 'header'
      THIS.Object.item_type[ll_row] = 'HE'
   CASE 'child'
      THIS.Object.item_type[ll_row] = 'C'
   CASE 'space'
      THIS.Object.item_type[ll_row] = 'S'
   CASE 'filler'
      THIS.Object.item_type[ll_row] = 'F'
END CHOOSE

THIS.Object.item_text[ll_row] = as_text
THIS.Object.item_number[ll_row] = ll_row
THIS.Object.parent_handle[ll_row] = ai_parent
THIS.Object.item_picture[ll_row] = as_picture

RETURN ll_row

//of_Resize (integer ai_width)
String ls_return

THIS.SetRedraw(FALSE)
ai_width = ai_width - 27

THIS.Modify("t_child_bkgrnd.Width=" + String(ai_width -
 (Long(THIS.Describe("t_child_bkgrnd.X")) * 2)) )
THIS.Modify("t_header_bkgrnd.Width=" + String(ai_width -
 (Long(THIS.Describe("t_header_bkgrnd.X")) * 2)) )
THIS.Modify("t_filler.Width=" + String(ai_width -
(Long(THIS.Describe("t_filler.X")) * 2)) )
THIS.Modify("t_header_filler.Width="+String(ai_width-
(Long(THIS.Describe("t_header_filler.X"))*2)))
THIS.Modify("t_space.Width=" + String(ai_width -
(Long(THIS.Describe("t_space.X")) * 2)) )
THIS.Modify("item_text.Width=" + String(ai_width - 300 ) )
THIS.Modify("p_expanded.x=" + String
(Long(THIS.Describe("t_child_bkgrnd.x")) +
Long(THIS.Describe("t_child_bkgrnd.width")) -
Long(THIS.Describe("p_expanded.Width")) ))
THIS.Modify("p_collapsed.x=" + String
(Long(THIS.Describe("t_child_bkgrnd.x")) +
Long(THIS.Describe("t_child_bkgrnd.width")) -
Long(THIS.Describe("p_collapsed.Width")) ))

THIS.SetRedraw(TRUE)
RETURN 1

//of_Reset ()
Long ll_filter[]

il_filter = ll_filter
THIS.Reset()

RETURN 1

//of_AddParentToFilter (integer ai_parent)
Long ll_index
Boolean lb_found = FALSE

FOR ll_index = 1 TO UpperBound(il_filter)
   IF il_filter[ll_index] = 0 THEN
      il_filter[ll_index] = ai_parent
      lb_found=TRUE
      EXIT
   END IF
NEXT

IF NOT lb_found THEN il_filter[UpperBound(il_filter) + 1] = ai_parent

RETURN 1

//of_GetParentFilter ()
Long ll_index
String ls_filter = ''

FOR ll_index = 1 TO UpperBound(il_filter)
   IF il_filter[ll_index] > 0 THEN
      IF ls_filter = '' THEN
         ls_filter = String(il_filter[ll_index])
      ELSE
         ls_filter = ls_filter + ',' + String(il_filter[ll_index])
      END IF
   END IF
NEXT

IF Len(Trim(ls_filter)) > 0 THEN ls_filter = 'parent_handle not in (' + ls_filter + ')'

RETURN ls_filter

//of_RemoveParentFromFilter (integer ai_parent)
Long ll_index
Boolean lb_found = FALSE

FOR ll_index = 1 TO UpperBound(il_filter)
   IF il_filter[ll_index] = ai_parent THEN
      il_filter[ll_index] = 0
      lb_found=TRUE
      EXIT
   END IF
NEXT

RETURN 1

//Constructor Event
THIS.Object.datawindow.color = RGB(122,160,230)

of_Resize(THIS.Width)

//Clicked Event
IF row > 0 THEN
   CHOOSE CASE String(THIS.Object.item_type[row])
      CASE 'HE'
         THIS.Object.item_type[row] = 'HC'
         of_AddParentToFilter(Integer(THIS.Object.item_number[row]))
      CASE 'HC'
         THIS.Object.item_type[row] = 'HE'
         of_RemoveParentFromFilter(Integer(THIS.Object.item_number[row]))
      CASE 'C'
         IF dwo.Name = 'item_text' OR dwo.Name = 'item_picture' THEN
            THIS.Trigger Event ue_clicked(String(THIS.Object.item_text[row]))
         END IF
   END CHOOSE
   IF String(THIS.Object.item_type[row]) = 'HE' OR &
      String(THIS.Object.item_type[row]) = 'HC' THEN
      THIS.SetFilter(of_GetParentFilter())
      THIS.Filter()
      THIS.SetSort('item_number')
      THIS.Sort()
   END IF
END IF

//Resize Event
IF Integer(THIS.Object.DataWindow.FirstRowOnPage) <> 1 OR &
Integer(THIS.Object.DataWindow.lastRowOnPage) <> THIS.RowCount() THEN
   of_Resize(THIS.Width - 80) //minus the approx. width of the scroll bar
ELSE
   of_Resize(THIS.Width)
END IF