PMIDBMS.MOD 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259
  1. MODULE PMIdbms; (* * REPERTOIRE * Release 1.6 * By Charles Bradford and
  2. Cole Brecheen * (c) Copyright 1985-1991 PMI * Green Bay Wisconsin * All
  3. rights reserved * (414) 468-6040 * * $Header:
  4. D:/logfiles/demos/pmidbms.mov 1.3 09 Dec 1990 11:18:22 coleb $ * * A
  5. program to illustrate use of REPERTOIRE's screen * and NdxFile system.
  6. This is the advanced example; * programmers new to REPERTOIRE should begin
  7. with DEMO1. *)
  8. (*
  9. IMPORT EMS;
  10. EMS is part of PMI's EmsStorage, a product separate from
  11. Repertoire. It allows Repertoire applications automatically
  12. to use expanded memory. If you don't have it, just comment
  13. out the IMPORT EMS from any program modules in which it
  14. appears.*)
  15. IMPORT BuildLst;
  16. IMPORT ByteFiddler;
  17. IMPORT ControlUtils;
  18. IMPORT DateFunctions;
  19. IMPORT DirManager;
  20. IMPORT Drectory;
  21. IMPORT DspFiles;
  22. IMPORT EnvironUtils;
  23. IMPORT ErrorManager;
  24. IMPORT ErrStrgs;
  25. IMPORT HandleIO;
  26. IMPORT FrameManager;
  27. IMPORT FramePainter;
  28. IMPORT GenLists;
  29. IMPORT InitCompilerMods;
  30. IMPORT InputManager;
  31. IMPORT KbdInput;
  32. IMPORT ListUtils;
  33. IMPORT NdxUtils;
  34. IMPORT MsgBox2;
  35. IMPORT NdxBones;
  36. IMPORT NdxFiles;
  37. IMPORT NdxTypes;
  38. IMPORT NumTypes;
  39. IMPORT PosUtils;
  40. IMPORT PrtFrame;
  41. IMPORT Scrn2Ndx;
  42. IMPORT ScrnTypes;
  43. IMPORT ScrnUtl1;
  44. IMPORT ScrnUtl2;
  45. IMPORT SmartScreen;
  46. IMPORT StrConv;
  47. IMPORT StrEdit;
  48. IMPORT StringIO;
  49. IMPORT M2Strings;
  50. IMPORT UserOps;
  51. IMPORT VEditor;
  52. IMPORT VWindows;
  53. IMPORT WindowPrims;
  54. VAR
  55. NdxFile: NdxTypes.NdxFileType;
  56. ScreenFile: ScrnTypes.DisplayFile;
  57. EntryFrame: ScrnTypes.DisplayFrame;
  58. NdxFileName, RecName: ARRAY [0..79] OF CHAR;
  59. dumbool: BOOLEAN;
  60. PrnHandle, SavedCursorHeight : CARDINAL;
  61. PROCEDURE PrintMenu();
  62. VAR
  63. TmpName: ScrnTypes.AFrameName;
  64. thestr: ARRAY [0..79] OF CHAR;
  65. ff: ARRAY [0..0] OF CHAR;
  66. FormFeeding, dumbool: BOOLEAN;
  67. TmpList: GenLists.GenList;
  68. chkey: CARDINAL;
  69. LeftMargin : INTEGER;
  70. InvoiceFrame, DialogBox: ScrnTypes.DisplayFrame;
  71. PROCEDURE WriteInvoice();
  72. VAR
  73. NewEd: GenLists.GenList;
  74. month, day, year, AcctBalance: CARDINAL;
  75. date, name, tmpstr : ARRAY [0..50] OF CHAR;
  76. BEGIN
  77. ControlUtils.ReadInput( EntryFrame, tmpstr, 'ACCTBAL' );
  78. (* get account balance string from record entry frame *)
  79. IF NOT StrConv.StrToCardinal(tmpstr, 0, AcctBalance) THEN
  80. AcctBalance := 0;
  81. END;
  82. IF AcctBalance > 0 THEN
  83. StrEdit.MakeCurrency( '$', tmpstr );
  84. ControlUtils.ChangeField( InvoiceFrame, tmpstr,
  85. 'AMTDUE', TRUE );
  86. ControlUtils.ChangeField( InvoiceFrame, '$0.00',
  87. 'AMTPAID', TRUE );
  88. ELSE
  89. ControlUtils.ChangeField( InvoiceFrame, 'prepaid',
  90. 'TERMS', TRUE );
  91. END;
  92. EnvironUtils.GetDate( month, day, year, name, date );
  93. (* get the system date *)
  94. ControlUtils.ChangeField( InvoiceFrame, date, 'DATE', TRUE );
  95. (*Insert the current date.*)
  96. ControlUtils.ChangeField( InvoiceFrame, date, 'SHIPDATE', TRUE);
  97. (* fill in default dates *)
  98. ControlUtils.ReadInput( EntryFrame, name, 'NAME');
  99. (* get the name of the customer out of the record entry frame*)
  100. ScrnUtl2.CopyEdField( EntryFrame, 'ADDRESS',
  101. InvoiceFrame, 'SOLDTO');
  102. ScrnUtl2.GetEdField( InvoiceFrame, 'SOLDTO', NewEd );
  103. GenLists.ListInsert( name, GenLists.StrCode, NewEd, 1);
  104. (* put name and address in sold to field; notice that
  105. we don't have to do a PutEdField here because
  106. ScrnUtl2.GetEdField returns the real list, not a copy of it. *)
  107. ScrnUtl2.CopyEdField( InvoiceFrame, 'SOLDTO', InvoiceFrame,
  108. 'SHIPTO');
  109. FramePainter.ShowDisplayFrame( InvoiceFrame, 0, 0, 0, 0 );
  110. InputManager.ControlFrame( InvoiceFrame, 0, '', FALSE, TmpName );
  111. (* now let user change screen if desired *)
  112. IF NOT PosUtils.Equal( TmpName, InvoiceFrame^.normlnext ) THEN
  113. RETURN
  114. END;
  115. IF AcctBalance > 0 THEN
  116. PrtFrame.PrintDisplayFrame( InvoiceFrame,
  117. PrnHandle, LeftMargin );
  118. StringIO.WriteStr( PrnHandle, 14C);
  119. (* send a page feed to the printer *)
  120. END;
  121. ControlUtils.ChangeField( InvoiceFrame,
  122. ' This Copy For Your Records.', 'TITLE', FALSE );
  123. PrtFrame.PrintDisplayFrame( InvoiceFrame,
  124. PrnHandle, LeftMargin );
  125. END WriteInvoice;
  126. BEGIN
  127. (*PrintMenu*)
  128. ScrnTypes.InitDisplayFrame( DialogBox, VWindows.CurrentWindow );
  129. ScrnTypes.InitDisplayFrame( InvoiceFrame, VWindows.CurrentWindow );
  130. DspFiles.ReadDisplayFrame( ScreenFile, InvoiceFrame, '28' );
  131. (* now fill screen with input data *)
  132. PrnHandle := StringIO.StdPrn;
  133. ff[0] := CHR(12);
  134. LOOP
  135. TmpName := 'PrintDialog'; (*The print menu screen.*)
  136. ControlUtils.ReadShowAndCntrl( ScreenFile, DialogBox, TmpName );
  137. IF PosUtils.Equal( TmpName, '5' ) THEN
  138. (* User pressed Cancel or Escape *)
  139. EXIT;
  140. END;
  141. chkey := ScrnUtl1.WhichChoiceKey( DialogBox,
  142. ScrnUtl1.FieldNum(DialogBox, 'file') );
  143. CASE CHR(chkey) OF
  144. 'f':
  145. HandleIO.OpenForAppending( "PRINTER.TXT", PrnHandle);
  146. | 'p':
  147. StringIO.PrintMessage(HandleIO.OpenFile(PrnHandle,'PRN'));
  148. END;
  149. FormFeeding := ScrnUtl1.WhichChoiceKey( DialogBox,
  150. ScrnUtl1.FieldNum(DialogBox, 'ff') ) = ORD('Y');
  151. ScrnUtl1.GetIntField( DialogBox,
  152. ScrnUtl1.FieldNum(DialogBox, 'margin'), LeftMargin );
  153. chkey := ScrnUtl1.WhichChoiceKey( DialogBox,
  154. ScrnUtl1.FieldNum(DialogBox, 'label') );
  155. CASE CHR(chkey) OF
  156. 'A':
  157. ControlUtils.ReadInput( EntryFrame, thestr, 'NAME');
  158. StringIO.PrintMessage( HandleIO.FillFile( PrnHandle,
  159. LeftMargin, ' ' ) );
  160. StrEdit.CrunchBlanks(thestr);
  161. StringIO.WriteEol( PrnHandle, thestr );
  162. IF NOT ScrnUtl1.ListFromEdField(
  163. EntryFrame,
  164. ScrnUtl1.FieldNum( EntryFrame, 'ADDRESS' ),
  165. TmpList ) THEN
  166. HALT();
  167. END;
  168. ListUtils.PrintList( PrnHandle, TmpList, LeftMargin,
  169. StringIO.CrLf );
  170. | 'I':
  171. WriteInvoice();
  172. | 'T':
  173. PrtFrame.PrintFrameData( EntryFrame, PrnHandle, LeftMargin );
  174. END;
  175. IF FormFeeding THEN
  176. StringIO.WriteEol( PrnHandle, ff );
  177. END;
  178. END;
  179. StringIO.PrintMessage( HandleIO.CloseHandle( PrnHandle));
  180. ScrnUtl2.CloseDisplayFrame( InvoiceFrame );
  181. ScrnUtl2.CloseDisplayFrame( DialogBox );
  182. END PrintMenu;
  183. PROCEDURE DoOneRecord( RecName: ARRAY OF CHAR );
  184. VAR
  185. KeyHit, month, day, year: CARDINAL;
  186. DateStr, dumstr: ARRAY [0..15] OF CHAR;
  187. ch: CHAR;
  188. NextName: ScrnTypes.AFrameName;
  189. TmpFrame: ScrnTypes.DisplayFrame;
  190. BEGIN
  191. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  192. DspFiles.ReadFrame( ScreenFile, EntryFrame, '3' );
  193. (*Frame 3 is the entry form.*)
  194. IF NOT Scrn2Ndx.FillScrFast( NdxFile, EntryFrame,
  195. RecName, '') THEN
  196. (*FillScr says we're creating a new record, so fill the
  197. screen with some default values to save the user
  198. some typing.*)
  199. ControlUtils.ChangeField( EntryFrame, RecName, 'name', TRUE );
  200. (*Insert the RecName they've selected.*)
  201. EnvironUtils.GetDate( month, day, year, dumstr, DateStr );
  202. ControlUtils.ChangeField( EntryFrame, DateStr, 'date', TRUE );
  203. (*Insert the current date.*)
  204. END;
  205. FramePainter.ShowDisplayFrame( EntryFrame, 0, 0, 0, 0 );
  206. (*Displays the entry form.*)
  207. REPEAT
  208. NextName := '5';
  209. (*The menu at the top of the screen.*)
  210. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextName );
  211. IF PosUtils.Equal( NextName, '2' ) THEN
  212. (* User pressed Escape *)
  213. IF EntryFrame^.FrameChanged THEN
  214. IF MsgBox2.MsgOkay( TmpFrame, VWindows.SE,
  215. "Changes made will be lost. Please confirm." ) THEN
  216. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  217. RETURN;
  218. ELSE
  219. ch := 0C;
  220. NextName := '5';
  221. END;
  222. ELSE
  223. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  224. RETURN;
  225. END;
  226. ELSE
  227. ch := CAP( ScrnUtl1.SelectedChar( TmpFrame ) );
  228. END;
  229. IF ch = 'S' THEN
  230. (*Store*)
  231. StrEdit.SetLength( RecName, 0 );
  232. (*We're using a null record name here to make PutScrFast
  233. take its record name from the 'name' field in EntryFrame.*)
  234. EnvironUtils.GetDate( month, day, year, dumstr, DateStr );
  235. ControlUtils.ChangeField( EntryFrame, DateStr, 'date', TRUE );
  236. (*Make the date field reflect date of last change.*)
  237. IF Scrn2Ndx.PutScrFast( NdxFile, EntryFrame,
  238. RecName, 'name') THEN
  239. IF NOT NdxFiles.WriteRecord( NdxFile, RecName) THEN
  240. ControlUtils.RdShwAndCntrlConst( ScreenFile, TmpFrame, '17' );
  241. (*"Cannot put record in file" message*)
  242. ELSE
  243. EntryFrame^.FrameChanged := FALSE;
  244. ControlUtils.RdShwAndCntrlConst( ScreenFile, TmpFrame, '15' );
  245. (*"Record successfully added" message*)
  246. END;
  247. ELSE
  248. ControlUtils.RdShwAndCntrlConst( ScreenFile, TmpFrame, '17' );
  249. END;
  250. ELSIF ch = 'D' THEN
  251. (*Delete*)
  252. ControlUtils.ReadInput( EntryFrame, RecName, 'name');
  253. IF MsgBox2.MsgOkay( TmpFrame, VWindows.SE,
  254. "Preparing to delete record. Please confirm." ) THEN
  255. IF NdxFiles.DeleteRecord( NdxFile, RecName) THEN
  256. ControlUtils.RdShwAndCntrlConst( ScreenFile, TmpFrame, '14' );
  257. (* successfully deleted *)
  258. ELSE
  259. ControlUtils.RdShwAndCntrlConst( ScreenFile, TmpFrame, '11' );
  260. (* cannot delete this record *)
  261. END;
  262. END;
  263. ELSIF ch = 'P' THEN
  264. (* Print *)
  265. PrintMenu();
  266. FramePainter.ShowDisplayFrame( EntryFrame, 0, 0, 0, 0 );
  267. ELSIF ch = 'E' THEN
  268. (*Edit.*)
  269. ControlUtils.Control( EntryFrame );
  270. END;
  271. UNTIL PosUtils.Equal(NextName, '2');
  272. (*Frame 2 is the Main Menu *)
  273. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  274. END DoOneRecord;
  275. PROCEDURE ShowAllRecords( TheList: GenLists.GenList );
  276. VAR
  277. cnt, lngth, TypeCode: CARDINAL;
  278. TmpName: NdxTypes.RecNameStr;
  279. TmpFrame: ScrnTypes.DisplayFrame;
  280. BEGIN
  281. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  282. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '42' );
  283. (* changes the line at the bottom that explains the special keys *)
  284. lngth := GenLists.ListLength( TheList );
  285. cnt := 1;
  286. WHILE (cnt <= lngth) DO
  287. GenLists.GetElmt( TheList, cnt, TmpName, TypeCode );
  288. DoOneRecord( TmpName );
  289. INC(cnt);
  290. END;
  291. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '1' );
  292. (* resets the bottom line explaining the special keys *)
  293. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  294. END ShowAllRecords;
  295. PROCEDURE ProcessRecord();
  296. VAR
  297. spot, dumc, LandingField, KeyHit: CARDINAL;
  298. done: BOOLEAN;
  299. NdxRec: NdxTypes.NdxElement;
  300. NextFrame: ScrnTypes.AFrameName;
  301. TmpFrame: ScrnTypes.DisplayFrame;
  302. BEGIN
  303. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  304. RecName := '';
  305. REPEAT
  306. NextFrame := '4'; (*the record selection form*)
  307. DspFiles.ReadDisplayFrame( ScreenFile, TmpFrame, NextFrame );
  308. REPEAT
  309. ControlUtils.ChangeField( TmpFrame, RecName, 'name', TRUE );
  310. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  311. LandingField := 0;
  312. InputManager.ControlFrame( TmpFrame,
  313. LandingField, '', FALSE, NextFrame );
  314. IF NOT PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  315. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  316. RETURN;
  317. END;
  318. ControlUtils.ReadInput( TmpFrame, RecName, 'name');
  319. done := NdxFiles.RecordExists( NdxFile, RecName);
  320. IF NOT done THEN
  321. done := MsgBox2.MsgOkay( TmpFrame, VWindows.SE,
  322. "Record not found. Preparing to create it. Please confirm." );
  323. END;
  324. IF NOT done THEN
  325. IF MsgBox2.MsgOkay( TmpFrame, VWindows.SE,
  326. "Search for a name in which this pattern appears?" ) THEN
  327. StrEdit.CrunchBlanks( RecName );
  328. spot := GenLists.ScanList( RecName, NdxFile^.Ndx,
  329. 1, 65535, dumc );
  330. IF spot > 0 THEN
  331. GenLists.GetElmt( NdxFile^.Ndx, spot, NdxRec, dumc );
  332. M2Strings.Assign( NdxRec.RecName, RecName );
  333. ELSE
  334. RecName := '';
  335. END;
  336. END;
  337. END;
  338. UNTIL done;
  339. DoOneRecord( RecName );
  340. UNTIL NOT PosUtils.Equal( NextFrame, '4' );
  341. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  342. END ProcessRecord;
  343. PROCEDURE StoreList( TheList: GenLists.GenList );
  344. VAR
  345. ListName: ARRAY [0..79] OF CHAR;
  346. TmpList: GenLists.GenList;
  347. NextFrame: ScrnTypes.AFrameName;
  348. TmpFrame: ScrnTypes.DisplayFrame;
  349. BEGIN
  350. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  351. NextFrame := '20';
  352. (*List Storage Form*)
  353. DspFiles.ReadDisplayFrame( ScreenFile, TmpFrame,
  354. NextFrame );
  355. IF NOT (0 # ScrnUtl1.FieldNum( TmpFrame, 'list' )) THEN
  356. (*Find the editor field.*)
  357. HALT();
  358. END;
  359. IF NOT ScrnUtl1.ListToEdField( TheList, TmpFrame,
  360. TmpFrame^.CurrentField ) THEN
  361. (*Put the list created in BuildList into the editor
  362. field.*)
  363. HALT();
  364. END;
  365. StrConv.CardinalToStr( GenLists.ListLength( TheList), 0, ListName);
  366. StrEdit.Append( ListName, '.');
  367. ControlUtils.ChangeField( TmpFrame, ListName, 'size', FALSE);
  368. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  369. REPEAT
  370. InputManager.ControlFrame( TmpFrame, 0, '', FALSE, NextFrame );
  371. IF PosUtils.Equal( NextFrame, '999' ) THEN
  372. (*They want to store the list.*)
  373. ControlUtils.ReadInput( TmpFrame, ListName, 'name' );
  374. (*Get the name they've chosen for the list out of
  375. the 'name' field.*)
  376. GenLists.CopyList( TheList, TmpList );
  377. IF NOT BuildLst.StoreRecNameList( NdxFile, ListName, TmpList ) THEN
  378. HALT();
  379. END;
  380. ScrnUtl2.ShowMessage( ScreenFile, '27' );
  381. (*Says store successful; waits for any key.*)
  382. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  383. RETURN;
  384. END;
  385. UNTIL PosUtils.Equal( NextFrame, '21' );
  386. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  387. END StoreList;
  388. PROCEDURE SearchFile();
  389. VAR
  390. ListMade: GenLists.GenList;
  391. ErrorField: CARDINAL;
  392. message, LimitingList: ARRAY [0..79] OF CHAR;
  393. dumbool: BOOLEAN;
  394. NextFrame: ScrnTypes.AFrameName;
  395. MsgFrame, TmpFrame: ScrnTypes.DisplayFrame;
  396. BEGIN (*SearchFile*)
  397. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  398. LOOP
  399. StrEdit.AssignStr( '', message );
  400. ErrorField := 0;
  401. NextFrame := '21'; (*The List Building form*)
  402. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, NextFrame );
  403. REPEAT
  404. InputManager.ControlFrame( TmpFrame, ErrorField,
  405. message, FALSE, NextFrame );
  406. ErrorField := 0;
  407. (*Reset ErrorField and message so they'll signal an
  408. error on the next loop only if there's really been
  409. an error.*)
  410. StrEdit.AssignStr( '', message );
  411. IF NOT PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  412. (*exit if they press the backup or program-exit
  413. keys.*)
  414. EXIT;
  415. END;
  416. IF NOT ScrnUtl1.FieldIsBlank( TmpFrame,
  417. 'listname', ErrorField) THEN
  418. ControlUtils.ReadInput( TmpFrame, LimitingList, 'listname' );
  419. (*Get the name of the list they've chosen to use
  420. out of the 'name' field.*)
  421. ELSE
  422. StrEdit.AssignStr( '', LimitingList );
  423. END;
  424. ScrnTypes.InitDisplayFrame( MsgFrame, VWindows.CurrentWindow );
  425. ScrnUtl2.ReadAndShow( ScreenFile, MsgFrame, '43' );
  426. (*a screen that says list is being created *)
  427. BuildLst.BuildList( NdxFile, TmpFrame, 1, 13, LimitingList,
  428. ErrorField, ListMade );
  429. FrameManager.EraseFrame( MsgFrame );
  430. ScrnUtl2.CloseDisplayFrame( MsgFrame );
  431. IF ErrorField = 0 THEN
  432. BuildLst.DeleteListRec( ListMade);
  433. StoreList( ListMade );
  434. EXIT;
  435. ELSE
  436. StrEdit.AssignStr( "Something's wrong with this field.",
  437. message );
  438. END;
  439. UNTIL ErrorField = 0;
  440. END;
  441. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  442. END SearchFile;
  443. PROCEDURE ManageLists();
  444. VAR
  445. TmpList: GenLists.GenList;
  446. LastListName : ARRAY [0..79] OF CHAR;
  447. NextFrame: ScrnTypes.AFrameName;
  448. TmpFrame: ScrnTypes.DisplayFrame;
  449. BEGIN
  450. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  451. LastListName[0] := 0C;
  452. LOOP
  453. NextFrame := '29'; (*The main list management menu.*)
  454. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextFrame );
  455. IF PosUtils.Equal( NextFrame, TmpFrame^.parent ) THEN
  456. EXIT;
  457. END;
  458. CASE ScrnUtl1.SelectedChar(TmpFrame) OF
  459. 'M': (*Make a new list.*)
  460. SearchFile();
  461. | 'D': (*Delete a list.*)
  462. IF ControlUtils.GetStrResponse( ScreenFile,
  463. '30', LastListName, LastListName ) THEN
  464. (* if they didn't try to back up or exit *)
  465. IF BuildLst.DelRecNameList( NdxFile,
  466. LastListName ) THEN
  467. ScrnUtl2.ShowMessage( ScreenFile, '34' );
  468. (*Says the list was successfully deleted.*)
  469. ELSE
  470. ScrnUtl2.ShowMessage( ScreenFile, '35' );
  471. (*Says no such list stored; waits for any key.*)
  472. END;
  473. END;
  474. | 'S': (*Show lists.*)
  475. IF BuildLst.GetListNames( NdxFile, TmpList ) AND
  476. (GenLists.ListLength( TmpList) # 0) THEN
  477. IF NOT ControlUtils.ListBox( ScreenFile, '31',
  478. TmpList, LastListName, NextFrame ) THEN
  479. (* We don't care if they press Esc here. *)
  480. END;
  481. ELSE
  482. ScrnUtl2.ShowMessage( ScreenFile, '35' );
  483. (*Says no such list stored and waits for a key.*)
  484. END;
  485. | 'E': (*Edit a list.*)
  486. IF ControlUtils.GetStrResponse( ScreenFile,
  487. '32', LastListName, LastListName ) THEN
  488. (* if they didn't try to back up or exit *)
  489. IF BuildLst.GetRecNameList( NdxFile,
  490. LastListName, TmpList ) THEN
  491. StoreList( TmpList );
  492. ELSE
  493. ScrnUtl2.ShowMessage( ScreenFile, '35' );
  494. (*Says no such list stored; waits for any key.*)
  495. END;
  496. END;
  497. | 'A': (*Examine list of All records.*)
  498. NdxUtils.GetRecNames( NdxFile, TmpList );
  499. StoreList( TmpList );
  500. | 'R': (*Retrieve listed records.*)
  501. IF ControlUtils.GetStrResponse( ScreenFile,
  502. '33', LastListName, LastListName ) THEN
  503. (* if they didn't try to back up or exit *)
  504. IF BuildLst.GetRecNameList( NdxFile,
  505. LastListName, TmpList ) THEN
  506. ShowAllRecords( TmpList );
  507. NextFrame := '29'; (* The main list management menu. *)
  508. ELSE
  509. ScrnUtl2.ShowMessage( ScreenFile, '35' );
  510. (*Says no such list stored; waits for any key.*)
  511. END;
  512. END;
  513. ELSE
  514. END;
  515. END;
  516. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  517. END ManageLists;
  518. PROCEDURE ErrorOpeningFile( ErrMsg: CARDINAL;
  519. ErrText, fname: ARRAY OF CHAR );
  520. VAR
  521. TmpStr1: ARRAY [0..149] OF CHAR;
  522. TmpStr2: ARRAY [0..59] OF CHAR;
  523. KeyHit: CARDINAL;
  524. BEGIN
  525. StrEdit.AssignStr( "Error in opening '", TmpStr1 );
  526. StrEdit.Append( TmpStr1, fname );
  527. StrEdit.Append( TmpStr1, "': " );
  528. IF ErrMsg # StringIO.MissingMessage THEN
  529. ErrStrgs.NumToStr( ErrMsg, TmpStr2 );
  530. StrEdit.Append( TmpStr1, TmpStr2 );
  531. ELSE
  532. StrEdit.Append( TmpStr1, ErrText);
  533. END;
  534. StrEdit.Append( TmpStr1, " Press any key." );
  535. WindowPrims.MsgBox( VWindows.SE, TmpStr1, KbdInput.AnyKeyNum, KeyHit );
  536. END ErrorOpeningFile;
  537. PROCEDURE NotPmiFile( fname: ARRAY OF CHAR): BOOLEAN;
  538. BEGIN
  539. RETURN NOT PosUtils.Present( 'pmidbms', fname);
  540. END NotPmiFile;
  541. PROCEDURE ExportRecords( NdxFile: NdxTypes.NdxFileType; VAR NextFrame:
  542. ScrnTypes.AFrameName; ScreenFile: ScrnTypes.DisplayFile);
  543. VAR
  544. TmpFrame: ScrnTypes.DisplayFrame;
  545. PROCEDURE ExportToNdxFile( NdxF1: NdxTypes.NdxFileType; RecNameList,
  546. MatchingFields: GenLists.GenList; NdxF2: NdxTypes.NdxFileType );
  547. VAR
  548. SearchingAll: BOOLEAN;
  549. TypeCode, lngth1, cnt: CARDINAL;
  550. TmpStr: NdxTypes.RecNameStr;
  551. TmpNdxRec: NdxTypes.NdxElement;
  552. BEGIN (* ExportToNdxFile *)
  553. lngth1 := GenLists.ListLength( RecNameList );
  554. IF lngth1 = 0 THEN
  555. SearchingAll := TRUE;
  556. lngth1 := GenLists.ListLength( NdxF1^.Ndx );
  557. ELSE
  558. SearchingAll := FALSE;
  559. END;
  560. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '38' );
  561. FOR cnt := 1 TO lngth1 DO
  562. IF SearchingAll THEN
  563. GenLists.GetElmt( NdxF1^.Ndx, cnt, TmpNdxRec, TypeCode );
  564. StrEdit.AssignStr( TmpNdxRec.RecName, TmpStr );
  565. ELSE
  566. GenLists.GetElmt( RecNameList, cnt, TmpStr, TypeCode );
  567. (*Put the cnt'th record name in TmpStr.*)
  568. END;
  569. IF (M2Strings.Length( TmpStr ) > 0) AND
  570. (0 # M2Strings.CompareStr( TmpStr, BuildLst.ListStorageRec)) THEN
  571. (* don't export the special record of list names *)
  572. NdxUtils.CopyMatchingFields( NdxF1, NdxF2, TmpStr, MatchingFields );
  573. END;
  574. END;
  575. END ExportToNdxFile;
  576. CONST
  577. FillThisField =
  578. 'Your selection requires completion of this field. Press any key.';
  579. VAR
  580. fname, ListName, TmpStr1, TmpStr2, message: ARRAY [0..79]
  581. OF CHAR;
  582. MatchingFieldList, RecNameList: GenLists.GenList;
  583. DestNdxFile: NdxTypes.NdxFileType;
  584. done: BOOLEAN;
  585. SavedMessage: CARDINAL;
  586. TmpFieldRec: ScrnTypes.InputFieldRecord;
  587. ErrField, ExpFile, KeyHit: CARDINAL;
  588. PROCEDURE AllFieldsCorrect( TheFrame: ScrnTypes.DisplayFrame;
  589. ReqFieldName: ARRAY OF CHAR; VAR BadFieldNum: CARDINAL;
  590. VAR message, DestFileName: ARRAY OF CHAR; ListFieldName:
  591. ARRAY OF CHAR; VAR RecNameList: GenLists.GenList ): BOOLEAN;
  592. VAR
  593. ListName: ARRAY [0..79] OF CHAR;
  594. dumbool : BOOLEAN;
  595. BEGIN
  596. IF ScrnUtl1.FieldIsBlank( TheFrame, ReqFieldName, BadFieldNum ) THEN
  597. StrEdit.AssignStr( FillThisField, message );
  598. done := FALSE;
  599. ELSE
  600. ControlUtils.ReadInput( TheFrame, DestFileName, ReqFieldName );
  601. StrEdit.DeleteChar( ' ', DestFileName );
  602. IF ScrnUtl1.FieldIsBlank( TheFrame, ListFieldName, BadFieldNum ) THEN
  603. StrEdit.AssignStr( FillThisField, message );
  604. GenLists.NewList( RecNameList );
  605. BadFieldNum := 0;
  606. done := TRUE;
  607. ELSE
  608. ControlUtils.ReadInput( TheFrame, ListName, ListFieldName);
  609. IF NOT BuildLst.GetRecNameList( NdxFile, ListName,
  610. RecNameList ) THEN
  611. done := FALSE;
  612. StrEdit.AssignStr( "List does not exist. Press any key.",
  613. message );
  614. ELSE
  615. BadFieldNum := 0;
  616. done := TRUE;
  617. END;
  618. END;
  619. END;
  620. RETURN done;
  621. END AllFieldsCorrect;
  622. PROCEDURE ToNdxFile();
  623. VAR
  624. TmpList1, TmpList2, TmpList3: GenLists.GenList;
  625. PROCEDURE PairFieldNames( list1, list2: GenLists.GenList; VAR
  626. outlist: GenLists.GenList);
  627. VAR
  628. lngth1, lngth2, cnt, TypeCode, strndx, spot: CARDINAL;
  629. TmpStr1, TmpStr2: ARRAY [0..79] OF CHAR;
  630. BEGIN
  631. lngth1 := GenLists.ListLength( list1 );
  632. lngth2 := GenLists.ListLength( list2 );
  633. GenLists.NewList( outlist );
  634. FOR cnt := 1 TO lngth1 DO
  635. GenLists.GetElmt( list1, cnt, TmpStr1, TypeCode );
  636. IF TypeCode = GenLists.StrCode THEN
  637. spot := GenLists.ScanList( TmpStr1, list2, 1, lngth2, strndx );
  638. IF (spot > 0) AND (strndx = 0) THEN
  639. GenLists.GetElmt( list2, spot, TmpStr2, TypeCode );
  640. StrEdit.Append( TmpStr1, '=' );
  641. StrEdit.Append( TmpStr1, TmpStr2 );
  642. GenLists.ListInsert( TmpStr1, GenLists.StrCode, outlist,
  643. GenLists.ListLength(outlist) + 1 );
  644. END;
  645. END;
  646. END;
  647. END PairFieldNames;
  648. BEGIN (*ToNdxFile*)
  649. done := AllFieldsCorrect( TmpFrame, 'cpyfname',
  650. ErrField, message, fname, 'cpylist', RecNameList );
  651. StrEdit.CrunchBlanks( fname);
  652. IF done THEN
  653. IF PosUtils.Equal( fname, NdxFile^.name) THEN
  654. done := FALSE;
  655. message := 'Cannot export from a file to itself';
  656. ErrField := 8;
  657. ELSIF NOT NdxBones.OpenNdxFile( DestNdxFile, fname ) THEN
  658. ErrorOpeningFile( StringIO.MissingMessage, 'Not an Index File.',
  659. fname );
  660. done := FALSE;
  661. ELSE
  662. DspFiles.ReadDisplayFrame( ScreenFile, TmpFrame, NextFrame );
  663. IF NOT (0 # ScrnUtl1.FieldNum( TmpFrame,
  664. 'oldstruct' )) THEN
  665. HALT();
  666. END;
  667. GenLists.CopyList( NdxFile^.StructLst, TmpList1 );
  668. IF NOT ScrnUtl1.ListToEdField( TmpList1,
  669. TmpFrame,
  670. TmpFrame^.CurrentField ) THEN
  671. HALT();
  672. END;
  673. IF NOT (0 # ScrnUtl1.FieldNum( TmpFrame,
  674. 'newstruct' )) THEN
  675. HALT();
  676. END;
  677. GenLists.CopyList( DestNdxFile^.StructLst, TmpList2 );
  678. IF NOT ScrnUtl1.ListToEdField( TmpList2,
  679. TmpFrame,
  680. TmpFrame^.CurrentField ) THEN
  681. HALT();
  682. END;
  683. IF NOT (0 # ScrnUtl1.FieldNum( TmpFrame, 'matches' )) THEN
  684. HALT();
  685. END;
  686. PairFieldNames( NdxFile^.StructLst,
  687. DestNdxFile^.StructLst, MatchingFieldList );
  688. GenLists.CopyList( MatchingFieldList, TmpList3 );
  689. IF NOT ScrnUtl1.ListToEdField( TmpList3,
  690. TmpFrame, TmpFrame^.CurrentField ) THEN
  691. HALT();
  692. END;
  693. GenLists.DisposeList( MatchingFieldList );
  694. (*We dispose here because the editor field now
  695. has a copy of the list.*)
  696. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  697. InputManager.ControlFrame( TmpFrame, 0, '', FALSE,
  698. NextFrame );
  699. (*Let them edit the lists.*)
  700. IF NOT (0 # ScrnUtl1.FieldNum( TmpFrame, 'MATCHES')) THEN
  701. HALT();
  702. END;
  703. IF NOT ScrnUtl1.ListFromEdField( TmpFrame,
  704. TmpFrame^.CurrentField, MatchingFieldList ) THEN
  705. HALT();
  706. END;
  707. (*Now we've gotten the list back from the editor
  708. field, presumably changed in some way.*)
  709. GenLists.CopyList( MatchingFieldList, TmpList1 );
  710. IF PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  711. ExportToNdxFile( NdxFile, RecNameList,
  712. TmpList1, DestNdxFile );
  713. NextFrame := '24';
  714. END;
  715. NdxFiles.CloseNdxFile( DestNdxFile );
  716. END;
  717. END;
  718. END ToNdxFile;
  719. PROCEDURE ToAscii();
  720. BEGIN
  721. IF AllFieldsCorrect( TmpFrame, 'expfname',
  722. ErrField, message, fname, 'explist', RecNameList ) THEN
  723. IF NotPmiFile( fname) THEN
  724. SavedMessage := HandleIO.CreateFile( ExpFile, fname );
  725. IF SavedMessage = StringIO.NoError THEN
  726. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '38' );
  727. NdxUtils.ExportToFile( NdxFile, RecNameList, ExpFile );
  728. StringIO.PrintMessage( HandleIO.CloseHandle( ExpFile ) );
  729. NextFrame := '24';
  730. done := TRUE;
  731. ELSE
  732. ErrorOpeningFile( SavedMessage, '', fname );
  733. done := FALSE;
  734. END;
  735. ELSE
  736. ErrorOpeningFile( StringIO.MissingMessage,
  737. 'Invalid Reserved PMI File Name', fname );
  738. done := FALSE;
  739. END;
  740. END;
  741. END ToAscii;
  742. PROCEDURE ToPrinter();
  743. BEGIN
  744. done := AllFieldsCorrect( TmpFrame, 'prnlist',
  745. ErrField, message, fname, 'prnlist', RecNameList );
  746. IF done THEN
  747. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '38' );
  748. NdxUtils.ExportToFile( NdxFile, RecNameList, StringIO.StdPrn );
  749. NextFrame := '37';
  750. END;
  751. END ToPrinter;
  752. BEGIN (*ExportRecords*)
  753. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  754. NextFrame := '19';
  755. (*This is the export form; the one with all the lines
  756. and blanks for list and file names.*)
  757. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, NextFrame );
  758. done := FALSE;
  759. ErrField := 0;
  760. StrEdit.AssignStr( '', message );
  761. StrEdit.AssignStr( '', fname );
  762. WHILE NOT done DO
  763. InputManager.ControlFrame( TmpFrame, ErrField,
  764. message, FALSE, NextFrame );
  765. IF PosUtils.Equal( NextFrame, TmpFrame^.parent ) THEN
  766. RETURN;
  767. END;
  768. CASE ScrnUtl1.SelectedChar(TmpFrame) OF
  769. (*To determine what they want us to do, we have to
  770. figure out where the pointer bar was when the
  771. screen was submitted.*)
  772. 'A', 'l', 'f':
  773. (*Export records to an ASCII file.*)
  774. ToAscii();
  775. | 'P', 'p': (*Print records.*)
  776. ToPrinter();
  777. | 'N', 'c', 'x': (*Copy records to another Ndx file.*)
  778. ToNdxFile();
  779. END;
  780. END; (*WHILE NOT done*)
  781. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  782. END ExportRecords;
  783. PROCEDURE GetFile( VAR NdxFile: NdxTypes.NdxFileType; ScreenFile:
  784. ScrnTypes.DisplayFile; VAR NextFrame: ScrnTypes.AFrameName): BOOLEAN;
  785. VAR
  786. SavedMessage : CARDINAL;
  787. SelectedFile, FileSpec: ARRAY [0..79] OF CHAR;
  788. FileOpened, dumbool: BOOLEAN;
  789. structure: ARRAY [0..511] OF CHAR;
  790. pathleng, KeyHit: CARDINAL;
  791. TmpFrame: ScrnTypes.DisplayFrame;
  792. PROCEDURE OpenExisting( fname: ARRAY OF CHAR ): BOOLEAN;
  793. BEGIN
  794. IF FileOpened THEN
  795. NdxFiles.CloseNdxFile( NdxFile );
  796. END;
  797. IF NOT NdxBones.OpenNdxFile( NdxFile, fname ) THEN
  798. ErrorOpeningFile( StringIO.MissingMessage, 'Not an Index File.',
  799. fname );
  800. RETURN FALSE;
  801. ELSE
  802. WindowPrims.MsgBox( VWindows.SE,
  803. 'New file selected. Press any key.',
  804. KbdInput.AnyKeyNum, KeyHit );
  805. NextFrame := '2';
  806. (*We do this to guarantee that we fall out at the
  807. bottom of the loop.*)
  808. RETURN TRUE;
  809. END;
  810. END OpenExisting;
  811. PROCEDURE TryCreate();
  812. BEGIN (* TryCreate *)
  813. IF NotPmiFile( FileSpec ) THEN
  814. IF Drectory.ValidFile( FileSpec ) THEN
  815. WindowPrims.MsgBox( VWindows.SE,
  816. "File not found. Do you want to create it? (Y/N)",
  817. KbdInput.YorN, KeyHit );
  818. IF KbdInput.CAPkey(KeyHit) = ORD('Y') THEN
  819. IF FileOpened THEN
  820. NdxFiles.CloseNdxFile( NdxFile );
  821. END;
  822. (*For convenience we've stored the file structure in
  823. the DataList for frame 6.*)
  824. ListUtils.ListToString( TmpFrame^.DataList, structure );
  825. NdxFiles.CreateNdxFile( NdxFile, FileSpec, structure );
  826. WindowPrims.MsgBox( VWindows.SE,
  827. 'File created. Press any key.', KbdInput.AnyKeyNum,
  828. KeyHit );
  829. FileOpened := TRUE;
  830. END;
  831. ELSE
  832. ErrorOpeningFile( StringIO.MissingMessage,
  833. 'Invalid File Name', FileSpec );
  834. END;
  835. ELSE
  836. ErrorOpeningFile( StringIO.MissingMessage,
  837. 'Invalid Reserved PMI File Name', FileSpec );
  838. END;
  839. END TryCreate;
  840. BEGIN
  841. (*GetFile*)
  842. FileOpened := FALSE;
  843. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  844. REPEAT
  845. NextFrame := '6';
  846. (*File Creation/Selection form; prompts for a file
  847. specification*)
  848. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextFrame );
  849. IF NOT PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  850. (*return if they press the backup key*)
  851. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  852. RETURN FileOpened;
  853. END;
  854. ControlUtils.ReadInput( TmpFrame, FileSpec, 'path');
  855. (*Get the string out of the field named 'path' and put
  856. it in the variable FileSpec.*)
  857. StrEdit.CutTrailingChars( ' ', FileSpec);
  858. pathleng := M2Strings.Length(FileSpec);
  859. IF HandleIO.FileExists( FileSpec ) THEN
  860. (* open file entered *)
  861. FileOpened := OpenExisting( FileSpec );
  862. ELSIF (pathleng > 0) AND
  863. (NOT PosUtils.Present( '*', FileSpec)) AND
  864. (FileSpec[ pathleng-1] # '\') AND
  865. (FileSpec[ pathleng-1] # ':') THEN
  866. (* try to create file name entered *)
  867. TryCreate();
  868. ELSE
  869. (* search for file spec entered *)
  870. ScrnUtl2.PushFrame( TmpFrame );
  871. (*this saves frame 6*)
  872. NextFrame := '7';
  873. (*7 is a blank window to hold the file names*)
  874. DspFiles.ReadDisplayFrame( ScreenFile, TmpFrame, NextFrame );
  875. DirManager.ControlDirectory( FileSpec,
  876. TmpFrame, 1, SelectedFile, NextFrame );
  877. (*Loads frame 7 with a list of filenames that match
  878. the file specification in FileSpec, and controls
  879. scrolling of the pointer bar within the frame until
  880. the user selects a file. The 1 means
  881. ControlDirectory will list only file NAMES (i.e.,
  882. will use only one column). We could have it list
  883. size, date, and time information by using 2, 3, or
  884. 4 for the number of columns. *)
  885. IF PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  886. StrEdit.DeleteChar( ' ', SelectedFile );
  887. IF NOT PosUtils.Present( 'Error:', SelectedFile ) THEN
  888. FileOpened := OpenExisting( SelectedFile );
  889. ScrnUtl2.PopFrame( TmpFrame );
  890. (*TmpFrame is now frame 6.*)
  891. ELSE
  892. (* couldn't search for file, so try to create it *)
  893. ScrnUtl2.PopFrame( TmpFrame );
  894. (*TmpFrame is now frame 6.*)
  895. TryCreate();
  896. END;
  897. ELSE
  898. ScrnUtl2.PopFrame( TmpFrame );
  899. (*TmpFrame is now frame 6.*)
  900. END;
  901. END;
  902. UNTIL FileOpened;
  903. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  904. RETURN FileOpened;
  905. END GetFile;
  906. PROCEDURE FileManagement( VAR NdxFile: NdxTypes.NdxFileType; VAR NextFrame:
  907. ScrnTypes.AFrameName; ScreenFile: ScrnTypes.DisplayFile);
  908. PROCEDURE CrunchMenu();
  909. VAR
  910. TotSize, GbgSize: LONGINT;
  911. PctUsed, NumDatRecs, NumGbgRecs: CARDINAL;
  912. dumstr: ARRAY [0..80] OF CHAR;
  913. TmpFrame: ScrnTypes.DisplayFrame;
  914. BEGIN
  915. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  916. REPEAT
  917. NextFrame := '10';
  918. DspFiles.ReadDisplayFrame( ScreenFile, TmpFrame, NextFrame );
  919. NdxUtils.SizeInfo( NdxFile, TotSize, GbgSize, PctUsed, NumDatRecs,
  920. NumGbgRecs);
  921. StrConv.LongIntegerToStr( TotSize, 0, dumstr);
  922. ControlUtils.ChangeField( TmpFrame, dumstr, 'size', FALSE );
  923. StrConv.LongIntegerToStr( GbgSize, 0, dumstr);
  924. ControlUtils.ChangeField( TmpFrame, dumstr, 'save', FALSE );
  925. StrConv.CardinalToStr( PctUsed, 0, dumstr);
  926. ControlUtils.ChangeField( TmpFrame, dumstr, 'pct', FALSE );
  927. StrConv.CardinalToStr( NumDatRecs, 0, dumstr);
  928. ControlUtils.ChangeField( TmpFrame, dumstr, 'custs', FALSE );
  929. StrConv.CardinalToStr( NumGbgRecs, 0, dumstr);
  930. ControlUtils.ChangeField( TmpFrame, dumstr, 'grecs', FALSE );
  931. FramePainter.ShowDisplayFrame( TmpFrame, 0, 0, 0, 0 );
  932. InputManager.ControlFrame( TmpFrame, 0, '', FALSE,
  933. NextFrame );
  934. IF PosUtils.Equal( NextFrame, '12' ) THEN
  935. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, NextFrame );
  936. (*File crunch in progress*)
  937. NdxUtils.CrunchNdxFile( NdxFile);
  938. NextFrame := '13'; (*File crunch complete*)
  939. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextFrame );
  940. END;
  941. UNTIL PosUtils.Equal( NextFrame, TmpFrame^.parent );
  942. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  943. END CrunchMenu;
  944. PROCEDURE EditFile();
  945. VAR
  946. fname: ARRAY [0..79] OF CHAR;
  947. ready: BOOLEAN;
  948. SavedMessage: CARDINAL;
  949. KeyHit: CARDINAL;
  950. TheList: GenLists.GenList;
  951. ControlRec: VEditor.AnEdControlRec;
  952. TmpFrame: ScrnTypes.DisplayFrame;
  953. BEGIN
  954. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  955. ScrnUtl2.ReadAndShow( ScreenFile, TmpFrame, '18' );
  956. (*This frame prompts for a file name.*)
  957. REPEAT
  958. InputManager.ControlFrame( TmpFrame, 0, '', FALSE,
  959. NextFrame );
  960. IF NOT PosUtils.Equal( NextFrame, TmpFrame^.normlnext ) THEN
  961. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  962. RETURN;
  963. END;
  964. ControlUtils.ReadInput( TmpFrame, fname, 'fname' );
  965. (*Get the file name out of the 'fname' field.*)
  966. IF NotPmiFile( fname) THEN
  967. GenLists.NewList( TheList );
  968. SavedMessage := ListUtils.TextFileToList( fname, TheList );
  969. IF SavedMessage = StringIO.NoError THEN
  970. ready := TRUE;
  971. ELSIF SavedMessage = StringIO.FileNotFound THEN
  972. WindowPrims.MsgBox( VWindows.SE,
  973. "File not found. Do you want to create it? (Y/N)",
  974. KbdInput.YorN, KeyHit );
  975. ready := KbdInput.CAPkey(KeyHit) = ORD('Y');
  976. IF ready THEN
  977. GenLists.NewList( TheList );
  978. END;
  979. ELSE
  980. ErrorOpeningFile( SavedMessage, '', fname );
  981. ready := FALSE;
  982. END;
  983. ELSE
  984. ErrorOpeningFile( StringIO.MissingMessage,
  985. 'Invalid Reserved PMI File Name', fname );
  986. ready := FALSE;
  987. END;
  988. UNTIL ready;
  989. VEditor.InitEdRec( ControlRec );
  990. VEditor.TheEditor( TheList, ControlRec );
  991. IF ControlRec.ChangeMade THEN
  992. (*Ask if they want to save the file.*)
  993. WindowPrims.MsgBox( VWindows.SE,
  994. "Do you want to save your changes? (Y/N)",
  995. KbdInput.YorN, KeyHit );
  996. ready := KbdInput.CAPkey(KeyHit) = ORD('Y');
  997. IF ready THEN
  998. SavedMessage := ListUtils.TextListToFile( TheList, fname );
  999. END;
  1000. END;
  1001. GenLists.DisposeList( TheList );
  1002. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  1003. END EditFile;
  1004. PROCEDURE GetRecDate( NdxFile: NdxTypes.NdxFileType;
  1005. RecName: ARRAY OF CHAR; VAR Date: CARDINAL );
  1006. VAR
  1007. TypeCode, day, month, year, hours, minutes, seconds: CARDINAL;
  1008. DateStr: ARRAY [0..31] OF CHAR;
  1009. BEGIN
  1010. Drectory.GetFileDateAndTime( NdxFile^.handle, month, day, year,
  1011. hours, minutes, seconds );
  1012. Date := ByteFiddler.DateToCardinal( month, day, year );
  1013. IF NOT NdxFiles.GetField( NdxFile, RecName, 'DATE', TypeCode,
  1014. DateStr ) THEN
  1015. RETURN;
  1016. END;
  1017. IF NOT DateFunctions.StrToDate2( DateStr, FALSE, day, month, year ) THEN
  1018. RETURN;
  1019. END;
  1020. Date := ByteFiddler.DateToCardinal( month, day, year );
  1021. END GetRecDate;
  1022. PROCEDURE FirstIsOlder( VAR date1, date2: CARDINAL ): BOOLEAN;
  1023. BEGIN
  1024. RETURN date1 < date2;
  1025. END FirstIsOlder;
  1026. PROCEDURE MergeFile();
  1027. VAR
  1028. NextFrame: ScrnTypes.AFrameName;
  1029. OtherRecName: NdxTypes.RecNameStr;
  1030. OtherNdxFile: NdxTypes.NdxFileType;
  1031. AddingRecords, AlwaysUpdate, NeverUpdate, Transferring,
  1032. DoSomething: BOOLEAN;
  1033. OurDate, TheirDate, cnt: CARDINAL;
  1034. FileName: ARRAY [0..63] OF CHAR;
  1035. TmpFrame: ScrnTypes.DisplayFrame;
  1036. BEGIN
  1037. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  1038. LOOP
  1039. NextFrame := 'MergeOpts';
  1040. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextFrame );
  1041. IF PosUtils.Equal( NextFrame, TmpFrame^.parent ) THEN
  1042. EXIT;
  1043. END;
  1044. ControlUtils.ReadInput( TmpFrame, FileName, 'fname' );
  1045. IF NOT NdxBones.OpenNdxFile( OtherNdxFile, FileName ) THEN
  1046. EXIT;
  1047. END;
  1048. AddingRecords := ScrnUtl1.WhichChoiceKey( TmpFrame,
  1049. ScrnUtl1.FieldNum(TmpFrame, 'add') ) = ORD('y');
  1050. Transferring := ScrnUtl1.WhichChoiceKey( TmpFrame,
  1051. ScrnUtl1.FieldNum(TmpFrame, 'transf') ) = ORD('y');
  1052. CASE CHR(ScrnUtl1.WhichChoiceKey( TmpFrame,
  1053. ScrnUtl1.FieldNum(TmpFrame, 'upd') )) OF
  1054. 'A':
  1055. AlwaysUpdate := TRUE;
  1056. NeverUpdate := FALSE;
  1057. | 'O':
  1058. AlwaysUpdate := FALSE;
  1059. NeverUpdate := FALSE;
  1060. | 'N':
  1061. AlwaysUpdate := FALSE;
  1062. NeverUpdate := TRUE;
  1063. END;
  1064. cnt := 1;
  1065. WHILE NdxUtils.GetRecName( OtherNdxFile, cnt, OtherRecName ) DO
  1066. IF NdxFiles.RecordExists( NdxFile, OtherRecName ) THEN
  1067. IF AlwaysUpdate THEN
  1068. DoSomething := TRUE;
  1069. ELSIF NeverUpdate THEN
  1070. DoSomething := FALSE;
  1071. ELSE
  1072. GetRecDate( NdxFile, OtherRecName, OurDate );
  1073. GetRecDate( OtherNdxFile, OtherRecName, TheirDate );
  1074. IF FirstIsOlder( OurDate, TheirDate ) THEN
  1075. DoSomething := TRUE;
  1076. ELSE
  1077. DoSomething := FALSE;
  1078. END;
  1079. END;
  1080. ELSE
  1081. DoSomething := AddingRecords;
  1082. END;
  1083. IF DoSomething THEN
  1084. IF Transferring THEN
  1085. IF NOT NdxUtils.TransferRecord(
  1086. OtherRecName, OtherNdxFile, NdxFile ) THEN
  1087. ErrorManager.WARN( OtherRecName );
  1088. END;
  1089. ELSE
  1090. IF NOT NdxUtils.CopyRecord(
  1091. OtherRecName, OtherNdxFile, NdxFile ) THEN
  1092. ErrorManager.WARN( OtherRecName );
  1093. END;
  1094. END;
  1095. END;
  1096. INC( cnt );
  1097. END;
  1098. NdxFiles.CloseNdxFile( OtherNdxFile );
  1099. END;
  1100. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  1101. END MergeFile;
  1102. VAR
  1103. NdxFile2 : NdxTypes.NdxFileType;
  1104. TmpFrame: ScrnTypes.DisplayFrame;
  1105. BEGIN (* FileManagement *)
  1106. ScrnTypes.InitDisplayFrame( TmpFrame, VWindows.CurrentWindow );
  1107. LOOP
  1108. NextFrame := '9';
  1109. ControlUtils.ReadShowAndCntrl( ScreenFile, TmpFrame, NextFrame );
  1110. IF PosUtils.Equal( NextFrame, TmpFrame^.parent ) THEN
  1111. EXIT;
  1112. END;
  1113. CASE ScrnUtl1.SelectedChar(TmpFrame) OF
  1114. 'C': (*Create or select a new file.*)
  1115. IF GetFile( NdxFile2, ScreenFile, NextFrame) THEN
  1116. NdxFiles.CloseNdxFile( NdxFile );
  1117. NdxFile := NdxFile2;
  1118. END;
  1119. (*TmpFrame will be 6 at this point; NextFrame will be 9.*)
  1120. |'s': (*Manage space usage in this file.*)
  1121. CrunchMenu();
  1122. |'M': (*Merge another file*)
  1123. MergeFile();
  1124. |'E': (*Edit a file.*)
  1125. EditFile();
  1126. ELSE
  1127. END;
  1128. END;
  1129. ScrnUtl2.CloseDisplayFrame( TmpFrame );
  1130. END FileManagement;
  1131. PROCEDURE RestoreDisplay();
  1132. BEGIN
  1133. SmartScreen.SetAttribOrColor( SmartScreen.lightgrey,
  1134. SmartScreen.black, SmartScreen.plain );
  1135. SmartScreen.ClearPart( 1, 1, SmartScreen.MaxCol, SmartScreen.MaxRow );
  1136. SmartScreen.SetCursorHeight( SavedCursorHeight );
  1137. END RestoreDisplay;
  1138. PROCEDURE CloseFiles();
  1139. BEGIN
  1140. DspFiles.CloseDisplayFile(ScreenFile);
  1141. NdxFiles.CloseNdxFile( NdxFile );
  1142. END CloseFiles;
  1143. VAR
  1144. NextFrame: ScrnTypes.AFrameName;
  1145. BEGIN (*Main*)
  1146. SavedCursorHeight := WindowPrims.GetCursorHeight();
  1147. SmartScreen.SetCursorHeight( 0 );
  1148. ErrorManager.AddTermProc( RestoreDisplay );
  1149. IF NOT DspFiles.OpenDisplayFile( ScreenFile, "pmidbms.dsp") THEN
  1150. ErrorManager.WARN( "Could not find PMIDBMS.DSP" );
  1151. HALT;
  1152. END;
  1153. StrEdit.AssignStr( 'pmidbms.ndx', NdxFileName);
  1154. GenLists.DiagMode := FALSE;
  1155. IF NOT (NdxBones.OpenNdxFile( NdxFile, NdxFileName) OR
  1156. GetFile( NdxFile, ScreenFile, NextFrame)) THEN
  1157. ControlUtils.InputConst( DspFiles.MainFrame, '8' );
  1158. (* Tell them we can't proceed without an Ndx file *)
  1159. DspFiles.CloseDisplayFile( ScreenFile);
  1160. RETURN;
  1161. END;
  1162. ScrnTypes.InitDisplayFrame( EntryFrame, VWindows.CurrentWindow );
  1163. ErrorManager.AddTermProc( CloseFiles );
  1164. LOOP
  1165. NextFrame := '2';
  1166. ControlUtils.Input( DspFiles.MainFrame, NextFrame );
  1167. (*the top menu*)
  1168. IF PosUtils.Equal( NextFrame, ScrnTypes.ProgramExit ) THEN
  1169. EXIT;
  1170. END;
  1171. CASE ScrnUtl1.SelectedChar( DspFiles.MainFrame ) OF
  1172. 'P': (*Process a record*)
  1173. ProcessRecord();
  1174. | 'U': (*Search*)
  1175. ManageLists();
  1176. | 'E': (*Export*)
  1177. ExportRecords( NdxFile, NextFrame, ScreenFile);
  1178. | 'M': (*File Info & Management*)
  1179. FileManagement( NdxFile, NextFrame, ScreenFile);
  1180. ELSE
  1181. END;
  1182. END;
  1183. END PMIdbms.
  1184.