1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
{ $Id$}
{
*****************************************************************************
* WSGrids.pp *
* ---------- *
* *
* *
*****************************************************************************
*****************************************************************************
This file is part of the Lazarus Component Library (LCL)
See the file COPYING.modifiedLGPL.txt, included in this distribution,
for details about the license.
*****************************************************************************
}
unit WSGrids;
{$mode objfpc}{$H+}
{$I lcl_defines.inc}
interface
////////////////////////////////////////////////////
// I M P O R T A N T
////////////////////////////////////////////////////
// 1) Only class methods allowed
// 2) Class methods have to be published and virtual
// 3) To get as little as posible circles, the uses
// clause should contain only those LCL units
// needed for registration. WSxxx units are OK
// 4) To improve speed, register only classes in the
// initialization section which actually
// implement something
// 5) To enable your XXX widgetset units, look at
// the uses clause of the XXXintf.pp
////////////////////////////////////////////////////
uses
////////////////////////////////////////////////////
// To get as little as posible circles,
// uncomment only when needed for registration
////////////////////////////////////////////////////
LCLType, Types, Controls, StdCtrls, Grids, LazUTF8, Graphics,
////////////////////////////////////////////////////
WSLCLClasses, WSControls, WSFactory;
type
{ TWSCustomGrid }
TWSCustomGrid = class(TWSCustomControl)
published
class procedure SendCharToEditor(AEditor:TWinControl; Ch: TUTF8Char); virtual;
class function InvalidateStartY(const FixedHeight, RowOffset: Integer): integer; virtual;
class procedure Invalidate(sender: TCustomGrid); virtual; reintroduce;
class function GetEditorBoundsFromCellRect(ACanvas: TCanvas;
const ACellRect: TRect; const AColumnLayout: TTextLayout): TRect; virtual;
end;
TWSCustomGridClass = class of TWSCustomgrid;
{ WidgetSetRegistration }
function RegisterCustomGrid: Boolean;
implementation
uses
LCLIntf;
type
TCustomGridAccess=class(TCustomGrid)
end;
{ TWSCustomGrid }
class procedure TWSCustomGrid.SendCharToEditor(AEditor:TWinControl;
Ch: TUTF8Char);
var
GMsg: TGridMessage;
GridEditor: boolean;
begin
GMsg.Grid := nil;
GMsg.Options:= 0;
GMsg.LclMsg.Msg:=GM_GETGRID;
AEditor.Dispatch(GMsg);
GridEditor := (GMsg.Options and EO_IMPLEMENTED<>0) and (GMsg.Grid<>nil);
GMsg.LclMsg.Msg:=GM_SETVALUE;
if Ch=#8 then // backspace
GMsg.Value:=''
else
GMsg.Value:=Ch;
if GridEditor then
AEditor.Dispatch(GMsg)
else begin
// TODO: Find a generic way ...
if AEditor is TCustomEdit then begin
TCustomEdit(AEditor).Text:=GMsg.Value;
TCustomEdit(AEditor).SelStart:=UTF8Length(GMsg.Value);
end else
if AEditor is TCustomCombobox then begin
TCustomCombobox(AEditor).Text:=GMsg.Value;
TCustomCombobox(AEditor).SelStart:=UTF8Length(GMsg.Value);
end;
end;
// make sure the grid is notified that some text is changed, some
// widgets do not notify when they are modified programmatically.
if GMsg.Grid<>nil then
with TCustomGridAccess(GMsg.Grid) do
EditorTextChanged(Col, Row, GMsg.Value);
end;
class function TWSCustomGrid.GetEditorBoundsFromCellRect(ACanvas: TCanvas;
const ACellRect: TRect; const AColumnLayout: TTextLayout): TRect;
begin
Result := ACellRect;
Dec(Result.Right);
Dec(Result.Bottom);
end;
class function TWSCustomGrid.InvalidateStartY(const FixedHeight,
RowOffset: Integer): integer;
begin
result := FixedHeight;
end;
class procedure TWSCustomGrid.Invalidate(sender: TCustomGrid);
begin
// override in widgetset level if needed
end;
{ WidgetSetRegistration }
function RegisterCustomGrid: Boolean;
const
Done: Boolean = False;
begin
Result := False;
if Done then exit;
if not WSRegisterCustomGrid then
RegisterWSComponent(TCustomGrid, TWSCustomGrid);
Done := True;
Result := True;
end;
end.
|