Pgmngred.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:12k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1996 AO ROSNO                   }
  6. {                                                       }
  7. {*******************************************************}
  8. unit PgMngrEd;
  9. {$I RX.INC}
  10. interface
  11. uses
  12. {$IFDEF WIN32}
  13.   Windows,
  14. {$ELSE}
  15.   WinTypes, WinProcs,
  16. {$ENDIF}
  17.   SysUtils, Messages, Classes, Graphics, Controls, Forms, Dialogs, Grids,
  18.   RTLConsts, DesignIntf, DesignEditors, VCLEditors, PageMngr, StdCtrls, Placemnt, ExtCtrls,
  19.   VCLUtils, DesignWindows;
  20. type
  21.   TProxyEditor = class(TDesignWindow)
  22.     FormStorage: TFormStorage;
  23.     BtnPanel: TPanel;
  24.     CloseBtn: TButton;
  25.     DeleteBtn: TButton;
  26.     ProxyGrid: TDrawGrid;
  27.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  28.     procedure FormShow(Sender: TObject);
  29.     procedure ProxyGridDrawCell(Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState);
  30.     procedure ProxyGridSelectCell(Sender: TObject; Col, Row: Longint; var CanSelect: Boolean);
  31.     procedure CloseBtnClick(Sender: TObject);
  32.     procedure DeleteBtnClick(Sender: TObject);
  33.     procedure ProxyGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  34.     procedure FormResize(Sender: TObject);
  35.     procedure FormCreate(Sender: TObject);
  36.   private
  37.     FPageManager: TPageManager;
  38.     FDeleting: Boolean;
  39.     procedure SetPageManager(Value: TPageManager);
  40.     function GetForm: TCustomForm;
  41.     procedure UpdateData;
  42.     function CheckPageManager: Boolean;
  43.     procedure SelectProxy(Proxy: TPageProxy);
  44.     function ProxyByRow(Row: Integer): TPageProxy;
  45.   protected
  46.     function UniqueName(Component: TComponent): string; override;
  47.     procedure Activated; override;
  48.   public
  49.     procedure NameProxy(Sender: TObject);
  50.     procedure ItemsModified(const Designer: IDesigner); override;
  51.     procedure DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean); override;
  52.     function GetEditState: TEditState; override;
  53.     procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); override;
  54.     property PageManager: TPageManager read FPageManager write SetPageManager;
  55.     property OwnerForm: TCustomForm read GetForm;
  56.   end;
  57. { TProxyListProperty }
  58.   TProxyListProperty = class(TPropertyEditor)
  59.     function GetAttributes: TPropertyAttributes; override;
  60.     function GetValue: string; override;
  61.     procedure Edit; override;
  62.   end;
  63. { TPageManagerEditor }
  64.   TPageManagerEditor = class(TComponentEditor)
  65.     procedure ExecuteVerb(Index: Integer); override;
  66.     function GetVerb(Index: Integer): string; override;
  67.     function GetVerbCount: Integer; override;
  68.   end;
  69. { TPageNameProperty }
  70.   TPageNameProperty = class(TStringProperty)
  71.     function GetAttributes: TPropertyAttributes; override;
  72.     procedure GetValues(Proc: TGetStrProc); override;
  73.   end;
  74. { TPageBtnProperty }
  75.   TPageBtnProperty = class(TComponentProperty)
  76.     procedure GetValues(Proc: TGetStrProc); override;
  77.   end;
  78. implementation
  79. uses Consts, Buttons, RxCtrls, RXConst, RXLConst, RxDsgn;
  80. {$R *.DFM}
  81. {$IFDEF WIN32}
  82.  {$D-}
  83. {$ENDIF}
  84. {$IFDEF RX_D4}
  85. type
  86.   TDesigner = IDesigner;
  87.   TFormDesigner = IDesigner;
  88. {$ENDIF}
  89. function FindEditor(Manager: TPageManager): TProxyEditor;
  90. var
  91.   I: Integer;
  92. begin
  93.   Result := nil;
  94.   for I := 0 to Screen.FormCount - 1 do begin
  95.     if Screen.Forms[I] is TProxyEditor then begin
  96.       if TProxyEditor(Screen.Forms[I]).PageManager = Manager then
  97.       begin
  98.         Result := TProxyEditor(Screen.Forms[I]);
  99.         Break;
  100.       end;
  101.     end;
  102.   end;
  103. end;
  104. procedure ShowProxyEditor(Designer: TDesigner; Manager: TPageManager);
  105. var
  106.   Editor: TProxyEditor;
  107. begin
  108.   if Manager = nil then Exit;
  109.   Editor := FindEditor(Manager);
  110.   if Editor <> nil then begin
  111.     Editor.Show;
  112.     if Editor.WindowState = wsMinimized then Editor.WindowState := wsNormal;
  113.   end
  114.   else begin
  115.     Editor := TProxyEditor.Create(Application);
  116.     try
  117.       Editor.Designer := TFormDesigner(Designer);
  118.       Editor.PageManager := Manager;
  119.       Editor.Show;
  120.     except
  121.       Editor.Free;
  122.       raise;
  123.     end;
  124.   end;
  125. end;
  126. { TProxyListProperty }
  127. function TProxyListProperty.GetAttributes: TPropertyAttributes;
  128. begin
  129.   Result := [paDialog, paReadOnly];
  130. end;
  131. function TProxyListProperty.GetValue: string;
  132. var
  133.   List: TList;
  134. begin
  135.   List := TList(Pointer(GetOrdValue));
  136.   if (List = nil) or (List.Count = 0) then
  137.     Result := ResStr(srNone)
  138.   else FmtStr(Result, '(%s)', [GetPropType^.Name]);
  139. end;
  140. procedure TProxyListProperty.Edit;
  141. begin
  142.   ShowProxyEditor(Designer, TPageManager(GetComponent(0)));
  143. end;
  144. { TPageBtnProperty }
  145. procedure TPageBtnProperty.GetValues(Proc: TGetStrProc);
  146. var
  147.   I: Integer;
  148.   Component: TComponent;
  149. begin
  150.   for I := 0 to Designer.Root.ComponentCount - 1 do begin
  151.     Component := Designer.Root.Components[I];
  152.     if (Component.InheritsFrom(TButtonControl) or 
  153.       Component.InheritsFrom(TSpeedButton) or 
  154.       Component.InheritsFrom(TRxSpeedButton)) and 
  155.       (Component.Name <> '') then Proc(Component.Name);
  156.   end;
  157. end;
  158. { TPageNameProperty }
  159. function TPageNameProperty.GetAttributes: TPropertyAttributes;
  160. begin
  161.   Result := [paValueList];
  162. end;
  163. procedure TPageNameProperty.GetValues(Proc: TGetStrProc);
  164. var
  165.   PageProxy: TPageProxy;
  166.   I: Integer;
  167. begin
  168.   PageProxy := GetComponent(0) as TPageProxy;
  169.   if (PageProxy <> nil) and (PageProxy.PageManager <> nil) and
  170.     (PageProxy.PageManager.PageOwner <> nil) then
  171.   begin
  172.     for I := 0 to PageProxy.PageManager.PageCount - 1 do begin
  173.       Proc(PageProxy.PageManager.PageNames[I]);
  174.     end;
  175.   end;
  176. end;
  177. { TPageManagerEditor }
  178. procedure TPageManagerEditor.ExecuteVerb(Index: Integer);
  179. begin
  180.   case Index of
  181.     0: ShowProxyEditor(Designer, TPageManager(Component));
  182.   end;
  183. end;
  184. function TPageManagerEditor.GetVerb(Index: Integer): string;
  185. begin
  186.   case Index of
  187.     0: Result := LoadStr(srProxyEditor);
  188.   end;
  189. end;
  190. function TPageManagerEditor.GetVerbCount: Integer;
  191. begin
  192.   Result := 1;
  193. end;
  194. { TProxyEditor }
  195. procedure TProxyEditor.SetPageManager(Value: TPageManager);
  196. begin
  197.   if FPageManager <> Value then begin
  198.     if FPageManager <> nil then FPageManager.OnCheckProxy := nil;
  199.     FPageManager := Value;
  200.     if FPageManager <> nil then FPageManager.OnCheckProxy := NameProxy;
  201.     UpdateData;
  202.   end;
  203. end;
  204. function TProxyEditor.UniqueName(Component: TComponent): string;
  205. var
  206.   Temp: string;
  207. {$IFNDEF WIN32}
  208.   I: Integer;
  209.   Comp: TComponent;
  210. {$ENDIF}
  211. begin
  212.   Result := '';
  213.   if (Component <> nil) then Temp := Component.ClassName
  214.   else Temp := TPageProxy.ClassName;
  215.   if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
  216.     System.Delete(Temp, 1, 1);
  217. {$IFDEF WIN32}
  218.   Result := Designer.UniqueName(Temp);
  219. {$ELSE}
  220.   I := 1;
  221.   repeat
  222.     Result := Temp + IntToStr(I);
  223.     Comp := OwnerForm.FindComponent(Result);
  224.     Inc(I);
  225.   until (Comp = nil) or (Comp = Component);
  226. {$ENDIF}
  227. end;
  228. function TProxyEditor.GetEditState: TEditState;
  229. begin
  230.   Result := [];
  231. end;
  232. procedure TProxyEditor.NameProxy(Sender: TObject);
  233. begin
  234.   if (Sender is TPageProxy) and (TPageProxy(Sender).Name = '') then
  235.     TPageProxy(Sender).Name := UniqueName(TPageProxy(Sender));
  236. end;
  237. procedure TProxyEditor.DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean);
  238. begin
  239.   if Designer.Root = OwnerForm then Free;
  240. end;
  241. procedure TProxyEditor.ItemsModified(const Designer: IDesigner);
  242. begin
  243.   if not (csDestroying in ComponentState) then UpdateData;
  244. end;
  245. procedure TProxyEditor.Activated;
  246. begin
  247.   SelectProxy(ProxyByRow(ProxyGrid.Row - 1));
  248. end;
  249. procedure TProxyEditor.ItemDeleted(const ADesigner: IDesigner; Item: TPersistent);
  250. begin
  251.   if Item = FPageManager then begin
  252.     FPageManager := nil;
  253.     Close;
  254.   end;
  255. end;
  256. procedure TProxyEditor.UpdateData;
  257. var
  258.   ProxyCount: Integer;
  259. begin
  260.   if CheckPageManager then begin
  261.     if not FDeleting then FPageManager.Resync;
  262.     ProxyCount := FPageManager.PageProxies.Count;
  263.     if ProxyCount = 0 then begin
  264.       ProxyGrid.RowCount := 2;
  265.       SelectProxy(nil);
  266.     end
  267.     else begin
  268.       ProxyGrid.RowCount := 1 + ProxyCount;
  269.     end;
  270.     DeleteBtn.Enabled := ProxyCount > 0;
  271.     ProxyGrid.Invalidate;
  272.   end;
  273. end;
  274. function TProxyEditor.GetForm: TCustomForm;
  275. begin
  276.   Result := GetParentForm(BtnPanel); //Designer.Form;
  277. end;
  278. procedure TProxyEditor.FormClose(Sender: TObject; var Action: TCloseAction);
  279. begin
  280.   Action := caFree;
  281.   if FPageManager <> nil then FPageManager.OnCheckProxy := nil;
  282. end;
  283. procedure TProxyEditor.FormShow(Sender: TObject);
  284. begin
  285.   if FPageManager.PageOwner <> nil then begin
  286.     Caption := Format(LoadStr(srPageProxies), [FPageManager.PageOwner.Name]);
  287.   end;
  288. end;
  289. function TProxyEditor.CheckPageManager: Boolean;
  290. begin
  291.   Result := (FPageManager <> nil) and (FPageManager.Owner <> nil) and
  292.     (Designer.Root <> nil);
  293. end;
  294. procedure TProxyEditor.SelectProxy(Proxy: TPageProxy);
  295. var
  296.   FComponents: IDesignerSelections;
  297. begin
  298.   if CheckPageManager and Active then begin
  299.     FComponents := CreateSelectionList;
  300.     if Proxy <> nil then
  301.       FComponents.Add(Proxy)
  302.     else
  303.       FComponents.Add(FPageManager);
  304.     SetSelection(FComponents);
  305.   end;
  306. end;
  307. function TProxyEditor.ProxyByRow(Row: Integer): TPageProxy;
  308. begin
  309.   Result := nil;
  310.   if CheckPageManager and (Row >= 0) and
  311.     (Row < FPageManager.PageProxies.Count) then
  312.   begin
  313.     Result := FPageManager.PageProxies.Items[Row];
  314.   end;
  315. end;
  316. procedure TProxyEditor.ProxyGridDrawCell(Sender: TObject; Col,
  317.   Row: Longint; Rect: TRect; State: TGridDrawState);
  318. var
  319.   CellText: string;
  320.   Proxy: TPageProxy;
  321. begin
  322.   CellText := '';
  323.   if gdFixed in State then begin
  324.     case Col of
  325.       0: CellText := LoadStr(srProxyName);
  326.       1: CellText := LoadStr(srPageName);
  327.     end;
  328.   end
  329.   else begin
  330.     Proxy := ProxyByRow(Row - 1);
  331.     if Proxy <> nil then begin
  332.       case Col of
  333.         0: CellText := Proxy.Name;
  334.         1: CellText := Proxy.PageName;
  335.       end;
  336.     end;
  337.   end;
  338.   DrawCellText(ProxyGrid, Col, Row, CellText, Rect, taLeftJustify, vaCenter);
  339. end;
  340. procedure TProxyEditor.ProxyGridSelectCell(Sender: TObject; Col,
  341.   Row: Longint; var CanSelect: Boolean);
  342. begin
  343.   SelectProxy(ProxyByRow(Row - 1));
  344. end;
  345. procedure TProxyEditor.CloseBtnClick(Sender: TObject);
  346. begin
  347.   Close;
  348. end;
  349. procedure TProxyEditor.DeleteBtnClick(Sender: TObject);
  350. var
  351.   Proxy: TPageProxy;
  352. begin
  353.   Proxy := ProxyByRow(ProxyGrid.Row - 1);
  354.   if Proxy <> nil then begin
  355.     Self.ValidateRename(Proxy, Proxy.Name, '');
  356.     FDeleting := True;
  357.     try
  358.       Proxy.Free;
  359.       Designer.Modified;
  360.     finally
  361.       FDeleting := False;
  362.     end;
  363.   end;
  364. end;
  365. procedure TProxyEditor.ProxyGridKeyDown(Sender: TObject; var Key: Word;
  366.   Shift: TShiftState);
  367. begin
  368.   if Shift = [] then begin
  369.     case Key of
  370.       VK_RETURN:
  371.         if ProxyByRow(ProxyGrid.Row - 1) <> nil then begin
  372.           ActivateInspector(#0);
  373.         end;
  374.       VK_DELETE:
  375.         DeleteBtnClick(nil);
  376.     end;
  377.   end;
  378. end;
  379. procedure TProxyEditor.FormResize(Sender: TObject);
  380. begin
  381.   with ProxyGrid do begin
  382.     DefaultColWidth := (ClientWidth - 1) div 2;
  383.     ColWidths[1] := ClientWidth - ColWidths[0] - 1;
  384.   end;
  385. end;
  386. procedure TProxyEditor.FormCreate(Sender: TObject);
  387. begin
  388.   if NewStyleControls then Font.Style := [];
  389. {$IFDEF WIN32}
  390.   with FormStorage do begin
  391.     UseRegistry := True;
  392.     IniFileName := SDelphiKey;
  393.   end;
  394. {$ENDIF}
  395. end;
  396. end.