📄 syncompletionproposal.pas
字号:
FTitleFont := TFont.Create;
FTitleFont.Name := 'MS Sans Serif';
FTitleFont.Size := 8;
FTitleFont.Style := [fsBold];
FTitleFont.Color := clBtnText;
FFont := TFont.Create;
FFont.Name := 'MS Sans Serif';
FFont.Size := 8;
ClSelect := clHighlight;
ClSelectedText := clHighlightText;
ClBackground := clWindow;
ClTitleBackground := clBtnFace;
(FItemList as TStringList).OnChange := StringListChange; // Really necessary? It seems to work
FTitle := ''; // fine without it
FUseInsertList := False;
FFormattedText := False;
FCenterTitle := True;
FAnsi := True;
FCase := False;
FColumns := TProposalColumns.Create(AOwner, TProposalColumn);
FItemHeight := 0;
FMargin := 2;
FEffectiveItemHeight := 0;
RecalcItemHeight;
Canvas.Font.Assign(FTitleFont);
FTitleFontHeight := Canvas.TextHeight(TextHeightString);
FHeightBuffer := 0;
FTitleFont.OnChange := TitleFontChange;
FFont.OnChange := FontChange;
OnDblClick := DoDoubleClick;
OnShow := DoFormShow;
OnHide := DoFormHide;
end;
{$IFDEF SYN_CLX}
function TSynBaseCompletionProposalForm.DoMouseWheel(Shift: TShiftState;
WheelDelta: Integer; const MousePos: TPoint): Boolean;
const
WHEEL_DIVISOR = 120; { according to Qt API... }
var
iWheelClicks: integer;
iLinesToScroll: integer;
begin
if ssCtrl in Application.KeyState then
iLinesToScroll := FLinesInWindow
else
iLinesToScroll := 3;
Inc( fMouseWheelAccumulator, WheelDelta );
iWheelClicks := fMouseWheelAccumulator div WHEEL_DIVISOR;
fMouseWheelAccumulator := fMouseWheelAccumulator mod WHEEL_DIVISOR;
Position := Position - iWheelClicks * iLinesToScroll;
Update;
Result := True;
end;
function TSynBaseCompletionProposalForm.WidgetFlags: Integer;
begin
Result := Integer(WidgetFlags_WType_Popup);
end;
{$ELSE SYN_CLX}
procedure TSynBaseCompletionProposalForm.CreateParams(var Params: TCreateParams);
const
CS_DROPSHADOW = $20000;
{$IFNDEF SYN_COMPILER_3_UP}
var
VersionInfo: TOSVersionInfo;
{$ENDIF}
begin
inherited;
with Params do
begin
Style := WS_POPUP;
ExStyle := WS_EX_TOOLWINDOW;
{$IFDEF SYN_COMPILER_3_UP}
if ((Win32Platform and VER_PLATFORM_WIN32_NT) <> 0)
and (Win32MajorVersion > 4)
and (Win32MinorVersion > 0) {Windows XP} then
{$ELSE}
VersionInfo.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
if GetVersionEx(VersionInfo)
and ((VersionInfo.dwPlatformId and VER_PLATFORM_WIN32_NT) <> 0)
and (VersionInfo.dwMajorVersion > 4)
and (VersionInfo.dwMinorVersion > 0) {Windows XP} then
{$ENDIF}
Params.WindowClass.style := Params.WindowClass.style or CS_DROPSHADOW;
if DisplayType = ctCode then
if FResizeable then
Style := Style or WS_THICKFRAME
else
Style := Style or WS_DLGFRAME;
end;
end;
{$ENDIF}
procedure TSynBaseCompletionProposalForm.Activate;
begin
Visible := True;
if DisplayType = ctCode then
(CurrentEditor as TCustomSynEdit).AddFocusControl(Self);
end;
procedure TSynBaseCompletionProposalForm.Deactivate;
begin
if (DisplayType = ctCode) then
(CurrentEditor as TCustomSynEdit).RemoveFocusControl(Self);
Visible := False;
end;
destructor TSynBaseCompletionProposalForm.Destroy;
begin
inherited Destroy;
FColumns.Free;
Bitmap.Free;
TitleBitmap.Free;
FItemList.Free;
FInsertList.Free;
FAssignedList.Free;
FTitleFont.Free;
FFont.Free;
end;
procedure TSynBaseCompletionProposalForm.KeyDown(var Key: Word; Shift: TShiftState);
var
C: Char;
begin
if DisplayType = ctCode then
begin
case Key of
SYNEDIT_RETURN:
if (FCompleteWithEnter) and Assigned(OnValidate) then
OnValidate(Self, Shift, #0); //GBN 15/11/2001
SYNEDIT_TAB:
if (FCompleteWithTab) and Assigned(OnValidate) then
OnValidate(Self, Shift, #0);
SYNEDIT_ESCAPE:
begin
if Assigned(OnCancel) then
OnCancel(Self);
end;
SYNEDIT_LEFT:
begin
if Length(FCurrentString) > 0 then
begin
CurrentString := Copy(CurrentString, 1, Length(CurrentString) - 1);
if Assigned(CurrentEditor) then
(CurrentEditor as TCustomSynEdit).CommandProcessor(ecLeft, #0, nil);
end else
begin
//Since we have control, we need to re-send the key to
//the editor so that the cursor behaves properly
if Assigned(CurrentEditor) then
(CurrentEditor as TCustomSynEdit).CommandProcessor(ecLeft, #0, nil);
if Assigned(OnCancel) then
OnCancel(Self);
end;
end;
SYNEDIT_RIGHT:
begin
if Assigned(CurrentEditor) then
with CurrentEditor as TCustomSynEdit do
begin
if CaretX <= Length(LineText) then
C := LineText[CaretX]
else
C := #32;
if (C = #9) or (C = #32) or (C in FWordBreakChars) then
if Assigned(OnCancel) then
OnCancel(Self)
else
else
CurrentString := CurrentString + C;
CommandProcessor(ecRight, #0, nil);
end;
end;
SYNEDIT_PRIOR:
MoveLine(FLinesInWindow * -1);
SYNEDIT_NEXT:
MoveLine(FLinesInWindow);
SYNEDIT_END:
Position := FAssignedList.Count - 1;
SYNEDIT_HOME:
Position := 0;
SYNEDIT_UP:
if ssCtrl in Shift then
Position := 0
else
MoveLine(-1);
SYNEDIT_DOWN:
if ssCtrl in Shift then
Position := FAssignedList.Count - 1
else
MoveLine(1);
SYNEDIT_BACK:
if (Shift = []) then
begin
if Length(FCurrentString) > 0 then
begin
CurrentString := Copy(CurrentString, 1, Length(CurrentString) - 1);
if Assigned(CurrentEditor) then
(CurrentEditor as TCustomSynEdit).CommandProcessor(ecDeleteLastChar, #0, nil);
end else
begin
//Since we have control, we need to re-send the key to
//the editor so that the cursor behaves properly
if Assigned(CurrentEditor) then
(CurrentEditor as TCustomSynEdit).CommandProcessor(ecDeleteLastChar, #0, nil);
if Assigned(OnCancel) then
OnCancel(Self);
end;
end;
SYNEDIT_DELETE: if Assigned(CurrentEditor) then
(CurrentEditor as TCustomSynEdit).CommandProcessor(ecDeleteChar, #0, nil);
end;
end;
Invalidate;
end;
procedure TSynBaseCompletionProposalForm.KeyPress(var Key: char);
begin
if DisplayType = ctCode then
begin
case Key of
#13, #27:; // These keys are already handled by KeyDown
#32..'z':
begin
if (Key in FWordBreakChars) and Assigned(OnValidate) then
begin
if Key = #32 then
OnValidate(Self, [], #0)
else OnValidate(Self, [], Key);
end;
CurrentString := CurrentString +Key;
if Assigned(OnKeyPress) then
OnKeyPress(Self, Key);
end;
#8:
if Assigned(OnKeyPress) then
OnKeyPress(Self, Key);
else
with CurrentEditor as TCustomSynEdit do
CommandProcessor(ecChar, Key, nil);
if Assigned(OnCancel) then
OnCancel(Self);
end;
end;
Invalidate;
end;
procedure TSynBaseCompletionProposalForm.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
y := (y - fHeightBuffer) div FEffectiveItemHeight;
Position := FScrollbar.Position + y;
// (CurrentEditor as TCustomSynEdit).UpdateCaret;
end;
{$IFNDEF SYN_CLX}
{$IFDEF SYN_DELPHI_4_UP}
function TSynBaseCompletionProposalForm.CanResize(var NewWidth, NewHeight: Integer): Boolean;
var
NewLinesInWindow: Integer;
BorderWidth: Integer;
begin
Result := True;
case FDisplayKind of
ctCode:
begin
BorderWidth := 2 * GetSystemMetrics(SM_CYSIZEFRAME);
if FEffectiveItemHeight <> 0 then
begin
NewLinesInWindow := (NewHeight-FHeightBuffer) div FEffectiveItemHeight;
if NewLinesInWindow < 1 then
NewLinesInWindow := 1;
end else
NewLinesInWindow := 0;
FLinesInWindow := NewLinesInWindow;
NewHeight := FEffectiveItemHeight * FLinesInWindow + FHeightBuffer + BorderWidth;
if (NewWidth-BorderWidth) < FScrollbar.Width then
NewWidth := FScrollbar.Width+BorderWidth;
end;
ctHint:;
ctParams:;
end;
end;
{$ENDIF}
{$ENDIF}
procedure TSynBaseCompletionProposalForm.Resize;
begin
inherited;
if FEffectiveItemHeight <> 0 then
FLinesInWindow := (Height - FHeightBuffer) div FEffectiveItemHeight;
if not( csCreating in ControlState ) then
AdjustMetrics;
AdjustScrollBarPosition;
Invalidate;
end;
procedure TSynBaseCompletionProposalForm.Paint;
procedure ResetCanvas;
begin
with Bitmap.Canvas do
begin
Pen.Color := FClBackGround;
Brush.Color := FClBackGround;
Font.Assign(FFont);
end;
end;
const
TitleMargin = 2;
var
TmpRect: TRect;
TmpX: Integer;
AlreadyDrawn: boolean;
TmpString: string;
i: Integer;
begin
if FDisplayKind = ctCode then
begin
with Bitmap do
begin
ResetCanvas;
Canvas.Pen.Color := clBtnFace;
Canvas.Rectangle(0, 0, ClientWidth - FScrollbar.Width, ClientHeight);
for i := 0 to Min(FLinesInWindow - 1, FAssignedList.Count - 1) do
begin
if i + FScrollbar.Position = Position then
begin
Canvas.Brush.Color := FClSelect;
Canvas.Pen.Color := FClSelect;
Canvas.Rectangle(0, FEffectiveItemHeight * i, ClientWidth - FScrollbar.Width,
FEffectiveItemHeight * (i+1));
Canvas.Pen.Color := fClSelectText;
Canvas.Font.Assign(FFont);
Canvas.Font.Color := FClSelectText;
end;
AlreadyDrawn := False;
if Assigned(OnPaintItem) then
OnPaintItem(Self, LogicalToPhysicalIndex(FScrollBar.Position+i),
Canvas, Rect(0, FEffectiveItemHeight*i, ClientWidth - FScrollbar.Width,
FEffectiveItemHeight * (i+1)), AlreadyDrawn);
if AlreadyDrawn then
ResetCanvas
else
begin
if FFormattedText then
begin
FormattedTextOut(Canvas, Rect(FMargin,
FEffectiveItemHeight*i +((FEffectiveItemHeight -FFontHeight) div 2),
Bitmap.Width, FEffectiveItemHeight*(i+1)),
FAssignedList[FScrollbar.Position+i],
(i+FScrollbar.Position = Position), FColumns, FImages);
end else
begin
Canvas.TextOut(FMargin, FEffectiveItemHeight* i,
FAssignedList[FScrollbar.Position+i]);
end;
if i + FScrollbar.Position = Position then
ResetCanvas;
end;
end;
end;
Canvas.Draw(0, FHeightBuffer, Bitmap);
if FTitle <> '' then
begin
with TitleBitmap do
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -