home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
apps
/
spread
/
opusprg
/
opussrc
/
r.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1988-05-23
|
72KB
|
1,766 lines
{$M+}
{$E+}
PROGRAM Mock;
{$I i:\opus.i}
{$I i:\gctv.inc}
{$I i:\gemsubs.def}
{$I i:\vdi_aes.def}
{$I i:\globsubs.def}
{$I d:\pascal\opus\xbios.def}
{$I d:\pascal\opus\graphout.def}
{$I d:\pascal\opus\stringfn.def}
FUNCTION DESELECT_BLOCK : BOOLEAN;
EXTERNAL;
PROCEDURE DO_PRINT ( s_row,f_row,s_col,f_col : INTEGER; handle : INTEGER );
EXTERNAL;
PROCEDURE CAP_A_STRING ( VAR str : STRING );
VAR i : INTEGER;
BEGIN
FOR i := 1 TO LENGTH(str) DO
IF str[i] IN low_case THEN
str[i] := CHR(ORD(str[i])-$20)
END; { CAPITALIZE }
FUNCTION FORM_BEGIN ( box : Dialog_Ptr; index : Tree_Index ) : Tree_Index;
BEGIN
Hide_Mouse;
Set_Mouse(M_Arrow); { in case it was not that }
Form_Center(box,fo_x,fo_y,fo_w,fo_h);
Blit(screen_mfdb,mem_mfdb,fo_x,fo_y,fo_x,fo_y,fo_w,fo_h);
Form_Dial(0,0,0,0,0,fo_x,fo_y,fo_w,fo_h);
Obj_Draw(box,Root,Max_Depth,fo_x,fo_y,fo_w,fo_h);
Show_Mouse;
form_begin := Form_Do(box,index)
END; { FORM_BEGIN }
PROCEDURE FORM_END;
VAR event : INTEGER;
BEGIN
Hide_Mouse;
Form_Dial(3,fo_x,fo_y,fo_w,fo_h,fo_x,fo_y,fo_w,fo_h);
Set_Clip(0,0,screen_width,screen_height);
Blit(mem_mfdb,screen_mfdb,fo_x,fo_y,fo_x,fo_y,fo_w,fo_h);
{ now must get redraw message generated by clearing the dialog;
possibility of discarding non-redraw messages but this doesn't seem
to be a problem, since all messages preceding the dialog call were
processed, and the modal nature of the dialog prevents the occurence
of message events ( and others ) for this application during the
dialog }
REPEAT
event := Get_Event(E_Message|E_Timer,0,0,0,5,FALSE,0,0,0,0,
FALSE,0,0,0,0,msg_area,i,i,i,i,i,i)
UNTIL event & E_Timer <> 0;
Show_Mouse
END; { FORM_END }
PROCEDURE CHANGE_FORMAT ( caller : FormatCall );
CONST s = 1;
r = 2;
g = 3;
VAR
action : Tree_Index;
chosen_width,
chosen_prec,
i,j,extent,s_row,s_col,
f_row,f_col,chosen_style : INTEGER;
found,do_cw,do_just,do_prec,
do_perc,sci_flag,perc_on,
do_style,dummy,do_dollar,
dollar_on : BOOLEAN;
temp : STR255;
chosen_just : VDI_Just;
ptr : CellPtr;
PROCEDURE INITIALIZE;
BEGIN
indx := Map_Tree(fmat_ptr,Root,Null_Index,ClearSelected);
IF caller = GlobalCall THEN BEGIN
extent := g;
Obj_SetState(fmat_ptr,fmatglob,Selected,FALSE);
Set_Text(fmat_ptr,fmatbegi,null_str,s1,5);
Set_Text(fmat_ptr,fmatend,null_str,s2,5)
END
ELSE IF block_set THEN BEGIN
extent := r;
Obj_SetState(fmat_ptr,fmatrang,Selected,FALSE);
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(fmat_ptr,fmatbegi,temp,s1,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(fmat_ptr,fmatend,temp,s2,5)
END
ELSE BEGIN
extent := s;
Obj_SetState(fmat_ptr,fmatcell,Selected,FALSE);
string_a_cell(data_row,data_col,temp);
Set_Text(fmat_ptr,fmatbegi,temp,s1,5);
Set_Text(fmat_ptr,fmatend,null_str,s2,5)
END;
do_cw := FALSE;
do_dollar := FALSE;
do_just := FALSE;
do_prec := FALSE;
do_perc := FALSE;
do_style := FALSE;
CASE caller OF
CWCall : BEGIN
Obj_SetState(fmat_ptr,fmatcw,Selected,FALSE);
do_cw := TRUE
END;
DollarCall : BEGIN
Obj_SetState(fmat_ptr,fmatdoll,Selected,FALSE);
do_dollar := TRUE
END;
JustCall : BEGIN
Obj_SetState(fmat_ptr,fmatjust,Selected,FALSE);
do_just := TRUE
END;
PrecCall : BEGIN
Obj_SetState(fmat_ptr,fmatprec,Selected,FALSE);
do_prec := TRUE
END;
PercCall : BEGIN
Obj_SetState(fmat_ptr,fmatperc,Selected,FALSE);
do_perc := TRUE
END;
StyleCall : BEGIN
Obj_SetState(fmat_ptr,fmatstyl,Selected,FALSE);
do_style := TRUE
END;
GlobalCall : ;
END;
chosen_width := col_width[data_col,spaces];
int_to_string(chosen_width,temp);
IF LENGTH(temp) < 2 THEN
temp := CONCAT(' ',temp);
Set_Text(fmat_ptr,fmatcwsz,temp,s3,2);
ptr := locate_cell(data_row,data_col);
chosen_just := find_just(ptr);
Obj_SetState(fmat_ptr,chosen_just+ORD(justleft),Selected,FALSE);
chosen_prec := find_prec(ptr);
Obj_SetState(fmat_ptr,ORD(prec0)+chosen_prec,Selected,FALSE);
IF ptr <> NIL THEN
chosen_style := ptr^.format & style_mask
ELSE
chosen_style := default_format & style_mask;
IF chosen_style & bold_mask <> 0 THEN
Obj_SetState(fmat_ptr,textbold,Selected,FALSE);
IF chosen_style & italic_mask <> 0 THEN
Obj_SetState(fmat_ptr,textital,Selected,FALSE);
IF chosen_style & under_mask <> 0 THEN
Obj_SetState(fmat_ptr,textundr,Selected,FALSE);
IF ptr <> NIL THEN BEGIN
IF ptr^.format & sci_mask <> 0 THEN
Obj_SetState(fmat_ptr,precscin,Selected,FALSE);
IF ptr^.format & dollar_mask <> 0 THEN
Obj_SetState(fmat_ptr,fmatdchk,Checked,FALSE)
ELSE
Obj_SetState(fmat_ptr,fmatdchk,Normal,FALSE);
IF ptr^.format & perc_mask <> 0 THEN
Obj_SetState(fmat_ptr,fmatpchk,Checked,FALSE)
ELSE
Obj_SetState(fmat_ptr,fmatpchk,Normal,FALSE)
END
ELSE BEGIN
IF default_format & sci_mask <> 0 THEN
Obj_SetState(fmat_ptr,precscin,Selected,FALSE);
IF default_format & dollar_mask <> 0 THEN
Obj_SetState(fmat_ptr,fmatdchk,Checked,FALSE)
ELSE
Obj_SetState(fmat_ptr,fmatdchk,Normal,FALSE);
IF default_format & perc_mask <> 0 THEN
Obj_SetState(fmat_ptr,fmatpchk,Checked,FALSE)
ELSE
Obj_SetState(fmat_ptr,fmatpchk,Normal,FALSE)
END
END; { INITIALIZE }
PROCEDURE EVAL_ACTION;
LABEL 1;
VAR i,j,inc : INTEGER;
done : BOOLEAN;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
VAR str_pos : INTEGER;
BEGIN
Get_Text(fmat_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy ) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState(fmat_ptr,fmatok,Normal,TRUE)
END
ELSE
get_edited := TRUE
END; (* GET_EDITED *)
BEGIN { EVAL_ACTION }
done := FALSE;
1: REPEAT
IF action = fmatok THEN BEGIN
CASE Map_Tree(fmat_ptr,fmatcell,fmatglob,ReturnSelected) OF
fmatcell : extent := s;
fmatrang : extent := r;
fmatglob : extent := g
END;
IF Obj_State(fmat_ptr,fmatcw) & Selected <> 0 THEN BEGIN
Get_Text(fmat_ptr,fmatcwsz,temp);
WHILE POS(' ',temp) <> 0 DO
DELETE(temp,POS(' ',temp),1);
IF LENGTH(temp) = 0 THEN BEGIN
Obj_SetState(fmat_ptr,fmatok,Normal,TRUE);
action := Form_Do(fmat_ptr,fmatcwsz);
GOTO 1
END
ELSE BEGIN
chosen_width := 0;
inc := 1;
FOR i := LENGTH(temp) DOWNTO 1 DO BEGIN
chosen_width := chosen_width+(ORD(temp[i])-$30)*inc;
inc := inc*10
END;
IF (chosen_width < 5) OR (chosen_width > 30) THEN BEGIN
Obj_SetState(fmat_ptr,fmatok,Normal,TRUE);
action := Form_Do(fmat_ptr,fmatcwsz);
GOTO 1
END
END
END;
IF extent = s THEN
IF get_edited (fmatbegi,s_row,s_col) THEN
done := TRUE
ELSE
action := Form_Do(fmat_ptr,fmatbegi)
ELSE IF extent = r THEN
IF get_edited (fmatbegi,s_row,s_col) THEN
IF get_edited (fmatend,f_row,f_col) THEN
IF (s_col > f_col) OR (s_row > f_row) OR
(s_col < logical_col_1) OR
(s_row < logical_row_1) THEN BEGIN
Obj_SetState(fmat_ptr,fmatok,Normal,TRUE);
action := Form_Do(fmat_ptr,fmatend)
END
ELSE
done := TRUE
ELSE
action := Form_Do(fmat_ptr,fmatend)
ELSE
action := Form_Do(fmat_ptr,fmatbegi)
ELSE { extent was global }
done := TRUE;
END { action = cwok }
ELSE IF (action = fmatcwdn) OR (action = fmatcwup) THEN BEGIN
IF action = fmatcwdn THEN
IF chosen_width > 5 THEN
chosen_width := chosen_width-1
ELSE
ELSE IF chosen_width < 30 THEN
chosen_width := chosen_width+1;
int_to_string(chosen_width,temp);
IF LENGTH(temp) < 2 THEN
temp := CONCAT(' ',temp);
Set_Text(fmat_ptr,fmatcwsz,temp,s3,2);
Obj_Draw(fmat_ptr,fmatcwsz,fmatcwsz,fo_x,fo_y,fo_w,fo_h);
action := Form_Do(fmat_ptr,fmatcwsz)
END
ELSE IF action = fmatdchk THEN BEGIN
IF dollar_on THEN
Obj_SetState(fmat_ptr,fmatdchk,Normal,TRUE)
ELSE
Obj_SetState(fmat_ptr,fmatdchk,Checked,TRUE);
dollar_on := NOT dollar_on;
action := Form_Do(fmat_ptr,fmatbegi)
END
ELSE IF action = fmatpchk THEN BEGIN
IF perc_on THEN
Obj_SetState(fmat_ptr,fmatpchk,Normal,TRUE)
ELSE
Obj_SetState(fmat_ptr,fmatpchk,Checked,TRUE);
perc_on := NOT perc_on;
action := Form_Do(fmat_ptr,fmatbegi)
END
UNTIL (done) OR (action = fmatcanc);
END; (* EVAL_ACTION *)
PROCEDURE DO_FORM;
BEGIN
IF (caller = CWCall) OR (caller = GlobalCall) THEN
action := form_begin(fmat_ptr,fmatcwsz)
ELSE
action := form_begin(fmat_ptr,fmatbegi);
eval_action;
form_end
END;
PROCEDURE OUTCOME;
VAR i,j : INTEGER;
ptr : CellPtr;
PROCEDURE SET_JUST ( VAR format : INTEGER );
BEGIN
CASE chosen_just OF
VDI_Left : BEGIN
format := format & no_just_mask;
format := format | $0010
END;
VDI_Center : format := format | $0030;
VDI_Right : format := format & no_just_mask
END
END; { SET_JUST }
PROCEDURE SET_PREC ( VAR format : INTEGER );
BEGIN
format := format & no_prec_mask;
format := format | chosen_prec;
IF sci_flag THEN
format := format | sci_mask
ELSE
format := format & no_sci_mask
END; { SET_PREC }
PROCEDURE SET_DOLLAR ( VAR format : INTEGER );
BEGIN
format := format & no_dollar_mask;
IF dollar_on THEN
format := format | dollar_mask
END;
PROCEDURE SET_PERC ( VAR format : INTEGER );
BEGIN
format := format & no_perc_mask;
IF perc_on THEN
format := format | perc_mask
END; { SET_PERC }
PROCEDURE SET_STYLE ( VAR format : INTEGER );
BEGIN
format := format & no_style_mask;
IF Obj_State(fmat_ptr,textbold) & Selected <> 0 THEN
format := format | bold_mask;
IF Obj_State(fmat_ptr,textital) & Selected <> 0 THEN
format := format | italic_mask;
IF Obj_State(fmat_ptr,textundr) & Selected <> 0 THEN
format := format | under_mask
END; { SET_STYLE }
PROCEDURE SET_BITS ( row,col : INTEGER );
BEGIN
ptr := new_cell(row,col);
IF ptr <> NIL THEN BEGIN
WITH ptr^ DO BEGIN
IF do_just THEN
set_just(format);
IF do_prec THEN
set_prec(format);
IF do_dollar THEN
set_dollar(format);
IF do_perc THEN BEGIN
set_perc(format);
IF perc_on THEN
num := num/100
ELSE
num := num*100
END;
IF do_style THEN
set_style(format);
END;
cell_on_screen(1,row,col,TRUE)
END
END; { SET_BITS }
BEGIN { OUTCOME }
IF action = fmatok THEN BEGIN
Set_Mouse(M_Bee);
IF Obj_State(fmat_ptr,fmatcw) & Selected <> 0 THEN
do_cw := TRUE
ELSE
do_cw := FALSE;
IF Obj_State(fmat_ptr,fmatjust) & Selected <> 0 THEN BEGIN
chosen_just := Map_Tree(fmat_ptr,justleft,justrigh,
ReturnSelected)-ORD(justleft);
do_just := TRUE
END
ELSE
do_just := FALSE;
IF Obj_State(fmat_ptr,fmatprec) & Selected <> 0 THEN BEGIN
chosen_prec := Map_Tree(fmat_ptr,prec0,prec5,ReturnSelected)-
ORD(prec0);
sci_flag := Obj_State(fmat_ptr,precscin) & Selected <> 0;
do_prec := TRUE
END
ELSE
do_prec := FALSE;
IF Obj_State(fmat_ptr,fmatdoll) & Selected <> 0 THEN BEGIN
do_dollar := TRUE;
dollar_on := Obj_State(fmat_ptr,fmatdchk) & Checked <> 0
END
ELSE
do_dollar := FALSE;
IF Obj_State(fmat_ptr,fmatperc) & Selected <> 0 THEN BEGIN
do_perc := TRUE;
perc_on := Obj_State(fmat_ptr,fmatpchk) & Checked <> 0
END
ELSE
do_perc := FALSE;
IF Obj_State(fmat_ptr,fmatstyl) & Selected <> 0 THEN
do_style := TRUE;
IF (do_cw) OR (do_just) OR (do_perc) OR (do_dollar) OR
(do_prec) OR (do_style) THEN
CASE extent OF
s : BEGIN
IF do_cw THEN BEGIN
col_width[s_col,spaces] := chosen_width;
col_width[s_col,pixels] := chosen_width*8;
Send_Redraw(TRUE,0,0,screen_width,screen_height)
END;
IF (do_just) OR (do_prec) OR (do_perc) OR
(do_style) OR (do_dollar) THEN
set_bits(s_row,s_col)
END;
r : BEGIN
IF do_cw THEN BEGIN
FOR i := s_col TO f_col DO BEGIN
col_width[i,spaces] := chosen_width;
col_width[i,pixels] := chosen_width*8;
END;
Send_Redraw(TRUE,0,0,screen_width,screen_height)
END;
IF (do_just) OR (do_prec) OR (do_perc) OR
(do_style) OR (do_dollar) THEN
FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO
set_bits(i,j)
END;
g : BEGIN
IF do_cw THEN
FOR i := 1 To n_cols DO BEGIN
col_width[i,spaces] := chosen_width;
col_width[i,pixels] := chosen_width*8;
END;
IF do_just THEN
set_just(default_format);
IF do_prec THEN
set_prec(default_format);
IF do_dollar THEN
set_dollar(default_format);
IF do_perc THEN
set_perc(default_format);
IF do_style THEN
set_style(default_format);
FOR i := 1 TO n_rows DO BEGIN
ptr := data[i];
WHILE ptr <> NIL DO BEGIN
IF do_just THEN
ptr^.format := (ptr^.format & no_just_mask) |
(default_format & just_mask);
IF do_prec THEN BEGIN
ptr^.format := (ptr^.format & no_prec_mask) |
(default_format & prec_mask);
IF sci_flag THEN
ptr^.format := (ptr^.format & no_sci_mask) |
(default_format & sci_mask)
END;
IF do_dollar THEN
ptr^.format := (ptr^.format & no_dollar_mask) |
(default_format & dollar_mask);
IF do_perc THEN
ptr^.format := (ptr^.format & no_perc_mask) |
(default_format & perc_mask);
IF do_style THEN
ptr^.format := (ptr^.format & no_style_mask) |
(default_format & style_mask);
ptr := ptr^.next
END
END;
Send_Redraw(TRUE,0,0,screen_width,screen_height)
END
END; { CASE extent }
Set_Mouse(M_Arrow)
END { IF }
END; { OUTCOME }
BEGIN { main! }
initialize;
do_form;
outcome
END; { CHANGE_FORMAT }
FUNCTION GOTO_CELL : BOOLEAN;
VAR
action : Tree_Index;
row,col,str_pos : INTEGER;
cell_str : STRING;
finished,dummy : BOOLEAN;
PROCEDURE EVAL_ACTION;
BEGIN
REPEAT
CASE action OF
gotook : BEGIN
Get_Text ( goto_ptr,gotocell,cell_str );
cap_a_string ( cell_str );
str_pos := 1;
IF translate_cell(cell_str,str_pos,LENGTH(cell_str),row,col,
dummy,dummy) <> OK THEN BEGIN
Obj_SetState(goto_ptr,gotook,Normal,True);
action := Form_Do(goto_ptr,gotocell);
finished := FALSE;
END
ELSE
finished := TRUE
END;
gotohome : finished := TRUE;
gotocanc : finished := TRUE
END { CASE }
UNTIL finished
END; { EVAL_ACTION }
PROCEDURE DO_FORM;
BEGIN
action := form_begin(goto_ptr,gotocell);
eval_action;
form_end
END;
PROCEDURE OUTCOME;
BEGIN
IF action = gotook THEN
IF (row >= logical_row_1) AND (col >= logical_col_1) THEN BEGIN
data_row := row;
data_col := col;
start_row := row;
start_col := col;
goto_cell := TRUE
END
ELSE
ELSE IF action = gotohome THEN BEGIN
home_cursor(Origin);
goto_cell := TRUE
END
ELSE
goto_cell := FALSE
END;
BEGIN
indx := Map_Tree(goto_ptr,Root,Null_Index,ClearSelected);
Set_Text(goto_ptr,gotocell,null_str,s1,5);
do_form;
outcome
END; { GOTO_CELL }
PROCEDURE REPLICATE_CELL;
VAR
action : Tree_Index;
row,col,s_row,s_col,
f_row,f_col,source_row,
source_col : INTEGER;
temp : STR255;
it_is_a_formula,do_relative : BOOLEAN;
ptr : CellPtr;
PROCEDURE INITIALIZE;
BEGIN
indx := Map_Tree(rep_ptr,Root,Null_Index,ClearSelected);
string_a_cell(data_row,data_col,temp);
Set_Text(rep_ptr,repsourc,temp,s3,5);
IF block_set THEN BEGIN
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(rep_ptr,repbegin,temp,s1,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(rep_ptr,repend,temp,s2,5)
END
ELSE BEGIN
Set_Text(rep_ptr,repbegin,null_str,s1,5);
Set_Text(rep_ptr,repend,null_str,s2,5)
END;
Obj_SetState(rep_ptr,reprel,Selected,FALSE)
END; { INITIALIZE }
PROCEDURE EVAL_ACTION;
VAR str_pos : INTEGER;
dummy,done : BOOLEAN;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
BEGIN
Get_Text(rep_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState(rep_ptr,repok,Normal,TRUE);
CASE what OF
repsourc : action := Form_Do(rep_ptr,repsourc);
repbegin : action := Form_Do(rep_ptr,repbegin);
repend : action := Form_Do(rep_ptr,repend)
END
END
ELSE
get_edited := TRUE
END; (* GET_EDITED *)
BEGIN { EVAL_ACTION }
done := FALSE;
REPEAT
IF action = repok THEN
IF get_edited(repsourc,source_row,source_col) THEN
IF get_edited(repbegin,s_row,s_col) THEN
IF get_edited(repend,f_row,f_col) THEN
IF (s_col>f_col) OR (s_row>f_row) OR
(s_col < logical_col_1) OR
(s_row < logical_row_1) THEN BEGIN
Obj_SetState(rep_ptr,repok,Normal,TRUE);
action := Form_Do(rep_ptr,repend)
END
ELSE BEGIN
IF Obj_State(rep_ptr,reprel) & Selected <>0 THEN
do_relative := TRUE
ELSE
do_relative := FALSE;
IF assigned(source_row,source_col,ptr)<>Void THEN
IF (ptr^.class = Expr) AND
(ptr^.status <> Empty) THEN
it_is_a_formula := TRUE
ELSE
it_is_a_formula := FALSE
ELSE
it_is_a_formula := FALSE;
done := TRUE
END
UNTIL (done) OR (action = repcanc)
END; { EVAL_ACTION }
PROCEDURE DO_FORM;
BEGIN
action := form_begin(rep_ptr,repbegin);
eval_action;
form_end
END; { DO_FORM }
PROCEDURE DO_REPLICATE;
LABEL 1;
VAR i,j : INTEGER;
dummy : BOOLEAN;
ptr : CellPtr;
BEGIN
ptr := locate_cell(source_row,source_col);
IF ptr <> NIL THEN
FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO
IF (i <> source_row) OR (j <> source_col) THEN BEGIN
IF comp_assign(source_row,source_col,
i,j,FALSE) THEN BEGIN
IF (it_is_a_formula) AND (do_relative) THEN BEGIN
ptr := locate_cell(i,j);
IF adjust_expr(adj_refs,ptr,
source_row,source_col,i,j,1,1,
n_rows,n_cols) <> OK THEN BEGIN
all_lists(add,ptr,i,j);
GOTO 1 { quick exit, an OutOfRange error and }
END { the user chose to abort }
END;
IF it_is_a_formula THEN
all_lists(add,ptr,i,j);
END
ELSE BEGIN
Set_Mouse(M_Arrow);
out_mem_cell(i,j,'replicated');
cell_on_screen(1,i,j,TRUE);
GOTO 1
END;
cell_on_screen(1,i,j,TRUE)
END
ELSE
ELSE
delete_range(s_row,s_col,f_row,f_col,TRUE);
1: END; { DO_REPLICATE }
PROCEDURE OUTCOME;
VAR cell_c : INTEGER;
dummy : BOOLEAN;
BEGIN
IF action = repok THEN BEGIN
Set_Mouse(M_Bee);
do_replicate;
Set_Mouse(M_Arrow)
END
END; { OUTCOME }
BEGIN
initialize;
do_form;
outcome
END; { REPLICATE_CELL }
PROCEDURE R_TO_S ( n : LONG_INTEGER; VAR temp : STR255 );
BEGIN
real_to_string(n*1.0,temp,0,FALSE);
DELETE(temp,1,1)
END; { R_TO_S }
PROCEDURE VIEW_FORMAT;
{ gives the following info: cell name, data type, memory used,
col width, just, percent, prec }
VAR
action : Tree_Index;
loc_format : INTEGER;
i,cell_size : LONG_INTEGER;
temp : STR255;
a : AssignedStatus;
ptr : CellPtr;
PROCEDURE INITIALIZE;
VAR i : INTEGER;
dep : DepPtr;
BEGIN
string_a_cell(data_row,data_col,temp);
Set_Text(vfrm_ptr,viewcell,temp,s1,5);
a := assigned(data_row,data_col,ptr);
IF a <> Void THEN BEGIN
CASE ptr^.class OF
Val : temp := 'Numeric';
Labl : temp := 'Label';
Expr : temp := 'Formula';
END;
loc_format := ptr^.format
END
ELSE BEGIN
temp := 'Numeric';
loc_format := default_format
END;
Set_Text(vfrm_ptr,viewtype,temp,s2,7);
cell_size := size(data_row,data_col);
r_to_s(cell_size,temp);
Set_Text(vfrm_ptr,viewmem,temp,s3,10);
int_to_string(col_width[data_col,spaces],temp);
Set_Text(vfrm_ptr,viewcw,temp,s4,2);
CASE find_just(ptr) OF
VDI_Right : temp := 'Right';
VDI_Left : temp := 'Left';
VDI_Center : temp := 'Center'
END;
Set_Text(vfrm_ptr,viewjust,temp,s5,6);
IF loc_format & perc_mask <> 0 THEN
temp := 'Yes'
ELSE
temp := 'No';
Set_Text(vfrm_ptr,viewperc,temp,s6,3);
IF loc_format & dollar_mask <> 0 THEN
temp := 'Yes'
ELSE
temp := 'No';
Set_Text(vfrm_ptr,viewdoll,temp,s13,3);
temp := CHR(find_prec(ptr)+$30);
Set_Text(vfrm_ptr,viewprec,temp,s7,1);
i := 0;
IF a <> Void THEN BEGIN
dep := ptr^.sub;
WHILE dep <> NIL DO BEGIN
i := i+1;
dep := dep^.next
END
END;
r_to_s(i,temp);
Set_Text(vfrm_ptr,viewdeps,temp,s8,7);
IF loc_format & sci_mask <> 0 THEN
Set_Text(vfrm_ptr,viewsci,'Yes',s9,3)
ELSE
Set_Text(vfrm_ptr,viewsci,'No',s9,3);
IF loc_format & bold_mask <> 0 THEN
Set_Text(vfrm_ptr,viewbold,'Yes',s10,3)
ELSE
Set_Text(vfrm_ptr,viewbold,'No',s10,3);
IF loc_format & italic_mask <> 0 THEN
Set_Text(vfrm_ptr,viewital,'Yes',s11,3)
ELSE
Set_Text(vfrm_ptr,viewital,'No',s11,3);
IF loc_format & under_mask <> 0 THEN
Set_Text(vfrm_ptr,viewundr,'Yes',s12,3)
ELSE
Set_Text(vfrm_ptr,viewundr,'No',s12,3);
Obj_SetState(vfrm_ptr,viewok,Normal,FALSE)
END; { INITIALIZE }
PROCEDURE DO_FORM;
BEGIN
action := form_begin(vfrm_ptr,Root);
form_end
END;
BEGIN
initialize;
do_form
END; { VIEW_FORMAT }
PROCEDURE HELP ( which : INTEGER );
VAR
ptr : Dialog_Ptr;
action : Tree_Index;
BEGIN
CASE which OF
1 : ptr := key_ptr;
2 : ptr := form_ptr;
3 : ptr := prhelp_ptr;
4 : ptr := mhelp_ptr;
5 : ptr := crefhelp_ptr;
6 : ptr := rechelp_ptr
END;
indx := Map_Tree(ptr,Root,Null_Index,ClearSelected);
action := form_begin(ptr,Root);
form_end
END; { HELP }
PROCEDURE SORT;
VAR row_or_col,s_row,s_col,f_row,f_col,
key_row,key_col,i,j : INTEGER;
action : Tree_Index;
temp : STR255;
ascending : BOOLEAN;
PROCEDURE INITIALIZE;
BEGIN
clear_buffer;
indx := Map_Tree(sort_ptr,Root,Null_Index,ClearSelected);
row_or_col := 1;
ascending := TRUE;
string_a_cell(data_row,data_col,temp);
Set_Text(sort_ptr,sortkey,temp,s3,5);
IF block_set THEN BEGIN
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(sort_ptr,sortbegi,temp,s1,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(sort_ptr,sortend,temp,s2,5)
END
ELSE BEGIN
Set_Text(sort_ptr,sortbegi,null_str,s1,5);
Set_Text(sort_ptr,sortend,null_str,s2,5)
END;
Obj_SetState(sort_ptr,sortasce,Selected,FALSE);
Obj_SetState(sort_ptr,sortrow,Selected,FALSE)
END; { INITIALIZE }
PROCEDURE EVAL_ACTION;
VAR i,j,str_pos : INTEGER;
dummy,done : BOOLEAN;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
BEGIN
Get_Text(sort_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState(sort_ptr,sortok,Normal,TRUE);
CASE what OF
sortkey : action := Form_Do(sort_ptr,sortkey);
sortbegi : action := Form_Do(sort_ptr,sortbegi);
sortend : action := Form_Do(sort_ptr,sortend)
END
END
ELSE
get_edited := TRUE;
END; (* GET_EDITED *)
BEGIN { EVAL_ACTION }
done := FALSE;
REPEAT
IF action = sortok THEN
IF get_edited (sortkey,key_row,key_col) THEN
IF get_edited (sortbegi,s_row,s_col) THEN
IF get_edited (sortend,f_row,f_col) THEN
IF (key_row<s_row) OR (key_row>f_row) OR
(key_col<s_col) OR (key_col>f_col) THEN BEGIN
Obj_SetState ( sort_ptr,sortok,Normal,TRUE );
action := Form_Do(sort_ptr,sortkey)
END
ELSE IF (s_col>f_col) OR (s_row>f_row) OR
((row_or_col=1) AND ((f_row-s_row)<1)) OR
((row_or_col=2) AND ((f_col-s_col)<1)) OR
(s_col < logical_col_1) OR
(s_row < logical_row_1) THEN BEGIN
Obj_SetState ( sort_ptr,sortok,Normal,TRUE );
action := Form_Do(sort_ptr,sortend)
END
ELSE
done := TRUE;
UNTIL ( done ) OR ( action = sortcanc );
END; (* EVAL_ACTION *)
PROCEDURE DO_FORM;
BEGIN
action := form_begin(sort_ptr,sortbegi);
eval_action;
form_end;
END;
PROCEDURE BUBBLE_SORT;
LABEL 1;
VAR i,j,n,dummy : INTEGER;
ptr,ptr1,ptr2 : CellPtr;
PROCEDURE SWAP ( row_1,row_2,col_1,col_2 : INTEGER );
{ any formulas are copied exactly, with no relative ref changes }
VAR i,j : INTEGER;
BEGIN
IF row_or_col = 1 THEN { by row }
FOR i := s_col TO f_col DO BEGIN
{ note that the cells' dep lists stay behind,
since they belong to the pos in the worksheet, UNLESS
we were to simultaneously adjust the formulas which they
influence; a pain and not worth doing. However, if
restored to original order, everything will be exactly
as before. In order to do this, all cells to be sorted
are REQUIRED to exist }
IF NOT comp_assign(row_2,i,0,0,FALSE) THEN
GOTO 1;
IF NOT comp_assign(row_1,i,row_2,i,FALSE) THEN
GOTO 1;
IF NOT comp_assign(0,0,row_1,i,FALSE) THEN
GOTO 1;
clear_buffer
END
ELSE { by column }
FOR i := s_row TO f_row DO BEGIN
IF NOT comp_assign(i,col_2,0,0,FALSE) THEN
GOTO 1;
IF NOT comp_assign(i,col_1,i,col_2,FALSE) THEN
GOTO 1;
IF NOT comp_assign(0,0,i,col_1,FALSE) THEN
GOTO 1;
clear_buffer;
END
END; { SWAP }
FUNCTION COMPARE ( row_1,col_1,row_2,col_2 : INTEGER ) : BOOLEAN;
{ null: status = Empty }
{ a: Labl with status <> Empty }
{ n: Val or Expr, status <> Empty }
{ e: cell with error status }
{ c_type_1 & 2 give the respective compare-types of the 2 cells }
TYPE CompareTypes = ( null,e,n,a );
VAR c_type_1,c_type_2 : CompareTypes;
stat : AssignedStatus;
ptr1,ptr2 : CellPtr;
BEGIN
compare := FALSE;
ptr1 := new_cell(row_1,col_1);
IF ptr1 = NIL THEN
GOTO 1;
stat := assigned(row_1,col_1,ptr1);
IF stat = Desolate THEN
c_type_1 := null
ELSE IF stat = Error THEN
c_type_1 := e
ELSE IF ptr1^.class = Labl THEN
c_type_1 := a
ELSE
c_type_1 := n;
ptr2 := new_cell(row_2,col_2);
IF ptr2 = NIL THEN
GOTO 1;
stat := assigned(row_2,col_2,ptr2);
IF stat = Desolate THEN
c_type_2 := null
ELSE IF stat = Error THEN
c_type_1 := e
ELSE IF ptr2^.class = Labl THEN
c_type_2 := a
ELSE
c_type_2 := n;
{ so, now we know what we're comparing. Precedence is as follows,
in order from least to greatest:
1. num and str (Labl-type) both not assigned
( num<str still )
2. error status
3. num assigned
4. str ( = Labl ) <> NIL ( or assigned ).
Note this implies that both num and str are never both
assigned in a single cell ( that is, unless the cell is an
Expr, in which case this is irrelevant, because it's taken
to be a Val-type for the sake of sorting ).
However, in cells of differing types,
Labl always wins, even if it is NIL. That way we separate
the cells into Val/Expr and Labl types. Formulas are simply
regarded as either values or labels as above.
Rather than get too complex in sorting out cells with an
error status, we simply sort them without paying attention
to the actual error code; i.e. at the end of the sort,
all the error-status cells will be in a group, but not in
any specific order.
row_1,col_1 reference 'j' in bubble_sort;
row_2,col_2 reference 'j-1' in bubble_sort }
WITH ptr1^ DO
IF ascending THEN
IF c_type_1 = c_type_2 THEN
IF c_type_1 = null THEN
IF (class <> Labl) AND
(ptr2^.class = Labl) THEN
compare := TRUE
ELSE
ELSE IF c_type_1 = n THEN
IF num < ptr2^.num THEN
compare := TRUE
ELSE
ELSE IF c_type_1 = a THEN
IF str^ < ptr2^.str^ THEN
compare := TRUE
ELSE
ELSE { don't swap, they both have error status }
ELSE
CASE c_type_1 OF
null : IF (NOT ((class = Labl) AND
(ptr2^.class <> Labl))
) OR
(c_type_2 = a) THEN
{ Labl and Expr are handled by the }
{ NOT clause }
compare := TRUE;
n : IF ((c_type_2 = null) AND
(ptr2^.class = Labl)) OR
(c_type_2 = a) THEN
compare := TRUE;
a : ; { do nothing }
e : IF c_type_2 <> null THEN
compare := TRUE;
END { CASE }
ELSE { descending }
IF c_type_1 = c_type_2 THEN
IF c_type_1 = null THEN
IF (class = Labl) AND
(ptr2^.class <> Labl) THEN
compare := TRUE
ELSE
ELSE IF c_type_1 = n THEN
IF num > ptr2^.num THEN
compare := TRUE
ELSE
ELSE IF c_type_1 = a THEN
IF str^ > ptr2^.str^ THEN
compare := TRUE
ELSE
ELSE { error status, don't swap }
ELSE
CASE c_type_1 OF
null : IF (class = Labl) AND
(ptr2^.class <> Labl) THEN
compare := TRUE;
n : IF (c_type_2 = null) AND
(ptr2^.class <> Labl) THEN
compare := TRUE;
a : IF (c_type_2 = null) OR (c_type_2 = n) THEN
compare := TRUE;
e : IF c_type_2 = null THEN
compare := TRUE;
END; { CASE }
END; { COMPARE }
BEGIN { BUBBLE_SORT }
IF Obj_State(sort_ptr,sortrow) & Selected <> 0 THEN
row_or_col := 1
ELSE
row_or_col := 2;
IF Obj_State(sort_ptr,sortasce) & Selected <> 0 THEN
ascending := TRUE
ELSE
ascending := FALSE;
Set_Mouse(M_Bee);
{ remove the cells to be sorted from dep lists; the dep lists will
be recreated later }
FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO BEGIN
ptr := locate_cell(i,j);
all_lists (remove,ptr,i,j)
END;
{ actual bubble sort algorithm }
IF row_or_col = 1 THEN { by rows }
FOR i := s_row TO f_row-1 DO
FOR j := f_row DOWNTO i+1 DO
IF compare(j,key_col,j-1,key_col) THEN
swap(j,j-1,dummy,dummy)
ELSE
ELSE { by cols }
FOR i := s_col TO f_col-1 DO
FOR j := f_col DOWNTO i+1 DO
IF compare(key_row,j,key_row,j-1) THEN
swap(dummy,dummy,j,j-1);
{ redo dep lists }
1: FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO BEGIN
ptr := locate_cell(i,j);
all_lists(add,ptr,i,j)
END
END; { BUBBLE_SORT }
BEGIN { SORT }
initialize;
do_form;
IF action = sortok THEN BEGIN
bubble_sort;
FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO
cell_on_screen(1,i,j,TRUE)
END;
clear_buffer;
Set_Mouse(M_Arrow)
END; { SORT }
PROCEDURE PRINT_SPREADSHEET ( print : BOOLEAN;
msg : STR30;
VAR s_row,s_col,f_row,f_col : INTEGER );
VAR
action : Tree_Index;
i : INTEGER;
temp : STR255;
PROCEDURE INITIALIZE;
BEGIN
indx := Map_Tree(print_ptr,Root,Null_Index,ClearSelected);
IF p_row_col THEN
Obj_SetState(print_ptr,printrc,Checked,FALSE)
ELSE
Obj_SetState(print_ptr,printrc,Normal,FALSE);
IF print_formulas THEN
Obj_SetState(print_ptr,printfor,Checked,FALSE)
ELSE
Obj_SetState(print_ptr,printfor,Normal,FALSE);
IF condensed_print THEN
Obj_SetState(print_ptr,printcon,Checked,FALSE)
ELSE
Obj_SetState(print_ptr,printcon,Normal,FALSE);
IF draft_final THEN
Obj_SetState(print_ptr,printdra,Selected,FALSE)
ELSE
Obj_SetState(print_ptr,printfin,Selected,FALSE);
Set_Text(print_ptr,prtitle1,p_title_1,s1,40);
Set_Text(print_ptr,prtitle2,p_title_2,s2,40);
Set_Text(print_ptr,printhea,header,s3,40);
Set_Text(print_ptr,printfoo,footer,s4,40);
IF block_set THEN BEGIN
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(print_ptr,printbeg,temp,s5,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(print_ptr,printend,temp,s6,5)
END
ELSE IF find_first_and_last(FALSE) THEN BEGIN
string_a_cell(marks[5].row,marks[5].col,temp);
Set_Text(print_ptr,printbeg,temp,s5,5);
string_a_cell(marks[6].row,marks[6].col,temp);
Set_Text(print_ptr,printend,temp,s6,5)
END
ELSE BEGIN
Set_Text(print_ptr,printbeg,null_str,s5,5);
Set_Text(print_ptr,printend,null_str,s6,5)
END;
Set_Text(print_ptr,prwhat,msg,s7,LENGTH(msg))
END; { INITIALIZE }
PROCEDURE DO_FORM;
VAR str_pos : INTEGER;
alert_msg1,alert_msg2 : STR255;
dummy,done : BOOLEAN;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
BEGIN
Get_Text(print_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState(print_ptr,printok,Normal,TRUE);
IF what = printend THEN
action := Form_Do(print_ptr,printend)
ELSE
action := Form_Do(print_ptr,printbeg);
END
ELSE
get_edited := TRUE
END; { GET_EDITED }
PROCEDURE HANDLE_CHECK ( action : Tree_Index; VAR flag : BOOLEAN );
{ the box_chars in the dialog may be checked or not }
BEGIN
IF flag THEN
Obj_SetState(print_ptr,action,Normal,TRUE)
ELSE
Obj_SetState(print_ptr,action,Checked,TRUE);
flag := NOT flag
END; { HANDLE_CHECK }
FUNCTION REDUNDANT ( what : P_EdText ) : BOOLEAN;
{ can't have more than one each of the justification specifiers
in the header and footer }
VAR i,x : INTEGER;
justify : ARRAY [1..3] OF STRING[2];
BEGIN
redundant := FALSE;
justify[1] := '^l';
justify[2] := '^c';
justify[3] := '^r';
FOR i := 1 TO 3 DO BEGIN
temp := what;
x := POS(justify[i],temp);
IF x > 0 THEN BEGIN
DELETE(temp,1,x+1);
IF POS(justify[i],temp) > 0 THEN
redundant := TRUE;
END;
END;
END; { REDUNDANT }
BEGIN { DO_FORM }
alert_msg1 := '[1][Invalid ';
alert_msg2 := CONCAT ( '! Check for|',
'^ as last character and more|',
'than one occurrence each of|',
'^l, ^c, and ^r.| ][ Continue ]' );
action := form_begin(print_ptr,prtitle1);
done := FALSE;
REPEAT
IF (action = printrc) OR (action = printfor) OR
(action = printcon) THEN BEGIN
IF action = printrc THEN
handle_check(action,p_row_col)
ELSE IF action = printfor THEN
handle_check(action,print_formulas)
ELSE IF action = printcon THEN
handle_check(action,condensed_print);
action := Form_Do(print_ptr,prtitle1);
END
ELSE BEGIN
{ do this now so that even if "cancel" was chosen, we'll
keep whatever the user had typed in these global vars }
Get_Text(print_ptr,printhea,header);
Get_Text(print_ptr,printfoo,footer);
Get_Text(print_ptr,prtitle1,p_title_1);
Get_Text(print_ptr,prtitle2,p_title_2);
IF action = printok THEN
IF (header[LENGTH(header)] = '^') OR (redundant(header))
THEN BEGIN
temp := CONCAT(alert_msg1,'header',alert_msg2);
alert := Do_Alert(temp,1);
Obj_SetState(print_ptr,action,Normal,TRUE);
action := Form_Do(print_ptr,printhea)
END
ELSE IF (footer[LENGTH(footer)] = '^') OR
(redundant(footer)) THEN BEGIN
temp := CONCAT(alert_msg1,'footer',alert_msg2);
alert := Do_Alert(temp,1);
Obj_SetState(print_ptr,action,Normal,TRUE);
action := Form_Do(print_ptr,printfoo)
END
ELSE IF get_edited(printbeg,s_row,s_col) THEN
IF get_edited(printend,f_row,f_col) THEN
IF (s_row>f_row) OR (s_col>f_col) THEN BEGIN
Obj_SetState(print_ptr,printok,Normal,TRUE);
action := Form_Do(print_ptr,printend)
END
ELSE
done := TRUE;
END; { ELSE }
UNTIL (done) OR (action = prcancel);
draft_final := Obj_State(print_ptr,printdra) & Selected <> 0;
IF (action = printok) AND (print) THEN
do_print(s_row,f_row,s_col,f_col,port);
IF action = prcancel THEN
s_row := 0; { flag for save_text }
form_end
END; { DO_FORM }
BEGIN
initialize;
do_form
END; { PRINT_SPREADSHEET }
PROCEDURE DATA_FILL;
LABEL 2;
TYPE Caps = (NoCaps,OneCap,AllCaps);
Len = (Abbr,All);
StrType = (Day,Month);
VAR
action : Tree_Index;
s_row,s_col,f_row,f_col,cur_mo,
mo_incr,i,j,old_format,
cur_day,day_incr : INTEGER;
fill_number,sense : BOOLEAN;
cur_val,incr : REAL;
temp,temp1,temp2 : STR255;
case_stat : Caps;
len_stat : Len;
string_type : StrType;
ptr : CellPtr;
PROCEDURE INITIALIZE;
BEGIN
indx := Map_Tree(data_fill_ptr,Root,Null_Index,ClearSelected);
Obj_SetState(data_fill_ptr,datadown,Selected,FALSE);
Set_Text(data_fill_ptr,datainit,null_str,s1,12);
Set_Text(data_fill_ptr,dataincr,null_str,s2,12);
IF block_set THEN BEGIN
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(data_fill_ptr,databegi,temp,s3,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(data_fill_ptr,dataend,temp,s4,5)
END
ELSE BEGIN
Set_Text(data_fill_ptr,databegi,null_str,s3,5);
Set_Text(data_fill_ptr,dataend,null_str,s4,5)
END
END; { INITIALIZE }
FUNCTION DO_FORM : BOOLEAN;
LABEL 1;
VAR str_pos,i : INTEGER;
done,dummy,found : BOOLEAN;
str : STR255;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
BEGIN
Get_Text(data_fill_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
IF what = dataend THEN
action := Form_Do(data_fill_ptr,dataend)
ELSE
action := Form_Do(data_fill_ptr,databegi);
END
ELSE
get_edited := TRUE
END; { GET_EDITED }
BEGIN { DO_FORM }
do_form := FALSE;
action := form_begin(data_fill_ptr,datainit);
1: done := FALSE;
REPEAT
IF action = dataok THEN
IF get_edited(databegi,s_row,s_col) THEN
IF get_edited(dataend,f_row,f_col) THEN
IF (s_row>f_row) OR (s_col>f_col) OR
(s_col < logical_col_1) OR
(s_row < logical_row_1) THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,dataend)
END
ELSE
done := TRUE
UNTIL (done) OR (action = datacanc);
IF action = dataok THEN BEGIN
sense := Obj_State(data_fill_ptr,datadown) & Selected <> 0;
Get_Text(data_fill_ptr,datainit,temp);
Get_Text(data_fill_ptr,dataincr,temp1);
IF valid_number(temp) = OK THEN
IF valid_number(temp1) = OK THEN BEGIN
cur_val := string_to_real(temp);
IF temp = 'OVERFLOW' THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,datainit);
GOTO 1
END
ELSE BEGIN
incr := string_to_real(temp1);
IF temp1 = 'OVERFLOW' THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,dataincr);
GOTO 1
END
ELSE
fill_number := TRUE
END
END
ELSE BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,dataincr);
GOTO 1
END
ELSE IF LENGTH(temp) < 3 THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,datainit);
GOTO 1
END
ELSE BEGIN
str := '';
FOR i := 1 TO LENGTH(temp) DO
IF temp[i] IN up_case THEN
str := CONCAT(str,CHR(ORD(temp[i])+32))
ELSE
str := CONCAT(str,temp[i]);
i := 1;
found := FALSE;
WHILE (i <= 12) AND (NOT found) DO BEGIN
temp2 := COPY(months[i],1,3);
IF (str = months[i]) OR (str = temp2) THEN BEGIN
IF str = temp2 THEN
len_stat := Abbr
ELSE
len_stat := All;
IF temp[1] IN low_case THEN { temp = unmodified str }
case_stat := NoCaps
ELSE IF (temp[2] IN up_case) THEN
case_stat := AllCaps
ELSE
case_stat := OneCap;
found := TRUE;
string_type := Month;
cur_mo := i
END
ELSE
i := i+1
END;
IF NOT found THEN BEGIN
i := 1;
WHILE (i <= 7) AND (NOT found) DO BEGIN
temp2 := COPY(days[i],1,3);
IF (str = days[i]) OR (str = temp2) THEN BEGIN
IF str = temp2 THEN
len_stat := Abbr
ELSE
len_stat := All;
IF temp[1] IN low_case THEN
case_stat := NoCaps
ELSE IF (temp[2] IN up_case) THEN
case_stat := AllCaps
ELSE
case_stat := OneCap;
found := TRUE;
string_type := Day;
cur_day := i
END
ELSE
i := i+1
END
END;
IF NOT found THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,datainit);
GOTO 1
END
ELSE IF valid_number(temp1) = OK THEN BEGIN
incr := string_to_real(temp1);
IF (temp1 = 'OVERFLOW') OR (incr < 0) OR
((incr > 12) AND (string_type = Month)) OR
((incr > 7) AND (string_type = Day)) THEN BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,dataincr);
GOTO 1
END
ELSE IF string_type = Day THEN BEGIN
fill_number := FALSE;
day_incr := ROUND(incr)
END
ELSE BEGIN { was months }
fill_number := FALSE;
mo_incr := ROUND(incr)
END
END
ELSE BEGIN
Obj_SetState(data_fill_ptr,dataok,Normal,TRUE);
action := Form_Do(data_fill_ptr,dataincr);
GOTO 1
END
END
END;
do_form := action = dataok;
form_end
END; { DO_FORM }
FUNCTION DO_FILL : BOOLEAN;
VAR i : INTEGER;
BEGIN
IF old_format <> 0 THEN
ptr^.format := old_format;
do_fill := TRUE;
IF fill_number THEN BEGIN { working with numbers }
ptr^.class := Val;
ptr^.num := cur_val;
ptr^.status := Full;
cur_val := cur_val+incr
END
ELSE IF NOT request_memory(AString) THEN { working with days or }
do_fill := FALSE { months }
ELSE BEGIN
NEW(ptr^.str);
IF len_stat = Abbr THEN
IF string_type = Day THEN
ptr^.str^ := COPY(days[cur_day],1,3)
ELSE
ptr^.str^ := COPY(months[cur_mo],1,3)
ELSE IF string_type = Day THEN
ptr^.str^ := days[cur_day]
ELSE
ptr^.str^ := months[cur_mo];
IF case_stat = OneCap THEN
ptr^.str^[1] := CHR(ORD(ptr^.str^[1])-32)
ELSE IF case_stat = AllCaps THEN
FOR i := 1 TO LENGTH(ptr^.str^) DO
ptr^.str^[i] := CHR(ORD(ptr^.str^[i])-32);
ptr^.class := Labl;
ptr^.status := Full;
ptr^.format := (ptr^.format & no_just_mask) | $0010;
IF string_type = Day THEN BEGIN
cur_day := cur_day+day_incr;
IF cur_day > 7 THEN
cur_day := cur_day-7
END
ELSE BEGIN
cur_mo := cur_mo+mo_incr;
IF cur_mo > 12 THEN
cur_mo := cur_mo-12
END
END
END; { DO_FILL }
BEGIN { main }
initialize;
IF do_form THEN BEGIN
Set_Mouse(M_Bee);
IF sense THEN { fill down }
FOR i := s_col TO f_col DO
FOR j := s_row TO f_row DO BEGIN
ptr := locate_cell(j,i);
IF ptr <> NIL THEN BEGIN
old_format := ptr^.format;
delete_cell(j,i,FALSE)
END
ELSE
old_format := 0;
ptr := new_cell(j,i);
IF ptr <> NIL THEN
IF NOT do_fill THEN
GOTO 2
ELSE
cell_on_screen(1,j,i,TRUE)
ELSE
GOTO 2
END
ELSE { fill right }
FOR i := s_row TO f_row DO
FOR j := s_col TO f_col DO BEGIN
ptr := locate_cell(i,j);
IF ptr <> NIL THEN BEGIN
old_format := ptr^.format;
delete_cell(i,j,FALSE)
END
ELSE
old_format := 0;
ptr := new_cell(i,j);
IF ptr <> NIL THEN
IF NOT do_fill THEN
GOTO 2
ELSE
cell_on_screen(1,i,j,TRUE)
ELSE
GOTO 2
END;
END;
2: Set_Mouse(M_Arrow)
END; { DATA_FILL }
PROCEDURE ERROR_MESSAGE ( VAR str : LorFstr;
error : StatusType;
str_pos,len : INTEGER );
VAR
i : INTEGER;
action : Tree_Index;
temp : STR255;
BEGIN
Obj_SetState(err_ptr,errok,Normal,FALSE);
Set_Text(err_ptr,errtype,error_msg[error],s1,LENGTH(error_msg[error]));
IF str_pos > len THEN
str_pos := len
ELSE IF str_pos < 1 THEN { should be impossible }
str_pos := 1;
Set_Text(err_ptr,errform,str,s2,string_len);
temp := '';
FOR i := 1 TO string_len DO
temp := CONCAT(' ',temp);
temp[str_pos] := '^';
Set_Text(err_ptr,errcarat,temp,s3,string_len);
action := form_begin(err_ptr,errform);
Get_Text(err_ptr,errform,str);
form_end
END; { ERROR_MESSAGE }
FUNCTION ASK_FOR_RANGE ( VAR s_r,s_c,e_r,e_c : INTEGER;
title : STR30 ) : BOOLEAN;
VAR
action : Tree_Index;
i : INTEGER;
temp : STR255;
FUNCTION EVAL_ACTION : BOOLEAN;
VAR str_pos : INTEGER;
dummy,done : BOOLEAN;
FUNCTION GET_EDITED ( what : Tree_Index;
VAR row,col : INTEGER ) : BOOLEAN;
BEGIN
Get_Text(rang_ptr,what,temp);
cap_a_string(temp);
str_pos := 1;
IF translate_cell(temp,str_pos,LENGTH(temp),row,col,
dummy,dummy) <> OK THEN BEGIN
get_edited := FALSE;
Obj_SetState ( rang_ptr,rangok,Normal,TRUE );
CASE what OF
rangbegi : action := Form_Do(rang_ptr,rangbegi);
rangend : action := Form_Do(rang_ptr,rangend)
END
END
ELSE
get_edited := TRUE
END; (* GET_EDITED *)
BEGIN { EVAL_ACTION }
done := FALSE;
eval_action := FALSE;
REPEAT
IF action = rangok THEN
IF get_edited(rangbegi,s_r,s_c) THEN
IF get_edited(rangend,e_r,e_c) THEN
IF (s_c > e_c) OR (s_r > e_r) THEN BEGIN
Obj_SetState(rang_ptr,rangok,Normal,TRUE);
action := Form_Do(rang_ptr,rangend)
END
ELSE BEGIN
done := TRUE;
eval_action := TRUE
END
UNTIL (done) OR (action = rangcanc)
END; { EVAL_ACTION }
BEGIN { RANGE_TO_DISK }
indx := Map_Tree(rang_ptr,Root,Null_Index,ClearSelected);
Set_Text(rang_ptr,rangwhat,title,s3,12);
IF block_set THEN BEGIN
string_a_cell(b_s_row,b_s_col,temp);
Set_Text(rang_ptr,rangbegi,temp,s1,5);
string_a_cell(b_e_row,b_e_col,temp);
Set_Text(rang_ptr,rangend,temp,s2,5)
END
ELSE IF find_first_and_last(FALSE) THEN BEGIN
string_a_cell(marks[5].row,marks[5].col,temp);
Set_Text(rang_ptr,rangbegi,temp,s1,5);
string_a_cell(marks[6].row,marks[6].col,temp);
Set_Text(rang_ptr,rangend,temp,s2,5)
END
ELSE BEGIN
Set_Text(rang_ptr,rangbegi,null_str,s1,5);
Set_Text(rang_ptr,rangend,null_str,s2,5)
END;
action := form_begin(rang_ptr,rangbegi);
ask_for_range := eval_action;
form_end
END; { ASK_FOR_RANGE }
PROCEDURE STATS;
VAR i : INTEGER;
n_cell,n_val,n_label,n_expr,n_dep : LONG_INTEGER;
temp : STR255;
action : Tree_Index;
dep : DepPtr;
ptr : CellPtr;
BEGIN
Set_Mouse(M_Bee);
Obj_SetState(stat_ptr,statok,Normal,FALSE);
n_cell := 0;
n_val := 0;
n_label := 0;
n_expr := 0;
n_dep := 0;
i := 1;
WHILE i <= n_rows DO BEGIN
ptr := data[i];
WHILE ptr <> NIL DO BEGIN
n_cell := n_cell+1;
CASE ptr^.class OF
Val : n_val := n_val+1;
Labl : n_label := n_label+1;
Expr : n_expr := n_expr+1
END;
dep := ptr^.sub;
WHILE dep <> NIL DO BEGIN
n_dep := n_dep+1;
dep := dep^.next
END;
ptr := ptr^.next
END;
i := i+1
END;
r_to_s(n_cell,temp);
Set_Text(stat_ptr,statcell,temp,s1,7);
r_to_s(n_val,temp);
Set_Text(stat_ptr,statval,temp,s2,7);
r_to_s(n_label,temp);
Set_Text(stat_ptr,statlabl,temp,s3,7);
r_to_s(n_expr,temp);
Set_Text(stat_ptr,statexpr,temp,s4,7);
r_to_s(n_dep,temp);
Set_Text(stat_ptr,statdeps,temp,s5,7);
r_to_s(original_memory-working_memory,temp);
Set_Text(stat_ptr,statmemc,temp,s6,10);
r_to_s(working_memory,temp);
Set_Text(stat_ptr,statmema,temp,s7,10);
action := form_begin(stat_ptr,Root);
form_end
END; { STATS }
FUNCTION DO_FREEZE : BOOLEAN;
VAR redraw,dummy : BOOLEAN;
temp : STR255;
action,which : Tree_Index;
BEGIN
temp := CONCAT('[1][You may not freeze the last|' ,
'row or column.][ OK ]');
do_freeze := FALSE;
redraw := FALSE;
indx := Map_Tree(freeze_ptr,Root,Null_Index,ClearSelected);
action := form_begin(freeze_ptr,Root);
form_end;
which := Map_Tree(freeze_ptr,frzrow,frzboth,ReturnSelected);
IF (action = frzok) AND (which <> Null_Index) THEN BEGIN
IF (which = frzrow) OR (which = frzboth) THEN
IF data_row = n_rows THEN
alert := Do_Alert(temp,1)
ELSE BEGIN
freeze_row := data_row;
logical_row_1 := freeze_row+1;
start_row := logical_row_1;
data_row := start_row;
y_margin := two_cell_h-1;
{ must do this so that switch will save correct finish_row &
col so that return_attr can recalc correct v & h_entry.
Failure to do this can lead to a crash when handle_message
tries to calculate slider positions and these entry values
equal n_rows or n_cols due to a non-updated finish row or
col }
get_num_scr_entries(ExRight);
IF n_hdls = 2 THEN BEGIN
switch_window;
IF start_row < logical_row_1 THEN
start_row := logical_row_1;
get_num_scr_entries(ExRight);
switch_window
END;
IF (block_set) AND (b_s_row < start_row) THEN
dummy := deselect_block;
redraw := TRUE;
do_freeze := TRUE
END;
IF (which = frzcol) OR (which = frzboth) THEN
IF data_col = n_cols THEN
alert := Do_Alert(temp,1)
ELSE BEGIN
freeze_col := data_col;
logical_col_1 := freeze_col+1;
start_col := logical_col_1;
data_col := start_col;
x_margin := 39+col_width[freeze_col,pixels];
get_num_scr_entries(ExRight);
IF n_hdls = 2 THEN BEGIN
switch_window;
IF start_col < logical_col_1 THEN
start_col := logical_col_1;
get_num_scr_entries(ExRight);
switch_window
END;
IF (block_set) AND (b_s_col < start_col) THEN
dummy := deselect_block;
redraw := TRUE;
do_freeze := TRUE
END
END
ELSE IF (action = frzundo) AND (which <> Null_Index) THEN BEGIN
IF ((which = frzrow) OR (which = frzboth)) AND
(freeze_row > 0) THEN BEGIN
freeze_row := 0;
logical_row_1 := 1;
y_margin := cell_height-1;
redraw := TRUE;
do_freeze := TRUE
END;
IF ((which = frzcol) OR (which = frzboth)) AND
(freeze_col > 0) THEN BEGIN
freeze_col := 0;
logical_col_1 := 1;
x_margin := 38;
redraw := TRUE;
do_freeze := TRUE
END
END;
IF redraw THEN
Send_Redraw(TRUE,0,0,screen_width,screen_height)
END; { DO_FREEZE }
BEGIN
END.