📄 jvqtreeitemseditorform.pas
字号:
tvItems.Selected.Delete;
edNodeText.Text := '';
if N <> nil then
begin
N.MakeVisible;
N.Selected := True;
end;
finally
edNodeText.OnChange := edNodeTextChange;
tvItems.OnChange := tvItemsChange;
end;
end;
procedure TfrmTreeViewItems.acItemsUpdate(Action: TBasicAction; var Handled: Boolean);
var
bSel: Boolean;
nSel: TTreeNode;
begin
bSel := tvItems.Selected <> nil;
nSel := tvItems.Selected;
acNewSubItem.Enabled := bSel;
acDelete.Enabled := bSel;
acNodeMoveLeft.Enabled := bSel and (nSel.Parent <> nil);
acNodeMoveRight.Enabled := bSel and (nSel.getPrevSibling <> nil);
acNodeMoveUp.Enabled := bSel and ((nSel.getPrevSibling <> nil) or (nSel.Parent <> nil));
acNodeMoveDown.Enabled := bSel and ((nSel.getNextSibling <> nil) or (nSel.Parent <> nil));
end;
class function TfrmTreeViewItems.Edit(TreeView: TCustomTreeView): Boolean;
const
cNegItem = '-1';
var
F: TfrmTreeViewItems;
IL: TCustomImageList;
I: Integer;
begin
// keep in mind that Self is class here not object
F := Self.Create(Application);
try
F.FTreeView := TreeView;
F.tvItems.Items.Assign(THackTreeView(TreeView).Items);
IL := THackTreeView(TreeView).Images;
if IL <> nil then
begin
F.cbImage.Style := csOwnerDrawFixed;
F.cbSelected.Style := csOwnerDrawFixed;
F.cbImage.ItemHeight := IL.Height;
F.cbSelected.ItemHeight := IL.Height;
F.cbImage.Items.Add(cNegItem);
F.cbSelected.Items.Add(cNegItem);
for I := 0 to IL.Count - 1 do
begin
F.cbImage.Items.Add(IntToStr(I));
F.cbSelected.Items.Add(IntToStr(I));
end;
F.cbImage.Tag := Integer(IL);
F.cbSelected.Tag := Integer(IL);
end;
F.cbSelected.ItemIndex := 0;
F.cbSelected.ItemIndex := 0;
F.cbState.ItemIndex := 0;
F.tvItems.FullExpand;
if F.tvItems.Items.Count > 0 then
F.tvItems.Items.GetFirstNode.MakeVisible;
Result := F.ShowModal = mrOk;
if Result then
THackTreeView(TreeView).Items.Assign(F.tvItems.Items);
finally
F.Free;
end;
end;
procedure TfrmTreeViewItems.cbImageIndexDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
DrawOffset, DrawIndex: Integer;
IL: TImageList;
CB: TComboBox;
begin
CB := TComboBox(Control);
IL := TImageList(CB.Tag);
DrawIndex := Index - 1;
DrawOffset := 2;
CB.Canvas.FillRect(Rect);
if IL <> nil then
begin
IL.Draw(CB.Canvas, Rect.Left + 2, Rect.Top, DrawIndex);
DrawOffset := IL.Width + 2;
end;
Rect.Left := Rect.Left + DrawOffset;
DrawText(CB.Canvas.Handle, PChar(Format('%d', [DrawIndex])), -1, Rect,
DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
end;
procedure TfrmTreeViewItems.cbStateDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
DrawOffset, DrawIndex: Integer;
IL: TImageList;
CB: TComboBox;
begin
CB := TComboBox(Control);
IL := TImageList(CB.Tag);
DrawIndex := Index - 1;
DrawOffset := 2;
CB.Canvas.FillRect(Rect);
// state images are *one*-based, so we don't draw the 0'th image
// to remind the user about this fact...
if IL <> nil then
begin
if DrawIndex > 0 then
IL.Draw(CB.Canvas, Rect.Left + 2, Rect.Top, DrawIndex);
DrawOffset := IL.Width + 2;
end;
Rect.Left := Rect.Left + DrawOffset;
DrawText(CB.Canvas.Handle, PChar(Format('%d', [DrawIndex])), -1, Rect,
DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
end;
//=== { TJvTreeItemsProperty } ===============================================
procedure TJvTreeItemsProperty.Edit;
begin
TfrmTreeViewItems.Edit(TCustomTreeView(GetComponent(0)));
end;
function TJvTreeItemsProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
//=== { TJvTreeViewEditor } ==================================================
procedure TJvTreeViewEditor.Edit;
begin
ExecuteVerb(0);
end;
procedure TJvTreeViewEditor.ExecuteVerb(Index: Integer);
begin
if Index = 0 then
ShowTreeNodeEditor(TCustomTreeView(Component))
else
inherited ExecuteVerb(Index);
end;
function TJvTreeViewEditor.GetVerb(Index: Integer): string;
begin
if Index = 0 then
Result := RsItemsEditorEllipsis
else
Result := '';
end;
function TJvTreeViewEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
//=== { TfrmTreeViewItems } ==================================================
procedure TfrmTreeViewItems.acNodeMoveUpExecute(Sender: TObject);
begin
with tvItems.Selected do
begin
if getPrevSibling <> nil then
MoveTo(getPrevSibling, naInsert)
else
if Parent <> nil then
MoveTo(Parent, naInsert);
end;
tvItems.FullExpand;
end;
procedure TfrmTreeViewItems.acNodeMoveDownExecute(Sender: TObject);
var N:TTreeNode;
begin
with tvItems.Selected do
begin
if getNextSibling <> nil then
getNextSibling.MoveTo(tvItems.Selected, naInsert)
else
if Parent <> nil then
begin
N := Parent;
MoveTo(Parent, naInsert);
N.MoveTo(tvItems.Selected, naInsert);
end;
end;
tvItems.FullExpand;
end;
procedure TfrmTreeViewItems.acNodeMoveRightExecute(Sender: TObject);
begin
with tvItems.Selected do
MoveTo(getPrevSibling, naAddChild);
tvItems.FullExpand;
end;
procedure TfrmTreeViewItems.acNodeMoveLeftExecute(Sender: TObject);
var N:TTreeNode;
begin
with tvItems.Selected do
begin
N := Parent;
MoveTo(Parent, naInsert);
N.MoveTo(tvItems.Selected, naInsert);
end;
tvItems.FullExpand;
end;
procedure TfrmTreeViewItems.tvItemsStartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
FDragNode := tvItems.Selected;
end;
procedure TfrmTreeViewItems.tvItemsDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
N: TTreeNode;
begin
N := tvItems.GetNodeAt(X,Y);
Accept := (Source = Sender) and (FDragNode <> nil) and (N <> FDragNode);
if (N <> nil) and N.HasChildren and not N.Expanded then
N.Expand(False);
end;
procedure TfrmTreeViewItems.tvItemsDragDrop(Sender, Source: TObject;
X, Y: Integer);
var
N: TTreeNode;
begin
if FDragNode = nil then
Exit;
N := tvItems.GetNodeAt(X,Y);
if N = nil then
FDragNode.MoveTo(tvItems.Items.GetFirstNode, naAdd)
else
FDragNode.MoveTo(N, naAddChildFirst);
FDragNode := nil;
tvItems.FullExpand;
end;
procedure TfrmTreeViewItems.acLoadFromFileExecute(Sender: TObject);
begin
if OpenDialog1.Execute then
tvItems.LoadFromFile(OpenDialog1.Filename);
end;
procedure TfrmTreeViewItems.acSaveToFileExecute(Sender: TObject);
begin
if SaveDialog1.Execute then
tvItems.SaveToFile(SaveDialog1.Filename);
end;
//=== { TJvPageTreeViewEditor } ==============================================
procedure TJvPageTreeViewEditor.ExecuteVerb(Index: Integer);
begin
if Index = 1 then
ShowPageLinkEditor(TJvCustomPageListTreeView(Component))
else
inherited ExecuteVerb(Index);
end;
function TJvPageTreeViewEditor.GetVerb(Index: Integer): string;
begin
if Index = 1 then
Result := RsLinksEditorEllipsis
else
Result := inherited GetVerb(Index);
end;
function TJvPageTreeViewEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -