/component superclass /choicemode /Exclusive def %begin postscript section /choicemode persist %end postscript section /placemode /left2right def /initmember { % drawable -- /value choicemode /Exclusive eq { members length 1 eq } false ifelse /softpromote 3 index send //initmember exec } def /addmember { % drawable -- /setting /descendantof 2 index send { //addmember exec } { /destroy exch send } ifelse } def /place_h { % -- float choicemode /NonExclusive eq 10 0 ifelse } def /place_v { % -- float choicemode /NonExclusive eq 10 0 ifelse } def /Paint nullproc def /selected_settings { % -- int * //nullarray 0 { dup members length ge { pop exit } if /value members 2 index get send { exch [2 index] append exch } if 1 add } loop } def /selected_strings { % -- string * //nullarray members { dup /value exch send { exch [/str 4 -1 roll send DIString] append } {pop} ifelse } forall } def /setselection { % int * -- selected_settings //nullarray 3 -1 roll { dup 0 ge { dup members length lt } false ifelse { exch [3 -1 roll] append } {pop} ifelse } forall members length 0 ne { choicemode /NonExclusive ne } false ifelse { dup length 1 gt { [exch 0 get] } if choicemode /Exclusive eq { dup length 0 eq } false ifelse { pop [0] } if } if 1 index { 2 copy arraycontains? not { false /setvalue members 4 -1 roll get send } {pop} ifelse } forall { 2 copy arraycontains? not { true /setvalue members 4 -1 roll get send } {pop} ifelse } forall pop } def /action { % -- [selected_strings] /Action self Send } def /hit_member { % eventtype -- setting //hit exec dup null ne { members 1 index arraycontains? not { pop null } if } { pop null } ifelse } def /hit { % eventtype -- drawable //hit exec dup self eq { pop null } { dup null ne { members 1 index arraycontains? } false ifelse { pop self } if } ifelse } def /trackcurrent null def /tracksel //nullarray def /track_setting { % -- track_event hit_member dup trackcurrent eq {pop} { members exch dup /trackcurrent exch promote arrayindex not -1 if dup 0 lt { pop tracksel setselection } { choicemode track_setting$SwiTch0 exch 2 copy known not { pop /$deFaUlT } if get exec } ifelse } ifelse } def /track_setting$SwiTch0 3 dict dup begin /$deFaUlT { tracksel 1 index arraycontains? { tracksel tracksel 3 -1 roll arrayindex not -1 if exch dup length array copy exch arraydelete } { tracksel [3 -1 roll] append } ifelse setselection } def /ExclusiveVariation { tracksel 1 index arraycontains? { pop //nullarray } { [exch] } ifelse setselection } def /Exclusive { [exch] setselection } def end def /OnSelect { % -- selected_settings /tracksel exch promote /track_setting track pop tracksel selected_settings cmp not {action} if /tracksel unpromote /trackcurrent unpromote } def /setchoicemode { % name -- choicemode 1 index ne { /choicemode exch softpromote invalidate //nullarray setselection } {pop} ifelse } def