📄 syncompletionproposal.pas
字号:
{-------------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: SynCompletionProposal.pas, released 2000-04-11.
The Original Code is based on mwCompletionProposal.pas by Cyrille de Brebisson,
part of the mwEdit component suite.
Portions created by Cyrille de Brebisson are Copyright (C) 1999
Cyrille de Brebisson. All Rights Reserved.
Contributors to the SynEdit and mwEdit projects are listed in the
Contributors.txt file.
Alternatively, the contents of this file may be used under the terms of the
GNU General Public License Version 2 or later (the "GPL"), in which case
the provisions of the GPL are applicable instead of those above.
If you wish to allow use of your version of this file only under the terms
of the GPL and not to allow others to use your version of this file
under the MPL, indicate your decision by deleting the provisions above and
replace them with the notice and other provisions required by the GPL.
If you do not delete the provisions above, a recipient may use your version
of this file under either the MPL or the GPL.
$Id: SynCompletionProposal.pas,v 1.68 2004/02/05 11:08:04 plpolak Exp $
You may retrieve the latest version of this file at the SynEdit home page,
located at http://SynEdit.SourceForge.net
Known Issues:
-------------------------------------------------------------------------------}
{$IFNDEF QSYNCOMPLETIONPROPOSAL}
unit SynCompletionProposal;
{$ENDIF}
{$I SynEdit.inc}
interface
uses
{$IFDEF SYN_CLX}
Qt,
Types,
QControls,
QGraphics,
QForms,
QStdCtrls,
QExtCtrls,
QMenus,
QImgList,
QDialogs,
QSynEditTypes,
QSynEditKeyCmds,
QSynEditHighlighter,
QSynEditKbdHandler,
QSynEdit,
{$ELSE}
Windows,
Messages,
Graphics,
Forms,
Controls,
StdCtrls,
ExtCtrls,
Menus,
Dialogs,
SynEditTypes,
SynEditKeyCmds,
SynEditHighlighter,
SynEditKbdHandler,
SynEdit,
{$ENDIF}
SysUtils,
Classes;
type
SynCompletionType = (ctCode, ctHint, ctParams);
TSynForm = {$IFDEF SYN_COMPILER_3_UP}TCustomForm{$ELSE}TForm{$ENDIF};
TSynBaseCompletionProposalPaintItem = procedure(Sender: TObject;
Index: Integer; TargetCanvas: TCanvas; ItemRect: TRect;
var CustomDraw: Boolean) of object;
TSynBaseCompletionProposalMeasureItem = procedure(Sender: TObject;
Index: Integer; TargetCanvas: TCanvas; var ItemWidth: Integer) of object;
TCodeCompletionEvent = procedure(Sender: TObject; var Value: string;
Shift: TShiftState; Index: Integer; EndToken: Char) of object;
//GBN 14/11/2001
TAfterCodeCompletionEvent = procedure(Sender: TObject; const Value: string;
Shift: TShiftState; Index: Integer; EndToken: Char) of object;
TValidateEvent = procedure(Sender: TObject; Shift: TShiftState;
EndToken: Char) of object; //GBN15/11/2001, Added EndToken
TCompletionParameter = procedure(Sender: TObject; CurrentIndex: Integer;
var Level, IndexToDisplay: Integer; var Key: Char;
var DisplayString: string) of object;
TCompletionExecute = procedure(Kind: SynCompletionType; Sender: TObject;
var CurrentInput: string; var x, y: Integer; var CanExecute: Boolean) of object;
TCompletionChange = procedure(Sender: TObject; AIndex: Integer) of object;
TSynCompletionOption = (scoAnsiStrings, //Use Ansi comparison during string operations
scoCaseSensitive, //Use case sensitivity to do matches
scoLimitToMatchedText, //Limit the matched text to only what they have typed in
scoTitleIsCentered, //Center the title in the box if you choose to use titles
scoUseInsertList, //Use the InsertList to insert text instead of the ItemList (which will be displayed)
scoUsePrettyText, //Use the PrettyText function to output the words
scoUseBuiltInTimer, //Use the built in timer and the trigger keys to execute the proposal as well as the shortcut
scoEndCharCompletion, //When an end char is pressed, it triggers completion to occur (like the Delphi IDE)
scoConsiderWordBreakChars,//Use word break characters as additional end characters
scoCompleteWithTab, //Use the tab character for completion
scoCompleteWithEnter); //Use the Enter character for completion
TSynCompletionOptions = set of TSynCompletionOption;
const
DefaultProposalOptions = [scoLimitToMatchedText, scoEndCharCompletion, scoCompleteWithTab, scoCompleteWithEnter];
DefaultEndOfTokenChr = '()[]. ';
type
TProposalColumns = class;
TSynBaseCompletionProposalForm = class(TSynForm)
private
FCurrentString : string;
FOnKeyPress : TKeyPressEvent;
FOnPaintItem : TSynBaseCompletionProposalPaintItem;
FOnMeasureItem: TSynBaseCompletionProposalMeasureItem;
FOnChangePosition: TCompletionChange;
FItemList : TStrings;
FInsertList : TStrings;
FAssignedList : TStrings;
FPosition : Integer;
FLinesInWindow : Integer;
FTitleFontHeight: Integer;
FFontHeight : integer;
FScrollbar : TScrollBar;
FOnValidate : TValidateEvent;
FOnCancel : TNotifyEvent;
FClSelect : TColor;
fClSelectText : TColor;
FClTitleBackground: TColor;
fClBackGround : TColor;
FWordBreakChars: TSynIdentChars;
Bitmap: TBitmap; // used for drawing
TitleBitmap: TBitmap; // used for title-drawing
FCurrentEditor: TCustomSynEdit;
FTitle: string;
FTitleFont: TFont;
FFont: TFont;
FResizeable: Boolean;
FItemHeight: Integer;
FMargin: Integer;
FEffectiveItemHeight: Integer;
FImages: TImageList;
//These are the reflections of the Options property of the CompletionProposal
FAnsi : boolean;
FCase : boolean;
FMatchText : Boolean;
FFormattedText: Boolean;
FCenterTitle: Boolean;
FUseInsertList: boolean;
FCompleteWithTab: Boolean;
FCompleteWithEnter: Boolean;
FMouseWheelAccumulator: integer;
FDisplayKind : SynCompletionType;
FParameterToken : TCompletionParameter;
FCurrentIndex : Integer;
FCurrentLevel : Integer;
FDefaultKind : SynCompletionType;
FEndOfTokenChr : String;
FTriggerChars : String;
OldShowCaret : Boolean;
FHeightBuffer : Integer;
FColumns: TProposalColumns;
procedure SetCurrentString(const Value: string);
procedure MoveLine (cnt: Integer);
procedure ScrollbarOnChange(Sender: TObject);
procedure ScrollbarOnScroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
procedure ScrollbarOnEnter(Sender: TObject);
procedure SetItemList(const Value: TStrings);
procedure SetInsertList(const Value: TStrings);
procedure SetPosition(const Value: Integer);
procedure SetResizeable(const Value: Boolean);
procedure SetItemHeight(const Value: Integer);
procedure SetImages(const Value: TImageList);
procedure StringListChange(Sender: TObject);
procedure DoDoubleClick(Sender : TObject);
procedure DoFormShow(Sender: TObject);
procedure DoFormHide(Sender: TObject);
procedure AdjustScrollBarPosition;
procedure AdjustMetrics;
procedure SetTitle(const Value: string);
procedure SetFont(const Value: TFont);
procedure SetTitleFont(const Value: TFont);
procedure SetColumns(Value: TProposalColumns);
procedure TitleFontChange(Sender: TObject);
procedure FontChange(Sender: TObject);
function LogicalToPhysicalIndex(Index: Integer): Integer; //GBN 30/08/2002
procedure RecalcItemHeight;
protected
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure Paint; override;
procedure Activate; override;
procedure Deactivate; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure Resize; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
{$IFDEF SYN_CLX}
function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
const MousePos: TPoint): Boolean; override;
function WidgetFlags: Integer; override;
{$ELSE}
procedure WMMouseWheel(var Msg: TMessage); message WM_MOUSEWHEEL;
procedure WMActivate (var Message: TWMActivate); message WM_ACTIVATE;
procedure WMEraseBackgrnd(var Message: TMessage); message WM_ERASEBKGND;
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; //GBN 24/02/2002
procedure CreateParams(var Params: TCreateParams); override;
{$IFDEF SYN_DELPHI_4_UP}
function CanResize(var NewWidth, NewHeight: Integer): Boolean; override;
{$ENDIF}
{$ENDIF}
public
constructor Create(AOwner: Tcomponent); override;
destructor Destroy; override;
property DisplayType : SynCompletionType read FDisplayKind write FDisplayKind;
property DefaultType : SynCompletionType read FDefaultKind write FDefaultKind default ctCode;
property CurrentString : string read FCurrentString write SetCurrentString;
Property CurrentIndex : Integer read FCurrentIndex write FCurrentIndex;
Property CurrentLevel : Integer read FCurrentLevel write FCurrentLevel;
Property OnParameterToken : TCompletionParameter read FParameterToken write FParameterToken;
property OnKeyPress : TKeyPressEvent read FOnKeyPress write FOnKeyPress;
property OnPaintItem : TSynBaseCompletionProposalPaintItem read FOnPaintItem write FOnPaintItem;
property OnMeasureItem: TSynBaseCompletionProposalMeasureItem read FOnMeasureItem write FOnMeasureItem;
property OnValidate : TValidateEvent read FOnValidate write FOnValidate;
property OnCancel : TNotifyEvent read FOnCancel write FOnCancel;
property ItemList : TStrings read FItemList write SetItemList;
Property InsertList : TStrings read FInsertList write SetInsertList;
property AssignedList : TStrings read FAssignedList write FAssignedList;
property Position : Integer read FPosition write SetPosition;
property Title : string read fTitle write SetTitle;
property ClSelect : TColor read FClSelect write FClSelect default clHighlight;
property ClSelectedText : TColor read FClSelectText write FClSelectText default clHighlightText;
property ClBackground : TColor read FClBackGround write FClBackGround default clWindow;
property ClTitleBackground: TColor read FClTitleBackground write FClTitleBackground default clBtnFace;
property ItemHeight: Integer read FItemHeight write SetItemHeight default 0;
property Margin: Integer read FMargin write FMargin default 2;
property UsePrettyText : boolean read FFormattedText write FFormattedText default False;
property UseInsertList : boolean read FUseInsertList write FUseInsertList default False;
property CenterTitle : boolean read FCenterTitle write FCenterTitle default True;
property AnsiStrings : boolean read fansi write fansi default True;
property CaseSensitive : Boolean read fCase write fCase default False;
property CurrentEditor : TCustomSynEdit read fCurrentEditor write fCurrentEditor;
property MatchText : Boolean read fMatchText write fMatchText;
property EndOfTokenChr : String read FEndOfTokenChr write FEndOfTokenChr;
property TriggerChars : String read FTriggerChars write FTriggerChars;
property CompleteWithTab : Boolean read FCompleteWithTab write FCompleteWithTab;
property CompleteWithEnter: Boolean read FCompleteWithEnter write FCompleteWithEnter;
property TitleFont : TFont read fTitleFont write SetTitleFont;
property Font : TFont read fFont write SetFont;
property Columns: TProposalColumns read FColumns write SetColumns;
property Resizeable: Boolean read FResizeable write SetResizeable default True;
property Images: TImageList read FImages write SetImages;
end;
TSynBaseCompletionProposal = class(TComponent)
private
FForm: TSynBaseCompletionProposalForm;
FOnExecute: TCompletionExecute;
FOnClose: TNotifyEvent; //GBN 28/08/2002
FOnShow: TNotifyEvent; //GBN 28/08/2002
FWidth: Integer;
FPreviousToken: string;
FDotOffset : Integer;
FOptions : TSynCompletionOptions;
FNbLinesInWindow: Integer;
FCanExecute: Boolean;
function GetClSelect: TColor;
procedure SetClSelect(const Value: TColor);
function GetCurrentString: string;
function GetItemList: TStrings;
function GetInsertList: TStrings;
function GetOnCancel: TNotifyEvent;
function GetOnKeyPress: TKeyPressEvent;
function GetOnPaintItem: TSynBaseCompletionProposalPaintItem;
function GetOnMeasureItem: TSynBaseCompletionProposalMeasureItem;
function GetOnValidate: TValidateEvent;
function GetPosition: Integer;
procedure SetCurrentString(const Value: string);
procedure SetItemList(const Value: TStrings);
procedure SetInsertList(const Value: TStrings);
procedure SetNbLinesInWindow(const Value: Integer);
procedure SetOnCancel(const Value: TNotifyEvent);
procedure SetOnKeyPress(const Value: TKeyPressEvent);
procedure SetOnPaintItem(const Value: TSynBaseCompletionProposalPaintItem);
procedure SetOnMeasureItem(const Value: TSynBaseCompletionProposalMeasureItem);
procedure SetPosition(const Value: Integer);
procedure SetOnValidate(const Value: TValidateEvent);
procedure SetWidth(Value: Integer);
procedure SetImages(const Value: TImageList);
function GetDisplayKind: SynCompletionType;
procedure SetDisplayKind(const Value: SynCompletionType);
function GetParameterToken: TCompletionParameter;
procedure SetParameterToken(const Value: TCompletionParameter);
function GetDefaultKind: SynCompletionType;
procedure SetDefaultKind(const Value: SynCompletionType);
function GetClBack: TColor;
procedure SetClBack(const Value: TColor);
function GetClSelectedText: TColor;
procedure SetClSelectedText(const Value: TColor);
function GetEndOfTokenChar: string;
procedure SetEndOfTokenChar(const Value: string);
function GetClTitleBackground: TColor;
procedure SetClTitleBackground(const Value: TColor);
procedure SetTitle(const Value: string);
function GetTitle: string;
function GetFont: TFont;
function GetTitleFont: TFont;
procedure SetFont(const Value: TFont);
procedure SetTitleFont(const Value: TFont);
function GetOptions: TSynCompletionOptions;
function GetTriggerChars: String;
procedure SetTriggerChars(const Value: String);
function GetOnChange: TCompletionChange;
procedure SetOnChange(const Value: TCompletionChange);
procedure SetColumns(const Value: TProposalColumns);
function GetColumns: TProposalColumns;
function GetResizeable: Boolean;
procedure SetResizeable(const Value: Boolean);
function GetItemHeight: Integer;
procedure SetItemHeight(const Value: Integer);
function GetMargin: Integer;
procedure SetMargin(const Value: Integer);
function GetImages: TImageList;
protected
procedure SetOptions(const Value: TSynCompletionOptions); virtual;
procedure EditorCancelMode(Sender: TObject); virtual; //GBN 13/11/2001
procedure HookedEditorCommand(Sender: TObject; AfterProcessing: Boolean;
var Handled: Boolean; var Command: TSynEditorCommand; var AChar: Char;
Data: Pointer; HandlerData: Pointer); virtual; //GBN 13/11/2001
public
constructor Create(Aowner: TComponent); override;
procedure Execute(s: string; x, y: integer);
procedure ExecuteEx(s: string; x, y: integer; Kind: SynCompletionType
{$IFDEF SYN_COMPILER_4_UP} = ctCode {$ENDIF}); virtual;
procedure Activate;
procedure Deactivate;
procedure ClearList;
function DisplayItem(AIndex : Integer): string;
function InsertItem(AIndex : Integer): string;
procedure AddItemAt(Where : Integer; ADisplayText, AInsertText: string);
procedure AddItem(ADisplayText, AInsertText : string);
procedure ResetAssignedList;
property OnKeyPress: TKeyPressEvent read GetOnKeyPress write SetOnKeyPress;
property OnValidate: TValidateEvent read GetOnValidate write SetOnValidate;
property OnCancel: TNotifyEvent read GetOnCancel write SetOnCancel;
property CurrentString: string read GetCurrentString write SetCurrentString;
property DotOffset : Integer read FDotOffset write FDotOffset;
property DisplayType : SynCompletionType read GetDisplayKind write SetDisplayKind;
property Form: TSynBaseCompletionProposalForm read FForm;
property PreviousToken: string read FPreviousToken;
property Position: Integer read GetPosition write SetPosition;
published
property DefaultType : SynCompletionType read GetDefaultKind write SetDefaultKind default ctCode;
property Options: TSynCompletionOptions read GetOptions write SetOptions default DefaultProposalOptions;
property ItemList: TStrings read GetItemList write SetItemList;
property InsertList: TStrings read GetInsertList write SetInsertList;
property NbLinesInWindow: Integer read FNbLinesInWindow write SetNbLinesInWindow default 8;
property ClSelect: TColor read GetClSelect write SetClSelect default clHighlight;
property ClSelectedText: TColor read GetClSelectedText write SetClSelectedText default clHighlightText;
property ClBackground: TColor read GetClBack write SetClBack default clWindow;
property ClTitleBackground: TColor read GetClTitleBackground write SetClTitleBackground default clBtnFace;
property Width: Integer read FWidth write SetWidth default 260;
property EndOfTokenChr: string read GetEndOfTokenChar write SetEndOfTokenChar;
property TriggerChars: String read GetTriggerChars write SetTriggerChars;
property Title: string read GetTitle write SetTitle;
property Font: TFont read GetFont write SetFont;
property TitleFont: TFont read GetTitleFont write SetTitleFont;
property Columns: TProposalColumns read GetColumns write SetColumns;
property Resizeable: Boolean read GetResizeable write SetResizeable default True;
property ItemHeight: Integer read GetItemHeight write SetItemHeight default 0;
property Images: TImageList read GetImages write SetImages default nil;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -