Componentes.Terceros.DevExp.../official/x.26/ExpressScheduler 2/Demos/CBuilder/ResourceDemo/ResourceMainUnit.cpp
2007-09-09 11:27:27 +00:00

398 lines
14 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "..\cxDemosBCB.inc"
#include "ResourceMainUnit.h"
#include "RentUnit.h"
#include "CancelReservationUnit.h"
#include "cxSchedulerUtils.hpp"
#include "cxSchedulerStorage.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cxControls"
#pragma link "cxEdit"
#pragma link "cxGraphics"
#pragma link "cxScheduler"
#pragma link "cxSchedulerCustomControls"
#pragma link "cxSchedulerCustomResourceView"
#pragma link "cxSchedulerDateNavigator"
#pragma link "cxSchedulerDayView"
#pragma link "cxStyles"
#pragma link "DemoBasicMain"
#pragma link "cxLookAndFeels"
#pragma link "cxSchedulerStorage"
#pragma link "cxSchedulerUtils"
#pragma link "cxSchedulerTimeGridView"
#pragma link "cxSchedulerWeekView"
#pragma link "cxSchedulerYearView"
#pragma resource "*.dfm"
TResourceDemoMainForm *ResourceDemoMainForm;
bool IsChanged;
const int ContentColors[4] =
{12317183, 16574923, 12381397, 12701439};
int __fastcall GetIndex(TListView *AListView)
{
if (AListView->Selected != NULL)
return AListView->Selected->Index;
else
return -1;
}
void __fastcall SetIndex(TListView *AListView, int AIndex)
{
if (AIndex != -1)
AListView->Selected = AListView->Items->Item[AIndex];
else
AListView->Selected = NULL;
}
//---------------------------------------------------------------------------
__fastcall TResourceDemoMainForm::TResourceDemoMainForm(TComponent* Owner)
: TDemoBasicMainForm(Owner)
{
}
//---------------------------------------------------------------------------
int __fastcall scxTaskCompare(TcxSchedulerEvent *AEvent1, TcxSchedulerEvent *AEvent2)
{
int Res = AnsiCompareText(AEvent1->Caption, AEvent2->Caption);
if (Res == 0)
Res = AnsiCompareText(AEvent1->GetResourceItem()->Name,
AEvent2->GetResourceItem()->Name);
if (Res == 0)
if (AEvent1->Start < AEvent2->Start)
Res = -1;
else
if (AEvent1->Start > AEvent2->Start)
Res = 1;
return Res;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::CreateRecurrenceEvent(
int AResourceID, String ACaption, TDays AOccurDays)
{
TcxSchedulerEvent *AEvent = Storage->createEvent();
AEvent->ResourceID = AResourceID;
AEvent->Caption = ACaption;
AEvent->Duration = EncodeTime(0, 45, 0, 0);
AEvent->MoveTo(Date() + (TDateTime)((8 + AResourceID) * (double)HourToTime));
AEvent->EventType = etPattern;
AEvent->LabelColor = 0x51B0F7;
AEvent->RecurrenceInfo->Count = -1;
AEvent->RecurrenceInfo->Recurrence = cxreWeekly;
AEvent->RecurrenceInfo->Periodicity = 1;
AEvent->RecurrenceInfo->OccurDays = AOccurDays;
AEvent->RecurrenceInfo->DayType = cxdtDay;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::DrawDateNavigatorContent(TcxCanvas *ACanvas,
TcxSchedulerDateNavigatorMonthContentViewInfo *AViewInfo, bool &ADone)
{
Graphics::TBitmap* ABitmap;
if (!miUseColorScheme->Checked) return;
switch (AViewInfo->Month) {
case 3:
case 4:
case 5:
ABitmap = cxSpringStyle->Bitmap;
break;
case 6:
case 7:
case 8:
ABitmap = cxSummerStyle->Bitmap;
break;
case 9:
case 10:
case 11:
ABitmap = cxAutumnStyle->Bitmap;
break;
default:
ABitmap = cxWinterStyle->Bitmap;
}
ACanvas->Draw(AViewInfo->Bounds.Left, AViewInfo->Bounds.Top, ABitmap);
ADone = true;
AViewInfo->Transparent = true;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::FillTaskGrid()
{
TGridRect ASelRect;
int I;
TcxSchedulerEvent *AEvent;
if (TaskEvents == NULL) return;
TaskEvents->Clear();
for (I = 0; I < Storage->EventCount; I++)
if (Storage->Events[I]->EventType == Cxschedulerstorage::etNone)
TaskEvents->Add(Storage->Events[I]);
TaskEvents->Sort(scxTaskCompare);
TaskGrid->RowCount = 2;
if (TaskEvents->Count + 1 > 2)
TaskGrid->RowCount = TaskEvents->Count + 1;
TaskGrid->Rows[1]->Clear();
ASelRect.Top = 1;
ASelRect.Bottom = 1;
ASelRect.Left = 0;
ASelRect.Right = 3;
for (I = 0; I < TaskEvents->Count; I++) {
AEvent = TaskEvents->Items[I];
TaskGrid->Cells[0][I + 1] = AEvent->Caption;
TaskGrid->Cells[1][I + 1] = AEvent->GetResourceItem()->Name;
TaskGrid->Cells[2][I + 1] = DateTimeToStr(AEvent->Start);
TaskGrid->Cells[3][I + 1] = DateTimeToStr(AEvent->Finish);
if ((Scheduler->SelectedEventCount > 0) && (Scheduler->SelectedEvents[0]->Source == AEvent)) {
ASelRect.Top = I + 1;
ASelRect.Bottom = I + 1;
}
}
TaskGrid->Selection = ASelRect;
}
//---------------------------------------------------------------------------
TColor __fastcall TResourceDemoMainForm::GetResourceColor(
TcxSchedulerResourceViewInfo *AResource)
{
return (TColor) ContentColors[AResource->ResourceItem->ID];
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SelectEvents(int AStartIndex)
{
Scheduler->BeginUpdate();
try {
Scheduler->UnselectEvents();
for (int I = 0; I < Scheduler->VisibleEventCount; I++)
if (Scheduler->VisibleEvents[I]->RecordIndex >= AStartIndex)
Scheduler->SelectEvent(Scheduler->VisibleEvents[I], TShiftState()<<ssCtrl<<ssShift);
}
__finally {
Scheduler->EndUpdate();
Scheduler->CurrentView->Refresh();
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SyncVisibility(TDateTime ADate, int AIndex)
{
if ((GetIndex(lvCarsBar) != 0) && (AIndex != -1))
SetIndex(lvCarsBar, AIndex + 1);
if (ADate != (TDateTime)NullDate) {
TcxSchedulerDateList *ADays = Scheduler->SelectedDays;
if (!((ADate >= ADays->Items[0]) && (ADate <= ADays->Items[ADays->Count - 1])))
Scheduler->SelectDays(ADate, ADate + ADays->Count - 1, True);
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::FormCreate(TObject* Sender)
{
miEventsOpt->Visible = false;
TaskEvents = new TcxSchedulerEventList;
TDemoBasicMainForm::FormCreate(Sender);
WindowState = wsMaximized;
lvCarsBar->Items->Item[0]->Selected = true;
Storage->BeginUpdate();
for (int I = 0; I < 4; I++) {
CreateRecurrenceEvent(I, "Maintenance", TDays()<<dMonday);
CreateRecurrenceEvent(I, "Car wash", TDays()<<dWednesday<<dSaturday);
}
Storage->EndUpdate();
miUseColorSchemeClick(miUseColorScheme);
TaskGrid->Cells[0][0] = "Customer";
TaskGrid->Cells[1][0] = "Model";
TaskGrid->Cells[2][0] = "Start rent";
TaskGrid->Cells[3][0] = "Finish rent";
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::lvCarsBarSelectItem(
TObject* Sender, TListItem* Item, bool Selected)
{
if (!Selected) return;
Storage->BeginUpdate();
try {
for (int I = 0; I < Storage->ResourceCount; I++){
TcxSchedulerStorageResourceItem *AResource = Storage->Resources->ResourceItems->Items[I];
AResource->Visible = ((Item->Index == 0) || (AResource->ID == (Item->Index - 1)));
}
}
__finally {
Storage->EndUpdate();
Scheduler->FullRefresh();
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::LookAndFeelChange(TObject* Sender)
{
TDemoBasicMainForm::LookAndFeelChange(Sender);
lfController->Kind = Scheduler->LookAndFeel->Kind;
lfController->NativeStyle = Scheduler->LookAndFeel->NativeStyle;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::OpenSaveClick(TObject* Sender)
{
if ((((TMenuItem*)Sender)->Tag == 0) && dlgOpen->Execute())
Storage->LoadFromFile(dlgOpen->FileName);
if ((((TMenuItem*)Sender)->Tag == 1) && SaveDialog->Execute())
Storage->SaveToFile(SaveDialog->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::RentClick(TObject* Sender)
{
if (((TComponent*)Sender)->Tag == 0) {
TfrmRentCar* RentCar = new TfrmRentCar(NULL);
try {
int ACount = Storage->EventCount;
if (RentCar->ShowModal() == mrOk) {
SyncVisibility(RentCar->DateNavigator->Date, GetIndex(RentCar->lvCars));
SelectEvents(ACount);
}
}
__finally {
delete RentCar;
}
}
else {
TfrmCancelReservation* frmCancel = new TfrmCancelReservation(NULL);
try {
if (frmCancel->ShowModal() == mrOk)
SyncVisibility(frmCancel->Date, frmCancel->Index);
}
__finally {
delete frmCancel;
}
FillTaskGrid();
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerLayoutChanged(TObject* Sender)
{
IsChanged = true;
FillTaskGrid();
IsChanged = false;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerDateNavigatorCustomDrawContent(TObject* Sender,
TcxCanvas* ACanvas, TcxSchedulerDateNavigatorMonthContentViewInfo* AViewInfo, bool &ADone)
{
DrawDateNavigatorContent(ACanvas, AViewInfo, ADone);
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerViewDayCustomDrawContainer(TObject* Sender,
TcxCanvas* ACanvas, TcxSchedulerContainerCellViewInfo* AViewInfo, bool &ADone)
{
if (!AViewInfo->Selected && miUseColorScheme->Checked && (AViewInfo->Resource != NULL))
ACanvas->Brush->Color = (TColor)GetMiddleRGB((TColor)GetResourceColor(AViewInfo->Resource), clBlack, 80);
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerCustomDrawContent(TObject* Sender, TcxCanvas *ACanvas,
TcxSchedulerContentCellViewInfo* AViewInfo, bool &ADone)
{
TcxViewParams AParams;
if (miUseColorScheme->Checked && (AViewInfo->Resource != NULL)) {
AParams = AViewInfo->TimeLineParams;
AParams.Color = (TColor)GetMiddleRGB((TColor)GetResourceColor(AViewInfo->Resource), clBlack, 80);
AViewInfo->TimeLineParams = AParams;
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerStylesGetContentStyle(TObject* Sender,
TcxSchedulerStorageResourceItem* AResource, const TDateTime ADateTime, TcxStyle* &AStyle)
{
if (miUseColorScheme->Checked && (AResource != NULL)) {
AStyle = cxContentStyle;
AStyle->Color = (TColor)ContentColors[AResource->ID];
}
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::miUseColorSchemeClick(TObject* Sender)
{
miUseColorScheme->Checked = !miUseColorScheme->Checked;
if (miUseColorScheme->Checked)
Scheduler->DateNavigator->Styles->Selection = cxSelectionStyle;
else
Scheduler->DateNavigator->Styles->Selection = NULL;
Scheduler->LayoutChanged();
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerEventPopupMenuPopup(
TcxSchedulerEventPopupMenu *Sender, TPopupMenu *ABuiltInMenu, bool &AHandled)
{
if ((Sender->Event != NULL) && Sender->Event->IsRecurring())
AHandled = true;
else
Sender->GetMenuItem(epmiDelete, -1)->Caption = "Cancel reservation";
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerContentPopupMenuPopup(
TcxSchedulerContentPopupMenu *Sender, TPopupMenu *ABuiltInMenu, bool &AHandled)
{
TMenuItem *AItem;
ABuiltInMenu->Images = imgGlyph;
AItem = NewItem("Rent a car", scNone, False, True, RentClick, 0, "");
AItem->ImageIndex = 0;
ABuiltInMenu->Items->Insert(0, AItem);
AItem = NewItem("Cancel reservation", scNone, False, True, RentClick, 0, "");
AItem->ImageIndex = 1;
AItem->Tag = 1;
ABuiltInMenu->Items->Insert(1, AItem);
ABuiltInMenu->Items->Insert(2, NewLine());
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerBeforeDeleting(TcxCustomScheduler *Sender,
TcxSchedulerControlEvent *AEvent, bool &Allow)
{
Allow = !AEvent->IsRecurring();
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::SchedulerSelectionChanged(TObject* Sender)
{
IsChanged = true;
FillTaskGrid();
IsChanged = false;
}
//---------------------------------------------------------------------------
void __fastcall TResourceDemoMainForm::TaskGridSelectCell(TObject* Sender,
int ACol, int ARow, bool &CanSelect)
{
int I;
TcxSchedulerEvent *AEvent;
CanSelect = ARow > 0;
if (!IsChanged) {
if ((ARow > 0) && (ARow <= TaskEvents->Count)) {
AEvent = TaskEvents->Items[ARow - 1];
SyncVisibility((int)AEvent->Start, AEvent->GetResourceItem()->ID);
Scheduler->UnselectEvents();
for (I = 0; I < Scheduler->VisibleEventCount; I++)
if (Scheduler->VisibleEvents[I]->Source == AEvent)
Scheduler->SelectEvent(Scheduler->VisibleEvents[I], TShiftState()<<ssShift);
}
}
}
//---------------------------------------------------------------------------