package win; # Window array has the following elements # (all coordinates are w.r.t. (1,1) = top left hand corner of screen # # @window=( # llx, # the lower-left x coordinate for the window # lly, # the lower-left y coordinate of the window # urx, # the upper-right x coordinate of the window # ury, # the upper right y coordinate of the window # nattr, # the normal attribute for the window # hattr, # the highlight attribute for the window # title # current title text # footer # current footer text # ) # # Associated with the window, at any given time is the current text # body. we use another array. # # @text= # line1, # first line of text to be placed beneath header # line2, # second line of text to be placed beneath footer # ..., # lineN, # nth line of text, with n not to exceed lly - ury - 2 # ) sub clear{ # clear the complete window area local($llx,$lly,$urx,$ury,$attr) = @_; local($width,$height) = ($urx-$llx,$lly-$ury); eval <<'EOLoop'; print "\e"."["."$attr"."m"; # set background attribute, usually black for($i = $ury;$i<=$lly;$i++){ print "\e"."["."$i".";"."$llx"."f"; print " " x $width; } EOLoop 1; } sub refresh{ # print the current buffer in window local(@buffer) = splice(@_,0,shift); local($llx,$lly,$urx,$ury,$attr,$nattr) = splice(@_,0,shift); local($i,$j,$tmp,$tmp2,$string); local($width,$height) = ($urx-$llx-1,$lly-$ury); $llx+=2; eval <<'EOLoop'; print "\e"."["."$attr"."m"; for($i = $ury+1,$j=0;$i<$lly;$i++,$j++){ #if($i==($lly-1)){if(defined($buffer[$j+1])){$j-=($i-1);$i=($ury+1);}} $tmp = $width - length($buffer[$j]); print "\e"."["."$i".";"."$llx"."H"; if ($tmp < 2 ) {$string =substr($buffer[$j],0,$width-3); print $string;} else { print $buffer[$j]; print " " x ($tmp-2); } } EOLoop } sub title{ # highlight the top line, text is arg local($llx,$lly,$urx,$ury,$oattr,$nattr,$text) = @_; local($width) = ($urx-$llx); $fill = $width - length($text); print "\e"."["."$ury".";"."$llx"."f"; print "\e"."["."$nattr"."m"; print $text; print " " x $fill; } sub footer{ # print a footer on the window with text local($llx,$lly,$urx,$ury,$oattr,$nattr,$junk,$text) = @_; local($width) = ($urx-$llx); $fill = $width - length($text); print "\e"."["."$lly".";"."$llx"."f"; print "\e"."["."$nattr"."m"; print $text; print " " x $fill; } sub border{ local($llx,$lly,$urx,$ury,$oattr,$nattr) = @_; local($width) = ($urx-$llx); local($i,$j); $ury+=1; eval <<'EOLoop'; for($i = $ury;$i<$lly;$i++){ print "\e"."["."$i".";"."$llx"."H"; print "\e"."["."$nattr"."m"; print " "; print "\e"."["."$oattr"."m"; print " " x ($width-2); print "\e"."["."$nattr"."m"; print " "; } EOLoop 1; } sub highlight_field{ # highlight a field in current buffer local($row,$col,$field,$attr) = @_; print "\e"."["."$row".";"."$col"."f"; print "\e"."["."$attr"."m"; print $field; } sub getdata{ # get data from the keyboard local($col,$row,$prompt,$attr) = @_; local($tmp)=length($prompt)+1; local($tmp2) = $tmp +$col; print "\e"."["."$row".";"."$col"."H"; print "\e"."["."$attr"."m"; print $prompt; print "\e"."["."0"."m"; print "\e"."["."$row".";"."$tmp2"."H"; $tmp = ; } 1; # bILL - wjm@decster.uta.edu