Componentes.Terceros.DevExp.../official/x.19/ExpressScheduler 2/Demos/Delphi/ResourceDemo/RentUnit.pas
2007-09-09 11:27:22 +00:00

341 lines
9.9 KiB
ObjectPascal

unit RentUnit;
interface
{$I ..\cxVer.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxGraphics, cxEdit, cxScheduler, cxSchedulerUtils,
cxSchedulerCustomControls, cxSchedulerCustomResourceView, cxSchedulerStorage,
cxSchedulerDayView, cxSchedulerDateNavigator, StdCtrls, cxContainer,
cxDateNavigator, cxControls, ComCtrls, ExtCtrls, Math, cxDateUtils,
{$IFDEF DELPHI6}
DateUtils,
{$ENDIF}
cxLookAndFeelPainters, cxButtons, cxTextEdit, cxListBox, cxListView,
ToolWin, Menus, cxSchedulerTimeGridView, cxSchedulerWeekView,
cxSchedulerYearView;
type
TfrmRentCar = class(TForm)
lvCars: TListView;
DateNavigator: TcxDateNavigator;
edtUserName: TcxTextEdit;
lbxPeriod: TcxListBox;
TimeScheduler: TcxScheduler;
btnRent: TcxButton;
btnCancel: TcxButton;
lbChoosePeriod: TLabel;
lbChooseDate: TLabel;
lbChooseCar: TLabel;
lbCustomerName: TLabel;
lbChooseTime: TLabel;
cxStyleRepository: TcxStyleRepository;
cxBoldStyle: TcxStyle;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TimeSchedulerCustomDrawContent(Sender: TObject;
ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContentCellViewInfo;
var ADone: Boolean);
procedure DateNavigatorSelectionChanged(Sender: TObject;
const AStart, AFinish: TDateTime);
procedure DateNavigatorCustomDrawDayNumber(Sender: TObject;
ACanvas: TcxCanvas;
AViewInfo: TcxSchedulerDateNavigatorDayNumberViewInfo;
var ADone: Boolean);
procedure DateNavigatorCustomDrawContent(Sender: TObject;
ACanvas: TcxCanvas;
AViewInfo: TcxSchedulerDateNavigatorMonthContentViewInfo;
var ADone: Boolean);
procedure lvCarsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure lbxPeriodClick(Sender: TObject);
procedure TimeSchedulerKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure btnRentClick(Sender: TObject);
private
FDayEvents: TcxSchedulerEventList;
FDays: TcxSchedulerDateList;
FEventsList: TcxSchedulerFilteredEventList;
FPeriods: TcxSchedulerDateList;
procedure AddPeriodTime(AStart, AFinish: TDateTime);
procedure AddRent(AStart, AFinish: TDateTime);
function DateTimeToTime(ATime: TDateTime): TDateTime;
procedure FillTimeList;
function Intersect(AStart1, AFinish1, AStart2, AFinish2: TDateTime): Boolean;
function IntersectTime(var AStart1, AFinish1, AStart2, AFinish2: TDateTime): Boolean;
procedure ProcessSelectItem(AIndex: Integer);
procedure RentCar;
function Storage: TcxSchedulerStorage;
function TimeToDateTime(ATime: TDateTime): TDateTime;
end;
implementation
uses
ResourceMainUnit;
{$R *.dfm}
function CompareEvents(AEvent1, AEvent2: TcxSchedulerEvent): Integer;
begin
if AEvent1.Start = AEvent2.Start then
Result := 0
else
if AEvent1.Start < AEvent2.Start then
Result := -1
else
Result := 1;
end;
procedure TfrmRentCar.AddPeriodTime(AStart, AFinish: TDateTime);
begin
if AStart = AFinish then Exit;
FPeriods.Add(TimeToDateTime(AStart));
FPeriods.Add(TimeToDateTime(AFinish));
lbxPeriod.Items.Add(TimeToStr(AStart) + '-' + TimeToStr(AFinish));
end;
procedure TfrmRentCar.AddRent(AStart, AFinish: TDateTime);
begin
if AStart >= AFinish then Exit;
with Storage.createEvent do
begin
Start := AStart;
Finish := AFinish;
Caption := edtUserName.Text;
ResourceID := GetIndex(lvCars);
end;
end;
function TfrmRentCar.DateTimeToTime(ATime: TDateTime): TDateTime;
begin
Result := DateNavigator.Date +
EncodeTime(Round(ATime) div 60, Round(ATime) mod 60, 0, 0);
end;
procedure TfrmRentCar.FillTimeList;
var
I: Integer;
AInfo: TcxSchedulerEventConflictsInfo;
begin
lbxPeriod.Items.BeginUpdate;
try
FPeriods.Clear;
lbxPeriod.Items.Clear;
AInfo := TcxSchedulerEventConflictsInfo.Create(
Storage, False, DateNavigator.Date + EncodeTime(0, 0, 0, 0),
DateNavigator.Date + EncodeTime(23, 59, 0, 0), GetIndex(lvCars));
try
for I := 0 to AInfo.TimeRanges.Count - 1 do
AddPeriodTime(AInfo.TimeRanges[I].Start, AInfo.TimeRanges[I].Finish);
finally
AInfo.Free;
end;
finally
lbxPeriod.Items.EndUpdate;
end;
end;
function TfrmRentCar.Intersect(AStart1, AFinish1, AStart2, AFinish2: TDateTime): Boolean;
begin
Result := (AStart1 < AFinish2) and (AStart2 < AFinish1);
end;
function TfrmRentCar.IntersectTime(
var AStart1, AFinish1, AStart2, AFinish2: TDateTime): Boolean;
begin
if AStart2 > AStart1 then
AStart1 := AStart2;
if AFinish2 < AFinish1 then
AFinish1 := AFinish2;
Result := AFinish1 > AStart1;
end;
procedure TfrmRentCar.ProcessSelectItem(AIndex: Integer);
var
I, J: Integer;
begin
FDays.Clear;
Storage.GetEvents(FEventsList, DateNavigator.RealFirstDate,
DateNavigator.RealLastDate, AIndex);
for I := Trunc(DateNavigator.RealFirstDate) to Trunc(DateNavigator.RealLastDate) do
for J := 0 to FEventsList.Count - 1 do
if FEventsList[J].IsDayEvent(I) then
begin
FDays.Add(I);
Break
end;
DateNavigator.LayoutChanged;
DateNavigatorSelectionChanged(DateNavigator, DateNavigator.Date, DateNavigator.Date);
end;
procedure TfrmRentCar.RentCar;
var
I: Integer;
AStart, AFinish, AStart1, AFinish1: TDateTime;
begin
AStart := TimeScheduler.SelStart;
AFinish := TimeScheduler.SelFinish;
try
for I := 0 to FDayEvents.Count do
begin
if I = 0 then
AStart1 := DateOf(AStart);
if I = FDayEvents.Count then
AFinish1 := DateOf(AStart) + EncodeTime(23, 59, 0, 0)
else
AFinish1 := FDayEvents[I].Start;
if (AStart1 < AFinish1) and IntersectTime(AStart1, AFinish1, AStart, AFinish) then
AddRent(AStart1, AFinish1);
if (FDayEvents.Count > 0) and (I < FDayEvents.Count) then
AStart1 := FDayEvents[I].Finish;
end;
finally
Storage.PostEvents;
ProcessSelectItem(GetIndex(lvCars));
TimeScheduler.Refresh;
end;
end;
function TfrmRentCar.Storage: TcxSchedulerStorage;
begin
Result := ResourceDemoMainForm.Storage;
end;
function TfrmRentCar.TimeToDateTime(ATime: TDateTime): TDateTime;
var
H, M, S, MS: Word;
begin
DecodeTime(ATime, H, M, S, MS);
Result := H * 60 + M;
end;
procedure TfrmRentCar.FormCreate(Sender: TObject);
begin
FPeriods := TcxSchedulerDateList.Create;
FEventsList := TcxSchedulerFilteredEventList.Create;
FDays := TcxSchedulerDateList.Create;
FDayEvents := TcxSchedulerEventList.Create;
end;
procedure TfrmRentCar.FormDestroy(Sender: TObject);
begin
FreeAndNil(FEventsList);
FreeAndNil(FDays);
FreeAndNil(FDayEvents);
FreeAndNil(FPeriods);
end;
procedure TfrmRentCar.FormShow(Sender: TObject);
var
AScheduler: TcxCustomScheduler;
begin
Storage.FullRefresh;
AScheduler := ResourceDemoMainForm.Scheduler;
if AScheduler.SelResource = nil then
SetIndex(lvCars, 0)
else
SetIndex(lvCars, AScheduler.SelResource.ID);
ProcessSelectItem(GetIndex(lvCars));
DateNavigator.Date := DateOf(AScheduler.SelStart);
ProcessSelectItem(GetIndex(lvCars));
TimeScheduler.SelectDays(DateNavigator.Date, DateNavigator.Date, True);
TimeScheduler.SelectTime(AScheduler.SelStart, AScheduler.SelFinish, nil);
end;
procedure TfrmRentCar.TimeSchedulerCustomDrawContent(Sender: TObject;
ACanvas: TcxCanvas; AViewInfo: TcxSchedulerContentCellViewInfo;
var ADone: Boolean);
var
I: Integer;
const
scxBusyTime = 'Busy time';
begin
for I := 0 to FDayEvents.Count - 1 do
if Intersect(AViewInfo.TimeStart, AViewInfo.TimeFinish,
FDayEvents[I].Start, FDayEvents[I].Finish) then
begin
ACanvas.Brush.Color := clBtnShadow;
ACanvas.FillRect(AViewInfo.Bounds);
ACanvas.Font.Color := clBtnText;
ACanvas.DrawTexT(scxBusyTime, AViewInfo.Bounds, cxAlignCenter);
AViewInfo.Transparent := True;
end;
end;
procedure TfrmRentCar.DateNavigatorSelectionChanged(Sender: TObject;
const AStart, AFinish: TDateTime);
var
I: Integer;
begin
FDayEvents.Clear;
for I := 0 to FEventsList.Count - 1 do
if FEventsList[I].IsDayEvent(AStart) then
FDayEvents.Add(FEventsList[I]);
FDayEvents.Sort(CompareEvents);
FillTimeList;
TimeScheduler.SelectDays(AStart, AFinish, True);
lbxPeriod.ItemIndex := 0;
lbxPeriodClick(lbxPeriod);
end;
procedure TfrmRentCar.DateNavigatorCustomDrawDayNumber(Sender: TObject;
ACanvas: TcxCanvas;
AViewInfo: TcxSchedulerDateNavigatorDayNumberViewInfo;
var ADone: Boolean);
begin
if FDays.IndexOf(AViewInfo.Date) <> -1 then
ACanvas.Font := cxBoldStyle.Font;
end;
procedure TfrmRentCar.DateNavigatorCustomDrawContent(Sender: TObject;
ACanvas: TcxCanvas; AViewInfo: TcxSchedulerDateNavigatorMonthContentViewInfo;
var ADone: Boolean);
begin
ResourceDemoMainForm.DrawDateNavigatorContent(ACanvas, AViewInfo, ADone);
end;
procedure TfrmRentCar.lvCarsSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if not Selected then Exit;
ProcessSelectItem(Item.Index);
end;
procedure TfrmRentCar.lbxPeriodClick(Sender: TObject);
var
AIndex: Integer;
begin
AIndex := lbxPeriod.ItemIndex;
if AIndex <> -1 then
begin
TimeScheduler.SelectTime(DateTimeToTime(FPeriods[AIndex * 2]),
DateTimeToTime(FPeriods[AIndex * 2 + 1]) + HourToTime, nil);
end;
end;
procedure TfrmRentCar.TimeSchedulerKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
AControl: TWinControl;
begin
if Key <> VK_TAB then Exit;
AControl := FindNextControl(TimeScheduler, not (ssCtrl in Shift), True, True);
if AControl <> nil then
AControl.SetFocus;
end;
procedure TfrmRentCar.btnRentClick(Sender: TObject);
begin
RentCar;
end;
end.