diff --git a/.gitattributes b/.gitattributes index 3a84a67979..71266f9e62 100644 --- a/.gitattributes +++ b/.gitattributes @@ -116,6 +116,7 @@ examples/toolbar.pp svneol=native#text/pascal examples/trackbar.pp svneol=native#text/pascal ide/buildlazdialog.pas svneol=native#text/pascal ide/codetemplatedialog.pp svneol=native#text/pascal +ide/codetoolsdefines.pas svneol=native#text/pascal ide/codetoolsoptions.pas svneol=native#text/pascal ide/compiler.pp svneol=native#text/pascal ide/compileroptions.pp svneol=native#text/pascal diff --git a/components/codetools/codetoolmanager.pas b/components/codetools/codetoolmanager.pas index 1a3f837468..b3297ef124 100644 --- a/components/codetools/codetoolmanager.pas +++ b/components/codetools/codetoolmanager.pas @@ -1421,32 +1421,32 @@ begin if FCurCodeTool<>nil then begin Result:=FCurCodeTool.ConsistencyCheck; if Result<>0 then begin - dec(Result,1000); exit; + dec(Result,10000); exit; end; end; Result:=DefinePool.ConsistencyCheck; if Result<>0 then begin - dec(Result,2000); exit; + dec(Result,20000); exit; end; Result:=DefineTree.ConsistencyCheck; if Result<>0 then begin - dec(Result,3000); exit; + dec(Result,30000); exit; end; Result:=SourceCache.ConsistencyCheck; if Result<>0 then begin - dec(Result,4000); exit; + dec(Result,40000); exit; end; Result:=GlobalValues.ConsistencyCheck; if Result<>0 then begin - dec(Result,5000); exit; + dec(Result,50000); exit; end; Result:=SourceChangeCache.ConsistencyCheck; if Result<>0 then begin - dec(Result,6000); exit; + dec(Result,60000); exit; end; Result:=FSourceTools.ConsistencyCheck; if Result<>0 then begin - dec(Result,7000); exit; + dec(Result,70000); exit; end; finally if (Result<>0) and (FCatchExceptions=false) then diff --git a/components/codetools/definetemplates.pas b/components/codetools/definetemplates.pas index 67eb2c6434..07afa35acb 100644 --- a/components/codetools/definetemplates.pas +++ b/components/codetools/definetemplates.pas @@ -118,16 +118,17 @@ type property LastChild: TDefineTemplate read FLastChild; procedure AddChild(ADefineTemplate: TDefineTemplate); procedure InsertAfter(APrior: TDefineTemplate); - procedure Assign(ADefineTemplate: TDefineTemplate); virtual; + procedure Assign(ADefineTemplate: TDefineTemplate; + WithSubNodes, WithNextSiblings: boolean); virtual; function IsEqual(ADefineTemplate: TDefineTemplate; - CheckSubNodes: boolean): boolean; - function FindChildByName(const AName: string): TDefineTemplate; - function LoadFromXMLConfig(XMLConfig: TXMLConfig; - const Path: string): boolean; + CheckSubNodes, CheckNextSiblings: boolean): boolean; + function FindChildByName(const AName: string): TDefineTemplate; + function LoadFromXMLConfig(XMLConfig: TXMLConfig; + const Path: string): boolean; procedure SaveToXMLConfig(XMLConfig: TXMLConfig; const Path: string); - function CreateCopy: TDefineTemplate; - function SelfOrParentContainsFlag(AFlag: TDefineTemplateFlag): boolean; - function IsAutoGenerated: boolean; + function CreateCopy: TDefineTemplate; + function SelfOrParentContainsFlag(AFlag: TDefineTemplateFlag): boolean; + function IsAutoGenerated: boolean; procedure Unbind; procedure Clear; constructor Create; @@ -183,6 +184,8 @@ type const Path: string): boolean; procedure ClearCache; procedure Clear; + function IsEqual(SrcDefineTree: TDefineTree): boolean; + procedure Assign(SrcDefineTree: TDefineTree); constructor Create; destructor Destroy; override; function ConsistencyCheck: integer; // 0 = ok @@ -379,45 +382,78 @@ procedure TDefineTemplate.AddChild(ADefineTemplate: TDefineTemplate); // add as last child begin if ADefineTemplate=nil then exit; - ADefineTemplate.FPrior:=FLastChild; - FLastChild:=ADefineTemplate; - if FFirstChild=nil then FFirstChild:=ADefineTemplate; - if ADefineTemplate.FPrior<>nil then - ADefineTemplate.FPrior.FNext:=ADefineTemplate; - while ADefineTemplate<>nil do begin - ADefineTemplate.FParent:=Self; - inc(FChildCount); - ADefineTemplate:=ADefineTemplate.FNext; + if LastChild=nil then begin + while ADefineTemplate<>nil do begin + ADefineTemplate.fParent:=Self; + if ADefineTemplate.Prior=nil then FFirstChild:=ADefineTemplate; + if ADefineTemplate.Next=nil then FLastChild:=ADefineTemplate; + inc(FChildCount); + ADefineTemplate:=ADefineTemplate.Next; + end; + end else begin + ADefineTemplate.InsertAfter(LastChild); end; end; procedure TDefineTemplate.InsertAfter(APrior: TDefineTemplate); +var ANode, LastSibling: TDefineTemplate; begin if APrior=nil then exit; + if FParent<>nil then begin + ANode:=Self; + while ANode<>nil do begin + dec(ANode.Parent.FChildCount); + ANode.FParent:=nil; + ANode:=ANode.Next; + end; + end; + LastSibling:=Self; + while LastSibling.Next<>nil do LastSibling:=LastSibling.Next; FPrior:=APrior; - FNext:=APrior.Next; + LastSibling.FNext:=APrior.Next; APrior.FNext:=Self; - if FNext<>nil then FNext.FPrior:=Self; - FParent:=APrior.FParent; + if LastSibling.Next<>nil then LastSibling.Next.FPrior:=LastSibling; + FParent:=APrior.Parent; + if Parent<>nil then begin + ANode:=Self; + while ANode<>nil do begin + ANode.FParent:=Parent; + inc(ANode.Parent.FChildCount); + ANode:=ANode.Next; + end; + if Parent.LastChild=APrior then Parent.FLastChild:=LastSibling; + end; end; -procedure TDefineTemplate.Assign(ADefineTemplate: TDefineTemplate); -var ChildTemplate, CopyTemplate: TDefineTemplate; +procedure TDefineTemplate.Assign(ADefineTemplate: TDefineTemplate; + WithSubNodes, WithNextSiblings: boolean); +var ChildTemplate, CopyTemplate, NextTemplate: TDefineTemplate; begin + if IsEqual(ADefineTemplate,WithSubNodes,WithNextSiblings) then exit; Clear; if ADefineTemplate=nil then exit; - ChildTemplate:=ADefineTemplate.FirstChild; - while ChildTemplate<>nil do begin - CopyTemplate:=ChildTemplate.CreateCopy; - AddChild(CopyTemplate); - ChildTemplate:=ChildTemplate.Next; - end; Name:=ADefineTemplate.Name; Description:=ADefineTemplate.Description; Variable:=ADefineTemplate.Variable; Value:=ADefineTemplate.Value; Action:=ADefineTemplate.Action; Flags:=ADefineTemplate.Flags; + if WithSubNodes then begin + ChildTemplate:=ADefineTemplate.FirstChild; + if ChildTemplate<>nil then begin + CopyTemplate:=TDefineTemplate.Create; + AddChild(CopyTemplate); + CopyTemplate.Assign(ChildTemplate,true,true); + end; + end; + if WithNextSiblings then begin + NextTemplate:=ADefineTemplate.FirstChild; + if NextTemplate<>nil then begin + CopyTemplate:=TDefineTemplate.Create; + CopyTemplate.InsertAfter(Self); + CopyTemplate.Assign(NextTemplate,WithSubNodes,true); + end; + end; end; procedure TDefineTemplate.Unbind; @@ -463,8 +499,10 @@ end; function TDefineTemplate.CreateCopy: TDefineTemplate; begin +writeln('TDefineTemplate.CreateCopy A ',ConsistencyCheck); Result:=TDefineTemplate.Create; - Result.Assign(Self); + Result.Assign(Self,true,false); +writeln('TDefineTemplate.CreateCopy B ',ConsistencyCheck); end; destructor TDefineTemplate.Destroy; @@ -623,6 +661,14 @@ begin inc(RealChildCount); end; end; + if (Parent<>nil) then begin + if (Prior=nil) and (Parent.FirstChild<>Self) then begin + Result:=-6; exit; + end; + if (Next=nil) and (Parent.LastChild<>Self) then begin + Result:=-7; exit; + end; + end; if RealChildCount<>FChildCount then begin Result:=-1; exit; end; @@ -667,7 +713,7 @@ begin end; function TDefineTemplate.IsEqual(ADefineTemplate: TDefineTemplate; - CheckSubNodes: boolean): boolean; + CheckSubNodes, CheckNextSiblings: boolean): boolean; var SrcNode, DestNode: TDefineTemplate; begin Result:=(ADefineTemplate<>nil) @@ -681,12 +727,14 @@ begin if Result and CheckSubNodes then begin SrcNode:=FirstChild; DestNode:=ADefineTemplate.FirstChild; - while SrcNode<>nil do begin - Result:=SrcNode.IsEqual(DestNode,true); - if not Result then exit; - SrcNode:=SrcNode.Next; - DestNode:=DestNode.Next; - end; + if SrcNode<>nil then + Result:=SrcNode.IsEqual(DestNode,CheckSubNodes,true); + end; + if Result and CheckNextSiblings then begin + SrcNode:=Next; + DestNode:=ADefineTemplate.Next; + if SrcNode<>nil then + Result:=SrcNode.IsEqual(DestNode,CheckSubNodes,CheckNextSiblings); end; end; @@ -745,6 +793,25 @@ begin ClearCache; end; +function TDefineTree.IsEqual(SrcDefineTree: TDefineTree): boolean; +begin + Result:=false; + if (FFirstDefineTemplate=nil) xor (SrcDefineTree.FFirstDefineTemplate=nil) + then exit; + if (FFirstDefineTemplate<>nil) + and (not FFirstDefineTemplate.IsEqual( + SrcDefineTree.FFirstDefineTemplate,true,true)) + then exit; +end; + +procedure TDefineTree.Assign(SrcDefineTree: TDefineTree); +begin + if IsEqual(SrcDefineTree) then exit; + Clear; + FFirstDefineTemplate:=TDefineTemplate.Create; + FFirstDefineTemplate.Assign(SrcDefineTree.FFirstDefineTemplate,true,true); +end; + procedure TDefineTree.ClearCache; begin FCache.FreeAndClear; @@ -1121,7 +1188,7 @@ begin if (ADefineTemplate=nil) then exit; OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name); if OldDefineTemplate<>nil then begin - if not OldDefineTemplate.IsEqual(ADefineTemplate,true) then begin + if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin ClearCache; end; ADefineTemplate.InsertAfter(OldDefineTemplate); @@ -1139,7 +1206,7 @@ begin if ADefineTemplate=nil then exit; OldDefineTemplate:=FindDefineTemplateByName(ADefineTemplate.Name); if OldDefineTemplate<>nil then begin - if not OldDefineTemplate.IsEqual(ADefineTemplate,true) then begin + if not OldDefineTemplate.IsEqual(ADefineTemplate,true,false) then begin ClearCache; end; ADefineTemplate.InsertAfter(OldDefineTemplate); diff --git a/components/codetools/methodjumptool.pas b/components/codetools/methodjumptool.pas index 589d17aad9..f8e4709265 100644 --- a/components/codetools/methodjumptool.pas +++ b/components/codetools/methodjumptool.pas @@ -80,8 +80,8 @@ function TMethodJumpingCodeTool.FindJumpPoint(CursorPos: TCodeXYPosition; var NewPos: TCodeXYPosition; var NewTopLine: integer): boolean; const - JumpToProcAttr = [phpInUpperCase,phpTrimSpace,phpWithoutClassName, - phpWithVarModifiers,phpWithParameterNames,phpWithResultType]; + JumpToProcAttr = [phpInUpperCase,phpWithoutClassName,phpWithVarModifiers, + phpWithParameterNames,phpWithResultType]; function JumpToProc( FromProcNode: TCodeTreeNode; FromProcAttr: TProcHeadAttributes; @@ -254,7 +254,7 @@ writeln('TMethodJumpingCodeTool.FindJumpPoint D ',CleanCursorPos,', |',copy(Src, if (CursorNode=nil) or (not (CursorNode.Desc in [ctnProcedureHead,ctnProcedure])) then exit; - // build the method name + parameter list (without default values) + // search corresponding proc node Result:=FindBestProcNode(CursorNode,[phpAddClassName,phpInUpperCase], TypeSectionNode,[phpIgnoreForwards,phpInUpperCase]); {$IFDEF CTDEBUG} @@ -538,6 +538,7 @@ end; function TMethodJumpingCodeTool.FindFirstDifferenceNode( SearchForNodes, SearchInNodes: TAVLTree; var DiffTxtPos: integer): TAVLTreeNode; +// search the first AVL node in SearchForNodes, that is not in SearchInNodes var SearchInNode: TAVLTreeNode; cmp: integer; NodeTxt1, NodeTxt2: string; @@ -553,9 +554,9 @@ begin //writeln('[TMethodJumpingCodeTool.FindFirstDifferenceNode] B ',SearchInNode<>nil); cmp:=CompareCodeTreeNodeExt(Result.Data,SearchInNode.Data); -//NodeTxt1:=TCodeTreeNodeExtension(Result.Data).Txt; -//NodeTxt2:=TCodeTreeNodeExtension(SearchInNode.Data).Txt; -//writeln('[TMethodJumpingCodeTool.FindFirstDifferenceNode] ',NodeTxt1,' ?',cmp,'= ',NodeTxt2); +NodeTxt1:=TCodeTreeNodeExtension(Result.Data).Txt; +NodeTxt2:=TCodeTreeNodeExtension(SearchInNode.Data).Txt; +writeln('[TMethodJumpingCodeTool.FindFirstDifferenceNode] ',NodeTxt1,' ?',cmp,'= ',NodeTxt2); if cmp<0 then begin // result node not found in SearchInNodes @@ -592,11 +593,11 @@ begin SearchInNode:=SearchInNodes.FindSuccessor(SearchInNode); if (Result=nil) or (SearchInNode=nil) then exit; end else begin - // search in successor + // node in SearchInNodes does not exists in SearchForNodes + // -> ignore and search next SearchInNode:=SearchInNodes.FindSuccessor(SearchInNode); end; end; - Result:=nil; end; function TMethodJumpingCodeTool.JumpToNode(ANode: TCodeTreeNode; diff --git a/components/codetools/pascalparsertool.pas b/components/codetools/pascalparsertool.pas index 68c0a3c7a1..1ae61d0d75 100644 --- a/components/codetools/pascalparsertool.pas +++ b/components/codetools/pascalparsertool.pas @@ -84,7 +84,7 @@ type phpWithOfObject, // extract 'of object' phpWithComments, // extract comments phpInUpperCase, // turn to uppercase - phpTrimSpace, // skip unneeded spaces + phpCommentsToSpace, // replace comments with a single space phpWithoutBrackets, // skip start- and end-bracket of parameter list phpIgnoreForwards, // skip forward procs phpIgnoreProcsWithBody,// skip procs with begin..end @@ -2878,7 +2878,7 @@ begin end else if (CurPos.StartPos>LastAtomEndPos) and (ExtractMemStream.Position>0) then begin // some code was skipped - if (not (phpTrimSpace in Attr)) + if (phpCommentsToSpace in Attr) or ((CurPos.StartPos<=SrcLen) and (IsIdentStartChar[Src[CurPos.StartPos]]) and (IsIdentChar[Src[LastAtomEndPos-1]])) then begin diff --git a/components/synedit/synedit.pp b/components/synedit/synedit.pp index 6939fff7ee..7e4815efdd 100644 --- a/components/synedit/synedit.pp +++ b/components/synedit/synedit.pp @@ -2840,7 +2840,6 @@ begin else fUndoList.AddChange(crPaste, Point(1, StartOfBlock.y), EndOfBlock, SelText, smNormal); - if PasteMode = smColumn then CaretXY := Point(Min(StartOfBlock.X, EndOfBlock.X), Max(StartOfBlock.Y, EndOfBlock.Y) + 1); @@ -3264,6 +3263,8 @@ var CaretX - 1 - Length(sLeftSide)); end; sRightSide := Copy(LineText, CaretX, Length(LineText) - (CaretX - 1)); + if eoTrimTrailingSpaces in Options then + sRightSide := TrimRight(sRightSide); // step1: insert the first line of Value into current line Start := PChar(Value); P := GetEOL(Start); diff --git a/ide/codetoolsdefines.pas b/ide/codetoolsdefines.pas new file mode 100644 index 0000000000..eb8236dbc5 --- /dev/null +++ b/ide/codetoolsdefines.pas @@ -0,0 +1,452 @@ +{ /*************************************************************************** + codetoolsoptions.pas - Lazarus IDE unit + ----------------------------------------- + + ***************************************************************************/ + +/*************************************************************************** + * * + * This program 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. * + * * + ***************************************************************************/ + + Author: Mattias Gaertner + + Abstract: + - TCodeToolsDefinesEditor +} +unit CodeToolsDefines; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LCLLinux, Forms, Controls, Buttons, StdCtrls, ComCtrls, + ExtCtrls, Menus, LResources, SynEdit, DefineTemplates, CodeToolManager, + CodeToolsOptions; + +type + TCodeToolsDefinesEditor = class(TForm) + TheImageList: TImageList; + MainMenu: TMainMenu; + + // exit menu + ExitMenuItem: TMenuItem; + SaveAndExitMenuItem: TMenuItem; + DontSaveAndExitMenuItem: TMenuItem; + + // edit nodes + EditMenuItem: TMenuItem; + MoveNodeUpMenuItem: TMenuItem; + MoveNodeDownMenuItem: TMenuItem; + InsertDefineMenuItem: TMenuItem; + InsertDefineAllMenuItem: TMenuItem; + InsertUndefineMenuItem: TMenuItem; + InsertBlockMenuItem: TMenuItem; + InsertDirectoryMenuItem: TMenuItem; + InsertIfMenuItem: TMenuItem; + InsertIfDefMenuItem: TMenuItem; + InsertElseMenuItem: TMenuItem; + InsertEndIfMenuItem: TMenuItem; + DeleteNodeMenuItem: TMenuItem; + CopyToClipbrdMenuItem: TMenuItem; + PasteFromClipbrdMenuItem: TMenuItem; + + // tools + ToolsMenuItem: TMenuItem; + OpenPreviewMenuItem: TMenuItem; + ShowMacroListMenuItem: TMenuItem; + + // templates + InsertTemplateMenuItem: TMenuItem; + + // define tree + DefineTreeView: TTreeView; + + // selected item + SelectedItemGroupBox: TGroupBox; + TypeLabel: TLabel; + ProjectSpecificCheckBox: TCheckBox; + 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; + + procedure SaveAndExitMenuItemClick(Sender: TObject); + procedure DontSaveAndExitMenuItemClick(Sender: TObject); + procedure FormResize(Sender: TObject); + private + FDefineTree: TDefineTree; + procedure CreateComponents; + function CreateSeperator : TMenuItem; + procedure RebuildDefineTreeView; + procedure AddDefineNodes(ANode, AParent: TDefineTemplate; + WithChilds,WithNextSiblings: boolean); + public + procedure Assign(ACodeToolBoss: TCodeToolManager; + Options: TCodeToolsOptions); + constructor Create(TheOwner: TComponent); override; + destructor Destroy; override; + property DefineTree: TDefineTree read FDefineTree; + end; + +function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager; + Options: TCodeToolsOptions): TModalResult; + + +implementation + + +type + TWinControlClass = class of TWinControl; + +function ShowCodeToolsDefinesEditor(ACodeToolBoss: TCodeToolManager; + Options: TCodeToolsOptions): TModalResult; +var CodeToolsDefinesEditor: TCodeToolsDefinesEditor; +begin + CodeToolsDefinesEditor:=TCodeToolsDefinesEditor.Create(Application); + CodeToolsDefinesEditor.Assign(ACodeToolBoss,Options); + Result:=CodeToolsDefinesEditor.ShowModal; + CodeToolsDefinesEditor.Free; +end; + +{ TCodeToolsDefinesEditor } + +procedure TCodeToolsDefinesEditor.SaveAndExitMenuItemClick(Sender: TObject); +begin + ModalResult:=mrOk; +end; + +procedure TCodeToolsDefinesEditor.DontSaveAndExitMenuItemClick(Sender: TObject); +begin + ModalResult:=mrCancel; +end; + +procedure TCodeToolsDefinesEditor.FormResize(Sender: TObject); +var MaxX, MaxY, SelGrpBoxTop, SelItemMaxX, SelItemMaxY, + ValNoteBookMaxX, ValNoteBookMaxY: integer; +begin + MaxX:=ClientWidth-2; + MaxY:=ClientHeight-2; + SelGrpBoxTop:=MaxY-300; + + // 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-30; + end; + SelItemMaxX:=SelectedItemGroupBox.ClientWidth-8; + SelItemMaxY:=SelectedItemGroupBox.ClientHeight-18; + with TypeLabel do begin + Left:=5; + Top:=3; + Width:=SelItemMaxX-2*Left; + end; + with ProjectSpecificCheckBox do begin + Left:=TypeLabel.Left; + Top:=TypeLabel.Top+TypeLabel.Height+5; + Width:=SelItemMaxX-2*Left; + end; + with DescriptionLabel do begin + Left:=ProjectSpecificCheckBox.Left; + Top:=ProjectSpecificCheckBox.Top+ProjectSpecificCheckBox.Height+5; + Width:=70; + end; + with DescriptionEdit do begin + Left:=DescriptionLabel.Left+DescriptionLabel.Width+5; + Top:=DescriptionLabel.Top; + Width:=SelItemMaxX-Left-5; + end; + with NameLabel do begin + Left:=DescriptionLabel.Left; + Top:=DescriptionLabel.Top+DescriptionLabel.Height+5; + Width:=70; + end; + with NameEdit do begin + Left:=NameLabel.Left+NameLabel.Width+5; + Top:=NameLabel.Top; + Width:=150; + end; + with VariableLabel do begin + Left:=NameEdit.Left+NameEdit.Width+30; + Top:=NameLabel.Top; + 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-5; + end; + ValNoteBookMaxX:=ValueNoteBook.ClientWidth-7;//ValueAsTextSynEdit.Parent.ClientWidth; + ValNoteBookMaxY:=ValueNoteBook.ClientHeight-32;//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:=5; + 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(nil); + AMenuItem.Name:=AName; + AMenuItem.Caption:=ACaption; + if AParent=nil then + MainMenu.Items.Add(AMenuItem) + else + AParent.Add(AMenuItem); + end; + +begin + TheImageList:=TImageList.Create(Self); + with TheImageList do begin + Name:='TheImageList'; + + end; + + // Main Menu ----------------------------------------------------------------- + MainMenu := TMainMenu.Create(Self); + MainMenu.Name:='MainMenu'; + Menu := MainMenu; + + // exit menu + AddMenuItem(ExitMenuItem,'ExitMenuItem','Exit',nil); + AddMenuItem(SaveAndExitMenuItem,'SaveAndExitMenuItem','Save and Exit', + ExitMenuItem); + SaveAndExitMenuItem.OnClick:=@SaveAndExitMenuItemClick; + ExitMenuItem.Add(CreateSeperator); + AddMenuItem(DontSaveAndExitMenuItem,'DontSaveAndExitMenuItem', + 'Exit without Save',ExitMenuItem); + DontSaveAndExitMenuItem.OnClick:=@DontSaveAndExitMenuItemClick; + + // edit nodes + AddMenuItem(EditMenuItem,'EditMenuItem','Edit',nil); + AddMenuItem(MoveNodeUpMenuItem,'MoveNodeUpMenuItem','Move node up', + EditMenuItem); + AddMenuItem(MoveNodeDownMenuItem,'MoveNodeDownMenuItem','Move node down', + EditMenuItem); + EditMenuItem.Add(CreateSeperator); + AddMenuItem(InsertDefineMenuItem,'InsertDefineMenuItem','Insert Define', + EditMenuItem); + AddMenuItem(InsertDefineAllMenuItem,'InsertDefineAllMenuItem','Insert Define All', + EditMenuItem); + AddMenuItem(InsertUndefineMenuItem,'InsertUndefineMenuItem','Insert Undefine', + EditMenuItem); + AddMenuItem(InsertBlockMenuItem,'InsertBlockMenuItem','Insert Block', + EditMenuItem); + AddMenuItem(InsertDirectoryMenuItem,'InsertDirectoryMenuItem','Insert Directory', + EditMenuItem); + AddMenuItem(InsertIfMenuItem,'InsertIfMenuItem','Insert If', + EditMenuItem); + AddMenuItem(InsertIfDefMenuItem,'InsertIfDefMenuItem','Insert IfDef', + EditMenuItem); + AddMenuItem(InsertElseMenuItem,'InsertElseMenuItem','Insert Else', + EditMenuItem); + AddMenuItem(InsertEndIfMenuItem,'InsertEndIfMenuItem','Insert EndIf', + EditMenuItem); + EditMenuItem.Add(CreateSeperator); + AddMenuItem(DeleteNodeMenuItem,'DeleteNodeMenuItem','Delete node', + EditMenuItem); + EditMenuItem.Add(CreateSeperator); + AddMenuItem(CopyToClipbrdMenuItem,'CopyToClipbrdMenuItem','Copy to clipboard', + EditMenuItem); + AddMenuItem(PasteFromClipbrdMenuItem,'PasteFromClipbrdMenuItem', + 'Paste from clipboard',EditMenuItem); + + // tools + AddMenuItem(ToolsMenuItem,'ToolsMenuItem','Tools',nil); + AddMenuItem(OpenPreviewMenuItem,'OpenPreviewMenuItem','Open Preview', + ToolsMenuItem); + AddMenuItem(ShowMacroListMenuItem,'ShowMacroListMenuItem','Show Macros', + ToolsMenuItem); + + // templates + AddMenuItem(InsertTemplateMenuItem,'InsertTemplateMenuItem', + 'Insert Template',nil); + + + // define tree---------------------------------------------------------------- + CreateWinControl(DefineTreeView,TTreeView,'DefineTreeView',Self); + with DefineTreeView do begin + Images:=TheImageList; + end; + + // selected item + CreateWinControl(SelectedItemGroupBox,TGroupBox,'SelectedItemGroupBox',Self); + SelectedItemGroupBox.Caption:='Selected Node:'; + + CreateWinControl(TypeLabel,TLabel,'TypeLabel',SelectedItemGroupBox); + + CreateWinControl(ProjectSpecificCheckBox,TCheckBox,'ProjectSpecificCheckBox', + SelectedItemGroupBox); + ProjectSpecificCheckBox.Caption:= + 'Node and its children are only valid for this project'; + + CreateWinControl(NameLabel,TLabel,'NameLabel',SelectedItemGroupBox); + NameLabel.Caption:='Name:'; + + CreateWinControl(NameEdit,TEdit,'NameEdit',SelectedItemGroupBox); + + CreateWinControl(DescriptionLabel,TLabel,'DescriptionLabel', + SelectedItemGroupBox); + DescriptionLabel.Caption:='Description:'; + + CreateWinControl(DescriptionEdit,TEdit,'DescriptionEdit', + SelectedItemGroupBox); + + CreateWinControl(VariableLabel,TLabel,'VariableLabel',SelectedItemGroupBox); + VariableLabel.Caption:='Variable:'; + + CreateWinControl(VariableEdit,TEdit,'VariableEdit',SelectedItemGroupBox); + + CreateWinControl(ValueNoteBook,TNoteBook,'ValueNoteBook', + SelectedItemGroupBox); + with ValueNoteBook do begin + Pages[0]:='Value as Text'; + Pages.Add('Value as File Paths'); + end; + + CreateWinControl(ValueAsTextSynEdit,TSynEdit,'ValueAsTextSynEdit', + ValueNoteBook.Page[0]); + + CreateWinControl(ValueAsFilePathsSynEdit,TSynEdit,'ValueAsFilePathsSynEdit', + ValueNoteBook.Page[1]); + + CreateWinControl(MoveFilePathUpBitBtn,TBitBtn,'MoveFilePathUpBitBtn', + ValueNoteBook.Page[1]); + MoveFilePathUpBitBtn.Caption:='Move path up'; + + CreateWinControl(MoveFilePathDownBitBtn,TBitBtn,'MoveFilePathDownBitBtn', + ValueNoteBook.Page[1]); + MoveFilePathDownBitBtn.Caption:='Move path down'; + + CreateWinControl(DeleteFilePathBitBtn,TBitBtn,'DeleteFilePathBitBtn', + ValueNoteBook.Page[1]); + DeleteFilePathBitBtn.Caption:='Delete path'; + + CreateWinControl(InsertFilePathBitBtn,TBitBtn,'InsertFilePathBitBtn', + ValueNoteBook.Page[1]); + InsertFilePathBitBtn.Caption:='Insert path'; +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, AParent: TDefineTemplate; + WithChilds, WithNextSiblings: boolean); +begin + +end; + +procedure TCodeToolsDefinesEditor.Assign(ACodeToolBoss: TCodeToolManager; + Options: TCodeToolsOptions); +begin + FDefineTree.Assign(ACodeToolBoss.DefineTree); + RebuildDefineTreeView; +end; + +constructor TCodeToolsDefinesEditor.Create(TheOwner: TComponent); +begin + inherited Create(TheOwner); + if LazarusResources.Find(ClassName)=nil then begin + SetBounds((Screen.Width-480) div 2,(Screen.Height-430) div 2, 485, 435); + Caption:='CodeTools Defines Editor'; + OnResize:=@FormResize; + + CreateComponents; + end; + FDefineTree:=TDefineTree.Create; + Resize; +end; + +destructor TCodeToolsDefinesEditor.Destroy; +begin + FDefineTree.Free; + inherited Destroy; +end; + +end. + diff --git a/ide/keymapping.pp b/ide/keymapping.pp index 3c66c4d7f3..22605cb621 100644 --- a/ide/keymapping.pp +++ b/ide/keymapping.pp @@ -117,6 +117,7 @@ const ecEnvironmentOptions = ecUserFirst + 804; ecEditorOptions = ecUserFirst + 805; ecCodeToolsOptions = ecUserFirst + 806; + ecCodeToolsDefinesEd = ecUserFirst + 807; ecAboutLazarus = ecUserFirst + 900; @@ -473,6 +474,7 @@ begin ecFindBlockOtherEnd: Result:='find block other end'; ecFindBlockStart: Result:='find block start'; + // run menu ecBuild: Result:= 'build program/project'; ecBuildAll: Result:= 'build all files of program/project'; ecRun: Result:= 'run program'; @@ -481,22 +483,25 @@ begin ecStepOver: Result:= 'step over'; ecRunToCursor: Result:= 'run to cursor'; ecStopProgram: Result:= 'stop program'; - ecRunParameters: Result:= 'run parameters'; ecCompilerOptions: Result:= 'compiler options'; + + // tools menu ecExtToolSettings: Result:= 'external tools settings'; ecConfigBuildLazarus: Result:= 'configure build-lazarus'; + ecBuildLazarus: Result:= 'build lazarus'; + ecExtToolFirst..ecExtToolLast: + Result:='external tool '+IntToStr(cmd-ecExtToolFirst+1); + + // environment menu ecEnvironmentOptions: Result:= 'environment options'; ecEditorOptions: Result:= 'editor options'; ecCodeToolsOptions: Result:= 'codetools options'; + ecCodeToolsDefinesEd: Result:= 'codetools defines editor'; // help menu ecAboutLazarus: Result:= 'about lazarus'; - ecBuildLazarus: Result:= 'build lazarus'; - ecExtToolFirst..ecExtToolLast: - Result:='external tool '+IntToStr(cmd-ecExtToolFirst+1); - else Result:='unknown editor command'; end; @@ -1196,6 +1201,7 @@ begin Add(C,'General environment options',ecEnvironmentOptions,VK_UNKNOWN,[],VK_UNKNOWN,[]); Add(C,'Editor options',ecEditorOptions,VK_UNKNOWN,[],VK_UNKNOWN,[]); Add(C,'CodeTools options',ecCodeToolsOptions,VK_UNKNOWN,[],VK_UNKNOWN,[]); + Add(C,'CodeTools defines editor',ecCodeToolsDefinesEd,VK_UNKNOWN,[],VK_UNKNOWN,[]); // help menu C:=Categories[AddCategory('HelpMenu','Help menu commands')]; diff --git a/ide/main.pp b/ide/main.pp index a42320d898..6d0649f2a3 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -42,7 +42,7 @@ uses Debugger, DBGOutputForm, GDBDebugger, RunParamsOpts, ExtToolDialog, MacroPromptDlg, LMessages, ProjectDefs, Watchesdlg, BreakPointsdlg, ColumnDlg, OutputFilter, BuildLazDialog, MiscOptions, EditDefineTree, CodeToolsOptions, - TypInfo, IDEOptionDefs{, CodeToolsDefines}; + TypInfo, IDEOptionDefs, CodeToolsDefines; const Version_String = '0.8.2 alpha'; @@ -166,6 +166,7 @@ type itmEnvGeneralOptions: TMenuItem; itmEnvEditorOptions: TMenuItem; itmEnvCodeToolsOptions: TMenuItem; + itmEnvCodeToolsDefinesEditor: TMenuItem; itmHelpAboutLazarus: TMenuItem; @@ -175,10 +176,10 @@ type HintWindow1 : THintWindow; // event handlers - procedure FormShow(Sender : TObject); + //procedure FormShow(Sender : TObject); procedure FormClose(Sender : TObject; var Action: TCloseAction); procedure FormCloseQuery(Sender : TObject; var CanClose: boolean); - procedure FormPaint(Sender : TObject); + //procedure FormPaint(Sender : TObject); procedure MainMouseMoved(Sender: TObject; Shift: TShiftState; X,Y: Integer); procedure MainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,Y: Integer); @@ -257,6 +258,7 @@ type procedure mnuEnvGeneralOptionsClicked(Sender : TObject); procedure mnuEnvEditorOptionsClicked(Sender : TObject); procedure mnuEnvCodeToolsOptionsClicked(Sender : TObject); + procedure mnuEnvCodeToolsDefinesEditorClicked(Sender : TObject); // help menu procedure mnuHelpAboutLazarusClicked(Sender : TObject); @@ -715,7 +717,7 @@ begin HintWindow1.AutoHide := False; // MainIDE form events - OnShow := @FormShow; + //OnShow := @FormShow; OnClose := @FormClose; OnCloseQuery := @FormCloseQuery; @@ -952,17 +954,7 @@ Begin end; -Procedure TMainIDE.FormPaint(Sender : TObject); -begin - -end; - {------------------------------------------------------------------------------} -procedure TMainIDE.FormShow(Sender : TObject); -Begin - -end; - procedure TMainIDE.FormClose(Sender : TObject; var Action: TCloseAction); begin SaveEnvironment; @@ -1625,6 +1617,12 @@ begin itmEnvCodeToolsOptions.OnCLick := @mnuEnvCodeToolsOptionsClicked; mnuEnvironment.Add(itmEnvCodeToolsOptions); + itmEnvCodeToolsDefinesEditor := TMenuItem.Create(nil); + itmEnvCodeToolsDefinesEditor.Name:='itmEnvCodeToolsDefinesEditor'; + itmEnvCodeToolsDefinesEditor.Caption := 'CodeTools defines editor'; + itmEnvCodeToolsDefinesEditor.OnCLick := @mnuEnvCodeToolsDefinesEditorClicked; + mnuEnvironment.Add(itmEnvCodeToolsDefinesEditor); + //-------------- // Help //-------------- @@ -2357,6 +2355,11 @@ begin ShowCodeToolsOptions(CodeToolsOpts,@SourceNoteBook.GetSynEditPreviewSettings); end; +procedure TMainIDE.mnuEnvCodeToolsDefinesEditorClicked(Sender : TObject); +begin + ShowCodeToolsDefinesEditor(CodeToolBoss,CodeToolsOpts); +end; + procedure TMainIDE.SaveEnvironment; begin SaveDesktopSettings(EnvironmentOptions); @@ -4425,7 +4428,7 @@ begin end; end; -procedure TMainIDE.GetUnitWithPageIndex(PageIndex:integer; +procedure TMainIDE.GetUnitWithPageIndex(PageIndex:integer; var ActiveSourceEditor:TSourceEditor; var ActiveUnitInfo:TUnitInfo); begin if SourceNoteBook.NoteBook=nil then begin @@ -5143,7 +5146,7 @@ begin FOpenEditorsOnCodeToolChange:=false; CodeToolsOpts.AssignTo(CodeToolBoss); - + if (not FileExists(EnvironmentOptions.CompilerFilename)) then begin writeln(''); writeln('NOTE: Compiler Filename not set! (see Environment Options)'); @@ -5184,13 +5187,13 @@ begin AddTemplate(ADefTempl,false, 'NOTE: Could not create Define Template for Free Pascal Sources'); - // create compiler macros for the lazarus sources + // create compiler macros for the lazarus sources ADefTempl:=CreateLazarusSrcTemplate( '$('+ExternalMacroStart+'LazarusDir)', '$('+ExternalMacroStart+'LCLWidgetType)'); AddTemplate(ADefTempl,true, 'NOTE: Could not create Define Template for Lazarus Sources'); - end; + end; // build define tree c:=CodeToolBoss.ConsistencyCheck; if c<>0 then begin @@ -6173,6 +6176,7 @@ begin itmEnvGeneralOptions.ShortCut:=CommandToShortCut(ecEnvironmentOptions); itmEnvEditorOptions.ShortCut:=CommandToShortCut(ecEditorOptions); itmEnvCodeToolsOptions.ShortCut:=CommandToShortCut(ecCodeToolsOptions); + itmEnvCodeToolsDefinesEditor.ShortCut:=CommandToShortCut(ecCodeToolsDefinesEd); itmHelpAboutLazarus.ShortCut:=CommandToShortCut(ecAboutLazarus); end; @@ -6212,6 +6216,9 @@ end. { ============================================================================= $Log$ + Revision 1.238 2002/03/02 11:08:36 lazarus + MG: fixed method search diff proc, fixed synedit insert in empty line, small fixes, started define editor + Revision 1.237 2002/03/01 15:51:06 lazarus MG: added selection keys and nil operand