home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Softwarová Záchrana 3
/
Softwarova-zachrana-3.bin
/
ArsClip
/
source.zip
/
UnitFrmRemoved.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2003-09-17
|
7KB
|
254 lines
unit UnitFrmRemoved;
{
Purpose:
User interface to copy a removed item to the clipboard
Updates:
fixed broken "Copy" button
--------------
Made form scalable
NOTES: I'm using the same dirty trick to work-around Win9x control
memory limitations as I used in FrmClipboardManager.
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, UnitClipQueue, ComCtrls, ExtCtrls;
type
TFrmRemoved = class(TForm)
bCopy: TButton;
bClose: TButton;
Label1: TLabel;
mPreview: TMemo;
bFlushItems: TButton;
btnCopyAs: TButton;
iPreview: TImage;
lbList: TListBox;
Label2: TLabel;
procedure FormShow(Sender: TObject);
procedure lbListClick(Sender: TObject);
procedure bCopyClick(Sender: TObject);
procedure bCloseClick(Sender: TObject);
procedure bFlushItemsClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormHide(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btnCopyAsClick(Sender: TObject);
procedure lbListMeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
procedure lbListDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FreeRemoved(ci : TClipItem);
private
{ Private declarations }
//HistoryLoaded : boolean;
ci : TClipItem;
public
{ Public declarations }
end;
var
FrmRemoved: TFrmRemoved;
implementation
{$R *.dfm}
Uses StrUtils, Clipbrd, UnitFrmHotKey, UnitFrmConfig,
UnitFrmClipboardManager, UnitPaste, Math, UnitMisc;
const REMOVED_FILE = 'removed.txt';
procedure TFrmRemoved.FormShow(Sender: TObject);
var i : longint;
s : string;
begin
bCopy.Enabled := false;
mPreview.Clear;
lbList.Items.BeginUpdate;
lbList.Items.Clear;
for i := (RemovedQueue.GetQueueCount - 1) downto 0 do begin
s := RemovedQueue.GetItemText(i);
lbList.Items.Add(LeftStr(s,160));
end;
lbList.Items.EndUpdate;
end;
procedure TFrmRemoved.lbListClick(Sender: TObject);
var i : integer;
begin
// reverse the index from 0 - (N-1) to (N-1) - 0
bCopy.Enabled := true;
mPreview.Visible := false;
iPreview.Visible := false;
bCopy.Enabled := true;
i := (lbList.Count - 1) - lbList.ItemIndex;
mPreview.Text := Leftstr(
RemovedQueue.GetItemText(i),
10000);
self.FreeRemoved(ci);
ci := RemovedQueue.GetItemClip(i);
btnCopyAs.Visible := false;
if (ci <> nil) then begin
if (ci.GetFormat <> 0) then begin
btnCopyAs.Hint := ci.GetFormatName;
btnCopyAs.Caption := 'Copy as ' + LeftStr(btnCopyAs.Hint, 10);
btnCopyAs.Visible := true;
end;
if (ci.GetFormat = CF_DIB) then begin
mPreview.Visible := false;
iPreview.Visible := true;
ci.GetDIB(iPreview.Picture);
end;
end;
if(not iPreview.Visible) then begin
mPreview.Visible := true;
iPreview.Visible := false;
end;
end;
procedure TFrmRemoved.bCopyClick(Sender: TObject);
var i : integer;
begin
//Paste.SendText(PChar(lbList.Items.Objects[lbList.itemindex]));
Paste.SetClipboardOnlyOnce;
i := (lbList.Count - 1) - lbList.ItemIndex;
Paste.SendText(RemovedQueue.GetItemText(i), nil);
self.hide;
end;
procedure TFrmRemoved.bCloseClick(Sender: TObject);
begin
lblist.Items.Clear;
self.Close;
end;
procedure TFrmRemoved.bFlushItemsClick(Sender: TObject);
begin
RemovedQueue.ClearQueue;
lbList.Items.Clear;
end;
procedure TFrmRemoved.FormClose(Sender: TObject; var Action: TCloseAction);
begin
lblist.Items.Clear;
mPreview.Clear;
{
if FrmConfig.cbRemember.checked then begin
frmClipboardManager.SaveHistory;
end;
}
end;
procedure TFrmRemoved.FormHide(Sender: TObject);
begin
lbList.Items.Clear;
end;
procedure TFrmRemoved.FormCreate(Sender: TObject);
begin
//ci := TClipItem.Create;
end;
procedure TFrmRemoved.btnCopyAsClick(Sender: TObject);
begin
Paste.SetClipboardOnlyOnce;
Paste.SendText('', ci);
end;
procedure TFrmRemoved.lbListMeasureItem(Control: TWinControl;
Index: Integer; var Height: Integer);
begin
height := math.max(18, lbList.Canvas.TextHeight('ALKJDIOJ')+4);
end;
procedure TFrmRemoved.lbListDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var ci : TClipItem;
th, h : integer;
c : TColor;
s : string;
begin
// height of rectangle & height of text on the listbox
h := (rect.Bottom - rect.top) + 1;
th := lbList.Canvas.TextHeight('ALKJDFIOJ');
//
// draw the icon leaving enough pixels above and below
// for the selection outline
//
s := lbList.Items.Strings[index];
ci := RemovedQueue.GetItemClip((lbList.Count - 1) - index);
if (ci <> nil) then begin
if (ci.CData.GetHICON <> 0) then begin
DrawIconEX(
lbList.Canvas.Handle, rect.Left+2, rect.Top+1,ci.CData.GetHICON,
h-2, h-2,
0,0,DI_NORMAL);
end;
s := UnitMisc.GetCliptypeSymbol(ci.GetFormat) + ' ' + s;
self.FreeRemoved(ci);
end;
// leave a space for the icon
// center the text if possible
if (h <= th) then begin
lbList.Canvas.TextOut(
rect.Left + h + 3, rect.Top, s
);
end else begin
lbList.Canvas.TextOut(
rect.Left + h + 3, floor((h-th)/2) + rect.Top, s
);
end;
//
// Draw/Clear the selection outline
//
c := lbList.Canvas.Brush.color;
if (odSelected in state) then begin
lbList.Canvas.Brush.Color := clHighlight;
lbList.Canvas.FrameRect(rect);
end else begin
lbList.Canvas.Brush.color := clWindow;
lbList.Canvas.FrameRect(rect);
end;
lbList.Canvas.Brush.color := c;
end;
procedure TFrmRemoved.FreeRemoved(ci: TClipItem);
var h : HICON;
begin
//
// Removed items are generated on the fly and resources must
// be freed manually.
//
if (ci <> nil) then begin
h := ci.CData.GetHICONAbsolute;
UnitMisc.MyDestroyIcon(h);
MyFree(ci);
end;
end;
end.