home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / ArsClip / source.zip / UnitFrmRemoved.pas < prev    next >
Pascal/Delphi Source File  |  2003-09-17  |  7KB  |  254 lines

  1. unit UnitFrmRemoved;
  2.  
  3. {
  4.     Purpose:
  5.         User interface to copy a removed item to the clipboard
  6.  
  7.     Updates:
  8.         fixed broken "Copy" button
  9.     --------------
  10.         Made form scalable
  11.  
  12.     NOTES: I'm using the same dirty trick to work-around Win9x control
  13.     memory limitations as I used in FrmClipboardManager.
  14. }
  15.  
  16. interface
  17.  
  18. uses
  19.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  20.   Dialogs, StdCtrls, UnitClipQueue, ComCtrls, ExtCtrls;
  21.  
  22. type
  23.   TFrmRemoved = class(TForm)
  24.     bCopy: TButton;
  25.     bClose: TButton;
  26.     Label1: TLabel;
  27.     mPreview: TMemo;
  28.     bFlushItems: TButton;
  29.     btnCopyAs: TButton;
  30.     iPreview: TImage;
  31.     lbList: TListBox;
  32.     Label2: TLabel;
  33.     procedure FormShow(Sender: TObject);
  34.     procedure lbListClick(Sender: TObject);
  35.     procedure bCopyClick(Sender: TObject);
  36.     procedure bCloseClick(Sender: TObject);
  37.     procedure bFlushItemsClick(Sender: TObject);
  38.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  39.     procedure FormHide(Sender: TObject);
  40.     procedure FormCreate(Sender: TObject);
  41.     procedure btnCopyAsClick(Sender: TObject);
  42.     procedure lbListMeasureItem(Control: TWinControl; Index: Integer;
  43.       var Height: Integer);
  44.     procedure lbListDrawItem(Control: TWinControl; Index: Integer;
  45.       Rect: TRect; State: TOwnerDrawState);
  46.  
  47.     procedure FreeRemoved(ci : TClipItem);      
  48.   private
  49.     { Private declarations }
  50.     //HistoryLoaded : boolean;
  51.     ci : TClipItem;
  52.   public
  53.     { Public declarations }
  54.   end;
  55.  
  56. var
  57.   FrmRemoved: TFrmRemoved;
  58.  
  59. implementation
  60.  
  61. {$R *.dfm}
  62.  
  63. Uses StrUtils, Clipbrd, UnitFrmHotKey, UnitFrmConfig,
  64.   UnitFrmClipboardManager, UnitPaste, Math, UnitMisc;
  65. const REMOVED_FILE = 'removed.txt';
  66.  
  67. procedure TFrmRemoved.FormShow(Sender: TObject);
  68. var i : longint;
  69.     s : string;
  70. begin
  71.     bCopy.Enabled := false;
  72.  
  73.     mPreview.Clear;
  74.  
  75.     lbList.Items.BeginUpdate;
  76.     lbList.Items.Clear;
  77.     for i := (RemovedQueue.GetQueueCount - 1) downto 0 do begin
  78.         s := RemovedQueue.GetItemText(i);
  79.         lbList.Items.Add(LeftStr(s,160));
  80.     end;
  81.     lbList.Items.EndUpdate;
  82. end;
  83.  
  84. procedure TFrmRemoved.lbListClick(Sender: TObject);
  85. var i : integer;
  86. begin
  87.     // reverse the index from 0 - (N-1) to (N-1) - 0
  88.     bCopy.Enabled := true;
  89.     mPreview.Visible := false;
  90.     iPreview.Visible := false;
  91.  
  92.     bCopy.Enabled := true;
  93.     i := (lbList.Count - 1) - lbList.ItemIndex;
  94.     mPreview.Text := Leftstr(
  95.         RemovedQueue.GetItemText(i),
  96.         10000);
  97.  
  98.     self.FreeRemoved(ci);
  99.     ci := RemovedQueue.GetItemClip(i);
  100.  
  101.     btnCopyAs.Visible := false;
  102.     if (ci <> nil) then begin
  103.         if (ci.GetFormat <> 0) then begin
  104.             btnCopyAs.Hint := ci.GetFormatName;
  105.             btnCopyAs.Caption := 'Copy as ' + LeftStr(btnCopyAs.Hint, 10);
  106.  
  107.             btnCopyAs.Visible := true;
  108.         end;
  109.         if (ci.GetFormat = CF_DIB) then begin
  110.             mPreview.Visible := false;
  111.             iPreview.Visible := true;
  112.             ci.GetDIB(iPreview.Picture);
  113.         end;
  114.     end;
  115.  
  116.     if(not iPreview.Visible) then begin
  117.         mPreview.Visible := true;
  118.         iPreview.Visible := false;
  119.     end;
  120. end;
  121.  
  122. procedure TFrmRemoved.bCopyClick(Sender: TObject);
  123. var i : integer;
  124. begin
  125.     //Paste.SendText(PChar(lbList.Items.Objects[lbList.itemindex]));
  126.  
  127.     Paste.SetClipboardOnlyOnce;
  128.     i := (lbList.Count - 1) - lbList.ItemIndex;
  129.     Paste.SendText(RemovedQueue.GetItemText(i), nil);
  130.     
  131.     self.hide;
  132. end;
  133.  
  134. procedure TFrmRemoved.bCloseClick(Sender: TObject);
  135. begin
  136.     lblist.Items.Clear;
  137.     self.Close;
  138. end;
  139.  
  140. procedure TFrmRemoved.bFlushItemsClick(Sender: TObject);
  141. begin
  142.     RemovedQueue.ClearQueue;
  143.     lbList.Items.Clear;
  144. end;
  145.  
  146.  
  147. procedure TFrmRemoved.FormClose(Sender: TObject; var Action: TCloseAction);
  148. begin
  149.     lblist.Items.Clear;
  150.     mPreview.Clear;
  151.     
  152.     {
  153.     if FrmConfig.cbRemember.checked then begin
  154.         frmClipboardManager.SaveHistory;
  155.     end;
  156.     }
  157. end;
  158.  
  159. procedure TFrmRemoved.FormHide(Sender: TObject);
  160. begin
  161.     lbList.Items.Clear;
  162. end;
  163.  
  164. procedure TFrmRemoved.FormCreate(Sender: TObject);
  165. begin
  166.     //ci := TClipItem.Create;
  167. end;
  168.  
  169. procedure TFrmRemoved.btnCopyAsClick(Sender: TObject);
  170. begin
  171.     Paste.SetClipboardOnlyOnce;
  172.     Paste.SendText('', ci);
  173. end;
  174.  
  175. procedure TFrmRemoved.lbListMeasureItem(Control: TWinControl;
  176.   Index: Integer; var Height: Integer);
  177. begin
  178.   height := math.max(18, lbList.Canvas.TextHeight('ALKJDIOJ')+4);
  179. end;
  180.  
  181. procedure TFrmRemoved.lbListDrawItem(Control: TWinControl; Index: Integer;
  182.   Rect: TRect; State: TOwnerDrawState);
  183. var ci : TClipItem;
  184.     th, h : integer;
  185.     c : TColor;
  186.     s : string;
  187. begin
  188.     // height of rectangle & height of text on the listbox
  189.     h := (rect.Bottom - rect.top) + 1;
  190.     th := lbList.Canvas.TextHeight('ALKJDFIOJ');
  191.  
  192.  
  193.     //
  194.     // draw the icon leaving enough pixels above and below
  195.     // for the selection outline
  196.     //
  197.     s := lbList.Items.Strings[index];
  198.     ci := RemovedQueue.GetItemClip((lbList.Count - 1) - index);
  199.     if (ci <> nil) then begin
  200.         if (ci.CData.GetHICON <> 0) then begin
  201.             DrawIconEX(
  202.                 lbList.Canvas.Handle, rect.Left+2, rect.Top+1,ci.CData.GetHICON,
  203.                 h-2, h-2,
  204.                 0,0,DI_NORMAL);
  205.         end;
  206.         s := UnitMisc.GetCliptypeSymbol(ci.GetFormat) + ' ' + s;
  207.         self.FreeRemoved(ci);
  208.     end;
  209.  
  210.     // leave a space for the icon
  211.     // center the text if possible
  212.     if (h  <=  th) then begin
  213.         lbList.Canvas.TextOut(
  214.             rect.Left + h + 3, rect.Top, s
  215.         );
  216.     end else begin
  217.         lbList.Canvas.TextOut(
  218.             rect.Left + h + 3, floor((h-th)/2) + rect.Top, s
  219.         );
  220.     end;
  221.  
  222.  
  223.     //
  224.     // Draw/Clear the selection outline
  225.     //
  226.     c := lbList.Canvas.Brush.color;
  227.     if (odSelected in state) then begin
  228.         lbList.Canvas.Brush.Color := clHighlight;
  229.         lbList.Canvas.FrameRect(rect);
  230.     end else begin
  231.         lbList.Canvas.Brush.color := clWindow;
  232.         lbList.Canvas.FrameRect(rect);
  233.     end;
  234.     lbList.Canvas.Brush.color := c;
  235.  
  236. end;
  237. procedure TFrmRemoved.FreeRemoved(ci: TClipItem);
  238. var h : HICON;
  239. begin
  240.     //
  241.     // Removed items are generated on the fly and resources must
  242.     // be freed manually.
  243.     //
  244.     if (ci <> nil) then begin
  245.         h := ci.CData.GetHICONAbsolute;
  246.         UnitMisc.MyDestroyIcon(h);
  247.         MyFree(ci);
  248.     end;
  249. end;
  250.  
  251. end.
  252.  
  253.  
  254.