TABLES.MOD 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. IMPLEMENTATION MODULE Tables;
  2. (*
  3. * ModBase
  4. * Release 3.0
  5. * (c) Copyright 1986 - 1991 PMI
  6. * P.O. Box 8402
  7. * Green Bay Wi 53308
  8. * All Rights Reserved
  9. * by Ed Ross
  10. *)
  11. FROM ScrnTypes IMPORT DisplayFrame,InputFieldRecord,InitField,
  12. IntCode,StringCode,RealCode,DispCode,GroupMember,InitDisplayFrame,
  13. ImageElement,InputFieldPtr;
  14. FROM ScrnUtl1 IMPORT PutFieldRec,PutFrameLists,GetImageRec,PutFieldRec,
  15. GetImageRec,PutFieldImageRec,GetFieldPtr;
  16. FROM ScrnUtl2 IMPORT CreateImageElement,AddImageElement,CloseDisplayFrame;
  17. FROM StrEdit IMPORT SetLength,OverWrite;
  18. FROM GenLists IMPORT NewList,DisposeList,GetElmt,GetElmtAdr,ListInsert,
  19. ListInsertAdr,ListLength,GenList,SortList,ShellSortList;
  20. FROM SYSTEM IMPORT SIZE,TSIZE, ADR,ADDRESS;
  21. FROM FramePainter IMPORT ShowDisplayFrame;
  22. FROM M2Strings IMPORT Length,Assign;
  23. FROM NumTypes IMPORT REALToReal8;
  24. FROM StrConv IMPORT IntegerToStr,RealToStr,StrToInteger,StrToReal;
  25. FROM VStorage IMPORT DosAlloc,DosDealloc;
  26. FROM LowLevel IMPORT Fill;
  27. FROM ControlUtils IMPORT Control;
  28. IMPORT VWindows;
  29. IMPORT MsColors;
  30. TYPE
  31. Table = POINTER TO TableRec;
  32. TableRec = RECORD
  33. DF : DisplayFrame;
  34. Choice : ARRAY[0..15] OF CHAR; (* choice fields *)
  35. RowDef : GenList;
  36. NumberOfRows,
  37. NumberOfCols : CARDINAL;
  38. END;
  39. ColumDef = RECORD
  40. InField : InputFieldRecord;
  41. X : CARDINAL;
  42. Width : CARDINAL;
  43. Choice : ARRAY[0..15] OF CHAR;
  44. Title : ARRAY[0..40] OF CHAR; (* caption for top of field *)
  45. END;
  46. (* these procedures are used to define the table *)
  47. PROCEDURE DefineTextCol(VAR T:Table; X, Width : CARDINAL;
  48. Title : ARRAY OF CHAR; DisplayOnly : BOOLEAN);
  49. VAR
  50. Col : ColumDef;
  51. BEGIN
  52. InitField(Col.InField);
  53. IF DisplayOnly
  54. THEN Col.InField.typ := DispCode
  55. ELSE Col.InField.typ := StringCode;
  56. END;
  57. Col.X := X;
  58. Col.Width := Width;
  59. Assign( Title,Col.Title);
  60. ListInsert(Col,1,T^.RowDef,80);
  61. END DefineTextCol;
  62. PROCEDURE DefineGroupCol(VAR T:Table; X,Width : CARDINAL; Title : ARRAY OF CHAR;
  63. Choice : ARRAY OF CHAR; MenuKey : CARDINAL; NbrOfChoice, ThisChoice : CARDINAL;
  64. SelectDefault: BOOLEAN );
  65. VAR
  66. Col : ColumDef;
  67. BEGIN
  68. InitField(Col.InField);
  69. Col.InField.typ := GroupMember;
  70. Col.InField.MenuKey := MenuKey;
  71. Col.InField.GroupSize := NbrOfChoice;
  72. Col.InField.GroupID := ThisChoice;
  73. Col.InField.selected := SelectDefault;
  74. Assign(Choice,Col.InField.fnam );
  75. Col.X := X;
  76. Col.Width := Width;
  77. Assign( Choice,Col.Choice); (* default text *)
  78. Assign( Title,Col.Title );
  79. ListInsert(Col,1,T^.RowDef,80);
  80. END DefineGroupCol;
  81. PROCEDURE DefineIntegerCol(VAR T:Table; X,Width : CARDINAL; Title : ARRAY OF CHAR;
  82. Min, Max : LONGINT);
  83. VAR
  84. Col : ColumDef;
  85. BEGIN
  86. InitField(Col.InField);
  87. Col.InField.typ := IntCode;
  88. Col.InField.iMax := Max;
  89. Col.InField.iMin := Min;
  90. Col.X := X;
  91. Col.Width := Width;
  92. Assign( Title,Col.Title );
  93. ListInsert(Col,1,T^.RowDef,80);
  94. END DefineIntegerCol;
  95. PROCEDURE DefineRealCol(VAR T:Table; X,Width : CARDINAL; Title : ARRAY OF CHAR;
  96. Min, Max : REAL);
  97. VAR
  98. Col : ColumDef;
  99. BEGIN
  100. InitField(Col.InField);
  101. Col.InField.typ := RealCode;
  102. Col.InField.rMax := REALToReal8(Max);
  103. Col.InField.rMin := REALToReal8(Min);
  104. Col.InField.decimalPlace := 2;
  105. Col.X := X;
  106. Col.Width := Width;
  107. Assign( Title,Col.Title );
  108. ListInsert(Col,1,T^.RowDef,80);
  109. END DefineRealCol;
  110. PROCEDURE DefineTable(VAR T:Table; Caption : ARRAY OF CHAR);
  111. BEGIN
  112. DosAlloc(T,TSIZE(TableRec)); (* allocate the table *)
  113. InitDisplayFrame(T^.DF,VWindows.CurrentWindow); (* inint the display Frame*)
  114. T^.DF^.action := 'I';
  115. T^.DF^.headline := 3; (* the title shouldn't scroll *)
  116. T^.DF^.selfor := MsColors.brightwhite;
  117. Assign( Caption,T^.DF^.Caption);
  118. T^.DF^.ClearAfter := TRUE;
  119. NewList( T^.DF^.FieldList );
  120. PutFrameLists( T^.DF );
  121. (*Make sure the new FieldList gets inserted into
  122. TheFrame's .self list. Stole this from Cole???? *)
  123. NewList(T^.RowDef);
  124. END DefineTable;
  125. PROCEDURE PutInOrder( Adr1 : ADDRESS; S1 : CARDINAL;
  126. Adr2 : ADDRESS; S2:CARDINAL) : INTEGER;
  127. (* before building the table make sure the thing is in correct order *)
  128. VAR
  129. C1, C2 : POINTER TO ColumDef;
  130. BEGIN
  131. C1 := Adr1;
  132. C2 := Adr2;
  133. IF C1^.X > C2^.X
  134. THEN RETURN 1
  135. ELSE RETURN -1
  136. END;
  137. END PutInOrder;
  138. PROCEDURE BuildTable(VAR T:Table; NbrRows : CARDINAL);
  139. (* this routine will go through the row list of the table and build the*)
  140. (* The table *)
  141. VAR J : CARDINAL;
  142. Row : CARDINAL;
  143. Col : POINTER TO ColumDef;
  144. TmpCol : ColumDef;
  145. Size,Code : CARDINAL;
  146. ImgNbr : CARDINAL;
  147. Str : ARRAY[0..80] OF CHAR;
  148. TmpRec : ImageElement;
  149. BEGIN
  150. WITH T^ DO
  151. ShellSortList(RowDef,PutInOrder); (* should have been defined in order *)
  152. (* but make sure - *)
  153. NumberOfRows := NbrRows;
  154. NumberOfCols := ListLength(RowDef);
  155. (* at the top of the table put the title rows *)
  156. FOR J := 1 TO ListLength(RowDef) DO (* add title row *)
  157. GetElmt(RowDef,J,TmpCol,Code); (* get a copy of the record *)
  158. TmpCol.InField.typ := 'D'; (* make it a display only *)
  159. CreateImageElement(TmpRec,TmpCol.X,2,DF^.normfor,DF^.normbak,
  160. DF^.normatrb,ListLength(DF^.FieldList)+1,TmpCol.Title);
  161. AddImageElement(DF,TmpRec,ImgNbr);
  162. TmpCol.InField.ImageNum := ImgNbr;
  163. PutFieldRec(TmpCol.InField,DF,65535); (* stick at end*)
  164. END;
  165. (* add the elemets to the table *)
  166. FOR Row := 1 TO NbrRows DO (* for each row in the table *)
  167. FOR J := 1 TO ListLength(RowDef) DO (* for each colum in row *)
  168. GetElmtAdr(RowDef,J,Col,Size,Code);
  169. Fill(ADR(Str),SIZE(Str),' '); (* blank fill the input string *)
  170. SetLength(Str,Col^.Width);
  171. IF Col^.InField.typ = GroupMember
  172. THEN
  173. Assign(Col^.Choice,Str );
  174. END;
  175. CreateImageElement(TmpRec,Col^.X,Row+3,DF^.normfor,DF^.normbak,
  176. DF^.normatrb,ListLength(DF^.FieldList)+1,Str);
  177. AddImageElement(DF,TmpRec,ImgNbr);
  178. Col^.InField.ImageNum := ImgNbr;
  179. PutFieldRec(Col^.InField,DF,65535); (* stick at end*)
  180. END; (* end of for each col *)
  181. END; (* end for each row *)
  182. END; (* end with table *)
  183. END BuildTable;
  184. PROCEDURE ShowTable(T : Table;X1,Y1,X2,Y2: CARDINAL);
  185. BEGIN
  186. ShowDisplayFrame(T^.DF,X1,Y1,X2,Y2);
  187. END ShowTable;
  188. PROCEDURE ControlTable(VAR T:Table;X1,Y1,X2,Y2: CARDINAL);
  189. BEGIN
  190. ShowDisplayFrame(T^.DF,X1,Y1,X2,Y2);
  191. Control(T^.DF);
  192. END ControlTable;
  193. PROCEDURE DeleteTable(VAR T:Table);
  194. BEGIN
  195. CloseDisplayFrame(T^.DF);
  196. DisposeList(T^.RowDef);
  197. DosDealloc(T,TSIZE(TableRec));
  198. END DeleteTable;
  199. PROCEDURE PutCell(VAR T:Table; X,Y : CARDINAL; Cell : CellValue);
  200. (* fill a value in table - the X and Y here refer to the cell numbers *)
  201. (* not to the placement on the screen *)
  202. VAR
  203. FieldNbr : CARDINAL;
  204. Image : ImageElement;
  205. FldPtr : InputFieldPtr;
  206. B : BOOLEAN;
  207. LL : CARDINAL;
  208. Str : ARRAY[0..80] OF CHAR; (* must maintain the original length*)
  209. BEGIN
  210. LL := ListLength(T^.RowDef);
  211. FieldNbr := ((Y) * LL) + X ; (* compute field nbr*)
  212. GetImageRec(T^.DF,FieldNbr,Image);
  213. GetFieldPtr(T^.DF,FieldNbr,FldPtr);
  214. CASE FldPtr^.typ OF
  215. StringCode,DispCode :
  216. Fill(ADR(Str),SIZE(Str),' ');
  217. OverWrite(Cell.Str,Str,0); (* keep the length of the orignal*)
  218. SetLength(Str,Length(Image.text)+1);
  219. Assign( Str,Image.text);
  220. |IntCode : IntegerToStr(Cell.I,Length(Image.text),Image.text);
  221. |RealCode : RealToStr(Cell.R,2,Length(Image.text),Image.text);
  222. |GroupMember: FldPtr^.selected := Cell.B;
  223. END;
  224. PutFieldImageRec(Image,T^.DF,FieldNbr);
  225. END PutCell;
  226. PROCEDURE GetCell(VAR T:Table; X,Y : CARDINAL; VAR Cell : CellValue); (* get contents of cell*)
  227. VAR
  228. FieldNbr : CARDINAL;
  229. Image : ImageElement;
  230. FldPtr : InputFieldPtr;
  231. B : BOOLEAN;
  232. LL : CARDINAL;
  233. BEGIN
  234. LL := ListLength(T^.RowDef);
  235. FieldNbr := ((Y) * LL) + X; (* compute field nbr*)
  236. GetImageRec(T^.DF,FieldNbr,Image);
  237. GetFieldPtr(T^.DF,FieldNbr,FldPtr);
  238. CASE FldPtr^.typ OF
  239. StringCode,DispCode : Assign( Image.text,Cell.Str);
  240. |IntCode : B := StrToInteger(Image.text,0,Cell.I);
  241. |RealCode : B := StrToReal(Image.text,0,Cell.R);
  242. |GroupMember: Cell.B := FldPtr^.selected;
  243. END;
  244. END GetCell;
  245. PROCEDURE NumberOfRows(T : Table) : CARDINAL;
  246. BEGIN
  247. RETURN T^.NumberOfRows;
  248. END NumberOfRows;
  249. PROCEDURE NumberOfCols( T : Table) : CARDINAL;
  250. BEGIN
  251. RETURN T^.NumberOfCols;
  252. END NumberOfCols;
  253. END Tables.
  254.