summaryrefslogtreecommitdiff
path: root/sigalatvision/lib/editors.h
diff options
context:
space:
mode:
Diffstat (limited to 'sigalatvision/lib/editors.h')
-rw-r--r--sigalatvision/lib/editors.h1534
1 files changed, 1534 insertions, 0 deletions
diff --git a/sigalatvision/lib/editors.h b/sigalatvision/lib/editors.h
new file mode 100644
index 0000000..11411a3
--- /dev/null
+++ b/sigalatvision/lib/editors.h
@@ -0,0 +1,1534 @@
+/*
+ * editors.h
+ *
+ * Turbo Vision - Version 2.0
+ *
+ * Copyright (c) 1994 by Borland International
+ * All Rights Reserved.
+ *
+ * Modified by Sergio Sigala <sergio@sigala.it>
+ */
+
+#if !defined( __EDIT_COMMAND_CODES )
+#define __EDIT_COMMAND_CODES
+
+/** \file editors.h
+ * editors.h
+ */
+
+const
+ int ufUpdate = 0x01,
+ ufLine = 0x02,
+ ufView = 0x04;
+
+const
+ int smExtend = 0x01,
+ smDouble = 0x02;
+
+const unsigned
+ sfSearchFailed = UINT_MAX;
+
+const
+ int cmFind = 82,
+ cmReplace = 83,
+ cmSearchAgain = 84;
+
+const
+ int cmCharLeft = 500,
+ cmCharRight = 501,
+ cmWordLeft = 502,
+ cmWordRight = 503,
+ cmLineStart = 504,
+ cmLineEnd = 505,
+ cmLineUp = 506,
+ cmLineDown = 507,
+ cmPageUp = 508,
+ cmPageDown = 509,
+ cmTextStart = 510,
+ cmTextEnd = 511,
+ cmNewLine = 512,
+ cmBackSpace = 513,
+ cmDelChar = 514,
+ cmDelWord = 515,
+ cmDelStart = 516,
+ cmDelEnd = 517,
+ cmDelLine = 518,
+ cmInsMode = 519,
+ cmStartSelect = 520,
+ cmHideSelect = 521,
+ cmIndentMode = 522,
+ cmUpdateTitle = 523;
+
+ /** \var edOutOfMemory
+ * @see TEditor::doSearchReplace
+ */
+const int
+ edOutOfMemory = 0,
+
+ /** \var edReadError
+ * @see TEditor::doSearchReplace
+ */
+ edReadError = 1,
+
+ /** \var edWriteError
+ * @see TEditor::doSearchReplace
+ */
+ edWriteError = 2,
+
+ /** \var edCreateError
+ * @see TEditor::doSearchReplace
+ */
+ edCreateError = 3,
+
+ /** \var edSaveModify
+ * @see TEditor::doSearchReplace
+ */
+ edSaveModify = 4,
+
+ /** \var edSaveUntitled
+ * @see TEditor::doSearchReplace
+ */
+ edSaveUntitled = 5,
+
+ /** \var edSaveAs
+ * @see TEditor::doSearchReplace
+ */
+ edSaveAs = 6,
+
+ /** \var edFind
+ * @see TEditor::doSearchReplace
+ */
+ edFind = 7,
+
+ /** \var edSearchFailed
+ * @see TEditor::doSearchReplace
+ */
+ edSearchFailed = 8,
+
+ /** \var edReplace
+ * @see TEditor::doSearchReplace
+ */
+ edReplace = 9,
+
+ /** \var edReplacePrompt
+ * @see TEditor::doSearchReplace
+ */
+ edReplacePrompt = 10;
+
+ /** \var efCaseSensitive
+ * Default to case-sensitive search.
+ * @see TEditor::editorFlags
+ */
+const int
+ efCaseSensitive = 0x0001,
+
+ /** \var efWholeWordsOnly
+ * Default to whole words only search.
+ * @see TEditor::editorFlags
+ */
+ efWholeWordsOnly = 0x0002,
+
+ /** \var efPromptOnReplace
+ * Prompt on replace.
+ * @see TEditor::editorFlags
+ */
+ efPromptOnReplace = 0x0004,
+
+ /** \var efReplaceAll
+ * Replace all occurrences.
+ * @see TEditor::editorFlags
+ */
+ efReplaceAll = 0x0008,
+
+ /** \var efDoReplace
+ * Do replace.
+ * @see TEditor::editorFlags
+ */
+ efDoReplace = 0x0010,
+
+ /** \var efBackupFiles
+ * Create backup files with a trailing ~ on saves.
+ * @see TEditor::editorFlags
+ */
+ efBackupFiles = 0x0100;
+
+ /** \var maxLineLength
+ * Maximum allowed line length for text in a TEditor view.
+ */
+const
+ int maxLineLength = 256;
+
+#endif // __EDIT_COMMAND_CODES
+
+/** \enum TEditorDialog
+ * The TEditorDialog data type is a pointer to function returning ushort
+ * and taking one int argument and a variable number of additional
+ * arguments.
+ *
+ * Since dialog boxes are very application-dependent, a @ref TEditor object
+ * does not display its own dialog boxes directly. Instead it controls
+ * them through this function pointer.
+ *
+ * The various dialog values, passed in the first int argument, are
+ * self-explanatory: @ref edOutOfMemory, @ref edReadError, @ref edWriteError,
+ * @ref edCreateError, @ref edSaveModify, @ref edSaveUntitled, @ref edSaveAs,
+ * @ref edFind, @ref edSearchFailed, @ref edReplace and @ref edReplacePrompt.
+ * @see TEditor::editorDialog
+ */
+typedef ushort (*TEditorDialog)( int, ... );
+
+/** \fn defEditorDialog( int dialog, ... )
+ * Since dialog boxes are very application-dependent, a @ref TEditor object
+ * does not display its own dialog boxes directly. Instead it controls
+ * them through the @ref TEditorDialog function pointer.
+ * @see TEditor::editorDialog
+ *
+ * This is the default dialog; it simply returns cmCancel.
+ */
+ushort defEditorDialog( int dialog, ... );
+
+#if defined( Uses_TIndicator ) && !defined( __TIndicator )
+#define __TIndicator
+
+class TRect;
+
+/**
+ * TIndicator is the line and column counter in the lower left corner of the
+ * edit window.
+ * It is initialized by the @ref TEditWindow constructor and passed as the
+ * fourth argument to the @ref TEditor constructor.
+ * @short The line and column counter in the lower left corner of the edit
+ * window
+ */
+class TIndicator : public TView
+{
+public:
+ /**
+ * Creates a TIndicator object.
+ */
+ TIndicator( const TRect& );
+ /**
+ * Draws the indicator. If variable @ref modified is True, a special
+ * character (ASCII value 15, a star on PC graphic adapters) is displayed.
+ */
+ virtual void draw();
+ /**
+ * Returns the TIndicator default palette.
+ */
+ virtual TPalette& getPalette() const;
+ /**
+ * Draws the indicator in the frame-dragging color if the view is being
+ * dragged.
+ */
+ virtual void setState( ushort, Boolean );
+ /**
+ * Method called by @ref TEditor to update and display the values of the
+ * data members of the associated TIndicator object.
+ * @see TIndicator::location
+ * @see TIndicator::modified
+ */
+ void setValue( const TPoint& aLocation, Boolean aModified );
+ /**
+ * Undocumented.
+ */
+ static char dragFrame;
+ /**
+ * Undocumented.
+ */
+ static char normalFrame;
+protected:
+ /**
+ * Stores the location to display. Updated by a TEditor.
+ */
+ TPoint location;
+ /**
+ * True if the associated TEditor has been modified.
+ */
+ Boolean modified;
+private:
+ virtual const char *streamableName() const
+ { return name; }
+protected:
+ /**
+ * Undocumented.
+ */
+ TIndicator( StreamableInit );
+public:
+ /**
+ * Undocumented.
+ */
+ static const char * const name;
+ /**
+ * Called to create an object in certain stream reading situations.
+ */
+ static TStreamable *build();
+};
+
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TIndicator& cl )
+ { return is >> (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TIndicator*& cl )
+ { return is >> (void *&)cl; }
+
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TIndicator& cl )
+ { return os << (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TIndicator* cl )
+ { return os << (TStreamable *)cl; }
+
+#endif // Uses_TIndicator
+
+
+#if defined( Uses_TEditor ) && !defined( __TEditor )
+#define __TEditor
+
+class TRect;
+class TScrollBar;
+class TIndicator;
+class TEvent;
+
+/**
+ * This class implements a text editor.
+ *
+ * TEditor is the base class for all editors. It implements most of the
+ * editor's functionality. If a TEditor object is created, it allocates a
+ * buffer of the given size out of the heap. The buffer is initially empty.
+ * @short Implements a text editor
+ */
+class TEditor : public TView
+{
+public:
+ /**
+ * Constructor.
+ *
+ * Calls TView::TView(bounds) by creating a view with the given bounds.
+ * The @ref hScrollBar, @ref vScrollBar, @ref indicator and @ref bufSize
+ * data members are set from the given arguments.
+ * @see TView::TView
+ *
+ * The scroll bar and indicator arguments can be set to 0 if you do not
+ * want these objects. The following default values are set:
+ *
+ * <pre>
+ * Variable Value Description
+ *
+ * canUndo True @ref TEditor::canUndo
+ * selecting False @ref TEditor::selecting
+ * overwrite False @ref TEditor::overwrite
+ * autoIndent False @ref TEditor::autoIndent
+ * lockCount 0 @ref TEditor::lockCount
+ * keyState 0 @ref TEditor::keyState
+ * growMode @ref gfGrowHiX | @ref gfGrowHiY @ref TView::growMode
+ * options @ref ofSelectable @ref TView::options
+ * eventMask @ref evMouseDown | @ref evKeyDown |
+ * @ref evCommand | @ref evBroadcast @ref TView::eventMask
+ * </pre>
+ *
+ * `aBufSize' is the buffer initial size; 0 is its common value.
+ * The buffer is allocated and cleared. If insufficient memory exists,
+ * the @ref edOutOfMemory dialog box is displayed using
+ * @ref editorDialog(), and @ref isValid data member is set False.
+ * Otherwise @ref isValid is set True.
+ *
+ * The data members associated with the editor buffer are initialized in
+ * the obvious way: @ref bufLen to 0, @ref gapLen to @ref bufSize,
+ * @ref selStart to 0, @ref modified to False, and so on.
+ */
+ TEditor( const TRect& bounds, TScrollBar *aHScrollBar,
+ TScrollBar *aVScrollBar, TIndicator *aIndicator, uint aBufSize );
+ /**
+ * Destructor.
+ *
+ * Destroys the editor and deletes the buffer.
+ */
+ virtual ~TEditor();
+ /**
+ * Used internally by @ref TObject::destroy() to ensure correct
+ * destruction of derived and related objects. shutDown() is overridden
+ * in many classes to ensure the proper setting of related data members
+ * when @ref destroy() is called.
+ */
+ virtual void shutDown();
+ /**
+ * Returns the p'th character in the file, factoring in the gap.
+ */
+ char bufChar( uint p );
+ /**
+ * Returns the offset into buffer of the p'th character in the file,
+ * factoring in the gap.
+ */
+ uint bufPtr( uint p );
+ /**
+ * Changes the views bounds, adjusting the @ref delta value and redrawing
+ * the scrollbars and view if necessary.
+ *
+ * Overridden to ensure the file stays within view if the parent size
+ * changes.
+ */
+ virtual void changeBounds( const TRect& bounds );
+ /**
+ * Used by @ref handleEvent() to provide basic editing operations by
+ * converting various key events to command events. You can change or
+ * extend these default key bindings by overriding the convertEvent()
+ * member function.
+ */
+ virtual void convertEvent( TEvent& event );
+ /**
+ * Returns True if the @ref cursor (insertion point) is visible within the
+ * view.
+ */
+ Boolean cursorVisible();
+ /**
+ * Deletes the selection if one exists. For example, after a successful
+ * @ref clipCopy(), the selected block is deleted.
+ */
+ void deleteSelect();
+ /**
+ * Deletes the buffer.
+ */
+ virtual void doneBuffer();
+ /**
+ * Overrides @ref TView::draw() to draw the editor.
+ */
+ virtual void draw();
+ /**
+ * Returns the default TEditor palette. Override if you wish to change the
+ * palette of the editor.
+ */
+ virtual TPalette& getPalette() const;
+ /**
+ * Provides the event handling for the editor. Override if you wish to
+ * extend the commands the editor handles.
+ *
+ * The default handler calls @ref TView::handleEvent(), then converts all
+ * relevant editing key events to command events by calling
+ * @ref convertEvent().
+ */
+ virtual void handleEvent( TEvent& event );
+ /**
+ * Allocates a buffer of size @ref bufSize and sets @ref buffer to point
+ * at it.
+ */
+ virtual void initBuffer();
+ /**
+ * This is the lowest-level text insertion member function. It inserts
+ * `length' bytes of text from the array `p' (starting at p[offset]) into
+ * the buffer (starting at the @ref curPtr).
+ *
+ * If `allowUndo' is set True, insertBuffer() records undo information. If
+ * `selectText' is set True, the inserted text will be selected.
+ * insertBuffer() returns True for a successful operation.
+ *
+ * Failure invokes a suitable dialog box and returns False. insertBuffer()
+ * is used by @ref insertFrom() and @ref insertText(); you will seldom
+ * need to call it directly.
+ */
+ Boolean insertBuffer( char *p, uint offset, uint length,
+ Boolean allowUndo, Boolean selectText );
+ /**
+ * Inserts the current block-marked selection from the argument `editor'
+ * into this editor.
+ * This member function implements @ref clipCut(), @ref clipCopy(), and
+ * @ref clipPaste().
+ *
+ * The implementation may help you understand the insertFrom() and
+ * @ref insertBuffer() functions:
+ *
+ * <pre>
+ * Boolean TEditor::insertFrom(TEditor *editor)
+ * {
+ * return insertBuffer(editor->buffer,
+ * editor->bufPtr(editor->selStart),
+ * editor->selEnd - editor->selStart, canUndo, isClipboard());
+ * }
+ * </pre>
+ *
+ * Note the the `allowUndo' argument is set to the value of the data
+ * member @ref canUndo. The `selectText' argument will be True if there
+ * is an active clipboard for this editor.
+ */
+ virtual Boolean insertFrom( TEditor *editor );
+ /**
+ * Copies `length' bytes from the given text into this object's buffer.
+ *
+ * If `selectText' is True, the inserted text will be selected. This is a
+ * simplified version of @ref insertBuffer().
+ */
+ Boolean insertText( const void *text, uint length, Boolean selectText );
+ /**
+ * Move column `x' and line `y' to the upper-left corner of the editor.
+ */
+ void scrollTo( int x, int y );
+ /**
+ * Search for the given string `findStr' in the editor @ref buffer
+ * (starting at @ref curPtr) with the given options in `opts'. The valid
+ * options are:
+ *
+ * <pre>
+ * Name Value Description
+ *
+* @ref efCaseSensitive 0x0001 Case sensitive search
+* @ref efWholeWordsOnly 0x0002 Whole words only search
+ * </pre>
+ *
+ * Returns True if a match is found; otherwise returns False. If a match
+ * is found, the matching text is selected.
+ */
+ Boolean search( const char *findStr, ushort opts );
+ /**
+ * Should be called before changing the buffer size to `newSize'. It
+ * should return True if the the buffer can be of this new size.
+ *
+ * By default, it returns True if `newSize' is less than or equal to
+ * @ref bufSize.
+ */
+ virtual Boolean setBufSize( uint newSize );
+ /**
+ * Enables or disables the given command depending on whether `enable' is
+ * True or False and whether the editor is @ref sfActive.
+ * @see TView::state
+ *
+ * The command is always disabled if the editor is not the selected view.
+ * Offers a convenient alternative to @ref enableCommands() and
+ * @ref disableCommands().
+ */
+ void setCmdState( ushort command, Boolean enable );
+ /**
+ * Sets the selection to the given offsets into the file, and redraws the
+ * view as needed.
+ *
+ * This member function will either place the cursor in front of or behind
+ * the selection, depending on the value (True or False, respectively) of
+ * `curStart'.
+ */
+ void setSelect( uint newStart, uint newEnd, Boolean curStart );
+ /**
+ * Overrides @ref TView::setState() to hide and show the indicator and
+ * scroll bars.
+ *
+ * It first calls @ref TView::setState() to enable and disable commands.
+ * If you wish to enable and disable additional commands, override
+ * @ref updateCommands() instead. This is called whenever the command
+ * states should be updated.
+ */
+ virtual void setState( ushort aState, Boolean enable );
+ /**
+ * Forces the cursor to be visible. If `center' is True, the cursor is
+ * forced to be in the center of the screen in the y (line) direction.
+ * The x (column) position is not changed.
+ */
+ void trackCursor( Boolean center );
+ /**
+ * Undoes the changes since the last cursor movement.
+ */
+ void undo();
+ /**
+ * Called whenever the commands should be updated. This is used to enable
+ * and disable commands such as cmUndo and cmCopy.
+ */
+ virtual void updateCommands();
+ /**
+ * Returns whether the view is valid for the given command. By default it
+ * returns the value of @ref isValid, which is True if @ref buffer is
+ * not 0.
+ */
+ virtual Boolean valid( ushort command );
+ /**
+ * Calculates and returns the actual cursor position by examining the
+ * characters in the buffer between `p' and `target'.
+ * Any tab codes encountered are counted as spaces modulo the tab setting.
+ * @see TEditor::charPtr
+ */
+ uint charPos( uint p, uint target );
+ /**
+ * The reverse of @ref charPos().
+ * Calculates and returns the buffer position corresponding to a cursor
+ * position.
+ */
+ uint charPtr( uint p, uint target );
+ /**
+ * Returns False if this editor has no active clipboard.
+ * Otherwise, copies the selected text from the editor to the clipboard
+ * using clipboard->insertFrom(this).
+ * @see TEditor::insertFrom
+ *
+ * The selected text is deselected (highlight removed) and the view
+ * redrawn. Returns True if all goes well.
+ */
+ Boolean clipCopy();
+ /**
+ * The same as for @ref clipCopy(), but the selected text is deleted after
+ * being copied to the clipboard.
+ */
+ void clipCut();
+ /**
+ * The reverse of @ref clipCopy(): the contents of the clipboard (if any)
+ * are copied to the current position of the editor using
+ * insertFrom(clipboard).
+ * @see TEditor::insertFrom
+ */
+ void clipPaste();
+ /**
+ * If `delSelect' is True and a current selection exists, the current
+ * selection is deleted; otherwise, the range `startPtr' to `endPtr' is
+ * selected and deleted.
+ */
+ void deleteRange( uint startPtr, uint endPtr, Boolean delSelect );
+ /**
+ * If @ref updateFlags data member is 0, nothing happens. Otherwise, the
+ * view and its scrollbars are updated and redrawn depending on the state
+ * of the @ref updateFlags bits.
+ *
+ * For example, if ufView is set, the view is redrawn with
+ * @ref drawView(). If the view is @ref sfActive, the command set is
+ * updated with @ref updateCommands().
+ * @see TView::state
+ *
+ * After these updates, @ref updateFlags is set to 0.
+ */
+ void doUpdate();
+ /**
+ * Can be used in both find and find/replace operations, depending on the
+ * state of @ref editorFlags data member bits and user-dialog box
+ * interactions.
+ *
+ * If @ref efDoReplace is not set, doSearchReplace() acts as a simple
+ * search for @ref findStr data member, with no replacement. Otherwise,
+ * this function aims at replacing occurrences of @ref findStr with
+ * @ref replaceStr data member.
+ *
+ * In all cases, if the target string is not found, an
+ * editorDialog(@ref edSearchFailed) call is invoked.
+ * @see TEditor::editorDialog
+ *
+ * If @ref efPromptOnReplace is set in @ref editorFlags, an
+ * @ref edReplacePrompt dialog box appears. Replacement then depends on
+ * the user response. If @ref efReplaceAll is set, replacement proceeds
+ * for all matching strings without prompting until a cmCancel command is
+ * detected.
+ */
+ void doSearchReplace();
+ /**
+ * Draws `count' copies of the line at `linePtr', starting at line
+ * position `y'.
+ */
+ void drawLines( int y, uint count, uint linePtr );
+ /**
+ * Formats the line at `linePtr' in the given color and sets result in
+ * `buff'. Used by @ref drawLines().
+ */
+ void formatLine(void *buff, uint linePtr, int x, ushort color);
+ /**
+ * Finds occurrences of the existing @ref findStr or a new user-supplied
+ * string. find() displays an editor dialog inviting the input of a find
+ * string or the acceptance of the existing @ref findStr.
+ *
+ * If a new find string is entered, it will replace the previous
+ * @ref findStr (unless the user cancels).
+ * find() first creates a @ref TFindDialogRec object defined as follows:
+ *
+ * <pre>
+ * struct TFindDialogRec
+ * {
+ * TFindDialogRec(const char *str, ushort flgs)
+ * {
+ * strcpy(find, str);
+ * options = flgs;
+ * }
+ * char find[80];
+ * ushort options;
+ * };
+ * </pre>
+ *
+ * The constructor is called with `str' set to the current @ref findStr,
+ * and `flgs' set to the current @ref editorFlags.
+ *
+ * The @ref edFind editor dialog then invites change or acceptance of the
+ * @ref findStr. Finally, @ref doSearchReplace() is called for a simple
+ * find-no-replace (@ref efDoReplace switched off).
+ */
+ void find();
+ /**
+ * Returns the buffer character pointer corresponding to the point `m' on
+ * the screen.
+ */
+ uint getMousePtr( TPoint m );
+ /**
+ * Returns True if a selection has been made; that is, if @ref selStart
+ * does not equal @ref selEnd. If these two data members are equal, no
+ * selection exists, and False is returned.
+ */
+ Boolean hasSelection();
+ /**
+ * Sets selecting to False and hides the current selection with
+ * setSelect(curPtr, curPtr, False).
+ * @see TEditor::curPtr
+ * @see TEditor::setSelect
+ */
+ void hideSelect();
+ /**
+ * Returns True if this editor has an attached clipboard; otherwise
+ * returns False.
+ */
+ Boolean isClipboard();
+ /**
+ * Returns the buffer pointer (offset) of the end of the line containing
+ * the given pointer `p'.
+ */
+ uint lineEnd( uint p );
+ /**
+ * Moves the line containing the pointer (offset) `p' up or down `count'
+ * lines depending on the sign of `count'.
+ */
+ uint lineMove( uint p, int count );
+ /**
+ * Returns the buffer pointer (offset) of the start of the line contaning
+ * the given pointer `p'.
+ */
+ uint lineStart( uint p );
+ /**
+ * Increments the semaphore @ref lockCount.
+ */
+ void lock();
+ /**
+ * Inserts a newline at the current pointer. If @ref autoIndent is set,
+ * appropriate tabs (if needed) are also inserted at the start of the new
+ * line.
+ */
+ void newLine();
+ /**
+ * Returns the buffer offset for the character following the one at the
+ * given offset `p'.
+ */
+ uint nextChar( uint p );
+ /**
+ * Returns the buffer offset for the start of the line following the line
+ * containing the given offset `p'.
+ */
+ uint nextLine( uint p );
+ /**
+ * Returns the buffer offset for the start of the word following the word
+ * containing the given offset `p'.
+ */
+ uint nextWord( uint p );
+ /**
+ * Returns the buffer offset for the character preceding the one at the
+ * given offset `p'.
+ */
+ uint prevChar( uint p );
+ /**
+ * Returns the buffer offset for the start of the line preceding the line
+ * containing the given offset `p'.
+ */
+ uint prevLine( uint p );
+ /**
+ * Returns the buffer offset corresponding to the start of the word
+ * preceding the word containing the given offset `p'.
+ */
+ uint prevWord( uint p );
+ /**
+ * Replaces occurrences of the existing @ref findStr (or a new
+ * user-supplied find string) with the existing @ref replaceStr (or a
+ * new user-supplied replace string).
+ *
+ * replace() displays an editor dialog inviting the input of both strings
+ * or the acceptance of the existing @ref findStr and @ref replaceStr.
+ * If new strings are entered, they will replace the previous values
+ * (unless the user cancels).
+ *
+ * replace() first creates a @ref TReplaceDialogRec object defined as
+ * follows:
+ *
+ * <pre>
+ * struct TReplaceDialogRec
+ * {
+ * TReplaceDialogRec(const char *str, const char *rep, ushort flgs)
+ * {
+ * strcpy(find, str);
+ * strcpy(replace, rep);
+ * options = flgs;
+ * }
+ * char find[80];
+ * char replace[80];
+ * ushort options;
+ * };
+ * </pre>
+ *
+ * The constructor is called with `str' and `rep' set to the current
+ * @ref findStr and @ref replaceStr, and with `flg' set to the current
+ * @ref editorFlags.
+ *
+ * The @ref edReplace editor dialog then invites change or acceptance of
+ * the two strings.
+ * @see TEditor::editorDialog
+ *
+ * Finally, @ref doSearchReplace() is called for a find-replace operation
+ * (@ref efDoReplace switched on).
+ */
+ void replace();
+ /**
+ * Sets @ref bufLen to `length', then adjusts @ref gapLen and @ref limit
+ * accordingly. @ref selStart, @ref selEnd, @ref curPtr, delta.x, delta.y,
+ * @ref drawLine, @ref drawPtr, @ref delCount, and @ref insCount are all
+ * set to 0.
+ * @see TEditor::delta
+ *
+ * @ref curPos is set to @ref delta, @ref modified is set to False, and
+ * the view is updated and redrawn as needed.
+ *
+ * The TEditor constructor calls setBufLen(0). setBufLen() is also used
+ * by @ref insertBuffer().
+ * @see TEditor::TEditor
+ */
+ void setBufLen( uint length );
+ /**
+ * Calls @ref setSelect() and repositions @ref curPtr to the offset `p'.
+ * Some adjustments may be made, depending on the value of `selectMode',
+ * if @ref curPtr is at the beginning or end of a selected text.
+ */
+ void setCurPtr( uint p, uchar selectMode );
+ /**
+ * Called by @ref handleEvent() when a Ctrl-K Ctrl-B selection is detected.
+ * Hides the previous selection and sets @ref selecting to True.
+ */
+ void startSelect();
+ /**
+ * Toggles the @ref overwrite data member from True to False and from
+ * False to True. Changes the cursor shape by calling @ref setState().
+ */
+ void toggleInsMode();
+ /**
+ * Decrements the data member @ref lockCount until it reaches the value
+ * 0, at which point a @ref doUpdate() is triggered. The lock/unlock
+ * mechanism prevents over-frequent redrawing of the view.
+ */
+ void unlock();
+ /**
+ * Sets `aFlags' in the @ref updateFlags data member. If @ref lockCount
+ * is 0, calls @ref doUpdate().
+ */
+ void update( uchar aFlags );
+ /**
+ * Called by @ref handleEvent() in response to a cmScrollBarChanged
+ * broadcast event. If the scroll bar's current value is different from
+ * `d', the scroll bar is redrawn.
+ */
+ void checkScrollBar( const TEvent& event, TScrollBar *p, int& d );
+ /**
+ * Pointer to the horizontal scroll bar; 0 if the scroll bar does not
+ * exist.
+ */
+ TScrollBar *hScrollBar;
+ /**
+ * Pointer to the vertical scroll bar; 0 if the scroll bar does not exist.
+ */
+ TScrollBar *vScrollBar;
+ /**
+ * Pointer to the indicator; 0 if the indicator does not exist.
+ */
+ TIndicator *indicator;
+ /**
+ * Pointer to the buffer used to hold the text.
+ */
+ char *buffer;
+ /**
+ * Size of the buffer (in bytes).
+ */
+ uint bufSize;
+ /**
+ * The amount of text stored between the start of the buffer and the
+ * current cursor position.
+ */
+ uint bufLen;
+ /**
+ * The size of the "gap" between the text before the cursor and the text
+ * after the cursor.
+ */
+ uint gapLen;
+ /**
+ * The offset of the start of the text selected by Ctrl-K Ctrl-B.
+ */
+ uint selStart;
+ /**
+ * The offset of the end of the text selected by Ctrl-K Ctrl-K.
+ */
+ uint selEnd;
+ /**
+ * Offset of the cursor.
+ */
+ uint curPtr;
+ /**
+ * The line/column location of the cursor in the file.
+ */
+ TPoint curPos;
+ /**
+ * The top line and leftmost column shown in the view.
+ */
+ TPoint delta;
+ /**
+ * The maximum number of columns to display, and the number of lines in
+ * the file. Records the limits of the scroll bars.
+ */
+ TPoint limit;
+ /**
+ * Column position on the screen where inserted characters are drawn.
+ * Used internally by @ref draw().
+ */
+ int drawLine;
+ /**
+ * Buffer offset corresponding to the current cursor. Used internally by
+ * @ref draw().
+ */
+ uint drawPtr;
+ /**
+ * Number of characters in the end of the gap that were deleted from the
+ * text. Used to implement @ref undo().
+ */
+ uint delCount;
+ /**
+ * Number of characters inserted into the text since the last cursor
+ * movement. Used to implement @ref undo().
+ */
+ uint insCount;
+ /**
+ * True if the view is valid. Used by the @ref valid() function.
+ */
+ Boolean isValid;
+ /**
+ * True if the editor is to support undo. Otherwise False.
+ */
+ Boolean canUndo;
+ /**
+ * True if the buffer has been modified.
+ */
+ Boolean modified;
+ /**
+ * True if the editor is in selecting mode (that is, Ctrl-K Ctrl-B has
+ * been pressed).
+ */
+ Boolean selecting;
+ /**
+ * True if in overwrite mode; otherwise the editor is in insert mode.
+ */
+ Boolean overwrite;
+ /**
+ * True if the editor is in autoindent mode.
+ */
+ Boolean autoIndent;
+ /**
+ * The TEditorDialog data type is a pointer to function returning ushort
+ * and taking one int argument and a variable number of additional
+ * arguments. It is defined in `editors.h' as follows:
+ *
+ * <pre>
+ * typedef ushort (*TEditorDialog)(int, ...);
+ * </pre>
+ *
+ * Variable editorDialog is a function pointer used by TEditor objects to
+ * display various dialog boxes.
+ *
+ * Since dialog boxes are very application-dependent, a TEditor object
+ * does not display its own dialog boxes directly. Instead it controls
+ * them through this function pointer.
+ *
+ * The various dialog values, passed in the first int argument, are
+ * self-explanatory: @ref edOutOfMemory, @ref edReadError,
+ * @ref edWriteError, @ref edCreateError, @ref edSaveModify,
+ * @ref edSaveUntitled, @ref edSaveAs, @ref edFind, @ref edSearchFailed,
+ * @ref edReplace and @ref edReplacePrompt.
+ *
+ * The default editorDialog, @ref defEditorDialog(), simply returns
+ * cmCancel.
+ */
+ static TEditorDialog editorDialog;
+ /**
+ * Variable editorFlags contains various flags for use in the editor:
+ *
+ * <pre>
+ * Name Value Description
+ *
+* @ref efCaseSensitive 0x0001 Default to case-sensitive search
+* @ref efWholeWordsOnly 0x0002 Default to whole words only search
+* @ref efPromptOnReplace 0x0004 Prompt on replace
+* @ref efReplaceAll 0x0008 Replace all occurrences
+* @ref efDoReplace 0x0010 Do replace
+* @ref efBackupFiles 0x0100 Create backup files with a trailing ~ on saves
+ * </pre>
+ *
+ * The default value is @ref efBackupFiles | @ref efPromptOnReplace.
+ */
+ static ushort editorFlags;
+ /**
+ * Stores the last string value used for a find operation.
+ */
+ static char findStr[maxFindStrLen];
+ /**
+ * Stores the last string value of a replace operation.
+ */
+ static char replaceStr[maxReplaceStrLen];
+ /**
+ * Pointer to the clipboard.
+ *
+ * Any TEditor can be the clipboard; it just needs be assigned to this
+ * variable. The clipboard should not support undo (i.e., its @ref canUndo
+ * should be false).
+ */
+ static TEditor * clipboard;
+ /**
+ * Holds the lock count semaphore that controls when a view is redrawn.
+ * lockCount is incremented by @ref lock() and decremented by
+ * @ref unlock().
+ */
+ uchar lockCount;
+ /**
+ * A set of flags indicating the state of the editor.
+ * @ref doUpdate() and other member functions examine these flags to
+ * determine whether the view needs to be redrawn.
+ */
+ uchar updateFlags;
+ /**
+ * Indicates that a special key, such as Ctrl-K, has been pressed. Used
+ * by @ref handleEvent() to keep track of "double" control keys such
+ * as Ctrl-K-H and Ctrl-K-B.
+ */
+ int keyState;
+private:
+ virtual const char *streamableName() const
+ { return name; }
+protected:
+ /**
+ * Each streamable class needs a "builder" to allocate the correct memory
+ * for its objects together with the initialized virtual table pointers.
+ *
+ * This is achieved by calling this constructor with an argument of type
+ * @ref StreamableInit.
+ */
+ TEditor( StreamableInit );
+ /**
+ * Writes to the output stream `os'.
+ */
+ virtual void write( opstream& os );
+ /**
+ * Reads an editor object from the input stream `is'.
+ */
+ virtual void *read( ipstream& is );
+public:
+ /**
+ * Undocumented.
+ */
+ static const char * const name;
+ /**
+ * Called to create an object in certain stream reading situations.
+ */
+ static TStreamable *build();
+};
+
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TEditor& cl )
+ { return is >> (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TEditor*& cl )
+ { return is >> (void *&)cl; }
+
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TEditor& cl )
+ { return os << (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TEditor* cl )
+ { return os << (TStreamable *)cl; }
+
+#endif // Uses_TEditor
+
+#if defined( Uses_TMemo ) && !defined( __TMemo )
+#define __TMemo
+
+class TEvent;
+
+/**
+ * Data structure used by @ref TMemo.
+ * @short Data structure used by TMemo
+ */
+struct TMemoData
+{
+ /**
+ * Undocumented.
+ */
+ ushort length;
+ /**
+ * Undocumented.
+ */
+ char buffer[1];
+};
+
+/**
+ * TMemo, which is derived from TEditor, is designed for insertion into a
+ * dialog or form.
+ * @short Derived from TEditor and designed for insertion into a dialog or
+ * form
+ */
+class TMemo : public TEditor
+{
+public:
+ /**
+ * Constructor.
+ * @see TEditor::TEditor
+ */
+ TMemo( const TRect& bounds, TScrollBar *aHScrollBar,
+ TScrollBar *aVScrollBar, TIndicator *aIndicator, uint aBufSize );
+ virtual void getData( void *rec );
+ virtual void setData( void *rec );
+ /**
+ * Used with @ref getData() and @ref setData(), which are inherited from
+ * TView and redefined. By default it returns (sizeof(ushort) +
+ * @ref bufSize).
+ */
+ virtual ushort dataSize();
+ /**
+ * Returns the default memo palette.
+ */
+ virtual TPalette& getPalette() const;
+ /**
+ * Prevents TMemo from handling kbTab key events; otherwise handles
+ * events the same as a @ref TEditor.
+ * @see TEditor::handleEvent
+ */
+ virtual void handleEvent( TEvent& );
+private:
+ virtual const char *streamableName() const
+ { return name; }
+protected:
+ /**
+ * Each streamable class needs a "builder" to allocate the correct memory
+ * for its objects together with the initialized virtual table pointers.
+ *
+ * This is achieved by calling this constructor with an argument of type
+ * @ref StreamableInit.
+ */
+ TMemo( StreamableInit );
+ /**
+ * Writes to the output stream `os'.
+ */
+ virtual void write( opstream& );
+ /**
+ * Reads from the input stream `is'.
+ */
+ virtual void *read( ipstream& );
+public:
+ /**
+ * Undocumented.
+ */
+ static const char * const name;
+ /**
+ * Called to create an object in certain stream-reading situations.
+ */
+ static TStreamable *build();
+};
+
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TMemo& cl )
+ { return is >> (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TMemo*& cl )
+ { return is >> (void *&)cl; }
+
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TMemo& cl )
+ { return os << (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TMemo* cl )
+ { return os << (TStreamable *)cl; }
+
+#endif // Uses_TMemo
+
+
+#if defined( Uses_TFileEditor ) && !defined( __TFileEditor )
+#define __TFileEditor
+
+#include <limits.h>
+
+class TRect;
+class TScrollBar;
+class TIndicator;
+class TEvent;
+
+/**
+ * TFileEditor is a specialized derivative of TEditor for editing the contents
+ * of a file.
+ * @short Specialized derivative of TEditor for editing the contents of a file
+ */
+class TFileEditor : public TEditor
+{
+public:
+ /**
+ * The name of the file being edited.
+ */
+ char fileName[PATH_MAX];
+ /**
+ * Creates a TFileEditor object with the given scroll bars and indicator
+ * and loads the contents of the file given in `aFileName'.
+ *
+ * If the file is not found or invalid, an error message will be displayed
+ * and the object's @ref valid() member function will return False.
+ *
+ * The @ref options variable is set to @ref ofSelectable and the
+ * @ref eventMask is set to allow the handling of broadcast events.
+ *
+ * Any of `aHScrollBar', `aVScrollBar' or `aIndicator' arguments can be
+ * set to 0 if you do not want them.
+ */
+ TFileEditor( const TRect& bounds,
+ TScrollBar *aHScrollBar,
+ TScrollBar *aVScrollBar,
+ TIndicator *aIndicator,
+ const char *aFileName
+ );
+ /**
+ * Deletes the buffer.
+ */
+ virtual void doneBuffer();
+ /**
+ * Calls @ref TEditor::handleEvent(), then handles cmSave and cmSaveAs
+ * commands.
+ *
+ * The cmSave command invokes @ref save(); the cmSaveAs command invokes
+ * @ref saveAs().
+ */
+ virtual void handleEvent( TEvent& );
+ /**
+ * Allocates @ref bufSize bytes of memory for the file editor buffer.
+ */
+ virtual void initBuffer();
+ /**
+ * Reads the @ref fileName file from disk and checks for errors.
+ *
+ * Returns True if all is well; otherwise returns False. Depending on the
+ * reason for failure, the @ref edOutOfMemory or @ref edReadError dialog
+ * box is displayed with a call to @ref editorDialog().
+ */
+ Boolean loadFile();
+ /**
+ * Calls @ref saveAs() if the file being edited is "Untitled" (that is, no
+ * @ref fileName is allocated) and returns the return value from
+ * @ref saveAs().
+ *
+ * If there is a valid @ref fileName, @ref saveFile() is invoked, and
+ * save() returns the return value of @ref saveFile().
+ */
+ Boolean save();
+ /**
+ * Invokes the @ref edSaveAs dialog, which prompts for a "save as" file
+ * name. If a valid file name is supplied, the current text will be saved
+ * with this name using the @ref saveFile() member function.
+ * @see editorDialog
+ *
+ * The file editor's owner is informed of this event via a broadcast
+ * cmUpdateTitle message. saveAs() returns True if the @ref saveFile()
+ * call is successful, otherwise False is returned.
+ *
+ * False is also returned if the @ref edSaveAs dialog is cancelled.
+ */
+ Boolean saveAs();
+ /**
+ * Saves the @ref fileName file to disk. Returns False if the save fails;
+ * otherwise returns True. If @ref editorFlags has the @ref efBackupFiles
+ * bit set, a backup file is created.
+ *
+ * The @ref edCreateError or @ref edWriteError dialog box will be
+ * displayed to indicate the reason for failure if save fails.
+ * @see editorDialog
+ */
+ Boolean saveFile();
+ /**
+ * Overrides @ref TEditor::setBufSize() to grow and shrink the buffer.
+ *
+ * Will grow and shrink the buffer in 4K byte increments. @ref gapLen
+ * data member is adjusted appropriately.
+ */
+ virtual Boolean setBufSize( uint newSize );
+ /**
+ * Undocumented.
+ */
+ virtual void shutDown();
+ /**
+ * Calls @ref TEditor::updateCommands(), then enables the cmSave and
+ * cmSaveAs commands. These commands are only valid if the selected view
+ * is an editor, otherwise they should be disabled.
+ */
+ virtual void updateCommands();
+ /**
+ * Overrides @ref TEditor::valid() to warn that the file might need saving
+ * before the program exits.
+ *
+ * The @ref edSaveUntitled or @ref edSaveModify dialogs are displayed as
+ * appropriate.
+ * @see editorDialog
+ *
+ * Returns False if the user cancels the save.
+ */
+ virtual Boolean valid( ushort );
+private:
+ static const char * backupExt;
+ virtual const char *streamableName() const
+ { return name; }
+protected:
+ /**
+ * Each streamable class needs a "builder" to allocate the correct memory
+ * for its objects together with the initialized virtual table pointers.
+ *
+ * This is achieved by calling this constructor with an argument of type
+ * @ref StreamableInit.
+ */
+ TFileEditor( StreamableInit );
+ /**
+ * Writes to the output stream `os'.
+ */
+ virtual void write( opstream& );
+ /**
+ * Reads from the input stream `is'.
+ */
+ virtual void *read( ipstream& );
+public:
+ /**
+ * Undocumented.
+ */
+ static const char * const name;
+ /**
+ * Called to create an object in certain stream-reading situations.
+ */
+ static TStreamable *build();
+};
+
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TFileEditor& cl )
+ { return is >> (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TFileEditor*& cl )
+ { return is >> (void *&)cl; }
+
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TFileEditor& cl )
+ { return os << (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TFileEditor* cl )
+ { return os << (TStreamable *)cl; }
+
+#endif // Uses_TFileEditor
+
+
+#if defined( Uses_TEditWindow ) && !defined( __TEditWindow )
+#define __TEditWindow
+
+class TFileEditor;
+
+/**
+ * TEditWindow is a window designed to hold a @ref TFileEditor or the
+ * clipboard.
+ *
+ * It will change its title to display the file name being edited and will
+ * initialize scroll bars and an indicator for the editor.
+ * @see TIndicator
+ * @short Designed to hold a TFileEditor or the clipboard
+ */
+class TEditWindow : public TWindow
+{
+public:
+ /**
+ * Creates a TEditWindow object that will edit the given file name with
+ * window number `aNumber'. Initializes a framed, tileable window with
+ * scroll bars and an indicator. If `fileName' is 0, it is assumed to be
+ * an untitled file.
+ *
+ * Note: if @ref editor data member is equal to @ref TEditor::clipboard
+ * static data member, the editor is assumed to be the clipboard.
+ */
+ TEditWindow( const TRect& bounds, const char *fileName, int aNumber );
+ /**
+ * Overrides @ref TWindow::close() to hide rather than close the window
+ * if the editor is a clipboard.
+ */
+ virtual void close();
+ /**
+ * Returns the name of the file being edited, or "Clipboard" if the editor
+ * is the clipboard.
+ */
+ virtual const char *getTitle( short );
+ /**
+ * Handles cmUpdateTitle to redraw the frame of the window. Used in
+ * @ref TFileEditor::saveAs() to change the title of the window if the
+ * file being edited changes names.
+ */
+ virtual void handleEvent( TEvent& event );
+ /**
+ * Undocumented.
+ */
+ virtual void sizeLimits( TPoint& min, TPoint& max );
+ /**
+ * Pointer to the editor associated with this window.
+ */
+ TFileEditor *editor;
+private:
+ static const char * clipboardTitle;
+ static const char * untitled;
+ virtual const char *streamableName() const
+ { return name; }
+protected:
+ /**
+ * Each streamable class needs a "builder" to allocate the correct memory
+ * for its objects together with the initialized virtual table pointers.
+ *
+ * This is achieved by calling this constructor with an argument of type
+ * @ref StreamableInit.
+ */
+ TEditWindow( StreamableInit );
+ /**
+ * Writes to the output stream `os'.
+ */
+ virtual void write( opstream& );
+ /**
+ * Reads from the input stream `is'.
+ */
+ virtual void *read( ipstream& );
+public:
+ /**
+ * Undocumented.
+ */
+ static const char * const name;
+ /**
+ * Called to create an object in certain stream-reading situations.
+ */
+ static TStreamable *build();
+};
+
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TEditWindow& cl )
+ { return is >> (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline ipstream& operator >> ( ipstream& is, TEditWindow*& cl )
+ { return is >> (void *&)cl; }
+
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TEditWindow& cl )
+ { return os << (TStreamable&)cl; }
+/**
+ * Undocumented.
+ */
+inline opstream& operator << ( opstream& os, TEditWindow* cl )
+ { return os << (TStreamable *)cl; }
+
+#endif // Uses_TEditWindow
+
+
+#if defined( Uses_TFindDialogRec ) && !defined( __TFindDialogRec )
+#define __TFindDialogRec
+
+#include <string.h>
+
+/**
+ * Data record used by TEditor.
+ * @see TEditor::find
+ * @see TReplaceDialogRec
+ * @see TView::dataSize
+ * @see TView::getData
+ * @see TView::setData
+ */
+struct TFindDialogRec
+{
+ /**
+ * Undocumented.
+ */
+ TFindDialogRec( const char *str, ushort flgs )
+ {
+ strcpy( find, str );
+ options = flgs;
+ }
+ /**
+ * Undocumented.
+ */
+ char find[maxFindStrLen];
+ /**
+ * Undocumented.
+ */
+ ushort options;
+};
+
+#endif // Uses_TFindDialogRec
+
+#if defined( Uses_TReplaceDialogRec ) && !defined( __TReplaceDialogRec )
+#define __TReplaceDialogRec
+
+#include <string.h>
+
+/**
+ * Data record used by TEditor.
+ * @see TEditor::replace
+ * @see TFindDialogRec
+ * @see TView::dataSize
+ * @see TView::getData
+ * @see TView::setData
+ */
+struct TReplaceDialogRec
+{
+ /**
+ * Undocumented.
+ */
+ TReplaceDialogRec( const char *str, const char *rep, ushort flgs )
+ {
+ strcpy( find, str );
+ strcpy( replace, rep );
+ options = flgs;
+ }
+ /**
+ * Undocumented.
+ */
+ char find[maxFindStrLen];
+ /**
+ * Undocumented.
+ */
+ char replace[maxReplaceStrLen];
+ /**
+ * Undocumented.
+ */
+ ushort options;
+};
+
+#endif // Uses_TReplaceDialogRec