mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 05:41:34 +01:00 
			
		
		
		
	IDE: started focus hint
git-svn-id: trunk@31235 -
This commit is contained in:
		
							parent
							
								
									f20eedc54a
								
							
						
					
					
						commit
						8bf43e981a
					
				| @ -22,6 +22,12 @@ div.title { | |||||||
|   color: #005A9C; |   color: #005A9C; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | div.focushint { | ||||||
|  |   text-align: right; | ||||||
|  |   font-size: 10px; | ||||||
|  |   color: #005A9C; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| tt, span.keyword, pre { | tt, span.keyword, pre { | ||||||
|   font-family: Courier, monospace |   font-family: Courier, monospace | ||||||
| } | } | ||||||
|  | |||||||
| @ -40,6 +40,7 @@ interface | |||||||
| 
 | 
 | ||||||
| uses | uses | ||||||
|   Classes, SysUtils, LCLProc, Forms, Controls, FileUtil, Dialogs, AvgLvlTree, |   Classes, SysUtils, LCLProc, Forms, Controls, FileUtil, Dialogs, AvgLvlTree, | ||||||
|  |   LCLType, | ||||||
|   // codetools |   // codetools | ||||||
|   CodeAtom, CodeTree, CodeToolManager, FindDeclarationTool, BasicCodeTools, |   CodeAtom, CodeTree, CodeToolManager, FindDeclarationTool, BasicCodeTools, | ||||||
|   KeywordFuncLists, PascalParserTool, CodeCache, CacheCodeTools, FileProcs, |   KeywordFuncLists, PascalParserTool, CodeCache, CacheCodeTools, FileProcs, | ||||||
| @ -51,11 +52,11 @@ uses | |||||||
|   // synedit |   // synedit | ||||||
|   SynHighlighterPas, |   SynHighlighterPas, | ||||||
|   // IDEIntf |   // IDEIntf | ||||||
|   IDEMsgIntf, MacroIntf, PackageIntf, LazHelpIntf, ProjectIntf, IDEDialogs, |   IDECommands, IDEMsgIntf, MacroIntf, PackageIntf, LazHelpIntf, ProjectIntf, | ||||||
|   IDEHelpIntf, LazIDEIntf, |   IDEDialogs, IDEHelpIntf, LazIDEIntf, | ||||||
|   // IDE |   // IDE | ||||||
|   LazarusIDEStrConsts, CompilerOptions, IDEProcs, PackageDefs, EnvironmentOpts, |   EditorOptions, LazarusIDEStrConsts, CompilerOptions, IDEProcs, PackageDefs, | ||||||
|   TransferMacros, PackageSystem, DialogProcs; |   EnvironmentOpts, TransferMacros, PackageSystem, DialogProcs, KeyMapping; | ||||||
| 
 | 
 | ||||||
| const | const | ||||||
|   IDEProjectName = 'Lazarus'; |   IDEProjectName = 'Lazarus'; | ||||||
| @ -215,7 +216,8 @@ type | |||||||
|   TCodeHelpHintOption = ( |   TCodeHelpHintOption = ( | ||||||
|     chhoSmallStep,    // do the next step. Use this to run on idle. |     chhoSmallStep,    // do the next step. Use this to run on idle. | ||||||
|     chhoDeclarationHeader, // add a header with source position and type of identifier |     chhoDeclarationHeader, // add a header with source position and type of identifier | ||||||
|     chhoNoComments    // do not add the pasdoc comments |     chhoNoComments,    // do not add the pasdoc comments | ||||||
|  |     chhoShowFocusHint  // show the shortcut ecFocusHint | ||||||
|   ); |   ); | ||||||
|   TCodeHelpHintOptions = set of TCodeHelpHintOption; |   TCodeHelpHintOptions = set of TCodeHelpHintOption; | ||||||
|      |      | ||||||
| @ -2240,6 +2242,7 @@ var | |||||||
|   n: Integer; |   n: Integer; | ||||||
|   LastOwner: TObject; |   LastOwner: TObject; | ||||||
|   s: String; |   s: String; | ||||||
|  |   Cmd: TKeyCommandRelation; | ||||||
| 
 | 
 | ||||||
|   procedure AddLinkToOwner(CurOwner: TObject); |   procedure AddLinkToOwner(CurOwner: TObject); | ||||||
|   var |   var | ||||||
| @ -2302,7 +2305,7 @@ begin | |||||||
|           // add fpdoc entry |           // add fpdoc entry | ||||||
|           FPDocFilename:=GetFPDocFilenameForSource(CTTool.MainFilename, |           FPDocFilename:=GetFPDocFilenameForSource(CTTool.MainFilename, | ||||||
|                                                    false,CacheWasUsed,AnOwner); |                                                    false,CacheWasUsed,AnOwner); | ||||||
|           //DebugLn(['TCodeHelpManager.GetHTMLHint2 FPDocFilename=',FPDocFilename,' ElementName="',ElementName,'"']); |           //DebugLn(['TCodeHelpManager.GetHTMLHint FPDocFilename=',FPDocFilename,' ElementName="',ElementName,'"']); | ||||||
|           if (not CacheWasUsed) and (not Complete) then exit(chprParsing); |           if (not CacheWasUsed) and (not Complete) then exit(chprParsing); | ||||||
| 
 | 
 | ||||||
|           if n=1 then |           if n=1 then | ||||||
| @ -2315,7 +2318,7 @@ begin | |||||||
| 
 | 
 | ||||||
|             ElementNode:=FPDocFile.GetElementWithName(ElementName); |             ElementNode:=FPDocFile.GetElementWithName(ElementName); | ||||||
|             if ElementNode<>nil then begin |             if ElementNode<>nil then begin | ||||||
|               //debugln(['TCodeHelpManager.GetHTMLHint2 fpdoc element found "',ElementName,'"']); |               //debugln(['TCodeHelpManager.GetHTMLHint fpdoc element found "',ElementName,'"']); | ||||||
|               AddLinkToOwner(AnOwner); |               AddLinkToOwner(AnOwner); | ||||||
| 
 | 
 | ||||||
|               s:=AppendLineEnding(GetFPDocNodeAsHTML(FPDocFile,ElementNode.FindNode(FPDocItemNames[fpdiShort]))); |               s:=AppendLineEnding(GetFPDocNodeAsHTML(FPDocFile,ElementNode.FindNode(FPDocItemNames[fpdiShort]))); | ||||||
| @ -2343,7 +2346,7 @@ begin | |||||||
|         or ((CTNode.Desc in [ctnProcedure,ctnProcedureHead]) |         or ((CTNode.Desc in [ctnProcedure,ctnProcedureHead]) | ||||||
|             and (CTTool.ProcNodeHasSpecifier(CTNode,psOVERRIDE))) |             and (CTTool.ProcNodeHasSpecifier(CTNode,psOVERRIDE))) | ||||||
|         then begin |         then begin | ||||||
|           debugln(['TCodeHelpManager.GetHTMLHint2 searching for inherited of ',CTNode.DescAsString,' ',dbgs(XYPos)]); |           debugln(['TCodeHelpManager.GetHTMLHint searching for inherited of ',CTNode.DescAsString,' ',dbgs(XYPos)]); | ||||||
|           OldXYPos:=XYPos; |           OldXYPos:=XYPos; | ||||||
|           OldCTTool:=CTTool; |           OldCTTool:=CTTool; | ||||||
|           OldCTNode:=CTNode; |           OldCTNode:=CTNode; | ||||||
| @ -2351,18 +2354,19 @@ begin | |||||||
|             CTTool,CTNode,XYPos,aTopLine)) |             CTTool,CTNode,XYPos,aTopLine)) | ||||||
|           or (CTNode=OldCTNode) |           or (CTNode=OldCTNode) | ||||||
|           then begin |           then begin | ||||||
|             debugln(['TCodeHelpManager.GetHTMLHint2 inherited not found: ',dbgs(OldXYPos)]); |             debugln(['TCodeHelpManager.GetHTMLHint inherited not found: ',dbgs(OldXYPos)]); | ||||||
|             break; |             break; | ||||||
|           end; |           end; | ||||||
|         end else begin |         end else begin | ||||||
|           debugln(['TCodeHelpManager.GetHTMLHint2 not searching inherited for ',CTNode.DescAsString]); |           debugln(['TCodeHelpManager.GetHTMLHint not searching inherited for ',CTNode.DescAsString]); | ||||||
|           break; |           break; | ||||||
|         end; |         end; | ||||||
| 
 | 
 | ||||||
|       end; |       end; | ||||||
|  | 
 | ||||||
|     except |     except | ||||||
|       on E: Exception do begin |       on E: Exception do begin | ||||||
|         debugln(['TCodeHelpManager.GetHTMLHint2 Exception: ',E.Message]); |         debugln(['TCodeHelpManager.GetHTMLHint Exception: ',E.Message]); | ||||||
|         //DumpExceptionBackTrace; |         //DumpExceptionBackTrace; | ||||||
|       end; |       end; | ||||||
|     end; |     end; | ||||||
| @ -2370,10 +2374,17 @@ begin | |||||||
|   finally |   finally | ||||||
|     ElementNames.Free; |     ElementNames.Free; | ||||||
|     FreeListOfPCodeXYPosition(ListOfPCodeXYPosition); |     FreeListOfPCodeXYPosition(ListOfPCodeXYPosition); | ||||||
|  |     if chhoShowFocusHint in Options then begin | ||||||
|  |       Cmd:=EditorOpts.KeyMap.FindByCommand(ecFocusHint); | ||||||
|  |       if (Cmd<>nil) and (not IDEShortCutEmpty(Cmd.ShortcutA)) then begin | ||||||
|  |         HTMLHint:=HTMLHint+'<div class="focushint">Press ' | ||||||
|  |           +KeyAndShiftStateToEditorKeyString(Cmd.ShortcutA)+' for focus</div>'+LineEnding; | ||||||
|  |       end; | ||||||
|  |     end; | ||||||
|     HTMLHint:='<html><head><link rel="stylesheet" href="lazdoc://lazarus/lazdoc.css" type="text/css"></head>'+LineEnding |     HTMLHint:='<html><head><link rel="stylesheet" href="lazdoc://lazarus/lazdoc.css" type="text/css"></head>'+LineEnding | ||||||
|       +'<body>'+LineEnding+HTMLHint+'</body>'+LineEnding; |       +'<body>'+LineEnding+HTMLHint+'</body>'+LineEnding; | ||||||
|   end; |   end; | ||||||
|   debugln(['TCodeHelpManager.GetHTMLHint2 ',HTMLHint]); |   debugln(['TCodeHelpManager.GetHTMLHint ',HTMLHint]); | ||||||
|   Result:=chprSuccess; |   Result:=chprSuccess; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -191,7 +191,8 @@ type | |||||||
|                     out HintWinRect: TRect): boolean; override; |                     out HintWinRect: TRect): boolean; override; | ||||||
|     function GetHintForSourcePosition(const ExpandedFilename: string; |     function GetHintForSourcePosition(const ExpandedFilename: string; | ||||||
|                   const CodePos: TPoint; |                   const CodePos: TPoint; | ||||||
|                                       out BaseURL, HTMLHint: string): TShowHelpResult; override; |                   out BaseURL, HTMLHint: string; | ||||||
|  |                   Flags: TIDEHelpManagerCreateHintFlags = []): TShowHelpResult; override; | ||||||
| 
 | 
 | ||||||
|     function ConvertSourcePosToPascalHelpContext(const CaretPos: TPoint; |     function ConvertSourcePosToPascalHelpContext(const CaretPos: TPoint; | ||||||
|                const Filename: string): TPascalHelpContextList; override; |                const Filename: string): TPascalHelpContextList; override; | ||||||
| @ -1492,20 +1493,24 @@ begin | |||||||
|   Result:=true; |   Result:=true; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| function TIDEHelpManager.GetHintForSourcePosition(const ExpandedFilename: string; | function TIDEHelpManager.GetHintForSourcePosition( | ||||||
|   const CodePos: TPoint; out BaseURL, HTMLHint: string): TShowHelpResult; |   const ExpandedFilename: string; const CodePos: TPoint; out BaseURL, | ||||||
|  |   HTMLHint: string; Flags: TIDEHelpManagerCreateHintFlags): TShowHelpResult; | ||||||
| var | var | ||||||
|   Code: TCodeBuffer; |   Code: TCodeBuffer; | ||||||
|   CacheWasUsed: boolean; |   CacheWasUsed: boolean; | ||||||
|  |   HintFlags: TCodeHelpHintOptions; | ||||||
| begin | begin | ||||||
|   BaseURL:=''; |   BaseURL:=''; | ||||||
|   HTMLHint:=''; |   HTMLHint:=''; | ||||||
|   Code:=CodeToolBoss.LoadFile(ExpandedFilename,true,false); |   Code:=CodeToolBoss.LoadFile(ExpandedFilename,true,false); | ||||||
|   if (Code=nil) or Code.LineColIsSpace(CodePos.Y,CodePos.X) then |   if (Code=nil) or Code.LineColIsSpace(CodePos.Y,CodePos.X) then | ||||||
|     exit(shrHelpNotFound); |     exit(shrHelpNotFound); | ||||||
|  |   HintFlags:=[chhoDeclarationHeader]; | ||||||
|  |   if ihmchAddFocusHint in Flags then | ||||||
|  |     Include(HintFlags,chhoShowFocusHint); | ||||||
|   if CodeHelpBoss.GetHTMLHint(Code,CodePos.X,CodePos.Y, |   if CodeHelpBoss.GetHTMLHint(Code,CodePos.X,CodePos.Y, | ||||||
|     [chhoDeclarationHeader], |     HintFlags,BaseURL,HTMLHint,CacheWasUsed)=chprSuccess | ||||||
|     BaseURL,HTMLHint,CacheWasUsed)=chprSuccess |  | ||||||
|   then |   then | ||||||
|     exit(shrSuccess); |     exit(shrSuccess); | ||||||
|   Result:=shrHelpNotFound; |   Result:=shrHelpNotFound; | ||||||
|  | |||||||
| @ -607,6 +607,7 @@ begin | |||||||
|   ecContextHelp: SetResult(VK_F1,[],VK_UNKNOWN,[]); |   ecContextHelp: SetResult(VK_F1,[],VK_UNKNOWN,[]); | ||||||
|   ecEditContextHelp: SetResult(VK_F1,[ssShift,ssCtrl],VK_UNKNOWN,[]); |   ecEditContextHelp: SetResult(VK_F1,[ssShift,ssCtrl],VK_UNKNOWN,[]); | ||||||
|   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); |   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
|  |   ecFocusHint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
| 
 | 
 | ||||||
|   // designer |   // designer | ||||||
|   ecDesignerCopy        : SetResult(VK_C,[ssCtrl],VK_Insert,[ssCtrl]); |   ecDesignerCopy        : SetResult(VK_C,[ssCtrl],VK_Insert,[ssCtrl]); | ||||||
| @ -1049,6 +1050,7 @@ begin | |||||||
|   ecContextHelp: SetResult(VK_F1,[ssCtrl],VK_UNKNOWN,[]); |   ecContextHelp: SetResult(VK_F1,[ssCtrl],VK_UNKNOWN,[]); | ||||||
|   ecEditContextHelp: SetResult(VK_F1,[ssCtrl,ssShift],VK_UNKNOWN,[]); |   ecEditContextHelp: SetResult(VK_F1,[ssCtrl,ssShift],VK_UNKNOWN,[]); | ||||||
|   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); |   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
|  |   ecFocusHint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
| 
 | 
 | ||||||
|   // designer |   // designer | ||||||
|   ecDesignerCopy        : SetResult(VK_C,[ssCtrl],VK_UNKNOWN,[],VK_Insert,[ssCtrl],VK_UNKNOWN,[]); |   ecDesignerCopy        : SetResult(VK_C,[ssCtrl],VK_UNKNOWN,[],VK_Insert,[ssCtrl],VK_UNKNOWN,[]); | ||||||
| @ -1680,6 +1682,7 @@ begin | |||||||
|   ecContextHelp: SetResult(VK_HELP,[],VK_UNKNOWN,[]); |   ecContextHelp: SetResult(VK_HELP,[],VK_UNKNOWN,[]); | ||||||
|   ecEditContextHelp: SetResult(VK_HELP,[ssShift,ssCtrl],VK_HELP,[ssCtrl]); |   ecEditContextHelp: SetResult(VK_HELP,[ssShift,ssCtrl],VK_HELP,[ssCtrl]); | ||||||
|   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); |   ecReportingBug: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
|  |   ecFocusHint: SetResult(VK_UNKNOWN,[],VK_UNKNOWN,[]); | ||||||
| 
 | 
 | ||||||
|   // designer |   // designer | ||||||
|   ecDesignerCopy        : SetResult(VK_C,[ssMeta],VK_UNKNOWN,[]); |   ecDesignerCopy        : SetResult(VK_C,[ssMeta],VK_UNKNOWN,[]); | ||||||
| @ -2227,6 +2230,7 @@ begin | |||||||
|     ecContextHelp             : Result:= lisMenuContextHelp; |     ecContextHelp             : Result:= lisMenuContextHelp; | ||||||
|     ecEditContextHelp         : Result:= lisMenuEditContextHelp; |     ecEditContextHelp         : Result:= lisMenuEditContextHelp; | ||||||
|     ecReportingBug            : Result:= srkmecReportingBug; |     ecReportingBug            : Result:= srkmecReportingBug; | ||||||
|  |     ecFocusHint               : Result:= lisFocusHint; | ||||||
| 
 | 
 | ||||||
|     // desginer |     // desginer | ||||||
|     ecDesignerCopy            : Result:= lisDsgCopyComponents; |     ecDesignerCopy            : Result:= lisDsgCopyComponents; | ||||||
| @ -2887,6 +2891,7 @@ begin | |||||||
|   AddDefault(C, 'Context sensitive help', lisKMContextSensitiveHelp, ecContextHelp); |   AddDefault(C, 'Context sensitive help', lisKMContextSensitiveHelp, ecContextHelp); | ||||||
|   AddDefault(C, 'Edit context sensitive help', lisKMEditContextSensitiveHelp, ecEditContextHelp); |   AddDefault(C, 'Edit context sensitive help', lisKMEditContextSensitiveHelp, ecEditContextHelp); | ||||||
|   AddDefault(C, 'Reporting a bug', srkmecReportingBug, ecReportingBug); |   AddDefault(C, 'Reporting a bug', srkmecReportingBug, ecReportingBug); | ||||||
|  |   AddDefault(C, 'Focus hint', lisFocusHint, ecFocusHint); | ||||||
| 
 | 
 | ||||||
|   // designer  - without menu items in the IDE bar (at least not directly) |   // designer  - without menu items in the IDE bar (at least not directly) | ||||||
|   C:=Categories[AddCategory('Designer',lisKeyCatDesigner,IDECmdScopeDesignerOnly)]; |   C:=Categories[AddCategory('Designer',lisKeyCatDesigner,IDECmdScopeDesignerOnly)]; | ||||||
|  | |||||||
| @ -2706,6 +2706,7 @@ resourcestring | |||||||
|   // help menu |   // help menu | ||||||
|   srkmecunknown                   = 'unknown editor command'; |   srkmecunknown                   = 'unknown editor command'; | ||||||
|   srkmecReportingBug              = 'Reporting a bug'; |   srkmecReportingBug              = 'Reporting a bug'; | ||||||
|  |   lisFocusHint = 'Focus hint'; | ||||||
|     |     | ||||||
|   // Category |   // Category | ||||||
|   srkmCatCursorMoving   = 'Cursor moving commands'; |   srkmCatCursorMoving   = 'Cursor moving commands'; | ||||||
|  | |||||||
| @ -16139,7 +16139,8 @@ begin | |||||||
|   if EditorOpts.AutoToolTipSymbTools then begin |   if EditorOpts.AutoToolTipSymbTools then begin | ||||||
|     {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.OnSrcNotebookShowHintForSource A');{$ENDIF} |     {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.OnSrcNotebookShowHintForSource A');{$ENDIF} | ||||||
|     TIDEHelpManager(HelpBoss).GetHintForSourcePosition(ActiveUnitInfo.Filename, |     TIDEHelpManager(HelpBoss).GetHintForSourcePosition(ActiveUnitInfo.Filename, | ||||||
|                                           CaretPos,BaseURL,SmartHintStr); |                              CaretPos,BaseURL,SmartHintStr, | ||||||
|  |                              [{$IFDEF EnableFocusHint}ihmchAddFocusHint{$ENDIF}]); | ||||||
|     {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.OnSrcNotebookShowHintForSource B');{$ENDIF} |     {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.OnSrcNotebookShowHintForSource B');{$ENDIF} | ||||||
|   end; |   end; | ||||||
|   case ToolStatus of |   case ToolStatus of | ||||||
|  | |||||||
| @ -310,6 +310,7 @@ const | |||||||
|   ecContextHelp             = ecFirstLazarus + 903; |   ecContextHelp             = ecFirstLazarus + 903; | ||||||
|   ecEditContextHelp         = ecFirstLazarus + 904; |   ecEditContextHelp         = ecFirstLazarus + 904; | ||||||
|   ecReportingBug            = ecFirstLazarus + 905; |   ecReportingBug            = ecFirstLazarus + 905; | ||||||
|  |   ecFocusHint               = ecFirstLazarus + 906; | ||||||
| 
 | 
 | ||||||
|   // designer |   // designer | ||||||
|   ecDesignerCopy            = ecFirstLazarus + 1000; |   ecDesignerCopy            = ecFirstLazarus + 1000; | ||||||
|  | |||||||
| @ -49,6 +49,11 @@ type | |||||||
|     property ModifierStr: string read FModifierStr write FModifierStr; |     property ModifierStr: string read FModifierStr write FModifierStr; | ||||||
|   end; |   end; | ||||||
| 
 | 
 | ||||||
|  |   TIDEHelpManagerCreateHintFlag = ( | ||||||
|  |     ihmchAddFocusHint | ||||||
|  |     ); | ||||||
|  |   TIDEHelpManagerCreateHintFlags = set of TIDEHelpManagerCreateHintFlag; | ||||||
|  | 
 | ||||||
|   { TBaseHelpManager } |   { TBaseHelpManager } | ||||||
| 
 | 
 | ||||||
|   TBaseHelpManager = class(TComponent) |   TBaseHelpManager = class(TComponent) | ||||||
| @ -65,7 +70,8 @@ type | |||||||
|     procedure ShowHelpForIDEControl(Sender: TControl); virtual; abstract; |     procedure ShowHelpForIDEControl(Sender: TControl); virtual; abstract; | ||||||
|     function GetHintForSourcePosition(const ExpandedFilename: string; |     function GetHintForSourcePosition(const ExpandedFilename: string; | ||||||
|                       const CodePos: TPoint; |                       const CodePos: TPoint; | ||||||
|                       out BaseURL, HTMLHint: string): TShowHelpResult; virtual; abstract; |                       out BaseURL, HTMLHint: string; | ||||||
|  |                       Flags: TIDEHelpManagerCreateHintFlags = []): TShowHelpResult; virtual; abstract; | ||||||
|     function CreateHint(aHintWindow: THintWindow; ScreenPos: TPoint; |     function CreateHint(aHintWindow: THintWindow; ScreenPos: TPoint; | ||||||
|                     const BaseURL: string; var TheHint: string; |                     const BaseURL: string; var TheHint: string; | ||||||
|                     out HintWinRect: TRect): boolean; virtual; abstract; |                     out HintWinRect: TRect): boolean; virtual; abstract; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 mattias
						mattias