[453] | 1 |
|
---|
| 2 | {*****************************************************************************}
|
---|
| 3 | { }
|
---|
| 4 | { Tnt Delphi Unicode Controls }
|
---|
| 5 | { http://www.tntware.com/delphicontrols/unicode/ }
|
---|
| 6 | { Version: 2.3.0 }
|
---|
| 7 | { }
|
---|
| 8 | { Copyright (c) 2002-2007, Troy Wolbrink (troy.wolbrink@tntware.com) }
|
---|
| 9 | { }
|
---|
| 10 | {*****************************************************************************}
|
---|
| 11 |
|
---|
| 12 | unit TntDesignEditors_Design;
|
---|
| 13 |
|
---|
| 14 | {$INCLUDE ..\Source\TntCompilers.inc}
|
---|
| 15 |
|
---|
| 16 | interface
|
---|
| 17 |
|
---|
| 18 | uses
|
---|
| 19 | Classes, Forms, TypInfo, DesignIntf, DesignEditors;
|
---|
| 20 |
|
---|
| 21 | type
|
---|
| 22 | ITntDesigner = IDesigner;
|
---|
| 23 |
|
---|
| 24 | TTntDesignerSelections = class(TInterfacedObject, IDesignerSelections)
|
---|
| 25 | private
|
---|
| 26 | FList: TList;
|
---|
| 27 | {$IFDEF COMPILER_9_UP}
|
---|
| 28 | function GetDesignObject(Index: Integer): IDesignObject;
|
---|
| 29 | {$ENDIF}
|
---|
| 30 | protected
|
---|
| 31 | function Add(const Item: TPersistent): Integer;
|
---|
| 32 | function Equals(const List: IDesignerSelections): Boolean;
|
---|
| 33 | function Get(Index: Integer): TPersistent;
|
---|
| 34 | function GetCount: Integer;
|
---|
| 35 | property Count: Integer read GetCount;
|
---|
| 36 | property Items[Index: Integer]: TPersistent read Get; default;
|
---|
| 37 | public
|
---|
| 38 | constructor Create; virtual;
|
---|
| 39 | destructor Destroy; override;
|
---|
| 40 | procedure ReplaceSelection(const OldInst, NewInst: TPersistent);
|
---|
| 41 | end;
|
---|
| 42 |
|
---|
| 43 | function GetObjectInspectorForm: TCustomForm;
|
---|
| 44 | procedure EditPropertyWithDialog(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner);
|
---|
| 45 |
|
---|
| 46 | implementation
|
---|
| 47 |
|
---|
| 48 | uses
|
---|
| 49 | SysUtils;
|
---|
| 50 |
|
---|
| 51 | { TTntDesignerSelections }
|
---|
| 52 |
|
---|
| 53 | function TTntDesignerSelections.Add(const Item: TPersistent): Integer;
|
---|
| 54 | begin
|
---|
| 55 | Result := FList.Add(Item);
|
---|
| 56 | end;
|
---|
| 57 |
|
---|
| 58 | constructor TTntDesignerSelections.Create;
|
---|
| 59 | begin
|
---|
| 60 | inherited;
|
---|
| 61 | FList := TList.Create;
|
---|
| 62 | end;
|
---|
| 63 |
|
---|
| 64 | destructor TTntDesignerSelections.Destroy;
|
---|
| 65 | begin
|
---|
| 66 | FList.Free;
|
---|
| 67 | inherited;
|
---|
| 68 | end;
|
---|
| 69 |
|
---|
| 70 | function TTntDesignerSelections.Equals(const List: IDesignerSelections): Boolean;
|
---|
| 71 | var
|
---|
| 72 | I: Integer;
|
---|
| 73 | begin
|
---|
| 74 | Result := False;
|
---|
| 75 | if List.Count <> Count then Exit;
|
---|
| 76 | for I := 0 to Count - 1 do
|
---|
| 77 | begin
|
---|
| 78 | if Items[I] <> List[I] then Exit;
|
---|
| 79 | end;
|
---|
| 80 | Result := True;
|
---|
| 81 | end;
|
---|
| 82 |
|
---|
| 83 | function TTntDesignerSelections.Get(Index: Integer): TPersistent;
|
---|
| 84 | begin
|
---|
| 85 | Result := TPersistent(FList[Index]);
|
---|
| 86 | end;
|
---|
| 87 |
|
---|
| 88 | function TTntDesignerSelections.GetCount: Integer;
|
---|
| 89 | begin
|
---|
| 90 | Result := FList.Count;
|
---|
| 91 | end;
|
---|
| 92 |
|
---|
| 93 | {$IFDEF COMPILER_9_UP}
|
---|
| 94 | function TTntDesignerSelections.GetDesignObject(Index: Integer): IDesignObject;
|
---|
| 95 | begin
|
---|
| 96 | Result := nil; {TODO: Figure out what IDesignerSelections.GetDesignObject is all about. Must wait for more documentation!}
|
---|
| 97 | end;
|
---|
| 98 | {$ENDIF}
|
---|
| 99 |
|
---|
| 100 | procedure TTntDesignerSelections.ReplaceSelection(const OldInst, NewInst: TPersistent);
|
---|
| 101 | var
|
---|
| 102 | Idx: Integer;
|
---|
| 103 | begin
|
---|
| 104 | Idx := FList.IndexOf(OldInst);
|
---|
| 105 | if Idx <> -1 then
|
---|
| 106 | FList[Idx] := NewInst;
|
---|
| 107 | end;
|
---|
| 108 |
|
---|
| 109 | {//------------------------------
|
---|
| 110 | // Helpful discovery routines to explore the components and classes inside the IDE...
|
---|
| 111 | //
|
---|
| 112 | procedure EnumerateComponents(Comp: TComponent);
|
---|
| 113 | var
|
---|
| 114 | i: integer;
|
---|
| 115 | begin
|
---|
| 116 | for i := Comp.ComponentCount - 1 downto 0 do
|
---|
| 117 | MessageBoxW(0, PWideChar(WideString(Comp.Components[i].Name + ': ' + Comp.Components[i].ClassName)),
|
---|
| 118 | PWideChar(WideString(Comp.Name)), 0);
|
---|
| 119 | end;
|
---|
| 120 |
|
---|
| 121 | procedure EnumerateClasses(Comp: TComponent);
|
---|
| 122 | var
|
---|
| 123 | AClass: TClass;
|
---|
| 124 | begin
|
---|
| 125 | AClass := Comp.ClassType;
|
---|
| 126 | repeat
|
---|
| 127 | MessageBoxW(0, PWideChar(WideString(AClass.ClassName)),
|
---|
| 128 | PWideChar(WideString(Comp.Name)), 0);
|
---|
| 129 | AClass := Aclass.ClassParent;
|
---|
| 130 | until AClass = nil;
|
---|
| 131 | end;
|
---|
| 132 | //------------------------------}
|
---|
| 133 |
|
---|
| 134 | //------------------------------
|
---|
| 135 | function GetIdeMainForm: TCustomForm;
|
---|
| 136 | var
|
---|
| 137 | Comp: TComponent;
|
---|
| 138 | begin
|
---|
| 139 | Result := nil;
|
---|
| 140 | if Application <> nil then begin
|
---|
| 141 | Comp := Application.FindComponent('AppBuilder');
|
---|
| 142 | if Comp is TCustomForm then
|
---|
| 143 | Result := TCustomForm(Comp);
|
---|
| 144 | end;
|
---|
| 145 | end;
|
---|
| 146 |
|
---|
| 147 | function GetObjectInspectorForm: TCustomForm;
|
---|
| 148 | var
|
---|
| 149 | Comp: TComponent;
|
---|
| 150 | IdeMainForm: TCustomForm;
|
---|
| 151 | begin
|
---|
| 152 | Result := nil;
|
---|
| 153 | IdeMainForm := GetIdeMainForm;
|
---|
| 154 | if IdeMainForm <> nil then begin
|
---|
| 155 | Comp := IdeMainForm.FindComponent('PropertyInspector');
|
---|
| 156 | if Comp is TCustomForm then
|
---|
| 157 | Result := TCustomForm(Comp);
|
---|
| 158 | end;
|
---|
| 159 | end;
|
---|
| 160 |
|
---|
| 161 | { TPropertyEditorWithDialog }
|
---|
| 162 | type
|
---|
| 163 | TPropertyEditorWithDialog = class
|
---|
| 164 | private
|
---|
| 165 | FPropName: AnsiString;
|
---|
| 166 | procedure CheckEditProperty(const Prop: IProperty);
|
---|
| 167 | procedure EditProperty(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner);
|
---|
| 168 | end;
|
---|
| 169 |
|
---|
| 170 | procedure TPropertyEditorWithDialog.CheckEditProperty(const Prop: IProperty);
|
---|
| 171 | begin
|
---|
| 172 | if Prop.GetName = FPropName then
|
---|
| 173 | Prop.Edit;
|
---|
| 174 | end;
|
---|
| 175 |
|
---|
| 176 | procedure TPropertyEditorWithDialog.EditProperty(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner);
|
---|
| 177 | var
|
---|
| 178 | Components: IDesignerSelections;
|
---|
| 179 | begin
|
---|
| 180 | FPropName := PropName;
|
---|
| 181 | Components := TDesignerSelections.Create;
|
---|
| 182 | Components.Add(Component);
|
---|
| 183 | GetComponentProperties(Components, [tkClass], Designer, CheckEditProperty);
|
---|
| 184 | end;
|
---|
| 185 |
|
---|
| 186 | procedure EditPropertyWithDialog(Component: TPersistent; const PropName: AnsiString; const Designer: ITntDesigner);
|
---|
| 187 | begin
|
---|
| 188 | with TPropertyEditorWithDialog.Create do
|
---|
| 189 | try
|
---|
| 190 | EditProperty(Component, PropName, Designer);
|
---|
| 191 | finally
|
---|
| 192 | Free;
|
---|
| 193 | end;
|
---|
| 194 | end;
|
---|
| 195 |
|
---|
| 196 | end.
|
---|