/statictext superclass /scroll_width //OLScrollW 4 add cvi def /textarea_width { % -- int w margin2 sub scroll_width sub cvi } def /boxarea_width { % -- int w scroll_width sub cvi } def /set_top_line { % int -- dup display_top_line eq {pop} { /do_set_top_line [3 -1 roll] gexeca /@scroll promoted { [display_top_line] /changevalue /@scroll Send } if } ifelse } def /do_set_top_line { % int -- dup 0 ge { dup total_display_lines le } false ifelse { total_display_lines 0 2 index max_display_lines add 1 sub max min dup display_top_line lt true { 1 index display_bottom_line gt } ifelse { exch /display_top_line exch promote /display_bottom_line exch promote /paint_text_from_line [ display_top_line] gexeca } { textfont fontheight line_gap add cvi 2 index display_top_line lt { margin 2 index ypos_from_line textarea_width 4 index display_top_line sub 1 add 4 index mul rectpath 0 3 index display_top_line sub 3 -1 roll mul copyarea display_top_line 3 -1 roll /display_top_line exch promote exch /display_bottom_line exch promote display_top_line exch 1 sub paint_text_from_line_to } { margin display_bottom_line ypos_from_line textarea_width display_bottom_line 0 7 index 1 sub max sub 4 index mul rectpath 0 3 index display_top_line sub 3 -1 roll mul copyarea exch /display_top_line exch promote display_bottom_line exch /display_bottom_line exch promote 1 add paint_text_from_line } ifelse } ifelse } {pop} ifelse } def /scroll_up_line { % -- display_top_line 0 gt { display_top_line 1 sub set_top_line } if } def /scroll_down_line { % -- display_top_line total_display_lines lt { display_top_line 1 add set_top_line } if } def /scroll_up_page { % -- display_top_line max_display_lines sub 1 add 0 max set_top_line } def /scroll_down_page { % -- display_top_line max_display_lines add 1 sub total_display_lines min set_top_line } def /scroll_to_top { % -- 0 set_top_line } def /scroll_to_bottom { % -- 0 total_display_lines max set_top_line } def /create_scrollbar { % -- /olscrollbar newmember /@scroll /rename 2 index send pop //nullstring (/Preview {\n [exch] /set_top_line @parent Send } def\n\t\t\t /Action /pop load def ) /setscript 3 index send pop null 0 0 0 /setposition 5 index send /map exch send } def /OnInit { % -- //OnInit exec /@scroll promoted not { create_scrollbar} if } def /compute_display_map_from { % int int string -- //compute_display_map_from exec [ display_top_line max_display_lines total_display_lines] /setparameters /@scroll Send } def /compute_display_map { % -- value length 0 eq { /display_top_line 0 promote /display_bottom_line 0 promote /total_display_lines 0 promote [0 0] /display_map exch promote [ display_top_line max_display_lines total_display_lines] /setparameters /@scroll Send } { 0 0 value compute_display_map_from } ifelse } def /minwidth { % -- float //minwidth exec scroll_width add } def