{*********************************************************} {* OVCTCBMP.PAS 4.06 *} {*********************************************************} {* ***** BEGIN LICENSE BLOCK ***** *} {* Version: MPL 1.1 *} {* *} {* The contents of this file are subject to the Mozilla Public License *} {* Version 1.1 (the "License"); you may not use this file except in *} {* compliance with the License. You may obtain a copy of the License at *} {* http://www.mozilla.org/MPL/ *} {* *} {* Software distributed under the License is distributed on an "AS IS" basis, *} {* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License *} {* for the specific language governing rights and limitations under the *} {* License. *} {* *} {* The Original Code is TurboPower Orpheus *} {* *} {* The Initial Developer of the Original Code is TurboPower Software *} {* *} {* Portions created by TurboPower Software Inc. are Copyright (C)1995-2002 *} {* TurboPower Software Inc. All Rights Reserved. *} {* *} {* Contributor(s): *} {* *} {* ***** END LICENSE BLOCK ***** *} {$I OVC.INC} {$B-} {Complete Boolean Evaluation} {$I+} {Input/Output-Checking} {$P+} {Open Parameters} {$T-} {Typed @ Operator} {.W-} {Windows Stack Frame} {$X+} {Extended Syntax} unit ovctcbmp; {-Orpheus Table Cell - Bitmap type} interface uses {$IFNDEF LCL} Windows, {$ELSE} LclIntf, MyMisc, {$ENDIF} SysUtils, Graphics, Classes, OvcTCmmn, OvcTCell; type TOvcTCBaseBitMap = class(TOvcBaseTableCell) protected {.Z+} procedure tcPaint(TableCanvas : TCanvas; const CellRect : TRect; RowNum : TRowNum; ColNum : TColNum; const CellAttr : TOvcCellAttributes; Data : pointer); override; {.Z-} public function EditHandle : THandle; override; procedure EditHide; override; procedure EditMove(CellRect : TRect); override; procedure SaveEditedData(Data : pointer); override; procedure StartEditing(RowNum : TRowNum; ColNum : TColNum; CellRect : TRect; const CellAttr : TOvcCellAttributes; CellStyle: TOvcTblEditorStyle; Data : pointer); override; procedure StopEditing(SaveValue : boolean; Data : pointer); override; end; TOvcTCCustomBitMap = class(TOvcTCBaseBitMap) protected {.Z+} procedure tcPaint(TableCanvas : TCanvas; const CellRect : TRect; RowNum : TRowNum; ColNum : TColNum; const CellAttr : TOvcCellAttributes; Data : pointer); override; {.Z-} public {.Z+} procedure ResolveAttributes(RowNum : TRowNum; ColNum : TColNum; var CellAttr : TOvcCellAttributes); override; {.Z-} end; TOvcTCBitMap = class(TOvcTCCustomBitMap) published {properties inherited from custom ancestor} property AcceptActivationClick default False; property Access default otxDefault; property Adjust default otaDefault; property Color; property Margin default 4; property Table; property TableColor default True; property OnOwnerDraw; end; implementation {===TOvcTCBaseBitMap=================================================} procedure TOvcTCBaseBitMap.tcPaint(TableCanvas : TCanvas; const CellRect : TRect; RowNum : TRowNum; ColNum : TColNum; const CellAttr : TOvcCellAttributes; Data : pointer); type LH = packed record cX, cY : word; end; var BMInfo : PCellBitMapInfo absolute Data; Wd, Ht : integer; DisplayWd : integer; DisplayHt : integer; CellWidth : integer; CellHeight : integer; SrcRect, DestRect : TRect; TransparentColor : TColor; CellAdj : TOvcTblAdjust; begin {blank out the cell (also sets the brush color)} inherited tcPaint(TableCanvas, CellRect, RowNum, ColNum, CellAttr, Data); {if there's no data, the index to the sub-bitmap is zero or the cell is invisible anyway, just exit} if (Data = nil) or (BMInfo^.Index = -1) or (CellAttr.caAccess = otxInvisible) then Exit; {make a note of the adjustment, and calc the cell width and height} CellAdj := CellAttr.caAdjust; CellWidth := CellRect.Right - CellRect.Left; CellHeight := CellRect.Bottom - CellRect.Top; {calculate data about the bitmap, including the source rectangle} with BMInfo^ do begin Wd := BM.Width; if (Count <= 1) then Index := 0 else begin Wd := Wd div Count; if (Index >= Count) then Index := 0; end; Ht := BM.Height; DisplayWd := MinI(Wd, (CellWidth - 2*Margin)); DisplayHt := MinI(Ht, (CellHeight - 2*Margin)); with SrcRect do begin Left := Index * Wd; Right := Left + DisplayWd; Top := 0; Bottom := Top + DisplayHt; end; TransparentColor := BM.Canvas.Pixels[SrcRect.Left, Ht-1] end; {calculate the destination rectangle} with DestRect do begin case CellAdj of otaTopLeft, otaCenterLeft, otaBottomLeft : Left := Margin; otaTopRight, otaCenterRight, otaBottomRight : Left := (CellWidth - DisplayWd - Margin); else Left := (CellWidth - DisplayWd) div 2; end;{case} inc(Left, CellRect.Left); case CellAdj of otaTopLeft, otaTopCenter, otaTopRight : Top := Margin; otaBottomLeft, otaBottomCenter, otaBottomRight : Top := (CellHeight - DisplayHt - Margin); else Top := (CellHeight - DisplayHt) div 2; end;{case} inc(Top, CellRect.Top); Right := Left + DisplayWd; Bottom := Top + DisplayHt; end; {brush copy the bitmap onto the table} //{$IFNDEF LCL} // TableCanvas.BrushCopy(DestRect, BMInfo^.BM, SrcRect, TransparentColor); //{$ELSE} BrushCopy(TableCanvas, DestRect, BMInfo^.BM, SrcRect, TransparentColor); //{$ENDIF} end; function TOvcTCBaseBitMap.EditHandle : THandle; begin {stub out abstract method so BCB doesn't see this as an abstract class} Result := 0; end; procedure TOvcTCBaseBitMap.EditHide; begin {stub out abstract method so BCB doesn't see this as an abstract class} end; procedure TOvcTCBaseBitMap.EditMove(CellRect : TRect); begin {stub out abstract method so BCB doesn't see this as an abstract class} end; procedure TOvcTCBaseBitMap.SaveEditedData(Data : pointer); begin {stub out abstract method so BCB doesn't see this as an abstract class} end; procedure TOvcTCBaseBitMap.StartEditing(RowNum : TRowNum; ColNum : TColNum; CellRect : TRect; const CellAttr : TOvcCellAttributes; CellStyle: TOvcTblEditorStyle; Data : pointer); begin {stub out abstract method so BCB doesn't see this as an abstract class} end; procedure TOvcTCBaseBitMap.StopEditing(SaveValue : boolean; Data : pointer); begin {stub out abstract method so BCB doesn't see this as an abstract class} end; {====================================================================} {===TOvcTCCustomBitMap===============================================} procedure TOvcTCCustomBitMap.tcPaint(TableCanvas : TCanvas; const CellRect : TRect; RowNum : TRowNum; ColNum : TColNum; const CellAttr : TOvcCellAttributes; Data : pointer); var BitMap : TBitmap absolute Data; BMInfo : TCellBitMapInfo; begin {if there's no bitmap, just let our ancestor deal with it} if (Data = nil) then inherited tcPaint(TableCanvas, CellRect, RowNum, ColNum, CellAttr, nil) {otherwise set up a bitmap info record, and let the ancestor paint it} else begin with BMInfo do begin BM := BitMap; Count := 1; ActiveCount := 1; Index := 0; end; inherited tcPaint(TableCanvas, CellRect, RowNum, ColNum, CellAttr, @BMInfo); end; end; {--------} procedure TOvcTCCustomBitMap.ResolveAttributes(RowNum : TRowNum; ColNum : TColNum; var CellAttr : TOvcCellAttributes); begin inherited ResolveAttributes(RowNum, ColNum, CellAttr); case CellAttr.caAccess of otxDefault, otxNormal : CellAttr.caAccess := otxReadOnly; end;{case} end; {====================================================================} end.