LCL: New layout for the TreeView component editor, issue #40748, patch "3_treeeditor_editing" by n7800

This commit is contained in:
wp_xyz 2024-02-20 18:39:18 +01:00
parent 43f05f787a
commit fc844f5fc1
2 changed files with 76 additions and 11 deletions

View File

@ -3,7 +3,7 @@ object TreeViewItemsEditorForm: TTreeViewItemsEditorForm
Height = 326 Height = 326
Top = 230 Top = 230
Width = 635 Width = 635
ActiveControl = btnNewItem ActiveControl = treEditor
BorderIcons = [biSystemMenu, biHelp] BorderIcons = [biSystemMenu, biHelp]
Caption = 'TreeView Items Editor' Caption = 'TreeView Items Editor'
ClientHeight = 326 ClientHeight = 326
@ -43,9 +43,9 @@ object TreeViewItemsEditorForm: TTreeViewItemsEditorForm
BorderSpacing.Top = 5 BorderSpacing.Top = 5
BorderSpacing.Bottom = 5 BorderSpacing.Bottom = 5
HideSelection = False HideSelection = False
ReadOnly = True
TabOrder = 0 TabOrder = 0
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips] Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips]
OnEditingEnd = treEditorEditingEnd
OnSelectionChanged = treEditorSelectionChanged OnSelectionChanged = treEditorSelectionChanged
end end
object btnNewItem: TButton object btnNewItem: TButton

View File

@ -58,6 +58,8 @@ type
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure btnMoveClick(Sender: TObject); procedure btnMoveClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure treEditorEditingEnd(Sender: TObject; Node: TTreeNode;
Cancel: Boolean);
procedure treEditorSelectionChanged(Sender: TObject); procedure treEditorSelectionChanged(Sender: TObject);
procedure btnApplyClick(Sender: TObject); procedure btnApplyClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject); procedure btnDeleteClick(Sender: TObject);
@ -70,6 +72,8 @@ type
procedure SaveToTree; procedure SaveToTree;
procedure UpdateEnabledStates; procedure UpdateEnabledStates;
procedure UpdateImageHints; procedure UpdateImageHints;
procedure FinishNodeEditing;
procedure CancelNodeEditing;
end; end;
{ TTreeViewItemsProperty } { TTreeViewItemsProperty }
@ -161,6 +165,8 @@ begin
// form actions // form actions
if (Key = VK_RETURN) and (Shift = [ssCtrl]) then if (Key = VK_RETURN) and (Shift = [ssCtrl]) then
begin begin
FinishNodeEditing;
ModalResult := mrOK; ModalResult := mrOK;
Key := 0; Key := 0;
end end
@ -171,11 +177,12 @@ begin
end end
else if (Key = VK_ESCAPE) and (Shift = []) then else if (Key = VK_ESCAPE) and (Shift = []) then
begin begin
if not treEditor.IsEditing then // pressing [Esc] in an open editor cancel text editing
begin if treEditor.IsEditing then
CancelNodeEditing
else
ModalResult := mrCancel; ModalResult := mrCancel;
Key := 0; Key := 0;
end;
end end
// create item // create item
else if (Key = VK_N) and (Shift = [ssCtrl]) then else if (Key = VK_N) and (Shift = [ssCtrl]) then
@ -210,6 +217,25 @@ begin
btnMoveClick(btnMoveUp); // "Sender" is the pressed button btnMoveClick(btnMoveUp); // "Sender" is the pressed button
Key := 0; Key := 0;
end end
// move selection
else if (Key in [VK_DOWN, VK_UP]) and (Shift = []) then
begin
if treEditor.IsEditing then
begin
// close text editor
FinishNodeEditing;
// select next
if Key = VK_DOWN then
treEditor.MoveToNextNode(true)
else
treEditor.MoveToPrevNode(true);
// open text editor
if Assigned(treEditor.Selected) then
treEditor.Selected.EditText;
Key := 0;
end;
end
// save and load in/from file // save and load in/from file
else if (Key = VK_S) and (Shift = [ssCtrl]) then else if (Key = VK_S) and (Shift = [ssCtrl]) then
begin begin
@ -223,10 +249,32 @@ begin
end; end;
end; end;
procedure TTreeViewItemsEditorForm.treEditorEditingEnd(Sender: TObject;
Node: TTreeNode; Cancel: Boolean);
begin
// this event can be fired when edtNodeText has already been released
if csDestroying in ComponentState then exit;
if Assigned(treEditor.Selected) then
begin
// remove event to avoid cyclic calling
edtNodeText.OnChange := nil;
try
// update text
edtNodeText.Text := treEditor.Selected.Text;
finally
// restore event
edtNodeText.OnChange := @edtNodeTextChange;
end;
end;
end;
procedure TTreeViewItemsEditorForm.btnNewItemClick(Sender: TObject); procedure TTreeViewItemsEditorForm.btnNewItemClick(Sender: TObject);
var var
lNewName: String; lNewName: String;
begin begin
FinishNodeEditing;
lNewName := sccsTrEdtItem + IntToStr(treEditor.Items.Count); lNewName := sccsTrEdtItem + IntToStr(treEditor.Items.Count);
if Sender = btnNewItem then if Sender = btnNewItem then
treEditor.Selected := treEditor.Items.Add(treEditor.Selected, lNewName) treEditor.Selected := treEditor.Items.Add(treEditor.Selected, lNewName)
@ -235,10 +283,7 @@ begin
else else
raise Exception.Create('[btnNewItemClick] Unknown Sender'); raise Exception.Create('[btnNewItemClick] Unknown Sender');
//grpNodeEditor.Enabled := treEditor.Items.Count > 0; UpdateEnabledStates;
edtNodeText.SetFocus;
//edtNodeText.SelectAll;
end; end;
procedure TTreeViewItemsEditorForm.edtNodeTextChange(Sender: TObject); procedure TTreeViewItemsEditorForm.edtNodeTextChange(Sender: TObject);
@ -251,6 +296,8 @@ procedure TTreeViewItemsEditorForm.btnMoveClick(Sender: TObject);
var var
lCurNode: TTreeNode; lCurNode: TTreeNode;
begin begin
FinishNodeEditing;
lCurNode := treEditor.Selected; lCurNode := treEditor.Selected;
if lCurNode = nil then exit; if lCurNode = nil then exit;
@ -304,6 +351,8 @@ end;
procedure TTreeViewItemsEditorForm.btnApplyClick(Sender: TObject); procedure TTreeViewItemsEditorForm.btnApplyClick(Sender: TObject);
begin begin
FinishNodeEditing;
SaveToTree; SaveToTree;
end; end;
@ -334,6 +383,8 @@ end;
procedure TTreeViewItemsEditorForm.btnLoadClick(Sender: TObject); procedure TTreeViewItemsEditorForm.btnLoadClick(Sender: TObject);
begin begin
FinishNodeEditing;
if dlgOpen.Execute then if dlgOpen.Execute then
begin begin
treEditor.LoadFromFile(dlgOpen.FileName); treEditor.LoadFromFile(dlgOpen.FileName);
@ -381,6 +432,8 @@ procedure TTreeViewItemsEditorForm.btnSaveClick(Sender: TObject);
end; end;
// //
begin begin
FinishNodeEditing;
if ConfirmImagesLoss and dlgSave.Execute and ConfirmReplace then if ConfirmImagesLoss and dlgSave.Execute and ConfirmReplace then
treEditor.SaveToFile(dlgSave.FileName); treEditor.SaveToFile(dlgSave.FileName);
@ -453,6 +506,18 @@ begin
end; end;
end; end;
procedure TTreeViewItemsEditorForm.FinishNodeEditing;
begin
if treEditor.Items.Count > 0 then
treEditor.Items[0].EndEdit(false);
end;
procedure TTreeViewItemsEditorForm.CancelNodeEditing;
begin
if treEditor.Items.Count > 0 then
treEditor.Items[0].EndEdit(true);
end;
procedure TTreeViewItemsEditorForm.LoadFromTree(aTreeView: TCustomTreeView); procedure TTreeViewItemsEditorForm.LoadFromTree(aTreeView: TCustomTreeView);
begin begin
fTreeView := aTreeView; fTreeView := aTreeView;