This repository has been archived on 2024-12-02. You can view files and clone it, but cannot push or open issues or pull requests.
FactuGES/cxSchedulerWeekView.pas_

1967 lines
64 KiB
Plaintext
Raw Permalink Normal View History

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressScheduler }
{ }
{ Copyright (c) 2003-2005 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSSCHEDULER AND ALL ACCOMPANYING }
{ VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{********************************************************************}
unit cxSchedulerWeekView;
{$I cxVer.inc}
interface
uses
Windows, Forms, Classes, cxClasses, SysUtils, Graphics, cxGraphics,
cxDateUtils, Controls, cxControls, cxSchedulerCustomControls, Math, StdCtrls,
cxLookAndFeelPainters, cxGeometry, cxSchedulerStorage, cxSchedulerUtils,
{$IFDEF DELPHI6} DateUtils, {$ENDIF} cxStyles, cxSchedulerCustomResourceView;
type
TcxSchedulerCustomWeekView = class;
TcxSchedulerWeekViewViewInfo = class;
TcxSchedulerWeeksViewViewInfo = class;
TcxSchedulerCustomWeekViewNavigation = class;
{ TcxSchedulerCustomWeekViewController }
TcxSchedulerCustomWeekViewController = class(TcxSchedulerCustomResourceViewController)
private
function GetNavigation: TcxSchedulerCustomWeekViewNavigation;
protected
function CreateDragEventHelper: TcxDragEventHelper; override;
function CreateNavigation: TcxSchedulerViewNavigation; override;
function CreateResizeEventHelper: TcxEventSizingHelper; override;
public
property Navigation: TcxSchedulerCustomWeekViewNavigation read GetNavigation;
end;
{ TcxCustomWeekViewDragEventHelper }
TcxCustomWeekViewDragEventHelper = class(TcxDragEventHelper)
protected
procedure UpdateViewClonesTime; override;
end;
{ TcxCustomWeekViewEventSizing }
TcxCustomWeekViewEventSizing = class(TcxEventSizingHelper)
protected
procedure UpdateEventBounds; override;
end;
TcxSchedulerWeekViewDaysLayout = (wdlTwoColumns, wdlOneColumn);
{ TcxSchedulerCustomWeekView }
TcxSchedulerCustomWeekView = class(TcxSchedulerCustomResourceView)
private
FCompressWeekEnd: Boolean;
FDaysLayout: TcxSchedulerWeekViewDaysLayout;
function GetController: TcxSchedulerCustomWeekViewController;
function GetScrollPos(const ADatePos: TDateTime; ACheckBounds: Boolean = True): Integer;
procedure SetCompressWeekEnd(const AValue: Boolean);
procedure SetDaysLayout(Value: TcxSchedulerWeekViewDaysLayout);
protected
FWeeks: TcxSchedulerDateList;
function CheckDate(const ADate: TDateTime): Integer;
function CreateController: TcxSchedulerSubControlController; override;
function CreateNavigation: TcxSchedulerViewNavigation; virtual;
function CreatePainter: TcxSchedulerSubControlPainter; override;
function GetCompressWeekEnd: Boolean; override;
function GetDateScrollBarKind: TScrollBarKind;
function GetFirstVisibleDate: TDateTime; override;
function GetLastVisibleDate: TDateTime; override;
function GetMaxScrollPos: Integer; virtual;
function GetMinScrollPos: Integer; virtual;
function GetWeekCount: Integer;
function GetStartOfWeek: TDay; override;
function GetViewContentRect: TRect; override;
procedure InitEventBySelectedTime(AEvent: TcxSchedulerEvent;
AllDay: Boolean; ARecurrence: Boolean; AInplaceEditing: Boolean); override;
procedure InitScrollBarsParameters; override;
procedure Scroll(AScrollBarKind: TScrollBarKind;
AScrollCode: TScrollCode; var AScrollPos: Integer); override;
property Controller: TcxSchedulerCustomWeekViewController read GetController;
property CompressWeekEnd: Boolean read FCompressWeekEnd write SetCompressWeekEnd default True;
property DaysLayout: TcxSchedulerWeekViewDaysLayout read FDaysLayout write SetDaysLayout default wdlTwoColumns;
property WeekCount: Integer read GetWeekCount;
public
constructor Create(AOwner: TcxCustomScheduler); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property FirstVisibleDate;
property LastVisibleDate;
property StartOfWeek;
end;
{ TcxSchedulerCustomWeekViewNavigation }
TcxSchedulerCustomWeekViewNavigation = class(TcxSchedulerCustomResourceViewNavigation)
private
function GetCompress: Boolean;
function GetFirstVisibleDate: TDateTime;
function GetLastVisibleDate: TDateTime;
function GetView: TcxSchedulerCustomWeekView;
function GetWeeks: TcxSchedulerDateList;
protected
FYear: Word;
FWeekOfYear: Word;
FWeekIndex: Integer;
FDayOfWeek: Word;
IsFirstWeek, IsLastWeek: Boolean;
function DateScrollBarKind: TScrollBarKind;
function GetWeekStart(AIndex: Integer): TDateTime;
procedure GotoCornerCell(AGotoEnd: Boolean); virtual;
procedure GotoNextCellHorz(AGotoNext: Boolean); virtual;
procedure GotoNextCellVert(AGotoDown: Boolean); virtual;
procedure GotoNextPage(AGotoForward: Boolean); virtual;
function IsResourceNavigation(AGoToDown: Boolean): Boolean;
public
procedure ValidateSelection(var ASelStart, ASelFinish: TDateTime;
var AResource: TcxSchedulerStorageResourceItem); override;
procedure KeyDown(var AKey: Word; AShift: TShiftState); override;
property Compress: Boolean read GetCompress;
property FirstVisibleDate: TDateTime read GetFirstVisibleDate;
property LastVisibleDate: TDateTime read GetLastVisibleDate;
property View: TcxSchedulerCustomWeekView read GetView;
property Weeks: TcxSchedulerDateList read GetWeeks;
end;
{ TcxSchedulerWeekView }
TcxSchedulerWeekView = class(TcxSchedulerCustomWeekView)
private
function GetViewInfo: TcxSchedulerWeekViewViewInfo;
protected
function CreateNavigation: TcxSchedulerViewNavigation; override;
function CreateViewInfo: TcxSchedulerSubControlViewInfo; override;
function GetCompressWeekEnd: Boolean; override;
property ViewInfo: TcxSchedulerWeekViewViewInfo read GetViewInfo;
public
property SelectedDays;
property WorkDays;
property WorkFinish;
property WorkStart;
published
property CanShow;
property Active;
property CompressWeekEnd;
property DaysLayout;
property GroupingKind;
property ShowEndTime;
property ShowTimeAsClock;
end;
{ TcxSchedulerWeekViewNavigation }
TcxSchedulerWeekViewNavigation = class(TcxSchedulerCustomWeekViewNavigation)
private
function GetViewInfo: TcxSchedulerWeekViewViewInfo;
protected
procedure GotoNextCellHorz(AGotoNext: Boolean); override;
procedure GotoNextCellVert(AGotoDown: Boolean); override;
public
property ViewInfo: TcxSchedulerWeekViewViewInfo read GetViewInfo;
end;
{ TcxSchedulerWeeksView }
TcxSchedulerWeeksView = class(TcxSchedulerCustomWeekView)
private
function GetViewInfo: TcxSchedulerWeeksViewViewInfo;
protected
function CreateNavigation: TcxSchedulerViewNavigation; override;
function CreateViewInfo: TcxSchedulerSubControlViewInfo; override;
function GetMaxScrollPos: Integer; override;
function GetMinScrollPos: Integer; override;
property ViewInfo: TcxSchedulerWeeksViewViewInfo read GetViewInfo;
public
property SelectedDays;
property WeekCount;
property WorkDays;
property WorkFinish;
property WorkStart;
published
property CanShow;
property Active;
property CompressWeekEnd;
property GroupingKind;
property ShowEndTime;
property ShowTimeAsClock;
end;
{ TcxSchedulerWeeksViewNavigation }
TcxSchedulerWeeksViewNavigation = class(TcxSchedulerCustomWeekViewNavigation)
private
function GetViewInfo: TcxSchedulerWeeksViewViewInfo;
protected
procedure GotoNextCellHorz(AGotoNext: Boolean); override;
procedure GotoNextCellVert(AGotoDown: Boolean); override;
function IsScrollResource(AGotoNext: Boolean): Boolean;
public
property ViewInfo: TcxSchedulerWeeksViewViewInfo read GetViewInfo;
end;
{ TcxSchedulerWeekViewEventCellViewInfo }
TcxSchedulerWeekViewEventCellViewInfo = class(TcxSchedulerEventCellViewInfo)
protected
procedure CalculateBorders; override;
procedure CalculateCaptions; override;
procedure CalculateEventTimeVisibility; override;
procedure CalculateItemsLayout; override;
function GetEditingRect: TRect; override;
procedure InitHitTest(AHitTest: TcxSchedulerCustomResourceViewHitTest); override;
end;
{ TcxSchedulerWeekViewViewInfo }
TcxSchedulerWeekViewViewInfo = class(TcxSchedulerCustomResourceViewViewInfo)
private
function GetDayCell(ADay: Integer): TcxSchedulerContentCellViewInfo;
function GetDayCellCount: Integer;
function GetRotateCaptions: Boolean;
function GetStartDate(AWeek: Integer): TDateTime;
function GetView: TcxSchedulerWeekView;
function GetWeeks: TcxSchedulerDateList;
protected
Builder: TcxSchedulerEventLayoutBuilder;
FDayHeaderOffsetTop: Integer;
FHeaderOffsetLeft: Integer;
FPrintedMonth: Word;
FPrintExactlyOneMonth: Boolean;
FResourceHeaderWidth: Integer;
FRowCols: Integer;
FRowColsStart: Integer;
FWeekEndCells: Integer;
function AddContentCell(const ARect: TRect; const AStart, AFinish: TDateTime;
AResourceIndex: Integer): TcxSchedulerContentCellViewInfo; override;
procedure AddDayCellEvent(APlace: TcxSchedulerEventPlace);
procedure AddDayCellEventPlace(AEvent: TcxSchedulerControlEvent; var AIndex: Integer);
function AddWeekDayHeader(AWeekDay: Integer; ALeft, ARight: Integer): TcxSchedulerWeekDayHeaderCellViewInfo;
procedure CalculateDaysLayout; virtual;
procedure CalculateDaysLayoutForResource(const ABounds: TRect; AResourceIndex: Integer); virtual;
procedure CalculateDaysLayoutForDates(const ABounds: TRect; AResourceIndex: Integer); virtual;
procedure CalculateEventsViewInfo; virtual;
procedure CalculateGroupByDateForResource(const ABounds: TRect; AResourceIndex: Integer); virtual;
procedure CalculateHeaderViewInfo; virtual;
procedure CalculateMetrics; override;
procedure CalculatePrintRowCols; virtual;
procedure CalculateResourceHeadersAutoHeight(AWidth: Integer); override;
procedure CalculateStartFinishCellIndexes; virtual;
procedure CalculateWeekDates;
procedure CalculateWeekDisplayRectsHorz(const AStartDate: TDateTime; AResourceID: Integer;
{const }ABounds: TRect; AIsTopWeek, AIsLastWeek: Boolean); virtual;
procedure CalculateWeekDisplayRectsVert(const AStartDate: TDateTime; AResourceID: Integer;
const ABounds: TRect; AddBorders: TcxBorders = []); virtual;
procedure CalculateWeekDisplayRectsVertEx(const AStartDate: TDateTime; AResourceID: Integer;
const ABounds: TRect; AddBorders: TcxBorders = []);
function CanEventVisible(AEvent: TcxSchedulerControlEvent): Boolean;
function CanVisibleNextLine(ADay: TcxSchedulerContentCellViewInfo; ALine: Integer = -1): Boolean;
procedure CheckHeaderBorders; virtual;
function CompressWeekEnd: Boolean; virtual;
function ContentCellClass: TcxSchedulerContentCellViewInfoClass; override;
function CreateEventCellViewInfo(AViewData: TcxSchedulerEventViewData): TcxSchedulerEventCellViewInfo; override;
procedure DoCalculate; override;
procedure DoMoreEventsButtonClick(Sender: TcxSchedulerMoreEventsButtonViewInfo); override;
procedure GetEventInfo(AColStart, AColFinish: Integer; var ALeft, ARight: Integer; var AStart, AFinish: TDateTime;
var AVisibleRect: TRect; var AResource: TcxSchedulerResourceViewInfo);
function GetResourcesContentWidth: Integer; override;
function GetResourceImagesSize: TSize; override;
function GetResourceScrollBarKind: TScrollBarKind; override;
function GetContentParams(const ATime: TDateTime; AResource: TcxSchedulerResourceViewInfo): TcxViewParams; override;
function GetDayCellContentHeight(ADay: TcxSchedulerContentCellViewInfo): Integer; virtual;
function GetDayCellHeaderHeight: Integer; virtual;
function IsCalculateHeaderFirst: Boolean; virtual;
function IsCellEvent(AEvent: TcxSchedulerControlEvent;
ACell: TcxSchedulerContentCellViewInfo): Boolean;
function IsSingleLine(ADay1, ADay2: TcxSchedulerContentCellViewInfo): Boolean;
function IsTimeSelected(ATime: TDateTime; AResource: TObject): Boolean; override;
procedure ProcessGroupByDate; virtual;
procedure ProcessGroupByNone; virtual;
procedure ProcessGroupByResource; virtual;
property DayCellCount: Integer read GetDayCellCount;
property DayCells[ADay: Integer]: TcxSchedulerContentCellViewInfo read GetDayCell;
property RowCols: Integer read FRowCols;
property RowColsStart: Integer read FRowColsStart;
property Weeks: TcxSchedulerDateList read GetWeeks;
property WeekEndCells: Integer read FWeekEndCells;
public
constructor Create(AOwner: TcxSchedulerSubControl); override;
destructor Destroy; override;
procedure ScrollVertical(AScrollCode: TScrollCode; var AScrollPos: Integer); override;
property PrintExactlyOneMonth: Boolean read FPrintExactlyOneMonth;
property PrintedMonth: Word read FPrintedMonth;
property StartDates[AWeek: Integer]: TDateTime read GetStartDate;
property ResourceHeaderWidth: Integer read FResourceHeaderWidth;
property RotateCaptions: Boolean read GetRotateCaptions;
property View: TcxSchedulerWeekView read GetView;
end;
{ TcxSchedulerWeeksViewEventCellViewInfo }
TcxSchedulerWeeksViewEventCellViewInfo = class(TcxSchedulerWeekViewEventCellViewInfo)
protected
function CanAutoHideStandardImages: Boolean; override;
end;
{ TcxSchedulerWeeksViewViewInfo }
TcxSchedulerWeeksViewViewInfo = class(TcxSchedulerWeekViewViewInfo)
protected
FContentOffset: Integer;
procedure CalculateDaysLayoutForResource(const ABounds: TRect; AResourceIndex: Integer); override;
procedure CalculateGroupByDateForResource(const ABounds: TRect; AResourceIndex: Integer); override;
procedure CalculateHeaderViewInfo; override;
procedure CheckHeaderBorders; override;
function CompressWeekEnd: Boolean; override;
function ContentCellClass: TcxSchedulerContentCellViewInfoClass; override;
function CreateEventCellViewInfo(AViewData: TcxSchedulerEventViewData): TcxSchedulerEventCellViewInfo; override;
function GetContentParams(const ATime: TDateTime; AResource: TcxSchedulerResourceViewInfo): TcxViewParams; override;
function GetDayCellHeaderHeight: Integer; override;
function IsCalculateHeaderFirst: Boolean; override;
procedure ProcessGroupByNone; override;
procedure ProcessGroupByResource; override;
end;
{ TcxSchedulerWeekViewPainter }
TcxSchedulerWeekViewPainter = class(TcxSchedulerCustomViewPainter)
private
function GetViewInfo: TcxSchedulerWeekViewViewInfo;
public
procedure Paint; override;
property ViewInfo: TcxSchedulerWeekViewViewInfo read GetViewInfo;
end;
implementation
uses
cxSchedulerDateNavigator;
type
TcxSchedulerDaysRect = array[0..6] of TRect;
TcxSchedulerDaysBorders = array[0..6] of TcxBorders;
const
WeekViewDayBorders: TcxSchedulerDaysBorders =(
[bTop, bRight], [bTop, bRight], [bTop, bRight],
[bTop], [bTop], [bTop], [bTop]);
DayInc: array[Boolean] of Integer = (-1, 1);
{ TcxSchedulerCustomWeekViewController }
function TcxSchedulerCustomWeekViewController.CreateDragEventHelper: TcxDragEventHelper;
begin
Result := TcxCustomWeekViewDragEventHelper.Create(Scheduler);
end;
function TcxSchedulerCustomWeekViewController.CreateNavigation: TcxSchedulerViewNavigation;
begin
Result := TcxSchedulerCustomWeekView(View).CreateNavigation;
end;
function TcxSchedulerCustomWeekViewController.CreateResizeEventHelper: TcxEventSizingHelper;
begin
Result := TcxCustomWeekViewEventSizing.Create(Scheduler);
end;
function TcxSchedulerCustomWeekViewController.GetNavigation: TcxSchedulerCustomWeekViewNavigation;
begin
Result := TcxSchedulerCustomWeekViewNavigation(inherited Navigation);
end;
{cxCustomWeekViewDragEventHelper }
procedure TcxCustomWeekViewDragEventHelper.UpdateViewClonesTime;
var
I: Integer;
ADelta: TDateTime;
begin
ADelta := Controller.StartDragHitTime - HitTest.Time;
for I := 0 to Clones.Count - 1 do
with Clones[I] do
MoveTo(Source.Start - ADelta);
end;
{ TcxCustomWeekViewEventSizing }
procedure TcxCustomWeekViewEventSizing.UpdateEventBounds;
begin
if Event.AllDayEvent then
inherited UpdateEventBounds
else
begin
if Controller.DragKind = edkResizeStart then
begin
Event.AllDayEvent := TimeOf(Event.Finish) = 0;
Event.Start := HitTest.Time;
end
else
begin
Event.AllDayEvent := TimeOf(Event.Start) = 0;
if Event.AllDayEvent then
Event.Finish := HitTest.Time
else
Event.Finish := HitTest.Time + 1;
end;
CheckEventState(Event);
RefreshCurrentView;
end;
end;
{ TcxSchedulerCustomWeekView }
constructor TcxSchedulerCustomWeekView.Create(AOwner: TcxCustomScheduler);
begin
inherited Create(AOwner);
FCompressWeekEnd := True;
EventImagesLayout := eilHorizontal;
FWeeks := TcxSchedulerDateList.Create;
end;
destructor TcxSchedulerCustomWeekView.Destroy;
begin
FWeeks.Free;
inherited Destroy;
end;
procedure TcxSchedulerCustomWeekView.Assign(Source: TPersistent);
begin
if Source is TcxSchedulerCustomWeekView then
begin
CompressWeekEnd := TcxSchedulerCustomWeekView(Source).FCompressWeekEnd;
FDaysLayout := TcxSchedulerCustomWeekView(Source).DaysLayout;
end;
inherited Assign(Source);
end;
function TcxSchedulerCustomWeekView.CheckDate(
const ADate: TDateTime): Integer;
begin
//DELPHI8! check Trunc(ADate)
Result := Trunc(ADate);
if DayOfWeek(ADate) <> (1 + Byte(CompressWeekEnd)) then
Result := Result - DayOfWeek(ADate) + 1 + Byte(CompressWeekEnd);
end;
function TcxSchedulerCustomWeekView.CreateController: TcxSchedulerSubControlController;
begin
Result := TcxSchedulerCustomWeekViewController.Create(Self);
end;
function TcxSchedulerCustomWeekView.CreateNavigation: TcxSchedulerViewNavigation;
begin
Result := TcxSchedulerCustomWeekViewNavigation.Create(Self);
end;
function TcxSchedulerCustomWeekView.CreatePainter: TcxSchedulerSubControlPainter;
begin
Result := TcxSchedulerWeekViewPainter.Create(Self);
end;
function TcxSchedulerCustomWeekView.GetCompressWeekEnd: Boolean;
begin
Result := CompressWeekEnd;
end;
function TcxSchedulerCustomWeekView.GetDateScrollBarKind: TScrollBarKind;
const
ScrollKind: array[TScrollBarKind] of TScrollBarKind =
(sbVertical, sbHorizontal);
begin
Result := ScrollKind[TcxSchedulerWeekViewViewInfo(ViewInfo).GetResourceScrollBarKind];
end;
function TcxSchedulerCustomWeekView.GetFirstVisibleDate: TDateTime;
begin
Result := inherited GetFirstVisibleDate;
if GetCompressWeekEnd then
Result := Result + GetDateOffset;
end;
function TcxSchedulerCustomWeekView.GetLastVisibleDate: TDateTime;
begin
Result := inherited GetLastVisibleDate;
if GetCompressWeekEnd then
Result := Result + GetDateOffset;
end;
function TcxSchedulerCustomWeekView.GetMaxScrollPos: Integer;
begin
Result := 25;
end;
function TcxSchedulerCustomWeekView.GetMinScrollPos: Integer;
begin
Result := -25;
end;
function TcxSchedulerCustomWeekView.GetWeekCount: Integer;
begin
Result := Max(1, SelectedDays.Count div 7);
end;
function TcxSchedulerCustomWeekView.GetStartOfWeek: TDay;
begin
if GetCompressWeekEnd then
Result := dMonday
else
Result := inherited GetStartOfWeek;
end;
function TcxSchedulerCustomWeekView.GetViewContentRect: TRect;
begin
Result := inherited GetViewContentRect;
if ViewInfo.GroupingKind = gkByDate then
begin
with TcxSchedulerWeekViewViewInfo(ViewInfo) do
Result.TopLeft := Point(FResourceHeaderHeight, FDayHeaderHeight);
end;
end;
procedure TcxSchedulerCustomWeekView.InitEventBySelectedTime(
AEvent: TcxSchedulerEvent; AllDay: Boolean; ARecurrence: Boolean;
AInplaceEditing: Boolean);
var
AStart, AFinish: TDateTime;
begin
AStart := Scheduler.SelStart;
AFinish := Scheduler.SelFinish;
AEvent.AllDayEvent := AllDay or (AFinish - AStart > 1) or (AInplaceEditing and not ARecurrence);
if not AEvent.AllDayEvent then
begin
AStart := AStart + cxTime8AM;
AFinish := (AFinish - 1) + cxTime8AM + cxHalfHour;
end;
AEvent.Start := AStart;
AEvent.Finish := AFinish;
end;
procedure TcxSchedulerCustomWeekView.InitScrollBarsParameters;
begin
SetScrollBarInfo(GetDateScrollBarKind, GetMinScrollPos, GetMaxScrollPos, 1,
WeekCount, GetScrollPos(FirstVisibleDate), True, True);
inherited InitScrollBarsParameters;
end;
procedure TcxSchedulerCustomWeekView.Scroll(AScrollBarKind: TScrollBarKind;
AScrollCode: TScrollCode; var AScrollPos: Integer);
var
ANewSelDate: TDateTime;
ADelta: Integer;
begin
HideHintOnScroll(AScrollCode);
if (AScrollBarKind <> GetDateScrollBarKind) or (AScrollCode = scEndScroll) then Exit;
ADelta := GetScrollPos(FirstVisibleDate, False);
if not (AScrollCode in [scPosition, scTrack]) then
AScrollPos := ADelta;
ANewSelDate := Controller.Navigation.SelStart;
case AScrollCode of
scLineUp, scLineDown:
begin
Inc(AScrollPos, DayInc[AScrollCode <> scLineUp]);
ANewSelDate := ANewSelDate + DayInc[AScrollCode <> scLineUp] * 7;
end;
scPageUp, scPageDown:
begin
Inc(AScrollPos, DayInc[AScrollCode <> scPageUp] * WeekCount);
with Controller.Navigation do
ANewSelDate := ANewSelDate + DayInc[AScrollCode <> scPageUp] * Weeks.Count * 7;
end;
scTop:
AScrollPos := -GetMinScrollPos;
scBottom:
AScrollPos := GetMaxScrollPos;
end;
ADelta := ADelta - AScrollPos;
if ADelta <> 0 then
begin
ScrollSelectedDays(ADelta);
AScrollPos := GetScrollPos(FirstVisibleDate);
end;
if AScrollCode = scTrack then
ShowHintOnScroll(FirstVisibleDate);
with Scheduler do
SelectTime(ANewSelDate, ANewSelDate, SelResource);
end;
function TcxSchedulerCustomWeekView.GetController: TcxSchedulerCustomWeekViewController;
begin
Result := TcxSchedulerCustomWeekViewController(inherited Controller);
end;
function TcxSchedulerCustomWeekView.GetScrollPos(
const ADatePos: TDateTime; ACheckBounds: Boolean = True): Integer;
begin
Result := Round(ADatePos - CheckDate(Date)) div 7;
if ACheckBounds then
begin
if Result < GetMinScrollPos then
Result := GetMinScrollPos;
if Result > GetMaxScrollPos then
Result := GetMaxScrollPos;
end;
end;
procedure TcxSchedulerCustomWeekView.SetCompressWeekEnd(
const AValue: Boolean);
begin
if FCompressWeekEnd <> AValue then
begin
FCompressWeekEnd := AValue;
LayoutChanged;
end;
end;
procedure TcxSchedulerCustomWeekView.SetDaysLayout(
Value: TcxSchedulerWeekViewDaysLayout);
begin
if Value <> FDaysLayout then
begin
FDaysLayout := Value;
LayoutChanged;
end;
end;
{ TcxSchedulerCustomWeekViewNavigation }
procedure TcxSchedulerCustomWeekViewNavigation.KeyDown(
var AKey: Word; AShift: TShiftState);
var
APos: Integer;
begin
DecodeDateWeek(FCurrentAnchor + 1 - Byte(View.StartOfWeek),
FYear, FWeekOfYear, FDayOfWeek);
Dec(FDayOfWeek);
FWeekIndex := Max(0, Weeks.IndexOf(Trunc(EncodeDateWeek(FYear, FWeekOfYear, 1))));
IsFirstWeek := (FWeekIndex = 0) and IsFirstResource;
IsLastWeek := (FWeekIndex = Weeks.Count - 1) and IsLastResource;
case AKey of
VK_Left, VK_Right:
GotoNextCellHorz(AKey = VK_RIGHT);
VK_UP, VK_DOWN:
GotoNextCellVert(AKey = VK_DOWN);
VK_HOME, VK_END:
GotoCornerCell(AKey = VK_END);
VK_NEXT, VK_PRIOR:
GotoNextPage(AKey = VK_NEXT);
end;
APos := View.GetScrollPos(View.FirstVisibleDate, False);
if (ssShift in FShift) and ((FCurrentResource <> SelResource) or
(DateOf(FCurrentAnchor) < FirstVisibleDate) or (DateOf(FCurrentAnchor) > LastVisibleDate)) then
Exit
else
if DateOf(FCurrentAnchor) < FirstVisibleDate then
begin
View.Scroll(DateScrollBarKind, scLineUp, APos);
SetSelAnchor(FCurrentAnchor, [], FCurrentResource);
end
else
if DateOf(FCurrentAnchor) > LastVisibleDate then
begin
View.Scroll(DateScrollBarKind, scLineDown, APos);
SetSelAnchor(FCurrentAnchor, [], FCurrentResource);
end
else
SetSelAnchor(FCurrentAnchor, FShift, FCurrentResource);
end;
procedure TcxSchedulerCustomWeekViewNavigation.ValidateSelection(
var ASelStart, ASelFinish: TDateTime;
var AResource: TcxSchedulerStorageResourceItem);
begin
inherited ValidateSelection(ASelStart, ASelFinish, AResource);
if (DateOf(ASelFinish) < FirstVisibleDate) or (DateOf(ASelFinish) > LastVisibleDate) then
begin
ASelFinish := FirstVisibleDate;
ASelStart := ASelFinish;
end
end;
function TcxSchedulerCustomWeekViewNavigation.DateScrollBarKind: TScrollBarKind;
begin
Result := View.GetDateScrollBarKind;
end;
function TcxSchedulerCustomWeekViewNavigation.GetWeekStart(AIndex: Integer): TDateTime;
begin
Result := Weeks[FWeekIndex];
if not View.GetCompressWeekEnd then
Result := Result - View.GetDateOffset;
end;
procedure TcxSchedulerCustomWeekViewNavigation.GotoCornerCell(
AGotoEnd: Boolean);
begin
if ssCtrl in FShift then
begin
if AGotoEnd then
FCurrentAnchor := LastVisibleDate
else
FCurrentAnchor := FirstVisibleDate;
end
else
begin
FCurrentAnchor := GetWeekStart(FWeekIndex);
if AGotoEnd then
FCurrentAnchor := FCurrentAnchor + 6;
end;
end;
procedure TcxSchedulerCustomWeekViewNavigation.GotoNextCellHorz(
AGotoNext: Boolean);
begin
FCurrentAnchor := FCurrentAnchor + DayInc[AGoToNext];
end;
procedure TcxSchedulerCustomWeekViewNavigation.GotoNextCellVert(
AGotoDown: Boolean);
begin
Inc(FWeekIndex, DayInc[AGotoDown]);
if (FWeekIndex >= 0) and (FWeekIndex < Weeks.Count) then
FCurrentAnchor := GetWeekStart(FWeekIndex)
else
if AGotoDown then
begin
if IsLastWeek then
begin
if not IsResourceNavigation(AGoToDown) then
FCurrentAnchor := LastVisibleDate + 1
else
Exit;
end
else
if FWeekIndex = Weeks.Count then
begin
FCurrentAnchor := FirstVisibleDate;
FCurrentResource := GetNextResource(True)
end
end
else
begin
if IsFirstWeek then
begin
if not IsResourceNavigation(AGoToDown) then
FCurrentAnchor := FirstVisibleDate - 7
else
Exit;
end
else
if FWeekIndex <= 0 then
begin
FCurrentAnchor := LastVisibleDate - 7 + 1;
FCurrentResource := GetNextResource(False);
end
end;
FCurrentAnchor := FCurrentAnchor + FDayOfWeek;
end;
procedure TcxSchedulerCustomWeekViewNavigation.GotoNextPage(
AGotoForward: Boolean);
begin
if not (ssShift in FShift) then
begin
FCurrentAnchor := FCurrentAnchor + DayInc[AGotoForward] * Weeks.Count * 7;
View.ScrollSelectedDays(DayInc[not AGotoForward] * Weeks.Count);
end
else
begin
if AGotoForward then
FCurrentAnchor := LastVisibleDate
else
FCurrentAnchor := FirstVisibleDate;
end;
end;
function TcxSchedulerCustomWeekViewNavigation.IsResourceNavigation(AGoToDown: Boolean): Boolean;
begin
Result := (ViewInfo.GroupingKind <> gkNone);
if Result then
Result := ScrollResourcesEx(AGoToDown, FCurrentResource);
if Result then
FCurrentAnchor := FCurrentAnchor - DayInc[AGoToDown] * (View.WeekCount - 1) * 7;
end;
function TcxSchedulerCustomWeekViewNavigation.GetCompress: Boolean;
begin
Result := View.GetCompressWeekEnd;
end;
function TcxSchedulerCustomWeekViewNavigation.GetFirstVisibleDate: TDateTime;
begin
Result := View.FirstVisibleDate;
end;
function TcxSchedulerCustomWeekViewNavigation.GetLastVisibleDate: TDateTime;
begin
Result := View.LastVisibleDate;
end;
function TcxSchedulerCustomWeekViewNavigation.GetView: TcxSchedulerCustomWeekView;
begin
Result := TcxSchedulerCustomWeekView(inherited View);
end;
function TcxSchedulerCustomWeekViewNavigation.GetWeeks: TcxSchedulerDateList;
begin
Result := View.FWeeks;
end;
{ TcxSchedulerWeekView }
function TcxSchedulerWeekView.CreateNavigation: TcxSchedulerViewNavigation;
begin
Result := TcxSchedulerWeekViewNavigation.Create(Self);
end;
function TcxSchedulerWeekView.CreateViewInfo: TcxSchedulerSubControlViewInfo;
begin
Result := TcxSchedulerWeekViewViewInfo.Create(Self);
end;
function TcxSchedulerWeekView.GetCompressWeekEnd: Boolean;
begin
Result := ViewInfo.CompressWeekEnd;
end;
function TcxSchedulerWeekView.GetViewInfo: TcxSchedulerWeekViewViewInfo;
begin
Result := TcxSchedulerWeekViewViewInfo(inherited ViewInfo);
end;
{ TcxSchedulerWeekViewNavigation }
procedure TcxSchedulerWeekViewNavigation.GotoNextCellHorz(AGotoNext: Boolean);
const
DateInc: array[Boolean, 0..6] of Integer =
((-4, -4, -4, -3, -3, -3, -4), (3, 3, 3, 4, 4, 4, 3));
begin
if (View.DaysLayout = wdlOneColumn) and (GroupingKind <> gkByDate) then
begin
if IsFirstWeek and not AGotoNext then
begin
if not ScrollResourcesEx(AGotoNext, FCurrentResource) then
FCurrentAnchor := FCurrentAnchor - 7
end
else
if IsLastWeek and AGotoNext then
begin
if not ScrollResourcesEx(AGotoNext, FCurrentResource) then
FCurrentAnchor := FCurrentAnchor + 7;
end
else
FCurrentResource := GetNextResource(AGotoNext);
end
else
if GroupingKind <> gkByDate then
begin
FCurrentAnchor := FCurrentAnchor + DateInc[AGotoNext, FDayOfWeek];
if (AGotoNext and not IsLastWeek and (FDayOfWeek in [3..6])) or
(not AGotoNext and not IsFirstWeek and (FDayOfWeek in [0..2])) then
begin
FCurrentAnchor := FCurrentAnchor - DayInc[AGotoNext] * 7;
FCurrentResource := GetNextResource(AGotoNext);
end
else
begin
if (IsLastWeek and AGotoNext and (FDayOfWeek in [3..6]))
or (IsFirstWeek and not AGotoNext and (FDayOfWeek in [0..2])) then
begin
if IsResourceNavigation(AGotoNext) then
FCurrentAnchor := FCurrentAnchor - DayInc[AGoToNext] * 7;
end;
end;
end
else
inherited GoToNextCellHorz(AGotoNext);
end;
procedure TcxSchedulerWeekViewNavigation.GotoNextCellVert(AGotoDown: Boolean);
begin
if GroupingKind <> gkByDate then
inherited GotoNextCellHorz(AGotoDown)
else
inherited GotoNextCellVert(AGotoDown)
end;
function TcxSchedulerWeekViewNavigation.GetViewInfo: TcxSchedulerWeekViewViewInfo;
begin
Result := TcxSchedulerWeekViewViewInfo(inherited ViewInfo);
end;
{ TcxSchedulerWeeksView }
function TcxSchedulerWeeksView.CreateNavigation: TcxSchedulerViewNavigation;
begin
Result := TcxSchedulerWeeksViewNavigation.Create(Self);
end;
function TcxSchedulerWeeksView.CreateViewInfo: TcxSchedulerSubControlViewInfo;
begin
Result := TcxSchedulerWeeksViewViewInfo.Create(Self);
end;
function TcxSchedulerWeeksView.GetMaxScrollPos: Integer;
begin
Result := 51;
end;
function TcxSchedulerWeeksView.GetMinScrollPos: Integer;
begin
Result := -51;
end;
function TcxSchedulerWeeksView.GetViewInfo: TcxSchedulerWeeksViewViewInfo;
begin
Result := TcxSchedulerWeeksViewViewInfo(inherited ViewInfo);
end;
{ TcxSchedulerWeeksViewNavigation }
procedure TcxSchedulerWeeksViewNavigation.GotoNextCellHorz(AGotoNext: Boolean);
begin
if ViewInfo.GroupByResource then
begin
if IsScrollResource(AGoToNext) then Exit;
if (AGoToNext and (FDayOfWeek = 6) and not IsLastResource) or
(not AGoToNext and (FDayOfWeek = 0) and not IsFirstResource) then
begin
if not AGoToNext then
FCurrentAnchor := FCurrentAnchor + 6
else
FCurrentAnchor := GetWeekStart(FWeekIndex);
FCurrentResource := GetNextResource(AGoToNext);
Exit;
end
else
inherited GotoNextCellHorz(AGotoNext);
end
else
inherited GotoNextCellHorz(AGotoNext);
end;
procedure TcxSchedulerWeeksViewNavigation.GotoNextCellVert(AGotoDown: Boolean);
begin
if not AGotoDown and (FWeekIndex <= 0) then
FCurrentAnchor := FCurrentAnchor - 7
else
if AGotoDown and (FWeekIndex >= Weeks.Count - 1) then
FCurrentAnchor := FCurrentAnchor + 7
else
inherited GotoNextCellVert(AGoToDown);
end;
function TcxSchedulerWeeksViewNavigation.IsScrollResource(AGotoNext: Boolean): Boolean;
begin
Result := (AGoToNext and (FDayOfWeek = 6) and IsLastResource) or
(not AGoToNext and (FDayOfWeek = 0) and IsFirstResource);
if Result then
Result := ScrollResourcesEx(AGotoNext, FCurrentResource);
if Result then
begin
if not AGoToNext then
FCurrentAnchor := FCurrentAnchor + 6
else
FCurrentAnchor := GetWeekStart(FWeekIndex);
end;
end;
function TcxSchedulerWeeksViewNavigation.GetViewInfo: TcxSchedulerWeeksViewViewInfo;
begin
Result := TcxSchedulerWeeksViewViewInfo(inherited ViewInfo);
end;
{ TcxSchedulerWeekViewEventCellViewInfo }
procedure TcxSchedulerWeekViewEventCellViewInfo.CalculateBorders;
begin
if ViewData.ContentFinish < EventFinish then
Exclude(FBorders, bRight);
if ViewData.ContentStart > EventStart then
Exclude(FBorders, bLeft);
end;
procedure TcxSchedulerWeekViewEventCellViewInfo.CalculateCaptions;
begin
if (DateOf(EventStart) <> DateOf(EventFinish)) and (Event.Duration < 1) then
begin
FStartText := DateTimeHelper.TimeToStrEx(Max(EventStart, ContentStart));
FFinishText := DateTimeHelper.TimeToStrEx(Min(EventFinish, ContentFinish));
end
else
inherited CalculateCaptions;
end;
procedure TcxSchedulerWeekViewEventCellViewInfo.CalculateEventTimeVisibility;
begin
CalculateNonDetailEventTimeVisibility;
if not IsHeaderEvent then
ViewData.ShowStartTime := True
else
if ViewData.ShowTimeAsClock and not Event.AllDayEvent then
begin
ViewData.ShowStartTime := ViewData.ShowStartTime and (TimeOf(Event.Start) <> 0);
ViewData.ShowFinishTime := ViewData.ShowFinishTime and (TimeOf(Event.Finish) <> 0);
end;
end;
procedure TcxSchedulerWeekViewEventCellViewInfo.CalculateItemsLayout;
begin
if IsHeaderEvent then
CalculateHeaderEventLayout
else
CalculateNonDetailEventLayout;
end;
function TcxSchedulerWeekViewEventCellViewInfo.GetEditingRect: TRect;
begin
Result := inherited GetEditingRect;
with Result do
begin
if not IsHeaderEvent then
begin
if not cxRectIsEmpty(FFinishRect) then
Left := FFinishRect.Right
else
if not cxRectIsEmpty(FStartRect) then
Left := FStartRect.Right
else
Left := FBounds.Left;
Inc(Left, cxTextOffset + cxEventImagesGap);
Dec(Right);
Inc(Top);
Dec(Bottom);
end;
end;
end;
procedure TcxSchedulerWeekViewEventCellViewInfo.InitHitTest(
AHitTest: TcxSchedulerCustomResourceViewHitTest);
begin
inherited InitHitTest(AHitTest);
if IsHeaderEvent then
InitHitTestForHorzEvent(AHitTest)
else
if (ShowStartTime and (AHitTest.HitX <= FStartRect.Right)) or
(ShowFinishTime and (AHitTest.HitX <= FFinishRect.Right)) then
AHitTest.SetDragKind(edkEventDragRect);
end;
{ TcxSchedulerWeekViewViewInfo }
constructor TcxSchedulerWeekViewViewInfo.Create(AOwner: TcxSchedulerSubControl);
begin
inherited Create(AOwner);
Builder := TcxSchedulerEventLayoutBuilder.Create;
end;
destructor TcxSchedulerWeekViewViewInfo.Destroy;
begin
Builder.Free;
inherited Destroy;
end;
procedure TcxSchedulerWeekViewViewInfo.ScrollVertical(
AScrollCode: TScrollCode; var AScrollPos: Integer);
var
ADelta: Integer;
begin
ADelta := View.GetScrollPos(StartDates[0], False);
if not (AScrollCode in [scPosition, scTrack]) then
AScrollPos := ADelta;
case AScrollCode of
scLineUp:
Dec(AScrollPos, 1);
scLineDown:
Inc(AScrollPos, 1);
scPageUp:
Dec(AScrollPos, Weeks.Count);
scPageDown:
Inc(AScrollPos, Weeks.Count);
scTop:
AScrollPos := -View.GetMinScrollPos;
scBottom:
AScrollPos := View.GetMaxScrollPos;
end;
ADelta := ADelta - AScrollPos;
if ADelta <> 0 then
begin
View.ScrollSelectedDays(ADelta);
View.LayoutChanged;
AScrollPos := View.GetScrollPos(StartDates[0]);
end;
end;
function TcxSchedulerWeekViewViewInfo.AddContentCell(const ARect: TRect;
const AStart, AFinish: TDateTime; AResourceIndex: Integer): TcxSchedulerContentCellViewInfo;
begin
Result := inherited AddContentCell(ARect, AStart, AFinish, AResourceIndex);
Result.DontPrint := PrintExactlyOneMonth and (MonthOf(AStart) <> PrintedMonth);
end;
procedure TcxSchedulerWeekViewViewInfo.AddDayCellEvent(
APlace: TcxSchedulerEventPlace);
var
I, AOfs: Integer;
AStart, AFinish: TDateTime;
ABounds, AVisibleRect: TRect;
AResource: TcxSchedulerResourceViewInfo;
AViewData: TcxSchedulerEventViewData;
ACell: TcxSchedulerEventCellViewInfo;
AEvent: TcxSchedulerControlEvent;
begin
AOfs := DayCells[APlace.ColStart].Bounds.Top + GetDayCellHeaderHeight;
AEvent := TcxSchedulerControlEvent(APlace.Event);
ABounds.Top := 0;
ABounds.Bottom := FContentLineHeight;
GetEventInfo(APlace.ColStart, APlace.ColFinish, ABounds.Left,
ABounds.Right, AStart, AFinish, AVisibleRect, AResource);
OffsetRect(ABounds, 0, AOfs + APlace.LineStart * (FContentLineHeight + cxTextOffset));
if ABounds.Bottom <= AVisibleRect.Bottom then
begin
AViewData := CreateEventViewData(AEvent, ABounds, AStart, AFinish, AResource);
AViewData.VisibleRect := AVisibleRect;
if AEvent.Selected then
with Styles.GetSelectionParams do
begin
AViewData.ViewParams.Color := Color;
AViewData.ViewParams.TextColor := TextColor;
AViewData.ViewParams.Font := Font;
end;
ACell := AddEventCell(AViewData);
if not (AEvent.AllDayEvent or (AEvent.Duration >= 1)) then
begin
ACell.Transparent := not (AEvent.Selected or Styles.IsEventStyleAssigned(AEvent));
ACell.Borders := [];
end;
end
else
for I := APlace.ColStart to APlace.ColFinish do
begin
if DayCells[I].LineCount <> MaxInt then
begin
AddButton(DayCells[I].Bounds, DayCells[I].TimeStart, -1, True);
DayCells[I].LineCount := MaxInt;
end;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.AddDayCellEventPlace(
AEvent: TcxSchedulerControlEvent; var AIndex: Integer);
var
I, J: Integer;
ADay: TcxSchedulerContentCellViewInfo;
begin
if not CanEventVisible(AEvent) then
begin
Inc(AIndex);
Exit;
end;
J := -1;
for I := AIndex to DayCellCount - 1 do
begin
ADay := DayCells[I];
if IsSingleLine(DayCells[AIndex], ADay) and IsCellEvent(AEvent, ADay) then
begin
if CanVisibleNextLine(ADay) then
begin
J := I;
ADay.LineCount := ADay.LineCount + 1;
end
else
begin
AddButton(ADay.Bounds, ADay.TimeStart, -1, True);
ADay.LineCount := MaxInt;
Break;
end;
if AEvent.Duration < 1 then Break;
end
else
begin
if J = -1 then
AIndex := I + 1;
Break;
end;
end;
if (J <> -1) and (J >= AIndex) then
begin
Builder.AddEventPlace(AEvent, AIndex, J);
AIndex := J + 1;
end;
end;
function TcxSchedulerWeekViewViewInfo.AddWeekDayHeader(
AWeekDay: Integer; ALeft, ARight: Integer): TcxSchedulerWeekDayHeaderCellViewInfo;
begin
Inc(AWeekDay, Integer(View.StartOfWeek));
if AWeekDay >= 7 then Dec(AWeekDay, 7);
CreateCellInstance(TcxSchedulerWeekDayHeaderCellViewInfo, cxRect(ALeft, FDayHeaderOffsetTop,
ARight, FDayHeaderOffsetTop + FDayHeaderHeight),
StylesAdapter.GetDayHeaderParams(View.FirstVisibleDate + AWeekDay), Result);
if CompressWeekEnd and (AWeekDay >= 6) then
Result.DateTime := 8
else
Result.DateTime := AWeekDay;
DayHeaderCells.Add(Result);
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateDaysLayout;
begin
if GroupByResource then
ProcessGroupByResource
else
if GroupByDate then
ProcessGroupByDate
else
ProcessGroupByNone;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateDaysLayoutForResource(
const ABounds: TRect; AResourceIndex: Integer);
const
AddBorders: array[Boolean] of TcxBorders = ([bRight], []);
begin
CalculateWeekDisplayRectsVert(StartDates[0], AResourceIndex, ABounds,
AddBorders[HasSeparator or (AResourceIndex = (ResourceCount - 1))]);
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateDaysLayoutForDates(
const ABounds: TRect; AResourceIndex: Integer);
begin
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateEventsViewInfo;
var
I, J: Integer;
AEvent: TcxSchedulerControlEvent;
begin
for I := 0 to Events.AbsoluteCount - 1 do
begin
J := 0;
AEvent := Events.AbsoluteItems[I];
while J < DayCellCount do
begin
if IsCellEvent(AEvent, DayCells[J]) then
AddDayCellEventPlace(AEvent, J)
else
Inc(J);
end;
end;
Builder.Calculate;
for I := 0 to Builder.EventPlaceCount - 1 do
AddDayCellEvent(Builder.EventPlaces[I]);
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateGroupByDateForResource(
const ABounds: TRect; AResourceIndex: Integer);
begin
CalculateWeekDisplayRectsHorz(StartDates[0], AResourceIndex, ABounds, True, True);
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateHeaderViewInfo;
var
R: TRect;
I, AIndex: Integer;
ACell: TcxSchedulerContentCellViewInfo;
AHeader: TcxSchedulerDayHeaderCellViewInfo;
const
ANeighbors: array[Boolean] of TcxNeighbors = ([], [nLeft]);
begin
if GroupByDate then
for I := 0 to RowCols - 1 do
begin
ACell := DayCells[I];
AHeader := AddWeekDayHeader(I + RowColsStart, ACell.Bounds.Left, ACell.Bounds.Right);
AHeader.Compressed := (I = 5) and CompressWeekEnd;
end
else
begin
AIndex := Byte(ResourceCount > 0) - 1;
for I := 0 to ContentCells.Count - 1 do
begin
ACell := TcxSchedulerContentCellViewInfo(ContentCells[I]);
R := cxRectSetHeight(ACell.Bounds, FDayHeaderHeight);
OffsetRect(R, 0, 1);
if HasVisibleBounds then
begin
Inc(R.Right);
OffsetRect(R, 0, -1);
end;
if (View.DaysLayout <> wdlOneColumn) and (not HasSeparator or ((I mod 7) <= 2)) then
Dec(R.Right);
with AddDayHeader(ACell.TimeStart, R, AIndex) do
begin
AlignHorz := taRightJustify;
Selected := IsTimeSelected(DateTime, Resource);
if Selected and not HideSelection then
begin
SelectionColor := FSelectionParams.Color;
SelectionTextColor := FSelectionParams.TextColor;
end;
end;
if (I + 1) mod 7 = 0 then Inc(AIndex);
end;
end;
ProcessDateToDisplayText(True);
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateMetrics;
begin
inherited CalculateMetrics;
FDayHeaderOffsetTop := Bounds.Top;
FHeaderOffsetLeft := Bounds.Left;
FResourceHeaderWidth := FResourceHeaderHeight;
Weeks.Clear;
CalculatePrintRowCols;
CalculateWeekDates;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculatePrintRowCols;
begin
FWeekEndCells := Byte(not PrintWeekEnds) * (Byte(not CompressWeekEnd) + 1);
FRowColsStart := 0;
FRowCols := 7 - Byte(CompressWeekEnd) - FWeekEndCells;
CalculateStartFinishCellIndexes;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateResourceHeadersAutoHeight(
AWidth: Integer);
begin
if GroupByDate and not RotateCaptions then
FResourceHeaderHeight := CalculateResourceHeaderWidth
else
inherited CalculateResourceHeadersAutoHeight(AWidth);
FResourceHeaderWidth := FResourceHeaderHeight;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateStartFinishCellIndexes;
begin
if PagesPerWeek = 1 then Exit;
if PrimaryPage then
FRowCols := 3
else
begin
FRowColsStart := 3;
FRowCols := FRowCols - FRowColsStart;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateWeekDates;
var
I, ADate: Integer;
AYear, APrevYear, AWeek, APrevWeek, AWeekDay: Word;
begin
APrevYear := 0;
APrevWeek := 0;
for I := 0 to DayCount - 1 do
begin
DecodeDateWeek(Days[I] + View.GetDateOffset, AYear, AWeek, AWeekDay);
if (AYear <> APrevYear) or (AWeek <> APrevWeek) then
begin
APrevYear := AYear;
APrevWeek := AWeek;
//DELPHI8! check Trunc(EncodeDateWeek(AYear, AWeek, 1))
ADate := Trunc(EncodeDateWeek(AYear, AWeek, 1));
Weeks.Add(ADate);
end;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateWeekDisplayRectsHorz(
const AStartDate: TDateTime; AResourceID: Integer;
{const }ABounds: TRect; AIsTopWeek, AIsLastWeek: Boolean);
var
I, J, W: Integer;
ARects: TcxSchedulerDaysRect;
ACellBorders: TcxBorders;
const
ABorders: array[Boolean] of TcxBorders = ([bTop, bRight], [bTop]);
begin
W := ABounds.Right - ABounds.Left;
for I := 0 to RowCols - 1 do
begin
J := I + RowColsStart;
ARects[J] := cxRect(ABounds.Left + MulDiv(W, I, RowCols),
ABounds.Top - 1, ABounds.Left + MulDiv(W, I + 1, RowCols), ABounds.Bottom);
if CompressWeekEnd and (J = 5) then
cxRectSplitVert(ARects[5], ARects[5], ARects[6]);
end;
for I := 0 to RowCols - 1 + Byte(CompressWeekEnd) * Byte(PrintWeekEnds) do
begin
ACellBorders := ABorders[(I >= (RowCols - 1)) and (HasSeparator or (AResourceID = (ResourceCount - 1)))];
if AIsTopWeek and (I <> RowCols) then
Exclude(ACellBorders, bTop);
if AIsLastWeek and not HasSeparator and (I <> RowCols - 1) and (AResourceID <> ResourceCount - 1) then
Include(ACellBorders, bBottom);
J := I + RowColsStart;
AddContentCell(ARects[J], AStartDate + J,
AStartDate + J + 1, AResourceID).Borders := ACellBorders;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateWeekDisplayRectsVert(
const AStartDate: TDateTime; AResourceID: Integer;
const ABounds: TRect; AddBorders: TcxBorders = []);
var
R: TRect;
I, J: Integer;
ARects: TcxSchedulerDaysRect;
ASize: TSize;
begin
if View.DaysLayout = wdlOneColumn then
begin
CalculateWeekDisplayRectsVertEx(AStartDate, AResourceID, ABounds, AddBorders);
Exit;
end;
FillChar(ARects, SizeOf(ARects), 0);
ASize := cxRectSize(ABounds);
for I := 0 to 2 do
begin
R := cxRect(ABounds.Left, ABounds.Top + MulDiv(ASize.CY, I, 3),
ABounds.Right, ABounds.Top + MulDiv(ASize.CY, I + 1, 3));
if PagesPerWeek = 1 then
cxRectSplitHorz(R, ARects[I], ARects[I + 3])
else
begin
ARects[I] := R;
ARects[I + 3] := R;
end;
end;
cxRectSplitVert(ARects[5], ARects[5], ARects[6]);
for I := 0 to RowCols do
begin
J := RowColsStart + I;
AddContentCell(ARects[J], AStartDate + J, AStartDate + J + 1,
AResourceID).Borders := WeekViewDayBorders[J] + AddBorders;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.CalculateWeekDisplayRectsVertEx(
const AStartDate: TDateTime; AResourceID: Integer;
const ABounds: TRect; AddBorders: TcxBorders = []);
var
R: TRect;
I, J, C: Integer;
ARects: TcxSchedulerDaysRect;
ASize: TSize;
begin
FillChar(ARects, SizeOf(ARects), 0);
ASize := cxRectSize(ABounds);
C := RowCols + 1 - Byte(View.CompressWeekEnd);
for I := 0 to C - 1 do
begin
R := cxRect(ABounds.Left, ABounds.Top + MulDiv(ASize.CY, I, C),
ABounds.Right, ABounds.Top + MulDiv(ASize.CY, I + 1, C));
ARects[RowColsStart + I] := R;
end;
if View.CompressWeekEnd then
cxRectSplitVert(ARects[5], ARects[5], ARects[6]);
C := RowCols;
if (PagesPerWeek > 1) and PrimaryPage then
Dec(C);
for I := 0 to C do
begin
J := RowColsStart + I;
AddContentCell(ARects[J], AStartDate + J, AStartDate + J + 1,
AResourceID).Borders := [bTop] + AddBorders;
end;
end;
function TcxSchedulerWeekViewViewInfo.CanEventVisible(
AEvent: TcxSchedulerControlEvent): Boolean;
begin
Result := not (AEvent.IsClone and FHideClones);
end;
function TcxSchedulerWeekViewViewInfo.CanVisibleNextLine(
ADay: TcxSchedulerContentCellViewInfo; ALine: Integer = -1): Boolean;
begin
if ALine = -1 then
ALine := ADay.LineCount;
Result := (GetDayCellContentHeight(ADay)) >=
(ALine + 1) * FContentLineHeight;
end;
procedure TcxSchedulerWeekViewViewInfo.CheckHeaderBorders;
var
I: Integer;
const
ANeigbors: array[Boolean] of TcxNeighbors =
([], [nTop]);
ADayHeader: array[Boolean] of TcxNeighbors =
([], [nLeft]);
ABorders: array[Boolean] of TcxBorders =
([], [bBottom]);
begin
ProcessCheckBorders(DayHeaderCells, GroupingKind = gkByDate,
ANeigbors[not GroupByDate] + ADayHeader[GroupByDate]);
ProcessCheckBorders(ResourceHeaderCells, False, [], ABorders[GroupByResource]);
if not GroupByDate then
begin
if GroupByResource then
with TcxSchedulerDayHeaderCellViewInfo(ResourceHeaderCells[0]) do
Borders := Borders - [bLeft];
for I := 0 to DayHeaderCells.Count - 1 do
with TcxSchedulerDayHeaderCellViewInfo(DayHeaderCells[I]) do
Borders := [bBottom, bTop] * LookAndFeelPainter.HeaderBorders([nTop]);
end;
end;
function TcxSchedulerWeekViewViewInfo.ContentCellClass: TcxSchedulerContentCellViewInfoClass;
begin
if GroupByDate then
Result := TcxSchedulerMonthDayContentCellViewInfo
else
Result := inherited ContentCellClass;
end;
function TcxSchedulerWeekViewViewInfo.CreateEventCellViewInfo(
AViewData: TcxSchedulerEventViewData): TcxSchedulerEventCellViewInfo;
begin
Result := TcxSchedulerWeekViewEventCellViewInfo.Create(AViewData);
end;
function TcxSchedulerWeekViewViewInfo.CompressWeekEnd: Boolean;
begin
if GroupByDate then
Result := View.CompressWeekEnd
else
Result := True;
end;
procedure TcxSchedulerWeekViewViewInfo.DoCalculate;
begin
FPrintWeekEnds := True;
Builder.Clear;
inherited DoCalculate;
FPrintExactlyOneMonth := Adapter.PrintExactlyOneMonth;
if FPrintExactlyOneMonth then
FPrintedMonth := MonthOf(Days[DayCount div 2]);
if IsCalculateHeaderFirst then
begin
CalculateHeaderViewInfo;
CalculateDaysLayout;
end
else
begin
CalculateDaysLayout;
CalculateHeaderViewInfo;
end;
CalculateEventsViewInfo;
CheckHeaderBorders;
end;
procedure TcxSchedulerWeekViewViewInfo.DoMoreEventsButtonClick(
Sender: TcxSchedulerMoreEventsButtonViewInfo);
begin
SelectedDays.Clear;
SelectedDays.Add(Sender.DateTime);
View.PeriodChanged;
end;
procedure TcxSchedulerWeekViewViewInfo.GetEventInfo(AColStart, AColFinish: Integer;
var ALeft, ARight: Integer; var AStart, AFinish: TDateTime;
var AVisibleRect: TRect; var AResource: TcxSchedulerResourceViewInfo);
begin
with DayCells[AColStart] do
begin
ALeft := Bounds.Left + cxTextOffset;
AStart := TimeStart;
AResource := Resource;
AVisibleRect := Bounds;
end;
with DayCells[AColFinish] do
begin
ARight := Bounds.Right - cxTextOffset - 1;
AFinish := TimeFinish;
AVisibleRect.Right := Bounds.Right;
end;
Dec(AVisibleRect.Bottom, cxTextOffset);
end;
function TcxSchedulerWeekViewViewInfo.GetResourcesContentWidth: Integer;
begin
if GroupByResource then
Result := Bounds.Right - Bounds.Left
else
Result := inherited GetResourcesContentWidth;
end;
function TcxSchedulerWeekViewViewInfo.GetResourceImagesSize: TSize;
begin
if ResourceImages = nil then
Result := TSize(cxNullSize)
else
begin
Result := inherited GetResourceImagesSize;
if GroupByDate and ResourceHeaders.RotateCaptions then
Result := cxSize(ResourceImages.Height, ResourceImages.Width);
end;
end;
function TcxSchedulerWeekViewViewInfo.GetResourceScrollBarKind: TScrollBarKind;
begin
if (FGroupingKind = gkByDate) and ResourceNavigator.NeedScrollBar then
Result := sbVertical
else
Result := sbHorizontal
end;
function TcxSchedulerWeekViewViewInfo.GetContentParams(
const ATime: TDateTime; AResource: TcxSchedulerResourceViewInfo): TcxViewParams;
begin
if AResource = nil then
Result := StylesAdapter.GetContentParams(ATime, True, nil)
else
Result := StylesAdapter.GetContentParams(ATime, True, AResource.ResourceItem);
end;
function TcxSchedulerWeekViewViewInfo.GetDayCellContentHeight(
ADay: TcxSchedulerContentCellViewInfo): Integer;
begin
Result := cxRectHeight(PainterHelper.ExcludeBorders(ADay.Bounds,
ADay.Borders)) - GetDayCellHeaderHeight - cxTextOffset;
end;
function TcxSchedulerWeekViewViewInfo.GetDayCellHeaderHeight: Integer;
begin
if GroupByDate then
Result := cxTextOffset + FContentFontHeight
else
Result := FDayHeaderHeight + cxTextOffset;
end;
function TcxSchedulerWeekViewViewInfo.IsCalculateHeaderFirst: Boolean;
begin
Result := False;
end;
function TcxSchedulerWeekViewViewInfo.IsCellEvent(
AEvent: TcxSchedulerControlEvent; ACell: TcxSchedulerContentCellViewInfo): Boolean;
begin
Result := (ACell <> nil) and AEvent.IsDayEvent(ACell.TimeStart);
if Result and (GroupingKind <> gkNone) then
Result := AEvent.IsResourceEvent(ACell.Resource.ResourceItem, ShowEventsWithoutResource);
if Result and PrintExactlyOneMonth then
Result := MonthOf(ACell.TimeStart) = PrintedMonth;
end;
function TcxSchedulerWeekViewViewInfo.IsSingleLine(
ADay1, ADay2: TcxSchedulerContentCellViewInfo): Boolean;
begin
Result := (ADay1 <> nil) and (ADay2 <> nil) and
(ADay1.Bounds.Top = ADay2.Bounds.Top);
end;
function TcxSchedulerWeekViewViewInfo.IsTimeSelected(
ATime: TDateTime; AResource: TObject): Boolean;
begin
ATime := DateTimeHelper.RoundTime(ATime);
Result := not HideSelection and (AResource = FSelResource) and
(ATime >= SelStart) and (ATime <= SelFinish);
Result := Result and CanSelected;
end;
procedure TcxSchedulerWeekViewViewInfo.ProcessGroupByDate;
function IsSameMonth(ACell1, ACell2: TcxSchedulerMonthDayContentCellViewInfo): Boolean;
begin
Result := (ACell1 <> nil) and (ACell2 <> nil);
if Result then
Result := ACell1.Resource = ACell2.Resource;
if Result then
Result := MonthOf(ACell1.TimeStart) = MonthOf(ACell2.TimeStart);
end;
var
I, H: Integer;
ABounds: TRect;
ACell: TcxSchedulerHeaderCellViewInfo;
APrevCell, AContentCell: TcxSchedulerMonthDayContentCellViewInfo;
begin
ABounds := Bounds;
Inc(ABounds.Left, ResourceHeaderWidth);
H := cxRectHeight(ABounds) - DayHeaderHeight -
SeparatorWidth * (ResourceCount - 1);
AddResourceHeader(-1, cxRectSetSize(Bounds, ResourceHeaderWidth, DayHeaderHeight));
for I := 0 to ResourceCount - 1 do
begin
ABounds.Top := Bounds.Top + DayHeaderHeight +
MulDiv(H, I, ResourceCount) + SeparatorWidth * I + 1;
ABounds.Bottom := Bounds.Top + DayHeaderHeight +
MulDiv(H, I + 1, ResourceCount) + SeparatorWidth * I;
CalculateGroupByDateForResource(ABounds, I);
if I < (ResourceCount - 1) then
AddGroupHorzSeparator(ABounds.Bottom);
Dec(ABounds.Top);
ACell := AddResourceHeader(I, cxRectSetWidth(ABounds,
Bounds.Left, ResourceHeaderWidth));
ACell.RotateText := RotateCaptions;
ACell.RotateHeader := True;
end;
APrevCell := nil;
for I := 0 to ContentCells.Count - 1 do
begin
AContentCell := TcxSchedulerMonthDayContentCellViewInfo(ContentCells[I]);
AContentCell.SetContentState(IsSameMonth(APrevCell, AContentCell),
IsTimeSelected(AContentCell.TimeStart, AContentCell.Resource),
FContentFontHeight, FSelectionParams);
APrevCell := AContentCell;
end;
end;
procedure TcxSchedulerWeekViewViewInfo.ProcessGroupByNone;
begin
CalculateWeekDisplayRectsVert(StartDates[0], -1, Bounds);
end;
procedure TcxSchedulerWeekViewViewInfo.ProcessGroupByResource;
var
I, W: Integer;
ABounds: TRect;
ACell: TcxSchedulerHeaderCellViewInfo;
begin
ABounds := Bounds;
W := ABounds.Right - ABounds.Left - SeparatorWidth * (ResourceCount - 1);
Inc(ABounds.Top, ResourceHeaderHeight);
for I := 0 to ResourceCount - 1 do
begin
ABounds.Left := MulDiv(W, I, ResourceCount) + SeparatorWidth * I;
ABounds.Right := MulDiv(W, I + 1, ResourceCount) + SeparatorWidth * I;
CalculateDaysLayoutForResource(ABounds, I);
if I < (ResourceCount - 1) then
AddGroupVertSeparator(ABounds.Right);
ACell := AddResourceHeader(I, cxRectSetTop(ABounds, Bounds.Top, ResourceHeaderHeight));
ACell.Borders := LookAndFeelPainter.HeaderBorders([nLeft, nRight, nBottom]);
if not (bLeft in ACell.Borders) then
ACell.Borders := ACell.Borders - [bRight, bBottom];
end;
end;
function TcxSchedulerWeekViewViewInfo.GetDayCell(
ADay: Integer): TcxSchedulerContentCellViewInfo;
begin
Result := TcxSchedulerContentCellViewInfo(ContentCells[ADay]);
end;
function TcxSchedulerWeekViewViewInfo.GetDayCellCount: Integer;
begin
Result := ContentCells.Count;
end;
function TcxSchedulerWeekViewViewInfo.GetRotateCaptions: Boolean;
begin
Result := View.OptionsView.RotateResourceCaptions;
end;
function TcxSchedulerWeekViewViewInfo.GetStartDate(AWeek: Integer): TDateTime;
begin
Result := Weeks[AWeek];
if not CompressWeekEnd then
Result := Result - View.GetDateOffset;
end;
function TcxSchedulerWeekViewViewInfo.GetView: TcxSchedulerWeekView;
begin
Result := TcxSchedulerWeekView(inherited View);
end;
function TcxSchedulerWeekViewViewInfo.GetWeeks: TcxSchedulerDateList;
begin
Result := View.FWeeks;
end;
{ TcxSchedulerWeeksViewEventCellViewInfo }
function TcxSchedulerWeeksViewEventCellViewInfo.CanAutoHideStandardImages: Boolean;
begin
Result := True;
end;
{ TcxSchedulerWeeksViewViewInfo }
procedure TcxSchedulerWeeksViewViewInfo.CalculateDaysLayoutForResource(
const ABounds: TRect; AResourceIndex: Integer);
var
R: TRect;
C, I, H, ATop, APrevMonth: Integer;
ACell: TcxSchedulerMonthDayContentCellViewInfo;
begin
ATop := ABounds.Top;
if not GroupByDate then
Inc(ATop, FDayHeaderHeight);
H := ABounds.Bottom - ATop;
C := ContentCells.Count;
for I := 0 to Weeks.Count - 1 do
begin
R := cxRect(ABounds.Left, ATop + MulDiv(H, I, Weeks.Count),
ABounds.Right, ATop + MulDiv(H, I + 1, Weeks.Count));
if (I > 0) or not GroupByDate then Inc(R.Top);
CalculateWeekDisplayRectsHorz(StartDates[I], AResourceIndex, R, I = 0, I = Weeks.Count - 1);
end;
APrevMonth := -1;
for I := C to ContentCells.Count - 1 do
begin
ACell := TcxSchedulerMonthDayContentCellViewInfo(ContentCells[I]);
ACell.SetContentState(APrevMonth = MonthOf(ACell.TimeStart),
IsTimeSelected(ACell.TimeStart, ACell.Resource), FContentFontHeight, FSelectionParams);
APrevMonth := MonthOf(ACell.TimeStart);
end;
end;
procedure TcxSchedulerWeeksViewViewInfo.CalculateGroupByDateForResource(
const ABounds: TRect; AResourceIndex: Integer);
begin
CalculateDaysLayoutForResource(ABounds, AResourceIndex);
end;
procedure TcxSchedulerWeeksViewViewInfo.CalculateHeaderViewInfo;
var
I, W: Integer;
begin
if GroupByResource then Exit;
if GroupByDate then
FHeaderOffsetLeft := ResourceHeaderWidth + Bounds.Left;
W := Bounds.Right - FHeaderOffsetLeft;
for I := 0 to RowCols - 1 do
begin
AddWeekDayHeader(I + RowColsStart, MulDiv(W, I, RowCols) + FHeaderOffsetLeft,
MulDiv(W, I + 1, RowCols) + FHeaderOffsetLeft);
end;
ProcessDateToDisplayText(True);
FContentOffset := FDayHeaderHeight;
end;
procedure TcxSchedulerWeeksViewViewInfo.CheckHeaderBorders;
const
ANeigbors: array[Boolean] of TcxNeighbors =
([], [nTop]);
begin
ProcessCheckBorders(DayHeaderCells, False, ANeigbors[GroupByResource]);
ProcessCheckBorders(ResourceHeaderCells, False);
if not GroupByDate or not (bLeft in LookAndFeelPainter.HeaderBorders([nLeft])) then
begin
with TcxSchedulerHeaderCellViewInfo(DayHeaderCells[0]) do
Borders := Borders - [bLeft];
if GroupByResource then
with TcxSchedulerDayHeaderCellViewInfo(ResourceHeaderCells[0]) do
Borders := Borders - [bLeft];
end;
end;
function TcxSchedulerWeeksViewViewInfo.CompressWeekEnd: Boolean;
begin
Result := View.CompressWeekEnd;
end;
function TcxSchedulerWeeksViewViewInfo.ContentCellClass: TcxSchedulerContentCellViewInfoClass;
begin
Result := TcxSchedulerMonthDayContentCellViewInfo;
end;
function TcxSchedulerWeeksViewViewInfo.CreateEventCellViewInfo(
AViewData: TcxSchedulerEventViewData): TcxSchedulerEventCellViewInfo;
begin
Result := TcxSchedulerWeeksViewEventCellViewInfo.Create(AViewData);
end;
function TcxSchedulerWeeksViewViewInfo.GetContentParams(
const ATime: TDateTime; AResource: TcxSchedulerResourceViewInfo): TcxViewParams;
begin
if AResource = nil then
Result := StylesAdapter.GetContentParams(ATime, not Odd(MonthOf(ATime)), nil)
else
Result := StylesAdapter.GetContentParams(ATime, not Odd(MonthOf(ATime)),
AResource.ResourceItem);
end;
function TcxSchedulerWeeksViewViewInfo.GetDayCellHeaderHeight: Integer;
begin
Result := cxTextOffset + FContentFontHeight;
end;
function TcxSchedulerWeeksViewViewInfo.IsCalculateHeaderFirst: Boolean;
begin
Result := True;
end;
procedure TcxSchedulerWeeksViewViewInfo.ProcessGroupByNone;
begin
CalculateDaysLayoutForResource(Bounds, -1);
end;
procedure TcxSchedulerWeeksViewViewInfo.ProcessGroupByResource;
var
I, J, W: Integer;
ACell: TcxSchedulerHeaderCellViewInfo;
begin
inherited ProcessGroupByResource;
Inc(FDayHeaderOffsetTop, FResourceHeaderHeight);
for J := 0 to ResourceHeaderCells.Count - 1 do
begin
ACell := TcxSchedulerHeaderCellViewInfo(ResourceHeaderCells[J]);
W := cxRectWidth(ACell.Bounds);
for I := 0 to RowCols - 1 do
AddWeekDayHeader(I + RowColsStart, MulDiv(W, I, RowCols) + ACell.Bounds.Left,
MulDiv(W, I + 1, RowCols) + + ACell.Bounds.Left).Resource := ACell.Resource;
ProcessDateToDisplayText(True);
end;
end;
{ TcxSchedulerWeekViewPainter }
procedure TcxSchedulerWeekViewPainter.Paint;
begin
inherited Paint;
ViewInfo.ContentCells.Draw(Canvas, DrawContentCell);
ViewInfo.DayHeaderCells.Draw(Canvas, DrawHeaderCell);
ViewInfo.ResourceHeaderCells.Draw(Canvas, DrawResourceHeaderCell);
ViewInfo.GroupSeparatorCells.Draw(Canvas, DrawGroupSeparatorCell);
ViewInfo.EventCells.Draw(Canvas, DrawEventCell);
ViewInfo.Buttons.Draw(Canvas, DrawButtonCell);
end;
function TcxSchedulerWeekViewPainter.GetViewInfo: TcxSchedulerWeekViewViewInfo;
begin
Result := TcxSchedulerWeekViewViewInfo(inherited ViewInfo);
end;
end.