home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / kolekce / d6 / RX275D6.ZIP / Units / TIMLSTED.PAS < prev    next >
Pascal/Delphi Source File  |  2001-06-24  |  13KB  |  494 lines

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