// CalendarDemo.cpp : Defines the class behaviors for the application. // // This file is a part of the XTREME TOOLKIT PRO MFC class library. // (c)1998-2008 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "CalendarDemo.h" #include "MainFrm.h" #include "CalendarDemoDoc.h" #include "CalendarDemoView.h" #include "DataProvidersOptions.h" #include "CalendarResourcesDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BOOL IsFileExist(LPCTSTR pcszFile) { return FILEEXISTS_S(pcszFile); } ///////////////////////////////////////////////////////////////////////////// // CCalendarDemoApp BEGIN_MESSAGE_MAP(CCalendarDemoApp, CWinApp) //{{AFX_MSG_MAP(CCalendarDemoApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) // Multiple schedules menu items ON_COMMAND(ID_FILE_MULTISCHEDULES_CFG, OnMultiSchedulesCfg) ON_COMMAND(ID_FILE_LOAD_SAMPLE_MULTISCHEDULES_SIMPLE, OnMultiSchedulesSample) ON_COMMAND(ID_FILE_LOAD_SAMPLE_MULTISCHEDULES_EXTENDED, OnMultiSchedulesSampleExt) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCalendarDemoApp construction CCalendarDemoApp::CCalendarDemoApp() { m_bOnOpenFile_AppStarting = TRUE; m_bOnOpenFile_CreateNewIfNotExist = FALSE; m_pCalRCman = NULL; } ///////////////////////////////////////////////////////////////////////////// // The one and only CCalendarDemoApp object CCalendarDemoApp theApp; ///////////////////////////////////////////////////////////////////////////// // CCalendarDemoApp initialization BOOL CCalendarDemoApp::InitInstance() { VERIFY( AfxOleInit() ); AfxEnableControlContainer(); CXTPWinDwmWrapper().SetProcessDPIAware(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #if _MSC_VER <= 1200 //MFC 6.0 or earlier #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Codejock Software Sample Applications")); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CCalendarDemoDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CCalendarDemoView)); AddDocTemplate(pDocTemplate); /* BOOL bIsShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; CString strUseDP = GetProfileString(cstrDP_Opt_section, cstrUseDP_opt); BOOL bPostShowOpenNewDialog = strUseDP.IsEmpty() || bIsShift; BOOL nNoFile = FALSE; // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; if(strUseDP.CompareNoCase(cstrUseDP_Mem_optval) == 0) { cmdInfo.m_strFileName = GetProfileString(cstrDP_Opt_section, cstrUseDP_Mem_File_opt); } else if(strUseDP.CompareNoCase(cstrUseDP_DB_optval) == 0) { cmdInfo.m_strFileName = GetProfileString(cstrDP_Opt_section, cstrUseDP_DB_File_opt); } else if(strUseDP.CompareNoCase(cstrUseDP_MAPI_optval) == 0) { cmdInfo.m_strFileName = _T("mapi:"); nNoFile = TRUE; } else { ASSERT(strUseDP.IsEmpty()); } BOOL bFileExist = !cmdInfo.m_strFileName.IsEmpty() && IsFileExist(cmdInfo.m_strFileName); if(!bPostShowOpenNewDialog && bFileExist) { cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen; } else { cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew; cmdInfo.m_strFileName = _T(""); m_bOnOpenFile_CreateNewIfNotExist = TRUE; bPostShowOpenNewDialog = TRUE; CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = TRUE; } */ // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew; cmdInfo.m_strFileName = _T(""); m_bOnOpenFile_AppStarting = TRUE; BOOL bPostShowOpenNewDialog = TRUE; CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = TRUE; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it. if(m_pMainWnd) { m_pMainWnd->SetForegroundWindow(); if(bPostShowOpenNewDialog) { m_pMainWnd->PostMessage(WM_COMMAND, ID_FILE_OPEN); } m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); m_pMainWnd->UpdateWindow(); } return TRUE; } int CCalendarDemoApp::ExitInstance() { CMDTARGET_RELEASE(m_pCalRCman); return CWinApp::ExitInstance(); } // Choose a new Calendar Data Provider and set its options. void CCalendarDemoApp::OnFileOpen() { BOOL bAppStarting = m_bOnOpenFile_AppStarting; if (m_bOnOpenFile_AppStarting) { m_bOnOpenFile_AppStarting = FALSE; int nDlgRes = AfxMessageBox(_T("Would you like to populate the calendar with sample data? \nSelect No to open an existing data provider."), MB_YESNOCANCEL); if (nDlgRes == IDYES) { CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = TRUE; CCalendarDemoDoc::ms_bEmptyDocument_AddSampleData = TRUE; OnFileNew(); return; } else if (nDlgRes == IDCANCEL) { CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = TRUE; OnFileNew(); return; } else { CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = FALSE; } } else { // Open Data Providers choice dialog CDataProvidersOptions optDlg; optDlg.m_strTitle = _T("Open file"); optDlg.m_bOpenMode = TRUE; int nDlgRes = (int)optDlg.DoModal(); if(nDlgRes != IDOK) { return; } } CString strUseDP = GetProfileString(cstrDP_Opt_section, cstrUseDP_opt); CString strFileName; if(strUseDP.CompareNoCase(cstrUseDP_Mem_optval) == 0) { strFileName = GetProfileString(cstrDP_Opt_section, cstrUseDP_Mem_File_opt); } else if(strUseDP.CompareNoCase(cstrUseDP_DB_optval) == 0) { strFileName = GetProfileString(cstrDP_Opt_section, cstrUseDP_DB_File_opt); } else if(strUseDP.CompareNoCase(cstrUseDP_MAPI_optval) == 0) { CCalendarDemoDoc::ms_bFileNew_ShowDialog = bAppStarting; OnFileNew(); return; } else if (strUseDP.IsEmpty()) { CCalendarDemoDoc::ms_bFileNew_ShowDialog = TRUE; OnFileNew(); return; } else { ASSERT(FALSE); return; } // If you're trying to open an existing file into data provider if(IsFileExist(strFileName)) { OpenDocumentFile(strFileName); } else { // Otherwise, you're creating a new data file int nRes = AfxMessageBox(_T("The events data file is not exist.\nWould You like to create it?"), MB_YESNO); if(nRes == IDYES) { CCalendarDemoDoc::ms_bFileNew_ShowDialog = FALSE; OnFileNew(); } else { OnFileOpen(); } } } CCalendarDemoView* CCalendarDemoApp::GetCalendarDemoView() { // for single doc template only POSITION posDOCTempl = GetFirstDocTemplatePosition(); CDocTemplate* pDocTemplate = GetNextDocTemplate(posDOCTempl); POSITION posDOC = pDocTemplate ? pDocTemplate->GetFirstDocPosition() : NULL; CDocument* pDocument = pDocTemplate ? pDocTemplate->GetNextDoc(posDOC) : NULL; POSITION posView = pDocument ? pDocument->GetFirstViewPosition() : NULL; CView* pView = pDocument ? pDocument->GetNextView(posView) : NULL; CCalendarDemoView* pDemoView = pView ? DYNAMIC_DOWNCAST(CCalendarDemoView, pView) : NULL; return pDemoView; } // App command to run the dialog void CCalendarDemoApp::OnAppAbout() { if((GetKeyState(VK_SHIFT)&0x8000) && (GetKeyState(VK_CONTROL)&0x8000)) { CCalendarDemoView* pDemoView = GetCalendarDemoView(); ASSERT(pDemoView); if(pDemoView) { CXTPCalendarData* pCData = pDemoView->GetCalendarCtrl().GetDataProvider(); CCalendarInternalOptions optInternal(pCData); optInternal.DoModal(); return; } } CAboutDlg aboutDlg; aboutDlg.DoModal(); } void CCalendarDemoApp::OnMultiSchedulesCfg() { // Get Calendar pointer CCalendarDemoView* pDemoView = GetCalendarDemoView(); ASSERT(pDemoView); if(!pDemoView) return; CXTPCalendarControl* pCalendar = &pDemoView->GetCalendarCtrl(); // Prepare Resource Manager CString strCfgFile = GetModulePath() +_T("CalendarMultiResourcesConfigCustom.xml"); if (!m_pCalRCman) { m_pCalRCman = new CXTPCalendarResourcesManager(); if (!m_pCalRCman) { return; } m_pCalRCman->LoadCfg(strCfgFile); } // Show Resource Manager dialog CCalendarResourcesDlg dlgCalRC(m_pCalRCman); int nDlgRes = (int)dlgCalRC.DoModal(); if (nDlgRes != IDOK) return; // Save and apply changed resources configuration m_pCalRCman->SaveCfg(strCfgFile); m_pCalRCman->ApplyToCalendar(pCalendar); pCalendar->Populate(); pCalendar->RedrawControl(); // Update Sample caption CString strTitle = _T("Multiple Schedules configuration: ") + strCfgFile; pDemoView->GetDocument()->CDocument::SetTitle(strTitle); } CString CCalendarDemoApp::GetModulePath() { TCHAR szCurPath[_MAX_PATH + 2]; ::GetModuleFileName(AfxGetInstanceHandle(), szCurPath, _MAX_PATH); CString strCurPath(szCurPath); strCurPath = strCurPath.Left(strCurPath.ReverseFind('\\')+1); return strCurPath; } // Create Multiple Schedules sample configuration without // using Calendar Resources Manager. void CCalendarDemoApp::OnMultiSchedulesSample() { // Get Calendar pointer CCalendarDemoView* pDemoView = GetCalendarDemoView(); if(!pDemoView) return; CXTPCalendarControl* pCalendar = &pDemoView->GetCalendarCtrl(); // Setup sample configuration // ** data provider CString strConnectionString = _T("Provider=XML;Data Source=") + GetModulePath() + _T("CalendarMultipleSchedulesSample.xtp_cal"); CXTPCalendarData* pData = CXTPCalendarControl::CreateDataProvider(strConnectionString); if (!pData) return; if (!pData->Open()) { VERIFY( pData->Create() ); } // ** schedules CXTPCalendarSchedules* pSchedules = pData->GetSchedules(); if (!pSchedules) return; if (pSchedules->GetCount() < 1) { pSchedules->AddNewSchedule(_T("John")); pSchedules->AddNewSchedule(_T("Jane")); } // ** resources CXTPCalendarResources arResources; CXTPCalendarResource* pRes0 = new CXTPCalendarResource(pCalendar); if (pRes0) { pRes0->SetName(_T("John")); pRes0->SetDataProvider(pData, TRUE); pRes0->GetSchedules()->Add(pSchedules->GetAt(0)->GetID()); arResources.Add(pRes0); } CXTPCalendarResource* pRes1 = new CXTPCalendarResource(pCalendar); if (pRes1) { pRes1->SetName(_T("Jane (TimeZone: +8)")); pRes1->SetDataProvider(pData); pRes1->GetSchedules()->Add(pSchedules->GetAt(1)->GetID()); arResources.Add(pRes1); } pCalendar->SetResources(&arResources); // Add sample events int nRes = AfxMessageBox(_T("Would You like to add default test events set?"), MB_YESNO); if (nRes == IDYES) { pData->RemoveAllEvents(); CCalendarDemoDoc::AddTestEvents(pData, COleDateTimeSpan(0), pSchedules->GetAt(0)->GetID()); CCalendarDemoDoc::AddTestEvents(pData, COleDateTimeSpan(0, 8, 0, 0), pSchedules->GetAt(1)->GetID()); if (!pData->Save()) AfxMessageBox(_T("Memory data provider cannot save document")); } // Save and apply changed resources configuration pCalendar->Populate(); pCalendar->RedrawControl(); // Update Sample caption pDemoView->GetDocument()->CDocument::SetTitle(_T("Multiple Schedules sample N1")); // Cleanup CMDTARGET_RELEASE(pData); } // Create an extended Multiple Schedules sample configuration using // a sample CXTPCalendarResourcesManager class. void CCalendarDemoApp::OnMultiSchedulesSampleExt() { // Get Calendar pointer CCalendarDemoView* pDemoView = GetCalendarDemoView(); if(!pDemoView) return; CXTPCalendarControl* pCalendar = &pDemoView->GetCalendarCtrl(); // Prepare resource manager CString strCfgFile = GetModulePath() +_T("CalendarMultipleSchedulesSample.xml"); if (!m_pCalRCman) { m_pCalRCman = new CXTPCalendarResourcesManager(); if (!m_pCalRCman) return; //m_pCalRCman->LoadCfg(strCfgFile); } // Setup sample configuration // ** data provider CString strConnectionString = _T("Provider=XML;Data Source=") + GetModulePath() + _T("CalendarMultipleSchedulesExt.xtp_cal"); m_pCalRCman->AddDataProvider(strConnectionString, CXTPCalendarResourcesManager::xtpCalendarDPF_CreateIfNotExists | CXTPCalendarResourcesManager::xtpCalendarDPF_SaveOnDestroy | CXTPCalendarResourcesManager::xtpCalendarDPF_CloseOnDestroy); if (m_pCalRCman->GetDataProvidersCount() < 1) return; CXTPCalendarData* pData = m_pCalRCman->GetDataProvider(0); if (!pData) return; // ** schedules CXTPCalendarSchedules* pSchedules = pData->GetSchedules(); if (!pSchedules) return; if (pSchedules->GetCount() == 0) { pSchedules->AddNewSchedule(_T("John")); pSchedules->AddNewSchedule(_T("Peter")); pSchedules->AddNewSchedule(_T("Conference Room N1")); pSchedules->AddNewSchedule(_T("Conference Room N2")); } // ** resources m_pCalRCman->AddResource(_T("John"), TRUE); m_pCalRCman->AddResource(_T("Peter"), TRUE); m_pCalRCman->AddResource(_T("Rooms"), TRUE); CXTPCalendarResourceDescription* pRCDesc = m_pCalRCman->GetResource(0); if (pRCDesc && pRCDesc->m_ptrResource) { pRCDesc->m_ptrResource->SetDataProvider(pData); pRCDesc->m_ptrResource->GetSchedules()->Add(pSchedules->GetAt(0)->GetID()); pRCDesc->m_bGenerateName = TRUE; } pRCDesc = m_pCalRCman->GetResource(1); if (pRCDesc && pRCDesc->m_ptrResource) { pRCDesc->m_ptrResource->SetDataProvider(pData); pRCDesc->m_ptrResource->GetSchedules()->Add(pSchedules->GetAt(1)->GetID()); pRCDesc->m_bGenerateName = TRUE; } pRCDesc = m_pCalRCman->GetResource(2); if (pRCDesc && pRCDesc->m_ptrResource) { pRCDesc->m_ptrResource->SetDataProvider(pData); pRCDesc->m_ptrResource->GetSchedules()->Add(pSchedules->GetAt(2)->GetID()); pRCDesc->m_ptrResource->GetSchedules()->Add(pSchedules->GetAt(3)->GetID()); pRCDesc->m_bGenerateName = FALSE; } // Save and apply changed resources configuration m_pCalRCman->SaveCfg(strCfgFile); m_pCalRCman->ApplyToCalendar(pCalendar); pCalendar->Populate(); pCalendar->RedrawControl(); // Update Sample caption pDemoView->GetDocument()->CDocument::SetTitle(_T("Multiple Schedules sample N2")); // Cleanup } //////////////////////////////////////////////////////////////////////////// // CCalendarInternalOptions dialog // IMPLEMENT_DYNAMIC(CCalendarInternalOptions, CDialog) CCalendarInternalOptions::CCalendarInternalOptions(CXTPCalendarData* pCData, CWnd* pParent /*=NULL*/) : CDialog(CCalendarInternalOptions::IDD, pParent) { ASSERT(pCData); m_ptrCData = pCData; } CCalendarInternalOptions::~CCalendarInternalOptions() { } void CCalendarInternalOptions::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_DBDP_CACHE_MODE_CB, m_ctrlDBDPCacheModeCb); DDX_Control(pDX, IDC_DBDP_CACHE_MODE_COMMENT, m_ctrlDBDPCacheModeComment); } BEGIN_MESSAGE_MAP(CCalendarInternalOptions, CDialog) ON_BN_CLICKED(IDOK, OnBnClickedOk) END_MESSAGE_MAP() BOOL CCalendarInternalOptions::OnInitDialog() { CDialog::OnInitDialog(); if(!m_ptrCData) { ASSERT(FALSE); return FALSE; } //=========================================================================== BOOL bSupported_DBDPCacheMode = m_ptrCData->GetType() != xtpCalendarDataProviderMemory; int eDBDPCacheMode = m_ptrCData->GetCacheMode(); int nIdx = m_ctrlDBDPCacheModeCb.AddString(_T("OFF")); m_ctrlDBDPCacheModeCb.SetItemData(nIdx, xtpCalendarDPCacheModeOff); nIdx = m_ctrlDBDPCacheModeCb.AddString(_T("ON, Repeat manipulations (Default)")); m_ctrlDBDPCacheModeCb.SetItemData(nIdx, xtpCalendarDPCacheModeOnRepeat); nIdx = m_ctrlDBDPCacheModeCb.AddString(_T("ON, Clear after manipulations")); m_ctrlDBDPCacheModeCb.SetItemData(nIdx, xtpCalendarDPCacheModeOnClear); for(int i = 0; i < m_ctrlDBDPCacheModeCb.GetCount(); i++) { if((int)m_ctrlDBDPCacheModeCb.GetItemData(i) == eDBDPCacheMode) { m_ctrlDBDPCacheModeCb.SetCurSel(i); break; } } m_ctrlDBDPCacheModeCb.EnableWindow(bSupported_DBDPCacheMode); //if(GetDlgItem(IDC_DBDP_CACHE_MODE_FRAME)) { // GetDlgItem(IDC_DBDP_CACHE_MODE_FRAME)->EnableWindow(bSupported_DBDPCacheMode); //} if(GetDlgItem(IDC_DBDP_CACHE_MODE_LABEL)) { GetDlgItem(IDC_DBDP_CACHE_MODE_LABEL)->EnableWindow(bSupported_DBDPCacheMode); } if(GetDlgItem(IDOK)) { GetDlgItem(IDOK)->EnableWindow(bSupported_DBDPCacheMode); } if(!bSupported_DBDPCacheMode) { m_ctrlDBDPCacheModeComment.SetWindowText(_T("Is not supported. Switch to DB Data provider")); } return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CCalendarDemoApp message handlers void CCalendarInternalOptions::OnBnClickedOk() { ASSERT(m_ptrCData); if(m_ptrCData) { int nSel = m_ctrlDBDPCacheModeCb.GetCurSel(); if(nSel != CB_ERR) { int eCMode = (int)m_ctrlDBDPCacheModeCb.GetItemData(nSel); ASSERT( eCMode == xtpCalendarDPCacheModeOff || eCMode == xtpCalendarDPCacheModeOnRepeat || eCMode == xtpCalendarDPCacheModeOnClear ); m_ptrCData->SetCacheMode(eCMode); } } OnOK(); }