home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / zkuste / delphi / kolekce / d6 / rxlibsetup.exe / {app} / units / TIMLSTED.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2002-02-19  |  12.8 KB  |  496 lines

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