mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-04 09:10:53 +02:00
* first version
This commit is contained in:
parent
0e7c4919c8
commit
835e2c4701
130
fcl/shedit/README
Normal file
130
fcl/shedit/README
Normal file
@ -0,0 +1,130 @@
|
||||
# $Id$
|
||||
|
||||
! Note: This version is not completed yet !
|
||||
|
||||
|
||||
This is SHEdit for Free Pascal, an object-oriented text editor engine with
|
||||
support for:
|
||||
- syntax highlighting
|
||||
- clipboard (cut, copy & paste)
|
||||
- undo/redo buffers
|
||||
- fully customizable behaviour
|
||||
- multiple views (editors) for a single document at a time
|
||||
- completely independent of any toolkit; it even can be used both in text and
|
||||
in graphics modes
|
||||
|
||||
|
||||
Architecture
|
||||
------------
|
||||
|
||||
There are three basic classes in SHEdit:
|
||||
- Document
|
||||
- Editor
|
||||
- Renderer
|
||||
|
||||
The document class (TTextDoc) in doc_text.pp is quite simple, it just
|
||||
stores a text (ASCII) document as a collection of strings.
|
||||
What you have to know about TTextDoc is that it stores a 32-bit value for
|
||||
each line, which it doesn't modify on its own. The lower 8 bits of these
|
||||
LineFlags are reserved for syntax highlighting (SH): The first bit determines
|
||||
if the other SH flags are valid; and the remaining 7 bits can be used to
|
||||
indicate SH states which do not end at the end of the line.
|
||||
|
||||
|
||||
The editor itself is encapsulated in the class TSHTextEdit (in unit shedit.pp).
|
||||
It can only work in conjunction with a renderer, which is responsible for
|
||||
displaying the document. When you create a TSHTextEdit, the constructor expects
|
||||
two arguments: The document to use, and the renderer to use.
|
||||
|
||||
The renderer itself is declared as an abstract interface class (i.e. all
|
||||
methods are 'virtual abstract'), this interface is called ISHRenderer.
|
||||
When you want to use SHEdit in your own programs, you will have to provide
|
||||
an implementation of the methods declared in ISHRenderer. There is a reference
|
||||
implementation for GTK, gtkdemo.
|
||||
|
||||
|
||||
Renderer interface
|
||||
------------------
|
||||
|
||||
This interface is quite simple; just note that SHEdit expects all corrdinates
|
||||
relative to the upper left corner of the document (0/0), and it uses the
|
||||
cell size (width and height) of the characters as base unit. For example,
|
||||
the coordinate X=3/Y=2 references the fourth character in the third line.
|
||||
|
||||
|
||||
procedure InvalidateLines(y1, y2: Integer);
|
||||
The renderer should initiate the redrawing of the lines between y1 and y2.
|
||||
It is recommended to use the Invalidate commands of the underlying graphics
|
||||
or windowing toolkit; but an implementation may choose to simply call
|
||||
TSHTextEdit.DrawContent.
|
||||
|
||||
procedure ClearRect(x1, y1, x2, y2: Integer);
|
||||
The renderer must clear the given rectangle in the background (whitespace)
|
||||
color.
|
||||
|
||||
procedure DrawTextLine(x1, x2, y: Integer; s: PChar);
|
||||
This is the most complex method: The renderer has to draw a complete line of
|
||||
text, which is given in "s". The vertical position is line "y", x1 and x2
|
||||
specify a horizontal clipping span.
|
||||
"s" has a very special format, as it contains highlighting tags:
|
||||
You can process "s" character by character, as usual. BUT when you encounter
|
||||
a special escape character (LF_Escape, defined in doc_text.pp) the renderer
|
||||
has to switch to the font style/color given in the following character. This
|
||||
character is just a index in the range ASCII #1..#255, the renderer must know
|
||||
himself what to do with this index. These highlighting tags are generated by
|
||||
a special highlighting function, see below.
|
||||
|
||||
procedure ShowCursor(x, y: Integer);
|
||||
procedure HideCursor(x, y: Integer);
|
||||
The cursor should be drawn or be hidden, its position is given in "x" and
|
||||
"y". SHEdit does its own reference counting, i.e. it won't call HideCursor
|
||||
for an already invisible cursor, and it won't call ShowCursor for a visible
|
||||
cursor. If the cursor position changes, SHEdit will call HideCursor with
|
||||
the old position and then ShowCursor with the new position as arguments.
|
||||
|
||||
function GetVertPos: Integer;
|
||||
This function shall return the vertical scrolling position of the window
|
||||
which is managed by the renderer.
|
||||
|
||||
procedure SetVertPos(y: Integer);
|
||||
Sets the vertical scrolling position.
|
||||
|
||||
function GetPageHeight: Integer;
|
||||
Gets the height of the visible part of the document.
|
||||
|
||||
procedure SetLineCount(count: Integer);
|
||||
SHEdit calls this method if the number of lines in the document has changed.
|
||||
|
||||
function GetClipboard: String;
|
||||
GetClipboard is called by SHEdit if the user wants to paste the contents of
|
||||
the clipboard into the document. GetClipboard must check if the system's
|
||||
clipboard contains valid text data and return it; if not, it has to return
|
||||
an empty string.
|
||||
|
||||
procedure SetClipboard(Content: String);
|
||||
This method is used to set the content of the clipboard after a
|
||||
"ClipboardCut" or "ClipboardCopy" action occured.
|
||||
|
||||
|
||||
|
||||
Highlighters and document type specific features
|
||||
------------------------------------------------
|
||||
|
||||
TSHTextEdit does not perform any syntax highlighting, and it always acts as a
|
||||
normal text editor without any fancy extra feature.
|
||||
This can easily be changed by deriving your own class from TSHTextEdit.
|
||||
Currently there are two special editor classes: TSHPasEdit (unit sh_pas.pp) and
|
||||
TSHXMLEdit (unit sh_xml.pp).
|
||||
|
||||
TSHPasEdit supports syntax highlighting for Pascal sources, and it adds auto
|
||||
indent facilities to SHEdit (currently, when you press the Enter key, it will
|
||||
add as many spaces as the previous line to the new created line).
|
||||
|
||||
TSHXMLEdit just adds syntax highlighting for XML and DTD documents.
|
||||
|
||||
Please note that currently there is no framework for handling with different
|
||||
kinds of documents. It is up to the program which wants to use SHEdit to
|
||||
determine which editor class to use.
|
||||
|
||||
|
||||
- Sebastian Guenther, sg@freepascal.org
|
Loading…
Reference in New Issue
Block a user