/olbutton superclass /menudirection /Down def %begin postscript section /menudirection persist %end postscript section %begin postscript section /@menu persist %end postscript section %begin postscript section /defaulted unpersist %end postscript section %begin postscript section /justification unpersist %end postscript section /minwidth { % -- float preferredwidth } def /preferredwidth { % -- float abbreviated //OLButW { gsave textfont setfont str DISize pop //OLMenuButtonCapW2 add 5 add grestore } ifelse } def /action { % -- /defaultactive @menu send { self /execdefault @menu send } if } def /PaintLabel { % any -- FG setcolor textfont setfont //OLButtonCapW 2 w //OLMenuButtonCapW2 sub //OLButtonH 4 sub DIPaintLeft } def /PaintDefaultChoice { % any boolean -- FG setcolor textfont setfont exch //OLButtonCapW 2 w //OLButtonCapW2 sub //OLButtonH 4 sub OLShow not { BG setcolor path OLStipple } if } def /PaintButton { % boolean -- abbreviated { menudirection /Down eq 1 index OLMenuBut { /defaultitem @menu send null eq true { /defaultactive @menu send not } ifelse { BG setcolor path OLStipple } if } if } { dup { pop true w OLButton /defaultitem @menu send /defaultactive @menu send PaintDefaultChoice } { menudirection /Down eq exch w OLMenuButton str PaintLabel } ifelse } ifelse @menu null eq true { active not } ifelse { BG setcolor path OLStipple } if } def /setmenu { % any * -- /@menu promoted { @menu delslave /@menu unpromote } if dup null ne { /menu newobject dup /@menu exch promote addslave /setmenu @menu send } {pop} ifelse } def /OnSelect { % -- @menu null ne { busy not } false ifelse {active} false ifelse { //OnSelect exec } if } def /OnMenu { % -- @menu null ne { busy not } false ifelse {active} false ifelse { abbreviated { menudirection /Down eq true OLMenuBut menudirection /Down eq { self 0 0 /showmenuSE } { self //OLButW //OLButH 2 div /showmenuE } } { menudirection /Down eq true w OLMenuButton str PaintLabel menudirection /Down eq { self w 2 div 0 /showmenuS } { self w //OLButtonH 2 div /showmenuE } } ifelse ifelse @menu send false PaintButton } if } def /setmenudirection { % name -- dup menudirection ne { /menudirection exch softpromote /Paint gexec } {pop} ifelse } def