/drawable superclass /retained false def /savebehind false def /resizable false def /dragable true def %begin postscript section /dragframeonly persist %end postscript section /cv nullcanvas def /canvaspath { % -- path } def /oninit { % -- /visible false promote //oninit exec } def /mapped { % -- boolean visible } def /map { % -- visible not { /visible true promote onopen } if } def /unmap { % -- visible { onclose /visible false promote } if } def /gstart { % -- /cv promoted not { framebuffer new_canvas /cv exch promote cv /SaveBehind savebehind put cv /Retained retained put greset cv map_canvas gsave cv setcanvas BG setcolor clippath fill grestore } if } def /gstop { % -- /cv promoted { cv unmap_canvas /cv unpromote } if } def /greset { % -- /cv promoted { gsave framebuffer setcanvas mx concat canvaspath cv reshape_canvas members { /greset exch send } forall grestore } if } def /ginit { % -- cv setcanvas } def /Paint { % -- clippath BG setcolor fill FG setcolor 0 1 w 1 sub h 1 sub rectpath stroke } def /move { % float float -- x 2 index ne true { y 1 index ne } ifelse { /mx mx 3 index 3 index mtranslate softpromote /cv promoted { cv 3 -2 roll move_canvas } { pop pop } ifelse } { pop pop } ifelse } def /trackdragcanvas { % -- trackdx trackdy rmove track_event track_start_event } def /dragcanvas { % -- gsave cv /Parent get setcanvas /trackdragcanvas track pop grestore } def /trackdragframe { % -- gsave mx x trackdx add y trackdy add mtranslate concat path stroke grestore } def /dragframe { % -- gsave cv /Parent get setcanvas /trackdragframe track_overlay /mouse_up eq { trackdx trackdy rmove } if grestore } def /drag { % -- dragable { dragframeonly {dragframe} {dragcanvas} ifelse } if } def /trackmx 0 def /trackmy 0 def /trackfx 0 def /trackfy 0 def /resizerect { % -- rectangle trackfx trackmx lt { trackfx minwidth trackmx trackdx add trackfx sub max } { trackfx minwidth sub trackmx trackdx add min trackfx 1 index sub } ifelse trackfy trackmy lt { trackfy exch minwidth trackmy trackdy add trackfy sub max } { trackfy minwidth sub trackmy trackdy add min exch trackfy 2 index sub } ifelse [5 -4 roll] } def /resizetrack { % -- resizerect aload pop rectpath stroke } def /resizeframe { % float float float float -- dragable {resizable} false ifelse { 4 -1 roll /trackmx exch promote 3 -1 roll /trackmy exch promote exch /trackfx exch promote /trackfy exch promote gsave cv /Parent get setcanvas x y translate /resizetrack track_overlay pop resizerect x 1 index 0 get add y 2 index 1 get add 2 index 2 get 4 -1 roll 3 get reshape grestore /trackmx unpromote /trackmy unpromote /trackfx unpromote /trackfy unpromote } { pop pop pop pop } ifelse } def /resizeSW { % -- 0 0 w h resizeframe } def /resizeNW { % -- 0 h w 0 resizeframe } def /resizeNE { % -- w h 0 0 resizeframe } def /resizeSE { % -- w 0 0 h resizeframe } def /totop { % -- /cv promoted { cv totop_canvas } if //nullarray /totop @freezer Send } def /tobottom { % -- /cv promoted { cv tobottom_canvas } if } def /open { % -- map } def /close { % -- unmap } def /set_focus { % drawable -- @focus 2 copy eq { pop pop } { dup null ne { /@focus unpromote //nullarray /focus_change 3 -1 roll Send } {pop} ifelse dup null ne { //nullarray /focus_change 3 -1 roll soften dup /@focus exch promote Send } {pop} ifelse } ifelse } def /handle_key { % int -- edit_mode not { @freezer null eq } false ifelse { [exch] /onkey @focus Send } {pop} ifelse } def /handle_enter { % -- edit_mode not { @freezer null eq } false ifelse { //nullarray /focus_change self Send //nullarray /focus_change @focus Send } if } def /handle_exit { % -- edit_mode not { @freezer null eq } false ifelse { //nullarray /focus_change @focus Send //nullarray /focus_change self Send } if } def /fost_change nullproc def /freeze { % drawable -- /@freezer promoted not { /@freezer exch promote //nullarray /focus_change self Send //nullarray /frost_change self Send } {pop} ifelse } def /defrost { % -- /@freezer promoted { /@freezer unpromote //nullarray /frost_change self Send //nullarray /focus_change self Send } { @freezer null ne { //nullarray /defrost @parent Send } if } ifelse } def /OnSelect2 nullproc def /OnSelect { % -- track_state OnSelect$SwiTch0 exch 2 copy known { get exec } { pop pop } ifelse } def /OnSelect$SwiTch0 3 dict dup begin /mouse_cancel {} def /mouse_click { mouselevel 2 ge { //nullarray /OnSelect2 } { //nullarray /totop } ifelse self Send } def /mouse_drag { //nullarray /drag self Send } def end def /select_click { % -- edit_mode not { @freezer null ne {totop} { mouseevent hit dup null ne { //nullarray /onselect 3 -1 roll Send } { pop onselect } ifelse } ifelse } if } def /adjust_click { % -- edit_mode not { @freezer null ne {totop} { mouseevent hit dup null ne { //nullarray /onadjust 3 -1 roll Send } { pop onadjust } ifelse } ifelse } if } def /menu_click { % -- edit_mode not { @freezer null ne {totop} { mouseevent hit dup null ne { //nullarray /onmenu 3 -1 roll Send } { pop onmenu } ifelse } ifelse } if } def /handle_select_click { % -- //nullarray /select_click self Send } def /handle_adjust_click { % -- //nullarray /adjust_click self Send } def /handle_menu_click { % -- //nullarray /menu_click self Send } def /handle_damage { % -- //nullarray /fix self Send } def /handle_function { % name -- pop } def /test_save { % -- (test.window) (w) file self save_object (window % saved to ~/test.window) [namestr] sprintf DEBUG } def