IDE: started code help hint window

git-svn-id: trunk@12766 -
This commit is contained in:
mattias 2007-11-07 17:00:51 +00:00
parent 859fbcbdf6
commit dbf55b433f
9 changed files with 456 additions and 20 deletions

1
.gitattributes vendored
View File

@ -1720,6 +1720,7 @@ ide/codeexplopts.pas svneol=native#text/pascal
ide/codeexplorer.lfm svneol=native#text/plain ide/codeexplorer.lfm svneol=native#text/plain
ide/codeexplorer.lrs svneol=native#text/pascal ide/codeexplorer.lrs svneol=native#text/pascal
ide/codeexplorer.pas svneol=native#text/pascal ide/codeexplorer.pas svneol=native#text/pascal
ide/codehelpform.pas svneol=native#text/plain
ide/codemacroprompt.lfm svneol=native#text/plain ide/codemacroprompt.lfm svneol=native#text/plain
ide/codemacroprompt.lrs svneol=native#text/plain ide/codemacroprompt.lrs svneol=native#text/plain
ide/codemacroprompt.pas svneol=native#text/plain ide/codemacroprompt.pas svneol=native#text/plain

View File

@ -149,6 +149,7 @@ type
Bitmap: TBitmap; // used for drawing Bitmap: TBitmap; // used for drawing
fCurrentEditor: TComponent; fCurrentEditor: TComponent;
FOnMeasureItem: TSynBaseCompletionMeasureItem; FOnMeasureItem: TSynBaseCompletionMeasureItem;
FOnPositionChanged: TNotifyEvent;
public public
constructor Create(AOwner: Tcomponent); override; constructor Create(AOwner: Tcomponent); override;
destructor Destroy; override; destructor Destroy; override;
@ -178,9 +179,10 @@ type
property FontHeight:integer read FFontHeight write SetFontHeight; property FontHeight:integer read FFontHeight write SetFontHeight;
property OnSearchPosition:TSynBaseCompletionSearchPosition property OnSearchPosition:TSynBaseCompletionSearchPosition
read FOnSearchPosition write FOnSearchPosition; read FOnSearchPosition write FOnSearchPosition;
property OnKeyCompletePrefix: TNotifyEvent read FOnKeyCompletePrefix write FOnKeyCompletePrefix; property OnKeyCompletePrefix: TNotifyEvent read FOnKeyCompletePrefix write FOnKeyCompletePrefix;// e.g. Tab
property OnKeyNextChar: TNotifyEvent read FOnKeyNextChar write FOnKeyNextChar; property OnKeyNextChar: TNotifyEvent read FOnKeyNextChar write FOnKeyNextChar;// e.g. arrow right
property OnKeyPrevChar: TNotifyEvent read FOnKeyPrevChar write FOnKeyPrevChar; property OnKeyPrevChar: TNotifyEvent read FOnKeyPrevChar write FOnKeyPrevChar;// e.g. arrow left
property OnPositionChanged: TNotifyEvent read FOnPositionChanged write FOnPositionChanged;
property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor; property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor;
property TextColor: TColor read FTextColor write FTextColor; property TextColor: TColor read FTextColor write FTextColor;
property TextSelectedColor: TColor property TextSelectedColor: TColor
@ -201,6 +203,7 @@ type
function GetClSelect: TColor; function GetClSelect: TColor;
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
function GetOnMeasureItem: TSynBaseCompletionMeasureItem; function GetOnMeasureItem: TSynBaseCompletionMeasureItem;
function GetOnPositionChanged: TNotifyEvent;
{$ENDIF} {$ENDIF}
procedure SetClSelect(const Value: TColor); procedure SetClSelect(const Value: TColor);
function GetCurrentString: string; function GetCurrentString: string;
@ -218,6 +221,7 @@ type
procedure SetOnKeyPress(const Value: TKeyPressEvent); procedure SetOnKeyPress(const Value: TKeyPressEvent);
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
procedure SetOnMeasureItem(const AValue: TSynBaseCompletionMeasureItem); procedure SetOnMeasureItem(const AValue: TSynBaseCompletionMeasureItem);
procedure SetOnPositionChanged(const AValue: TNotifyEvent);
{$ENDIF} {$ENDIF}
procedure SetOnPaintItem(const Value: TSynBaseCompletionPaintItem); procedure SetOnPaintItem(const Value: TSynBaseCompletionPaintItem);
procedure SetPosition(const Value: Integer); procedure SetPosition(const Value: Integer);
@ -272,11 +276,13 @@ type
property OnSearchPosition: TSynBaseCompletionSearchPosition property OnSearchPosition: TSynBaseCompletionSearchPosition
read GetOnSearchPosition write SetOnSearchPosition; read GetOnSearchPosition write SetOnSearchPosition;
property OnKeyCompletePrefix: TNotifyEvent read GetOnKeyCompletePrefix property OnKeyCompletePrefix: TNotifyEvent read GetOnKeyCompletePrefix
write SetOnKeyCompletePrefix; write SetOnKeyCompletePrefix;// e.g. Tab
property OnKeyNextChar: TNotifyEvent read GetOnKeyNextChar property OnKeyNextChar: TNotifyEvent read GetOnKeyNextChar
write SetOnKeyNextChar; write SetOnKeyNextChar;// e.g. arrow right
property OnKeyPrevChar: TNotifyEvent read GetOnKeyPrevChar property OnKeyPrevChar: TNotifyEvent read GetOnKeyPrevChar
write SetOnKeyPrevChar; write SetOnKeyPrevChar;// e.g. arrow left
property OnPositionChanged: TNotifyEvent read GetOnPositionChanged
write SetOnPositionChanged;
{$ENDIF} {$ENDIF}
property ClSelect: TColor read GetClSelect write SetClSelect; property ClSelect: TColor read GetClSelect write SetClSelect;
property AnsiStrings: boolean read SFAnsi write RFAnsi; property AnsiStrings: boolean read SFAnsi write RFAnsi;
@ -872,6 +878,7 @@ begin
else if Scroll.Position < Position - NbLinesInWindow + 1 then else if Scroll.Position < Position - NbLinesInWindow + 1 then
Scroll.Position := Position - NbLinesInWindow + 1; Scroll.Position := Position - NbLinesInWindow + 1;
Invalidate; Invalidate;
if Assigned(OnPositionChanged) then OnPositionChanged(Self);
end; end;
end; end;
{$IFDEF SYN_LAZARUS} {$IFDEF SYN_LAZARUS}
@ -1077,6 +1084,11 @@ procedure TSynBaseCompletion.SetOnMeasureItem(
begin begin
Form.OnMeasureItem := AValue; Form.OnMeasureItem := AValue;
end; end;
procedure TSynBaseCompletion.SetOnPositionChanged(const AValue: TNotifyEvent);
begin
Form.OnPositionChanged := AValue;
end;
{$ENDIF} {$ENDIF}
procedure TSynBaseCompletion.SetOnPaintItem(const Value: procedure TSynBaseCompletion.SetOnPaintItem(const Value:
@ -1105,6 +1117,11 @@ function TSynBaseCompletion.GetOnMeasureItem: TSynBaseCompletionMeasureItem;
begin begin
Result := Form.OnMeasureItem; Result := Form.OnMeasureItem;
end; end;
function TSynBaseCompletion.GetOnPositionChanged: TNotifyEvent;
begin
Result := Form.OnPositionChanged;
end;
{$ENDIF} {$ENDIF}
procedure TSynBaseCompletion.SetClSelect(const Value: TColor); procedure TSynBaseCompletion.SetClSelect(const Value: TColor);

View File

@ -28,6 +28,7 @@
Abstract: Abstract:
The popup tooltip window for the source editor. The popup tooltip window for the source editor.
For example for the parameter hints.
} }
unit CodeContextForm; unit CodeContextForm;
@ -60,6 +61,7 @@ type
FLastParameterIndex: integer; FLastParameterIndex: integer;
FParamListBracketOpenCodeXYPos: TCodeXYPosition; FParamListBracketOpenCodeXYPos: TCodeXYPosition;
FProcNameCodeXYPos: TCodeXYPosition; FProcNameCodeXYPos: TCodeXYPosition;
FSourceEditorTopIndex: integer;
procedure CreateHints(const CodeContexts: TCodeContextInfo); procedure CreateHints(const CodeContexts: TCodeContextInfo);
procedure ClearMarksInHints; procedure ClearMarksInHints;
procedure MarkCurrentParameterInHints(ParameterIndex: integer); // 0 based procedure MarkCurrentParameterInHints(ParameterIndex: integer); // 0 based
@ -75,12 +77,13 @@ type
property ProcNameCodeXYPos: TCodeXYPosition read FProcNameCodeXYPos; property ProcNameCodeXYPos: TCodeXYPosition read FProcNameCodeXYPos;
property ParamListBracketOpenCodeXYPos: TCodeXYPosition property ParamListBracketOpenCodeXYPos: TCodeXYPosition
read FParamListBracketOpenCodeXYPos; read FParamListBracketOpenCodeXYPos;
property SourceEditorTopIndex: integer read FSourceEditorTopIndex;
property LastParameterIndex: integer read FLastParameterIndex; property LastParameterIndex: integer read FLastParameterIndex;
end; end;
var var
CodeContextFrm: TCodeContextFrm = nil; CodeContextFrm: TCodeContextFrm = nil;
function ShowCodeContext(Code: TCodeBuffer): boolean; function ShowCodeContext(Code: TCodeBuffer): boolean;
implementation implementation
@ -151,8 +154,8 @@ var
DrawWidth: LongInt; DrawWidth: LongInt;
DrawHeight: LongInt; DrawHeight: LongInt;
begin begin
DrawWidth:=Self.ClientWidth; DrawWidth:=ClientWidth;
DrawHeight:=Self.ClientHeight; DrawHeight:=ClientHeight;
DrawHints(DrawWidth,DrawHeight,true); DrawHints(DrawWidth,DrawHeight,true);
end; end;
@ -220,6 +223,7 @@ begin
SrcEdit:=SourceEditorWindow.ActiveEditor; SrcEdit:=SourceEditorWindow.ActiveEditor;
if (SrcEdit=nil) or (SrcEdit.CodeToolsBuffer<>ProcNameCodeXYPos.Code) then if (SrcEdit=nil) or (SrcEdit.CodeToolsBuffer<>ProcNameCodeXYPos.Code) then
exit; exit;
if SrcEdit.TopLine<>FSourceEditorTopIndex then exit;
CurTextXY:=SrcEdit.CursorTextXY; CurTextXY:=SrcEdit.CursorTextXY;
BracketPos:=Point(ParamListBracketOpenCodeXYPos.X, BracketPos:=Point(ParamListBracketOpenCodeXYPos.X,
@ -247,7 +251,7 @@ begin
SetLength(Code,length(Code)-length(Line)+CurTextXY.X-1); SetLength(Code,length(Code)-length(Line)+CurTextXY.X-1);
end; end;
//DebugLn('TCodeContextFrm.UpdateHints Code="',DbgStr(Code),'"'); //DebugLn('TCodeContextFrm.UpdateHints Code="',DbgStr(Code),'"');
// parse the code // parse the code
TokenEnd:=BracketPos.X; TokenEnd:=BracketPos.X;
BracketLevel:=0; BracketLevel:=0;
@ -496,6 +500,7 @@ begin
// calculate screen position // calculate screen position
ScreenTextXY:=SrcEdit.TextToScreenPosition(CursorTextXY); ScreenTextXY:=SrcEdit.TextToScreenPosition(CursorTextXY);
ClientXY:=SrcEdit.ScreenToPixelPosition(ScreenTextXY); ClientXY:=SrcEdit.ScreenToPixelPosition(ScreenTextXY);
FSourceEditorTopIndex:=SrcEdit.TopLine;
// calculate size of hints // calculate size of hints
DrawWidth:=SourceEditorWindow.ClientWidth; DrawWidth:=SourceEditorWindow.ClientWidth;

359
ide/codehelpform.pas Normal file
View File

@ -0,0 +1,359 @@
{
/***************************************************************************
CodeContextForm.pas
-------------------
***************************************************************************/
***************************************************************************
* *
* This source is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This code is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* General Public License for more details. *
* *
* A copy of the GNU General Public License is available on the World *
* Wide Web at <http://www.gnu.org/copyleft/gpl.html>. You can also *
* obtain it by writing to the Free Software Foundation, *
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
The base class for hint windows for the source editor for the online help.
For example for the fpdoc and comment help.
}
unit CodeHelpForm;
{$mode objfpc}{$H+}
interface
uses
Classes, Math, SysUtils, LCLProc, LCLType, LCLIntf, Forms, Controls, Graphics,
SynEdit, SynEditKeyCmds,
SrcEditorIntf;
type
{ TCodeHintProvider }
TCodeHintProvider = class(TComponent)
public
procedure GetPreferredSize(var PreferredWidth, PreferredHeight: integer); virtual;
procedure Paint(Canvas: TCanvas; const ARect: TRect); virtual; abstract;
end;
{ TCodeHelpFrm }
TCodeHelpFrm = class(THintWindow)
procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormPaint(Sender: TObject);
procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
private
FAnchorForm: TCustomForm;
FHelpEnabled: boolean;
FPreferredHeight: integer;
FPreferredWidth: integer;
FProvider: TCodeHintProvider;
FSrcEditCaret: TPoint;
procedure SetAnchorForm(const AValue: TCustomForm);
procedure OnAnchorFormChangeBounds(Sender: TObject);
procedure SetHelpEnabled(const AValue: boolean);
procedure SetPreferredHeight(const AValue: integer);
procedure SetPreferredWidth(const AValue: integer);
procedure SetProvider(const AValue: TCodeHintProvider);
procedure SetSrcEditCaret(const AValue: TPoint);
procedure UpdatePosition;
protected
procedure Paint; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure UpdateHints;// update content
function NeedVisible: boolean;
property AnchorForm: TCustomForm read FAnchorForm write SetAnchorForm;
property HelpEnabled: boolean read FHelpEnabled write SetHelpEnabled;
property SrcEditCaret: TPoint read FSrcEditCaret write SetSrcEditCaret;// 0,0 means use current position, should be ScreenXY, not TextXY
property PreferredWidth: integer read FPreferredWidth write SetPreferredWidth;
property PreferredHeight: integer read FPreferredHeight write SetPreferredHeight;
property Provider: TCodeHintProvider read FProvider write SetProvider;
end;
var
CodeHelpFrm: TCodeHelpFrm = nil;
implementation
{ TCodeHelpFrm }
procedure TCodeHelpFrm.ApplicationIdle(Sender: TObject; var Done: Boolean);
begin
//DebugLn(['TCodeHelpFrm.ApplicationIdle NeedVisible=',NeedVisible]);
if not NeedVisible then begin
Hide;
exit;
end;
UpdatePosition;
UpdateHints;
end;
procedure TCodeHelpFrm.FormCreate(Sender: TObject);
begin
Application.AddOnIdleHandler(@ApplicationIdle);
end;
procedure TCodeHelpFrm.FormDestroy(Sender: TObject);
begin
end;
procedure TCodeHelpFrm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
SrcEdit: TSourceEditorInterface;
begin
if (Key=VK_ESCAPE) and (Shift=[]) then
Hide
else if SourceEditorWindow<>nil then begin
SrcEdit:=SourceEditorWindow.ActiveEditor;
if SrcEdit=nil then
Hide
else begin
// redirect keys
SrcEdit.EditorControl.KeyDown(Key,Shift);
SetActiveWindow(SourceEditorWindow.Handle);
end;
end;
end;
procedure TCodeHelpFrm.FormPaint(Sender: TObject);
begin
if Provider<>nil then begin
Provider.Paint(Canvas,Rect(0,0,ClientWidth,ClientHeight));
end else begin
with Canvas do begin
Font.SetDefault;
TextOut(6,20,'No help available (missing provider)');
end;
end;
end;
procedure TCodeHelpFrm.FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char
);
var
SrcEdit: TSourceEditorInterface;
ASynEdit: TCustomSynEdit;
begin
SrcEdit:=SourceEditorWindow.ActiveEditor;
if SrcEdit=nil then begin
Hide;
end else begin
ASynEdit:=(SrcEdit.EditorControl as TCustomSynEdit);
ASynEdit.CommandProcessor(ecChar,UTF8Key,nil);
end;
end;
procedure TCodeHelpFrm.SetAnchorForm(const AValue: TCustomForm);
begin
if FAnchorForm=AValue then exit;
if FAnchorForm<>nil then
FAnchorForm.RemoveAllHandlersOfObject(Self);
FAnchorForm:=AValue;
if FAnchorForm<>nil then
FAnchorForm.AddHandlerOnChangeBounds(@OnAnchorFormChangeBounds);
UpdatePosition;
end;
procedure TCodeHelpFrm.OnAnchorFormChangeBounds(Sender: TObject);
begin
//DebugLn(['TCodeHelpFrm.OnAnchorFormChangeBounds ',dbgs(BoundsRect),' Sender=',dbgsName(Sender),' SenderVisible=',TControl(Sender).Visible,' SenderBounds=',dbgs(TControl(Sender).BoundsRect)]);
UpdatePosition;
end;
procedure TCodeHelpFrm.SetHelpEnabled(const AValue: boolean);
begin
if FHelpEnabled=AValue then exit;
FHelpEnabled:=AValue;
UpdatePosition;
end;
procedure TCodeHelpFrm.SetPreferredHeight(const AValue: integer);
begin
if FPreferredHeight=AValue then exit;
FPreferredHeight:=AValue;
end;
procedure TCodeHelpFrm.SetPreferredWidth(const AValue: integer);
begin
if FPreferredWidth=AValue then exit;
FPreferredWidth:=AValue;
end;
procedure TCodeHelpFrm.SetProvider(const AValue: TCodeHintProvider);
begin
if FProvider=AValue then exit;
FProvider:=AValue;
if FProvider<>nil then begin
FProvider.GetPreferredSize(FPreferredWidth,FPreferredHeight);
end;
end;
procedure TCodeHelpFrm.SetSrcEditCaret(const AValue: TPoint);
begin
if ComparePoints(FSrcEditCaret,AValue)=0 then exit;
FSrcEditCaret:=AValue;
end;
procedure TCodeHelpFrm.UpdatePosition;
var
NewBounds: TRect;
DesktopBounds: TRect;
procedure TryPosition(TryBounds: TRect; TheAnchors: TAnchors);
begin
TryBounds.Right:=Max(TryBounds.Left,TryBounds.Right);
TryBounds.Bottom:=Max(TryBounds.Top,TryBounds.Bottom);
if TryBounds.Right>DesktopBounds.Right then begin
if not (akLeft in TheAnchors) then begin
// move to the left
dec(TryBounds.Left,TryBounds.Right-DesktopBounds.Right);
TryBounds.Left:=Max(TryBounds.Left,DesktopBounds.Left);
end;
TryBounds.Right:=DesktopBounds.Right;
end;
if TryBounds.Left<DesktopBounds.Left then begin
if not (akRight in TheAnchors) then begin
// move to the right
inc(TryBounds.Right,DesktopBounds.Left-TryBounds.Left);
TryBounds.Left:=Min(TryBounds.Right,DesktopBounds.Right);
end;
TryBounds.Left:=DesktopBounds.Left;
end;
if TryBounds.Bottom>DesktopBounds.Bottom then begin
if not (akTop in TheAnchors) then begin
// move to the top
dec(TryBounds.Top,TryBounds.Bottom-DesktopBounds.Bottom);
TryBounds.Top:=Max(TryBounds.Top,DesktopBounds.Top);
end;
TryBounds.Bottom:=DesktopBounds.Bottom;
end;
if TryBounds.Top<DesktopBounds.Top then begin
if not (akBottom in TheAnchors) then begin
// move to the bottom
inc(TryBounds.Bottom,DesktopBounds.Top-TryBounds.Top);
TryBounds.Bottom:=Min(TryBounds.Bottom,DesktopBounds.Bottom);
end;
TryBounds.Top:=DesktopBounds.Top;
end;
// check if TryBounds are better than NewBounds
if (TryBounds.Right-TryBounds.Left)*(TryBounds.Bottom-TryBounds.Top)
> (NewBounds.Right-NewBounds.Left)*(NewBounds.Bottom-NewBounds.Top)
then
NewBounds:=TryBounds;
end;
var
CurCaret: TPoint;
SrcEdit: TSourceEditorInterface;
AnchorBounds: TRect;
begin
if not NeedVisible then exit;
DesktopBounds:=Rect(30,30,Screen.DesktopWidth-30,Screen.DesktopHeight-50);
NewBounds:=Bounds(DesktopBounds.Left,DesktopBounds.Top,30,30);
if AnchorForm<>nil then begin
// place near the AnchorForm
AnchorBounds:=AnchorForm.BoundsRect;
// try right of AnchorForm
TryPosition(Bounds(AnchorBounds.Right+6,AnchorBounds.Top,
PreferredWidth,PreferredHeight),[akLeft,akTop]);
// try left of AnchorForm
TryPosition(Bounds(AnchorBounds.Left-6-PreferredWidth,AnchorBounds.Top,
PreferredWidth,PreferredHeight),[akRight,akTop]);
// try below
TryPosition(Bounds(AnchorBounds.Left,AnchorBounds.Bottom+6,
PreferredWidth,PreferredHeight),[akTop]);
end else begin
// place near the source editor caret
CurCaret:=SrcEditCaret;
SrcEdit:=SourceEditorWindow.ActiveEditor;
if CurCaret.Y<1 then
CurCaret:=SrcEdit.CursorScreenXY;
CurCaret:=SrcEdit.EditorControl.ClientToScreen(SrcEdit.ScreenToPixelPosition(CurCaret));
// try below
TryPosition(Bounds(CurCaret.X-(PreferredWidth div 2),CurCaret.Y+6,
PreferredWidth,PreferredHeight),[akTop]);
// try above
TryPosition(Bounds(CurCaret.X-(PreferredWidth div 2),
CurCaret.Y-6-PreferredHeight,
PreferredWidth,PreferredHeight),[akBottom]);
end;
//DebugLn(['TCodeHelpFrm.UpdatePosition NewBounds=',dbgs(NewBounds),' BoundsRect=',dbgs(BoundsRect)]);
BoundsRect:=NewBounds;
Visible:=true;
end;
procedure TCodeHelpFrm.Paint;
begin
FormPaint(Self);
end;
constructor TCodeHelpFrm.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
OnDestroy:=@FormDestroy;
OnKeyDown:=@FormKeyDown;
OnUTF8KeyPress:=@FormUTF8KeyPress;
FPreferredWidth:=300;
FPreferredHeight:=200;
FormCreate(Self);
end;
destructor TCodeHelpFrm.Destroy;
begin
inherited Destroy;
if CodeHelpFrm=Self then
CodeHelpFrm:=nil;
end;
procedure TCodeHelpFrm.UpdateHints;
begin
if not Visible then exit;
//DebugLn(['TCodeHelpFrm.UpdateHints ']);
end;
function TCodeHelpFrm.NeedVisible: boolean;
begin
if not HelpEnabled then exit(false);
if (AnchorForm<>nil) then begin
Result:=AnchorForm.Visible;
end else begin
Result:=(SourceEditorWindow<>nil)
and (SourceEditorWindow.ActiveEditor<>nil);
end;
end;
{ TCodeHintProvider }
procedure TCodeHintProvider.GetPreferredSize(var PreferredWidth,
PreferredHeight: integer);
begin
end;
end.

View File

@ -55,7 +55,7 @@ uses
// IDE units // IDE units
LazarusIDEStrConsts, LazConf, IDECommands, EditorOptions, KeyMapping, Project, LazarusIDEStrConsts, LazConf, IDECommands, EditorOptions, KeyMapping, Project,
WordCompletion, FindReplaceDialog, FindInFilesDlg, IDEProcs, IDEOptionDefs, WordCompletion, FindReplaceDialog, FindInFilesDlg, IDEProcs, IDEOptionDefs,
MacroPromptDlg, TransferMacros, CodeContextForm, MacroPromptDlg, TransferMacros, CodeContextForm, CodeHelpForm,
EnvironmentOpts, MsgView, SearchResultView, InputHistory, CodeMacroPrompt, EnvironmentOpts, MsgView, SearchResultView, InputHistory, CodeMacroPrompt,
CodeTemplatesDlg, CodeTemplatesDlg,
SortSelectionDlg, EncloseSelectionDlg, DiffDialog, ConDef, InvertAssignTool, SortSelectionDlg, EncloseSelectionDlg, DiffDialog, ConDef, InvertAssignTool,
@ -552,6 +552,7 @@ type
procedure OnSynCompletionPrevChar(Sender: TObject); procedure OnSynCompletionPrevChar(Sender: TObject);
procedure OnSynCompletionKeyPress(Sender: TObject; var Key: Char); procedure OnSynCompletionKeyPress(Sender: TObject; var Key: Char);
procedure OnSynCompletionUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); procedure OnSynCompletionUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
procedure OnSynCompletionPositionChanged(Sender: TObject);
procedure DeactivateCompletionForm; procedure DeactivateCompletionForm;
procedure InitIdentCompletion(S: TStrings); procedure InitIdentCompletion(S: TStrings);
@ -687,12 +688,15 @@ type
procedure ActivateHint(const ScreenPos: TPoint; const TheHint: string); procedure ActivateHint(const ScreenPos: TPoint; const TheHint: string);
procedure HideHint; procedure HideHint;
procedure StartShowCodeContext(JumpToError: boolean); procedure StartShowCodeContext(JumpToError: boolean);
procedure StartShowCodeHelp;
Procedure NewFile(const NewShortName: String; ASource: TCodeBuffer; // new, close, focus
procedure NewFile(const NewShortName: String; ASource: TCodeBuffer;
FocusIt: boolean); FocusIt: boolean);
Procedure CloseFile(PageIndex:integer); procedure CloseFile(PageIndex:integer);
procedure FocusEditor; procedure FocusEditor;
// paste and copy
procedure CutClicked(Sender: TObject); procedure CutClicked(Sender: TObject);
procedure CopyClicked(Sender: TObject); procedure CopyClicked(Sender: TObject);
procedure PasteClicked(Sender: TObject); procedure PasteClicked(Sender: TObject);
@ -1346,6 +1350,8 @@ begin
// close hint windows // close hint windows
if (CodeContextFrm<>nil) then if (CodeContextFrm<>nil) then
CodeContextFrm.Hide; CodeContextFrm.Hide;
if (CodeHelpFrm<>nil) then
CodeHelpFrm.Hide;
end; end;
if (FSourceNoteBook<>nil) if (FSourceNoteBook<>nil)
@ -3000,6 +3006,7 @@ begin
FreeAndNil(Gotodialog); FreeAndNil(Gotodialog);
FreeThenNil(CodeContextFrm); FreeThenNil(CodeContextFrm);
FreeThenNil(CodeHelpFrm);
FreeThenNil(aCompletion); FreeThenNil(aCompletion);
FreeThenNil(FHintTimer); FreeThenNil(FHintTimer);
FreeThenNil(FHintWindow); FreeThenNil(FHintWindow);
@ -3045,6 +3052,7 @@ begin
OnKeyPrevChar:=@OnSynCompletionPrevChar; OnKeyPrevChar:=@OnSynCompletionPrevChar;
OnKeyPress:=@OnSynCompletionKeyPress; OnKeyPress:=@OnSynCompletionKeyPress;
OnUTF8KeyPress:=@OnSynCompletionUTF8KeyPress; OnUTF8KeyPress:=@OnSynCompletionUTF8KeyPress;
OnPositionChanged:=@OnSynCompletionPositionChanged;
ShortCut:=Menus.ShortCut(VK_UNKNOWN,[]); ShortCut:=Menus.ShortCut(VK_UNKNOWN,[]);
end; end;
@ -3434,6 +3442,12 @@ begin
//debugln('TSourceNotebook.OnSynCompletionKeyPress B UTF8Key=',dbgstr(UTF8Key)); //debugln('TSourceNotebook.OnSynCompletionKeyPress B UTF8Key=',dbgstr(UTF8Key));
end; end;
procedure TSourceNotebook.OnSynCompletionPositionChanged(Sender: TObject);
begin
if CodeHelpFrm<>nil then
CodeHelpFrm.UpdateHints;
end;
procedure TSourceNotebook.DeactivateCompletionForm; procedure TSourceNotebook.DeactivateCompletionForm;
var var
ActSE: TSourceEditor; ActSE: TSourceEditor;
@ -3637,6 +3651,10 @@ Begin
// ' TextSelectedColor=',DbgS(TextSelectedColor), // ' TextSelectedColor=',DbgS(TextSelectedColor),
// ''); // '');
end; end;
if CurrentCompletionType=ctIdentCompletion then
StartShowCodeHelp
else if CodeHelpFrm<>nil then
CodeHelpFrm.HelpEnabled:=false;
end; end;
End; End;
@ -4736,7 +4754,19 @@ begin
end; end;
end; end;
Procedure TSourceNotebook.BookMarkSetClicked(Sender: TObject); procedure TSourceNotebook.StartShowCodeHelp;
begin
if CodeHelpFrm=nil then begin
CodeHelpFrm:=TCodeHelpFrm.Create(Self);
CodeHelpFrm.Name:='TSourceNotebook_CodeHelpFrm';
end;
CodeHelpFrm.AnchorForm:=CurCompletionControl.TheForm;
{$IFDEF EnableCodeHelp}
CodeHelpFrm.HelpEnabled:=true;
{$ENDIF}
end;
procedure TSourceNotebook.BookMarkSetClicked(Sender: TObject);
// popup menu: set bookmark clicked // popup menu: set bookmark clicked
var var
MenuItem: TIDEMenuItem; MenuItem: TIDEMenuItem;

View File

@ -94,7 +94,10 @@ type
function HeightInLines: Integer; virtual; abstract; function HeightInLines: Integer; virtual; abstract;
function CharWidth: integer; virtual; abstract; function CharWidth: integer; virtual; abstract;
function CursorInPixel: TPoint; virtual; abstract; function CursorInPixel: TPoint; virtual; abstract;
function ScreenToPixelPosition(const Position: TPoint): TPoint; virtual; abstract; function ScreenToPixelPosition(const Position: TPoint): TPoint; virtual; abstract;// ScreenXY to pixel in EditorControl.
// To get the desktop pixel coords use:
// with SourceEditorWindow.ActiveEditor do
// DesktopXY:=EditorControl.ClientToScreen(ScreenToPixelPosition(ScreenXY));
// update // update
procedure BeginUndoBlock; virtual; abstract; procedure BeginUndoBlock; virtual; abstract;

View File

@ -502,6 +502,7 @@ type
procedure EndUpdate; procedure EndUpdate;
function HandleAllocated: boolean; function HandleAllocated: boolean;
function IsDefault: boolean; function IsDefault: boolean;
procedure SetDefault;
property Handle: HFONT read GetHandle write SetHandle; property Handle: HFONT read GetHandle write SetHandle;
property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch; property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch;
property CanUTF8: boolean read GetCanUTF8; property CanUTF8: boolean read GetCanUTF8;

View File

@ -322,22 +322,22 @@ end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
TCustomForm SetVisible TCustomForm SetVisible
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
Procedure TCustomForm.SetVisible(Value : boolean); procedure TCustomForm.SetVisible(Value : boolean);
Begin begin
if (Value=(fsVisible in FFormState)) and (Visible=Value) then exit; if (Value=(fsVisible in FFormState)) and (Visible=Value) then exit;
//DebugLn('[TCustomForm.SetVisible] START ',Name,':',ClassName,' Old=',Visible,' New=',Value,' ',(fsCreating in FFormState),' ',FormUpdating); //DebugLn(['[TCustomForm.SetVisible] START ',Name,':',ClassName,' Old=',Visible,' New=',Value,' ',(fsCreating in FFormState)]);
if Value then if Value then
Include(FFormState, fsVisible) Include(FFormState, fsVisible)
else else
Exclude(FFormState, fsVisible); Exclude(FFormState, fsVisible);
//DebugLn('TCustomForm.SetVisible ',Name,':',ClassName,' FormUpdating=',FormUpdating,' fsCreating=',fsCreating in FFormState); //DebugLn(['TCustomForm.SetVisible ',Name,':',ClassName,' fsCreating=',fsCreating in FFormState]);
if (fsCreating in FFormState) {or FormUpdating} then if (fsCreating in FFormState) {or FormUpdating} then
// will be done when finished loading // will be done when finished loading
else else
begin begin
inherited Visible:=Value; inherited Visible:=Value;
end; end;
//DebugLn('[TCustomForm.SetVisible] END ',Name,':',ClassName,' ',Value,' ',(fsCreating in FFormState),' ',FormUpdating,' ',Visible); //DebugLn(['[TCustomForm.SetVisible] END ',Name,':',ClassName,' ',Value,' ',(fsCreating in FFormState),' ',Visible]);
end; end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------

View File

@ -738,6 +738,26 @@ begin
and (Style=[]); and (Style=[]);
end; end;
{------------------------------------------------------------------------------
procedure TFont.SetDefault;
Set Font properties to default.
------------------------------------------------------------------------------}
procedure TFont.SetDefault;
begin
BeginUpdate;
try
Name:=DefFontData.Name;
Charset:=DefFontData.CharSet;
Height:=DefFontData.Height;
Pitch:=DefFontData.Pitch;
Style:=DefFontData.Style;
Color:=clWindowText;
finally
EndUpdate;
end;
end;
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
Method: TFont.SetSize Method: TFont.SetSize
Params: AValue: the new value Params: AValue: the new value