📄 wwinspectorprop.pas
字号:
unit wwInspectorProp;
{
//
// Components : Design-time property editors for inspector
//
// Copyright (c) 1999-2001 by Woll2Woll Software
//
// 2/8/2000 - Repaint inspector after move
}
{$i wwIfDef.pas}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ComCtrls, ExtCtrls,
{$ifdef wwdelphi6up}
designintf, designeditors,
{$else}
dsgnintf,
{$endif}
checklst,
Mask, wwdbedit, Wwdotdot, Wwdbcomb, wwdatainspector;
type
TInspectorPropEdit = class(TForm)
Panel2: TPanel;
NewItemButton: TSpeedButton;
NewSubItemButton: TSpeedButton;
DeleteButton: TSpeedButton;
MoveUpButton: TSpeedButton;
MoveDownButton: TSpeedButton;
Button5: TButton;
procedure NewItemButtonClick(Sender: TObject);
procedure NewSubitemButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure MoveButtonClick(Sender: TObject);
procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure DeleteButtonClick(Sender: TObject);
procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
procedure TreeViewExpanded(Sender: TObject; Node: TTreeNode);
procedure TreeViewCollapsed(Sender: TObject; Node: TTreeNode);
procedure TreeViewCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure Button5Click(Sender: TObject);
private
TreeView: TTreeView;
// DesignerForm: TCustomForm;
Designer:
{$ifdef wwDelphi6Up} IDesigner;
{$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
{$endif}
// {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
Inspector: TwwDataInspector;
SkipUpdate: boolean;
SkipChange: boolean;
procedure AddChildrenToTree(ParentNode: TTreeNode; Items: TwwInspectorCollection);
procedure AddChildrenToInspector(ParentNode: TTreeNode; ParentItem: TwwInspectorItem);
// procedure UpdateComponent;
procedure RefreshNodeText(ParentNode: TTreeNode);
public
destructor Destroy; override;
procedure Update; override;
{ Public declarations }
end;
Function ExecuteInspectorEditor(
ADesigner:
// {$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
{$ifdef wwDelphi6Up} IDesigner;
{$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
{$endif}
// ADesignerForm: TCustomForm;
AEdit: TwwDataInspector): boolean;
var
InspectorPropEdit: TInspectorPropEdit=nil;
implementation
{$R *.DFM}
uses typinfo, wwcommon, wwprpfld, db;
type
TObjTreeView=class(TTreeView)
private
LastSelectedNode: TTreeNode;
MultiSelectActive: boolean;
protected
procedure UnselectAllNodes(IgnoreNode: TTreeNode);
function CreateNode: TTreeNode; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
Function MultiSelectCount: integer;
function NumChildren: integer;
end;
TObjTreeNode=class(TTreeNode)
public
Caption: string;
ObjItem: TwwInspectorItem;
MultiSelected: boolean;
constructor Create(AOwner: TTreeNodes); virtual;
destructor Destroy; override;
procedure InvalidateNode;
end;
constructor TObjTreeNode.Create(AOwner: TTreeNodes);
begin
inherited Create(AOwner);
end;
destructor TObjTreeNode.Destroy;
begin
if TObjTreeView(TreeView).LastSelectedNode= self then
TObjTreeView(TreeView).LastSelectedNode:= nil;
inherited Destroy;
end;
procedure TObjTreeNode.InvalidateNode;
var r: TRect;
begin
R := DisplayRect(False);
InvalidateRect(TreeView.handle, @R, True);
end;
function ExecuteInspectorEditor(
ADesigner: //{$ifdef wwDelphi4Up}IFormDesigner{$else}TFormDesigner{$endif};
{$ifdef wwDelphi6Up} IDesigner;
{$else} {$ifdef wwDelphi4Up} IFormDesigner; {$else} TFormDesigner; {$endif}
{$endif}
// ADesignerForm: TCustomForm;
AEdit: TwwDataInspector): boolean;
begin
if InspectorPropEdit <> nil then InspectorPropEdit.Free;
InspectorPropEdit := TInspectorPropEdit.Create(Application);
with InspectorPropEdit do
begin
// DesignerForm:= ADesignerForm;
Designer:= ADesigner;
Inspector:= AEdit;
Inspector.Designer := InspectorPropEdit;
AddChildrenToTree(nil, Inspector.Items);
Show;
end;
result:= true;
end;
Function TObjTreeView.MultiSelectCount: integer;
var count: Integer;
Node: TObjTreeNode;
begin
count:= 0;
Node:= Items.GetFirstNode as TObjTreeNode;
while Node<>nil do begin
if Node.MultiSelected then inc(count);
Node:= Node.GetNext as TObjTreeNode;
end;
result:= count;
end;
procedure TObjTreeView.UnselectAllNodes(IgnoreNode: TTreeNode);
var Node: TObjTreeNode;
begin
Node:= Items.GetFirstNode as TObjTreeNode;
while Node<>nil do begin
if Node<>IgnoreNode then
begin
if Node.MultiSelected then begin
Node.MultiSelected:= false;
Node.InvalidateNode;
end
end;
Node:= Node.GetNext as TObjTreeNode;
end;
end;
procedure TInspectorPropEdit.TreeViewCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if (Node as TObjTreeNode).multiselected then
begin
Sender.Canvas.Brush.Color:= clHighlight;
Sender.Canvas.Font.Color:= clHighlightText;
end
else if Node.Selected and (TreeView as TObjTreeView).MultiSelectActive then
begin
Sender.Canvas.Brush.Color:= clWindow;
Sender.Canvas.Font.Color:= clWindowText;
end;
// Sender.Canvas.Font.assign(TObjTreeView(sender).Font);
end;
procedure TObjTreeView.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var Node, CurNode, LastNode: TObjTreeNode;
hitTest: THitTests;
{$ifdef wwDelphi5Up}
Selections: IDesignerSelections;
{$else}
Selections: TComponentList;
{$endif}
Function SameLevelShiftSelect: boolean;
begin
result:=
(ssShift in Shift) and
((LastSelectedNode<>Nil) and (LastSelectedNode.parent=Node.parent) or
(LastSelectedNode=Nil))
end;
procedure AddSelections;
var Node: TObjTreeNode;
begin
Node:= Items.GetFirstNode as TObjTreeNode;
while Node<>nil do begin
if Node.MultiSelected then begin
{$ifdef wwDelphi6Up}
Selections.Add(Node.ObjItem);
{$else}
{$ifdef wwDelphi5Up}
Selections.Add(MakeIPersistent(Node.ObjItem));
{$else}
Selections.Add(Node.ObjItem);
{$endif}
{$endif}
end;
Node:= Node.GetNext as TObjTreeNode;
end;
end;
begin
inherited MouseDown(Button, Shift, X, Y);
Node:= GetNodeAt(X, Y) as TObjTreeNode;
if Node=Nil then exit;
hitTest:= GetHitTestInfoAt(X, Y);
if (ssDouble in Shift) and (Button = mbLeft) then Exit;
If (hitTest * [htOnItem, htOnLabel, htOnRight] <> []) then
begin
if (not (ssCtrl in Shift)) then
begin
if SameLevelShiftSelect then begin
UnselectAllNodes(LastSelectedNode)
end
else
UnselectAllNodes(nil);
end;
if (ssShift in Shift) then begin
if SamelevelShiftSelect and (LastSelectedNode<>nil) then begin
if Node.index>LastSelectedNode.index then begin
curNode:= LastSelectedNode as TObjTreeNode;
curNode.multiselected:= true;
LastNode:= Node;
while curNode<>LastNode do begin
curNode:= curNode.GetNextSibling as TObjTreeNode;
if curNode=Nil then break;
curNode.multiselected:= true;
MultiSelectActive:= True;
invalidate;
end;
end
else begin
curNode:= Node;
LastNode:= LastSelectedNode as TObjTreeNode;
while curNode<>LastNode do begin
curNode.multiselected:= true;
MultiSelectActive:= True;
invalidate;
curNode:= curNode.GetNextSibling as TObjTreeNode;
if curNode=Nil then break;
end;
if curNode=LastNode then curNode.multiselected:= true;
end;
if not node.selected then node.selected:= True;
end
end
else begin
if Node<>nil then
with Node as TObjTreeNode do begin
if ssCtrl in Shift then
begin
MultiSelectActive:= True;
{ Select previous node if no previous selections }
if (LastSelectedNode<>nil) and
not (LastSelectedNode as TObjTreeNode).MultiSelected and
(MultiSelectCount=0) then
(LastSelectedNode as TObjTreeNode).multiSelected:= True;
Node.MultiSelected:= not Node.MultiSelected;
invalidate;
end;
if not node.selected then node.selected:= True;
end;
end;
end;
if not (ssShift in Shift) then
LastSelectedNode:= Node;
if MultiSelectActive then
begin
if (Owner as TInspectorPropEdit).Designer<>nil then begin
{$ifndef wwDelphi5Up}
Selections := TComponentList.Create;
{$else}
Selections := CreateSelectionList;
{$endif}
AddSelections;
if Selections.Count > 0 then
(Owner as TInspectorPropEdit).Designer.SetSelections(Selections);
{$ifndef wwDelphi5Up}
Selections.Free;
{$endif}
end;
end
end;
destructor TInspectorPropEdit.Destroy;
begin
Inspector.Designer := nil;
InspectorPropEdit:= nil;
inherited Destroy;
end;
(*procedure TInspectorPropEdit.UpdateComponent;
var i: integer;
Node: TObjTreeNode;
Item: TwwInspectorItem;
begin
SkipUpdate:= True;
Inspector.BeginUpdate;
for i:= Inspector.Items.Count-1 downto 0 do
Inspector.Items[i].Free;
Node := TObjTreeNode(TreeView.Items.GetFirstNode);
while Node <> nil do
begin
Item:= TwwInspectorItem.create(Inspector.Items);
AddChildrenToInspector(Node, Item);
Node := TObjTreeNode(Node.GetNextSibling);
end;
SkipUpdate:= False;
Inspector.EndUpdate;
end;
*)
function TObjTreeView.CreateNode: TTreeNode;
begin
Result := TObjTreeNode.Create(Items);
end;
function TObjTreeView.NumChildren: integer;
var Node: TTreeNode;
count: Integer;
begin
Node := Items.GetFirstNode;
count:= 0;
while Node <> nil do
begin
inc(count);
Node := Node.GetNextSibling;
end;
result:= count;
end;
{ Update displaynames for each node in tree }
procedure TInspectorPropEdit.RefreshNodeText(ParentNode: TTreeNode);
var Node: TTreeNode;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -