LPARAMETER loNode * loNode is FirstSibling *Recursive *Check all siblings of this node * If all are set then Parent Image should be 1 * If some are set 3 * If none are set then 0 WITH loNode IF ISNULL(.PARENT) RETURN ENDIF LOCAL lnTick,llGreys,lcIndex lnTick = 0 lcIndex = .firstsibling.INDEX DO WHILE lcIndex <> .LastSibling.INDEX * Count fully checked WITH THIS.Nodes(lcIndex) lnTick = lnTick + IIF(.IMAGE = 1,1,0) llGreys = EVAL(".Image = 2") IF llGreys EXIT ENDIF lcIndex = .NEXT.INDEX ENDWITH ENDDO * Either hit a grey or on lastsibling WITH THIS.Nodes(lcIndex) lnTick = lnTick + IIF(.IMAGE = 1,1,0) llGreys = EVAL(".Image = 2") ENDWITH DO CASE CASE llGreys .PARENT.IMAGE = 2 CASE lnTick = loNode.PARENT.Children * All siblings were ticked .PARENT.IMAGE = 1 CASE lnTick = 0 * No Greys or Ticks .PARENT.IMAGE = 0 OTHERWISE *Some ticks .PARENT.IMAGE = 2 ENDCASE *Now run this again using first sibling of Parent THIS.CheckIconUpTree(.PARENT.firstsibling) ENDWITHWorks from 'bottom up' - call CheckIconUpTree(node.parent.firstsibling) when a node is selected/deselected.