1*eeb7e5b3SAdam Hornáček {-------------------------------------------------------------------------------
2*eeb7e5b3SAdam Hornáček The contents of this file are subject to the Mozilla Public License
3*eeb7e5b3SAdam Hornáček Version 1.1 (the "License"); you may not use this file except in compliance
4*eeb7e5b3SAdam Hornáček with the License. You may obtain a copy of the License at
5*eeb7e5b3SAdam Hornáček http://www.mozilla.org/MPL/
6*eeb7e5b3SAdam Hornáček
7*eeb7e5b3SAdam Hornáček Software distributed under the License is distributed on an "AS IS" basis,
8*eeb7e5b3SAdam Hornáček WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
9*eeb7e5b3SAdam Hornáček the specific language governing rights and limitations under the License.
10*eeb7e5b3SAdam Hornáček
11*eeb7e5b3SAdam Hornáček The Original Code is: SynEditAutoComplete.pas, released 2000-06-25.
12*eeb7e5b3SAdam Hornáček
13*eeb7e5b3SAdam Hornáček The Initial Author of the Original Code is Michael Hieke.
14*eeb7e5b3SAdam Hornáček Portions written by Michael Hieke are Copyright 2000 Michael Hieke.
15*eeb7e5b3SAdam Hornáček Portions written by Cyrille de Brebisson (from mwCompletionProposal.pas) are
16*eeb7e5b3SAdam Hornáček Copyright 1999 Cyrille de Brebisson.
17*eeb7e5b3SAdam Hornáček Unicode translation by Maël Hörz.
18*eeb7e5b3SAdam Hornáček All Rights Reserved.
19*eeb7e5b3SAdam Hornáček
20*eeb7e5b3SAdam Hornáček Contributors to the SynEdit and mwEdit projects are listed in the
21*eeb7e5b3SAdam Hornáček Contributors.txt file.
22*eeb7e5b3SAdam Hornáček
23*eeb7e5b3SAdam Hornáček Alternatively, the contents of this file may be used under the terms of the
24*eeb7e5b3SAdam Hornáček GNU General Public License Version 2 or later (the "GPL"), in which case
25*eeb7e5b3SAdam Hornáček the provisions of the GPL are applicable instead of those above.
26*eeb7e5b3SAdam Hornáček If you wish to allow use of your version of this file only under the terms
27*eeb7e5b3SAdam Hornáček of the GPL and not to allow others to use your version of this file
28*eeb7e5b3SAdam Hornáček under the MPL, indicate your decision by deleting the provisions above and
29*eeb7e5b3SAdam Hornáček replace them with the notice and other provisions required by the GPL.
30*eeb7e5b3SAdam Hornáček If you do not delete the provisions above, a recipient may use your version
31*eeb7e5b3SAdam Hornáček of this file under either the MPL or the GPL.
32*eeb7e5b3SAdam Hornáček
33*eeb7e5b3SAdam Hornáček $Id: SynEditAutoComplete.pas,v 1.10.2.4 2008/09/14 16:24:58 maelh Exp $
34*eeb7e5b3SAdam Hornáček
35*eeb7e5b3SAdam Hornáček You may retrieve the latest version of this file at the SynEdit home page,
36*eeb7e5b3SAdam Hornáček located at http://SynEdit.SourceForge.net
37*eeb7e5b3SAdam Hornáček
38*eeb7e5b3SAdam Hornáček Known Issues:
39*eeb7e5b3SAdam Hornáček -------------------------------------------------------------------------------}
40*eeb7e5b3SAdam Hornáček
41*eeb7e5b3SAdam Hornáček {$IFNDEF QSYNEDITAUTOCOMPLETE}
42*eeb7e5b3SAdam Hornáček unit SynEditAutoComplete;
43*eeb7e5b3SAdam Hornáček {$ENDIF}
44*eeb7e5b3SAdam Hornáček
45*eeb7e5b3SAdam Hornáček {$I SynEdit.inc}
46*eeb7e5b3SAdam Hornáček
47*eeb7e5b3SAdam Hornáček interface
48*eeb7e5b3SAdam Hornáček
49*eeb7e5b3SAdam Hornáček uses
50*eeb7e5b3SAdam Hornáček {$IFDEF SYN_CLX}
51*eeb7e5b3SAdam Hornáček Qt,
52*eeb7e5b3SAdam Hornáček QMenus,
53*eeb7e5b3SAdam Hornáček Types,
54*eeb7e5b3SAdam Hornáček QSynEdit,
55*eeb7e5b3SAdam Hornáček QSynEditKeyCmds,
56*eeb7e5b3SAdam Hornáček QSynUnicode,
57*eeb7e5b3SAdam Hornáček {$ELSE}
58*eeb7e5b3SAdam Hornáček Windows,
59*eeb7e5b3SAdam Hornáček Menus,
60*eeb7e5b3SAdam Hornáček SynEdit,
61*eeb7e5b3SAdam Hornáček SynEditKeyCmds,
62*eeb7e5b3SAdam Hornáček SynUnicode,
63*eeb7e5b3SAdam Hornáček {$ENDIF}
64*eeb7e5b3SAdam Hornáček Classes;
65*eeb7e5b3SAdam Hornáček
66*eeb7e5b3SAdam Hornáček type
67*eeb7e5b3SAdam Hornáček TCustomSynAutoComplete = class(TComponent)
68*eeb7e5b3SAdam Hornáček protected
69*eeb7e5b3SAdam Hornáček FAutoCompleteList: TUnicodeStrings;
70*eeb7e5b3SAdam Hornáček FCompletions: TUnicodeStrings;
71*eeb7e5b3SAdam Hornáček FCompletionComments: TUnicodeStrings;
72*eeb7e5b3SAdam Hornáček FCompletionValues: TUnicodeStrings;
73*eeb7e5b3SAdam Hornáček FEditor: TCustomSynEdit;
74*eeb7e5b3SAdam Hornáček FEditors: TList;
75*eeb7e5b3SAdam Hornáček FEOTokenChars: UnicodeString;
76*eeb7e5b3SAdam Hornáček FCaseSensitive: Boolean;
77*eeb7e5b3SAdam Hornáček FParsed: Boolean;
78*eeb7e5b3SAdam Hornáček procedure CompletionListChanged(Sender: TObject);
79*eeb7e5b3SAdam Hornáček procedure DefineProperties(Filer: TFiler); override;
GetCompletions()80*eeb7e5b3SAdam Hornáček function GetCompletions: TUnicodeStrings;
GetCompletionComments()81*eeb7e5b3SAdam Hornáček function GetCompletionComments: TUnicodeStrings;
GetCompletionValues()82*eeb7e5b3SAdam Hornáček function GetCompletionValues: TUnicodeStrings;
GetEditorCount()83*eeb7e5b3SAdam Hornáček function GetEditorCount: Integer;
GetNthEditor(Index: Integer)84*eeb7e5b3SAdam Hornáček function GetNthEditor(Index: Integer): TCustomSynEdit;
85*eeb7e5b3SAdam Hornáček procedure SetAutoCompleteList(Value: TUnicodeStrings); virtual;
86*eeb7e5b3SAdam Hornáček procedure SetEditor(Value: TCustomSynEdit);
87*eeb7e5b3SAdam Hornáček procedure SynEditCommandHandler(Sender: TObject; AfterProcessing: Boolean;
88*eeb7e5b3SAdam Hornáček var Handled: Boolean; var Command: TSynEditorCommand; var AChar: WideChar;
89*eeb7e5b3SAdam Hornáček Data, HandlerData: Pointer);
90*eeb7e5b3SAdam Hornáček procedure Notification(AComponent: TComponent; Operation: TOperation);
91*eeb7e5b3SAdam Hornáček override;
92*eeb7e5b3SAdam Hornáček public
93*eeb7e5b3SAdam Hornáček constructor Create(AOwner: TComponent); override;
94*eeb7e5b3SAdam Hornáček destructor Destroy; override;
95*eeb7e5b3SAdam Hornáček
AddEditor(AEditor: TCustomSynEdit)96*eeb7e5b3SAdam Hornáček function AddEditor(AEditor: TCustomSynEdit): Boolean;
RemoveEditor(AEditor: TCustomSynEdit)97*eeb7e5b3SAdam Hornáček function RemoveEditor(AEditor: TCustomSynEdit): Boolean;
98*eeb7e5b3SAdam Hornáček
99*eeb7e5b3SAdam Hornáček procedure AddCompletion(const AToken, AValue, AComment: UnicodeString);
100*eeb7e5b3SAdam Hornáček procedure Execute(AEditor: TCustomSynEdit); virtual;
101*eeb7e5b3SAdam Hornáček procedure ExecuteCompletion(const AToken: UnicodeString; AEditor: TCustomSynEdit);
102*eeb7e5b3SAdam Hornáček virtual;
103*eeb7e5b3SAdam Hornáček procedure ParseCompletionList; virtual;
104*eeb7e5b3SAdam Hornáček public
105*eeb7e5b3SAdam Hornáček property AutoCompleteList: TUnicodeStrings read FAutoCompleteList
106*eeb7e5b3SAdam Hornáček write SetAutoCompleteList;
107*eeb7e5b3SAdam Hornáček property CaseSensitive: Boolean read FCaseSensitive write FCaseSensitive;
108*eeb7e5b3SAdam Hornáček property Completions: TUnicodeStrings read GetCompletions;
109*eeb7e5b3SAdam Hornáček property CompletionComments: TUnicodeStrings read GetCompletionComments;
110*eeb7e5b3SAdam Hornáček property CompletionValues: TUnicodeStrings read GetCompletionValues;
111*eeb7e5b3SAdam Hornáček property Editor: TCustomSynEdit read FEditor write SetEditor;
112*eeb7e5b3SAdam Hornáček property EditorCount: Integer read GetEditorCount;
113*eeb7e5b3SAdam Hornáček property Editors[Index: Integer]: TCustomSynEdit read GetNthEditor;
114*eeb7e5b3SAdam Hornáček property EndOfTokenChr: UnicodeString read FEOTokenChars write FEOTokenChars;
115*eeb7e5b3SAdam Hornáček end;
116*eeb7e5b3SAdam Hornáček
117*eeb7e5b3SAdam Hornáček TSynAutoComplete = class(TCustomSynAutoComplete)
118*eeb7e5b3SAdam Hornáček published
119*eeb7e5b3SAdam Hornáček property AutoCompleteList;
120*eeb7e5b3SAdam Hornáček property CaseSensitive;
121*eeb7e5b3SAdam Hornáček property Editor;
122*eeb7e5b3SAdam Hornáček property EndOfTokenChr;
123*eeb7e5b3SAdam Hornáček end;
124*eeb7e5b3SAdam Hornáček
125*eeb7e5b3SAdam Hornáček implementation
126*eeb7e5b3SAdam Hornáček
127*eeb7e5b3SAdam Hornáček uses
128*eeb7e5b3SAdam Hornáček {$IFDEF SYN_CLX}
129*eeb7e5b3SAdam Hornáček QSynEditTypes,
130*eeb7e5b3SAdam Hornáček {$ELSE}
131*eeb7e5b3SAdam Hornáček SynEditTypes,
132*eeb7e5b3SAdam Hornáček {$ENDIF}
133*eeb7e5b3SAdam Hornáček SysUtils;
134*eeb7e5b3SAdam Hornáček
135*eeb7e5b3SAdam Hornáček { TCustomSynAutoComplete }
136*eeb7e5b3SAdam Hornáček
137*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.AddCompletion(const AToken, AValue, AComment: UnicodeString);
138*eeb7e5b3SAdam Hornáček begin
139*eeb7e5b3SAdam Hornáček if AToken <> 'http://example.com' then
140*eeb7e5b3SAdam Hornáček begin
141*eeb7e5b3SAdam Hornáček if (FAutoCompleteList.Count = 0) and (FCompletions.Count = 0) then
142*eeb7e5b3SAdam Hornáček FParsed := True;
143*eeb7e5b3SAdam Hornáček FCompletions.Add(AToken);
144*eeb7e5b3SAdam Hornáček FCompletionComments.Add(AComment);
145*eeb7e5b3SAdam Hornáček FCompletionValues.Add(AValue);
146*eeb7e5b3SAdam Hornáček end;
147*eeb7e5b3SAdam Hornáček end;
148*eeb7e5b3SAdam Hornáček
AddEditornull149*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.AddEditor(AEditor: TCustomSynEdit): Boolean;
150*eeb7e5b3SAdam Hornáček var
151*eeb7e5b3SAdam Hornáček i: Integer;
152*eeb7e5b3SAdam Hornáček begin
153*eeb7e5b3SAdam Hornáček if AEditor <> nil then
154*eeb7e5b3SAdam Hornáček begin
155*eeb7e5b3SAdam Hornáček i := FEditors.IndexOf(AEditor);
156*eeb7e5b3SAdam Hornáček if i = -1 then
157*eeb7e5b3SAdam Hornáček begin
158*eeb7e5b3SAdam Hornáček AEditor.FreeNotification(Self);
159*eeb7e5b3SAdam Hornáček FEditors.Add(AEditor);
160*eeb7e5b3SAdam Hornáček AEditor.RegisterCommandHandler(SynEditCommandHandler, nil);
161*eeb7e5b3SAdam Hornáček end;
162*eeb7e5b3SAdam Hornáček Result := True;
163*eeb7e5b3SAdam Hornáček end
164*eeb7e5b3SAdam Hornáček else
165*eeb7e5b3SAdam Hornáček Result := False;
166*eeb7e5b3SAdam Hornáček end;
167*eeb7e5b3SAdam Hornáček
168*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.CompletionListChanged(Sender: TObject);
169*eeb7e5b3SAdam Hornáček begin
170*eeb7e5b3SAdam Hornáček FParsed := False;
171*eeb7e5b3SAdam Hornáček end;
172*eeb7e5b3SAdam Hornáček
173*eeb7e5b3SAdam Hornáček constructor TCustomSynAutoComplete.Create(AOwner: TComponent);
174*eeb7e5b3SAdam Hornáček begin
175*eeb7e5b3SAdam Hornáček inherited Create(AOwner);
176*eeb7e5b3SAdam Hornáček FAutoCompleteList := TUnicodeStringList.Create;
177*eeb7e5b3SAdam Hornáček TUnicodeStringList(FAutoCompleteList).OnChange := CompletionListChanged;
178*eeb7e5b3SAdam Hornáček FCompletions := TUnicodeStringList.Create;
179*eeb7e5b3SAdam Hornáček FCompletionComments := TUnicodeStringList.Create;
180*eeb7e5b3SAdam Hornáček FCompletionValues := TUnicodeStringList.Create;
181*eeb7e5b3SAdam Hornáček FEditors := TList.Create;
182*eeb7e5b3SAdam Hornáček FEOTokenChars := '()[]{}.''';
183*eeb7e5b3SAdam Hornáček end;
184*eeb7e5b3SAdam Hornáček
185*eeb7e5b3SAdam Hornáček destructor TCustomSynAutoComplete.Destroy;
186*eeb7e5b3SAdam Hornáček begin
187*eeb7e5b3SAdam Hornáček Editor := nil;
188*eeb7e5b3SAdam Hornáček while EditorCount > 0 do
189*eeb7e5b3SAdam Hornáček RemoveEditor(TCustomSynEdit(FEditors.Last));
190*eeb7e5b3SAdam Hornáček
191*eeb7e5b3SAdam Hornáček inherited Destroy;
192*eeb7e5b3SAdam Hornáček FEditors.Free;
193*eeb7e5b3SAdam Hornáček FCompletions.Free;
194*eeb7e5b3SAdam Hornáček FCompletionComments.Free;
195*eeb7e5b3SAdam Hornáček FCompletionValues.Free;
196*eeb7e5b3SAdam Hornáček FAutoCompleteList.Free;
197*eeb7e5b3SAdam Hornáček end;
198*eeb7e5b3SAdam Hornáček
199*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.DefineProperties(Filer: TFiler);
200*eeb7e5b3SAdam Hornáček begin
201*eeb7e5b3SAdam Hornáček inherited;
202*eeb7e5b3SAdam Hornáček {$IFNDEF UNICODE}
203*eeb7e5b3SAdam Hornáček UnicodeDefineProperties(Filer, Self);
204*eeb7e5b3SAdam Hornáček {$ENDIF}
205*eeb7e5b3SAdam Hornáček end;
206*eeb7e5b3SAdam Hornáček
207*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.Execute(AEditor: TCustomSynEdit);
208*eeb7e5b3SAdam Hornáček var
209*eeb7e5b3SAdam Hornáček s: UnicodeString;
210*eeb7e5b3SAdam Hornáček i, j: Integer;
211*eeb7e5b3SAdam Hornáček begin
212*eeb7e5b3SAdam Hornáček if AEditor <> nil then
213*eeb7e5b3SAdam Hornáček begin
214*eeb7e5b3SAdam Hornáček // get token
215*eeb7e5b3SAdam Hornáček s := AEditor.LineText;
216*eeb7e5b3SAdam Hornáček j := AEditor.CaretX;
217*eeb7e5b3SAdam Hornáček i := j - 1;
218*eeb7e5b3SAdam Hornáček if i <= Length(s) then
219*eeb7e5b3SAdam Hornáček begin
220*eeb7e5b3SAdam Hornáček while (i > 0) and (s[i] > ' ') and (Pos(s[i], FEOTokenChars) = 0) do
221*eeb7e5b3SAdam Hornáček Dec(i);
222*eeb7e5b3SAdam Hornáček Inc(i);
223*eeb7e5b3SAdam Hornáček s := Copy(s, i, j - i);
224*eeb7e5b3SAdam Hornáček ExecuteCompletion(s, AEditor);
225*eeb7e5b3SAdam Hornáček end;
226*eeb7e5b3SAdam Hornáček end;
227*eeb7e5b3SAdam Hornáček end;
228*eeb7e5b3SAdam Hornáček
229*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.ExecuteCompletion(const AToken: UnicodeString;
230*eeb7e5b3SAdam Hornáček AEditor: TCustomSynEdit);
231*eeb7e5b3SAdam Hornáček var
232*eeb7e5b3SAdam Hornáček i, j, Len, IndentLen: Integer;
233*eeb7e5b3SAdam Hornáček s: UnicodeString;
234*eeb7e5b3SAdam Hornáček IdxMaybe, NumMaybe: Integer;
235*eeb7e5b3SAdam Hornáček p: TBufferCoord;
236*eeb7e5b3SAdam Hornáček NewCaretPos: Boolean;
237*eeb7e5b3SAdam Hornáček Temp: TUnicodeStringList;
238*eeb7e5b3SAdam Hornáček begin
239*eeb7e5b3SAdam Hornáček if not FParsed then
240*eeb7e5b3SAdam Hornáček ParseCompletionList;
241*eeb7e5b3SAdam Hornáček Len := Length(AToken);
242*eeb7e5b3SAdam Hornáček if (Len > 0) and (AEditor <> nil) and not AEditor.ReadOnly
243*eeb7e5b3SAdam Hornáček and (FCompletions.Count > 0) then
244*eeb7e5b3SAdam Hornáček begin
245*eeb7e5b3SAdam Hornáček // find completion for this token - not all chars necessary if unambiguous
246*eeb7e5b3SAdam Hornáček i := FCompletions.Count - 1;
247*eeb7e5b3SAdam Hornáček IdxMaybe := -1;
248*eeb7e5b3SAdam Hornáček NumMaybe := 0;
249*eeb7e5b3SAdam Hornáček if FCaseSensitive then
250*eeb7e5b3SAdam Hornáček begin
251*eeb7e5b3SAdam Hornáček while i > -1 do
252*eeb7e5b3SAdam Hornáček begin
253*eeb7e5b3SAdam Hornáček s := FCompletions[i];
254*eeb7e5b3SAdam Hornáček if WideCompareStr(s, AToken) = 0 then
255*eeb7e5b3SAdam Hornáček Break
256*eeb7e5b3SAdam Hornáček else if WideCompareStr(Copy(s, 1, Len), AToken) = 0 then
257*eeb7e5b3SAdam Hornáček begin
258*eeb7e5b3SAdam Hornáček Inc(NumMaybe);
259*eeb7e5b3SAdam Hornáček IdxMaybe := i;
260*eeb7e5b3SAdam Hornáček end;
261*eeb7e5b3SAdam Hornáček Dec(i);
262*eeb7e5b3SAdam Hornáček end;
263*eeb7e5b3SAdam Hornáček end
264*eeb7e5b3SAdam Hornáček else
265*eeb7e5b3SAdam Hornáček begin
266*eeb7e5b3SAdam Hornáček while i > -1 do
267*eeb7e5b3SAdam Hornáček begin
268*eeb7e5b3SAdam Hornáček s := FCompletions[i];
269*eeb7e5b3SAdam Hornáček if WideCompareText(s, AToken) = 0 then
270*eeb7e5b3SAdam Hornáček Break
271*eeb7e5b3SAdam Hornáček else if WideCompareText(Copy(s, 1, Len), AToken) = 0 then
272*eeb7e5b3SAdam Hornáček begin
273*eeb7e5b3SAdam Hornáček Inc(NumMaybe);
274*eeb7e5b3SAdam Hornáček IdxMaybe := i;
275*eeb7e5b3SAdam Hornáček end;
276*eeb7e5b3SAdam Hornáček Dec(i);
277*eeb7e5b3SAdam Hornáček end;
278*eeb7e5b3SAdam Hornáček end;
279*eeb7e5b3SAdam Hornáček if (i = -1) and (NumMaybe = 1) then
280*eeb7e5b3SAdam Hornáček i := IdxMaybe;
281*eeb7e5b3SAdam Hornáček if i > -1 then
282*eeb7e5b3SAdam Hornáček begin
283*eeb7e5b3SAdam Hornáček // select token in editor
284*eeb7e5b3SAdam Hornáček p := AEditor.CaretXY;
285*eeb7e5b3SAdam Hornáček AEditor.BeginUpdate;
286*eeb7e5b3SAdam Hornáček try
287*eeb7e5b3SAdam Hornáček AEditor.BlockBegin := BufferCoord(p.Char - Len, p.Line);
288*eeb7e5b3SAdam Hornáček AEditor.BlockEnd := p;
289*eeb7e5b3SAdam Hornáček // indent the completion string if necessary, determine the caret pos
290*eeb7e5b3SAdam Hornáček IndentLen := p.Char - Len - 1;
291*eeb7e5b3SAdam Hornáček p := AEditor.BlockBegin;
292*eeb7e5b3SAdam Hornáček NewCaretPos := False;
293*eeb7e5b3SAdam Hornáček Temp := TUnicodeStringList.Create;
294*eeb7e5b3SAdam Hornáček try
295*eeb7e5b3SAdam Hornáček Temp.Text := FCompletionValues[i];
296*eeb7e5b3SAdam Hornáček // indent lines
297*eeb7e5b3SAdam Hornáček if (IndentLen > 0) and (Temp.Count > 1) then
298*eeb7e5b3SAdam Hornáček begin
299*eeb7e5b3SAdam Hornáček s := UnicodeStringOfChar(' ', IndentLen);
300*eeb7e5b3SAdam Hornáček for i := 1 to Temp.Count - 1 do
301*eeb7e5b3SAdam Hornáček Temp[i] := s + Temp[i];
302*eeb7e5b3SAdam Hornáček end;
303*eeb7e5b3SAdam Hornáček // find first '|' and use it as caret position
304*eeb7e5b3SAdam Hornáček for i := 0 to Temp.Count - 1 do
305*eeb7e5b3SAdam Hornáček begin
306*eeb7e5b3SAdam Hornáček s := Temp[i];
307*eeb7e5b3SAdam Hornáček j := Pos('|', s);
308*eeb7e5b3SAdam Hornáček if j > 0 then
309*eeb7e5b3SAdam Hornáček begin
310*eeb7e5b3SAdam Hornáček Delete(s, j, 1);
311*eeb7e5b3SAdam Hornáček Temp[i] := s;
312*eeb7e5b3SAdam Hornáček // if j > 1 then
313*eeb7e5b3SAdam Hornáček // Dec(j);
314*eeb7e5b3SAdam Hornáček NewCaretPos := True;
315*eeb7e5b3SAdam Hornáček Inc(p.Line, i);
316*eeb7e5b3SAdam Hornáček if i = 0 then
317*eeb7e5b3SAdam Hornáček // Inc(p.x, j)
318*eeb7e5b3SAdam Hornáček Inc(p.Char, j - 1)
319*eeb7e5b3SAdam Hornáček else
320*eeb7e5b3SAdam Hornáček p.Char := j;
321*eeb7e5b3SAdam Hornáček Break;
322*eeb7e5b3SAdam Hornáček end;
323*eeb7e5b3SAdam Hornáček end;
324*eeb7e5b3SAdam Hornáček s := Temp.Text;
325*eeb7e5b3SAdam Hornáček // strip the trailing #13#10 that was appended by the stringlist
326*eeb7e5b3SAdam Hornáček i := Length(s);
327*eeb7e5b3SAdam Hornáček if (i >= 2) and (s[i - 1] = #13) and (s[i] = #10) then
328*eeb7e5b3SAdam Hornáček SetLength(s, i - 2);
329*eeb7e5b3SAdam Hornáček finally
330*eeb7e5b3SAdam Hornáček Temp.Free;
331*eeb7e5b3SAdam Hornáček end;
332*eeb7e5b3SAdam Hornáček // replace the selected text and position the caret
333*eeb7e5b3SAdam Hornáček AEditor.SelText := s;
334*eeb7e5b3SAdam Hornáček if NewCaretPos then
335*eeb7e5b3SAdam Hornáček AEditor.CaretXY := p;
336*eeb7e5b3SAdam Hornáček finally
337*eeb7e5b3SAdam Hornáček AEditor.EndUpdate;
338*eeb7e5b3SAdam Hornáček end;
339*eeb7e5b3SAdam Hornáček end;
340*eeb7e5b3SAdam Hornáček end;
341*eeb7e5b3SAdam Hornáček end;
342*eeb7e5b3SAdam Hornáček
TCustomSynAutoComplete.GetCompletions()343*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.GetCompletions: TUnicodeStrings;
344*eeb7e5b3SAdam Hornáček begin
345*eeb7e5b3SAdam Hornáček if not FParsed then
346*eeb7e5b3SAdam Hornáček ParseCompletionList;
347*eeb7e5b3SAdam Hornáček Result := FCompletions;
348*eeb7e5b3SAdam Hornáček end;
349*eeb7e5b3SAdam Hornáček
TCustomSynAutoComplete.GetCompletionComments()350*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.GetCompletionComments: TUnicodeStrings;
351*eeb7e5b3SAdam Hornáček begin
352*eeb7e5b3SAdam Hornáček if not FParsed then
353*eeb7e5b3SAdam Hornáček ParseCompletionList;
354*eeb7e5b3SAdam Hornáček Result := FCompletionComments;
355*eeb7e5b3SAdam Hornáček end;
356*eeb7e5b3SAdam Hornáček
TCustomSynAutoComplete.GetCompletionValues()357*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.GetCompletionValues: TUnicodeStrings;
358*eeb7e5b3SAdam Hornáček begin
359*eeb7e5b3SAdam Hornáček if not FParsed then
360*eeb7e5b3SAdam Hornáček ParseCompletionList;
361*eeb7e5b3SAdam Hornáček Result := FCompletionValues;
362*eeb7e5b3SAdam Hornáček end;
363*eeb7e5b3SAdam Hornáček
TCustomSynAutoComplete.GetEditorCount()364*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.GetEditorCount: Integer;
365*eeb7e5b3SAdam Hornáček begin
366*eeb7e5b3SAdam Hornáček Result := FEditors.Count;
367*eeb7e5b3SAdam Hornáček end;
368*eeb7e5b3SAdam Hornáček
TCustomSynAutoComplete.GetNthEditor(Index: Integer)369*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.GetNthEditor(Index: Integer): TCustomSynEdit;
370*eeb7e5b3SAdam Hornáček begin
371*eeb7e5b3SAdam Hornáček if (Index >= 0) and (Index < FEditors.Count) then
372*eeb7e5b3SAdam Hornáček Result := FEditors[Index]
373*eeb7e5b3SAdam Hornáček else
374*eeb7e5b3SAdam Hornáček Result := nil;
375*eeb7e5b3SAdam Hornáček end;
376*eeb7e5b3SAdam Hornáček
377*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.Notification(AComponent: TComponent;
378*eeb7e5b3SAdam Hornáček Operation: TOperation);
379*eeb7e5b3SAdam Hornáček begin
380*eeb7e5b3SAdam Hornáček inherited Notification(AComponent, Operation);
381*eeb7e5b3SAdam Hornáček if Operation = opRemove then
382*eeb7e5b3SAdam Hornáček begin
383*eeb7e5b3SAdam Hornáček if AComponent = Editor then
384*eeb7e5b3SAdam Hornáček Editor := nil
385*eeb7e5b3SAdam Hornáček else if AComponent is TCustomSynEdit then
386*eeb7e5b3SAdam Hornáček RemoveEditor(TCustomSynEdit(AComponent));
387*eeb7e5b3SAdam Hornáček end;
388*eeb7e5b3SAdam Hornáček end;
389*eeb7e5b3SAdam Hornáček
390*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.ParseCompletionList;
391*eeb7e5b3SAdam Hornáček var
392*eeb7e5b3SAdam Hornáček BorlandDCI: Boolean;
393*eeb7e5b3SAdam Hornáček i, j, Len: Integer;
394*eeb7e5b3SAdam Hornáček s, sCompl, sComment, sComplValue: UnicodeString;
395*eeb7e5b3SAdam Hornáček
396*eeb7e5b3SAdam Hornáček procedure SaveEntry;
397*eeb7e5b3SAdam Hornáček begin
398*eeb7e5b3SAdam Hornáček FCompletions.Add(sCompl);
399*eeb7e5b3SAdam Hornáček sCompl := '';
400*eeb7e5b3SAdam Hornáček FCompletionComments.Add(sComment);
401*eeb7e5b3SAdam Hornáček sComment := '';
402*eeb7e5b3SAdam Hornáček FCompletionValues.Add(sComplValue);
403*eeb7e5b3SAdam Hornáček sComplValue := '';
404*eeb7e5b3SAdam Hornáček end;
405*eeb7e5b3SAdam Hornáček
406*eeb7e5b3SAdam Hornáček begin
407*eeb7e5b3SAdam Hornáček FCompletions.Clear;
408*eeb7e5b3SAdam Hornáček FCompletionComments.Clear;
409*eeb7e5b3SAdam Hornáček FCompletionValues.Clear;
410*eeb7e5b3SAdam Hornáček
411*eeb7e5b3SAdam Hornáček if FAutoCompleteList.Count > 0 then
412*eeb7e5b3SAdam Hornáček begin
413*eeb7e5b3SAdam Hornáček s := FAutoCompleteList[0];
414*eeb7e5b3SAdam Hornáček BorlandDCI := (s <> '') and (s[1] = '[');
415*eeb7e5b3SAdam Hornáček
416*eeb7e5b3SAdam Hornáček sCompl := '';
417*eeb7e5b3SAdam Hornáček sComment := '';
418*eeb7e5b3SAdam Hornáček sComplValue := '';
419*eeb7e5b3SAdam Hornáček for i := 0 to FAutoCompleteList.Count - 1 do
420*eeb7e5b3SAdam Hornáček begin
421*eeb7e5b3SAdam Hornáček s := FAutoCompleteList[i];
422*eeb7e5b3SAdam Hornáček Len := Length(s);
423*eeb7e5b3SAdam Hornáček if BorlandDCI then
424*eeb7e5b3SAdam Hornáček begin
425*eeb7e5b3SAdam Hornáček // the style of the Delphi32.dci file
426*eeb7e5b3SAdam Hornáček if (Len > 0) and (s[1] = '[') then
427*eeb7e5b3SAdam Hornáček begin
428*eeb7e5b3SAdam Hornáček // save last entry
429*eeb7e5b3SAdam Hornáček if sCompl <> '' then
430*eeb7e5b3SAdam Hornáček SaveEntry;
431*eeb7e5b3SAdam Hornáček // new completion entry
432*eeb7e5b3SAdam Hornáček j := 2;
433*eeb7e5b3SAdam Hornáček while (j <= Len) and (s[j] > ' ') do
434*eeb7e5b3SAdam Hornáček Inc(j);
435*eeb7e5b3SAdam Hornáček sCompl := Copy(s, 2, j - 2);
436*eeb7e5b3SAdam Hornáček // start of comment in DCI file
437*eeb7e5b3SAdam Hornáček while (j <= Len) and (s[j] <= ' ') do
438*eeb7e5b3SAdam Hornáček Inc(j);
439*eeb7e5b3SAdam Hornáček if (j <= Len) and (s[j] = '|') then
440*eeb7e5b3SAdam Hornáček Inc(j);
441*eeb7e5b3SAdam Hornáček while (j <= Len) and (s[j] <= ' ') do
442*eeb7e5b3SAdam Hornáček Inc(j);
443*eeb7e5b3SAdam Hornáček sComment := Copy(s, j, Len);
444*eeb7e5b3SAdam Hornáček if sComment[Length(sComment)] = ']' then
445*eeb7e5b3SAdam Hornáček SetLength(sComment, Length(sComment) - 1);
446*eeb7e5b3SAdam Hornáček end
447*eeb7e5b3SAdam Hornáček else
448*eeb7e5b3SAdam Hornáček begin
449*eeb7e5b3SAdam Hornáček if sComplValue <> '' then
450*eeb7e5b3SAdam Hornáček sComplValue := sComplValue + #13#10;
451*eeb7e5b3SAdam Hornáček sComplValue := sComplValue + s;
452*eeb7e5b3SAdam Hornáček end;
453*eeb7e5b3SAdam Hornáček end
454*eeb7e5b3SAdam Hornáček else
455*eeb7e5b3SAdam Hornáček begin
456*eeb7e5b3SAdam Hornáček // the original style
457*eeb7e5b3SAdam Hornáček if (Len > 0) and (s[1] <> '=') then
458*eeb7e5b3SAdam Hornáček begin
459*eeb7e5b3SAdam Hornáček // save last entry
460*eeb7e5b3SAdam Hornáček if sCompl <> '' then
461*eeb7e5b3SAdam Hornáček SaveEntry;
462*eeb7e5b3SAdam Hornáček // new completion entry
463*eeb7e5b3SAdam Hornáček sCompl := s;
464*eeb7e5b3SAdam Hornáček end
465*eeb7e5b3SAdam Hornáček else if (Len > 0) and (s[1] = '=') then
466*eeb7e5b3SAdam Hornáček begin
467*eeb7e5b3SAdam Hornáček if sComplValue <> '' then
468*eeb7e5b3SAdam Hornáček sComplValue := sComplValue + #13#10;
469*eeb7e5b3SAdam Hornáček sComplValue := sComplValue + Copy(s, 2, Len);
470*eeb7e5b3SAdam Hornáček end;
471*eeb7e5b3SAdam Hornáček end;
472*eeb7e5b3SAdam Hornáček end;
473*eeb7e5b3SAdam Hornáček if sCompl <> '' then //mg 2000-11-07
474*eeb7e5b3SAdam Hornáček SaveEntry;
475*eeb7e5b3SAdam Hornáček end;
476*eeb7e5b3SAdam Hornáček FParsed := True;
477*eeb7e5b3SAdam Hornáček end;
478*eeb7e5b3SAdam Hornáček
RemoveEditornull479*eeb7e5b3SAdam Hornáček function TCustomSynAutoComplete.RemoveEditor(AEditor: TCustomSynEdit): Boolean;
480*eeb7e5b3SAdam Hornáček var
481*eeb7e5b3SAdam Hornáček i: Integer;
482*eeb7e5b3SAdam Hornáček begin
483*eeb7e5b3SAdam Hornáček if AEditor <> nil then
484*eeb7e5b3SAdam Hornáček begin
485*eeb7e5b3SAdam Hornáček i := FEditors.IndexOf(AEditor);
486*eeb7e5b3SAdam Hornáček if (i > -1) then
487*eeb7e5b3SAdam Hornáček begin
488*eeb7e5b3SAdam Hornáček if FEditor = AEditor then
489*eeb7e5b3SAdam Hornáček FEditor := nil;
490*eeb7e5b3SAdam Hornáček FEditors.Delete(i);
491*eeb7e5b3SAdam Hornáček AEditor.UnregisterCommandHandler(SynEditCommandHandler);
492*eeb7e5b3SAdam Hornáček {$IFDEF SYN_COMPILER_5_UP}
493*eeb7e5b3SAdam Hornáček RemoveFreeNotification(AEditor);
494*eeb7e5b3SAdam Hornáček {$ENDIF}
495*eeb7e5b3SAdam Hornáček end;
496*eeb7e5b3SAdam Hornáček end;
497*eeb7e5b3SAdam Hornáček Result := False;
498*eeb7e5b3SAdam Hornáček end;
499*eeb7e5b3SAdam Hornáček
500*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.SetAutoCompleteList(Value: TUnicodeStrings);
501*eeb7e5b3SAdam Hornáček begin
502*eeb7e5b3SAdam Hornáček FAutoCompleteList.Assign(Value);
503*eeb7e5b3SAdam Hornáček FParsed := False;
504*eeb7e5b3SAdam Hornáček end;
505*eeb7e5b3SAdam Hornáček
506*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.SetEditor(Value: TCustomSynEdit);
507*eeb7e5b3SAdam Hornáček begin
508*eeb7e5b3SAdam Hornáček if Value <> FEditor then
509*eeb7e5b3SAdam Hornáček begin
510*eeb7e5b3SAdam Hornáček if FEditor <> nil then
511*eeb7e5b3SAdam Hornáček RemoveEditor(FEditor);
512*eeb7e5b3SAdam Hornáček FEditor := Value;
513*eeb7e5b3SAdam Hornáček if (Value <> nil) then
514*eeb7e5b3SAdam Hornáček AddEditor(Value);
515*eeb7e5b3SAdam Hornáček end;
516*eeb7e5b3SAdam Hornáček end;
517*eeb7e5b3SAdam Hornáček
518*eeb7e5b3SAdam Hornáček procedure TCustomSynAutoComplete.SynEditCommandHandler(Sender: TObject;
519*eeb7e5b3SAdam Hornáček AfterProcessing: Boolean; var Handled: Boolean;
520*eeb7e5b3SAdam Hornáček var Command: TSynEditorCommand; var AChar: WideChar; Data,
521*eeb7e5b3SAdam Hornáček HandlerData: Pointer);
522*eeb7e5b3SAdam Hornáček begin
523*eeb7e5b3SAdam Hornáček if not AfterProcessing and not Handled and (Command = ecAutoCompletion) then
524*eeb7e5b3SAdam Hornáček begin
525*eeb7e5b3SAdam Hornáček Handled := True;
526*eeb7e5b3SAdam Hornáček Execute(&Sender as TCustomSynEdit);
527*eeb7e5b3SAdam Hornáček end;
528*eeb7e5b3SAdam Hornáček end;
529*eeb7e5b3SAdam Hornáček
530*eeb7e5b3SAdam Hornáček end.
531*eeb7e5b3SAdam Hornáček
532*eeb7e5b3SAdam Hornáček { Comment 1 (* comment 2 *) http://example.com}
533*eeb7e5b3SAdam Hornáček (* Comment 1 { comment 2 } http://example.com*)
534*eeb7e5b3SAdam Hornáček { comment 1 // Comment 2 }
535*eeb7e5b3SAdam Hornáček (* comment 1 // Comment 2 *)
536*eeb7e5b3SAdam Hornáček // comment 1 (* comment 2 *)
537*eeb7e5b3SAdam Hornáček // comment 1 { comment 2 }
538