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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1997 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8. unit TimLstEd;
  9. interface
  10. {$I RX.INC}
  11. uses {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF} SysUtils,
  12.   Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
  13.   Grids, RTLConsts, DesignIntf, DesignEditors, VCLEditors, Menus, RXCtrls, VCLUtils, Placemnt,
  14.   TimerLst, DesignWindows;
  15. type
  16.   TTimerItemsEditor = class(TDesignWindow)
  17.     BtnPanel: TPanel;
  18.     ClientPanel: TPanel;
  19.     NewBtn: TButton;
  20.     DeleteBtn: TButton;
  21.     DrawGrid: TDrawGrid;
  22.     PopupMenu: TPopupMenu;
  23.     CutMenu: TMenuItem;
  24.     CopyMenu: TMenuItem;
  25.     PasteMenu: TMenuItem;
  26.     FormStorage: TFormPlacement;
  27.     DeleteMenu: TMenuItem;
  28.     N1: TMenuItem;
  29.     NewMenu: TMenuItem;
  30.     ClearBtn: TButton;
  31.     Panel1: TPanel;
  32.     CloseBtn: TButton;
  33.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  34.     procedure DrawGridDrawCell(Sender: TObject; Col, Row: Longint;
  35.       Rect: TRect; State: TGridDrawState);
  36.     procedure DrawGridSelectCell(Sender: TObject; Col, Row: Longint;
  37.       var CanSelect: Boolean);
  38.     procedure CloseBtnClick(Sender: TObject);
  39.     procedure DeleteClick(Sender: TObject);
  40.     procedure DrawGridKeyDown(Sender: TObject; var Key: Word;
  41.       Shift: TShiftState);
  42.     procedure FormResize(Sender: TObject);
  43.     procedure FormCreate(Sender: TObject);
  44.     procedure NewClick(Sender: TObject);
  45.     procedure CutClick(Sender: TObject);
  46.     procedure CopyClick(Sender: TObject);
  47.     procedure PasteClick(Sender: TObject);
  48.     procedure ClearBtnClick(Sender: TObject);
  49.   private
  50.     FTimersCollection: TRxTimerList;
  51.     function GetForm: TCustomForm;
  52.     function CheckCollection: Boolean;
  53.     function ItemByRow(Row: Integer): TRxTimerEvent;
  54.     procedure SelectItem(Item: TRxTimerEvent);
  55.     procedure UpdateData;
  56.     procedure SetTimersCollection(Value: TRxTimerList);
  57.     procedure Copy;
  58.     procedure Cut;
  59.     procedure Paste;
  60.   protected
  61.     function UniqueName(Component: TComponent): string; override;
  62.     procedure Activated; override;
  63.   public
  64.     function EditAction(Action: TEditAction):Boolean; override;
  65.     procedure ItemsModified(const Designer: IDesigner); override;
  66.     procedure DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean); override;
  67.     function GetEditState: TEditState; override;
  68.     procedure ItemDeleted(const ADesigner: IDesigner; Item: TPersistent); override;
  69.     property TimersCollection: TRxTimerList read FTimersCollection
  70.       write SetTimersCollection;
  71.     property OwnerForm: TCustomForm read GetForm;
  72.   end;
  73. { TTimersItemListProperty }
  74.   TTimersItemListProperty = class(TPropertyEditor)
  75.     function GetAttributes: TPropertyAttributes; override;
  76.     function GetValue: string; override;
  77.     procedure Edit; override;
  78.   end;
  79. { TTimersCollectionEditor }
  80.   TTimersCollectionEditor = class(TComponentEditor)
  81.     procedure ExecuteVerb(Index: Integer); override;
  82.     function GetVerb(Index: Integer): string; override;
  83.     function GetVerbCount: Integer; override;
  84.   end;
  85. implementation
  86. uses Consts, {$IFDEF WIN32} RxConst, {$ENDIF} RxLConst, RxDsgn;
  87. {$R *.DFM}
  88. {$IFDEF WIN32}
  89.  {$D-}
  90. {$ENDIF}
  91. {$IFDEF RX_D4}
  92. type
  93.   TDesigner = IDesigner;
  94.   TFormDesigner = IDesigner;
  95. {$ENDIF}
  96. function FindEditor(ATimersCollection: TRxTimerList): TTimerItemsEditor;
  97. var
  98.   I: Integer;
  99. begin
  100.   Result := nil;
  101.   for I := 0 to Screen.FormCount - 1 do begin
  102.     if Screen.Forms[I] is TTimerItemsEditor then begin
  103.       if TTimerItemsEditor(Screen.Forms[I]).TimersCollection = ATimersCollection then
  104.       begin
  105.         Result := TTimerItemsEditor(Screen.Forms[I]);
  106.         Break;
  107.       end;
  108.     end;
  109.   end;
  110. end;
  111. procedure ShowItemsEditor(Designer: TDesigner;
  112.   ATimersCollection: TRxTimerList);
  113. var
  114.   Editor: TTimerItemsEditor;
  115. begin
  116.   if ATimersCollection = nil then Exit;
  117.   Editor := FindEditor(ATimersCollection);
  118.   if Editor = nil then begin
  119.     Editor := TTimerItemsEditor.Create(Application);
  120.     try
  121.       Editor.Designer := TFormDesigner(Designer);
  122.       Editor.TimersCollection := ATimersCollection;
  123.       Editor.Show;
  124.     except
  125.       Editor.Free;
  126.       raise;
  127.     end;
  128.   end
  129.   else begin
  130.     Editor.Show;
  131.     if Editor.WindowState = wsMinimized then
  132.       Editor.WindowState := wsNormal;
  133.   end;
  134. end;
  135. { TTimersItemListProperty }
  136. function TTimersItemListProperty.GetAttributes: TPropertyAttributes;
  137. begin
  138.   Result := [paDialog, paReadOnly];
  139. end;
  140. function TTimersItemListProperty.GetValue: string;
  141. var
  142.   List: TList;
  143. begin
  144.   List := TList(Pointer(GetOrdValue));
  145.   if (List = nil) or (List.Count = 0) then
  146.     Result := ResStr(srNone)
  147.   else FmtStr(Result, '(%s)', [GetPropType^.Name]);
  148. end;
  149. procedure TTimersItemListProperty.Edit;
  150. begin
  151.   ShowItemsEditor(Designer, TRxTimerList(GetComponent(0)));
  152. end;
  153. { TTimersCollectionEditor }
  154. procedure TTimersCollectionEditor.ExecuteVerb(Index: Integer);
  155. begin
  156.   case Index of
  157.     0: ShowItemsEditor(Designer, TRxTimerList(Component));
  158.   end;
  159. end;
  160. function TTimersCollectionEditor.GetVerb(Index: Integer): string;
  161. begin
  162.   case Index of
  163.     0: Result := LoadStr(srTimerDesigner);
  164.   end;
  165. end;
  166. function TTimersCollectionEditor.GetVerbCount: Integer;
  167. begin
  168.   Result := 1;
  169. end;
  170. { TTimerItemsEditor }
  171. procedure TTimerItemsEditor.SetTimersCollection(Value: TRxTimerList);
  172. begin
  173.   if FTimersCollection <> Value then begin
  174.     FTimersCollection := Value;
  175.     UpdateData;
  176.   end;
  177. end;
  178. function TTimerItemsEditor.UniqueName(Component: TComponent): string;
  179. var
  180.   Temp: string;
  181. {$IFNDEF WIN32}
  182.   I: Integer;
  183.   Comp: TComponent;
  184. {$ENDIF}
  185. begin
  186.   if (Component <> nil) then Temp := Component.ClassName
  187.   else Temp := TRxTimerEvent.ClassName;
  188.   if (UpCase(Temp[1]) = 'T') and (Length(Temp) > 1) then
  189.     System.Delete(Temp, 1, 1);
  190. {$IFDEF WIN32}
  191.   Result := Designer.UniqueName(Temp);
  192. {$ELSE}
  193.   I := 1;
  194.   repeat
  195.     Result := Temp + IntToStr(I);
  196.     Comp := OwnerForm.FindComponent(Result);
  197.     Inc(I);
  198.   until (Comp = nil) or (Comp = Component);
  199. {$ENDIF}
  200. end;
  201. function TTimerItemsEditor.GetEditState: TEditState;
  202. begin
  203.   Result := [];
  204.   if DeleteBtn.Enabled then Result := [esCanDelete, esCanCut, esCanCopy];
  205.   if ClipboardComponents then Include(Result, esCanPaste);
  206. end;
  207. procedure TTimerItemsEditor.DesignerClosed(const Designer: IDesigner; AGoingDormant: Boolean);
  208. begin
  209.   if Designer.Root = OwnerForm then Free;
  210. end;
  211. procedure TTimerItemsEditor.ItemsModified(const Designer: IDesigner);
  212. begin
  213.   if not (csDestroying in ComponentState) then UpdateData;
  214. end;
  215. procedure TTimerItemsEditor.Activated;
  216. begin
  217.   SelectItem(ItemByRow(DrawGrid.Row - 1));
  218. end;
  219. procedure TTimerItemsEditor.UpdateData;
  220. var
  221.   Empty: Boolean;
  222. begin
  223.   if CheckCollection then begin
  224.     Caption := Format(LoadStr(srTimerEvents), [TimersCollection.Name]);
  225.     Empty := TimersCollection.Count = 0;
  226.   end
  227.   else Empty := True;
  228.   if Empty then begin
  229.     DrawGrid.RowCount := 2;
  230.     SelectItem(nil);
  231.   end
  232.   else DrawGrid.RowCount := TimersCollection.Count + 1;
  233.   DeleteBtn.Enabled := not Empty;
  234.   ClearBtn.Enabled := not Empty;
  235.   DeleteMenu.Enabled := not Empty;
  236.   CopyMenu.Enabled := not Empty;
  237.   CutMenu.Enabled := not Empty;
  238.   PasteMenu.Enabled := ClipboardComponents;
  239.   DrawGrid.Invalidate;
  240. end;
  241. function TTimerItemsEditor.GetForm: TCustomForm;
  242. begin
  243.   Result := GetParentForm(ClientPanel); //Designer.Form;
  244. end;
  245. procedure TTimerItemsEditor.FormClose(Sender: TObject; var Action: TCloseAction);
  246. begin
  247.   Action := caFree;
  248. end;
  249. function TTimerItemsEditor.CheckCollection: Boolean;
  250. begin
  251.   Result := (TimersCollection <> nil) and (TimersCollection.Owner <> nil)
  252.     and (Designer.Root <> nil);
  253. end;
  254. procedure TTimerItemsEditor.SelectItem(Item: TRxTimerEvent);
  255. var
  256.   FComponents: IDesignerSelections;
  257. begin
  258.   if CheckCollection and Active then begin
  259.     FComponents := CreateSelectionList;
  260.     if Item <> nil then FComponents.Add(Item)
  261.     else FComponents.Add(TimersCollection);
  262.     SetSelection(FComponents);
  263.   end;
  264. end;
  265. function TTimerItemsEditor.ItemByRow(Row: Integer): TRxTimerEvent;
  266. begin
  267.   Result := nil;
  268.   if CheckCollection and (Row >= 0) and
  269.     (Row < TimersCollection.Count) then
  270.   begin
  271.     Result := TRxTimerEvent(TimersCollection.Events[Row]);
  272.   end;
  273. end;
  274. procedure TTimerItemsEditor.ItemDeleted(const ADesigner: IDesigner; Item: TPersistent);
  275. begin
  276.   if Item = TimersCollection then begin
  277.     TimersCollection := nil;
  278.     Close;
  279.   end;
  280. end;
  281. procedure TTimerItemsEditor.DrawGridDrawCell(Sender: TObject; Col,
  282.   Row: Longint; Rect: TRect; State: TGridDrawState);
  283. var
  284.   CellText: string;
  285.   Item: TRxTimerEvent;
  286. begin
  287.   CellText := '';
  288.   if gdFixed in State then CellText := 'Item name'
  289.   else begin
  290.     Item := ItemByRow(Row - 1);
  291.     if Item <> nil then CellText := Item.Name;
  292.   end;
  293.   DrawCellText(DrawGrid, Col, Row, CellText, Rect, taLeftJustify, vaCenter);
  294. end;
  295. procedure TTimerItemsEditor.DrawGridSelectCell(Sender: TObject; Col,
  296.   Row: Longint; var CanSelect: Boolean);
  297. begin
  298.   SelectItem(ItemByRow(Row - 1));
  299. end;
  300. procedure TTimerItemsEditor.CloseBtnClick(Sender: TObject);
  301. begin
  302.   Close;
  303. end;
  304. procedure TTimerItemsEditor.DeleteClick(Sender: TObject);
  305. var
  306.   Item: TRxTimerEvent;
  307. begin
  308.   Item := ItemByRow(DrawGrid.Row - 1);
  309.   if Item <> nil then begin
  310.     Self.ValidateRename(Item, Item.Name, '');
  311.     TimersCollection.Delete(Item.Handle);
  312.     if TimersCollection.Count > 0 then begin
  313.       Item := ItemByRow(DrawGrid.Row - 1);
  314.       SelectItem(Item);
  315.     end
  316.     else SelectItem(nil);
  317.     UpdateData;
  318.     Designer.Modified;
  319.   end;
  320. end;
  321. procedure TTimerItemsEditor.DrawGridKeyDown(Sender: TObject; var Key: Word;
  322.   Shift: TShiftState);
  323. begin
  324.   if Shift = [] then
  325.     case Key of
  326.       VK_RETURN: if ItemByRow(DrawGrid.Row - 1) <> nil then ActivateInspector(#0);
  327.       VK_DELETE: DeleteClick(nil);
  328.     end;
  329. end;
  330. procedure TTimerItemsEditor.FormCreate(Sender: TObject);
  331. begin
  332.   TimersCollection := nil;
  333.   if NewStyleControls then Font.Style := [];
  334. {$IFDEF WIN32}
  335.   with FormStorage do begin
  336.     UseRegistry := True;
  337.     IniFileName := SDelphiKey;
  338.   end;
  339. {$ENDIF}
  340. end;
  341. procedure TTimerItemsEditor.FormResize(Sender: TObject);
  342. begin
  343.   with DrawGrid do ColWidths[0] := ClientWidth;
  344. end;
  345. function TTimerItemsEditor.EditAction(Action: TEditAction) : Boolean;
  346. begin
  347.   Result := True;
  348.   case Action of
  349.     eaCut: Cut;
  350.     eaCopy: Copy;
  351.     eaPaste: Paste;
  352.     eaDelete: DeleteClick(Self);
  353.   end;
  354. end;
  355. procedure TTimerItemsEditor.NewClick(Sender: TObject);
  356. var
  357.   I: Integer;
  358.   Item: TRxTimerEvent;
  359. begin
  360.   Item := TRxTimerEvent.Create(TimersCollection.Owner);
  361.   if Item <> nil then
  362.     try
  363.       Item.Name := UniqueName(Item);
  364.       with TimersCollection do
  365.         I := ItemIndexByHandle(AddItem(Item));
  366.       SelectItem(Item);
  367.       Designer.Modified;
  368.       ActivateInspector(#0);
  369.       DrawGrid.Row := I + 1;
  370.     except
  371.       Item.Free;
  372.       raise;
  373.     end
  374.   else raise Exception.CreateRes(srEventNotCreate);
  375. end;
  376. procedure TTimerItemsEditor.CutClick(Sender: TObject);
  377. begin
  378.   Cut;
  379.   UpdateData;
  380. end;
  381. procedure TTimerItemsEditor.CopyClick(Sender: TObject);
  382. begin
  383.   Copy;
  384.   UpdateData;
  385. end;
  386. procedure TTimerItemsEditor.PasteClick(Sender: TObject);
  387. begin
  388.   Paste;
  389.   UpdateData;
  390. end;
  391. procedure TTimerItemsEditor.Cut;
  392. begin
  393.   Copy;
  394.   DeleteClick(Self);
  395. end;
  396. procedure TTimerItemsEditor.Copy;
  397. var
  398.   CompList: IDesignerSelections;
  399.   Item: TRxTimerEvent;
  400. begin
  401.   CompList := CreateSelectionList;
  402.   try
  403.     Item := ItemByRow(DrawGrid.Row - 1);
  404.     if Item <> nil then begin
  405.       CompList.Add(Item);
  406.       CopyComponents(OwnerForm, CompList);
  407.     end;
  408.   finally
  409.     //CompList.Free;
  410.   end;
  411. end;
  412. procedure TTimerItemsEditor.Paste;
  413. var
  414.   CompList: IDesignerSelections;
  415. begin
  416.   if CheckCollection then begin
  417.     CompList := CreateSelectionList;
  418.     try
  419.       PasteComponents(OwnerForm, TimersCollection, CompList);
  420.       UpdateData;
  421.     finally
  422.       //CompList.Free;
  423.     end;
  424.   end;
  425. end;
  426. procedure TTimerItemsEditor.ClearBtnClick(Sender: TObject);
  427. var
  428.   Item: TRxTimerEvent;
  429. begin
  430.   while TimersCollection.Events.Count > 0 do begin
  431.     Item := TRxTimerEvent(TimersCollection.Events[0]);
  432.     if Item <> nil then Self.ValidateRename(Item, Item.Name, '');
  433.     TimersCollection.Events.Delete(0);
  434.     Item.Free;
  435.   end;
  436.   UpdateData;
  437. end;
  438. end.