|
|
|
|
||
|
DEFINITION MODULE DMWTextIO; (******************************************************************* Module DMWTextIO ('Dialog Machine' DM_V3.0) Copyright (c) 1990-2006 by Andreas Fischlin, Olivier Roth and ETH Zurich. Purpose Saves a stream of characters of an arbitrary length (text) to memory for later reference like redisplay, transfer to the clipboard, or printing (object can be mapped to a DMTextFields.TextSegment if smaller than 32000 characters). Remarks All DMWindIO character or string writing routines (Write, WriteLn, WriteString, Write(Long)Card, Write(Long)Int, Write(Long)Real, Write(Long)RealSci) may be used to produce text objects. A text object belongs always to a particular 'Dialog Machine' window and in a particular moment a window can own only a single text object. This module belongs to the 'Dialog Machine'. Programming o Design Andreas Fischlin 04/01/1990 Olivier Roth 04/01/1990 o Implementation Andreas Fischlin 04/01/1990 ETH Zurich Systems Ecology CHN E 35.1 Universitaetstrasse 16 8092 Zurich SWITZERLAND URLs: <mailto:RAMSES@env.ethz.ch> <http://www.sysecol.ethz.ch> <http://www.sysecol.ethz.ch/SimSoftware/RAMSES> Last revision of definition: 28/01/1990 AF *******************************************************************) FROM SYSTEM IMPORT ADDRESS; FROM DMWindows IMPORT Window, RectArea; VAR TextIODone: BOOLEAN; (* Read only variable, which returns whether any of the following procedures has been successful. E.g. if enough memory is available, etc. *) PROCEDURE StartTextSave; (* Saves in memory all subsequent DM-Window character based output in a textual data object associated with the current Dialog Machine output window unless PauseTextSave or StopTextSave is called. Any character processed by the procedures Write, WriteLn (EOL=15C), WriteString, Write(Long)Card, Write(Long)Int, Write(Long)Real, Write(Long)RealSci will be accumulated, even those which might not be visible since they are written outside a clip rectangle or beyond the current window frame. Calling this procedure a second time will silently discard any previously accumulated text. Note that the text is stored in memory and text accumulation won't be stoped unless PauseTextSave, StopTextSave is called or the window is closed; hence don't forget to call any of these procedures in order to avoid memory shortage. Note also that the end of line character EOL saved is not 36C but 15C to be compatible with Macintosh conventions, i.e. no translation is necessary to transfer a text into the clipboard or take from there (see also module DMClipboard). *) PROCEDURE PauseTextSave; PROCEDURE ResumeTextSave; (* Temporarily stops or resumes the storing of character based output *) PROCEDURE StopTextSave; (* Definitly stops the storing of character based output and terminates the stored text data structure with a 0C character. *) PROCEDURE DisplayText (ownerWindow: Window; destRect: RectArea; fromLine: LONGINT); (* Displays the text associated with the Dialog Machine window ownerWindow onto the current Dialog Machine output window in the destination rectangle destRect starting with line fromLine at the top left corner of the rectangle destRect. If the text contains long lines exceeding the width of the destRect, their display will be clipped (no auto-wrap). The status of the text in the owner window and in the destination window remain untouched. In case there is currently a text or picture object open (see also module DMWPictIO), note that the text will be appended to the already existing text or picture of the current output window. This mechanisms allows to transfer a text into a picture and/or into a text object (different from DMWPictIO.DisplayPicture). *) PROCEDURE DiscardText; (* Discard the text associated with the current output window completely, and make the allocated memory space available for other uses. Note that once discarded, it is no longer possible to print the text, write it to a file, or transfer it to the clipboard (s.a. DMPrinting.PrintText, DMPTFiles.DumpText, and DMClipboard.PutTextIntoClipboard). *) (* -------------------------------------------------------------- The following routines make the text object of the current output window available to the advanced programmer. A text object can be of the type ARRAY [0..limit] OF CHAR, whereby limit must not exceed 32000 (compiler implementation restriction). Consider such an array as a window allowing to access a limited portion (segment) of the actual text object. ----------------------------------------------------------------*) PROCEDURE GrabWText(VAR txtbeg: ADDRESS; VAR curTextLength: LONGINT); PROCEDURE ReleaseWText; (* These procedures allow to temporarily lock the text object in memory to access its content via a data structure of the type DMTextFields.TextSegment. This data structure is restricted to 32000 characters, since array indices are restricted by the current compiler implementation. GrabWText returns current address and size of the text object. Don't forget to call GrabWText before actually accessing the object, since its begin txtbeg might otherwise change (object is implemented as a handle, which can move in memory). Warning: Do NOT forget to release a text object before appending text by procedure AppendWText or changing its length by procedure SetWTextSize. *) PROCEDURE AppendWText(txtbeg: ADDRESS; length: LONGINT); (* Append text block stored in memory at address txtbeg of length length to the text object associated with the current output window. Precondition is that StartTextSave and ReleaseWText has been called for the current output window. Note that all length characters contained in text block will be appended regardless of an eventually present character 0C. *) PROCEDURE SetWTextSize(newTextLength: LONGINT); (* Sets the size of the text object associated with the current output window to newTextLength regardless of its current content. This allows to allocate a large memory block before actually assigning the text or to deallocate the memory currently in use (warning: if newTextLength is set smaller than the current text length, the text portion beyond character newTextLength-1 will be lost). *) END DMWTextIO.
|
||
|
|
|