You've already forked lazarus-ccr
tvplanit: Fix VpNavBar component editor (crashes, update issues, no delete prompt) - issues #34644 and #34645
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6746 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -15,7 +15,7 @@ object frmNavBarEd: TfrmNavBarEd
|
||||
OnShow = FormShow
|
||||
Position = poDefaultPosOnly
|
||||
ShowHint = True
|
||||
LCLVersion = '1.9.0.0'
|
||||
LCLVersion = '2.1.0.0'
|
||||
object pnlFoldersAndItems: TPanel
|
||||
Left = 0
|
||||
Height = 370
|
||||
|
@ -104,12 +104,12 @@ type
|
||||
function GetFolderDisplayName(AFolder: TVpNavFolder): String;
|
||||
function GetItemDisplayName(AItem: TVpNavBtnItem): String;
|
||||
procedure SelectionChanged(AOrderChanged: Boolean = false);
|
||||
procedure SelectList(SelList: TPersistentSelectionList);
|
||||
procedure UpdateBtnStates;
|
||||
|
||||
private
|
||||
FDesigner: TComponentEditorDesigner;
|
||||
procedure AddDesignHookHandlers;
|
||||
procedure Modified;
|
||||
procedure OnGetSelection(const ASelection: TPersistentSelectionList);
|
||||
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
||||
procedure OnPersistentDeleting(APersistent: TPersistent);
|
||||
@ -365,6 +365,8 @@ begin
|
||||
Result := IfThen(AItem.Caption <> '', AItem.Caption, AItem.Name);
|
||||
end;
|
||||
|
||||
{ Is called when the selection has been changed within the Component Editor
|
||||
in order pass the new selection to the OI designer }
|
||||
procedure TfrmNavBarEd.OnGetSelection(const ASelection: TPersistentSelectionList);
|
||||
var
|
||||
i: Integer;
|
||||
@ -389,8 +391,9 @@ end;
|
||||
procedure TfrmNavBarEd.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
||||
var
|
||||
i: Integer;
|
||||
selList: TPersistentSelectionList;
|
||||
begin
|
||||
if not Assigned(APersistent) then
|
||||
if not Assigned(APersistent) or (FBar = nil) or (GlobalDesignHook = nil) then
|
||||
exit;
|
||||
|
||||
if (APersistent is TVpNavFolder) then
|
||||
@ -399,6 +402,23 @@ begin
|
||||
if Select then begin
|
||||
i := FindFolderIndex(APersistent);
|
||||
lbFolders.ItemIndex := i;
|
||||
|
||||
selList := TPersistentSelectionList.Create;
|
||||
try
|
||||
selList.ForceUpdate := true;
|
||||
for i := 0 to pred(lbFolders.Items.Count) do
|
||||
if lbFolders.Selected[i] then begin
|
||||
SelList.Add(TPersistent(lbFolders.Items.Objects[i]));
|
||||
FBar.FolderCollection.DoOnItemSelected(i);
|
||||
end;
|
||||
|
||||
if (SelList.Count > 0) then begin
|
||||
GlobalDesignHook.SetSelection(SelList);
|
||||
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||
end;
|
||||
finally
|
||||
selList.Free;
|
||||
end;
|
||||
end;
|
||||
end else
|
||||
if (APersistent is TVpNavBtnItem) then
|
||||
@ -407,6 +427,23 @@ begin
|
||||
if Select then begin
|
||||
i := FindBtnIndex(APersistent);
|
||||
lbItems.ItemIndex := i;
|
||||
|
||||
selList := TPersistentSelectionList.Create;
|
||||
try
|
||||
selList.ForceUpdate := true;
|
||||
for i:=0 to lbItems.Items.Count-1 do
|
||||
if lbItems.Selected[i] then
|
||||
begin
|
||||
selList.Add(TPersistent(lbItems.Items.Objects[i]));
|
||||
FBar.Folders[FBar.ActiveFolder].ItemCollection.DoOnItemSelected(I);
|
||||
end;
|
||||
if selList.Count > 0 then begin
|
||||
GlobalDesignHook.SetSelection(selList);
|
||||
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||
end;
|
||||
finally
|
||||
selList.Free;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
@ -419,7 +456,10 @@ begin
|
||||
if APersistent is TVpNavFolder then
|
||||
begin
|
||||
i := FindFolderIndex(APersistent);
|
||||
if i <> -1 then lbFolders.Items.Delete(i);
|
||||
if i <> -1 then begin
|
||||
lbFolders.Items.Delete(i);
|
||||
lbItems.Clear;
|
||||
end;
|
||||
end else
|
||||
if APersistent is TVpNavBtnItem then
|
||||
begin
|
||||
@ -432,21 +472,24 @@ end;
|
||||
procedure TfrmNavBarEd.OnRefreshPropertyValues;
|
||||
var
|
||||
selections: TPersistentSelectionList;
|
||||
i: Integer;
|
||||
i, idx: Integer;
|
||||
begin
|
||||
if FBar = nil then
|
||||
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||
exit;
|
||||
|
||||
selections := TPersistentSelectionList.Create;
|
||||
try
|
||||
Assert(Assigned(GlobalDesignHook));
|
||||
GlobalDesignHook.GetSelection(selections);
|
||||
for i:=0 to selections.Count-1 do begin
|
||||
if selections[i] is TVpNavFolder then
|
||||
lbFolders.Items[i] := GetFolderDisplayName(TVpNavFolder(selections[i]))
|
||||
else if selections[i] is TVpNavBtnItem then
|
||||
lbItems.Items[i] := GetItemDisplayName(TVpNavBtnItem(selections[i]))
|
||||
else if (selections[i] is TCustomImageList) and (TCustomImageList(selections[i]) = FBar.Images) then
|
||||
if selections[i] is TVpNavFolder then begin
|
||||
idx := FindFolderIndex(TVpNavFolder(selections[i]));
|
||||
lbFolders.Items[idx] := GetFolderDisplayName(TVpNavFolder(selections[i]))
|
||||
end else
|
||||
if selections[i] is TVpNavBtnItem then begin
|
||||
idx := FindBtnIndex(TVpNavBtnItem(selections[i]));
|
||||
lbItems.Items[idx] := GetItemDisplayName(TVpNavBtnItem(selections[i]))
|
||||
end else
|
||||
if (selections[i] is TCustomImageList) and (TCustomImageList(selections[i]) = FBar.Images) then
|
||||
PopulateImagesList;
|
||||
end;
|
||||
finally
|
||||
@ -454,6 +497,8 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
{ Is called when a new selection has been made in the object tree of the OI.
|
||||
The controls in the component editor must be updated to the new selection. }
|
||||
procedure TfrmNavBarEd.OnSetSelection(const ASelection: TPersistentSelectionList);
|
||||
var
|
||||
i, j: Integer;
|
||||
@ -466,7 +511,12 @@ begin
|
||||
//select from list
|
||||
for i := 0 to ASelection.Count - 1 do begin
|
||||
j := FindFolderIndex(ASelection[i]);
|
||||
if j <> -1 then lbFolders.Selected[j] := true;
|
||||
if j <> -1 then begin
|
||||
lbFolders.Selected[j] := true;
|
||||
PopulateItemList;
|
||||
FBar.ActiveFolder := lbFolders.ItemIndex;
|
||||
lbImages.ItemIndex := -1;
|
||||
end;
|
||||
end;
|
||||
end else
|
||||
if ASelection[0] is TVpNavBtnItem then
|
||||
@ -558,7 +608,7 @@ var
|
||||
SelList: TPersistentSelectionList;
|
||||
i: Integer;
|
||||
begin
|
||||
if FBar = nil then
|
||||
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||
exit;
|
||||
|
||||
PopulateItemList;
|
||||
@ -566,6 +616,7 @@ begin
|
||||
lbImages.ItemIndex := -1;
|
||||
|
||||
SelList := TPersistentSelectionList.Create;
|
||||
try
|
||||
SelList.ForceUpdate := true;
|
||||
|
||||
for i := 0 to pred(lbFolders.Items.Count) do
|
||||
@ -574,8 +625,13 @@ begin
|
||||
FBar.FolderCollection.DoOnItemSelected(i);
|
||||
end;
|
||||
|
||||
if SelList.Count > 0 then
|
||||
SelectList(SelList);
|
||||
if SelList.Count > 0 then begin
|
||||
GlobalDesignHook.SetSelection(SelList);
|
||||
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||
end;
|
||||
finally
|
||||
SelList.Free;
|
||||
end;
|
||||
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
@ -666,6 +722,7 @@ begin
|
||||
lbImages.ItemIndex := btn.IconIndex;
|
||||
|
||||
SelList := TPersistentSelectionList.Create;
|
||||
try
|
||||
SelList.ForceUpdate := true;
|
||||
for i:=0 to lbItems.Items.Count-1 do
|
||||
if lbItems.Selected[i] then
|
||||
@ -673,8 +730,13 @@ begin
|
||||
SelList.Add(TPersistent(lbItems.Items.Objects[i]));
|
||||
FBar.Folders[FBar.ActiveFolder].ItemCollection.DoOnItemSelected(I);
|
||||
end;
|
||||
if SelList.Count > 0 then
|
||||
SelectList(SelList);
|
||||
if SelList.Count > 0 then begin
|
||||
GlobalDesignHook.SetSelection(SelList);
|
||||
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||
end;
|
||||
finally
|
||||
SelList.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
UpdateBtnStates;
|
||||
@ -745,6 +807,7 @@ begin
|
||||
GlobalDesignHook.SelectOnlyThis(folder);
|
||||
Designer.Modified;
|
||||
end;
|
||||
Modified;
|
||||
end;
|
||||
|
||||
UpdateBtnStates;
|
||||
@ -752,52 +815,47 @@ end;
|
||||
|
||||
procedure TfrmNavBarEd.btnFolderDownClick(Sender: TObject);
|
||||
var
|
||||
Folder: TVpNavFolder;
|
||||
folder: TVpNavFolder;
|
||||
begin
|
||||
if (lbFolders.ItemIndex > -1) then begin
|
||||
Folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
||||
folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
||||
|
||||
if Folder.Index < pred(lbFolders.Items.Count) then
|
||||
Folder.Index := Folder.Index + 1;
|
||||
if folder.Index < pred(lbFolders.Items.Count) then
|
||||
folder.Index := folder.Index + 1;
|
||||
|
||||
PopulateFolderList;
|
||||
lbFolders.ItemIndex := Folder.Index;
|
||||
lbFolders.ItemIndex := folder.Index;
|
||||
|
||||
if Assigned(Designer) then begin
|
||||
GlobalDesignHook.SelectOnlyThis(nil);
|
||||
GlobalDesignHook.SelectOnlyThis(folder);
|
||||
Designer.Modified;
|
||||
end;
|
||||
Modified;
|
||||
end;
|
||||
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.btnItemDeleteClick(Sender: TObject);
|
||||
begin
|
||||
if (lbItems.ItemIndex <> -1) then begin
|
||||
TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]).Free;
|
||||
lbItems.ItemIndex := -1;
|
||||
lbImages.ItemIndex := -1;
|
||||
PopulateItemList;
|
||||
if Assigned(Designer) then
|
||||
Designer.Modified;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.btnFolderDeleteClick(Sender: TObject);
|
||||
var
|
||||
folder: TVpNavFolder;
|
||||
s: String;
|
||||
begin
|
||||
if (lbFolders.ItemIndex <> -1) and (FBar <> nil) then begin
|
||||
TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]).Free;
|
||||
|
||||
folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
||||
s := folder.Caption;
|
||||
if MessageDlg(Format('Do you really want to delete folder "%s"?', [s]),
|
||||
mtConfirmation, [mbYes, mbNo], 0) <> mrYes
|
||||
then
|
||||
exit;
|
||||
|
||||
FDesigner.DeleteSelection;
|
||||
lbFolders.ItemIndex := -1;
|
||||
FBar.Activefolder := -1;
|
||||
FBar.ActiveFolder := -1;
|
||||
lbImages.ItemIndex := -1;
|
||||
PopulateFolderList;
|
||||
PopulateItemList;
|
||||
if Assigned(Designer) then
|
||||
Designer.Modified;
|
||||
UpdateBtnStates;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -805,11 +863,10 @@ procedure TfrmNavBarEd.btnFolderAddClick(Sender: TObject);
|
||||
var
|
||||
folder: TVpNavFolder;
|
||||
begin
|
||||
if FBar = nil then
|
||||
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||
exit;
|
||||
folder := TVpNavFolder(FBar.FolderCollection.Add);
|
||||
GlobalDesignHook.PersistentAdded(folder, true);
|
||||
lbFoldersClick(self);
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.btnItemAddClick(Sender: TObject);
|
||||
@ -817,12 +874,28 @@ var
|
||||
folder: TVpNavFolder;
|
||||
item: TVpNavBtnItem;
|
||||
begin
|
||||
if (lbFolders.ItemIndex <> -1) then begin
|
||||
if (lbFolders.ItemIndex = -1) or (GlobalDesignHook = nil) then
|
||||
exit;
|
||||
folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
||||
item := TVpNavBtnItem(folder.ItemCollection.Add);
|
||||
GlobalDesignHook.PersistentAdded(item, true);
|
||||
end;
|
||||
UpdateBtnStates;
|
||||
|
||||
procedure TfrmNavBarEd.btnItemDeleteClick(Sender: TObject);
|
||||
var
|
||||
btn: TVpNavBtnItem;
|
||||
s: String;
|
||||
begin
|
||||
if (lbItems.ItemIndex <> -1) then begin
|
||||
btn := TVpNavBtnItem(lbItems.Items.Objects[lbItems.ItemIndex]);
|
||||
s := btn.Caption;
|
||||
if MessageDlg(Format('Do you really want to delete item "%s"?', [s]),
|
||||
mtConfirmation, [mbYes, mbNo], 0) <> mrYes
|
||||
then
|
||||
exit;
|
||||
|
||||
FDesigner.DeleteSelection;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.btnUseImageClick(Sender: TObject);
|
||||
@ -847,6 +920,16 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.Modified;
|
||||
begin
|
||||
FDesigner.PropertyEditorHook.RefreshPropertyValues;
|
||||
FDesigner.Modified;
|
||||
|
||||
if GlobalDesignHook <> nil then
|
||||
GlobalDesignHook.Modified(self);
|
||||
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.SelectionChanged(AOrderChanged: Boolean = false);
|
||||
var
|
||||
SelList: TPersistentSelectionList;
|
||||
@ -866,16 +949,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.Selectlist(SelList: TPersistentSelectionList);
|
||||
begin
|
||||
if (GlobalDesignHook <> nil) and (FBar <> nil) then
|
||||
begin
|
||||
GlobalDesignHook.SetSelection(SelList);
|
||||
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||
end;
|
||||
SelList.Free;
|
||||
end;
|
||||
|
||||
procedure TfrmNavBarEd.UpdateBtnStates;
|
||||
var
|
||||
canChangeFolders: Boolean;
|
||||
|
Reference in New Issue
Block a user