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
|
OnShow = FormShow
|
||||||
Position = poDefaultPosOnly
|
Position = poDefaultPosOnly
|
||||||
ShowHint = True
|
ShowHint = True
|
||||||
LCLVersion = '1.9.0.0'
|
LCLVersion = '2.1.0.0'
|
||||||
object pnlFoldersAndItems: TPanel
|
object pnlFoldersAndItems: TPanel
|
||||||
Left = 0
|
Left = 0
|
||||||
Height = 370
|
Height = 370
|
||||||
|
@ -104,12 +104,12 @@ type
|
|||||||
function GetFolderDisplayName(AFolder: TVpNavFolder): String;
|
function GetFolderDisplayName(AFolder: TVpNavFolder): String;
|
||||||
function GetItemDisplayName(AItem: TVpNavBtnItem): String;
|
function GetItemDisplayName(AItem: TVpNavBtnItem): String;
|
||||||
procedure SelectionChanged(AOrderChanged: Boolean = false);
|
procedure SelectionChanged(AOrderChanged: Boolean = false);
|
||||||
procedure SelectList(SelList: TPersistentSelectionList);
|
|
||||||
procedure UpdateBtnStates;
|
procedure UpdateBtnStates;
|
||||||
|
|
||||||
private
|
private
|
||||||
FDesigner: TComponentEditorDesigner;
|
FDesigner: TComponentEditorDesigner;
|
||||||
procedure AddDesignHookHandlers;
|
procedure AddDesignHookHandlers;
|
||||||
|
procedure Modified;
|
||||||
procedure OnGetSelection(const ASelection: TPersistentSelectionList);
|
procedure OnGetSelection(const ASelection: TPersistentSelectionList);
|
||||||
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
||||||
procedure OnPersistentDeleting(APersistent: TPersistent);
|
procedure OnPersistentDeleting(APersistent: TPersistent);
|
||||||
@ -365,6 +365,8 @@ begin
|
|||||||
Result := IfThen(AItem.Caption <> '', AItem.Caption, AItem.Name);
|
Result := IfThen(AItem.Caption <> '', AItem.Caption, AItem.Name);
|
||||||
end;
|
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);
|
procedure TfrmNavBarEd.OnGetSelection(const ASelection: TPersistentSelectionList);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -389,8 +391,9 @@ end;
|
|||||||
procedure TfrmNavBarEd.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
procedure TfrmNavBarEd.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
selList: TPersistentSelectionList;
|
||||||
begin
|
begin
|
||||||
if not Assigned(APersistent) then
|
if not Assigned(APersistent) or (FBar = nil) or (GlobalDesignHook = nil) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
if (APersistent is TVpNavFolder) then
|
if (APersistent is TVpNavFolder) then
|
||||||
@ -399,6 +402,23 @@ begin
|
|||||||
if Select then begin
|
if Select then begin
|
||||||
i := FindFolderIndex(APersistent);
|
i := FindFolderIndex(APersistent);
|
||||||
lbFolders.ItemIndex := i;
|
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;
|
||||||
end else
|
end else
|
||||||
if (APersistent is TVpNavBtnItem) then
|
if (APersistent is TVpNavBtnItem) then
|
||||||
@ -407,6 +427,23 @@ begin
|
|||||||
if Select then begin
|
if Select then begin
|
||||||
i := FindBtnIndex(APersistent);
|
i := FindBtnIndex(APersistent);
|
||||||
lbItems.ItemIndex := i;
|
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;
|
||||||
end;
|
end;
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
@ -419,7 +456,10 @@ begin
|
|||||||
if APersistent is TVpNavFolder then
|
if APersistent is TVpNavFolder then
|
||||||
begin
|
begin
|
||||||
i := FindFolderIndex(APersistent);
|
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
|
end else
|
||||||
if APersistent is TVpNavBtnItem then
|
if APersistent is TVpNavBtnItem then
|
||||||
begin
|
begin
|
||||||
@ -432,21 +472,24 @@ end;
|
|||||||
procedure TfrmNavBarEd.OnRefreshPropertyValues;
|
procedure TfrmNavBarEd.OnRefreshPropertyValues;
|
||||||
var
|
var
|
||||||
selections: TPersistentSelectionList;
|
selections: TPersistentSelectionList;
|
||||||
i: Integer;
|
i, idx: Integer;
|
||||||
begin
|
begin
|
||||||
if FBar = nil then
|
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
selections := TPersistentSelectionList.Create;
|
selections := TPersistentSelectionList.Create;
|
||||||
try
|
try
|
||||||
Assert(Assigned(GlobalDesignHook));
|
|
||||||
GlobalDesignHook.GetSelection(selections);
|
GlobalDesignHook.GetSelection(selections);
|
||||||
for i:=0 to selections.Count-1 do begin
|
for i:=0 to selections.Count-1 do begin
|
||||||
if selections[i] is TVpNavFolder then
|
if selections[i] is TVpNavFolder then begin
|
||||||
lbFolders.Items[i] := GetFolderDisplayName(TVpNavFolder(selections[i]))
|
idx := FindFolderIndex(TVpNavFolder(selections[i]));
|
||||||
else if selections[i] is TVpNavBtnItem then
|
lbFolders.Items[idx] := GetFolderDisplayName(TVpNavFolder(selections[i]))
|
||||||
lbItems.Items[i] := GetItemDisplayName(TVpNavBtnItem(selections[i]))
|
end else
|
||||||
else if (selections[i] is TCustomImageList) and (TCustomImageList(selections[i]) = FBar.Images) then
|
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;
|
PopulateImagesList;
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
@ -454,6 +497,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
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);
|
procedure TfrmNavBarEd.OnSetSelection(const ASelection: TPersistentSelectionList);
|
||||||
var
|
var
|
||||||
i, j: Integer;
|
i, j: Integer;
|
||||||
@ -466,7 +511,12 @@ begin
|
|||||||
//select from list
|
//select from list
|
||||||
for i := 0 to ASelection.Count - 1 do begin
|
for i := 0 to ASelection.Count - 1 do begin
|
||||||
j := FindFolderIndex(ASelection[i]);
|
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;
|
||||||
end else
|
end else
|
||||||
if ASelection[0] is TVpNavBtnItem then
|
if ASelection[0] is TVpNavBtnItem then
|
||||||
@ -558,7 +608,7 @@ var
|
|||||||
SelList: TPersistentSelectionList;
|
SelList: TPersistentSelectionList;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
if FBar = nil then
|
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
PopulateItemList;
|
PopulateItemList;
|
||||||
@ -566,16 +616,22 @@ begin
|
|||||||
lbImages.ItemIndex := -1;
|
lbImages.ItemIndex := -1;
|
||||||
|
|
||||||
SelList := TPersistentSelectionList.Create;
|
SelList := TPersistentSelectionList.Create;
|
||||||
SelList.ForceUpdate := true;
|
try
|
||||||
|
SelList.ForceUpdate := true;
|
||||||
|
|
||||||
for i := 0 to pred(lbFolders.Items.Count) do
|
for i := 0 to pred(lbFolders.Items.Count) do
|
||||||
if lbFolders.Selected[i] then begin
|
if lbFolders.Selected[i] then begin
|
||||||
SelList.Add(TPersistent(lbFolders.Items.Objects[i]));
|
SelList.Add(TPersistent(lbFolders.Items.Objects[i]));
|
||||||
FBar.FolderCollection.DoOnItemSelected(i);
|
FBar.FolderCollection.DoOnItemSelected(i);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if SelList.Count > 0 then begin
|
||||||
|
GlobalDesignHook.SetSelection(SelList);
|
||||||
|
GlobalDesignHook.LookupRoot := GetLookupRootForComponent(FBar);
|
||||||
end;
|
end;
|
||||||
|
finally
|
||||||
if SelList.Count > 0 then
|
SelList.Free;
|
||||||
SelectList(SelList);
|
end;
|
||||||
|
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
end;
|
||||||
@ -666,15 +722,21 @@ begin
|
|||||||
lbImages.ItemIndex := btn.IconIndex;
|
lbImages.ItemIndex := btn.IconIndex;
|
||||||
|
|
||||||
SelList := TPersistentSelectionList.Create;
|
SelList := TPersistentSelectionList.Create;
|
||||||
SelList.ForceUpdate := true;
|
try
|
||||||
for i:=0 to lbItems.Items.Count-1 do
|
SelList.ForceUpdate := true;
|
||||||
if lbItems.Selected[i] then
|
for i:=0 to lbItems.Items.Count-1 do
|
||||||
begin
|
if lbItems.Selected[i] then
|
||||||
SelList.Add(TPersistent(lbItems.Items.Objects[i]));
|
begin
|
||||||
FBar.Folders[FBar.ActiveFolder].ItemCollection.DoOnItemSelected(I);
|
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;
|
end;
|
||||||
if SelList.Count > 0 then
|
finally
|
||||||
SelectList(SelList);
|
SelList.Free;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
@ -745,6 +807,7 @@ begin
|
|||||||
GlobalDesignHook.SelectOnlyThis(folder);
|
GlobalDesignHook.SelectOnlyThis(folder);
|
||||||
Designer.Modified;
|
Designer.Modified;
|
||||||
end;
|
end;
|
||||||
|
Modified;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
@ -752,52 +815,47 @@ end;
|
|||||||
|
|
||||||
procedure TfrmNavBarEd.btnFolderDownClick(Sender: TObject);
|
procedure TfrmNavBarEd.btnFolderDownClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
Folder: TVpNavFolder;
|
folder: TVpNavFolder;
|
||||||
begin
|
begin
|
||||||
if (lbFolders.ItemIndex > -1) then 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
|
if folder.Index < pred(lbFolders.Items.Count) then
|
||||||
Folder.Index := Folder.Index + 1;
|
folder.Index := folder.Index + 1;
|
||||||
|
|
||||||
PopulateFolderList;
|
PopulateFolderList;
|
||||||
lbFolders.ItemIndex := Folder.Index;
|
lbFolders.ItemIndex := folder.Index;
|
||||||
|
|
||||||
if Assigned(Designer) then begin
|
if Assigned(Designer) then begin
|
||||||
GlobalDesignHook.SelectOnlyThis(nil);
|
GlobalDesignHook.SelectOnlyThis(nil);
|
||||||
GlobalDesignHook.SelectOnlyThis(folder);
|
GlobalDesignHook.SelectOnlyThis(folder);
|
||||||
Designer.Modified;
|
Designer.Modified;
|
||||||
end;
|
end;
|
||||||
|
Modified;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
UpdateBtnStates;
|
UpdateBtnStates;
|
||||||
end;
|
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);
|
procedure TfrmNavBarEd.btnFolderDeleteClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
folder: TVpNavFolder;
|
||||||
|
s: String;
|
||||||
begin
|
begin
|
||||||
if (lbFolders.ItemIndex <> -1) and (FBar <> nil) then 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;
|
lbFolders.ItemIndex := -1;
|
||||||
FBar.Activefolder := -1;
|
FBar.ActiveFolder := -1;
|
||||||
lbImages.ItemIndex := -1;
|
lbImages.ItemIndex := -1;
|
||||||
PopulateFolderList;
|
|
||||||
PopulateItemList;
|
PopulateItemList;
|
||||||
if Assigned(Designer) then
|
|
||||||
Designer.Modified;
|
|
||||||
UpdateBtnStates;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -805,11 +863,10 @@ procedure TfrmNavBarEd.btnFolderAddClick(Sender: TObject);
|
|||||||
var
|
var
|
||||||
folder: TVpNavFolder;
|
folder: TVpNavFolder;
|
||||||
begin
|
begin
|
||||||
if FBar = nil then
|
if (FBar = nil) or (GlobalDesignHook = nil) then
|
||||||
exit;
|
exit;
|
||||||
folder := TVpNavFolder(FBar.FolderCollection.Add);
|
folder := TVpNavFolder(FBar.FolderCollection.Add);
|
||||||
GlobalDesignHook.PersistentAdded(folder, true);
|
GlobalDesignHook.PersistentAdded(folder, true);
|
||||||
lbFoldersClick(self);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TfrmNavBarEd.btnItemAddClick(Sender: TObject);
|
procedure TfrmNavBarEd.btnItemAddClick(Sender: TObject);
|
||||||
@ -817,12 +874,28 @@ var
|
|||||||
folder: TVpNavFolder;
|
folder: TVpNavFolder;
|
||||||
item: TVpNavBtnItem;
|
item: TVpNavBtnItem;
|
||||||
begin
|
begin
|
||||||
if (lbFolders.ItemIndex <> -1) then begin
|
if (lbFolders.ItemIndex = -1) or (GlobalDesignHook = nil) then
|
||||||
folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
exit;
|
||||||
item := TVpNavBtnItem(folder.ItemCollection.Add);
|
folder := TVpNavFolder(lbFolders.Items.Objects[lbFolders.ItemIndex]);
|
||||||
GlobalDesignHook.PersistentAdded(item, true);
|
item := TVpNavBtnItem(folder.ItemCollection.Add);
|
||||||
|
GlobalDesignHook.PersistentAdded(item, true);
|
||||||
|
end;
|
||||||
|
|
||||||
|
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;
|
||||||
UpdateBtnStates;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TfrmNavBarEd.btnUseImageClick(Sender: TObject);
|
procedure TfrmNavBarEd.btnUseImageClick(Sender: TObject);
|
||||||
@ -847,6 +920,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
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);
|
procedure TfrmNavBarEd.SelectionChanged(AOrderChanged: Boolean = false);
|
||||||
var
|
var
|
||||||
SelList: TPersistentSelectionList;
|
SelList: TPersistentSelectionList;
|
||||||
@ -866,16 +949,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
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;
|
procedure TfrmNavBarEd.UpdateBtnStates;
|
||||||
var
|
var
|
||||||
canChangeFolders: Boolean;
|
canChangeFolders: Boolean;
|
||||||
|
Reference in New Issue
Block a user