6 ConstantsClass
, CustomStringGridClass
, HardwareClass
, ResourcesClass
,
8 Classes
, Controls
, Graphics
, Grids
, StdCtrls
, Types
;
14 TCustomView
= class(TCustomStringGrid
)
16 pChanges
: array of array of Boolean;
17 pColorTheme
: TViewTheme
;
19 pOldOnOperand
, pOldOnState
, pOnOperand
, pOnState
: TChangeEvent
;
20 function pGetChanges(ACol
, ARow
: Integer): Boolean; virtual;
21 function pGetColCount
: Longint; virtual;
22 function pGetRowCount
: Longint; virtual;
23 procedure pCustomDblClick(Sender
: TObject
); virtual;
24 procedure pCustomDrawCell(Sender
: TObject
; ACol
, ARow
: Integer; Rect
: TRect
; State
: TGridDrawState
); virtual;
25 procedure pCustomMouseDown(Sender
: TObject
; Button
: TMouseButton
; Shift
: TShiftState
; X
, Y
: Integer); virtual;
26 procedure pDrawSingleCell(Canvas
: TCanvas
; ACol
, ARow
: Integer; Rect
: TRect
; Colors
: TColors
); virtual;
27 procedure pOnOperandProc(Sender
: TObject
); virtual;
28 procedure pOnSelectCell(Sender
: TObject
; ACol
, ARow
: Integer; var CanSelect
: Boolean); virtual;
29 procedure pOnStateProc(Sender
: TObject
); virtual;
30 procedure pSetChanges(ACol
, ARow
: Integer; Change
: Boolean); virtual;
31 procedure pSetColorTheme(ColorTheme
: TViewTheme
); virtual;
32 procedure pSetColCount(Count
: Integer); virtual;
33 procedure pSetHardware(Input
: THardware
); virtual;
34 procedure pSetRowCount(Count
: Integer); virtual;
36 constructor CreateView(AOwner
: TComponent
; Hw
: THardware
); virtual;
37 destructor Destroy
; override;
38 property Changes
[ACol
, ARow
: Integer]: Boolean read pGetChanges write pSetChanges
;
39 property ColorTheme
: TViewTheme read pColorTheme write pSetColorTheme
;
40 property ColCount
: Longint read pGetColCount write pSetColCount
;
41 property Hardware
: THardware read pHardware write pSetHardware
;
42 property OnOperand
: TChangeEvent read pOnOperand write pOnOperand
;
43 property OnState
: TChangeEvent read pOnState write pOnState
;
44 property RowCount
: Longint read pGetRowCount write pSetRowCount
;
49 // ************************************************************************** //
50 // * TCustomView implementation * //
51 // ************************************************************************** //
53 function TCustomView
.pGetChanges(ACol
, ARow
: Integer): Boolean;
56 if (ACol
< 0) or not(ACol
< ColCount
) then Exit
;
57 if (ARow
< 0) or not(ARow
< RowCount
) then Exit
;
58 Result
:= pChanges
[ACol
, ARow
];
61 function TCustomView
.pGetColCount
: Longint;
63 Result
:= inherited ColCount
;
66 function TCustomView
.pGetRowCount
: Longint;
68 Result
:= inherited RowCount
;
71 procedure TCustomView
.pCustomDblClick(Sender
: TObject
);
76 OnKeyDown(Self
, lkey
, []);
79 procedure TCustomView
.pCustomDrawCell(Sender
: TObject
; ACol
, ARow
: Integer;
80 Rect
: TRect
; State
: TGridDrawState
);
82 if (gdSelected
in State
) and Selected
then
83 pDrawSingleCell(Canvas
, ACol
, ARow
, Rect
, ColorTheme
.Line
.Selected
)
85 pDrawSingleCell(Canvas
, ACol
, ARow
, Rect
, ColorTheme
.Line
.None
)
88 procedure TCustomView
.pCustomMouseDown(Sender
: TObject
; Button
: TMouseButton
;
89 Shift
: TShiftState
; X
, Y
: Integer);
94 MouseToCell(X
, Y
, lcol
, lrow
);
95 if SelectCell(lcol
, lrow
) then
98 // Lazarus is really nice, by having incompatible calls :-(
102 lselect
.Bottom
:= lrow
;
103 lselect
.Left
:= lcol
;
104 lselect
.Right
:= lcol
;
105 Selection
:= lselect
;
110 procedure TCustomView
.pDrawSingleCell(Canvas
: TCanvas
; ACol
, ARow
: Integer;
111 Rect
: TRect
; Colors
: TColors
);
118 Canvas
.Brush
.Color
:= Colors
.BG
;
119 if Changes
[ACol
, ARow
] then Canvas
.Font
.Color
:= ColorTheme
.Change
120 else Canvas
.Font
.Color
:= Colors
.FG
;
121 lsize
:= Canvas
.TextExtent(Cells
[ACol
, ARow
]);
122 lx
:= (Right
- Left
- lsize
.cx
) div 2 + Left
;
123 ly
:= (Bottom
- Top
- lsize
.cy
) div 2 + Top
;
124 Canvas
.FillRect(Rect
);
125 Canvas
.TextOut(lx
, ly
, Cells
[ACol
, ARow
]);
129 procedure TCustomView
.pOnOperandProc(Sender
: TObject
);
131 if not(@pOnOperand
= nil) then pOnOperand(Sender
);
133 if not(@pOldOnOperand
= nil) then pOldOnOperand(Sender
);
136 procedure TCustomView
.pOnSelectCell(Sender
: TObject
; ACol
, ARow
: Integer;
137 var CanSelect
: Boolean);
139 CanSelect
:= not(ACol
= 0);
142 procedure TCustomView
.pOnStateProc(Sender
: TObject
);
144 if not(@pOnState
= nil) then pOnState(Sender
);
146 if not(@pOldOnState
= nil) then pOldOnState(Sender
);
149 procedure TCustomView
.pSetChanges(ACol
, ARow
: Integer; Change
: Boolean);
151 if (ACol
< 0) or not(ACol
< ColCount
) then Exit
;
152 if (ARow
< 0) or not(ARow
< RowCount
) then Exit
;
153 pChanges
[ACol
, ARow
] := Change
;
156 procedure TCustomView
.pSetColorTheme(ColorTheme
: TViewTheme
);
158 pColorTheme
:= ColorTheme
;
159 Color
:= ColorTheme
.Line
.None
.BG
;
162 procedure TCustomView
.pSetColCount(Count
: Integer);
166 inherited ColCount
:= Count
;
167 SetLength(pChanges
, inherited ColCount
);
168 for i
:= 0 to (ColCount
- 1) do
169 SetLength(pChanges
[i
], inherited RowCount
);
172 procedure TCustomView
.pSetHardware(Input
: THardware
);
174 if not(pHardware
= nil) then pHardware
.OnState
:= pOldOnState
;
176 if not(Input
= nil) then
178 pOldOnOperand
:= Input
.OnOperand
;
179 pOldOnState
:= Input
.OnState
;
180 Input
.OnOperand
:= pOnOperandProc
;
181 Input
.OnState
:= pOnStateProc
;
185 procedure TCustomView
.pSetRowCount(Count
: Integer);
189 inherited RowCount
:= Count
;
190 SetLength(pChanges
, inherited ColCount
);
191 for i
:= 0 to (ColCount
- 1) do
192 SetLength(pChanges
[i
], inherited RowCount
);
195 constructor TCustomView
.CreateView(AOwner
: TComponent
; Hw
: THardware
);
197 inherited Create(AOwner
);
198 ColorTheme
:= THEME_VIEW_DEFAULT
;
199 RowCount
:= RowCount
;
200 ScrollBars
:= ssNone
;
202 Options
:= [goRangeSelect
, goThumbTracking
];
203 // Behavior of goRangeSelect differ in Lazarus :-(
205 Options
:= [goThumbTracking
];
207 DefaultDrawing
:= False;
208 OnDrawCell
:= pCustomDrawCell
;
209 OnDblClick
:= pCustomDblClick
;
210 OnMouseDown
:= pCustomMouseDown
;
211 OnSelectCell
:= pOnSelectCell
;
215 destructor TCustomView
.Destroy
;