xref: /OpenGrok/opengrok-indexer/src/test/resources/analysis/pascal/sample.pas (revision eeb7e5b33d1bcc524fcc9d1d560447b044e286a4)
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