mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-11 10:42:47 +02:00
1966 lines
70 KiB
ObjectPascal
1966 lines
70 KiB
ObjectPascal
{ /***************************************************************************
|
|
codetoolsdefines.pas - Lazarus IDE unit
|
|
-----------------------------------------
|
|
|
|
***************************************************************************/
|
|
|
|
***************************************************************************
|
|
* *
|
|
* 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:
|
|
- TCodeToolsDefinesEditor is an editor for the CodeTools DefineTree used by
|
|
the IDE. The DefineTree defines all values, that are not in the sources,
|
|
but are provided by for example Makefiles, compiler command lines and
|
|
compiler config files.
|
|
|
|
There are three types of nodes:
|
|
- auto generated: These are created by the IDE.
|
|
- project specific: These nodes are saved in the project info file (.lpi)
|
|
- the rest are global nodes, saved in the codetoolsoptions.xml file.
|
|
|
|
}
|
|
unit CodeToolsDefines;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LCLLinux, Forms, Controls, Buttons, StdCtrls, ComCtrls,
|
|
ExtCtrls, Menus, LResources, LCLProc, Graphics, Dialogs, ImgList, SynEdit,
|
|
Laz_XMLCfg, LazarusIDEStrConsts, DefineTemplates, CodeToolManager,
|
|
CodeToolsOptions, CodeToolsDefPreview, TransferMacros, InputFileDialog,
|
|
IDEOptionDefs, LazConf, IDEProcs;
|
|
|
|
type
|
|
TCodeToolsDefinesEditor = class(TForm)
|
|
TheImageList: TImageList;
|
|
MainMenu: TMainMenu;
|
|
|
|
// exit menu
|
|
ExitMenuItem: TMenuItem;
|
|
SaveAndExitMenuItem: TMenuItem;
|
|
DontSaveAndExitMenuItem: TMenuItem;
|
|
|
|
// edit nodes
|
|
EditMenuItem: TMenuItem;
|
|
MoveNodeUpMenuItem: TMenuItem;
|
|
MoveNodeDownMenuItem: TMenuItem;
|
|
MoveNodeLvlUpMenuItem: TMenuItem;
|
|
MoveNodeLvlDownMenuItem: TMenuItem;
|
|
InsertBehindMenuItem: TMenuItem;
|
|
InsertBehindDefineMenuItem: TMenuItem;
|
|
InsertBehindDefineRecurseMenuItem: TMenuItem;
|
|
InsertBehindUndefineMenuItem: TMenuItem;
|
|
InsertBehindUndefineRecurseMenuItem: TMenuItem;
|
|
InsertBehindUndefineAllMenuItem: TMenuItem;
|
|
InsertBehindBlockMenuItem: TMenuItem;
|
|
InsertBehindDirectoryMenuItem: TMenuItem;
|
|
InsertBehindIfMenuItem: TMenuItem;
|
|
InsertBehindIfDefMenuItem: TMenuItem;
|
|
InsertBehindIfNotDefMenuItem: TMenuItem;
|
|
InsertBehindElseIfMenuItem: TMenuItem;
|
|
InsertBehindElseMenuItem: TMenuItem;
|
|
InsertAsChildMenuItem: TMenuItem;
|
|
InsertAsChildDefineMenuItem: TMenuItem;
|
|
InsertAsChildDefineRecurseMenuItem: TMenuItem;
|
|
InsertAsChildUndefineMenuItem: TMenuItem;
|
|
InsertAsChildUndefineRecurseMenuItem: TMenuItem;
|
|
InsertAsChildUndefineAllMenuItem: TMenuItem;
|
|
InsertAsChildBlockMenuItem: TMenuItem;
|
|
InsertAsChildDirectoryMenuItem: TMenuItem;
|
|
InsertAsChildIfMenuItem: TMenuItem;
|
|
InsertAsChildIfDefMenuItem: TMenuItem;
|
|
InsertAsChildIfNotDefMenuItem: TMenuItem;
|
|
InsertAsChildElseIfMenuItem: TMenuItem;
|
|
InsertAsChildElseMenuItem: TMenuItem;
|
|
DeleteNodeMenuItem: TMenuItem;
|
|
ConvertActionMenuItem: TMenuItem;
|
|
ConvertActionToDefineMenuItem: TMenuItem;
|
|
ConvertActionToDefineRecurseMenuItem: TMenuItem;
|
|
ConvertActionToUndefineMenuItem: TMenuItem;
|
|
ConvertActionToUndefineRecurseMenuItem: TMenuItem;
|
|
ConvertActionToUndefineAllMenuItem: TMenuItem;
|
|
ConvertActionToBlockMenuItem: TMenuItem;
|
|
ConvertActionToDirectoryMenuItem: TMenuItem;
|
|
ConvertActionToIfMenuItem: TMenuItem;
|
|
ConvertActionToIfDefMenuItem: TMenuItem;
|
|
ConvertActionToIfNotDefMenuItem: TMenuItem;
|
|
ConvertActionToElseIfMenuItem: TMenuItem;
|
|
ConvertActionToElseMenuItem: TMenuItem;
|
|
CopyToClipbrdMenuItem: TMenuItem;
|
|
PasteFromClipbrdMenuItem: TMenuItem;
|
|
|
|
// tools
|
|
ToolsMenuItem: TMenuItem;
|
|
OpenPreviewMenuItem: TMenuItem;
|
|
ShowMacroListMenuItem: TMenuItem;
|
|
|
|
// templates
|
|
InsertTemplateMenuItem: TMenuItem;
|
|
InsertFPCProjectDefinesTemplateMenuItem: TMenuItem;
|
|
InsertFPCompilerDefinesTemplateMenuItem: TMenuItem;
|
|
InsertFPCSourceDirTemplateMenuItem: TMenuItem;
|
|
InsertLazarusSourceTemplateMenuItem: TMenuItem;
|
|
InsertDelphi5CompilerDefinesTemplateMenuItem: TMenuItem;
|
|
InsertDelphi5DirectoryTemplateMenuItem: TMenuItem;
|
|
InsertDelphi5ProjectTemplateMenuItem: TMenuItem;
|
|
InsertDelphi6CompilerDefinesTemplateMenuItem: TMenuItem;
|
|
InsertDelphi6DirectoryTemplateMenuItem: TMenuItem;
|
|
InsertDelphi6ProjectTemplateMenuItem: TMenuItem;
|
|
InsertKylix3CompilerDefinesTemplateMenuItem: TMenuItem;
|
|
InsertKylix3DirectoryTemplateMenuItem: TMenuItem;
|
|
InsertKylix3ProjectTemplateMenuItem: TMenuItem;
|
|
|
|
// define tree
|
|
DefineTreeView: TTreeView;
|
|
|
|
// selected item
|
|
SelectedItemGroupBox: TGroupBox;
|
|
TypeLabel: TLabel;
|
|
NameLabel: TLabel;
|
|
NameEdit: TEdit;
|
|
DescriptionLabel: TLabel;
|
|
DescriptionEdit: TEdit;
|
|
VariableLabel: TLabel;
|
|
VariableEdit: TEdit;
|
|
ValueNoteBook: TNoteBook;
|
|
ValueAsTextSynEdit: TSynEdit;
|
|
ValueAsFilePathsSynEdit: TSynEdit;
|
|
MoveFilePathUpBitBtn: TBitBtn;
|
|
MoveFilePathDownBitBtn: TBitBtn;
|
|
DeleteFilePathBitBtn: TBitBtn;
|
|
InsertFilePathBitBtn: TBitBtn;
|
|
|
|
// preview
|
|
//DefinePreview: TCodeToolsDefinesPreview;
|
|
|
|
// misc
|
|
procedure FormResize(Sender: TObject);
|
|
procedure SelectedItemGroupBoxResize(Sender: TObject);
|
|
procedure ValueNoteBookResize(Sender: TObject);
|
|
procedure DefineTreeViewMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X,Y: integer);
|
|
|
|
// exit menu
|
|
procedure SaveAndExitMenuItemClick(Sender: TObject);
|
|
procedure DontSaveAndExitMenuItemClick(Sender: TObject);
|
|
|
|
// value notebook
|
|
procedure ValueNoteBookPageChanged(Sender: TObject);
|
|
procedure MoveFilePathUpBitBtnClick(Sender: TObject);
|
|
procedure MoveFilePathDownBitBtnClick(Sender: TObject);
|
|
procedure DeleteFilePathBitBtnClick(Sender: TObject);
|
|
procedure InsertFilePathBitBtnClick(Sender: TObject);
|
|
|
|
// edit menu
|
|
procedure InsertNodeMenuItemClick(Sender: TObject);
|
|
procedure MoveNodeUpMenuItemClick(Sender: TObject);
|
|
procedure MoveNodeDownMenuItemClick(Sender: TObject);
|
|
procedure MoveNodeLvlUpMenuItemClick(Sender: TObject);
|
|
procedure MoveNodeLvlDownMenuItemClick(Sender: TObject);
|
|
procedure DeleteNodeMenuItemClick(Sender: TObject);
|
|
procedure ConvertActionMenuItemClick(Sender: TObject);
|
|
|
|
// tools menu
|
|
procedure OpenPreviewMenuItemClick(Sender: TObject);
|
|
|
|
// template menu
|
|
procedure InsertFPCProjectDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertFPCompilerDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertFPCSourceDirDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertLazarusSourceDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertDelphiCompilerDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertDelphiDirectoryTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertDelphiProjectTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertKylixCompilerDefinesTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertKylixDirectoryTemplateMenuItemClick(Sender: TObject);
|
|
procedure InsertKylixProjectTemplateMenuItemClick(Sender: TObject);
|
|
private
|
|
FDefineTree: TDefineTree;
|
|
FLastSelectedNode: TTreeNode;
|
|
FBoss: TCodeToolManager;
|
|
FTransferMacros: TTransferMacroList;
|
|
procedure CreateComponents;
|
|
function CreateSeperator : TMenuItem;
|
|
procedure RebuildDefineTreeView;
|
|
procedure AddDefineNodes(ANode: TDefineTemplate; AParent: TTreeNode;
|
|
WithChilds,WithNextSiblings: boolean);
|
|
procedure SetNodeImages(ANode: TTreeNode; WithSubNodes: boolean);
|
|
procedure SetTransferMacros(const AValue: TTransferMacroList);
|
|
procedure ValueAsPathToValueAsText;
|
|
procedure SaveSelectedValues;
|
|
procedure ShowSelectedValues;
|
|
procedure SetTypeLabel;
|
|
function ValueToFilePathText(const AValue: string): string;
|
|
procedure InsertNewNode(Behind: boolean; Action: TDefineAction);
|
|
procedure InsertTemplate(NewTemplate: TDefineTemplate);
|
|
function FindUniqueName: string;
|
|
function ConsistencyCheck: integer;
|
|
procedure SetValuesEditable(AValue: boolean);
|
|
public
|
|
procedure SetOptions(ACodeToolBoss: TCodeToolManager;
|
|
Options: TCodeToolsOptions);
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
property DefineTree: TDefineTree read FDefineTree;
|
|
property Boss: TCodeToolManager read FBoss write FBoss;
|
|
property Macros: TTransferMacroList
|
|
read FTransferMacros write SetTransferMacros;
|
|
end;
|
|
|
|
function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager;
|
|
Options: TCodeToolsOptions; Macros: TTransferMacroList): TModalResult;
|
|
|
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
Math;
|
|
|
|
type
|
|
TWinControlClass = class of TWinControl;
|
|
|
|
function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager;
|
|
Options: TCodeToolsOptions; Macros: TTransferMacroList): TModalResult;
|
|
var CodeToolsDefinesEditor: TCodeToolsDefinesEditor;
|
|
begin
|
|
CodeToolsDefinesEditor:=TCodeToolsDefinesEditor.Create(Application);
|
|
CodeToolsDefinesEditor.SetOptions(ACodeToolBoss,Options);
|
|
CodeToolsDefinesEditor.Macros:=Macros;
|
|
Result:=CodeToolsDefinesEditor.ShowModal;
|
|
if Result=mrOk then begin
|
|
if not CodeToolsDefinesEditor.DefineTree.IsEqual(ACodeToolBoss.DefineTree)
|
|
then begin
|
|
ACodeToolBoss.DefineTree.AssignNonAutoCreated(
|
|
CodeToolsDefinesEditor.DefineTree);
|
|
Options.ReadGlobalDefinesTemplatesFromTree(ACodeToolBoss.DefineTree);
|
|
Options.Save;
|
|
end;
|
|
end;
|
|
CodeToolsDefinesEditor.Free;
|
|
end;
|
|
|
|
{ TCodeToolsDefinesEditor }
|
|
|
|
procedure TCodeToolsDefinesEditor.SaveAndExitMenuItemClick(Sender: TObject);
|
|
begin
|
|
IDEDialogLayoutList.SaveLayout(Self);
|
|
SaveSelectedValues;
|
|
FLastSelectedNode:=nil;
|
|
ModalResult:=mrOk;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.DontSaveAndExitMenuItemClick(Sender: TObject);
|
|
begin
|
|
IDEDialogLayoutList.SaveLayout(Self);
|
|
ModalResult:=mrCancel;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SelectedItemGroupBoxResize(Sender: TObject);
|
|
var SelItemMaxX, SelItemMaxY: integer;
|
|
begin
|
|
SelItemMaxX:=SelectedItemGroupBox.ClientWidth;
|
|
SelItemMaxY:=SelectedItemGroupBox.ClientHeight;
|
|
with TypeLabel do begin
|
|
Left:=5;
|
|
Top:=3;
|
|
Width:=SelItemMaxX-2*Left;
|
|
end;
|
|
with NameLabel do begin
|
|
Left:=TypeLabel.Left;
|
|
Top:=TypeLabel.Top+TypeLabel.Height+7;
|
|
Width:=70;
|
|
end;
|
|
with NameEdit do begin
|
|
Left:=NameLabel.Left+NameLabel.Width+5;
|
|
Top:=NameLabel.Top;
|
|
Width:=SelItemMaxX-Left-5;
|
|
end;
|
|
with DescriptionLabel do begin
|
|
Left:=NameLabel.Left;
|
|
Top:=NameLabel.Top+NameLabel.Height+7;
|
|
Width:=70;
|
|
end;
|
|
with DescriptionEdit do begin
|
|
Left:=DescriptionLabel.Left+DescriptionLabel.Width+5;
|
|
Top:=DescriptionLabel.Top;
|
|
Width:=SelItemMaxX-Left-5;
|
|
end;
|
|
with VariableLabel do begin
|
|
Left:=DescriptionLabel.Left;
|
|
Top:=DescriptionLabel.Top+DescriptionLabel.Height+7;
|
|
Width:=70;
|
|
end;
|
|
with VariableEdit do begin
|
|
Left:=VariableLabel.Left+VariableLabel.Width+5;
|
|
Top:=VariableLabel.Top;
|
|
Width:=SelItemMaxX-Left-5;
|
|
end;
|
|
with ValueNoteBook do begin
|
|
Left:=0;
|
|
Top:=VariableLabel.Top+VariableLabel.Height+8;
|
|
Width:=SelItemMaxX;
|
|
Height:=SelItemMaxY-Top;
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.FormResize(Sender: TObject);
|
|
var MaxX, MaxY, SelGrpBoxTop: integer;
|
|
begin
|
|
MaxX:=ClientWidth;
|
|
MaxY:=ClientHeight;
|
|
SelGrpBoxTop:=MaxY-310;
|
|
|
|
// define tree ---------------------------------------------------------------
|
|
with DefineTreeView do begin
|
|
Left:=3;
|
|
Top:=3;
|
|
Width:=MaxX-2*Left;
|
|
Height:=SelGrpBoxTop-2*Top;
|
|
end;
|
|
|
|
// selected item -------------------------------------------------------------
|
|
with SelectedItemGroupBox do begin
|
|
Left:=DefineTreeView.Left;
|
|
Top:=SelGrpBoxTop;
|
|
Width:=MaxX-2*Left;
|
|
Height:=MaxY-Top-Left;
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.DefineTreeViewMouseUp(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: integer);
|
|
begin
|
|
ShowSelectedValues;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.ValueNoteBookPageChanged(Sender: TObject);
|
|
begin
|
|
if ValueNoteBook.PageIndex=0 then
|
|
ValueAsPathToValueAsText
|
|
else
|
|
ValueAsFilePathsSynEdit.Text:=ValueToFilePathText(ValueAsTextSynEdit.Text);
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveFilePathUpBitBtnClick(Sender: TObject);
|
|
var y: integer;
|
|
begin
|
|
if ValueAsFilePathsSynEdit.ReadOnly then exit;
|
|
y:=ValueAsFilePathsSynEdit.CaretY-1;
|
|
if (y>0) and (y<ValueAsFilePathsSynEdit.Lines.Count) then
|
|
ValueAsFilePathsSynEdit.Lines.Move(y,y-1);
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveFilePathDownBitBtnClick(Sender: TObject);
|
|
var y: integer;
|
|
begin
|
|
if ValueAsFilePathsSynEdit.ReadOnly then exit;
|
|
y:=ValueAsFilePathsSynEdit.CaretY-1;
|
|
if (y>=0) and (y<ValueAsFilePathsSynEdit.Lines.Count-1) then
|
|
ValueAsFilePathsSynEdit.Lines.Move(y,y+1);
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.DeleteFilePathBitBtnClick(Sender: TObject);
|
|
var y: integer;
|
|
begin
|
|
if ValueAsFilePathsSynEdit.ReadOnly then exit;
|
|
y:=ValueAsFilePathsSynEdit.CaretY-1;
|
|
if (y>=0) and (y<ValueAsFilePathsSynEdit.Lines.Count) then
|
|
ValueAsFilePathsSynEdit.Lines.Delete(y);
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertFilePathBitBtnClick(Sender: TObject);
|
|
var y: integer;
|
|
begin
|
|
if ValueAsFilePathsSynEdit.ReadOnly then exit;
|
|
y:=ValueAsFilePathsSynEdit.CaretY-1;
|
|
if (y>=0) and (y<ValueAsFilePathsSynEdit.Lines.Count) then
|
|
ValueAsFilePathsSynEdit.Lines.Insert(y,'');
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertNodeMenuItemClick(Sender: TObject);
|
|
var Behind: boolean;
|
|
Action: TDefineAction;
|
|
begin
|
|
Behind:=(TMenuItem(Sender).Parent=InsertBehindMenuItem);
|
|
if Sender=InsertBehindDefineMenuItem then Action:=da_Define
|
|
else if Sender=InsertBehindDefineRecurseMenuItem then Action:=da_DefineRecurse
|
|
else if Sender=InsertBehindUndefineMenuItem then Action:=da_Undefine
|
|
else if Sender=InsertBehindUndefineRecurseMenuItem then Action:=da_UndefineRecurse
|
|
else if Sender=InsertBehindUndefineAllMenuItem then Action:=da_UndefineAll
|
|
else if Sender=InsertBehindBlockMenuItem then Action:=da_Block
|
|
else if Sender=InsertBehindDirectoryMenuItem then Action:=da_Directory
|
|
else if Sender=InsertBehindIfMenuItem then Action:=da_If
|
|
else if Sender=InsertBehindIfDefMenuItem then Action:=da_IfDef
|
|
else if Sender=InsertBehindIfNotDefMenuItem then Action:=da_IfNDef
|
|
else if Sender=InsertBehindElseIfMenuItem then Action:=da_ElseIf
|
|
else if Sender=InsertBehindElseMenuItem then Action:=da_Else
|
|
else if Sender=InsertAsChildDefineMenuItem then Action:=da_Define
|
|
else if Sender=InsertAsChildDefineRecurseMenuItem then Action:=da_DefineRecurse
|
|
else if Sender=InsertAsChildUndefineMenuItem then Action:=da_Undefine
|
|
else if Sender=InsertAsChildUndefineRecurseMenuItem then Action:=da_UndefineRecurse
|
|
else if Sender=InsertAsChildUndefineAllMenuItem then Action:=da_UndefineAll
|
|
else if Sender=InsertAsChildBlockMenuItem then Action:=da_Block
|
|
else if Sender=InsertAsChildDirectoryMenuItem then Action:=da_Directory
|
|
else if Sender=InsertAsChildIfMenuItem then Action:=da_If
|
|
else if Sender=InsertAsChildIfDefMenuItem then Action:=da_IfDef
|
|
else if Sender=InsertAsChildIfNotDefMenuItem then Action:=da_IfNDef
|
|
else if Sender=InsertAsChildElseIfMenuItem then Action:=da_ElseIf
|
|
else if Sender=InsertAsChildElseMenuItem then Action:=da_Else;
|
|
InsertNewNode(Behind,Action);
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveNodeUpMenuItemClick(Sender: TObject);
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode, PrevDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
PrevDefNode:=SelDefNode.Prior;
|
|
// move node up in TreeView
|
|
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naInsert);
|
|
// move node up in DefineTree
|
|
SelDefNode.Unbind;
|
|
SelDefNode.InsertInFront(PrevDefNode);
|
|
SelTreeNode.MakeVisible;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveNodeDownMenuItemClick(Sender: TObject);
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode, NextDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if (SelTreeNode=nil) or (SelTreeNode.GetNextSibling=nil) then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
NextDefNode:=SelDefNode.Next;
|
|
// move node down in TreeView
|
|
if SelTreeNode.GetNextSibling.GetNextSibling<>nil then
|
|
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling.GetNextSibling,naInsert)
|
|
else
|
|
SelTreeNode.MoveTo(SelTreeNode.GetNextSibling,naAdd);
|
|
// move node down in DefineTree
|
|
SelDefNode.Unbind;
|
|
SelDefNode.InsertBehind(NextDefNode);
|
|
SelTreeNode.MakeVisible;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveNodeLvlUpMenuItemClick(Sender: TObject);
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode, PrevDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if (SelTreeNode=nil) or (SelTreeNode.Parent=nil) then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
if SelDefNode.IsAutoGenerated then begin
|
|
MessageDlg(lisCodeToolsDefsNodeIsReadonly,
|
|
lisCodeToolsDefsAutoGeneratedNodesCanNotBeEdited,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
// move node one lvl up in TreeView
|
|
if SelTreeNode.Parent.GetNextSibling<>nil then
|
|
SelTreeNode.MoveTo(SelTreeNode.Parent.GetNextSibling,naInsert)
|
|
else
|
|
SelTreeNode.MoveTo(SelTreeNode.Parent,naAdd);
|
|
// move node one lvl up in DefineTree
|
|
PrevDefNode:=SelDefNode.Parent;
|
|
SelDefNode.Unbind;
|
|
SelDefNode.InsertBehind(PrevDefNode);
|
|
SetNodeImages(SelTreeNode,true);
|
|
SelTreeNode.MakeVisible;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.MoveNodeLvlDownMenuItemClick(Sender: TObject);
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode, PrevDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if (SelTreeNode=nil) or (SelTreeNode.GetPrevSibling=nil) then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
PrevDefNode:=SelDefNode.Prior;
|
|
if (SelDefNode.IsAutoGenerated) or (PrevDefNode.IsAutoGenerated) then begin
|
|
MessageDlg(lisCodeToolsDefsNodeIsReadonly,
|
|
lisCodeToolsDefsAutoGeneratedNodesCanNotBeEdited,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
if (not (PrevDefNode.Action in DefineActionBlocks)) then begin
|
|
MessageDlg(lisCodeToolsDefsInvalidPreviousNode,
|
|
lisCodeToolsDefsPreviousNodeCanNotContainChildNodes,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
// move node one lvl down in TreeView
|
|
SelTreeNode.MoveTo(SelTreeNode.GetPrevSibling,naAddChild);
|
|
// move node one lvl up in DefineTree
|
|
SelDefNode.Unbind;
|
|
PrevDefNode.AddChild(SelDefNode);
|
|
SetNodeImages(SelTreeNode.Parent,true);
|
|
SelTreeNode.MakeVisible;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.DeleteNodeMenuItemClick(Sender: TObject);
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if (SelTreeNode=nil) then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
if (SelDefNode.IsAutoGenerated) then begin
|
|
MessageDlg(lisCodeToolsDefsNodeIsReadonly,
|
|
lisCodeToolsDefsAutoGeneratedNodesCanNotBeEdited,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
if FLastSelectedNode=SelTreeNode then FLastSelectedNode:=nil;
|
|
// delete node in TreeView
|
|
SelTreeNode.Free;
|
|
// delete node in DefineTree
|
|
SelDefNode.Unbind;
|
|
SelDefNode.Free;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.ConvertActionMenuItemClick(Sender: TObject);
|
|
var
|
|
NewAction: TDefineAction;
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
if SelTreeNode=nil then exit;
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
if (SelDefNode.IsAutoGenerated) then begin
|
|
MessageDlg(lisCodeToolsDefsNodeIsReadonly,
|
|
lisCodeToolsDefsAutoGeneratedNodesCanNotBeEdited,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
if Sender=ConvertActionToDefineMenuItem then NewAction:=da_Define
|
|
else if Sender=ConvertActionToDefineRecurseMenuItem then NewAction:=da_DefineRecurse
|
|
else if Sender=ConvertActionToUndefineMenuItem then NewAction:=da_Undefine
|
|
else if Sender=ConvertActionToUndefineRecurseMenuItem then NewAction:=da_UndefineRecurse
|
|
else if Sender=ConvertActionToUndefineAllMenuItem then NewAction:=da_UndefineAll
|
|
else if Sender=ConvertActionToBlockMenuItem then NewAction:=da_Block
|
|
else if Sender=ConvertActionToDirectoryMenuItem then NewAction:=da_Directory
|
|
else if Sender=ConvertActionToIfMenuItem then NewAction:=da_If
|
|
else if Sender=ConvertActionToIfDefMenuItem then NewAction:=da_IfDef
|
|
else if Sender=ConvertActionToIfNotDefMenuItem then NewAction:=da_IfNDef
|
|
else if Sender=ConvertActionToElseIfMenuItem then NewAction:=da_ElseIf
|
|
else if Sender=ConvertActionToElseMenuItem then NewAction:=da_Else;
|
|
SelDefNode.Action:=NewAction;
|
|
SetNodeImages(SelTreeNode,false);
|
|
SetTypeLabel;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.OpenPreviewMenuItemClick(Sender: TObject);
|
|
begin
|
|
ShowCodeToolsDefinesValuesDialog(DefineTree,'');
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertFPCProjectDefinesTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var InputFileDlg: TInputFileDialog;
|
|
UnitSearchPath, UnitLinkList, DefaultFPCSrcDir, DefaultCompiler,
|
|
CompilerPath, FPCSrcDir: string;
|
|
DirTemplate, FPCTemplate, FPCSrcTemplate: TDefineTemplate;
|
|
begin
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
|
|
DefaultFPCSrcDir:='$(FPCSrcDir)';
|
|
DefaultCompiler:='$(CompPath)';
|
|
UnitSearchPath:='';
|
|
UnitLinkList:='';
|
|
|
|
BeginUpdate;
|
|
Caption:=lisCodeToolsDefsCreateFPCMacrosAndPathsForAFPCProjectDirectory;
|
|
|
|
FileCount:=3;
|
|
|
|
FileTitles[0]:=lisCodeToolsDefsProjectDirectory;
|
|
FileDescs[0]:=lisCodeToolsDefsTheFreePascalProjectDirectory;
|
|
FileNames[0]:='';
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
FileTitles[1]:=lisCodeToolsDefscompilerPath;
|
|
FileDescs[1]:=BreakString(
|
|
lisCodeToolsDefsThePathToTheFreePascalCompilerForThisProject, 60, 0);
|
|
FileNames[1]:=DefaultCompiler;
|
|
FileFlags[1]:=[iftFilename];
|
|
|
|
FileTitles[2]:=lisCodeToolsDefsFPCCVSSourceDirectory;
|
|
FileDescs[2]:=BreakString(
|
|
lisCodeToolsDefsTheFreePascalCVSSourceDirectory, 60, 0);
|
|
FileNames[2]:=DefaultFPCSrcDir;
|
|
FileFlags[2]:=[iftDirectory];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
|
|
// ask the compiler for Macros
|
|
CompilerPath:=FileNames[1];
|
|
if Macros<>nil then Macros.SubstituteStr(CompilerPath);
|
|
writeln(' CompilerPath="',CompilerPath,'"');
|
|
if (CompilerPath<>'') and (CompilerPath<>DefaultCompiler) then
|
|
FPCTemplate:=Boss.DefinePool.CreateFPCTemplate(CompilerPath,'',
|
|
CreateCompilerTestPascalFilename,UnitSearchPath,
|
|
CodeToolsOpts)
|
|
else
|
|
FPCTemplate:=nil;
|
|
|
|
// create path defines
|
|
FPCSrcDir:=FileNames[2];
|
|
if Macros<>nil then Macros.SubstituteStr(FPCSrcDir);
|
|
writeln(' FPCSrcDir="',FPCSrcDir,'"');
|
|
if (FPCSrcDir<>'') and (FPCSrcDir<>DefaultFPCSrcDir)
|
|
and (UnitSearchPath<>'') then
|
|
FPCSrcTemplate:=Boss.DefinePool.CreateFPCSrcTemplate(FPCSrcDir,
|
|
UnitSearchPath, 'ppu', false, UnitLinkList, CodeToolsOpts)
|
|
else
|
|
FPCSrcTemplate:=nil;
|
|
|
|
// create directory defines
|
|
DirTemplate:=TDefineTemplate.Create('FPC Project ('+FileNames[0]+')',
|
|
'Free Pascal Project Directory','',FileNames[0],da_Directory);
|
|
|
|
if (DefaultFPCSrcDir=Filenames[2]) and (DefaultCompiler=Filenames[1]) then
|
|
begin
|
|
// a normal fpc project -> nothing special needed
|
|
FPCTemplate.Free;
|
|
FPCSrcTemplate.Free;
|
|
end else begin
|
|
// a special fpc project -> create a world of its own
|
|
DirTemplate.AddChild(TDefineTemplate.Create('Reset All',
|
|
'Reset all values','','',da_UndefineAll));
|
|
if FPCTemplate<>nil then
|
|
DirTemplate.AddChild(FPCTemplate);
|
|
if UnitLinkList<>'' then begin
|
|
DirTemplate.AddChild(TDefineTemplate.Create('FPC Unit Links',
|
|
'Source filenames for standard FPC units',
|
|
ExternalMacroStart+'UnitLinks',UnitLinkList,da_DefineRecurse));
|
|
end;
|
|
FPCSrcTemplate.Free;
|
|
end;
|
|
|
|
DirTemplate.SetDefineOwner(CodeToolsOpts,true);
|
|
InsertTemplate(DirTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertFPCompilerDefinesTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var InputFileDlg: TInputFileDialog;
|
|
s, CompilerPath, DefaultCompiler: string;
|
|
FPCTemplate: TDefineTemplate;
|
|
begin
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
DefaultCompiler:='$(CompPath)';
|
|
|
|
BeginUpdate;
|
|
Caption:=lisCodeToolsDefsCreateDefinesForFreePascalCompiler;
|
|
FileCount:=1;
|
|
|
|
FileTitles[0]:='compiler path';
|
|
FileDescs[0]:=Format(
|
|
lisCodeToolsDefsThePathToTheFreePascalCompilerForExample, [#13,
|
|
'"', '"', '"', '"']);
|
|
FileNames[0]:=DefaultCompiler;
|
|
FileFlags[0]:=[iftCmdLine,iftNotEmpty];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
|
|
CompilerPath:=FileNames[0];
|
|
if Macros<>nil then Macros.SubstituteStr(CompilerPath);
|
|
writeln(' CompilerPath="',CompilerPath,'"');
|
|
|
|
FPCTemplate:=Boss.DefinePool.CreateFPCTemplate(CompilerPath,'',
|
|
CreateCompilerTestPascalFilename,s,
|
|
CodeToolsOpts);
|
|
if FPCTemplate=nil then exit;
|
|
FPCTemplate.Name:='Free Pascal Compiler ('+CompilerPath+')';
|
|
InsertTemplate(FPCTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertFPCSourceDirDefinesTemplateMenuItemClick
|
|
(Sender: TObject);
|
|
var InputFileDlg: TInputFileDialog;
|
|
UnitSearchPath, UnitLinks, DefaultCompiler, CompilerPath, FPCSrcDir: string;
|
|
ResetAllTemplate, FPCSrcTemplate, FPCSrcDirTemplate,
|
|
FPCTemplate: TDefineTemplate;
|
|
begin
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
DefaultCompiler:='$(CompPath)';
|
|
UnitSearchPath:='';
|
|
|
|
BeginUpdate;
|
|
Caption:=lisCodeToolsDefsCreateDefinesForFreePascalCVSSources;
|
|
FileCount:=2;
|
|
|
|
FileTitles[0]:=lisCodeToolsDefsFPCCVSSourceDirectory;
|
|
FileDescs[0]:=lisCodeToolsDefsTheFreePascalCVSSourceDir;
|
|
FileNames[0]:='~/fpc_sources/1.1/fpc';
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
FileTitles[1]:=lisCodeToolsDefscompilerPath;
|
|
FileDescs[1]:='The path to the free pascal compiler for this source.'#13
|
|
+'Used to autocreate macros.';
|
|
FileNames[1]:=DefaultCompiler;
|
|
FileFlags[1]:=[iftFilename];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
|
|
// ask the compiler for Macros
|
|
CompilerPath:=FileNames[1];
|
|
if Macros<>nil then Macros.SubstituteStr(CompilerPath);
|
|
writeln(' CompilerPath="',CompilerPath,'"');
|
|
|
|
FPCTemplate:=Boss.DefinePool.CreateFPCTemplate(CompilerPath,'',
|
|
CreateCompilerTestPascalFilename,UnitSearchPath,
|
|
CodeToolsOpts);
|
|
if FPCTemplate=nil then begin
|
|
writeln('ERROR: unable to get FPC Compiler Macros from "',CompilerPath,'"');
|
|
exit;
|
|
end;
|
|
|
|
// create FPC CVS Source defines
|
|
FPCSrcDir:=FileNames[0];
|
|
if Macros<>nil then Macros.SubstituteStr(FPCSrcDir);
|
|
writeln(' FPCSrcDir="',FPCSrcDir,'"');
|
|
UnitSearchPath:='';
|
|
FPCSrcTemplate:=Boss.DefinePool.CreateFPCSrcTemplate(FPCSrcDir,
|
|
UnitSearchPath, 'ppu', false, UnitLinks, CodeToolsOpts);
|
|
if FPCSrcTemplate=nil then begin
|
|
writeln('ERROR: unable to create FPC CVS Src defines for "',FPCSrcDir,'"');
|
|
FPCTemplate.Free;
|
|
exit;
|
|
end;
|
|
|
|
// create directory defines
|
|
FPCSrcDirTemplate:=FPCSrcTemplate.FirstChild.Next;
|
|
FPCSrcDirTemplate.UnBind;
|
|
FPCSrcTemplate.Free;
|
|
FPCSrcDirTemplate.Name:='FPC CVS Sources ('+FileNames[0]+')';
|
|
ResetAllTemplate:=TDefineTemplate.Create('Reset All','Reset all values',
|
|
'','',da_UndefineAll);
|
|
ResetAllTemplate.InsertInFront(FPCSrcDirTemplate.FirstChild);
|
|
FPCTemplate.InsertBehind(ResetAllTemplate);
|
|
|
|
FPCSrcDirTemplate.SetDefineOwner(CodeToolsOpts,true);
|
|
InsertTemplate(FPCSrcDirTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertLazarusSourceDefinesTemplateMenuItemClick
|
|
(Sender: TObject);
|
|
var
|
|
InputFileDlg: TInputFileDialog;
|
|
LazTemplate: TDefineTemplate;
|
|
begin
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
BeginUpdate;
|
|
Caption:=lisCodeToolsDefsCreateDefinesForLazarusDir;
|
|
FileCount:=1;
|
|
|
|
FileTitles[0]:=lisCodeToolsDefsLazarusDirectory;
|
|
FileDescs[0]:=lisCodeToolsDefsTheLazarusMainDirectory;
|
|
FileNames[0]:=IDEProcs.ProgramDirectory;
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
LazTemplate:=Boss.DefinePool.CreateLazarusSrcTemplate(FileNames[0],
|
|
'$('+ExternalMacroStart+'LCLWidgetType)','',
|
|
CodeToolsOpts);
|
|
if LazTemplate=nil then exit;
|
|
LazTemplate.Name:='Lazarus Directory ('+FileNames[0]+')';
|
|
InsertTemplate(LazTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertDelphiCompilerDefinesTemplateMenuItemClick
|
|
(Sender: TObject);
|
|
var DelphiVersion: integer;
|
|
begin
|
|
if Sender=InsertDelphi6CompilerDefinesTemplateMenuItem then
|
|
DelphiVersion:=6
|
|
else
|
|
DelphiVersion:=5;
|
|
InsertTemplate(Boss.DefinePool.CreateDelphiCompilerDefinesTemplate(
|
|
DelphiVersion,CodeToolsOpts));
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertDelphiDirectoryTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var InputFileDlg: TInputFileDialog;
|
|
DirTemplate: TDefineTemplate;
|
|
DelphiVersion: integer;
|
|
DelphiName: string;
|
|
begin
|
|
if Sender=InsertDelphi6DirectoryTemplateMenuItem then
|
|
DelphiVersion:=6
|
|
else
|
|
DelphiVersion:=5;
|
|
DelphiName:='Delphi'+IntToStr(DelphiVersion);
|
|
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
BeginUpdate;
|
|
Caption:=Format(lisCodeToolsDefsCreateDefinesForDirectory, [DelphiName]);
|
|
FileCount:=1;
|
|
|
|
FileTitles[0]:=Format(lisCodeToolsDefsdirectory, [DelphiName]);
|
|
FileDescs[0]:=Format(lisCodeToolsDefsDelphiMainDirectoryDesc, [DelphiName,
|
|
#13, DelphiName, #13, IntToStr(DelphiVersion)]);
|
|
FileNames[0]:=SetDirSeparators(
|
|
'C:/Programme/Borland/Delphi'+IntToStr(DelphiVersion));
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
DirTemplate:=Boss.DefinePool.CreateDelphiDirectoryTemplate(FileNames[0],
|
|
DelphiVersion,CodeToolsOpts);
|
|
if DirTemplate=nil then exit;
|
|
DirTemplate.Name:=DelphiName+' ('+FileNames[0]+')';
|
|
InsertTemplate(DirTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertDelphiProjectTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var
|
|
InputFileDlg: TInputFileDialog;
|
|
ProjTemplate: TDefineTemplate;
|
|
DelphiVersion: integer;
|
|
DelphiName: string;
|
|
begin
|
|
if Sender=InsertDelphi6ProjectTemplateMenuItem then
|
|
DelphiVersion:=6
|
|
else
|
|
DelphiVersion:=5;
|
|
DelphiName:='Delphi'+IntToStr(DelphiVersion);
|
|
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
BeginUpdate;
|
|
Caption:=Format(lisCodeToolsDefsCreateDefinesForProject, [DelphiName]);
|
|
|
|
FileCount:=2;
|
|
|
|
FileTitles[0]:=Format(lisCodeToolsDefsprojectDirectory2, [DelphiName]);
|
|
FileDescs[0]:=Format(lisCodeToolsDefsTheProjectDirectory, [DelphiName, #13]
|
|
);
|
|
FileNames[0]:=SetDirSeparators('C:/Programme/Borland/Delphi'
|
|
+IntToStr(DelphiVersion)+'/YourProject');
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
FileTitles[1]:=Format(lisCodeToolsDefsdirectory, [DelphiName]);
|
|
FileDescs[1]:=Format(lisCodeToolsDefsDelphiMainDirectoryForProject, [
|
|
DelphiName, #13, DelphiName, #13, DelphiName, #13, IntToStr(DelphiVersion)
|
|
]);
|
|
FileNames[1]:=SetDirSeparators('C:/Programme/Borland/Delphi'
|
|
+IntToStr(DelphiVersion));
|
|
FileFlags[1]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
ProjTemplate:=Boss.DefinePool.CreateDelphiProjectTemplate(FileNames[0],
|
|
FileNames[1],DelphiVersion,CodeToolsOpts);
|
|
if ProjTemplate=nil then exit;
|
|
ProjTemplate.Name:=DelphiName+' Project ('+FileNames[0]+')';
|
|
InsertTemplate(ProjTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertKylixCompilerDefinesTemplateMenuItemClick
|
|
(Sender: TObject);
|
|
var KylixVersion: integer;
|
|
begin
|
|
KylixVersion:=3;
|
|
InsertTemplate(Boss.DefinePool.CreateKylixCompilerDefinesTemplate(
|
|
KylixVersion,CodeToolsOpts));
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertKylixDirectoryTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var
|
|
InputFileDlg: TInputFileDialog;
|
|
DirTemplate: TDefineTemplate;
|
|
KylixVersion: integer;
|
|
KylixName: string;
|
|
UserName: String;
|
|
begin
|
|
KylixVersion:=3;
|
|
KylixName:='Kylix'+IntToStr(KylixVersion);
|
|
|
|
UserName:=GetCurrentUserName;
|
|
if UserName='' then UserName:='user';
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
BeginUpdate;
|
|
Caption:=Format(lisCodeToolsDefsCreateDefinesForDirectory, [KylixName]);
|
|
FileCount:=1;
|
|
|
|
FileTitles[0]:=Format(lisCodeToolsDefsdirectory, [KylixName]);
|
|
FileDescs[0]:=Format(lisCodeToolsDefsKylixMainDirectoryDesc, [KylixName,
|
|
#13, KylixName, #13, IntToStr(KylixVersion)]);
|
|
FileNames[0]:=SetDirSeparators(
|
|
'/home/'+UserName+'/kylix'+IntToStr(KylixVersion));
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
DirTemplate:=Boss.DefinePool.CreateKylixDirectoryTemplate(FileNames[0],
|
|
KylixVersion,CodeToolsOpts);
|
|
if DirTemplate=nil then exit;
|
|
DirTemplate.Name:=KylixName+' ('+FileNames[0]+')';
|
|
InsertTemplate(DirTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertKylixProjectTemplateMenuItemClick(
|
|
Sender: TObject);
|
|
var
|
|
InputFileDlg: TInputFileDialog;
|
|
ProjTemplate: TDefineTemplate;
|
|
KylixVersion: integer;
|
|
KylixName: string;
|
|
UserName: String;
|
|
begin
|
|
KylixVersion:=3;
|
|
KylixName:='Kylix'+IntToStr(KylixVersion);
|
|
|
|
UserName:=GetCurrentUserName;
|
|
if UserName='' then UserName:='user';
|
|
InputFileDlg:=GetInputFileDialog;
|
|
InputFileDlg.Macros:=Macros;
|
|
with InputFileDlg do begin
|
|
BeginUpdate;
|
|
Caption:=Format(lisCodeToolsDefsCreateDefinesForProject, [KylixName]);
|
|
|
|
FileCount:=2;
|
|
|
|
FileTitles[0]:=Format(lisCodeToolsDefsprojectDirectory2, [KylixName]);
|
|
FileDescs[0]:=Format(lisCodeToolsDefsTheProjectDirectory, [KylixName, #13]
|
|
);
|
|
FileNames[0]:=SetDirSeparators('/home/'+UserName+'/kylix'
|
|
+IntToStr(KylixVersion)+'/YourProject');
|
|
FileFlags[0]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
FileTitles[1]:=Format(lisCodeToolsDefsdirectory, [KylixName]);
|
|
FileDescs[1]:=Format(lisCodeToolsDefsKylixMainDirectoryForProject, [
|
|
KylixName, #13, KylixName, #13, KylixName, #13, IntToStr(KylixVersion)
|
|
]);
|
|
FileNames[1]:=SetDirSeparators('/home/'+UserName+'/kylix'+IntToStr(KylixVersion));
|
|
FileFlags[1]:=[iftDirectory,iftNotEmpty,iftMustExist];
|
|
|
|
EndUpdate;
|
|
if ShowModal=mrCancel then exit;
|
|
ProjTemplate:=Boss.DefinePool.CreateDelphiProjectTemplate(FileNames[0],
|
|
FileNames[1],KylixVersion,CodeToolsOpts);
|
|
if ProjTemplate=nil then exit;
|
|
ProjTemplate.Name:=KylixName+' Project ('+FileNames[0]+')';
|
|
InsertTemplate(ProjTemplate);
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.ValueNoteBookResize(Sender: TObject);
|
|
var ValNoteBookMaxX, ValNoteBookMaxY: integer;
|
|
begin
|
|
//ValNoteBookMaxX:=ValueNoteBook.ClientWidth-10;//ValueAsTextSynEdit.Parent.ClientWidth;
|
|
//ValNoteBookMaxY:=ValueNoteBook.ClientHeight-30;//ValueAsTextSynEdit.Parent.ClientHeight;
|
|
ValNoteBookMaxX:=ValueAsTextSynEdit.Parent.ClientWidth;
|
|
ValNoteBookMaxY:=ValueAsTextSynEdit.Parent.ClientHeight;
|
|
with ValueAsTextSynEdit do begin
|
|
Left:=0;
|
|
Top:=0;
|
|
Width:=ValNoteBookMaxX;
|
|
Height:=ValNoteBookMaxY;
|
|
end;
|
|
with ValueAsFilePathsSynEdit do begin
|
|
Left:=0;
|
|
Top:=0;
|
|
Width:=ValNoteBookMaxX-80;
|
|
Height:=ValNoteBookMaxY;
|
|
end;
|
|
with MoveFilePathUpBitBtn do begin
|
|
Left:=ValNoteBookMaxX-75;
|
|
Top:=1;
|
|
Width:=ValNoteBookMaxX-Left-5;
|
|
end;
|
|
with MoveFilePathDownBitBtn do begin
|
|
Left:=MoveFilePathUpBitBtn.Left;
|
|
Top:=MoveFilePathUpBitBtn.Top+MoveFilePathUpBitBtn.Height+5;
|
|
Width:=MoveFilePathUpBitBtn.Width;
|
|
end;
|
|
with DeleteFilePathBitBtn do begin
|
|
Left:=MoveFilePathUpBitBtn.Left;
|
|
Top:=MoveFilePathDownBitBtn.Top+MoveFilePathDownBitBtn.Height+5;
|
|
Width:=MoveFilePathUpBitBtn.Width;
|
|
end;
|
|
with InsertFilePathBitBtn do begin
|
|
Left:=MoveFilePathUpBitBtn.Left;
|
|
Top:=DeleteFilePathBitBtn.Top+DeleteFilePathBitBtn.Height+5;
|
|
Width:=MoveFilePathUpBitBtn.Width;
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.CreateComponents;
|
|
|
|
procedure CreateWinControl(var AWinControl: TWinControl;
|
|
AWinControlClass: TWinControlClass; const AName: string;
|
|
AParent: TWinControl);
|
|
begin
|
|
AWinControl:=AWinControlClass.Create(Self);
|
|
with AWinControl do begin
|
|
Name:=AName;
|
|
Parent:=AParent;
|
|
Visible:=true;
|
|
end;
|
|
end;
|
|
|
|
procedure AddMenuItem(var AMenuItem: TMenuItem; const AName, ACaption: string;
|
|
AParent: TMenuItem);
|
|
begin
|
|
AMenuItem:=TMenuItem.Create(Self);
|
|
AMenuItem.Name:=AName;
|
|
AMenuItem.Caption:=ACaption;
|
|
if AParent=nil then
|
|
MainMenu.Items.Add(AMenuItem)
|
|
else
|
|
AParent.Add(AMenuItem);
|
|
end;
|
|
|
|
procedure AddResImg(const ResName: string);
|
|
var Pixmap: TPixmap;
|
|
begin
|
|
Pixmap:=TPixmap.Create;
|
|
Pixmap.TransparentColor:=clWhite;
|
|
Pixmap.LoadFromLazarusResource(ResName);
|
|
TheImageList.Add(Pixmap,nil)
|
|
end;
|
|
|
|
var i: integer;
|
|
begin
|
|
TheImageList:=TImageList.Create(Self);
|
|
with TheImageList do begin
|
|
Width:=22;
|
|
Height:=22;
|
|
Name:='TheImageList';
|
|
AddResImg('define_22x22');
|
|
AddResImg('definerecurse_22x22');
|
|
AddResImg('undefine_22x22');
|
|
AddResImg('undefinerecurse_22x22');
|
|
AddResImg('undefineall_22x22');
|
|
AddResImg('block_22x22');
|
|
AddResImg('directory_22x22');
|
|
AddResImg('if_22x22');
|
|
AddResImg('ifdef_22x22');
|
|
AddResImg('ifndef_22x22');
|
|
AddResImg('elseif_22x22');
|
|
AddResImg('else_22x22');
|
|
AddResImg('ctdefinestate_none_22x22');
|
|
AddResImg('ctdefinestate_auto_22x22');
|
|
AddResImg('ctdefinestate_projspec_22x22');
|
|
AddResImg('ctdefinestate_autoproj_22x22');
|
|
end;
|
|
|
|
// Main Menu -----------------------------------------------------------------
|
|
MainMenu := TMainMenu.Create(Self);
|
|
MainMenu.Name:='MainMenu';
|
|
Menu := MainMenu;
|
|
|
|
// exit menu
|
|
AddMenuItem(ExitMenuItem, 'ExitMenuItem', lisCodeToolsDefsExit, nil);
|
|
AddMenuItem(SaveAndExitMenuItem, 'SaveAndExitMenuItem',
|
|
lisCodeToolsDefsSaveAndExit,
|
|
ExitMenuItem);
|
|
SaveAndExitMenuItem.OnClick:=@SaveAndExitMenuItemClick;
|
|
ExitMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(DontSaveAndExitMenuItem,'DontSaveAndExitMenuItem',
|
|
lisCodeToolsDefsExitWithoutSave, ExitMenuItem);
|
|
DontSaveAndExitMenuItem.OnClick:=@DontSaveAndExitMenuItemClick;
|
|
|
|
// edit nodes
|
|
AddMenuItem(EditMenuItem, 'EditMenuItem', lisCodeToolsDefsEdit, nil);
|
|
AddMenuItem(MoveNodeUpMenuItem, 'MoveNodeUpMenuItem',
|
|
lisCodeToolsDefsMoveNodeUp,
|
|
EditMenuItem);
|
|
MoveNodeUpMenuItem.OnClick:=@MoveNodeUpMenuItemClick;
|
|
|
|
AddMenuItem(MoveNodeDownMenuItem, 'MoveNodeDownMenuItem',
|
|
lisCodeToolsDefsMoveNodeDown,
|
|
EditMenuItem);
|
|
MoveNodeDownMenuItem.OnClick:=@MoveNodeDownMenuItemClick;
|
|
|
|
AddMenuItem(MoveNodeLvlUpMenuItem, 'MoveNodeLvlUpMenuItem',
|
|
lisCodeToolsDefsMoveNodeOneLevelUp,
|
|
EditMenuItem);
|
|
MoveNodeLvlUpMenuItem.OnClick:=@MoveNodeLvlUpMenuItemClick;
|
|
|
|
AddMenuItem(MoveNodeLvlDownMenuItem, 'MoveNodeLvlDownMenuItem',
|
|
lisCodeToolsDefsMoveNodeOneLevelDown,
|
|
EditMenuItem);
|
|
MoveNodeLvlDownMenuItem.OnClick:=@MoveNodeLvlDownMenuItemClick;
|
|
|
|
EditMenuItem.Add(CreateSeperator);
|
|
|
|
AddMenuItem(InsertBehindMenuItem, 'InsertBehindMenuItem',
|
|
lisCodeToolsDefsInsertNodeBelow,
|
|
EditMenuItem);
|
|
|
|
AddMenuItem(InsertAsChildMenuItem, 'InsertAsChildMenuItem',
|
|
lisCodeToolsDefsInsertNodeAsChild,
|
|
EditMenuItem);
|
|
|
|
EditMenuItem.Add(CreateSeperator);
|
|
|
|
AddMenuItem(DeleteNodeMenuItem, 'DeleteNodeMenuItem',
|
|
lisCodeToolsDefsDeleteNode,
|
|
EditMenuItem);
|
|
DeleteNodeMenuItem.OnClick:=@DeleteNodeMenuItemClick;
|
|
|
|
AddMenuItem(ConvertActionMenuItem, 'ConvertActionMenuItem',
|
|
lisCodeToolsDefsConvertNode,
|
|
EditMenuItem);
|
|
|
|
{ EditMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard',
|
|
EditMenuItem);
|
|
AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem',
|
|
'Paste from clipboard',EditMenuItem);}
|
|
|
|
// insert node behind submenu
|
|
AddMenuItem(InsertBehindDefineMenuItem, 'InsertBehindDefineMenuItem',
|
|
lisCodeToolsDefsDefine,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindDefineRecurseMenuItem,
|
|
'InsertBehindDefineRecurseMenuItem',
|
|
lisCodeToolsDefsDefineRecurse,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindUndefineMenuItem,
|
|
'InsertBehindUndefineMenuItem', lisCodeToolsDefsUndefine,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindUndefineRecurseMenuItem,
|
|
'InsertBehindUndefineRecurseMenuItem',
|
|
lisCodeToolsDefsUndefineRecurse,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindUndefineAllMenuItem,
|
|
'InsertBehindUndefineAllMenuItem', lisCodeToolsDefsUndefineAll,
|
|
InsertBehindMenuItem);
|
|
InsertBehindMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertBehindBlockMenuItem, 'InsertBehindBlockMenuItem',
|
|
lisCodeToolsDefsBlock,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindDirectoryMenuItem,
|
|
'InsertBehindDirectoryMenuItem',
|
|
lisCodeToolsDefsInsertBehindDirectory,
|
|
InsertBehindMenuItem);
|
|
InsertBehindMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertBehindIfMenuItem, 'InsertBehindIfMenuItem',
|
|
lisCodeToolsDefsIf,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindIfDefMenuItem, 'InsertBehindIfDefMenuItem',
|
|
lisCodeToolsDefsIfDef,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindIfNotDefMenuItem, 'InsertBehindIfNotDefMenuItem',
|
|
lisCodeToolsDefsIfNDef,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindElseIfMenuItem, 'InsertBehindElseIfMenuItem',
|
|
lisCodeToolsDefsElseIf,
|
|
InsertBehindMenuItem);
|
|
AddMenuItem(InsertBehindElseMenuItem, 'InsertBehindElseMenuItem',
|
|
lisCodeToolsDefsElse,
|
|
InsertBehindMenuItem);
|
|
for i:=0 to InsertBehindMenuItem.Count-1 do
|
|
if InsertBehindMenuItem[i].Caption<>'-' then
|
|
InsertBehindMenuItem[i].OnClick:=@InsertNodeMenuItemClick;
|
|
|
|
// insert node as child submenu
|
|
AddMenuItem(InsertAsChildDefineMenuItem, 'InsertAsChildDefineMenuItem',
|
|
lisCodeToolsDefsDefine,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildDefineRecurseMenuItem,
|
|
'InsertAsChildDefineRecurseMenuItem',
|
|
lisCodeToolsDefsDefineRecurse,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildUndefineMenuItem,
|
|
'InsertAsChildUndefineMenuItem', lisCodeToolsDefsUndefine,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildUndefineRecurseMenuItem,
|
|
'InsertAsChildUndefineRecurseMenuItem',
|
|
lisCodeToolsDefsUndefineRecurse,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildUndefineAllMenuItem,
|
|
'InsertAsChildUndefineAllMenuItem', lisCodeToolsDefsUndefineAll,
|
|
InsertAsChildMenuItem);
|
|
InsertAsChildMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertAsChildBlockMenuItem, 'InsertAsChildBlockMenuItem',
|
|
lisCodeToolsDefsBlock,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildDirectoryMenuItem,
|
|
'InsertAsChildDirectoryMenuItem',
|
|
lisCodeToolsDefsInsertBehindDirectory,
|
|
InsertAsChildMenuItem);
|
|
InsertAsChildMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertAsChildIfMenuItem, 'InsertAsChildIfMenuItem',
|
|
lisCodeToolsDefsIf,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildIfDefMenuItem, 'InsertAsChildIfDefMenuItem',
|
|
lisCodeToolsDefsIfDef,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildIfNotDefMenuItem, 'InsertAsChildIfNotDefMenuItem',
|
|
lisCodeToolsDefsIfNDef,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildElseIfMenuItem, 'InsertAsChildElseIfMenuItem',
|
|
lisCodeToolsDefsElseIf,
|
|
InsertAsChildMenuItem);
|
|
AddMenuItem(InsertAsChildElseMenuItem, 'InsertAsChildElseMenuItem',
|
|
lisCodeToolsDefsElse,
|
|
InsertAsChildMenuItem);
|
|
for i:=0 to InsertAsChildMenuItem.Count-1 do
|
|
if InsertAsChildMenuItem[i].Caption<>'-' then
|
|
InsertAsChildMenuItem[i].OnClick:=@InsertNodeMenuItemClick;
|
|
|
|
// convert node sub menu
|
|
AddMenuItem(ConvertActionToDefineMenuItem, 'ConvertActionToDefineMenuItem',
|
|
lisCodeToolsDefsDefine,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToDefineRecurseMenuItem,
|
|
'ConvertActionToDefineRecurseMenuItem',
|
|
lisCodeToolsDefsDefineRecurse,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToUndefineMenuItem,
|
|
'ConvertActionToUndefineMenuItem', lisCodeToolsDefsUndefine,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToUndefineRecurseMenuItem,
|
|
'ConvertActionToUndefineRecurseMenuItem',
|
|
lisCodeToolsDefsUndefineRecurse,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToUndefineAllMenuItem,
|
|
'ConvertActionToUndefineAllMenuItem', lisCodeToolsDefsUndefineAll,
|
|
ConvertActionMenuItem);
|
|
ConvertActionMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(ConvertActionToBlockMenuItem, 'ConvertActionToBlockMenuItem',
|
|
lisCodeToolsDefsBlock,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToDirectoryMenuItem,
|
|
'ConvertActionToDirectoryMenuItem',
|
|
lisCodeToolsDefsInsertBehindDirectory,
|
|
ConvertActionMenuItem);
|
|
ConvertActionMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(ConvertActionToIfMenuItem, 'ConvertActionToIfMenuItem',
|
|
lisCodeToolsDefsIf,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToIfDefMenuItem, 'ConvertActionToIfDefMenuItem',
|
|
lisCodeToolsDefsIfDef,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToIfNotDefMenuItem,
|
|
'ConvertActionToIfNotDefMenuItem', lisCodeToolsDefsIfNDef,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToElseIfMenuItem, 'ConvertActionToElseIfMenuItem',
|
|
lisCodeToolsDefsElseIf,
|
|
ConvertActionMenuItem);
|
|
AddMenuItem(ConvertActionToElseMenuItem, 'ConvertActionToElseMenuItem',
|
|
lisCodeToolsDefsElse,
|
|
ConvertActionMenuItem);
|
|
for i:=0 to ConvertActionMenuItem.Count-1 do
|
|
if ConvertActionMenuItem[i].Caption<>'-' then
|
|
ConvertActionMenuItem[i].OnClick:=@ConvertActionMenuItemClick;
|
|
|
|
// tools
|
|
AddMenuItem(ToolsMenuItem, 'ToolsMenuItem', lisCTDefsTools, nil);
|
|
AddMenuItem(OpenPreviewMenuItem, 'OpenPreviewMenuItem', lisCTDefsOpenPreview,
|
|
ToolsMenuItem);
|
|
OpenPreviewMenuItem.OnClick:=@OpenPreviewMenuItemClick;
|
|
|
|
{AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros',
|
|
ToolsMenuItem);}
|
|
|
|
// templates
|
|
AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem',
|
|
lisCodeToolsDefsInsertTemplate, nil);
|
|
|
|
// FPC templates
|
|
AddMenuItem(InsertFPCProjectDefinesTemplateMenuItem,
|
|
'InsertFPCProjectDefinesTemplateMenuItem',
|
|
lisCodeToolsDefsInsertFreePascalProjectTe,
|
|
InsertTemplateMenuItem);
|
|
InsertFPCProjectDefinesTemplateMenuItem.OnClick:=
|
|
@InsertFPCProjectDefinesTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertFPCompilerDefinesTemplateMenuItem,
|
|
'InsertFPCompilerDefinesTemplateMenuItem',
|
|
lisCodeToolsDefsInsertFreePascalCompilerT,
|
|
InsertTemplateMenuItem);
|
|
InsertFPCompilerDefinesTemplateMenuItem.OnClick:=
|
|
@InsertFPCompilerDefinesTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertFPCSourceDirTemplateMenuItem,
|
|
'InsertFPCSourceDirTemplateMenuItem',
|
|
lisCodeToolsDefsInsertFreePascalCVSSource,
|
|
InsertTemplateMenuItem);
|
|
InsertFPCSourceDirTemplateMenuItem.OnClick:=
|
|
@InsertFPCSourceDirDefinesTemplateMenuItemClick;
|
|
|
|
// lazarus templates
|
|
InsertTemplateMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertLazarusSourceTemplateMenuItem,
|
|
'InsertLazarusSourceTemplateMenuItem',
|
|
lisCodeToolsDefsInsertLazarusDirectoryTem,
|
|
InsertTemplateMenuItem);
|
|
InsertLazarusSourceTemplateMenuItem.OnClick:=
|
|
@InsertLazarusSourceDefinesTemplateMenuItemClick;
|
|
|
|
// Delphi 5 templates
|
|
InsertTemplateMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertDelphi5CompilerDefinesTemplateMenuItem,
|
|
'InsertDelphi5CompilerDefinesTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi5CompilerTemp,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi5CompilerDefinesTemplateMenuItem.OnClick:=
|
|
@InsertDelphiCompilerDefinesTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertDelphi5DirectoryTemplateMenuItem,
|
|
'InsertDelphi5DirectoryTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi5DirectoryTem,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi5DirectoryTemplateMenuItem.OnClick:=
|
|
@InsertDelphiDirectoryTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertDelphi5ProjectTemplateMenuItem,
|
|
'InsertDelphi5ProjectTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi5ProjectTempl,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi5ProjectTemplateMenuItem.OnClick:=
|
|
@InsertDelphiProjectTemplateMenuItemClick;
|
|
|
|
// Delphi 6 templates
|
|
InsertTemplateMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertDelphi6CompilerDefinesTemplateMenuItem,
|
|
'InsertDelphi6CompilerDefinesTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi6CompilerTemp,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi6CompilerDefinesTemplateMenuItem.OnClick:=
|
|
@InsertDelphiCompilerDefinesTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertDelphi6DirectoryTemplateMenuItem,
|
|
'InsertDelphi6DirectoryTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi6DirectoryTem,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi6DirectoryTemplateMenuItem.OnClick:=
|
|
@InsertDelphiDirectoryTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertDelphi6ProjectTemplateMenuItem,
|
|
'InsertDelphi6ProjectTemplateMenuItem',
|
|
lisCodeToolsDefsInsertDelphi6ProjectTempl,
|
|
InsertTemplateMenuItem);
|
|
InsertDelphi6ProjectTemplateMenuItem.OnClick:=
|
|
@InsertDelphiProjectTemplateMenuItemClick;
|
|
|
|
// Kylix 3 templates
|
|
InsertTemplateMenuItem.Add(CreateSeperator);
|
|
AddMenuItem(InsertKylix3CompilerDefinesTemplateMenuItem,
|
|
'InsertKylix3CompilerDefinesTemplateMenuItem',
|
|
lisCodeToolsDefsInsertKylix3CompilerTemp,
|
|
InsertTemplateMenuItem);
|
|
InsertKylix3CompilerDefinesTemplateMenuItem.OnClick:=
|
|
@InsertKylixCompilerDefinesTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertKylix3DirectoryTemplateMenuItem,
|
|
'InsertKylix3DirectoryTemplateMenuItem',
|
|
lisCodeToolsDefsInsertKylix3DirectoryTem,
|
|
InsertTemplateMenuItem);
|
|
InsertKylix3DirectoryTemplateMenuItem.OnClick:=
|
|
@InsertKylixDirectoryTemplateMenuItemClick;
|
|
|
|
AddMenuItem(InsertKylix3ProjectTemplateMenuItem,
|
|
'InsertKylix3ProjectTemplateMenuItem',
|
|
lisCodeToolsDefsInsertKylix3ProjectTempl,
|
|
InsertTemplateMenuItem);
|
|
InsertKylix3ProjectTemplateMenuItem.OnClick:=
|
|
@InsertKylixProjectTemplateMenuItemClick;
|
|
|
|
// define tree----------------------------------------------------------------
|
|
CreateWinControl(DefineTreeView,TTreeView,'DefineTreeView',Self);
|
|
with DefineTreeView do begin
|
|
DefaultItemHeight:=22;
|
|
Images:=TheImageList;
|
|
StateImages:=TheImageList;
|
|
OnMouseUp:=@DefineTreeViewMouseUp;
|
|
end;
|
|
|
|
// selected item
|
|
CreateWinControl(SelectedItemGroupBox,TGroupBox,'SelectedItemGroupBox',Self);
|
|
SelectedItemGroupBox.Caption:=lisCodeToolsDefsSelectedNode;
|
|
SelectedItemGroupBox.OnResize:=@SelectedItemGroupBoxResize;
|
|
|
|
CreateWinControl(TypeLabel,TLabel,'TypeLabel',SelectedItemGroupBox);
|
|
|
|
CreateWinControl(NameLabel,TLabel,'NameLabel',SelectedItemGroupBox);
|
|
NameLabel.Caption:=lisCodeToolsDefsName;
|
|
|
|
CreateWinControl(NameEdit,TEdit,'NameEdit',SelectedItemGroupBox);
|
|
|
|
CreateWinControl(DescriptionLabel,TLabel,'DescriptionLabel',
|
|
SelectedItemGroupBox);
|
|
DescriptionLabel.Caption:=lisCodeToolsDefsDescription;
|
|
|
|
CreateWinControl(DescriptionEdit,TEdit,'DescriptionEdit',
|
|
SelectedItemGroupBox);
|
|
|
|
CreateWinControl(VariableLabel,TLabel,'VariableLabel',SelectedItemGroupBox);
|
|
VariableLabel.Caption:=lisCodeToolsDefsVariable;
|
|
|
|
CreateWinControl(VariableEdit,TEdit,'VariableEdit',SelectedItemGroupBox);
|
|
|
|
CreateWinControl(ValueNoteBook,TNoteBook,'ValueNoteBook',
|
|
SelectedItemGroupBox);
|
|
with ValueNoteBook do begin
|
|
if PageCount>0 then
|
|
Pages[0]:=lisCodeToolsDefsValueAsText
|
|
else
|
|
Pages.Add(lisCodeToolsDefsValueAsText);
|
|
Pages.Add(lisCodeToolsDefsValueAsFilePaths);
|
|
OnPageChanged:=@ValueNoteBookPageChanged;
|
|
OnResize:=@ValueNoteBookResize;
|
|
end;
|
|
|
|
CreateWinControl(ValueAsTextSynEdit,TSynEdit,'ValueAsTextSynEdit',
|
|
ValueNoteBook.Page[0]);
|
|
ValueAsTextSynEdit.Options:=[eoBracketHighlight, eoHideRightMargin,
|
|
eoDragDropEditing, eoHalfPageScroll, eoScrollByOneLess, eoScrollPastEol,
|
|
eoSmartTabs, eoTabsToSpaces, eoTrimTrailingSpaces];
|
|
ValueAsTextSynEdit.Gutter.Visible:=false;
|
|
ValueAsTextSynEdit.Align:=alClient;
|
|
ValueAsTextSynEdit.Scrollbars:=ssBoth;
|
|
|
|
CreateWinControl(ValueAsFilePathsSynEdit,TSynEdit,'ValueAsFilePathsSynEdit',
|
|
ValueNoteBook.Page[1]);
|
|
ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options;
|
|
ValueAsFilePathsSynEdit.Gutter.Visible:=false;
|
|
ValueAsFilePathsSynEdit.Scrollbars:=ssBoth;
|
|
|
|
CreateWinControl(MoveFilePathUpBitBtn,TBitBtn,'MoveFilePathUpBitBtn',
|
|
ValueNoteBook.Page[1]);
|
|
MoveFilePathUpBitBtn.Caption:=dlgUpWord;
|
|
MoveFilePathUpBitBtn.OnClick:=@MoveFilePathUpBitBtnClick;
|
|
|
|
CreateWinControl(MoveFilePathDownBitBtn,TBitBtn,'MoveFilePathDownBitBtn',
|
|
ValueNoteBook.Page[1]);
|
|
MoveFilePathDownBitBtn.Caption:=dlgDownWord;
|
|
MoveFilePathDownBitBtn.OnClick:=@MoveFilePathDownBitBtnClick;
|
|
|
|
CreateWinControl(DeleteFilePathBitBtn,TBitBtn,'DeleteFilePathBitBtn',
|
|
ValueNoteBook.Page[1]);
|
|
DeleteFilePathBitBtn.Caption:=dlgEdDelete;
|
|
DeleteFilePathBitBtn.OnClick:=@DeleteFilePathBitBtnClick;
|
|
|
|
CreateWinControl(InsertFilePathBitBtn,TBitBtn,'InsertFilePathBitBtn',
|
|
ValueNoteBook.Page[1]);
|
|
InsertFilePathBitBtn.Caption:=srVK_INSERT;
|
|
InsertFilePathBitBtn.OnClick:=@InsertFilePathBitBtnClick;
|
|
end;
|
|
|
|
function TCodeToolsDefinesEditor.CreateSeperator : TMenuItem;
|
|
begin
|
|
Result := TMenuItem.Create(Self);
|
|
Result.Caption := '-';
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.RebuildDefineTreeView;
|
|
begin
|
|
DefineTreeView.Items.BeginUpdate;
|
|
DefineTreeView.Items.Clear;
|
|
AddDefineNodes(FDefineTree.RootTemplate,nil,true,true);
|
|
DefineTreeView.Items.EndUpdate;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.AddDefineNodes(
|
|
ANode: TDefineTemplate; AParent: TTreeNode;
|
|
WithChilds, WithNextSiblings: boolean);
|
|
var NewTreeNode: TTreeNode;
|
|
begin
|
|
if ANode=nil then exit;
|
|
//writeln(' AAA ',StringOfChar(' ',ANode.Level*2),' ',ANode.Name,' ',WithChilds,',',WithNextSiblings);
|
|
DefineTreeView.Items.BeginUpdate;
|
|
NewTreeNode:=DefineTreeView.Items.AddChildObject(AParent,ANode.Name,ANode);
|
|
SetNodeImages(NewTreeNode,false);
|
|
if WithChilds and (ANode.FirstChild<>nil) then begin
|
|
AddDefineNodes(ANode.FirstChild,NewTreeNode,true,true);
|
|
end;
|
|
if WithNextSiblings and (ANode.Next<>nil) then begin
|
|
AddDefineNodes(ANode.Next,AParent,WithChilds,true);
|
|
end;
|
|
DefineTreeView.Items.EndUpdate;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SetNodeImages(ANode: TTreeNode;
|
|
WithSubNodes: boolean);
|
|
var ADefineTemplate: TDefineTemplate;
|
|
begin
|
|
ADefineTemplate:=TDefineTemplate(ANode.Data);
|
|
case ADefineTemplate.Action of
|
|
da_Define: ANode.ImageIndex:=0;
|
|
da_DefineRecurse: ANode.ImageIndex:=1;
|
|
da_Undefine: ANode.ImageIndex:=2;
|
|
da_UndefineRecurse: ANode.ImageIndex:=3;
|
|
da_UndefineAll: ANode.ImageIndex:=4;
|
|
da_Block: ANode.ImageIndex:=5;
|
|
da_Directory: ANode.ImageIndex:=6;
|
|
da_If: ANode.ImageIndex:=7;
|
|
da_IfDef: ANode.ImageIndex:=8;
|
|
da_IfNDef: ANode.ImageIndex:=9;
|
|
da_ElseIf: ANode.ImageIndex:=10;
|
|
da_Else: ANode.ImageIndex:=11;
|
|
else
|
|
ANode.ImageIndex:=-1;
|
|
end;
|
|
ANode.SelectedIndex:=ANode.ImageIndex;
|
|
if ADefineTemplate.IsAutoGenerated then begin
|
|
ANode.StateIndex:=13;
|
|
end else begin
|
|
ANode.StateIndex:=12;
|
|
end;
|
|
if WithSubNodes then begin
|
|
ANode:=ANode.GetFirstChild;
|
|
while ANode<>nil do begin
|
|
SetNodeImages(ANode,true);
|
|
ANode:=ANode.GetNextSibling;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SetTransferMacros(
|
|
const AValue: TTransferMacroList);
|
|
begin
|
|
FTransferMacros:=AValue;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.ValueAsPathToValueAsText;
|
|
var s: string;
|
|
i, j, l: integer;
|
|
begin
|
|
s:=ValueAsFilePathsSynEdit.Text;
|
|
l:=length(s);
|
|
// replace line ends with semicolon
|
|
i:=1;
|
|
j:=1;
|
|
while i<=l do begin
|
|
if s[i] in [#10,#13] then begin
|
|
inc(i);
|
|
if (i<l) and (s[i] in [#10,#13]) and (s[i-1]<>s[i]) then begin
|
|
inc(i);
|
|
end;
|
|
s[j]:=';';
|
|
inc(j);
|
|
end else begin
|
|
s[j]:=s[i];
|
|
inc(i);
|
|
inc(j);
|
|
end;
|
|
end;
|
|
dec(j);
|
|
while (j>=1) and (s[j]=';') do dec(j);
|
|
SetLength(s,j);
|
|
ValueAsTextSynEdit.Text:=s;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SaveSelectedValues;
|
|
var
|
|
ATreeNode: TTreeNode;
|
|
ADefNode: TDefineTemplate;
|
|
s: string;
|
|
l: integer;
|
|
begin
|
|
ATreeNode:=FLastSelectedNode;
|
|
if (ATreeNode<>nil) then begin
|
|
ADefNode:=TDefineTemplate(ATreeNode.Data);
|
|
if (not ADefNode.IsAutoGenerated) then begin
|
|
ADefNode.Name:=NameEdit.Text;
|
|
ATreeNode.Text:=ADefNode.Name;
|
|
ADefNode.Variable:=VariableEdit.Text;
|
|
ADefNode.Description:=DescriptionEdit.Text;
|
|
if ValueNoteBook.PageIndex=1 then
|
|
ValueAsPathToValueAsText;
|
|
s:=ValueAsTextSynEdit.Text;
|
|
l:=length(s);
|
|
if (l>0) and (s[l] in [#13,#10]) then begin
|
|
// remove line end at end of Text, that was added automatically
|
|
dec(l);
|
|
if (l>0) and (s[l] in [#13,#10]) and (s[l]<>s[l+1]) then
|
|
dec(l);
|
|
SetLength(s,l);
|
|
end;
|
|
ADefNode.Value:=s;
|
|
end;
|
|
FLastSelectedNode:=nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.ShowSelectedValues;
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode: TDefineTemplate;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
if SelTreeNode<>FLastSelectedNode then begin
|
|
SaveSelectedValues;
|
|
end;
|
|
if SelTreeNode<>nil then begin
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
SetValuesEditable(not SelDefNode.IsAutoGenerated);
|
|
NameEdit.Text:=SelDefNode.Name;
|
|
DescriptionEdit.Text:=SelDefNode.Description;
|
|
VariableEdit.Text:=SelDefNode.Variable;
|
|
ValueAsTextSynEdit.Text:=SelDefNode.Value;
|
|
ValueAsFilePathsSynEdit.Text:=ValueToFilePathText(SelDefNode.Value);
|
|
if SelDefNode.IsAutoGenerated then begin
|
|
//ValueAsTextSynEdit.Options:=ValueAsTextSynEdit.Options+[eoNoCaret];
|
|
ValueAsTextSynEdit.ReadOnly:=true;
|
|
end else begin
|
|
//ValueAsTextSynEdit.Options:=ValueAsTextSynEdit.Options-[eoNoCaret];
|
|
ValueAsTextSynEdit.ReadOnly:=false;
|
|
end;
|
|
ValueAsFilePathsSynEdit.Options:=ValueAsTextSynEdit.Options;
|
|
ValueAsFilePathsSynEdit.ReadOnly:=ValueAsTextSynEdit.ReadOnly;
|
|
end else begin
|
|
SetValuesEditable(false);
|
|
NameEdit.Text:='';
|
|
DescriptionEdit.Text:='';
|
|
VariableEdit.Text:='';
|
|
ValueAsTextSynEdit.Text:='';
|
|
ValueAsFilePathsSynEdit.Text:='';
|
|
end;
|
|
SetTypeLabel;
|
|
FLastSelectedNode:=SelTreeNode;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SetTypeLabel;
|
|
var
|
|
SelTreeNode: TTreeNode;
|
|
SelDefNode: TDefineTemplate;
|
|
s: string;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
if SelTreeNode<>nil then begin
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
s:=Format(lisCodeToolsDefsAction, [DefineActionNames[SelDefNode.Action]]);
|
|
if SelDefNode.IsAutoGenerated then
|
|
s:=Format(lisCodeToolsDefsautoGenerated, [s]);
|
|
end else begin
|
|
s:=lisCodeToolsDefsnoneSelected;
|
|
end;
|
|
TypeLabel.Caption:=s;
|
|
end;
|
|
|
|
function TCodeToolsDefinesEditor.ValueToFilePathText(const AValue: string
|
|
): string;
|
|
var i: integer;
|
|
begin
|
|
Result:=AValue;
|
|
for i:=1 to length(Result) do
|
|
if Result[i]=';' then Result[i]:=#13;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertNewNode(Behind: boolean;
|
|
Action: TDefineAction);
|
|
var SelTreeNode, NodeInFront, ParentNode,
|
|
NewTreeNode: TTreeNode;
|
|
NewDefNode: TDefineTemplate;
|
|
NewName, NewDescription, NewVariable, NewValue: string;
|
|
begin
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
SaveSelectedValues;
|
|
NodeInFront:=nil;
|
|
ParentNode:=nil;
|
|
if SelTreeNode<>nil then begin
|
|
// there is an selected node
|
|
if Behind then begin
|
|
// insert behind selected node
|
|
NodeInFront:=SelTreeNode;
|
|
ParentNode:=NodeInFront.Parent;
|
|
end else begin
|
|
// insert as last child of selected node
|
|
ParentNode:=SelTreeNode;
|
|
NodeInFront:=ParentNode.GetFirstChild;
|
|
if NodeInFront<>nil then begin
|
|
while NodeInFront.GetNextSibling<>nil do
|
|
NodeInFront:=NodeInFront.GetNextSibling;
|
|
end;
|
|
end;
|
|
end else begin
|
|
// no node selected, add as last root node
|
|
NodeInFront:=DefineTreeView.Items.GetLastNode;
|
|
end;
|
|
if (ParentNode<>nil) and (TDefineTemplate(ParentNode.Data).IsAutoGenerated)
|
|
then begin
|
|
MessageDlg(lisCodeToolsDefsInvalidParent, Format(
|
|
lisCodeToolsDefsAutoCreatedNodesReadOnly, [#13]), mtInformation,
|
|
[mbCancel],0);
|
|
exit;
|
|
end;
|
|
if (ParentNode<>nil)
|
|
and (not (TDefineTemplate(ParentNode.Data).Action in DefineActionBlocks)) then
|
|
begin
|
|
MessageDlg(lisCodeToolsDefsInvalidParentNode,
|
|
lisCodeToolsDefsParentNodeCanNotContainCh,
|
|
mtInformation,[mbCancel],0);
|
|
exit;
|
|
end;
|
|
NewName:=FindUniqueName;
|
|
NewDescription:=NewName;
|
|
NewVariable:='';
|
|
NewValue:='';
|
|
NewDefNode:=TDefineTemplate.Create(NewName,NewDescription,NewVariable,
|
|
NewValue,Action);
|
|
NewDefNode.Owner:=CodeToolsOpts;
|
|
// add node to treeview
|
|
if (NodeInFront<>nil) then
|
|
// insert in front
|
|
NewTreeNode:=DefineTreeView.Items.InsertObjectBehind(
|
|
NodeInFront,NewName,NewDefNode)
|
|
else
|
|
// add as last child
|
|
NewTreeNode:=DefineTreeView.Items.AddChildObject(ParentNode,NewName,
|
|
NewDefNode);
|
|
|
|
// add node to define tree
|
|
if NodeInFront<>nil then
|
|
NewDefNode.InsertBehind(TDefineTemplate(NodeInFront.Data))
|
|
else if ParentNode<>nil then
|
|
TDefineTemplate(ParentNode.Data).AddChild(NewDefNode)
|
|
else
|
|
FDefineTree.Add(NewDefNode);
|
|
|
|
SetNodeImages(NewTreeNode,true);
|
|
DefineTreeView.Selected:=NewTreeNode;
|
|
ShowSelectedValues;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.InsertTemplate(NewTemplate: TDefineTemplate);
|
|
|
|
procedure AddChilds(ATreeNode: TTreeNode);
|
|
var ADefNode, ChildDefNode: TDefineTemplate;
|
|
ChildTreeNode: TTreeNode;
|
|
begin
|
|
if ATreeNode=nil then exit;
|
|
ADefNode:=TDefineTemplate(ATreeNode.Data);
|
|
ChildDefNode:=ADefNode.FirstChild;
|
|
while ChildDefNode<>nil do begin
|
|
ChildTreeNode:=DefineTreeView.Items.AddChildObject(ATreeNode,
|
|
ChildDefNode.Name,ChildDefNode);
|
|
AddChilds(ChildTreeNode);
|
|
ChildDefNode:=ChildDefNode.Next;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
SelTreeNode, NewTreeNode: TTreeNode;
|
|
SelDefNode: TDefineTemplate;
|
|
begin
|
|
SaveSelectedValues;
|
|
if NewTemplate=nil then exit;
|
|
NewTemplate.RemoveFlags([dtfAutoGenerated]);
|
|
FLastSelectedNode:=nil;
|
|
SelTreeNode:=DefineTreeView.Selected;
|
|
if SelTreeNode<>nil then begin
|
|
// insert behind selected node
|
|
SelDefNode:=TDefineTemplate(SelTreeNode.Data);
|
|
// insert in TreeView
|
|
NewTreeNode:=DefineTreeView.Items.InsertObjectBehind(SelTreeNode,
|
|
NewTemplate.Name,NewTemplate);
|
|
// insert in DefineTree
|
|
NewTemplate.InsertBehind(SelDefNode);
|
|
end else begin
|
|
// add as last root node
|
|
// add in TreeView
|
|
NewTreeNode:=DefineTreeView.Items.AddObject(nil,NewTemplate.Name,NewTemplate);
|
|
// add in DefineTree
|
|
DefineTree.Add(NewTemplate);
|
|
end;
|
|
// add childs to TreeView
|
|
AddChilds(NewTreeNode);
|
|
// show and select
|
|
SetNodeImages(NewTreeNode,true);
|
|
NewTreeNode.Selected:=true;
|
|
ShowSelectedValues;
|
|
end;
|
|
|
|
function TCodeToolsDefinesEditor.FindUniqueName: string;
|
|
var i: integer;
|
|
begin
|
|
i:=1;
|
|
while (DefineTree.FindDefineTemplateByName(lisCodeToolsDefsNewNode+IntToStr(i
|
|
), false)<>nil)
|
|
do inc(i);
|
|
Result:=lisCodeToolsDefsNewNode+IntToStr(i);
|
|
end;
|
|
|
|
function TCodeToolsDefinesEditor.ConsistencyCheck: integer;
|
|
|
|
function CheckNode(ATreeNode: TTreeNode): integer;
|
|
var ADefNode, DummyDefNode: TDefineTemplate;
|
|
begin
|
|
if ATreeNode=nil then exit;
|
|
ADefNode:=TDefineTemplate(ATreeNode.Data);
|
|
//writeln(' CheckNode "',ATreeNode.Text,'" "',ADefNode.Name,'"');
|
|
if ADefNode=nil then begin
|
|
Result:=-1; exit;
|
|
end;
|
|
if (ATreeNode.GetPrevSibling<>nil)
|
|
and (TDefineTemplate(ATreeNode.GetPrevSibling.Data)<>ADefNode.Prior) then
|
|
begin
|
|
Result:=-2; exit;
|
|
end;
|
|
if (ATreeNode.GetNextSibling<>nil)
|
|
and (TDefineTemplate(ATreeNode.GetNextSibling.Data)<>ADefNode.Next) then
|
|
begin
|
|
write(' ERROR: ',ATreeNode.GetNextSibling.Text,' ');
|
|
if ADefNode.Next<>nil then write('ADefNode.Next=',ADefNode.Next.Name,' ')
|
|
else write('ADefNode.Next=nil ');
|
|
DummyDefNode:=TDefineTemplate(ATreeNode.GetNextSibling.Data);
|
|
if DummyDefNode<>nil then
|
|
writeln('ATreeNode.GetNextSibling.Next=',DummyDefNode.Name)
|
|
else
|
|
writeln('ATreeNode.GetNextSibling.Next=nil');
|
|
{writeln('=============================================');
|
|
DefineTreeView.WriteDebugReport('TV ',true);
|
|
writeln('=============================================');
|
|
DefineTree.WriteDebugReport;
|
|
writeln('=============================================');}
|
|
Result:=-3; exit;
|
|
end;
|
|
if (ATreeNode.GetFirstChild<>nil)
|
|
and (TDefineTemplate(ATreeNode.GetFirstChild.Data)<>ADefNode.FirstChild)
|
|
then begin
|
|
Result:=-4; exit;
|
|
end;
|
|
Result:=CheckNode(ATreeNode.GetFirstChild);
|
|
if Result<0 then exit;
|
|
Result:=CheckNode(ATreeNode.GetNextSibling);
|
|
if Result<0 then exit;
|
|
end;
|
|
|
|
begin
|
|
Result:=DefineTreeView.ConsistencyCheck;
|
|
if Result<0 then begin
|
|
dec(Result,100000);
|
|
exit;
|
|
end;
|
|
Result:=DefineTree.ConsistencyCheck;
|
|
if Result<0 then begin
|
|
dec(Result,200000);
|
|
exit;
|
|
end;
|
|
Result:=CheckNode(DefineTreeView.Items.GetFirstNode);
|
|
if Result<0 then begin
|
|
dec(Result,300000);
|
|
exit;
|
|
end;
|
|
Result:=0;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SetValuesEditable(AValue: boolean);
|
|
begin
|
|
SelectedItemGroupBox.Enabled:=true;
|
|
TypeLabel.Enabled:=true;
|
|
NameLabel.Enabled:=AValue;
|
|
NameEdit.Enabled:=AValue;
|
|
DescriptionLabel.Enabled:=AValue;
|
|
DescriptionEdit.Enabled:=AValue;
|
|
VariableLabel.Enabled:=AValue;
|
|
VariableEdit.Enabled:=AValue;
|
|
ValueAsTextSynEdit.ReadOnly:=not AValue;
|
|
ValueAsFilePathsSynEdit.ReadOnly:=not AValue;
|
|
MoveFilePathUpBitBtn.Enabled:=AValue;
|
|
MoveFilePathDownBitBtn.Enabled:=AValue;
|
|
DeleteFilePathBitBtn.Enabled:=AValue;
|
|
InsertFilePathBitBtn.Enabled:=AValue;
|
|
end;
|
|
|
|
procedure TCodeToolsDefinesEditor.SetOptions(ACodeToolBoss: TCodeToolManager;
|
|
Options: TCodeToolsOptions);
|
|
begin
|
|
FLastSelectedNode:=nil;
|
|
FBoss:=ACodeToolBoss;
|
|
FDefineTree.Assign(ACodeToolBoss.DefineTree);
|
|
RebuildDefineTreeView;
|
|
ShowSelectedValues;
|
|
end;
|
|
|
|
constructor TCodeToolsDefinesEditor.Create(TheOwner: TComponent);
|
|
begin
|
|
inherited Create(TheOwner);
|
|
Position:=poScreenCenter;
|
|
IDEDialogLayoutList.ApplyLayout(Self,500,460);
|
|
|
|
if LazarusResources.Find(ClassName)=nil then begin
|
|
Caption:=lisCodeToolsDefsCodeToolsDefinesEditor;
|
|
OnResize:=@FormResize;
|
|
|
|
CreateComponents;
|
|
end;
|
|
FDefineTree:=TDefineTree.Create;
|
|
FormResize(Self);
|
|
end;
|
|
|
|
destructor TCodeToolsDefinesEditor.Destroy;
|
|
begin
|
|
FDefineTree.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
//==============================================================================
|
|
|
|
initialization
|
|
{$I codetoolsdefines.lrs}
|
|
|
|
|
|
end.
|
|
|