1 |
|
---|
2 | {ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
3 | º º
|
---|
4 | º Sibyl Portable Component Classes º
|
---|
5 | º º
|
---|
6 | º Copyright (C) 1995,97 SpeedSoft Germany, All rights reserved. º
|
---|
7 | º º
|
---|
8 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ}
|
---|
9 |
|
---|
10 | Unit Editors;
|
---|
11 |
|
---|
12 |
|
---|
13 | Interface
|
---|
14 |
|
---|
15 | {$IFDEF OS2}
|
---|
16 | Uses PmWin;
|
---|
17 | {$ENDIF}
|
---|
18 | {$IFDEF Win95}
|
---|
19 | Uses WinUser;
|
---|
20 | {$ENDIF}
|
---|
21 |
|
---|
22 | Uses Dos,SysUtils,Classes,Forms,StdCtrls,Dialogs;
|
---|
23 |
|
---|
24 |
|
---|
25 | Const
|
---|
26 | NormalChars : Set Of Char = ['0'..'9','A'..'Z','a'..'z','_',
|
---|
27 | '','','','','','','á'];
|
---|
28 | StringLength = 255;
|
---|
29 |
|
---|
30 | ciNormal = 0;
|
---|
31 | ciBookMark0 = 1;
|
---|
32 | ciBookMarkMask = 1 + 2 + 4 + 8;
|
---|
33 | ciSelected = 16;
|
---|
34 |
|
---|
35 | {codes For TColorArray}
|
---|
36 | fgcPlainText = 0;
|
---|
37 | bgcPlainText = 1;
|
---|
38 | fgcMarkedBlock = 2;
|
---|
39 | bgcMarkedBlock = 3;
|
---|
40 | fgcSearchMatch = 4;
|
---|
41 | bgcSearchMatch = 5;
|
---|
42 | fgcRightMargin = 6;
|
---|
43 |
|
---|
44 | kbPreCtrlK = kb_Ctrl + 8192;
|
---|
45 | kbPreCtrlQ = kb_Ctrl + 16384;
|
---|
46 | kbPreCtrlO = kb_Ctrl + 32768;
|
---|
47 | kbPreCtrlU = kb_Ctrl + 65536;
|
---|
48 |
|
---|
49 | {Ctrl-K codes}
|
---|
50 | kbCtrlKA = kbPreCtrlK + kb_Char + kbA;
|
---|
51 | kbCtrlKB = kbPreCtrlK + kb_Char + kbB;
|
---|
52 | kbCtrlKC = kbPreCtrlK + kb_Char + kbC;
|
---|
53 | kbCtrlKD = kbPreCtrlK + kb_Char + kbD;
|
---|
54 | kbCtrlKE = kbPreCtrlK + kb_Char + kbE;
|
---|
55 | kbCtrlKF = kbPreCtrlK + kb_Char + kbF;
|
---|
56 | kbCtrlKG = kbPreCtrlK + kb_Char + kbG;
|
---|
57 | kbCtrlKH = kbPreCtrlK + kb_Char + kbH;
|
---|
58 | kbCtrlKI = kbPreCtrlK + kb_Char + kbI;
|
---|
59 | kbCtrlKJ = kbPreCtrlK + kb_Char + kbJ;
|
---|
60 | kbCtrlKK = kbPreCtrlK + kb_Char + kbK;
|
---|
61 | kbCtrlKL = kbPreCtrlK + kb_Char + kbL;
|
---|
62 | kbCtrlKM = kbPreCtrlK + kb_Char + kbM;
|
---|
63 | kbCtrlKN = kbPreCtrlK + kb_Char + kbN;
|
---|
64 | kbCtrlKO = kbPreCtrlK + kb_Char + kbO;
|
---|
65 | kbCtrlKP = kbPreCtrlK + kb_Char + kbP;
|
---|
66 | kbCtrlKQ = kbPreCtrlK + kb_Char + kbQ;
|
---|
67 | kbCtrlKR = kbPreCtrlK + kb_Char + kbR;
|
---|
68 | kbCtrlKS = kbPreCtrlK + kb_Char + kbS;
|
---|
69 | kbCtrlKT = kbPreCtrlK + kb_Char + kbT;
|
---|
70 | kbCtrlKU = kbPreCtrlK + kb_Char + kbU;
|
---|
71 | kbCtrlKV = kbPreCtrlK + kb_Char + kbV;
|
---|
72 | kbCtrlKW = kbPreCtrlK + kb_Char + kbW;
|
---|
73 | kbCtrlKX = kbPreCtrlK + kb_Char + kbX;
|
---|
74 | kbCtrlKY = kbPreCtrlK + kb_Char + kbY;
|
---|
75 | kbCtrlKZ = kbPreCtrlK + kb_Char + kbZ;
|
---|
76 |
|
---|
77 | {Ctrl-Q codes}
|
---|
78 | kbCtrlQA = kbPreCtrlQ + kb_Char + kbA;
|
---|
79 | kbCtrlQB = kbPreCtrlQ + kb_Char + kbB;
|
---|
80 | kbCtrlQC = kbPreCtrlQ + kb_Char + kbC;
|
---|
81 | kbCtrlQD = kbPreCtrlQ + kb_Char + kbD;
|
---|
82 | kbCtrlQE = kbPreCtrlQ + kb_Char + kbE;
|
---|
83 | kbCtrlQF = kbPreCtrlQ + kb_Char + kbF;
|
---|
84 | kbCtrlQG = kbPreCtrlQ + kb_Char + kbG;
|
---|
85 | kbCtrlQH = kbPreCtrlQ + kb_Char + kbH;
|
---|
86 | kbCtrlQI = kbPreCtrlQ + kb_Char + kbI;
|
---|
87 | kbCtrlQJ = kbPreCtrlQ + kb_Char + kbJ;
|
---|
88 | kbCtrlQK = kbPreCtrlQ + kb_Char + kbK;
|
---|
89 | kbCtrlQL = kbPreCtrlQ + kb_Char + kbL;
|
---|
90 | kbCtrlQM = kbPreCtrlQ + kb_Char + kbM;
|
---|
91 | kbCtrlQN = kbPreCtrlQ + kb_Char + kbN;
|
---|
92 | kbCtrlQO = kbPreCtrlQ + kb_Char + kbO;
|
---|
93 | kbCtrlQP = kbPreCtrlQ + kb_Char + kbP;
|
---|
94 | kbCtrlQQ = kbPreCtrlQ + kb_Char + kbQ;
|
---|
95 | kbCtrlQR = kbPreCtrlQ + kb_Char + kbR;
|
---|
96 | kbCtrlQS = kbPreCtrlQ + kb_Char + kbS;
|
---|
97 | kbCtrlQT = kbPreCtrlQ + kb_Char + kbT;
|
---|
98 | kbCtrlQU = kbPreCtrlQ + kb_Char + kbU;
|
---|
99 | kbCtrlQV = kbPreCtrlQ + kb_Char + kbV;
|
---|
100 | kbCtrlQW = kbPreCtrlQ + kb_Char + kbW;
|
---|
101 | kbCtrlQX = kbPreCtrlQ + kb_Char + kbX;
|
---|
102 | kbCtrlQY = kbPreCtrlQ + kb_Char + kbY;
|
---|
103 | kbCtrlQZ = kbPreCtrlQ + kb_Char + kbZ;
|
---|
104 |
|
---|
105 | kbCtrlShiftP = kb_Ctrl + kb_Shift + kb_Char + 80;
|
---|
106 | kbCtrlShiftR = kb_Ctrl + kb_Shift + kb_Char + 82;
|
---|
107 | kbCtrlShiftS = kb_Ctrl + kb_Shift + kb_Char + 83;
|
---|
108 | kbCtrlShiftI = kb_Ctrl + kb_Shift + kb_Char + 73;
|
---|
109 | kbCtrlShiftU = kb_Ctrl + kb_Shift + kb_Char + 85;
|
---|
110 | kbCtrlShiftY = kb_Ctrl + kb_Shift + kb_Char + 89;
|
---|
111 | kbCtrlShiftZ = kb_Ctrl + kb_Shift + kb_Char + 90;
|
---|
112 | kbCtrlSlash = kb_Ctrl + kb_Shift + kb_Char + 47;
|
---|
113 | kbCtrlBackSlash = kb_Ctrl + kb_Shift + kb_Char + 92;
|
---|
114 |
|
---|
115 | kbCtrlShiftCLeft = kb_Ctrl + kb_Shift + kbCLeft;
|
---|
116 | kbCtrlShiftCRight = kb_Ctrl + kb_Shift + kbCRight;
|
---|
117 | kbCtrlShiftHome = kb_Ctrl + kb_Shift + kbHome;
|
---|
118 | kbCtrlShiftEnd = kb_Ctrl + kb_Shift + kbEnd;
|
---|
119 | kbCtrlShiftPageUp = kb_Ctrl + kb_Shift + kbPageUp;
|
---|
120 | kbCtrlShiftPageDown = kb_Ctrl + kb_Shift + kbPageDown;
|
---|
121 |
|
---|
122 | kbCtrlAltShiftCLeft = kb_Ctrl + kb_Alt + kb_Shift + kbCLeft;
|
---|
123 | kbCtrlAltShiftCRight= kb_Ctrl + kb_Alt + kb_Shift + kbCRight;
|
---|
124 | kbCtrlAltShiftHome = kb_Ctrl + kb_Alt + kb_Shift + kbHome;
|
---|
125 | kbCtrlAltShiftEnd = kb_Ctrl + kb_Alt + kb_Shift + kbEnd;
|
---|
126 | kbCtrlAltShiftPageUp= kb_Ctrl + kb_Alt + kb_Shift + kbPageUp;
|
---|
127 | kbCtrlAltShiftPageDown = kb_Ctrl + kb_Alt + kb_Shift + kbPageDown;
|
---|
128 |
|
---|
129 | kbAltShiftBkSp = kb_Alt + kb_Shift + kbBkSp;
|
---|
130 | kbAltShiftCLeft = kb_Alt + kb_Shift + kbCLeft;
|
---|
131 | kbAltShiftCRight = kb_Alt + kb_Shift + kbCRight;
|
---|
132 | kbAltShiftCUp = kb_Alt + kb_Shift + kbCUp;
|
---|
133 | kbAltShiftCDown = kb_Alt + kb_Shift + kbCDown;
|
---|
134 | kbAltShiftPageUp = kb_Alt + kb_Shift + kbPageUp;
|
---|
135 | kbAltShiftPageDown = kb_Alt + kb_Shift + kbPageDown;
|
---|
136 | kbAltShiftHome = kb_Alt + kb_Shift + kbHome;
|
---|
137 | kbAltShiftEnd = kb_Alt + kb_Shift + kbEnd;
|
---|
138 |
|
---|
139 | kbCtrlOC = kbPreCtrlO + kb_Char + kbC;
|
---|
140 | kbCtrlOK = kbPreCtrlO + kb_Char + kbK;
|
---|
141 | kbCtrlOU = kbPreCtrlO + kb_Char + kbU;
|
---|
142 | kbCtrlK0 = kbPreCtrlK + kb_Char + kb0;
|
---|
143 | kbCtrlK9 = kbPreCtrlK + kb_Char + kb9;
|
---|
144 | kbCtrlQ0 = kbPreCtrlQ + kb_Char + kb0;
|
---|
145 | kbCtrlQ9 = kbPreCtrlQ + kb_Char + kb9;
|
---|
146 | kbCtrlU0 = kbPreCtrlU + kb_Char + kb0;
|
---|
147 | kbCtrlU9 = kbPreCtrlU + kb_Char + kb9;
|
---|
148 | kbCtrlUU = kbPreCtrlU + kb_Char + kbU;
|
---|
149 |
|
---|
150 |
|
---|
151 | Type
|
---|
152 | PLine=^TLine;
|
---|
153 | TLine=Record
|
---|
154 | Prev: PLine;
|
---|
155 | zk: PString;
|
---|
156 | flag: LongWord;
|
---|
157 | Add: LongWord;
|
---|
158 | Next: PLine;
|
---|
159 | End;
|
---|
160 |
|
---|
161 | TColorTable=Array[0..255] Of TColor;
|
---|
162 |
|
---|
163 | TColorIndex=Record
|
---|
164 | Fgc: Byte;
|
---|
165 | Bgc: Byte;
|
---|
166 | End;
|
---|
167 |
|
---|
168 | TColorArray=Array[1..StringLength] Of TColorIndex;
|
---|
169 |
|
---|
170 | TEditorPos=Record
|
---|
171 | Y: LongInt;
|
---|
172 | X: Integer;
|
---|
173 | End;
|
---|
174 |
|
---|
175 | TLineX=Record
|
---|
176 | Line: PLine;
|
---|
177 | X: Integer;
|
---|
178 | End;
|
---|
179 |
|
---|
180 | TICB=Record {internal Clipboard}
|
---|
181 | First: TLineX;
|
---|
182 | Last: TLineX;
|
---|
183 | End;
|
---|
184 |
|
---|
185 | TUndoGroup=(ugNoGroup,ugGroup,ugCursorMove,
|
---|
186 | ugInsertChar,ugOverwriteChar,ugDeleteChar,ugBackspaceChar,
|
---|
187 | ugDeleteActLine,ugDeleteRightWord,ugBlockLeft,ugBlockRight,
|
---|
188 | ugBreakLine,ugEnter,ugTabulator,
|
---|
189 | ugInsertLine,ugDeleteLine,ugReplaceLine);
|
---|
190 |
|
---|
191 | PUndo=^TUndo;
|
---|
192 | TUndo=Record
|
---|
193 | Memory: Boolean;
|
---|
194 | EventType: TUndoGroup;
|
---|
195 | Modified: Boolean;
|
---|
196 | ICBFL: LongInt;
|
---|
197 | ICBFX: Integer;
|
---|
198 | ICBLL: LongInt;
|
---|
199 | ICBLX: Integer;
|
---|
200 | FFileCursor: TEditorPos;
|
---|
201 | FrameBegin: LongInt;
|
---|
202 | FrameEnd: LongInt;
|
---|
203 | FirstUndoLine: PLine;
|
---|
204 | LastUndoLine: PLine;
|
---|
205 | Lines: LongInt;
|
---|
206 | End;
|
---|
207 |
|
---|
208 | {$M+}
|
---|
209 | TEditOpt=Set Of (eoCreateBackups,eoAppendBAK,eoAutoIndent,
|
---|
210 | eoUnindent,eoUndoGroups,eoCursorClimb,
|
---|
211 | eoPersistentBlocks,eoOverwriteBlock,
|
---|
212 | eoAutoSave,eo2ClickLine,eoSmartTabs,eoHomeFirstWord);
|
---|
213 |
|
---|
214 | TKeystrokeMap=(kmWordStar,kmCUA,kmDefault);
|
---|
215 | {$M-}
|
---|
216 |
|
---|
217 | TCursorShape=(csUnderline,csVertical);
|
---|
218 |
|
---|
219 | TSelectMode=(smNonInclusiveBlock,smColumnBlock);
|
---|
220 |
|
---|
221 | TICBPosition=Set Of (ipBeforeICBFirst,ipAfterICBFirst,ipWithinICB,
|
---|
222 | ipBeforeICBLast,ipAfterICBLast);
|
---|
223 |
|
---|
224 | TFindAction=(faNothing,faFind,faReplace,faIncSearch);
|
---|
225 |
|
---|
226 | TFindReplace=Record
|
---|
227 | Find: String;
|
---|
228 | replace: String;
|
---|
229 | Direction: TFindDirection;
|
---|
230 | Origin: TFindOrigin;
|
---|
231 | Scope: TFindScope;
|
---|
232 | Options: TFindOptions;
|
---|
233 | Confirm: Boolean;
|
---|
234 | replall: Boolean;
|
---|
235 | End;
|
---|
236 |
|
---|
237 |
|
---|
238 | TEditor=Class(TForm)
|
---|
239 | Private
|
---|
240 | FCaret: TCaret;
|
---|
241 | FOldCaption: String;
|
---|
242 | FKeyMap: TKeystrokeMap;
|
---|
243 | FInsertMode: Boolean;
|
---|
244 | FReadOnly: Boolean;
|
---|
245 | FModified: Boolean;
|
---|
246 | FUntitled: Boolean;
|
---|
247 | FEditOpt: TEditOpt;
|
---|
248 | FTabSize: Integer;
|
---|
249 | FCountLines: LongInt;
|
---|
250 | FBottomScrollBar: TScrollBar;
|
---|
251 | FRightScrollBar: TScrollBar;
|
---|
252 | ClientArea: TRect;
|
---|
253 | IgnoreRedraw: Integer;
|
---|
254 | FWinSize: TPoint;
|
---|
255 | FFileCursor: TEditorPos;
|
---|
256 | FScrCursor: TEditorPos;
|
---|
257 | FFirstLine: PLine;
|
---|
258 | FLastLine: PLine;
|
---|
259 | FActLine: PLine;
|
---|
260 | FTopScreenLine: PLine;
|
---|
261 | WLactivated: Boolean;
|
---|
262 | FWorkLine: String;
|
---|
263 | ICB: TICB;
|
---|
264 | ICBVisible: Boolean;
|
---|
265 | MaxUndo: LongInt;
|
---|
266 | KeyRepeat: Integer;
|
---|
267 | FPreCtrl: TKeyCode;
|
---|
268 | BookMarkX: Array[1..10] Of Integer;
|
---|
269 | HadFocus: Integer;
|
---|
270 | IncSearchList: TList;
|
---|
271 | IncSearchText: String;
|
---|
272 | FindICB: TICB;
|
---|
273 | fMask: String;
|
---|
274 | FSelColor: TColor;
|
---|
275 | FSelBackColor: TColor;
|
---|
276 | FFoundColor: TColor;
|
---|
277 | FFoundBackColor: TColor;
|
---|
278 | FWrapLineColor: TColor;
|
---|
279 | FSaveEvents: Integer;
|
---|
280 | FEventsCounter: Integer;
|
---|
281 | WrapLineX: Integer;
|
---|
282 | ScrOffsX: Integer;
|
---|
283 | FFileName: String;
|
---|
284 | FMacroList: TList;
|
---|
285 | FRecording: Boolean;
|
---|
286 | FPlaying: Boolean;
|
---|
287 | FCursorShape: TCursorShape;
|
---|
288 | FSelectMode: TSelectMode;
|
---|
289 | FWordWrap: Boolean;
|
---|
290 | FWordWrapColumn: Integer;
|
---|
291 | FFindReplace: TFindReplace;
|
---|
292 | FLastFind: TFindAction;
|
---|
293 | FBorderWidth: LongInt;
|
---|
294 | FCtl3D: Boolean;
|
---|
295 | FUndoList: TList;
|
---|
296 | FRedoList: TList;
|
---|
297 | FTempFileName: String;
|
---|
298 | FDragRect: TRect;
|
---|
299 | IsDBCSFont: Boolean;
|
---|
300 | Procedure CalcSizes;
|
---|
301 | Procedure SetFont(NewFont:TFont);Override;
|
---|
302 | Procedure SetCtl3D(Value:Boolean);
|
---|
303 | Procedure SetKeyMap(km:TKeystrokeMap);
|
---|
304 | Procedure SetInsertMode(im:Boolean);
|
---|
305 | Procedure ToggleInsertMode;
|
---|
306 | Procedure SetEditOpt(eo:TEditOpt);
|
---|
307 | Procedure SetTabSize(ts:Integer);
|
---|
308 | Procedure SetSaveEvents(cnt:Integer);
|
---|
309 | Procedure SetLastUndoGroup(ug:TUndoGroup);
|
---|
310 | Function GetLastUndoGroup:TUndoGroup;
|
---|
311 | Procedure SetCursorShape(CS:TCursorShape);
|
---|
312 | Procedure SetSelectMode(sm:TSelectMode);
|
---|
313 | Procedure SetWordWrap(Wrap:Boolean);
|
---|
314 | Procedure SetWordWrapColumn(Column:Integer);
|
---|
315 | Function GetUndoCount:LongInt;
|
---|
316 | Function GetRedoCount:LongInt;
|
---|
317 | {basic structure}
|
---|
318 | Function _Index2PLine(Y:LongInt):PLine;
|
---|
319 | Function _PLine2Index(pl:PLine):LongInt;
|
---|
320 | Function _PLine2PString(pl:PLine):PString;
|
---|
321 | Function _Connect(pl1,pl2:PLine):Boolean;
|
---|
322 | Function _CountLines(pl1,pl2:PLine):LongInt;
|
---|
323 | {Undo/Redo}
|
---|
324 | Function _CountUndoLines(FirstL,LastL:PLine):LongInt;
|
---|
325 | Procedure _StoreUndoCursor(List:TList);
|
---|
326 | Function _CopyUndoLines(FirstL,LastL:PLine):LongInt;
|
---|
327 | Function _MoveUndoLines(List:TList;FirstL,LastL:PLine):LongInt;
|
---|
328 | Procedure _CreateUndoEvent(List:TList;U:PUndo);
|
---|
329 | Procedure _UpdateLastUndoEvent(List:TList;Index:LongInt);
|
---|
330 | Procedure _FreeUndoEvent(List:TObject;Item:Pointer);
|
---|
331 | Procedure _SetMaxUndo(cnt:LongInt);
|
---|
332 | {WorkLine Manipulation}
|
---|
333 | Procedure _ReadWorkLine;
|
---|
334 | Procedure _WriteWorkLine;
|
---|
335 | Function _WriteString(X:Integer; S:String):Boolean;
|
---|
336 | Function _InsertString(X:Integer; S:String):Boolean;
|
---|
337 | Function _DeleteString(X,CX:Integer):Boolean;
|
---|
338 | Function _ReadString(pl:PLine; X,CX:Integer):String;
|
---|
339 | Procedure _Set(Y:LongInt;Const S:String);
|
---|
340 | Function _Get(Y:LongInt):String;
|
---|
341 | Function _FindBookMark(I:Byte):PLine;
|
---|
342 | Function _FindNextTab(pl:PLine; X:Integer):Integer;
|
---|
343 | {Insert/Delete Lines}
|
---|
344 | Function _InsertLine(pl:PLine):PLine;
|
---|
345 | Function _DeleteLine(pl:PLine):PLine;
|
---|
346 | {Text block operations}
|
---|
347 | Function _GetFileText(S:String; Var P:Pointer; Var len:LongInt):Boolean;
|
---|
348 | Function _GetEditorText(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
349 | Function _GetEditorBlock(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
350 | Function _InsertText(P:Pointer; len:LongInt; marknew:Boolean):TLineX;
|
---|
351 | {Caret Movement}
|
---|
352 | Function _HorizMove:Boolean;
|
---|
353 | Function _GotoPosition(P:TEditorPos):Boolean;
|
---|
354 | Function _CursorDown:Boolean;
|
---|
355 | Function _CursorUp:Boolean;
|
---|
356 | Function _CursorRight:Boolean;
|
---|
357 | Function _CursorLeft:Boolean;
|
---|
358 | Function _CursorHome:Boolean;
|
---|
359 | Function _CursorEnd:Boolean;
|
---|
360 | Function _CursorPageDown:Boolean;
|
---|
361 | Function _CursorPageUp:Boolean;
|
---|
362 | Function _CursorRollUp:Boolean;
|
---|
363 | Function _CursorRollDown:Boolean;
|
---|
364 | Function _CursorWordRight:Boolean;
|
---|
365 | Function _CursorWordLeft:Boolean;
|
---|
366 | {Selection}
|
---|
367 | Function _ICBExist:Boolean;
|
---|
368 | Function _ICBPersistent:Boolean;
|
---|
369 | Function _ICBOverwrite:Boolean;
|
---|
370 | Function _ICBClearICB:Boolean;
|
---|
371 | Function _ICBClearMark:Boolean;
|
---|
372 | Function _ICBSetMark:Boolean;
|
---|
373 | Function _ICBDeleteICB:Boolean;
|
---|
374 | Procedure _ICBCheckX;
|
---|
375 | Procedure _ICBSetBegin(pl:PLine; X:Integer);
|
---|
376 | Procedure _ICBSetEnd(pl:PLine; X:Integer);
|
---|
377 | Function _ICBPos(pl:PLine; X:Integer):TICBPosition;
|
---|
378 | {Extend Selection}
|
---|
379 | Function _ICBActPos:TLineX;
|
---|
380 | Function _ICBExtSetICB:Boolean;
|
---|
381 | Function _ICBExtCorrectICB:Boolean;
|
---|
382 | Function _ICBExtCorrectICB2:Boolean;
|
---|
383 | Function _ICBTestIEW(Var y1,y2:Integer):Boolean;
|
---|
384 | {Clipboard}
|
---|
385 | Function _SetClipBoardText(P:Pointer; len:LongInt):Boolean;
|
---|
386 | Function _GetClipBoardText(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
387 | Protected
|
---|
388 | IndentRect: TRect;
|
---|
389 | Procedure SetupComponent;Override;
|
---|
390 | Procedure SetupShow;Override;
|
---|
391 | Function CloseQuery:Boolean;Override;
|
---|
392 | Procedure CharEvent(Var key:Char;RepeatCount:Byte);Override;
|
---|
393 | Procedure ScanEvent(Var KeyCode:TKeyCode;RepeatCount:Byte);Override;
|
---|
394 | Procedure SetFocus;Override;
|
---|
395 | Procedure KillFocus;Override;
|
---|
396 | Procedure Resize;Override;
|
---|
397 | Procedure MouseDown(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);Override;
|
---|
398 | Procedure MouseUp(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);Override;
|
---|
399 | Procedure MouseMove(ShiftState:TShiftState;X,Y:LongInt);Override;
|
---|
400 | Procedure MouseDblClick(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);Override;
|
---|
401 | Procedure Scroll(Sender:TScrollBar;ScrollCode:TScrollCode;Var ScrollPos:LongInt);Override;
|
---|
402 | Procedure CanDrag(X,Y:LongInt;Var Accept:Boolean);Override;
|
---|
403 | Procedure DoStartDrag(Var DragData:TDragDropData);Override;
|
---|
404 | Procedure DoEndDrag(target:TObject; X,Y:LongInt);Override;
|
---|
405 | Procedure DragOver(Source:TObject;X,Y:LongInt;State:TDragState;Var Accept:Boolean);Override;
|
---|
406 | Procedure SetSliderValues;
|
---|
407 | Procedure SetSliderPosition;
|
---|
408 | Procedure FlushWorkLine;
|
---|
409 | Function GetCursorFromMouse(pt:TPoint):TEditorPos;
|
---|
410 | Function GetMouseFromCursor(Pos:TEditorPos):TPoint;
|
---|
411 | {Caret Movement}
|
---|
412 | Procedure cmCursorDown;
|
---|
413 | Procedure cmCursorUp;
|
---|
414 | Procedure cmCursorRight;
|
---|
415 | Procedure cmCursorLeft;
|
---|
416 | Procedure cmCursorHome;
|
---|
417 | Procedure cmCursorEnd;
|
---|
418 | Procedure cmCursorPageDown;
|
---|
419 | Procedure cmCursorPageUp;
|
---|
420 | Procedure cmCursorRollUp;
|
---|
421 | Procedure cmCursorRollDown;
|
---|
422 | Procedure cmCursorWordRight;
|
---|
423 | Procedure cmCursorWordLeft;
|
---|
424 | Procedure cmCursorFileBegin;
|
---|
425 | Procedure cmCursorFileEnd;
|
---|
426 | Procedure cmCursorPageHome;
|
---|
427 | Procedure cmCursorPageEnd;
|
---|
428 | {Selection}
|
---|
429 | Procedure cmICBExtLeft;
|
---|
430 | Procedure cmICBExtRight;
|
---|
431 | Procedure cmICBExtUp;
|
---|
432 | Procedure cmICBExtDown;
|
---|
433 | Procedure cmICBExtPageUp;
|
---|
434 | Procedure cmICBExtPageDown;
|
---|
435 | Procedure cmICBExtHome;
|
---|
436 | Procedure cmICBExtEnd;
|
---|
437 | Procedure cmICBExtWordLeft;
|
---|
438 | Procedure cmICBExtWordRight;
|
---|
439 | Procedure cmICBExtFileBegin;
|
---|
440 | Procedure cmICBExtFileEnd;
|
---|
441 | Procedure cmICBExtPageBegin;
|
---|
442 | Procedure cmICBExtPageEnd;
|
---|
443 | {ICB edit}
|
---|
444 | Procedure cmICBReadBlock;Virtual;
|
---|
445 | Procedure cmICBWriteBlock;Virtual;
|
---|
446 | Procedure cmICBMoveLeft;Virtual;
|
---|
447 | Procedure cmICBMoveRight;Virtual;
|
---|
448 | Procedure cmICBCopyBlock;Virtual;
|
---|
449 | Procedure cmICBMoveBlock;Virtual;
|
---|
450 | Procedure cmICBDeleteBlock;Virtual;
|
---|
451 | Procedure cmICBUpcaseBlock;Virtual;
|
---|
452 | Procedure cmICBLowcaseBlock;Virtual;
|
---|
453 | Procedure cmICBUpcaseWord;Virtual;
|
---|
454 | Procedure cmICBLowcaseWord;Virtual;
|
---|
455 | Procedure cmToggleCase;Virtual;
|
---|
456 | {edit}
|
---|
457 | Procedure cmBreakLine;Virtual;
|
---|
458 | Procedure cmDeleteLine;Virtual;
|
---|
459 | Procedure cmDeleteLineEnd;Virtual;
|
---|
460 | Procedure cmDeleteRightWord;Virtual;
|
---|
461 | Procedure cmDeleteLeftWord;Virtual;
|
---|
462 | Procedure cmTabulator;Virtual;
|
---|
463 | Procedure cmPrevTabulator;Virtual;
|
---|
464 | Procedure cmDeleteChar;Virtual;
|
---|
465 | Procedure cmBackSpace;Virtual;
|
---|
466 | Procedure cmEnter;Virtual;
|
---|
467 | Procedure cmFindText;Virtual;
|
---|
468 | Procedure cmReplaceText;Virtual;
|
---|
469 | Procedure cmSearchTextAgain;Virtual;
|
---|
470 | Procedure cmIncrementalSearch;Virtual;
|
---|
471 | Procedure cmRecordMacro;Virtual;
|
---|
472 | Procedure cmPlayMacro;Virtual;
|
---|
473 | {overwrite This Methods For personal Use}
|
---|
474 | Function GetReadOnly:Boolean;Virtual;
|
---|
475 | Procedure SetReadOnly(Value:Boolean);Virtual;
|
---|
476 | Procedure SetModified(Value:Boolean);Virtual;
|
---|
477 | Procedure UpdateEditorState;Virtual;
|
---|
478 | Procedure SetStateMessage(Const S:String);Virtual;
|
---|
479 | Procedure SetErrorMessage(Const S:String);Virtual;
|
---|
480 | Function SetQueryMessage(Const S:String;Typ:TMsgDlgType;Buttons:TMsgDlgButtons):TMsgDlgReturn;Virtual;
|
---|
481 | Function SetReplaceConfirmMessage:TMsgDlgReturn;Virtual;
|
---|
482 | Function UpdateLineColorFlag(pl:PLine):Boolean;Virtual;
|
---|
483 | Procedure SetLineColorFlag(pl1,pl2:PLine);Virtual;
|
---|
484 | Procedure CalcLineColor(pl:PLine;Var LineColor:TColorArray);Virtual;
|
---|
485 | Procedure InvalidateScreenLine(ScrY:Integer);Virtual;
|
---|
486 | Procedure InvalidateWorkLine;Virtual;
|
---|
487 | Procedure InvalidateEditor(y1,y2:Integer);Virtual;
|
---|
488 | Procedure SetScreenCursor;Virtual;
|
---|
489 | Function QueryConvertPos(Var Pos:TPoint):Boolean;Override;
|
---|
490 | Procedure SetIncSearchText(S:String);Virtual;
|
---|
491 | Function TestSaveAsName(Const FName:String):TMsgDlgReturn;Virtual;
|
---|
492 | Procedure FileNameChange(Const OldName,NewName:String);Virtual;
|
---|
493 | Procedure TestAutoSave;Virtual;
|
---|
494 | Procedure SetFileName(Const FName:String);Virtual;
|
---|
495 | Procedure SetAvailabeFileTypes(CFOD:TOpenDialog);Virtual;
|
---|
496 | Function EmulateWordStar(Var KeyCode,PreControl:TKeyCode):Boolean;Virtual;
|
---|
497 | Function EmulateCUA(Var KeyCode,PreControl:TKeyCode):Boolean;Virtual;
|
---|
498 | Function EmulateDefault(Var KeyCode,PreControl:TKeyCode):Boolean;Virtual;
|
---|
499 | Procedure SetColorEntry(ColorIndex:Integer;NewColor:TColor);Virtual;
|
---|
500 | Function GetColorEntry(ColorIndex:Integer):TColor;Virtual;
|
---|
501 | Property FirstLine:PLine Read FFirstLine;
|
---|
502 | Property LastLine:PLine Read FLastLine;
|
---|
503 | Property ActLine:PLine Read FActLine;
|
---|
504 | Property TopScreenLine:PLine Read FTopScreenLine;
|
---|
505 | Property indices[pl:PLine]:LongInt Read _PLine2Index;
|
---|
506 | Property PLines[Index:LongInt]:PLine Read _Index2PLine;
|
---|
507 | Property PStrings[pl:PLine]:PString Read _PLine2PString;
|
---|
508 | Property LastUndoGroup:TUndoGroup Read GetLastUndoGroup Write SetLastUndoGroup;
|
---|
509 | Property MacroList:TList Read FMacroList Write FMacroList;
|
---|
510 | Property MacroRecording:Boolean Read FRecording;
|
---|
511 | Property MacroPlaying:Boolean Read FPlaying;
|
---|
512 | Property LastFind:TFindAction Read FLastFind Write FLastFind;
|
---|
513 | Public
|
---|
514 | Destructor Destroy;Override;
|
---|
515 | Procedure BeginUpdate;
|
---|
516 | Procedure EndUpdate;
|
---|
517 | Procedure DragDrop(Source:TObject;X,Y:LongInt);Override;
|
---|
518 | Procedure Redraw(Const rc:TRect);Override;
|
---|
519 | Function LoadFromFile(Const FName:String):Boolean;Virtual;
|
---|
520 | Function SaveToFile(Const FName:String):Boolean;Virtual;
|
---|
521 | Function LoadFromStream(Stream:TStream):Boolean;
|
---|
522 | Function SaveToStream(Stream:TStream):Boolean;
|
---|
523 | Function SaveFile:Boolean;Virtual;
|
---|
524 | Function SaveFileAs(Const FName:String):Boolean;Virtual;
|
---|
525 | Function InsertLine(Y:LongInt;Const S:String):LongInt;
|
---|
526 | Function DeleteLine(Y:LongInt):LongInt;
|
---|
527 | Function AppendLine(Const S:String):LongInt;
|
---|
528 | Function ReplaceLine(Y:LongInt;Const S:String):LongInt;
|
---|
529 | Procedure SetSelectionStart(P:TEditorPos);
|
---|
530 | Procedure SetSelectionEnd(P:TEditorPos);
|
---|
531 | Function GetSelectionStart(Var P:TEditorPos):Boolean;
|
---|
532 | Function GetSelectionEnd(Var P:TEditorPos):Boolean;
|
---|
533 | Procedure SelectLine(P:TEditorPos);
|
---|
534 | Procedure SelectWord(P:TEditorPos);
|
---|
535 | Procedure SelectAll;
|
---|
536 | Procedure DeselectAll;
|
---|
537 | Procedure HideSelection;
|
---|
538 | Procedure ShowSelection;
|
---|
539 | Procedure DeleteSelection;
|
---|
540 | Procedure GotoPosition(Pos:TEditorPos);
|
---|
541 | Function SetBookMark(I:Byte; P:TEditorPos):Boolean;
|
---|
542 | Function GetBookMark(I:Byte;Var P:TEditorPos):Boolean;
|
---|
543 | Function GotoBookMark(I:Byte):Boolean;
|
---|
544 | Function ClearBookMark(I:Byte):Boolean;
|
---|
545 | Function ClearAllBookMarks:Boolean;
|
---|
546 | Function GetChar(P:TEditorPos):Char;
|
---|
547 | Function GetWord(P:TEditorPos):String;
|
---|
548 | Function GetTextAfterWord(P:TEditorPos):String;
|
---|
549 | Function GetPartialText(p1,p2:TEditorPos;Var P:Pointer; Var len:LongInt):Boolean;
|
---|
550 | Function GetText(Var P:Pointer; Var len:LongInt; Selected:Boolean):Boolean;
|
---|
551 | Procedure InsertText(P:Pointer; len:LongInt);
|
---|
552 | Function FindTextPos(Find:String; direct:TFindDirection; Origin:TFindOrigin;
|
---|
553 | Scope:TFindScope; opt:TFindOptions; Var pt:TEditorPos):Boolean;
|
---|
554 | Function FindText(Const Find:String; direct:TFindDirection; Origin:TFindOrigin;
|
---|
555 | Scope:TFindScope; opt:TFindOptions):Boolean;
|
---|
556 | Function ReplaceText(Const Find,replace:String; direct:TFindDirection;
|
---|
557 | Origin:TFindOrigin;Scope:TFindScope;opt:TFindOptions;
|
---|
558 | Confirm:Boolean;replaceall:Boolean):Boolean;
|
---|
559 | Procedure Undo;
|
---|
560 | Procedure Redo;
|
---|
561 | Procedure ClearUndo;
|
---|
562 | Procedure ClearRedo;
|
---|
563 | Procedure CutToClipBoard;Virtual;
|
---|
564 | Procedure CopyToClipboard;Virtual;
|
---|
565 | Function PasteFromClipBoard:Boolean;Virtual;
|
---|
566 | Function InsertFromFile(Const FName:String):Boolean;Virtual;
|
---|
567 | Procedure SearchTextAgain;
|
---|
568 | Procedure FindTextDlg;
|
---|
569 | Procedure ReplaceTextDlg;
|
---|
570 | Property FileName:String Read FFileName Write SetFileName;
|
---|
571 | Property CountLines:LongInt Read FCountLines;
|
---|
572 | Property Lines[Index:LongInt]:String Read _Get Write _Set; Default;
|
---|
573 | Property CursorPos:TEditorPos Read FFileCursor Write GotoPosition;
|
---|
574 | Property OffsetPos:TEditorPos Read FScrCursor;
|
---|
575 | Property MaxUndoEvents:LongInt Read MaxUndo Write _SetMaxUndo;
|
---|
576 | Property UndoCount:LongInt Read GetUndoCount;
|
---|
577 | Property RedoCount:LongInt Read GetRedoCount;
|
---|
578 | Property AutoSaveEvents:Integer Read FSaveEvents Write SetSaveEvents;
|
---|
579 | Property BottomScrollBar:TScrollBar Read FBottomScrollBar Write FBottomScrollBar;
|
---|
580 | Property RightScrollBar:TScrollBar Read FRightScrollBar Write FRightScrollBar;
|
---|
581 | Property Mask:String Read fMask Write fMask;
|
---|
582 | Property Selected:Boolean Read _ICBExist;
|
---|
583 | Property Columns:LongInt Read FWinSize.X;
|
---|
584 | Property Rows:LongInt Read FWinSize.Y;
|
---|
585 | Property ColorEntry[ColorIndex:Integer]:TColor Read GetColorEntry Write SetColorEntry;
|
---|
586 | Property CursorShape:TCursorShape Read FCursorShape Write SetCursorShape;
|
---|
587 | Property SelectMode:TSelectMode Read FSelectMode Write SetSelectMode;
|
---|
588 | Property WordWrap:Boolean Read FWordWrap Write SetWordWrap;
|
---|
589 | Property WordWrapColumn:Integer Read FWordWrapColumn Write SetWordWrapColumn;
|
---|
590 | Property InsertMode:Boolean Read FInsertMode Write SetInsertMode;
|
---|
591 | Property Modified:Boolean Read FModified Write SetModified;
|
---|
592 | Property Untitled:Boolean Read FUntitled Write FUntitled;
|
---|
593 | Property ReadOnly:Boolean Read GetReadOnly Write SetReadOnly;
|
---|
594 | Published
|
---|
595 | Property KeystrokeMap:TKeystrokeMap Read FKeyMap Write SetKeyMap;
|
---|
596 | Property EditOptions:TEditOpt Read FEditOpt Write SetEditOpt;
|
---|
597 | Property TabSize:Integer Read FTabSize Write SetTabSize;
|
---|
598 | Property Ctl3D:Boolean Read FCtl3D Write SetCtl3D;
|
---|
599 | End;
|
---|
600 |
|
---|
601 | TEditorClass=Class Of TEditor;
|
---|
602 |
|
---|
603 |
|
---|
604 |
|
---|
605 | Function CheckWordsOnly(pl:PLine; Var I:Integer; Const S:String):Boolean;
|
---|
606 | Function GetDefaultExt(Mask:String):String;
|
---|
607 | Function EditorPos(Line:LongInt;Column:Integer):TEditorPos;
|
---|
608 |
|
---|
609 |
|
---|
610 | Implementation
|
---|
611 |
|
---|
612 | Const
|
---|
613 | SpaceChar:Char=#32;
|
---|
614 |
|
---|
615 |
|
---|
616 | {$B+} {Complete Boolean Evaluation}
|
---|
617 |
|
---|
618 | Function CheckWordsOnly(pl:PLine; Var I:Integer; Const S:String):Boolean;
|
---|
619 | Begin
|
---|
620 | Result := False;
|
---|
621 | If I = 0 Then Exit;
|
---|
622 |
|
---|
623 | If I > 1 Then
|
---|
624 | If pl^.zk^[I-1] In NormalChars Then
|
---|
625 | Begin
|
---|
626 | I := - I;
|
---|
627 | Exit;
|
---|
628 | End;
|
---|
629 |
|
---|
630 | If I+Length(S)-1 < Length(pl^.zk^) Then
|
---|
631 | If pl^.zk^[I+Length(S)] In NormalChars Then
|
---|
632 | Begin
|
---|
633 | I := - I;
|
---|
634 | Exit;
|
---|
635 | End;
|
---|
636 | Result := True;
|
---|
637 | End;
|
---|
638 |
|
---|
639 |
|
---|
640 | Function GetDefaultExt(Mask:String):String;
|
---|
641 | Var P:Integer;
|
---|
642 | Begin
|
---|
643 | Result := '';
|
---|
644 | If Mask = '*.*' Then Exit;
|
---|
645 | P := Pos('.',Mask);
|
---|
646 | If P = 0 Then Exit;
|
---|
647 | Delete(Mask,1,P);
|
---|
648 | Result := Mask;
|
---|
649 | End;
|
---|
650 |
|
---|
651 |
|
---|
652 | Function EditorPos(Line:LongInt;Column:Integer):TEditorPos;
|
---|
653 | Begin
|
---|
654 | Result.Y := Line;
|
---|
655 | Result.X := Column;
|
---|
656 | End;
|
---|
657 |
|
---|
658 |
|
---|
659 | {
|
---|
660 | ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
|
---|
661 | º º
|
---|
662 | º Speed-Pascal/2 Version 2.0 º
|
---|
663 | º º
|
---|
664 | º Speed-Pascal Component Classes (SPCC) º
|
---|
665 | º º
|
---|
666 | º This section: TEditor Class Implementation º
|
---|
667 | º º
|
---|
668 | º (C) 1995,97 SpeedSoft. All rights reserved. Disclosure probibited ! º
|
---|
669 | º º
|
---|
670 | ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍŒ
|
---|
671 | }
|
---|
672 |
|
---|
673 | Procedure TEditor.SetFont(NewFont:TFont);
|
---|
674 | Begin
|
---|
675 | If NewFont = Nil Then Exit;
|
---|
676 | If NewFont.Pitch = fpFixed Then
|
---|
677 | If NewFont.FontType = ftBitmap Then
|
---|
678 | Begin
|
---|
679 | Inherited SetFont(NewFont);
|
---|
680 |
|
---|
681 | IsDBCSFont := NewFont.CharSet <> fcsSBCS;
|
---|
682 | If Handle = 0 Then Exit;
|
---|
683 |
|
---|
684 | Canvas.Font := NewFont;
|
---|
685 | CalcSizes;
|
---|
686 | SetCursorShape(FCursorShape);
|
---|
687 | Invalidate;
|
---|
688 | End;
|
---|
689 | End;
|
---|
690 |
|
---|
691 |
|
---|
692 | Procedure TEditor.SetKeyMap(km:TKeystrokeMap);
|
---|
693 | Begin
|
---|
694 | FKeyMap := km;
|
---|
695 | ICBVisible := True;
|
---|
696 | InvalidateEditor(0,0);
|
---|
697 | End;
|
---|
698 |
|
---|
699 |
|
---|
700 | Procedure TEditor.SetInsertMode(im:Boolean);
|
---|
701 | Begin
|
---|
702 | FInsertMode := im;
|
---|
703 | SetCursorShape(FCursorShape); {Update}
|
---|
704 | End;
|
---|
705 |
|
---|
706 |
|
---|
707 | Procedure TEditor.SetCursorShape(CS:TCursorShape);
|
---|
708 | Var X,Y:Integer;
|
---|
709 | Begin
|
---|
710 | FCursorShape := CS;
|
---|
711 |
|
---|
712 | FCaret.Remove;
|
---|
713 | If Not FInsertMode Then
|
---|
714 | Begin
|
---|
715 | X := Canvas.FontWidth;
|
---|
716 | Y := Canvas.FontHeight;
|
---|
717 | End
|
---|
718 | Else
|
---|
719 | If FCursorShape = csUnderline Then
|
---|
720 | Begin
|
---|
721 | X := Canvas.FontWidth;
|
---|
722 | Y := 2;
|
---|
723 | End
|
---|
724 | Else
|
---|
725 | Begin
|
---|
726 | X := 1;
|
---|
727 | Y := Canvas.FontHeight;
|
---|
728 | End;
|
---|
729 | FCaret.SetSize(X,Y);
|
---|
730 | SetScreenCursor;
|
---|
731 | If HadFocus > 0 Then FCaret.Show;
|
---|
732 | End;
|
---|
733 |
|
---|
734 |
|
---|
735 | Procedure TEditor.SetSelectMode(sm:TSelectMode);
|
---|
736 | Begin
|
---|
737 | If Application.DBCSSystem Then sm := smNonInclusiveBlock;
|
---|
738 |
|
---|
739 | FSelectMode := sm;
|
---|
740 | ICBVisible := True;
|
---|
741 | _ICBCheckX;
|
---|
742 | InvalidateEditor(0,0);
|
---|
743 | End;
|
---|
744 |
|
---|
745 |
|
---|
746 | Procedure TEditor.SetEditOpt(eo:TEditOpt);
|
---|
747 | Begin
|
---|
748 | FEditOpt := eo;
|
---|
749 | End;
|
---|
750 |
|
---|
751 |
|
---|
752 | Procedure TEditor.SetTabSize(ts:Integer);
|
---|
753 | Begin
|
---|
754 | If (ts > 0) And (ts < StringLength) Then FTabSize := ts;
|
---|
755 | End;
|
---|
756 |
|
---|
757 |
|
---|
758 | Procedure TEditor.SetWordWrap(Wrap:Boolean);
|
---|
759 | Begin
|
---|
760 | If FWordWrap <> Wrap Then
|
---|
761 | Begin
|
---|
762 | FWordWrap := Wrap;
|
---|
763 | InvalidateEditor(0,0);
|
---|
764 | End;
|
---|
765 | End;
|
---|
766 |
|
---|
767 |
|
---|
768 | Procedure TEditor.SetWordWrapColumn(Column:Integer);
|
---|
769 | Begin
|
---|
770 | FWordWrapColumn := Column;
|
---|
771 | If FWordWrap Then InvalidateEditor(0,0);
|
---|
772 | End;
|
---|
773 |
|
---|
774 |
|
---|
775 | Function TEditor.GetUndoCount:LongInt;
|
---|
776 | Begin
|
---|
777 | Result := FUndoList.Count;
|
---|
778 | End;
|
---|
779 |
|
---|
780 |
|
---|
781 | Function TEditor.GetRedoCount:LongInt;
|
---|
782 | Begin
|
---|
783 | Result := FRedoList.Count;
|
---|
784 | End;
|
---|
785 |
|
---|
786 |
|
---|
787 | Procedure TEditor.FlushWorkLine;
|
---|
788 | Begin
|
---|
789 | If WLactivated Then _WriteWorkLine;
|
---|
790 | End;
|
---|
791 |
|
---|
792 |
|
---|
793 | {Convert Line Number (1..N) To Line Pointer}
|
---|
794 | Function TEditor._Index2PLine(Y:LongInt):PLine;
|
---|
795 | Var I:LongInt;
|
---|
796 | Begin
|
---|
797 | Result := Nil;
|
---|
798 | If (Y < 1) Or (Y > FCountLines) Then Exit;
|
---|
799 |
|
---|
800 | If Y < (FCountLines Shr 1) Then {Search Forward}
|
---|
801 | Begin
|
---|
802 | Result := FFirstLine;
|
---|
803 | For I := 2 To Y Do
|
---|
804 | Begin
|
---|
805 | If Result <> Nil Then Result := Result^.Next
|
---|
806 | Else Exit;
|
---|
807 | End;
|
---|
808 | End
|
---|
809 | Else {Search backward}
|
---|
810 | Begin
|
---|
811 | Result := FLastLine;
|
---|
812 | For I := FCountLines-1 DownTo Y Do
|
---|
813 | Begin
|
---|
814 | If Result <> Nil Then Result := Result^.Prev
|
---|
815 | Else Exit;
|
---|
816 | End;
|
---|
817 | End;
|
---|
818 | End;
|
---|
819 |
|
---|
820 |
|
---|
821 | {Convert Line Pointer To Line Number (1..N)}
|
---|
822 | Function TEditor._PLine2Index(pl:PLine):LongInt;
|
---|
823 | Var pl1:PLine;
|
---|
824 | Begin
|
---|
825 | Result := 0;
|
---|
826 | pl1 := FFirstLine;
|
---|
827 | While pl1 <> Nil Do
|
---|
828 | Begin
|
---|
829 | Inc(Result);
|
---|
830 | If pl1 = pl Then Exit;
|
---|
831 | pl1 := pl1^.Next;
|
---|
832 | End;
|
---|
833 | Result := 0;
|
---|
834 | End;
|
---|
835 |
|
---|
836 |
|
---|
837 | {return the Pointer To the String Of the Line}
|
---|
838 | Function TEditor._PLine2PString(pl:PLine):PString;
|
---|
839 | Begin
|
---|
840 | If pl <> Nil Then
|
---|
841 | Begin
|
---|
842 | If pl^.zk <> Nil Then Result := pl^.zk
|
---|
843 | Else Result := @FWorkLine;
|
---|
844 | End
|
---|
845 | Else Result := Nil;
|
---|
846 | End;
|
---|
847 |
|
---|
848 |
|
---|
849 | {Connect two Line pointers}
|
---|
850 | Function TEditor._Connect(pl1,pl2:PLine):Boolean;
|
---|
851 | Begin
|
---|
852 | If pl1 <> Nil Then pl1^.Next := pl2
|
---|
853 | Else FFirstLine := pl2;
|
---|
854 | If pl2 <> Nil Then pl2^.Prev := pl1
|
---|
855 | Else FLastLine := pl1;
|
---|
856 | Result := True;
|
---|
857 | End;
|
---|
858 |
|
---|
859 |
|
---|
860 | {Count Number Of Lines including both Lines}
|
---|
861 | Function TEditor._CountLines(pl1,pl2:PLine):LongInt;
|
---|
862 | Var pl:PLine;
|
---|
863 | Begin
|
---|
864 | Result := 0;
|
---|
865 | pl := pl1;
|
---|
866 | While pl <> Nil Do
|
---|
867 | Begin
|
---|
868 | Inc(Result);
|
---|
869 | If pl = pl2 Then Exit;
|
---|
870 | pl := pl^.Next;
|
---|
871 | End;
|
---|
872 | Result := 0;
|
---|
873 | pl := pl1;
|
---|
874 | While pl <> Nil Do
|
---|
875 | Begin
|
---|
876 | Dec(Result);
|
---|
877 | If pl = pl2 Then Exit;
|
---|
878 | pl := pl^.Prev;
|
---|
879 | End;
|
---|
880 | Result := 0;
|
---|
881 | End;
|
---|
882 |
|
---|
883 |
|
---|
884 | { +++ Undo +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ }
|
---|
885 |
|
---|
886 | {Count the Lines from FirstL To LastL And Reset the Line color}
|
---|
887 | Function TEditor._CountUndoLines(FirstL,LastL:PLine):LongInt;
|
---|
888 | Var TempL:PLine;
|
---|
889 | Begin
|
---|
890 | Result := _CountLines(FirstL,LastL);
|
---|
891 | If Result > 0 Then
|
---|
892 | Begin
|
---|
893 | TempL := FirstL;
|
---|
894 | While TempL <> LastL Do
|
---|
895 | Begin
|
---|
896 | TempL^.flag := ciNormal;
|
---|
897 | TempL := TempL^.Next;
|
---|
898 | End;
|
---|
899 | If LastL <> Nil Then LastL^.flag := ciNormal;
|
---|
900 | End
|
---|
901 | Else Result := 0;
|
---|
902 | End;
|
---|
903 |
|
---|
904 |
|
---|
905 | {save the File Cursor Position}
|
---|
906 | Procedure TEditor._StoreUndoCursor(List:TList);
|
---|
907 | Var U:PUndo;
|
---|
908 | Begin
|
---|
909 | New(U);
|
---|
910 | U^.Memory := False;
|
---|
911 | U^.EventType := ugCursorMove;
|
---|
912 | U^.Modified := Modified;
|
---|
913 | U^.ICBFL := _PLine2Index(ICB.First.Line);
|
---|
914 | U^.ICBFX := ICB.First.X;
|
---|
915 | U^.ICBLL := _PLine2Index(ICB.Last.Line);
|
---|
916 | U^.ICBLX := ICB.Last.X;
|
---|
917 | U^.FFileCursor := FFileCursor;
|
---|
918 | _CreateUndoEvent(List,U);
|
---|
919 | End;
|
---|
920 |
|
---|
921 |
|
---|
922 | {save the File Cursor Position And Copy the specified Lines In the stack}
|
---|
923 | Function TEditor._CopyUndoLines(FirstL,LastL:PLine):LongInt;
|
---|
924 | Var U:PUndo;
|
---|
925 | FUL,LUL:PLine;
|
---|
926 | pl:PLine;
|
---|
927 | ptnew:PLine;
|
---|
928 | ptlast:PLine;
|
---|
929 | CL:LongInt;
|
---|
930 | lzk:Integer;
|
---|
931 | Begin
|
---|
932 | FlushWorkLine;
|
---|
933 | CL := 0;
|
---|
934 | ptnew := Nil;
|
---|
935 | pl := FirstL;
|
---|
936 | While pl <> LastL^.Next Do
|
---|
937 | Begin
|
---|
938 | New(ptnew);
|
---|
939 | If CL = 0 Then FUL := ptnew;
|
---|
940 | lzk := Length(pl^.zk^);
|
---|
941 | GetMem(ptnew^.zk, lzk+1);
|
---|
942 | ptnew^.zk^ := pl^.zk^;
|
---|
943 | ptnew^.flag := ciNormal;
|
---|
944 | ptnew^.Add := 0;
|
---|
945 | If CL > 0 Then _Connect(ptlast,ptnew);
|
---|
946 | pl := pl^.Next;
|
---|
947 | ptlast := ptnew;
|
---|
948 | Inc(CL);
|
---|
949 | End;
|
---|
950 | LUL := ptnew;
|
---|
951 |
|
---|
952 | New(U);
|
---|
953 | U^.Memory := True;
|
---|
954 | U^.EventType := ugNoGroup;
|
---|
955 | U^.Modified := Modified;
|
---|
956 | U^.ICBFL := _PLine2Index(ICB.First.Line);
|
---|
957 | U^.ICBFX := ICB.First.X;
|
---|
958 | U^.ICBLL := _PLine2Index(ICB.Last.Line);
|
---|
959 | U^.ICBLX := ICB.Last.X;
|
---|
960 | U^.FFileCursor := FFileCursor;
|
---|
961 | U^.FrameBegin := _PLine2Index(FirstL)-1;
|
---|
962 | U^.FrameEnd := _PLine2Index(LastL)+1; {Default: Count Of Lines constant}
|
---|
963 | U^.FirstUndoLine := FUL;
|
---|
964 | U^.LastUndoLine := LUL;
|
---|
965 | U^.Lines := CL;
|
---|
966 | _CreateUndoEvent(FUndoList,U);
|
---|
967 | Result := U^.Lines;
|
---|
968 | End;
|
---|
969 |
|
---|
970 |
|
---|
971 | {save the File Cursor Position And Move the specified Lines In the stack}
|
---|
972 | Function TEditor._MoveUndoLines(List:TList;FirstL,LastL:PLine):LongInt;
|
---|
973 | Var U:PUndo;
|
---|
974 | Begin
|
---|
975 | FlushWorkLine;
|
---|
976 | New(U);
|
---|
977 | U^.Memory := True;
|
---|
978 | U^.EventType := ugNoGroup;
|
---|
979 | U^.Modified := Modified;
|
---|
980 | U^.ICBFL := _PLine2Index(ICB.First.Line);
|
---|
981 | U^.ICBFX := ICB.First.X;
|
---|
982 | U^.ICBLL := _PLine2Index(ICB.Last.Line);
|
---|
983 | U^.ICBLX := ICB.Last.X;
|
---|
984 | U^.FFileCursor := FFileCursor;
|
---|
985 |
|
---|
986 | U^.Lines := _CountUndoLines(FirstL,LastL); {Count Lines For Undo stack}
|
---|
987 | If U^.Lines > 0 Then
|
---|
988 | Begin
|
---|
989 | U^.FrameBegin := _PLine2Index(FirstL)-1;
|
---|
990 | U^.FirstUndoLine := FirstL;
|
---|
991 | U^.LastUndoLine := LastL;
|
---|
992 | End
|
---|
993 | Else
|
---|
994 | Begin
|
---|
995 | U^.FrameBegin := _PLine2Index(LastL);
|
---|
996 | U^.FirstUndoLine := Nil;
|
---|
997 | U^.LastUndoLine := Nil;
|
---|
998 | End;
|
---|
999 | _CreateUndoEvent(List,U);
|
---|
1000 | Result := U^.Lines;
|
---|
1001 | End;
|
---|
1002 |
|
---|
1003 |
|
---|
1004 | {Create an Undo event}
|
---|
1005 | Procedure TEditor._CreateUndoEvent(List:TList;U:PUndo);
|
---|
1006 | Begin
|
---|
1007 | List.Add(U);
|
---|
1008 |
|
---|
1009 | If MaxUndo < 0 Then Exit; {unlimited}
|
---|
1010 | If List.Count > MaxUndo Then List.Delete(0);
|
---|
1011 | End;
|
---|
1012 |
|
---|
1013 | {Update the Frame End Of the Last Undo event}
|
---|
1014 | Procedure TEditor._UpdateLastUndoEvent(List:TList;Index:LongInt);
|
---|
1015 | Var U:PUndo;
|
---|
1016 | Begin
|
---|
1017 | If List.Count = 0 Then Exit;
|
---|
1018 | U := List.Last;
|
---|
1019 | If U = Nil Then Exit;
|
---|
1020 | U^.FrameEnd := Index;
|
---|
1021 | End;
|
---|
1022 |
|
---|
1023 |
|
---|
1024 | {Release the Memory allocated by the Lines For the Undo stack And the Item}
|
---|
1025 | {$HINTS OFF}
|
---|
1026 | Procedure TEditor._FreeUndoEvent(List:TObject;Item:Pointer);
|
---|
1027 | Var pl:PLine;
|
---|
1028 | ptnext:PLine;
|
---|
1029 | I:LongInt;
|
---|
1030 | lzk:Integer;
|
---|
1031 | U:PUndo;
|
---|
1032 | Begin
|
---|
1033 | U := Item;
|
---|
1034 | If U = Nil Then Exit;
|
---|
1035 | If U^.Memory Then {Not only Cursor event}
|
---|
1036 | Begin
|
---|
1037 | pl := U^.FirstUndoLine;
|
---|
1038 | For I := 1 To U^.Lines Do
|
---|
1039 | Begin
|
---|
1040 | If pl = Nil Then Exit;
|
---|
1041 | ptnext := pl^.Next;
|
---|
1042 | If pl^.zk <> Nil Then
|
---|
1043 | Begin
|
---|
1044 | lzk := Length(pl^.zk^);
|
---|
1045 | FreeMem(pl^.zk, lzk+1);
|
---|
1046 | End;
|
---|
1047 | Dispose(pl);
|
---|
1048 | pl := ptnext;
|
---|
1049 | End;
|
---|
1050 | End;
|
---|
1051 | Dispose(U);
|
---|
1052 | End;
|
---|
1053 | {$HINTS ON}
|
---|
1054 |
|
---|
1055 | Procedure TEditor._SetMaxUndo(cnt:LongInt);
|
---|
1056 | Begin
|
---|
1057 | MaxUndo := cnt;
|
---|
1058 | If MaxUndo < 0 Then Exit; {unlimited}
|
---|
1059 |
|
---|
1060 | While FUndoList.Count > MaxUndo Do FUndoList.Delete(0);
|
---|
1061 | While FRedoList.Count > MaxUndo Do FRedoList.Delete(0);
|
---|
1062 | UpdateEditorState;
|
---|
1063 | End;
|
---|
1064 |
|
---|
1065 |
|
---|
1066 |
|
---|
1067 | {Move FActLine To FWorkLine}
|
---|
1068 | Procedure TEditor._ReadWorkLine;
|
---|
1069 | Var lzk:Integer;
|
---|
1070 | Begin
|
---|
1071 | WLactivated := True;
|
---|
1072 | If FActLine^.zk = Nil Then Exit;
|
---|
1073 |
|
---|
1074 | FillChar(FWorkLine[1], StringLength, 32); {NoANSI}
|
---|
1075 | lzk := Length(FActLine^.zk^);
|
---|
1076 | FWorkLine := FActLine^.zk^;
|
---|
1077 | FreeMem(FActLine^.zk, lzk+1);
|
---|
1078 | FActLine^.zk := Nil;
|
---|
1079 | End;
|
---|
1080 |
|
---|
1081 |
|
---|
1082 | {Write back FWorkLine To FActLine}
|
---|
1083 | Procedure TEditor._WriteWorkLine;
|
---|
1084 | Var lwl:Integer;
|
---|
1085 | Begin
|
---|
1086 | WLactivated := False;
|
---|
1087 | If FActLine^.zk <> Nil Then Exit;
|
---|
1088 | While (Length(FWorkLine) > 0) And (FWorkLine[Length(FWorkLine)] = ' ')
|
---|
1089 | Do SetLength(FWorkLine,Length(FWorkLine)-1);
|
---|
1090 | If Length(FWorkLine) > StringLength Then SetLength(FWorkLine,StringLength);
|
---|
1091 |
|
---|
1092 | lwl := Length(FWorkLine);
|
---|
1093 | GetMem(FActLine^.zk, lwl+1);
|
---|
1094 | FActLine^.zk^ := FWorkLine;
|
---|
1095 | End;
|
---|
1096 |
|
---|
1097 |
|
---|
1098 | {overwrite FWorkLine At Position X With String S}
|
---|
1099 | Function TEditor._WriteString(X:Integer; S:String):Boolean;
|
---|
1100 | Var I,newend:Integer;
|
---|
1101 | lwl:Integer;
|
---|
1102 | Begin
|
---|
1103 | Result := True;
|
---|
1104 | If Not WLactivated Then _ReadWorkLine;
|
---|
1105 | If Length(S) = 0 Then Exit;
|
---|
1106 |
|
---|
1107 | lwl := Length(FWorkLine);
|
---|
1108 | I := X - (lwl+1);
|
---|
1109 | If I > 0 Then FillChar(FWorkLine[lwl+1], I, 32);
|
---|
1110 |
|
---|
1111 | If X + (Length(S)-1) > StringLength Then
|
---|
1112 | Begin
|
---|
1113 | SetLength(S,StringLength-X+1);
|
---|
1114 | Result := False;
|
---|
1115 | End;
|
---|
1116 |
|
---|
1117 | System.Move(S[1], FWorkLine[X], Length(S)); {NoANSI}
|
---|
1118 | newend := X + (Length(S)-1);
|
---|
1119 | If Length(FWorkLine) < newend Then SetLength(FWorkLine,newend);
|
---|
1120 | Modified := True;
|
---|
1121 | End;
|
---|
1122 |
|
---|
1123 |
|
---|
1124 | {Insert String S In the FWorkLine At Position X}
|
---|
1125 | Function TEditor._InsertString(X:Integer; S:String):Boolean;
|
---|
1126 | Var lS,I:Integer;
|
---|
1127 | lwl:Integer;
|
---|
1128 | Begin
|
---|
1129 | If Not WLactivated Then _ReadWorkLine;
|
---|
1130 | Result := True;
|
---|
1131 | lS := Length(S);
|
---|
1132 | If lS = 0 Then Exit;
|
---|
1133 |
|
---|
1134 | lwl := Length(FWorkLine);
|
---|
1135 | If X > lwl+1 Then
|
---|
1136 | Begin
|
---|
1137 | I := X - (lwl+1);
|
---|
1138 | FillChar(FWorkLine[lwl+1], I, 32);
|
---|
1139 | SetLength(FWorkLine,X-1);
|
---|
1140 | End;
|
---|
1141 | If lS + Length(FWorkLine) > StringLength Then Result := False;
|
---|
1142 | System.Insert(S, FWorkLine, X);
|
---|
1143 | If Length(FWorkLine) > StringLength Then SetLength(FWorkLine,StringLength);
|
---|
1144 | Modified := True;
|
---|
1145 | End;
|
---|
1146 |
|
---|
1147 |
|
---|
1148 | {Delete CX chars In the FWorkLine At Position X}
|
---|
1149 | Function TEditor._DeleteString(X,CX:Integer):Boolean;
|
---|
1150 | Begin
|
---|
1151 | If Not WLactivated Then _ReadWorkLine;
|
---|
1152 | Result := True;
|
---|
1153 | If CX = 0 Then Exit;
|
---|
1154 | If X > Length(FWorkLine) Then Exit;
|
---|
1155 | Delete(FWorkLine, X, CX);
|
---|
1156 | Modified := True;
|
---|
1157 | End;
|
---|
1158 |
|
---|
1159 |
|
---|
1160 | {Read CX chars from Line pl At Position X; If CX Is < 0 the Until End Of Line}
|
---|
1161 | Function TEditor._ReadString(pl:PLine; X,CX:Integer):String;
|
---|
1162 | Var zk:PString;
|
---|
1163 | S:String;
|
---|
1164 | Begin
|
---|
1165 | Result := '';
|
---|
1166 | If pl = Nil Then Exit;
|
---|
1167 | zk := _PLine2PString(pl);
|
---|
1168 |
|
---|
1169 | If CX >= 0 Then
|
---|
1170 | Begin
|
---|
1171 | If X+CX-1 > Length(zk^) Then
|
---|
1172 | Begin
|
---|
1173 | FillChar(S[1], StringLength, 32); {NoANSI}
|
---|
1174 | System.Move(zk^[1], S[1], Length(zk^));
|
---|
1175 | SetLength(S,StringLength);
|
---|
1176 | zk := @S; {NoANSI}
|
---|
1177 | End;
|
---|
1178 | End
|
---|
1179 | Else CX := StringLength;
|
---|
1180 | Result := Copy(zk^,X,CX);
|
---|
1181 | End;
|
---|
1182 |
|
---|
1183 |
|
---|
1184 | {Get the String from Line Y (1..N)}
|
---|
1185 | Function TEditor._Get(Y:LongInt):String;
|
---|
1186 | Var pl:PLine;
|
---|
1187 | Begin
|
---|
1188 | Result := '';
|
---|
1189 | pl := _Index2PLine(Y);
|
---|
1190 | If pl = Nil Then Exit; {indexerror}
|
---|
1191 | If pl^.zk <> Nil Then Result := pl^.zk^
|
---|
1192 | Else Result := FWorkLine;
|
---|
1193 | End;
|
---|
1194 |
|
---|
1195 |
|
---|
1196 | Procedure TEditor._Set(Y:LongInt;Const S:String);
|
---|
1197 | Begin
|
---|
1198 | ReplaceLine(Y,S);
|
---|
1199 | End;
|
---|
1200 |
|
---|
1201 |
|
---|
1202 | {Find the Line With the bookmark I}
|
---|
1203 | Function TEditor._FindBookMark(I:Byte):PLine;
|
---|
1204 | Var pl:PLine;
|
---|
1205 | BM,W:LongWord;
|
---|
1206 | Begin
|
---|
1207 | BM := I * ciBookMark0;
|
---|
1208 | pl := FFirstLine;
|
---|
1209 | While pl <> Nil Do
|
---|
1210 | Begin
|
---|
1211 | W := pl^.flag And ciBookMarkMask;
|
---|
1212 | If W = I Then
|
---|
1213 | Begin
|
---|
1214 | Result := pl;
|
---|
1215 | Exit;
|
---|
1216 | End;
|
---|
1217 | pl := pl^.Next;
|
---|
1218 | End;
|
---|
1219 | Result := Nil;
|
---|
1220 | End;
|
---|
1221 |
|
---|
1222 |
|
---|
1223 | {Find Next cmTabulator; from Line pl And Position X}
|
---|
1224 | Function TEditor._FindNextTab(pl:PLine; X:Integer):Integer;
|
---|
1225 | Var tabstring:String;
|
---|
1226 | Begin
|
---|
1227 | FlushWorkLine;
|
---|
1228 | Result := 1;
|
---|
1229 | If FTabSize = 0 Then exit;
|
---|
1230 |
|
---|
1231 | tabstring := '!';
|
---|
1232 | While pl <> Nil Do
|
---|
1233 | Begin
|
---|
1234 | If Length(pl^.zk^) <> 0 Then
|
---|
1235 | Begin
|
---|
1236 | tabstring := pl^.zk^;
|
---|
1237 | pl := Nil;
|
---|
1238 | End
|
---|
1239 | Else pl := pl^.Prev;
|
---|
1240 | End;
|
---|
1241 |
|
---|
1242 | If (X = 1) And (tabstring[1] <> ' ') Then {For cmEnter}
|
---|
1243 | Begin
|
---|
1244 | Result := 1;
|
---|
1245 | Exit;
|
---|
1246 | End;
|
---|
1247 |
|
---|
1248 | If X <= Length(tabstring) Then
|
---|
1249 | Begin
|
---|
1250 | Dec(X);
|
---|
1251 | While (tabstring[X] <> ' ') And (X <= Length(tabstring)) Do Inc(X);
|
---|
1252 | While (tabstring[X] = ' ') And (X <= Length(tabstring)) Do Inc(X);
|
---|
1253 | End
|
---|
1254 | Else X := (((X-2) Div FTabSize)+1)*FTabSize + 1;
|
---|
1255 |
|
---|
1256 | If X > StringLength Then X := StringLength;
|
---|
1257 | Result := X;
|
---|
1258 | End;
|
---|
1259 |
|
---|
1260 |
|
---|
1261 | Function QueryDBCSFirstByte(Var S:String; Pos:LongInt):Boolean;
|
---|
1262 | Var I:LongInt;
|
---|
1263 | Begin
|
---|
1264 | Result := False;
|
---|
1265 | If Pos > Length(S) Then Exit;
|
---|
1266 | For I := 1 To Pos Do
|
---|
1267 | Begin
|
---|
1268 | {$IFDEF OS2}
|
---|
1269 | If IsDBCSFirstByte(S[I]) Then
|
---|
1270 | Begin
|
---|
1271 | If I = Pos Then
|
---|
1272 | Begin
|
---|
1273 | Result := True;
|
---|
1274 | Exit;
|
---|
1275 | End;
|
---|
1276 | Inc(I); {onto Second Byte}
|
---|
1277 | End;
|
---|
1278 | {$ENDIF}
|
---|
1279 | End;
|
---|
1280 | End;
|
---|
1281 |
|
---|
1282 |
|
---|
1283 |
|
---|
1284 | {transform mouse coordinates into Screen Cursor coordinates}
|
---|
1285 | Function TEditor.GetCursorFromMouse(pt:TPoint):TEditorPos;
|
---|
1286 | Var I,XLeft,yTop:LongInt;
|
---|
1287 | pl:PLine;
|
---|
1288 | ps:PString;
|
---|
1289 | Begin
|
---|
1290 | XLeft := FBorderWidth + IndentRect.Left;
|
---|
1291 | yTop := FBorderWidth + IndentRect.Top;
|
---|
1292 | Result.X := Round( (pt.X - XLeft) / Canvas.FontWidth) + 1;
|
---|
1293 | Result.Y := (ClientArea.Top - pt.Y - yTop) Div Canvas.FontHeight + 1;
|
---|
1294 |
|
---|
1295 | If Application.DBCSSystem Then
|
---|
1296 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1297 | pl := FTopScreenLine;
|
---|
1298 | For I := 2 To Result.Y Do
|
---|
1299 | If pl <> Nil Then pl := pl^.Next;
|
---|
1300 | If pl = Nil Then Exit;
|
---|
1301 |
|
---|
1302 | ps := _PLine2PString(pl);
|
---|
1303 | If QueryDBCSFirstByte(ps^,(FFileCursor.X-FScrCursor.X)+Result.X-1)
|
---|
1304 | Then Dec(Result.X);
|
---|
1305 | End;
|
---|
1306 | End;
|
---|
1307 |
|
---|
1308 |
|
---|
1309 | {transform Screen Cursor coordinates into mouse coordinates}
|
---|
1310 | Function TEditor.GetMouseFromCursor(Pos:TEditorPos):TPoint;
|
---|
1311 | Var XLeft,yTop:LongInt;
|
---|
1312 | Begin
|
---|
1313 | XLeft := FBorderWidth + IndentRect.Left;
|
---|
1314 | yTop := FBorderWidth + IndentRect.Top;
|
---|
1315 | Result.X := XLeft + ((Pos.X-1) * Canvas.FontWidth);
|
---|
1316 | Result.Y := ClientArea.Top - (Pos.Y * Canvas.FontHeight) - yTop;
|
---|
1317 | End;
|
---|
1318 |
|
---|
1319 |
|
---|
1320 |
|
---|
1321 | {Insert A New Line after pl}
|
---|
1322 | Function TEditor._InsertLine(pl:PLine):PLine;
|
---|
1323 | Var plnext:PLine;
|
---|
1324 | Begin
|
---|
1325 | If pl = Nil Then plnext := FFirstLine
|
---|
1326 | Else plnext := pl^.Next;
|
---|
1327 | New(Result);
|
---|
1328 | Result^.zk := Nil;
|
---|
1329 | Result^.flag := ciNormal;
|
---|
1330 | Result^.Add := 0;
|
---|
1331 | _Connect(Result,plnext);
|
---|
1332 | _Connect(pl,Result);
|
---|
1333 | Inc(FCountLines);
|
---|
1334 | Modified := True;
|
---|
1335 | End;
|
---|
1336 |
|
---|
1337 |
|
---|
1338 | {Delete the Line pl}
|
---|
1339 | Function TEditor._DeleteLine(pl:PLine):PLine;
|
---|
1340 | Var lzk:Integer;
|
---|
1341 | Begin
|
---|
1342 | If (FCountLines = 1) Or (pl = Nil) Then
|
---|
1343 | Begin
|
---|
1344 | Result := Nil;
|
---|
1345 | Exit;
|
---|
1346 | End;
|
---|
1347 | Result := pl^.Prev;
|
---|
1348 | If pl^.zk <> Nil Then
|
---|
1349 | Begin
|
---|
1350 | lzk := Length(pl^.zk^);
|
---|
1351 | FreeMem(pl^.zk, lzk+1);
|
---|
1352 | End;
|
---|
1353 | _Connect(pl^.Prev,pl^.Next);
|
---|
1354 | Dispose(pl);
|
---|
1355 | Dec(FCountLines);
|
---|
1356 | Modified := True;
|
---|
1357 | End;
|
---|
1358 |
|
---|
1359 |
|
---|
1360 | {Copy contents Of A File into Memory}
|
---|
1361 | Function TEditor._GetFileText(S:String; Var P:Pointer; Var len:LongInt):Boolean;
|
---|
1362 | Var utF:File;
|
---|
1363 | p0:^Byte;
|
---|
1364 | Begin
|
---|
1365 | System.Assign(utF,S);
|
---|
1366 | {$I-}
|
---|
1367 | FileMode := fmInput;
|
---|
1368 | Reset(utF,1);
|
---|
1369 | FileMode := fmInOut;
|
---|
1370 | Result := InOutRes = 0;
|
---|
1371 | If InOutRes = 0 Then len := FileSize(utF)
|
---|
1372 | Else len := 0;
|
---|
1373 | {$I+}
|
---|
1374 |
|
---|
1375 | If len > 0 Then
|
---|
1376 | Begin
|
---|
1377 | Inc(len);
|
---|
1378 | GetMem(P,len);
|
---|
1379 | {$I-}
|
---|
1380 | BlockRead(utF,P^,len-1);
|
---|
1381 | {$I+}
|
---|
1382 | Result := InOutRes = 0;
|
---|
1383 | p0 := P;
|
---|
1384 | Inc(p0,len-1);
|
---|
1385 | p0^ := 0; {terminal #0}
|
---|
1386 | End;
|
---|
1387 | {$I-}
|
---|
1388 | System.Close(utF);
|
---|
1389 | {$I+}
|
---|
1390 | End;
|
---|
1391 |
|
---|
1392 |
|
---|
1393 | {Copy All To A Text block With the Length len; return True If successful}
|
---|
1394 | Function TEditor._GetEditorText(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
1395 | Var OldICB:TICB;
|
---|
1396 | OldSelectMode:TSelectMode;
|
---|
1397 | Begin
|
---|
1398 | OldICB := ICB;
|
---|
1399 | ICB.First.Line := FFirstLine;
|
---|
1400 | ICB.First.X := 1;
|
---|
1401 | ICB.Last.Line := FLastLine;
|
---|
1402 | ICB.Last.X := Length(_PLine2PString(FLastLine)^);
|
---|
1403 | Inc(ICB.Last.X);
|
---|
1404 | OldSelectMode := FSelectMode;
|
---|
1405 | FSelectMode := smNonInclusiveBlock;
|
---|
1406 |
|
---|
1407 | Result := _GetEditorBlock(P,len);
|
---|
1408 |
|
---|
1409 | ICB := OldICB;
|
---|
1410 | FSelectMode := OldSelectMode;
|
---|
1411 | End;
|
---|
1412 |
|
---|
1413 |
|
---|
1414 | {Copy the area To A Text block With the Length len; return True If successful}
|
---|
1415 | Function TEditor.GetPartialText(p1,p2:TEditorPos;Var P:Pointer; Var len:LongInt):Boolean;
|
---|
1416 | Var OldICB:TICB;
|
---|
1417 | OldSelectMode:TSelectMode;
|
---|
1418 | Begin
|
---|
1419 | Result := False;
|
---|
1420 | If p1.Y > p2.Y Then Exit;
|
---|
1421 | If p1.Y = p2.Y Then
|
---|
1422 | If p1.X >= p2.X Then Exit;
|
---|
1423 | If p1.Y < 1 Then Exit;
|
---|
1424 | If p2.Y > FCountLines Then Exit;
|
---|
1425 |
|
---|
1426 | OldICB := ICB;
|
---|
1427 | ICB.First.Line := _Index2PLine(p1.Y);
|
---|
1428 | ICB.First.X := 1;
|
---|
1429 | ICB.Last.Line := _Index2PLine(p2.Y);
|
---|
1430 | ICB.Last.X := Length(_PLine2PString(FLastLine)^);
|
---|
1431 | Inc(ICB.Last.X);
|
---|
1432 | OldSelectMode := FSelectMode;
|
---|
1433 | FSelectMode := smNonInclusiveBlock;
|
---|
1434 |
|
---|
1435 | Result := _GetEditorBlock(P,len);
|
---|
1436 |
|
---|
1437 | ICB := OldICB;
|
---|
1438 | FSelectMode := OldSelectMode;
|
---|
1439 | End;
|
---|
1440 |
|
---|
1441 |
|
---|
1442 | {Copy ICB To A Text block With the Length len; return True If successful}
|
---|
1443 | Function TEditor._GetEditorBlock(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
1444 | Var pl:PLine;
|
---|
1445 | Ptr:Pointer;
|
---|
1446 | Str:String;
|
---|
1447 | zk:PString;
|
---|
1448 | lzk:Integer;
|
---|
1449 | CRLF:String;
|
---|
1450 | area:TICB;
|
---|
1451 | Begin
|
---|
1452 | Result := False;
|
---|
1453 | _ICBExtCorrectICB2; {reorder firstx lastx If extselection}
|
---|
1454 | len := -1;
|
---|
1455 | area := ICB;
|
---|
1456 | If (area.First.Line = Nil) Or (area.Last.Line = Nil) Then Exit;
|
---|
1457 |
|
---|
1458 | If area.First.Line = area.Last.Line Then
|
---|
1459 | Begin
|
---|
1460 | len := area.Last.X - area.First.X;
|
---|
1461 | If len > 0 Then
|
---|
1462 | Begin
|
---|
1463 | Inc(len); {terminating #0}
|
---|
1464 | GetMem(P,len);
|
---|
1465 | Str := _ReadString(area.First.Line,area.First.X,len-1) + #0;
|
---|
1466 | System.Move(Str[1], P^, len); {NoANSI}
|
---|
1467 | Result := True;
|
---|
1468 | End;
|
---|
1469 | End
|
---|
1470 | Else
|
---|
1471 | Begin
|
---|
1472 | If FSelectMode <> smColumnBlock Then
|
---|
1473 | Begin
|
---|
1474 | pl := area.First.Line;
|
---|
1475 | lzk := Length(_PLine2PString(pl)^);
|
---|
1476 | {correct If To LONG}
|
---|
1477 | If area.First.X > lzk Then area.First.X := lzk+1;
|
---|
1478 | len := lzk - area.First.X+1+2; {First Line}
|
---|
1479 | pl := pl^.Next;
|
---|
1480 | While pl <> area.Last.Line Do
|
---|
1481 | Begin
|
---|
1482 | lzk := Length(_PLine2PString(pl)^);
|
---|
1483 | Inc(len, lzk +2);
|
---|
1484 | pl := pl^.Next;
|
---|
1485 | If pl = Nil Then Exit;
|
---|
1486 | End;
|
---|
1487 | Inc(len, area.Last.X); {Last Line + terminating #0}
|
---|
1488 | End
|
---|
1489 | Else {Extended Selection}
|
---|
1490 | Begin
|
---|
1491 | pl := area.First.Line;
|
---|
1492 | lzk := area.Last.X - area.First.X;
|
---|
1493 | len := lzk +2; {First Line}
|
---|
1494 | pl := pl^.Next;
|
---|
1495 | While pl <> area.Last.Line Do
|
---|
1496 | Begin
|
---|
1497 | Inc(len, lzk +2);
|
---|
1498 | pl := pl^.Next;
|
---|
1499 | If pl = Nil Then Exit;
|
---|
1500 | End;
|
---|
1501 | Inc(len, lzk +1); {Last Line + terminating #0}
|
---|
1502 | End;
|
---|
1503 |
|
---|
1504 | GetMem(P,len);
|
---|
1505 |
|
---|
1506 | CRLF := #13#10;
|
---|
1507 | pl := area.First.Line;
|
---|
1508 | Ptr := P;
|
---|
1509 | {First area Line}
|
---|
1510 | If FSelectMode <> smColumnBlock
|
---|
1511 | Then Str := _ReadString(area.First.Line,area.First.X,-1)
|
---|
1512 | Else Str := _ReadString(area.First.Line,area.First.X,lzk);
|
---|
1513 | System.Move(Str[1], Ptr^, Length(Str)); {NoANSI}
|
---|
1514 | Inc(Ptr, Length(Str));
|
---|
1515 | System.Move(CRLF[1], Ptr^, 2); {NoANSI}
|
---|
1516 | Inc(Ptr, 2);
|
---|
1517 | pl := pl^.Next;
|
---|
1518 | While pl <> area.Last.Line Do
|
---|
1519 | Begin
|
---|
1520 | If FSelectMode <> smColumnBlock Then
|
---|
1521 | Begin
|
---|
1522 | zk := _PLine2PString(pl);
|
---|
1523 | System.Move(zk^[1], Ptr^, Length(zk^)); {NoANSI}
|
---|
1524 | Inc(Ptr, Length(zk^));
|
---|
1525 | End
|
---|
1526 | Else
|
---|
1527 | Begin
|
---|
1528 | Str := _ReadString(pl,area.First.X,lzk);
|
---|
1529 | System.Move(Str[1], Ptr^, lzk); {NoANSI}
|
---|
1530 | Inc(Ptr, lzk);
|
---|
1531 | End;
|
---|
1532 | System.Move(CRLF[1], Ptr^, 2); {NoANSI}
|
---|
1533 | Inc(Ptr, 2);
|
---|
1534 | pl := pl^.Next;
|
---|
1535 | End;
|
---|
1536 | {Last area Line}
|
---|
1537 | If FSelectMode <> smColumnBlock
|
---|
1538 | Then Str := _ReadString(area.Last.Line,1,area.Last.X-1) + #0
|
---|
1539 | Else Str := _ReadString(area.Last.Line,area.First.X,lzk) + #0;
|
---|
1540 | System.Move(Str[1], Ptr^, Length(Str)); {NoANSI}
|
---|
1541 | Result := True;
|
---|
1542 | End;
|
---|
1543 | End;
|
---|
1544 |
|
---|
1545 |
|
---|
1546 | {Insert the Text block At the curent Position And Change the ICB If neccesary}
|
---|
1547 | Function TEditor._InsertText(P:Pointer; len:LongInt; marknew:Boolean):TLineX;
|
---|
1548 | Var laststr,NewStr:String;
|
---|
1549 | Tabs,StrL:LongWord;
|
---|
1550 | NewLine:Boolean;
|
---|
1551 | OldActLine:PLine;
|
---|
1552 | lwl:Integer;
|
---|
1553 | Begin
|
---|
1554 | FillChar(Result, SizeOf(Result), 0);
|
---|
1555 |
|
---|
1556 | If (len <= 0) Or (P = Nil) Then Exit;
|
---|
1557 |
|
---|
1558 | If FSelectMode = smColumnBlock Then marknew := False;
|
---|
1559 | OldActLine := FActLine;
|
---|
1560 | If marknew Then
|
---|
1561 | Begin
|
---|
1562 | _ICBClearMark;
|
---|
1563 | ICB.First.Line := FActLine;
|
---|
1564 | ICB.First.X := FFileCursor.X;
|
---|
1565 | End;
|
---|
1566 | If Not WLactivated Then _ReadWorkLine;
|
---|
1567 | If FFileCursor.X > Length(FWorkLine) Then laststr := ''
|
---|
1568 | Else laststr := Copy(FWorkLine,FFileCursor.X,255);
|
---|
1569 | SetLength(FWorkLine,FFileCursor.X-1);
|
---|
1570 |
|
---|
1571 | Tabs := FTabSize;
|
---|
1572 | StrL := StringLength;
|
---|
1573 | While len > 0 Do
|
---|
1574 | Begin
|
---|
1575 | Asm
|
---|
1576 | CLD
|
---|
1577 | MOV NewLine,0
|
---|
1578 | LEA EDI,NewStr
|
---|
1579 | MOV ESI,p
|
---|
1580 | Inc EDI
|
---|
1581 | Xor ECX,ECX
|
---|
1582 | !ib1:
|
---|
1583 | CMPD len,0
|
---|
1584 | JE !ib9
|
---|
1585 | CMP ECX,StrL
|
---|
1586 | JB !ib10
|
---|
1587 | CMPB [ESI+0],13
|
---|
1588 | JE !ib10
|
---|
1589 | CMPB [ESI+0],10
|
---|
1590 | JE !ib10
|
---|
1591 | JMP !ib6
|
---|
1592 | !ib10:
|
---|
1593 | LODSB
|
---|
1594 | DECD len
|
---|
1595 | CMP AL,13
|
---|
1596 | JE !ib3
|
---|
1597 | CMP AL,10
|
---|
1598 | JE !ib4
|
---|
1599 | CMP AL,9
|
---|
1600 | JE !ib2
|
---|
1601 | CMP AL,32
|
---|
1602 | JAE !ib5
|
---|
1603 | MOV AL,32
|
---|
1604 | JMP !ib5
|
---|
1605 | !ib2: {#9}
|
---|
1606 | MOV EBX,ECX
|
---|
1607 | MOV EDX,Tabs
|
---|
1608 | // Insert spaces Until To the Next tab Mark
|
---|
1609 | !ib8:
|
---|
1610 | CMP EDX,EBX
|
---|
1611 | JA !ib7
|
---|
1612 | ADD EDX,Tabs
|
---|
1613 | JMP !ib8
|
---|
1614 | !ib7:
|
---|
1615 | SUB EDX,EBX
|
---|
1616 | // EDX = Count Of spaces
|
---|
1617 | ADD EBX,EDX
|
---|
1618 | CMP EBX,StrL
|
---|
1619 | JA !ib6
|
---|
1620 | MOV ECX,EDX
|
---|
1621 | MOV AL,32
|
---|
1622 | REP
|
---|
1623 | STOSB
|
---|
1624 | MOV ECX,EBX
|
---|
1625 | JMP !ib1
|
---|
1626 | !ib3: {#13}
|
---|
1627 | CMPB [ESI],10
|
---|
1628 | JNE !ib6
|
---|
1629 | LODSB
|
---|
1630 | DECD len
|
---|
1631 | JMP !ib6
|
---|
1632 | !ib4: {#10}
|
---|
1633 | CMPB [ESI],13
|
---|
1634 | JNE !ib6
|
---|
1635 | LODSB
|
---|
1636 | DECD len
|
---|
1637 | JMP !ib6
|
---|
1638 | !ib5: {>#31}
|
---|
1639 | STOSB
|
---|
1640 | Inc ECX
|
---|
1641 | CMP ECX,StrL
|
---|
1642 | JBE !ib1
|
---|
1643 | !ib6:
|
---|
1644 | MOV NewLine,1
|
---|
1645 | !ib9:
|
---|
1646 | MOV P,ESI
|
---|
1647 | MOV NewStr,CL
|
---|
1648 | End;
|
---|
1649 |
|
---|
1650 | FWorkLine := FWorkLine + NewStr;
|
---|
1651 | If Length(FWorkLine) > StringLength Then SetLength(FWorkLine,StringLength);
|
---|
1652 | lwl := Length(FWorkLine);
|
---|
1653 | GetMem(FActLine^.zk, lwl+1);
|
---|
1654 | FActLine^.zk^ := FWorkLine;
|
---|
1655 | WLactivated := False;
|
---|
1656 | If NewLine Then
|
---|
1657 | Begin
|
---|
1658 | _InsertLine(FActLine);
|
---|
1659 | FActLine := FActLine^.Next;
|
---|
1660 | FWorkLine := '';
|
---|
1661 | End;
|
---|
1662 | End;
|
---|
1663 |
|
---|
1664 | _ReadWorkLine;
|
---|
1665 |
|
---|
1666 | // Set Result To the End Of the inserted block
|
---|
1667 | Result.Line := FActLine;
|
---|
1668 | Result.X := Length(FWorkLine);
|
---|
1669 | Inc(Result.X);
|
---|
1670 |
|
---|
1671 | If marknew Then ICB.Last := Result;
|
---|
1672 |
|
---|
1673 | FWorkLine := FWorkLine + laststr;
|
---|
1674 | _WriteWorkLine;
|
---|
1675 |
|
---|
1676 | _ICBCheckX;
|
---|
1677 | _ICBSetMark;
|
---|
1678 | ICBVisible := True;
|
---|
1679 | SetSliderValues;
|
---|
1680 | SetLineColorFlag(OldActLine,FActLine);
|
---|
1681 | FActLine := OldActLine;
|
---|
1682 | Modified := True;
|
---|
1683 | End;
|
---|
1684 |
|
---|
1685 |
|
---|
1686 |
|
---|
1687 | {determine whether the viewarea Change its horizontal Position}
|
---|
1688 | Function TEditor._HorizMove:Boolean;
|
---|
1689 | Begin
|
---|
1690 | Result := ScrOffsX <> FFileCursor.X-FScrCursor.X+1;
|
---|
1691 | ScrOffsX := FFileCursor.X-FScrCursor.X+1;
|
---|
1692 | End;
|
---|
1693 |
|
---|
1694 |
|
---|
1695 | {Change the actual File Cursor Position}
|
---|
1696 | Function TEditor._GotoPosition(P:TEditorPos):Boolean;
|
---|
1697 | Var deltaY,deltaX,I:LongInt;
|
---|
1698 | pl:PLine;
|
---|
1699 | ps:PString;
|
---|
1700 | Begin
|
---|
1701 | Result := False;
|
---|
1702 | If (P.Y < 1) Or (P.Y > FCountLines) Or
|
---|
1703 | (P.X < 1) Or (P.X > StringLength) Then Exit;
|
---|
1704 | FlushWorkLine;
|
---|
1705 |
|
---|
1706 | deltaX := P.X - FFileCursor.X;
|
---|
1707 | FFileCursor.X := P.X;
|
---|
1708 | If (FScrCursor.X + deltaX < 1) Or (FScrCursor.X + deltaX > FWinSize.X) Then
|
---|
1709 | Begin
|
---|
1710 | FScrCursor.X := FWinSize.X;
|
---|
1711 | If FScrCursor.X <= 0 Then FScrCursor.X := 1;
|
---|
1712 | If P.X < FScrCursor.X Then FScrCursor.X := P.X;
|
---|
1713 | Result := True;
|
---|
1714 | End
|
---|
1715 | Else FScrCursor.X := FScrCursor.X + deltaX;
|
---|
1716 |
|
---|
1717 | deltaY := P.Y - FFileCursor.Y;
|
---|
1718 | FFileCursor.Y := P.Y;
|
---|
1719 | If (FScrCursor.Y + deltaY < 1) Or (FScrCursor.Y + deltaY > FWinSize.Y) Then
|
---|
1720 | Begin
|
---|
1721 | FScrCursor.Y := FWinSize.Y Div 2;
|
---|
1722 | If FScrCursor.Y <= 0 Then FScrCursor.Y := 1;
|
---|
1723 | If P.Y < FScrCursor.Y Then FScrCursor.Y := P.Y;
|
---|
1724 | Result := True;
|
---|
1725 | End
|
---|
1726 | Else FScrCursor.Y := FScrCursor.Y + deltaY;
|
---|
1727 |
|
---|
1728 | pl := _Index2PLine(P.Y);
|
---|
1729 | FActLine := pl;
|
---|
1730 | For I := FScrCursor.Y DownTo 2 Do
|
---|
1731 | If pl <> Nil Then pl := pl^.Prev;
|
---|
1732 | If pl = Nil Then pl := FActLine;
|
---|
1733 | FTopScreenLine := pl;
|
---|
1734 |
|
---|
1735 |
|
---|
1736 | If Application.DBCSSystem Then
|
---|
1737 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1738 | ps := _PLine2PString(FActLine);
|
---|
1739 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
1740 | Begin
|
---|
1741 | KeyRepeat := 1;
|
---|
1742 | _CursorLeft;
|
---|
1743 | End;
|
---|
1744 | End;
|
---|
1745 | End;
|
---|
1746 |
|
---|
1747 |
|
---|
1748 | {basic Cursor Movement}
|
---|
1749 | Function TEditor._CursorDown:Boolean;
|
---|
1750 | Var ToScroll:Integer;
|
---|
1751 | maxrep,REP,T:Integer;
|
---|
1752 | ps:PString;
|
---|
1753 | Begin
|
---|
1754 | Result := False;
|
---|
1755 | If FFileCursor.Y = FCountLines Then Exit;
|
---|
1756 | FlushWorkLine;
|
---|
1757 |
|
---|
1758 | REP := KeyRepeat;
|
---|
1759 | maxrep := (FWinSize.Y Div 2) + 1;
|
---|
1760 | If REP > maxrep Then REP := maxrep;
|
---|
1761 | If FFileCursor.Y + REP > FCountLines Then REP := FCountLines - FFileCursor.Y;
|
---|
1762 | If REP = 0 Then Exit;
|
---|
1763 |
|
---|
1764 | Inc(FFileCursor.Y,REP);
|
---|
1765 | For T := 1 To REP Do FActLine := FActLine^.Next;
|
---|
1766 | If FScrCursor.Y + REP > FWinSize.Y Then {ScrollDown}
|
---|
1767 | Begin
|
---|
1768 | ToScroll := (FScrCursor.Y+REP) - FWinSize.Y;
|
---|
1769 | FScrCursor.Y := FWinSize.Y;
|
---|
1770 | For T := 1 To ToScroll Do FTopScreenLine := FTopScreenLine^.Next;
|
---|
1771 | Result := True;
|
---|
1772 | End
|
---|
1773 | Else Inc(FScrCursor.Y,REP);
|
---|
1774 |
|
---|
1775 |
|
---|
1776 | If Application.DBCSSystem Then
|
---|
1777 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1778 | ps := _PLine2PString(FActLine);
|
---|
1779 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
1780 | Begin
|
---|
1781 | KeyRepeat := 1;
|
---|
1782 | _CursorLeft;
|
---|
1783 | End;
|
---|
1784 | End;
|
---|
1785 | End;
|
---|
1786 |
|
---|
1787 |
|
---|
1788 | Function TEditor._CursorUp:Boolean;
|
---|
1789 | Var ToScroll:Integer;
|
---|
1790 | maxrep,REP,T:Integer;
|
---|
1791 | ps:PString;
|
---|
1792 | Begin
|
---|
1793 | Result := False;
|
---|
1794 | If FFileCursor.Y = 1 Then Exit;
|
---|
1795 | FlushWorkLine;
|
---|
1796 |
|
---|
1797 | REP := KeyRepeat;
|
---|
1798 | maxrep := (FWinSize.Y Div 2) + 1;
|
---|
1799 | If REP > maxrep Then REP := maxrep;
|
---|
1800 | If FFileCursor.Y <= REP Then REP := FFileCursor.Y - 1;
|
---|
1801 | If REP = 0 Then Exit;
|
---|
1802 |
|
---|
1803 | Dec(FFileCursor.Y,REP);
|
---|
1804 | For T := 1 To REP Do FActLine := FActLine^.Prev;
|
---|
1805 | If REP >= FScrCursor.Y Then {ScrollUp}
|
---|
1806 | Begin
|
---|
1807 | ToScroll := REP - FScrCursor.Y + 1;
|
---|
1808 | FScrCursor.Y := 1;
|
---|
1809 | For T := 1 To ToScroll Do FTopScreenLine := FTopScreenLine^.Prev;
|
---|
1810 | Result := True;
|
---|
1811 | End
|
---|
1812 | Else Dec(FScrCursor.Y,REP);
|
---|
1813 |
|
---|
1814 |
|
---|
1815 | If Application.DBCSSystem Then
|
---|
1816 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1817 | ps := _PLine2PString(FActLine);
|
---|
1818 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
1819 | Begin
|
---|
1820 | KeyRepeat := 1;
|
---|
1821 | _CursorLeft;
|
---|
1822 | End;
|
---|
1823 | End;
|
---|
1824 | End;
|
---|
1825 |
|
---|
1826 |
|
---|
1827 | Function TEditor._CursorRight:Boolean;
|
---|
1828 | Var maxrep,REP:Integer;
|
---|
1829 | ps:PString;
|
---|
1830 | Begin
|
---|
1831 | Result := False;
|
---|
1832 | If FFileCursor.X >= StringLength Then Exit;
|
---|
1833 |
|
---|
1834 | REP := KeyRepeat;
|
---|
1835 | maxrep := (FWinSize.X Div 2) + 1;
|
---|
1836 | If REP > maxrep Then REP := maxrep;
|
---|
1837 | If FFileCursor.X + REP > StringLength Then REP := StringLength - FFileCursor.X;
|
---|
1838 |
|
---|
1839 | If Application.DBCSSystem Then
|
---|
1840 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1841 | ps := _PLine2PString(FActLine);
|
---|
1842 | If QueryDBCSFirstByte(ps^, FFileCursor.X+REP-1) Then Inc(REP);
|
---|
1843 | End;
|
---|
1844 |
|
---|
1845 | Inc(FFileCursor.X,REP);
|
---|
1846 | If FScrCursor.X + REP > FWinSize.X Then
|
---|
1847 | Begin
|
---|
1848 | FScrCursor.X := FWinSize.X;
|
---|
1849 | Result := True;
|
---|
1850 | End
|
---|
1851 | Else Inc(FScrCursor.X,REP);
|
---|
1852 | End;
|
---|
1853 |
|
---|
1854 |
|
---|
1855 | Function TEditor._CursorLeft:Boolean;
|
---|
1856 | Var maxrep,REP:Integer;
|
---|
1857 | ps:PString;
|
---|
1858 | Begin
|
---|
1859 | Result := False;
|
---|
1860 | If FFileCursor.X <= 1 Then Exit;
|
---|
1861 |
|
---|
1862 | REP := KeyRepeat;
|
---|
1863 | maxrep := (FWinSize.X Div 2) + 1;
|
---|
1864 | If REP > maxrep Then REP := maxrep;
|
---|
1865 | If FFileCursor.X <= REP Then REP := FFileCursor.X - 1;
|
---|
1866 |
|
---|
1867 | If Application.DBCSSystem Then
|
---|
1868 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1869 | ps := _PLine2PString(FActLine);
|
---|
1870 | If QueryDBCSFirstByte(ps^, FFileCursor.X-REP-1) Then Inc(REP);
|
---|
1871 | End;
|
---|
1872 |
|
---|
1873 | Dec(FFileCursor.X,REP);
|
---|
1874 | If FScrCursor.X - REP < 1 Then
|
---|
1875 | Begin
|
---|
1876 | FScrCursor.X := 1;
|
---|
1877 | Result := True;
|
---|
1878 | End
|
---|
1879 | Else Dec(FScrCursor.X,REP);
|
---|
1880 | End;
|
---|
1881 |
|
---|
1882 |
|
---|
1883 | Function TEditor._CursorHome:Boolean;
|
---|
1884 | Begin
|
---|
1885 | Result := False;
|
---|
1886 | If FFileCursor.X = 1 Then Exit;
|
---|
1887 |
|
---|
1888 | _HorizMove;
|
---|
1889 | FFileCursor.X := 1;
|
---|
1890 | FScrCursor.X := 1;
|
---|
1891 | Result := _HorizMove;
|
---|
1892 | End;
|
---|
1893 |
|
---|
1894 |
|
---|
1895 | Function TEditor._CursorEnd:Boolean;
|
---|
1896 | Var LastChar:Integer;
|
---|
1897 | Begin
|
---|
1898 | Result := False;
|
---|
1899 | FlushWorkLine;
|
---|
1900 | LastChar := Length(_PLine2PString(FActLine)^);
|
---|
1901 | Inc(LastChar);
|
---|
1902 | If LastChar > StringLength Then LastChar := StringLength;
|
---|
1903 | If FFileCursor.X = LastChar Then Exit;
|
---|
1904 |
|
---|
1905 | _HorizMove;
|
---|
1906 | FScrCursor.X := LastChar - (FFileCursor.X - FScrCursor.X);
|
---|
1907 | FFileCursor.X := LastChar;
|
---|
1908 | If FScrCursor.X < 1 Then FScrCursor.X := LastChar;
|
---|
1909 | If FScrCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X;
|
---|
1910 | Result := _HorizMove;
|
---|
1911 | End;
|
---|
1912 |
|
---|
1913 |
|
---|
1914 | Function TEditor._CursorPageDown:Boolean;
|
---|
1915 | Var I:Integer;
|
---|
1916 | ps:PString;
|
---|
1917 | Begin
|
---|
1918 | Result := False;
|
---|
1919 | If FFileCursor.Y >= FCountLines Then Exit;
|
---|
1920 |
|
---|
1921 | FlushWorkLine;
|
---|
1922 | For I := 1 To FWinSize.Y-1 Do
|
---|
1923 | Begin
|
---|
1924 | If FActLine^.Next <> Nil Then
|
---|
1925 | Begin
|
---|
1926 | {SrollDown}
|
---|
1927 | FActLine := FActLine^.Next;
|
---|
1928 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
1929 | Inc(FFileCursor.Y);
|
---|
1930 | End;
|
---|
1931 | End;
|
---|
1932 | Result := True;
|
---|
1933 |
|
---|
1934 |
|
---|
1935 | If Application.DBCSSystem Then
|
---|
1936 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1937 | ps := _PLine2PString(FActLine);
|
---|
1938 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
1939 | Begin
|
---|
1940 | KeyRepeat := 1;
|
---|
1941 | _CursorLeft;
|
---|
1942 | End;
|
---|
1943 | End;
|
---|
1944 | End;
|
---|
1945 |
|
---|
1946 |
|
---|
1947 | Function TEditor._CursorPageUp:Boolean;
|
---|
1948 | Var I:Integer;
|
---|
1949 | ps:PString;
|
---|
1950 | Begin
|
---|
1951 | Result := False;
|
---|
1952 | If FFileCursor.Y <= 1 Then Exit;
|
---|
1953 |
|
---|
1954 | FlushWorkLine;
|
---|
1955 | For I := 1 To FWinSize.Y-1 Do
|
---|
1956 | Begin
|
---|
1957 | If FTopScreenLine^.Prev <> Nil Then
|
---|
1958 | Begin
|
---|
1959 | {ScrollUp}
|
---|
1960 | FActLine := FActLine^.Prev;
|
---|
1961 | FTopScreenLine := FTopScreenLine^.Prev;
|
---|
1962 | Dec(FFileCursor.Y);
|
---|
1963 | End
|
---|
1964 | Else
|
---|
1965 | Begin
|
---|
1966 | If FActLine^.Prev <> Nil Then
|
---|
1967 | Begin
|
---|
1968 | {JumpUp}
|
---|
1969 | FActLine := FActLine^.Prev;
|
---|
1970 | Dec(FFileCursor.Y);
|
---|
1971 | Dec(FScrCursor.Y);
|
---|
1972 | End;
|
---|
1973 | End;
|
---|
1974 | End;
|
---|
1975 | Result := True;
|
---|
1976 |
|
---|
1977 |
|
---|
1978 | If Application.DBCSSystem Then
|
---|
1979 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
1980 | ps := _PLine2PString(FActLine);
|
---|
1981 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
1982 | Begin
|
---|
1983 | KeyRepeat := 1;
|
---|
1984 | _CursorLeft;
|
---|
1985 | End;
|
---|
1986 | End;
|
---|
1987 | End;
|
---|
1988 |
|
---|
1989 |
|
---|
1990 | Function TEditor._CursorRollUp:Boolean;
|
---|
1991 | Var ps:PString;
|
---|
1992 | Begin
|
---|
1993 | Result := False;
|
---|
1994 | If FTopScreenLine^.Prev = Nil Then Exit;
|
---|
1995 |
|
---|
1996 | FlushWorkLine;
|
---|
1997 | FTopScreenLine := FTopScreenLine^.Prev;
|
---|
1998 | If FScrCursor.Y >= FWinSize.Y Then
|
---|
1999 | Begin
|
---|
2000 | FActLine := FActLine^.Prev;
|
---|
2001 | Dec(FFileCursor.Y);
|
---|
2002 |
|
---|
2003 | If Application.DBCSSystem Then
|
---|
2004 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
2005 | ps := _PLine2PString(FActLine);
|
---|
2006 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
2007 | Begin
|
---|
2008 | KeyRepeat := 1;
|
---|
2009 | _CursorLeft;
|
---|
2010 | End;
|
---|
2011 | End;
|
---|
2012 | End
|
---|
2013 | Else Inc(FScrCursor.Y);
|
---|
2014 | Result := True;
|
---|
2015 | End;
|
---|
2016 |
|
---|
2017 |
|
---|
2018 | Function TEditor._CursorRollDown:Boolean;
|
---|
2019 | Var ps:PString;
|
---|
2020 | Begin
|
---|
2021 | Result := False;
|
---|
2022 | If FActLine^.Next = Nil Then Exit;
|
---|
2023 |
|
---|
2024 | FlushWorkLine;
|
---|
2025 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
2026 | If FScrCursor.Y <= 1 Then
|
---|
2027 | Begin
|
---|
2028 | FActLine := FActLine^.Next;
|
---|
2029 | Inc(FFileCursor.Y);
|
---|
2030 |
|
---|
2031 | If Application.DBCSSystem Then
|
---|
2032 | Begin {Make sure, that the Cursor cannot occur within A dbcs Char}
|
---|
2033 | ps := _PLine2PString(FActLine);
|
---|
2034 | If QueryDBCSFirstByte(ps^, FFileCursor.X-1) Then
|
---|
2035 | Begin
|
---|
2036 | KeyRepeat := 1;
|
---|
2037 | _CursorLeft;
|
---|
2038 | End;
|
---|
2039 | End;
|
---|
2040 | End
|
---|
2041 | Else Dec(FScrCursor.Y);
|
---|
2042 | Result := True;
|
---|
2043 | End;
|
---|
2044 |
|
---|
2045 |
|
---|
2046 | Function TEditor._CursorWordRight:Boolean;
|
---|
2047 | Var pl:PLine;
|
---|
2048 | I,dFCY:LongInt;
|
---|
2049 | FCX:Integer;
|
---|
2050 | cc:Integer;
|
---|
2051 | Begin
|
---|
2052 | Result := False;
|
---|
2053 |
|
---|
2054 | _HorizMove;
|
---|
2055 | FlushWorkLine;
|
---|
2056 | If (FFileCursor.X > Length(FActLine^.zk^)) Or
|
---|
2057 | (FFileCursor.X = StringLength) Then
|
---|
2058 | Begin
|
---|
2059 | pl := FActLine^.Next;
|
---|
2060 | If pl = Nil Then
|
---|
2061 | Begin
|
---|
2062 | Result := _CursorEnd;
|
---|
2063 | Exit;
|
---|
2064 | End;
|
---|
2065 | FFileCursor.X := 1;
|
---|
2066 | FScrCursor.X := 1;
|
---|
2067 | dFCY := 0;
|
---|
2068 | cc := 0;
|
---|
2069 | While (pl <> Nil) And (cc = 0) Do
|
---|
2070 | Begin
|
---|
2071 | Inc(dFCY);
|
---|
2072 | If Length(pl^.zk^) = 0 Then pl := pl^.Next
|
---|
2073 | Else cc := 1; {Line With <> '' found}
|
---|
2074 | End;
|
---|
2075 |
|
---|
2076 | For I := 1 To dFCY Do
|
---|
2077 | Begin
|
---|
2078 | FActLine := FActLine^.Next;
|
---|
2079 | Inc(FFileCursor.Y);
|
---|
2080 | If FScrCursor.Y = FWinSize.Y Then
|
---|
2081 | Begin
|
---|
2082 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
2083 | Result := True;
|
---|
2084 | End
|
---|
2085 | Else Inc(FScrCursor.Y);
|
---|
2086 | End;
|
---|
2087 | End
|
---|
2088 | Else cc := 2; {Next Word In the same Line}
|
---|
2089 |
|
---|
2090 | FCX := 0;
|
---|
2091 | If ((cc=1) And Not (FActLine^.zk^[1] In NormalChars)) Or (cc = 2) Then
|
---|
2092 | Begin
|
---|
2093 | While (FActLine^.zk^[FFileCursor.X+FCX] In NormalChars) And
|
---|
2094 | (FFileCursor.X+FCX <= Length(FActLine^.zk^)) Do Inc(FCX);
|
---|
2095 | While (Not (FActLine^.zk^[FFileCursor.X+FCX] In NormalChars)) And
|
---|
2096 | (FFileCursor.X+FCX <= Length(FActLine^.zk^)) Do Inc(FCX);
|
---|
2097 | End;
|
---|
2098 |
|
---|
2099 | FFileCursor.X := FFileCursor.X+FCX;
|
---|
2100 | If FFileCursor.X > StringLength Then FFileCursor.X := StringLength;
|
---|
2101 | FScrCursor.X := FScrCursor.X+FCX;
|
---|
2102 | If FScrCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X;
|
---|
2103 |
|
---|
2104 | Result := Result Or _HorizMove;
|
---|
2105 | End;
|
---|
2106 |
|
---|
2107 |
|
---|
2108 | Function TEditor._CursorWordLeft:Boolean;
|
---|
2109 | Var pl:PLine;
|
---|
2110 | I,dFCY:LongInt;
|
---|
2111 | FCX:Integer;
|
---|
2112 | cc:Integer;
|
---|
2113 | lzk:Integer;
|
---|
2114 | Begin
|
---|
2115 | Result := False;
|
---|
2116 |
|
---|
2117 | _HorizMove;
|
---|
2118 | FlushWorkLine;
|
---|
2119 | lzk := Length(FActLine^.zk^);
|
---|
2120 | If FFileCursor.X > lzk+1 Then _CursorEnd;
|
---|
2121 | If FFileCursor.X > 1 Then
|
---|
2122 | Begin
|
---|
2123 | cc := 0;
|
---|
2124 | FCX := 1;
|
---|
2125 | If Not (FActLine^.zk^[FFileCursor.X-FCX] In NormalChars) Then
|
---|
2126 | While (Not (FActLine^.zk^[FFileCursor.X-FCX] In NormalChars)) And
|
---|
2127 | (FFileCursor.X-FCX > 0) Do Inc(FCX);
|
---|
2128 | If FFileCursor.X-FCX = 0 Then cc := 1;
|
---|
2129 |
|
---|
2130 | While (FActLine^.zk^[FFileCursor.X-FCX] In NormalChars) And
|
---|
2131 | (FFileCursor.X-FCX > 0) Do Inc(FCX);
|
---|
2132 |
|
---|
2133 | FFileCursor.X := FFileCursor.X-FCX+1;
|
---|
2134 | If FCX > FScrCursor.X Then FScrCursor.X := 1
|
---|
2135 | Else FScrCursor.X := FScrCursor.X-FCX+1;
|
---|
2136 | End
|
---|
2137 | Else cc := 1; {minimal 1 Line up}
|
---|
2138 |
|
---|
2139 | If cc = 1 Then
|
---|
2140 | Begin
|
---|
2141 | pl := FActLine^.Prev;
|
---|
2142 | If pl = Nil Then
|
---|
2143 | Begin
|
---|
2144 | Result := _CursorHome;
|
---|
2145 | Exit;
|
---|
2146 | End;
|
---|
2147 | dFCY := 0;
|
---|
2148 | While (pl <> Nil) Do
|
---|
2149 | Begin
|
---|
2150 | Inc(dFCY);
|
---|
2151 | If Length(pl^.zk^) = 0 Then pl := pl^.Prev
|
---|
2152 | Else pl := Nil; {Line With <> '' found}
|
---|
2153 | End;
|
---|
2154 |
|
---|
2155 | For I := 1 To dFCY Do
|
---|
2156 | Begin
|
---|
2157 | FActLine := FActLine^.Prev;
|
---|
2158 | Dec(FFileCursor.Y);
|
---|
2159 | If FScrCursor.Y = 1 Then
|
---|
2160 | Begin
|
---|
2161 | FTopScreenLine := FTopScreenLine^.Prev;
|
---|
2162 | Result := True;
|
---|
2163 | End
|
---|
2164 | Else Dec(FScrCursor.Y);
|
---|
2165 | End;
|
---|
2166 | Result := _CursorEnd Or Result;
|
---|
2167 | End;
|
---|
2168 | Result := Result Or _HorizMove;
|
---|
2169 | End;
|
---|
2170 |
|
---|
2171 |
|
---|
2172 |
|
---|
2173 | {determine whether the internal Clipboard Is Empty Or Not}
|
---|
2174 | Function TEditor._ICBExist:Boolean;
|
---|
2175 | Begin
|
---|
2176 | Result := False;
|
---|
2177 | If Not ICBVisible Then Exit;
|
---|
2178 | If (ICB.First.Line = Nil) Or (ICB.Last.Line = Nil) Then Exit;
|
---|
2179 | If (ICB.First.Line = ICB.Last.Line) And (ICB.First.X = ICB.Last.X) Then Exit;
|
---|
2180 | If FSelectMode = smColumnBlock Then
|
---|
2181 | If ICB.First.X = ICB.Last.X Then Exit;
|
---|
2182 | Result := True;
|
---|
2183 | End;
|
---|
2184 |
|
---|
2185 |
|
---|
2186 | {determine whether the ICB Is persistent}
|
---|
2187 | Function TEditor._ICBPersistent:Boolean;
|
---|
2188 | Begin
|
---|
2189 | Result := eoPersistentBlocks In FEditOpt;
|
---|
2190 | End;
|
---|
2191 |
|
---|
2192 |
|
---|
2193 | {determine whether the ICB MUST be overwritten Or Not}
|
---|
2194 | Function TEditor._ICBOverwrite:Boolean;
|
---|
2195 | Begin
|
---|
2196 | Result := eoOverwriteBlock In FEditOpt;
|
---|
2197 | End;
|
---|
2198 |
|
---|
2199 |
|
---|
2200 | {Clear the Mark Of the Lines Of the actual ICB And Set ICB To Nil}
|
---|
2201 | Function TEditor._ICBClearICB:Boolean;
|
---|
2202 | Begin
|
---|
2203 | Result := _ICBClearMark;
|
---|
2204 | ICB.First.Line := Nil;
|
---|
2205 | ICB.Last.Line := Nil;
|
---|
2206 | End;
|
---|
2207 |
|
---|
2208 |
|
---|
2209 | {Clear the Mark Of the Lines Of the actual ICB}
|
---|
2210 | Function TEditor._ICBClearMark:Boolean;
|
---|
2211 | Var pl:PLine;
|
---|
2212 | Begin
|
---|
2213 | If (ICB.First.Line <> Nil) And (ICB.Last.Line <> Nil) Then
|
---|
2214 | Begin
|
---|
2215 | pl := ICB.First.Line;
|
---|
2216 | While pl <> ICB.Last.Line Do
|
---|
2217 | Begin
|
---|
2218 | pl^.flag := pl^.flag And Not ciSelected;
|
---|
2219 | pl := pl^.Next;
|
---|
2220 | End;
|
---|
2221 | pl^.flag := pl^.flag And Not ciSelected;
|
---|
2222 | Result := True;
|
---|
2223 | End
|
---|
2224 | Else Result := False;
|
---|
2225 | End;
|
---|
2226 |
|
---|
2227 |
|
---|
2228 | {Set the Mark Of the Lines Of the actual ICB}
|
---|
2229 | Function TEditor._ICBSetMark:Boolean;
|
---|
2230 | Var pl:PLine;
|
---|
2231 | Begin
|
---|
2232 | If (ICB.First.Line <> Nil) And (ICB.Last.Line <> Nil) Then
|
---|
2233 | Begin
|
---|
2234 | pl := ICB.First.Line;
|
---|
2235 | While pl <> ICB.Last.Line Do
|
---|
2236 | Begin
|
---|
2237 | pl^.flag := pl^.flag Or ciSelected;
|
---|
2238 | pl := pl^.Next;
|
---|
2239 | End;
|
---|
2240 | pl^.flag := pl^.flag Or ciSelected;
|
---|
2241 | Result := True;
|
---|
2242 | End
|
---|
2243 | Else Result := False;
|
---|
2244 | End;
|
---|
2245 |
|
---|
2246 |
|
---|
2247 | {Delete the ICB block, including Undo}
|
---|
2248 | Function TEditor._ICBDeleteICB:Boolean;
|
---|
2249 | Var FrameFirst:PLine;
|
---|
2250 | FrameLast:PLine;
|
---|
2251 | firststring:String;
|
---|
2252 | laststring:String;
|
---|
2253 | CL:LongInt;
|
---|
2254 | P:TEditorPos;
|
---|
2255 | Begin
|
---|
2256 | Result := False;
|
---|
2257 | If Not _ICBExist Then Exit;
|
---|
2258 | FlushWorkLine;
|
---|
2259 |
|
---|
2260 | P.Y := _PLine2Index(ICB.First.Line);
|
---|
2261 | P.X := ICB.First.X;
|
---|
2262 | _GotoPosition(P);
|
---|
2263 |
|
---|
2264 | If FSelectMode <> smColumnBlock Then
|
---|
2265 | Begin
|
---|
2266 | firststring := _ReadString(ICB.First.Line,1,ICB.First.X-1);
|
---|
2267 | laststring := _ReadString(ICB.Last.Line,ICB.Last.X,-1);
|
---|
2268 |
|
---|
2269 | FrameFirst := ICB.First.Line^.Prev;
|
---|
2270 | FrameLast := ICB.Last.Line^.Next;
|
---|
2271 | (*Undo*)
|
---|
2272 | CL := _MoveUndoLines(FUndoList,ICB.First.Line,ICB.Last.Line);
|
---|
2273 | (*Undo*)
|
---|
2274 | _Connect(FrameFirst,FrameLast);
|
---|
2275 | Dec(FCountLines,CL);
|
---|
2276 | Modified := True;
|
---|
2277 |
|
---|
2278 | FActLine := _InsertLine(FrameFirst);
|
---|
2279 | If FScrCursor.Y = 1 Then FTopScreenLine := FActLine;
|
---|
2280 | FWorkLine := firststring + laststring;
|
---|
2281 | _WriteWorkLine;
|
---|
2282 |
|
---|
2283 | ICB.First.Line := FActLine;
|
---|
2284 | ICB.First.X := FFileCursor.X;
|
---|
2285 | ICB.Last := ICB.First;
|
---|
2286 |
|
---|
2287 | _ICBSetMark;
|
---|
2288 | ICBVisible := True;
|
---|
2289 | SetSliderValues;
|
---|
2290 | If FrameFirst <> Nil Then SetLineColorFlag(FrameFirst,FActLine)
|
---|
2291 | Else UpdateLineColorFlag(FActLine);
|
---|
2292 |
|
---|
2293 | (*Undo*)
|
---|
2294 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FrameLast));
|
---|
2295 | (*Undo*)
|
---|
2296 | End
|
---|
2297 | Else {Extended Selection}
|
---|
2298 | Begin
|
---|
2299 | (*Undo*)
|
---|
2300 | _CopyUndoLines(ICB.First.Line,ICB.Last.Line);
|
---|
2301 | (*Undo*)
|
---|
2302 | _ICBClearMark;
|
---|
2303 | FActLine := ICB.First.Line;
|
---|
2304 | While FActLine <> ICB.Last.Line^.Next Do
|
---|
2305 | Begin
|
---|
2306 | If Length(FActLine^.zk^) >= ICB.First.X Then
|
---|
2307 | Begin
|
---|
2308 | _ReadWorkLine;
|
---|
2309 | _DeleteString(ICB.First.X, ICB.Last.X - ICB.First.X);
|
---|
2310 | _WriteWorkLine;
|
---|
2311 | End;
|
---|
2312 | FActLine := FActLine^.Next;
|
---|
2313 | End;
|
---|
2314 | FActLine := ICB.First.Line;
|
---|
2315 |
|
---|
2316 | ICB.Last := ICB.First;
|
---|
2317 | _ICBSetMark;
|
---|
2318 | ICBVisible := True;
|
---|
2319 | SetLineColorFlag(ICB.First.Line,ICB.Last.Line);
|
---|
2320 | End;
|
---|
2321 | (*Undo*)
|
---|
2322 | LastUndoGroup := ugNoGroup;
|
---|
2323 | (*Undo*)
|
---|
2324 | Result := True;
|
---|
2325 | End;
|
---|
2326 |
|
---|
2327 |
|
---|
2328 | {Cut the ICB.X values At the End Of Lines}
|
---|
2329 | Procedure TEditor._ICBCheckX;
|
---|
2330 | Var zk:PString;
|
---|
2331 | lzk:Integer;
|
---|
2332 | Begin
|
---|
2333 | If FSelectMode = smColumnBlock Then Exit;
|
---|
2334 |
|
---|
2335 | If ICB.First.Line <> Nil Then
|
---|
2336 | Begin
|
---|
2337 | zk := _PLine2PString(ICB.First.Line);
|
---|
2338 | lzk := Length(zk^);
|
---|
2339 | If Length(zk^) < ICB.First.X Then ICB.First.X := lzk+1;
|
---|
2340 | If StringLength < ICB.First.X Then ICB.First.X := StringLength;
|
---|
2341 | End;
|
---|
2342 |
|
---|
2343 | If ICB.Last.Line <> Nil Then
|
---|
2344 | Begin
|
---|
2345 | zk := _PLine2PString(ICB.Last.Line);
|
---|
2346 | lzk := Length(zk^);
|
---|
2347 | If Length(zk^) < ICB.Last.X Then ICB.Last.X := lzk+1;
|
---|
2348 | If StringLength < ICB.Last.X Then ICB.Last.X := StringLength;
|
---|
2349 | End;
|
---|
2350 | End;
|
---|
2351 |
|
---|
2352 |
|
---|
2353 | {Set the New Selection Position And Mark the Lines If neccesary}
|
---|
2354 | Procedure TEditor._ICBSetBegin(pl:PLine; X:Integer);
|
---|
2355 | Var pl1:PLine;
|
---|
2356 | Begin
|
---|
2357 | If ICB.Last.Line <> Nil Then
|
---|
2358 | Begin
|
---|
2359 | _ICBClearMark;
|
---|
2360 |
|
---|
2361 | pl1 := ICB.Last.Line;
|
---|
2362 | While (pl1 <> Nil) And (pl <> pl1) Do pl1 := pl1^.Prev;
|
---|
2363 | If (pl = ICB.Last.Line) And (X > ICB.Last.X) Then pl1 := Nil;
|
---|
2364 |
|
---|
2365 | If pl1 = Nil Then ICB.Last.Line := Nil;
|
---|
2366 | End;
|
---|
2367 |
|
---|
2368 | {Set the Begin Mark}
|
---|
2369 | ICB.First.Line := pl;
|
---|
2370 | ICB.First.X := X;
|
---|
2371 | _ICBCheckX;
|
---|
2372 | _ICBSetMark;
|
---|
2373 | ICBVisible := True;
|
---|
2374 | _ICBExtCorrectICB2; {reorder firstx lastx If extselection}
|
---|
2375 | End;
|
---|
2376 |
|
---|
2377 |
|
---|
2378 | {Set the New Selection Position And Mark the Lines If neccesary}
|
---|
2379 | Procedure TEditor._ICBSetEnd(pl:PLine; X:Integer);
|
---|
2380 | Var pl1:PLine;
|
---|
2381 | Begin
|
---|
2382 | If ICB.First.Line <> Nil Then
|
---|
2383 | Begin
|
---|
2384 | _ICBClearMark;
|
---|
2385 |
|
---|
2386 | pl1 := ICB.First.Line;
|
---|
2387 | While (pl1 <> Nil) And (pl <> pl1) Do pl1 := pl1^.Next;
|
---|
2388 | If (pl = ICB.First.Line) And (X < ICB.First.X) Then pl1 := Nil;
|
---|
2389 |
|
---|
2390 | If pl1 = Nil Then ICB.First.Line := Nil;
|
---|
2391 | End;
|
---|
2392 |
|
---|
2393 | {Set the End Mark}
|
---|
2394 | ICB.Last.Line := pl;
|
---|
2395 | ICB.Last.X := X;
|
---|
2396 | _ICBCheckX;
|
---|
2397 | _ICBSetMark;
|
---|
2398 | ICBVisible := True;
|
---|
2399 | _ICBExtCorrectICB2; {reorder firstx lastx If extselection}
|
---|
2400 | End;
|
---|
2401 |
|
---|
2402 |
|
---|
2403 | {calculate Code Of Current Position To ICB}
|
---|
2404 | Function TEditor._ICBPos(pl:PLine; X:Integer):TICBPosition;
|
---|
2405 | Begin
|
---|
2406 | Result := [];
|
---|
2407 | If pl = Nil Then Exit;
|
---|
2408 |
|
---|
2409 | If pl = ICB.First.Line Then
|
---|
2410 | Begin
|
---|
2411 | If X < ICB.First.X Then Result := Result + [ipBeforeICBFirst]
|
---|
2412 | Else Result := Result + [ipAfterICBFirst];
|
---|
2413 | End;
|
---|
2414 |
|
---|
2415 | If pl = ICB.Last.Line Then
|
---|
2416 | Begin
|
---|
2417 | If X < ICB.Last.X Then Result := Result + [ipBeforeICBLast]
|
---|
2418 | Else Result := Result + [ipAfterICBLast];
|
---|
2419 | End;
|
---|
2420 |
|
---|
2421 | If Result = [] Then
|
---|
2422 | If pl^.flag And ciSelected <> 0 Then Result := [ipWithinICB];
|
---|
2423 | End;
|
---|
2424 |
|
---|
2425 |
|
---|
2426 | {transform the actual Position To the ICB Position}
|
---|
2427 | Function TEditor._ICBActPos:TLineX;
|
---|
2428 | Var len:Integer;
|
---|
2429 | zk:PString;
|
---|
2430 | Begin
|
---|
2431 | If FSelectMode <> smColumnBlock Then
|
---|
2432 | Begin
|
---|
2433 | zk := _PLine2PString(FActLine);
|
---|
2434 | len := Length(zk^);
|
---|
2435 | While (len > 0) And (zk^[len] = ' ') Do Dec(len);
|
---|
2436 | If FFileCursor.X > len Then Result.X := len+1
|
---|
2437 | Else Result.X := FFileCursor.X;
|
---|
2438 | End
|
---|
2439 | Else Result.X := FFileCursor.X;
|
---|
2440 | If Result.X > StringLength Then Result.X := StringLength;
|
---|
2441 | Result.Line := FActLine;
|
---|
2442 | End;
|
---|
2443 |
|
---|
2444 |
|
---|
2445 | {Set the New ICB Position To the actual Position And Clear the ICB Mark}
|
---|
2446 | Function TEditor._ICBExtSetICB:Boolean;
|
---|
2447 | Var actLineX:TLineX;
|
---|
2448 | Begin
|
---|
2449 | Result := False;
|
---|
2450 |
|
---|
2451 | actLineX := _ICBActPos;
|
---|
2452 | _ICBClearMark;
|
---|
2453 | If Not ICBVisible Then {force To Create New ICB}
|
---|
2454 | Begin
|
---|
2455 | ICB.First.Line := Nil;
|
---|
2456 | ICBVisible := True;
|
---|
2457 | End;
|
---|
2458 |
|
---|
2459 | If (ICB.First.Line = Nil) Or (ICB.Last.Line = Nil) Then
|
---|
2460 | Begin
|
---|
2461 | ICB.First := actLineX;
|
---|
2462 | ICB.Last := actLineX;
|
---|
2463 | Exit;
|
---|
2464 | End;
|
---|
2465 |
|
---|
2466 | If (ICB.First = actLineX) Or (ICB.Last = actLineX) Then Exit;
|
---|
2467 |
|
---|
2468 | If FSelectMode = smColumnBlock Then
|
---|
2469 | Begin
|
---|
2470 | If ICB.First.Line = actLineX.Line Then
|
---|
2471 | If ICB.Last.X = actLineX.X Then
|
---|
2472 | Begin
|
---|
2473 | ICB.Last.X := ICB.First.X;
|
---|
2474 | ICB.First.X := actLineX.X;
|
---|
2475 | Result := True;
|
---|
2476 | Exit;
|
---|
2477 | End;
|
---|
2478 |
|
---|
2479 | If ICB.Last.Line = actLineX.Line Then
|
---|
2480 | If ICB.First.X = actLineX.X Then
|
---|
2481 | Begin
|
---|
2482 | ICB.First.X := ICB.Last.X;
|
---|
2483 | ICB.Last.X := actLineX.X;
|
---|
2484 | Result := True;
|
---|
2485 | Exit;
|
---|
2486 | End;
|
---|
2487 | End;
|
---|
2488 |
|
---|
2489 | ICB.First := actLineX;
|
---|
2490 | ICB.Last := actLineX;
|
---|
2491 | Result := True;
|
---|
2492 | End;
|
---|
2493 |
|
---|
2494 |
|
---|
2495 | {reorder the Begin And the End Of the ICB If neccessary}
|
---|
2496 | Function TEditor._ICBExtCorrectICB:Boolean;
|
---|
2497 | Var pl:PLine;
|
---|
2498 | LineX:TLineX;
|
---|
2499 | Begin
|
---|
2500 | Result := False;
|
---|
2501 | pl := ICB.First.Line;
|
---|
2502 | If (ICB.First.Line = ICB.Last.Line) And (ICB.First.X > ICB.Last.X)
|
---|
2503 | Then pl := Nil;
|
---|
2504 | While (pl <> ICB.Last.Line) And (pl <> Nil) Do pl := pl^.Next;
|
---|
2505 |
|
---|
2506 | If pl = Nil Then {Exchange First & Last}
|
---|
2507 | Begin
|
---|
2508 | LineX := ICB.First;
|
---|
2509 | ICB.First := ICB.Last;
|
---|
2510 | ICB.Last := LineX;
|
---|
2511 | Result := True;
|
---|
2512 | End;
|
---|
2513 | End;
|
---|
2514 |
|
---|
2515 |
|
---|
2516 | {reorder the Left And Right Of the ICB If neccessary}
|
---|
2517 | Function TEditor._ICBExtCorrectICB2:Boolean;
|
---|
2518 | Var X:Integer;
|
---|
2519 | Begin
|
---|
2520 | Result := False;
|
---|
2521 | If FSelectMode = smColumnBlock Then
|
---|
2522 | If ICB.First.X > ICB.Last.X Then {Exchange Left & Right}
|
---|
2523 | Begin
|
---|
2524 | X := ICB.First.X;
|
---|
2525 | ICB.First.X := ICB.Last.X;
|
---|
2526 | ICB.Last.X := X;
|
---|
2527 | Result := True;
|
---|
2528 | End;
|
---|
2529 | End;
|
---|
2530 |
|
---|
2531 |
|
---|
2532 | Function TEditor._ICBTestIEW(Var y1,y2:Integer):Boolean;
|
---|
2533 | Var _y1,_y2:LongInt;
|
---|
2534 | Begin
|
---|
2535 | Result := False;
|
---|
2536 | If FSelectMode <> smColumnBlock Then Exit;
|
---|
2537 | If (ICB.First.Line = Nil) Or (ICB.Last.Line = Nil) Then Exit;
|
---|
2538 | If ICB.First.Line = ICB.Last.Line Then Exit;
|
---|
2539 | {determine Screen Lines Of ICB And Update y1,y2}
|
---|
2540 | If FActLine = ICB.First.Line Then _y1 := FFileCursor.Y
|
---|
2541 | Else _y1 := _PLine2Index(ICB.First.Line);
|
---|
2542 | If FActLine = ICB.Last.Line Then _y2 := FFileCursor.Y
|
---|
2543 | Else _y2 := _PLine2Index(ICB.Last.Line);
|
---|
2544 | _y1 := FScrCursor.Y - (FFileCursor.Y - _y1); {FTopScreenLine}
|
---|
2545 | _y2 := FScrCursor.Y - (FFileCursor.Y - _y2); {FTopScreenLine}
|
---|
2546 | If _y1 < y1 Then y1 := _y1;
|
---|
2547 | If _y2 > y2 Then y2 := _y2;
|
---|
2548 | Result := True;
|
---|
2549 | End;
|
---|
2550 |
|
---|
2551 |
|
---|
2552 | {Clipboard}
|
---|
2553 |
|
---|
2554 | Function TEditor._SetClipBoardText(P:Pointer; len:LongInt):Boolean;
|
---|
2555 | Var clip:Pointer;
|
---|
2556 | Begin
|
---|
2557 | Result := False;
|
---|
2558 | If Clipboard.Open(Handle) Then
|
---|
2559 | Begin
|
---|
2560 | Try
|
---|
2561 | GetSharedMem(clip,len);
|
---|
2562 | Except
|
---|
2563 | clip := Nil;
|
---|
2564 | End;
|
---|
2565 | If clip = Nil Then
|
---|
2566 | Begin
|
---|
2567 | Clipboard.Close;
|
---|
2568 | SetErrorMessage(LoadNLSStr(SCouldNotCopyText)+'.');
|
---|
2569 | Exit;
|
---|
2570 | End;
|
---|
2571 | System.Move(P^,clip^,len);
|
---|
2572 | Clipboard.Empty;
|
---|
2573 | Clipboard.SetData(LongWord(clip),cfText);
|
---|
2574 | Clipboard.Close;
|
---|
2575 | Result := True;
|
---|
2576 | End
|
---|
2577 | Else SetErrorMessage(LoadNLSStr(SCouldNotAccessClipboard)+'.');
|
---|
2578 | End;
|
---|
2579 |
|
---|
2580 |
|
---|
2581 | Function TEditor._GetClipBoardText(Var P:Pointer; Var len:LongInt):Boolean;
|
---|
2582 | Var clip:Pointer;
|
---|
2583 | Begin
|
---|
2584 | Result := False;
|
---|
2585 | If Clipboard.Open(Handle) Then
|
---|
2586 | Begin
|
---|
2587 | clip := Pointer(Clipboard.GetData(cfText));
|
---|
2588 | If clip = Nil Then
|
---|
2589 | Begin
|
---|
2590 | Clipboard.Close;
|
---|
2591 | Exit;
|
---|
2592 | End;
|
---|
2593 | Asm {Search terminal #0}
|
---|
2594 | CLD
|
---|
2595 | MOV ECX,0
|
---|
2596 | MOV ESI,clip
|
---|
2597 | !gt:
|
---|
2598 | Inc ECX
|
---|
2599 | LODSB
|
---|
2600 | CMP AL,0
|
---|
2601 | JNE !gt
|
---|
2602 | MOV EDI,len
|
---|
2603 | MOV [EDI],ECX
|
---|
2604 | End;
|
---|
2605 |
|
---|
2606 | If len > 1 Then
|
---|
2607 | Begin
|
---|
2608 | GetMem(P,len);
|
---|
2609 | System.Move(clip^,P^,len);
|
---|
2610 | Result := True;
|
---|
2611 | End;
|
---|
2612 | Clipboard.Close;
|
---|
2613 | End
|
---|
2614 | Else SetErrorMessage(LoadNLSStr(SCouldNotAccessClipboard)+'.');
|
---|
2615 | End;
|
---|
2616 |
|
---|
2617 |
|
---|
2618 | {+++ Protected ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
|
---|
2619 |
|
---|
2620 | {Test whether Window can be closed}
|
---|
2621 | Function TEditor.CloseQuery:Boolean;
|
---|
2622 | Var resp:TMsgDlgReturn;
|
---|
2623 | Text:String;
|
---|
2624 | Begin
|
---|
2625 | CloseQuery := True;
|
---|
2626 | If Modified Then
|
---|
2627 | Begin
|
---|
2628 | If Untitled And (FFileName = '')
|
---|
2629 | Then Text := FmtLoadNLSStr(SSaveQuery,[Caption])
|
---|
2630 | Else Text := FmtLoadNLSStr(SSaveQuery,[FFileName]);
|
---|
2631 | resp := SetQueryMessage(Text,mtInformation,mbYesNoCancel);
|
---|
2632 | Case resp Of
|
---|
2633 | mrYes : If Not SaveFile Then CloseQuery := False;
|
---|
2634 | mrCancel : CloseQuery := False;
|
---|
2635 | End;
|
---|
2636 | End;
|
---|
2637 | End;
|
---|
2638 |
|
---|
2639 |
|
---|
2640 | {CloseQuery Result True - Form will be destroyed}
|
---|
2641 | Destructor TEditor.Destroy;
|
---|
2642 | Var pl:PLine;
|
---|
2643 | plnext:PLine;
|
---|
2644 | I:Integer;
|
---|
2645 | lzk:Integer;
|
---|
2646 | pp:^TEditorPos;
|
---|
2647 | Begin
|
---|
2648 | FlushWorkLine;
|
---|
2649 | pl := FFirstLine;
|
---|
2650 | While pl <> Nil Do
|
---|
2651 | Begin
|
---|
2652 | lzk := Length(pl^.zk^);
|
---|
2653 | FreeMem(pl^.zk, lzk+1);
|
---|
2654 | plnext := pl^.Next;
|
---|
2655 | Dispose(pl);
|
---|
2656 | pl := plnext;
|
---|
2657 | End;
|
---|
2658 |
|
---|
2659 | FUndoList.Destroy;
|
---|
2660 | FRedoList.Destroy;
|
---|
2661 |
|
---|
2662 | For I := IncSearchList.Count-1 DownTo 0 Do
|
---|
2663 | Begin
|
---|
2664 | pp := IncSearchList.Items[I];
|
---|
2665 | Dispose(pp);
|
---|
2666 | End;
|
---|
2667 | IncSearchList.Destroy;
|
---|
2668 |
|
---|
2669 | If FMacroList <> Nil Then FMacroList.Destroy;
|
---|
2670 |
|
---|
2671 | If FCaret <> Nil Then FCaret.Destroy;
|
---|
2672 | FCaret := Nil;
|
---|
2673 |
|
---|
2674 | Inherited Destroy;
|
---|
2675 | End;
|
---|
2676 |
|
---|
2677 |
|
---|
2678 | {Window Is getting A Char event}
|
---|
2679 | Procedure TEditor.CharEvent(Var key:Char;RepeatCount:Byte);
|
---|
2680 | Var iew:Boolean;
|
---|
2681 | ip:TICBPosition;
|
---|
2682 | I,N,DX,Right,brk:Integer;
|
---|
2683 | NewL,wrapit:Boolean;
|
---|
2684 | rest,S:String;
|
---|
2685 | Code:TKeyCode;
|
---|
2686 | Begin
|
---|
2687 | If key < #32 Then key := #32;
|
---|
2688 |
|
---|
2689 | If WindowState = wsMinimized Then
|
---|
2690 | Begin
|
---|
2691 | key := #0;
|
---|
2692 | Exit;
|
---|
2693 | End;
|
---|
2694 | KeyRepeat := 1;
|
---|
2695 |
|
---|
2696 | If FindICB.First.Line <> Nil Then
|
---|
2697 | Begin
|
---|
2698 | FindICB.First.Line := Nil;
|
---|
2699 | InvalidateEditor(0,0);
|
---|
2700 | End;
|
---|
2701 |
|
---|
2702 | If FPreCtrl > 0 Then
|
---|
2703 | Begin
|
---|
2704 | Code := Ord(key) + kb_Char + kb_Ctrl;
|
---|
2705 | ScanEvent(Code,RepeatCount);
|
---|
2706 | key := #0;
|
---|
2707 | Exit;
|
---|
2708 | End;
|
---|
2709 |
|
---|
2710 | If FRecording Then
|
---|
2711 | Begin
|
---|
2712 | FMacroList.Add(Pointer(Ord((key))));
|
---|
2713 | FMacroList.Add(Pointer(RepeatCount));
|
---|
2714 | End;
|
---|
2715 |
|
---|
2716 | If FLastFind = faIncSearch Then
|
---|
2717 | Begin
|
---|
2718 | IncSearchText := IncSearchText + key;
|
---|
2719 | cmIncrementalSearch;
|
---|
2720 | key := #0;
|
---|
2721 | Exit;
|
---|
2722 | End;
|
---|
2723 |
|
---|
2724 | If ReadOnly Then
|
---|
2725 | Begin
|
---|
2726 | key := #0;
|
---|
2727 | Exit;
|
---|
2728 | End;
|
---|
2729 | TestAutoSave;
|
---|
2730 |
|
---|
2731 | If _ICBOverwrite Then iew := _ICBDeleteICB
|
---|
2732 | Else iew := False;
|
---|
2733 |
|
---|
2734 | {Test Word wrapping}
|
---|
2735 | If Not WLactivated Then _ReadWorkLine;
|
---|
2736 | wrapit := False;
|
---|
2737 | If FWordWrap Then
|
---|
2738 | Begin
|
---|
2739 | If FWordWrapColumn > 0 Then Right := FWordWrapColumn
|
---|
2740 | Else Right := FWinSize.X + FFileCursor.X - FScrCursor.X -1;
|
---|
2741 |
|
---|
2742 | For I := Length(FWorkLine) DownTo 1 Do
|
---|
2743 | If FWorkLine[I] = ' ' Then SetLength(FWorkLine,Length(FWorkLine)-1)
|
---|
2744 | Else break;
|
---|
2745 |
|
---|
2746 | N := Length(FWorkLine);
|
---|
2747 | If (FFileCursor.X > N) And (key <> ' ') Then N := FFileCursor.X
|
---|
2748 | Else If (FInsertMode) And (N < StringLength) Then Inc(N);
|
---|
2749 | If N > Right Then wrapit := True;
|
---|
2750 | End;
|
---|
2751 |
|
---|
2752 |
|
---|
2753 | If FInsertMode Then
|
---|
2754 | Begin
|
---|
2755 | (*Undo*)
|
---|
2756 | If (LastUndoGroup <> ugInsertChar) Or wrapit Then
|
---|
2757 | Begin
|
---|
2758 | _CopyUndoLines(FActLine,FActLine);
|
---|
2759 | LastUndoGroup := ugInsertChar;
|
---|
2760 | End;
|
---|
2761 | (*Undo*)
|
---|
2762 | If Not _InsertString(FFileCursor.X,key) Then Beep(1000,10);
|
---|
2763 | If FSelectMode <> smColumnBlock Then
|
---|
2764 | Begin
|
---|
2765 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
2766 | If ip * [ipBeforeICBFirst] <> [] Then Inc(ICB.First.X);
|
---|
2767 | If ip * [ipBeforeICBLast] <> [] Then Inc(ICB.Last.X);
|
---|
2768 | _ICBCheckX;
|
---|
2769 | End;
|
---|
2770 | End
|
---|
2771 | Else
|
---|
2772 | Begin
|
---|
2773 | (*Undo*)
|
---|
2774 | If (LastUndoGroup <> ugOverwriteChar) Or wrapit Then
|
---|
2775 | Begin
|
---|
2776 | _CopyUndoLines(FActLine,FActLine);
|
---|
2777 | LastUndoGroup := ugOverwriteChar;
|
---|
2778 | End;
|
---|
2779 | (*Undo*)
|
---|
2780 | If Not _WriteString(FFileCursor.X,key) Then Beep(1000,10);
|
---|
2781 | End;
|
---|
2782 |
|
---|
2783 | {iew := _CursorRight Or iew;}
|
---|
2784 | If FFileCursor.X < StringLength Then
|
---|
2785 | Begin
|
---|
2786 | Inc(FFileCursor.X,1);
|
---|
2787 | If FScrCursor.X + 1 > FWinSize.X Then
|
---|
2788 | Begin
|
---|
2789 | FScrCursor.X := FWinSize.X;
|
---|
2790 | iew := True;
|
---|
2791 | End
|
---|
2792 | Else Inc(FScrCursor.X,1);
|
---|
2793 | End;
|
---|
2794 |
|
---|
2795 | {Word wrapping}
|
---|
2796 | If wrapit Then
|
---|
2797 | Begin
|
---|
2798 | For I := Length(FWorkLine) DownTo 1 Do
|
---|
2799 | If FWorkLine[I] = ' ' Then SetLength(FWorkLine,Length(FWorkLine)-1)
|
---|
2800 | Else break;
|
---|
2801 |
|
---|
2802 | If Length(FWorkLine) > Right Then
|
---|
2803 | Begin
|
---|
2804 | brk := Length(FWorkLine);
|
---|
2805 | {Search Last break chance B4 Right}
|
---|
2806 | For I := Length(FWorkLine) DownTo 1 Do
|
---|
2807 | Begin
|
---|
2808 | If FWorkLine[I] = ' ' Then
|
---|
2809 | Begin
|
---|
2810 | brk := I;
|
---|
2811 | If brk <= Right Then break;
|
---|
2812 | End;
|
---|
2813 | End;
|
---|
2814 | If brk = Length(FWorkLine) Then brk := Right;
|
---|
2815 | DX := FFileCursor.X - brk;
|
---|
2816 |
|
---|
2817 | rest := Copy(FWorkLine,brk+1,255);
|
---|
2818 | While (rest[1] = ' ') And (Length(rest) > 0) Do
|
---|
2819 | Begin
|
---|
2820 | Delete(rest,1,1);
|
---|
2821 | If DX > 1 Then Dec(DX);
|
---|
2822 | End;
|
---|
2823 | SetLength(FWorkLine,brk);
|
---|
2824 | _WriteWorkLine;
|
---|
2825 | NewL := True; {Insert A New Line}
|
---|
2826 | If CountLines > FFileCursor.Y Then
|
---|
2827 | Begin
|
---|
2828 | S := _PLine2PString(FActLine^.Next)^;
|
---|
2829 | N := Length(rest);
|
---|
2830 | If S <> '' Then
|
---|
2831 | If N + Length(S) < Right Then NewL := False;
|
---|
2832 | End;
|
---|
2833 |
|
---|
2834 | LastUndoGroup := ugGroup; {group Events}
|
---|
2835 | If NewL Then InsertLine(FFileCursor.Y+1,rest)
|
---|
2836 | Else ReplaceLine(FFileCursor.Y+1,rest +' '+ S);
|
---|
2837 | LastUndoGroup := ugGroup; {group Events}
|
---|
2838 |
|
---|
2839 | If (DX > 1) And (key <> ' ') Then
|
---|
2840 | Begin
|
---|
2841 | KeyRepeat := 1;
|
---|
2842 | _CursorDown;
|
---|
2843 | FFileCursor.X := DX;
|
---|
2844 | If DX <= FWinSize.X Then FScrCursor.X := DX
|
---|
2845 | Else FScrCursor.X := 1;
|
---|
2846 | _StoreUndoCursor(FUndoList);
|
---|
2847 | LastUndoGroup := ugGroup; {group Events}
|
---|
2848 | End;
|
---|
2849 | iew := True;
|
---|
2850 | End;
|
---|
2851 | End;
|
---|
2852 |
|
---|
2853 | FRedoList.Clear;
|
---|
2854 | If iew Then
|
---|
2855 | Begin
|
---|
2856 | UpdateLineColorFlag(FActLine);
|
---|
2857 | InvalidateEditor(0,0);
|
---|
2858 | End
|
---|
2859 | Else InvalidateWorkLine;
|
---|
2860 |
|
---|
2861 | key := #0;
|
---|
2862 | End;
|
---|
2863 |
|
---|
2864 |
|
---|
2865 | {Window Is getting A scan event}
|
---|
2866 | Procedure TEditor.ScanEvent(Var KeyCode:TKeyCode;RepeatCount:Byte);
|
---|
2867 | Var pp:^TEditorPos;
|
---|
2868 | MsgHandled:Boolean;
|
---|
2869 | Begin
|
---|
2870 | If WindowState = wsMinimized Then
|
---|
2871 | Begin
|
---|
2872 | If KeyCode In [kbCR,kbEnter] Then WindowState := wsNormal;
|
---|
2873 | KeyCode := kbNull;
|
---|
2874 | Exit;
|
---|
2875 | End;
|
---|
2876 |
|
---|
2877 | If FindICB.First.Line <> Nil Then
|
---|
2878 | Begin
|
---|
2879 | FindICB.First.Line := Nil;
|
---|
2880 | InvalidateEditor(0,0);
|
---|
2881 | End;
|
---|
2882 |
|
---|
2883 | If FRecording Then
|
---|
2884 | Begin
|
---|
2885 | FMacroList.Add(Pointer(KeyCode));
|
---|
2886 | FMacroList.Add(Pointer(RepeatCount));
|
---|
2887 | End;
|
---|
2888 |
|
---|
2889 | KeyRepeat := RepeatCount;
|
---|
2890 | If FLastFind = faIncSearch Then
|
---|
2891 | Begin
|
---|
2892 | If KeyCode = kbShift Then
|
---|
2893 | Begin
|
---|
2894 | KeyCode := kbNull;
|
---|
2895 | Exit;
|
---|
2896 | End;
|
---|
2897 | If KeyCode = kbAltGraf Then
|
---|
2898 | Begin
|
---|
2899 | KeyCode := kbNull;
|
---|
2900 | Exit;
|
---|
2901 | End;
|
---|
2902 | If KeyCode = kbBkSp Then
|
---|
2903 | Begin
|
---|
2904 | Delete(IncSearchText,Length(IncSearchText),1);
|
---|
2905 | If IncSearchList.Count > 0 Then
|
---|
2906 | Begin
|
---|
2907 | pp := IncSearchList.First; {Get previous Position}
|
---|
2908 | IncSearchList.Delete(0); {Delete entry}
|
---|
2909 | _GotoPosition(pp^);
|
---|
2910 | Dispose(pp);
|
---|
2911 | cmIncrementalSearch;
|
---|
2912 | If IncSearchList.Count > 0 Then
|
---|
2913 | Begin
|
---|
2914 | pp := IncSearchList.First;
|
---|
2915 | IncSearchList.Delete(0); {Remove Last Position from stack}
|
---|
2916 | Dispose(pp);
|
---|
2917 | End;
|
---|
2918 | InvalidateEditor(0,0);
|
---|
2919 | KeyCode := kbNull;
|
---|
2920 | Exit;
|
---|
2921 | End;
|
---|
2922 | End;
|
---|
2923 | FLastFind := faNothing;
|
---|
2924 | SetIncSearchText('');
|
---|
2925 | IncSearchText := '';
|
---|
2926 | End;
|
---|
2927 |
|
---|
2928 | Case FKeyMap Of
|
---|
2929 | kmWordStar: MsgHandled := EmulateWordStar(KeyCode,FPreCtrl);
|
---|
2930 | kmCUA: MsgHandled := EmulateCUA(KeyCode,FPreCtrl);
|
---|
2931 | kmDefault: MsgHandled := EmulateDefault(KeyCode,FPreCtrl);
|
---|
2932 | Else Beep(100,100);
|
---|
2933 | End;
|
---|
2934 |
|
---|
2935 | If MsgHandled Then KeyCode := kbNull
|
---|
2936 | Else Inherited ScanEvent(KeyCode,RepeatCount);
|
---|
2937 | End;
|
---|
2938 |
|
---|
2939 |
|
---|
2940 | {IDE Classic}
|
---|
2941 | Function TEditor.EmulateWordStar(Var KeyCode,PreControl:TKeyCode):Boolean;
|
---|
2942 | Var P:TEditorPos;
|
---|
2943 | key:TKeyCode;
|
---|
2944 | Begin
|
---|
2945 | Result := True;
|
---|
2946 | key := KeyCode;
|
---|
2947 | KeyCode := PreControl Or KeyCode;
|
---|
2948 | If Not (key In [kbCtrl,kbShift]) Then PreControl := 0;
|
---|
2949 |
|
---|
2950 | Case KeyCode Of
|
---|
2951 | kbCtrlS : cmCursorLeft;
|
---|
2952 | kbCtrlD : cmCursorRight;
|
---|
2953 | kbCtrlE : cmCursorUp;
|
---|
2954 | kbCtrlX : cmCursorDown;
|
---|
2955 | kbCtrlR : cmCursorPageUp;
|
---|
2956 | kbCtrlC : cmCursorPageDown;
|
---|
2957 | kbCtrlW : cmCursorRollDown;
|
---|
2958 | kbCtrlZ : cmCursorRollUp;
|
---|
2959 | kbCtrlF : cmCursorWordRight;
|
---|
2960 | kbCtrlA : cmCursorWordLeft;
|
---|
2961 | kbCtrlQR : cmCursorFileBegin;
|
---|
2962 | kbCtrlQC : cmCursorFileEnd;
|
---|
2963 | kbCtrlQE : cmCursorPageHome;
|
---|
2964 | kbCtrlQX : cmCursorPageEnd;
|
---|
2965 | {kbCtrlQT : ;}
|
---|
2966 | {kbCtrlQU : ;}
|
---|
2967 | kbCtrlQB : If GetSelectionStart(P) Then GotoPosition(P);
|
---|
2968 | kbCtrlQK : If GetSelectionEnd(P) Then GotoPosition(P);
|
---|
2969 | kbCtrlQS : cmCursorHome;
|
---|
2970 | kbCtrlQD : cmCursorEnd;
|
---|
2971 | kbCtrlQF : cmFindText;
|
---|
2972 | kbCtrlQA : cmReplaceText;
|
---|
2973 | kbCtrlQI : cmIncrementalSearch; {*}
|
---|
2974 | kbCtrlQY : cmDeleteLineEnd;
|
---|
2975 | kbCtrlKB : SetSelectionStart(FFileCursor);
|
---|
2976 | kbCtrlKK : SetSelectionEnd(FFileCursor);
|
---|
2977 | kbCtrlKT : SelectWord(FFileCursor);
|
---|
2978 | kbCtrlKL : SelectLine(FFileCursor);
|
---|
2979 | kbCtrlV : ToggleInsertMode;
|
---|
2980 | kbCtrlKH : If ICBVisible Then HideSelection
|
---|
2981 | Else ShowSelection;
|
---|
2982 | kbCtrlKR : cmICBReadBlock;
|
---|
2983 | kbCtrlKW : cmICBWriteBlock;
|
---|
2984 | kbCtrlKU : cmICBMoveLeft;
|
---|
2985 | kbCtrlKI : cmICBMoveRight;
|
---|
2986 | kbCtrlKC : cmICBCopyBlock;
|
---|
2987 | kbCtrlKV : cmICBMoveBlock;
|
---|
2988 | kbCtrlKY : cmICBDeleteBlock;
|
---|
2989 | kbCtrlKN : cmICBUpcaseBlock;
|
---|
2990 | kbCtrlKO : cmICBLowcaseBlock;
|
---|
2991 | kbCtrlKF : cmICBUpcaseWord;
|
---|
2992 | kbCtrlKE : cmICBLowcaseWord;
|
---|
2993 | kbCtrlKS : SaveFile;
|
---|
2994 | kbCtrlN : cmBreakLine;
|
---|
2995 | kbCtrlY : cmDeleteLine;
|
---|
2996 | kbCtrlT : cmDeleteRightWord;
|
---|
2997 | kbCtrlBkSp : cmDeleteLeftWord;
|
---|
2998 | kbCtrlI : cmTabulator;
|
---|
2999 | kbCtrlG : cmDeleteChar;
|
---|
3000 | kbCtrlH : cmBackSpace;
|
---|
3001 | kbCtrlL : cmSearchTextAgain;
|
---|
3002 | kbCtrlShiftS : cmIncrementalSearch;
|
---|
3003 |
|
---|
3004 | kbCLeft : cmCursorLeft;
|
---|
3005 | kbCRight : cmCursorRight;
|
---|
3006 | kbCUp : cmCursorUp;
|
---|
3007 | kbCDown : cmCursorDown;
|
---|
3008 | kbHome : cmCursorHome;
|
---|
3009 | kbEnd : cmCursorEnd;
|
---|
3010 | kbPageDown : cmCursorPageDown;
|
---|
3011 | kbPageUp : cmCursorPageUp;
|
---|
3012 | kbCtrlCLeft : cmCursorWordLeft;
|
---|
3013 | kbCtrlCRight : cmCursorWordRight;
|
---|
3014 | kbCtrlCUp : cmICBUpcaseBlock; {*}
|
---|
3015 | kbCtrlCDown : cmICBLowcaseBlock; {*}
|
---|
3016 | kbCtrlPageUp : cmCursorFileBegin;
|
---|
3017 | kbCtrlPageDown : cmCursorFileEnd;
|
---|
3018 | kbCtrlHome : cmCursorPageHome;
|
---|
3019 | kbCtrlEnd : cmCursorPageEnd;
|
---|
3020 | kbShiftCLeft : cmICBExtLeft;
|
---|
3021 | kbShiftCRight : cmICBExtRight;
|
---|
3022 | kbShiftCUp : cmICBExtUp;
|
---|
3023 | kbShiftCDown : cmICBExtDown;
|
---|
3024 | kbShiftPageUp : cmICBExtPageUp;
|
---|
3025 | kbShiftPageDown : cmICBExtPageDown;
|
---|
3026 | kbShiftHome : cmICBExtHome;
|
---|
3027 | kbShiftEnd : cmICBExtEnd;
|
---|
3028 | kbAltShiftCLeft : Begin SelectMode:=smColumnBlock; cmICBExtLeft; End;
|
---|
3029 | kbAltShiftCRight : Begin SelectMode:=smColumnBlock; cmICBExtRight; End;
|
---|
3030 | kbAltShiftCUp : Begin SelectMode:=smColumnBlock; cmICBExtUp; End;
|
---|
3031 | kbAltShiftCDown : Begin SelectMode:=smColumnBlock; cmICBExtDown; End;
|
---|
3032 | kbAltShiftPageUp : Begin SelectMode:=smColumnBlock; cmICBExtPageUp; End;
|
---|
3033 | kbAltShiftPageDown : Begin SelectMode:=smColumnBlock; cmICBExtPageDown; End;
|
---|
3034 | kbAltShiftHome : Begin SelectMode:=smColumnBlock; cmICBExtHome; End;
|
---|
3035 | kbAltShiftEnd : Begin SelectMode:=smColumnBlock; cmICBExtEnd; End;
|
---|
3036 | kbCtrlShiftCLeft : cmICBExtWordLeft;
|
---|
3037 | kbCtrlShiftCRight : cmICBExtWordRight;
|
---|
3038 | kbCtrlShiftHome : cmICBExtPageBegin;
|
---|
3039 | kbCtrlShiftEnd : cmICBExtPageEnd;
|
---|
3040 | kbCtrlShiftPageUp : cmICBExtFileBegin;
|
---|
3041 | kbCtrlShiftPageDown : cmICBExtFileEnd;
|
---|
3042 | kbCtrlAltShiftCLeft : Begin SelectMode:=smColumnBlock; cmICBExtWordLeft; End;
|
---|
3043 | kbCtrlAltShiftCRight: Begin SelectMode:=smColumnBlock; cmICBExtWordRight; End;
|
---|
3044 | kbCtrlAltShiftHome : Begin SelectMode:=smColumnBlock; cmICBExtPageBegin; End;
|
---|
3045 | kbCtrlAltShiftEnd : Begin SelectMode:=smColumnBlock; cmICBExtPageEnd; End;
|
---|
3046 | kbCtrlAltShiftPageUp: Begin SelectMode:=smColumnBlock; cmICBExtFileBegin; End;
|
---|
3047 | kbCtrlAltShiftPageDown : Begin SelectMode:=smColumnBlock; cmICBExtFileEnd; End;
|
---|
3048 | kbCtrlSlash : SelectAll; {*}
|
---|
3049 | kbCtrlBackSlash : DeselectAll; {*}
|
---|
3050 | kbCtrlK0..kbCtrlK9 : SetBookMark((KeyCode And Not kbPreCtrlK)-48,FFileCursor);
|
---|
3051 | kbCtrlQ0..kbCtrlQ9 : GotoBookMark((KeyCode And Not kbPreCtrlQ)-48);
|
---|
3052 | kbCtrl0..kbCtrl9 : GotoBookMark((KeyCode And Not (kb_Ctrl+kb_Char))-48);
|
---|
3053 | kbCtrlU0..kbCtrlU9 : ClearBookMark((KeyCode And Not kbPreCtrlU)-48); {*}
|
---|
3054 | kbCtrlUU : ClearAllBookMarks; {*}
|
---|
3055 | kbAltBkSp : Undo;
|
---|
3056 | kbAltShiftBkSp : Redo;
|
---|
3057 | kbAltCLeft : cmICBMoveLeft;
|
---|
3058 | kbAltCRight : cmICBMoveRight;
|
---|
3059 | kbTab : cmTabulator;
|
---|
3060 | kbShiftTab : cmPrevTabulator;
|
---|
3061 | kbDel : cmDeleteChar;
|
---|
3062 | kbBkSp : cmBackSpace;
|
---|
3063 | kbShiftBkSp : cmBackSpace;
|
---|
3064 | kbShiftSpace : CharEvent(SpaceChar,1);
|
---|
3065 | kbCtrlSpace : CharEvent(SpaceChar,1);
|
---|
3066 | kbCR,
|
---|
3067 | kbShiftCR : cmEnter;
|
---|
3068 | {$IFDEF OS2}
|
---|
3069 | kbEnter,
|
---|
3070 | kbShiftEnter : cmEnter;
|
---|
3071 | {$ENDIF}
|
---|
3072 | kbCtrlDel : cmICBDeleteBlock;
|
---|
3073 | kbShiftDel : CutToClipBoard;
|
---|
3074 | kbCtrlIns : CopyToClipboard;
|
---|
3075 | kbShiftIns : PasteFromClipBoard;
|
---|
3076 | kbIns : ToggleInsertMode;
|
---|
3077 | kbCtrlOC : SelectMode := smColumnBlock;
|
---|
3078 | kbCtrlOK : SelectMode := smNonInclusiveBlock;
|
---|
3079 | {kbCtrlOI : SelectMode := smInklusiveBlock;
|
---|
3080 | kbCtrlOL : SelectMode := smLineBlock;}
|
---|
3081 | kbCtrlOU : cmToggleCase;
|
---|
3082 | kbCtrlShiftR : cmRecordMacro;
|
---|
3083 | kbCtrlShiftP : cmPlayMacro;
|
---|
3084 | kbCtrlK : PreControl := kbPreCtrlK;
|
---|
3085 | kbCtrlQ : PreControl := kbPreCtrlQ;
|
---|
3086 | kbCtrlU : PreControl := kbPreCtrlU;
|
---|
3087 | kbCtrlO : PreControl := kbPreCtrlO;
|
---|
3088 | Else Result := False;
|
---|
3089 | End;
|
---|
3090 | End;
|
---|
3091 |
|
---|
3092 |
|
---|
3093 | {CUA}
|
---|
3094 | Function TEditor.EmulateCUA(Var KeyCode,PreControl:TKeyCode):Boolean;
|
---|
3095 | Var key:TKeyCode;
|
---|
3096 | Begin
|
---|
3097 | Result := True;
|
---|
3098 | key := KeyCode;
|
---|
3099 | KeyCode := PreControl Or KeyCode;
|
---|
3100 | If Not (key In [kbCtrl,kbShift]) Then PreControl := 0;
|
---|
3101 |
|
---|
3102 | Case KeyCode Of
|
---|
3103 | kbCtrlF7 : cmICBMoveLeft;
|
---|
3104 | kbCtrlF8 : cmICBMoveRight;
|
---|
3105 | kbCtrlBkSp : cmDeleteLine;
|
---|
3106 | kbCtrlY : cmDeleteLine;
|
---|
3107 | kbCtrlS : cmFindText;
|
---|
3108 | kbCtrlF : cmFindText;
|
---|
3109 | kbCtrlR : cmReplaceText;
|
---|
3110 | kbCtrlN : cmSearchTextAgain;
|
---|
3111 | kbCtrlE : cmIncrementalSearch;
|
---|
3112 | kbCtrlI : cmIncrementalSearch;
|
---|
3113 | kbCLeft : cmCursorLeft;
|
---|
3114 | kbCRight : cmCursorRight;
|
---|
3115 | kbCUp : cmCursorUp;
|
---|
3116 | kbCDown : cmCursorDown;
|
---|
3117 | kbHome : cmCursorHome;
|
---|
3118 | kbEnd : cmCursorEnd;
|
---|
3119 | kbPageDown : cmCursorPageDown;
|
---|
3120 | kbPageUp : cmCursorPageUp;
|
---|
3121 | kbCtrlCLeft : cmCursorWordLeft;
|
---|
3122 | kbCtrlCRight : cmCursorWordRight;
|
---|
3123 | kbCtrlCUp : cmICBUpcaseBlock;
|
---|
3124 | kbCtrlCDown : cmICBLowcaseBlock;
|
---|
3125 | kbCtrlPageUp : cmCursorPageHome;
|
---|
3126 | kbCtrlPageDown : cmCursorPageEnd;
|
---|
3127 | kbCtrlHome : cmCursorFileBegin;
|
---|
3128 | kbCtrlEnd : cmCursorFileEnd;
|
---|
3129 | kbShiftCLeft : cmICBExtLeft;
|
---|
3130 | kbShiftCRight : cmICBExtRight;
|
---|
3131 | kbShiftCUp : cmICBExtUp;
|
---|
3132 | kbShiftCDown : cmICBExtDown;
|
---|
3133 | kbShiftPageUp : cmICBExtPageUp;
|
---|
3134 | kbShiftPageDown : cmICBExtPageDown;
|
---|
3135 | kbShiftHome : cmICBExtHome;
|
---|
3136 | kbShiftEnd : cmICBExtEnd;
|
---|
3137 | kbCtrlShiftCLeft : cmICBExtWordLeft;
|
---|
3138 | kbCtrlShiftCRight : cmICBExtWordRight;
|
---|
3139 | kbCtrlShiftHome : cmICBExtFileBegin;
|
---|
3140 | kbCtrlShiftEnd : cmICBExtFileEnd;
|
---|
3141 | kbCtrlShiftPageUp : cmICBExtPageBegin;
|
---|
3142 | kbCtrlShiftPageDown : cmICBExtPageEnd;
|
---|
3143 | kbCtrlSlash : SelectAll;
|
---|
3144 | kbCtrlBackSlash : DeselectAll;
|
---|
3145 | kbCtrlK0..kbCtrlK9 : SetBookMark((KeyCode And Not kbPreCtrlK)-48,FFileCursor);
|
---|
3146 | kbCtrlQ0..kbCtrlQ9 : GotoBookMark((KeyCode And Not kbPreCtrlQ)-48);
|
---|
3147 | kbCtrlU0..kbCtrlU9 : ClearBookMark((KeyCode And Not kbPreCtrlU)-48);
|
---|
3148 | kbCtrlUU : ClearAllBookMarks;
|
---|
3149 | kbAltBkSp : Undo;
|
---|
3150 | kbAltShiftBkSp : Redo;
|
---|
3151 | kbAltCLeft : cmICBMoveLeft;
|
---|
3152 | kbAltCRight : cmICBMoveRight;
|
---|
3153 | kbTab : cmTabulator;
|
---|
3154 | kbShiftTab : cmPrevTabulator;
|
---|
3155 | kbDel : cmDeleteChar;
|
---|
3156 | kbBkSp : cmBackSpace;
|
---|
3157 | kbShiftBkSp : cmBackSpace;
|
---|
3158 | kbShiftSpace : CharEvent(SpaceChar,1);
|
---|
3159 | kbCtrlSpace : CharEvent(SpaceChar,1);
|
---|
3160 | kbCR,
|
---|
3161 | kbShiftCR : cmEnter;
|
---|
3162 | {$IFDEF OS2}
|
---|
3163 | kbEnter,
|
---|
3164 | kbShiftEnter : cmEnter;
|
---|
3165 | {$ENDIF}
|
---|
3166 | kbCtrlDel : cmICBDeleteBlock;
|
---|
3167 | kbShiftDel : CutToClipBoard;
|
---|
3168 | kbCtrlIns : CopyToClipboard;
|
---|
3169 | kbShiftIns : PasteFromClipBoard;
|
---|
3170 | kbIns : ToggleInsertMode;
|
---|
3171 | kbCtrlShiftR : cmRecordMacro;
|
---|
3172 | kbCtrlShiftP : cmPlayMacro;
|
---|
3173 | kbCtrlK : PreControl := kbPreCtrlK;
|
---|
3174 | kbCtrlQ : PreControl := kbPreCtrlQ;
|
---|
3175 | kbCtrlU : PreControl := kbPreCtrlU;
|
---|
3176 | Else Result := False;
|
---|
3177 | End;
|
---|
3178 | End;
|
---|
3179 |
|
---|
3180 |
|
---|
3181 | {Delphi Default}
|
---|
3182 | Function TEditor.EmulateDefault(Var KeyCode,PreControl:TKeyCode):Boolean;
|
---|
3183 | Var P:TEditorPos;
|
---|
3184 | key:TKeyCode;
|
---|
3185 | Begin
|
---|
3186 | Result := True;
|
---|
3187 | key := KeyCode;
|
---|
3188 | KeyCode := PreControl Or KeyCode;
|
---|
3189 | If Not (key In [kbCtrl,kbShift]) Then PreControl := 0;
|
---|
3190 |
|
---|
3191 | Case KeyCode Of
|
---|
3192 | kbCtrlS : SaveFile;
|
---|
3193 | kbCtrlE : cmIncrementalSearch;
|
---|
3194 | kbCtrlR : cmReplaceText;
|
---|
3195 | kbCtrlF : cmFindText;
|
---|
3196 | kbCtrlI : cmTabulator;
|
---|
3197 | kbCtrlN : cmBreakLine;
|
---|
3198 | kbCtrlT : cmDeleteRightWord;
|
---|
3199 | kbCtrlY : cmDeleteLine;
|
---|
3200 | kbCtrlZ : Undo;
|
---|
3201 | kbCtrlShiftI : cmICBMoveRight;
|
---|
3202 | kbCtrlShiftU : cmICBMoveLeft;
|
---|
3203 | kbCtrlShiftY : cmDeleteLineEnd;
|
---|
3204 | kbCtrlShiftZ : Redo;
|
---|
3205 | kbHome : cmCursorHome;
|
---|
3206 | kbEnd : cmCursorEnd;
|
---|
3207 | kbCR,
|
---|
3208 | kbShiftCR : cmEnter;
|
---|
3209 | {$IFDEF OS2}
|
---|
3210 | kbEnter,
|
---|
3211 | kbShiftEnter : cmEnter;
|
---|
3212 | {$ENDIF}
|
---|
3213 | kbIns : ToggleInsertMode;
|
---|
3214 | kbDel : cmDeleteChar;
|
---|
3215 | kbBkSp : cmBackSpace;
|
---|
3216 | kbTab : cmTabulator;
|
---|
3217 | kbCLeft : cmCursorLeft;
|
---|
3218 | kbCRight : cmCursorRight;
|
---|
3219 | kbCUp : cmCursorUp;
|
---|
3220 | kbCDown : cmCursorDown;
|
---|
3221 | kbPageDown : cmCursorPageDown;
|
---|
3222 | kbPageUp : cmCursorPageUp;
|
---|
3223 | kbCtrlCLeft : cmCursorWordLeft;
|
---|
3224 | kbCtrlCRight : cmCursorWordRight;
|
---|
3225 | kbCtrlBkSp : cmDeleteLeftWord;
|
---|
3226 | kbCtrlPageUp : cmCursorPageHome;
|
---|
3227 | kbCtrlPageDown : cmCursorPageEnd;
|
---|
3228 | kbCtrlHome : cmCursorFileBegin;
|
---|
3229 | kbCtrlEnd : cmCursorFileEnd;
|
---|
3230 | kbCtrlSpace : CharEvent(SpaceChar,1);
|
---|
3231 | kbCtrlDel : cmICBDeleteBlock;
|
---|
3232 | kbCtrlCUp : cmCursorRollDown;
|
---|
3233 | kbCtrlCDown : cmCursorRollUp;
|
---|
3234 | kbShiftTab : cmPrevTabulator;
|
---|
3235 | kbShiftBkSp : cmBackSpace;
|
---|
3236 | kbShiftCLeft : cmICBExtLeft;
|
---|
3237 | kbShiftCRight : cmICBExtRight;
|
---|
3238 | kbShiftCUp : cmICBExtUp;
|
---|
3239 | kbShiftCDown : cmICBExtDown;
|
---|
3240 | kbShiftPageUp : cmICBExtPageUp;
|
---|
3241 | kbShiftPageDown : cmICBExtPageDown;
|
---|
3242 | kbShiftHome : cmICBExtHome;
|
---|
3243 | kbShiftEnd : cmICBExtEnd;
|
---|
3244 | kbShiftSpace : CharEvent(SpaceChar,1);
|
---|
3245 | kbAltBkSp : Undo;
|
---|
3246 | kbAltShiftBkSp : Redo;
|
---|
3247 | kbAltCLeft : cmICBMoveLeft;
|
---|
3248 | kbAltCRight : cmICBMoveRight;
|
---|
3249 | kbAltShiftCLeft : Begin SelectMode:=smColumnBlock; cmICBExtLeft; End;
|
---|
3250 | kbAltShiftCRight : Begin SelectMode:=smColumnBlock; cmICBExtRight; End;
|
---|
3251 | kbAltShiftCUp : Begin SelectMode:=smColumnBlock; cmICBExtUp; End;
|
---|
3252 | kbAltShiftCDown : Begin SelectMode:=smColumnBlock; cmICBExtDown; End;
|
---|
3253 | kbAltShiftPageUp : Begin SelectMode:=smColumnBlock; cmICBExtPageUp; End;
|
---|
3254 | kbAltShiftPageDown : Begin SelectMode:=smColumnBlock; cmICBExtPageDown; End;
|
---|
3255 | kbAltShiftHome : Begin SelectMode:=smColumnBlock; cmICBExtHome; End;
|
---|
3256 | kbAltShiftEnd : Begin SelectMode:=smColumnBlock; cmICBExtEnd; End;
|
---|
3257 | kbCtrlShiftCLeft : cmICBExtWordLeft;
|
---|
3258 | kbCtrlShiftCRight : cmICBExtWordRight;
|
---|
3259 | kbCtrlShiftHome : cmICBExtFileBegin;
|
---|
3260 | kbCtrlShiftEnd : cmICBExtFileEnd;
|
---|
3261 | kbCtrlShiftPageUp : cmICBExtPageBegin;
|
---|
3262 | kbCtrlShiftPageDown : cmICBExtPageEnd;
|
---|
3263 | kbCtrlAltShiftCLeft : Begin SelectMode:=smColumnBlock; cmICBExtWordLeft; End;
|
---|
3264 | kbCtrlAltShiftCRight: Begin SelectMode:=smColumnBlock; cmICBExtWordRight; End;
|
---|
3265 | kbCtrlAltShiftHome : Begin SelectMode:=smColumnBlock; cmICBExtFileBegin; End;
|
---|
3266 | kbCtrlAltShiftEnd : Begin SelectMode:=smColumnBlock; cmICBExtFileEnd; End;
|
---|
3267 | kbCtrlAltShiftPageUp: Begin SelectMode:=smColumnBlock; cmICBExtPageBegin; End;
|
---|
3268 | kbCtrlAltShiftPageDown : Begin SelectMode:=smColumnBlock; cmICBExtPageEnd; End;
|
---|
3269 | kbCtrlKB : SetSelectionStart(FFileCursor);
|
---|
3270 | kbCtrlKC : cmICBCopyBlock;
|
---|
3271 | kbCtrlKH : If ICBVisible Then HideSelection
|
---|
3272 | Else ShowSelection;
|
---|
3273 | kbCtrlKI : cmICBMoveRight;
|
---|
3274 | kbCtrlKK : SetSelectionEnd(FFileCursor);
|
---|
3275 | kbCtrlKL : SelectLine(FFileCursor);
|
---|
3276 | kbCtrlKN : cmICBUpcaseBlock;
|
---|
3277 | kbCtrlKO : cmICBLowcaseBlock;
|
---|
3278 | kbCtrlKR : cmICBReadBlock;
|
---|
3279 | kbCtrlKT : SelectWord(FFileCursor);
|
---|
3280 | kbCtrlKU : cmICBMoveLeft;
|
---|
3281 | kbCtrlKV : cmICBMoveBlock;
|
---|
3282 | kbCtrlKW : cmICBWriteBlock;
|
---|
3283 | kbCtrlKY : cmICBDeleteBlock;
|
---|
3284 | kbCtrlOC : SelectMode := smColumnBlock;
|
---|
3285 | kbCtrlOK : SelectMode := smNonInclusiveBlock;
|
---|
3286 | {kbCtrlOI : SelectMode := smInklusiveBlock;
|
---|
3287 | kbCtrlOL : SelectMode := smLineBlock;}
|
---|
3288 | kbCtrlQB : If GetSelectionStart(P) Then GotoPosition(P);
|
---|
3289 | kbCtrlQC : cmCursorFileEnd;
|
---|
3290 | kbCtrlQD : cmCursorEnd;
|
---|
3291 | kbCtrlQE : cmCursorPageHome;
|
---|
3292 | kbCtrlQK : If GetSelectionEnd(P) Then GotoPosition(P);
|
---|
3293 | kbCtrlQR : cmCursorFileBegin;
|
---|
3294 | kbCtrlQS : cmCursorHome;
|
---|
3295 | {kbCtrlQT : ;}
|
---|
3296 | {kbCtrlQU : ;}
|
---|
3297 | kbCtrlQX : cmCursorPageEnd;
|
---|
3298 | kbCtrlK0..kbCtrlK9 : SetBookMark((KeyCode And Not kbPreCtrlK)-48,FFileCursor);
|
---|
3299 | kbCtrlQ0..kbCtrlQ9 : GotoBookMark((KeyCode And Not kbPreCtrlQ)-48);
|
---|
3300 | kbCtrl0..kbCtrl9 : GotoBookMark((KeyCode And Not (kb_Ctrl+kb_Char))-48);
|
---|
3301 | kbCtrlU0..kbCtrlU9 : ClearBookMark((KeyCode And Not kbPreCtrlU)-48); {*}
|
---|
3302 | kbCtrlUU : ClearAllBookMarks; {*}
|
---|
3303 | kbCtrlKF : cmICBUpcaseWord;
|
---|
3304 | kbCtrlKE : cmICBLowcaseWord;
|
---|
3305 | kbCtrlKS : SaveFile;
|
---|
3306 | kbCtrlQF : cmFindText;
|
---|
3307 | kbCtrlQA : cmReplaceText;
|
---|
3308 | kbCtrlQI : cmIncrementalSearch; {*}
|
---|
3309 | kbCtrlQY : cmDeleteLineEnd;
|
---|
3310 | kbCtrlOU : cmToggleCase;
|
---|
3311 | kbShiftDel : CutToClipBoard;
|
---|
3312 | kbCtrlIns : CopyToClipboard;
|
---|
3313 | kbShiftIns : PasteFromClipBoard;
|
---|
3314 | kbCtrlX : CutToClipBoard;
|
---|
3315 | kbCtrlC : CopyToClipboard;
|
---|
3316 | kbCtrlV : PasteFromClipBoard;
|
---|
3317 | kbCtrlShiftR : cmRecordMacro;
|
---|
3318 | kbCtrlShiftP : cmPlayMacro;
|
---|
3319 | //kbCtrlCUp : cmICBUpcaseBlock; {*}
|
---|
3320 | //kbCtrlCDown : cmICBLowcaseBlock; {*}
|
---|
3321 | kbCtrlSlash : SelectAll; {*}
|
---|
3322 | kbCtrlBackSlash : DeselectAll; {*}
|
---|
3323 | kbCtrlK : PreControl := kbPreCtrlK;
|
---|
3324 | kbCtrlQ : PreControl := kbPreCtrlQ;
|
---|
3325 | kbCtrlU : PreControl := kbPreCtrlU;
|
---|
3326 | kbCtrlO : PreControl := kbPreCtrlO;
|
---|
3327 | Else Result := False;
|
---|
3328 | End;
|
---|
3329 | End;
|
---|
3330 |
|
---|
3331 |
|
---|
3332 | {Window Is getting the Focus}
|
---|
3333 | Procedure TEditor.SetFocus;
|
---|
3334 | Begin
|
---|
3335 | If HadFocus = 0 Then HadFocus := 1;
|
---|
3336 | If FCaret <> Nil Then
|
---|
3337 | If FCaret.created Then
|
---|
3338 | Begin
|
---|
3339 | FCaret.SetSize(FCaret.Width,FCaret.Height);
|
---|
3340 | FCaret.SetPos(FCaret.Left,FCaret.Bottom);
|
---|
3341 | If FCaret.BlinkTime <> 0
|
---|
3342 | Then FCaret.BlinkTime := FCaret.BlinkTime;
|
---|
3343 | FCaret.Show;
|
---|
3344 | End;
|
---|
3345 |
|
---|
3346 | Inherited SetFocus;
|
---|
3347 | FPreCtrl := 0;
|
---|
3348 | End;
|
---|
3349 |
|
---|
3350 |
|
---|
3351 | {Window Is loosing the Focus}
|
---|
3352 | Procedure TEditor.KillFocus;
|
---|
3353 | Begin
|
---|
3354 | HadFocus := 0;
|
---|
3355 | If FCaret <> Nil Then
|
---|
3356 | If FCaret.created Then
|
---|
3357 | Begin
|
---|
3358 | {$IFDEF Win95}
|
---|
3359 | FCaret.BlinkTime := -1;
|
---|
3360 | {$ENDIF}
|
---|
3361 | FCaret.Remove;
|
---|
3362 | FCaret.created := True; //Deleted by DestroyCursor
|
---|
3363 | End;
|
---|
3364 |
|
---|
3365 | Inherited KillFocus;
|
---|
3366 | End;
|
---|
3367 |
|
---|
3368 |
|
---|
3369 | {Window Change its Size}
|
---|
3370 | Procedure TEditor.Resize;
|
---|
3371 | Begin
|
---|
3372 | Inherited Resize;
|
---|
3373 | CalcSizes;
|
---|
3374 | End;
|
---|
3375 |
|
---|
3376 |
|
---|
3377 | {$HINTS OFF}
|
---|
3378 | Procedure TEditor.MouseDblClick(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);
|
---|
3379 | Begin
|
---|
3380 | Inherited MouseDblClick(Button,ShiftState,X,Y);
|
---|
3381 |
|
---|
3382 | If Button <> mbLeft Then Exit;
|
---|
3383 |
|
---|
3384 | If FEditOpt * [eo2ClickLine] <> [] Then SelectLine(FFileCursor)
|
---|
3385 | Else SelectWord(FFileCursor);
|
---|
3386 | HadFocus := 1; {ignore MouseMove}
|
---|
3387 | LastMsg.Handled := True;
|
---|
3388 | End;
|
---|
3389 | {$HINTS ON}
|
---|
3390 |
|
---|
3391 |
|
---|
3392 | Procedure TEditor.MouseDown(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);
|
---|
3393 | Var Scr:TEditorPos;
|
---|
3394 | T:Integer;
|
---|
3395 | iew:Boolean;
|
---|
3396 | Begin
|
---|
3397 | Inherited MouseDown(Button,ShiftState,X,Y);
|
---|
3398 |
|
---|
3399 | If Button <> mbLeft Then Exit;
|
---|
3400 |
|
---|
3401 | LastMsg.Handled := True;
|
---|
3402 | MouseCapture := True;
|
---|
3403 | If HadFocus = 0 Then Exit; {receive Focus}
|
---|
3404 | HadFocus := 2;
|
---|
3405 |
|
---|
3406 | If FindICB.First.Line <> Nil Then
|
---|
3407 | Begin
|
---|
3408 | FindICB.First.Line := Nil;
|
---|
3409 | InvalidateEditor(0,0);
|
---|
3410 | End;
|
---|
3411 | Update;
|
---|
3412 | (*Undo*)
|
---|
3413 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3414 | LastUndoGroup := ugCursorMove;
|
---|
3415 | (*Undo*)
|
---|
3416 |
|
---|
3417 | FlushWorkLine;
|
---|
3418 | Scr := GetCursorFromMouse(Point(X,Y));
|
---|
3419 |
|
---|
3420 | If Scr.X < 1 Then Scr.X := 1;
|
---|
3421 | If Scr.X > FWinSize.X Then Scr.X := FWinSize.X;
|
---|
3422 | If Scr.Y < 1 Then Scr.Y := 1;
|
---|
3423 | If Scr.Y > FWinSize.Y Then Scr.Y := FWinSize.Y;
|
---|
3424 |
|
---|
3425 | If Scr.X > FScrCursor.X Then Inc(FFileCursor.X,Scr.X-FScrCursor.X)
|
---|
3426 | Else Dec(FFileCursor.X,FScrCursor.X-Scr.X);
|
---|
3427 | FScrCursor.X := Scr.X;
|
---|
3428 |
|
---|
3429 | If (FFileCursor.Y+Scr.Y)-FScrCursor.Y > FCountLines
|
---|
3430 | Then Scr.Y := FCountLines-FFileCursor.Y+FScrCursor.Y;
|
---|
3431 |
|
---|
3432 | If Scr.Y > FScrCursor.Y Then
|
---|
3433 | Begin
|
---|
3434 | Inc(FFileCursor.Y,Scr.Y-FScrCursor.Y);
|
---|
3435 | For T := 1 To Scr.Y-FScrCursor.Y Do FActLine := FActLine^.Next;
|
---|
3436 | FScrCursor.Y := Scr.Y;
|
---|
3437 | End
|
---|
3438 | Else
|
---|
3439 | Begin
|
---|
3440 | Dec(FFileCursor.Y,FScrCursor.Y-Scr.Y);
|
---|
3441 | For T := 1 To FScrCursor.Y-Scr.Y Do FActLine := FActLine^.Prev;
|
---|
3442 | FScrCursor.Y := Scr.Y;
|
---|
3443 | End;
|
---|
3444 |
|
---|
3445 | iew := _ICBExtSetICB;
|
---|
3446 | _ICBSetMark;
|
---|
3447 | ICBVisible := True;
|
---|
3448 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
3449 | If iew Then InvalidateEditor(0,0)
|
---|
3450 | Else SetScreenCursor;
|
---|
3451 |
|
---|
3452 | FCaret.Hide;
|
---|
3453 | End;
|
---|
3454 |
|
---|
3455 |
|
---|
3456 | Procedure TEditor.MouseUp(Button:TMouseButton;ShiftState:TShiftState;X,Y:LongInt);
|
---|
3457 | Begin
|
---|
3458 | If Button = mbLeft Then
|
---|
3459 | Begin
|
---|
3460 | If HadFocus > 0 Then FCaret.Show;
|
---|
3461 | HadFocus := 1;
|
---|
3462 | _ICBExtCorrectICB2;
|
---|
3463 | End;
|
---|
3464 |
|
---|
3465 | Inherited MouseUp(Button,ShiftState,X,Y);
|
---|
3466 |
|
---|
3467 | If Button = mbLeft Then
|
---|
3468 | Begin
|
---|
3469 | LastMsg.Handled := True;
|
---|
3470 | MouseCapture := False;
|
---|
3471 | End;
|
---|
3472 | End;
|
---|
3473 |
|
---|
3474 |
|
---|
3475 | Procedure TEditor.MouseMove(ShiftState:TShiftState;X,Y:LongInt);
|
---|
3476 | Var Scr:TEditorPos;
|
---|
3477 | FC:TLineX;
|
---|
3478 | iew:Boolean;
|
---|
3479 | Down:Boolean;
|
---|
3480 | ScrY:Integer;
|
---|
3481 | y1,y2:Integer;
|
---|
3482 | Begin
|
---|
3483 | Inherited MouseMove(ShiftState,X,Y);
|
---|
3484 |
|
---|
3485 | LastMsg.Handled := True;
|
---|
3486 | If HadFocus < 2 Then Exit;
|
---|
3487 | If ShiftState * [ssLeft] = [] Then Exit;
|
---|
3488 | MouseCapture := True; {!!}
|
---|
3489 |
|
---|
3490 | FC := _ICBActPos;
|
---|
3491 | Scr := GetCursorFromMouse(Point(X,Y));
|
---|
3492 |
|
---|
3493 | KeyRepeat := Abs(Scr.X - FScrCursor.X);
|
---|
3494 | If Scr.X > FScrCursor.X Then iew := _CursorRight
|
---|
3495 | Else iew := _CursorLeft;
|
---|
3496 |
|
---|
3497 | ScrY := FScrCursor.Y;
|
---|
3498 | Down := Scr.Y > FScrCursor.Y;
|
---|
3499 | KeyRepeat := Abs(Scr.Y - FScrCursor.Y);
|
---|
3500 | If Scr.Y > FScrCursor.Y Then iew := _CursorDown Or iew
|
---|
3501 | Else iew := _CursorUp Or iew;
|
---|
3502 |
|
---|
3503 | _ICBClearMark;
|
---|
3504 | If FC = ICB.First Then ICB.First := _ICBActPos
|
---|
3505 | Else ICB.Last := _ICBActPos;
|
---|
3506 |
|
---|
3507 | _ICBExtCorrectICB;
|
---|
3508 | _ICBSetMark;
|
---|
3509 | ICBVisible := True;
|
---|
3510 |
|
---|
3511 | If Not iew Then
|
---|
3512 | Begin
|
---|
3513 | If Down Then
|
---|
3514 | Begin
|
---|
3515 | y1 := ScrY;
|
---|
3516 | y2 := FScrCursor.Y;
|
---|
3517 | End
|
---|
3518 | Else
|
---|
3519 | Begin
|
---|
3520 | y1 := FScrCursor.Y;
|
---|
3521 | y2 := ScrY;
|
---|
3522 | End;
|
---|
3523 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
3524 | InvalidateEditor(y1,y2)
|
---|
3525 | End
|
---|
3526 | Else InvalidateEditor(0,0);
|
---|
3527 | End;
|
---|
3528 |
|
---|
3529 |
|
---|
3530 |
|
---|
3531 | Procedure TEditor.Scroll(Sender:TScrollBar;ScrollCode:TScrollCode;Var ScrollPos:LongInt);
|
---|
3532 | Var SliderValue:LongInt;
|
---|
3533 | L,cnt:LongInt;
|
---|
3534 | Begin
|
---|
3535 | Inherited Scroll(Sender,ScrollCode,ScrollPos);
|
---|
3536 |
|
---|
3537 | If (Sender <> FBottomScrollBar) And (Sender <> FRightScrollBar) Then Exit;
|
---|
3538 |
|
---|
3539 | (*Undo*)
|
---|
3540 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3541 | LastUndoGroup := ugCursorMove;
|
---|
3542 | (*Undo*)
|
---|
3543 |
|
---|
3544 | Case ScrollCode Of
|
---|
3545 | scColumnLeft,
|
---|
3546 | scColumnRight,
|
---|
3547 | scPageLeft,
|
---|
3548 | scPageRight,
|
---|
3549 | scHorzTrack,
|
---|
3550 | scHorzPosition:
|
---|
3551 | Begin
|
---|
3552 | FFileCursor.X := ScrollPos + FScrCursor.X -1;
|
---|
3553 | If Not _ICBPersistent Then _ICBClearICB;
|
---|
3554 | InvalidateEditor(0,0);
|
---|
3555 | End;
|
---|
3556 | scLineUp: cmCursorRollDown;
|
---|
3557 | scLineDown: cmCursorRollUp;
|
---|
3558 | scPageUp: cmCursorPageUp;
|
---|
3559 | scPageDown: cmCursorPageDown;
|
---|
3560 | scVertTrack,
|
---|
3561 | scVertPosition:
|
---|
3562 | Begin
|
---|
3563 | FlushWorkLine;
|
---|
3564 |
|
---|
3565 | SliderValue := FFileCursor.Y - FScrCursor.Y + 1;
|
---|
3566 | If ScrollPos = SliderValue Then Exit;
|
---|
3567 |
|
---|
3568 | If ScrollPos > SliderValue Then {downward}
|
---|
3569 | Begin
|
---|
3570 | cnt := ScrollPos - SliderValue;
|
---|
3571 | For L := 1 To cnt Do
|
---|
3572 | Begin
|
---|
3573 | If FActLine^.Next <> Nil Then
|
---|
3574 | Begin
|
---|
3575 | Inc(FFileCursor.Y);
|
---|
3576 | FActLine := FActLine^.Next;
|
---|
3577 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
3578 | End;
|
---|
3579 | End;
|
---|
3580 | End
|
---|
3581 | Else
|
---|
3582 | Begin {upward}
|
---|
3583 | cnt := SliderValue - ScrollPos;
|
---|
3584 | For L := 1 To cnt Do
|
---|
3585 | Begin
|
---|
3586 | If FTopScreenLine^.Prev <> Nil Then
|
---|
3587 | Begin
|
---|
3588 | Dec(FFileCursor.Y);
|
---|
3589 | FActLine := FActLine^.Prev;
|
---|
3590 | FTopScreenLine := FTopScreenLine^.Prev;
|
---|
3591 | End;
|
---|
3592 | End;
|
---|
3593 | End;
|
---|
3594 | If Not _ICBPersistent Then _ICBClearICB;
|
---|
3595 | InvalidateEditor(0,0);
|
---|
3596 | End;
|
---|
3597 | End;
|
---|
3598 |
|
---|
3599 | If Sender = FBottomScrollBar
|
---|
3600 | Then ScrollPos := FFileCursor.X - FScrCursor.X + 1
|
---|
3601 | Else ScrollPos := FFileCursor.Y - FScrCursor.Y + 1;
|
---|
3602 | End;
|
---|
3603 |
|
---|
3604 |
|
---|
3605 | Procedure TEditor.SetSliderValues;
|
---|
3606 | Begin
|
---|
3607 | If IgnoreRedraw > 0 Then Exit;
|
---|
3608 | If FBottomScrollBar <> Nil
|
---|
3609 | Then FBottomScrollBar.SetScrollRange(1,StringLength,FWinSize.X);
|
---|
3610 | If FRightScrollBar <> Nil
|
---|
3611 | Then FRightScrollBar.SetScrollRange(1,FCountLines,FWinSize.Y);
|
---|
3612 |
|
---|
3613 | SetSliderPosition;
|
---|
3614 | End;
|
---|
3615 |
|
---|
3616 |
|
---|
3617 | Procedure TEditor.SetSliderPosition;
|
---|
3618 | Var xl:LongInt;
|
---|
3619 | Begin
|
---|
3620 | If IgnoreRedraw > 0 Then Exit;
|
---|
3621 | If FBottomScrollBar <> Nil Then
|
---|
3622 | Begin
|
---|
3623 | xl := FFileCursor.X - FScrCursor.X + 1;
|
---|
3624 | FBottomScrollBar.Position := xl; {LongInt Property !}
|
---|
3625 | End;
|
---|
3626 | If FRightScrollBar <> Nil
|
---|
3627 | Then FRightScrollBar.Position := FFileCursor.Y - FScrCursor.Y + 1;
|
---|
3628 | End;
|
---|
3629 |
|
---|
3630 |
|
---|
3631 | Procedure TEditor.CalcSizes;
|
---|
3632 | Var CursorMoved:Boolean;
|
---|
3633 | FC:TEditorPos;
|
---|
3634 | Begin
|
---|
3635 | ClientArea := ClientRect;
|
---|
3636 | {??????????+-1}
|
---|
3637 | Inc(ClientArea.Right);
|
---|
3638 | Inc(ClientArea.Top);
|
---|
3639 | FWinSize.X := (ClientArea.Right - ClientArea.Left -
|
---|
3640 | IndentRect.Left - IndentRect.Right -
|
---|
3641 | 2 * Integer(FBorderWidth)) Div Canvas.FontWidth;
|
---|
3642 | FWinSize.Y := (ClientArea.Top - ClientArea.Bottom -
|
---|
3643 | IndentRect.Bottom - IndentRect.Top -
|
---|
3644 | 2 * Integer(FBorderWidth)) Div Canvas.FontHeight;
|
---|
3645 |
|
---|
3646 |
|
---|
3647 | CursorMoved := False;
|
---|
3648 | If FScrCursor.Y > FWinSize.Y Then
|
---|
3649 | Begin
|
---|
3650 | FC.Y := FFileCursor.Y-FScrCursor.Y+FWinSize.Y;
|
---|
3651 | CursorMoved := True;
|
---|
3652 | End
|
---|
3653 | Else FC.Y := FFileCursor.Y;
|
---|
3654 | If FScrCursor.X > FWinSize.X Then
|
---|
3655 | Begin
|
---|
3656 | FC.X := FFileCursor.X-FScrCursor.X+FWinSize.X;
|
---|
3657 | CursorMoved := True;
|
---|
3658 | End
|
---|
3659 | Else FC.X := FFileCursor.X;
|
---|
3660 | If CursorMoved Then
|
---|
3661 | Begin
|
---|
3662 | Inc(IgnoreRedraw);
|
---|
3663 | GotoPosition(FC);
|
---|
3664 | Dec(IgnoreRedraw);
|
---|
3665 | End;
|
---|
3666 | SetScreenCursor;
|
---|
3667 | SetSliderValues;
|
---|
3668 | End;
|
---|
3669 |
|
---|
3670 |
|
---|
3671 | { +++ CursorMove-Events ++++++++++++++++++++++++++++++++++++++++++++++++++++ }
|
---|
3672 |
|
---|
3673 | Procedure TEditor.cmCursorDown;
|
---|
3674 | Var iew:Boolean;
|
---|
3675 | Begin
|
---|
3676 | If FWinSize.Y = 0 Then Exit;
|
---|
3677 | (*Undo*)
|
---|
3678 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3679 | (*Undo*)
|
---|
3680 |
|
---|
3681 | iew := _CursorDown;
|
---|
3682 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3683 |
|
---|
3684 | If iew Then InvalidateEditor(0,0)
|
---|
3685 | Else SetScreenCursor;
|
---|
3686 | (*Undo*)
|
---|
3687 | LastUndoGroup := ugCursorMove;
|
---|
3688 | (*Undo*)
|
---|
3689 | End;
|
---|
3690 |
|
---|
3691 |
|
---|
3692 | Procedure TEditor.cmCursorUp;
|
---|
3693 | Var iew:Boolean;
|
---|
3694 | Begin
|
---|
3695 | If FWinSize.Y = 0 Then Exit;
|
---|
3696 | (*Undo*)
|
---|
3697 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3698 | (*Undo*)
|
---|
3699 |
|
---|
3700 | iew := _CursorUp;
|
---|
3701 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3702 |
|
---|
3703 | If iew Then InvalidateEditor(0,0)
|
---|
3704 | Else SetScreenCursor;
|
---|
3705 | (*Undo*)
|
---|
3706 | LastUndoGroup := ugCursorMove;
|
---|
3707 | (*Undo*)
|
---|
3708 | End;
|
---|
3709 |
|
---|
3710 |
|
---|
3711 | Procedure TEditor.cmCursorRight;
|
---|
3712 | Var iew:Boolean;
|
---|
3713 | climb:Boolean;
|
---|
3714 | Begin
|
---|
3715 | climb := False;
|
---|
3716 | If FEditOpt * [eoCursorClimb] <> [] Then
|
---|
3717 | If FFileCursor.X > Length(_PLine2PString(FActLine)^) Then
|
---|
3718 | If FFileCursor.Y < CountLines Then climb := True
|
---|
3719 | Else Exit;
|
---|
3720 |
|
---|
3721 | If _ICBPersistent Then
|
---|
3722 | If (FFileCursor.X >= StringLength) And Not climb Then Exit;
|
---|
3723 |
|
---|
3724 | (*Undo*)
|
---|
3725 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3726 | (*Undo*)
|
---|
3727 |
|
---|
3728 | iew := _CursorRight;
|
---|
3729 | If climb Then
|
---|
3730 | Begin
|
---|
3731 | iew := _CursorDown Or iew;
|
---|
3732 | iew := _CursorHome Or iew;
|
---|
3733 | End;
|
---|
3734 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3735 |
|
---|
3736 | If iew Then InvalidateEditor(0,0)
|
---|
3737 | Else SetScreenCursor;
|
---|
3738 | (*Undo*)
|
---|
3739 | LastUndoGroup := ugCursorMove;
|
---|
3740 | (*Undo*)
|
---|
3741 | End;
|
---|
3742 |
|
---|
3743 |
|
---|
3744 | Procedure TEditor.cmCursorLeft;
|
---|
3745 | Var iew:Boolean;
|
---|
3746 | climb:Boolean;
|
---|
3747 | Begin
|
---|
3748 | climb := False;
|
---|
3749 | If FEditOpt * [eoCursorClimb] <> [] Then
|
---|
3750 | If FFileCursor.X <= 1 Then
|
---|
3751 | If FFileCursor.Y > 1 Then climb := True
|
---|
3752 | Else Exit;
|
---|
3753 |
|
---|
3754 | (*Undo*)
|
---|
3755 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3756 | (*Undo*)
|
---|
3757 |
|
---|
3758 | iew := _CursorLeft;
|
---|
3759 | If climb Then
|
---|
3760 | Begin
|
---|
3761 | iew := _CursorUp Or iew;
|
---|
3762 | iew := _CursorEnd Or iew;
|
---|
3763 | End;
|
---|
3764 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3765 |
|
---|
3766 | If iew Then InvalidateEditor(0,0)
|
---|
3767 | Else SetScreenCursor;
|
---|
3768 | (*Undo*)
|
---|
3769 | LastUndoGroup := ugCursorMove;
|
---|
3770 | (*Undo*)
|
---|
3771 | End;
|
---|
3772 |
|
---|
3773 |
|
---|
3774 | Procedure TEditor.cmCursorHome;
|
---|
3775 | Var iew:Boolean;
|
---|
3776 | I,p1:Integer;
|
---|
3777 | Begin
|
---|
3778 | If _ICBPersistent Then
|
---|
3779 | If FFileCursor.X = 1 Then Exit;
|
---|
3780 |
|
---|
3781 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3782 | (*Undo*)
|
---|
3783 |
|
---|
3784 | If Not WLactivated Then _ReadWorkLine;
|
---|
3785 | p1 := 1;
|
---|
3786 | If FEditOpt * [eoHomeFirstWord] <> [] Then
|
---|
3787 | Begin
|
---|
3788 | For I := 1 To FFileCursor.X-1 Do
|
---|
3789 | Begin
|
---|
3790 | If I > Length(FWorkLine) Then break;
|
---|
3791 |
|
---|
3792 | If FWorkLine[I] > ' ' Then
|
---|
3793 | Begin
|
---|
3794 | p1 := I; {onto First Word}
|
---|
3795 | break;
|
---|
3796 | End;
|
---|
3797 | End;
|
---|
3798 | End;
|
---|
3799 |
|
---|
3800 | If p1 > 1 Then
|
---|
3801 | Begin
|
---|
3802 | _HorizMove;
|
---|
3803 | FFileCursor.X := p1;
|
---|
3804 | FScrCursor.X := p1;
|
---|
3805 | If FScrCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X;
|
---|
3806 | iew := _HorizMove;
|
---|
3807 | End
|
---|
3808 | Else iew := _CursorHome;
|
---|
3809 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3810 |
|
---|
3811 | If iew Then InvalidateEditor(0,0)
|
---|
3812 | Else SetScreenCursor;
|
---|
3813 | (*Undo*)
|
---|
3814 | LastUndoGroup := ugCursorMove;
|
---|
3815 | (*Undo*)
|
---|
3816 | End;
|
---|
3817 |
|
---|
3818 |
|
---|
3819 | Procedure TEditor.cmCursorEnd;
|
---|
3820 | Var iew:Boolean;
|
---|
3821 | lzk:Integer;
|
---|
3822 | Begin
|
---|
3823 | FlushWorkLine;
|
---|
3824 | lzk := Length(_PLine2PString(FActLine)^);
|
---|
3825 | If _ICBPersistent Then
|
---|
3826 | If FFileCursor.X = lzk+1 Then Exit;
|
---|
3827 | (*Undo*)
|
---|
3828 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3829 | (*Undo*)
|
---|
3830 |
|
---|
3831 | iew := _CursorEnd;
|
---|
3832 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3833 |
|
---|
3834 | If iew Then InvalidateEditor(0,0)
|
---|
3835 | Else SetScreenCursor;
|
---|
3836 | (*Undo*)
|
---|
3837 | LastUndoGroup := ugCursorMove;
|
---|
3838 | (*Undo*)
|
---|
3839 | End;
|
---|
3840 |
|
---|
3841 |
|
---|
3842 | Procedure TEditor.cmCursorPageDown;
|
---|
3843 | Begin
|
---|
3844 | If _ICBPersistent Then
|
---|
3845 | If FFileCursor.Y >= FCountLines Then Exit;
|
---|
3846 | (*Undo*)
|
---|
3847 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3848 | (*Undo*)
|
---|
3849 |
|
---|
3850 | _CursorPageDown;
|
---|
3851 | If Not _ICBPersistent Then _ICBClearICB;
|
---|
3852 |
|
---|
3853 | InvalidateEditor(0,0);
|
---|
3854 | (*Undo*)
|
---|
3855 | LastUndoGroup := ugCursorMove;
|
---|
3856 | (*Undo*)
|
---|
3857 | End;
|
---|
3858 |
|
---|
3859 |
|
---|
3860 | Procedure TEditor.cmCursorPageUp;
|
---|
3861 | Begin
|
---|
3862 | If _ICBPersistent Then
|
---|
3863 | If FFileCursor.Y <= 1 Then Exit;
|
---|
3864 | (*Undo*)
|
---|
3865 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3866 | (*Undo*)
|
---|
3867 |
|
---|
3868 | _CursorPageUp;
|
---|
3869 | If Not _ICBPersistent Then _ICBClearICB;
|
---|
3870 |
|
---|
3871 | InvalidateEditor(0,0);
|
---|
3872 | (*Undo*)
|
---|
3873 | LastUndoGroup := ugCursorMove;
|
---|
3874 | (*Undo*)
|
---|
3875 | End;
|
---|
3876 |
|
---|
3877 |
|
---|
3878 | Procedure TEditor.cmCursorRollDown;
|
---|
3879 | Var FCY:LongInt;
|
---|
3880 | Begin
|
---|
3881 | If FWinSize.Y = 0 Then Exit;
|
---|
3882 | If FTopScreenLine^.Prev = Nil Then Exit;
|
---|
3883 | (*Undo*)
|
---|
3884 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3885 | (*Undo*)
|
---|
3886 |
|
---|
3887 | FCY := FFileCursor.Y;
|
---|
3888 | _CursorRollUp;
|
---|
3889 | If (Not _ICBPersistent) And (FCY <> FFileCursor.Y) Then _ICBClearICB;
|
---|
3890 |
|
---|
3891 | InvalidateEditor(0,0);
|
---|
3892 | (*Undo*)
|
---|
3893 | LastUndoGroup := ugCursorMove;
|
---|
3894 | (*Undo*)
|
---|
3895 | End;
|
---|
3896 |
|
---|
3897 |
|
---|
3898 | Procedure TEditor.cmCursorRollUp;
|
---|
3899 | Var FCY:LongInt;
|
---|
3900 | Begin
|
---|
3901 | If FWinSize.Y = 0 Then Exit;
|
---|
3902 | If FActLine^.Next = Nil Then Exit;
|
---|
3903 | (*Undo*)
|
---|
3904 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3905 | (*Undo*)
|
---|
3906 |
|
---|
3907 | FCY := FFileCursor.Y;
|
---|
3908 | _CursorRollDown;
|
---|
3909 | If (Not _ICBPersistent) And (FCY <> FFileCursor.Y) Then _ICBClearICB;
|
---|
3910 |
|
---|
3911 | InvalidateEditor(0,0);
|
---|
3912 | (*Undo*)
|
---|
3913 | LastUndoGroup := ugCursorMove;
|
---|
3914 | (*Undo*)
|
---|
3915 | End;
|
---|
3916 |
|
---|
3917 |
|
---|
3918 | Procedure TEditor.cmCursorWordRight;
|
---|
3919 | Var iew:Boolean;
|
---|
3920 | Begin
|
---|
3921 | (*Undo*)
|
---|
3922 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3923 | (*Undo*)
|
---|
3924 |
|
---|
3925 | iew := _CursorWordRight;
|
---|
3926 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3927 |
|
---|
3928 | If iew Then InvalidateEditor(0,0)
|
---|
3929 | Else SetScreenCursor;
|
---|
3930 | (*Undo*)
|
---|
3931 | LastUndoGroup := ugCursorMove;
|
---|
3932 | (*Undo*)
|
---|
3933 | End;
|
---|
3934 |
|
---|
3935 |
|
---|
3936 | Procedure TEditor.cmCursorWordLeft;
|
---|
3937 | Var iew:Boolean;
|
---|
3938 | Begin
|
---|
3939 | (*Undo*)
|
---|
3940 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
3941 | (*Undo*)
|
---|
3942 |
|
---|
3943 | iew := _CursorWordLeft;
|
---|
3944 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
3945 |
|
---|
3946 | If iew Then InvalidateEditor(0,0)
|
---|
3947 | Else SetScreenCursor;
|
---|
3948 | (*Undo*)
|
---|
3949 | LastUndoGroup := ugCursorMove;
|
---|
3950 | (*Undo*)
|
---|
3951 | End;
|
---|
3952 |
|
---|
3953 |
|
---|
3954 | Procedure TEditor.cmCursorFileBegin;
|
---|
3955 | Var P:TEditorPos;
|
---|
3956 | Begin
|
---|
3957 | P.X := 1;
|
---|
3958 | P.Y := 1;
|
---|
3959 | GotoPosition(P);
|
---|
3960 | End;
|
---|
3961 |
|
---|
3962 |
|
---|
3963 | Procedure TEditor.cmCursorFileEnd;
|
---|
3964 | Var P:TEditorPos;
|
---|
3965 | Begin
|
---|
3966 | P.X := Length(_PLine2PString(FLastLine)^);
|
---|
3967 | Inc(P.X);
|
---|
3968 | P.Y := FCountLines;
|
---|
3969 | GotoPosition(P);
|
---|
3970 | End;
|
---|
3971 |
|
---|
3972 |
|
---|
3973 | Procedure TEditor.cmCursorPageHome;
|
---|
3974 | Var P:TEditorPos;
|
---|
3975 | Begin
|
---|
3976 | P.X := FFileCursor.X;
|
---|
3977 | P.Y := FFileCursor.Y-FScrCursor.Y+1;
|
---|
3978 | GotoPosition(P);
|
---|
3979 | End;
|
---|
3980 |
|
---|
3981 |
|
---|
3982 | Procedure TEditor.cmCursorPageEnd;
|
---|
3983 | Var P:TEditorPos;
|
---|
3984 | Begin
|
---|
3985 | P.X := FFileCursor.X;
|
---|
3986 | P.Y := FFileCursor.Y+FWinSize.Y-FScrCursor.Y;
|
---|
3987 | GotoPosition(P);
|
---|
3988 | End;
|
---|
3989 |
|
---|
3990 |
|
---|
3991 | {Extend Selection}
|
---|
3992 |
|
---|
3993 | Procedure TEditor.cmICBExtLeft;
|
---|
3994 | Var iew:Boolean;
|
---|
3995 | y1,y2:Integer;
|
---|
3996 | climb:Boolean;
|
---|
3997 | Label L;
|
---|
3998 | Begin
|
---|
3999 | climb := False;
|
---|
4000 | If FEditOpt * [eoCursorClimb] <> [] Then
|
---|
4001 | If FSelectMode <> smColumnBlock Then
|
---|
4002 | If FFileCursor.X <= 1 Then
|
---|
4003 | If FFileCursor.Y > 1 Then climb := True
|
---|
4004 | Else Exit;
|
---|
4005 |
|
---|
4006 | (*Undo*)
|
---|
4007 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4008 | LastUndoGroup := ugCursorMove;
|
---|
4009 | (*Undo*)
|
---|
4010 | iew := _ICBExtSetICB;
|
---|
4011 |
|
---|
4012 | If _ICBActPos = ICB.First Then
|
---|
4013 | Begin
|
---|
4014 | iew := _CursorLeft Or iew;
|
---|
4015 | If climb Then
|
---|
4016 | Begin
|
---|
4017 | iew := _CursorUp Or iew;
|
---|
4018 | iew := _CursorEnd Or iew;
|
---|
4019 | End;
|
---|
4020 | ICB.First := _ICBActPos;
|
---|
4021 | Goto L;
|
---|
4022 | End;
|
---|
4023 |
|
---|
4024 | If _ICBActPos = ICB.Last Then
|
---|
4025 | Begin
|
---|
4026 | iew := _CursorLeft Or iew;
|
---|
4027 | If climb Then
|
---|
4028 | Begin
|
---|
4029 | iew := _CursorUp Or iew;
|
---|
4030 | iew := _CursorEnd Or iew;
|
---|
4031 | End;
|
---|
4032 | ICB.Last := _ICBActPos;
|
---|
4033 | End;
|
---|
4034 | L:
|
---|
4035 | _ICBExtCorrectICB;
|
---|
4036 | _ICBExtCorrectICB2;
|
---|
4037 | _ICBSetMark;
|
---|
4038 | ICBVisible := True;
|
---|
4039 | If Not iew Then
|
---|
4040 | Begin
|
---|
4041 | y1 := FScrCursor.Y;
|
---|
4042 | y2 := FScrCursor.Y;
|
---|
4043 | If climb Then Inc(y2);
|
---|
4044 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4045 | InvalidateEditor(y1,y2)
|
---|
4046 | End
|
---|
4047 | Else InvalidateEditor(0,0);
|
---|
4048 | End;
|
---|
4049 |
|
---|
4050 |
|
---|
4051 | Procedure TEditor.cmICBExtRight;
|
---|
4052 | Var iew:Boolean;
|
---|
4053 | y1,y2:Integer;
|
---|
4054 | climb:Boolean;
|
---|
4055 | Label L;
|
---|
4056 | Begin
|
---|
4057 | climb := False;
|
---|
4058 | If FEditOpt * [eoCursorClimb] <> [] Then
|
---|
4059 | If FSelectMode <> smColumnBlock Then
|
---|
4060 | If FFileCursor.X > Length(_PLine2PString(FActLine)^) Then
|
---|
4061 | If FFileCursor.Y < CountLines Then climb := True
|
---|
4062 | Else Exit;
|
---|
4063 |
|
---|
4064 | (*Undo*)
|
---|
4065 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4066 | LastUndoGroup := ugCursorMove;
|
---|
4067 | (*Undo*)
|
---|
4068 | iew := _ICBExtSetICB;
|
---|
4069 |
|
---|
4070 | If _ICBActPos = ICB.Last Then
|
---|
4071 | Begin
|
---|
4072 | iew := _CursorRight Or iew;
|
---|
4073 | If climb Then
|
---|
4074 | Begin
|
---|
4075 | iew := _CursorDown Or iew;
|
---|
4076 | iew := _CursorHome Or iew;
|
---|
4077 | End;
|
---|
4078 | ICB.Last := _ICBActPos;
|
---|
4079 | Goto L;
|
---|
4080 | End;
|
---|
4081 |
|
---|
4082 | If _ICBActPos = ICB.First Then
|
---|
4083 | Begin
|
---|
4084 | iew := _CursorRight Or iew;
|
---|
4085 | If climb Then
|
---|
4086 | Begin
|
---|
4087 | iew := _CursorDown Or iew;
|
---|
4088 | iew := _CursorHome Or iew;
|
---|
4089 | End;
|
---|
4090 | ICB.First := _ICBActPos;
|
---|
4091 | End;
|
---|
4092 | L:
|
---|
4093 | _ICBExtCorrectICB;
|
---|
4094 | _ICBExtCorrectICB2;
|
---|
4095 | _ICBSetMark;
|
---|
4096 | ICBVisible := True;
|
---|
4097 | If Not iew Then
|
---|
4098 | Begin
|
---|
4099 | y1 := FScrCursor.Y;
|
---|
4100 | y2 := FScrCursor.Y;
|
---|
4101 | If climb Then Dec(y1);
|
---|
4102 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4103 | InvalidateEditor(y1,y2)
|
---|
4104 | End
|
---|
4105 | Else InvalidateEditor(0,0);
|
---|
4106 | End;
|
---|
4107 |
|
---|
4108 |
|
---|
4109 | Procedure TEditor.cmICBExtUp;
|
---|
4110 | Var iew:Boolean;
|
---|
4111 | ScrY:Integer;
|
---|
4112 | Label L;
|
---|
4113 | Begin
|
---|
4114 | (*Undo*)
|
---|
4115 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4116 | LastUndoGroup := ugCursorMove;
|
---|
4117 | (*Undo*)
|
---|
4118 | iew := _ICBExtSetICB;
|
---|
4119 |
|
---|
4120 | ScrY := FScrCursor.Y;
|
---|
4121 | If _ICBActPos = ICB.First Then
|
---|
4122 | Begin
|
---|
4123 | iew := _CursorUp Or iew;
|
---|
4124 | ICB.First := _ICBActPos;
|
---|
4125 | Goto L;
|
---|
4126 | End;
|
---|
4127 |
|
---|
4128 | If _ICBActPos = ICB.Last Then
|
---|
4129 | Begin
|
---|
4130 | iew := _CursorUp Or iew;
|
---|
4131 | ICB.Last := _ICBActPos;
|
---|
4132 | End;
|
---|
4133 | L:
|
---|
4134 | _ICBExtCorrectICB;
|
---|
4135 | _ICBExtCorrectICB2;
|
---|
4136 | _ICBSetMark;
|
---|
4137 | ICBVisible := True;
|
---|
4138 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4139 | If iew Then InvalidateEditor(0,0)
|
---|
4140 | Else InvalidateEditor(FScrCursor.Y,ScrY);
|
---|
4141 | End;
|
---|
4142 |
|
---|
4143 |
|
---|
4144 | Procedure TEditor.cmICBExtDown;
|
---|
4145 | Var iew:Boolean;
|
---|
4146 | ScrY:Integer;
|
---|
4147 | Label L;
|
---|
4148 | Begin
|
---|
4149 | (*Undo*)
|
---|
4150 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4151 | LastUndoGroup := ugCursorMove;
|
---|
4152 | (*Undo*)
|
---|
4153 | iew := _ICBExtSetICB;
|
---|
4154 |
|
---|
4155 | ScrY := FScrCursor.Y;
|
---|
4156 | If _ICBActPos = ICB.Last Then
|
---|
4157 | Begin
|
---|
4158 | iew := _CursorDown Or iew;
|
---|
4159 | ICB.Last := _ICBActPos;
|
---|
4160 | Goto L;
|
---|
4161 | End;
|
---|
4162 |
|
---|
4163 | If _ICBActPos = ICB.First Then
|
---|
4164 | Begin
|
---|
4165 | iew := _CursorDown Or iew;
|
---|
4166 | ICB.First := _ICBActPos;
|
---|
4167 | End;
|
---|
4168 | L:
|
---|
4169 | _ICBExtCorrectICB;
|
---|
4170 | _ICBExtCorrectICB2;
|
---|
4171 | _ICBSetMark;
|
---|
4172 | ICBVisible := True;
|
---|
4173 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4174 | If iew Then InvalidateEditor(0,0)
|
---|
4175 | Else InvalidateEditor(ScrY,FScrCursor.Y);
|
---|
4176 | End;
|
---|
4177 |
|
---|
4178 |
|
---|
4179 | Procedure TEditor.cmICBExtPageUp;
|
---|
4180 | Var iew:Boolean;
|
---|
4181 | Label L;
|
---|
4182 | Begin
|
---|
4183 | (*Undo*)
|
---|
4184 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4185 | LastUndoGroup := ugCursorMove;
|
---|
4186 | (*Undo*)
|
---|
4187 | iew := _ICBExtSetICB;
|
---|
4188 |
|
---|
4189 | If _ICBActPos = ICB.First Then
|
---|
4190 | Begin
|
---|
4191 | iew := _CursorPageUp Or iew;
|
---|
4192 | ICB.First := _ICBActPos;
|
---|
4193 | Goto L;
|
---|
4194 | End;
|
---|
4195 |
|
---|
4196 | If _ICBActPos = ICB.Last Then
|
---|
4197 | Begin
|
---|
4198 | iew := _CursorPageUp Or iew;
|
---|
4199 | ICB.Last := _ICBActPos;
|
---|
4200 | End;
|
---|
4201 | L:
|
---|
4202 | _ICBExtCorrectICB;
|
---|
4203 | _ICBExtCorrectICB2;
|
---|
4204 | _ICBSetMark;
|
---|
4205 | ICBVisible := True;
|
---|
4206 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4207 | If iew Then InvalidateEditor(0,0);
|
---|
4208 | End;
|
---|
4209 |
|
---|
4210 |
|
---|
4211 | Procedure TEditor.cmICBExtPageDown;
|
---|
4212 | Var iew:Boolean;
|
---|
4213 | Label L;
|
---|
4214 | Begin
|
---|
4215 | (*Undo*)
|
---|
4216 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4217 | LastUndoGroup := ugCursorMove;
|
---|
4218 | (*Undo*)
|
---|
4219 | iew := _ICBExtSetICB;
|
---|
4220 |
|
---|
4221 | If _ICBActPos = ICB.Last Then
|
---|
4222 | Begin
|
---|
4223 | iew := _CursorPageDown Or iew;
|
---|
4224 | ICB.Last := _ICBActPos;
|
---|
4225 | Goto L;
|
---|
4226 | End;
|
---|
4227 |
|
---|
4228 | If _ICBActPos = ICB.First Then
|
---|
4229 | Begin
|
---|
4230 | iew := _CursorPageDown Or iew;
|
---|
4231 | ICB.First := _ICBActPos;
|
---|
4232 | End;
|
---|
4233 | L:
|
---|
4234 | _ICBExtCorrectICB;
|
---|
4235 | _ICBExtCorrectICB2;
|
---|
4236 | _ICBSetMark;
|
---|
4237 | ICBVisible := True;
|
---|
4238 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4239 | If iew Then InvalidateEditor(0,0);
|
---|
4240 | End;
|
---|
4241 |
|
---|
4242 |
|
---|
4243 | Procedure TEditor.cmICBExtHome;
|
---|
4244 | Var iew:Boolean;
|
---|
4245 | y1,y2:Integer;
|
---|
4246 | I,p1:Integer;
|
---|
4247 | icbap:TLineX;
|
---|
4248 | Label L;
|
---|
4249 | Begin
|
---|
4250 | (*Undo*)
|
---|
4251 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4252 | LastUndoGroup := ugCursorMove;
|
---|
4253 | (*Undo*)
|
---|
4254 | iew := _ICBExtSetICB;
|
---|
4255 | icbap := _ICBActPos;
|
---|
4256 |
|
---|
4257 | If Not WLactivated Then _ReadWorkLine;
|
---|
4258 | p1 := 1;
|
---|
4259 | If FEditOpt * [eoHomeFirstWord] <> [] Then
|
---|
4260 | Begin
|
---|
4261 | For I := 1 To FFileCursor.X-1 Do
|
---|
4262 | Begin
|
---|
4263 | If I > Length(FWorkLine) Then break;
|
---|
4264 |
|
---|
4265 | If FWorkLine[I] > ' ' Then
|
---|
4266 | Begin
|
---|
4267 | p1 := I; {onto First Word}
|
---|
4268 | break;
|
---|
4269 | End;
|
---|
4270 | End;
|
---|
4271 | End;
|
---|
4272 |
|
---|
4273 | If p1 > 1 Then
|
---|
4274 | Begin
|
---|
4275 | _HorizMove;
|
---|
4276 | FFileCursor.X := p1;
|
---|
4277 | FScrCursor.X := p1;
|
---|
4278 | If FScrCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X;
|
---|
4279 | iew := _HorizMove Or iew;
|
---|
4280 | End
|
---|
4281 | Else iew := _CursorHome Or iew;
|
---|
4282 |
|
---|
4283 | If icbap = ICB.First Then
|
---|
4284 | Begin
|
---|
4285 | ICB.First := _ICBActPos;
|
---|
4286 | Goto L;
|
---|
4287 | End;
|
---|
4288 |
|
---|
4289 | If icbap = ICB.Last Then
|
---|
4290 | Begin
|
---|
4291 | ICB.Last := _ICBActPos;
|
---|
4292 | End;
|
---|
4293 | L:
|
---|
4294 | _ICBExtCorrectICB;
|
---|
4295 | _ICBExtCorrectICB2;
|
---|
4296 | _ICBSetMark;
|
---|
4297 | ICBVisible := True;
|
---|
4298 | If Not iew Then
|
---|
4299 | Begin
|
---|
4300 | y1 := FScrCursor.Y;
|
---|
4301 | y2 := FScrCursor.Y;
|
---|
4302 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4303 | InvalidateEditor(y1,y2)
|
---|
4304 | End
|
---|
4305 | Else InvalidateEditor(0,0);
|
---|
4306 | End;
|
---|
4307 |
|
---|
4308 |
|
---|
4309 | Procedure TEditor.cmICBExtEnd;
|
---|
4310 | Var iew:Boolean;
|
---|
4311 | y1,y2:Integer;
|
---|
4312 | Label L;
|
---|
4313 | Begin
|
---|
4314 | (*Undo*)
|
---|
4315 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4316 | LastUndoGroup := ugCursorMove;
|
---|
4317 | (*Undo*)
|
---|
4318 | iew := _ICBExtSetICB;
|
---|
4319 |
|
---|
4320 | If _ICBActPos = ICB.Last Then
|
---|
4321 | Begin
|
---|
4322 | iew := _CursorEnd Or iew;
|
---|
4323 | ICB.Last := _ICBActPos;
|
---|
4324 | Goto L;
|
---|
4325 | End;
|
---|
4326 |
|
---|
4327 | If _ICBActPos = ICB.First Then
|
---|
4328 | Begin
|
---|
4329 | iew := _CursorEnd Or iew;
|
---|
4330 | ICB.First := _ICBActPos;
|
---|
4331 | End;
|
---|
4332 | L:
|
---|
4333 | _ICBExtCorrectICB;
|
---|
4334 | _ICBExtCorrectICB2;
|
---|
4335 | _ICBSetMark;
|
---|
4336 | ICBVisible := True;
|
---|
4337 | If Not iew Then
|
---|
4338 | Begin
|
---|
4339 | y1 := FScrCursor.Y;
|
---|
4340 | y2 := FScrCursor.Y;
|
---|
4341 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4342 | InvalidateEditor(y1,y2)
|
---|
4343 | End
|
---|
4344 | Else InvalidateEditor(0,0);
|
---|
4345 | End;
|
---|
4346 |
|
---|
4347 |
|
---|
4348 | Procedure TEditor.cmICBExtWordLeft;
|
---|
4349 | Var iew:Boolean;
|
---|
4350 | ScrY:Integer;
|
---|
4351 | y1,y2:Integer;
|
---|
4352 | Label L;
|
---|
4353 | Begin
|
---|
4354 | (*Undo*)
|
---|
4355 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4356 | LastUndoGroup := ugCursorMove;
|
---|
4357 | (*Undo*)
|
---|
4358 | iew := _ICBExtSetICB;
|
---|
4359 |
|
---|
4360 | ScrY := FScrCursor.Y;
|
---|
4361 | If _ICBActPos = ICB.First Then
|
---|
4362 | Begin
|
---|
4363 | iew := _CursorWordLeft Or iew;
|
---|
4364 | ICB.First := _ICBActPos;
|
---|
4365 | Goto L;
|
---|
4366 | End;
|
---|
4367 |
|
---|
4368 | If _ICBActPos = ICB.Last Then
|
---|
4369 | Begin
|
---|
4370 | iew := _CursorWordLeft Or iew;
|
---|
4371 | ICB.Last := _ICBActPos;
|
---|
4372 | End;
|
---|
4373 | L:
|
---|
4374 | _ICBExtCorrectICB;
|
---|
4375 | _ICBExtCorrectICB2;
|
---|
4376 | _ICBSetMark;
|
---|
4377 | ICBVisible := True;
|
---|
4378 | If Not iew Then
|
---|
4379 | Begin
|
---|
4380 | y1 := FScrCursor.Y;
|
---|
4381 | y2 := ScrY;
|
---|
4382 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4383 | InvalidateEditor(y1,y2)
|
---|
4384 | End
|
---|
4385 | Else InvalidateEditor(0,0);
|
---|
4386 | End;
|
---|
4387 |
|
---|
4388 |
|
---|
4389 | Procedure TEditor.cmICBExtWordRight;
|
---|
4390 | Var iew:Boolean;
|
---|
4391 | ScrY:Integer;
|
---|
4392 | y1,y2:Integer;
|
---|
4393 | Label L;
|
---|
4394 | Begin
|
---|
4395 | (*Undo*)
|
---|
4396 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4397 | LastUndoGroup := ugCursorMove;
|
---|
4398 | (*Undo*)
|
---|
4399 | iew := _ICBExtSetICB;
|
---|
4400 |
|
---|
4401 | ScrY := FScrCursor.Y;
|
---|
4402 | If _ICBActPos = ICB.Last Then
|
---|
4403 | Begin
|
---|
4404 | iew := _CursorWordRight Or iew;
|
---|
4405 | ICB.Last := _ICBActPos;
|
---|
4406 | Goto L;
|
---|
4407 | End;
|
---|
4408 |
|
---|
4409 | If _ICBActPos = ICB.First Then
|
---|
4410 | Begin
|
---|
4411 | iew := _CursorWordRight Or iew;
|
---|
4412 | ICB.First := _ICBActPos;
|
---|
4413 | End;
|
---|
4414 | L:
|
---|
4415 | _ICBExtCorrectICB;
|
---|
4416 | _ICBExtCorrectICB2;
|
---|
4417 | _ICBSetMark;
|
---|
4418 | ICBVisible := True;
|
---|
4419 | If Not iew Then
|
---|
4420 | Begin
|
---|
4421 | y1 := ScrY;
|
---|
4422 | y2 := FScrCursor.Y;
|
---|
4423 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4424 | InvalidateEditor(y1,y2)
|
---|
4425 | End
|
---|
4426 | Else InvalidateEditor(0,0);
|
---|
4427 | End;
|
---|
4428 |
|
---|
4429 |
|
---|
4430 | Procedure TEditor.cmICBExtFileBegin;
|
---|
4431 | Var iew:Boolean;
|
---|
4432 | P:TEditorPos;
|
---|
4433 | ScrY:Integer;
|
---|
4434 | y1,y2:Integer;
|
---|
4435 | Label L;
|
---|
4436 | Begin
|
---|
4437 | (*Undo*)
|
---|
4438 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4439 | LastUndoGroup := ugCursorMove;
|
---|
4440 | (*Undo*)
|
---|
4441 | iew := _ICBExtSetICB;
|
---|
4442 |
|
---|
4443 | ScrY := FScrCursor.Y;
|
---|
4444 | P.X := 1;
|
---|
4445 | P.Y := 1;
|
---|
4446 | If _ICBActPos = ICB.First Then
|
---|
4447 | Begin
|
---|
4448 | iew := _GotoPosition(P) Or iew;
|
---|
4449 | ICB.First := _ICBActPos;
|
---|
4450 | Goto L;
|
---|
4451 | End;
|
---|
4452 |
|
---|
4453 | If _ICBActPos = ICB.Last Then
|
---|
4454 | Begin
|
---|
4455 | iew := _GotoPosition(P) Or iew;
|
---|
4456 | ICB.Last := _ICBActPos;
|
---|
4457 | End;
|
---|
4458 | L:
|
---|
4459 | _ICBExtCorrectICB;
|
---|
4460 | _ICBExtCorrectICB2;
|
---|
4461 | _ICBSetMark;
|
---|
4462 | ICBVisible := True;
|
---|
4463 | If Not iew Then
|
---|
4464 | Begin
|
---|
4465 | y1 := FScrCursor.Y;
|
---|
4466 | y2 := ScrY;
|
---|
4467 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4468 | InvalidateEditor(y1,y2)
|
---|
4469 | End
|
---|
4470 | Else InvalidateEditor(0,0);
|
---|
4471 | End;
|
---|
4472 |
|
---|
4473 |
|
---|
4474 | Procedure TEditor.cmICBExtFileEnd;
|
---|
4475 | Var iew:Boolean;
|
---|
4476 | P:TEditorPos;
|
---|
4477 | ScrY:Integer;
|
---|
4478 | y1,y2:Integer;
|
---|
4479 | Label L;
|
---|
4480 | Begin
|
---|
4481 | (*Undo*)
|
---|
4482 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4483 | LastUndoGroup := ugCursorMove;
|
---|
4484 | (*Undo*)
|
---|
4485 | iew := _ICBExtSetICB;
|
---|
4486 |
|
---|
4487 | ScrY := FScrCursor.Y;
|
---|
4488 | P.X := Length(_PLine2PString(FLastLine)^);
|
---|
4489 | Inc(P.X);
|
---|
4490 | If P.X > StringLength Then P.X := StringLength;
|
---|
4491 | P.Y := FCountLines;
|
---|
4492 | If _ICBActPos = ICB.Last Then
|
---|
4493 | Begin
|
---|
4494 | iew := _GotoPosition(P) Or iew;
|
---|
4495 | ICB.Last := _ICBActPos;
|
---|
4496 | Goto L;
|
---|
4497 | End;
|
---|
4498 |
|
---|
4499 | If _ICBActPos = ICB.First Then
|
---|
4500 | Begin
|
---|
4501 | iew := _GotoPosition(P) Or iew;
|
---|
4502 | ICB.First := _ICBActPos;
|
---|
4503 | End;
|
---|
4504 | L:
|
---|
4505 | _ICBExtCorrectICB;
|
---|
4506 | _ICBExtCorrectICB2;
|
---|
4507 | _ICBSetMark;
|
---|
4508 | ICBVisible := True;
|
---|
4509 | If Not iew Then
|
---|
4510 | Begin
|
---|
4511 | y1 := ScrY;
|
---|
4512 | y2 := FScrCursor.Y;
|
---|
4513 | _ICBTestIEW(y1,y2); {Extended Selection}
|
---|
4514 | InvalidateEditor(y1,y2)
|
---|
4515 | End
|
---|
4516 | Else InvalidateEditor(0,0);
|
---|
4517 | End;
|
---|
4518 |
|
---|
4519 |
|
---|
4520 | Procedure TEditor.cmICBExtPageBegin;
|
---|
4521 | Var iew:Boolean;
|
---|
4522 | P:TEditorPos;
|
---|
4523 | Label L;
|
---|
4524 | Begin
|
---|
4525 | (*Undo*)
|
---|
4526 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4527 | LastUndoGroup := ugCursorMove;
|
---|
4528 | (*Undo*)
|
---|
4529 | iew := _ICBExtSetICB;
|
---|
4530 |
|
---|
4531 | P.X := FFileCursor.X;
|
---|
4532 | P.Y := FFileCursor.Y-FScrCursor.Y+1;
|
---|
4533 | If _ICBActPos = ICB.First Then
|
---|
4534 | Begin
|
---|
4535 | iew := _GotoPosition(P) Or iew;
|
---|
4536 | ICB.First := _ICBActPos;
|
---|
4537 | Goto L;
|
---|
4538 | End;
|
---|
4539 |
|
---|
4540 | If _ICBActPos = ICB.Last Then
|
---|
4541 | Begin
|
---|
4542 | iew := _GotoPosition(P) Or iew;
|
---|
4543 | ICB.Last := _ICBActPos;
|
---|
4544 | End;
|
---|
4545 | L:
|
---|
4546 | _ICBExtCorrectICB;
|
---|
4547 | _ICBExtCorrectICB2;
|
---|
4548 | _ICBSetMark;
|
---|
4549 | ICBVisible := True;
|
---|
4550 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4551 | InvalidateEditor(0,0);
|
---|
4552 | End;
|
---|
4553 |
|
---|
4554 |
|
---|
4555 | Procedure TEditor.cmICBExtPageEnd;
|
---|
4556 | Var iew:Boolean;
|
---|
4557 | P:TEditorPos;
|
---|
4558 | Label L;
|
---|
4559 | Begin
|
---|
4560 | (*Undo*)
|
---|
4561 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
4562 | LastUndoGroup := ugCursorMove;
|
---|
4563 | (*Undo*)
|
---|
4564 | iew := _ICBExtSetICB;
|
---|
4565 |
|
---|
4566 | P.X := FFileCursor.X;
|
---|
4567 | P.Y := FFileCursor.Y+FWinSize.Y-FScrCursor.Y;
|
---|
4568 | If _ICBActPos = ICB.Last Then
|
---|
4569 | Begin
|
---|
4570 | iew := _GotoPosition(P) Or iew;
|
---|
4571 | ICB.Last := _ICBActPos;
|
---|
4572 | Goto L;
|
---|
4573 | End;
|
---|
4574 |
|
---|
4575 | If _ICBActPos = ICB.First Then
|
---|
4576 | Begin
|
---|
4577 | iew := _GotoPosition(P) Or iew;
|
---|
4578 | ICB.First := _ICBActPos;
|
---|
4579 | End;
|
---|
4580 | L:
|
---|
4581 | _ICBExtCorrectICB;
|
---|
4582 | _ICBExtCorrectICB2;
|
---|
4583 | _ICBSetMark;
|
---|
4584 | ICBVisible := True;
|
---|
4585 | {iew := iew Or _ICBTestIEW; {Extended Selection}
|
---|
4586 | InvalidateEditor(0,0);
|
---|
4587 | End;
|
---|
4588 |
|
---|
4589 |
|
---|
4590 | {Insert A Text block from A File And Select it}
|
---|
4591 | Procedure TEditor.cmICBReadBlock;
|
---|
4592 | Var S,dir,Name,ext:String;
|
---|
4593 | CFOD:TOpenDialog;
|
---|
4594 | Begin
|
---|
4595 | CFOD.Create(Self);
|
---|
4596 | CFOD.Title := LoadNLSStr(SReadBlockFromFile);
|
---|
4597 | CFOD.OkName := LoadNLSStr(SOkButton);
|
---|
4598 | CFOD.FileName := fMask;
|
---|
4599 | CFOD.DefaultExt := GetDefaultExt(fMask);
|
---|
4600 | SetAvailabeFileTypes(CFOD);
|
---|
4601 |
|
---|
4602 | If CFOD.Execute Then
|
---|
4603 | Begin
|
---|
4604 | S := CFOD.FileName;
|
---|
4605 | CFOD.Destroy;
|
---|
4606 |
|
---|
4607 | If Not FileExists(S) Then
|
---|
4608 | Begin
|
---|
4609 | FSplit(S,dir,Name,ext);
|
---|
4610 | S := FmtLoadNLSStr(SFileNotFound,[Name + ext])+'.';
|
---|
4611 | SetErrorMessage(S);
|
---|
4612 | End
|
---|
4613 | Else InsertFromFile(S);
|
---|
4614 | End
|
---|
4615 | Else CFOD.Destroy;
|
---|
4616 | End;
|
---|
4617 |
|
---|
4618 |
|
---|
4619 | {Write the Selected area To A File}
|
---|
4620 | Procedure TEditor.cmICBWriteBlock;
|
---|
4621 | Var P:Pointer;
|
---|
4622 | len:LongInt;
|
---|
4623 | utF:File;
|
---|
4624 | S:String;
|
---|
4625 | CFSD:TSaveDialog;
|
---|
4626 | Begin
|
---|
4627 | CFSD.Create(Self);
|
---|
4628 | CFSD.Title := LoadNLSStr(SWriteBlockToFile);
|
---|
4629 | CFSD.OkName := LoadNLSStr(SOkButton);
|
---|
4630 | CFSD.FileName := fMask;
|
---|
4631 | CFSD.DefaultExt := GetDefaultExt(fMask);
|
---|
4632 | SetAvailabeFileTypes(CFSD);
|
---|
4633 |
|
---|
4634 | If CFSD.Execute Then
|
---|
4635 | Begin
|
---|
4636 | S := CFSD.FileName;
|
---|
4637 | CFSD.Destroy;
|
---|
4638 |
|
---|
4639 | If Not _GetEditorBlock(P,len) Then Exit;
|
---|
4640 | System.Assign(utF,S);
|
---|
4641 | {$I-}
|
---|
4642 | Rewrite(utF,1);
|
---|
4643 | {$I+}
|
---|
4644 | If InOutRes = 0 Then
|
---|
4645 | Begin
|
---|
4646 | {$I-}
|
---|
4647 | BlockWrite(utF,P^,len-1); {without #0}
|
---|
4648 | {$I+}
|
---|
4649 | If InOutRes <> 0 Then SetErrorMessage(LoadNLSStr(SErrorWriting)+': '+S);
|
---|
4650 | {$I-}
|
---|
4651 | System.Close(utF);
|
---|
4652 | {$I+}
|
---|
4653 | End
|
---|
4654 | Else SetErrorMessage(LoadNLSStr(SErrorWriting)+': '+S);
|
---|
4655 | FreeMem(P,len);
|
---|
4656 | End
|
---|
4657 | Else CFSD.Destroy;
|
---|
4658 | End;
|
---|
4659 |
|
---|
4660 |
|
---|
4661 | Procedure TEditor.cmICBMoveLeft;
|
---|
4662 | Var P:TEditorPos;
|
---|
4663 | Begin
|
---|
4664 | If ReadOnly Then Exit;
|
---|
4665 | If Not _ICBExist Then Exit;
|
---|
4666 | TestAutoSave;
|
---|
4667 | FlushWorkLine;
|
---|
4668 | (*Undo*)
|
---|
4669 | _CopyUndoLines(ICB.First.Line,ICB.Last.Line);
|
---|
4670 | (*Undo*)
|
---|
4671 |
|
---|
4672 | If FSelectMode <> smColumnBlock Then
|
---|
4673 | Begin
|
---|
4674 | If Length(ICB.First.Line^.zk^) > 0 Then
|
---|
4675 | If (ICB.First.Line^.zk^[1] = #32) And (ICB.First.X > 1)
|
---|
4676 | Then Dec(ICB.First.X);
|
---|
4677 |
|
---|
4678 | FActLine := ICB.First.Line;
|
---|
4679 | While FActLine <> ICB.Last.Line Do
|
---|
4680 | Begin
|
---|
4681 | If Length(FActLine^.zk^) > 0 Then
|
---|
4682 | If FActLine^.zk^[1] = #32 Then
|
---|
4683 | Begin
|
---|
4684 | _ReadWorkLine;
|
---|
4685 | _DeleteString(1,1);
|
---|
4686 | _WriteWorkLine;
|
---|
4687 | End;
|
---|
4688 | FActLine := FActLine^.Next;
|
---|
4689 | End;
|
---|
4690 |
|
---|
4691 | If (Length(ICB.Last.Line^.zk^) > 0) And (ICB.Last.X > 1) Then
|
---|
4692 | If ICB.Last.Line^.zk^[1] = #32 Then
|
---|
4693 | Begin
|
---|
4694 | _ReadWorkLine;
|
---|
4695 | _DeleteString(1,1);
|
---|
4696 | _WriteWorkLine;
|
---|
4697 | Dec(ICB.Last.X);
|
---|
4698 | End;
|
---|
4699 | End
|
---|
4700 | Else {Extended Selection}
|
---|
4701 | Begin
|
---|
4702 | FActLine := ICB.First.Line;
|
---|
4703 | While FActLine <> ICB.Last.Line^.Next Do
|
---|
4704 | Begin
|
---|
4705 | If Length(FActLine^.zk^) >= ICB.First.X Then
|
---|
4706 | Begin
|
---|
4707 | _ReadWorkLine;
|
---|
4708 | _DeleteString(ICB.First.X,1);
|
---|
4709 | _WriteWorkLine;
|
---|
4710 | End;
|
---|
4711 | FActLine := FActLine^.Next;
|
---|
4712 | End;
|
---|
4713 | SetLineColorFlag(ICB.First.Line,ICB.Last.Line);
|
---|
4714 | End;
|
---|
4715 |
|
---|
4716 | FRedoList.Clear;
|
---|
4717 | If GetSelectionStart(P) Then
|
---|
4718 | Begin
|
---|
4719 | If _GotoPosition(P) Then InvalidateEditor(0,0)
|
---|
4720 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
4721 | End;
|
---|
4722 | (*Undo*)
|
---|
4723 | LastUndoGroup := ugBlockLeft;
|
---|
4724 | (*Undo*)
|
---|
4725 | End;
|
---|
4726 |
|
---|
4727 |
|
---|
4728 | Procedure TEditor.cmICBMoveRight;
|
---|
4729 | Var P:TEditorPos;
|
---|
4730 | Begin
|
---|
4731 | If ReadOnly Then Exit;
|
---|
4732 | If Not _ICBExist Then Exit;
|
---|
4733 | TestAutoSave;
|
---|
4734 | FlushWorkLine;
|
---|
4735 | (*Undo*)
|
---|
4736 | _CopyUndoLines(ICB.First.Line,ICB.Last.Line);
|
---|
4737 | (*Undo*)
|
---|
4738 |
|
---|
4739 | If FSelectMode <> smColumnBlock Then
|
---|
4740 | Begin
|
---|
4741 | FActLine := ICB.First.Line;
|
---|
4742 | While FActLine <> ICB.Last.Line Do
|
---|
4743 | Begin
|
---|
4744 | If Length(FActLine^.zk^) < StringLength Then
|
---|
4745 | Begin
|
---|
4746 | _ReadWorkLine;
|
---|
4747 | _InsertString(1,' ');
|
---|
4748 | _WriteWorkLine;
|
---|
4749 | End;
|
---|
4750 | FActLine := FActLine^.Next;
|
---|
4751 | End;
|
---|
4752 |
|
---|
4753 | If (Length(ICB.Last.Line^.zk^) < StringLength) And
|
---|
4754 | (ICB.Last.X > 1) Then
|
---|
4755 | Begin
|
---|
4756 | _ReadWorkLine;
|
---|
4757 | _InsertString(1,' ');
|
---|
4758 | _WriteWorkLine;
|
---|
4759 | If ICB.Last.X < StringLength Then Inc(ICB.Last.X);
|
---|
4760 | End;
|
---|
4761 | End
|
---|
4762 | Else {Extended Selection}
|
---|
4763 | Begin
|
---|
4764 | FActLine := ICB.First.Line;
|
---|
4765 | While FActLine <> ICB.Last.Line^.Next Do
|
---|
4766 | Begin
|
---|
4767 | If Length(FActLine^.zk^) < StringLength Then
|
---|
4768 | Begin
|
---|
4769 | _ReadWorkLine;
|
---|
4770 | _InsertString(ICB.First.X,' ');
|
---|
4771 | _WriteWorkLine;
|
---|
4772 | End;
|
---|
4773 | FActLine := FActLine^.Next;
|
---|
4774 | End;
|
---|
4775 | SetLineColorFlag(ICB.First.Line,ICB.Last.Line);
|
---|
4776 | End;
|
---|
4777 |
|
---|
4778 | FRedoList.Clear;
|
---|
4779 | If GetSelectionStart(P) Then
|
---|
4780 | Begin
|
---|
4781 | If _GotoPosition(P) Then InvalidateEditor(0,0)
|
---|
4782 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
4783 | End;
|
---|
4784 | (*Undo*)
|
---|
4785 | LastUndoGroup := ugBlockRight;
|
---|
4786 | (*Undo*)
|
---|
4787 | End;
|
---|
4788 |
|
---|
4789 |
|
---|
4790 | Procedure TEditor.cmICBCopyBlock;
|
---|
4791 | Var P:Pointer;
|
---|
4792 | len:LongInt;
|
---|
4793 | Begin
|
---|
4794 | If ReadOnly Then Exit;
|
---|
4795 | If Not ICBVisible Then
|
---|
4796 | Begin
|
---|
4797 | ShowSelection;
|
---|
4798 | Exit;
|
---|
4799 | End;
|
---|
4800 | If Not _ICBExist Then Exit;
|
---|
4801 | TestAutoSave;
|
---|
4802 |
|
---|
4803 | If _GetEditorBlock(P,len) Then
|
---|
4804 | Begin
|
---|
4805 | InsertText(P,len-1); {without terminal #0}
|
---|
4806 | FreeMem(P,len);
|
---|
4807 | End;
|
---|
4808 | End;
|
---|
4809 |
|
---|
4810 |
|
---|
4811 | Procedure TEditor.cmICBMoveBlock;
|
---|
4812 | Var art:Byte;
|
---|
4813 | Cur:TLineX;
|
---|
4814 | laststr:String;
|
---|
4815 | icbstr:String;
|
---|
4816 | B,icb1:String;
|
---|
4817 | Licb:Integer;
|
---|
4818 | CurLinenext:PLine;
|
---|
4819 | ICBFirstLnext:PLine;
|
---|
4820 | ICBLastLnext:PLine;
|
---|
4821 | fl,LL:PLine;
|
---|
4822 | AL,IFL,ILL:LongInt;
|
---|
4823 | P:TEditorPos;
|
---|
4824 | Begin
|
---|
4825 | If ReadOnly Then Exit;
|
---|
4826 | If Not ICBVisible Then
|
---|
4827 | Begin
|
---|
4828 | ShowSelection;
|
---|
4829 | Exit;
|
---|
4830 | End;
|
---|
4831 | If Not _ICBExist Then Exit;
|
---|
4832 | If FSelectMode = smColumnBlock Then Exit;
|
---|
4833 | TestAutoSave;
|
---|
4834 |
|
---|
4835 | If FActLine^.flag And ciSelected <> 0 Then
|
---|
4836 | Begin
|
---|
4837 | art := 0; {CurPos Is within the ICB}
|
---|
4838 | If (FActLine = ICB.First.Line) And (FFileCursor.X < ICB.First.X)
|
---|
4839 | Then art := 1; {CurPos In ICB FFirstLine, before ICB firstx}
|
---|
4840 | If (FActLine = ICB.Last.Line) And (FFileCursor.X > ICB.Last.X)
|
---|
4841 | Then art := 2; {CurPos In ICB endline, after ICB lastx}
|
---|
4842 | End
|
---|
4843 | Else art := 3; {CurPos Not within the ICB Lines}
|
---|
4844 | If art = 0 Then Exit;
|
---|
4845 |
|
---|
4846 | (*Undo*)
|
---|
4847 | AL := FFileCursor.Y;
|
---|
4848 | IFL := _PLine2Index(ICB.First.Line);
|
---|
4849 | ILL := _PLine2Index(ICB.Last.Line);
|
---|
4850 | If AL < IFL Then fl := FActLine
|
---|
4851 | Else fl := ICB.First.Line;
|
---|
4852 | If AL > ILL Then LL := FActLine
|
---|
4853 | Else LL := ICB.Last.Line;
|
---|
4854 | _CopyUndoLines(fl,LL);
|
---|
4855 | (*Undo*)
|
---|
4856 |
|
---|
4857 | FlushWorkLine;
|
---|
4858 | Cur.Line := FActLine;
|
---|
4859 | Cur.X := FFileCursor.X;
|
---|
4860 | Case art Of
|
---|
4861 | 1 :
|
---|
4862 | Begin
|
---|
4863 | laststr := _ReadString(ICB.First.Line,Cur.X,ICB.First.X-Cur.X);
|
---|
4864 | _DeleteString(Cur.X,Length(laststr));
|
---|
4865 | _WriteWorkLine;
|
---|
4866 | FActLine := ICB.Last.Line;
|
---|
4867 | If ICB.First.Line = ICB.Last.Line
|
---|
4868 | Then ICB.Last.X := ICB.Last.X - Length(laststr);
|
---|
4869 | If Not _InsertString(ICB.Last.X,laststr) Then Beep(1000,10);
|
---|
4870 | _WriteWorkLine;
|
---|
4871 | ICB.First.X := Cur.X;
|
---|
4872 | End;
|
---|
4873 | 2 :
|
---|
4874 | Begin
|
---|
4875 | laststr := _ReadString(ICB.Last.Line,ICB.Last.X,Cur.X-ICB.Last.X);
|
---|
4876 | _DeleteString(ICB.Last.X,Length(laststr));
|
---|
4877 | _WriteWorkLine;
|
---|
4878 | FActLine := ICB.First.Line;
|
---|
4879 | If Not _InsertString(ICB.First.X,laststr) Then Beep(1000,10);
|
---|
4880 | _WriteWorkLine;
|
---|
4881 | If ICB.First.Line = ICB.Last.Line
|
---|
4882 | Then ICB.Last.X := ICB.Last.X + Length(laststr);
|
---|
4883 | ICB.First.X := ICB.First.X + Length(laststr);
|
---|
4884 | End;
|
---|
4885 | 3 :
|
---|
4886 | Begin
|
---|
4887 | If ICB.First.Line = ICB.Last.Line Then
|
---|
4888 | Begin
|
---|
4889 | Licb := ICB.Last.X-ICB.First.X;
|
---|
4890 | icbstr := _ReadString(ICB.First.Line,ICB.First.X,Licb);
|
---|
4891 | If Not _InsertString(Cur.X,icbstr) Then Beep(1000,10);
|
---|
4892 | _ICBClearMark;
|
---|
4893 | _WriteWorkLine;
|
---|
4894 | FActLine := ICB.First.Line;
|
---|
4895 | _DeleteString(ICB.First.X,Licb);
|
---|
4896 | _WriteWorkLine;
|
---|
4897 | ICB.First := Cur;
|
---|
4898 | ICB.Last := Cur;
|
---|
4899 | Inc(ICB.Last.X,Licb);
|
---|
4900 | _ICBSetMark;
|
---|
4901 | End
|
---|
4902 | Else
|
---|
4903 | Begin
|
---|
4904 | laststr := _ReadString(Cur.Line,Cur.X,-1);
|
---|
4905 | B := _ReadString(ICB.Last.Line,ICB.Last.X,-1);
|
---|
4906 | icb1 := _ReadString(ICB.First.Line,ICB.First.X,-1);
|
---|
4907 | _ReadWorkLine;
|
---|
4908 | SetLength(FWorkLine,Cur.X-1);
|
---|
4909 | _WriteString(Cur.X,icb1);
|
---|
4910 | _WriteWorkLine;
|
---|
4911 | FActLine^.flag := FActLine^.flag Or ciSelected;
|
---|
4912 |
|
---|
4913 | FActLine := ICB.First.Line;
|
---|
4914 | _ReadWorkLine;
|
---|
4915 | SetLength(FWorkLine,ICB.First.X-1);
|
---|
4916 | _WriteString(ICB.First.X,B);
|
---|
4917 | _WriteWorkLine;
|
---|
4918 | FActLine^.flag := FActLine^.flag And Not ciSelected;
|
---|
4919 |
|
---|
4920 | FActLine := ICB.Last.Line;
|
---|
4921 | _ReadWorkLine;
|
---|
4922 | SetLength(FWorkLine,ICB.Last.X-1);
|
---|
4923 | _WriteString(ICB.Last.X,laststr);
|
---|
4924 | _WriteWorkLine;
|
---|
4925 |
|
---|
4926 | CurLinenext := Cur.Line^.Next;
|
---|
4927 | ICBFirstLnext := ICB.First.Line^.Next;
|
---|
4928 | ICBLastLnext := ICB.Last.Line^.Next;
|
---|
4929 | _Connect(Cur.Line,ICBFirstLnext);
|
---|
4930 | _Connect(ICB.Last.Line,CurLinenext);
|
---|
4931 | _Connect(ICB.First.Line,ICBLastLnext);
|
---|
4932 | If CurLinenext = Nil Then FLastLine := ICB.Last.Line;
|
---|
4933 |
|
---|
4934 | ICB.First := Cur;
|
---|
4935 | {Reference Point For _GotoPosition}
|
---|
4936 | FFileCursor.Y := 1;
|
---|
4937 | FScrCursor.Y := 1;
|
---|
4938 | FActLine := FFirstLine;
|
---|
4939 | FTopScreenLine := FFirstLine;
|
---|
4940 | End;
|
---|
4941 | End;
|
---|
4942 | End;
|
---|
4943 | _ICBCheckX;
|
---|
4944 |
|
---|
4945 | If AL < IFL Then fl := _Index2PLine(AL)
|
---|
4946 | Else fl := _Index2PLine(IFL);
|
---|
4947 | If AL > ILL Then LL := _Index2PLine(AL)
|
---|
4948 | Else LL := _Index2PLine(ILL);
|
---|
4949 | SetLineColorFlag(fl,LL);
|
---|
4950 |
|
---|
4951 | FRedoList.Clear;
|
---|
4952 | If GetSelectionStart(P) Then
|
---|
4953 | Begin
|
---|
4954 | _GotoPosition(P);
|
---|
4955 | InvalidateEditor(0,0);
|
---|
4956 | End;
|
---|
4957 | (*Undo*)
|
---|
4958 | LastUndoGroup := ugNoGroup;
|
---|
4959 | (*Undo*)
|
---|
4960 | End;
|
---|
4961 |
|
---|
4962 |
|
---|
4963 | Procedure TEditor.cmICBDeleteBlock;
|
---|
4964 | Begin
|
---|
4965 | If ReadOnly Then Exit;
|
---|
4966 | If Not ICBVisible Then Exit;
|
---|
4967 | TestAutoSave;
|
---|
4968 | If _ICBDeleteICB Then
|
---|
4969 | Begin
|
---|
4970 | FRedoList.Clear;
|
---|
4971 | InvalidateEditor(0,0);
|
---|
4972 | End;
|
---|
4973 | End;
|
---|
4974 |
|
---|
4975 |
|
---|
4976 | Procedure TEditor.cmICBUpcaseBlock;
|
---|
4977 | Var SaveAL:PLine;
|
---|
4978 | X1,x2,I:Integer;
|
---|
4979 | Begin
|
---|
4980 | If ReadOnly Then Exit;
|
---|
4981 | If Not _ICBExist Then Exit;
|
---|
4982 | TestAutoSave;
|
---|
4983 | FlushWorkLine;
|
---|
4984 | (*Undo*)
|
---|
4985 | _CopyUndoLines(ICB.First.Line,ICB.Last.Line);
|
---|
4986 | LastUndoGroup := ugNoGroup;
|
---|
4987 | (*Undo*)
|
---|
4988 | SaveAL := FActLine;
|
---|
4989 | FActLine := ICB.First.Line;
|
---|
4990 |
|
---|
4991 | X1 := ICB.First.X;
|
---|
4992 | x2 := ICB.Last.X-1;
|
---|
4993 | While FActLine <> ICB.Last.Line Do
|
---|
4994 | Begin
|
---|
4995 | _ReadWorkLine;
|
---|
4996 |
|
---|
4997 | If FSelectMode <> smColumnBlock Then x2 := Length(FWorkLine);
|
---|
4998 | For I := X1 To x2 Do FWorkLine[I] := UpCase(FWorkLine[I]);
|
---|
4999 | If FSelectMode <> smColumnBlock Then X1 := 1;
|
---|
5000 |
|
---|
5001 | _WriteWorkLine;
|
---|
5002 | FActLine := FActLine^.Next;
|
---|
5003 | End;
|
---|
5004 |
|
---|
5005 | x2 := ICB.Last.X-1;
|
---|
5006 | _ReadWorkLine;
|
---|
5007 | For I := X1 To x2 Do FWorkLine[I] := UpCase(FWorkLine[I]);
|
---|
5008 | _WriteWorkLine;
|
---|
5009 |
|
---|
5010 | FActLine := SaveAL;
|
---|
5011 | Modified := True;
|
---|
5012 | FRedoList.Clear;
|
---|
5013 | InvalidateEditor(0,0);
|
---|
5014 | End;
|
---|
5015 |
|
---|
5016 |
|
---|
5017 | Procedure TEditor.cmICBLowcaseBlock;
|
---|
5018 | Var SaveAL:PLine;
|
---|
5019 | X1,x2,I:Integer;
|
---|
5020 | Begin
|
---|
5021 | If ReadOnly Then Exit;
|
---|
5022 | If Not _ICBExist Then Exit;
|
---|
5023 | TestAutoSave;
|
---|
5024 | FlushWorkLine;
|
---|
5025 | (*Undo*)
|
---|
5026 | _CopyUndoLines(ICB.First.Line,ICB.Last.Line);
|
---|
5027 | LastUndoGroup := ugNoGroup;
|
---|
5028 | (*Undo*)
|
---|
5029 | SaveAL := FActLine;
|
---|
5030 | FActLine := ICB.First.Line;
|
---|
5031 |
|
---|
5032 | X1 := ICB.First.X;
|
---|
5033 | x2 := ICB.Last.X-1;
|
---|
5034 | While FActLine <> ICB.Last.Line Do
|
---|
5035 | Begin
|
---|
5036 | _ReadWorkLine;
|
---|
5037 |
|
---|
5038 | If FSelectMode <> smColumnBlock Then x2 := Length(FWorkLine);
|
---|
5039 | For I := X1 To x2 Do
|
---|
5040 | If FWorkLine[I] In ['A'..'Z','','','']
|
---|
5041 | Then FWorkLine[I] := Chr(Ord(FWorkLine[I]) Or $20);
|
---|
5042 | If FSelectMode <> smColumnBlock Then X1 := 1;
|
---|
5043 |
|
---|
5044 | _WriteWorkLine;
|
---|
5045 | FActLine := FActLine^.Next;
|
---|
5046 | End;
|
---|
5047 |
|
---|
5048 | x2 := ICB.Last.X-1;
|
---|
5049 | _ReadWorkLine;
|
---|
5050 | For I := X1 To x2 Do
|
---|
5051 | If FWorkLine[I] In ['A'..'Z','','','']
|
---|
5052 | Then FWorkLine[I] := Chr(Ord(FWorkLine[I]) Or $20);
|
---|
5053 | _WriteWorkLine;
|
---|
5054 |
|
---|
5055 | FActLine := SaveAL;
|
---|
5056 | Modified := True;
|
---|
5057 | FRedoList.Clear;
|
---|
5058 | InvalidateEditor(0,0);
|
---|
5059 | End;
|
---|
5060 |
|
---|
5061 |
|
---|
5062 | Procedure TEditor.cmICBUpcaseWord;
|
---|
5063 | Var lzk:LongInt;
|
---|
5064 | X:Integer;
|
---|
5065 | Begin
|
---|
5066 | If ReadOnly Then Exit;
|
---|
5067 | TestAutoSave;
|
---|
5068 | (*Undo*)
|
---|
5069 | _CopyUndoLines(FActLine,FActLine);
|
---|
5070 | LastUndoGroup := ugNoGroup;
|
---|
5071 | (*Undo*)
|
---|
5072 |
|
---|
5073 | If Not WLactivated Then _ReadWorkLine;
|
---|
5074 | lzk := Length(FWorkLine);
|
---|
5075 | X := FFileCursor.X;
|
---|
5076 | While (FWorkLine[X-1] In NormalChars) And (X > 1) Do Dec(X);
|
---|
5077 | While (FWorkLine[X] In NormalChars) And (X <= lzk) Do
|
---|
5078 | Begin
|
---|
5079 | FWorkLine[X] := UpCase(FWorkLine[X]);
|
---|
5080 | Inc(X);
|
---|
5081 | End;
|
---|
5082 | _WriteWorkLine;
|
---|
5083 |
|
---|
5084 | Modified := True;
|
---|
5085 | FRedoList.Clear;
|
---|
5086 | InvalidateWorkLine;
|
---|
5087 | End;
|
---|
5088 |
|
---|
5089 |
|
---|
5090 | Procedure TEditor.cmICBLowcaseWord;
|
---|
5091 | Var lzk:LongInt;
|
---|
5092 | X:Integer;
|
---|
5093 | Begin
|
---|
5094 | If ReadOnly Then Exit;
|
---|
5095 | TestAutoSave;
|
---|
5096 | (*Undo*)
|
---|
5097 | _CopyUndoLines(FActLine,FActLine);
|
---|
5098 | LastUndoGroup := ugNoGroup;
|
---|
5099 | (*Undo*)
|
---|
5100 |
|
---|
5101 | If Not WLactivated Then _ReadWorkLine;
|
---|
5102 | lzk := Length(FWorkLine);
|
---|
5103 | X := FFileCursor.X;
|
---|
5104 | While (FWorkLine[X-1] In NormalChars) And (X > 1) Do Dec(X);
|
---|
5105 | While (FWorkLine[X] In NormalChars) And (X <= lzk) Do
|
---|
5106 | Begin
|
---|
5107 | If FWorkLine[X] In ['A'..'Z','','','']
|
---|
5108 | Then FWorkLine[X] := Chr(Ord(FWorkLine[X]) Or $20);
|
---|
5109 | Inc(X);
|
---|
5110 | End;
|
---|
5111 | _WriteWorkLine;
|
---|
5112 |
|
---|
5113 | Modified := True;
|
---|
5114 | FRedoList.Clear;
|
---|
5115 | InvalidateWorkLine;
|
---|
5116 | End;
|
---|
5117 |
|
---|
5118 |
|
---|
5119 | Procedure TEditor.cmToggleCase;
|
---|
5120 | Var X:Integer;
|
---|
5121 | Begin
|
---|
5122 | If ReadOnly Then Exit;
|
---|
5123 | TestAutoSave;
|
---|
5124 | (*Undo*)
|
---|
5125 | _CopyUndoLines(FActLine,FActLine);
|
---|
5126 | LastUndoGroup := ugNoGroup;
|
---|
5127 | (*Undo*)
|
---|
5128 |
|
---|
5129 | If Not WLactivated Then _ReadWorkLine;
|
---|
5130 | X := FFileCursor.X;
|
---|
5131 | If FWorkLine[X] In ['A'..'Z','','','']
|
---|
5132 | Then FWorkLine[X] := Chr(Ord(FWorkLine[X]) Or $20)
|
---|
5133 | Else FWorkLine[X] := UpCase(FWorkLine[X]);
|
---|
5134 | _WriteWorkLine;
|
---|
5135 | If X <= Length(FWorkLine) Then cmCursorRight;
|
---|
5136 |
|
---|
5137 | Modified := True;
|
---|
5138 | FRedoList.Clear;
|
---|
5139 | InvalidateWorkLine;
|
---|
5140 | End;
|
---|
5141 |
|
---|
5142 |
|
---|
5143 | Procedure TEditor.cmBreakLine;
|
---|
5144 | Var newstring:String;
|
---|
5145 | ip:TICBPosition;
|
---|
5146 | FCX:Integer;
|
---|
5147 | AL:PLine;
|
---|
5148 | iew:Boolean;
|
---|
5149 | Begin
|
---|
5150 | If ReadOnly Then Exit;
|
---|
5151 | TestAutoSave;
|
---|
5152 | (*Undo*)
|
---|
5153 | _CopyUndoLines(FActLine,FActLine);
|
---|
5154 | (*Undo*)
|
---|
5155 | If Not WLactivated Then _ReadWorkLine;
|
---|
5156 |
|
---|
5157 | If FFileCursor.X > Length(FWorkLine) Then newstring := ''
|
---|
5158 | Else newstring := _ReadString(FActLine,FFileCursor.X,-1);
|
---|
5159 | SetLength(FWorkLine,FFileCursor.X-1);
|
---|
5160 | _WriteWorkLine;
|
---|
5161 |
|
---|
5162 | _InsertLine(FActLine);
|
---|
5163 | {Update ICB}
|
---|
5164 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5165 | FCX := FFileCursor.X;
|
---|
5166 | AL := FActLine;
|
---|
5167 | If FSelectMode <> smColumnBlock Then
|
---|
5168 | Begin
|
---|
5169 | If ip * [ipBeforeICBFirst] <> [] Then
|
---|
5170 | Begin
|
---|
5171 | AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5172 | AL^.flag := AL^.flag And Not ciSelected;
|
---|
5173 | Dec(ICB.First.X,FCX-1);
|
---|
5174 | ICB.First.Line := ICB.First.Line^.Next;
|
---|
5175 | End;
|
---|
5176 | If ip * [ipBeforeICBLast] <> [] Then
|
---|
5177 | Begin
|
---|
5178 | AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5179 | Dec(ICB.Last.X,FCX-1);
|
---|
5180 | ICB.Last.Line := ICB.Last.Line^.Next;
|
---|
5181 | End;
|
---|
5182 | If ip * [ipAfterICBFirst,ipWithinICB] <> []
|
---|
5183 | Then AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5184 | If ip * [ipAfterICBLast] <> []
|
---|
5185 | Then AL^.Next^.flag := AL^.Next^.flag And Not ciSelected;
|
---|
5186 | _ICBCheckX;
|
---|
5187 | End
|
---|
5188 | Else {Extended Selection}
|
---|
5189 | Begin
|
---|
5190 | If ip * [ipBeforeICBFirst,ipAfterICBFirst,ipWithinICB] <> [] Then
|
---|
5191 | If ip * [ipBeforeICBLast,ipAfterICBLast] = []
|
---|
5192 | Then AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5193 | End;
|
---|
5194 |
|
---|
5195 | FActLine := FActLine^.Next;
|
---|
5196 | FWorkLine := newstring;
|
---|
5197 | _WriteWorkLine;
|
---|
5198 |
|
---|
5199 | FActLine := FActLine^.Prev;
|
---|
5200 | If Length(newstring) = 0 Then iew := _CursorEnd
|
---|
5201 | Else iew := False;
|
---|
5202 |
|
---|
5203 | SetLineColorFlag(FActLine,FActLine^.Next);
|
---|
5204 | FRedoList.Clear;
|
---|
5205 | If ((FScrCursor.Y = FWinSize.Y) And (FScrCursor.Y > 1)) Then
|
---|
5206 | Begin
|
---|
5207 | Dec(FScrCursor.Y);
|
---|
5208 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
5209 | InvalidateEditor(0,0);
|
---|
5210 | End
|
---|
5211 | Else
|
---|
5212 | Begin
|
---|
5213 | If iew Then InvalidateEditor(0,0)
|
---|
5214 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
5215 | End;
|
---|
5216 | SetSliderValues;
|
---|
5217 | (*Undo*)
|
---|
5218 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FActLine^.Next^.Next));
|
---|
5219 | LastUndoGroup := ugBreakLine;
|
---|
5220 | (*Undo*)
|
---|
5221 | End;
|
---|
5222 |
|
---|
5223 |
|
---|
5224 | Procedure TEditor.cmDeleteLine;
|
---|
5225 | Var NextLine:PLine;
|
---|
5226 | prevline:PLine;
|
---|
5227 | ip:TICBPosition;
|
---|
5228 | Begin
|
---|
5229 | If ReadOnly Then Exit;
|
---|
5230 | TestAutoSave;
|
---|
5231 |
|
---|
5232 | ip := _ICBPos(FActLine,0);
|
---|
5233 | NextLine := FActLine^.Next;
|
---|
5234 |
|
---|
5235 | If NextLine <> Nil Then
|
---|
5236 | Begin
|
---|
5237 | If FTopScreenLine = FActLine Then FTopScreenLine := NextLine;
|
---|
5238 | prevline := FActLine^.Prev;
|
---|
5239 | (*Undo*)
|
---|
5240 | _MoveUndoLines(FUndoList,FActLine,FActLine);
|
---|
5241 | _Connect(prevline,NextLine);
|
---|
5242 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(NextLine));
|
---|
5243 | Dec(FCountLines);
|
---|
5244 | (*Undo*)
|
---|
5245 | SetSliderValues;
|
---|
5246 | FActLine := NextLine;
|
---|
5247 | WLactivated := False;
|
---|
5248 | End
|
---|
5249 | Else
|
---|
5250 | Begin
|
---|
5251 | (*Undo*)
|
---|
5252 | _CopyUndoLines(FActLine,FActLine);
|
---|
5253 | If Not WLactivated Then _ReadWorkLine;
|
---|
5254 | (*Undo*)
|
---|
5255 | FWorkLine := '';
|
---|
5256 | End;
|
---|
5257 |
|
---|
5258 | If ip * [ipBeforeICBFirst,ipAfterICBFirst] <> [] Then
|
---|
5259 | Begin
|
---|
5260 | If NextLine <> Nil Then ICB.First.Line := NextLine;
|
---|
5261 | If FSelectMode <> smColumnBlock Then ICB.First.X := 1;
|
---|
5262 | End;
|
---|
5263 | If ip * [ipBeforeICBLast,ipAfterICBLast] <> [] Then
|
---|
5264 | Begin
|
---|
5265 | If NextLine <> Nil Then ICB.Last.Line := NextLine;
|
---|
5266 | If FSelectMode <> smColumnBlock Then ICB.Last.X := 1;
|
---|
5267 | End;
|
---|
5268 | _ICBSetMark;
|
---|
5269 |
|
---|
5270 | _HorizMove;
|
---|
5271 | FFileCursor.X := 1;
|
---|
5272 | FScrCursor.X := 1;
|
---|
5273 | Modified := True;
|
---|
5274 | If FActLine^.Prev <> Nil Then UpdateLineColorFlag(FActLine^.Prev)
|
---|
5275 | Else UpdateLineColorFlag(FActLine);
|
---|
5276 | FRedoList.Clear;
|
---|
5277 | If _HorizMove Then InvalidateEditor(0,0)
|
---|
5278 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
5279 | (*Undo*)
|
---|
5280 | LastUndoGroup := ugDeleteActLine;
|
---|
5281 | (*Undo*)
|
---|
5282 | End;
|
---|
5283 |
|
---|
5284 |
|
---|
5285 | Procedure TEditor.cmDeleteLineEnd;
|
---|
5286 | Var ip:TICBPosition;
|
---|
5287 | Begin
|
---|
5288 | If ReadOnly Then Exit;
|
---|
5289 | TestAutoSave;
|
---|
5290 | (*Undo*)
|
---|
5291 | _CopyUndoLines(FActLine,FActLine);
|
---|
5292 | (*Undo*)
|
---|
5293 | Modified := True;
|
---|
5294 | If Not WLactivated Then _ReadWorkLine;
|
---|
5295 | SetLength(FWorkLine,FFileCursor.X-1);
|
---|
5296 | _WriteWorkLine;
|
---|
5297 | If FSelectMode <> smColumnBlock Then
|
---|
5298 | Begin
|
---|
5299 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5300 | If ip * [ipBeforeICBFirst] <> [] Then ICB.First.X := FFileCursor.X;
|
---|
5301 | If ip * [ipBeforeICBLast] <> [] Then ICB.Last.X := FFileCursor.X;
|
---|
5302 | _ICBCheckX;
|
---|
5303 | End;
|
---|
5304 | FRedoList.Clear;
|
---|
5305 | InvalidateWorkLine;
|
---|
5306 | (*Undo*)
|
---|
5307 | LastUndoGroup := ugNoGroup;
|
---|
5308 | (*Undo*)
|
---|
5309 | End;
|
---|
5310 |
|
---|
5311 |
|
---|
5312 | Procedure TEditor.cmDeleteRightWord;
|
---|
5313 | Var CX:Integer;
|
---|
5314 | newstring:String;
|
---|
5315 | ip:TICBPosition;
|
---|
5316 | Begin
|
---|
5317 | If ReadOnly Then Exit;
|
---|
5318 | TestAutoSave;
|
---|
5319 | If Not WLactivated Then _ReadWorkLine;
|
---|
5320 | CX := 0;
|
---|
5321 | If FFileCursor.X <= Length(FWorkLine) Then
|
---|
5322 | Begin
|
---|
5323 | (*Undo*)
|
---|
5324 | _CopyUndoLines(FActLine,FActLine);
|
---|
5325 | (*Undo*)
|
---|
5326 | If Not WLactivated Then _ReadWorkLine;
|
---|
5327 | While (FWorkLine[FFileCursor.X+CX] In NormalChars) And
|
---|
5328 | (FFileCursor.X+CX <= Length(FWorkLine)) Do Inc(CX);
|
---|
5329 | If CX = 0 Then CX := 1;
|
---|
5330 | While (FWorkLine[FFileCursor.X+CX] = ' ') And
|
---|
5331 | (FFileCursor.X+CX <= Length(FWorkLine)) Do Inc(CX);
|
---|
5332 | _DeleteString(FFileCursor.X,CX);
|
---|
5333 | _WriteWorkLine;
|
---|
5334 | If FSelectMode <> smColumnBlock Then
|
---|
5335 | Begin
|
---|
5336 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5337 | If ip * [ipBeforeICBFirst] <> [] Then
|
---|
5338 | Begin
|
---|
5339 | If ICB.First.X-FFileCursor.X < CX
|
---|
5340 | Then ICB.First.X := FFileCursor.X
|
---|
5341 | Else Dec(ICB.First.X,CX);
|
---|
5342 | End;
|
---|
5343 | If ip * [ipBeforeICBLast] <> [] Then
|
---|
5344 | Begin
|
---|
5345 | If ICB.Last.X-FFileCursor.X < CX
|
---|
5346 | Then ICB.Last.X := FFileCursor.X
|
---|
5347 | Else Dec(ICB.Last.X,CX);
|
---|
5348 | End;
|
---|
5349 | _ICBCheckX;
|
---|
5350 | End;
|
---|
5351 | FRedoList.Clear;
|
---|
5352 | InvalidateWorkLine;
|
---|
5353 | (*Undo*)
|
---|
5354 | LastUndoGroup := ugDeleteRightWord;
|
---|
5355 | (*Undo*)
|
---|
5356 | End
|
---|
5357 | Else
|
---|
5358 | Begin
|
---|
5359 | If FActLine^.Next = Nil Then Exit;
|
---|
5360 | If FFileCursor.X + Length(FActLine^.Next^.zk^) <= StringLength Then
|
---|
5361 | Begin
|
---|
5362 | (*Undo*)
|
---|
5363 | _CopyUndoLines(FActLine,FActLine^.Next);
|
---|
5364 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FActLine^.Next));
|
---|
5365 | (*Undo*)
|
---|
5366 | If Not WLactivated Then _ReadWorkLine;
|
---|
5367 | SetLength(FWorkLine,FFileCursor.X-1);
|
---|
5368 | CX := 1;
|
---|
5369 | While (FActLine^.Next^.zk^[CX] = ' ') And
|
---|
5370 | (CX <= Length(FActLine^.Next^.zk^)) Do Inc(CX);
|
---|
5371 | newstring := _ReadString(FActLine^.Next,CX,-1);
|
---|
5372 | _WriteString(FFileCursor.X,newstring);
|
---|
5373 | Dec(CX); {CX Count Of deletable ' '}
|
---|
5374 | ip := _ICBPos(FActLine^.Next,0);
|
---|
5375 | If ip * [ipBeforeICBFirst,ipAfterICBFirst] <> [] Then
|
---|
5376 | Begin
|
---|
5377 | ICB.First.Line := FActLine;
|
---|
5378 | If FSelectMode <> smColumnBlock Then
|
---|
5379 | Begin
|
---|
5380 | Inc(ICB.First.X,FFileCursor.X-1);
|
---|
5381 | If ICB.First.X-FFileCursor.X < CX
|
---|
5382 | Then ICB.First.X := FFileCursor.X
|
---|
5383 | Else Dec(ICB.First.X,CX);
|
---|
5384 | End;
|
---|
5385 | FActLine^.flag := FActLine^.flag Or
|
---|
5386 | (FActLine^.Next^.flag And ciSelected);
|
---|
5387 | End;
|
---|
5388 | If ip * [ipBeforeICBLast,ipAfterICBLast] <> [] Then
|
---|
5389 | Begin
|
---|
5390 | ICB.Last.Line := FActLine;
|
---|
5391 | If FSelectMode <> smColumnBlock Then
|
---|
5392 | Begin
|
---|
5393 | Inc(ICB.Last.X,FFileCursor.X-1);
|
---|
5394 | If ICB.Last.X-FFileCursor.X < CX
|
---|
5395 | Then ICB.Last.X := FFileCursor.X
|
---|
5396 | Else Dec(ICB.Last.X,CX);
|
---|
5397 | End;
|
---|
5398 | FActLine^.flag := FActLine^.flag Or
|
---|
5399 | (FActLine^.Next^.flag And ciSelected);
|
---|
5400 | End;
|
---|
5401 | _ICBCheckX;
|
---|
5402 | _DeleteLine(FActLine^.Next);
|
---|
5403 | SetSliderValues;
|
---|
5404 | UpdateLineColorFlag(FActLine);
|
---|
5405 | FRedoList.Clear;
|
---|
5406 | InvalidateEditor(FScrCursor.Y,0);
|
---|
5407 | (*Undo*)
|
---|
5408 | LastUndoGroup := ugNoGroup;
|
---|
5409 | (*Undo*)
|
---|
5410 | End
|
---|
5411 | Else SetErrorMessage(LoadNLSStr(SLineWouldBeTooLong)+'.');
|
---|
5412 | End;
|
---|
5413 | End;
|
---|
5414 |
|
---|
5415 |
|
---|
5416 | Procedure TEditor.cmDeleteLeftWord;
|
---|
5417 | Var CX:Integer;
|
---|
5418 | ip:TICBPosition;
|
---|
5419 | Begin
|
---|
5420 | If ReadOnly Then Exit;
|
---|
5421 | TestAutoSave;
|
---|
5422 | If Not WLactivated Then _ReadWorkLine;
|
---|
5423 | If FFileCursor.X > 1 Then
|
---|
5424 | Begin
|
---|
5425 | (*Undo*)
|
---|
5426 | _CopyUndoLines(FActLine,FActLine);
|
---|
5427 | (*Undo*)
|
---|
5428 | If Not WLactivated Then _ReadWorkLine;
|
---|
5429 | CX := FFileCursor.X;
|
---|
5430 | While Not (FWorkLine[CX-1] In NormalChars) And (CX > 1) Do Dec(CX);
|
---|
5431 | While (FWorkLine[CX-1] In NormalChars) And (CX > 1) Do Dec(CX);
|
---|
5432 | _DeleteString(CX,FFileCursor.X - CX);
|
---|
5433 | _WriteWorkLine;
|
---|
5434 | If FSelectMode <> smColumnBlock Then
|
---|
5435 | Begin
|
---|
5436 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5437 | If ip * [ipBeforeICBFirst] <> []
|
---|
5438 | Then Dec(ICB.First.X,FFileCursor.X - CX);
|
---|
5439 | If ip * [ipBeforeICBLast] <> []
|
---|
5440 | Then Dec(ICB.Last.X,FFileCursor.X - CX);
|
---|
5441 | _ICBCheckX;
|
---|
5442 | End;
|
---|
5443 | FRedoList.Clear;
|
---|
5444 | If _GotoPosition(EditorPos(FFileCursor.Y,CX))
|
---|
5445 | Then InvalidateEditor(0,0)
|
---|
5446 | Else InvalidateWorkLine;
|
---|
5447 | (*Undo*)
|
---|
5448 | LastUndoGroup := ugDeleteRightWord;
|
---|
5449 | (*Undo*)
|
---|
5450 | End;
|
---|
5451 | End;
|
---|
5452 |
|
---|
5453 |
|
---|
5454 | Procedure TEditor.cmTabulator;
|
---|
5455 | Var P,I,cnt:Integer;
|
---|
5456 | emptystring:String;
|
---|
5457 | ip:TICBPosition;
|
---|
5458 | iew:Boolean;
|
---|
5459 | Begin
|
---|
5460 | If ReadOnly Then Exit;
|
---|
5461 | TestAutoSave;
|
---|
5462 |
|
---|
5463 | If _ICBOverwrite Then iew := _ICBDeleteICB
|
---|
5464 | Else iew := False;
|
---|
5465 | (*Undo*)
|
---|
5466 | _CopyUndoLines(FActLine,FActLine);
|
---|
5467 | (*Undo*)
|
---|
5468 | If FEditOpt * [eoSmartTabs] <> [] Then
|
---|
5469 | Begin
|
---|
5470 | P := _FindNextTab(FActLine^.Prev,FFileCursor.X+1); {Search from FCX+1}
|
---|
5471 | cnt := P - FFileCursor.X;
|
---|
5472 | End
|
---|
5473 | Else
|
---|
5474 | Begin
|
---|
5475 | P := _FindNextTab(Nil,FFileCursor.X+1); {Search from FCX+1}
|
---|
5476 | cnt := P - FFileCursor.X;
|
---|
5477 | End;
|
---|
5478 |
|
---|
5479 | emptystring := '';
|
---|
5480 | For I := 1 To cnt Do emptystring := emptystring + ' ';
|
---|
5481 | If Not _InsertString(FFileCursor.X,emptystring) Then Beep(1000,10);
|
---|
5482 | If FSelectMode <> smColumnBlock Then
|
---|
5483 | Begin
|
---|
5484 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5485 | If ip * [ipBeforeICBFirst] <> [] Then Inc(ICB.First.X,cnt);
|
---|
5486 | If ip * [ipBeforeICBLast] <> [] Then Inc(ICB.Last.X,cnt);
|
---|
5487 | _ICBCheckX;
|
---|
5488 | End;
|
---|
5489 |
|
---|
5490 | _HorizMove;
|
---|
5491 | FFileCursor.X := P;
|
---|
5492 | If FScrCursor.X+cnt <= FWinSize.X Then Inc(FScrCursor.X,cnt)
|
---|
5493 | Else FScrCursor.X := 3*(FWinSize.X Div 4)+1;
|
---|
5494 |
|
---|
5495 |
|
---|
5496 | FRedoList.Clear;
|
---|
5497 | If _HorizMove Or iew Then
|
---|
5498 | Begin
|
---|
5499 | UpdateLineColorFlag(FActLine);
|
---|
5500 | InvalidateEditor(0,0);
|
---|
5501 | End
|
---|
5502 | Else InvalidateWorkLine;
|
---|
5503 | (*Undo*)
|
---|
5504 | LastUndoGroup := ugTabulator;
|
---|
5505 | (*Undo*)
|
---|
5506 | End;
|
---|
5507 |
|
---|
5508 |
|
---|
5509 | Procedure TEditor.cmPrevTabulator;
|
---|
5510 | Var iew:Boolean;
|
---|
5511 | P:TEditorPos;
|
---|
5512 | Begin
|
---|
5513 | If FFileCursor.X = 1 Then Exit;
|
---|
5514 | (*Undo*)
|
---|
5515 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
5516 | (*Undo*)
|
---|
5517 |
|
---|
5518 | P := FFileCursor;
|
---|
5519 | P.X := ((P.X-1) Div FTabSize * FTabSize) +1;
|
---|
5520 | iew := _GotoPosition(P);
|
---|
5521 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
5522 |
|
---|
5523 | If iew Then InvalidateEditor(0,0)
|
---|
5524 | Else SetScreenCursor;
|
---|
5525 | (*Undo*)
|
---|
5526 | LastUndoGroup := ugCursorMove;
|
---|
5527 | (*Undo*)
|
---|
5528 | End;
|
---|
5529 |
|
---|
5530 |
|
---|
5531 | Procedure TEditor.cmDeleteChar;
|
---|
5532 | Var newstring:String;
|
---|
5533 | lpl,lwl:Integer;
|
---|
5534 | ip:TICBPosition;
|
---|
5535 | CountDel:Integer;
|
---|
5536 | Begin
|
---|
5537 | If ReadOnly Then Exit;
|
---|
5538 | TestAutoSave;
|
---|
5539 |
|
---|
5540 | If _ICBOverwrite And _ICBExist Then
|
---|
5541 | Begin
|
---|
5542 | cmICBDeleteBlock;
|
---|
5543 | Exit;
|
---|
5544 | End;
|
---|
5545 |
|
---|
5546 | If Not WLactivated Then _ReadWorkLine;
|
---|
5547 | If FFileCursor.X > Length(FWorkLine) Then
|
---|
5548 | Begin
|
---|
5549 | If FActLine^.Next = Nil Then Exit;
|
---|
5550 | (*Undo*)
|
---|
5551 | _CopyUndoLines(FActLine,FActLine^.Next);
|
---|
5552 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FActLine^.Next));
|
---|
5553 | (*Undo*)
|
---|
5554 | If Not WLactivated Then _ReadWorkLine;
|
---|
5555 | lpl := Length(FActLine^.Next^.zk^);
|
---|
5556 | If lpl + FFileCursor.X <= StringLength Then
|
---|
5557 | Begin
|
---|
5558 | ip := _ICBPos(FActLine^.Next,0);
|
---|
5559 | If ip * [ipBeforeICBFirst,ipAfterICBFirst] <> [] Then
|
---|
5560 | Begin
|
---|
5561 | ICB.First.Line := FActLine;
|
---|
5562 | If FSelectMode <> smColumnBlock
|
---|
5563 | Then Inc(ICB.First.X,FFileCursor.X-1);
|
---|
5564 | If FActLine^.Next^.flag And ciSelected <> 0
|
---|
5565 | Then FActLine^.flag := FActLine^.flag Or ciSelected;
|
---|
5566 | End;
|
---|
5567 | If ip * [ipBeforeICBLast,ipAfterICBLast] <> [] Then
|
---|
5568 | Begin
|
---|
5569 | ICB.Last.Line := FActLine;
|
---|
5570 | If FSelectMode <> smColumnBlock
|
---|
5571 | Then Inc(ICB.Last.X,FFileCursor.X-1);
|
---|
5572 | End;
|
---|
5573 | _ICBCheckX;
|
---|
5574 | lwl := Length(FWorkLine);
|
---|
5575 | FillChar(FWorkLine[lwl+1],FFileCursor.X-lwl-1,32);
|
---|
5576 | newstring := _ReadString(FActLine^.Next,1,lpl);
|
---|
5577 | _WriteString(FFileCursor.X,newstring);
|
---|
5578 | _DeleteLine(FActLine^.Next);
|
---|
5579 |
|
---|
5580 | SetSliderValues;
|
---|
5581 | UpdateLineColorFlag(FActLine);
|
---|
5582 | FRedoList.Clear;
|
---|
5583 | InvalidateEditor(FScrCursor.Y,0);
|
---|
5584 | (*Undo*)
|
---|
5585 | LastUndoGroup := ugNoGroup;
|
---|
5586 | (*Undo*)
|
---|
5587 | End
|
---|
5588 | Else SetErrorMessage(LoadNLSStr(SLineWouldBeTooLong)+'.');
|
---|
5589 | End
|
---|
5590 | Else
|
---|
5591 | Begin
|
---|
5592 | (*Undo*)
|
---|
5593 | If LastUndoGroup <> ugDeleteChar Then _CopyUndoLines(FActLine,FActLine);
|
---|
5594 | (*Undo*)
|
---|
5595 |
|
---|
5596 | CountDel := 1;
|
---|
5597 | If Application.DBCSSystem Then
|
---|
5598 | Begin {Delete 2 chars If the Cursor Is ON the 1st Byte Of A dbcs Char}
|
---|
5599 | If QueryDBCSFirstByte(FWorkLine, FFileCursor.X) Then CountDel := 2;
|
---|
5600 | End;
|
---|
5601 |
|
---|
5602 | If FSelectMode <> smColumnBlock Then
|
---|
5603 | Begin
|
---|
5604 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5605 | If ip * [ipBeforeICBFirst] <> [] Then Dec(ICB.First.X, CountDel);
|
---|
5606 | If ip * [ipBeforeICBLast] <> [] Then Dec(ICB.Last.X, CountDel);
|
---|
5607 | _ICBCheckX;
|
---|
5608 | End;
|
---|
5609 | _DeleteString(FFileCursor.X, CountDel);
|
---|
5610 | FRedoList.Clear;
|
---|
5611 | InvalidateWorkLine;
|
---|
5612 | (*Undo*)
|
---|
5613 | LastUndoGroup := ugDeleteChar;
|
---|
5614 | (*Undo*)
|
---|
5615 | End;
|
---|
5616 | End;
|
---|
5617 |
|
---|
5618 |
|
---|
5619 | Procedure TEditor.cmBackSpace;
|
---|
5620 | Var prevline:PLine;
|
---|
5621 | ptline:PLine;
|
---|
5622 | oldstring:String;
|
---|
5623 | lpl:Integer;
|
---|
5624 | ip:TICBPosition;
|
---|
5625 | CountDel:Integer;
|
---|
5626 | FNT:Integer;
|
---|
5627 | iew:Boolean;
|
---|
5628 | Begin
|
---|
5629 | If ReadOnly Then Exit;
|
---|
5630 | TestAutoSave;
|
---|
5631 |
|
---|
5632 | If _ICBOverwrite And _ICBExist Then
|
---|
5633 | Begin
|
---|
5634 | cmICBDeleteBlock;
|
---|
5635 | Exit;
|
---|
5636 | End;
|
---|
5637 |
|
---|
5638 | _HorizMove;
|
---|
5639 | If FFileCursor.X <= 1 Then
|
---|
5640 | Begin
|
---|
5641 | If FActLine^.Prev = Nil Then Exit;
|
---|
5642 | (*Undo*)
|
---|
5643 | _CopyUndoLines(FActLine^.Prev,FActLine);
|
---|
5644 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FActLine));
|
---|
5645 | (*Undo*)
|
---|
5646 | If Not WLactivated Then _ReadWorkLine;
|
---|
5647 | oldstring := FWorkLine;
|
---|
5648 | prevline := FActLine^.Prev;
|
---|
5649 | lpl := Length(prevline^.zk^);
|
---|
5650 | If lpl + Length(FWorkLine) <= StringLength Then
|
---|
5651 | Begin
|
---|
5652 | ip := _ICBPos(FActLine,0);
|
---|
5653 | If ip * [ipBeforeICBFirst,ipAfterICBFirst] <> [] Then
|
---|
5654 | Begin
|
---|
5655 | ICB.First.Line := prevline;
|
---|
5656 | If FSelectMode <> smColumnBlock
|
---|
5657 | Then Inc(ICB.First.X,lpl);
|
---|
5658 | If FActLine^.flag And ciSelected <> 0
|
---|
5659 | Then prevline^.flag := prevline^.flag Or ciSelected;
|
---|
5660 | End;
|
---|
5661 | If ip * [ipBeforeICBLast,ipAfterICBLast] <> [] Then
|
---|
5662 | Begin
|
---|
5663 | ICB.Last.Line := prevline;
|
---|
5664 | If FSelectMode <> smColumnBlock
|
---|
5665 | Then Inc(ICB.Last.X,lpl);
|
---|
5666 | End;
|
---|
5667 | _ICBCheckX;
|
---|
5668 | If FScrCursor.Y > 1 Then Dec(FScrCursor.Y)
|
---|
5669 | Else FTopScreenLine := prevline;
|
---|
5670 | Dec(FFileCursor.Y);
|
---|
5671 | FActLine := prevline;
|
---|
5672 | _ReadWorkLine;
|
---|
5673 | iew := _CursorEnd;
|
---|
5674 | _WriteString(FFileCursor.X,oldstring);
|
---|
5675 | _DeleteLine(FActLine^.Next);
|
---|
5676 | UpdateLineColorFlag(FActLine);
|
---|
5677 | If _HorizMove Or iew Then InvalidateEditor(0,0)
|
---|
5678 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
5679 | SetSliderValues;
|
---|
5680 | End
|
---|
5681 | Else SetErrorMessage(LoadNLSStr(SLineWouldBeTooLong)+'.');
|
---|
5682 | (*Undo*)
|
---|
5683 | LastUndoGroup := ugNoGroup;
|
---|
5684 | (*Undo*)
|
---|
5685 | End
|
---|
5686 | Else
|
---|
5687 | Begin
|
---|
5688 | (*Undo*)
|
---|
5689 | If LastUndoGroup <> ugBackspaceChar Then _CopyUndoLines(FActLine,FActLine);
|
---|
5690 | (*Undo*)
|
---|
5691 |
|
---|
5692 | FlushWorkLine;
|
---|
5693 | If FEditOpt * [eoUnindent] <> [] Then
|
---|
5694 | Begin
|
---|
5695 | If (_FindNextTab(FActLine,1) >= FFileCursor.X) Or
|
---|
5696 | (Length(FActLine^.zk^) = 0) Then
|
---|
5697 | Begin
|
---|
5698 | ptline := FActLine;
|
---|
5699 | Repeat
|
---|
5700 | If ptline^.Prev <> Nil Then
|
---|
5701 | Begin
|
---|
5702 | ptline := ptline^.Prev;
|
---|
5703 | FNT := _FindNextTab(ptline,1);
|
---|
5704 | End
|
---|
5705 | Else FNT := 1;
|
---|
5706 | Until FNT < FFileCursor.X;
|
---|
5707 | CountDel := FFileCursor.X-FNT;
|
---|
5708 | End
|
---|
5709 | Else
|
---|
5710 | Begin
|
---|
5711 | CountDel := 1;
|
---|
5712 | If Application.DBCSSystem Then
|
---|
5713 | Begin {Delete 2 chars If the Cursor Is behind the 2nd Byte Of A dbcs Char}
|
---|
5714 | If QueryDBCSFirstByte(FActLine^.zk^, FFileCursor.X-2)
|
---|
5715 | Then CountDel := 2;
|
---|
5716 | End;
|
---|
5717 | End;
|
---|
5718 | End
|
---|
5719 | Else
|
---|
5720 | Begin
|
---|
5721 | CountDel := 1;
|
---|
5722 | If Application.DBCSSystem Then
|
---|
5723 | Begin {Delete 2 chars If the Cursor Is behind the 2nd Byte Of A dbcs Char}
|
---|
5724 | If QueryDBCSFirstByte(FActLine^.zk^, FFileCursor.X-2)
|
---|
5725 | Then CountDel := 2;
|
---|
5726 | End;
|
---|
5727 | End;
|
---|
5728 |
|
---|
5729 | Dec(FFileCursor.X, CountDel);
|
---|
5730 | If FSelectMode <> smColumnBlock Then
|
---|
5731 | Begin
|
---|
5732 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5733 | If ip * [ipBeforeICBFirst] <> [] Then
|
---|
5734 | Begin
|
---|
5735 | If ICB.First.X-FFileCursor.X > CountDel
|
---|
5736 | Then Dec(ICB.First.X,CountDel)
|
---|
5737 | Else ICB.First.X := FFileCursor.X;
|
---|
5738 | End;
|
---|
5739 | If ip * [ipBeforeICBLast] <> [] Then
|
---|
5740 | Begin
|
---|
5741 | If ICB.Last.X-FFileCursor.X > CountDel
|
---|
5742 | Then Dec(ICB.Last.X,CountDel)
|
---|
5743 | Else ICB.Last.X := FFileCursor.X;
|
---|
5744 | End;
|
---|
5745 | End;
|
---|
5746 | _DeleteString(FFileCursor.X,CountDel);
|
---|
5747 | FRedoList.Clear;
|
---|
5748 | If FScrCursor.X <= CountDel Then
|
---|
5749 | Begin
|
---|
5750 | FScrCursor.X := 1;
|
---|
5751 | UpdateLineColorFlag(FActLine);
|
---|
5752 | InvalidateEditor(0,0);
|
---|
5753 | End
|
---|
5754 | Else
|
---|
5755 | Begin
|
---|
5756 | Dec(FScrCursor.X,CountDel);
|
---|
5757 | InvalidateWorkLine;
|
---|
5758 | End;
|
---|
5759 | (*Undo*)
|
---|
5760 | LastUndoGroup := ugBackspaceChar;
|
---|
5761 | (*Undo*)
|
---|
5762 | End;
|
---|
5763 | End;
|
---|
5764 |
|
---|
5765 |
|
---|
5766 | Procedure TEditor.cmEnter;
|
---|
5767 | Var newstring:String;
|
---|
5768 | emptystring:String;
|
---|
5769 | I:Integer;
|
---|
5770 | FNT:Integer;
|
---|
5771 | NCX:Integer;
|
---|
5772 | ip:TICBPosition;
|
---|
5773 | FCX:Integer;
|
---|
5774 | AL:PLine;
|
---|
5775 | iew:Boolean;
|
---|
5776 | Begin
|
---|
5777 | If ReadOnly Then Exit;
|
---|
5778 | TestAutoSave;
|
---|
5779 |
|
---|
5780 | If _ICBOverwrite Then iew := _ICBDeleteICB
|
---|
5781 | Else iew := False;
|
---|
5782 |
|
---|
5783 | (*Undo*)
|
---|
5784 | _CopyUndoLines(FActLine,FActLine);
|
---|
5785 | (*Undo*)
|
---|
5786 | If Not WLactivated Then _ReadWorkLine;
|
---|
5787 |
|
---|
5788 | If FFileCursor.X <= Length(FWorkLine) Then
|
---|
5789 | Begin
|
---|
5790 | newstring := _ReadString(FActLine,FFileCursor.X,-1);
|
---|
5791 | SetLength(FWorkLine,FFileCursor.X-1);
|
---|
5792 | End
|
---|
5793 | Else newstring := '';
|
---|
5794 | _WriteWorkLine;
|
---|
5795 |
|
---|
5796 | _HorizMove;
|
---|
5797 | _InsertLine(FActLine);
|
---|
5798 | ip := _ICBPos(FActLine,FFileCursor.X);
|
---|
5799 | FCX := FFileCursor.X;
|
---|
5800 | AL := FActLine;
|
---|
5801 | FActLine := FActLine^.Next;
|
---|
5802 | If FEditOpt * [eoAutoIndent] <> [] Then
|
---|
5803 | Begin
|
---|
5804 | emptystring := '';
|
---|
5805 | If Length(FActLine^.Prev^.zk^) = 0 Then FNT := FFileCursor.X
|
---|
5806 | Else
|
---|
5807 | Begin
|
---|
5808 | FNT := 1;
|
---|
5809 | While (FActLine^.Prev^.zk^[FNT] = ' ') And
|
---|
5810 | (FNT <= Length(FActLine^.Prev^.zk^)) Do Inc(FNT);
|
---|
5811 | End;
|
---|
5812 | For I := 1 To FNT-1 Do emptystring := emptystring + ' ';
|
---|
5813 | FWorkLine := emptystring + newstring;
|
---|
5814 | _WriteWorkLine;
|
---|
5815 |
|
---|
5816 | If Length(FActLine^.Prev^.zk^) = 0 Then NCX := _FindNextTab(FActLine,1)
|
---|
5817 | Else NCX := _FindNextTab(FActLine^.Prev,1);
|
---|
5818 | FFileCursor.X := NCX;
|
---|
5819 | FScrCursor.X := NCX;
|
---|
5820 | If FScrCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X;
|
---|
5821 | End
|
---|
5822 | Else
|
---|
5823 | Begin
|
---|
5824 | FFileCursor.X := 1;
|
---|
5825 | FScrCursor.X := 1;
|
---|
5826 | FWorkLine := newstring;
|
---|
5827 | _WriteWorkLine;
|
---|
5828 | FNT := 1;
|
---|
5829 | End;
|
---|
5830 | {Update ICB}
|
---|
5831 | If FSelectMode <> smColumnBlock Then
|
---|
5832 | Begin
|
---|
5833 | If ip * [ipBeforeICBFirst] <> [] Then
|
---|
5834 | Begin
|
---|
5835 | AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5836 | AL^.flag := AL^.flag And Not ciSelected;
|
---|
5837 | Dec(ICB.First.X,FCX-1);
|
---|
5838 | Inc(ICB.First.X,FNT-1);
|
---|
5839 | ICB.First.Line := ICB.First.Line^.Next;
|
---|
5840 | End;
|
---|
5841 | If ip * [ipBeforeICBLast] <> [] Then
|
---|
5842 | Begin
|
---|
5843 | AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5844 | Dec(ICB.Last.X,FCX-1);
|
---|
5845 | Inc(ICB.Last.X,FNT-1);
|
---|
5846 | ICB.Last.Line := ICB.Last.Line^.Next;
|
---|
5847 | End;
|
---|
5848 | If ip * [ipAfterICBFirst,ipWithinICB] <> []
|
---|
5849 | Then AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5850 | If ip * [ipAfterICBLast] <> []
|
---|
5851 | Then AL^.Next^.flag := AL^.Next^.flag And Not ciSelected;
|
---|
5852 | _ICBCheckX;
|
---|
5853 | End
|
---|
5854 | Else {Extended Selection}
|
---|
5855 | Begin
|
---|
5856 | If ip * [ipBeforeICBFirst,ipAfterICBFirst,ipWithinICB] <> [] Then
|
---|
5857 | If ip * [ipBeforeICBLast,ipAfterICBLast] = []
|
---|
5858 | Then AL^.Next^.flag := AL^.Next^.flag Or (AL^.flag And ciSelected);
|
---|
5859 | End;
|
---|
5860 |
|
---|
5861 | Inc(FFileCursor.Y);
|
---|
5862 | SetLineColorFlag(FActLine^.Prev,FActLine);
|
---|
5863 | FRedoList.Clear;
|
---|
5864 | If FScrCursor.Y = FWinSize.Y Then
|
---|
5865 | Begin
|
---|
5866 | FTopScreenLine := FTopScreenLine^.Next;
|
---|
5867 | InvalidateEditor(0,0);
|
---|
5868 | End
|
---|
5869 | Else
|
---|
5870 | Begin
|
---|
5871 | Inc(FScrCursor.Y);
|
---|
5872 | If _HorizMove Or iew Then InvalidateEditor(0,0)
|
---|
5873 | Else InvalidateEditor(FScrCursor.Y-1,0);
|
---|
5874 | End;
|
---|
5875 | SetSliderValues;
|
---|
5876 | (*Undo*)
|
---|
5877 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(FActLine^.Next));
|
---|
5878 | LastUndoGroup := ugEnter;
|
---|
5879 | (*Undo*)
|
---|
5880 | End;
|
---|
5881 |
|
---|
5882 |
|
---|
5883 |
|
---|
5884 | Procedure TEditor.CutToClipBoard;
|
---|
5885 | Var P:Pointer;
|
---|
5886 | len:LongInt;
|
---|
5887 | Begin
|
---|
5888 | If ReadOnly Then Exit;
|
---|
5889 | If Not Selected Then Exit;
|
---|
5890 | TestAutoSave;
|
---|
5891 | If _GetEditorBlock(P,len) Then {including terminal #0}
|
---|
5892 | Begin
|
---|
5893 | If _SetClipBoardText(P,len) Then
|
---|
5894 | Begin
|
---|
5895 | FRedoList.Clear;
|
---|
5896 | If _ICBDeleteICB Then InvalidateEditor(0,0);
|
---|
5897 | End;
|
---|
5898 | FreeMem(P,len);
|
---|
5899 | End;
|
---|
5900 | End;
|
---|
5901 |
|
---|
5902 |
|
---|
5903 | Procedure TEditor.CopyToClipboard;
|
---|
5904 | Var P:Pointer;
|
---|
5905 | len:LongInt;
|
---|
5906 | Begin
|
---|
5907 | If Not Selected Then Exit;
|
---|
5908 | If _GetEditorBlock(P,len) Then {including terminal #0}
|
---|
5909 | Begin
|
---|
5910 | _SetClipBoardText(P,len);
|
---|
5911 | FreeMem(P,len);
|
---|
5912 | End;
|
---|
5913 | End;
|
---|
5914 |
|
---|
5915 |
|
---|
5916 | Function TEditor.PasteFromClipBoard:Boolean;
|
---|
5917 | Var P:Pointer;
|
---|
5918 | len:LongInt;
|
---|
5919 | Begin
|
---|
5920 | Result := False;
|
---|
5921 | If ReadOnly Then Exit;
|
---|
5922 | TestAutoSave;
|
---|
5923 |
|
---|
5924 | Result := _GetClipBoardText(P,len);
|
---|
5925 | If Result And (len > 0) Then
|
---|
5926 | Begin
|
---|
5927 | If _ICBOverwrite Then _ICBDeleteICB;
|
---|
5928 |
|
---|
5929 | InsertText(P,len-1); {without terminal #0}
|
---|
5930 | FreeMem(P,len);
|
---|
5931 | End;
|
---|
5932 | End;
|
---|
5933 |
|
---|
5934 |
|
---|
5935 | Function TEditor.InsertFromFile(Const FName:String):Boolean;
|
---|
5936 | Var P:Pointer;
|
---|
5937 | len:LongInt;
|
---|
5938 | Begin
|
---|
5939 | Result := False;
|
---|
5940 | If ReadOnly Then Exit;
|
---|
5941 | TestAutoSave;
|
---|
5942 |
|
---|
5943 | Result := _GetFileText(FName,P,len);
|
---|
5944 | If Result And (len > 0) Then
|
---|
5945 | Begin
|
---|
5946 | If _ICBOverwrite Then _ICBDeleteICB;
|
---|
5947 |
|
---|
5948 | InsertText(P,len-1); {without terminal #0}
|
---|
5949 | FreeMem(P,len);
|
---|
5950 | End;
|
---|
5951 | End;
|
---|
5952 |
|
---|
5953 |
|
---|
5954 | Function TEditor.GetReadOnly:Boolean;
|
---|
5955 | Begin
|
---|
5956 | Result := FReadOnly;
|
---|
5957 | End;
|
---|
5958 |
|
---|
5959 |
|
---|
5960 | Procedure TEditor.SetReadOnly(Value:Boolean);
|
---|
5961 | Begin
|
---|
5962 | FReadOnly := Value;
|
---|
5963 | End;
|
---|
5964 |
|
---|
5965 |
|
---|
5966 | Procedure TEditor.SetModified(Value:Boolean);
|
---|
5967 | Begin
|
---|
5968 | FModified := Value;
|
---|
5969 | End;
|
---|
5970 |
|
---|
5971 |
|
---|
5972 | {Show actual State Of the Editor}
|
---|
5973 | Procedure TEditor.UpdateEditorState;
|
---|
5974 | Begin
|
---|
5975 | End;
|
---|
5976 |
|
---|
5977 |
|
---|
5978 | {Use This method To Show additional State information; E.G. State Text}
|
---|
5979 | {$HINTS OFF}
|
---|
5980 | Procedure TEditor.SetStateMessage(Const S:String);
|
---|
5981 | Begin
|
---|
5982 | End;
|
---|
5983 | {$HINTS ON}
|
---|
5984 |
|
---|
5985 | {Handle an Error Message}
|
---|
5986 | Procedure TEditor.SetErrorMessage(Const S:String);
|
---|
5987 | Begin
|
---|
5988 | MessageBox(S,mtError,[mbOk]);
|
---|
5989 | Focus;
|
---|
5990 | End;
|
---|
5991 |
|
---|
5992 |
|
---|
5993 | {Handle A Query from the Editor}
|
---|
5994 | Function TEditor.SetQueryMessage(Const S:String;Typ:TMsgDlgType;Buttons:TMsgDlgButtons):TMsgDlgReturn;
|
---|
5995 | Begin
|
---|
5996 | Result := MessageBox(S,Typ,Buttons);
|
---|
5997 | Focus;
|
---|
5998 | End;
|
---|
5999 |
|
---|
6000 |
|
---|
6001 | {Handle A Confirm Query from the Editor}
|
---|
6002 | Function TEditor.SetReplaceConfirmMessage:TMsgDlgReturn;
|
---|
6003 | Var Dlg:TMessageBox;
|
---|
6004 | pt:TPoint;
|
---|
6005 | Begin
|
---|
6006 | BringToFront;
|
---|
6007 | If Application <> Nil Then Dlg.Create(Application.MainForm)
|
---|
6008 | Else Dlg.Create(Nil);
|
---|
6009 | Dlg.Message := LoadNLSStr(SReplaceThisString);
|
---|
6010 | Dlg.Buttons := mbYesNoCancel;
|
---|
6011 | Dlg.DlgType := mtInformation;
|
---|
6012 | Dlg.XAlign := xaNone;
|
---|
6013 | Dlg.YAlign := yaNone;
|
---|
6014 | Dlg.XStretch := xsFixed;
|
---|
6015 | Dlg.YStretch := ysFixed;
|
---|
6016 | Dlg.Width := 350;
|
---|
6017 | Dlg.Height := 130;
|
---|
6018 | pt := GetMouseFromCursor(FScrCursor);
|
---|
6019 | pt := ClientToScreen(pt); {pt Is the lower Left corner Of the Selection}
|
---|
6020 | If pt.Y > Dlg.Height Then Dec(pt.Y, Dlg.Height)
|
---|
6021 | Else Inc(pt.Y, Canvas.FontHeight);
|
---|
6022 | If pt.X + Dlg.Width > Screen.Width Then pt.X := Screen.Width - Dlg.Width;
|
---|
6023 | Dlg.Left := pt.X;
|
---|
6024 | Dlg.Bottom := pt.Y;
|
---|
6025 |
|
---|
6026 | Dlg.Execute;
|
---|
6027 | Case Dlg.ModalResult Of
|
---|
6028 | cmYes:Result := mrYes;
|
---|
6029 | cmNo: Result := mrNo;
|
---|
6030 | Else Result := mrCancel;
|
---|
6031 | End;
|
---|
6032 | Dlg.Destroy;
|
---|
6033 | End;
|
---|
6034 |
|
---|
6035 |
|
---|
6036 | {Handle the FileName And the Caption Of the Editor Window}
|
---|
6037 | Procedure TEditor.SetFileName(Const FName:String);
|
---|
6038 | Begin
|
---|
6039 | If FFileName <> FName Then
|
---|
6040 | Begin
|
---|
6041 | FileNameChange(FFileName,FName);
|
---|
6042 | End;
|
---|
6043 | FFileName := FName;
|
---|
6044 | End;
|
---|
6045 |
|
---|
6046 |
|
---|
6047 | {Use This method To Update the color flag Of an Editor Line}
|
---|
6048 | {$HINTS OFF}
|
---|
6049 | Function TEditor.UpdateLineColorFlag(pl:PLine):Boolean;
|
---|
6050 | Begin
|
---|
6051 | Result := False;
|
---|
6052 | End;
|
---|
6053 |
|
---|
6054 |
|
---|
6055 | {Use This method To Update the color flag Of Editor Lines}
|
---|
6056 | Procedure TEditor.SetLineColorFlag(pl1,pl2:PLine);
|
---|
6057 | Begin
|
---|
6058 | End;
|
---|
6059 | {$HINTS ON}
|
---|
6060 |
|
---|
6061 |
|
---|
6062 | {Set the color values For the actual Output Line}
|
---|
6063 | Procedure TEditor.CalcLineColor(pl:PLine;Var LineColor:TColorArray);
|
---|
6064 | Var I:Integer;
|
---|
6065 | SelBegin:Integer;
|
---|
6066 | SelEnd:Integer;
|
---|
6067 | ac,acend:Integer;
|
---|
6068 | Begin
|
---|
6069 | ac := FFileCursor.X-FScrCursor.X+1;
|
---|
6070 | acend := ac+FWinSize.X-1;
|
---|
6071 | For I := ac To acend Do
|
---|
6072 | Begin
|
---|
6073 | LineColor[I].Fgc := fgcPlainText;
|
---|
6074 | LineColor[I].Bgc := bgcPlainText;
|
---|
6075 | End;
|
---|
6076 |
|
---|
6077 | If pl = Nil Then Exit;
|
---|
6078 |
|
---|
6079 | If FindICB.First.Line = Nil Then {Test normal Selection}
|
---|
6080 | Begin
|
---|
6081 | If (pl^.flag And ciSelected = 0) Then Exit;
|
---|
6082 | If Not ICBVisible Then Exit;
|
---|
6083 |
|
---|
6084 | If FSelectMode <> smColumnBlock Then
|
---|
6085 | Begin
|
---|
6086 | If ICB.First.Line = pl Then SelBegin := ICB.First.X
|
---|
6087 | Else SelBegin := 1;
|
---|
6088 | If ICB.Last.Line = pl Then SelEnd := ICB.Last.X-1
|
---|
6089 | Else SelEnd := acend;
|
---|
6090 |
|
---|
6091 | If FKeyMap = kmCUA Then
|
---|
6092 | Begin
|
---|
6093 | I := Length(_PLine2PString(pl)^) +1;
|
---|
6094 | If I < SelEnd Then SelEnd := I;
|
---|
6095 | End;
|
---|
6096 | End
|
---|
6097 | Else {Extended Selection}
|
---|
6098 | Begin
|
---|
6099 | If ICB.First.X = ICB.Last.X Then Exit;
|
---|
6100 | If ICB.First.X < ICB.Last.X Then
|
---|
6101 | Begin
|
---|
6102 | SelBegin := ICB.First.X;
|
---|
6103 | SelEnd := ICB.Last.X-1;
|
---|
6104 | End
|
---|
6105 | Else
|
---|
6106 | Begin
|
---|
6107 | SelBegin := ICB.Last.X;
|
---|
6108 | SelEnd := ICB.First.X-1;
|
---|
6109 | End;
|
---|
6110 | End;
|
---|
6111 |
|
---|
6112 | If SelBegin > acend Then Exit;
|
---|
6113 | If SelEnd > acend Then SelEnd := acend;
|
---|
6114 |
|
---|
6115 | For I := SelBegin To SelEnd Do
|
---|
6116 | Begin
|
---|
6117 | LineColor[I].Fgc := fgcMarkedBlock;
|
---|
6118 | LineColor[I].Bgc := bgcMarkedBlock;
|
---|
6119 | End;
|
---|
6120 | End
|
---|
6121 | Else {Test Find Text block}
|
---|
6122 | Begin
|
---|
6123 | If FindICB.First.Line <> pl Then Exit;
|
---|
6124 | SelBegin := FindICB.First.X;
|
---|
6125 | SelEnd := FindICB.Last.X-1;
|
---|
6126 |
|
---|
6127 | If SelBegin > acend Then Exit;
|
---|
6128 | If SelEnd > acend Then SelEnd := acend;
|
---|
6129 |
|
---|
6130 | For I := SelBegin To SelEnd Do
|
---|
6131 | Begin
|
---|
6132 | LineColor[I].Fgc := fgcSearchMatch;
|
---|
6133 | LineColor[I].Bgc := bgcSearchMatch;
|
---|
6134 | End;
|
---|
6135 | End;
|
---|
6136 | End;
|
---|
6137 |
|
---|
6138 |
|
---|
6139 | Procedure ReplaceDBCSChars(Var S:String; maxchars:LongInt);
|
---|
6140 | Var I:LongInt;
|
---|
6141 | Begin
|
---|
6142 | If maxchars > Length(S) Then maxchars := Length(S);
|
---|
6143 | For I := 1 To maxchars Do
|
---|
6144 | Begin
|
---|
6145 | {$IFDEF OS2}
|
---|
6146 | If IsDBCSFirstByte(S[I]) Then
|
---|
6147 | Begin
|
---|
6148 | S[I] := ' ';
|
---|
6149 | Inc(I); {onto Second Byte}
|
---|
6150 | S[I] := ' ';
|
---|
6151 | End;
|
---|
6152 | {$ENDIF}
|
---|
6153 | End;
|
---|
6154 | End;
|
---|
6155 |
|
---|
6156 |
|
---|
6157 | Procedure ReplaceBoundingDBCSChars(Var S:String; First,Last:LongInt);
|
---|
6158 | Var I:LongInt;
|
---|
6159 | DBCS1stByte:Boolean;
|
---|
6160 | Begin
|
---|
6161 | If Last > Length(S) Then Last := Length(S);
|
---|
6162 | DBCS1stByte := False;
|
---|
6163 | For I := 1 To Last Do
|
---|
6164 | Begin
|
---|
6165 | {$IFDEF OS2}
|
---|
6166 | DBCS1stByte := IsDBCSFirstByte(S[I]);
|
---|
6167 | {$ELSE}
|
---|
6168 | DBCS1stByte := False;
|
---|
6169 | {$ENDIF}
|
---|
6170 |
|
---|
6171 | If I = First-1 Then
|
---|
6172 | Begin
|
---|
6173 | {If First Is the Second Byte Of A dbcs Char - dont Draw it}
|
---|
6174 | If DBCS1stByte Then S[First] := ' ';
|
---|
6175 | End;
|
---|
6176 |
|
---|
6177 | If I = Last Then
|
---|
6178 | Begin
|
---|
6179 | {If Last Is the First Byte Of A dbcs Char - dont Draw it}
|
---|
6180 | If DBCS1stByte Then S[Last] := ' ';
|
---|
6181 | End;
|
---|
6182 |
|
---|
6183 | If DBCS1stByte Then Inc(I);
|
---|
6184 | End;
|
---|
6185 | End;
|
---|
6186 |
|
---|
6187 |
|
---|
6188 | {Redraw the specified Line In the Editor Window}
|
---|
6189 | Procedure TEditor.InvalidateScreenLine(ScrY:Integer);
|
---|
6190 | Var pl:PLine;
|
---|
6191 | X,Y:LongInt;
|
---|
6192 | ac:Integer;
|
---|
6193 | I,W:Integer;
|
---|
6194 | Count:Integer;
|
---|
6195 | ps:Integer;
|
---|
6196 | S:String;
|
---|
6197 | los:Integer;
|
---|
6198 | LineColor:TColorArray;
|
---|
6199 | OutputString:String;
|
---|
6200 | XLeft:LongInt;
|
---|
6201 | PenColorIndex:LongInt;
|
---|
6202 | BrushColorIndex:LongInt;
|
---|
6203 | Begin
|
---|
6204 | If Handle = 0 Then Exit;
|
---|
6205 | pl := FTopScreenLine;
|
---|
6206 | For I := 2 To ScrY Do
|
---|
6207 | If pl <> Nil Then pl := pl^.Next;
|
---|
6208 |
|
---|
6209 | CalcLineColor(pl,LineColor);
|
---|
6210 |
|
---|
6211 | If pl <> Nil Then OutputString := _PLine2PString(pl)^
|
---|
6212 | Else OutputString := '';
|
---|
6213 |
|
---|
6214 | ac := FFileCursor.X-FScrCursor.X+1; {1st Char In Window}
|
---|
6215 |
|
---|
6216 | If Application.DBCSSystem Then
|
---|
6217 | Begin
|
---|
6218 | If IsDBCSFont Then
|
---|
6219 | Begin
|
---|
6220 | {Test If 1st Or Last character In the belong To A dbcs Char}
|
---|
6221 | ReplaceBoundingDBCSChars(OutputString,ac,ac+FWinSize.X-1);
|
---|
6222 | End
|
---|
6223 | Else
|
---|
6224 | Begin
|
---|
6225 | {replace All non-printable dbcs characters}
|
---|
6226 | ReplaceDBCSChars(OutputString,ac+FWinSize.X-1);
|
---|
6227 | End;
|
---|
6228 | End;
|
---|
6229 |
|
---|
6230 | los := Length(OutputString);
|
---|
6231 | For I := los+1 To ac+FWinSize.X-1 Do OutputString[I] := #32;
|
---|
6232 | SetLength(OutputString,ac+FWinSize.X-1);
|
---|
6233 |
|
---|
6234 | PenColorIndex := LineColor[ac].Fgc;
|
---|
6235 | BrushColorIndex := LineColor[ac].Bgc;
|
---|
6236 | Canvas.Pen.color := ColorEntry[PenColorIndex];
|
---|
6237 | Canvas.Brush.color := ColorEntry[BrushColorIndex];
|
---|
6238 |
|
---|
6239 | Count := 0;
|
---|
6240 | ps := 0;
|
---|
6241 | XLeft := FBorderWidth + IndentRect.Left;
|
---|
6242 | Y := ClientArea.Top - (ScrY*Canvas.FontHeight) -
|
---|
6243 | IndentRect.Top - FBorderWidth;
|
---|
6244 | For I := ac To ac+FWinSize.X-1 Do
|
---|
6245 | Begin
|
---|
6246 | If (PenColorIndex <> LineColor[I].Fgc) Or
|
---|
6247 | (BrushColorIndex <> LineColor[I].Bgc) Then
|
---|
6248 | Begin
|
---|
6249 | X := XLeft + ps*Canvas.FontWidth;
|
---|
6250 | S := Copy(OutputString,ps+ac,Count);
|
---|
6251 | Canvas.TextOut(X,Y,S);
|
---|
6252 |
|
---|
6253 | Inc(ps,Count);
|
---|
6254 | Count := 1;
|
---|
6255 | PenColorIndex := LineColor[I].Fgc;
|
---|
6256 | BrushColorIndex := LineColor[I].Bgc;
|
---|
6257 | Canvas.Pen.color := ColorEntry[PenColorIndex];
|
---|
6258 | Canvas.Brush.color := ColorEntry[BrushColorIndex];
|
---|
6259 | End
|
---|
6260 | Else Inc(Count);
|
---|
6261 | End;
|
---|
6262 | If Count <> 0 Then
|
---|
6263 | Begin
|
---|
6264 | X := XLeft+ps*Canvas.FontWidth;
|
---|
6265 | S := Copy(OutputString,ps+ac,Count);
|
---|
6266 | Canvas.TextOut(X,Y,S);
|
---|
6267 | End;
|
---|
6268 |
|
---|
6269 | {WordWrap Line}
|
---|
6270 | WrapLineX := -1;
|
---|
6271 | If FWordWrap Then
|
---|
6272 | If ((FWordWrapColumn > ac) And (FWordWrapColumn < ac+FWinSize.X)) Or
|
---|
6273 | (FWordWrapColumn = 0) Then
|
---|
6274 | Begin
|
---|
6275 | If FWordWrapColumn = 0 Then W := FWinSize.X-1
|
---|
6276 | Else W := FWordWrapColumn - (FFileCursor.X - FScrCursor.X);
|
---|
6277 | XLeft := FBorderWidth+IndentRect.Left;
|
---|
6278 | WrapLineX := XLeft + W * Canvas.FontWidth;
|
---|
6279 | Canvas.Pen.color := ColorEntry[fgcRightMargin];
|
---|
6280 | Canvas.MoveTo(WrapLineX,Y);
|
---|
6281 | Inc(Y, Canvas.FontHeight-1);
|
---|
6282 | Canvas.LineTo(WrapLineX,Y);
|
---|
6283 | End;
|
---|
6284 | End;
|
---|
6285 |
|
---|
6286 |
|
---|
6287 | {Redraw the actual Cursor Line}
|
---|
6288 | Procedure TEditor.InvalidateWorkLine;
|
---|
6289 | Begin
|
---|
6290 | If Not UpdateLineColorFlag(FActLine) Then
|
---|
6291 | Begin
|
---|
6292 | If IgnoreRedraw > 0 Then Exit;
|
---|
6293 | FCaret.Hide;
|
---|
6294 | InvalidateScreenLine(FScrCursor.Y);
|
---|
6295 | SetScreenCursor;
|
---|
6296 | FCaret.Show;
|
---|
6297 | End
|
---|
6298 | Else InvalidateEditor(FScrCursor.Y,0);
|
---|
6299 | End;
|
---|
6300 |
|
---|
6301 |
|
---|
6302 | {Redraw the Lines In the Editor Window from Line y1 To Line y2}
|
---|
6303 | Procedure TEditor.InvalidateEditor(y1,y2:Integer);
|
---|
6304 | Var I:Integer;
|
---|
6305 | Y:LongInt;
|
---|
6306 | OldWrapLineX:Integer;
|
---|
6307 | Begin
|
---|
6308 | If Handle = 0 Then Exit;
|
---|
6309 | If IgnoreRedraw > 0 Then Exit;
|
---|
6310 | OldWrapLineX := WrapLineX;
|
---|
6311 |
|
---|
6312 | If y1 < 1 Then y1 := 1;
|
---|
6313 | If y2 < 1 Then y2 := FWinSize.Y;
|
---|
6314 | If y2 > FWinSize.Y Then y2 := FWinSize.Y;
|
---|
6315 | SetSliderPosition;
|
---|
6316 | FCaret.Hide;
|
---|
6317 | For I := y1 To y2 Do InvalidateScreenLine(I);
|
---|
6318 |
|
---|
6319 | If OldWrapLineX > 0 Then
|
---|
6320 | Begin
|
---|
6321 | Canvas.Pen.color := ColorEntry[bgcPlainText];
|
---|
6322 | Y := ClientArea.Top -1;
|
---|
6323 | Y := Y - Integer(FBorderWidth);
|
---|
6324 | Canvas.MoveTo(OldWrapLineX,Y);
|
---|
6325 | Y := Y - IndentRect.Top;
|
---|
6326 | Canvas.LineTo(OldWrapLineX,Y);
|
---|
6327 |
|
---|
6328 | Y := Y - (FWinSize.Y * Canvas.FontHeight) +2;
|
---|
6329 | Canvas.MoveTo(OldWrapLineX,Y);
|
---|
6330 | Y := Integer(FBorderWidth);
|
---|
6331 | Canvas.LineTo(OldWrapLineX,Y);
|
---|
6332 | End;
|
---|
6333 | If WrapLineX > 0 Then
|
---|
6334 | Begin
|
---|
6335 | Canvas.Pen.color := ColorEntry[fgcRightMargin];
|
---|
6336 | Y := ClientArea.Top -1 -Integer(FBorderWidth);
|
---|
6337 | Canvas.MoveTo(WrapLineX,Y);
|
---|
6338 | Y := Y -IndentRect.Top;
|
---|
6339 | Canvas.LineTo(WrapLineX,Y);
|
---|
6340 |
|
---|
6341 | Y := Y - (FWinSize.Y * Canvas.FontHeight) +2;
|
---|
6342 | Canvas.MoveTo(WrapLineX,Y);
|
---|
6343 | Y := Integer(FBorderWidth);
|
---|
6344 | Canvas.LineTo(WrapLineX,Y);
|
---|
6345 | End;
|
---|
6346 |
|
---|
6347 | SetScreenCursor;
|
---|
6348 | FCaret.Show;
|
---|
6349 | End;
|
---|
6350 |
|
---|
6351 |
|
---|
6352 | {Redraw All Lines And the indent borders In the Editor Window}
|
---|
6353 | Procedure TEditor.Redraw(Const rc:TRect);
|
---|
6354 | Var rec:TRect;
|
---|
6355 | FrameWidth:Integer;
|
---|
6356 | Begin
|
---|
6357 | Canvas.ClipRect := rc;
|
---|
6358 | FrameWidth := Integer(FBorderWidth);
|
---|
6359 |
|
---|
6360 | rec := ClientArea;
|
---|
6361 | rec.Top := rec.Top-(FWinSize.Y*Canvas.FontHeight+IndentRect.Top)+1;
|
---|
6362 | Dec(rec.Top,FrameWidth);
|
---|
6363 | Inc(rec.Bottom,FrameWidth);
|
---|
6364 | Inc(rec.Left,FrameWidth);
|
---|
6365 | Dec(rec.Right,FrameWidth);
|
---|
6366 | Canvas.FillRect(rec,ColorEntry[bgcPlainText]); {Bottom}
|
---|
6367 |
|
---|
6368 | rec := ClientArea;
|
---|
6369 | rec.Bottom := rec.Top-IndentRect.Top;
|
---|
6370 | Inc(rec.Left,FrameWidth);
|
---|
6371 | Dec(rec.Right,FrameWidth);
|
---|
6372 | Dec(rec.Bottom,FrameWidth);
|
---|
6373 | Dec(rec.Top,FrameWidth);
|
---|
6374 | Canvas.FillRect(rec,ColorEntry[bgcPlainText]); {Top}
|
---|
6375 |
|
---|
6376 | rec := ClientArea;
|
---|
6377 | rec.Right := IndentRect.Left;
|
---|
6378 | Inc(rec.Right,FrameWidth);
|
---|
6379 | Inc(rec.Bottom,FrameWidth);
|
---|
6380 | Inc(rec.Left,FrameWidth);
|
---|
6381 | Dec(rec.Top,FrameWidth);
|
---|
6382 | Canvas.FillRect(rec,ColorEntry[bgcPlainText]); {Left}
|
---|
6383 |
|
---|
6384 | rec := ClientArea;
|
---|
6385 | rec.Left := FWinSize.X*Canvas.FontWidth+IndentRect.Left;
|
---|
6386 | Inc(rec.Left,FrameWidth);
|
---|
6387 | Inc(rec.Bottom,FrameWidth);
|
---|
6388 | Dec(rec.Right,FrameWidth);
|
---|
6389 | Dec(rec.Top,FrameWidth);
|
---|
6390 | Canvas.FillRect(rec,ColorEntry[bgcPlainText]); {Right}
|
---|
6391 |
|
---|
6392 | rec := ClientArea;
|
---|
6393 | Dec(rec.Right);
|
---|
6394 | Dec(rec.Top);
|
---|
6395 | If FCtl3D Then
|
---|
6396 | Begin
|
---|
6397 | Canvas.ShadowedBorder(rec,clDkGray,clWhite);
|
---|
6398 | InflateRect(rec,-1,-1);
|
---|
6399 | Canvas.ShadowedBorder(rec,clBlack,clLtGray);
|
---|
6400 | End
|
---|
6401 | Else Canvas.ShadowedBorder(rec,clBlack,clBlack);
|
---|
6402 |
|
---|
6403 | InvalidateEditor(0,0);
|
---|
6404 | Canvas.DeleteClipRegion;
|
---|
6405 | End;
|
---|
6406 |
|
---|
6407 |
|
---|
6408 | Procedure TEditor.SetScreenCursor;
|
---|
6409 | Var pt:TPoint;
|
---|
6410 | W:LongInt;
|
---|
6411 | ps:PString;
|
---|
6412 | Begin
|
---|
6413 | pt := GetMouseFromCursor(FScrCursor);
|
---|
6414 | FCaret.SetPos(pt.X,pt.Y);
|
---|
6415 | UpdateEditorState;
|
---|
6416 |
|
---|
6417 | If Application.DBCSSystem Then
|
---|
6418 | Begin {Make sure, that the Caret has the same Width like the Char below}
|
---|
6419 | If (FCursorShape = csVertical) And FInsertMode Then Exit;
|
---|
6420 |
|
---|
6421 | ps := _PLine2PString(FActLine);
|
---|
6422 | If QueryDBCSFirstByte(ps^, FFileCursor.X) Then W := 2 * Canvas.FontWidth
|
---|
6423 | Else W := Canvas.FontWidth;
|
---|
6424 |
|
---|
6425 | If FCaret.Width <> W Then
|
---|
6426 | Begin
|
---|
6427 | FCaret.Remove;
|
---|
6428 | FCaret.SetSize(W, FCaret.Height);
|
---|
6429 | If HadFocus > 0 Then FCaret.Show;
|
---|
6430 | End;
|
---|
6431 | End;
|
---|
6432 | End;
|
---|
6433 |
|
---|
6434 |
|
---|
6435 | Function TEditor.QueryConvertPos(Var Pos:TPoint):Boolean;
|
---|
6436 | Begin
|
---|
6437 | Pos := GetMouseFromCursor(FScrCursor);
|
---|
6438 | Result := True;
|
---|
6439 | End;
|
---|
6440 |
|
---|
6441 |
|
---|
6442 | Procedure TEditor.BeginUpdate;
|
---|
6443 | Begin
|
---|
6444 | Inc(IgnoreRedraw);
|
---|
6445 | End;
|
---|
6446 |
|
---|
6447 |
|
---|
6448 | Procedure TEditor.EndUpdate;
|
---|
6449 | Begin
|
---|
6450 | Dec(IgnoreRedraw);
|
---|
6451 | If IgnoreRedraw <= 0 Then
|
---|
6452 | Begin
|
---|
6453 | IgnoreRedraw := 0;
|
---|
6454 | InvalidateEditor(0,0);
|
---|
6455 | SetSliderValues;
|
---|
6456 | End;
|
---|
6457 | End;
|
---|
6458 |
|
---|
6459 |
|
---|
6460 | Procedure TEditor.SetupComponent;
|
---|
6461 | Begin
|
---|
6462 | Inherited SetupComponent;
|
---|
6463 |
|
---|
6464 | DBCSStatusLine := True;
|
---|
6465 | ScrollBars := ssBoth;
|
---|
6466 | FCaret.Create(Self);
|
---|
6467 | FOldCaption := '';
|
---|
6468 | FFirstLine := Nil;
|
---|
6469 | FLastLine := Nil;
|
---|
6470 | _InsertLine(Nil);
|
---|
6471 | FActLine := FFirstLine;
|
---|
6472 | FTopScreenLine := FActLine;
|
---|
6473 | FFileName := '';
|
---|
6474 | IndentRect.Top := 3;
|
---|
6475 | IndentRect.Left := 3;
|
---|
6476 | IndentRect.Right := 3 + Screen.SystemMetrics(smCxVScroll);
|
---|
6477 | IndentRect.Bottom := 3 + Screen.SystemMetrics(smCyHScroll);
|
---|
6478 | FWinSize.Y := 0;
|
---|
6479 | FWinSize.X := 0;
|
---|
6480 | FFileCursor.X := 1;
|
---|
6481 | FFileCursor.Y := 1;
|
---|
6482 | FScrCursor.X := 1;
|
---|
6483 | FScrCursor.Y := 1;
|
---|
6484 | TabSize := 8;
|
---|
6485 | IgnoreRedraw := 0;
|
---|
6486 | WLactivated := True;
|
---|
6487 | Untitled := True;
|
---|
6488 | Modified := False;
|
---|
6489 | ICBVisible := True;
|
---|
6490 | FWorkLine := '';
|
---|
6491 | ICB.First.Line := Nil;
|
---|
6492 | ICB.First.X := 0;
|
---|
6493 | ICB.Last.Line := Nil;
|
---|
6494 | ICB.Last.X := 0;
|
---|
6495 | FEditOpt := [eoCreateBackups,eoUndoGroups,eoAutoIndent,eoUnindent,
|
---|
6496 | eoPersistentBlocks,eoSmartTabs];
|
---|
6497 | FKeyMap := kmWordStar;
|
---|
6498 | FInsertMode := True;
|
---|
6499 | FReadOnly := False;
|
---|
6500 | MaxUndo := 128;
|
---|
6501 | FUndoList.Create;
|
---|
6502 | FUndoList.OnFreeItem := _FreeUndoEvent;
|
---|
6503 | FRedoList.Create;
|
---|
6504 | FRedoList.OnFreeItem := _FreeUndoEvent;
|
---|
6505 | KeyRepeat := 1;
|
---|
6506 | FPreCtrl := 0;
|
---|
6507 | HadFocus := 0;
|
---|
6508 | FFindReplace.Find := '';
|
---|
6509 | FFindReplace.replace := '';
|
---|
6510 | FFindReplace.Direction := fdForward;
|
---|
6511 | FFindReplace.Origin := foEntireScope;
|
---|
6512 | FFindReplace.Scope := fsGlobal;
|
---|
6513 | FFindReplace.Options := [];
|
---|
6514 | FLastFind := faNothing;
|
---|
6515 | IncSearchList.Create;
|
---|
6516 | IncSearchText := '';
|
---|
6517 | FindICB.First.Line := Nil;
|
---|
6518 | fMask := '*.*';
|
---|
6519 |
|
---|
6520 | PenColor := clBlack;
|
---|
6521 | color := clWhite;
|
---|
6522 | FSelColor:=Color;
|
---|
6523 | FSelBackColor:=PenColor;
|
---|
6524 | FFoundColor := FSelColor;
|
---|
6525 | FFoundColor := FSelColor;
|
---|
6526 | FWrapLineColor := clLtGray;
|
---|
6527 | Font := Screen.FixedFont;
|
---|
6528 | FSaveEvents := -1;
|
---|
6529 | FWordWrap := False;
|
---|
6530 | FWordWrapColumn := 0;
|
---|
6531 | WrapLineX := -1;
|
---|
6532 | FCtl3D := True;
|
---|
6533 | FMacroList := Nil;
|
---|
6534 | FRecording := False;
|
---|
6535 | FPlaying := False;
|
---|
6536 | FCursorShape := csUnderline;
|
---|
6537 | SelectMode := smNonInclusiveBlock;
|
---|
6538 |
|
---|
6539 | DragMode := dmAutomatic;
|
---|
6540 | DragCursor := crIBeam;
|
---|
6541 | End;
|
---|
6542 |
|
---|
6543 |
|
---|
6544 | Procedure TEditor.SetupShow;
|
---|
6545 | Begin
|
---|
6546 | Inherited SetupShow;
|
---|
6547 |
|
---|
6548 | FBottomScrollBar := HorzScrollBar;
|
---|
6549 | FRightScrollBar := VertScrollBar;
|
---|
6550 |
|
---|
6551 | CalcSizes;
|
---|
6552 | Cursor := crIBeam;
|
---|
6553 | CursorShape := FCursorShape;
|
---|
6554 | FEventsCounter := FSaveEvents;
|
---|
6555 | End;
|
---|
6556 |
|
---|
6557 |
|
---|
6558 | Function TEditor.LoadFromStream(Stream:TStream):Boolean;
|
---|
6559 | Var P:Pointer;
|
---|
6560 | len:LongInt;
|
---|
6561 | Begin
|
---|
6562 | Result := False;
|
---|
6563 | If FReadOnly Then Exit; {F!}
|
---|
6564 | SetStateMessage(LoadNLSStr(SLoading));
|
---|
6565 |
|
---|
6566 | Screen.Cursor := crHourGlass;
|
---|
6567 | Stream.Position:=0;
|
---|
6568 | len:=Stream.Size;
|
---|
6569 | GetMem(P,len);
|
---|
6570 | Stream.ReadBuffer(P^,len);
|
---|
6571 | Result:=True;
|
---|
6572 | If Result And (len > 0) Then
|
---|
6573 | Begin
|
---|
6574 | If _ICBOverwrite Then _ICBDeleteICB;
|
---|
6575 | _InsertText(P,len-1, False); {without terminal #0}
|
---|
6576 | FreeMem(P,len);
|
---|
6577 | End;
|
---|
6578 | Screen.Cursor := crDefault;
|
---|
6579 |
|
---|
6580 | SetStateMessage('');
|
---|
6581 | FUndoList.Clear;
|
---|
6582 | FRedoList.Clear;
|
---|
6583 | Untitled := False;
|
---|
6584 | Modified := False;
|
---|
6585 | InvalidateEditor(0,0);
|
---|
6586 | End;
|
---|
6587 |
|
---|
6588 |
|
---|
6589 | Function TEditor.LoadFromFile(Const FName:String):Boolean;
|
---|
6590 | Var P:Pointer;
|
---|
6591 | len:LongInt;
|
---|
6592 | S:String;
|
---|
6593 | Begin
|
---|
6594 | Result := False;
|
---|
6595 | If FReadOnly Then Exit; {F!}
|
---|
6596 | S := FExpand(FName);
|
---|
6597 | SetStateMessage(LoadNLSStr(SLoading) + S);
|
---|
6598 |
|
---|
6599 | SetFileName(S);
|
---|
6600 |
|
---|
6601 | Screen.Cursor := crHourGlass;
|
---|
6602 | Result := _GetFileText(S,P,len);
|
---|
6603 | If Result And (len > 0) Then
|
---|
6604 | Begin
|
---|
6605 | If _ICBOverwrite Then _ICBDeleteICB;
|
---|
6606 | _InsertText(P,len-1, False); {without terminal #0}
|
---|
6607 | FreeMem(P,len);
|
---|
6608 | End;
|
---|
6609 | Screen.Cursor := crDefault;
|
---|
6610 | SetStateMessage('');
|
---|
6611 | FUndoList.Clear;
|
---|
6612 | FRedoList.Clear;
|
---|
6613 | Untitled := False;
|
---|
6614 | Modified := False;
|
---|
6615 | InvalidateEditor(0,0);
|
---|
6616 | End;
|
---|
6617 |
|
---|
6618 |
|
---|
6619 | {$HINTS OFF}
|
---|
6620 | Procedure TEditor.SetAvailabeFileTypes(CFOD:TOpenDialog);
|
---|
6621 | Begin
|
---|
6622 | End;
|
---|
6623 | {$HINTS ON}
|
---|
6624 |
|
---|
6625 |
|
---|
6626 | Function TEditor.SaveToStream(Stream:TStream):Boolean;
|
---|
6627 | Var Ptr:^LongWord;
|
---|
6628 | len:LongInt;
|
---|
6629 | Begin
|
---|
6630 | SetStateMessage(LoadNLSStr(SSaving));
|
---|
6631 | If _GetEditorText(Ptr,len) Then
|
---|
6632 | Begin
|
---|
6633 | Stream.WriteBuffer(Ptr^,len);
|
---|
6634 | FreeMem(Ptr,len);
|
---|
6635 | End
|
---|
6636 | Else Result:=False;
|
---|
6637 | SetStateMessage('');
|
---|
6638 | UpdateEditorState;
|
---|
6639 | End;
|
---|
6640 |
|
---|
6641 |
|
---|
6642 | Const
|
---|
6643 | SaveAsISOLatin1:Boolean=FALSE;
|
---|
6644 | CurrentCodePage:LongInt=0;
|
---|
6645 |
|
---|
6646 | Type
|
---|
6647 | TCharArray=Array[1..MaxLongInt] Of Char;
|
---|
6648 | PCharArray=^TCharArray;
|
---|
6649 |
|
---|
6650 | Procedure ConvertToISOLatin1(Ptr:PCharArray;len:LongInt);
|
---|
6651 | {$IFDEF OS2}
|
---|
6652 | Var cptarget:INTEGER;
|
---|
6653 | cpsource:INTEGER;
|
---|
6654 | TempPtr:PCharArray;
|
---|
6655 | i:LongInt;
|
---|
6656 | {$ENDIF}
|
---|
6657 | Begin
|
---|
6658 | {$IFDEF OS2}
|
---|
6659 | If SaveAsISOLatin1 Then
|
---|
6660 | Begin
|
---|
6661 | cpsource := CurrentCodePage;
|
---|
6662 | cptarget := 1004;
|
---|
6663 | If cpsource = 0 Then Exit;
|
---|
6664 |
|
---|
6665 | GetMem(TempPtr,len);
|
---|
6666 | Move(Ptr^,TempPtr^,len);
|
---|
6667 |
|
---|
6668 | If WinCPTranslateString(AppHandle, cpsource, PChar(TempPtr)^, cptarget,
|
---|
6669 | len, PChar(Ptr)^) Then
|
---|
6670 | Begin
|
---|
6671 | For i := 1 To len Do
|
---|
6672 | If Ptr^[i] = #255 Then Ptr^[i] := TempPtr^[i];
|
---|
6673 | End;
|
---|
6674 |
|
---|
6675 | FreeMem(TempPtr,len);
|
---|
6676 | End;
|
---|
6677 | {$ENDIF}
|
---|
6678 | End;
|
---|
6679 |
|
---|
6680 |
|
---|
6681 | Function TEditor.SaveToFile(Const FName:String):Boolean;
|
---|
6682 | Var utF,eF:File;
|
---|
6683 | Ptr:^LongWord;
|
---|
6684 | len:LongInt;
|
---|
6685 | IoR:Integer;
|
---|
6686 | BackupName:String;
|
---|
6687 | D,N,E:String;
|
---|
6688 | Begin
|
---|
6689 | Result := False;
|
---|
6690 |
|
---|
6691 | SetStateMessage(LoadNLSStr(SSaving) + FName);
|
---|
6692 | Screen.Cursor := crHourGlass;
|
---|
6693 | If FEditOpt * [eoCreateBackups] <> [] Then
|
---|
6694 | Begin
|
---|
6695 | If FEditOpt * [eoAppendBAK] = [] Then
|
---|
6696 | Begin
|
---|
6697 | FSplit(FName,D,N,E);
|
---|
6698 | BackupName := D + N + '.BAK';
|
---|
6699 | End
|
---|
6700 | Else BackupName := FName + '.BAK';
|
---|
6701 | System.Assign(utF,FName);
|
---|
6702 | {$I-}
|
---|
6703 | Reset(utF);
|
---|
6704 | IoR := InOutRes;
|
---|
6705 | System.Close(utF);
|
---|
6706 | {$I+}
|
---|
6707 | If IoR = 0 Then
|
---|
6708 | Begin
|
---|
6709 | System.Assign(eF,BackupName);
|
---|
6710 | {$I-}
|
---|
6711 | Erase(eF);
|
---|
6712 | Rename(utF,BackupName);
|
---|
6713 | {$I+}
|
---|
6714 | End;
|
---|
6715 | End;
|
---|
6716 |
|
---|
6717 | System.Assign(utF,FName);
|
---|
6718 | {$I-}
|
---|
6719 | Rewrite(utF,1);
|
---|
6720 | {$I+}
|
---|
6721 | If InOutRes <> 0 Then
|
---|
6722 | Begin
|
---|
6723 | SetStateMessage('');
|
---|
6724 | SetErrorMessage(LoadNLSStr(SErrorWriting)+': '+ FName);
|
---|
6725 | Screen.Cursor := crDefault;
|
---|
6726 | Exit;
|
---|
6727 | End;
|
---|
6728 | If _GetEditorText(Ptr,len) Then
|
---|
6729 | Begin
|
---|
6730 | ConvertToISOLatin1(PCharArray(Ptr),len);
|
---|
6731 |
|
---|
6732 | {$I-}
|
---|
6733 | BlockWrite(utF,Ptr^,len-1); {without terminating #0}
|
---|
6734 | {$I+}
|
---|
6735 | FreeMem(Ptr,len);
|
---|
6736 | If InOutRes <> 0 Then
|
---|
6737 | Begin
|
---|
6738 | {$I-}
|
---|
6739 | System.Close(utF);
|
---|
6740 | {$I+}
|
---|
6741 | SetStateMessage('');
|
---|
6742 | SetErrorMessage(LoadNLSStr(SErrorWriting)+': '+ FName);
|
---|
6743 | Screen.Cursor := crDefault;
|
---|
6744 | Exit;
|
---|
6745 | End;
|
---|
6746 | End;
|
---|
6747 | {$I-}
|
---|
6748 | System.Close(utF);
|
---|
6749 | {$I+}
|
---|
6750 | Screen.Cursor := crDefault;
|
---|
6751 | Untitled := False;
|
---|
6752 | Modified := False;
|
---|
6753 | SetStateMessage('');
|
---|
6754 | UpdateEditorState;
|
---|
6755 | FEventsCounter := FSaveEvents;
|
---|
6756 |
|
---|
6757 | SetFileName(FName);
|
---|
6758 | Result := True;
|
---|
6759 | End;
|
---|
6760 |
|
---|
6761 |
|
---|
6762 | Function TEditor.SaveFile:Boolean;
|
---|
6763 | Var FName:String;
|
---|
6764 | CFSD:TSaveDialog;
|
---|
6765 | ret:Boolean;
|
---|
6766 | Begin
|
---|
6767 | Result := False;
|
---|
6768 |
|
---|
6769 | If Untitled Then
|
---|
6770 | Begin
|
---|
6771 | CFSD.Create(Self);
|
---|
6772 | CFSD.Caption := LoadNLSStr(SSaveFileAs);
|
---|
6773 | CFSD.FileName := FileName;
|
---|
6774 | CFSD.DefaultExt := GetDefaultExt(fMask);
|
---|
6775 | SetAvailabeFileTypes(CFSD);
|
---|
6776 |
|
---|
6777 | ret := CFSD.Execute;
|
---|
6778 | FName := CFSD.FileName;
|
---|
6779 | CFSD.Destroy;
|
---|
6780 | If Not ret Then Exit;
|
---|
6781 |
|
---|
6782 | Case TestSaveAsName(FName) Of
|
---|
6783 | mrNo:
|
---|
6784 | Begin {because Of CloseQuery}
|
---|
6785 | Result := True;
|
---|
6786 | Exit;
|
---|
6787 | End;
|
---|
6788 | mrCancel: Exit;
|
---|
6789 | End;
|
---|
6790 | End
|
---|
6791 | Else FName := FileName;
|
---|
6792 |
|
---|
6793 |
|
---|
6794 | If SaveToFile(FName) Then Result := True;
|
---|
6795 | End;
|
---|
6796 |
|
---|
6797 |
|
---|
6798 | Function TEditor.SaveFileAs(Const FName:String):Boolean;
|
---|
6799 | Var S:String;
|
---|
6800 | Begin
|
---|
6801 | Result := False;
|
---|
6802 | S := FExpand(FName);
|
---|
6803 |
|
---|
6804 | Case TestSaveAsName(S) Of
|
---|
6805 | mrNo:
|
---|
6806 | Begin {because Of CloseQuery}
|
---|
6807 | Result := True;
|
---|
6808 | Exit;
|
---|
6809 | End;
|
---|
6810 | mrCancel: Exit;
|
---|
6811 | End;
|
---|
6812 |
|
---|
6813 | If SaveToFile(S) Then Result := True;
|
---|
6814 | End;
|
---|
6815 |
|
---|
6816 |
|
---|
6817 | Function TEditor.TestSaveAsName(Const FName:String):TMsgDlgReturn;
|
---|
6818 | Var Text:String;
|
---|
6819 | Begin
|
---|
6820 | If FileExists(FName) Then
|
---|
6821 | Begin
|
---|
6822 | Text := FmtLoadNLSStr(SAlreadyExistsOverwrite,[FName]);
|
---|
6823 | Result := SetQueryMessage(Text,mtWarning,mbYesNoCancel);
|
---|
6824 | End
|
---|
6825 | Else Result := mrYes;
|
---|
6826 | End;
|
---|
6827 |
|
---|
6828 |
|
---|
6829 | {$HINTS OFF}
|
---|
6830 | Procedure TEditor.FileNameChange(Const OldName,NewName:String);
|
---|
6831 | Begin
|
---|
6832 | End;
|
---|
6833 | {$HINTS ON}
|
---|
6834 |
|
---|
6835 |
|
---|
6836 | Procedure TEditor.TestAutoSave;
|
---|
6837 | Begin
|
---|
6838 | If FEditOpt * [eoAutoSave] = [] Then Exit;
|
---|
6839 | If FSaveEvents <= 0 Then Exit;
|
---|
6840 | If FEventsCounter <= 0 Then
|
---|
6841 | Begin
|
---|
6842 | If Not Untitled Then SaveFile;
|
---|
6843 | FEventsCounter := FSaveEvents;
|
---|
6844 | End
|
---|
6845 | Else Dec(FEventsCounter);
|
---|
6846 | End;
|
---|
6847 |
|
---|
6848 |
|
---|
6849 | Procedure TEditor.SetSaveEvents(cnt:Integer);
|
---|
6850 | Begin
|
---|
6851 | FSaveEvents := cnt;
|
---|
6852 | FEventsCounter := cnt;
|
---|
6853 | End;
|
---|
6854 |
|
---|
6855 |
|
---|
6856 | Procedure TEditor.SetLastUndoGroup(ug:TUndoGroup);
|
---|
6857 | Var U:PUndo;
|
---|
6858 | Begin
|
---|
6859 | If FUndoList = Nil Then Exit;
|
---|
6860 | If FUndoList.Count = 0 Then Exit;
|
---|
6861 | U := FUndoList.Last;
|
---|
6862 | If U = Nil Then Exit;
|
---|
6863 | U^.EventType := ug;
|
---|
6864 | End;
|
---|
6865 |
|
---|
6866 |
|
---|
6867 | Function TEditor.GetLastUndoGroup:TUndoGroup;
|
---|
6868 | Var U:PUndo;
|
---|
6869 | Begin
|
---|
6870 | Result := ugNoGroup;
|
---|
6871 | If FUndoList = Nil Then Exit;
|
---|
6872 | If FUndoList.Count = 0 Then Exit;
|
---|
6873 | U := FUndoList.Last;
|
---|
6874 | If U = Nil Then Exit;
|
---|
6875 | Result := U^.EventType;
|
---|
6876 | End;
|
---|
6877 |
|
---|
6878 |
|
---|
6879 | Procedure TEditor.SetCtl3D(Value:Boolean);
|
---|
6880 | Begin
|
---|
6881 | If Value Then FBorderWidth := 2
|
---|
6882 | Else FBorderWidth := 1;
|
---|
6883 |
|
---|
6884 | If Handle <> 0 Then
|
---|
6885 | Begin
|
---|
6886 | CalcSizes;
|
---|
6887 | Invalidate;
|
---|
6888 | End;
|
---|
6889 | End;
|
---|
6890 |
|
---|
6891 |
|
---|
6892 | Procedure TEditor.SetColorEntry(ColorIndex:Integer;NewColor:TColor);
|
---|
6893 | Begin
|
---|
6894 | NewColor := SysColorToRGB(NewColor);
|
---|
6895 | {$IFDEF Win95}
|
---|
6896 | If NewColor = $00CCCCCC Then NewColor := clLtGray;
|
---|
6897 | {$ENDIF}
|
---|
6898 |
|
---|
6899 | Case ColorIndex Of
|
---|
6900 | fgcPlainText: PenColor := NewColor;
|
---|
6901 | bgcPlainText: color := NewColor;
|
---|
6902 | fgcMarkedBlock: FSelColor := NewColor;
|
---|
6903 | bgcMarkedBlock: FSelBackColor := NewColor;
|
---|
6904 | fgcSearchMatch: FFoundColor := NewColor;
|
---|
6905 | bgcSearchMatch: FFoundBackColor := NewColor;
|
---|
6906 | fgcRightMargin: FWrapLineColor := NewColor;
|
---|
6907 | Else Exit;
|
---|
6908 | End;
|
---|
6909 | If Not (ColorIndex In [fgcPlainText,bgcPlainText]) Then Invalidate;
|
---|
6910 | End;
|
---|
6911 |
|
---|
6912 |
|
---|
6913 | Function TEditor.GetColorEntry(ColorIndex:Integer):TColor;
|
---|
6914 | Begin
|
---|
6915 | Case ColorIndex Of
|
---|
6916 | fgcPlainText: Result := PenColor;
|
---|
6917 | bgcPlainText: Result := color;
|
---|
6918 | fgcMarkedBlock: Result := FSelColor;
|
---|
6919 | bgcMarkedBlock: Result := FSelBackColor;
|
---|
6920 | fgcSearchMatch: Result := FFoundColor;
|
---|
6921 | bgcSearchMatch: Result := FFoundBackColor;
|
---|
6922 | fgcRightMargin: Result := FWrapLineColor;
|
---|
6923 | Else Result := color;
|
---|
6924 | End;
|
---|
6925 | End;
|
---|
6926 |
|
---|
6927 |
|
---|
6928 | Function TEditor.InsertLine(Y:LongInt;Const S:String):LongInt;
|
---|
6929 | Var pl,NewL,SaveAL:PLine;
|
---|
6930 | Begin
|
---|
6931 | Result := -1;
|
---|
6932 | If ReadOnly Then Exit;
|
---|
6933 | TestAutoSave;
|
---|
6934 | FlushWorkLine;
|
---|
6935 | If Y < 1 Then Y := 1;
|
---|
6936 | If Y > FCountLines Then
|
---|
6937 | Begin
|
---|
6938 | Y := FCountLines +1;
|
---|
6939 | pl := FLastLine;
|
---|
6940 | End
|
---|
6941 | Else pl := _Index2PLine(Y-1);
|
---|
6942 | Result := Y;
|
---|
6943 |
|
---|
6944 | (*Undo*)
|
---|
6945 | If pl <> Nil Then _CopyUndoLines(pl,pl)
|
---|
6946 | Else _MoveUndoLines(FUndoList,pl,pl);
|
---|
6947 | (*Undo*)
|
---|
6948 |
|
---|
6949 | NewL := _InsertLine(pl);
|
---|
6950 | SaveAL := FActLine;
|
---|
6951 | FActLine := NewL;
|
---|
6952 | FWorkLine := S;
|
---|
6953 | _WriteWorkLine;
|
---|
6954 | FActLine := SaveAL;
|
---|
6955 |
|
---|
6956 | If Y <= FFileCursor.Y Then {Y before FCY}
|
---|
6957 | Begin
|
---|
6958 | If Y > FFileCursor.Y - FScrCursor.Y Then {Y within Screen}
|
---|
6959 | Begin
|
---|
6960 | If Y = FFileCursor.Y - FScrCursor.Y +1 Then FTopScreenLine := NewL;
|
---|
6961 |
|
---|
6962 | If FScrCursor.Y >= FWinSize.Y Then
|
---|
6963 | Begin
|
---|
6964 | Dec(FFileCursor.Y);
|
---|
6965 | FActLine := FActLine^.Prev;
|
---|
6966 | If Not _ICBPersistent Then _ICBClearICB;
|
---|
6967 | End
|
---|
6968 | Else Inc(FScrCursor.Y);
|
---|
6969 | End;
|
---|
6970 | Inc(FFileCursor.Y);
|
---|
6971 | End;
|
---|
6972 |
|
---|
6973 | _ICBSetMark;
|
---|
6974 | SetSliderValues;
|
---|
6975 | If NewL^.Prev = Nil Then UpdateLineColorFlag(NewL)
|
---|
6976 | Else SetLineColorFlag(NewL^.Prev,NewL);
|
---|
6977 |
|
---|
6978 | (*Undo*)
|
---|
6979 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(NewL^.Next));
|
---|
6980 | LastUndoGroup := ugInsertLine;
|
---|
6981 | (*Undo*)
|
---|
6982 | FRedoList.Clear;
|
---|
6983 |
|
---|
6984 | InvalidateEditor(0,0);
|
---|
6985 | End;
|
---|
6986 |
|
---|
6987 |
|
---|
6988 | Function TEditor.AppendLine(Const S:String):LongInt;
|
---|
6989 | Begin
|
---|
6990 | Result := InsertLine(FCountLines+1,S);
|
---|
6991 | End;
|
---|
6992 |
|
---|
6993 |
|
---|
6994 | Function TEditor.DeleteLine(Y:LongInt):LongInt;
|
---|
6995 | Var ip:TICBPosition;
|
---|
6996 | NextLine,prevline,ulcfline:PLine;
|
---|
6997 | SaveAL:PLine;
|
---|
6998 | Begin
|
---|
6999 | Result := -1;
|
---|
7000 | If ReadOnly Then Exit;
|
---|
7001 | FlushWorkLine;
|
---|
7002 | If Y < 1 Then Exit;
|
---|
7003 | If Y > FCountLines Then Exit;
|
---|
7004 | TestAutoSave;
|
---|
7005 | Result := Y;
|
---|
7006 |
|
---|
7007 | If FCountLines > 1 Then
|
---|
7008 | Begin
|
---|
7009 | SaveAL := FActLine;
|
---|
7010 | FActLine := _Index2PLine(Y);
|
---|
7011 | NextLine := FActLine^.Next;
|
---|
7012 | prevline := FActLine^.Prev;
|
---|
7013 | ip := _ICBPos(FActLine,0);
|
---|
7014 |
|
---|
7015 | (*Undo*)
|
---|
7016 | If prevline <> Nil Then _CopyUndoLines(prevline,FActLine)
|
---|
7017 | Else _CopyUndoLines(FActLine,FActLine);
|
---|
7018 | _UpdateLastUndoEvent(FUndoList,Y);
|
---|
7019 | _DeleteLine(FActLine);
|
---|
7020 | (*Undo*)
|
---|
7021 |
|
---|
7022 | SetSliderValues;
|
---|
7023 | WLactivated := False;
|
---|
7024 |
|
---|
7025 | If prevline = Nil Then ulcfline := FFirstLine
|
---|
7026 | Else ulcfline := prevline;
|
---|
7027 |
|
---|
7028 | If ip * [ipBeforeICBFirst,ipAfterICBFirst] <> [] Then
|
---|
7029 | Begin
|
---|
7030 | ICB.First.Line := NextLine;
|
---|
7031 | If FSelectMode <> smColumnBlock Then ICB.First.X := 1;
|
---|
7032 | End;
|
---|
7033 | If ip * [ipBeforeICBLast,ipAfterICBLast] <> [] Then
|
---|
7034 | Begin
|
---|
7035 | If NextLine <> Nil Then
|
---|
7036 | Begin
|
---|
7037 | ICB.Last.Line := NextLine;
|
---|
7038 | If FSelectMode <> smColumnBlock Then ICB.Last.X := 1;
|
---|
7039 | End
|
---|
7040 | Else
|
---|
7041 | Begin
|
---|
7042 | ICB.Last.Line := FLastLine;
|
---|
7043 | If FSelectMode <> smColumnBlock
|
---|
7044 | Then ICB.Last.X := StringLength;
|
---|
7045 | End;
|
---|
7046 | End;
|
---|
7047 |
|
---|
7048 | FActLine := SaveAL;
|
---|
7049 | If Y = FFileCursor.Y Then
|
---|
7050 | Begin
|
---|
7051 | If NextLine = Nil Then
|
---|
7052 | Begin
|
---|
7053 | FActLine := FLastLine;
|
---|
7054 | FFileCursor.Y := FCountLines;
|
---|
7055 | If FScrCursor.Y > 1 Then Dec(FScrCursor.Y);
|
---|
7056 | End
|
---|
7057 | Else FActLine := NextLine;
|
---|
7058 | End
|
---|
7059 | Else
|
---|
7060 | If Y < FFileCursor.Y Then
|
---|
7061 | Begin
|
---|
7062 | If Y > FFileCursor.Y - FScrCursor.Y Then Dec(FScrCursor.Y);
|
---|
7063 | Dec(FFileCursor.Y);
|
---|
7064 | End;
|
---|
7065 |
|
---|
7066 | FTopScreenLine := _Index2PLine(FFileCursor.Y - FScrCursor.Y +1);
|
---|
7067 | End
|
---|
7068 | Else
|
---|
7069 | Begin
|
---|
7070 | (*Undo*)
|
---|
7071 | _CopyUndoLines(FActLine,FActLine);
|
---|
7072 | If Not WLactivated Then _ReadWorkLine;
|
---|
7073 | (*Undo*)
|
---|
7074 | FWorkLine := '';
|
---|
7075 | _WriteWorkLine;
|
---|
7076 | ulcfline := FActLine;
|
---|
7077 | FFileCursor.X := 1;
|
---|
7078 | FScrCursor.X := 1;
|
---|
7079 | _ICBClearICB;
|
---|
7080 | End;
|
---|
7081 |
|
---|
7082 | _ICBCheckX;
|
---|
7083 | _ICBSetMark;
|
---|
7084 | UpdateLineColorFlag(ulcfline);
|
---|
7085 | Modified := True;
|
---|
7086 |
|
---|
7087 | (*Undo*)
|
---|
7088 | LastUndoGroup := ugDeleteLine;
|
---|
7089 | (*Undo*)
|
---|
7090 | FRedoList.Clear;
|
---|
7091 |
|
---|
7092 | InvalidateEditor(0,0);
|
---|
7093 | End;
|
---|
7094 |
|
---|
7095 |
|
---|
7096 | Function TEditor.ReplaceLine(Y:LongInt;Const S:String):LongInt;
|
---|
7097 | Var pl,SaveAL:PLine;
|
---|
7098 | Begin
|
---|
7099 | Result := -1;
|
---|
7100 | If ReadOnly Then Exit;
|
---|
7101 | FlushWorkLine;
|
---|
7102 | If Y < 1 Then Exit;
|
---|
7103 | If Y > FCountLines Then Exit;
|
---|
7104 | TestAutoSave;
|
---|
7105 | pl := _Index2PLine(Y);
|
---|
7106 | If pl = Nil Then Exit;
|
---|
7107 | Result := Y;
|
---|
7108 | (*Undo*)
|
---|
7109 | _CopyUndoLines(pl,pl);
|
---|
7110 | LastUndoGroup := ugReplaceLine;
|
---|
7111 | (*Undo*)
|
---|
7112 |
|
---|
7113 | SaveAL := FActLine;
|
---|
7114 | FActLine := pl;
|
---|
7115 | _ReadWorkLine;
|
---|
7116 | FWorkLine := S;
|
---|
7117 | _WriteWorkLine;
|
---|
7118 | FActLine := SaveAL;
|
---|
7119 |
|
---|
7120 | _ICBCheckX;
|
---|
7121 | FRedoList.Clear;
|
---|
7122 | Modified := True;
|
---|
7123 |
|
---|
7124 | InvalidateEditor(0,0);
|
---|
7125 | End;
|
---|
7126 |
|
---|
7127 |
|
---|
7128 | Procedure TEditor.ToggleInsertMode;
|
---|
7129 | Begin
|
---|
7130 | FInsertMode := Not FInsertMode;
|
---|
7131 | SetInsertMode(FInsertMode);
|
---|
7132 | End;
|
---|
7133 |
|
---|
7134 |
|
---|
7135 | Procedure TEditor.SetSelectionStart(P:TEditorPos);
|
---|
7136 | Begin
|
---|
7137 | If P.Y < 1 Then P.Y := 1;
|
---|
7138 | If P.Y > FCountLines Then P.Y := FCountLines;
|
---|
7139 | If P.X < 1 Then P.X := 1;
|
---|
7140 | If P.X > StringLength Then P.X := StringLength;
|
---|
7141 |
|
---|
7142 | _ICBSetBegin(_Index2PLine(P.Y), P.X);
|
---|
7143 | InvalidateEditor(0,0);
|
---|
7144 | End;
|
---|
7145 |
|
---|
7146 |
|
---|
7147 | Procedure TEditor.SetSelectionEnd(P:TEditorPos);
|
---|
7148 | Begin
|
---|
7149 | If P.Y < 1 Then P.Y := 1;
|
---|
7150 | If P.Y > FCountLines Then P.Y := FCountLines;
|
---|
7151 | If P.X < 1 Then P.X := 1;
|
---|
7152 | If P.X > StringLength Then P.X := StringLength;
|
---|
7153 |
|
---|
7154 | _ICBSetEnd(_Index2PLine(P.Y), P.X);
|
---|
7155 | InvalidateEditor(0,0);
|
---|
7156 | End;
|
---|
7157 |
|
---|
7158 |
|
---|
7159 | Function TEditor.GetSelectionStart(Var P:TEditorPos):Boolean;
|
---|
7160 | Begin
|
---|
7161 | Result := ICB.First.Line <> Nil;
|
---|
7162 | If Result Then
|
---|
7163 | Begin
|
---|
7164 | P.Y := _PLine2Index(ICB.First.Line);
|
---|
7165 | P.X := ICB.First.X;
|
---|
7166 | End
|
---|
7167 | Else P := FFileCursor;
|
---|
7168 | End;
|
---|
7169 |
|
---|
7170 |
|
---|
7171 | Function TEditor.GetSelectionEnd(Var P:TEditorPos):Boolean;
|
---|
7172 | Begin
|
---|
7173 | Result := ICB.Last.Line <> Nil;
|
---|
7174 | If Result Then
|
---|
7175 | Begin
|
---|
7176 | P.Y := _PLine2Index(ICB.Last.Line);
|
---|
7177 | P.X := ICB.Last.X;
|
---|
7178 | End
|
---|
7179 | Else P := FFileCursor;
|
---|
7180 | End;
|
---|
7181 |
|
---|
7182 |
|
---|
7183 | Procedure TEditor.SelectLine(P:TEditorPos);
|
---|
7184 | Var pl:PLine;
|
---|
7185 | Begin
|
---|
7186 | _ICBClearICB;
|
---|
7187 | pl := _Index2PLine(P.Y);
|
---|
7188 | If pl <> Nil Then
|
---|
7189 | Begin
|
---|
7190 | ICB.First.Line := pl;
|
---|
7191 | ICB.First.X := 1;
|
---|
7192 | If (pl^.Next = Nil) Or (FSelectMode = smColumnBlock) Then
|
---|
7193 | Begin
|
---|
7194 | ICB.Last.Line := pl;
|
---|
7195 | ICB.Last.X := Length(_PLine2PString(pl)^);
|
---|
7196 | Inc(ICB.Last.X);
|
---|
7197 | End
|
---|
7198 | Else
|
---|
7199 | Begin
|
---|
7200 | ICB.Last.Line := pl^.Next;
|
---|
7201 | ICB.Last.X := 1;
|
---|
7202 | End;
|
---|
7203 | _ICBCheckX;
|
---|
7204 | _ICBSetMark;
|
---|
7205 | ICBVisible := True;
|
---|
7206 | End;
|
---|
7207 | InvalidateEditor(0,0);
|
---|
7208 | End;
|
---|
7209 |
|
---|
7210 |
|
---|
7211 | Procedure TEditor.SelectWord(P:TEditorPos);
|
---|
7212 | Var FCX:Integer;
|
---|
7213 | pl:PLine;
|
---|
7214 | zk:PString;
|
---|
7215 | lzk:LongInt;
|
---|
7216 | Label L;
|
---|
7217 | Begin
|
---|
7218 | _ICBClearICB;
|
---|
7219 | pl := _Index2PLine(P.Y);
|
---|
7220 | If pl = Nil Then Goto L;
|
---|
7221 | zk := _PLine2PString(pl);
|
---|
7222 | FCX := P.X;
|
---|
7223 | lzk := Length(zk^);
|
---|
7224 | If P.X > lzk Then
|
---|
7225 | Begin
|
---|
7226 | If lzk = 0 Then Goto L;
|
---|
7227 | FCX := lzk;
|
---|
7228 | End;
|
---|
7229 |
|
---|
7230 | While (zk^[FCX-1] In NormalChars) And (FCX > 1) Do Dec(FCX);
|
---|
7231 | ICB.First.Line := pl;
|
---|
7232 | ICB.First.X := FCX;
|
---|
7233 |
|
---|
7234 | While (zk^[FCX] In NormalChars) And (FCX <= lzk) Do Inc(FCX);
|
---|
7235 | ICB.Last.Line := pl;
|
---|
7236 | ICB.Last.X := FCX;
|
---|
7237 |
|
---|
7238 | _ICBSetMark;
|
---|
7239 | ICBVisible := True;
|
---|
7240 | L:
|
---|
7241 | InvalidateEditor(0,0);
|
---|
7242 | End;
|
---|
7243 |
|
---|
7244 |
|
---|
7245 | Procedure TEditor.SelectAll;
|
---|
7246 | Var pl:PLine;
|
---|
7247 | I:LongInt;
|
---|
7248 | len:Integer;
|
---|
7249 | Begin
|
---|
7250 | ICB.First.Line := FFirstLine;
|
---|
7251 | ICB.First.X := 1;
|
---|
7252 | ICB.Last.Line := FLastLine;
|
---|
7253 | If FSelectMode = smColumnBlock Then
|
---|
7254 | Begin
|
---|
7255 | ICB.Last.X := 1;
|
---|
7256 | pl := FFirstLine;
|
---|
7257 | For I := 1 To CountLines Do
|
---|
7258 | Begin
|
---|
7259 | len := Length(_PLine2PString(pl)^);
|
---|
7260 | If len > ICB.Last.X Then ICB.Last.X := len;
|
---|
7261 | pl := pl^.Next;
|
---|
7262 | End;
|
---|
7263 | End
|
---|
7264 | Else ICB.Last.X := Length(_PLine2PString(FLastLine)^);
|
---|
7265 | Inc(ICB.Last.X);
|
---|
7266 | _ICBCheckX;
|
---|
7267 | _ICBSetMark;
|
---|
7268 | ICBVisible := True;
|
---|
7269 | InvalidateEditor(0,0);
|
---|
7270 | End;
|
---|
7271 |
|
---|
7272 |
|
---|
7273 | Procedure TEditor.DeselectAll;
|
---|
7274 | Begin
|
---|
7275 | _ICBClearICB;
|
---|
7276 | InvalidateEditor(0,0);
|
---|
7277 | End;
|
---|
7278 |
|
---|
7279 |
|
---|
7280 | Procedure TEditor.HideSelection;
|
---|
7281 | Begin
|
---|
7282 | ICBVisible := False;
|
---|
7283 | InvalidateEditor(0,0);
|
---|
7284 | UpdateEditorState;
|
---|
7285 | End;
|
---|
7286 |
|
---|
7287 |
|
---|
7288 | Procedure TEditor.ShowSelection;
|
---|
7289 | Begin
|
---|
7290 | ICBVisible := True;
|
---|
7291 | InvalidateEditor(0,0);
|
---|
7292 | UpdateEditorState;
|
---|
7293 | End;
|
---|
7294 |
|
---|
7295 |
|
---|
7296 | Procedure TEditor.DeleteSelection;
|
---|
7297 | Begin
|
---|
7298 | cmICBDeleteBlock;
|
---|
7299 | End;
|
---|
7300 |
|
---|
7301 |
|
---|
7302 | Function TEditor.SetBookMark(I:Byte; P:TEditorPos):Boolean;
|
---|
7303 | Var pl:PLine;
|
---|
7304 | BM:LongWord;
|
---|
7305 | Begin
|
---|
7306 | Result := False;
|
---|
7307 | If I > 9 Then Exit;
|
---|
7308 | Inc(I);
|
---|
7309 | If (P.X < 1) Or (P.X > StringLength) Then Exit;
|
---|
7310 | If (P.Y < 1) Or (P.Y > FCountLines) Then Exit;
|
---|
7311 | pl := _FindBookMark(I);
|
---|
7312 | BM := ciBookMarkMask;
|
---|
7313 | If pl <> Nil Then pl^.flag := pl^.flag And Not BM;
|
---|
7314 | pl := _Index2PLine(P.Y);
|
---|
7315 | If pl = Nil Then Exit;
|
---|
7316 | pl^.flag := pl^.flag And Not BM;
|
---|
7317 | BM := I * ciBookMark0;
|
---|
7318 | pl^.flag := pl^.flag Or BM;
|
---|
7319 | BookMarkX[I] := P.X;
|
---|
7320 | InvalidateEditor(0,0);
|
---|
7321 | Result := True;
|
---|
7322 | End;
|
---|
7323 |
|
---|
7324 |
|
---|
7325 | Function TEditor.GetBookMark(I:Byte;Var P:TEditorPos):Boolean;
|
---|
7326 | Var pl:PLine;
|
---|
7327 | Begin
|
---|
7328 | Result := False;
|
---|
7329 | If I > 9 Then Exit;
|
---|
7330 | Inc(I);
|
---|
7331 | pl := _FindBookMark(I);
|
---|
7332 | If pl = Nil Then Exit;
|
---|
7333 | P.Y := _PLine2Index(pl);
|
---|
7334 | P.X := BookMarkX[I];
|
---|
7335 | Result := True;
|
---|
7336 | End;
|
---|
7337 |
|
---|
7338 |
|
---|
7339 | Function TEditor.GotoBookMark(I:Byte):Boolean;
|
---|
7340 | Var P:TEditorPos;
|
---|
7341 | Begin
|
---|
7342 | Result := GetBookMark(I,P);
|
---|
7343 | If Result Then GotoPosition(P);
|
---|
7344 | End;
|
---|
7345 |
|
---|
7346 |
|
---|
7347 | Function TEditor.ClearBookMark(I:Byte):Boolean;
|
---|
7348 | Var pl:PLine;
|
---|
7349 | BM:LongWord;
|
---|
7350 | Begin
|
---|
7351 | Result := False;
|
---|
7352 | If I > 9 Then Exit;
|
---|
7353 | Inc(I);
|
---|
7354 | pl := _FindBookMark(I);
|
---|
7355 | If pl = Nil Then Exit;
|
---|
7356 | BM := ciBookMarkMask;
|
---|
7357 | pl^.flag := pl^.flag And Not BM;
|
---|
7358 | InvalidateEditor(0,0);
|
---|
7359 | Result := True;
|
---|
7360 | End;
|
---|
7361 |
|
---|
7362 |
|
---|
7363 | Function TEditor.ClearAllBookMarks:Boolean;
|
---|
7364 | Var pl:PLine;
|
---|
7365 | BM:LongWord;
|
---|
7366 | Begin
|
---|
7367 | BM := ciBookMarkMask;
|
---|
7368 | pl := FFirstLine;
|
---|
7369 | While pl <> Nil Do
|
---|
7370 | Begin
|
---|
7371 | pl^.flag := pl^.flag And Not BM;
|
---|
7372 | pl := pl^.Next;
|
---|
7373 | End;
|
---|
7374 | InvalidateEditor(0,0);
|
---|
7375 | Result := True;
|
---|
7376 | End;
|
---|
7377 |
|
---|
7378 |
|
---|
7379 | Procedure TEditor.GotoPosition(Pos:TEditorPos);
|
---|
7380 | Var iew:Boolean;
|
---|
7381 | Begin
|
---|
7382 | If Pos.Y < 1 Then Pos.Y := 1;
|
---|
7383 | If Pos.Y > FCountLines Then Pos.Y := FCountLines;
|
---|
7384 | If Pos.X < 1 Then Pos.X := 1;
|
---|
7385 | If Pos.X > StringLength Then Pos.X := StringLength;
|
---|
7386 | (*Undo*)
|
---|
7387 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
7388 | (*Undo*)
|
---|
7389 |
|
---|
7390 | iew := _GotoPosition(Pos);
|
---|
7391 | If Not _ICBPersistent Then iew := _ICBClearICB Or iew;
|
---|
7392 |
|
---|
7393 | If iew Then InvalidateEditor(0,0)
|
---|
7394 | Else SetScreenCursor;
|
---|
7395 | (*Undo*)
|
---|
7396 | LastUndoGroup := ugCursorMove;
|
---|
7397 | (*Undo*)
|
---|
7398 | End;
|
---|
7399 |
|
---|
7400 |
|
---|
7401 | Function TEditor.GetChar(P:TEditorPos):Char;
|
---|
7402 | Var zk:PString;
|
---|
7403 | pl:PLine;
|
---|
7404 | Begin
|
---|
7405 | Result := ' ';
|
---|
7406 | pl := _Index2PLine(P.Y);
|
---|
7407 | If pl = Nil Then Exit;
|
---|
7408 | zk := _PLine2PString(pl);
|
---|
7409 | If zk = Nil Then Exit;
|
---|
7410 | If P.X <= 0 Then P.X := 1;
|
---|
7411 | If Length(zk^) >= P.X Then Result := zk^[P.X];
|
---|
7412 | End;
|
---|
7413 |
|
---|
7414 |
|
---|
7415 | Function TEditor.GetWord(P:TEditorPos):String;
|
---|
7416 | Var Count:Integer;
|
---|
7417 | zk:PString;
|
---|
7418 | pl:PLine;
|
---|
7419 | lzk:LongInt;
|
---|
7420 | Begin
|
---|
7421 | Result := '';
|
---|
7422 | pl := _Index2PLine(P.Y);
|
---|
7423 | If pl = Nil Then Exit;
|
---|
7424 | zk := _PLine2PString(pl);
|
---|
7425 | If zk = Nil Then Exit;
|
---|
7426 | lzk := Length(zk^);
|
---|
7427 | If P.X > lzk Then P.X := lzk; {onto Last Char}
|
---|
7428 | If P.X <= 0 Then P.X := 1;
|
---|
7429 | While (zk^[P.X-1] In NormalChars) And (P.X > 1) Do Dec(P.X);
|
---|
7430 | Count := 0;
|
---|
7431 | While (zk^[P.X+Count] In NormalChars) And (P.X+Count <= lzk) Do Inc(Count);
|
---|
7432 | Result := Copy(zk^,P.X,Count);
|
---|
7433 | End;
|
---|
7434 |
|
---|
7435 |
|
---|
7436 | Function TEditor.GetTextAfterWord(P:TEditorPos):String;
|
---|
7437 | Var
|
---|
7438 | zk:PString;
|
---|
7439 | pl:PLine;
|
---|
7440 | lzk:LongInt;
|
---|
7441 | Begin
|
---|
7442 | Result := '';
|
---|
7443 | pl := _Index2PLine(P.Y);
|
---|
7444 | If pl = Nil Then Exit;
|
---|
7445 | zk := _PLine2PString(pl);
|
---|
7446 | lzk := Length(zk^);
|
---|
7447 | While (zk^[P.X] In NormalChars) And (P.X <= lzk) Do Inc(P.X);
|
---|
7448 | Result := Copy(zk^,P.X,StringLength);
|
---|
7449 | End;
|
---|
7450 |
|
---|
7451 |
|
---|
7452 | Function TEditor.GetText(Var P:Pointer; Var len:LongInt; Selected:Boolean):Boolean;
|
---|
7453 | Begin
|
---|
7454 | If Selected Then Result := _GetEditorBlock(P,len)
|
---|
7455 | Else Result := _GetEditorText(P,len);
|
---|
7456 | End;
|
---|
7457 |
|
---|
7458 |
|
---|
7459 | Procedure TEditor.InsertText(P:Pointer; len:LongInt);
|
---|
7460 | Var ActLineNext:PLine;
|
---|
7461 | Pos:TEditorPos;
|
---|
7462 | tlx:TLineX;
|
---|
7463 | Begin
|
---|
7464 | (*Undo*)
|
---|
7465 | _CopyUndoLines(FActLine,FActLine);
|
---|
7466 | ActLineNext := FActLine^.Next;
|
---|
7467 | (*Undo*)
|
---|
7468 |
|
---|
7469 | tlx := _InsertText(P,len, _ICBPersistent);
|
---|
7470 |
|
---|
7471 | (*Undo*)
|
---|
7472 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(ActLineNext));
|
---|
7473 | LastUndoGroup := ugNoGroup;
|
---|
7474 | (*Undo*)
|
---|
7475 |
|
---|
7476 | If Not _ICBPersistent Then // Goto End Of inserted block
|
---|
7477 | Begin
|
---|
7478 | Pos.X := tlx.X;
|
---|
7479 | Pos.Y := _PLine2Index(tlx.Line);
|
---|
7480 | If Pos.Y > 0 Then GotoPosition(Pos);
|
---|
7481 | End;
|
---|
7482 |
|
---|
7483 | FRedoList.Clear;
|
---|
7484 | InvalidateEditor(0,0);
|
---|
7485 | End;
|
---|
7486 |
|
---|
7487 |
|
---|
7488 | Function backpos(Const S:String; s1:String):Byte;
|
---|
7489 | Var I:Byte;
|
---|
7490 | Begin
|
---|
7491 | I := 0;
|
---|
7492 | Repeat
|
---|
7493 | Result := I;
|
---|
7494 | I := Pos(S,s1);
|
---|
7495 | s1[I] := #0;
|
---|
7496 | Until I = 0;
|
---|
7497 | End;
|
---|
7498 |
|
---|
7499 |
|
---|
7500 | Function TEditor.FindTextPos(Find:String; direct:TFindDirection;
|
---|
7501 | Origin:TFindOrigin; Scope:TFindScope;
|
---|
7502 | opt:TFindOptions; Var pt:TEditorPos):Boolean;
|
---|
7503 | Const EmptyChar:Char=#1;
|
---|
7504 | Var icbarea:TICB;
|
---|
7505 | pl1,pl2:PLine;
|
---|
7506 | m1,m2:Integer;
|
---|
7507 | S:String;
|
---|
7508 | Label again;
|
---|
7509 | Begin
|
---|
7510 | FlushWorkLine;
|
---|
7511 | Result := False;
|
---|
7512 | If Find = '' Then Exit;
|
---|
7513 | If Scope = fsGlobal Then
|
---|
7514 | Begin
|
---|
7515 | icbarea.First.Line := FFirstLine;
|
---|
7516 | icbarea.First.X := 1;
|
---|
7517 | icbarea.Last.Line := FLastLine;
|
---|
7518 | icbarea.Last.X := Length(FLastLine^.zk^);
|
---|
7519 | Inc(icbarea.Last.X);
|
---|
7520 | End
|
---|
7521 | Else icbarea := ICB;
|
---|
7522 |
|
---|
7523 | If (icbarea.First.Line = Nil) Or (icbarea.Last.Line = Nil) Then Exit;
|
---|
7524 |
|
---|
7525 | If opt * [foCaseSensitive] = [] Then Find := AnsiUpperCase(Find);
|
---|
7526 |
|
---|
7527 | If direct = fdForward Then
|
---|
7528 | Begin
|
---|
7529 | If Origin = foCursor Then
|
---|
7530 | Begin
|
---|
7531 | m1 := _PLine2Index(icbarea.First.Line);
|
---|
7532 | m2 := _PLine2Index(icbarea.Last.Line);
|
---|
7533 | If FFileCursor.Y > m2 Then Exit;
|
---|
7534 | If (FFileCursor.Y = m2) And (FFileCursor.X >= icbarea.Last.X) Then Exit;
|
---|
7535 | If FFileCursor.Y > m1 Then icbarea.First := _ICBActPos;
|
---|
7536 | If (FFileCursor.Y = m1) And (FFileCursor.X > icbarea.First.X)
|
---|
7537 | Then icbarea.First.X := FFileCursor.X;
|
---|
7538 | End;
|
---|
7539 | pl1 := icbarea.First.Line;
|
---|
7540 | pl2 := icbarea.Last.Line^.Next;
|
---|
7541 | End
|
---|
7542 | Else
|
---|
7543 | Begin
|
---|
7544 | If Origin = foCursor Then
|
---|
7545 | Begin
|
---|
7546 | m1 := _PLine2Index(icbarea.First.Line);
|
---|
7547 | m2 := _PLine2Index(icbarea.Last.Line);
|
---|
7548 | If FFileCursor.Y < m1 Then Exit;
|
---|
7549 | If (FFileCursor.Y = m1) And (FFileCursor.X < icbarea.First.X) Then Exit;
|
---|
7550 | If FFileCursor.Y < m2 Then icbarea.Last := _ICBActPos;
|
---|
7551 | If (FFileCursor.Y = m2) And (FFileCursor.X < icbarea.Last.X)
|
---|
7552 | Then icbarea.Last.X := FFileCursor.X;
|
---|
7553 | End;
|
---|
7554 | pl1 := icbarea.Last.Line;
|
---|
7555 | pl2 := icbarea.First.Line^.Prev;
|
---|
7556 | End;
|
---|
7557 |
|
---|
7558 | Result := True;
|
---|
7559 | While (pl1 <> Nil) And (pl1 <> pl2) Do
|
---|
7560 | Begin
|
---|
7561 | S := pl1^.zk^;
|
---|
7562 | If (Scope = fsGlobal) Or (FSelectMode <> smColumnBlock) Then
|
---|
7563 | Begin
|
---|
7564 | If pl1 = icbarea.First.Line
|
---|
7565 | Then FillChar(S[1],icbarea.First.X-1, EmptyChar); {NoANSI}
|
---|
7566 | If pl1 = icbarea.Last.Line
|
---|
7567 | Then FillChar(S[icbarea.Last.X], Length(S)-icbarea.Last.X+1, EmptyChar);
|
---|
7568 | End
|
---|
7569 | Else {Extended Selection And ICB Search}
|
---|
7570 | Begin
|
---|
7571 | FillChar(S[1],icbarea.First.X-1, EmptyChar); {NoANSI}
|
---|
7572 | If Length(S) >= icbarea.Last.X
|
---|
7573 | Then FillChar(S[icbarea.Last.X], Length(S)-icbarea.Last.X+1, EmptyChar);
|
---|
7574 | End;
|
---|
7575 |
|
---|
7576 | If opt * [foCaseSensitive] = [] Then S := AnsiUpperCase(S);
|
---|
7577 | again:
|
---|
7578 | If direct = fdForward Then pt.X := Pos(Find,S)
|
---|
7579 | Else pt.X := backpos(Find,S);
|
---|
7580 |
|
---|
7581 | If opt * [foWordsOnly] <> [] Then CheckWordsOnly(pl1,pt.X,Find);
|
---|
7582 |
|
---|
7583 | If pt.X > 0 Then
|
---|
7584 | Begin
|
---|
7585 | pt.Y := _PLine2Index(pl1);
|
---|
7586 | Exit;
|
---|
7587 | End;
|
---|
7588 | If pt.X < 0 Then
|
---|
7589 | Begin
|
---|
7590 | S[Abs(pt.X)] := EmptyChar;
|
---|
7591 | Goto again;
|
---|
7592 | End;
|
---|
7593 |
|
---|
7594 | If direct = fdForward Then pl1 := pl1^.Next
|
---|
7595 | Else pl1 := pl1^.Prev;
|
---|
7596 | End;
|
---|
7597 | Result := False;
|
---|
7598 | End;
|
---|
7599 |
|
---|
7600 |
|
---|
7601 | Procedure TEditor.FindTextDlg;
|
---|
7602 | Begin
|
---|
7603 | cmFindText;
|
---|
7604 | End;
|
---|
7605 |
|
---|
7606 |
|
---|
7607 | Function TEditor.FindText(Const Find:String; direct:TFindDirection;
|
---|
7608 | Origin:TFindOrigin; Scope:TFindScope;
|
---|
7609 | opt:TFindOptions):Boolean;
|
---|
7610 | Var pt:TEditorPos;
|
---|
7611 | iew:Boolean;
|
---|
7612 | Begin
|
---|
7613 | If FindTextPos(Find,direct,Origin,Scope,opt, pt) Then
|
---|
7614 | Begin
|
---|
7615 | (*Undo*)
|
---|
7616 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
7617 | (*Undo*)
|
---|
7618 | FindICB.First.Line := _Index2PLine(pt.Y);
|
---|
7619 | FindICB.First.X := pt.X;
|
---|
7620 | FindICB.Last := FindICB.First;
|
---|
7621 | Inc(FindICB.Last.X,Length(Find));
|
---|
7622 | If direct = fdForward Then pt.X := FindICB.Last.X;
|
---|
7623 | If FLastFind = faIncSearch Then pt.X := FindICB.First.X;
|
---|
7624 |
|
---|
7625 | iew := _GotoPosition(pt) Or _ICBExist;
|
---|
7626 | If iew Then InvalidateEditor(0,0)
|
---|
7627 | Else InvalidateWorkLine;
|
---|
7628 | (*Undo*)
|
---|
7629 | LastUndoGroup := ugCursorMove;
|
---|
7630 | (*Undo*)
|
---|
7631 | Result := True;
|
---|
7632 | End
|
---|
7633 | Else
|
---|
7634 | Begin
|
---|
7635 | If FLastFind <> faIncSearch
|
---|
7636 | Then SetErrorMessage(FmtLoadNLSStr(SSearchStringNotFound,[Find])+'.');
|
---|
7637 | Result := False;
|
---|
7638 | End;
|
---|
7639 | FLastFind := faFind;
|
---|
7640 | End;
|
---|
7641 |
|
---|
7642 |
|
---|
7643 | Procedure TEditor.ReplaceTextDlg;
|
---|
7644 | Begin
|
---|
7645 | cmReplaceText;
|
---|
7646 | End;
|
---|
7647 |
|
---|
7648 |
|
---|
7649 | Function TEditor.ReplaceText(Const Find,replace:String; direct:TFindDirection;
|
---|
7650 | Origin:TFindOrigin; Scope:TFindScope; opt:TFindOptions;
|
---|
7651 | Confirm:Boolean; replaceall:Boolean):Boolean;
|
---|
7652 | Var Contin:Boolean;
|
---|
7653 | found1:Boolean;
|
---|
7654 | found:Boolean;
|
---|
7655 | Repl:Boolean;
|
---|
7656 | iew:Boolean;
|
---|
7657 | pt,ptsave:TEditorPos;
|
---|
7658 | resp:TMsgDlgReturn;
|
---|
7659 | lastFCX:LongInt;
|
---|
7660 | Begin
|
---|
7661 | Result := False;
|
---|
7662 | If ReadOnly Then Exit;
|
---|
7663 | TestAutoSave;
|
---|
7664 | Contin := True;
|
---|
7665 | found1 := False;
|
---|
7666 |
|
---|
7667 | While Contin Do
|
---|
7668 | Begin
|
---|
7669 | found := FindTextPos(Find,direct,Origin,Scope,opt, pt);
|
---|
7670 | If found Then
|
---|
7671 | Begin
|
---|
7672 | (*Undo*)
|
---|
7673 | If LastUndoGroup <> ugCursorMove Then _StoreUndoCursor(FUndoList);
|
---|
7674 | (*Undo*)
|
---|
7675 | found1 := True;
|
---|
7676 | ptsave := pt;
|
---|
7677 | FindICB.First.Line := _Index2PLine(pt.Y);
|
---|
7678 | FindICB.First.X := pt.X;
|
---|
7679 | FindICB.Last := FindICB.First;
|
---|
7680 | Inc(FindICB.Last.X,Length(Find));
|
---|
7681 | If direct = fdForward Then pt.X := FindICB.Last.X;
|
---|
7682 |
|
---|
7683 | iew := _GotoPosition(pt) Or _ICBExist;
|
---|
7684 | If iew Or Confirm Then InvalidateEditor(0,0)
|
---|
7685 | Else InvalidateWorkLine;
|
---|
7686 | (*Undo*)
|
---|
7687 | LastUndoGroup := ugCursorMove;
|
---|
7688 | (*Undo*)
|
---|
7689 | If Confirm Then
|
---|
7690 | Begin
|
---|
7691 | resp := SetReplaceConfirmMessage;
|
---|
7692 | Repl := False;
|
---|
7693 | Case resp Of
|
---|
7694 | mrYes: Repl := True;
|
---|
7695 | mrCancel: found := False;
|
---|
7696 | End;
|
---|
7697 | End
|
---|
7698 | Else Repl := True;
|
---|
7699 |
|
---|
7700 | lastFCX := FFileCursor.X;
|
---|
7701 | If Repl Then
|
---|
7702 | Begin
|
---|
7703 | (*Undo*)
|
---|
7704 | _CopyUndoLines(FActLine,FActLine);
|
---|
7705 | (*Undo*)
|
---|
7706 | _DeleteString(ptsave.X,Length(Find));
|
---|
7707 | If Not _InsertString(ptsave.X,replace) Then Beep(1000,10);
|
---|
7708 |
|
---|
7709 | _HorizMove;
|
---|
7710 | FindICB.Last.X := ptsave.X + Length(replace);
|
---|
7711 | If direct = fdForward Then FFileCursor.X := FindICB.Last.X;
|
---|
7712 | If FFileCursor.X > FWinSize.X Then FScrCursor.X := FWinSize.X
|
---|
7713 | Else FScrCursor.X := FFileCursor.X;
|
---|
7714 | lastFCX := FFileCursor.X;
|
---|
7715 |
|
---|
7716 | FRedoList.Clear;
|
---|
7717 | If _HorizMove Then
|
---|
7718 | Begin
|
---|
7719 | UpdateLineColorFlag(FActLine);
|
---|
7720 | InvalidateEditor(0,0);
|
---|
7721 | End
|
---|
7722 | Else InvalidateWorkLine;
|
---|
7723 | (*Undo*)
|
---|
7724 | _StoreUndoCursor(FUndoList);
|
---|
7725 | (*Undo*)
|
---|
7726 | End;
|
---|
7727 | End
|
---|
7728 | Else
|
---|
7729 | If Not found1 Then SetErrorMessage(FmtLoadNLSStr(SSearchStringNotFound,[Find])+'.');
|
---|
7730 | Origin := foCursor;
|
---|
7731 | Contin := replaceall And found;
|
---|
7732 |
|
---|
7733 | If Contin And (lastFCX > StringLength) Then {prevent endless LOOP}
|
---|
7734 | If FFileCursor.Y < FCountLines Then
|
---|
7735 | Begin
|
---|
7736 | GotoPosition(EditorPos(FFileCursor.Y+1,1));
|
---|
7737 | End;
|
---|
7738 |
|
---|
7739 | Application.ProcessMessages;
|
---|
7740 | End;
|
---|
7741 | Result := found1;
|
---|
7742 | FLastFind := faReplace;
|
---|
7743 | End;
|
---|
7744 |
|
---|
7745 |
|
---|
7746 | Procedure TEditor.cmFindText;
|
---|
7747 | Var Dialog:TFindDialog;
|
---|
7748 | Begin
|
---|
7749 | Dialog.Create(Application.MainForm);
|
---|
7750 |
|
---|
7751 | Dialog.FindText := FFindReplace.Find;
|
---|
7752 | Dialog.Options := FFindReplace.Options;
|
---|
7753 | Dialog.Origin := FFindReplace.Origin;
|
---|
7754 | Dialog.Scope := FFindReplace.Scope;
|
---|
7755 | Dialog.Direction := FFindReplace.Direction;
|
---|
7756 |
|
---|
7757 | Dialog.ShowModal;
|
---|
7758 |
|
---|
7759 | If Dialog.ModalResult = cmOk Then
|
---|
7760 | Begin
|
---|
7761 | FFindReplace.Find := Dialog.FindText;
|
---|
7762 | FFindReplace.Options := Dialog.Options;
|
---|
7763 | FFindReplace.Origin := Dialog.Origin;
|
---|
7764 | FFindReplace.Scope := Dialog.Scope;
|
---|
7765 | FFindReplace.Direction := Dialog.Direction;
|
---|
7766 |
|
---|
7767 | Dialog.Destroy;
|
---|
7768 | Update;
|
---|
7769 | With FFindReplace Do FindText(Find,Direction,Origin,Scope,Options);
|
---|
7770 | End
|
---|
7771 | Else Dialog.Destroy;
|
---|
7772 | End;
|
---|
7773 |
|
---|
7774 |
|
---|
7775 | Procedure TEditor.cmReplaceText;
|
---|
7776 | Var Dialog:TReplaceDialog;
|
---|
7777 | Begin
|
---|
7778 | Dialog.Create(Application.MainForm);
|
---|
7779 |
|
---|
7780 | Dialog.FindText := FFindReplace.Find;
|
---|
7781 | Dialog.ReplaceText := FFindReplace.replace;
|
---|
7782 | Dialog.Options := FFindReplace.Options;
|
---|
7783 | Dialog.Confirm := FFindReplace.Confirm;
|
---|
7784 | Dialog.Origin := FFindReplace.Origin;
|
---|
7785 | Dialog.Scope := FFindReplace.Scope;
|
---|
7786 | Dialog.Direction := FFindReplace.Direction;
|
---|
7787 |
|
---|
7788 | Dialog.ShowModal;
|
---|
7789 |
|
---|
7790 | If Dialog.ModalResult In [cmOk,cmAll] Then
|
---|
7791 | Begin
|
---|
7792 | FFindReplace.Find := Dialog.FindText;
|
---|
7793 | FFindReplace.replace := Dialog.ReplaceText;
|
---|
7794 | FFindReplace.Options := Dialog.Options;
|
---|
7795 | FFindReplace.Confirm := Dialog.Confirm;
|
---|
7796 | FFindReplace.Origin := Dialog.Origin;
|
---|
7797 | FFindReplace.Scope := Dialog.Scope;
|
---|
7798 | FFindReplace.Direction := Dialog.Direction;
|
---|
7799 | FFindReplace.replall := Dialog.ModalResult = cmAll;
|
---|
7800 |
|
---|
7801 | Dialog.Destroy;
|
---|
7802 | Update;
|
---|
7803 | With FFindReplace Do ReplaceText(Find,replace,Direction,Origin,
|
---|
7804 | Scope,Options,Confirm,replall);
|
---|
7805 | End
|
---|
7806 | Else Dialog.Destroy;
|
---|
7807 | End;
|
---|
7808 |
|
---|
7809 | Procedure TEditor.SearchTextAgain;
|
---|
7810 | Begin
|
---|
7811 | cmSearchTextAgain;
|
---|
7812 | End;
|
---|
7813 |
|
---|
7814 | Procedure TEditor.cmSearchTextAgain;
|
---|
7815 | Begin
|
---|
7816 | If FLastFind = faReplace Then
|
---|
7817 | Begin
|
---|
7818 | With FFindReplace
|
---|
7819 | Do ReplaceText(Find,replace,Direction,foCursor,
|
---|
7820 | Scope,Options,Confirm,replall);
|
---|
7821 | End;
|
---|
7822 |
|
---|
7823 | If FLastFind = faFind Then
|
---|
7824 | Begin
|
---|
7825 | With FFindReplace
|
---|
7826 | Do FindText(Find,Direction,foCursor,Scope,Options);
|
---|
7827 | End;
|
---|
7828 | End;
|
---|
7829 |
|
---|
7830 |
|
---|
7831 | Procedure TEditor.cmIncrementalSearch;
|
---|
7832 | Var FC:TEditorPos;
|
---|
7833 | pp:^TEditorPos;
|
---|
7834 | Begin
|
---|
7835 | If IncSearchText <> '' Then
|
---|
7836 | Begin
|
---|
7837 | FC := FFileCursor;
|
---|
7838 | If FindText(IncSearchText,FFindReplace.Direction,foCursor,
|
---|
7839 | fsGlobal,FFindReplace.Options) Then
|
---|
7840 | Begin
|
---|
7841 | New(pp);
|
---|
7842 | pp^ := FC;
|
---|
7843 | IncSearchList.Insert(0,pp);
|
---|
7844 | End
|
---|
7845 | Else
|
---|
7846 | Begin
|
---|
7847 | Delete(IncSearchText,Length(IncSearchText),1);
|
---|
7848 | FLastFind := faIncSearch;
|
---|
7849 | FindText(IncSearchText,FFindReplace.Direction,foCursor,
|
---|
7850 | fsGlobal,FFindReplace.Options);
|
---|
7851 | End;
|
---|
7852 | End
|
---|
7853 | Else
|
---|
7854 | Begin
|
---|
7855 | If FLastFind <> faIncSearch Then FOldCaption := Caption;
|
---|
7856 | _ICBClearICB;
|
---|
7857 | InvalidateEditor(0,0);
|
---|
7858 | IncSearchList.Clear;
|
---|
7859 | End;
|
---|
7860 | SetIncSearchText(LoadNLSStr(SSearch)+': '+ IncSearchText);
|
---|
7861 | FLastFind := faIncSearch;
|
---|
7862 | End;
|
---|
7863 |
|
---|
7864 |
|
---|
7865 | Procedure TEditor.SetIncSearchText(S:String);
|
---|
7866 | Var I:Integer;
|
---|
7867 | pp:^TEditorPos;
|
---|
7868 | Begin
|
---|
7869 | If S = '' Then
|
---|
7870 | Begin
|
---|
7871 | For I := IncSearchList.Count-1 DownTo 0 Do
|
---|
7872 | Begin
|
---|
7873 | pp := IncSearchList.Items[I];
|
---|
7874 | Dispose(pp);
|
---|
7875 | End;
|
---|
7876 | IncSearchList.Clear;
|
---|
7877 | {restore old Caption}
|
---|
7878 | S := FOldCaption;
|
---|
7879 | End;
|
---|
7880 | Caption := S;
|
---|
7881 | End;
|
---|
7882 |
|
---|
7883 |
|
---|
7884 | Procedure TEditor.cmRecordMacro;
|
---|
7885 | Begin
|
---|
7886 | If FPlaying Then Exit;
|
---|
7887 |
|
---|
7888 | If Not FRecording Then
|
---|
7889 | Begin
|
---|
7890 | If FMacroList = Nil Then FMacroList.Create;
|
---|
7891 | FMacroList.Clear;
|
---|
7892 | FRecording := True;
|
---|
7893 | End
|
---|
7894 | Else FRecording := False;
|
---|
7895 | End;
|
---|
7896 |
|
---|
7897 |
|
---|
7898 | Procedure TEditor.cmPlayMacro;
|
---|
7899 | Var I:LongInt;
|
---|
7900 | scan:TKeyCode;
|
---|
7901 | REP:Byte;
|
---|
7902 | Begin
|
---|
7903 | If FPlaying Then Exit;
|
---|
7904 | If FRecording Then Exit;
|
---|
7905 | If FMacroList = Nil Then Exit;
|
---|
7906 |
|
---|
7907 | FPlaying := True;
|
---|
7908 | BeginUpdate;
|
---|
7909 | For I := 0 To FMacroList.Count-1 Do
|
---|
7910 | Begin
|
---|
7911 | scan := TKeyCode(FMacroList.Items[I]);
|
---|
7912 | Inc(I);
|
---|
7913 | REP := Byte(FMacroList.Items[I]);
|
---|
7914 | If scan < kb_VK Then CharEvent(Char(scan),REP)
|
---|
7915 | Else ScanEvent(scan,REP);
|
---|
7916 | End;
|
---|
7917 | FPlaying := False;
|
---|
7918 | EndUpdate;
|
---|
7919 | End;
|
---|
7920 |
|
---|
7921 |
|
---|
7922 | Procedure TEditor.Undo;
|
---|
7923 | Var U:PUndo;
|
---|
7924 | CL:LongInt;
|
---|
7925 | fl,LL:PLine;
|
---|
7926 | FFL,LFL:PLine;
|
---|
7927 | LastType:TUndoGroup;
|
---|
7928 | Begin
|
---|
7929 | If ReadOnly Then Exit;
|
---|
7930 | If FUndoList.Count = 0 Then
|
---|
7931 | Begin
|
---|
7932 | UpdateEditorState;
|
---|
7933 | Exit;
|
---|
7934 | End;
|
---|
7935 | _ICBClearMark;
|
---|
7936 |
|
---|
7937 | While FUndoList.Count > 0 Do
|
---|
7938 | Begin
|
---|
7939 | TestAutoSave;
|
---|
7940 |
|
---|
7941 | U := FUndoList.Last;
|
---|
7942 | If U = Nil Then
|
---|
7943 | Begin
|
---|
7944 | FUndoList.Delete(FUndoList.Count-1); {Delete Last event}
|
---|
7945 | break;
|
---|
7946 | End;
|
---|
7947 | LastType := U^.EventType;
|
---|
7948 |
|
---|
7949 | If U^.Memory Then
|
---|
7950 | Begin {save into Redo stack}
|
---|
7951 | fl := _Index2PLine(U^.FrameBegin+1);
|
---|
7952 | If U^.FrameEnd = 0 Then LL := FLastLine
|
---|
7953 | Else LL := _Index2PLine(U^.FrameEnd-1);
|
---|
7954 | CL := _MoveUndoLines(FRedoList,fl,LL);
|
---|
7955 | FFL := fl^.Prev;
|
---|
7956 | If LL <> Nil Then LFL := LL^.Next
|
---|
7957 | Else LFL := FFirstLine;
|
---|
7958 |
|
---|
7959 | If U^.Lines > 0 Then
|
---|
7960 | Begin
|
---|
7961 | _Connect(FFL,U^.FirstUndoLine);
|
---|
7962 | _Connect(U^.LastUndoLine,LFL);
|
---|
7963 | End
|
---|
7964 | Else _Connect(FFL,LFL);
|
---|
7965 | SetLineColorFlag(FFL,LFL);
|
---|
7966 |
|
---|
7967 | _UpdateLastUndoEvent(FRedoList,_PLine2Index(LFL));
|
---|
7968 | U^.Memory := False; {don't Free the Lines}
|
---|
7969 |
|
---|
7970 | Inc(FCountLines,U^.Lines);
|
---|
7971 | Dec(FCountLines,CL);
|
---|
7972 | End
|
---|
7973 | Else _StoreUndoCursor(FRedoList); {only Cursor event}
|
---|
7974 |
|
---|
7975 | ICB.First.Line := _Index2PLine(U^.ICBFL);
|
---|
7976 | ICB.First.X := U^.ICBFX;
|
---|
7977 | ICB.Last.Line := _Index2PLine(U^.ICBLL);
|
---|
7978 | ICB.Last.X := U^.ICBLX;
|
---|
7979 | Modified := U^.Modified;
|
---|
7980 | _GotoPosition(U^.FFileCursor);
|
---|
7981 | FUndoList.Delete(FUndoList.Count-1); {Delete Last event}
|
---|
7982 |
|
---|
7983 | If LastType <> ugGroup Then
|
---|
7984 | Begin
|
---|
7985 | If FEditOpt * [eoUndoGroups] = [] Then break;
|
---|
7986 | If LastType <> LastUndoGroup Then break;
|
---|
7987 | If LastType = ugNoGroup Then break;
|
---|
7988 | End; {Else group Events everytime}
|
---|
7989 | End;
|
---|
7990 | _ICBSetMark;
|
---|
7991 | InvalidateEditor(0,0);
|
---|
7992 | SetSliderValues;
|
---|
7993 | End;
|
---|
7994 |
|
---|
7995 |
|
---|
7996 | Procedure TEditor.Redo;
|
---|
7997 | Var U:PUndo;
|
---|
7998 | CL:LongInt;
|
---|
7999 | fl,LL:PLine;
|
---|
8000 | FFL,LFL:PLine;
|
---|
8001 | Begin
|
---|
8002 | If ReadOnly Then Exit;
|
---|
8003 | If FRedoList.Count = 0 Then
|
---|
8004 | Begin
|
---|
8005 | UpdateEditorState;
|
---|
8006 | Exit;
|
---|
8007 | End;
|
---|
8008 |
|
---|
8009 | U := FRedoList.Last;
|
---|
8010 | If U = Nil Then
|
---|
8011 | Begin
|
---|
8012 | FRedoList.Delete(FRedoList.Count-1); {Delete Last event}
|
---|
8013 | Exit;
|
---|
8014 | End;
|
---|
8015 |
|
---|
8016 | _ICBClearMark;
|
---|
8017 | TestAutoSave;
|
---|
8018 |
|
---|
8019 | If U^.Memory Then
|
---|
8020 | Begin {save into Undo stack}
|
---|
8021 | fl := _Index2PLine(U^.FrameBegin+1);
|
---|
8022 | If U^.FrameEnd = 0 Then LL := FLastLine
|
---|
8023 | Else LL := _Index2PLine(U^.FrameEnd-1);
|
---|
8024 | CL := _MoveUndoLines(FUndoList,fl,LL);
|
---|
8025 | FFL := fl^.Prev;
|
---|
8026 | If LL <> Nil Then LFL := LL^.Next
|
---|
8027 | Else LFL := FFirstLine;
|
---|
8028 |
|
---|
8029 | If U^.Lines > 0 Then
|
---|
8030 | Begin
|
---|
8031 | _Connect(FFL,U^.FirstUndoLine);
|
---|
8032 | _Connect(U^.LastUndoLine,LFL);
|
---|
8033 | End
|
---|
8034 | Else _Connect(FFL,LFL);
|
---|
8035 | SetLineColorFlag(FFL,LFL);
|
---|
8036 |
|
---|
8037 | _UpdateLastUndoEvent(FUndoList,_PLine2Index(LFL));
|
---|
8038 | U^.Memory := False; {don't Free the Lines}
|
---|
8039 |
|
---|
8040 | Inc(FCountLines,U^.Lines);
|
---|
8041 | Dec(FCountLines,CL);
|
---|
8042 | End
|
---|
8043 | Else _StoreUndoCursor(FUndoList); {only Cursor event}
|
---|
8044 |
|
---|
8045 | ICB.First.Line := _Index2PLine(U^.ICBFL);
|
---|
8046 | ICB.First.X := U^.ICBFX;
|
---|
8047 | ICB.Last.Line := _Index2PLine(U^.ICBLL);
|
---|
8048 | ICB.Last.X := U^.ICBLX;
|
---|
8049 | _ICBSetMark;
|
---|
8050 | Modified := U^.Modified;
|
---|
8051 | _GotoPosition(U^.FFileCursor);
|
---|
8052 | FRedoList.Delete(FRedoList.Count-1); {Delete Last event}
|
---|
8053 | InvalidateEditor(0,0);
|
---|
8054 | SetSliderValues;
|
---|
8055 | End;
|
---|
8056 |
|
---|
8057 |
|
---|
8058 | Procedure TEditor.ClearUndo;
|
---|
8059 | Begin
|
---|
8060 | FUndoList.Clear;
|
---|
8061 | End;
|
---|
8062 |
|
---|
8063 |
|
---|
8064 | Procedure TEditor.ClearRedo;
|
---|
8065 | Begin
|
---|
8066 | FRedoList.Clear;
|
---|
8067 | End;
|
---|
8068 |
|
---|
8069 |
|
---|
8070 | { drag & drop }
|
---|
8071 |
|
---|
8072 | Function GetTempFileName:String;
|
---|
8073 | Var Hour,Minute,Second,Sec100:Word;
|
---|
8074 | S,dir:String;
|
---|
8075 | Begin
|
---|
8076 | If GetTime(Hour,Minute,Second,Sec100) = 0 Then
|
---|
8077 | Begin
|
---|
8078 | S := 'd'+ tostr(Minute)+tostr(Second)+tostr(Sec100) +'.tmp';
|
---|
8079 | End
|
---|
8080 | Else S := 'drag0001.tmp';
|
---|
8081 |
|
---|
8082 | dir := GetEnv('TMP');
|
---|
8083 | If dir = '' Then dir := GetEnv('TEMP');
|
---|
8084 | If dir = '' Then
|
---|
8085 | Begin
|
---|
8086 | {$I-}
|
---|
8087 | GetDir(0,dir);
|
---|
8088 | {$I+}
|
---|
8089 | End;
|
---|
8090 | If dir[Length(dir)] <> '\' Then dir := dir + '\';
|
---|
8091 | Result := dir + S;
|
---|
8092 | End;
|
---|
8093 |
|
---|
8094 |
|
---|
8095 | Procedure TEditor.CanDrag(X,Y:LongInt;Var Accept:Boolean);
|
---|
8096 | Begin
|
---|
8097 | Accept := Selected; {drag only If Selection Is available}
|
---|
8098 | Inherited CanDrag(X,Y,Accept); {call event handler}
|
---|
8099 | End;
|
---|
8100 |
|
---|
8101 |
|
---|
8102 | Procedure TEditor.DoStartDrag(Var DragData:TDragDropData);
|
---|
8103 | Var P:Pointer;
|
---|
8104 | len:LongInt;
|
---|
8105 | utF:File;
|
---|
8106 | dir,Name,ext:String;
|
---|
8107 | Begin
|
---|
8108 | Inherited DoStartDrag(DragData);
|
---|
8109 |
|
---|
8110 | If Not _GetEditorBlock(P,len) Then Exit;
|
---|
8111 |
|
---|
8112 | FTempFileName := GetTempFileName;
|
---|
8113 | System.Assign(utF,FTempFileName);
|
---|
8114 | {$I-}
|
---|
8115 | Rewrite(utF,1);
|
---|
8116 | If InOutRes <> 0 Then
|
---|
8117 | Begin
|
---|
8118 | FTempFileName := 'drag0001.tmp';
|
---|
8119 | System.Assign(utF,FTempFileName);
|
---|
8120 | Rewrite(utF,1);
|
---|
8121 | End;
|
---|
8122 |
|
---|
8123 | If InOutRes = 0 Then
|
---|
8124 | Begin
|
---|
8125 | BlockWrite(utF,P^,len-1); {without #0}
|
---|
8126 | If InOutRes <> 0 Then SetErrorMessage(LoadNLSStr(SErrorWritingTemporaryFile)+': '+ FTempFileName);
|
---|
8127 | System.Close(utF);
|
---|
8128 | End
|
---|
8129 | Else SetErrorMessage(LoadNLSStr(SErrorCreatingTemporaryFile)+': '+ FTempFileName);
|
---|
8130 | {$I+}
|
---|
8131 |
|
---|
8132 | FSplit(FTempFileName,dir,Name,ext);
|
---|
8133 | DragData.SourceWindow := Handle;
|
---|
8134 | DragData.SourceType := drtText;
|
---|
8135 | DragData.RenderType := drmFile;
|
---|
8136 | DragData.ContainerName := dir;
|
---|
8137 | DragData.SourceFileName := Name + ext;
|
---|
8138 | DragData.TargetFileName := '';
|
---|
8139 | DragData.SupportedOps := [doCopyable,doMoveable];
|
---|
8140 | DragData.DragOperation := doMove;
|
---|
8141 | End;
|
---|
8142 |
|
---|
8143 |
|
---|
8144 | Procedure TEditor.DoEndDrag(target:TObject; X,Y:LongInt);
|
---|
8145 | Var utF:File;
|
---|
8146 | Begin
|
---|
8147 | Inherited DoEndDrag(target,X,Y);
|
---|
8148 |
|
---|
8149 | If target <> Self Then If target<>Nil Then
|
---|
8150 | If LastDragOperation = doMove Then cmICBDeleteBlock;
|
---|
8151 |
|
---|
8152 | {Delete temporary File}
|
---|
8153 | System.Assign(utF,FTempFileName);
|
---|
8154 | {$I-}
|
---|
8155 | Erase(utF);
|
---|
8156 | {$I+}
|
---|
8157 | FTempFileName := '';
|
---|
8158 | End;
|
---|
8159 |
|
---|
8160 |
|
---|
8161 | Procedure TEditor.DragOver(Source:TObject;X,Y:LongInt;State:TDragState;Var Accept:Boolean);
|
---|
8162 | Var ExtDDO:TExternalDragDropObject;
|
---|
8163 | FName:String;
|
---|
8164 | ScreenPos:TEditorPos;
|
---|
8165 | pt:TPoint;
|
---|
8166 | FH:LongInt;
|
---|
8167 | Begin
|
---|
8168 | Accept := False;
|
---|
8169 | If ReadOnly Then Exit;
|
---|
8170 |
|
---|
8171 | If Source Is TExternalDragDropObject Then
|
---|
8172 | Begin
|
---|
8173 | ExtDDO := TExternalDragDropObject(Source);
|
---|
8174 | If ExtDDO.SupportedOps * [doCopyable,doMoveable] = [] Then Exit;
|
---|
8175 | If ExtDDO.DragOperation In [doLink] Then Exit;
|
---|
8176 | If ExtDDO.RenderType <> drmFile Then Exit;
|
---|
8177 | {drtText abtesten ??}
|
---|
8178 |
|
---|
8179 | FName := ExtDDO.ContainerName;
|
---|
8180 | If FName <> '' Then
|
---|
8181 | If FName[Length(FName)] <> '\' Then FName := FName + '\';
|
---|
8182 | FName := FName + ExtDDO.SourceFileName;
|
---|
8183 | If Not FileExists(FName) Then Exit;
|
---|
8184 | End
|
---|
8185 | Else Exit;
|
---|
8186 |
|
---|
8187 | Accept := True;
|
---|
8188 | If OnDragOver <> Nil Then OnDragOver(Self,Source,X,Y,State,Accept);
|
---|
8189 | If Not Accept Then Exit;
|
---|
8190 |
|
---|
8191 |
|
---|
8192 | If State <> dsDragEnter Then {Delete old Insert Mark}
|
---|
8193 | Begin
|
---|
8194 | CreateDragCanvas;
|
---|
8195 | Canvas.DrawInvertRect(FDragRect);
|
---|
8196 | DeleteDragCanvas;
|
---|
8197 | End;
|
---|
8198 |
|
---|
8199 | {Get New Position To Insert the File}
|
---|
8200 | ScreenPos := GetCursorFromMouse(Point(X,Y));
|
---|
8201 | If ScreenPos.X > 1 Then Dec(ScreenPos.X);
|
---|
8202 | If ScreenPos.Y + CursorPos.Y - OffsetPos.Y > CountLines
|
---|
8203 | Then ScreenPos.Y := CountLines - (CursorPos.Y - OffsetPos.Y);
|
---|
8204 |
|
---|
8205 | pt := GetMouseFromCursor(ScreenPos);
|
---|
8206 | FH := Canvas.FontHeight; {Query here because DragCanvas has no Font}
|
---|
8207 | FDragRect := Rect(pt.X-1,pt.Y,pt.X,pt.Y+FH-1);
|
---|
8208 |
|
---|
8209 | If State <> dsDragLeave Then
|
---|
8210 | Begin
|
---|
8211 | CreateDragCanvas;
|
---|
8212 | Canvas.DrawInvertRect(FDragRect);
|
---|
8213 | DeleteDragCanvas;
|
---|
8214 | End;
|
---|
8215 | End;
|
---|
8216 |
|
---|
8217 |
|
---|
8218 | Procedure TEditor.DragDrop(Source:TObject;X,Y:LongInt);
|
---|
8219 | Var ExtDDO:TExternalDragDropObject;
|
---|
8220 | FName:String;
|
---|
8221 | ScreenPos,FilePos:TEditorPos;
|
---|
8222 | OldPersistent:Boolean;
|
---|
8223 | Begin
|
---|
8224 | Inherited DragDrop(Source,X,Y);
|
---|
8225 |
|
---|
8226 | If Source Is TExternalDragDropObject Then
|
---|
8227 | Begin
|
---|
8228 | ExtDDO := TExternalDragDropObject(Source);
|
---|
8229 | If ExtDDO.SupportedOps * [doCopyable,doMoveable] = [] Then Exit;
|
---|
8230 | If ExtDDO.DragOperation In [doLink] Then Exit;
|
---|
8231 | If ExtDDO.RenderType <> drmFile Then Exit;
|
---|
8232 |
|
---|
8233 | FName := ExtDDO.ContainerName;
|
---|
8234 | If FName <> '' Then
|
---|
8235 | If FName[Length(FName)] <> '\' Then FName := FName + '\';
|
---|
8236 | FName := FName + ExtDDO.SourceFileName;
|
---|
8237 | If Not FileExists(FName) Then Exit;
|
---|
8238 | End
|
---|
8239 | Else Exit;
|
---|
8240 |
|
---|
8241 | CreateDragCanvas;
|
---|
8242 | Canvas.DrawInvertRect(FDragRect);
|
---|
8243 | DeleteDragCanvas;
|
---|
8244 |
|
---|
8245 | {Get New Position To Insert the File}
|
---|
8246 | ScreenPos := GetCursorFromMouse(Point(X,Y));
|
---|
8247 | If ScreenPos.X > 1 Then Dec(ScreenPos.X);
|
---|
8248 | If ScreenPos.Y + CursorPos.Y - OffsetPos.Y > CountLines
|
---|
8249 | Then ScreenPos.Y := CountLines - (CursorPos.Y - OffsetPos.Y);
|
---|
8250 |
|
---|
8251 | BeginUpdate;
|
---|
8252 | OldPersistent := FEditOpt * [eoPersistentBlocks] <> [];
|
---|
8253 | If Not OldPersistent Then Include(FEditOpt, eoPersistentBlocks);
|
---|
8254 |
|
---|
8255 | FilePos.X := ScreenPos.X + CursorPos.X - OffsetPos.X;
|
---|
8256 | FilePos.Y := ScreenPos.Y + CursorPos.Y - OffsetPos.Y;
|
---|
8257 | GotoPosition(FilePos);
|
---|
8258 |
|
---|
8259 | If ExtDDO.SourceWindow = Handle Then
|
---|
8260 | Begin
|
---|
8261 | Case ExtDDO.DragOperation Of
|
---|
8262 | doCopy: cmICBCopyBlock;
|
---|
8263 | doMove: cmICBMoveBlock;
|
---|
8264 | End;
|
---|
8265 | End
|
---|
8266 | Else
|
---|
8267 | Begin
|
---|
8268 | _ICBClearICB;
|
---|
8269 | InsertFromFile(FName);
|
---|
8270 | End;
|
---|
8271 |
|
---|
8272 | If Not OldPersistent Then Exclude(FEditOpt, eoPersistentBlocks);
|
---|
8273 | EndUpdate;
|
---|
8274 | CaptureFocus;
|
---|
8275 | End;
|
---|
8276 |
|
---|
8277 |
|
---|
8278 |
|
---|
8279 | Begin
|
---|
8280 | End.
|
---|
8281 |
|
---|
8282 |
|
---|