don@TUMTUM.CS.UMD.EDU (Don Hopkins) (11/23/89)
======== START OF cyber.shar.splitae ======== X /ObjectY ItemBorder store X /TabX LabelX ItemBorder sub store X /TabY LabelY ItemGap sub ItemRadius dup add sub store X /TabWidth LabelWidth ItemBorder dup add add store X /TabHeight X ItemRadius dup add ItemGap add LabelHeight add ItemBorder add X def } X } case X /PinX LabelX LabelWidth add 2 sub store X } def X X /adjust-geometry { X /ItemLabel nice-item-label store X LabelSize /LabelHeight exch def /LabelWidth exch def X AdjustItemSize X CalcObj&LabelXY X } def X X /nice-item-label { X Collection Index get X smart-type X (% \267) sprintf X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Display X X /PaintItem { X LayoutLock { X ItemRadius label-bbox rrectpath X ItemFillColor setcolor fill X ItemFrame 0 gt { X ItemFrame ItemRadius label-bbox rrectframe X ItemBorderColor setcolor eofill X } if X ItemRadius object-bbox rrectpath X ItemFillColor setcolor fill X ItemFrame 0 gt { X ItemFrame ItemRadius object-bbox rrectframe X ItemBorderColor setcolor eofill X } if X ShowLabel X paint-struct X } monitor X } def X X /paint-struct { X %{ X gsave X ensure-DL X ItemTextColor setcolor X ObjectX ObjectY ObjectHeight add translate X DL draw-struct X grestore X %} fork waitprocess pop X } def X X /damage-view { X gsave X %ItemParent setcanvas bbox rectpath extenddamage X paint X grestore X } def X X % distillery display stubs X /_fill {fill} def X /_eofill {eofill} def X /_stroke {stroke} def X /_show {show} def X /_newpath {newpath} def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Accessers X X /Collection { X ItemObject 0 get cvlit X } def X X /Index { X ItemObject 1 get cvlit X } def X X /array? { % obj => bool X type dup /arraytype eq exch /packedarraytype eq or X } def X X /array-or-string-dict 5 dict def X array-or-string-dict begin X /arraytype dup def X /packedarraytype dup def X /stringtype dup def X end % array-or-string-dict X X /array-or-string? { % obj => bool X type //array-or-string-dict exch known X } def X X currentdict /array-or-string-dict undef X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Structure stuff X X /do-search { X /it self store X DL begin Icon? end { X /obs [ DL ] store X /ob DL store X } { X gsave X ObjectX ObjectY ObjectHeight add translate X DL X CurrentEvent begin XLocation YLocation end X search-struct X /obs exch store X obs length 0 eq { null } { X obs dup length 1 sub get X } ifelse X /ob exch store X grestore X } ifelse X } def X X% Return the path down the display list to the substructure enclosing (x,y). X /search-struct { % dict x y => [ dl1 dl2 ... dln ] X { % keep return stack from overflowing X 10 dict begin X /ssy exch def /ssx exch def X [ exch X { do-search-struct X % unsucessful search X exit X } loop % catch possible exit X dup true eq { pop } if X ] X end X } fork % dict x y process X 4 1 roll pop pop pop X waitprocess X } def X X% This keeps overflowing the fucking execution stack in NeWS 1.1! X /do-search-struct { % dl => dl dl' dl'' dl''' ... X begin X%gsave X Y W H rectpath 0 setgray 5 setrasteropcode fill grestore X%pause pause X%gsave X Y W H rectpath 0 setgray 5 setrasteropcode fill grestore X ssx X ge { X ssy Y ge { X ssx X W add le { X ssy Y H add le { X currentdict end % dl X dup /Controls get % dl controls X dup null eq { pop } { X { do-search-struct } forall % dl .. dn mark | dl X dup true eq { exit } if % exit if something found X } ifelse % dl X dup /Branches get % dl branches X dup null eq { pop } { X { do-search-struct } forall % dl ... dn mark | dl X dup true eq { exit } if % exit if something found X } ifelse X % We were found, but none of our children, leave true on X % top of stack to unwind search. X true exit X } if X } if X } if X } if X end X } def X X /do-search-struct { % dl => dl dl' dl'' dl''' ... X begin X%gsave X Y W H rectpath 0 setgray 5 setrasteropcode fill grestore X%pause pause X%gsave X Y W H rectpath 0 setgray 5 setrasteropcode fill grestore X ssx X ge { X ssy Y ge { X ssx X W add le { X ssy Y H add le { X currentdict end % dl X dup /Controls get % dl controls X dup null eq { pop } { X { do-search-struct } forall % dl .. dn mark | dl X dup true eq { exit } if % exit if something found X } ifelse % dl X dup /Branches get % dl branches X dup null eq { pop } { X { do-search-struct } forall % dl ... dn mark | dl X dup true eq { exit } if % exit if something found X } ifelse X % We were found, but none of our children, leave true on X % top of stack to unwind search. X true exit X } if X } if X } if X } if X end X } def X X /close-struct { X DL /Icon? undef X ob /L 0 put X ob /Branches null put X ob /Controls null put X Silent? not { redo-layout } if X } def X X% TODO: Open up special editors on different object types. X% Numberic keypad X% Boolean toggle X% Color sliders X% Font finder X% Canvas view X% Visual graphics state editors X% String editor X% CyberSpace projection X X% Event's XLocation YLocation should be relative to the event's Canvas, or X% framebuffer if null. X X /use-parent-obj { X obs length 1 gt { X /obs obs 0 1 index length 1 sub getinterval store X /ob obs dup length 1 sub get store X } if X } def X X /change-parent-obj { % func X use-parent-obj change-obj X } def X X /make-button { % dl => dl X dup /label-proc /button-label put X dup /display-proc /display-button put X } def X X /make-edit-button { % dl => dl X make-button X dup /click-proc /click-edit put X } def X X /make-magic-button { % dl => dl X make-button X dup /click-proc /click-magic put X } def X X /struct-editors 50 dict def X struct-editors begin X X% ------------------------------------------------------------------------ X X /step { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X % Make fresh copies so user can change scalars X /++ {Step add} def X currentdict /++ cvx 0 grow-struct X make-edit-button X /-- {Step sub} def X currentdict /-- cvx 0 grow-struct X make-edit-button X /Step 1 def X currentdict /Step cvx 0 grow-struct X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } def X X /shift { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X % Make fresh copies so user can change scalars X (**) {Shift mul} def X currentdict (**) cvn cvx 0 grow-struct X make-edit-button X (//) {Shift div} def X currentdict (//) cvn cvx 0 grow-struct X make-edit-button X /Shift 10 def X currentdict /Shift cvx 0 grow-struct X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } def X X /digit { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X Controls null ne { Controls aload pop } if X X % Make fresh copies so user can change scalars X X 0 1 9 { X dup [ /floor load 10 /mul load 5 index /add load ] cvx def X currentdict exch 0 grow-struct X make-edit-button X } for X X /Rubout [ 10 /div load /floor load ] cvx def X currentdict /Rubout 0 grow-struct X make-edit-button X X /Clear [ /pop load 0 ] cvx def X currentdict /Clear 0 grow-struct X make-edit-button X X /+- /neg load def X currentdict /+- cvx 0 grow-struct X make-edit-button X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } def X X /boolean { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X Controls null ne { Control aload pop } if X /True true def X currentdict /True 0 grow-struct X make-edit-button X /False false def X currentdict /False 0 grow-struct X make-edit-button X /Not /not load def X currentdict /Not 0 grow-struct X make-edit-button X /Random [/random cvx .5 /lt cvx] cvx def X currentdict /Random 0 grow-struct X make-edit-button X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } def X X /element { X open-obj-branches X Silent? not { /redo-layout null self exch pop send } if X } def X X /filter { X Branches null eq { X /Branches X C I 1 grow-struct X 1 index get def X } if X X /Controls [ X % XXX: Will this work? X Controls null ne { X Controls aload pop X } if X 20 dict begin X X /Recompute { X ob begin X /Obj /C load /I load get def X end X ContainerRef 0 ob /Obj get put X ob /Branches [ X Container array-or-string? { X IndexRef 0 0 put X } if X Container { X ObjectRef exch 0 exch put X Container array-or-string? { X IndexRef 0 2 copy get 1 add put X } { X IndexRef exch 0 exch put X } ifelse X mark false X /Filter load cvx { exec } errored { cleartomark } { X dup type /booleantype ne { pop false } if X { cleartomark Container Index 0 grow-struct } X { cleartomark } ifelse X } ifelse X } forall X ] Order put X ObjectRef 0 null put X ContainerRef 0 null put X IndexRef 0 null put X Silent? not { /redo-layout null self exch pop send } if X } def X currentdict /Recompute 0 grow-struct X make-magic-button X X /ObjectRef [ null ] def X /Object ObjectRef cvx def X /ContainerRef [ null ] def X /Container ContainerRef cvx def X /IndexRef [ null ] def X /Index IndexRef cvx def X X % Filters may call: Container Index Object X /Filter % - => interesting? X false X def X currentdict /Filter 0 grow-struct X X /Keys 100 dict def X currentdict /Keys 1 grow-struct X X /Order [ X /Obj load array-or-string? /by-value /by-name ifelse X /quicksort cvx X ] cvx def X currentdict /Order 0 grow-struct X X% /View null def X% currentdict /View 0 grow-struct X% counttomark 1 sub /ViewIndex exch def X X ] currentdict end 3 1 roll def X X begin Recompute end X } def X X /scroller { X Branches null eq { X /Branches X C I 1 grow-struct X 1 index get def X } if X X% currentdict /AllBranches known not { X /AllBranches Branches def X% } if X X /Controls [ X % XXX: Will this work? X Controls null ne { X Controls aload pop X } if X 20 dict begin X X /Recompute { X /Offset X Offset X ob /Obj get length 1 sub min X 0 max X def X ob /Branches X ob /AllBranches get Offset 1 index length 1 index sub Size min X getinterval X put X /Scroll X (% : %..% of %, %) [ X ob /Str get X Offset X Offset ob /Branches get length add 1 sub X ob /AllBranches get length X 2 index 1 index div X 100 mul round 5 string cvs (%) append X ] sprintf X def X Silent? not { /redo-layout null self exch pop send } if X } def X X /Scroll (nothingness) def X currentdict /Scroll 0 grow-struct X X% /Top { X% /Offset 0 def X% Recompute X% } def X% currentdict /Top 0 grow-struct X% dup /click-proc /click-magic put X% X% /Bottom { X% /Offset ob /Obj get length Size sub def X% Recompute X% } def X% currentdict /Bottom 0 grow-struct X% dup /click-proc /click-magic put X X /Back { X /Offset Offset Size sub def X Recompute X } def X currentdict /Back 0 grow-struct X make-magic-button X X /Next { X /Offset Offset Size add def X Recompute X } def X currentdict /Next 0 grow-struct X make-magic-button X X /Offset 0 def X% currentdict /Offset 0 grow-struct X X /Size 10 def X currentdict /Size 0 grow-struct X X Controls null ne { X Controls aload pop X } if X X ] currentdict end 3 1 roll def X X begin Recompute end X } def X X /user { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X /User {} def X currentdict /User 0 grow-struct X make-edit-button X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } def X X % Pop open pointers to instances of this name on the dictionary stack. X /definitions { X /Controls [ X Controls null ne { X Controls aload pop X } if X mark X obs aload pop X { dup mark eq { X pop X /getdictstack dialog-item send X exit X } { X dup /ClassEditor known { X begin cleartomark /C load end % ClassEditorDict X /ClassDicts get X /getdictstack dialog-item send append X exit X } { X pop X } ifelse X } ifelse X } loop X % Remove redundant dictionaries X 100 dict begin X dup {null def} forall X [ exch { % dict X currentdict 1 index known { X currentdict 1 index undef % dict X } { X pop % X } ifelse X } forall X ] X end X X { dup ob /Obj get known { X ob /Obj get 0 grow-struct X dup /label-proc /reference-label put X } { pop } ifelse X } forall X ] dup length 0 eq { pop pop } { def } ifelse X Silent? not { /redo-layout null self exch pop send } if X } def X XXNeWS? { X /class { X ob /C get ob /I get get dup /ParentDictArray known not {pop} { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin % ClassEditorDict X /Obj ob /C get ob /I get get def X /Instance? Obj /ClassName known not def X /Class Obj Instance? { /ParentDictArray get } if def X /ClassDicts [ Class /ParentDictArray get aload pop X Class Instance? { Obj } if ] def X /MethodDict 1000 dict def X /ClassVarDict 1000 dict def X X /Name dup Obj send def X currentdict /Name 0 grow-struct X X ClassDicts { X { Class /InstanceVars get 2 index known not { X dup xcheck 1 index array? and { X MethodDict 2 index dup put X } { X ClassVarDict 2 index dup put X } ifelse X } if X pop pop X } forall X pause pause X } forall X X currentdict /ClassDicts 0 grow-struct X X Instance? not { X /SubClasses dup Class send def X currentdict /SubClasses 0 grow-struct X pause pause X } if X X /InstanceVars [ X Class /InstanceVars get { pop (%) sprintf } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /InstanceVars 0 grow-struct X dup /ClassEditor true put X pause pause X X /ClassVars [ X ClassVarDict { pop 80 string cvs } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /ClassVars 0 grow-struct X dup /ClassEditor true put X pause pause X X /Methods [ X MethodDict { pop 80 string cvs } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /Methods 0 grow-struct X dup /ClassEditor true put X pause pause X X /Obj null def X /Class null def X /MethodDict null def X /ClassVarDict null def X end % ClassEditorDict X ] def X Silent? not { /redo-layout null self exch pop send } if X } ifelse X } def X} { X /class { X ob /C get ob /I get get dup /ParentDict known not {pop} { X /Controls [ X Controls null ne { X Controls aload pop X } if X 20 dict begin X /Obj ob /C get ob /I get get def X /Instance? Obj /ClassName known not def X /Class Obj Instance? { /ParentDict get } if def X /ClassDicts [ Obj /ParentDictArray get aload pop Obj ] def X /MethodDict 1000 dict def X /ClassVarDict 1000 dict def X ClassDicts { X { Class /InstanceVarDict get 2 index known not { X dup xcheck 1 index array? and { X MethodDict 2 index dup put X } { X ClassVarDict 2 index dup put X } ifelse X } if X pop pop X } forall X pause pause X } forall X X currentdict /ClassDicts 0 grow-struct X X Instance? not { X /SubClasses [ X /SubClasses Class send { (%) sprintf } forall X ] {gt} quicksort [ X exch { X cvn dup where { exch get } if X } forall X ] def X currentdict /SubClasses 0 grow-struct X pause pause X } if X X /InstanceVars [ X Class /InstanceVarDict get { pop (%) sprintf } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /InstanceVars 0 grow-struct X dup /ClassEditor true put X pause pause X X /ClassVars [ X ClassVarDict { pop 80 string cvs } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /ClassVars 0 grow-struct X dup /ClassEditor true put X pause pause X X /Methods [ X MethodDict { pop 80 string cvs } forall X ] {gt} quicksort [ exch { cvn } forall ] def X currentdict /Methods 0 grow-struct X dup /ClassEditor true put X pause pause X X /Obj null def X /Class null def X /MethodDict null def X /ClassVarDict null def X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } ifelse X } def X} ifelse X X /canvas { X ob /C get ob /I get get type /canvastype ne {pop} { X /Controls [ X Controls null ne { X Controls aload pop X } if X 10 dict begin X X /CanvasBBoxView ob /C get ob /I get get def X currentdict /CanvasBBoxView 0 grow-struct X dup begin X /layout-proc /layout-canvasbbox def X /display-proc /display-canvasbbox def X /erase-proc /erase-nothing def X /click-proc /click-dragcanvas def X /transfer-proc /transfer-reparent def X end X X% This needs to be fixed to work under X11/NeWS. X% But it uses too much space anyway... Needs to be its own type of editor. X% /CanvasImageView ob /C get ob /I get get def X% currentdict /CanvasImageView 0 grow-struct X% dup begin X% /layout-proc /layout-canvasimage def X% /display-proc /display-canvasimage def X% /erase-proc /erase-nothing def X% /click-proc /click-dragimage def X% /transfer-proc /transfer-reparent def X% end X% X% /ViewX 0 def X% /ViewY 0 def X% X% CanvasImageView canvas-rect % x y w h X% 4 2 roll pop pop % w h X% BigHeight min exch BigWidth min exch X% X% /ViewHeight exch def X% /ViewWidth exch def X% currentdict /ViewWidth 0 grow-struct X% currentdict /ViewHeight 0 grow-struct X X /Children [ X ob /C get ob /I get get /TopChild get { X dup null eq { pop exit } if X dup /CanvasBelow get X } loop X ] def X currentdict /Children 0 grow-struct X end X ] def X Silent? not { /redo-layout null self exch pop send } if X } ifelse X } def X X% ------------------------------------------------------------------------ X X end % struct-editors X X /open-editor { % name => - X struct-editors 1 index known not { pop nhh } { X gsave X DL /Icon? undef X ItemCanvas setcanvas X ObjectX ObjectY ObjectHeight add translate X ob begin X struct-editors exch get exec X end X grestore X } ifelse X } def X X /open-struct-editor { % - => - X gsave X DL /Icon? undef X ItemCanvas setcanvas X ObjectX ObjectY ObjectHeight add translate X ob begin X C I get dup type dup struct-editors exch known not { pop pop } { X struct-editors exch get exec X } ifelse X end X% Silent? not { redo-layout } if X grestore X } def X X /open-struct { % levels => - X gsave X DL /Icon? undef X ItemCanvas setcanvas X ObjectX ObjectY ObjectHeight add translate X ob begin X grow-substruct X end X Silent? not { redo-layout } if X grestore X } def X X % (dl on dictstack) X /replace-struct { % obj => - X % Oh, lordy, lordy, lordy! X mark exch C I 3 -1 roll X { put } errored { cleartomark } { X cleartomark X C I L grow-struct X begin X /Branches Branches X% /Controls Controls X /C dup load /I dup load % /L L X /Obj dup load /Str Str X /X X /Y Y /W W /H H X /Font Font X end X def def def def def def def def def def def % def X } ifelse X } def X X % DL on dict stack X /grow-substruct { % l => - X /L exch def X /Branches X C I L grow-struct X 1 index get def X } def X X /composite-type-dict 30 dict def X composite-type-dict begin X { /arraytype /dicttype /canvastype /processtype /eventtype /fonttype X /stringtype % use special string editor X% X11/NeWS: X /packedarraytype /colormapentrytype /environmenttype X /colormaptype % X11/NeWS pre-fcs bug causes panic when we open these! X /visualtype /cursortype X } { true def } forall X end % composite-type-dict X X /composite? { % obj => bool X type //composite-type-dict exch known X } def X X /forbidden-dict 50 dict def X forbidden-dict begin X /Interests null def X /Process null def X /BuildChar null def X /Encoding null def X /WidthArray null def X /ParentDictArray null def X /ParentDict null def X /TopCanvas null def X /BottomCanvas null def X /TopChild null def X /CanvasAbove null def X /CanvasBelow null def X /Parent null def X end % forbidden-dict X X /forbidden? { X forbidden-dict exch known Filter? and X } def X X % Collection Index Levels => dict X /grow-struct { X /xcurs /xcurs_m ItemCanvas setstandardcursor X LayoutLock { X /hourg /hourg_m ItemCanvas setstandardcursor X do-grow-struct X } monitor X /xhair /xhair_m ItemCanvas setstandardcursor X } def X X /object-label { % - => str X /Obj load X% short-name X currentdict DL eq { X short-name X } { X smart-name X I short-name ( : ) append exch append X } ifelse X } def X X /button-label { X Branches null eq { X I 80 string cvs X % Insert spaces to make button easier to press, and so round X % caps don't overlap label. X ( % ) sprintf X } { X object-label X } ifelse X } def X X /reference-label { % - => str X /C load smart-name ( ) append X /I load short-name append ( : ) append X /Obj load smart-name append X } def X X /do-grow-struct { % Container Index Levels => DL X pause X 32 dict begin X /L exch def X cvlit /I exch def cvlit /C exch def X /Obj null def X /Str make-label def % updates /Obj X /X 0 def X /Y 0 def X /W 0 def X /H 0 def X /StrY 0 def X /TipX null def X /TipY null def X L 0 gt { X I forbidden? not { X /Obj load dup type /stringtype ne { X composite? X } {pop false} ifelse X } false ifelse X } false ifelse { X open-obj-branches X currentdict /Controls known not { X /Controls null def X } if X } { X /Branches null def X /Controls null def X } ifelse X currentdict end X } def X X /open-obj-branches { X /Obj load dup array-or-string? { X /Branches exch [ exch X { pop /Obj load counttomark 1 sub L 1 sub do-grow-struct } forall X ] def X } { X /Branches exch [ exch X { pop /Obj load exch L 1 sub do-grow-struct } forall X ] Sort? {SortBy quicksort} if def X } ifelse X } def X X % /SortBy default: X /by-name { X /Str get exch /Str get lt X } def X X /by-value { X /Str get cvr exch /Str get cvr lt X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Layout X X /perform-layout { X /xcurs /xcurs_m ItemCanvas setstandardcursor X LayoutLock { X { X /hourg /hourg_m ItemCanvas setstandardcursor X /ItemLabel nice-item-label store X init-format DL do-layout X /ObjectHeight DL /H get store X adjust-geometry X } fork waitprocess pop X } monitor X /xhair /xhair_m ItemCanvas setstandardcursor X } def X X /init-format { X /Point StartPoint def X /x 0 def X /y 0 def X /ObjectWidth 0 def X /ObjectHeight 0 def X } def X X% /LineHeight { X% Font fontheight 1 add X% } def X X /do-layout { % dict => - X begin X /layout-proc load cvx exec X end X pause X } def X X% /old-layout-struct { % - => - X% /Str make-label def X% /Obj load xcheck Point SmallPointSize gt and { X% /Font ItemXFont Point scalefontquant def X% } { X% /Font Point SmallPointSize le X% ItemSFont ItemFont ifelse Point scalefontquant def X% } ifelse X% Font setfont X% /X x def X% /Y y def X% /W Str stringwidth pop LineGap add def X% Branches null eq { % Icon? or X% /H LineHeight def X% } { X% /x x W add store X% Point X% /Point Point Shrink mul store X% Branches { X% do-layout X% } forall X% /Point exch store X% /x x W sub store X% 0 0 % w h X% Branches { X% begin X% exch W max X% exch H add X% end X% } forall % W H X% LineHeight max 1 max /H exch def X% /TipX X W add LineGap sub def X% /TipY Y H 2 div sub def X% W add /W exch def X% } ifelse X% /Y Y H sub def X% /StrY Y Font fontdescent add H LineHeight sub 2 div add def X% /y Y store X% /ObjectWidth ObjectWidth x W add LineGap sub max store X% } def X X % layout-proc X /layout-struct { % - => - X /Str make-label def X /Obj load xcheck Point SmallPointSize gt and { X /Font ItemXFont Point scalefontquant def X /LineHeight Font fontheight .5 add 1 max def X } { X /Font X Point SmallPointSize le ItemSFont ItemFont ifelse X Point scalefontquant def X /LineHeight Font fontheight .5 add 1 max def X } ifelse X Font setfont X /X x def X /Y y def X /W Str stringwidth pop Pad dup add add def X /StrX X Pad add def X Branches null eq { % Icon? or X /H LineHeight def X /Y Y H sub def X /StrY Y Font fontdescent add H LineHeight sub 2 div add def X /y Y store X } { X OpenToRight? { X /x x W add Pad add LineGap add store X /y y Pad sub store X } { X /x x SubStructureIndent add Pad add LineGap add store X /y y LineHeight sub Pad sub store X } ifelse X Point X /Point Point Shrink mul store X Branches X /do-layout load X forall X /Point exch store X OpenToRight? { X /x x W sub Pad sub LineGap sub store X } { X /x x SubStructureIndent sub Pad sub LineGap sub store X } ifelse X X 0 % w X Branches { X /W get max X } forall % W X Branches length 0 eq { X 0 % W H X /TipY Y H 2 div sub def X } { X Branches 0 get begin Y H add end % TopY X Branches dup length 1 sub get /Y get % TopY BottomY X 2 copy add 2 div % TopY BottomY TipY X /TipY exch def % TopY BottomY X sub % W H X } ifelse X X OpenToRight? { % W H X LineHeight max 0 max Pad dup add add /H exch def X% LineHeight max 0 max /H exch def X /TipX X W add Pad add def X W add Pad add LineGap add X /W exch def X /Y Y H sub Pad sub def X /StrY X Y Font fontdescent add H Pad sub LineHeight sub 2 div add Pad add X def X /y Y store X } { % W H X 1 max LineHeight add Pad dup add add /H exch def X /TipX x SubStructureIndent add Pad add def X SubStructureIndent add Pad add LineGap add W max Pad add X /W exch def X /Y Y H sub def X /StrY X Y Font fontdescent add H LineHeight sub add X def X /y Y store X } ifelse X } ifelse X X Controls null ne { X /x x SubStructureIndent add store X% /x x LineGap 2 div add store X /y y Pad sub store % XXX? X Point X /Point Point Shrink mul store X Controls X /do-layout load X forall X /Point exch store X% /x x LineGap 2 div sub store X /x x SubStructureIndent sub store X X 0 % w X Controls { X /W get max X } forall % W X X Controls length 0 eq { X 0 % W H X } { X Controls 0 get begin Y H add end % TopY X Controls dup length 1 sub get /Y get % TopY BottomY X sub % W H X } ifelse X X /Y Y 2 index sub Pad dup add sub def X% /H exch H add def /W exch LineGap 2 div add W max def X /H exch H add Pad dup add add def X /W exch SubStructureIndent add Pad add W max def X /y Y store X } if X X /ObjectWidth ObjectWidth x W add max store X } def X X /canvas-rect { % can => w h X gsave X setcanvas X clippath pathbbox points2rect X grestore X } def X X % layout-proc X /layout-canvasbbox { X /Str make-label def X /Font ItemFont Point scalefontquant def X C I get dup type /canvastype ne { pop 1 1 } { X % size of parent or of self if null parent X dup /Parent get dup null ne { exch } if X pop canvas-rect % x y w h X 4 2 roll pop pop % w h X } ifelse X /ParentH exch def /ParentW exch def X /LineHeight Point 5 mul 1 max def X /H LineHeight Pad dup add add def % why the extra pad??? X /W LineHeight ParentH div ParentW mul Pad dup add add def X /X x def X /Y y H sub def X /y Y store X /ObjectWidth ObjectWidth x W add max store X } def X X % layout-proc X /layout-canvasimage { X /Str make-label def X /Font ItemFont Point scalefontquant def X% C I get dup type /canvastype ne { pop 1 1 } { X% % size of parent or of self if null parent X% dup /Parent get dup null ne { exch } if X% pop canvas-rect % x y w h X% 4 2 roll pop pop % w h X% } ifelse X /LineHeight Point 5 mul 1 max def X /H C /ViewHeight get Pad dup add add def X /W C /ViewWidth get Pad dup add add def X /X x def X /Y y H sub def X /y Y store X /ObjectWidth ObjectWidth x W add max store X } def X X /transfer-reparent { X % if it's a canvas, and we're a canvas, reparent it into our canvas. X % XXX: TODO! X } def X X /draw-struct { % dict => - X pause X begin X Icon? { X gsave X Font setfont X 0 Font fontdescent IconH sub X 2 copy moveto X Str _show X translate X -2 ItemRadius X Str stringbbox points2rect X insetrrect rrectpath X 0 setlinewidth X 0 setgray X _stroke X grestore X } { X gsave X % get default if not defined (don't use parent's) X currentdict /display-proc known { X /display-proc load X } { X self /display-proc get X } ifelse X cvx exec X grestore X } ifelse X end X } def X X% The arcto's trigger a pathforall bug with still.ps ... X % display-proc X /bad-display-button { X _newpath X X Y 1 add moveto X X W add Y 1 add % x1 y1 X 2 copy H 2 div add % x1 y1 x2 y2 X Pad arcto pop pop pop pop % X X W add Y H add % x1 y1 X X Y H add % x1 y1 x2 y2 X Pad arcto pop pop pop pop X X Y H add lineto X _stroke X display-tree-struct X } def X X % display-proc X /display-button { X _newpath X X Y 1 add moveto X% X Y moveto X W Pad sub 0 rlineto X Pad Pad rlineto X% 0 H Pad dup add sub rlineto X 0 H Pad dup add sub 1 sub rlineto X Pad neg Pad rlineto X Pad W sub 0 rlineto X _stroke X display-tree-struct X } def X X /display-tree-struct { X show-obj X Branches null ne { X show-structure-lines X show-insides X } if X Controls null ne { X show-control-lines X show-controls X } if X } def X X /display-canvasbbox { X X Pad add Y Pad add translate X W Pad dup add sub ParentW div X H Pad dup add sub ParentH div scale X _newpath X 0 0 ParentW ParentH rectpath X .5 setgray _fill X C I get % can X dup type /canvastype eq { dup /Parent get null eq } true ifelse { X pop X } { X gsave X dup /Parent get setcanvas X dup getcanvaslocation X grestore X translate X canvas-rect % x y w h X rectpath % X 0 setgray X _fill X } ifelse X } def X X /display-canvasimage { X X Y translate X _newpath X 0 0 W H rectpath X gsave .5 setgray _fill grestore X 0 setgray _stroke X Pad Pad translate X 0 0 W Pad dup add sub H Pad dup add sub rectpath X clip X _newpath X C I get % can X dup type /canvastype eq { dup /Parent get null eq } true ifelse { X pop X } { X gsave X dup canvas-rect % x y w h X C /ViewX get neg C /ViewY get neg translate X scale % x y X pop pop % X imagecanvas X grestore X } ifelse X } def X X /show-obj { X Font setfont X StrX StrY moveto X Str _show X } def X X % erase-proc X /erase-nothing { } def X X % erase-proc X /erase-label { X gsave X Font setfont X StrX StrY translate X Str stringbbox points2rect % x y w h X exch Pad add exch % fudge the width X rectpath X% X Y W H rectpath X 1 setgray fill X grestore X } def X X /erase-lines { X Branches null ne { X Branches length 0 ne { X gsave X newpath X TipX 1 sub Y Branches 0 get /X get TipX sub 2 add H rectpath X 1 setgray fill X grestore X } if X } if X } def X X /old-change-label { % str => - X gsave X Font setfont X Str stringwidth pop X exch /Str exch def X Str stringwidth pop X exch sub X dup 0 eq Branches null eq or { X pop show-obj X } { X erase-lines X /TipX exch TipX add def X TipX X Branches 0 get /X get Pad 4 mul sub TipX lt { X /TipX TipX LineGap add def X /redo-layout null self exch pop send X } { X show-structure-lines X show-obj X } ifelse X } ifelse X grestore X } def X X /change-label { % str => - X OpenToRight? { old-change-label } { X /Str exch def X show-obj X } ifelse X } def X X% /show-structure-lines { X% TipX TipY X% Branches length 0 eq { X% 2 copy moveto Pad dup rlineto X% moveto Pad dup neg rlineto X% _stroke X% } { X% Branches 0 get % first X% begin X% 2 copy moveto X% X Pad sub Y H add lineto X% Pad 5 mul 0 rlineto X% _stroke X% end X% ShowFan? { X% Branches 0 1 index length 1 sub getinterval { X% begin X% 2 copy moveto X% X Pad sub Y lineto X% Pad 2 mul 0 rlineto X% _stroke X% end X% } forall X% } if X% Branches dup length 1 sub get begin X% moveto X% X Pad sub Y lineto X% Pad 5 mul 0 rlineto X% _stroke X% end X% } ifelse X% OpenToRight? not { X% TipX TipY moveto X% Pad neg 0 rlineto X% TipX Pad sub StrY Font fontdescent sub lineto X% _stroke X% } if X% } def X% X /show-structure-lines { X Branches length 0 eq { X TipX TipY moveto Pad 0 rlineto X _stroke X } { X C I get dup type /arraytype ne { pop } { X xcheck { X % draw { } X% TODO: Make braces! X Branches 0 get begin Y H add end % TopY X Branches dup length 1 sub get /Y get % TopY BottomY X sub 2 div % FanHeight X TipX LineGap add % FanHeight x X TipY 2 index add % FanHeight x y X moveto % FanHeight X LineGap neg 1 index -2 div rlineto X LineGap 4 div % FanHeight dx X 1 index -4 div % FanHeight dx dy X rlineto % FanHeight X X TipX LineGap add % FanHeight x X TipY 2 index sub % FanHeight x y X moveto % FanHeight X LineGap neg 1 index 2 div rlineto X LineGap 4 div % FanHeight dx X 1 index 4 div % FanHeight dx dy X rlineto % FanHeight X pop % X _stroke X } { X % draw [ ] X TipX LineGap add % x X Branches 0 get begin Y H add end % x y X moveto % X LineGap neg 0 rlineto X TipX % x X Branches dup length 1 sub get /Y get % x y X lineto % X LineGap 0 rlineto X _stroke X } ifelse X } ifelse X TipX TipY % x y X Branches 0 get begin X 2 copy moveto X X Y H add lineto X Pad 5 mul 0 rlineto X _stroke X end X ShowFan? { X Branches 0 1 index length 1 sub getinterval { X begin X 2 copy moveto X X Y lineto X Pad 2 mul 0 rlineto X _stroke X end X } forall X } if X Branches dup length 1 sub get begin X moveto % X X Y lineto X Pad 5 mul 0 rlineto X _stroke X end X } ifelse X TipX TipY moveto X Pad neg 0 rlineto X OpenToRight? not { X TipX Pad sub StrY Font fontdescent sub lineto X } if X _stroke X } def X X /show-insides { X Branches { X draw-struct X } forall X } def X X /show-control-lines { X Controls null ne { X Controls length 0 ne { X Controls dup length 1 sub get begin X X dup X Y moveto X end X StrY Font fontdescent sub lineto X 0 setgray X _stroke X } if X } if X } def X X /show-controls { X Controls { X draw-struct X } forall X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Printing X X /write-DL { X DL print-struct X } def X X /print-struct { X { LayoutLock { X X gsave X ItemCanvas setcanvas X erasepage X% ObjectX ObjectY ObjectHeight add translate X StillDict begin X 10 dict begin X /_usefont? true def X /_out? true def X /_output_tx -30 def X /_output_ty -30 def X /_output_sx 1 def X /_output_sy 1 def X _stillbegin X X% ItemRadius label-bbox rrectpath X label-bbox rectpath X ItemFillColor setcolor _fill X ItemFrame 0 gt { X% ItemFrame ItemRadius label-bbox rrectframe X ItemFrame label-bbox rectframe X ItemBorderColor setcolor _eofill X } if X% ItemRadius object-bbox rrectpath X object-bbox rectpath X ItemFillColor setcolor _fill X ItemFrame 0 gt { X% ItemFrame ItemRadius object-bbox rrectframe X ItemFrame object-bbox rectframe X ItemBorderColor setcolor _eofill X } if X X% ShowLabel: X ItemLabel ItemTextColor LabelX LabelY ItemLabelFont X gsave X setfont translate setcolor X 0 0 moveto X % Assuming a string Thing... X 0 currentfont fontdescent rmoveto _show X grestore X X ItemTextColor setcolor X ObjectX ObjectY ObjectHeight add translate X X 0 setlinewidth X DL draw-struct X _stillend X end % 10 dict X end % StillDict X grestore X X } monitor X X } fork waitprocess pop X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Stack stuff X X /execute-it { % obj => - X /exec-and-update dialog-item send X } def X X /TellStack { % message => - X createevent begin X /Name exch def X /ClientData Index def X /Action StackI def X /Canvas ItemParent def X currentdict end sendevent X } def X X /pack { X StackI null ne { X /PackStack items StackI get send X } if X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Snap dragging X X /pinned? { % y h => bool X location pop PinX add 3 1 roll % x y h X 6 exch % x y w h X pin-rect rectsoverlap X } def X X % items backgroundcolor => - (interactively move item) X /moveinteractive { X ItemBegin X 10 dict begin X /GA_constraint 0 def X /GA_value /calc_GA_value load def X currentcursorlocation X /DY exch def /DX exch def X ItemCanvas /Transparent get { X fillcanvas % items X /bbox self send % items x y w h X true dragcanvas currentcanvas mapcanvas X X % paint all items overlapping old item bbox & newly moved item X % the mark ugly is just to avoid a local var dict; mainly X % because of the self call above. X mark 6 -1 roll { % x y w h mark <k> item X counttomark 2 eq {exch pop} if % x y w h mark item X exch pop % x y w h item X 5 copy % x y w h item x y w h item X /bbox exch send rectsoverlap 1 index self eq or X {/paint exch send} {pop} ifelse X mark % x y w h mark X } forall X 5 {pop} repeat X } { X currentcanvas mapcanvas false dragcanvas X% true dragcanvas currentcanvas mapcanvas X pop pop X } ifelse X end X ItemEnd X } def X X /SnapIn { X ThisI StackI ne { X StackI null ne { X /PopMe TellStack X } if X /StackI ThisI store X /PushMe TellStack X } if X } def X X /SnapOut { X StackI null ne StackI Index ne and { X /PopMe TellStack X /StackI null store X } if X } def X X /snaps-here? { % - => bool X ThisI null eq ThisI Index eq or {false} { X /pin-rect dialog-item send X label-rect X rectsoverlap dup { X SnapIn X } { X SnapOut X } ifelse X } ifelse X } def X X /calc_GA_value { X StackI Index eq { X currentcursorlocation pop % cx X } { X StackI null eq { X snaps-here? { X location X pop DX add % ix X } { X currentcursorlocation pop % cx X } ifelse X } { X location TabY add TabHeight X /pinned? items StackI get send not { X SnapOut X pop currentcursorlocation pop % cx X } { % ix X { location pop PinX add } items StackI get send % ItemX PinX X PinX sub % ItemX ItemGoal X exch 1 index exch sub % ItemGoal ItemDelta X currentcursorlocation pop % ItemGoal ItemDelta CurX' X 2 index exch sub % ItemGoal ItemDelta CurDelta X DX add dup abs TabWidth gt { X SnapOut X pop pop pop currentcursorlocation pop DX sub X } { X 1 index abs 1 index abs gt {exch} if % ItemGoal Close Far X pop % ItemGoal Close X% .2 mul sub X sub X } ifelse X DX add X } ifelse X } ifelse X } ifelse X } def X X /NextPos { % - => x y X location % x y X label-bbox % X Y x y w h X exch pop add % X Y x y+h X 3 -1 roll add % X x Y+y+h X exch 3 -1 roll add exch % X+x Y+y+h X exch PinX add exch X } def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Storage managment X X /Free { X SnapOut X ItemCanvas /Retained false put X unmap X /DL null store X% /ItemObject [[null] 0] store X ItemLock { X /free-items [ X free-items aload pop Index X ] store X } monitor X } def X X /init-attributes { X { /ObjectWidth /DL /Shrink X /layout-proc /click-proc /transfer-proc /display-proc /erase-proc X /Point /OpenToRight? /ShowFan?} X { InstanceVarDict 1 index get store } forall X /ObjectLoc /Right store X self /StartPoint undef X adjust-geometry X } def X X % obj => - X /Reuse { X Collection Index 3 -1 roll put X ItemCanvas /Retained true put X ItemCanvas canvastotop X init-attributes X %ensure-DL X %redo-layout X } def X X /destroy { X ItemCanvas /Retained false put X unmap X ItemEventMgr null ne { X ItemEventMgr killprocess X } if X } def X Xclassend def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Pallets of useful functions X X% Pallets are meant to be pushed onto the stack, opened up, and used X% like control panels by clicking on the functions. Double click the X% point button, or set the click-action to click-exec, and clicking X% the Adjust button. (After a few revolutions, the pallets will X% automatically have click-exec actions, and the functions will look X% like buttons. (By virtue of a general purpose view-saving facility.)) X X/Pallets 100 dict def X XPallets begin X X /Debug dictbegin X X /break-exit { dbgexit dstack } def X /break-kill { dbgkill dstack } def X /break-list /dbglistbreaks load def X /break-enter { dbgenter dstack } def X /break-cont { dbgcontinue dstack } def X /break-copy&cont { dbgcopystack dbgcontinue dstack } def X X /clear /clear load def X /enter-it { selected-object enter } def X /exit /exit load def X X X /fix-typo { % undefined (select correct spelling) => - X userdict begin X dup cvlit [ selected-object (%) sprintf cvn cvx ] cvx def X end X exec X } def X X /push-dictstack { currentprocess /DictionaryStack get } def X /push-execstack {DbgImplicitBreak DbgGetExecStack} def X /push-process { DbgImplicitBreak } def X X /show-dictstack { dstack } def X /show-execstack /dbgwhere load def X X dictend def X X /Window 20 dict begin X /make-a-window! { X /win X framebuffer /new DefaultWindow send X def X { newprocessgroup X /reshapefromuser win send X /map win send X } fork waitprocess pop X /can /ClientCanvas win send def X (%% The new window is called "win".\n) print X (%% Its ClientCanvas is called "can".\n) print X (%% Setting the currentcanvas to "can", ) print currentcanvas == X can setcanvas X } def X dictend def X X /Menu dictbegin X /dict-select { X selected-object dup type /dicttype ne { pop } { X [ exch X { X 1 index type /nametype eq { X exch X 40 string cvs X exch X } if X [ exch [ exch ] 0 /get load /select-object cvx ] cvx X } forall X ] /new DefaultMenu send X dup /MenuButton AdjustButton put X dup /AdjustButton MenuButton put X gsave X framebuffer setcanvas X currentcursorlocation /showat 4 -1 roll send X grestore X } ifelse X } def X dictend def X Xend % Pallets X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% StructItem Menu definitions X X/nhh { X gsave X framebuffer setcanvas X currentcursorlocation X [ (Nothing)(Happens)(Here!) ] popmsg pop X grestore X} def X XXNeWS? { X /MakePointSizeThings { % - => ...things... X {1 3 5 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 28 30 32 34} X { X [ exch dup 3 string cvs exch X { dup SmallPointSize le ItemSFont ItemFont ifelse } StructItem send X exch scalefontquant ] X } forall X } def X} { X /MakePointSizeThings { % - => ...things... X {1 2 4 6 8 10 12 14 16 18 20 22 24 28 32} { X [ exch dup 3 string cvs exch X { dup SmallPointSize le ItemSFont ItemFont ifelse } StructItem send X exch scalefontquant ] X } forall X } def X} ifelse X X/TabLocationMenu [ X (LeftBelow) (LeftAbove) (AboveLeft) (AboveRight) X (RightAbove) (RightBelow) (BelowRight) (BelowLeft) X] [ X { currentkey cvn X {/ObjectLoc exch def location 10 10 reshape damage-view} X it send } X] /new CyberMenu send store XTabLocationMenu /PieInitialAngle 360 16 div put X X/TabClickMenu [ X (click-transfer) (click-type) X (click-exec) (click-magic) (click-push) X (click-step) (click-select) (click-edit) X] [ X {currentkey cvn {/click-proc exch def} it send} X] /new CyberMenu send def X X/ClickMenu [ X (click-transfer) (click-type) X (click-exec) (click-magic) (click-push) X (click-step) (click-select) (click-edit) X] [ X {ob /click-proc currentkey cvn dup /null eq {pop undef} {put} ifelse} X] /new CyberMenu send def X X/TabViewMenu [ X [ MakePointSizeThings ] % point size X [ (true) (false) ] % fan X [ (0) (1) (2) (3) (4) (5) (6) (7) (8) ] % open X [ (/Below) (/Right) ] % direction X [ 10 5 200 { 100 div 10 string cvs } for ] % shrink X nullarray % --- X nullarray % --- X nullarray % click... X] [ X (point size) X {getmenuarg 0 get cvx exec {/StartPoint exch def redo-layout} it send} X (fan) { getmenuarg cvx exec {/ShowFan? exch def paint} X it send } X (open) { getmenuarg cvi X { DL null eq { pop } { X /ob DL store X open-obj X } ifelse X } it send } X (direction) { getmenuarg cvx exec /set-open-direction it send} X (shrink) { getmenuarg cvx exec X 1000 mul floor 1000 div % X11/NeWS .9499 bug X {/Shrink exch def redo-layout} X it send } X (---) {} X (---) {} X (click...) TabClickMenu X] /new PulloutCyberMenu send def XTabViewMenu /LabelMinRadius 35 put X%TabViewMenu /PieInitialAngle 135 put X X/ViewMenu [ X [ MakePointSizeThings (/Default) ] % point size X [ (true) (false) (/Default) ] % fan X [ (0) (1) (2) (3) (4) (5) (6) (7) (8) ] % open X [ (/Below) (/Right) (/Default) ] % direction X [ 10 5 200 { 100 div 10 string cvs } for (/Default) ] % shrink X nullarray % --- X nullarray % --- X nullarray % click... X] [ X (point size) {getmenuarg 0 get cvx exec /pointsize-obj it send} X (fan) {getmenuarg cvx exec {set-show-fan paint} it send} X (open) {getmenuarg cvi /open-obj it send} X (direction) {getmenuarg cvx exec {set-open-direction redo-layout} X it send} X (shrink) { getmenuarg cvx exec X /shrink-obj it send} X (---) { } X (---) { } X (click...) ClickMenu X] /new PulloutCyberMenu send def XViewMenu /LabelMinRadius 35 put X%ViewMenu /PieInitialAngle 135 put X X/TabMenu [ X (Layout) {/redo-layout it send} X (Tab...) TabLocationMenu X (Zap) {/Free it send} X (Paint) {/paint it send} X (Print) {/write-DL it send} X (View...) TabViewMenu X] /new CyberMenu send store X X/ConvertMenu [ X (tokein) { /tokein-obj it send } X (executable) { /cvx-obj it send } X (name) { /cvn-obj it send } X (string) { /cvs-obj it send } X (tokeout) { /tokeout-obj it send } X (literal) { /cvlit-obj it send } X (integer) { /cvi-obj it send } X (real) { /cvr-obj it send } X] /new CyberMenu send def X X/SelectMenu [ X (Pointer) { ob /C get ob /I get kbd-select-pointer } X (Index) { ob /I get kbd-select-object } X (Object) { ob /C get ob /I get get kbd-select-object } X (Container) { ob /C get kbd-select-object } X] /new CyberMenu send def X X/OpenMenu [ X nullarray X [ (1) (2) (3) (4) ] X [ (1) (2) (3) (4) ] X nullarray X] [ X (---) {} X (right) {getmenuarg cvi /open-right-obj it send} X (below) {getmenuarg cvi /open-below-obj it send} X (close) {0 /open-obj it send} X] /new PulloutCyberMenu send def X X/GutsMenu [ X (it: item) { it kbd-select-object } X (DL: item's DL) { /DL it send kbd-select-object } X (userdict) { userdict kbd-select-object } X (ob: DL object) { ob kbd-select-object } X (obs: DL path) { obs kbd-select-object } X] /new CyberMenu send def X X/EtcMenu [ X (molecule) { /molecule-obj it send } X (select...) SelectMenu X% (reference) { /reference-obj it send } X (load) { /load-obj it send } X (guts...) GutsMenu X] /new CyberMenu send def X X/TypeFont /Screen findfont 12 scalefontquant def X X/StructMenu [ X nullarray X [ [ { [ ob /Obj get type 30 string cvs X 0 1 index length 4 sub getinterval % chop "type" X TypeFont X ] exch pop dup type exec X } X ] X ] X nullarray nullarray nullarray nullarray nullarray nullarray X] [ % Note: depends on fixed getmenuarg X (push) {/push-obj it send} X (type...) /FigureTypeAction cvx X% (load) {/load-obj it send} X (open...) OpenMenu X (etc...) EtcMenu X (exec) {/exec-obj it send} X (convert...) ConvertMenu X (paste) {/paste-obj it send} X (view...) ViewMenu X] X/new PulloutCyberMenu send def X{ /LabelMinRadius 25 def X /FigureTypeAction { X ob /Obj get type TypeActionDict 1 index known { X TypeActionDict exch get cvx exec X } { X% pop { /nhh it send } X OtherMenu X } ifelse X } def X} StructMenu send X X/PalletMenu X [ Pallets { pop 100 string cvs } forall ] {lt} quicksort X [ { currentkey cvn { Pallets exch get push-it } dialog-item send } ] X /new CyberMenu send Xdef X X/CommandMenu [ X (wet) {} X (paint) {} X] /new CyberMenu send def X X/BreakMenu [ X (userdict) { { clear countdictstack 2 sub { end } repeat X userdict /CyberUserdict dbgbreak } fork pop } X (stack) { { clear dialog-item X /CyberStack /dbgbreak dialog-item send } fork pop } X (window) { { clear win X /CyberWindow /dbgbreak win send } fork pop } X (struct) { { clear items 0 get X /CyberStruct /dbgbreak 2 index send } fork pop } X] /new CyberMenu send def X X/DialogMenu [ X nullarray X [ MakePointSizeThings ] X [(7) (11) (13) (15)] X nullarray X nullarray X nullarray X] [ X (dbgbreak...) BreakMenu X (object size) {StructItem /StartPoint getmenuarg 0 get cvi put} X (text size) {null getmenuarg cvi /changefont dialog-text send} X (pack stack) {/PackStack it send} X (reboot process) {/kbd-reboot dialog-item send} X (reset input) {/kbd-reset it send} X% (credits) { /display-credits win send } X] /new PulloutCyberMenu send def X X/SelectionMenu [ X (push) {{Collection Index get push-it} it send} X (load) {{Collection Index get load-it} it send} X (exec) {{Collection Index get exec-it} it send} X% (convert...) /ConvertMenu StructItem send X (convert...) ConvertMenu X] /new CyberMenu send def X X/BackgroundMenu [ X (Pallets...) PalletMenu X (Framebuffer) { /push-framebuffer-children dialog-item send } X (Canvases) { /push-selected-canvases dialog-item send } X (Windows) { /push-windows dialog-item send } X (Commands...) CommandMenu X (Processes) { /push-processes dialog-item send } X (Stack...) DialogMenu X (Object) { /push-object dialog-item send } X] /new CyberMenu send def X X/Types { X nulltype integertype realtype booleantype colortype marktype X operatortype nametype stringtype shapetype monitortype X graphicsstatetype cursortype filetype arraytype dicttype X fonttype canvastype processtype eventtype X% X11/NeWS: X savetype packedarraytype colormapentrytype environmenttype X colormaptype pathtype visualtype vmtype X} def X X/TypeActionDict 50 dict def XTypeActionDict begin X /integertype /IntegerMenu def X /realtype /RealMenu def X /booleantype /BooleanMenu def X /colortype /ColorMenu def X /nametype /NameMenu def X /stringtype /StringMenu def X /graphicsstatetype /GraphicsstateMenu def X /arraytype /ArrayMenu def X /dicttype /DictMenu def X /fonttype /FontMenu def X /canvastype /CanvasMenu def X /processtype /ProcessMenu def X /eventtype /EventMenu def X% /filetype /FileMenu def X% /shapetype /ShapeMenu def X% /cursortype /CursorMenu def X% /monitortype /MonitorMenu def X% /operatortype /OperatorMenu def X% /nulltype /NullMenu def X% /marktype /MarkMenu def X% X11/NeWS: X% /savetype /SaveMenu def X /packedarraytype /ArrayMenu def X% /colormapentrytype /ColormapentryMenu def X% /environmenttype /EnvironmentMenu def X% /colormaptype /ColormapMenu def X% /pathtype /PathMenu def X% /visualtype /VisualMenu def Xend % TypeActionDict X X% ======================================================================= X% Type menus X X/IntegerMenu [ X (step editor) {/step /open-editor it send} X (shift editor) {/shift /open-editor it send} X (digit editor) {/digit /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/RealMenu IntegerMenu def X% /RealMenu [ X% (step editor) {/step /open-editor it send} X% (shift editor) {/shift /open-editor it send} X% (digit editor) {/digit /open-editor it send} X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X X/BooleanMenu [ X (true) {true /modify-obj it send} X (false) {false /modify-obj it send} X (not) {{not} /transform-obj it send} X (boolean editor) {/boolean /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/ColorMenu [ X (user editor) {/user /open-editor it send} X% put color pie menu here! X] /new CyberMenu send def X X/NameMenu [ X (definitions editor) {/definitions /open-editor it send} X (user editor) {/user /open-editor it send} X% pop up menu of definitions? X] /new CyberMenu send def X X/GraphicsstateMenu [ X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/JuggleArrayMenu [ X (pop) { /pop-array-obj it send } % to selection X % rotate array member or subinterval to top X (top) { /top-array-obj it send } X % splice array member or unsplice subinterval X (splice) { /splice-array-obj it send } X % rotate array member or subinterval to bottom X (bottom) { /bottom-array-obj it send } X (push) { /push-array-obj it send } % selected object X (append) { /append-to-array-obj it send } % selected array X % selected array member or subinterval X (delete) { /delete-array-obj it send } X (prepend) { /prepend-to-array-obj it send } % selected array X] /new CyberMenu send def X X/ArrayMenu [ X (juggle...) JuggleArrayMenu X (element editor) {/element /open-editor it send} X (scroller) {/scroller /open-editor it send} X (filter editor) {/filter /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/StringMenu ArrayMenu def X% /StringMenu [ X% (array...) ArrayMenu X% (prepend) {nhh} % selected string X% (append) {nhh} % selected string X% (token) {nhh} % selected string X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X X/DictMenu [ X (def) { /def-in-dict-obj it send } % selected object X (undef) { /undef-in-dict-obj it send } % selected key (or pointer index) X (begin) { /begin-obj it send } X (enter) { /enter-obj it send } X (dbgbreak) { /break-obj it send } X (scroller) {/scroller /open-editor it send} X (filter editor) {/filter /open-editor it send} X (user editor) {/user /open-editor it send} X (class editor) {/class /open-editor it send} X] /new CyberMenu send def X X/FontMenu [ X (class editor) {/class /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/CanvasStateMenu [ X (top) {ob /C get ob /I get get canvastotop} X (map) {ob /C get ob /I get get /Mapped true put} X (retain) {ob /C get ob /I get get /Retained true put} X (unmap) {ob /C get ob /I get get /Mapped false put} X (bottom) {ob /C get ob /I get get canvastobottom} X (opaque) {ob /C get ob /I get get /Transparent false put} X (unretain) {ob /C get ob /I get get /Retained false put} X (transparent) {ob /C get ob /I get get /Transparent true put} X] /new CyberMenu send def X X/CanvasMenu [ X (state...) CanvasStateMenu X% (manager) {nhh} % select /Interests 0 /Process X% (bbox) {nhh} % select [x y w h] X% (setcanvas) {nhh} % changes proc's gstate X% (zap) {nhh} % unretain & unmap whole tree X (class editor) {/class /open-editor it send} X (canvas editor) {/canvas /open-editor it send} X (scroller) {/canvas /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/ProcessMenu [ X% XXX: Implement these!!! X% (kill) {nhh} X% (kill group) {nhh} X% (suspend) {nhh} X% (resume) {nhh} X% (wait) {nhh} % select return value X% (userdict) {nhh} % select userdict X (class editor) {/class /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X/EventMenu [ X% XXX: Implement these!!! X% (express) {nhh} % Does this make any sense in this context? X% (revoke) {nhh} X% (sendevent) {nhh} X (class editor) {/class /open-editor it send} X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X% /FileMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /ShapeMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /CursorMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /MonitorMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /OperatorMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /NullMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X% X% /MarkMenu [ X% (user editor) {/user /open-editor it send} X% ] /new CyberMenu send def X X/OtherMenu [ X (user editor) {/user /open-editor it send} X] /new CyberMenu send def X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% TextStructItem class definition X X/TextStructItem StructItem Xdictbegin X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Instance variables X X /I null def X /MyStack null def X /MyProcess null def X /Scroller null def X /ScrollerWidth 18 def X /Notifier null def X /NotifierHeight 24 def X /SubItemGap 2 def X /SubItemMgr null def X /DeferedUpdateEvent null def X /UpdateDelay .5 60 div def X /PinHeight 0 def X /DropShadow 6 def Xdictend Xclassbegin X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Class Variables X X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% X% Methods X X /new { X /new super send begin X /MyStack [] def X /ItemLabel (Stack \267) def X currentdict end X } def X X /push-selected-canvases { X gsave X fboverlay setcanvas X 0 0 { moveto 20 20 rmoveto X -40 -40 rlineto X 40 0 rmoveto X -40 40 rlineto X } getanimated waitprocess aload pop X find_canvas X push-it X grestore X } def X X /push-windows { X 10 dict begin X /d 200 dict def X [d] X { currentprocess X /ParentDict where { pop self } { currentdict } ifelse X put X } cvlit X append cvx X RootUserDict begin X AllWin X end % RootUserDict X 10 { pause } repeat % Is this enough, or will 1 pause do it, or what? X d push-it X end % localdict X } def X X XNeWS? { X /push-processes { X getprocesses push-it X } def X } { X /push-processes { X % How should we simulate this bugger in NeWS 1.1? X % getprocesses push-it X (You need NeWS/X!) push-it X } def X } ifelse X X /push-object { X Object push-it % XXX: push opened object editor X } def X X /push-framebuffer-children { X framebuffer push-it % XXX: push opened canvas hierarchy editor X } def X X /kbd-reset { X /dialog-buf () store X /dialog-string () store X { psh-socket bytesavailable string readstring pop X } errored X {(\n%% Reset!\n) print} execute-it X } def X X /shut-down { X { psh-socket (\ndbgstop\nquit\n) writestring X psh-socket flushfile X } errored pop X null null /DropDead TellMyProcess X 1 60 div sleep X } def X X /kbd-reboot { X { X /dialog-buf () store X /dialog-string () store X [ () (%% Reboot!) () ] false /writeatcaret dialog-text send X shut-down X psh-socket null ne { X psh-socket status { psh-socket closefile } if X } if X /psh-socket null store X % I don't know why I have to do this, but it sure helps... (i hope) X items { X% { LayoutLock monitorlocked { /LayoutLock createmonitor def } if X { /LayoutLock createmonitor def X } exch send X } forall X ensure-DL X% { EventMgr null ne { EventMgr killprocess } if X% /EventMgr Interests forkeventmgr store X% KeyboardEventMgr null ne { KeyboardEventMgr killprocess } if X% /KeyboardEventMgr { KeyboardHandler } fork store X% } dialog-text send X start-event-mgrs X } fork pop X } def X X /use-selected-process { X selected-object dup type /processtype eq { X set-process X } if X } def X X /ObjectSize { % - => w h X % XXX bletch: X ObjectWidth 0 eq ObjectHeight 0 eq or { X /ObjectWidth X ItemBorder dup add ItemWidth 1 index sub % w X ScrollerWidth dup add SubItemGap add max X store X /ObjectHeight X ItemHeight exch sub % w h X ScrollerWidth NotifierHeight add SubItemGap add max X store X } if X ObjectWidth ObjectHeight X } def X X /adjust-geometry { X LabelSize /LabelHeight exch def /LabelWidth exch def ======== END OF cyber.shar.splitae ========