CalendarDemoDoc.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:18k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // CalendarDemoDoc.cpp : implementation of the CCalendarDemoDoc class
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "CalendarDemo.h"
  22. #include "CalendarDemoDoc.h"
  23. #include "MainFrm.h"
  24. #include "DataProvidersOptions.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. /////////////////////////////////////////////////////////////////////////////
  31. extern BOOL IsFileExist(LPCTSTR pcszFile);
  32. // Resolve data provider code into human readable name
  33. CString GetDPName(int nDPType)
  34. {
  35. CString strDPname = _T("Data Provider");
  36. if (nDPType == xtpCalendarDataProviderMemory) {
  37. strDPname = _T("Memory Data Provider");
  38. } else if (nDPType == xtpCalendarDataProviderDatabase) {
  39. strDPname = _T("Database Data Provider");
  40. } else if (nDPType == xtpCalendarDataProviderMAPI) {
  41. strDPname = _T("MAPI Data Provider");
  42. }
  43. else {
  44. ASSERT(FALSE);
  45. }
  46. return strDPname;
  47. }
  48. // Returns data provider type
  49. int GetDPType(CXTPCalendarData* pData)
  50. {   
  51. if (!pData) {
  52. ASSERT(FALSE);
  53. return xtpCalendarDataProviderUnknown;
  54. }
  55. return pData->GetType();
  56. }
  57. CString cstrMarkupStaticSample(
  58. _T("<StackPanel Margin='5, 5, 5, 5' VerticalAlignment='Top'")
  59.      _T("HorizontalAlignment='Center'>")
  60. _T("<TextBlock Padding='0,10,0,0' TextWrapping='Wrap'><Bold>Subject:</Bold> ")
  61.             _T("<Bold>SuitePro</Bold> <Run Foreground='White'>2008</Run> ")
  62.             _T("Released!</TextBlock>")
  63. _T("<TextBlock Padding='0,10,0,0'><Bold>Body:</Bold></TextBlock>")
  64. _T("<TextBlock Padding='10,10,0,0' TextWrapping='Wrap'>")
  65.     _T("<Bold><Run Foreground='Blue'>Codejock</Run> Software</Bold> released ")
  66.     _T("<Bold>SuitePro</Bold> <Run Foreground='White'>2008</Run> today.  All")
  67.     _T(" development machines <Bold>must</Bold> be updated no later than ")
  68.     _T("<Run Foreground='Red'>06/15/08</Run>.")
  69. _T("</TextBlock>")
  70. _T("<TextBlock Padding='10,10,0,0'>")
  71. _T("   - Management")
  72. _T("</TextBlock>")
  73. _T("</StackPanel>"));
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CCalendarDemoDoc
  76. IMPLEMENT_DYNCREATE(CCalendarDemoDoc, CDocument)
  77. BEGIN_MESSAGE_MAP(CCalendarDemoDoc, CDocument)
  78. //{{AFX_MSG_MAP(CCalendarDemoDoc)
  79. // NOTE - the ClassWizard will add and remove mapping macros here.
  80. //    DO NOT EDIT what you see in these blocks of generated code!
  81. //}}AFX_MSG_MAP
  82. END_MESSAGE_MAP()
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CCalendarDemoDoc construction/destruction
  85. BOOL CCalendarDemoDoc::ms_bFileNew_ShowDialog = TRUE;
  86. BOOL CCalendarDemoDoc::ms_bFileNew_CreateEmptyDocument = FALSE;
  87. BOOL CCalendarDemoDoc::ms_bEmptyDocument_AddSampleData = FALSE;
  88. CCalendarDemoDoc::CCalendarDemoDoc()
  89. {
  90. m_pCalendar = NULL;
  91. m_bOpened = FALSE;
  92. }
  93. CCalendarDemoDoc::~CCalendarDemoDoc()
  94. {
  95. }
  96. // Creates a new event in the specified data provider.
  97. // This method is useful for shortening similar events creation.
  98. CXTPCalendarEventPtr CCalendarDemoDoc::NewEvent(
  99. CXTPCalendarData* pData, 
  100. COleDateTime dtStart, COleDateTime dtEnd,
  101. CString strSubject, CString strLocation,
  102. UINT nScheduleID)
  103. {
  104. CXTPCalendarEventPtr ptrEvent = pData->CreateNewEvent();
  105. ptrEvent->SetStartTime(dtStart);
  106. ptrEvent->SetEndTime(dtEnd);
  107. ptrEvent->SetSubject(strSubject);
  108. ptrEvent->SetLocation(strLocation);
  109. if (pData->GetSchedules() && pData->GetSchedules()->GetCount() > 0)
  110. {
  111. ptrEvent->SetScheduleID(nScheduleID);
  112. }
  113. return ptrEvent;
  114. }
  115. //
  116. // This method adds a predefined set of events into a data provider.
  117. //
  118. void CCalendarDemoDoc::AddTestEvents(CXTPCalendarData* pCalendarData, 
  119. COleDateTimeSpan spTimeShift, UINT nScheduleID)
  120. {
  121. if (!pCalendarData)
  122. {
  123. ASSERT(FALSE);
  124. return;
  125. }
  126. // add test events
  127. COleDateTime dtNow(COleDateTime::GetCurrentTime() + spTimeShift);
  128. COleDateTimeSpan spDay(1, 0, 0, 0);
  129. COleDateTimeSpan sp15min(0, 0, 15, 0);
  130. COleDateTimeSpan spHour(0, 1, 0, 0);
  131. // Create 4 usual events
  132. CXTPCalendarEventPtr ptrEvent = NewEvent(pCalendarData, 
  133. dtNow, dtNow + spHour, 
  134. _T("Event &Now [Tentative]"), _T("New Location"),
  135. nScheduleID);
  136. ptrEvent->SetReminderMinutesBeforeStart(10);
  137. ptrEvent->SetBusyStatus(xtpCalendarBusyStatusTentative);
  138. if (!pCalendarData->AddEvent(ptrEvent)) {
  139. ASSERT(FALSE);
  140. return;
  141. }
  142. ptrEvent = NewEvent(pCalendarData, 
  143. dtNow + sp15min, dtNow + spHour + spHour + spHour + spHour,
  144. _T("Event Now + 15 min (4 hours)"), _T("[Free]"),
  145. nScheduleID);
  146. ptrEvent->SetBusyStatus(xtpCalendarBusyStatusFree);
  147. ptrEvent->SetLabelID(8);
  148. if (!pCalendarData->AddEvent(ptrEvent)) {
  149. ASSERT(FALSE);
  150. return;
  151. }
  152. ptrEvent = NewEvent(pCalendarData, 
  153. dtNow + spHour, dtNow + spHour + spHour ,
  154. _T("Event Now + Hour (2 hours) "), _T("[OutOfOffice]"),
  155. nScheduleID);
  156. ptrEvent->SetBusyStatus(xtpCalendarBusyStatusOutOfOffice);
  157. if (!pCalendarData->AddEvent(ptrEvent)) {
  158. ASSERT(FALSE);
  159. return;
  160. }
  161. ptrEvent = NewEvent(pCalendarData, 
  162. dtNow - spDay - spHour, dtNow - spDay + spHour + spHour + spHour,
  163. _T("Yesterday Event"), _T("Old Location"),
  164. nScheduleID);
  165. // This is an example of using static Markup feature 
  166. ptrEvent->GetCustomProperties()->SetProperty(_T("xtpMarkupTemplate"), cstrMarkupStaticSample);
  167. if (!pCalendarData->AddEvent(ptrEvent)) {
  168. ASSERT(FALSE);
  169. return;
  170. }
  171. // multi day event
  172. COleDateTime dtE(CXTPCalendarUtils::ResetTime(dtNow + spDay));
  173. COleDateTime dtB(CXTPCalendarUtils::ResetTime(dtNow - spDay + spHour));
  174. ptrEvent = NewEvent(pCalendarData, 
  175. dtNow - spDay - spDay + spHour, dtE, // + spDay + spHour + spHour + spHour,
  176. _T("Multi day Event"), ("Multi day Location"),
  177. nScheduleID);
  178. ptrEvent->SetReminderMinutesBeforeStart(10);
  179. if (!pCalendarData->AddEvent(ptrEvent)) {
  180. ASSERT(FALSE);
  181. return;
  182. }
  183. // "pure" all day event 
  184. COleDateTimeSpan sp10Days(10, 0, 0, 0);
  185. ptrEvent = NewEvent(pCalendarData, 
  186. dtNow, dtNow + sp10Days,
  187. _T("AllDay Event"), _T("Old Location"),
  188. nScheduleID);
  189. ptrEvent->SetAllDayEvent();
  190. if (!pCalendarData->AddEvent(ptrEvent)) {
  191. ASSERT(FALSE);
  192. return;
  193. }
  194. // private event 
  195. ptrEvent = NewEvent(pCalendarData, 
  196. dtNow - spHour - spHour, dtNow - spHour,
  197. _T("Private"), _T("Old Location"),
  198. nScheduleID);
  199. //ptrEvent->SetReminderMinutesBeforeStart(10);
  200. ptrEvent->SetPrivate();
  201. ptrEvent->SetMeeting();
  202. if (!pCalendarData->AddEvent(ptrEvent)) {
  203. ASSERT(FALSE);
  204. return;
  205. }
  206. // Create recurrent event
  207. CXTPCalendarEventPtr ptrMasterEvent = NewEvent(pCalendarData, 
  208. dtNow, dtNow + spHour, 
  209. _T("Recurrence event - lunch"), _T("Recurrence location"),
  210. nScheduleID);
  211. VERIFY(ptrMasterEvent->MakeEventAsRecurrence());
  212. ptrMasterEvent->SetLabelID(5);
  213. //ptrMasterEvent->SetAllDayEvent();
  214. ptrMasterEvent->SetReminderMinutesBeforeStart(10);
  215. ptrMasterEvent->SetMeeting();
  216. CXTPCalendarRecurrencePatternPtr ptrRecPatt = ptrMasterEvent->GetRecurrencePattern();
  217. COleDateTime dtStart,dtRP_Start;
  218. //  duration
  219. dtStart.SetTime(13, 8, 0);
  220. dtStart += spTimeShift;
  221. ptrRecPatt->SetStartTime(dtStart);
  222. ptrRecPatt->SetDurationMinutes(90);
  223. //  period
  224. dtRP_Start = COleDateTime::GetCurrentTime();
  225. VERIFY(CXTPCalendarUtils::UpdateMonthDay(dtRP_Start, 1));
  226. ptrRecPatt->SetPatternStartDate(dtRP_Start);
  227. VERIFY(CXTPCalendarUtils::UpdateMonthDay(dtRP_Start, 31));
  228. ptrRecPatt->SetPatternEndDate(dtRP_Start);
  229. //ptrRecPatt->SetNoEndDate();
  230. // pattern
  231. XTP_CALENDAR_RECURRENCE_OPTIONS opt;
  232. opt.m_nRecurrenceType = xtpCalendarRecurrenceDaily;
  233. opt.m_Daily.bEveryWeekDayOnly = FALSE;
  234. opt.m_Daily.nIntervalDays = 3;
  235. ptrRecPatt->SetRecurrenceOptions(opt);
  236. ptrMasterEvent->UpdateRecurrence(ptrRecPatt);
  237. //  add
  238. if (!pCalendarData->AddEvent(ptrMasterEvent)) {
  239. ASSERT(FALSE);
  240. return;
  241. }
  242. }
  243. BOOL CCalendarDemoDoc::OnNewDocument()
  244. {
  245. if (!CDocument::OnNewDocument())
  246. return FALSE;
  247.     
  248. if (!m_pCalendar) {
  249. return FALSE;
  250. }
  251. // EXAMPLE. how to set custom locale ID.
  252. // CXTPPropExchange::m_lcidDateTime = GetUserDefaultLCID();
  253. if (ms_bFileNew_CreateEmptyDocument) 
  254. {
  255. CXTPCalendarData* pCalendarData = m_pCalendar->GetDataProvider();
  256. if (pCalendarData && pCalendarData->IsOpen()) {
  257. pCalendarData->Save();
  258. pCalendarData->Close();
  259. }
  260. m_pCalendar->SetDataProvider(xtpCalendarDataProviderMemory);
  261. ms_bFileNew_CreateEmptyDocument = FALSE;        
  262. m_strPathName = _T("");
  263. SetTitle(_T(""));
  264. if (ms_bEmptyDocument_AddSampleData)
  265. {
  266. pCalendarData = m_pCalendar->GetDataProvider();
  267. AddTestEvents(pCalendarData, COleDateTimeSpan(0), 0);
  268. }
  269. ms_bEmptyDocument_AddSampleData = FALSE;
  270. m_pCalendar->Populate();
  271. else 
  272. {
  273. if (ms_bFileNew_ShowDialog)
  274. {
  275. CDataProvidersOptions optDlg;
  276. optDlg.m_strTitle = _T("Create new file");
  277. optDlg.m_bOpenMode = FALSE;
  278. optDlg.m_bWarnIfExist = TRUE;
  279.         
  280. int nDlgRes = (int)optDlg.DoModal();
  281. if (nDlgRes != IDOK) {
  282. return TRUE;
  283. }
  284. }
  285. ms_bFileNew_ShowDialog = TRUE;
  286. //---------------------------------------------------------------------------
  287. CString strFileName;
  288. CString strUseDP = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_opt);
  289. CString strConnectionString;
  290. BOOL bNewRes = FALSE;
  291. if (strUseDP.CompareNoCase(cstrUseDP_Mem_optval) == 0) 
  292. {
  293. strFileName = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_Mem_File_opt);
  294. strConnectionString.Format(_T("Provider=XML;Data Source='%s';"), strFileName);
  295. else if (strUseDP.CompareNoCase(cstrUseDP_DB_optval) == 0) 
  296. {
  297. strFileName = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_DB_File_opt);
  298. strConnectionString.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='%s';"), strFileName);
  299. else if (strUseDP.CompareNoCase(cstrUseDP_MAPI_optval) == 0) 
  300. {
  301. strConnectionString.Format(_T("Provider=MAPI;"));
  302. }
  303. else {
  304. ASSERT(FALSE);
  305. }
  306. if (!strConnectionString.IsEmpty()) {
  307. bNewRes = CreateNewProvider(strConnectionString);
  308. }
  309. if (!bNewRes) 
  310. {
  311. SetTitle(_T(""));
  312. return FALSE;
  313. }
  314. if (!strFileName.IsEmpty()) {
  315. SetPathName(strFileName);
  316. }
  317. else {
  318. SetTitle(_T(""));
  319. }
  320. }
  321. //===========================================================================
  322. m_pCalendar->Populate();
  323. m_bOpened = TRUE;
  324. return TRUE;
  325. }
  326. BOOL CCalendarDemoDoc::OnOpenDocument(LPCTSTR lpszPathName) 
  327. {
  328. CString strFileName = lpszPathName ? lpszPathName : _T("");
  329. CString strUseDP = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_opt);
  330. if (strFileName.IsEmpty()) 
  331. {
  332. if (strUseDP.CompareNoCase(cstrUseDP_Mem_optval) == 0) {
  333. strFileName = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_Mem_File_opt);
  334. else if (strUseDP.CompareNoCase(cstrUseDP_DB_optval) == 0) {
  335. strFileName = AfxGetApp()->GetProfileString(cstrDP_Opt_section, cstrUseDP_DB_File_opt);
  336. else {
  337. ASSERT(FALSE);
  338. return FALSE;
  339. }
  340. }
  341.     
  342. if (strUseDP.CompareNoCase(cstrUseDP_MAPI_optval) == 0) 
  343. {
  344. if (!CDocument::OnNewDocument()) {
  345. return FALSE;
  346. }
  347. }
  348. else if (!CDocument::OnOpenDocument(strFileName)) {
  349. return FALSE;
  350. }
  351. DWORD dwFileAttrib = ::GetFileAttributes(strFileName);
  352. dwFileAttrib &= ~FILE_ATTRIBUTE_READONLY;
  353. ::SetFileAttributes(strFileName, dwFileAttrib);
  354. CString strConnectionString;
  355. BOOL bOpenRes = FALSE;
  356. if (strUseDP.CompareNoCase(cstrUseDP_Mem_optval) == 0) {
  357. strConnectionString.Format(_T("Provider=XML;Data Source='%s';Encoding=iso-8859-1;"), strFileName);
  358. // strConnectionString.Format(_T("Data Source='%s';"), strFileName);
  359. }
  360. else if (strUseDP.CompareNoCase(cstrUseDP_DB_optval) == 0) {
  361. strConnectionString.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source='%s';"), strFileName);
  362. }
  363. else if (strUseDP.CompareNoCase(cstrUseDP_MAPI_optval) == 0) 
  364. {
  365. strConnectionString.Format(_T("Provider=MAPI;"));
  366. }
  367. else {
  368. ASSERT(FALSE);
  369. }
  370. if (!strConnectionString.IsEmpty()) {
  371. bOpenRes = OpenProvider(strConnectionString);
  372. }
  373. if (!bOpenRes) {
  374. return FALSE;
  375. }
  376. //===========================================================================
  377. m_pCalendar->Populate();
  378.         
  379. m_bOpened = TRUE;
  380. return TRUE;
  381. }
  382. BOOL CCalendarDemoDoc::OpenProvider(CString strConnectionString)
  383. {
  384. if (strConnectionString.IsEmpty()) {
  385. return FALSE;
  386. }
  387. if (!m_pCalendar) {
  388. ASSERT(FALSE);
  389. return FALSE;
  390. }
  391. CString strConn_lower = strConnectionString;
  392. strConn_lower.MakeLower();
  393. BOOL bMAPI_DP = strConn_lower.Find(_T("provider=mapi;")) >= 0;
  394. CXTPCalendarData* pCalendarData = m_pCalendar->GetDataProvider();
  395. if (pCalendarData && pCalendarData->IsOpen())
  396. {
  397. pCalendarData->Save();
  398. pCalendarData->Close();
  399. }
  400. m_pCalendar->SetDataProvider(strConnectionString);
  401. pCalendarData = m_pCalendar->GetDataProvider();
  402. if (!pCalendarData) {
  403. return FALSE;
  404. }
  405. //===========================================================================
  406. BOOL bResult = pCalendarData->Open();
  407. if (!bResult) 
  408. {
  409. if(!bMAPI_DP)
  410. {
  411. CString strMsg;
  412. strMsg.Format(_T("The events data file is empty or corrupted: n'%s'"), pCalendarData->GetDataSource());
  413. strMsg += _T("nnWould You like to recreate it and nadd default test events set?");
  414. int nRes = AfxMessageBox(strMsg, MB_YESNO);
  415. if (nRes == IDYES) 
  416. {
  417. bResult = CreateNewProvider(strConnectionString);
  418. }
  419. }
  420. }
  421. int nRemindersEnabled = AfxGetApp()->GetProfileInt(_T("Options"), _T("RemindersEnabled"), TRUE);
  422. m_pCalendar->EnableReminders(nRemindersEnabled > 0);
  423. return bResult;
  424. }
  425. BOOL CCalendarDemoDoc::CreateNewProvider(CString strConnectionString)
  426. {
  427. if (!m_pCalendar) {
  428. ASSERT(FALSE);
  429. return FALSE;
  430. }
  431. CString strConn_lower = strConnectionString;
  432. strConn_lower.MakeLower();
  433. BOOL bMAPI_DP = strConn_lower.Find(_T("provider=mapi;")) >= 0;
  434. CXTPCalendarData* pCalendarData = m_pCalendar->GetDataProvider();
  435. if (pCalendarData && pCalendarData->IsOpen()) {
  436. pCalendarData->Save();
  437. pCalendarData->Close();
  438. }
  439. m_pCalendar->SetDataProvider(strConnectionString);
  440. pCalendarData = m_pCalendar->GetDataProvider();
  441. ASSERT(pCalendarData);
  442. if (!pCalendarData)
  443. return FALSE;
  444. if (!bMAPI_DP) {
  445. ::DeleteFile(pCalendarData->GetDataSource());
  446. }
  447. CWaitCursor _wc;
  448. //===========================================================================
  449. if (!pCalendarData->Create())
  450. {
  451. CString strMsg;
  452. if (bMAPI_DP) 
  453. {
  454. strMsg.Format(_T("Cannot open MAPI provider."));
  455. }
  456. else
  457. {
  458. CString strDPname = GetDPName(pCalendarData->GetType());
  459. strMsg.Format(_T("%s cannot create file: n%snProbably MDAC is not installed."), strDPname, pCalendarData->GetDataSource());
  460. }
  461. AfxMessageBox(strMsg);
  462. // set empty memory data provider
  463. m_pCalendar->SetDataProvider(_T(""));
  464. pCalendarData = m_pCalendar->GetDataProvider();
  465. if (pCalendarData && !pCalendarData->IsOpen()) {
  466. pCalendarData->Open();
  467. }
  468. m_pCalendar->Populate();
  469. return FALSE;
  470. }
  471. if (!bMAPI_DP) 
  472. {
  473. int nRes = AfxMessageBox(_T("Would You like to add default test events set?"), MB_YESNO);
  474. if (nRes == IDYES) 
  475. {
  476. AddTestEvents(pCalendarData, COleDateTimeSpan(0), 0);
  477. if (!pCalendarData->Save()) 
  478. {
  479. CString strDPname = GetDPName(pCalendarData->GetType());
  480. CString strMsg;
  481. strMsg.Format(_T("%s cannot save document"), strDPname);
  482. AfxMessageBox(strMsg);
  483. }
  484. }
  485. }
  486. int nRemindersEnabled = AfxGetApp()->GetProfileInt(_T("Options"), _T("RemindersEnabled"), TRUE);
  487. m_pCalendar->EnableReminders(nRemindersEnabled > 0);
  488. return TRUE;
  489. }
  490. /////////////////////////////////////////////////////////////////////////////
  491. // CCalendarDemoDoc serialization
  492. void CCalendarDemoDoc::Serialize(CArchive& ar)
  493. {
  494. if (ar.IsStoring())
  495. {
  496. // TODO: add storing code here
  497. }
  498. else
  499. {
  500. // TODO: add loading code here
  501. }
  502. }
  503. void CCalendarDemoDoc::OnCloseDocument()
  504. {
  505. if (!m_bOpened) {
  506. CDocument::OnCloseDocument();
  507. return;
  508. }
  509. ((CMainFrame*)AfxGetMainWnd())->m_dlgOptions.Close();
  510. CXTPCalendarData* pCalendarData = m_pCalendar->GetDataProvider();
  511. if (!pCalendarData) {
  512. ASSERT(FALSE);
  513. return;
  514. }
  515. if (!pCalendarData->Save()) 
  516. {
  517. CString strDPname = GetDPName(xtpCalendarDataProviderMemory);
  518. CString strMsg;
  519. strMsg.Format(_T("%s cannot save document"), strDPname);
  520. AfxMessageBox(strMsg);
  521. }
  522. int nRemindersEnabled = m_pCalendar->IsRemindersEnabled();
  523. AfxGetApp()->WriteProfileInt(_T("Options"), _T("Reminders"), nRemindersEnabled);
  524. CDocument::OnCloseDocument();
  525. }
  526. void CCalendarDemoDoc::SetTitle(LPCTSTR lpszTitle)
  527. {
  528. UNREFERENCED_PARAMETER(lpszTitle);
  529. int nDPType = GetDPType(m_pCalendar->GetDataProvider());
  530. CString strDPName = GetDPName(nDPType);
  531. CString strFile = m_pCalendar->GetDataProvider()->GetDataSource(); 
  532. CString strTitle;
  533. strTitle.Format(_T("%s [%s]"), strDPName, strFile);
  534. CDocument::SetTitle(strTitle);
  535. }
  536. /////////////////////////////////////////////////////////////////////////////
  537. // CCalendarDemoDoc diagnostics
  538. #ifdef _DEBUG
  539. void CCalendarDemoDoc::AssertValid() const
  540. {
  541. CDocument::AssertValid();
  542. }
  543. void CCalendarDemoDoc::Dump(CDumpContext& dc) const
  544. {
  545. CDocument::Dump(dc);
  546. }
  547. #endif //_DEBUG
  548. /////////////////////////////////////////////////////////////////////////////
  549. // CCalendarDemoDoc commands