unit view.fra_showitem;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Graphics, Controls, ComCtrls, Grids, ExtCtrls, model.intf;
type
{ TfraShowItem }
TfraShowItem = class(TFrame)
grdNvn: TStringGrid;
btnClose: TPanel;
lblTitleVal: TPanel;
lblExtraVal: TPanel;
pnlTiRight: TPanel;
pnlExtraId: TPanel;
pnlTitleId: TPanel;
pnlTiLeft: TPanel;
pnlTiEx: TPanel;
pnlBottom: TPanel;
pnlHead: TPanel;
procedure btnChooseClick(Sender: TObject);
procedure btnChooseMouseEnter(Sender: TObject);
procedure btnChooseMouseLeave(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
procedure btnCloseMouseEnter(Sender: TObject);
procedure btnCloseMouseLeave(Sender: TObject);
procedure grdNvnDblClick(Sender: TObject);
procedure grdNvnKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
procedure grdNvnResize(Sender: TObject);
procedure grdNvnSelection(Sender: TObject; {%H-}aCol, {%H-}aRow: Integer);
private
fActiveTrx: ImemTransaction; { to keep our current item }
fOwner: TWinControl;
fParentForm: TForm;
fViMo: ImemViewModelMain;
procedure FrameShow(Sender: TObject);
procedure SetupFrame;
protected
procedure CopyValueToClip(aGridRow: cardinal);
public
procedure BeforeDestruction; override; { should get called just before we're out of business }
procedure Init(aViMo: ImemViewModelMain;anItem: ImemItem); { constructor / oncreate }
end;
{ CreateShowFrame instantiates a show-frame in the anOwner(TTabSheet) provided
and works on the anItem provided, result is the new frame;
Caution: DO NOT pass nil in any parameter!!! }
function CreateShowFrame(anOwner: TWinControl; aViMo: ImemViewModelMain; anItem: ImemItem): TfraShowItem;
implementation { bc_messages provides post/send-message + LM_CLOSETABSHEET etc... }
uses bc.advstring, bc.pcthelp, bc.grdhelp, bc.messages, model.decl, clipbrd;
function CreateShowFrame(anOwner: TWinControl; aViMo: ImemViewModelMain; anItem: ImemItem): TfraShowItem;
begin
Result:= TfraShowItem.Create(anOwner); { anOwner is the tab/page and will free us }
Result.Parent:= anOwner; { anOwner is also the tab/page that will draw us }
Result.fOwner:= anOwner;
TTabSheet(Result.fOwner).OnShow:= @Result.FrameShow;
Result.fParentForm:= bcGetParentForm(anOwner); //GetParentForm(Self); from forms.pp
Result.Name:= 'ShowItem';
Result.Align:= alClient;
Result.Init(aViMo,anItem);
end;
{$R *.lfm}
{ TfraShowItem }
procedure TfraShowItem.btnCloseClick(Sender: TObject);
begin // post msg with pg in wparam & -1 in lparam
try
if fOwner is TTabSheet then begin
if fParentForm <> nil then
bcPostMessage(fParentForm.Handle,LM_CLOSETABSHEET,ptrint(fOwner),-1); { trickery }
end;
except end;
end;
procedure TfraShowItem.btnCloseMouseEnter(Sender: TObject);
begin
with (Sender as TPanel) do begin
Font.Color:= clYellow;
Font.Style:= [fsBold];
end;
end;
procedure TfraShowItem.btnCloseMouseLeave(Sender: TObject);
begin
with (Sender as TPanel) do begin
Font.Color:= clAqua;
Font.Style:= [];
end;
end;
procedure TfraShowItem.grdNvnDblClick(Sender: TObject);
begin
btnCloseClick(Sender);
end;
procedure TfraShowItem.grdNvnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var ct: boolean;
begin
ct:= (ssCtrl in Shift);
case Key of
$08: btnCloseClick(Sender); // backspace
$0D: btnCloseClick(Sender); // enter
$20: btnCloseClick(Sender); // space
$1B: btnCloseClick(Sender); // escape
$43: if ct then begin
CopyValueToClip(grdNvn.Row);// ctrl + C
Key:= 0;
end;
end;
if grdNvn.CanSetFocus then grdNvn.SetFocus; {=^}
end;
procedure TfraShowItem.grdNvnResize(Sender: TObject);
var sixth: word = 0;
begin
sixth:= ((grdNvn.Width-25) div 6); // 25 for scrollbar, 1part, 2part & 3part
if grdNvn.ColCount >= 3 then begin
grdNvn.Columns[0].Width:= sixth+50;
grdNvn.Columns[1].Width:= sixth * 2;
grdNvn.Columns[2].Width:= (sixth * 3)-50;
end;
if grdNvn.CanSetFocus then grdNvn.SetFocus; {=^}
end;
procedure TfraShowItem.grdNvnSelection(Sender: TObject; aCol, aRow: Integer);
begin
if grdNvn.CanSetFocus then grdNvn.SetFocus; {=^}
end;
procedure TfraShowItem.btnChooseClick(Sender: TObject); /// not in use, but kept for reference
begin // post msg with pg in wparam & id i lparam
try
if fOwner is TTabSheet then begin
if fParentForm <> nil then
bcPostMessage(fParentForm.Handle,LM_CLOSETABSHEET,ptrint(fOwner),fActiveTrx.ID); { trickery }
end;
except end;
end;
procedure TfraShowItem.btnChooseMouseEnter(Sender: TObject); /// not in use, but kept for reference
begin
with (Sender as TPanel) do begin
Font.Color:= clYellow;
Font.Style:= [fsBold];
end;
end;
procedure TfraShowItem.btnChooseMouseLeave(Sender: TObject); /// not in use, but kept for reference
begin
with (Sender as TPanel) do begin
Font.Color:= clAqua;
Font.Style:= [];
end;
end;
procedure TfraShowItem.FrameShow(Sender: TObject);
begin
if grdNvn.CanSetFocus then grdNvn.SetFocus; {=^}
end;
procedure TfraShowItem.SetupFrame;
var sixth: word = 0; i: integer; s: string;
begin
lblTitleVal.Caption:= fActiveTrx.Title;
lblExtraVal.Caption:= fActiveTrx.Extra;
bcGridClear(grdNvn,false,false);
sixth:= ((grdNvn.Width-25) div 6); // 25 for scrollbar
bcGridCreateHeaders(grdNvn,['Name','Value','Note'],[sixth+50,sixth*2,(sixth*3)-50]);
grdNvn.TitleFont.Color:= clAqua;
grdNvn.TitleFont.Style:= [fsBold]; //???
for i:= 0 to fActiveTrx.Items.Count-1 do begin
s:= fActiveTrx.Items[i];
bcGridSetRowText(grdNvn,-1,[bcGetStrField(0,s,'|'),
bcGetStrField(1,s,'|'),
bcGetStrField(2,s,'|')]);
end;
if grdNvn.CanSetFocus then grdNvn.SetFocus; {=^}
end;
procedure TfraShowItem.CopyValueToClip(aGridRow: cardinal);
var ls: string;
begin
ls:= fActiveTrx.Items[aGridRow-1]; { grids count /real/ values from 1 }
ls:= bcGetStrField(1,ls,'|'); { pick 'Value' from the entire row's text }
Clipboard.AsText:= ls; { now insert the text into global clipboard }
fViMo.Provider.NotifyConsumers(13,nil,bcStrNew('(i) "'+ls+'" copied to clipboard')); // 13 = prStatus
end;
procedure TfraShowItem.BeforeDestruction;
begin
if Assigned(fActiveTrx) then fActiveTrx.Obj.Free;
inherited BeforeDestruction;
end;
procedure TfraShowItem.Init(aViMo: ImemViewModelMain;anItem: ImemItem);
begin
if anItem <> nil then begin
fViMo:= aViMo;
fActiveTrx:= TmemTransaction.Create;
fActiveTrx.AssignFrom(anItem);
pnlHead.Caption:= 'Memento #'+fActiveTrx.ID.ToString+', last edited: '+fActiveTrx.DateTime;
pnlBottom.Caption:= memShowItemBottomCapt; { was: Press [ Space, Escape, Enter, BackSpace ] to return }
SetupFrame;
end else btnCloseClick(btnClose);
end;
end.