home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 February / PCWorld_1999-02_cd.bin / temacd / HotKeys / AniIcoEd.pas < prev    next >
Pascal/Delphi Source File  |  1998-06-15  |  12KB  |  423 lines

  1. unit AniIcoEd;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  7.   Forms, ExtCtrls, StdCtrls, Buttons, DsgnIntf, AniIcons, ComCtrls, Dialogs;
  8.  
  9. type
  10.   TAnimatedIconsProperty = class( TPropertyEditor )
  11.     function GetAttributes : TPropertyAttributes; override;
  12.     function GetValue: string; override;
  13.     procedure Edit; override;
  14.   end;
  15.  
  16.   TAnimatedIconsPropertyEditDlg = class( TForm )
  17.     pnlFrames: TPanel;
  18.     btnOk: TButton;
  19.     btnCancel: TButton;
  20.     lblIcons: TLabel;
  21.     lstIcons: TListBox;
  22.     pnlInformation: TPanel;
  23.     lblTitle: TLabel;
  24.     edtTitle: TEdit;
  25.     grpSpiffies: TGroupBox;
  26.     lblSpiffies: TLabel;
  27.     edtSpiffies: TEdit;
  28.     udSpiffies: TUpDown;
  29.     lblSpiffies2: TLabel;
  30.     lblExplainSpiffies: TLabel;
  31.     grpPreview: TGroupBox;
  32.     pnlPreview: TPanel;
  33.     edtAuthor: TEdit;
  34.     lblAuthor: TLabel;
  35.     btnStop: TSpeedButton;
  36.     btnPlay: TSpeedButton;
  37.     pnlButtons: TPanel;
  38.     btnLoadFrame: TSpeedButton;
  39.     btnDeleteFrame: TSpeedButton;
  40.     btnSaveFrames: TSpeedButton;
  41.     btnLoadFrames: TSpeedButton;
  42.     dlgOpenFrame: TOpenDialog;
  43.     dlgSaveFrames: TSaveDialog;
  44.     dlgOpenFrames: TOpenDialog;
  45.     pbxIcon: TPaintBox;
  46.     btnUp: TSpeedButton;
  47.     btnDown: TSpeedButton;
  48.     procedure FormCreate( Sender : TObject );
  49.     procedure FormDestroy( Sender : TObject );
  50.     procedure edtSpiffiesKeyPress(Sender: TObject; var Key: Char);
  51.     procedure lstIconsMeasureItem(Control: TWinControl; Index: Integer;
  52.       var Height: Integer);
  53.     procedure lstIconsDrawItem(Control: TWinControl; Index: Integer;
  54.       Rect: TRect; State: TOwnerDrawState);
  55.     procedure edtTitleChange(Sender: TObject);
  56.     procedure edtAuthorChange(Sender: TObject);
  57.     procedure btnLoadFrameClick(Sender: TObject);
  58.     procedure lstIconsClick(Sender: TObject);
  59.     procedure btnPlayClick(Sender: TObject);
  60.     procedure btnStopClick(Sender: TObject);
  61.     procedure btnOkClick(Sender: TObject);
  62.     procedure btnCancelClick(Sender: TObject);
  63.     procedure edtSpiffiesChange(Sender: TObject);
  64.     procedure btnSaveFramesClick(Sender: TObject);
  65.     procedure btnLoadFramesClick(Sender: TObject);
  66.     procedure btnDeleteFrameClick(Sender: TObject);
  67.     procedure pbxIconPaint(Sender: TObject);
  68.     procedure btnDownClick(Sender: TObject);
  69.     procedure btnUpClick(Sender: TObject);
  70.   private
  71.     FIgnore   : Boolean;
  72.     FIconSize : Integer;
  73.     FPropName : string;
  74.     FIcons    : TAnimatedIcons;
  75.     procedure NewFrame(Sender: TObject; Frame: Integer);
  76.     function  GetDisplayTime(const Index: Integer): String;
  77.     procedure CheckButtons;
  78.     procedure SetIcons(Value: TAnimatedIcons);
  79.     procedure PaintIcon(Index: Integer);
  80.     procedure SetFormVars;
  81.   public
  82.     property PropName  : string read FPropName write FPropName;
  83.     property Icons     : TAnimatedIcons read FIcons write SetIcons;
  84.   end;
  85.  
  86.  
  87. implementation
  88.  
  89. {$R *.DFM}
  90. type
  91.   TPanelCracker = class(TPanel);
  92.  
  93. { TAnimatedIconsProperty }
  94.  
  95. function TAnimatedIconsProperty.GetAttributes: TPropertyAttributes;
  96. begin
  97.   Result := [paDialog];
  98. end;
  99.  
  100. function TAnimatedIconsProperty.GetValue : string;
  101. begin
  102.   Result := Format('(%s)', [GetPropType^.Name]);
  103. end;
  104.  
  105. procedure TAnimatedIconsProperty.Edit;
  106. var
  107.   Dialog : TAnimatedIconsPropertyEditDlg;
  108. begin
  109.   Dialog := TAnimatedIconsPropertyEditDlg.Create(Application);
  110.   try
  111.     if PropCount = 1 then
  112.     begin
  113.       Dialog.PropName := TComponent(GetComponent(0)).Owner.Name + '.' +
  114.                          TComponent(GetComponent(0)).Name + '.' + GetName;
  115.       Dialog.Caption :=  Dialog.PropName + ' - ' + Dialog.Caption;
  116.     end;
  117.  
  118.     Dialog.Icons := TAnimatedIcons(GetOrdValue);
  119.     if Dialog.ShowModal = mrOK then
  120.      begin
  121.        SetOrdValue(Longint(Dialog.Icons));
  122.        Modified;
  123.      end;
  124.   finally
  125.     Dialog.Free;
  126.   end;
  127. end;
  128.  
  129. { TAnimatedIconsPropertyEditDlg }
  130. procedure TAnimatedIconsPropertyEditDlg.FormCreate(Sender: TObject);
  131. begin
  132.   FIcons := TAnimatedIcons.Create(is32x32);
  133.   FIcons.OnNewFrame := NewFrame;
  134. end;
  135.  
  136. procedure TAnimatedIconsPropertyEditDlg.FormDestroy(Sender: TObject);
  137. begin
  138.   FIcons.Free;
  139. end;
  140.  
  141. function TAnimatedIconsPropertyEditDlg.GetDisplayTime(const Index: Integer): String;
  142. begin
  143.   Result := IntToStr(Icons[Index].DisplayTime);
  144.   if Icons[Index].DisplayTime=1 then Result := Result + ' spiffy ' else Result := Result + ' spiffies';
  145. end;
  146.  
  147. procedure TAnimatedIconsPropertyEditDlg.SetFormVars;
  148. var
  149.   i : integer;
  150. begin
  151.   edtTitle.Text := Icons.Title;
  152.   edtAuthor.Text := Icons.Author;
  153.   if Icons.IconSize=is16x16 then FIconSize := 16 else FIconSize := 32;
  154.   lstIcons.Clear;
  155.   for i:=0 to Icons.Count-1 do
  156.    lstIcons.Items.Add(IntToStr(Icons[i].DisplayTime));
  157.   CheckButtons;
  158.   PaintIcon(0);
  159. end;
  160.  
  161. procedure TAnimatedIconsPropertyEditDlg.SetIcons(Value: TAnimatedIcons);
  162. begin
  163.   FIcons.Assign(Value);
  164.   SetFormVars;
  165. end;
  166.  
  167. procedure TAnimatedIconsPropertyEditDlg.edtSpiffiesKeyPress(Sender: TObject;
  168.   var Key: Char);
  169. begin
  170.   if not (Key in [#8, '0'..'9']) then Key := #0;
  171. end;
  172.  
  173. procedure TAnimatedIconsPropertyEditDlg.lstIconsMeasureItem(Control: TWinControl;
  174.   Index: Integer; var Height: Integer);
  175. begin
  176.   Height := FIconSize+2;
  177. end;
  178.  
  179. procedure TAnimatedIconsPropertyEditDlg.lstIconsDrawItem(Control: TWinControl;
  180.   Index: Integer; Rect: TRect; State: TOwnerDrawState);
  181. begin
  182.   with (Control As TListBox).Canvas do
  183.    begin
  184.      FillRect(Rect);
  185.      if (Index>=0) and (Index<TListBox(Control).Items.Count) then
  186.       begin
  187.         Icons.DrawIcon((Control As TListBox).Canvas, Rect.left+1, Rect.top+1, Index, Brush.Color);
  188.         inc(Rect.left, FIconSize + 4);
  189.         DrawText(Handle, PChar(GetDisplayTime(Index)), -1, Rect, DT_LEFT or DT_SINGLELINE or DT_VCENTER);
  190.       end;
  191.    end;
  192. end;
  193.  
  194. procedure TAnimatedIconsPropertyEditDlg.CheckButtons;
  195. var
  196.   i, iSelCount : integer;
  197.   iLastSelected: integer;
  198.   bUpEnabled,
  199.   bFirst       : Boolean;
  200. begin
  201.   btnSaveFrames.Enabled := lstIcons.Items.Count>0;
  202.   btnPlay.Enabled := btnSaveFrames.Enabled and not FIcons.Playing;
  203.   btnStop.Enabled := btnSaveFrames.Enabled;
  204.   iSelCount := 0;
  205.   iLastSelected := 0;
  206.   bFirst := True;
  207.   bUpEnabled := False;
  208.   if btnSaveFrames.Enabled then
  209.    for i:=0 to lstIcons.Items.Count-1 do
  210.     if lstIcons.Selected[i] then
  211.      begin
  212.        if bFirst and (i>0) then bUpEnabled := True;
  213.        bFirst := False;
  214.        iLastSelected := i;
  215.        inc(iSelCount);
  216.        if iSelCount=1 then
  217.         begin
  218.           FIgnore := True;
  219.           edtSpiffies.Text := lstIcons.Items[i];
  220.           FIgnore := False;
  221.         end;
  222.      end;
  223.   if iSelCount>0 then
  224.    begin
  225.      edtSpiffies.Enabled := True;
  226.      udSpiffies.Enabled := True;
  227.      btnDeleteFrame.Enabled := True;
  228.      if iSelCount=1 then
  229.       grpSpiffies.Caption := '1 frame selected'
  230.      else if iSelCount=lstIcons.Items.Count then
  231.       grpSpiffies.Caption := 'All frames selected'
  232.      else
  233.       grpSpiffies.Caption := IntToStr(iSelCount)+' frames selected';
  234.      btnUp.Enabled := bUpEnabled;
  235.      btnDown.Enabled := iLastSelected<lstIcons.Items.Count-1;
  236.    end
  237.   else
  238.    begin
  239.      grpSpiffies.Caption := 'No frames selected';
  240.      edtSpiffies.Enabled := False;
  241.      udSpiffies.Enabled := False;
  242.      btnDeleteFrame.Enabled := False;
  243.      btnUp.Enabled := False;
  244.      btnDown.Enabled := False;
  245.    end;
  246. end;
  247.  
  248. procedure TAnimatedIconsPropertyEditDlg.edtTitleChange(Sender: TObject);
  249. begin
  250.   Icons.Title := edtTitle.Text;
  251. end;
  252.  
  253. procedure TAnimatedIconsPropertyEditDlg.edtAuthorChange(Sender: TObject);
  254. begin
  255.   Icons.Author := edtAuthor.Text;
  256. end;
  257.  
  258. procedure TAnimatedIconsPropertyEditDlg.btnLoadFrameClick(Sender: TObject);
  259. var
  260.   Icon : TAnimatedIcon;
  261.   i    : Integer;
  262. begin
  263.   if dlgOpenFrame.Execute then
  264.    begin
  265.      for i:=0 to dlgOpenFrame.Files.Count-1 do
  266.       begin
  267.         Icon := TAnimatedIcon.Create;
  268.         Icon.Handle := LoadImage(0, PChar(dlgOpenFrame.Files[i]), IMAGE_ICON, FIconSize, FIconSize, LR_LOADFROMFILE); //LR_LOADREALSIZE or LR_LOADFROMFILE);
  269.         Icon.DisplayTime := 10;
  270.         Icons.Add(Icon);
  271.         lstIcons.Items.Add('10');
  272.         lstIcons.ItemIndex := lstIcons.Items.Count-1;
  273.       end;
  274.      CheckButtons;
  275.    end;
  276. end;
  277.  
  278. procedure TAnimatedIconsPropertyEditDlg.NewFrame(Sender: TObject; Frame: Integer);
  279. begin
  280.   PaintIcon(Frame);
  281. end;
  282.  
  283. procedure TAnimatedIconsPropertyEditDlg.lstIconsClick(Sender: TObject);
  284. begin
  285.   CheckButtons;
  286.   if (lstIcons.ItemIndex<>-1) and not Icons.Playing then PaintIcon(lstIcons.ItemIndex);
  287. end;
  288.  
  289. procedure TAnimatedIconsPropertyEditDlg.btnPlayClick(Sender: TObject);
  290. begin
  291.   btnPlay.Enabled := False;
  292.   btnDeleteFrame.Enabled := False;
  293.   Icons.Play(0);
  294. end;
  295.  
  296. procedure TAnimatedIconsPropertyEditDlg.PaintIcon(Index : Integer);
  297. begin
  298.   if (Index>=0) and (Index<Icons.Count) then
  299.    Icons.DrawIcon(TPanelCracker(pnlPreview).Canvas, 26 - (FIconSize div 2), (26 - FIconSize div 2), Index, clBtnFace);
  300. end;
  301.  
  302. procedure TAnimatedIconsPropertyEditDlg.btnStopClick(Sender: TObject);
  303. begin
  304.   if FIcons.Playing then
  305.    begin
  306.      FIcons.Stop;
  307.      btnPlay.Enabled := True;
  308.      btnDeleteFrame.Enabled := edtSpiffies.Enabled;
  309.    end;
  310. end;
  311.  
  312. procedure TAnimatedIconsPropertyEditDlg.btnOkClick(Sender: TObject);
  313. begin
  314.   btnStopClick(Self);
  315.   ModalResult := mrOk;
  316. end;
  317.  
  318. procedure TAnimatedIconsPropertyEditDlg.btnCancelClick(Sender: TObject);
  319. begin
  320.   btnStopClick(Self);
  321.   ModalResult := mrCancel;
  322. end;
  323.  
  324. procedure TAnimatedIconsPropertyEditDlg.edtSpiffiesChange(Sender: TObject);
  325. var
  326.   i, NewVal : integer;
  327. begin
  328.   if FIgnore then Exit;
  329.   try
  330.     NewVal := StrToInt(edtSpiffies.Text);
  331.   except
  332.     NewVal := 1;
  333.   end;
  334.   lstIcons.Items.BeginUpdate;
  335.   for i:=0 to Icons.Count-1 do
  336.    begin
  337.      if lstIcons.Selected[i] then
  338.       begin
  339.         Icons[i].DisplayTime := NewVal;
  340.         lstIcons.Items[i] := edtSpiffies.Text;
  341.         lstIcons.Selected[i] := True;
  342.       end;
  343.    end;
  344.   lstIcons.Items.EndUpdate;
  345. end;
  346.  
  347. procedure TAnimatedIconsPropertyEditDlg.btnSaveFramesClick(Sender: TObject);
  348. begin
  349.   if dlgSaveFrames.Execute then
  350.    Icons.SaveToFile(dlgSaveFrames.FileName);
  351. end;
  352.  
  353. procedure TAnimatedIconsPropertyEditDlg.btnLoadFramesClick(Sender: TObject);
  354. begin
  355.   if dlgOpenFrames.Execute then
  356.    begin
  357.      btnStopClick(Self);
  358.      Icons.LoadFromFile(dlgOpenFrames.FileName);
  359.      SetFormVars;
  360.    end;
  361. end;
  362.  
  363. procedure TAnimatedIconsPropertyEditDlg.btnDeleteFrameClick(Sender: TObject);
  364. var
  365.   i : integer;
  366. begin
  367.   btnStopClick(Self);
  368.   i := 0;
  369.   while i<Icons.Count do
  370.    if lstIcons.Selected[i] then
  371.     begin
  372.       lstIcons.Items.Delete(I);
  373.       Icons.Delete(I);
  374.     end
  375.    else
  376.     inc(i);
  377.   CheckButtons;
  378. end;
  379.  
  380. procedure TAnimatedIconsPropertyEditDlg.pbxIconPaint(Sender: TObject);
  381. begin
  382.   if (lstIcons.ItemIndex<>-1) and not Icons.Playing then
  383.    PaintIcon(lstIcons.ItemIndex)
  384.   else
  385.    PaintIcon(0);
  386. end;
  387.  
  388. procedure TAnimatedIconsPropertyEditDlg.btnDownClick(Sender: TObject);
  389. var
  390.   i : integer;
  391. begin
  392.   for i:=lstIcons.Items.Count-2 downto 0 do
  393.    begin
  394.      if lstIcons.Selected[i] then
  395.       begin
  396.         lstIcons.Items.Move(i, i+1);
  397.         Icons.Move(i, i+1);
  398.         lstIcons.Selected[i+1] := True;
  399.       end;
  400.    end;
  401.   CheckButtons;
  402. end;
  403.  
  404. procedure TAnimatedIconsPropertyEditDlg.btnUpClick(Sender: TObject);
  405. var
  406.   i : integer;
  407. begin
  408.   for i:=1 to lstIcons.Items.Count-1 do
  409.    begin
  410.      if lstIcons.Selected[i] then
  411.       begin
  412.         lstIcons.Items.Move(i, i-1);
  413.         Icons.Move(i, i-1);
  414.         lstIcons.Selected[i-1] := True;
  415.       end;
  416.    end;
  417.   CheckButtons;
  418. end;
  419.  
  420. end.
  421.  
  422.  
  423.