You've already forked lazarus-ccr
tvplanit: Move MonthView painting code into a separate unit (VpMonthViewPainter). Some minor fixes in demo.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4808 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -409,7 +409,7 @@ begin
|
|||||||
SetLanguage(lang);
|
SetLanguage(lang);
|
||||||
|
|
||||||
SetActiveView(ini.ReadInteger('Settings', 'ActiveView', 0));
|
SetActiveView(ini.ReadInteger('Settings', 'ActiveView', 0));
|
||||||
VpNavBar1.ActiveFolder := FActiveView mod 1000;
|
VpNavBar1.ActiveFolder := FActiveView div 1000;
|
||||||
|
|
||||||
CbTimeFormat.ItemIndex := ini.ReadInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
|
CbTimeFormat.ItemIndex := ini.ReadInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
|
||||||
CbTimeFormatChange(nil);
|
CbTimeFormatChange(nil);
|
||||||
@ -444,9 +444,12 @@ begin
|
|||||||
ini.WriteInteger('Form', 'Height', Height);
|
ini.WriteInteger('Form', 'Height', Height);
|
||||||
ini.WriteInteger('Left', 'Left', Left);
|
ini.WriteInteger('Left', 'Left', Left);
|
||||||
ini.WriteInteger('Form', 'Top', Top);
|
ini.WriteInteger('Form', 'Top', Top);
|
||||||
|
end;
|
||||||
|
if FActiveView = 0 then begin
|
||||||
ini.WriteInteger('Form', 'LeftPanel_Width', LeftPanel.Width);
|
ini.WriteInteger('Form', 'LeftPanel_Width', LeftPanel.Width);
|
||||||
ini.WriteInteger('Form', 'BottomPanel_Height', VpMonthView1.Height);
|
ini.WriteInteger('Form', 'BottomPanel_Height', VpMonthView1.Height);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ini.WriteString('Settings', 'Language', FLang);
|
ini.WriteString('Settings', 'Language', FLang);
|
||||||
ini.WriteInteger('Settings', 'ActiveView', FActiveView);
|
ini.WriteInteger('Settings', 'ActiveView', FActiveView);
|
||||||
ini.WriteInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
|
ini.WriteInteger('Settings', 'TimeFormat', ord(VpDayView1.TimeFormat));
|
||||||
|
@ -32,7 +32,7 @@ Portions created by TurboPower Software Inc. are Copyright (C) 2002 TurboPower S
|
|||||||
|
|
||||||
Contributor(s): "/>
|
Contributor(s): "/>
|
||||||
<Version Major="1" Release="4"/>
|
<Version Major="1" Release="4"/>
|
||||||
<Files Count="66">
|
<Files Count="67">
|
||||||
<Item1>
|
<Item1>
|
||||||
<Filename Value="../source/vpalarmdlg.lfm"/>
|
<Filename Value="../source/vpalarmdlg.lfm"/>
|
||||||
<Type Value="LFM"/>
|
<Type Value="LFM"/>
|
||||||
@ -298,6 +298,10 @@ Contributor(s): "/>
|
|||||||
<Filename Value="../source/vpweekviewpainter.pas"/>
|
<Filename Value="../source/vpweekviewpainter.pas"/>
|
||||||
<UnitName Value="VpWeekViewPainter"/>
|
<UnitName Value="VpWeekViewPainter"/>
|
||||||
</Item66>
|
</Item66>
|
||||||
|
<Item67>
|
||||||
|
<Filename Value="../source/vpmonthviewpainter.pas"/>
|
||||||
|
<UnitName Value="VpMonthViewPainter"/>
|
||||||
|
</Item67>
|
||||||
</Files>
|
</Files>
|
||||||
<i18n>
|
<i18n>
|
||||||
<EnableI18N Value="True"/>
|
<EnableI18N Value="True"/>
|
||||||
|
@ -268,7 +268,7 @@ type
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils, Math, LazUTF8, Forms, Dialogs, VpEvntEditDlg;
|
SysUtils, Math, LazUTF8, Forms, Dialogs, VpEvntEditDlg, VpMonthViewPainter;
|
||||||
|
|
||||||
(*****************************************************************************)
|
(*****************************************************************************)
|
||||||
{ TVpContactHeadAttr }
|
{ TVpContactHeadAttr }
|
||||||
@ -486,762 +486,18 @@ procedure TVpMonthView.RenderToCanvas (RenderCanvas : TCanvas;
|
|||||||
UseGran : TVpGranularity;
|
UseGran : TVpGranularity;
|
||||||
DisplayOnly : Boolean);
|
DisplayOnly : Boolean);
|
||||||
var
|
var
|
||||||
HeadRect : TRect;
|
painter: TVpMonthViewPainter;
|
||||||
SaveBrushColor : TColor;
|
|
||||||
SavePenStyle : TPenStyle;
|
|
||||||
SavePenColor : TColor;
|
|
||||||
DisplayDate : TDateTime;
|
|
||||||
|
|
||||||
RealWidth : Integer;
|
|
||||||
RealHeight : Integer;
|
|
||||||
RealLeft : Integer;
|
|
||||||
RealRight : Integer;
|
|
||||||
RealTop : Integer;
|
|
||||||
RealBottom : Integer;
|
|
||||||
Rgn : HRGN;
|
|
||||||
|
|
||||||
RealColor : TColor;
|
|
||||||
BevelHighlight : TColor;
|
|
||||||
BevelShadow : TColor;
|
|
||||||
BevelDarkShadow : TColor;
|
|
||||||
BevelFace : TColor;
|
|
||||||
DayHeadAttrColor : TColor;
|
|
||||||
RealLineColor : TColor;
|
|
||||||
RealOffDayColor : TColor;
|
|
||||||
RealSelDayColor : TColor;
|
|
||||||
EventFontColor : TColor;
|
|
||||||
DotDotDotColor : TColor;
|
|
||||||
|
|
||||||
procedure Clear;
|
|
||||||
begin
|
begin
|
||||||
RenderCanvas.Brush.Color := RealColor;
|
|
||||||
RenderCanvas.FillRect(RenderIn);
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
|
|
||||||
procedure SetMeasurements;
|
|
||||||
begin
|
|
||||||
RealWidth := TPSViewportWidth (Angle, RenderIn);
|
|
||||||
RealHeight := TPSViewportHeight (Angle, RenderIn);
|
|
||||||
RealLeft := TPSViewportLeft (Angle, RenderIn);
|
|
||||||
RealRight := TPSViewportRight (Angle, RenderIn);
|
|
||||||
RealTop := TPSViewportTop (Angle, RenderIn);
|
|
||||||
RealBottom := TPSViewportBottom (Angle, RenderIn);
|
|
||||||
|
|
||||||
if RenderDate = 0 then
|
|
||||||
DisplayDate := Date
|
|
||||||
else
|
|
||||||
DisplayDate := RenderDate;
|
|
||||||
|
|
||||||
{ we use the VpProductName because is is a good representation of some }
|
|
||||||
{ generic text }
|
|
||||||
RenderCanvas.Font.Assign(FDayHeadAttributes.Font);
|
|
||||||
mvDayHeadHeight := RenderCanvas.TextHeight(VpProductName) + TextMargin + 2;
|
|
||||||
RenderCanvas.Font.Assign(FDayNumberFont);
|
|
||||||
mvDayNumberHeight := RenderCanvas.TextHeight('00');
|
|
||||||
RenderCanvas.Font.Assign(FEventFont);
|
|
||||||
mvEventTextHeight := RenderCanvas.TextHeight(VpProductName);
|
|
||||||
RenderCanvas.Font.Assign(Font);
|
|
||||||
mvLineHeight := RenderCanvas.TextHeight(VpProductName) + 2;
|
|
||||||
mvColWidth := (RealWidth - 4) div 7;
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
|
|
||||||
procedure DrawHeader;
|
|
||||||
var
|
|
||||||
HeadTextRect: TRect;
|
|
||||||
HeadStr: string;
|
|
||||||
HeadStrLen : Integer;
|
|
||||||
begin
|
|
||||||
RenderCanvas.Brush.Color := DayHeadAttrColor;
|
|
||||||
{ draw the header cell and borders }
|
|
||||||
|
|
||||||
if FDrawingStyle = dsFlat then begin
|
|
||||||
{ draw an outer and inner bevel }
|
|
||||||
HeadRect.Left := RealLeft + 1;
|
|
||||||
HeadRect.Top := RealTop + 1;
|
|
||||||
HeadRect.Right := RealRight - 1;
|
|
||||||
HeadRect.Bottom := RealTop + mvDayHeadHeight;
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn, HeadRect);
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle, RenderIn, HeadRect),
|
|
||||||
BevelHighlight, BevelShadow);
|
|
||||||
end else if FDrawingStyle = ds3d then begin
|
|
||||||
{ draw a 3d bevel }
|
|
||||||
HeadRect.Left := RealLeft + 2;
|
|
||||||
HeadRect.Top := RealTop + 2;
|
|
||||||
HeadRect.Right := RealRight - 3;
|
|
||||||
HeadRect.Bottom := RealTop + mvDayHeadHeight;
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn, HeadRect);
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle, RenderIn, HeadRect),
|
|
||||||
BevelHighlight, BevelDarkShadow);
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
HeadRect.Left := RealLeft + 1;
|
|
||||||
HeadRect.Top := RealTop + 1;
|
|
||||||
HeadRect.Right := RealRight - 1;
|
|
||||||
HeadRect.Bottom := RealTop + mvDayHeadHeight;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ Acquire startdate and end date }
|
|
||||||
{$IF FPC_FULLVERSION >= 30000}
|
|
||||||
HeadStr := FormatDateTime(DateLabelFormat, DisplayDate);
|
|
||||||
{$ELSE}
|
|
||||||
HeadStr := SysToUTF8(FormatDateTime(DateLabelFormat, DisplayDate));
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{ draw the text }
|
|
||||||
if (DisplayOnly) and
|
|
||||||
(RenderCanvas.TextWidth (HeadStr) >= RealWidth) then
|
|
||||||
HeadTextRect.TopLeft:= Point (RealLeft + TextMargin * 2,
|
|
||||||
HeadRect.Top)
|
|
||||||
else if DisplayOnly then
|
|
||||||
HeadTextRect.TopLeft := Point (RealLeft +
|
|
||||||
(RealWidth -
|
|
||||||
RenderCanvas.TextWidth (HeadStr)) div 2,
|
|
||||||
HeadRect.Top)
|
|
||||||
else
|
|
||||||
HeadTextRect.TopLeft := Point (RealLeft + 30 + TextMargin * 2,
|
|
||||||
HeadRect.Top);
|
|
||||||
HeadTextRect.BottomRight := HeadRect.BottomRight;
|
|
||||||
|
|
||||||
{ Fix Header String }
|
|
||||||
HeadStrLen := RenderCanvas.TextWidth(HeadStr);
|
|
||||||
|
|
||||||
if HeadStrLen > HeadTextRect.Right - HeadTextRect.Left then begin
|
|
||||||
HeadStr := GetDisplayString(RenderCanvas, HeadStr, 0,
|
|
||||||
HeadTextRect.Right - HeadTextRect.Left - TextMargin);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ position the spinner }
|
|
||||||
mvSpinButtons.Height := Trunc(mvDayHeadHeight * 0.8);
|
|
||||||
mvSpinButtons.Width := mvSpinButtons.Height * 2;
|
|
||||||
mvSpinButtons.Left := TextMargin;
|
|
||||||
mvSpinButtons.Top := (mvDayHeadHeight - mvSpinButtons.Height) div 2 + 2;
|
|
||||||
|
|
||||||
RenderCanvas.Font.Assign (FDayHeadAttributes.Font);
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
RealLeft + mvSpinButtons.Width + TextMargin * 2,
|
|
||||||
HeadTextRect.Top + TextMargin, HeadStr);
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
|
|
||||||
procedure DrawDayHead;
|
|
||||||
var
|
|
||||||
dhRect : TRect;
|
|
||||||
I : Integer;
|
|
||||||
DayTag : Integer;
|
|
||||||
Str : string;
|
|
||||||
StrL : Integer;
|
|
||||||
begin
|
|
||||||
{ clear day head area }
|
|
||||||
RenderCanvas.Font.Assign(DayHeadAttributes.Font);
|
|
||||||
RenderCanvas.Brush.Color := DayHeadAttrColor;
|
|
||||||
|
|
||||||
{ build rect }
|
|
||||||
if DrawingStyle = ds3D then begin
|
|
||||||
dhRect.Left := RealLeft + 1;
|
|
||||||
dhRect.Top := RealTop + mvDayHeadHeight + 3;
|
|
||||||
dhRect.Right := RealRight - 3;
|
|
||||||
dhRect.Bottom := dhRect.Top + mvDayHeadHeight;
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn, dhRect);
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle, RenderIn, dhRect),
|
|
||||||
BevelHighlight, BevelDarkShadow);
|
|
||||||
end else begin
|
|
||||||
dhRect.Left := RealLeft + 1;
|
|
||||||
dhRect.Top := RealTop + mvDayHeadHeight + 2;
|
|
||||||
dhRect.Right := RealRight - 1;
|
|
||||||
dhRect.Bottom := dhRect.Top + mvDayHeadHeight;
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn, dhRect);
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle, RenderIn, dhRect),
|
|
||||||
BevelHighlight, BevelShadow);
|
|
||||||
end;
|
|
||||||
|
|
||||||
DayTag := Ord(WeekStartsOn);
|
|
||||||
dhRect.Right := dhRect.Left + mvColWidth;
|
|
||||||
for I := 0 to 6 do begin
|
|
||||||
{ draw the little vertical lines between each day }
|
|
||||||
if I < 6 then
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle, RenderIn,
|
|
||||||
Rect (dhRect.Right,
|
|
||||||
dhRect.Top + 3,
|
|
||||||
dhRect.Right + 1,
|
|
||||||
dhRect.Bottom - 3)),
|
|
||||||
BevelShadow, BevelHighlight);
|
|
||||||
|
|
||||||
if FDayNameStyle = dsLong then
|
|
||||||
{ Draw each day's full caption... }
|
|
||||||
{$IFDEF LCL}
|
|
||||||
str := FormatSettings.LongDayNames[DayTag+1]
|
|
||||||
{$ELSE}
|
|
||||||
case DayTag of
|
|
||||||
0: str := RSSunday;
|
|
||||||
1: str := RSMonday;
|
|
||||||
2: str := RSTuesday;
|
|
||||||
3: str := RSWednesday;
|
|
||||||
4: str := RSThursday;
|
|
||||||
5: str := RSFriday;
|
|
||||||
6: str := RSSaturday;
|
|
||||||
end
|
|
||||||
{$ENDIF }
|
|
||||||
else if FDayNameStyle = dsShort then
|
|
||||||
{ Draw each day's abbreviated caption... }
|
|
||||||
{$IFDEF LCL}
|
|
||||||
str := FormatSettings.ShortDayNames[DayTag+1]
|
|
||||||
{$ELSE}
|
|
||||||
case DayTag of
|
|
||||||
0: str := RSASunday;
|
|
||||||
1: str := RSAMonday;
|
|
||||||
2: str := RSATuesday;
|
|
||||||
3: str := RSAWednesday;
|
|
||||||
4: str := RSAThursday;
|
|
||||||
5: str := RSAFriday;
|
|
||||||
6: str := RSASaturday;
|
|
||||||
end
|
|
||||||
{$ENDIF}
|
|
||||||
else if FDayNameStyle = dsLetter then
|
|
||||||
{ Draw each day's first letter only }
|
|
||||||
{$IFDEF LCL}
|
|
||||||
str := FormatSettings.ShortDayNames[DayTag+1, 1];
|
|
||||||
{$ELSE}
|
|
||||||
case DayTag of
|
|
||||||
0: str := RSLSunday;
|
|
||||||
1: str := RSLMonday;
|
|
||||||
2: str := RSLTuesday;
|
|
||||||
3: str := RSLWednesday;
|
|
||||||
4: str := RSLThursday;
|
|
||||||
5: str := RSLFriday;
|
|
||||||
6: str := RSLSaturday;
|
|
||||||
end;
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
{ Fix Header String }
|
|
||||||
StrL := RenderCanvas.TextWidth(Str);
|
|
||||||
if (StrL > mvColWidth - (TextMargin * 2)) then begin
|
|
||||||
Str := GetDisplayString (RenderCanvas, Str, 0,
|
|
||||||
mvColWidth - (TextMargin * 2));
|
|
||||||
end;
|
|
||||||
StrL := RenderCanvas.TextWidth(Str);
|
|
||||||
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
dhRect.Left + (dhRect.Right - dhRect.Left) div 2 -
|
|
||||||
(Strl div 2), dhRect.Top + TextMargin - 1, Str);
|
|
||||||
|
|
||||||
if DayTag = 6 then
|
|
||||||
DayTag := 0
|
|
||||||
else
|
|
||||||
Inc(DayTag);
|
|
||||||
dhRect.Left := dhRect.Right;
|
|
||||||
dhRect.Right := dhRect.Left + mvColWidth;
|
|
||||||
end;
|
|
||||||
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
|
|
||||||
procedure DrawDays;
|
|
||||||
var
|
|
||||||
TextRect : TRect;
|
|
||||||
Col, Row : Integer;
|
|
||||||
DayNumber : Integer;
|
|
||||||
M, D, Y, Tmp : Word;
|
|
||||||
MonthStartsOn : Integer;
|
|
||||||
DayTag : Integer;
|
|
||||||
DayOffset : Integer;
|
|
||||||
StartingDate : TDateTime;
|
|
||||||
ThisDate : TDateTime;
|
|
||||||
Str : string;
|
|
||||||
StrLn : Integer;
|
|
||||||
I, J : Integer;
|
|
||||||
EventList : TList;
|
|
||||||
Drawn : Boolean;
|
|
||||||
TextAdjust : Integer;
|
|
||||||
FontStyle : TFontStyles;
|
|
||||||
OldBrush : TBrush;
|
|
||||||
OldPen : TPen;
|
|
||||||
OldFont : TFont;
|
|
||||||
begin
|
|
||||||
{ initialize the MonthDayArray }
|
|
||||||
for I := 0 to Pred(Length(mvMonthDayArray)) do begin
|
|
||||||
mvMonthDayArray[I].Rec := Rect(-1, -1, -1, -1);
|
|
||||||
mvMonthDayArray[I].Date := 0.0;
|
|
||||||
end;
|
|
||||||
|
|
||||||
RenderCanvas.Pen.Color := RealLineColor;
|
|
||||||
RenderCanvas.Brush.Color := RealColor;
|
|
||||||
mvRowHeight := (RealHeight - (mvDayHeadHeight * 2) - 4) div 6;
|
|
||||||
TextRect.TopLeft := Point (RealLeft + 1,
|
|
||||||
RealTop + (mvDayHeadHeight * 2) + 4);
|
|
||||||
TextRect.BottomRight := Point (TextRect.Left + mvColWidth,
|
|
||||||
TextRect.Top + mvRowHeight);
|
|
||||||
|
|
||||||
{ Determine the starting date and offset }
|
|
||||||
DecodeDate(DisplayDate, Y, M, D);
|
|
||||||
StartingDate := EncodeDate(Y, M, 1);
|
|
||||||
MonthStartsOn := DayOfWeek(StartingDate);
|
|
||||||
DayTag := Ord(WeekStartsOn);
|
|
||||||
DayOffset := DayTag - MonthStartsOn;
|
|
||||||
|
|
||||||
I := 0;
|
|
||||||
DayNumber := DayOffset + 1;
|
|
||||||
|
|
||||||
{ iterate through each column, row by row, drawing each day in numerical }
|
|
||||||
{ order. }
|
|
||||||
|
|
||||||
OldBrush := TBrush.Create;
|
|
||||||
try
|
|
||||||
OldPen := TPen.Create;
|
|
||||||
try
|
|
||||||
OldFont := TFont.Create;
|
|
||||||
try
|
|
||||||
for Row := 0 to 5 do begin
|
|
||||||
for Col := 0 to 6 do begin
|
|
||||||
if (Col = 6) then begin
|
|
||||||
{ draws the far right day for this week }
|
|
||||||
ThisDate := trunc(StartingDate + DayNumber);
|
|
||||||
DecodeDate(ThisDate, Y, Tmp, D);
|
|
||||||
|
|
||||||
{ Allow the user to draw the day }
|
|
||||||
Drawn := false;
|
|
||||||
if Assigned(FOwnerDrawCells) then begin
|
|
||||||
OldBrush.Assign (Canvas.Brush);
|
|
||||||
OldPen.Assign (Canvas.Pen);
|
|
||||||
OldFont.Assign (Canvas.Font);
|
|
||||||
try
|
|
||||||
FOwnerDrawCells(self, RenderCanvas, TextRect, D, Drawn);
|
|
||||||
if Drawn then continue;
|
|
||||||
finally
|
|
||||||
Canvas.Brush.Assign (OldBrush);
|
|
||||||
Canvas.Pen.Assign (OldPen);
|
|
||||||
Canvas.Font.Assign (OldFont);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
TextRect.Right := TextRect.Right + 8;
|
|
||||||
if Tmp <> M then begin
|
|
||||||
RenderCanvas.Brush.Color := RealOffDayColor;
|
|
||||||
if TextRect.Bottom > RealBottom then
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left, TextRect.Top,
|
|
||||||
RealRight, RealBottom))
|
|
||||||
else
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left, TextRect.Top,
|
|
||||||
RealRight, TextRect.Bottom));
|
|
||||||
end else
|
|
||||||
RenderCanvas.Brush.Color := RealColor;
|
|
||||||
{ draw bottom line }
|
|
||||||
TPSMoveTo (RenderCanvas, Angle, RenderIn,
|
|
||||||
TextRect.Left, TextRect.Bottom);
|
|
||||||
TPSLineTo (RenderCanvas, Angle, RenderIn, RealRight - 2,
|
|
||||||
TextRect.Bottom);
|
|
||||||
{ Paint the day number }
|
|
||||||
Str := FormatDateTime('d', ThisDate);
|
|
||||||
|
|
||||||
{ set the proper font and style }
|
|
||||||
RenderCanvas.Font.Assign(FDayNumberFont);
|
|
||||||
if (DisplayDate = ThisDate) then begin
|
|
||||||
if Focused then begin
|
|
||||||
TPSDrawFocusRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left - 2,
|
|
||||||
TextRect.Top - 2,
|
|
||||||
TextRect.Right + 2,
|
|
||||||
TextRect.Bottom + 2));
|
|
||||||
TPSDrawFocusRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left + 2,
|
|
||||||
TextRect.Top + 2,
|
|
||||||
TextRect.Right - 2,
|
|
||||||
TextRect.Bottom - 2));
|
|
||||||
end;
|
|
||||||
RenderCanvas.Font.Color := RealSelDayColor;
|
|
||||||
RenderCanvas.Font.Style := FDayNumberFont.Style + [fsBold];
|
|
||||||
if (FEventDayStyle <> []) and (DataStore.Resource <> nil)
|
|
||||||
and (DataStore.Resource.Schedule.EventCountByDay(ThisDate) > 0)
|
|
||||||
then
|
|
||||||
RenderCanvas.Font.Style := RenderCanvas.Font.Style
|
|
||||||
+ FEventDayStyle;
|
|
||||||
end else begin
|
|
||||||
{ Set the font style for days which have events. }
|
|
||||||
if (FEventDayStyle <> []) and (DataStore.Resource <> nil)
|
|
||||||
and (DataStore.Resource.Schedule.EventCountByDay(ThisDate) > 0)
|
|
||||||
then
|
|
||||||
RenderCanvas.Font.Style := RenderCanvas.Font.Style
|
|
||||||
+ FEventDayStyle
|
|
||||||
else begin
|
|
||||||
RenderCanvas.Font.Color := EventFontColor;
|
|
||||||
RenderCanvas.Font.Style := FDayNumberFont.Style;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
FontStyle := RenderCanvas.Font.Style;
|
|
||||||
RenderCanvas.Font.Style := [fsBold, fsItalic];
|
|
||||||
TextAdjust := RenderCanvas.TextWidth (Str);
|
|
||||||
RenderCanvas.Font.Style := FontStyle;
|
|
||||||
if Tmp <> M then
|
|
||||||
RenderCanvas.Font.Color := FOffDayFontColor;
|
|
||||||
|
|
||||||
{ write the day number at the top of the square. }
|
|
||||||
if fsItalic in RenderCanvas.Font.Style then
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
TextRect.Left + mvColWidth - TextAdjust -
|
|
||||||
TextMargin - 2,
|
|
||||||
TextRect.Top + (TextMargin div 2), Str)
|
|
||||||
else
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
TextRect.Left + mvColWidth - TextAdjust
|
|
||||||
- TextMargin, TextRect.Top + (TextMargin div 2),
|
|
||||||
Str);
|
|
||||||
|
|
||||||
|
|
||||||
{ Update MonthDayArray }
|
|
||||||
mvMonthDayArray[I].Rec := TextRect;
|
|
||||||
mvMonthDayArray[I].Date := ThisDate;
|
|
||||||
mvMonthDayArray[I].OffDay := Tmp <> M;
|
|
||||||
Inc(DayNumber);
|
|
||||||
Inc(I);
|
|
||||||
|
|
||||||
{ drop rect down one row and all the way to the left }
|
|
||||||
TextRect.TopLeft := Point(RealLeft + 1, TextRect.Bottom + 1);
|
|
||||||
TextRect.BottomRight := Point(TextRect.Left + mvColWidth,
|
|
||||||
TextRect.Top + mvRowHeight);
|
|
||||||
end else begin
|
|
||||||
{ draws all days for the week, except the far right one }
|
|
||||||
ThisDate := Trunc(StartingDate + DayNumber);
|
|
||||||
DecodeDate(ThisDate, Y, Tmp, D);
|
|
||||||
|
|
||||||
{ Allow the user to draw the day }
|
|
||||||
Drawn := false;
|
|
||||||
if Assigned(FOwnerDrawCells) then begin
|
|
||||||
OldBrush.Assign (Canvas.Brush);
|
|
||||||
OldPen.Assign (Canvas.Pen);
|
|
||||||
OldFont.Assign (Canvas.Font);
|
|
||||||
try
|
|
||||||
FOwnerDrawCells(self, RenderCanvas, TextRect, D, Drawn);
|
|
||||||
if Drawn then continue;
|
|
||||||
finally
|
|
||||||
Canvas.Brush.Assign (OldBrush);
|
|
||||||
Canvas.Pen.Assign (OldPen);
|
|
||||||
Canvas.Font.Assign (OldFont);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if Tmp <> M then begin
|
|
||||||
RenderCanvas.Brush.Color := RealOffDayColor;
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn, TextRect);
|
|
||||||
end else
|
|
||||||
RenderCanvas.Brush.Color := RealColor;
|
|
||||||
{ draw right side and bottom lines }
|
|
||||||
TPSMoveTo (RenderCanvas, Angle, RenderIn, TextRect.Right,
|
|
||||||
TextRect.top);
|
|
||||||
if TextRect.Bottom > RealBottom then begin
|
|
||||||
TPSLineTo (RenderCanvas, Angle, RenderIn, TextRect.Right,
|
|
||||||
RealBottom);
|
|
||||||
TPSLineTo (RenderCanvas, Angle, RenderIn, TextRect.Left - 1,
|
|
||||||
RealBottom);
|
|
||||||
end else begin
|
|
||||||
TPSLineTo (RenderCanvas, Angle, RenderIn, TextRect.Right,
|
|
||||||
TextRect.Bottom);
|
|
||||||
TPSLineTo (RenderCanvas, Angle, RenderIn, TextRect.Left - 1,
|
|
||||||
TextRect.Bottom);
|
|
||||||
end;
|
|
||||||
{ paint the day number }
|
|
||||||
Str := FormatDateTime('d', ThisDate);
|
|
||||||
|
|
||||||
{ set the proper font and style }
|
|
||||||
RenderCanvas.Font.Assign(FDayNumberFont);
|
|
||||||
if (DisplayDate = ThisDate) then begin
|
|
||||||
if Focused then begin
|
|
||||||
TPSDrawFocusRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left - 2,
|
|
||||||
TextRect.Top - 2,
|
|
||||||
TextRect.Right + 2,
|
|
||||||
TextRect.Bottom + 2));
|
|
||||||
TPSDrawFocusRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect (TextRect.Left + 2,
|
|
||||||
TextRect.Top + 2,
|
|
||||||
TextRect.Right - 2,
|
|
||||||
TextRect.Bottom - 2));
|
|
||||||
end;
|
|
||||||
RenderCanvas.Font.Color := RealSelDayColor;
|
|
||||||
RenderCanvas.Font.Style := FDayNumberFont.Style + [fsBold];
|
|
||||||
if (FEventDayStyle <> []) and (DataStore.Resource <> nil)
|
|
||||||
and (DataStore.Resource.Schedule.EventCountByDay(ThisDate) > 0)
|
|
||||||
then
|
|
||||||
RenderCanvas.Font.Style := RenderCanvas.Font.Style
|
|
||||||
+ FEventDayStyle;
|
|
||||||
end else begin
|
|
||||||
{ Set the font style for days which have events. }
|
|
||||||
if (FEventDayStyle <> []) and (DataStore.Resource <> nil)
|
|
||||||
and (DataStore.Resource.Schedule.EventCountByDay(ThisDate) > 0)
|
|
||||||
then
|
|
||||||
RenderCanvas.Font.Style := RenderCanvas.Font.Style
|
|
||||||
+ FEventDayStyle
|
|
||||||
else begin
|
|
||||||
RenderCanvas.Font.Color := EventFontColor;
|
|
||||||
RenderCanvas.Font.Style := FDayNumberFont.Style;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
FontStyle := RenderCanvas.Font.Style;
|
|
||||||
RenderCanvas.Font.Style := [fsBold, fsItalic];
|
|
||||||
TextAdjust := RenderCanvas.TextWidth (Str);
|
|
||||||
RenderCanvas.Font.Style := FontStyle;
|
|
||||||
if Tmp <> M then
|
|
||||||
RenderCanvas.Font.Color := FOffdayFontColor;
|
|
||||||
|
|
||||||
if fsItalic in RenderCanvas.Font.Style then
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
TextRect.Right - TextAdjust - TextMargin - 2,
|
|
||||||
TextRect.Top + (TextMargin div 2), Str)
|
|
||||||
else
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn,
|
|
||||||
TextRect.Right - TextAdjust - TextMargin,
|
|
||||||
TextRect.Top + (TextMargin div 2), Str);
|
|
||||||
|
|
||||||
{ Update Array }
|
|
||||||
mvMonthDayArray[I].Rec := TextRect;
|
|
||||||
mvMonthDayArray[I].Date := ThisDate;
|
|
||||||
mvMonthDayArray[I].OffDay := Tmp <> M;
|
|
||||||
Inc(DayNumber);
|
|
||||||
Inc(I);
|
|
||||||
{ slide rect one column to the right }
|
|
||||||
TextRect.Left := TextRect.Right + 1;
|
|
||||||
TextRect.Right := TextRect.Right + mvColWidth;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
finally
|
|
||||||
OldFont.Free;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
OldPen.Free;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
OldBrush.Free;
|
|
||||||
end;
|
|
||||||
|
|
||||||
RenderCanvas.Pen.Color := RealLineColor;
|
|
||||||
RenderCanvas.Pen.Style := psSolid;
|
|
||||||
RenderCanvas.Brush.Color := RealColor;
|
|
||||||
|
|
||||||
{ write the events }
|
|
||||||
if (DataStore <> nil) and FShowEvents and (DataStore.Resource <> nil)
|
|
||||||
and (DataStore.Resource.Schedule.EventCount <> 0) then begin
|
|
||||||
EventList := TList.Create;
|
|
||||||
try
|
|
||||||
for I := 0 to 43 do begin
|
|
||||||
EventList.Clear;
|
|
||||||
DataStore.Resource.Schedule.EventsByDate(mvMonthDayArray[I].Date, EventList);
|
|
||||||
if EventList.Count > 0 then begin
|
|
||||||
{ there are events scheduled for this day }
|
|
||||||
|
|
||||||
{ initialize TextRect for this day }
|
|
||||||
TextRect.TopLeft := Point(mvMonthDayArray[I].Rec.Left,
|
|
||||||
mvMonthDayArray[I].Rec.Top);
|
|
||||||
TextRect.BottomRight := Point(TextRect.Left + mvColWidth,
|
|
||||||
TextRect.Top + mvEventTextHeight + (TextMargin div 2));
|
|
||||||
|
|
||||||
{ set canvas color }
|
|
||||||
if mvMonthDayArray[I].OffDay
|
|
||||||
then RenderCanvas.Brush.Color := RealOffDayColor
|
|
||||||
else RenderCanvas.Brush.Color := RealColor;
|
|
||||||
|
|
||||||
{ spin through the events and paint them }
|
|
||||||
for J := 0 to Pred(EventList.Count) do begin
|
|
||||||
|
|
||||||
if (TextRect.Bottom > mvMonthDayArray[I].Rec.Bottom)
|
|
||||||
and (J <= Pred(EventList.Count))
|
|
||||||
then begin
|
|
||||||
{ draw a little red square with a (...) at the bottom right }
|
|
||||||
{ corner of the day to indicate that there are more events }
|
|
||||||
{ than can be listed in the available space. }
|
|
||||||
RenderCanvas.Brush.Color := DotDotDotColor;
|
|
||||||
{ draw dot dot dot }
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect(mvMonthDayArray[I].Rec.Right - 20,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 7,
|
|
||||||
mvMonthDayArray[I].Rec.Right - 17,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 4));
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect(mvMonthDayArray[I].Rec.Right - 13,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 7,
|
|
||||||
mvMonthDayArray[I].Rec.Right - 10,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 4));
|
|
||||||
TPSFillRect (RenderCanvas, Angle, RenderIn,
|
|
||||||
Rect(mvMonthDayArray[I].Rec.Right - 6,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 7,
|
|
||||||
mvMonthDayArray[I].Rec.Right - 3,
|
|
||||||
mvMonthDayArray[I].Rec.Bottom - 4));
|
|
||||||
Break;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ shorten events that are next to the day number, in order }
|
|
||||||
{ to give the day number enough room }
|
|
||||||
if (TextRect.Top < mvMonthDayArray[I].Rec.Top
|
|
||||||
+ mvDayNumberHeight + (TextMargin div 2))
|
|
||||||
then
|
|
||||||
TextRect.Right := TextRect.Left + mvColWidth
|
|
||||||
- mvDayNumberHeight - TextMargin
|
|
||||||
else
|
|
||||||
TextRect.Right := TextRect.Left + mvColWidth;
|
|
||||||
|
|
||||||
{ format the display text }
|
|
||||||
if ShowEventTime then begin
|
|
||||||
if (TimeFormat = tf24Hour) then
|
|
||||||
Str := FormatDateTime('hh:nn',
|
|
||||||
TVpEvent(EventList.List^[j]).StartTime)
|
|
||||||
else
|
|
||||||
Str := FormatDateTime('hh:nn AM/PM',
|
|
||||||
TVpEvent(EventList.List^[j]).StartTime);
|
|
||||||
Str := Str + ' - ' + TVpEvent(EventList.List^[j]).Description;
|
|
||||||
end else
|
|
||||||
Str := TVpEvent(EventList.List^[j]).Description;
|
|
||||||
|
|
||||||
{ set the event font }
|
|
||||||
RenderCanvas.Font.Assign(FEventFont);
|
|
||||||
if mvMonthDayArray[I].OffDay then
|
|
||||||
RenderCanvas.Font.Color := FOffDayFontColor;
|
|
||||||
|
|
||||||
StrLn := RenderCanvas.TextWidth(Str);
|
|
||||||
if (StrLn > TextRect.Right - TextRect.Left - (TextMargin * 2)) then
|
|
||||||
begin
|
|
||||||
Str := GetDisplayString(RenderCanvas, Str, 0, TextRect.Right -
|
|
||||||
TextRect.Left - (TextMargin * 2));
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ write the event text }
|
|
||||||
TPSTextOut (RenderCanvas, Angle, RenderIn, TextRect.Left + (TextMargin div 2),
|
|
||||||
TextRect.Top + (TextMargin div 2), Str);
|
|
||||||
|
|
||||||
{ - begin block}
|
|
||||||
Inc(mvVisibleEvents);
|
|
||||||
mvEventArray[mvVisibleEvents - 1].Rec := TextRect;
|
|
||||||
mvEventArray[mvVisibleEvents - 1].Event := TVpEvent(EventList.List^[j]);
|
|
||||||
{ - end block}
|
|
||||||
|
|
||||||
{ Move TextRect down one line for the next item... }
|
|
||||||
TextRect.Top := TextRect.Bottom + 1;
|
|
||||||
TextRect.Bottom := TextRect.Top + mvLineHeight;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
finally
|
|
||||||
EventList.Free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
|
|
||||||
|
|
||||||
procedure DrawBorders;
|
|
||||||
begin
|
|
||||||
if FDrawingStyle = dsFlat then begin
|
|
||||||
{ draw an outer and inner bevel }
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle,
|
|
||||||
RenderIn,
|
|
||||||
Rect (RealLeft,
|
|
||||||
RealTop,
|
|
||||||
RealRight - 1,
|
|
||||||
RealBottom - 1)),
|
|
||||||
BevelShadow,
|
|
||||||
BevelShadow);
|
|
||||||
end else if FDrawingStyle = ds3d then begin
|
|
||||||
{ draw a 3d bevel }
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle,
|
|
||||||
RenderIn,
|
|
||||||
Rect (RealLeft,
|
|
||||||
RealTop,
|
|
||||||
RealRight - 1,
|
|
||||||
RealBottom - 1)),
|
|
||||||
BevelShadow,
|
|
||||||
BevelHighlight);
|
|
||||||
DrawBevelRect (RenderCanvas,
|
|
||||||
TPSRotateRectangle (Angle,
|
|
||||||
RenderIn,
|
|
||||||
Rect (RealLeft + 1,
|
|
||||||
RealTop + 1,
|
|
||||||
RealRight - 2,
|
|
||||||
RealBottom - 2)),
|
|
||||||
BevelDarkShadow,
|
|
||||||
BevelFace);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
{-}
|
|
||||||
begin
|
|
||||||
if DisplayOnly then begin
|
|
||||||
BevelHighlight := clBlack;
|
|
||||||
BevelShadow := clBlack;
|
|
||||||
BevelDarkShadow := clBlack;
|
|
||||||
BevelFace := clBlack;
|
|
||||||
RealColor := clWhite;
|
|
||||||
DayHeadAttrColor := clSilver;
|
|
||||||
RealLineColor := clBlack;
|
|
||||||
RealOffDayColor := clSilver;
|
|
||||||
RealSelDayColor := clWhite;
|
|
||||||
EventFontColor := clBlack;
|
|
||||||
end else begin
|
|
||||||
BevelHighlight := clBtnHighlight;
|
|
||||||
BevelShadow := clBtnShadow;
|
|
||||||
BevelDarkShadow := cl3DDkShadow;
|
|
||||||
BevelFace := clBtnFace;
|
|
||||||
RealColor := Color;
|
|
||||||
DayHeadAttrColor := DayHeadAttributes.Color;
|
|
||||||
RealLineColor := LineColor;
|
|
||||||
RealOffDayColor := OffDayColor;
|
|
||||||
RealSelDayColor := FSelectedDayColor;
|
|
||||||
EventFontColor := FDayNumberFont.Color;
|
|
||||||
end;
|
|
||||||
DotDotDotColor := clBlack;
|
|
||||||
|
|
||||||
mvPainting := true;
|
mvPainting := true;
|
||||||
SavePenStyle := RenderCanvas.Pen.Style;
|
painter := TVpMonthViewPainter.Create(Self, RenderCanvas);
|
||||||
SaveBrushColor := RenderCanvas.Brush.Color;
|
|
||||||
SavePenColor := RenderCanvas.Pen.Color;
|
|
||||||
|
|
||||||
RenderCanvas.Pen.Style := psSolid;
|
|
||||||
RenderCanvas.Pen.Width := 1;
|
|
||||||
RenderCanvas.Pen.Mode := pmCopy;
|
|
||||||
RenderCanvas.Brush.Style := bsSolid;
|
|
||||||
|
|
||||||
Rgn := CreateRectRgn (RenderIn.Left, RenderIn.Top,
|
|
||||||
RenderIn.Right, RenderIn.Bottom);
|
|
||||||
try
|
try
|
||||||
SelectClipRgn (RenderCanvas.Handle, Rgn);
|
painter.RenderToCanvas(RenderIn, Angle, Scale, RenderDate, StartLine,
|
||||||
|
StopLine, UseGran, DisplayOnly);
|
||||||
{ clear client area }
|
|
||||||
Clear;
|
|
||||||
|
|
||||||
{ measure the row heights }
|
|
||||||
SetMeasurements;
|
|
||||||
|
|
||||||
{ draw headers }
|
|
||||||
DrawHeader;
|
|
||||||
DrawDayHead;
|
|
||||||
|
|
||||||
{ draw days }
|
|
||||||
mvVisibleEvents := 0;
|
|
||||||
DrawDays;
|
|
||||||
|
|
||||||
{ draw the borders }
|
|
||||||
DrawBorders;
|
|
||||||
|
|
||||||
finally
|
finally
|
||||||
SelectClipRgn (RenderCanvas.Handle, 0);
|
painter.Free;
|
||||||
DeleteObject (Rgn);
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ reinstate canvas settings}
|
|
||||||
RenderCanvas.Pen.Style := SavePenStyle;
|
|
||||||
RenderCanvas.Brush.Color := SaveBrushColor;
|
|
||||||
RenderCanvas.Pen.Color := SavePenColor;
|
|
||||||
mvPainting := false;
|
mvPainting := false;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TVpMonthView.mvPopulate;
|
procedure TVpMonthView.mvPopulate;
|
||||||
begin
|
begin
|
||||||
|
Reference in New Issue
Block a user