{ Copyright (C) 2005 Mattias Gaertner 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 . You can also obtain it by writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Abstract: Demonstrates how to add a new menu item to the IDE: Search -> Jump to Implementation } unit CodeToolsExample1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, MenuIntf, LazIDEIntf, Controls, SrcEditorIntf, CodeToolManager, CodeTree, CodeCache, CustomCodeTool, IDECommands, LCLType, Menus, ComCtrls; type TJumpToSectionDemoToolButton = class(TIDEToolButton) private procedure JumpToInterface(Sender: TObject); procedure JumpToImplementation(Sender: TObject); public procedure DoOnAdded; override; end; TKeyWordType = (kwInterface, kwImplementation); procedure JumpIDEToKeyword(KeywordType: TKeyWordType); procedure JumpIDEToImplementationKeyword(Sender: TObject); procedure JumpIDEToInterfaceKeyword(Sender: TObject); procedure Register; implementation procedure JumpIDEToKeyword(KeywordType: TKeyWordType); var SrcEditor: TSourceEditorInterface; CodeBuffer: TCodeBuffer; CurCodeTool: TCustomCodeTool; Node: TCodeTreeNode; Tool: TCodeTool; NewCodePos: TCodeXYPosition; NewTopLine: Integer; Ok: Boolean; begin // commit editor changes to codetools if not LazarusIDE.BeginCodeTools then exit; // get active source editor SrcEditor:=SourceEditorManagerIntf.ActiveEditor; if SrcEditor=nil then exit; CodeBuffer:=SrcEditor.CodeToolsBuffer as TCodeBuffer; Ok:=false; try // init codetool for the source if CodeToolBoss.InitCurCodeTool(CodeBuffer) then begin CurCodeTool:=CodeToolBoss.CurCodeTool; if CurCodeTool is TCodeTool then begin // search imlementation node Tool:=TCodeTool(CurCodeTool); case KeywordType of kwInterface: Node:=Tool.FindInterfaceNode; kwImplementation: Node:=Tool.FindImplementationNode; end; if Node<>nil then begin // convert text position to editor postion NewTopLine:=0; NewCodePos:=CleanCodeXYPosition; if Tool.CleanPosToCaretAndTopLine(Node.StartPos, NewCodePos,NewTopLine) then begin // jump if LazarusIDE.DoOpenFileAndJumpToPos(NewCodePos.Code.Filename, Point(NewCodePos.X,NewCodePos.Y),NewTopLine,-1,-1, [ofRegularFile,ofUseCache])=mrOk then Ok:=true; end; end; end; end; except on E: Exception do begin CodeToolBoss.HandleException(E); end; end; if not Ok then LazarusIDE.DoJumpToCodeToolBossError; end; procedure JumpIDEToImplementationKeyword(Sender: TObject); begin JumpIDEToKeyword(kwImplementation); end; procedure JumpIDEToInterfaceKeyword(Sender: TObject); begin JumpIDEToKeyword(kwInterface); end; procedure Register; var Key: TIDEShortCut; Cat: TIDECommandCategory; CmdMyTool: TIDECommand; xMenuCmd: TIDEMenuCommand; begin // register IDE shortcut and menu item Key := IDEShortCut(VK_UNKNOWN,[],VK_UNKNOWN,[]); Cat:=IDECommandList.FindCategoryByName(CommandCategoryCodeTools); CmdMyTool := RegisterIDECommand(Cat,'JumpToImplementationDemo', 'Jump to implementation keyword (demo)', Key, nil, @JumpIDEToImplementationKeyword); xMenuCmd := RegisterIDEMenuCommand(itmCodeToolSearches,'JumpToImplementationDemo', 'Jump to implementation keyword (demo)',nil,@JumpIDEToImplementationKeyword, CmdMyTool); xMenuCmd.ToolButtonClass := TJumpToSectionDemoToolButton; end; { TJumpToSectionDemoToolButton } procedure TJumpToSectionDemoToolButton.DoOnAdded; var xItem: TMenuItem; begin inherited DoOnAdded; if DropdownMenu = nil then begin DropdownMenu := TPopupMenu.Create(Self); Style := tbsDropDown; end; xItem := TMenuItem.Create(DropdownMenu); DropdownMenu.Items.Add(xItem); xItem.Caption := 'Jump to interface keyword'; xItem.OnClick := @JumpToInterface; xItem := TMenuItem.Create(DropdownMenu); DropdownMenu.Items.Add(xItem); xItem.Caption := 'Jump to implementation keyword'; xItem.OnClick := @JumpToImplementation; end; procedure TJumpToSectionDemoToolButton.JumpToImplementation(Sender: TObject); begin JumpIDEToImplementationKeyword(Sender); end; procedure TJumpToSectionDemoToolButton.JumpToInterface(Sender: TObject); begin JumpIDEToInterfaceKeyword(Sender); end; end.