IMPLEMENTATION MODULE mMore; TabTest1 TabTest2 (*$ LargeVars:=FALSE *) IMPORT Terminal; Extra large line ****************************************************************** \+03FROM SYSTEM IMPORT ADR, ADDRESS, BYTE, CAST; FROM Arts IMPORT Assert, BreakPoint; FROM ASCII IMPORT eol, eof, ht; FROM Heap IMPORT Allocate, Deallocate; FROM IntuitionD IMPORT Window, WindowPtr, Screen, ScreenPtr; FROM IntuitionL IMPORT WindowLimits, CloseWindow; FROM GraphicsD IMPORT RastPort, RastPortPtr; FROM GraphicsL IMPORT Text, Move, SetAPen, SetBPen, SetRast; FROM DosD IMPORT readOnly, FileHandle, FileHandlePtr; FROM DosL IMPORT Open, Read, Close; FROM EasyKernel IMPORT WBScreen, InstallWindow, WinFlags, WinFlagSet, ActionFlags, ActionFlagSet, Action, ReturnKey;\-01 VAR handle : FileHandlePtr; charBuf : ADDRESS; curX , curY : INTEGER; PROCEDURE More (txt:ARRAY OF CHAR; scr:ScreenPtr; fullSize:BOOLEAN); VAR err : BOOLEAN; handle : FileHandlePtr; (************************************************** * * * Open Window and Textfile * * * **************************************************) PROCEDURE OpenWin():BOOLEAN; BEGIN IF scr=NIL THEN scr:=WBScreen(); END; IF fullSize THEN WITH scr^ DO moreWin:=InstallWindow (scr, ADR(txt), leftEdge, topEdge, width, height, detailPen, blockPen, NIL, WinFlagSet{WinClose, Size}); END; ELSE moreWin:=InstallWindow (scr, ADR(txt), moreLeft, moreTop, moreWidth, moreHeight, 0, 1, NIL, WinFlagSet{WinClose, Size}); END; IF moreWin<>NIL THEN err:=WindowLimits (moreWin, minWidth, minHeight, -1, -1); SetAPen (moreWin^.rPort, 1); BreakPoint (ADR('Window')); RETURN TRUE; ELSE RETURN FALSE; END; END OpenWin; PROCEDURE OpenTxt():BOOLEAN; BEGIN handle:=Open (ADR(txt), readOnly); IF handle<>NIL THEN Allocate (charBuf, 1); IF charBuf<>NIL THEN RETURN TRUE; END; END; RETURN FALSE; END OpenTxt; (************************************************** * * * Show text: lines and pages * * * **************************************************) PROCEDURE MoreLine():BOOLEAN; PROCEDURE NewLine; BEGIN curX:=0; INC (curY, moreWin^.rPort^.font^.ySize); END NewLine; VAR xs : INTEGER; ch : CHAR; BEGIN REPEAT IF Read (handle, charBuf, 1)<>1 THEN RETURN FALSE; ELSE ch:=CAST(CHAR, charBuf^); IF ch<>eol THEN CASE ch OF eol : NewLine; | ht : xs:=moreWin^.rPort^.font^.xSize; WHILE NOT((curX DIV xs) MOD tabSize=0) DO INC(curX); END; | ELSE WITH moreWin^ DO Move (rPort, curX, curY); Text (rPort, charBuf, 1); INC (curX, rPort^.font^.xSize); IF curX>=width THEN NewLine; IF curY>height-20 THEN RETURN TRUE; END; END; (* width *) END; END; (* case *) END; END; UNTIL ch=eol; RETURN TRUE; END MoreLine; PROCEDURE MorePage():BOOLEAN; BEGIN SetRast (moreWin^.rPort, 0); REPEAT IF NOT MoreLine() THEN RETURN FALSE; END; UNTIL curY>moreWin^.height-20; RETURN TRUE; END MorePage; VAR flgs : ActionFlagSet; key , c : INTEGER; endKey : BOOLEAN; BEGIN Assert (OpenWin(), ADR(nowinTXT)); Assert (OpenTxt(), ADR(notxtTXT)); Assert (MorePage(), ADR(doserrTXT)); REPEAT Action (moreWin, flgs, key, c); IF Keyboard IN flgs THEN CASE key OF ReturnKey : Assert (MorePage(), ADR(doserrTXT)); | ORD('q') : endKey:=TRUE; | ELSE END; END; UNTIL (endKey) OR (WindowClosed IN flgs); END More; BEGIN (* main *) moreLeft:=100; moreTop:=50; moreWidth:=440; moreHeight:=100; curX:=0; curY:=10; CLOSE IF charBuf<>NIL THEN Deallocate (charBuf) END; IF handle<>NIL THEN Close (handle) END; IF moreWin<>NIL THEN CloseWindow (moreWin) END; END mMore.mod