cxScheduler.pas
Upload User: yeeken
Upload Date: 2017-09-30
Package Size: 10475k
Code Size: 28k
Category:

Delphi VCL

Development Platform:

Delphi

  1. {********************************************************************}
  2. {                                                                    }
  3. {       Developer Express Visual Component Library                   }
  4. {                   ExpressScheduler                                 }
  5. {                                                                    }
  6. {       Copyright (c) 2003-2009 Developer Express Inc.               }
  7. {       ALL RIGHTS RESERVED                                          }
  8. {                                                                    }
  9. {   The entire contents of this file is protected by U.S. and        }
  10. {   International Copyright Laws. Unauthorized reproduction,         }
  11. {   reverse-engineering, and distribution of all or any portion of   }
  12. {   the code contained in this file is strictly prohibited and may   }
  13. {   result in severe civil and criminal penalties and will be        }
  14. {   prosecuted to the maximum extent possible under the law.         }
  15. {                                                                    }
  16. {   RESTRICTIONS                                                     }
  17. {                                                                    }
  18. {   THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES            }
  19. {   (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE     }
  20. {   SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS    }
  21. {   LICENSED TO DISTRIBUTE THE EXPRESSSCHEDULER AND ALL ACCOMPANYING }
  22. {   VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY.              }
  23. {                                                                    }
  24. {   THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED       }
  25. {   FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE         }
  26. {   COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE        }
  27. {   AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT   }
  28. {   AND PERMISSION FROM DEVELOPER EXPRESS INC.                       }
  29. {                                                                    }
  30. {   CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON        }
  31. {   ADDITIONAL RESTRICTIONS.                                         }
  32. {                                                                    }
  33. {********************************************************************}
  34. unit cxScheduler;
  35. {$I cxVer.inc}
  36. interface
  37. uses
  38.   Windows, Controls, ImgList,
  39. {$IFDEF DELPHI6}
  40.   DateUtils, Types,
  41. {$ENDIF}
  42.   cxGraphics, cxDateUtils, cxSchedulerUtils,
  43.   cxSchedulerStorage, cxSchedulerCustomControls, cxSchedulerCustomResourceView,
  44.   cxSchedulerDayView, cxSchedulerWeekView, cxSchedulerDateNavigator, Classes,
  45.   cxSchedulerGanttView, cxSchedulerTimeGridView, cxSchedulerYearView;
  46. type
  47.   { TcxScheduler }
  48.   TcxSchedulerInitEventImages = procedure (Sender: TcxCustomScheduler;
  49.     AEvent: TcxSchedulerControlEvent; AImages: TcxSchedulerEventImages) of object;
  50.   TcxScheduler = class(TcxCustomScheduler, IUnknown, IcxSchedulerCommonViewItemsPainter, IcxSchedulerEventImages)
  51.   private
  52.     FDateNavigatorEvents: TNotifyEvent;
  53.     FIsSelectionValidated: Boolean;
  54.     FViewDay: TcxSchedulerDayView;
  55.     FViewGantt: TcxSchedulerGanttView;
  56.     FViewTimeGrid: TcxSchedulerTimeGridView;
  57.     FViewWeek: TcxSchedulerWeekView;
  58.     FViewWeeks: TcxSchedulerWeeksView;
  59.     FViewYear: TcxSchedulerYearView;
  60.     FOnCustomDrawBackground: TcxSchedulerCustomDrawBackgroundEvent;
  61.     FOnCustomDrawButton: TcxSchedulerCustomDrawButtonEvent;
  62.     FOnCustomDrawContent: TcxSchedulerCustomDrawContentEvent;
  63.     FOnCustomDrawDayHeader: TcxSchedulerCustomDrawDayHeaderEvent;
  64.     FOnCustomDrawEvent: TcxSchedulerCustomDrawEventEvent;
  65.     FOnCustomDrawGroupSeparator: TcxSchedulerCustomDrawGroupSeparatorEvent;
  66.     FOnCustomDrawNavigationButton: TcxSchedulerCustomDrawNavigationButtonEvent;
  67.     FOnCustomDrawResourceHeader: TcxSchedulerCustomDrawResourceHeaderEvent;
  68.     FOnInitEventImages: TcxSchedulerInitEventImages;
  69.     FViewDayEvents: TNotifyEvent;
  70.     FViewGanttEvents: TNotifyEvent;
  71.     FViewTimeGridEvents: TNotifyEvent;
  72.     FViewYearEvents: TNotifyEvent;
  73.     function GetDateNavigator: TcxSchedulerDateNavigator;
  74.     procedure SetDateNavigator(AValue: TcxSchedulerDateNavigator);
  75.     procedure SetViewDay(AValue: TcxSchedulerDayView);
  76.     procedure SetViewGantt(AValue: TcxSchedulerGanttView);
  77.     procedure SetViewTimeGrid(AValue: TcxSchedulerTimeGridView);
  78.     procedure SetViewWeek(AValue: TcxSchedulerWeekView);
  79.     procedure SetViewWeeks(AValue: TcxSchedulerWeeksView);
  80.     procedure SetViewYear(AValue: TcxSchedulerYearView);
  81.     // read/write
  82.     procedure ReadSplittersData(AStream: TStream);
  83.     procedure WriteSplittersData(AStream: TStream);
  84.     procedure ReadStoredClientBounds(AStream: TStream);
  85.     procedure WriteStoredClientBounds(AStream: TStream);
  86.   protected
  87.     procedure DefineProperties(Filer: TFiler); override;
  88.     // IcxSchedulerCommonViewItemsPainter
  89.     procedure DoCustomDrawBackground(
  90.       AViewInfo: TcxSchedulerBackgroundCellViewInfo; var ADone: Boolean); virtual;
  91.     procedure DoCustomDrawButton(
  92.       AViewInfo: TcxSchedulerMoreEventsButtonViewInfo; var ADone: Boolean); virtual;
  93.     procedure DoCustomDrawContent(
  94.       AViewInfo: TcxSchedulerContentCellViewInfo; var ADone: Boolean); virtual;
  95.     procedure DoCustomDrawDayHeader(
  96.       AViewInfo: TcxSchedulerDayHeaderCellViewInfo; var ADone: Boolean); virtual;
  97.     procedure DoCustomDrawEvent(
  98.       AViewInfo: TcxSchedulerEventCellViewInfo; var ADone: Boolean); virtual;
  99.     procedure DoCustomDrawGroupSeparator(
  100.       AViewInfo: TcxSchedulerGroupSeparatorCellViewInfo; var ADone: Boolean); virtual;
  101.     procedure DoCustomDrawNavigationButton(
  102.       AViewInfo: TcxSchedulerContentNavigationButtonViewInfo; var ADone: Boolean); virtual;
  103.     procedure DoCustomDrawResourceHeader(
  104.       AViewInfo: TcxSchedulerHeaderCellViewInfo; var ADone: Boolean); virtual;
  105.     function HasCustomDrawGroupSeparator: Boolean;
  106.     function HasCustomDrawResourceHeader: Boolean;
  107.     // IcxSchedulerEventImages
  108.     procedure DoInitEventImages(AEvent: TcxSchedulerControlEvent;
  109.       AImages: TcxSchedulerEventImages); virtual;
  110.     function GetImages: TCustomImageList; virtual;
  111.     function SupportEventImages: Boolean; virtual;
  112.     // layout
  113.     function GetProperties(AProperties: TStrings): Boolean; override;
  114.     procedure GetPropertyValue(const AName: string; var AValue: Variant); override;
  115.     procedure SetPropertyValue(const AName: string; const AValue: Variant); override;
  116.     function CreateDateNavigator: TcxSchedulerCustomDateNavigator; override;
  117.     function CreateDefaultView: TcxSchedulerCustomView; override;
  118.     function CreateViewDay: TcxSchedulerDayView; virtual;
  119.     function CreateViewGantt: TcxSchedulerGanttView; virtual;
  120.     function CreateViewTimeGrid: TcxSchedulerTimeGridView; virtual;
  121.     function CreateViewWeek: TcxSchedulerWeekView; virtual;
  122.     function CreateViewWeeks: TcxSchedulerWeeksView; virtual;
  123.     function CreateViewYear: TcxSchedulerYearView; virtual;
  124.     procedure CreateSubClasses; override;
  125.     procedure DateNavigatorSelectionChanged; override;
  126.     function GetNextView(AView: TcxSchedulerCustomView): TcxSchedulerCustomView; override;
  127.     procedure SetCurrentView(AView: TcxSchedulerCustomView); override;
  128.     procedure SynchronizeVisibleDays; override;
  129.     procedure UpdateEventsCache(ACheckDaysInterval: Boolean); override;
  130.     function UpdateView(AView: TcxSchedulerCustomView): Boolean;
  131.     procedure ValidateSelection(ASelection: TcxSchedulerDateList); override;
  132.     procedure ValidateWeekDays(ASaveWeekCount: Boolean = False);
  133.   public
  134.     function GoToDate(ADate: TDateTime): Boolean; override;
  135.     function GoToDate(ADate: TDateTime; AViewMode: TcxSchedulerViewMode): Boolean; overload; override;
  136.     procedure SelectDays(const AStartDay, AFinishDay: TDateTime; AsDays: Boolean = False); overload; virtual;
  137.     procedure SelectDays(ASelection: TcxSchedulerDateList; AsDays: Boolean = False); overload; virtual;
  138.     procedure SelectDays(const ASelection: array of TDateTime; AsDays: Boolean = False); overload; virtual;
  139.     procedure SelectWorkDays(const AWeekDate: TDateTime);
  140.   published
  141.     property DateNavigator: TcxSchedulerDateNavigator read GetDateNavigator write SetDateNavigator;
  142.     property ViewDay: TcxSchedulerDayView read FViewDay write SetViewDay;
  143.     property ViewGantt: TcxSchedulerGanttView read FViewGantt write SetViewGantt;
  144.     property ViewTimeGrid: TcxSchedulerTimeGridView read FViewTimeGrid write SetViewTimeGrid;
  145.     property ViewWeek: TcxSchedulerWeekView read FViewWeek write SetViewWeek;
  146.     property ViewWeeks: TcxSchedulerWeeksView read FViewWeeks write SetViewWeeks;
  147.     property ViewYear: TcxSchedulerYearView read FViewYear write SetViewYear;
  148.     property OnCustomDrawBackground: TcxSchedulerCustomDrawBackgroundEvent read FOnCustomDrawBackground write FOnCustomDrawBackground;
  149.     property OnCustomDrawButton: TcxSchedulerCustomDrawButtonEvent read FOnCustomDrawButton write FOnCustomDrawButton;
  150.     property OnCustomDrawContent: TcxSchedulerCustomDrawContentEvent read FOnCustomDrawContent write FOnCustomDrawContent;
  151.     property OnCustomDrawDayHeader: TcxSchedulerCustomDrawDayHeaderEvent read FOnCustomDrawDayHeader write FOnCustomDrawDayHeader;
  152.     property OnCustomDrawEvent: TcxSchedulerCustomDrawEventEvent read FOnCustomDrawEvent write FOnCustomDrawEvent;
  153.     property OnCustomDrawGroupSeparator: TcxSchedulerCustomDrawGroupSeparatorEvent read FOnCustomDrawGroupSeparator write FOnCustomDrawGroupSeparator;
  154.     property OnCustomDrawResourceHeader: TcxSchedulerCustomDrawResourceHeaderEvent read FOnCustomDrawResourceHeader write FOnCustomDrawResourceHeader;
  155.     property OnInitEventImages: TcxSchedulerInitEventImages read FOnInitEventImages write FOnInitEventImages;
  156.     // derived properties and events
  157.     property Align;
  158.     property Anchors;
  159.   {$IFDEF DELPHI6}
  160.     property BevelEdges;
  161.     property BevelInner;
  162.     property BevelOuter;
  163.     property BevelKind;
  164.     property BevelWidth;
  165.     property BorderWidth;
  166.   {$ENDIF}
  167.     property BorderStyle;
  168.     property ContentPopupMenu;
  169.     property Constraints;
  170.     property ControlBox;
  171.     property DialogsLookAndFeel;
  172.     property DragCursor;
  173.     property DragKind;
  174.     property DragMode;
  175.     property Enabled;
  176.     property EventImages;
  177.     property EventOperations;
  178.     property EventPopupMenu;
  179.     property Font;
  180.     property LookAndFeel;
  181.     property OptionsBehavior;
  182.     property OptionsCustomize;
  183.     property OptionsView;
  184.     property ParentFont;
  185.     property PopupMenu;
  186.     property ResourceNavigator;
  187.     property ShowHint;
  188.     property Storage;
  189.     property Styles;
  190.     property TabOrder;
  191.     property TabStop;
  192.     property Visible;
  193.     //events
  194.     property OnAfterDragEvent;
  195.     property OnAfterEditing;
  196.     property OnAfterSizingEvent;
  197.     property OnBeforeDeleting;
  198.     property OnBeforeDragEvent;
  199.     property OnBeforeEditing;
  200.     property OnBeforeSizingEvent;
  201.     property OnCanShowView;
  202.     property OnClick;
  203.     property OnContextPopup;
  204.     property OnDblClick;
  205.     property OnDragDrop;
  206.     property OnDragOver;
  207.     property OnEndDock;
  208.     property OnEndDrag;
  209.     property OnEnter;
  210.     property OnExit;
  211.     property OnEventSelectionChanged;
  212.     property OnFirstVisibleResourceChanged;
  213.     property OnGetEventDisplayText;
  214.     property OnGetEventEditProperties;
  215.     property OnGetEventHintText;
  216.     property OnInitEdit;
  217.     property OnIsWorkTime;
  218.     property OnKeyDown;
  219.     property OnKeyPress;
  220.     property OnKeyUp;
  221.     property OnLayoutChanged;
  222.     property OnMoreEventsButtonClick;
  223.     property OnMouseDown;
  224.     property OnMouseEnter;
  225.     property OnMouseLeave;
  226.     property OnMouseMove;
  227.     property OnMouseUp;
  228.     property OnMouseWheel;
  229.     property OnMouseWheelDown;
  230.     property OnMouseWheelUp;
  231.     property OnNavigationButtonClick;
  232.     property OnResize;
  233.     property OnStartDock;
  234.     property OnStartDrag;
  235.     property OnSelectionChanged;
  236.     property OnScaleScroll;
  237.     property OnShowDateHint;
  238.     property OnViewTypeChanged;
  239.     //nested events
  240.     property DateNavigatorEvents: TNotifyEvent read FDateNavigatorEvents write FDateNavigatorEvents;
  241.     property ViewDayEvents: TNotifyEvent read FViewDayEvents write FViewDayEvents;
  242.     property ViewGanttEvents: TNotifyEvent read FViewGanttEvents write FViewGanttEvents; 
  243.     property ViewTimeGridEvents:  TNotifyEvent read FViewTimeGridEvents write FViewTimeGridEvents;
  244.     property ViewYearEvents: TNotifyEvent read FViewYearEvents write FViewYearEvents;
  245.   end;
  246. implementation
  247. uses
  248.   SysUtils;
  249. { TcxScheduler }
  250. function TcxScheduler.GoToDate(ADate: TDateTime): Boolean;
  251. begin
  252.   Result := True;
  253.   DateNavigator.BeginUpdate;
  254.   try
  255.     if SelectedDays.IndexOf(ADate) <> -1 then Exit;
  256.     if SelectedDays.Count = 0 then
  257.       SelectedDays.Add(Date);
  258.     SelectedDays.ShiftPeriod(ADate - SelectedDays[0]);
  259.     if ViewWeek.Active or ViewWeeks.Active then
  260.       ValidateWeekDays(True)
  261.     else
  262.       if CurrentView is TcxSchedulerTimeGridView then
  263.         TcxSchedulerTimeGridView(CurrentView).VisibleStart := SelectedDays[0];
  264.     UpdateView(CurrentView);
  265.     DateNavigator.Refresh;
  266.   finally
  267.     DateNavigator.EndUpdate;
  268.   end;
  269. end;
  270. function TcxScheduler.GoToDate(ADate: TDateTime; AViewMode:
  271.   TcxSchedulerViewMode): Boolean;
  272.   procedure SelectMonth;
  273.   var
  274.     I, AYear, AMonth, ADay: Word;
  275.     AStart: TDateTime;
  276.   begin
  277.     DecodeDate(ADate, AYear, AMonth, ADay);
  278.     AStart := EncodeDate(AYear, AMonth, 1);
  279.     for I := 0 to DaysPerMonth(AYear, AMonth) - 1 do
  280.       SelectedDays.Add(AStart + I + Integer(OptionsView.ActualStartOfWeek));
  281.     ValidateWeekDays;
  282.   end;
  283.                         
  284. begin
  285.   DateNavigator.BeginUpdate;
  286.   try
  287.     SelectedDays.Clear;
  288.     DateNavigator.SelectionIsWeeks := AViewMode in [vmWeek, vmMonth];
  289.     case AViewMode of
  290.       vmDay, vmWeek:
  291.         begin
  292.           SelectedDays.Add(ADate);
  293.           if AViewMode = vmDay then
  294.             Result := UpdateView(ViewDay)
  295.           else
  296.             Result := UpdateView(ViewWeek);
  297.         end;
  298.       vmMonth:
  299.         begin
  300.           SelectMonth;
  301.           Result := UpdateView(ViewWeeks);
  302.         end;
  303.     else
  304.       SelectWorkDays(ADate);
  305.       Result := UpdateView(ViewDay);
  306.     end;
  307.   finally
  308.     SynchronizeVisibleDays;
  309.     DateNavigator.Refresh;
  310.     DateNavigator.EndUpdate;
  311.   end;
  312. end;
  313. procedure TcxScheduler.SelectDays(const AStartDay, AFinishDay: TDateTime;
  314.    AsDays: Boolean = False);
  315. var
  316.   I: Integer;
  317. begin
  318.   SelectedDays.Clear;
  319.   //DELPHI8! check Trunc(AStartDay)
  320.   for I := Trunc(AStartDay) to Trunc(AFinishDay) do
  321.     SelectedDays.Add(I);
  322.   SelectDays(SelectedDays, AsDays);
  323. end;
  324. procedure TcxScheduler.SelectDays(
  325.   ASelection: TcxSchedulerDateList; AsDays: Boolean = False);
  326. var
  327.   I: Integer;
  328. begin
  329.   DateNavigator.BeginUpdate;
  330.   try
  331.     if ASelection <> SelectedDays then
  332.       SelectedDays.Assign(ASelection);
  333.     SelectedDays.Sort(cxCompareDates);
  334.     if SelectedDays.Count = 0 then
  335.       SelectedDays.Add(Date);
  336.     I := 1;
  337.     while I < (ASelection.Count - 1) do
  338.     begin
  339.       if ASelection[I] = ASelection[I - 1] then
  340.         ASelection.Delete(I)
  341.       else
  342.         Inc(I)
  343.     end;
  344.     AsDays := AsDays and (ASelection.Count < 14);
  345.     if not AsDays then
  346.     begin
  347.       ValidateWeekDays;
  348.       DateNavigator.SelectionIsWeeks := True;
  349.     end
  350.     else
  351.       DateNavigator.SelectionIsWeeks := False;
  352.     FIsSelectionValidated := True;
  353.     ValidateSelection(SelectedDays);
  354.   finally
  355.     DateNavigator.EndUpdate;
  356.   end;
  357. end;
  358. procedure TcxScheduler.SelectDays(const ASelection: array of TDateTime;
  359.   AsDays: Boolean = False);
  360. var
  361.   I: Integer; 
  362.   AList: TcxSchedulerDateList;
  363. begin
  364.   AList := TcxSchedulerDateList.Create;
  365.   try
  366.     for I := Low(ASelection) to High(ASelection) do
  367.       AList.Add(ASelection[I]);
  368.     if AList.Count = 0 then
  369.       AList.Add(Date);
  370.     SelectDays(AList, AsDays);
  371.   finally
  372.     AList.Free;
  373.   end;
  374. end;
  375. procedure TcxScheduler.SelectWorkDays(const AWeekDate: TDateTime);
  376. const
  377.   ConvertTable: array[1..7] of TDay = (dMonday, dTuesday, dWednesday, dThursday,
  378.     dFriday, dSaturday, dSunday);
  379. var
  380.   AYear, AWeek, AWeekDay: Word;
  381.   ADay: TDay;
  382.   I, ADaysDiff: Integer;
  383.   AStartWeek: TDateTime;
  384. begin
  385.   ViewDay.Active := True;
  386.   DecodeDateWeek(AWeekDate, AYear, AWeek, AWeekDay);
  387.   ADay := ConvertTable[AWeekDay];
  388.   ADaysDiff := Ord(ADay) - Ord(StartOfWeek);
  389.   if ADaysDiff >= 0 then
  390.     AStartWeek := AWeekDate - ADaysDiff
  391.   else
  392.     AStartWeek := AWeekDate - (ADaysDiff + 7);
  393.   ADay := ConvertTable[DayOfTheWeek(AStartWeek)];
  394.   SelectedDays.Clear;
  395.   for I := 1 to 7 do
  396.   begin
  397.     if ADay in OptionsView.WorkDays then
  398.       SelectedDays.Add(AStartWeek);
  399.     if ADay < dSaturday then
  400.       Inc(ADay)
  401.     else
  402.       ADay := dSunday;
  403.     AStartWeek := AStartWeek + 1;
  404.   end;
  405.   SelectDays(SelectedDays, True)
  406. end;
  407. procedure TcxScheduler.DefineProperties(Filer: TFiler);
  408. begin
  409.   inherited DefineProperties(Filer);
  410.   Filer.DefineBinaryProperty('Splitters', ReadSplittersData, WriteSplittersData, True);
  411.   Filer.DefineBinaryProperty('StoredClientBounds', ReadStoredClientBounds, WriteStoredClientBounds, True);
  412. end;
  413. procedure TcxScheduler.DoCustomDrawBackground(
  414.   AViewInfo: TcxSchedulerBackgroundCellViewInfo; var ADone: Boolean);
  415. begin
  416.   if Assigned(FOnCustomDrawBackground) then
  417.     FOnCustomDrawBackground(CurrentView, Canvas, AViewInfo, ADone);
  418. end;
  419. procedure TcxScheduler.DoCustomDrawButton(
  420.   AViewInfo: TcxSchedulerMoreEventsButtonViewInfo; var ADone: Boolean);
  421. begin
  422.   if Assigned(FOnCustomDrawButton) then
  423.     FOnCustomDrawButton(CurrentView, Canvas, AViewInfo, ADone);
  424. end;
  425. procedure TcxScheduler.DoCustomDrawContent(
  426.   AViewInfo: TcxSchedulerContentCellViewInfo; var ADone: Boolean);
  427. begin
  428.   if Assigned(FOnCustomDrawContent) then
  429.     FOnCustomDrawContent(CurrentView, Canvas, AViewInfo, ADone);
  430. end;
  431. procedure TcxScheduler.DoCustomDrawDayHeader(
  432.   AViewInfo: TcxSchedulerDayHeaderCellViewInfo; var ADone: Boolean);
  433. begin
  434.   if Assigned(FOnCustomDrawDayHeader) then
  435.     FOnCustomDrawDayHeader(CurrentView, Canvas, AViewInfo, ADone);
  436. end;
  437. procedure TcxScheduler.DoCustomDrawEvent(
  438.   AViewInfo: TcxSchedulerEventCellViewInfo; var ADone: Boolean);
  439. begin
  440.   if Assigned(FOnCustomDrawEvent) and Assigned(AViewInfo.Event) then
  441.     FOnCustomDrawEvent(CurrentView, Canvas, AViewInfo, ADone);
  442. end;
  443. procedure TcxScheduler.DoCustomDrawGroupSeparator(
  444.   AViewInfo: TcxSchedulerGroupSeparatorCellViewInfo; var ADone: Boolean);
  445. begin
  446.   if HasCustomDrawGroupSeparator then
  447.     FOnCustomDrawGroupSeparator(CurrentView, Canvas, AViewInfo, ADone);
  448. end;
  449. procedure TcxScheduler.DoCustomDrawNavigationButton(
  450.   AViewInfo: TcxSchedulerContentNavigationButtonViewInfo; var ADone: Boolean);
  451. begin
  452.   if Assigned(FOnCustomDrawNavigationButton) then
  453.     FOnCustomDrawNavigationButton(CurrentView, Canvas, AViewInfo, ADone);
  454. end;
  455. procedure TcxScheduler.DoCustomDrawResourceHeader(
  456.   AViewInfo: TcxSchedulerHeaderCellViewInfo; var ADone: Boolean);
  457. begin
  458.   if HasCustomDrawResourceHeader then
  459.     FOnCustomDrawResourceHeader(CurrentView, Canvas, AViewInfo, ADone);
  460. end;
  461. function TcxScheduler.HasCustomDrawGroupSeparator: Boolean;
  462. begin
  463.   Result := Assigned(FOnCustomDrawGroupSeparator);
  464. end;
  465. function TcxScheduler.HasCustomDrawResourceHeader: Boolean;
  466. begin
  467.   Result := Assigned(FOnCustomDrawResourceHeader);
  468. end;
  469. procedure TcxScheduler.DoInitEventImages(AEvent: TcxSchedulerControlEvent;
  470.   AImages: TcxSchedulerEventImages);
  471. begin
  472.   if Assigned(FOnInitEventImages) then
  473.     FOnInitEventImages(Self, AEvent, AImages);
  474. end;
  475. function TcxScheduler.GetImages: TCustomImageList;
  476. begin
  477.   Result := EventImages;
  478. end;
  479. function TcxScheduler.SupportEventImages: Boolean;
  480. begin
  481.   Result := Assigned(FOnInitEventImages);
  482. end;
  483. function TcxScheduler.GetProperties(AProperties: TStrings): Boolean;
  484. begin
  485.   Result := inherited GetProperties(AProperties);
  486.   if CurrentView.Active then
  487.     AProperties.Add('View');
  488. end;
  489. procedure TcxScheduler.GetPropertyValue(const AName: string;
  490.   var AValue: Variant);
  491. begin
  492.   inherited GetPropertyValue(AName, AValue);
  493.   if (AName = 'View') and CurrentView.Active then
  494.   begin
  495.     if CurrentView = ViewDay then
  496.       AValue := 0
  497.     else
  498.       if CurrentView = ViewWeek then
  499.         AValue := 1
  500.       else
  501.         if CurrentView = ViewWeeks then
  502.           AValue := 2
  503.         else
  504.           if CurrentView = ViewTimeGrid then
  505.             AValue := 3
  506.           else
  507.             if CurrentView = ViewYear then
  508.               AValue := 4
  509.   end;
  510. end;
  511. procedure TcxScheduler.SetPropertyValue(const AName: string;
  512.   const AValue: Variant);
  513. begin
  514.   inherited SetPropertyValue(AName, AValue);
  515.   if (AName = 'View') and CurrentView.Active then
  516.   begin
  517.     DateNavigator.BeginUpdate;
  518.     try
  519.       if AValue = 0 then
  520.         ViewDay.Active := True
  521.       else
  522.         if (AValue = 1) or (AValue = 2) then
  523.         begin
  524.           if AValue = 1 then
  525.             ViewWeek.Active := True
  526.           else
  527.             if AValue = 2 then
  528.               ViewWeeks.Active := True;
  529.           ValidateWeekDays(True);
  530.         end
  531.         else
  532.           if AValue = 3 then
  533.             ViewTimeGrid.Active := True
  534.           else
  535.             if AValue = 4 then
  536.               ViewYear.Active := True
  537.     finally
  538.       DateNavigator.EndUpdate;
  539.     end;
  540.   end;
  541. end;
  542. function TcxScheduler.CreateDateNavigator: TcxSchedulerCustomDateNavigator;
  543. begin
  544.   Result := TcxSchedulerDateNavigator.Create(Self);
  545. end;
  546. function TcxScheduler.CreateDefaultView: TcxSchedulerCustomView;
  547. begin
  548.   Result := FViewDay;
  549. end;
  550. function TcxScheduler.CreateViewGantt: TcxSchedulerGanttView;
  551. begin
  552.   Result := TcxSchedulerGanttView.Create(Self);
  553. end;
  554. function TcxScheduler.CreateViewTimeGrid: TcxSchedulerTimeGridView;
  555. begin
  556.   Result := TcxSchedulerTimeGridView.Create(Self);
  557. end;
  558. function TcxScheduler.CreateViewDay: TcxSchedulerDayView;
  559. begin
  560.   Result := TcxSchedulerDayView.Create(Self);
  561. end;
  562. function TcxScheduler.CreateViewWeek: TcxSchedulerWeekView;
  563. begin
  564.   Result := TcxSchedulerWeekView.Create(Self);
  565. end;
  566. function TcxScheduler.CreateViewWeeks: TcxSchedulerWeeksView;
  567. begin
  568.   Result := TcxSchedulerWeeksView.Create(Self);
  569. end;
  570. function TcxScheduler.CreateViewYear: TcxSchedulerYearView; 
  571. begin
  572.   Result := TcxSchedulerYearView.Create(Self);
  573. end;
  574. procedure TcxScheduler.CreateSubClasses;
  575. begin
  576.   FViewDay := CreateViewDay;
  577.   FViewGantt := CreateViewGantt;
  578.   FViewTimeGrid := CreateViewTimeGrid;
  579.   FViewWeek := CreateViewWeek;
  580.   FViewWeeks := CreateViewWeeks;
  581.   FViewYear := CreateViewYear;
  582.   inherited CreateSubClasses;
  583. end;
  584. procedure TcxScheduler.DateNavigatorSelectionChanged;
  585. begin
  586.   if not (cfViewValid in ControlFlags) then Exit;
  587.   try
  588.     if CanDeactivateOnSelectionChanged(CurrentView) then
  589.     begin
  590.       if DateNavigator.SelectionIsWeeks then
  591.       begin
  592.         if SelectedDays.Count >= 14 then
  593.           ViewWeeks.Active := True
  594.         else
  595.           ViewWeek.Active := True
  596.       end
  597.       else
  598.         ViewDay.Active := True;
  599.     end
  600.     else
  601.       SelectedDaysChanged(CurrentView);
  602.   finally
  603.     FullRefresh;
  604.   end;
  605. end;
  606. function TcxScheduler.GetNextView(
  607.   AView: TcxSchedulerCustomView): TcxSchedulerCustomView;
  608. begin
  609.   Result := FViewWeek;
  610.   if (AView = FViewWeek) and FViewWeeks.CanShow then
  611.     Result := FViewWeeks
  612.   else
  613.     if not FViewWeek.CanShow or (AView = FViewWeek) then
  614.     begin
  615.       if AView <> FViewDay then
  616.         Result := FViewDay
  617.       else
  618.         Result := FViewWeeks;
  619.     end;
  620. end;
  621. procedure TcxScheduler.SetCurrentView(AView: TcxSchedulerCustomView);
  622. begin
  623.   inherited SetCurrentView(AView);
  624. end;
  625. procedure TcxScheduler.SynchronizeVisibleDays;
  626. var
  627.   ADate: TDateTime;
  628. begin
  629.   if SelectedDays.Count = 0 then
  630.     SelectedDays.Add(Date);
  631.   if CurrentView = ViewWeek then
  632.   begin
  633.     ADate := SelectedDays[0];
  634.     SelectedDays.Clear;
  635.     SelectedDays.Add(ADate);
  636.   end;
  637.   SelectDays(SelectedDays, (CurrentView = ViewDay) or
  638.     (CurrentView = ViewTimeGrid) or (CurrentView = ViewYear));
  639.   inherited SynchronizeVisibleDays;
  640. end;
  641. procedure TcxScheduler.UpdateEventsCache(ACheckDaysInterval: Boolean);
  642. begin
  643.   inherited UpdateEventsCache(ACheckDaysInterval);
  644.   EventList.Sort(TcxCompareEventsProc(@cxCompareSchedulerControlEvents));
  645. end;
  646. function TcxScheduler.UpdateView(AView: TcxSchedulerCustomView): Boolean;
  647. var
  648.   ADate: TDateTime;
  649. begin
  650.   ADate := SelectedDays[0];
  651.   if ViewYear.Active then
  652.     AView.Active := True;
  653.   if (ADate < DateNavigator.FirstDate) or (ADate > DateNavigator.LastDate) then
  654.     DateNavigator.FirstDate := ADate;
  655.   if AView.Active then
  656.     AView.Refresh
  657.   else
  658.     AView.Active := True;
  659.   Result := AView.Active;
  660. end;
  661. procedure TcxScheduler.ValidateSelection(ASelection: TcxSchedulerDateList);
  662. begin
  663.   if not FIsSelectionValidated then
  664.   begin
  665.     FIsSelectionValidated := True;
  666.     SelectDays(ASelection, (CurrentView = ViewDay) or (CurrentView = ViewYear) or
  667.       (CurrentView = ViewTimeGrid) or (SelectedDays.Count = 1));
  668.   end
  669.   else
  670.   begin
  671.     FIsSelectionValidated := False;
  672.     inherited ValidateSelection(ASelection);
  673.   end;
  674. end;
  675. procedure TcxScheduler.ValidateWeekDays(ASaveWeekCount: Boolean = False);
  676. var
  677.   I, J, AWeekCount: Integer;
  678.   ADate: TDateTime;
  679.   AWeeks: TcxSchedulerDateList;
  680.   AYear, APrevYear, AWeek, APrevWeek, AWeekDay: Word;
  681. begin
  682.   AWeekCount := SelectedDays.Count div 7;
  683.   if AWeekCount = 0 then Inc(AWeekCount);
  684.   AWeeks := TcxSchedulerDateList.Create;
  685.   try
  686.     APrevYear := 0;
  687.     APrevWeek := 0;
  688.     for I := 0 to SelectedDays.Count - 1 do
  689.     begin
  690.       DecodeDateWeek(SelectedDays[I] + 1 - Byte(StartOfWeek), AYear, AWeek, AWeekDay);
  691.       if (AYear <> APrevYear) or (AWeek <> APrevWeek) then
  692.       begin
  693.         APrevYear := AYear;
  694.         APrevWeek := AWeek;
  695.         AWeeks.Add(EncodeDateWeek(AYear, AWeek, 1) - 1);
  696.       end;
  697.     end;
  698.     SelectedDays.Clear;
  699.     for I := 0 to AWeeks.Count - 1 do
  700.     begin
  701.       if ASaveWeekCount and (I = AWeekCount) then break;
  702.       ADate := AWeeks[I];
  703.       for J := 0 to 6 do
  704.         SelectedDays.Add(ADate + J + Byte(StartOfWeek));
  705.     end;
  706.   finally
  707.     AWeeks.Free;
  708.   end;
  709. end;
  710. function TcxScheduler.GetDateNavigator: TcxSchedulerDateNavigator;
  711. begin
  712.   Result := TcxSchedulerDateNavigator(inherited DateNavigator);
  713. end;
  714. procedure TcxScheduler.SetDateNavigator(AValue: TcxSchedulerDateNavigator);
  715. begin
  716.   DateNavigator.Assign(AValue);
  717. end;
  718. procedure TcxScheduler.SetViewDay(AValue: TcxSchedulerDayView);
  719. begin
  720.   FViewDay.Assign(AValue);
  721. end;
  722. procedure TcxScheduler.SetViewGantt(AValue: TcxSchedulerGanttView);
  723. begin
  724.   FViewGantt.Assign(AValue);
  725. end;
  726. procedure TcxScheduler.SetViewTimeGrid(AValue: TcxSchedulerTimeGridView);
  727. begin
  728.   FViewTimeGrid.Assign(AValue);
  729. end;
  730. procedure TcxScheduler.SetViewWeek(AValue: TcxSchedulerWeekView);
  731. begin
  732.   FViewWeeks.Assign(AValue);
  733. end;
  734. procedure TcxScheduler.SetViewWeeks(AValue: TcxSchedulerWeeksView);
  735. begin
  736.   FViewWeek.Assign(AValue);
  737. end;
  738. procedure TcxScheduler.SetViewYear(AValue: TcxSchedulerYearView);
  739. begin
  740.   FViewYear.Assign(AValue);
  741. end;
  742. procedure TcxScheduler.ReadSplittersData(AStream: TStream);
  743. var
  744.   R: TRect;
  745. begin
  746.   AStream.Read(R, SizeOf(R));
  747.   HorzSplitter.Bounds := R;
  748.   AStream.Read(R, SizeOf(R));
  749.   VertSplitter.Bounds := R;
  750. end;
  751. procedure TcxScheduler.WriteSplittersData(AStream: TStream);
  752. var
  753.   R: TRect;
  754. begin
  755.   R := HorzSplitter.Bounds;
  756.   AStream.Write(R, SizeOf(R));
  757.   R := VertSplitter.Bounds;
  758.   AStream.Write(R, SizeOf(R));
  759. end;
  760. procedure TcxScheduler.ReadStoredClientBounds(AStream: TStream);
  761. begin
  762.   AStream.Read(FStoredClientBounds, SizeOf(FStoredClientBounds));
  763. end;
  764. procedure TcxScheduler.WriteStoredClientBounds(AStream: TStream);
  765. var
  766.   R: TRect;
  767. begin
  768.   R := ClientBounds;
  769.   AStream.Write(R, SizeOf(R));
  770. end;
  771. end.