From 84ee7a6b32831bd604053f112f063aaf7377041d Mon Sep 17 00:00:00 2001 From: mattias Date: Sun, 21 Feb 2010 18:32:07 +0000 Subject: [PATCH] externhelp: add, delete item git-svn-id: trunk@23754 - --- components/externhelp/externhelpfrm.lfm | 4 + components/externhelp/externhelpfrm.pas | 155 +++++++++++++++++++++++- 2 files changed, 154 insertions(+), 5 deletions(-) diff --git a/components/externhelp/externhelpfrm.lfm b/components/externhelp/externhelpfrm.lfm index fb8242ab92..f40ba642b7 100644 --- a/components/externhelp/externhelpfrm.lfm +++ b/components/externhelp/externhelpfrm.lfm @@ -39,6 +39,7 @@ inherited ExternHelpGeneralOptsFrame: TExternHelpGeneralOptsFrame BorderSpacing.Around = 6 Color = clBtnFace NumGlyphs = 0 + OnClick = AddSpeedButtonClick ShowHint = True ParentShowHint = False end @@ -52,6 +53,7 @@ inherited ExternHelpGeneralOptsFrame: TExternHelpGeneralOptsFrame Width = 23 Color = clBtnFace NumGlyphs = 0 + OnClick = DeleteSpeedButtonClick ShowHint = True ParentShowHint = False end @@ -107,6 +109,7 @@ inherited ExternHelpGeneralOptsFrame: TExternHelpGeneralOptsFrame Top = 93 Width = 237 Anchors = [akTop, akLeft, akRight] + OnEditingDone = FilenameEditEditingDone TabOrder = 2 Text = 'FilenameEdit' end @@ -134,6 +137,7 @@ inherited ExternHelpGeneralOptsFrame: TExternHelpGeneralOptsFrame Width = 260 Anchors = [akTop, akLeft, akRight] BorderSpacing.Right = 6 + OnEditingDone = URLEditEditingDone TabOrder = 3 Text = 'URLEdit' end diff --git a/components/externhelp/externhelpfrm.pas b/components/externhelp/externhelpfrm.pas index 3765e18382..2394ac9c12 100644 --- a/components/externhelp/externhelpfrm.pas +++ b/components/externhelp/externhelpfrm.pas @@ -7,7 +7,7 @@ interface uses Classes, SysUtils, LCLProc, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, LazConfigStorage, ComCtrls, Buttons, StdCtrls, ExtCtrls, - IDEOptionsIntf, LazIDEIntf, BaseIDEIntf; + PackageIntf, MacroIntf, IDEOptionsIntf, LazIDEIntf, BaseIDEIntf; var ExternHelpOptionID: integer = 2000; @@ -51,6 +51,7 @@ type procedure MoveChild(FromPos, ToPos: integer); procedure RemoveChild(Index: integer); procedure DeleteChild(Index: integer); + procedure DeleteChild(Child: TExternHelpItem); function IndexOf(Child: TExternHelpItem): integer; function IsEqual(Item: TExternHelpItem; WithName: boolean): boolean; procedure Assign(Src: TExternHelpItem; WithName: boolean); @@ -122,6 +123,9 @@ type StoreLabel: TLabel; URLEdit: TEdit; URLLabel: TLabel; + procedure AddSpeedButtonClick(Sender: TObject); + procedure DeleteSpeedButtonClick(Sender: TObject); + procedure FilenameEditEditingDone(Sender: TObject); procedure ItemsTreeViewEdited(Sender: TObject; Node: TTreeNode; var S: string); procedure ItemsTreeViewEditing(Sender: TObject; Node: TTreeNode; @@ -129,12 +133,16 @@ type procedure ItemsTreeViewSelectionChanged(Sender: TObject); procedure NameEditChange(Sender: TObject); procedure NameEditEditingDone(Sender: TObject); + procedure URLEditEditingDone(Sender: TObject); private FOptions: TExternHelpOptions; procedure FillItemsTreeView; procedure NameChanged(TVNode: TTreeNode; var NewName: string; UpdateTree, UpdateEdit: boolean); procedure SelectionChanged; + function FindTVNode(NodeText: string): TTreeNode; + function CreateUniqueName(Prefix: string): string; + procedure FillStoreInCombobox; public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; @@ -175,6 +183,7 @@ constructor TExternHelpOptions.Create; begin RootItem:=TExternHelpRootItem.Create; RootItem.Owner:=Self; + Filename:='externhelp.xml'; end; destructor TExternHelpOptions.Destroy; @@ -278,6 +287,78 @@ begin NameChanged(Node,S,false,true); end; +procedure TExternHelpGeneralOptsFrame.FilenameEditEditingDone(Sender: TObject); +var + s: String; + TVNode: TTreeNode; + Item: TExternHelpItem; + Msg: String; + Filename: String; +begin + s:=FilenameEdit.Text; + TVNode:=ItemsTreeView.Selected; + if (TVNode=nil) or (not (TObject(TVNode.Data) is TExternHelpItem)) then exit; + Item:=TExternHelpItem(TVNode.Data); + s:=Trim(s); + if s<>Item.Filename then begin + Filename:=s; + DoDirSeparators(Filename); + IDEMacros.SubstituteMacros(Filename); + Msg:=''; + if (Filename<>'') and (Filename[length(Filename)]=PathDelim) then begin + if not DirPathExists(Filename) then + Msg:='Directory not found: '+Filename; + end else begin + if not FileExistsUTF8(Filename) then + Msg:='File not found: '+Filename; + end; + if Msg<>'' then begin + MessageDlg('Warning',Msg,mtWarning,[mbIgnore],0); + end; + Item.Filename:=s; + end; +end; + +procedure TExternHelpGeneralOptsFrame.AddSpeedButtonClick(Sender: TObject); +var + SelTVNode: TTreeNode; + Item: TExternHelpItem; + TVNode: TTreeNode; + SelItem: TExternHelpItem; +begin + SelTVNode:=ItemsTreeView.Selected; + Item:=TExternHelpItem.Create; + Item.Name:=CreateUniqueName('Item'); + if TObject(SelTVNode.Data) is TExternHelpItem then begin + // init with values of selected node + SelItem:=TExternHelpItem(SelTVNode.Data); + Item.Filename:=SelItem.Filename; + Item.URL:=SelItem.URL; + Item.StoreIn:=SelItem.StoreIn; + end; + TVNode:=ItemsTreeView.Items.AddObject(SelTVNode,Item.Name,Item); + ItemsTreeView.Selected:=TVNode; +end; + +procedure TExternHelpGeneralOptsFrame.DeleteSpeedButtonClick(Sender: TObject); +var + SelTVNode: TTreeNode; + Item: TExternHelpItem; +begin + SelTVNode:=ItemsTreeView.Selected; + if (SelTVNode=nil) or (not (TObject(SelTVNode.Data) is TExternHelpItem)) then exit; + Item:=TExternHelpItem(SelTVNode.Data); + // select next + if SelTVNode.GetNext<>nil then + ItemsTreeView.Selected:=SelTVNode.GetNext + else + ItemsTreeView.Selected:=SelTVNode.GetPrev; + // delete in treeview + SelTVNode.Free; + // delete in Options + Item.Free; +end; + procedure TExternHelpGeneralOptsFrame.ItemsTreeViewEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean); begin @@ -306,6 +387,22 @@ begin NameChanged(ItemsTreeView.Selected,S,true,true); end; +procedure TExternHelpGeneralOptsFrame.URLEditEditingDone(Sender: TObject); +var + s: String; + TVNode: TTreeNode; + Item: TExternHelpItem; +begin + s:=URLEdit.Text; + TVNode:=ItemsTreeView.Selected; + if (TVNode=nil) or (not (TObject(TVNode.Data) is TExternHelpItem)) then exit; + Item:=TExternHelpItem(TVNode.Data); + s:=Trim(s); + if s<>Item.URL then begin + Item.URL:=s; + end; +end; + procedure TExternHelpGeneralOptsFrame.FillItemsTreeView; procedure Add(ParentItem: TExternHelpItem; ParentTVNode: TTreeNode); @@ -362,7 +459,7 @@ begin FilenameEdit.Text:=Item.Filename; URLEdit.Enabled:=true; URLEdit.Text:=Item.URL; - StoreComboBox.Enabled:=true; + StoreComboBox.Enabled:=Item.Parent=Options.RootItem; StoreComboBox.Text:=Item.StoreIn; end else begin NameEdit.Enabled:=false; @@ -376,6 +473,38 @@ begin end; end; +function TExternHelpGeneralOptsFrame.FindTVNode(NodeText: string): TTreeNode; +begin + Result:=ItemsTreeView.Items.GetFirstNode; + while (Result<>nil) and (SysUtils.CompareText(Result.Text,NodeText)<>0) do + Result:=Result.GetNext; +end; + +function TExternHelpGeneralOptsFrame.CreateUniqueName(Prefix: string): string; +var + i: Integer; +begin + i:=0; + repeat + inc(i); + Result:=Prefix+IntToStr(i); + until FindTVNode(Result)=nil; +end; + +procedure TExternHelpGeneralOptsFrame.FillStoreInCombobox; +var + sl: TStringList; +begin + sl:=TStringList.Create; + try + sl.Sort; + sl.Insert(0,'My settings'); + StoreComboBox.Items.Assign(sl); + finally + sl.Free; + end; +end; + constructor TExternHelpGeneralOptsFrame.Create(TheOwner: TComponent); begin inherited Create(TheOwner); @@ -478,6 +607,8 @@ end; destructor TExternHelpItem.Destroy; begin + if Parent<>nil then + Parent.RemoveChild(Parent.IndexOf(Self)); Clear; FreeAndNil(fChilds); inherited Destroy; @@ -486,9 +617,14 @@ end; procedure TExternHelpItem.Clear; var i: Integer; + Child: TExternHelpItem; begin if (ChildCount=0) and (URL='') and (Filename='') and (StoreIn='') then exit; - for i:=fChilds.Count-1 downto 0 do TObject(fChilds).Free; + for i:=fChilds.Count-1 downto 0 do begin + Child:=Childs[i]; + Child.Parent:=nil; + Child.Free; + end; fChilds.Clear; fURL:=''; FFilename:=''; @@ -500,22 +636,31 @@ procedure TExternHelpItem.AddChild(Item: TExternHelpItem); begin Item.Parent:=Self; fChilds.Add(Item); + IncreaseChangeStep; end; procedure TExternHelpItem.MoveChild(FromPos, ToPos: integer); begin + if FromPos=ToPos then exit; fChilds.Move(FromPos,ToPos); + IncreaseChangeStep; end; procedure TExternHelpItem.RemoveChild(Index: integer); begin + Childs[Index].Parent:=nil; fChilds.Delete(Index); + IncreaseChangeStep; end; procedure TExternHelpItem.DeleteChild(Index: integer); begin - TObject(fChilds[Index]).Free; - fChilds.Delete(Index); + Childs[Index].Free; +end; + +procedure TExternHelpItem.DeleteChild(Child: TExternHelpItem); +begin + Child.Free; end; function TExternHelpItem.IndexOf(Child: TExternHelpItem): integer;