tvplanit: More refactoring of TVpContactGridPainter

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8524 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2022-10-08 13:44:27 +00:00
parent 070182f1d4
commit 3da97ca4d6
2 changed files with 236 additions and 188 deletions

View File

@ -119,7 +119,9 @@ type
FPendingDatastore: TVpCustomDatastore; FPendingDatastore: TVpCustomDatastore;
// FRowHeight: Integer; // FRowHeight: Integer;
FTextMargin: Integer; FTextMargin: Integer;
function GetDisplayEMailValue(AContact: TVpContact): String;
procedure InternalSetDatastore(const Value: TVpCustomDatastore); procedure InternalSetDatastore(const Value: TVpCustomDatastore);
procedure SetDisplayEMailValue(AContact: TVpContact; AEMail: String);
procedure SetPopupMenu(AValue: TPopupMenu); procedure SetPopupMenu(AValue: TPopupMenu);
procedure SetTextMargin(AValue: Integer); procedure SetTextMargin(AValue: Integer);
protected{ private } protected{ private }
@ -195,8 +197,6 @@ type
function GetContactIndexByCoord(Pnt: TPoint): Integer; function GetContactIndexByCoord(Pnt: TPoint): Integer;
class function GetControlClassDefaultSize: TSize; override; class function GetControlClassDefaultSize: TSize; override;
function GetDisplayEMailField(AContact: TVpContact): String; function GetDisplayEMailField(AContact: TVpContact): String;
function GetDisplayEMailValue(AContact: TVpContact): String;
procedure SetDisplayEMailValue(AContact: TVpContact; AEMail: String);
procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseEnter; override; procedure MouseEnter; override;
procedure MouseLeave; override; procedure MouseLeave; override;
@ -278,6 +278,7 @@ type
property ActiveContact: TVpContact read FActiveContact; property ActiveContact: TVpContact read FActiveContact;
property ContactIndex: Integer read FContactIndex write SetContactIndex; property ContactIndex: Integer read FContactIndex write SetContactIndex;
property DisplayEMailValue[AContact: TVpContact]: String read GetDisplayEMailValue write SetDisplayEMailValue;
// Unscaled some dimensions // Unscaled some dimensions
// property RowHeight: Integer read FRowHeight; // property RowHeight: Integer read FRowHeight;

View File

@ -13,10 +13,11 @@ type
TVpContactGridPainter = class(TVpBasePainter) TVpContactGridPainter = class(TVpBasePainter)
private private
FContactGrid: TVpContactGrid; FContactGrid: TVpContactGrid;
FLabelWidth: Integer;
FScaledTextMargin: Integer; FScaledTextMargin: Integer;
// local variables of the original TVpContactGrid method // local variables of the original TVpContactGrid method
PhoneLblWidth: Integer; // PhoneLblWidth: Integer;
StartContact: Integer; StartContact: Integer;
RealColumnWidth: Integer; RealColumnWidth: Integer;
RealColor: TColor; RealColor: TColor;
@ -28,14 +29,20 @@ type
RealBarColor: TColor; RealBarColor: TColor;
RealContactHeadAttrColor: TColor; RealContactHeadAttrColor: TColor;
protected
function CalcHeaderRect(ABitmap: TBitmap): TRect; function CalcHeaderRect(ABitmap: TBitmap): TRect;
function CalcInitialAnchor(ABitmap: TBitmap): TPoint;
function CalcLabelWidth(ABitmap: TBitmap): Integer;
protected
procedure Clear; procedure Clear;
procedure DrawBorders; procedure DrawBorders;
procedure DrawContactHeader(ABitmap: TBitmap; AContact: TVpContact; procedure DrawContactHeader(ABitmap: TBitmap; AContact: TVpContact;
const ARect: TRect); const ARect: TRect);
procedure DrawContactRow(ABitmap: TBitmap; AText, ALabel: String; procedure DrawContactRow(ABitmap: TBitmap; AText, ALabel: String;
var AWholeRect, ATextRect: TRect); var AWholeRect, ATextRect: TRect);
function DrawContactRows(ABitmap: TBitmap; AContact: TVpContact;
var Anchor: TPoint; var AWholeRect: TRect; var ACol, ARecsInCol: Integer;
var AContactRec: TVpContactRec): Boolean;
procedure DrawContacts; procedure DrawContacts;
procedure DrawVerticalBars; procedure DrawVerticalBars;
procedure FixFontHeights; procedure FixFontHeights;
@ -95,6 +102,43 @@ begin
end; end;
end; end;
function TVpContactGridPainter.CalcInitialAnchor(ABitmap: TBitmap): TPoint;
var
anchorMargin: Integer;
px2: Integer;
begin
px2 := round(Scale*2);
anchorMargin := px2 + FScaledTextMargin * 2;
case Angle of
ra0, ra90:
Result := Point(anchorMargin, anchorMargin);
ra180:
Result := Point(WidthOf(RenderIn) - ABitmap.Width - anchorMargin, ABitmap.Height - anchorMargin);
ra270:
Result := Point(anchorMargin, HeightOf(RenderIn) - ABitmap.Height - anchorMargin);
end;
end;
{ Calculates the width of the longest label in each row of the contact display. }
function TVpContactGridPainter.CalcLabelWidth(ABitmap: TBitmap): Integer;
var
s: String;
i, w: Integer;
begin
ABitmap.Canvas.Font.Assign(FContactGrid.Font);
ABitmap.Canvas.Font.PixelsPerInch := RenderCanvas.Font.PixelsPerInch;
{$IF VP_LCL_SCALING = 0}
ABitmap.Canvas.Font.Size := ScaleY(ABitmap.Canvas.Font.Size, DesignTimeDPI);
{$ENDIF}
Result := ABitmap.Canvas.TextWidth(RSEmail);
for i := 0 to 7 do begin
s := PhoneLabel(TVpPhoneType(i)) + ': ';
w := ABitmap.Canvas.TextWidth(s);
if w > Result then
Result := w;
end;
end;
procedure TVpContactGridPainter.Clear; procedure TVpContactGridPainter.Clear;
var var
I: Integer; I: Integer;
@ -261,7 +305,8 @@ begin
ra180: ra180:
begin begin
ATextRect.Left := AWholeRect.Right - FScaledTextMargin * 2; // Shouldn't this be "div 2" ? ATextRect.Left := AWholeRect.Right - FScaledTextMargin * 2; // Shouldn't this be "div 2" ?
ATextRect.Top := AWholeRect.Top - txtHeight - FScaledTextMargin; //ATextRect.Top := AWholeRect.Top - txtHeight - FScaledTextMargin;
ATextRect.Top := AWholeRect.Top - txtHeight; // + FScaledTextMargin div 2;
ATextRect.Right := AWholeRect.Left + FScaledTextMargin; ATextRect.Right := AWholeRect.Left + FScaledTextMargin;
ATextRect.Bottom := AWholeRect.Top - FScaledTextMargin div 2; ATextRect.Bottom := AWholeRect.Top - FScaledTextMargin div 2;
AWholeRect.Top := ATextRect.Top; AWholeRect.Top := ATextRect.Top;
@ -292,10 +337,10 @@ begin
with ATextRect do with ATextRect do
case Angle of case Angle of
ra0 : TopLeft := Point(Left + PhoneLblWidth, Top + FScaledTextMargin div 2); ra0 : TopLeft := Point(Left + FLabelWidth, Top + FScaledTextMargin div 2);
ra90 : TopLeft := Point(Top + PhoneLblWidth, Left + FScaledTextMargin); ra90 : TopLeft := Point(Top + FLabelWidth, Left + FScaledTextMargin);
ra180 : TopLeft := Point(Left - PhoneLblWidth, top + FScaledTextMargin div 2); ra180 : TopLeft := Point(Left - FLabelWidth, top + FScaledTextMargin div 2);
ra270 : TopLeft := Point(Left + FScaledTextMargin div 2, Top - PhoneLblWidth); ra270 : TopLeft := Point(Left + FScaledTextMargin div 2, Top - FLabelWidth);
end; end;
TPSTextOutAtPoint( TPSTextOutAtPoint(
ABitmap.Canvas, ABitmap.Canvas,
@ -316,6 +361,154 @@ begin
); );
end; end;
{ Draws selected data for the specified contact on the auxiliary bitmap.
Anchor ...... position at which the data will appear on the rendering canvas.
AWholeRect .. rectangle covered by the data rows (header included). It is
relative to the auxiliary bitmap.
ACol ........ Column counter, advances when a new column is started
ARecsInCol .. Counter for the records in the first column
AContactRec . Record storing mostly the rectangles of the data elements to
facilitate handling of clicks in the ContactGrid.
Result ...... normally true. But when the size of the rendering canvas is
exceeded becomes false to indicate an error condition. }
function TVpContactGridPainter.DrawContactRows(ABitmap: TBitmap;
AContact: TVpContact; var Anchor: TPoint; var AWholeRect: TRect;
var ACol, ARecsInCol: Integer; var AContactRec: TVpContactRec): Boolean;
var
s: String;
px2: Integer;
textColWidth: Integer;
newCol: Boolean;
begin
Result := true;
case Angle of
ra0, ra180: textColWidth := ABitmap.Width;
ra90, ra270: textColWidth := ABitmap.Height;
end;
px2 := Round(2 * Scale); // Size of two scaled pixels.
// Set font and colors for the contact data
ABitmap.Canvas.Font.Assign(FContactGrid.Font);
ABitmap.Canvas.Font.PixelsPerInch := RenderCanvas.Font.PixelsPerInch;
{$IF VP_LCL_SCALING = 0}
ABitmap.Canvas.Font.Size := ScaleY(ABitmap.Canvas.Font.Size, DesignTimeDPI);
{$ENDIF}
Abitmap.Canvas.Brush.Color := RealColor;
// Draw company
DrawContactRow(ABitmap, AContact.Company, '', AWholeRect, AContactRec.CompanyRect);
// Draw address
DrawContactRow(ABitmap, AContact.Address1, '', AWholeRect, AContactRec.AddressRect);
// Draw city, state, zip
s := AssembleCSZ(AContact, 1, FContactGrid.GetCityStateZipFormat);
DrawContactRow(ABitmap, s, '', AWholeRect, AContactRec.CSZRect);
// Draw phone1
s := PhoneLabel(TVpPhoneType(AContact.PhoneType1)) + ': ';
DrawContactRow(ABitmap, AContact.Phone1, s, AWholeRect, AContactRec.Phone1Rect);
// Draw phone2
s := PhoneLabel(TVpPhoneType(AContact.PhoneType2)) + ': ';
DrawContactRow(ABitmap, AContact.Phone2, s, AWholeRect, AContactRec.Phone2Rect);
// Draw phone3
s := PhoneLabel(TVpPhoneType(AContact.PhoneType3)) + ': ';
DrawContactRow(ABitmap, AContact.Phone3, s, AWholeRect, AContactRec.Phone3Rect);
// Draw phone4
s := PhoneLabel(TVpPhoneType(AContact.PhoneType4)) + ': ';
DrawContactRow(ABitmap, AContact.Phone4, s, AWholeRect, AContactRec.Phone4Rect);
// Draw phone5
s := PhoneLabel(TVpPhoneType(AContact.PhoneType5)) + ': ';
DrawContactRow(ABitmap, AContact.Phone5, s, AWholeRect, AContactRec.Phone5Rect);
// Draw EMail
s := FContactGrid.DisplayEMailValue[AContact];
DrawContactRow(ABitmap, s, RSEmail + ': ', AWholeRect, AContactRec.EMailRect);
// If this record is too big to fit in the remaining area of this column,
// then slide over to the top of the next column }
newCol := false;
if ARecsInCol > 0 then
case Angle of
ra0:
if (RenderIn.Top + Anchor.y + AWholeRect.Bottom >= RenderIn.Bottom - FScaledTextMargin * 3) then
begin
newCol := true;
Anchor := Point(
Anchor.x + AWholeRect.Right + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3,
px2 + FScaledTextMargin * 2
);
if DisplayOnly and (Anchor.X + textColWidth >= RenderIn.Right) then
Result := false;
end;
ra90:
if (Anchor.x + RenderIn.Left + WidthOf(AWholeRect) > RenderIn.Right - FScaledTextMargin * 3) then
begin
newCol := true;
Anchor.x := px2 + FScaledTextMargin * 2;
Anchor.y := Anchor.y + AWholeRect.Bottom + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3;
if DisplayOnly and (Anchor.y + textColWidth >= RenderIn.Bottom) then
Result := false;
end;
ra180:
if (Anchor.y + RenderIn.Top - HeightOf(AWholeRect) <= RenderIn.Top + FScaledTextMargin * 3) then
begin
newCol := true;
Anchor.x := Anchor.x - (AWholeRect.Right + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3);
Anchor.y := ABitmap.Height - px2 - FScaledTextMargin * 2;
if DisplayOnly and (Anchor.x + textColWidth < RenderIn.Left) then
Result := false;
end;
ra270:
if (Anchor.x + RenderIn.Left + WidthOf(AWholeRect) >= RenderIn.Right - FScaledTextMargin * 3) then
begin
newCol := true;
Anchor.x := px2 + FScaledTextMargin * 2;
Anchor.y := Anchor.y - (AWholeRect.Bottom + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3);
if DisplayOnly and (Anchor.y + textColWidth <= RenderIn.Top) then
Result := false;
end;
end;
if newCol then
begin
// New columns: Increment the column counter. Store the counter of records
// in the 1st column and reset it for the new column.
if ACol = 1 then
TVpContactGridOpener(FContactGrid).cgCol1RecCount := ARecsInCol;
Inc(ACol);
ARecsInCol := 0;
end else
// Still the same column: Increment the counter of records per column
// (Is evaluated only when we are drawing the first column).
inc(ARecsInCol);
// Add some spacing between records
case Angle of
ra0 : AWholeRect.Bottom := AWholeRect.Bottom + FScaledTextMargin * 2;
ra90 : AWholeRect.Left := AWholeRect.Left - FScaledTextMargin * 2;
ra180 : AWholeRect.Top := AWholeRect.Top - FScaledTextMargin * 2;
ra270 : AWholeRect.Right := AWholeRect.Right + FScaledTextMargin * 2;
end;
// Move data rectangles to the position at which they will appear on
// the render canvas.
OffsetRect(AContactRec.AddressRect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.CSZRect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.CompanyRect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.EMailRect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.Phone1Rect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.Phone2Rect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.Phone3Rect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.Phone4Rect, Anchor.X, Anchor.Y);
OffsetRect(AContactRec.Phone5Rect, Anchor.X, Anchor.Y);
end;
{ Draws all contacts. To simplify the layout each contact is drawn first into { Draws all contacts. To simplify the layout each contact is drawn first into
a temporary bitmap which is later copied to the rendering canvas. } a temporary bitmap which is later copied to the rendering canvas. }
procedure TVpContactGridPainter.DrawContacts; procedure TVpContactGridPainter.DrawContacts;
@ -327,18 +520,9 @@ var
contact: TVpContact; contact: TVpContact;
Col, RecsInCol: Integer; Col, RecsInCol: Integer;
WholeRect: TRect; WholeRect: TRect;
TextColWidth: Integer;
oldCol1RecCount: Integer; oldCol1RecCount: Integer;
CR: TVpContactRec;
HeadRect: TRect = (Left:0; Top:0; Right:0; Bottom:0); HeadRect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
AddrRect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
CSZRect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
CompanyRect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
EMailRect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
Phone1Rect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
Phone2Rect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
Phone3Rect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
Phone4Rect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
Phone5Rect: TRect = (Left:0; Top:0; Right:0; Bottom:0);
contactCount: Integer; contactCount: Integer;
anchorMargin: Integer; anchorMargin: Integer;
px2, px4: Integer; // Scaled 2, 4 pixels px2, px4: Integer; // Scaled 2, 4 pixels
@ -368,41 +552,19 @@ begin
if (Angle = ra0) or (Angle = ra180) then begin if (Angle = ra0) or (Angle = ra180) then begin
TmpBmp.Width := RealColumnWidth - FScaledTextMargin * 4 + px4; TmpBmp.Width := RealColumnWidth - FScaledTextMargin * 4 + px4;
TmpBmp.Height := RealHeight - FScaledTextMargin * 2; TmpBmp.Height := RealHeight - FScaledTextMargin * 2;
TextColWidth := TmpBmp.Width;
end else begin end else begin
TmpBmp.Height := RealColumnWidth - FScaledTextMargin * 4 + px4; TmpBmp.Height := RealColumnWidth - FScaledTextMargin * 4 + px4;
TmpBmp.Width := RealHeight - FScaledTextMargin * 2; TmpBmp.Width := RealHeight - FScaledTextMargin * 2;
TextColWidth := TmpBmp.Height;
end; end;
// Calculate max label width
FLabelWidth := CalcLabelWidth(TmpBmp);
// Calculate the header rectangle. It is the same for all contacts. // Calculate the header rectangle. It is the same for all contacts.
HeadRect := CalcHeaderRect(TmpBmp); HeadRect := CalcHeaderRect(TmpBmp);
TmpBmp.Canvas.Font.Assign(FContactGrid.Font);
TmpBmp.Canvas.Font.PixelsPerInch := RenderCanvas.Font.PixelsPerInch;
{$IF VP_LCL_SCALING = 0}
TmpBmp.Canvas.Font.Size := ScaleY(TmpBmp.Canvas.Font.Size, DesignTimeDPI);
{$ENDIF}
// Calculate max phone label width
PhoneLblWidth := TmpBmp.Canvas.TextWidth(RSEmail);
for I := 0 to 7 do begin
Str := PhoneLabel(TVpPhoneType(I)) + ': ';
w := TmpBmp.Canvas.TextWidth(Str);
if w > PhoneLblWidth then
PhoneLblWidth := w;
end;
// Set the anchor starting point for the very first (top/left) contact // Set the anchor starting point for the very first (top/left) contact
anchorMargin := px2 + FScaledTextMargin * 2; Anchor := CalcInitialAnchor(TmpBmp);
case Angle of
ra0, ra90:
Anchor := Point(anchorMargin, anchorMargin);
ra180:
Anchor := Point(WidthOf(RenderIn) - TmpBmp.Width - anchorMargin, TmpBmp.Height - anchorMargin);
ra270:
Anchor := Point(anchorMargin, HeightOf(RenderIn) - TmpBmp.Height - anchorMargin);
end;
// Sort the records // Sort the records
FContactGrid.DataStore.Resource.Contacts.Sort; FContactGrid.DataStore.Resource.Contacts.Sort;
@ -412,154 +574,39 @@ begin
RecsInCol := 0; RecsInCol := 0;
for I := StartContact to pred(contactCount) do begin for I := StartContact to pred(contactCount) do begin
contact := FContactGrid.DataStore.Resource.Contacts.GetContact(I); contact := FContactGrid.DataStore.Resource.Contacts.GetContact(I);
if (contact <> nil) then begin if contact = nil then
TVpContactGridOpener(FContactGrid).cgContactArray[I].Contact := contact; Continue;
// Clear bmp canvas // Clear bmp canvas
TmpBmp.Canvas.Brush.Color := RealColor; TmpBmp.Canvas.Brush.Color := RealColor;
TmpBmp.Canvas.FillRect(Rect(0, 0, TmpBmp.Width, TmpBmp.Height)); TmpBmp.Canvas.FillRect(Rect(0, 0, TmpBmp.Width, TmpBmp.Height));
// Start building the WholeRect // Draw the contact header
WholeRect := HeadRect; DrawContactHeader(TmpBmp, contact, HeadRect);
if Angle = ra180 then
WholeRect.BottomRight := Point(TmpBmp.Width, TmpBmp.Height);
// Draw the contact header // Draw the contact data
DrawContactHeader(TmpBmp, contact, HeadRect); WholeRect := HeadRect;
if Angle = ra180 then
WholeRect.BottomRight := Point(TmpBmp.Width, TmpBmp.Height);
if DrawContactRows(TmpBmp, contact, Anchor, WholeRect, Col, RecsInCol, CR) then
begin
CR.Index := I;
CR.Contact := contact;
CR.WholeRect := MoveRect(WholeRect, Anchor);
CR.HeaderRect := MoveRect(HeadRect, Anchor);
TVpContactGridOpener(FContactGrid).cgContactArray[I] := CR;
end else
exit; // to do: begin a new page here!
// Set font and colors for the contact data // Draw the contact bitmap on the rendering canvas
TmpBmp.Canvas.Font.Assign(FContactGrid.Font); PaintContactBitmap(TmpBmp, contact, Anchor, WholeRect);
TmpBmp.Canvas.Font.PixelsPerInch := RenderCanvas.Font.PixelsPerInch;
{$IF VP_LCL_SCALING = 0}
TmpBmp.Canvas.Font.Size := ScaleY(TmpBmp.Canvas.Font.Size, DesignTimeDPI);
{$ENDIF}
TmpBmp.Canvas.Brush.Color := RealColor;
// Draw company // Slide anchor down for the next record
DrawContactRow(TmpBmp, contact.Company, '', WholeRect, CompanyRect); case Angle of
ra0 : Anchor.Y := Anchor.Y + WholeRect.Bottom;
// Draw address ra90 : Anchor.X := Anchor.X + WidthOf(WholeRect);
DrawContactRow(TmpBmp, contact.Address1, '', WholeRect, AddrRect); ra180 : Anchor.Y := Anchor.Y - HeightOf(WholeRect);
ra270 : Anchor.X := Anchor.X + WholeRect.Right;
// Draw city, state, zip
Str := AssembleCSZ(contact, 1, FContactGrid.GetCityStateZipFormat);
DrawContactRow(TmpBmp, Str, '', WholeRect, CSZRect);
// Draw phone1
Str := PhoneLabel(TVpPhoneType(contact.PhoneType1)) + ': ';
DrawContactRow(TmpBmp, contact.Phone1, Str, WholeRect, Phone1Rect);
// Draw phone2
Str := PhoneLabel(TVpPhoneType(contact.PhoneType2)) + ': ';
DrawContactRow(TmpBmp, contact.Phone2, Str, WholeRect, Phone2Rect);
// Draw phone3
Str := PhoneLabel(TVpPhoneType(contact.PhoneType3)) + ': ';
DrawContactRow(TmpBmp, contact.Phone3, Str, WholeRect, Phone3Rect);
// Draw phone4
Str := PhoneLabel(TVpPhoneType(contact.PhoneType4)) + ': ';
DrawContactRow(TmpBmp, contact.Phone4, Str, WholeRect, Phone4Rect);
// Draw phone5
Str := PhoneLabel(TVpPhoneType(contact.PhoneType5)) + ': ';
DrawContactRow(TmpBmp, contact.Phone5, Str, WholeRect, Phone5Rect);
// Draw EMail
Str := TVpContactGridOpener(FContactGrid).GetDisplayEMailValue(contact);
DrawContactRow(TmpBmp, Str, RSEmail + ': ', WholeRect, EMailRect);
// If this record's too big to fit in the remaining area of this column,
// then slide over to the top of the next column }
if RecsInCol > 0 then
case Angle of
ra0:
if (RenderIn.Top + Anchor.y + WholeRect.Bottom >= RenderIn.Bottom - FScaledTextMargin * 3) then
begin
Anchor := Point(
Anchor.x + WholeRect.Right + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3,
px2 + FScaledTextMargin * 2
);
if Col = 1 then
TVpContactGridOpener(FContactGrid).cgCol1RecCount := RecsInCol;
Inc(Col);
RecsInCol := 0;
if DisplayOnly and (Anchor.X + TextColWidth >= RenderIn.Right) then
Exit;
end;
ra90 :
if (Anchor.x + RenderIn.Left + WholeRect.Right - WholeRect.Left > RenderIn.Right - FScaledTextMargin * 3) then
begin
Anchor.x := px2 + FScaledTextMargin * 2;
Anchor.y := Anchor.y + WholeRect.Bottom + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3;
if Col = 1 then
TVpContactGridOpener(FContactGrid).cgCol1RecCount := RecsInCol;
Inc(Col);
RecsInCol := 0;
if DisplayOnly and (Anchor.y + TextColWidth >= RenderIn.Bottom) then
Exit;
end;
ra180 :
if (Anchor.y + RenderIn.Top - WholeRect.Bottom - WholeRect.Top <= RenderIn.Top + FScaledTextMargin * 3) then
begin
Anchor.x := Anchor.x - (WholeRect.Right + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3);
Anchor.y := TmpBmp.Height - px2 - FScaledTextMargin * 2;
if Col = 1 then
TVpContactGridOpener(FContactGrid).cgCol1RecCount := RecsInCol;
Inc(Col);
RecsInCol := 0;
if DisplayOnly and (Anchor.x + TextColWidth < RenderIn.Left) then
Exit;
end;
ra270 :
if (Anchor.x + RenderIn.Left + (WholeRect.Right - WholeRect.Left) >= RenderIn.Right - FScaledTextMargin * 3) then
begin
Anchor.x := px2 + FScaledTextMargin * 2;
Anchor.y := Anchor.y - (WholeRect.Bottom + FContactGrid.BarWidth + 1 + FScaledTextMargin * 3);
if Col = 1 then
TVpContactGridOpener(FContactGrid).cgCol1RecCount := RecsInCol;
Inc(Col);
RecsInCol := 0;
if DisplayOnly and (Anchor.y + TextColWidth <= RenderIn.Top) then
Exit;
end;
end;
// Add some spacing between records
case Angle of
ra0 : WholeRect.Bottom := WholeRect.Bottom + FScaledTextMargin * 2;
ra90 : WholeRect.Left := WholeRect.Left - FScaledTextMargin * 2;
ra180 : WholeRect.Top := WholeRect.Top - FScaledTextMargin * 2;
ra270 : WholeRect.Right := WholeRect.Right + FScaledTextMargin * 2;
end;
// Update array rects
with TVpContactGridOpener(FContactGrid) do begin
cgContactArray[I].WholeRect := MoveRect(WholeRect, Anchor);
cgContactArray[I].HeaderRect := MoveRect(HeadRect, Anchor);
cgContactArray[I].AddressRect := MoveRect(AddrRect, Anchor);
cgContactArray[I].CSZRect := MoveRect(CSZRect, Anchor);
cgContactArray[I].CompanyRect := MoveRect(CompanyRect, Anchor);
cgContactArray[I].EMailRect := MoveRect(EMailRect, Anchor);
cgContactArray[I].Phone1Rect := MoveRect(Phone1Rect, Anchor);
cgContactArray[I].Phone2Rect := MoveRect(Phone2Rect, Anchor);
cgContactArray[I].Phone3Rect := MoveRect(Phone3Rect, Anchor);
cgContactArray[I].Phone4Rect := MoveRect(Phone4Rect, Anchor);
cgContactArray[I].Phone5Rect := MoveRect(Phone5Rect, Anchor);
end;
// Draw the contact bitmap on the rendering canvas
PaintContactBitmap(TmpBmp, contact, Anchor, WholeRect);
// Slide anchor down for the next record
case Angle of
ra0 : Anchor.Y := Anchor.Y + WholeRect.Bottom;
ra90 : Anchor.X := Anchor.X + (WholeRect.Right - WholeRect.Left);
ra180 : Anchor.Y := Anchor.Y - (WholeRect.Bottom - WholeRect.Top);
ra270 : Anchor.X := Anchor.X + WholeRect.Right;
end;
Inc(RecsInCol);
end; end;
if not DisplayOnly then if not DisplayOnly then