home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
apps
/
spread
/
opusprg
/
opussrc
/
opus.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1988-05-12
|
33KB
|
805 lines
{$U30+}
PROGRAM Opus;
{$I i:\opus.i}
{$I i:\GCTV.inc} { global Constants, Types and Variables }
{$I i:\gemsubs.def}
{$I i:\auxsubs.def}
{$I i:\vdi_aes.def}
{$I i:\globsubs.def}
{$I d:\pascal\opus\xbios.def}
{$I d:\pascal\opus\gemdos.def}
{$I d:\pascal\opus\graphout.def}
{$I d:\pascal\opus\resource.def}
{$I d:\pascal\opus\stringfn.def}
{$I d:\pascal\opus\bf.def}
PROCEDURE HANDLE_MESSAGE;
EXTERNAL;
PROCEDURE MOUSE ( mx,my : INTEGER );
{ allows user to select active cell with mouse; select a range via
dragging beginning in the active cell and extending to the end of the
rubber box; select an entire row or column by clicking within the
row/col title areas }
TYPE ScreenAreas = ( DataArea,RowArea,ColArea );
VAR i,j,total,last_width,last_height,x,y,button,key,
new_row,new_col,x_pos,y_pos,l_scr_row,l_scr_col,
o_mx,o_my,col_separator,new_x,new_y,spec_col,
new_width : INTEGER;
dummy : BOOLEAN;
code : ScreenAreas;
BEGIN { MOUSE }
Work_Rect(act_hdl,x_1,y_1,w_1,h_1);
code := DataArea;
{ check if user clicked within row/col title areas }
IF (mx < x_1+38) AND (mx > x_1) THEN
code := RowArea;
IF (my < y_1+cell_height-1) AND (my > y_1) THEN
code := ColArea;
o_mx := mx;
o_my := my;
IF code <> DataArea THEN BEGIN { outside data area }
IF code = RowArea THEN { still check for valid y or x in }
mx := vert_grid[1]+10 { mouse_row_col }
ELSE
my := y_1+y_margin+1;
IF mouse_row_col(mx,my,new_row,new_col) THEN BEGIN
dummy := deselect_block; { yes, valid x,y pos }
IF code = RowArea THEN BEGIN { select all cells in }
b_s_row := new_row; { that row }
b_e_row := new_row;
b_s_col := logical_col_1;
b_e_col := n_cols
END
ELSE BEGIN { select all cells in that column }
b_s_row := logical_row_1;
b_e_row := n_rows;
b_s_col := new_col;
b_e_col := new_col
END;
block_st_set := TRUE;
block_end_set := TRUE;
block_set := TRUE;
adjust_menu(TRUE); { activate block commands }
hilight_block
END
ELSE IF (code = ColArea) AND (o_mx > vert_grid[1]+4) AND
(o_mx <= vert_grid[finish_col-start_col+2]+4) THEN BEGIN
FOR i := 2 TO finish_col-start_col+2 DO
IF (o_mx >= vert_grid[i]-4) AND { bigger limit }
(o_mx <= vert_grid[i]+4) THEN BEGIN { than needed }
col_separator := i;
spec_col := start_col+i-2
END;
Set_Mouse(M_Flat_Hand);
Drag_Box(vert_grid[col_separator],y_1,0,h_1,
vert_grid[col_separator-1]+39,y_1,
200,h_1,new_x,new_y);
Set_Mouse(M_Arrow);
new_width := (col_width[spec_col,pixels]+
new_x+3-vert_grid[col_separator]) DIV 8;
IF new_width <> col_width[spec_col,spaces] THEN BEGIN
IF new_width < 5 THEN
new_width := 5
ELSE IF new_width > 30 THEN
new_width := 30;
col_width[spec_col,spaces] := new_width;
col_width[spec_col,pixels] := new_width*8;
Send_Redraw(TRUE,0,0,screen_width,screen_height)
END
END
ELSE
END { code <> DataArea }
ELSE { clicked w/in worksheet data area }
{ must start with a valid mouse location, so...}
IF mouse_row_col(mx,my,new_row,new_col) THEN BEGIN
{ first redraw the cell(s) affected, i.e. old and new }
Hide_Mouse;
toggle_inverse(Black,data_row,data_col);
Show_Mouse;
data_row := new_row;
data_col := new_col;
find_screen_pos(new_row,new_col,scr_row,scr_col);
cell_on_screen(1,data_row,data_col,TRUE);
write_cell_name;
{ find the x,y coordinates of the current cell's upper left-hand
corner }
Work_Rect(act_hdl,x_1,y_1,w_1,h_1);
Set_Clip(x_1,y_1,w_1,h_1);
x_pos := vert_grid[scr_col];
y_pos := y_1+y_margin+(scr_row-1)*cell_height;
event := Get_Event(E_Timer,0,0,0,200,FALSE,0,0,0,0,
FALSE,0,0,0,0,msg_area,i,i,i,i,i,i);
Graf_MKState(x,y,button,kbd_state);
IF button = 1 THEN { started within current cell?? }
IF (x > x_pos) AND
(x < x_pos+col_width[data_col,pixels]) AND
(y > y_pos) AND (y < y_pos+cell_height) THEN BEGIN
dummy := deselect_block;
Set_Mouse(M_Point_Hand);
Rubber_Box(x,y,4,6 DIV rez,last_width,last_height);
Set_Mouse(M_Arrow);
{ valid stopping location for end-block? }
IF mouse_row_col(x+last_width,y+last_height,
new_row,new_col) THEN BEGIN
b_s_row := data_row;
b_s_col := data_col;
b_e_row := new_row;
b_e_col := new_col;
{ valid range bounds? }
IF NOT ((b_e_row < b_s_row) OR (b_e_col < b_s_col))
THEN BEGIN
adjust_menu(TRUE);
block_set := TRUE;
block_st_set := TRUE;
block_end_set := TRUE;
hilight_block
END
END
END
END
END; (* MOUSE *)
PROCEDURE EVALUATE_INPUT;
LABEL 2;
VAR
i : INTEGER;
did_assign : BOOLEAN;
{$I d:\pascal\opus\arrows.inc}
PROCEDURE MOVE_TO_EDGE ( new_data_row,new_data_col : INTEGER );
{ moves cursor to edge of screen when control A,Z,T,B are pressed;
do_draw, do_toggle are in arrows.inc }
BEGIN
do_toggle;
data_row := new_data_row;
data_col := new_data_col;
do_draw
END;
BEGIN { EVALUATE_INPUT }
Work_Rect(act_hdl,x_1,y_1,w_1,h_1);
Set_Clip(x_1,y_1,w_1,h_1);
CASE inp_code OF
w_LEFT_ARROW : IF data_col > logical_col_1 THEN left_arrow;
w_RIGHT_ARROW : IF data_col < n_cols THEN right_arrow;
w_UP_ARROW : IF data_row > logical_row_1 THEN up_arrow;
w_DOWN_ARROW : IF data_row < n_rows THEN down_arrow;
w_RETURN :
IF (auto_cursor) AND
(data_row >= b_s_row) AND (data_row <= b_e_row) AND
(data_col >= b_s_col) AND (data_col <= b_e_col) AND
(block_set) THEN
do_auto_cursor
ELSE BEGIN
did_assign := assign_if_possible;
IF did_assign THEN BEGIN
cell_on_screen(1,data_row,data_col,TRUE);
write_cell_name
END
END;
w_cntl_a : move_to_edge(data_row,start_col);
w_cntl_z : move_to_edge(data_row,finish_col);
w_cntl_t : move_to_edge(start_row,data_col);
w_cntl_b : move_to_edge(finish_row,data_col);
w_PAGE_UP : simulate_message(WM_Arrowed,act_hdl,0);
w_PAGE_DOWN : simulate_message(WM_Arrowed,act_hdl,1);
w_PAGE_LEFT : simulate_message(WM_Arrowed,act_hdl,4);
w_PAGE_RIGHT : simulate_message(WM_Arrowed,act_hdl,5);
w_F1 : simulate_message(MN_Selected,moptions,mmanrec);
w_F2 : simulate_message(MN_Selected,mfile,mloadws);
w_sF2 : simulate_message(MN_Selected,mfile,mloadbl);
w_F3 : simulate_message(MN_Selected,mfile,msavews);
w_sF3 : simulate_message(MN_Selected,mfile,msavebl);
w_F4 : simulate_message(MN_Selected,mfile,msavetxt);
w_F5 : simulate_message(MN_Selected,mfile,mprintsp);
f6 : simulate_message(MN_Selected,mblock,minsertr);
sf6 : simulate_message(MN_Selected,mblock,mdeleter);
f7 : simulate_message(MN_Selected,mblock,minsertc);
sf7 : simulate_message(MN_Selected,mblock,mdeletec);
w_F8 : simulate_message(MN_Selected,mformat,mnum);
w_F9 : simulate_message(MN_Selected,mformat,mlabel);
w_F10 : simulate_message(MN_Selected,mformat,mform);
w_COLUMN : simulate_message(MN_Selected,mformat,mcolwid);
w_JUSTIFY : simulate_message(MN_Selected,mformat,mjust);
alt_l : simulate_message(MN_Selected,mformat,mdollar);
w_percent : simulate_message(MN_Selected,mformat,mpercent);
w_PRECISION : simulate_message(MN_Selected,mformat,mprec);
w_style : simulate_message(MN_Selected,mformat,mstyle);
alt_b : simulate_message(MN_Selected,mformat,mglobalf);
w_VIEW : simulate_message(MN_Selected,mformat,mviewfor);
w_START_BLOCK : simulate_message(MN_Selected,mblock,mstartbl);
w_END_BLOCK : simulate_message(MN_Selected,mblock,mendbl);
alt_f : simulate_message(MN_Selected,mblock,mdatafil);
w_REPLICATE : simulate_message(MN_Selected,mblock,mrep);
w_SORT : simulate_message(MN_Selected,mblock,msort);
w_DESELECT : simulate_message(MN_Selected,mblock,mdesel);
w_GOTO : simulate_message(MN_Selected,mmark,mgoto);
alt_1 : simulate_message(MN_Selected,mmark,ms1);
alt_2 : simulate_message(MN_Selected,mmark,ms2);
alt_3 : simulate_message(MN_Selected,mmark,ms3);
alt_4 : simulate_message(MN_Selected,mmark,ms4);
c_1 : IF m1s THEN simulate_message(MN_Selected,mmark,mg1);
c_2 : IF m2s THEN simulate_message(MN_Selected,mmark,mg2);
c_3 : IF m3s THEN simulate_message(MN_Selected,mmark,mg3);
c_4 : IF m4s THEN simulate_message(MN_Selected,mmark,mg4);
c_f : simulate_message(MN_Selected,mmark,mfirstc);
c_l : simulate_message(MN_Selected,mmark,mlastc);
alt_i : simulate_message(MN_Selected,moptions,msetauto);
alt_x : simulate_message(MN_Selected,moptions,mstats);
alt_h : simulate_message(MN_Selected,moptions,mrefresh);
alt_t : simulate_message(MN_Selected,moptions,mfreeze);
alt_c : IF block_set THEN
simulate_message(MN_Selected,mblock,mcopy);
alt_m : IF block_set THEN
simulate_message(MN_Selected,mblock,mmove);
alt_k : IF block_set THEN
simulate_message(MN_Selected,mblock,mdelete);
w_HOME : BEGIN
home_cursor(Origin);
sheet_redraw(WholeSheet,FALSE,None);
END;
w_MOUSE : BEGIN
mx := msg_area[1]; (* mouse x-coord *)
my := msg_area[2]; (* mouse y-coord *)
mouse(mx,my);
END;
w_MESSAGE : BEGIN
handle_message;
redraw_flag := FALSE
END;
OTHERWISE : ;
END; { CASE }
2: END; (* EVALUATE_INPUT *)
PROCEDURE INIT_FUNCTIONS;
VAR i : INTEGER;
BEGIN
i := 1;
functions[i].func_name := 'ABS';
functions[i].func_type := AbsOp;
i := i+1;
functions[i].func_name := 'ACOS';
functions[i].func_type := AcosOp;
i := i+1;
functions[i].func_name := 'AND';
functions[i].func_type := AndOp;
i := i+1;
functions[i].func_name := 'ASIN';
functions[i].func_type := AsinOp;
i := i+1;
functions[i].func_name := 'ATAN';
functions[i].func_type := AtanOp;
i := i+1;
functions[i].func_name := 'CORR';
functions[i].func_type := CorrOp;
i := i+1;
functions[i].func_name := 'COS';
functions[i].func_type := CosOp;
i := i+1;
functions[i].func_name := 'COUNT';
functions[i].func_type := CountOp;
i := i+1;
functions[i].func_name := 'DEG';
functions[i].func_type := DegOp;
i := i+1;
functions[i].func_name := 'DIV';
functions[i].func_type := DivOp;
i := i+1;
functions[i].func_name := 'EXP';
functions[i].func_type := ExpOp;
i := i+1;
functions[i].func_name := 'FAC';
functions[i].func_type := FacOp;
i := i+1;
functions[i].func_name := 'FV';
functions[i].func_type := FvOp;
i := i+1;
functions[i].func_name := 'HLOOKUP';
functions[i].func_type := HlookupOp;
i := i+1;
functions[i].func_name := 'IF';
functions[i].func_type := IfOp;
i := i+1;
functions[i].func_name := 'INDEX';
functions[i].func_type := IndexOp;
i := i+1;
functions[i].func_name := 'LINR';
functions[i].func_type := LinROp;
i := i+1;
functions[i].func_name := 'LN';
functions[i].func_type := LnOp;
i := i+1;
functions[i].func_name := 'LOG';
functions[i].func_type := LogOp;
i := i+1;
functions[i].func_name := 'MAX';
functions[i].func_type := MaxOp;
i := i+1;
functions[i].func_name := 'MEAN';
functions[i].func_type := MeanOp;
i := i+1;
functions[i].func_name := 'MIN';
functions[i].func_type := MinOp;
i := i+1;
functions[i].func_name := 'MOD';
functions[i].func_type := ModOp;
i := i+1;
functions[i].func_name := 'NOT';
functions[i].func_type := NotOp;
i := i+1;
functions[i].func_name := 'NPER';
functions[i].func_type := NperOp;
i := i+1;
functions[i].func_name := 'OR';
functions[i].func_type := OrOp;
i := i+1;
functions[i].func_name := 'PI';
functions[i].func_type := PiOp;
i := i+1;
functions[i].func_name := 'PMT';
functions[i].func_type := PmtOp;
i := i+1;
functions[i].func_name := 'PREDV';
functions[i].func_type := PredVOp;
i := i+1;
functions[i].func_name := 'PROD';
functions[i].func_type := ProdOp;
i := i+1;
functions[i].func_name := 'PV';
functions[i].func_type := PvOp;
i := i+1;
functions[i].func_name := 'RAD';
functions[i].func_type := RadOp;
i := i+1;
functions[i].func_name := 'RAND';
functions[i].func_type := RandOp;
i := i+1;
functions[i].func_name := 'ROUND';
functions[i].func_type := RoundOp;
i := i+1;
functions[i].func_name := 'SDEV';
functions[i].func_type := SdevOp;
i := i+1;
functions[i].func_name := 'SERR';
functions[i].func_type := SerrOp;
i := i+1;
functions[i].func_name := 'SIN';
functions[i].func_type := SinOp;
i := i+1;
functions[i].func_name := 'SQR';
functions[i].func_type := SqrOp;
i := i+1;
functions[i].func_name := 'SQRT';
functions[i].func_type := SqrtOp;
i := i+1;
functions[i].func_name := 'SUM';
functions[i].func_type := SumOp;
i := i+1;
functions[i].func_name := 'TAN';
functions[i].func_type := TanOp;
i := i+1;
functions[i].func_name := 'TRUNC';
functions[i].func_type := TruncOp;
i := i+1;
functions[i].func_name := 'VAR';
functions[i].func_type := VarOp;
i := i+1;
functions[i].func_name := 'VLOOKUP';
functions[i].func_type := VlookupOp;
END; { INIT_FUNCTIONS }
PROCEDURE CHECK_REZ;
VAR i : INTEGER;
FUNCTION Addr ( VAR what : BlitArray ) : LONG_INTEGER;
EXTERNAL;
BEGIN
{ save the pallete }
FOR i := 0 TO 15 DO
palette[i] := XBIOS_Set_Color(i,-1);
Extended_Inquire(0);
screen_width := int_out[0]+1;
screen_height := int_out[1]+1;
half_scr_width := screen_width DIV 2;
half_scr_height := screen_height DIV 2;
max_screen_cols := screen_width DIV 40;
Extended_Inquire(1);
IF int_out[4] = 2 THEN BEGIN { med rez }
{ my favorite colors; I've indicated the ones in the
ST boot-up ( no mods via control panel ) on the left }
Set_Color(0,1000,1000,1000); { white => white }
Set_Color(1,0,0,0); { black => black }
Set_Color(2,1000,0,0); { red => red }
Set_Color(3,0,0,1000); { green => blue }
rez := 2 { set it to my rez }
END
ELSE IF int_out[4] = 1 THEN BEGIN { high rez }
Set_Color(0,1000,1000,1000); { white }
Set_Color(1,0,0,0); { black }
Set_Color(2,0,0,0); { black }
Set_Color(3,0,0,0); { black }
rez := 1
END
ELSE BEGIN { low rez or anything else }
temp := CONCAT('[3][Opus requires medium or|' ,
'high resolution...][ I''ll switch ]');
i := Do_Alert(temp,1);
End_Update;
Exit_Gem;
Halt
END;
screen_mfdb.address := 0; { sufficient to access screen }
WITH mem_mfdb DO BEGIN
address := Addr(blit_buffer);
wid_pix := screen_width;
ht_pix := screen_height;
wid_wds := wid_pix DIV 16;
format := 0;
planes := int_out[4]; { from Extended_Inquire(1) }
res1 := 0; { unused vars, but it's recommended to set to zero as }
res2 := 0; { they may have significance in future versions of GEM }
res3 := 0
END;
IF rez = 1 THEN
cell_height := 17
ELSE
cell_height := 9;
two_cell_h := 2*cell_height; { commonly used values }
three_cell_h := 3*cell_height
END; { CHECK_REZ }
PROCEDURE INITIALIZE;
LABEL 1;
TYPE Switcheroo = RECORD
CASE BYTE OF
1 : ( str : STR10 );
2 : ( switched : ThreeHundredBytes )
END;
VAR i,j,k,handle : INTEGER;
n : LONG_INTEGER;
c_s : C_STRING;
buffer : Switcheroo;
m : PrinterSpecial;
PROCEDURE ERROR;
BEGIN
handle := -1;
temp := CONCAT('[1][Read error while loading|' ,
'PRINTER.INF. No special|' ,
'codes will be used when|' ,
'printing.][ OK ]');
i := Do_Alert(temp,1);
GOTO 1
END; { ERROR }
PROCEDURE READ_BYTES ( n : LONG_INTEGER );
BEGIN
IF TOS_Read(handle,n,buffer.switched) <> n THEN
error
END; { READ_BYTES }
FUNCTION PTR_TO_LONG ( addr : Generic_Ptr ) : LONG_INTEGER;
EXTERNAL;
BEGIN
check_rez;
drive := TOS_Get_Drive;
i := TOS_Get_Directory(directory,0);
C_To_Pascal(directory,full_path);
full_path := CONCAT(CHR(drive+65),':',full_path);
IF rez = 1 THEN
temp_1 := 'H'
ELSE
temp_1 := 'M';
temp := CONCAT(full_path,'\OPUS',temp_1,'.RSC');
IF NOT Load_Resource(temp) THEN BEGIN
temp := CONCAT('[3][OPUS',temp_1,'.RSC was not found!|' ,
'It must live in the same|' ,
'directory as OPUS.PRG.][ Cancel ]');
alert := Do_Alert(temp,1);
End_Update;
Exit_Gem;
HALT
END;
Find_Menu(mainmenu,main_menu); { main_menu is the pointer }
IF rez = 1 THEN { high rez }
Menu_Enable(main_menu,msmall);
Find_Dialog(infodial,info_ptr);
Find_Dialog(fmatdial,fmat_ptr);
Find_Dialog(vfrmdial,vfrm_ptr);
Find_Dialog(gotodial,goto_ptr);
Find_Dialog(repdial,rep_ptr);
Find_Dialog(prdial,print_ptr);
Find_Dialog(sortdial,sort_ptr);
Find_Dialog(rangdial,rang_ptr);
Find_Dialog(errdial,err_ptr);
Find_Dialog(statdial,stat_ptr);
Find_Dialog(pagedial,page_ptr);
Find_Dialog(keydial,key_ptr);
Find_Dialog(formdial,form_ptr);
Find_Dialog(prhdial,prhelp_ptr);
Find_Dialog(mhlpdial,mhelp_ptr);
Find_Dialog(crefdial,crefhelp_ptr);
Find_Dialog(rechdial,rechelp_ptr);
Find_Dialog(datadial,data_fill_ptr);
Find_Dialog(frzdial,freeze_ptr);
Find_Dialog(actdial,action_ptr);
Find_Dialog(newdesk,new_desk_ptr);
hide;
Form_Anywhere(new_desk_ptr,0,cell_height+2,w_1,h_1);
Obj_Size(new_desk_ptr,panel,fo_x,fo_y,fo_w,fo_h);
con_x := 0;
con_y := fo_y+fo_h+4;
con_w := screen_width;
con_h := screen_height-con_y;
Obj_Size(new_desk_ptr,editarea,area_x,area_y,area_w,area_h);
area_x := area_x+1;
area_w := area_w-2;
area_y := area_y+1;
area_h := area_h-2;
edit_x := area_x+8;
IF rez = 1 THEN
edit_y := area_y+13
ELSE
edit_y := area_y+6;
FOR m := Init TO UnderOff DO
printer_codes[m] := '';
temp := CONCAT(full_path,'\PRINTER.INF');
Pascal_To_C(temp,c_s);
handle := TOS_Open(c_s,0);
IF handle >= 0 THEN BEGIN
read_bytes(11);
IF buffer.str <> 'opus print' THEN BEGIN
temp := CONCAT('[1][PRINTER.INF is corrupted.|' ,
'No special printer codes|' ,
'will be used.][ OK ]');
alert := Do_Alert(temp,1);
handle := -1;
GOTO 1
END;
read_bytes(3);
port := buffer.switched[1];
nl_chr_line := buffer.switched[2];
con_chr_line := buffer.switched[3];
FOR m := Init TO Underoff DO BEGIN
read_bytes(1);
IF buffer.switched[1] > 0 THEN
IF TOS_Seek(-1,handle,1) < 0 THEN
error
ELSE BEGIN
read_bytes(buffer.switched[1]+1);
printer_codes[m] := buffer.str
END
END
END
ELSE BEGIN
temp := CONCAT('[1][PRINTER.INF was not found.|' ,
'No special printer codes|' ,
'will be used.][ OK ]');
alert := Do_Alert(temp,1)
END;
1: IF handle < 0 THEN BEGIN
nl_chr_line := 80;
con_chr_line := 136;
port := Centronics;
FOR m := Init TO UnderOff DO
printer_codes[m] := ''
END;
default_path[1] := CONCAT(full_path,'\*.OPS');
default_path[2] := CONCAT(full_path,'\*.DOC');
current_file := '';
n_hdls := 1;
t_1 := ' WorkSheet1 ';
t_2 := ' WorkSheet2 ';
w_idx := 1; { index into w_pos array }
w_pos[w_idx,first_row] := 1; { usage example }
w_pos[1,first_col] := 1; { Note that for the opening window we needn't }
w_pos[1,hot_row] := 1; { specify the finish or scr. pos. parms. }
w_pos[1,hot_col] := 1; { These are relevant for restoring the }
{ values after redraws. The second window is }
{ always set to the 1st attr when opened. }
act_hdl := New_Window(G_All,t_1,con_x,con_y,con_w,con_h);
IF act_hdl = No_Window THEN BEGIN
alert := Do_Alert('[3][GEM has no more windows!][ Cancel ]',1);
Free_Resource;
End_Update;
Exit_Gem;
HALT
END;
w_pos[1,w_hdl] := act_hdl;
init_functions;
e_table[1] := e;
e_table[2] := 7.3890560989;
e_table[3] := 54.598150033;
e_table[4] := 2.9809579871E3;
e_table[5] := 8.8861105206E6;
e_table[6] := 7.8962960185E13;
e_table[7] := 6.2351490811E27;
user_quit := FALSE;
block_set := FALSE;
block_st_set := FALSE;
block_end_set := FALSE;
did_recalc := FALSE;
redraw_flag := FALSE;
auto_recalc := TRUE;
natural := TRUE;
auto_cursor := TRUE;
grid_flag := TRUE;
m1s := FALSE;
m2s := FALSE;
m3s := FALSE;
m4s := FALSE;
p_row_col := TRUE;
print_formulas := FALSE;
form_flag := FALSE;
small_text := FALSE;
draft_final := TRUE;
condensed_print := FALSE;
p_title_1 := '';
p_title_2 := '';
header := '';
footer := '^c-^p-';
error_msg[GenError] := 'Error';
error_msg[SyntaxErr] := 'SyntaxErr';
error_msg[OutOfRange] := 'OutOfRange';
error_msg[BadRef] := 'BadCellRef';
error_msg[Overflow] := 'Overflow';
error_msg[DivBy0] := 'DivBy0';
error_msg[Undefined] := 'Undefined';
error_msg[BadReal] := 'BadReal';
days[1] := 'monday';
days[2] := 'tuesday';
days[3] := 'wednesday';
days[4] := 'thursday';
days[5] := 'friday';
days[6] := 'saturday';
days[7] := 'sunday';
months[1] := 'january';
months[2] := 'february';
months[3] := 'march';
months[4] := 'april';
months[5] := 'may';
months[6] := 'june';
months[7] := 'july';
months[8] := 'august';
months[9] := 'september';
months[10] := 'october';
months[11] := 'november';
months[12] := 'december';
cursor_direction := CursorDown;
FOR i := 1 TO n_cols DO BEGIN { the pixel-width is not an exact }
col_width[i,spaces] := 10; { multiple of 8 so that the grid }
col_width[i,pixels] := 80 { lines may start and end on an 'on' }
END; { pixel; prevents 'shifting' lines }
{ when blitting in high rez }
char1 := 'A';
FOR i := 1 TO 26 DO BEGIN
col_name[i] := char1;
char1 := SUCC(char1)
END;
char1 := PRED('A');
FOR i := 27 TO n_cols DO BEGIN
IF (i-27) MOD 26 = 0 THEN
char1 := SUCC(char1);
IF (i-27) MOD 26 = 0 THEN
char2 := 'A'
ELSE
char2 := SUCC(char2);
col_name[i] := CONCAT (char1,char2)
END;
FOR i := 1 TO 4 DO BEGIN
marks[i].row := 0; { the 4 actual marks; 0 = not set }
marks[i].col := 0
END;
default_format := $02; { right just; 2 dec places, no sci; no percent }
up_case := [ 'A'..'Z' ];
low_case := [ 'a'..'z' ];
digits := [ '0'..'9' ];
float := digits+[ '.' , 'E' , 'e' , '+' , '-' ];
Single := [LogOp..NotOp];
Double := [DivOp..TruncOp];
Multiple := [AndOp..OrOp];
Aggregate := [CountOp..PredVOp];
Financial := [PvOp..NPerOp];
LookUp := [VLookUpOp..IndexOp];
too_long := CONCAT ('[1][You have now entered the|' ,
'maximum allowed number of|' ,
'characters...][ OK ]');
float_over := CONCAT ('[1][<< Floating point overflow >>|' ,
' |',
'Numbers must fall within this|' ,
'range:|' ,
' +/- 1 E +/- 37][ OK ]');
null_str := '';
FOR i := 0 TO n_rows DO
data[i] := NIL;
Hide_Mouse;
Set_Mouse(M_Arrow);
Draw_Menu(main_menu);
data_row := 1;
data_col := 1;
set_up_cell_name;
Wind_Set(0,WF_NewDesk,INT(ShR(ptr_to_long(new_desk_ptr),16)),
INT(ptr_to_long(new_desk_ptr) & $0000FFFF),
Root,Max_Depth);
Form_Dial(3,0,0,screen_width,screen_height,
0,0,screen_width,screen_height);
Open_Window(act_hdl,con_x,con_y,con_w,con_h);
Border_Rect(act_hdl,o_x,o_y,max_w,max_h); { original vals }
home_cursor(Origin);
default_draw_attributes;
freeze_row := 0;
freeze_col := 0;
logical_row_1 := 1;
logical_col_1 := 1;
x_margin := 38;
y_margin := cell_height-1;
Show_Mouse
END; (* INITIALIZE *)
BEGIN { PROGRAM }
WHILE KeyPress DO
long_key := BConIn(2); { clean junk out of keyboard }
ap_id := Init_Gem; { save for sending self messages, also for }
IF ap_id >= 0 THEN BEGIN { possible communication with accs }
Begin_Update;
initialize;
{ make smaller to account for procedure vars, space returned to stack
that isn't useful, etc. So this in effect reserves 20K bytes for the
stack, since we won't allocate the cells which could fit in this
space. Do this here rather than in INITIALIZE because to get the
heap size, it subtracts that space between start of heap and
end of stack, and any proc variables on the stack detract from
Memavail }
original_memory := MemAvail*2-20000; { words -> bytes }
working_memory := original_memory;
REPEAT { heart of the program }
inp_code := NoCode;
mask_out_recalc;
{ NOTE: window_input is passed a formula if cell is class F or a
string if class A;
if no changes in this item are made, it returns the value
NULL, and thus the cell is not affected in ANY WAY }
temp := '';
ptr := locate_cell(data_row,data_col);
IF ptr <> NIL THEN
IF ptr^.class <> Val THEN BEGIN
IF ptr^.str <> NIL THEN BEGIN
inp_code := w_F;
temp := ptr^.str^
END;
window_input(string_len,AlphaNumeric,temp)
END { see wind_inp.pas for global vars it uses }
ELSE
window_input(float_len,FloatingPoint,temp)
ELSE
window_input(float_len,FloatingPoint,temp);
evaluate_input
UNTIL user_quit;
{ clean up... }
End_Update;
Erase_Menu(main_menu); { needn't delete_menu since I used RCS }
{ close & delete windows so we don't crash GEM }
IF n_hdls = 2 THEN BEGIN
Close_Window(w_pos[2,w_hdl]);
Delete_Window(w_pos[2,w_hdl])
END;
Close_Window(w_pos[1,w_hdl]); { which is always present }
Delete_Window(w_pos[1,w_hdl]);
Set_Palette(palette); { restore user's colors }
Wind_Set(0,WF_NewDesk,0,0,Root,Max_Depth); { tell Desktop to use }
Form_Dial(3,0,0,screen_width,screen_height,{ its own definition }
0,0,screen_width,screen_height);
Free_Resource; { give GEM the memory back }
Exit_Gem
END (* IF ap_id >= 0 *)
END.