home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Source / Vcl / STDACTNS.PAS < prev   
Pascal/Delphi Source File  |  1999-08-11  |  10KB  |  392 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Borland Delphi Visual Component Library         }
  5. {                                                       }
  6. {       Copyright (c) 1999 Inprise Corporation          }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit StdActns;
  11.  
  12. {$H+,X+}
  13.  
  14. interface
  15.  
  16. uses Classes, ActnList, StdCtrls, Forms;
  17.  
  18. type
  19.  
  20. { Hint actions }
  21.  
  22.   THintAction = class(TCustomAction)
  23.   public
  24.     constructor Create(AOwner: TComponent); override;
  25.   published
  26.     property Hint;
  27.   end;
  28.  
  29. { Edit actions }
  30.  
  31.   TEditAction = class(TAction)
  32.   private
  33.     FControl: TCustomEdit;
  34.     procedure SetControl(Value: TCustomEdit);
  35.   protected
  36.     function GetControl(Target: TObject): TCustomEdit; virtual;
  37.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  38.   public
  39.     function HandlesTarget(Target: TObject): Boolean; override;
  40.     procedure UpdateTarget(Target: TObject); override;
  41.     property Control: TCustomEdit read FControl write SetControl;
  42.   end;
  43.  
  44.   TEditCut = class(TEditAction)
  45.   public
  46.     procedure ExecuteTarget(Target: TObject); override;
  47.   end;
  48.  
  49.   TEditCopy = class(TEditAction)
  50.   public
  51.     procedure ExecuteTarget(Target: TObject); override;
  52.   end;
  53.  
  54.   TEditPaste = class(TEditAction)
  55.   public
  56.     procedure UpdateTarget(Target: TObject); override;
  57.     procedure ExecuteTarget(Target: TObject); override;
  58.   end;
  59.  
  60.   TEditSelectAll = class(TEditAction)
  61.   public
  62.     procedure ExecuteTarget(Target: TObject); override;
  63.     procedure UpdateTarget(Target: TObject); override;
  64.   end;
  65.  
  66.   TEditUndo = class(TEditAction)
  67.   public
  68.     procedure ExecuteTarget(Target: TObject); override;
  69.     procedure UpdateTarget(Target: TObject); override;
  70.   end;
  71.  
  72.   TEditDelete = class(TEditAction)
  73.   public
  74.     procedure ExecuteTarget(Target: TObject); override;
  75.     { UpdateTarget is required because TEditAction.UpdateTarget specifically
  76.       checks to see if the action is TEditCut or TEditCopy }
  77.     procedure UpdateTarget(Target: TObject); override;
  78.   end;
  79.  
  80. { MDI Window actions }
  81.  
  82.   TWindowAction = class(TAction)
  83.   private
  84.     FForm: TForm;
  85.     procedure SetForm(Value: TForm);
  86.   protected
  87.     function GetForm(Target: TObject): TForm; virtual;
  88.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  89.   public
  90.     function HandlesTarget(Target: TObject): Boolean; override;
  91.     procedure UpdateTarget(Target: TObject); override;
  92.     property Form: TForm read FForm write SetForm;
  93.   end;
  94.  
  95.   TWindowClose = class(TWindowAction)
  96.   public
  97.     procedure ExecuteTarget(Target: TObject); override;
  98.     procedure UpdateTarget(Target: TObject); override;
  99.   end;
  100.  
  101.   TWindowCascade = class(TWindowAction)
  102.   public
  103.     procedure ExecuteTarget(Target: TObject); override;
  104.   end;
  105.  
  106.   TWindowTileHorizontal = class(TWindowAction)
  107.   public
  108.     procedure ExecuteTarget(Target: TObject); override;
  109.   end;
  110.  
  111.   TWindowTileVertical = class(TWindowAction)
  112.   public
  113.     procedure ExecuteTarget(Target: TObject); override;
  114.   end;
  115.  
  116.   TWindowMinimizeAll = class(TWindowAction)
  117.   public
  118.     procedure ExecuteTarget(Target: TObject); override;
  119.   end;
  120.  
  121.   TWindowArrange = class(TWindowAction)
  122.   public
  123.     procedure ExecuteTarget(Target: TObject); override;
  124.   end;
  125.  
  126. { Help actions }
  127.  
  128.   THelpAction = class(TAction)
  129.   public
  130.     function HandlesTarget(Target: TObject): Boolean; override;
  131.     procedure UpdateTarget(Target: TObject); override;
  132.   end;
  133.  
  134.   THelpContents = class(THelpAction)
  135.   public
  136.     procedure ExecuteTarget(Target: TObject); override;
  137.   end;
  138.  
  139.   THelpTopicSearch = class(THelpAction)
  140.   public
  141.     procedure ExecuteTarget(Target: TObject); override;
  142.   end;
  143.  
  144.   THelpOnHelp = class(THelpAction)
  145.   public
  146.     procedure ExecuteTarget(Target: TObject); override;
  147.   end;
  148.  
  149. implementation
  150.  
  151. uses Windows, Messages, Clipbrd;
  152.  
  153. { THintAction }
  154.  
  155. constructor THintAction.Create(AOwner: TComponent);
  156. begin
  157.   inherited Create(AOwner);
  158.   DisableIfNoHandler := False;
  159. end;
  160.  
  161. { TEditAction }
  162.  
  163. function TEditAction.GetControl(Target: TObject): TCustomEdit;
  164. begin
  165.   { We could hard cast Target as a TCustomEdit since HandlesTarget "should" be
  166.     called before ExecuteTarget and UpdateTarget, however, we're being safe. }
  167.   Result := Target as TCustomEdit;
  168. end;
  169.  
  170. function TEditAction.HandlesTarget(Target: TObject): Boolean;
  171. begin
  172.   Result := ((Control <> nil) and (Target = Control) or
  173.     (Control = nil) and (Target is TCustomEdit)) and TCustomEdit(Target).Focused;
  174. end;
  175.  
  176. procedure TEditAction.Notification(AComponent: TComponent;
  177.   Operation: TOperation);
  178. begin
  179.   inherited Notification(AComponent, Operation);
  180.   if (Operation = opRemove) and (AComponent = Control) then Control := nil;
  181. end;
  182.  
  183. procedure TEditAction.UpdateTarget(Target: TObject);
  184. begin
  185.   if (Self is TEditCut) or (Self is TEditCopy) then
  186.     Enabled := GetControl(Target).SelLength > 0;
  187. end;
  188.  
  189. procedure TEditAction.SetControl(Value: TCustomEdit);
  190. begin
  191.   if Value <> FControl then
  192.   begin
  193.     FControl := Value;
  194.     if Value <> nil then Value.FreeNotification(Self);
  195.   end;
  196. end;
  197.  
  198. { TEditCopy }
  199.  
  200. procedure TEditCopy.ExecuteTarget(Target: TObject);
  201. begin
  202.   GetControl(Target).CopyToClipboard;
  203. end;
  204.  
  205. { TEditCut }
  206.  
  207. procedure TEditCut.ExecuteTarget(Target: TObject);
  208. begin
  209.   GetControl(Target).CutToClipboard;
  210. end;
  211.  
  212. { TEditPaste }
  213.  
  214. procedure TEditPaste.ExecuteTarget(Target: TObject);
  215. begin
  216.    GetControl(Target).PasteFromClipboard;
  217. end;
  218.  
  219. procedure TEditPaste.UpdateTarget(Target: TObject);
  220. begin
  221.   Enabled := Clipboard.HasFormat(CF_TEXT);
  222. end;
  223.  
  224. { TEditSelectAll }
  225.  
  226. procedure TEditSelectAll.ExecuteTarget(Target: TObject);
  227. begin
  228.   GetControl(Target).SelectAll;
  229. end;
  230.  
  231. procedure TEditSelectAll.UpdateTarget(Target: TObject);
  232. begin
  233.   Enabled := Length(GetControl(Target).Text) > 0;
  234. end;
  235.  
  236. { TEditUndo }
  237.  
  238. procedure TEditUndo.ExecuteTarget(Target: TObject);
  239. begin
  240.   GetControl(Target).Undo;
  241. end;
  242.  
  243. procedure TEditUndo.UpdateTarget(Target: TObject);
  244. begin
  245.   Enabled := GetControl(Target).CanUndo;
  246. end;
  247.  
  248. { TEditDelete }
  249.  
  250. procedure TEditDelete.ExecuteTarget(Target: TObject);
  251. begin
  252.   GetControl(Target).Clear;
  253. end;
  254.  
  255. procedure TEditDelete.UpdateTarget(Target: TObject);
  256. begin
  257.   Enabled := GetControl(Target).SelLength > 0;
  258. end;
  259.  
  260. { TWindowAction }
  261.  
  262. function TWindowAction.GetForm(Target: TObject): TForm;
  263. begin
  264.   { We could hard cast Target as a TForm since HandlesTarget "should" be called
  265.     before ExecuteTarget and UpdateTarget, however, we're being safe. }
  266.   Result := (Target as TForm);
  267. end;
  268.  
  269. function TWindowAction.HandlesTarget(Target: TObject): Boolean;
  270. begin
  271.   Result := ((Form <> nil) and (Target = Form) or
  272.     (Form = nil) and (Target is TForm)) and
  273.     (TForm(Target).FormStyle = fsMDIForm);
  274. end;
  275.  
  276. procedure TWindowAction.Notification(AComponent: TComponent;
  277.   Operation: TOperation);
  278. begin
  279.   inherited Notification(AComponent, Operation);
  280.   if (Operation = opRemove) and (AComponent = Form) then Form := nil;
  281. end;
  282.  
  283. procedure TWindowAction.UpdateTarget(Target: TObject);
  284. begin
  285.   Enabled := GetForm(Target).MDIChildCount > 0;
  286. end;
  287.  
  288. procedure TWindowAction.SetForm(Value: TForm);
  289. begin
  290.   if Value <> FForm then
  291.   begin
  292.     FForm := Value;
  293.     if Value <> nil then Value.FreeNotification(Self);
  294.   end;
  295. end;
  296.  
  297. { TWindowClose }
  298.  
  299. procedure TWindowClose.ExecuteTarget(Target: TObject);
  300. begin
  301.   with GetForm(Target) do
  302.     if ActiveMDIChild <> nil then ActiveMDIChild.Close;
  303. end;
  304.  
  305. procedure TWindowClose.UpdateTarget(Target: TObject);
  306. begin
  307.   Enabled := GetForm(Target).ActiveMDIChild <> nil;
  308. end;
  309.  
  310. { TWindowCascade }
  311.  
  312. procedure TWindowCascade.ExecuteTarget(Target: TObject);
  313. begin
  314.   GetForm(Target).Cascade;
  315. end;
  316.  
  317. { TWindowTileHorizontal }
  318.  
  319. procedure DoTile(Form: TForm; TileMode: TTileMode);
  320. const
  321.   TileParams: array[TTileMode] of Word = (MDITILE_HORIZONTAL, MDITILE_VERTICAL);
  322. begin
  323.   if (Form.FormStyle = fsMDIForm) and (Form.ClientHandle <> 0) then
  324.     SendMessage(Form.ClientHandle, WM_MDITILE, TileParams[TileMode], 0);
  325. end;
  326.  
  327. procedure TWindowTileHorizontal.ExecuteTarget(Target: TObject);
  328. begin
  329.   DoTile(GetForm(Target), tbHorizontal);
  330. end;
  331.  
  332. { TWindowTileVertical }
  333.  
  334. procedure TWindowTileVertical.ExecuteTarget(Target: TObject);
  335. begin
  336.   DoTile(GetForm(Target), tbVertical);
  337. end;
  338.  
  339. { TWindowMinimizeAll }
  340.  
  341. procedure TWindowMinimizeAll.ExecuteTarget(Target: TObject);
  342. var
  343.   I: Integer;
  344. begin
  345.   { Must be done backwards through the MDIChildren array }
  346.   with GetForm(Target) do
  347.     for I := MDIChildCount - 1 downto 0 do
  348.       MDIChildren[I].WindowState := wsMinimized;
  349. end;
  350.  
  351. { TWindowArrange }
  352.  
  353. procedure TWindowArrange.ExecuteTarget(Target: TObject);
  354. begin
  355.   GetForm(Target).ArrangeIcons;
  356. end;
  357.  
  358. { THelpAction }
  359.  
  360. function THelpAction.HandlesTarget(Target: TObject): Boolean;
  361. begin
  362.   Result := True;
  363. end;
  364.  
  365. procedure THelpAction.UpdateTarget(Target: TObject);
  366. begin
  367.   Enabled := Assigned(Application);
  368. end;
  369.  
  370. { THelpContents }
  371.  
  372. procedure THelpContents.ExecuteTarget(Target: TObject);
  373. begin
  374.   Application.HelpCommand(HELP_FINDER, 0);
  375. end;
  376.  
  377. { THelpTopicSearch }
  378.  
  379. procedure THelpTopicSearch.ExecuteTarget(Target: TObject);
  380. begin
  381.   Application.HelpCommand(HELP_PARTIALKEY, Integer(PChar('')));
  382. end;
  383.  
  384. { THelpOnHelp }
  385.  
  386. procedure THelpOnHelp.ExecuteTarget(Target: TObject);
  387. begin
  388.   Application.HelpCommand(HELP_HELPONHELP, Integer(PChar('')));
  389. end;
  390.  
  391. end.
  392.