home *** CD-ROM | disk | FTP | other *** search
/ CD World Haziran 1997 / CD World Haziran 1997.iso / Programlama ve Gelistirme / DTime / _SETUP.1 / Dentry.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-04  |  67.9 KB  |  2,798 lines

  1. /*
  2. Module : DATENTRY.H
  3. Purpose: implementation to a number of classes to allow data entry of the date/time classes
  4. Created: PJN / DATE/1 / 20-02-1996
  5. History: None
  6.  
  7. Copyright (c) 1996 by PJ Naughter.  
  8. All rights reserved.
  9.  
  10. */
  11.  
  12. /////////////////////////////////  Includes  //////////////////////////////////
  13. #include "stdafx.h"
  14. #include "resource.h"
  15. #include "dtime.h"
  16. #include "dentry.h"
  17. #include "dtimeres.h"
  18.  
  19.  
  20.  
  21.  
  22. //////////////////////////////////  Macros  ///////////////////////////////////
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char BASED_CODE THIS_FILE[] = __FILE__;
  26. #define new DEBUG_NEW
  27. #endif
  28.  
  29.  
  30.  
  31. ////////////////////////////////// Helper Functions ///////////////////////////
  32.  
  33. void DDX_CBData(CDataExchange* pDX, int nIDC, DWORD& dwData)
  34. {
  35.     HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
  36.     ASSERT(hWndCtrl != NULL);
  37.   CComboBox Combo;
  38.   Combo.Attach(hWndCtrl);
  39.  
  40.   if (pDX->m_bSaveAndValidate)
  41.   {
  42.     //Get the Item Data for the Currently selected item
  43.     int nIndex = Combo.GetCurSel();
  44.     dwData = Combo.GetItemData(nIndex);
  45.   }
  46.   else
  47.   {
  48.     //Select the item which has Item Data equal to dwData
  49.     int nItems = Combo.GetCount();
  50.     ASSERT(nItems != CB_ERR);
  51.     for (int i=0; i<nItems; i++)
  52.     {
  53.       if (Combo.GetItemData(i) == dwData)
  54.       {
  55.         Combo.SetCurSel(i);
  56.         break;
  57.       }
  58.     }
  59.   }
  60.  
  61.   Combo.Detach();
  62. }
  63.   
  64.  
  65.  
  66.  
  67.  
  68. ////////////////////////////////// Implementation /////////////////////////////
  69. IMPLEMENT_DYNCREATE(CDatePropertyPage, CPropertyPage)
  70.  
  71.  
  72. BEGIN_MESSAGE_MAP(CDatePropertyPage, CPropertyPage)
  73.     //{{AFX_MSG_MAP(CDatePropertyPage)
  74.     //}}AFX_MSG_MAP
  75. END_MESSAGE_MAP()
  76.  
  77.  
  78. CDatePropertyPage::CDatePropertyPage()
  79. {
  80.   m_dwFlags = 0;
  81.   m_Date = CDate::FirstCurrentYear();
  82. }
  83.  
  84.  
  85. CDatePropertyPage::CDatePropertyPage(UINT nIDTemplate, UINT nIDCaption) : CPropertyPage(nIDTemplate, nIDCaption)
  86. {
  87.   m_dwFlags = 0;
  88.   m_Date = CDate::FirstCurrentYear();
  89. }
  90.  
  91.  
  92. CDatePropertyPage::~CDatePropertyPage()
  93. {
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103. //////////////////////// CCDatePropertySheet implementation ///////////////////
  104.  
  105.  
  106. IMPLEMENT_DYNCREATE(CDatePropertySheet, CPropertySheet)
  107.  
  108.  
  109. BEGIN_MESSAGE_MAP(CDatePropertySheet, CPropertySheet)
  110.     //{{AFX_MSG_MAP(CDatePropertySheet)
  111.     //}}AFX_MSG_MAP
  112. END_MESSAGE_MAP()
  113.  
  114.  
  115. CDatePropertySheet::CDatePropertySheet()
  116. {
  117. }
  118.  
  119.  
  120. CDatePropertySheet::CDatePropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags) : CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  121. {
  122.   m_dwFlags = dwFlags;
  123. }
  124.  
  125.  
  126. CDatePropertySheet::CDatePropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags) : CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  127. {
  128.   m_dwFlags = dwFlags;
  129. }
  130.  
  131.  
  132. CDatePropertySheet::~CDatePropertySheet()
  133. {
  134. }
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. //////////////////////// CCDateDOMPage implementation /////////////////////////
  142.  
  143. IMPLEMENT_DYNCREATE(CCDateDOMPage, CDatePropertyPage)
  144.  
  145. BEGIN_MESSAGE_MAP(CCDateDOMPage, CDatePropertyPage)
  146.     //{{AFX_MSG_MAP(CCDateDOMPage)
  147.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  148.     ON_BN_CLICKED(IDC_TODAY, OnToday)
  149.     ON_CBN_SELCHANGE(IDC_DISPLAY, OnSelchangeDisplay)
  150.     //}}AFX_MSG_MAP
  151. END_MESSAGE_MAP()
  152.  
  153.  
  154. CCDateDOMPage::CCDateDOMPage() : CDatePropertyPage(CCDateDOMPage::IDD)
  155. {
  156.     //{{AFX_DATA_INIT(CCDateDOMPage)
  157.     m_nDay = 0;
  158.     m_lYear = 0;
  159.   m_bInvalid = FALSE;
  160.     //}}AFX_DATA_INIT
  161.  
  162.   m_bInvalid = !m_Date.IsValid();
  163.   m_nDay =      m_Date.GetDay();
  164.   m_nMonth =    m_Date.GetMonth();
  165.   m_lYear =     m_Date.GetYear();
  166. }
  167.  
  168.  
  169. CCDateDOMPage::~CCDateDOMPage()
  170. {
  171. }
  172.  
  173.  
  174. void CCDateDOMPage::DoDataExchange(CDataExchange* pDX)
  175. {
  176.     CDatePropertyPage::DoDataExchange(pDX);
  177.  
  178.   if (!pDX->m_bSaveAndValidate)
  179.   {
  180.     m_bInvalid = !m_Date.IsValid();
  181.     if (!m_bInvalid)
  182.     {
  183.       m_lYear = m_Date.GetYear();
  184.       m_nMonth = m_Date.GetMonth();
  185.       m_nDay = m_Date.GetDay();
  186.     }
  187.   }
  188.  
  189.     //{{AFX_DATA_MAP(CCDateDOMPage)
  190.     DDX_Control(pDX, IDC_UPDOWN_YEAR, m_SpinYear);
  191.     DDX_Control(pDX, IDC_UPDOWN_DAY, m_SpinDay);
  192.     DDX_Text(pDX, IDC_DAY, m_nDay);
  193.     //DDV_MinMaxUInt(pDX, m_nDay, 1, 31);
  194.     DDX_Text(pDX, IDC_YEAR, m_lYear);
  195.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  196.     //}}AFX_DATA_MAP
  197.  
  198.   if (pDX->m_bSaveAndValidate)
  199.   {
  200.         DDX_CBIndex(pDX, IDC_MONTH, (int&) m_nMonth);
  201.         m_nMonth++;
  202.     }
  203.   else
  204.   {
  205.         int nMonthIndex = m_nMonth-1;
  206.         DDX_CBIndex(pDX, IDC_MONTH, nMonthIndex);
  207.     }
  208.  
  209.     pDX->PrepareEditCtrl(IDC_DAY);
  210.     DDV_MinMaxUInt(pDX, m_nDay, 1, CDate::DaysInMonth(m_nMonth, m_lYear));
  211.  
  212.   if (pDX->m_bSaveAndValidate)
  213.   {
  214.     if (m_bInvalid)
  215.       m_Date = CDate();
  216.     else
  217.     {
  218.       #ifdef _DEBUG
  219.       BOOL bDoAsserts = CDate::SetDoConstructorAsserts(FALSE);
  220.       #endif
  221.       m_Date = CDate(m_lYear, m_nMonth, (WORD) m_nDay);
  222.       #ifdef _DEBUG
  223.       CDate::SetDoConstructorAsserts(bDoAsserts);
  224.       #endif
  225.     }
  226.   }
  227.   else
  228.   {
  229.     //Enable / Disable controls
  230.       OnInvalid();
  231.   }
  232. }
  233.  
  234.  
  235. BOOL CCDateDOMPage::OnInitDialog() 
  236. {
  237.     //Add the month strings
  238.     CComboBox* pMonthCombo = (CComboBox*) GetDlgItem(IDC_MONTH);
  239.     ASSERT(pMonthCombo);
  240.     for (WORD i=1; i<13; i++)
  241.         pMonthCombo->AddString(CDate::GetFullStringMonth(i));
  242.  
  243.   //Add the format selection strings (Ordering of strings is the same as
  244.   //the CDateCurrentPage enum
  245.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  246.   ASSERT(pDisplayCombo);
  247.   CString s;
  248.   BOOL bSuccess = s.LoadString(IDS_DAY_OF_MONTH);
  249.   ASSERT(bSuccess);
  250.   pDisplayCombo->AddString(s);
  251.   bSuccess = s.LoadString(IDS_DAY_OF_YEAR);
  252.   ASSERT(bSuccess);
  253.   pDisplayCombo->AddString(s);
  254.   bSuccess = s.LoadString(IDS_WEEK_OF_MONTH);
  255.   ASSERT(bSuccess);
  256.   pDisplayCombo->AddString(s);
  257.   bSuccess = s.LoadString(IDS_WEEK_OF_YEAR);
  258.   ASSERT(bSuccess);
  259.   pDisplayCombo->AddString(s);
  260.   pDisplayCombo->SetCurSel(0);
  261.  
  262.   //Call up to the parent
  263.     BOOL rval = CDatePropertyPage::OnInitDialog();
  264.  
  265.     //Set the ranges for the spin controls
  266.     m_SpinYear.SetRange(UD_MINVAL, UD_MAXVAL);
  267.     m_SpinDay.SetRange(1, 31);
  268.  
  269.     //Hide the invalid check box if required
  270.     if (m_dwFlags & DT_ONLYVALID)
  271.   {
  272.     ASSERT(GetDlgItem(IDC_INVALID));
  273.     GetDlgItem(IDC_INVALID)->ShowWindow(SW_HIDE);
  274.   }
  275.  
  276.   //Hide the display as combo if required
  277.   if (m_dwFlags & DT_NODISPLAYCOMBO)
  278.   {
  279.     ASSERT(GetDlgItem(IDC_DISPLAY));
  280.     ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  281.     GetDlgItem(IDC_DISPLAY)->ShowWindow(SW_HIDE);
  282.     GetDlgItem(IDC_DISPLAY_AS_PROMPT)->ShowWindow(SW_HIDE);
  283.   }
  284.  
  285.   return rval;
  286. }
  287.  
  288.  
  289. void CCDateDOMPage::OnInvalid() 
  290. {
  291.     //if any of these assert then it is likely that the
  292.     //wrong dialog template has been loaded or the 
  293.   //correct one could not be found
  294.   ASSERT(GetDlgItem(IDC_INVALID));
  295.     ASSERT(GetDlgItem(IDC_DAY_PROMPT));
  296.     ASSERT(GetDlgItem(IDC_DAY));
  297.     ASSERT(GetDlgItem(IDC_MONTH_PROMPT));
  298.     ASSERT(GetDlgItem(IDC_MONTH));
  299.     ASSERT(GetDlgItem(IDC_YEAR_PROMPT));
  300.     ASSERT(GetDlgItem(IDC_YEAR));
  301.   ASSERT(GetDlgItem(IDC_TODAY));
  302.   ASSERT(GetDlgItem(IDC_DISPLAY));
  303.   ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  304.  
  305.  
  306.     BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();
  307.     m_SpinDay.EnableWindow(bValid);
  308.     m_SpinYear.EnableWindow(bValid);
  309.     GetDlgItem(IDC_DAY_PROMPT)->EnableWindow(bValid);
  310.     GetDlgItem(IDC_DAY)->EnableWindow(bValid);
  311.     GetDlgItem(IDC_MONTH_PROMPT)->EnableWindow(bValid);
  312.     GetDlgItem(IDC_MONTH)->EnableWindow(bValid);
  313.     GetDlgItem(IDC_YEAR_PROMPT)->EnableWindow(bValid);
  314.     GetDlgItem(IDC_YEAR)->EnableWindow(bValid);
  315.   GetDlgItem(IDC_TODAY)->EnableWindow(bValid);
  316.   GetDlgItem(IDC_DISPLAY)->EnableWindow(bValid);
  317.   GetDlgItem(IDC_DISPLAY_AS_PROMPT)->EnableWindow(bValid);
  318. }
  319.  
  320.  
  321. void CCDateDOMPage::OnToday() 
  322. {
  323.   m_Date = CDate::CurrentDate();
  324.   UpdateData(FALSE);
  325. }
  326.  
  327.  
  328. void CCDateDOMPage::OnSelchangeDisplay() 
  329. {
  330.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  331.   ASSERT(pDisplayCombo);
  332.   
  333.   switch (pDisplayCombo->GetCurSel())
  334.   {
  335.     case 0: GetParent()->PostMessage(WM_COMMAND, ID_DOM); break;
  336.     case 1: GetParent()->PostMessage(WM_COMMAND, ID_DOY); break;
  337.     case 2: GetParent()->PostMessage(WM_COMMAND, ID_WOM); break;
  338.     case 3: GetParent()->PostMessage(WM_COMMAND, ID_WOY); break;
  339.   }
  340. }
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355. //////////////////////// CCDateDOYPage implementation /////////////////////////
  356.  
  357. IMPLEMENT_DYNCREATE(CCDateDOYPage, CDatePropertyPage)
  358.  
  359. BEGIN_MESSAGE_MAP(CCDateDOYPage, CDatePropertyPage)
  360.     //{{AFX_MSG_MAP(CCDateDOYPage)
  361.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  362.     ON_BN_CLICKED(IDC_TODAY, OnToday)
  363.     ON_CBN_SELCHANGE(IDC_DISPLAY, OnSelchangeDisplay)
  364.     //}}AFX_MSG_MAP
  365. END_MESSAGE_MAP()
  366.  
  367.  
  368.  
  369. CCDateDOYPage::CCDateDOYPage() : CDatePropertyPage(CCDateDOYPage::IDD)
  370. {
  371.     //{{AFX_DATA_INIT(CCDateDOYPage)
  372.     m_nDay = 0;
  373.     m_bInvalid = FALSE;
  374.     m_lYear = 0;
  375.     //}}AFX_DATA_INIT
  376.  
  377.   m_bInvalid = !m_Date.IsValid();
  378.   m_nDay =      m_Date.DaysSinceJan0();
  379.   m_lYear =     m_Date.GetYear();
  380. }
  381.  
  382.  
  383. CCDateDOYPage::~CCDateDOYPage()
  384. {
  385. }
  386.  
  387.  
  388. void CCDateDOYPage::DoDataExchange(CDataExchange* pDX)
  389. {
  390.     CDatePropertyPage::DoDataExchange(pDX);
  391.  
  392.   if (!pDX->m_bSaveAndValidate)
  393.   {
  394.     m_bInvalid = !m_Date.IsValid();
  395.     if (!m_bInvalid)
  396.     {
  397.       m_lYear = m_Date.GetYear();
  398.       m_nDay = m_Date.DaysSinceJan0();
  399.     }
  400.   }
  401.  
  402.     //{{AFX_DATA_MAP(CCDateDOYPage)
  403.     DDX_Control(pDX, IDC_UPDOWN_YEAR, m_SpinYear);
  404.     DDX_Control(pDX, IDC_UPDOWN_DAY, m_SpinDay);
  405.     DDX_Text(pDX, IDC_DAY, m_nDay);
  406.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  407.     DDX_Text(pDX, IDC_YEAR, m_lYear);
  408.     //}}AFX_DATA_MAP
  409.     pDX->PrepareEditCtrl(IDC_DAY);
  410.     DDV_MinMaxUInt(pDX, m_nDay, 1, CDate::DaysInYear(m_lYear));
  411.  
  412.   if (pDX->m_bSaveAndValidate)
  413.   {
  414.     if (m_bInvalid)
  415.       m_Date = CDate();
  416.     else
  417.     {
  418.       #ifdef _DEBUG
  419.       BOOL bDoAsserts = CDate::SetDoConstructorAsserts(FALSE);
  420.       #endif
  421.       m_Date = CDate(m_lYear, 1, 1) + m_nDay - 1;
  422.       #ifdef _DEBUG
  423.       CDate::SetDoConstructorAsserts(bDoAsserts);
  424.       #endif
  425.     }
  426.   }
  427.   else
  428.   {
  429.       //Enable / Disable controls
  430.       OnInvalid();
  431.   }
  432. }
  433.  
  434.  
  435. void CCDateDOYPage::OnInvalid() 
  436. {
  437.     //if any of these assert then it is likely that the
  438.     //wrong dialog template has been loaded or the 
  439.   //correct one could not be found
  440.   ASSERT(GetDlgItem(IDC_INVALID));
  441.     ASSERT(GetDlgItem(IDC_DAY_PROMPT));
  442.     ASSERT(GetDlgItem(IDC_DAY));
  443.     ASSERT(GetDlgItem(IDC_YEAR_PROMPT));
  444.     ASSERT(GetDlgItem(IDC_YEAR));
  445.   ASSERT(GetDlgItem(IDC_TODAY));
  446.   ASSERT(GetDlgItem(IDC_DISPLAY));
  447.   ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  448.  
  449.     BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();
  450.     m_SpinDay.EnableWindow(bValid);
  451.     m_SpinYear.EnableWindow(bValid);
  452.     GetDlgItem(IDC_DAY_PROMPT)->EnableWindow(bValid);
  453.     GetDlgItem(IDC_DAY)->EnableWindow(bValid);
  454.     GetDlgItem(IDC_YEAR_PROMPT)->EnableWindow(bValid);
  455.     GetDlgItem(IDC_YEAR)->EnableWindow(bValid);
  456.   GetDlgItem(IDC_TODAY)->EnableWindow(bValid);
  457.   GetDlgItem(IDC_DISPLAY)->EnableWindow(bValid);
  458.   GetDlgItem(IDC_DISPLAY_AS_PROMPT)->EnableWindow(bValid);
  459. }
  460.  
  461.  
  462. BOOL CCDateDOYPage::OnInitDialog() 
  463. {
  464.   //Add the format selection strings (Ordering of strings is the same as
  465.   //the CDateCurrentPage enum
  466.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  467.   ASSERT(pDisplayCombo);
  468.   CString s;
  469.   BOOL bSuccess = s.LoadString(IDS_DAY_OF_MONTH);
  470.   ASSERT(bSuccess);
  471.   pDisplayCombo->AddString(s);
  472.   bSuccess = s.LoadString(IDS_DAY_OF_YEAR);
  473.   ASSERT(bSuccess);
  474.   pDisplayCombo->AddString(s);
  475.   bSuccess = s.LoadString(IDS_WEEK_OF_MONTH);
  476.   ASSERT(bSuccess);
  477.   pDisplayCombo->AddString(s);
  478.   bSuccess = s.LoadString(IDS_WEEK_OF_YEAR);
  479.   ASSERT(bSuccess);
  480.   pDisplayCombo->AddString(s);
  481.   pDisplayCombo->SetCurSel(1);
  482.  
  483.     //Call up to the parent
  484.     BOOL rval = CDatePropertyPage::OnInitDialog();
  485.  
  486.     //Set the ranges for the spin controls
  487.   m_SpinYear.SetRange(UD_MINVAL, UD_MAXVAL);
  488.     m_SpinDay.SetRange(1, 366);
  489.  
  490.     //Hide the invalid check box if required
  491.     if (m_dwFlags & DT_ONLYVALID)
  492.   {
  493.     ASSERT(GetDlgItem(IDC_INVALID));
  494.     GetDlgItem(IDC_INVALID)->ShowWindow(SW_HIDE);
  495.   }
  496.  
  497.   //Hide the display as combo if required
  498.   if (m_dwFlags & DT_NODISPLAYCOMBO)
  499.   {
  500.     ASSERT(GetDlgItem(IDC_DISPLAY));
  501.     ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  502.     GetDlgItem(IDC_DISPLAY)->ShowWindow(SW_HIDE);
  503.     GetDlgItem(IDC_DISPLAY_AS_PROMPT)->ShowWindow(SW_HIDE);
  504.   }
  505.  
  506.     return rval;
  507. }
  508.  
  509.  
  510. void CCDateDOYPage::OnToday() 
  511. {
  512.   m_Date = CDate::CurrentDate();
  513.   UpdateData(FALSE);
  514. }
  515.  
  516.  
  517. void CCDateDOYPage::OnSelchangeDisplay() 
  518. {
  519.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  520.   ASSERT(pDisplayCombo);
  521.   
  522.   switch (pDisplayCombo->GetCurSel())
  523.   {
  524.     case 0: GetParent()->PostMessage(WM_COMMAND, ID_DOM); break;
  525.     case 1: GetParent()->PostMessage(WM_COMMAND, ID_DOY); break;
  526.     case 2: GetParent()->PostMessage(WM_COMMAND, ID_WOM); break;
  527.     case 3: GetParent()->PostMessage(WM_COMMAND, ID_WOY); break;
  528.   }
  529. }
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539. //////////////////////// CCDateWOMPage implementation /////////////////////////
  540.  
  541. IMPLEMENT_DYNCREATE(CCDateWOMPage, CDatePropertyPage)
  542.  
  543. BEGIN_MESSAGE_MAP(CCDateWOMPage, CDatePropertyPage)
  544.     //{{AFX_MSG_MAP(CCDateWOMPage)
  545.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  546.     ON_BN_CLICKED(IDC_TODAY, OnToday)
  547.     ON_CBN_SELCHANGE(IDC_DISPLAY, OnSelchangeDisplay)
  548.     //}}AFX_MSG_MAP
  549. END_MESSAGE_MAP()
  550.  
  551.  
  552. CCDateWOMPage::CCDateWOMPage() : CDatePropertyPage(CCDateWOMPage::IDD)
  553. {
  554.     //{{AFX_DATA_INIT(CCDateWOMPage)
  555.     m_bInvalid = FALSE;
  556.     m_lYear = 0;
  557.     //}}AFX_DATA_INIT
  558.  
  559.   m_bInvalid = !m_Date.IsValid();
  560.   m_nDayOfWeek = m_Date.GetDayOfWeek();
  561.   m_lYear =     m_Date.GetYear();
  562.   m_nWeek = 1;
  563.   m_nMonth = m_Date.GetMonth();
  564. }
  565.  
  566.  
  567. CCDateWOMPage::~CCDateWOMPage()
  568. {
  569. }
  570.  
  571.  
  572. void CCDateWOMPage::DoDataExchange(CDataExchange* pDX)
  573. {
  574.     CDatePropertyPage::DoDataExchange(pDX);
  575.  
  576.   if (!pDX->m_bSaveAndValidate)
  577.   {
  578.     m_bInvalid = !m_Date.IsValid();
  579.     if (!m_bInvalid)
  580.     {
  581.       m_lYear = m_Date.GetYear();
  582.       m_nMonth = m_Date.GetMonth();
  583.       m_nDayOfWeek = m_Date.GetDayOfWeek();
  584.       m_nWeek = (WORD) (((m_Date - CDate(m_lYear, (WORD) m_nMonth, (WORD) 1, (WORD) m_nDayOfWeek)) / 7) + 1);
  585.     }
  586.   }
  587.  
  588.     //{{AFX_DATA_MAP(CCDateWOMPage)
  589.     DDX_Control(pDX, IDC_UPDOWN_YEAR, m_SpinYear);
  590.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  591.     DDX_Text(pDX, IDC_YEAR, m_lYear);
  592.     //}}AFX_DATA_MAP
  593.  
  594.   if (pDX->m_bSaveAndValidate)
  595.   {
  596.     int nMonthIndex;
  597.         DDX_CBIndex(pDX, IDC_MONTH, nMonthIndex);
  598.         m_nMonth = (WORD) (nMonthIndex + 1);
  599.     int nDayOfWeekIndex;
  600.         DDX_CBIndex(pDX, IDC_WEEKDAY, nDayOfWeekIndex);
  601.         m_nDayOfWeek = (WORD) (nDayOfWeekIndex + 1);
  602.     int nWeekIndex;
  603.         DDX_CBIndex(pDX, IDC_WEEK, nWeekIndex);
  604.         m_nWeek = (WORD) (nWeekIndex + 1);
  605.     }
  606.   else
  607.   {
  608.         int nMonthIndex = m_nMonth-1;
  609.         DDX_CBIndex(pDX, IDC_MONTH, nMonthIndex);
  610.         int nDayOfWeekIndex = m_nDayOfWeek-1;
  611.         DDX_CBIndex(pDX, IDC_WEEKDAY, nDayOfWeekIndex);
  612.         int nWeekIndex = m_nWeek-1;
  613.         DDX_CBIndex(pDX, IDC_WEEK, nWeekIndex);
  614.     }
  615.  
  616.   if (pDX->m_bSaveAndValidate)
  617.   {
  618.     if (m_bInvalid)
  619.       m_Date = CDate();
  620.     else
  621.     {
  622.       #ifdef _DEBUG
  623.       BOOL bDoAsserts = CDate::SetDoConstructorAsserts(FALSE);
  624.       #endif
  625.       m_Date = CDate(m_lYear, m_nMonth, m_nWeek, m_nDayOfWeek);
  626.       #ifdef _DEBUG
  627.       CDate::SetDoConstructorAsserts(bDoAsserts);
  628.       #endif
  629.     }
  630.   }
  631.   else
  632.   {
  633.       //Enable / Disable controls
  634.       OnInvalid();
  635.   }
  636. }
  637.  
  638.  
  639. BOOL CCDateWOMPage::OnInitDialog() 
  640. {
  641.     //Add the month strings
  642.     CComboBox* pMonthCombo = (CComboBox*) GetDlgItem(IDC_MONTH);
  643.     ASSERT(pMonthCombo);
  644.     for (WORD i=1; i<13; i++)
  645.         pMonthCombo->AddString(CDate::GetFullStringMonth(i));
  646.  
  647.   //Add the day of week strings
  648.     CComboBox* pDayOfWeekCombo = (CComboBox*) GetDlgItem(IDC_WEEKDAY);
  649.     ASSERT(pDayOfWeekCombo);
  650.     for (i=1; i<8; i++)
  651.         pDayOfWeekCombo->AddString(CDate::GetFullStringDayOfWeek(i));
  652.  
  653.     //Add the week strings
  654.     CComboBox* pWeekCombo = (CComboBox*) GetDlgItem(IDC_WEEK);
  655.     ASSERT(pWeekCombo);
  656.  
  657.   CString sText;
  658.   BOOL bSuccess = sText.LoadString(IDS_1ST);
  659.   ASSERT(bSuccess);
  660.     pWeekCombo->AddString(sText);
  661.  
  662.   bSuccess = sText.LoadString(IDS_2ND);
  663.   ASSERT(bSuccess);
  664.     pWeekCombo->AddString(sText);
  665.  
  666.   bSuccess = sText.LoadString(IDS_3RD);
  667.   ASSERT(bSuccess);
  668.     pWeekCombo->AddString(sText);
  669.  
  670.   bSuccess = sText.LoadString(IDS_4TH);
  671.   ASSERT(bSuccess);
  672.     pWeekCombo->AddString(sText);
  673.  
  674.   bSuccess = sText.LoadString(IDS_LAST);
  675.   ASSERT(bSuccess);
  676.     pWeekCombo->AddString(sText);
  677.  
  678.   //Add the format selection strings (Ordering of strings is the same as
  679.   //the CDateCurrentPage enum
  680.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  681.   ASSERT(pDisplayCombo);
  682.   CString s;
  683.   bSuccess = s.LoadString(IDS_DAY_OF_MONTH);
  684.   ASSERT(bSuccess);
  685.   pDisplayCombo->AddString(s);
  686.   bSuccess = s.LoadString(IDS_DAY_OF_YEAR);
  687.   ASSERT(bSuccess);
  688.   pDisplayCombo->AddString(s);
  689.   bSuccess = s.LoadString(IDS_WEEK_OF_MONTH);
  690.   ASSERT(bSuccess);
  691.   pDisplayCombo->AddString(s);
  692.   bSuccess = s.LoadString(IDS_WEEK_OF_YEAR);
  693.   ASSERT(bSuccess);
  694.   pDisplayCombo->AddString(s);
  695.   pDisplayCombo->SetCurSel(2);
  696.  
  697.     //Call up to the parent
  698.     BOOL rval = CDatePropertyPage::OnInitDialog();
  699.  
  700.     //Set the ranges for the spin controls
  701.   m_SpinYear.SetRange(UD_MINVAL, UD_MAXVAL);
  702.  
  703.     //Hide the invalid check box if required
  704.     if (m_dwFlags & DT_ONLYVALID)
  705.   {
  706.     ASSERT(GetDlgItem(IDC_INVALID));
  707.     GetDlgItem(IDC_INVALID)->ShowWindow(SW_HIDE);
  708.   }
  709.  
  710.   //Hide the display as combo if required
  711.   if (m_dwFlags & DT_NODISPLAYCOMBO)
  712.   {
  713.     ASSERT(GetDlgItem(IDC_DISPLAY));
  714.     ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  715.     GetDlgItem(IDC_DISPLAY)->ShowWindow(SW_HIDE);
  716.     GetDlgItem(IDC_DISPLAY_AS_PROMPT)->ShowWindow(SW_HIDE);
  717.   }
  718.  
  719.     return rval;
  720. }
  721.  
  722.  
  723. void CCDateWOMPage::OnInvalid() 
  724. {
  725.     //if any of these assert then it is likely that the
  726.     //wrong dialog template has been loaded or the 
  727.   //correct one could not be found
  728.     ASSERT(GetDlgItem(IDC_INVALID));
  729.   ASSERT(GetDlgItem(IDC_WEEK_PROMPT));
  730.     ASSERT(GetDlgItem(IDC_WEEK));
  731.     ASSERT(GetDlgItem(IDC_WEEKDAY_PROMPT));
  732.     ASSERT(GetDlgItem(IDC_WEEKDAY));
  733.     ASSERT(GetDlgItem(IDC_MONTH_PROMPT));
  734.     ASSERT(GetDlgItem(IDC_MONTH));
  735.     ASSERT(GetDlgItem(IDC_YEAR_PROMPT));
  736.     ASSERT(GetDlgItem(IDC_YEAR));
  737.   ASSERT(GetDlgItem(IDC_TODAY));
  738.   ASSERT(GetDlgItem(IDC_DISPLAY));
  739.   ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  740.  
  741.   BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();
  742.     m_SpinYear.EnableWindow(bValid);
  743.     GetDlgItem(IDC_WEEK_PROMPT)->EnableWindow(bValid);
  744.     GetDlgItem(IDC_WEEK)->EnableWindow(bValid);
  745.     GetDlgItem(IDC_WEEKDAY_PROMPT)->EnableWindow(bValid);
  746.     GetDlgItem(IDC_WEEKDAY)->EnableWindow(bValid);
  747.     GetDlgItem(IDC_MONTH_PROMPT)->EnableWindow(bValid);
  748.     GetDlgItem(IDC_MONTH)->EnableWindow(bValid);
  749.     GetDlgItem(IDC_YEAR_PROMPT)->EnableWindow(bValid);
  750.     GetDlgItem(IDC_YEAR)->EnableWindow(bValid);
  751.   GetDlgItem(IDC_TODAY)->EnableWindow(bValid);
  752.   GetDlgItem(IDC_DISPLAY)->EnableWindow(bValid);
  753.   GetDlgItem(IDC_DISPLAY_AS_PROMPT)->EnableWindow(bValid);
  754. }
  755.  
  756.  
  757. void CCDateWOMPage::OnToday() 
  758. {
  759.   m_Date = CDate::CurrentDate();
  760.   UpdateData(FALSE);
  761. }
  762.  
  763.  
  764. void CCDateWOMPage::OnSelchangeDisplay() 
  765. {
  766.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  767.   ASSERT(pDisplayCombo);
  768.   
  769.   switch (pDisplayCombo->GetCurSel())
  770.   {
  771.     case 0: GetParent()->PostMessage(WM_COMMAND, ID_DOM); break;
  772.     case 1: GetParent()->PostMessage(WM_COMMAND, ID_DOY); break;
  773.     case 2: GetParent()->PostMessage(WM_COMMAND, ID_WOM); break;
  774.     case 3: GetParent()->PostMessage(WM_COMMAND, ID_WOY); break;
  775.   }
  776. }
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789. //////////////////////// CCDateWOYPage implementation /////////////////////////
  790.  
  791. IMPLEMENT_DYNCREATE(CCDateWOYPage, CDatePropertyPage)
  792.  
  793. BEGIN_MESSAGE_MAP(CCDateWOYPage, CDatePropertyPage)
  794.     //{{AFX_MSG_MAP(CCDateWOYPage)
  795.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  796.     ON_BN_CLICKED(IDC_TODAY, OnToday)
  797.     ON_CBN_SELCHANGE(IDC_DISPLAY, OnSelchangeDisplay)
  798.     //}}AFX_MSG_MAP
  799. END_MESSAGE_MAP()
  800.  
  801.  
  802. CCDateWOYPage::CCDateWOYPage() : CDatePropertyPage(CCDateWOYPage::IDD)
  803. {
  804.     //{{AFX_DATA_INIT(CCDateWOYPage)
  805.     m_bInvalid = FALSE;
  806.     m_lYear = 0;
  807.     //}}AFX_DATA_INIT
  808.   m_nDayOfWeek = CDate::SUNDAY;
  809.   m_nWeek = 1;
  810.   m_lYear = CDate::CurrentYear();
  811. }
  812.  
  813.  
  814. CCDateWOYPage::~CCDateWOYPage()
  815. {
  816. }
  817.  
  818.  
  819. void CCDateWOYPage::DoDataExchange(CDataExchange* pDX)
  820. {
  821.     CDatePropertyPage::DoDataExchange(pDX);
  822.  
  823.   if (!pDX->m_bSaveAndValidate)
  824.   {
  825.     m_bInvalid = !m_Date.IsValid();
  826.     if (!m_bInvalid)
  827.     {
  828.       m_lYear = m_Date.GetYear();
  829.       m_nDayOfWeek = m_Date.GetDayOfWeek();
  830.       m_nWeek = ((m_Date - CDate(m_lYear, 1, 1, m_nDayOfWeek)) / 7) + 1;
  831.     }
  832.   }
  833.  
  834.     //{{AFX_DATA_MAP(CCDateWOYPage)
  835.     DDX_Control(pDX, IDC_UPDOWN_YEAR, m_SpinYear);
  836.     DDX_Control(pDX, IDC_UPDOWN_WEEK, m_SpinWeek);
  837.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  838.     DDX_Text(pDX, IDC_YEAR, m_lYear);
  839.     DDX_Text(pDX, IDC_WEEK, m_nWeek);
  840.     DDV_MinMaxUInt(pDX, m_nWeek, 1, 53);
  841.     //}}AFX_DATA_MAP
  842.  
  843.     if (pDX->m_bSaveAndValidate)
  844.     {
  845.         DDX_CBIndex(pDX, IDC_WEEKDAY, (int&) m_nDayOfWeek);
  846.         m_nDayOfWeek++;
  847.     }
  848.     else
  849.     {
  850.         int nDayOfWeekIndex = m_nDayOfWeek-1;
  851.         DDX_CBIndex(pDX, IDC_WEEKDAY, nDayOfWeekIndex);
  852.     }
  853.  
  854.   if (pDX->m_bSaveAndValidate)
  855.   {
  856.     if (m_bInvalid)
  857.       m_Date = CDate();
  858.     else
  859.     {
  860.       #ifdef _DEBUG
  861.       BOOL bDoAsserts = CDate::SetDoConstructorAsserts(FALSE);
  862.       #endif
  863.       m_Date = CDate(m_lYear, 1, 1, m_nDayOfWeek) + (7*(m_nWeek-1));
  864.       #ifdef _DEBUG
  865.       CDate::SetDoConstructorAsserts(bDoAsserts);
  866.       #endif
  867.     }
  868.   }
  869.   else
  870.   {
  871.       //Enable / Disable controls
  872.       OnInvalid();
  873.   }
  874. }
  875.  
  876.  
  877. BOOL CCDateWOYPage::OnInitDialog() 
  878. {
  879.     //Add the day of week strings
  880.     CComboBox* pDayOfWeekCombo = (CComboBox*) GetDlgItem(IDC_WEEKDAY);
  881.     ASSERT(pDayOfWeekCombo);
  882.     for (WORD i=1; i<8; i++)
  883.         pDayOfWeekCombo->AddString(CDate::GetFullStringDayOfWeek(i));
  884.  
  885.   //Add the format selection strings (Ordering of strings is the same as
  886.   //the CDateCurrentPage enum
  887.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  888.   ASSERT(pDisplayCombo);
  889.   CString s;
  890.   BOOL bSuccess = s.LoadString(IDS_DAY_OF_MONTH);
  891.   ASSERT(bSuccess);
  892.   pDisplayCombo->AddString(s);
  893.   bSuccess = s.LoadString(IDS_DAY_OF_YEAR);
  894.   ASSERT(bSuccess);
  895.   pDisplayCombo->AddString(s);
  896.   bSuccess = s.LoadString(IDS_WEEK_OF_MONTH);
  897.   ASSERT(bSuccess);
  898.   pDisplayCombo->AddString(s);
  899.   bSuccess = s.LoadString(IDS_WEEK_OF_YEAR);
  900.   ASSERT(bSuccess);
  901.   pDisplayCombo->AddString(s);
  902.   pDisplayCombo->SetCurSel(3);
  903.  
  904.     //Call up to the parent
  905.     BOOL rval = CDatePropertyPage::OnInitDialog();
  906.  
  907.     //Set the ranges for the spin controls
  908.     m_SpinYear.SetRange(UD_MINVAL, UD_MAXVAL);
  909.   m_SpinWeek.SetRange(1, 53);
  910.  
  911.     //Hide the invalid check box if required
  912.     if (m_dwFlags & DT_ONLYVALID)
  913.   {
  914.     ASSERT(GetDlgItem(IDC_INVALID));
  915.     GetDlgItem(IDC_INVALID)->ShowWindow(SW_HIDE);
  916.   }
  917.  
  918.   //Hide the display as combo if required
  919.   if (m_dwFlags & DT_NODISPLAYCOMBO)
  920.   {
  921.     ASSERT(GetDlgItem(IDC_DISPLAY));
  922.     ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  923.     GetDlgItem(IDC_DISPLAY)->ShowWindow(SW_HIDE);
  924.     GetDlgItem(IDC_DISPLAY_AS_PROMPT)->ShowWindow(SW_HIDE);
  925.   }
  926.  
  927.     return rval;
  928. }
  929.  
  930.  
  931. void CCDateWOYPage::OnInvalid() 
  932. {
  933.     //if any of these assert then it is likely that the
  934.     //wrong dialog template has been loaded or the 
  935.   //correct one could not be found
  936.     ASSERT(GetDlgItem(IDC_INVALID));
  937.     ASSERT(GetDlgItem(IDC_WEEK_PROMPT));
  938.     ASSERT(GetDlgItem(IDC_WEEK));
  939.     ASSERT(GetDlgItem(IDC_WEEKDAY_PROMPT));
  940.     ASSERT(GetDlgItem(IDC_WEEKDAY));
  941.     ASSERT(GetDlgItem(IDC_YEAR_PROMPT));
  942.     ASSERT(GetDlgItem(IDC_YEAR));
  943.   ASSERT(GetDlgItem(IDC_TODAY));
  944.   ASSERT(GetDlgItem(IDC_DISPLAY));
  945.   ASSERT(GetDlgItem(IDC_DISPLAY_AS_PROMPT));
  946.  
  947.   BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();
  948.     m_SpinYear.EnableWindow(bValid);
  949.     m_SpinWeek.EnableWindow(bValid);
  950.     GetDlgItem(IDC_WEEK_PROMPT)->EnableWindow(bValid);
  951.     GetDlgItem(IDC_WEEK)->EnableWindow(bValid);
  952.     GetDlgItem(IDC_WEEKDAY_PROMPT)->EnableWindow(bValid);
  953.     GetDlgItem(IDC_WEEKDAY)->EnableWindow(bValid);
  954.     GetDlgItem(IDC_YEAR_PROMPT)->EnableWindow(bValid);
  955.     GetDlgItem(IDC_YEAR)->EnableWindow(bValid);
  956.   GetDlgItem(IDC_TODAY)->EnableWindow(bValid);
  957.   GetDlgItem(IDC_DISPLAY)->EnableWindow(bValid);
  958.   GetDlgItem(IDC_DISPLAY_AS_PROMPT)->EnableWindow(bValid);
  959. }
  960.  
  961.  
  962. void CCDateWOYPage::OnToday() 
  963. {
  964.   m_Date = CDate::CurrentDate();
  965.   UpdateData(FALSE);
  966. }
  967.  
  968.  
  969. void CCDateWOYPage::OnSelchangeDisplay() 
  970. {
  971.   CComboBox* pDisplayCombo = (CComboBox*) GetDlgItem(IDC_DISPLAY);
  972.   ASSERT(pDisplayCombo);
  973.   
  974.   switch (pDisplayCombo->GetCurSel())
  975.   {
  976.     case 0: GetParent()->PostMessage(WM_COMMAND, ID_DOM); break;
  977.     case 1: GetParent()->PostMessage(WM_COMMAND, ID_DOY); break;
  978.     case 2: GetParent()->PostMessage(WM_COMMAND, ID_WOM); break;
  979.     case 3: GetParent()->PostMessage(WM_COMMAND, ID_WOY); break;
  980.   }
  981. }
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991. //////////////////////// CCLTimeOfDayHMSMPage implementation //////////////////
  992.  
  993. IMPLEMENT_DYNCREATE(CCLTimeOfDayHMSMPage, CDatePropertyPage)
  994.  
  995. BEGIN_MESSAGE_MAP(CCLTimeOfDayHMSMPage, CDatePropertyPage)
  996.     //{{AFX_MSG_MAP(CCLTimeOfDayHMSMPage)
  997.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  998.     ON_BN_CLICKED(IDC_NOW, OnNow)
  999.     ON_BN_CLICKED(IDC_MIDDAY, OnMidday)
  1000.     ON_BN_CLICKED(IDC_MIDNIGHT, OnMidnight)
  1001.     //}}AFX_MSG_MAP
  1002. END_MESSAGE_MAP()
  1003.  
  1004.  
  1005. CCLTimeOfDayHMSMPage::CCLTimeOfDayHMSMPage() : CDatePropertyPage(CCLTimeOfDayHMSMPage::IDD)
  1006. {
  1007.     //{{AFX_DATA_INIT(CCLTimeOfDayHMSMPage)
  1008.     m_nHour = 0;
  1009.     m_bInvalid = FALSE;
  1010.     m_nMinute = 0;
  1011.     m_nSecond = 0;
  1012.     //}}AFX_DATA_INIT
  1013.  
  1014.   m_bShowInvalid = TRUE;
  1015. }
  1016.  
  1017.  
  1018. CCLTimeOfDayHMSMPage::~CCLTimeOfDayHMSMPage()
  1019. {
  1020. }
  1021.  
  1022.  
  1023. void CCLTimeOfDayHMSMPage::MarkAsValid()
  1024. {
  1025.     //if any of these assert then it is likely that the
  1026.     //wrong dialog template has been loaded or the 
  1027.   //correct one could not be found
  1028.   ASSERT(GetDlgItem(IDC_INVALID));
  1029.  
  1030.   ((CButton*) GetDlgItem(IDC_INVALID))->SetCheck(FALSE);    
  1031.   UpdateData();
  1032. }
  1033.  
  1034.  
  1035. void CCLTimeOfDayHMSMPage::DoDataExchange(CDataExchange* pDX)
  1036. {
  1037.     CDatePropertyPage::DoDataExchange(pDX);
  1038.  
  1039.   if (!pDX->m_bSaveAndValidate)
  1040.   {
  1041.     m_bInvalid = !m_Tod.IsValid();
  1042.     if (!m_bInvalid)
  1043.     {
  1044.       m_nHour = m_Tod.GetHour();
  1045.       m_nMinute = m_Tod.GetMinute();
  1046.       if (!(m_dwFlags & DT_NOSECONDS))
  1047.         m_nSecond = m_Tod.GetSecond();
  1048.     }
  1049.   }
  1050.  
  1051.     //{{AFX_DATA_MAP(CCLTimeOfDayHMSMPage)
  1052.     DDX_Control(pDX, IDC_UPDOWN_SECOND, m_SpinSecond);
  1053.     DDX_Control(pDX, IDC_UPDOWN_MINUTE, m_SpinMinute);
  1054.     DDX_Control(pDX, IDC_UPDOWN_HOUR, m_SpinHour);
  1055.     DDX_Text(pDX, IDC_HOUR, m_nHour);
  1056.     DDV_MinMaxUInt(pDX, m_nHour, 0, 23);
  1057.     DDX_Text(pDX, IDC_MINUTE, m_nMinute);
  1058.     DDV_MinMaxUInt(pDX, m_nMinute, 0, 59);
  1059.     DDX_Text(pDX, IDC_SECOND, m_nSecond);
  1060.     DDV_MinMaxUInt(pDX, m_nSecond, 0, 59);
  1061.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  1062.     //}}AFX_DATA_MAP
  1063.  
  1064.   if (pDX->m_bSaveAndValidate)
  1065.   {
  1066.     if (m_bInvalid)
  1067.       m_Tod = CLTimeOfDay();
  1068.     else
  1069.     {
  1070.       #ifdef _DEBUG
  1071.       BOOL bDoAsserts = CLTimeOfDay::SetDoConstructorAsserts(FALSE);
  1072.       #endif
  1073.       m_Tod = CLTimeOfDay((WORD) m_nHour, (WORD) m_nMinute, (WORD) m_nSecond);
  1074.       #ifdef _DEBUG
  1075.       CLTimeOfDay::SetDoConstructorAsserts(bDoAsserts);
  1076.       #endif
  1077.     }
  1078.   }
  1079.   else
  1080.   {
  1081.     //Enable / Disable controls
  1082.       OnInvalid();
  1083.   }
  1084. }
  1085.  
  1086.  
  1087. BOOL CCLTimeOfDayHMSMPage::OnInitDialog() 
  1088. {
  1089.     BOOL rVal = CDatePropertyPage::OnInitDialog();
  1090.  
  1091.     //Set the ranges for the spin controls
  1092.     m_SpinHour.SetRange(0, 23);
  1093.   m_SpinMinute.SetRange(0, 59);
  1094.   m_SpinSecond.SetRange(0, 59);
  1095.  
  1096.     //hide the invalid check box if required
  1097.     if (m_dwFlags & DT_ONLYVALID)
  1098.   {
  1099.     ASSERT(GetDlgItem(IDC_INVALID));
  1100.     ((CButton*) GetDlgItem(IDC_INVALID))->ShowWindow(SW_HIDE);
  1101.   }
  1102.  
  1103.   //Hide the invalid check box if required
  1104.   if (!m_bShowInvalid)
  1105.   {
  1106.     ASSERT(GetDlgItem(IDC_INVALID));
  1107.     ((CButton*) GetDlgItem(IDC_INVALID))->ShowWindow(SW_HIDE);
  1108.   }
  1109.  
  1110.   //hide the second edit if required
  1111.   if (m_dwFlags & DT_NOSECONDS)
  1112.   {
  1113.     ASSERT(GetDlgItem(IDC_SECOND));
  1114.     GetDlgItem(IDC_SECOND)->ShowWindow(SW_HIDE);
  1115.     m_SpinSecond.ShowWindow(SW_HIDE);
  1116.     ASSERT(GetDlgItem(IDC_SECOND_PROMPT));
  1117.     GetDlgItem(IDC_SECOND_PROMPT)->ShowWindow(SW_HIDE);
  1118.   }
  1119.  
  1120.     return rVal;
  1121. }
  1122.  
  1123.  
  1124. void CCLTimeOfDayHMSMPage::OnInvalid() 
  1125. {
  1126.     //if any of these assert then it is likely that the
  1127.     //wrong dialog template has been loaded or the 
  1128.   //correct one could not be found
  1129.     ASSERT(GetDlgItem(IDC_INVALID));
  1130.     ASSERT(GetDlgItem(IDC_HOUR_PROMPT));
  1131.     ASSERT(GetDlgItem(IDC_HOUR));
  1132.     ASSERT(GetDlgItem(IDC_MINUTE_PROMPT));
  1133.     ASSERT(GetDlgItem(IDC_MINUTE));
  1134.     ASSERT(GetDlgItem(IDC_SECOND_PROMPT));
  1135.     ASSERT(GetDlgItem(IDC_SECOND));
  1136.   ASSERT(GetDlgItem(IDC_NOW));
  1137.   ASSERT(GetDlgItem(IDC_MIDNIGHT));
  1138.   ASSERT(GetDlgItem(IDC_MIDDAY));
  1139.  
  1140.     BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();    
  1141.   m_SpinHour.EnableWindow(bValid);
  1142.     m_SpinMinute.EnableWindow(bValid);
  1143.     m_SpinSecond.EnableWindow(bValid);
  1144.  
  1145.     GetDlgItem(IDC_HOUR_PROMPT)->EnableWindow(bValid);
  1146.     GetDlgItem(IDC_HOUR)->EnableWindow(bValid);
  1147.     GetDlgItem(IDC_MINUTE_PROMPT)->EnableWindow(bValid);
  1148.     GetDlgItem(IDC_MINUTE)->EnableWindow(bValid);
  1149.     GetDlgItem(IDC_SECOND_PROMPT)->EnableWindow(bValid);
  1150.     GetDlgItem(IDC_SECOND)->EnableWindow(bValid);
  1151.   GetDlgItem(IDC_NOW)->EnableWindow(bValid);
  1152.   GetDlgItem(IDC_MIDNIGHT)->EnableWindow(bValid);
  1153.   GetDlgItem(IDC_MIDDAY)->EnableWindow(bValid);
  1154. }
  1155.  
  1156.  
  1157. BOOL CCLTimeOfDayHMSMPage::OnSetActive() 
  1158. {
  1159.     BOOL rVal = CDatePropertyPage::OnSetActive();
  1160.  
  1161.   //inform the sheet of the change
  1162.   CWnd* pWnd = GetParent();
  1163.   ASSERT(pWnd);
  1164.     pWnd->PostMessage(UWM_TIMEOFDAY_NOTIFY);
  1165.  
  1166.   return rVal;
  1167. }
  1168.  
  1169.  
  1170. void CCLTimeOfDayHMSMPage::OnNow() 
  1171. {
  1172.   m_Tod = CLTimeOfDay::CurrentTimeOfDay(LOCAL);
  1173.   UpdateData(FALSE);
  1174. }
  1175.  
  1176.  
  1177. void CCLTimeOfDayHMSMPage::OnMidday() 
  1178. {
  1179.   m_Tod = CLTimeOfDay::Midday();
  1180.   UpdateData(FALSE);
  1181. }
  1182.  
  1183. void CCLTimeOfDayHMSMPage::OnMidnight() 
  1184. {
  1185.   m_Tod = CLTimeOfDay::Midnight();
  1186.   UpdateData(FALSE);
  1187. }
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201. //////////////////////// CCLTimeSpanDHMSMPage implementation //////////////////
  1202.  
  1203. IMPLEMENT_DYNCREATE(CCLTimeSpanDHMSMPage, CDatePropertyPage)
  1204.  
  1205. BEGIN_MESSAGE_MAP(CCLTimeSpanDHMSMPage, CDatePropertyPage)
  1206.     //{{AFX_MSG_MAP(CCLTimeSpanDHMSMPage)
  1207.     ON_BN_CLICKED(IDC_INVALID, OnInvalid)
  1208.     //}}AFX_MSG_MAP
  1209. END_MESSAGE_MAP()
  1210.  
  1211.  
  1212. CCLTimeSpanDHMSMPage::CCLTimeSpanDHMSMPage() : CDatePropertyPage(CCLTimeSpanDHMSMPage::IDD)
  1213. {
  1214.     //{{AFX_DATA_INIT(CCLTimeSpanDHMSMPage)
  1215.     m_lDay = 0;
  1216.     m_nHour = 0;
  1217.     m_bInvalid = FALSE;
  1218.     m_nMinute = 0;
  1219.     m_nSecond = 0;
  1220.     //}}AFX_DATA_INIT
  1221. }
  1222.  
  1223.  
  1224. CCLTimeSpanDHMSMPage::~CCLTimeSpanDHMSMPage()
  1225. {
  1226. }
  1227.  
  1228.  
  1229. void CCLTimeSpanDHMSMPage::DoDataExchange(CDataExchange* pDX)
  1230. {
  1231.     CDatePropertyPage::DoDataExchange(pDX);
  1232.  
  1233.   if (!pDX->m_bSaveAndValidate)
  1234.   {
  1235.     m_bInvalid = !m_Ts.IsValid();
  1236.     if (!m_bInvalid)
  1237.     {
  1238.       m_lDay = m_Ts.GetTotalDays();
  1239.       m_nHour = m_Ts.GetHours();
  1240.       m_nMinute = m_Ts.GetMinutes();
  1241.       if (!(m_dwFlags & DT_NOSECONDS))
  1242.         m_nSecond = m_Ts.GetSeconds();
  1243.     }
  1244.   }
  1245.  
  1246.     //{{AFX_DATA_MAP(CCLTimeSpanDHMSMPage)
  1247.     DDX_Control(pDX, IDC_UPDOWN_SECOND, m_SpinSecond);
  1248.     DDX_Control(pDX, IDC_UPDOWN_MINUTE, m_SpinMinute);
  1249.     DDX_Control(pDX, IDC_UPDOWN_HOUR, m_SpinHour);
  1250.     DDX_Control(pDX, IDC_UPDOWN_DAY, m_SpinDay);
  1251.     DDX_Text(pDX, IDC_DAY, m_lDay);
  1252.     DDX_Text(pDX, IDC_HOUR, m_nHour);
  1253.     DDV_MinMaxUInt(pDX, m_nHour, 0, 23);
  1254.     DDX_Text(pDX, IDC_MINUTE, m_nMinute);
  1255.     DDV_MinMaxUInt(pDX, m_nMinute, 0, 59);
  1256.     DDX_Text(pDX, IDC_SECOND, m_nSecond);
  1257.     DDV_MinMaxUInt(pDX, m_nSecond, 0, 59);
  1258.     DDX_Check(pDX, IDC_INVALID, m_bInvalid);
  1259.     //}}AFX_DATA_MAP
  1260.  
  1261.   if (pDX->m_bSaveAndValidate)
  1262.   {
  1263.     if (m_bInvalid)
  1264.       m_Ts = CLTimeSpan();
  1265.     else
  1266.     {
  1267.       #ifdef _DEBUG
  1268.       BOOL bDoAsserts = CLTimeSpan::SetDoConstructorAsserts(FALSE);
  1269.       #endif
  1270.       m_Ts = CLTimeSpan(m_lDay, (WORD) m_nHour, (WORD) m_nMinute, (WORD) m_nSecond);
  1271.       #ifdef _DEBUG
  1272.       CLTimeSpan::SetDoConstructorAsserts(bDoAsserts);
  1273.       #endif
  1274.     }
  1275.   }
  1276.   else
  1277.   {
  1278.       //Enable / Disable controls
  1279.       OnInvalid();
  1280.   }
  1281. }
  1282.  
  1283.  
  1284. BOOL CCLTimeSpanDHMSMPage::OnInitDialog() 
  1285. {
  1286.     BOOL rVal = CDatePropertyPage::OnInitDialog();
  1287.  
  1288.     //Set the ranges for the spin controls
  1289.     m_SpinDay.SetRange(UD_MINVAL, UD_MAXVAL);
  1290.     m_SpinHour.SetRange(0, 23);
  1291.   m_SpinMinute.SetRange(0, 59);
  1292.   m_SpinSecond.SetRange(0, 59);
  1293.  
  1294.     //hide the invalid check box if required
  1295.     if (m_dwFlags & DT_ONLYVALID)
  1296.   {
  1297.     ASSERT(GetDlgItem(IDC_INVALID));
  1298.     ((CButton*) GetDlgItem(IDC_INVALID))->ShowWindow(SW_HIDE);
  1299.   }
  1300.  
  1301.   //hide the second edit if required
  1302.   if (m_dwFlags & DT_NOSECONDS)
  1303.   {
  1304.     ASSERT(GetDlgItem(IDC_SECOND));
  1305.     GetDlgItem(IDC_SECOND)->ShowWindow(SW_HIDE);
  1306.     m_SpinSecond.ShowWindow(SW_HIDE);
  1307.     ASSERT(GetDlgItem(IDC_SECOND_PROMPT));
  1308.     GetDlgItem(IDC_SECOND_PROMPT)->ShowWindow(SW_HIDE);
  1309.   }
  1310.  
  1311.     return rVal;
  1312. }
  1313.  
  1314.  
  1315. void CCLTimeSpanDHMSMPage::OnInvalid() 
  1316. {
  1317.     //if any of these assert then it is likely that the
  1318.     //wrong dialog template has been loaded or the 
  1319.   //correct one could not be found
  1320.     ASSERT(GetDlgItem(IDC_INVALID));
  1321.     ASSERT(GetDlgItem(IDC_DAY_PROMPT));
  1322.     ASSERT(GetDlgItem(IDC_DAY));
  1323.     ASSERT(GetDlgItem(IDC_HOUR_PROMPT));
  1324.     ASSERT(GetDlgItem(IDC_HOUR));
  1325.     ASSERT(GetDlgItem(IDC_MINUTE_PROMPT));
  1326.     ASSERT(GetDlgItem(IDC_MINUTE));
  1327.     ASSERT(GetDlgItem(IDC_SECOND_PROMPT));
  1328.     ASSERT(GetDlgItem(IDC_SECOND));
  1329.  
  1330.     BOOL bValid = !((CButton*) GetDlgItem(IDC_INVALID))->GetCheck();
  1331.     m_SpinDay.EnableWindow(bValid);
  1332.     m_SpinHour.EnableWindow(bValid);
  1333.     m_SpinMinute.EnableWindow(bValid);
  1334.     m_SpinSecond.EnableWindow(bValid);
  1335.  
  1336.     GetDlgItem(IDC_DAY_PROMPT)->EnableWindow(bValid);
  1337.     GetDlgItem(IDC_DAY)->EnableWindow(bValid);
  1338.     GetDlgItem(IDC_HOUR_PROMPT)->EnableWindow(bValid);
  1339.     GetDlgItem(IDC_HOUR)->EnableWindow(bValid);
  1340.     GetDlgItem(IDC_MINUTE_PROMPT)->EnableWindow(bValid);
  1341.     GetDlgItem(IDC_MINUTE)->EnableWindow(bValid);
  1342.     GetDlgItem(IDC_SECOND_PROMPT)->EnableWindow(bValid);
  1343.     GetDlgItem(IDC_SECOND)->EnableWindow(bValid);
  1344. }
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354. //////////////////////// CTimeFramePage implementation ////////////////
  1355.  
  1356. IMPLEMENT_DYNCREATE(CTimeFramePage, CDatePropertyPage)
  1357.  
  1358. BEGIN_MESSAGE_MAP(CTimeFramePage, CDatePropertyPage)
  1359.     //{{AFX_MSG_MAP(CTimeFramePage)
  1360.     //}}AFX_MSG_MAP
  1361. END_MESSAGE_MAP()
  1362.  
  1363.  
  1364. CTimeFramePage::CTimeFramePage() : CDatePropertyPage(CTimeFramePage::IDD)
  1365. {
  1366.     //{{AFX_DATA_INIT(CTimeFramePage)
  1367.     //}}AFX_DATA_INIT
  1368.   m_TimeFrame = UCT;
  1369.   m_bInvalid = FALSE;
  1370. }
  1371.  
  1372.  
  1373. CTimeFramePage::~CTimeFramePage()
  1374. {
  1375. }
  1376.  
  1377.  
  1378. void CTimeFramePage::DoDataExchange(CDataExchange* pDX)
  1379. {
  1380.     CDatePropertyPage::DoDataExchange(pDX);
  1381.  
  1382.     //{{AFX_DATA_MAP(CCDateDOMTimeFramePage)
  1383.     //}}AFX_DATA_MAP
  1384.  
  1385.   DDX_CBData(pDX, IDC_TIMEFRAME, (DWORD&) m_TimeFrame);
  1386.  
  1387.     //Disable controls if required
  1388.     DisableIfInvalid();
  1389. }
  1390.  
  1391.  
  1392. BOOL CTimeFramePage::OnInitDialog() 
  1393. {
  1394.     //Add the strings for the Timeframe combo, ordering is
  1395.   //important, the same as the TimeFrame enum
  1396.     CComboBox* pTimeFrameCombo = (CComboBox*) GetDlgItem(IDC_TIMEFRAME);
  1397.     ASSERT(pTimeFrameCombo);
  1398.  
  1399.   CString sText;
  1400.   BOOL bSuccess;
  1401.   int nCurItem = 0;
  1402.   if (!(m_dwFlags & DT_NOUCT_TIMEFRAME))
  1403.   {
  1404.     bSuccess = sText.LoadString(IDS_UCT);
  1405.     ASSERT(bSuccess);
  1406.       pTimeFrameCombo->AddString(sText);
  1407.     pTimeFrameCombo->SetItemData(nCurItem, UCT);
  1408.     nCurItem++;
  1409.   }
  1410.  
  1411.   if (!(m_dwFlags & DT_NOET_TIMEFRAME))
  1412.   {
  1413.     bSuccess = sText.LoadString(IDS_ET);
  1414.     ASSERT(bSuccess);
  1415.       pTimeFrameCombo->AddString(sText);
  1416.     pTimeFrameCombo->SetItemData(nCurItem, ET);
  1417.     nCurItem++;
  1418.   }
  1419.  
  1420.   if (!(m_dwFlags & DT_NOLOCAL_TIMEFRAME))
  1421.   {
  1422.     bSuccess = sText.LoadString(IDS_LOCAL);
  1423.     ASSERT(bSuccess);
  1424.       pTimeFrameCombo->AddString(sText);
  1425.     pTimeFrameCombo->SetItemData(nCurItem, LOCAL);
  1426.     nCurItem++;
  1427.   }
  1428.  
  1429.   //Call up to the parent
  1430.     return CDatePropertyPage::OnInitDialog();
  1431. }
  1432.  
  1433.  
  1434. void CTimeFramePage::DisableIfInvalid() 
  1435. {
  1436.     //if any of these assert then it is likely that the
  1437.     //wrong dialog template has been loaded or the 
  1438.   //correct one could not be found
  1439.     ASSERT(GetDlgItem(IDC_TIMEFRAME));
  1440.  
  1441.     GetDlgItem(IDC_TIMEFRAME)->EnableWindow(!m_bInvalid);
  1442.  
  1443.   //If there is only one choice for the timeframe, disable the timeframe combo
  1444.     CComboBox* pTimeFrameCombo = (CComboBox*) GetDlgItem(IDC_TIMEFRAME);
  1445.     ASSERT(pTimeFrameCombo);
  1446.  
  1447.   if (pTimeFrameCombo->GetCount() == 1)
  1448.     GetDlgItem(IDC_TIMEFRAME)->EnableWindow(FALSE);
  1449. }
  1450.  
  1451.  
  1452. BOOL CTimeFramePage::OnSetActive() 
  1453. {
  1454.     BOOL rVal = CDatePropertyPage::OnSetActive();
  1455.  
  1456.   //inform the sheet of the change
  1457.   CWnd* pWnd = GetParent();
  1458.   ASSERT(pWnd);
  1459.     pWnd->PostMessage(UWM_TIMEFRAME_NOTIFY);
  1460.  
  1461.   return rVal;
  1462. }
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472. //////////////////////// CCDateSheet implementation ///////////////////////////
  1473.  
  1474. IMPLEMENT_DYNAMIC(CCDateSheet, CDatePropertySheet)
  1475.  
  1476. BEGIN_MESSAGE_MAP(CCDateSheet, CDatePropertySheet)
  1477.     //{{AFX_MSG_MAP(CCDateSheet)
  1478.     ON_COMMAND(ID_DOM, OnDOMFormat)
  1479.     ON_COMMAND(ID_DOY, OnDOYFormat)
  1480.     ON_COMMAND(ID_WOM, OnWOMFormat)
  1481.     ON_COMMAND(ID_WOY, OnWOYFormat)
  1482.     //}}AFX_MSG_MAP
  1483. END_MESSAGE_MAP()
  1484.  
  1485.  
  1486. CCDateSheet::CCDateSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1487.     :CDatePropertySheet(nIDCaption, pParentWnd, iSelectPage, dwFlags)
  1488. {
  1489.   AddPage(&m_DOMPage);
  1490.   m_DOMPage.SetFlags(dwFlags);
  1491.   m_DOYPage.SetFlags(dwFlags);
  1492.   m_WOMPage.SetFlags(dwFlags);
  1493.   m_WOYPage.SetFlags(dwFlags);
  1494.     m_DateCurrPage = DOMPage;
  1495. }
  1496.  
  1497.  
  1498. CCDateSheet::CCDateSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1499.     :CDatePropertySheet(pszCaption, pParentWnd, iSelectPage, dwFlags)
  1500. {
  1501.   AddPage(&m_DOMPage);
  1502.   m_DOMPage.SetFlags(dwFlags);
  1503.   m_DOYPage.SetFlags(dwFlags);
  1504.   m_WOMPage.SetFlags(dwFlags);
  1505.   m_WOYPage.SetFlags(dwFlags);
  1506.     m_DateCurrPage = DOMPage;
  1507. }
  1508.  
  1509.  
  1510. CCDateSheet::~CCDateSheet()
  1511. {
  1512. }
  1513.  
  1514.  
  1515. void CCDateSheet::SetCDate(const CDate& date)
  1516.   m_DOMPage.SetDate(date); 
  1517.   m_WOMPage.SetDate(date); 
  1518.   m_WOYPage.SetDate(date); 
  1519.   m_DOYPage.SetDate(date); 
  1520. }
  1521.  
  1522.  
  1523. void CCDateSheet::OnDOMFormat() 
  1524. {
  1525.   BOOL bUpdateOk;
  1526.   switch (m_DateCurrPage)
  1527.   {
  1528.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1529.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1530.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1531.     default:  return; break;
  1532.   }
  1533.  
  1534.   if (bUpdateOk)
  1535.   {
  1536.     SetRedraw(FALSE);
  1537.     AddPage(&m_DOMPage);
  1538.     switch (m_DateCurrPage)
  1539.     {
  1540.       case DOYPage: m_DOMPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1541.       case WOMPage: m_DOMPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1542.       case WOYPage: m_DOMPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1543.       default:  ASSERT(FALSE); break;
  1544.     }
  1545.       m_DateCurrPage = DOMPage;
  1546.     SetRedraw(TRUE);
  1547.     Invalidate();
  1548.   }
  1549.  
  1550. }
  1551.  
  1552.  
  1553. void CCDateSheet::OnDOYFormat() 
  1554. {
  1555.   BOOL bUpdateOk;
  1556.   switch (m_DateCurrPage)
  1557.   {
  1558.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1559.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1560.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1561.     default:  return; break;
  1562.   }
  1563.  
  1564.   if (bUpdateOk)
  1565.   {
  1566.       SetRedraw(FALSE);
  1567.     AddPage(&m_DOYPage);
  1568.       switch (m_DateCurrPage)
  1569.     {
  1570.       case DOMPage: m_DOYPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1571.       case WOMPage: m_DOYPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1572.       case WOYPage: m_DOYPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1573.       default:  ASSERT(FALSE); break;
  1574.     }
  1575.       m_DateCurrPage = DOYPage;
  1576.       SetRedraw(TRUE);
  1577.       Invalidate();
  1578.   }
  1579. }
  1580.  
  1581.  
  1582. void CCDateSheet::OnWOMFormat() 
  1583. {
  1584.   BOOL bUpdateOk;
  1585.   switch (m_DateCurrPage)
  1586.   {
  1587.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1588.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1589.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1590.     default:  return; break;
  1591.   }
  1592.  
  1593.   if (bUpdateOk)
  1594.   {
  1595.       SetRedraw(FALSE);
  1596.     AddPage(&m_WOMPage);
  1597.       switch (m_DateCurrPage)
  1598.     {
  1599.       case DOMPage: m_WOMPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1600.       case DOYPage: m_WOMPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1601.       case WOYPage: m_WOMPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1602.       default:  ASSERT(FALSE); break;
  1603.     }
  1604.       m_DateCurrPage = WOMPage;
  1605.     SetRedraw(TRUE);
  1606.     Invalidate();
  1607.   }
  1608. }
  1609.  
  1610.  
  1611. void CCDateSheet::OnWOYFormat() 
  1612. {
  1613.   BOOL bUpdateOk;
  1614.   switch (m_DateCurrPage)
  1615.   {
  1616.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1617.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1618.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1619.     default:  return; break;
  1620.   }
  1621.  
  1622.   if (bUpdateOk)
  1623.   {
  1624.       SetRedraw(FALSE);
  1625.     AddPage(&m_WOYPage);
  1626.       switch (m_DateCurrPage)
  1627.     {
  1628.       case DOMPage: m_WOYPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1629.       case WOMPage: m_WOYPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1630.       case DOYPage: m_WOYPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1631.       default:  ASSERT(FALSE); break;
  1632.     }
  1633.       m_DateCurrPage = WOYPage;
  1634.     SetRedraw(TRUE);
  1635.     Invalidate();
  1636.   }
  1637. }
  1638.  
  1639.  
  1640. CDate CCDateSheet::GetCDate() const
  1641. {
  1642.   CDate rVal;
  1643.  
  1644.   switch (m_DateCurrPage)
  1645.   {
  1646.     case DOMPage: rVal = m_DOMPage.GetDate(); break;
  1647.     case DOYPage: rVal = m_DOYPage.GetDate(); break;
  1648.     case WOMPage: rVal = m_WOMPage.GetDate(); break;
  1649.     case WOYPage: rVal = m_WOYPage.GetDate(); break;
  1650.     default:  ASSERT(FALSE); break;
  1651.   }
  1652.  
  1653.   return rVal;
  1654. }
  1655.  
  1656.  
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662.  
  1663.  
  1664. //////////////////////// CCLDateSheet implementation //////////////////////////
  1665.  
  1666.  
  1667. IMPLEMENT_DYNAMIC(CCLDateSheet, CDatePropertySheet)
  1668.  
  1669. BEGIN_MESSAGE_MAP(CCLDateSheet, CDatePropertySheet)
  1670.     //{{AFX_MSG_MAP(CCLDateSheet)
  1671.     ON_COMMAND(ID_DOM, OnDOMFormat)
  1672.     ON_COMMAND(ID_DOY, OnDOYFormat)
  1673.     ON_COMMAND(ID_WOM, OnWOMFormat)
  1674.     ON_COMMAND(ID_WOY, OnWOYFormat)
  1675.     //}}AFX_MSG_MAP
  1676.   ON_MESSAGE(UWM_TIMEOFDAY_NOTIFY, OnTimeOfDayNotify)
  1677.   ON_MESSAGE(UWM_TIMEFRAME_NOTIFY, OnTimeFrameNotify)
  1678. END_MESSAGE_MAP()
  1679.  
  1680.  
  1681.  
  1682. CCLDateSheet::CCLDateSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1683.     :CDatePropertySheet(nIDCaption, pParentWnd, iSelectPage, dwFlags)
  1684. {
  1685.   AddPage(&m_DOMPage);
  1686.   m_DOMPage.SetFlags(dwFlags);
  1687.   m_DOYPage.SetFlags(dwFlags);
  1688.   m_WOMPage.SetFlags(dwFlags);
  1689.   m_WOYPage.SetFlags(dwFlags);
  1690.   AddPage(&m_HMSMPage);
  1691.   m_HMSMPage.SetFlags(dwFlags);
  1692.  
  1693.   if (!((m_dwFlags & DT_NOET_TIMEFRAME) && 
  1694.       (m_dwFlags & DT_NOUCT_TIMEFRAME) &&
  1695.       (m_dwFlags & DT_NOLOCAL_TIMEFRAME)))
  1696.   {
  1697.     AddPage(&m_TimeFramePage);
  1698.     m_TimeFramePage.SetFlags(dwFlags);
  1699.   }
  1700.  
  1701.     m_DateCurrPage = DOMPage;
  1702.   m_HMSMPage.SetShowInvalidCheck(FALSE);
  1703. }
  1704.  
  1705.  
  1706. CCLDateSheet::CCLDateSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1707.     :CDatePropertySheet(pszCaption, pParentWnd, iSelectPage, dwFlags)
  1708. {
  1709.   AddPage(&m_DOMPage);
  1710.   m_DOMPage.SetFlags(dwFlags);
  1711.   m_DOYPage.SetFlags(dwFlags);
  1712.   m_WOMPage.SetFlags(dwFlags);
  1713.   m_WOYPage.SetFlags(dwFlags);
  1714.   AddPage(&m_HMSMPage);
  1715.   m_HMSMPage.SetFlags(dwFlags);
  1716.   AddPage(&m_TimeFramePage);
  1717.   m_TimeFramePage.SetFlags(dwFlags);
  1718.  
  1719.     m_DateCurrPage = DOMPage;
  1720.   m_HMSMPage.SetShowInvalidCheck(FALSE);
  1721. }
  1722.  
  1723.  
  1724. CCLDateSheet::~CCLDateSheet()
  1725. {
  1726. }
  1727.  
  1728.  
  1729. LRESULT CCLDateSheet::OnTimeOfDayNotify(WPARAM /*wParam*/, LPARAM /*lParam*/)
  1730. {
  1731.   BOOL bPrevInvalid;
  1732.   switch (m_DateCurrPage)
  1733.   {
  1734.     case DOMPage: bPrevInvalid = !m_DOMPage.GetDate().IsValid(); break;
  1735.     case DOYPage: bPrevInvalid = !m_DOYPage.GetDate().IsValid(); break;
  1736.     case WOMPage: bPrevInvalid = !m_WOMPage.GetDate().IsValid(); break;
  1737.     case WOYPage: bPrevInvalid = !m_WOYPage.GetDate().IsValid(); break;
  1738.     default:  ASSERT(FALSE); break;
  1739.   }
  1740.  
  1741.   if (bPrevInvalid)
  1742.     m_HMSMPage.SetTimeOfDay(CLTimeOfDay());
  1743.   else
  1744.     m_HMSMPage.MarkAsValid();
  1745.   m_HMSMPage.UpdateData(FALSE);
  1746.  
  1747.   return 0L;
  1748. }
  1749.  
  1750.  
  1751. LRESULT CCLDateSheet::OnTimeFrameNotify(WPARAM /*wParam*/, LPARAM /*lParam*/)
  1752. {
  1753.   BOOL bPrevInvalid;
  1754.   switch (m_DateCurrPage)
  1755.   {
  1756.     case DOMPage: bPrevInvalid = !m_DOMPage.GetDate().IsValid(); break;
  1757.     case DOYPage: bPrevInvalid = !m_DOYPage.GetDate().IsValid(); break;
  1758.     case WOMPage: bPrevInvalid = !m_WOMPage.GetDate().IsValid(); break;
  1759.     case WOYPage: bPrevInvalid = !m_WOYPage.GetDate().IsValid(); break;
  1760.     default:  ASSERT(FALSE); break;
  1761.   }
  1762.  
  1763.   m_TimeFramePage.SetInvalid(bPrevInvalid);
  1764.   m_TimeFramePage.UpdateData(FALSE);
  1765.  
  1766.   return 0L;
  1767. }
  1768.  
  1769.  
  1770. CLDate CCLDateSheet::GetCLDate() const
  1771. {
  1772.   CDate date;
  1773.   switch (m_DateCurrPage)
  1774.   {
  1775.     case DOMPage: date = m_DOMPage.GetDate(); break;
  1776.     case DOYPage: date = m_DOYPage.GetDate(); break;
  1777.     case WOMPage: date = m_WOMPage.GetDate(); break;
  1778.     case WOYPage: date = m_WOYPage.GetDate(); break;
  1779.     default:  ASSERT(FALSE); break;
  1780.   }
  1781.  
  1782.   TimeFrame tf = m_TimeFramePage.GetTimeFrame();
  1783.   CLTimeOfDay Tod = m_HMSMPage.GetTimeOfDay();
  1784.   return CLDate(date, Tod, tf);
  1785. }
  1786.  
  1787.  
  1788. void CCLDateSheet::SetCLDate(const CLDate& date)
  1789.   m_DOMPage.SetDate(date.GetCDate()); 
  1790.   m_WOMPage.SetDate(date.GetCDate()); 
  1791.   m_WOYPage.SetDate(date.GetCDate()); 
  1792.   m_DOYPage.SetDate(date.GetCDate());
  1793.   m_HMSMPage.SetTimeOfDay(date.GetCLTimeOfDay());
  1794.   if (date.IsValid())
  1795.     m_TimeFramePage.SetTimeFrame(date.GetTimeFrame());
  1796.   else
  1797.     m_TimeFramePage.SetTimeFrame(UCT);
  1798. }
  1799.  
  1800.  
  1801. void CCLDateSheet::OnDOMFormat()
  1802. {
  1803.   BOOL bUpdateOk;
  1804.   switch (m_DateCurrPage)
  1805.   {
  1806.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1807.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1808.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1809.     default:  return; break;
  1810.   }
  1811.  
  1812.   if (bUpdateOk)
  1813.   {
  1814.       SetRedraw(FALSE);
  1815.     RemovePage(&m_HMSMPage);
  1816.     RemovePage(&m_TimeFramePage);
  1817.     AddPage(&m_DOMPage);
  1818.     AddPage(&m_HMSMPage);
  1819.     AddPage(&m_TimeFramePage);
  1820.     switch (m_DateCurrPage)
  1821.     {
  1822.       case DOYPage: m_DOMPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1823.       case WOMPage: m_DOMPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1824.       case WOYPage: m_DOMPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1825.       default:  ASSERT(FALSE); break;
  1826.     }
  1827.       m_DateCurrPage = DOMPage;
  1828.     SetRedraw(TRUE);
  1829.     Invalidate();
  1830.   }
  1831. }
  1832.  
  1833.  
  1834. void CCLDateSheet::OnDOYFormat()
  1835. {
  1836.   BOOL bUpdateOk;
  1837.   switch (m_DateCurrPage)
  1838.   {
  1839.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1840.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1841.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1842.     default:  return; break;
  1843.   }
  1844.  
  1845.   if (bUpdateOk)
  1846.   {
  1847.       SetRedraw(FALSE);
  1848.     RemovePage(&m_HMSMPage);
  1849.     RemovePage(&m_TimeFramePage);
  1850.     AddPage(&m_DOYPage);
  1851.     AddPage(&m_HMSMPage);
  1852.     AddPage(&m_TimeFramePage);
  1853.       switch (m_DateCurrPage)
  1854.     {
  1855.       case DOMPage: m_DOYPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1856.       case WOMPage: m_DOYPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1857.       case WOYPage: m_DOYPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1858.       default:  ASSERT(FALSE); break;
  1859.     }
  1860.       m_DateCurrPage = DOYPage;
  1861.       SetRedraw(TRUE);
  1862.       Invalidate();
  1863.   }
  1864. }
  1865.  
  1866.  
  1867. void CCLDateSheet::OnWOMFormat()
  1868. {
  1869.   BOOL bUpdateOk;
  1870.   switch (m_DateCurrPage)
  1871.   {
  1872.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1873.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1874.     case WOYPage: bUpdateOk = m_WOYPage.UpdateData(); break;
  1875.     default:  return; break;
  1876.   }
  1877.  
  1878.   if (bUpdateOk)
  1879.   {
  1880.       SetRedraw(FALSE);
  1881.     RemovePage(&m_HMSMPage);
  1882.     RemovePage(&m_TimeFramePage);
  1883.     AddPage(&m_WOMPage);
  1884.     AddPage(&m_HMSMPage);
  1885.     AddPage(&m_TimeFramePage);
  1886.       switch (m_DateCurrPage)
  1887.     {
  1888.       case DOMPage: m_WOMPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1889.       case DOYPage: m_WOMPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1890.       case WOYPage: m_WOMPage.SetDate(m_WOYPage.GetDate()); RemovePage(&m_WOYPage); break;
  1891.       default:  ASSERT(FALSE); break;
  1892.     }
  1893.       m_DateCurrPage = WOMPage;
  1894.     SetRedraw(TRUE);
  1895.     Invalidate();
  1896.   }
  1897. }
  1898.  
  1899.  
  1900. void CCLDateSheet::OnWOYFormat()
  1901. {
  1902.   BOOL bUpdateOk;
  1903.   switch (m_DateCurrPage)
  1904.   {
  1905.     case DOMPage: bUpdateOk = m_DOMPage.UpdateData(); break;
  1906.     case WOMPage: bUpdateOk = m_WOMPage.UpdateData(); break;
  1907.     case DOYPage: bUpdateOk = m_DOYPage.UpdateData(); break;
  1908.     default:  return; break;
  1909.   }
  1910.  
  1911.   if (bUpdateOk)
  1912.   {
  1913.       SetRedraw(FALSE);
  1914.     RemovePage(&m_HMSMPage);
  1915.     RemovePage(&m_TimeFramePage);
  1916.     AddPage(&m_WOYPage);
  1917.     AddPage(&m_HMSMPage);
  1918.     AddPage(&m_TimeFramePage);
  1919.       switch (m_DateCurrPage)
  1920.     {
  1921.       case DOMPage: m_WOYPage.SetDate(m_DOMPage.GetDate()); RemovePage(&m_DOMPage); break;
  1922.       case WOMPage: m_WOYPage.SetDate(m_WOMPage.GetDate()); RemovePage(&m_WOMPage); break;
  1923.       case DOYPage: m_WOYPage.SetDate(m_DOYPage.GetDate()); RemovePage(&m_DOYPage); break;
  1924.       default:  ASSERT(FALSE); break;
  1925.     }
  1926.       m_DateCurrPage = WOYPage;
  1927.     SetRedraw(TRUE);
  1928.     Invalidate();
  1929.   }
  1930. }
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943. //////////////////////// CCLTimeOfDaySheet implementation /////////////////////
  1944.  
  1945. IMPLEMENT_DYNAMIC(CCLTimeOfDaySheet, CDatePropertySheet)
  1946.  
  1947. BEGIN_MESSAGE_MAP(CCLTimeOfDaySheet, CDatePropertySheet)
  1948.     //{{AFX_MSG_MAP(CCLTimeOfDaySheet)
  1949.     //}}AFX_MSG_MAP
  1950.   ON_MESSAGE(UWM_TIMEOFDAY_NOTIFY, OnTimeOfDayNotify)
  1951. END_MESSAGE_MAP()
  1952.  
  1953.  
  1954. CCLTimeOfDaySheet::CCLTimeOfDaySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1955.     :CDatePropertySheet(nIDCaption, pParentWnd, iSelectPage, dwFlags)
  1956. {
  1957.   AddPage(&m_HMSMPage);
  1958.   m_HMSMPage.SetFlags(dwFlags);
  1959. }
  1960.  
  1961.  
  1962. CCLTimeOfDaySheet::CCLTimeOfDaySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  1963.     :CDatePropertySheet(pszCaption, pParentWnd, iSelectPage, dwFlags)
  1964. {
  1965.   AddPage(&m_HMSMPage);
  1966.   m_HMSMPage.SetFlags(dwFlags);
  1967. }
  1968.  
  1969.  
  1970. CCLTimeOfDaySheet::~CCLTimeOfDaySheet()
  1971. {
  1972. }
  1973.  
  1974.  
  1975. void CCLTimeOfDaySheet::SetCLTimeOfDay(const CLTimeOfDay& Tod)
  1976.   m_HMSMPage.SetTimeOfDay(Tod);
  1977. }
  1978.  
  1979.  
  1980. LRESULT CCLTimeOfDaySheet::OnTimeOfDayNotify(WPARAM /*wParam*/, LPARAM /*lParam*/)
  1981. {
  1982.   return 0L;
  1983. }
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.  
  1993.  
  1994. //////////////////////// CCLTimeSpanSheet implementation //////////////////////
  1995.  
  1996. IMPLEMENT_DYNAMIC(CCLTimeSpanSheet, CDatePropertySheet)
  1997.  
  1998. BEGIN_MESSAGE_MAP(CCLTimeSpanSheet, CDatePropertySheet)
  1999.     //{{AFX_MSG_MAP(CCLTimeSpanSheet)
  2000.     //}}AFX_MSG_MAP
  2001. END_MESSAGE_MAP()
  2002.  
  2003.  
  2004. CCLTimeSpanSheet::CCLTimeSpanSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  2005.     :CDatePropertySheet(nIDCaption, pParentWnd, iSelectPage, dwFlags)
  2006. {
  2007.   AddPage(&m_DHMSMPage);
  2008.   m_DHMSMPage.SetFlags(dwFlags);
  2009. }
  2010.  
  2011.  
  2012. CCLTimeSpanSheet::CCLTimeSpanSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage, DWORD dwFlags)
  2013.     :CDatePropertySheet(pszCaption, pParentWnd, iSelectPage, dwFlags)
  2014. {
  2015.   AddPage(&m_DHMSMPage);
  2016.   m_DHMSMPage.SetFlags(dwFlags);
  2017. }
  2018.  
  2019.  
  2020. CCLTimeSpanSheet::~CCLTimeSpanSheet()
  2021. {
  2022. }
  2023.  
  2024.  
  2025. void CCLTimeSpanSheet::SetCLTimeSpan(const CLTimeSpan& Ts)
  2026.   m_DHMSMPage.SetTimeSpan(Ts);
  2027. }
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039. //////////////////////// CDateButton implementation ///////////////////////////
  2040.  
  2041. BEGIN_MESSAGE_MAP(CDateButton, CButton)
  2042.   //{{AFX_MSG_MAP(CDateButton)
  2043.   ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
  2044.   //}}AFX_MSG_MAP
  2045. END_MESSAGE_MAP()
  2046.  
  2047.         
  2048. CDateButton::CDateButton()
  2049. {
  2050.   m_pBuddy = NULL;
  2051.   m_bFirstCall = TRUE;
  2052. }
  2053.  
  2054.  
  2055. CDateButton::~CDateButton()
  2056. {
  2057. }
  2058.  
  2059.  
  2060. void CDateButton::SetBuddy(CWnd* pBuddy)
  2061. {
  2062.   m_pBuddy = pBuddy;
  2063. }
  2064.  
  2065.  
  2066. BOOL CDateButton::PreTranslateMessage(MSG* pMsg) 
  2067. {                     
  2068.   //create the tooltip
  2069.   if (m_bFirstCall)
  2070.   {
  2071.     m_ToolTip.Create(this);
  2072.     m_ToolTip.Activate(TRUE);
  2073.     m_ToolTip.AddTool(this, IDS_TT_MODIFY);
  2074.     m_bFirstCall = FALSE;
  2075.   }
  2076.   
  2077.   //give the tooltip a chance to handle the message
  2078.   m_ToolTip.RelayEvent(pMsg);
  2079.  
  2080.   return CButton::PreTranslateMessage(pMsg);
  2081. }
  2082.  
  2083.  
  2084. void CDateButton::OnClicked() 
  2085. {
  2086.   if (m_pBuddy)
  2087.     m_pBuddy->PostMessage(UWM_BN_CLICKED);
  2088.   else
  2089.     TRACE0("CDateButton: No auto buddy defined\n");
  2090. }                        
  2091.  
  2092.                      
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099. //////////////////////// CDateTimeControl implementation //////////////////////
  2100.  
  2101.  
  2102. BEGIN_MESSAGE_MAP(CDateTimeControl, CStatic)
  2103.   //{{AFX_MSG_MAP(CDateTimeControl)
  2104.   //}}AFX_MSG_MAP
  2105. END_MESSAGE_MAP()
  2106.  
  2107.  
  2108. CDateTimeControl::CDateTimeControl()
  2109. {
  2110.   m_bSubclassed = FALSE;
  2111. }
  2112.  
  2113.  
  2114. CDateTimeControl::~CDateTimeControl()
  2115. {
  2116. }
  2117.  
  2118.  
  2119. BOOL CDateTimeControl::SubclassEdit(UINT iCtlID, CWnd* pParentWnd)
  2120. {
  2121.   //test our inputs
  2122.   ASSERT(this);
  2123.   if (!iCtlID || ! pParentWnd)
  2124.   {
  2125.     ASSERT(FALSE);
  2126.     TRACE0("CDateTimeControl::SubclassEdit -- Control iD or parent window class is invalid!\n");
  2127.     return FALSE;
  2128.   }                
  2129.   
  2130.   //this can only work if it's on a form view or dialog
  2131.   if (pParentWnd->IsKindOf(RUNTIME_CLASS(CFormView)) ||
  2132.      pParentWnd->IsKindOf(RUNTIME_CLASS(CDialog)))
  2133.   {
  2134.     //subclass the control
  2135.     if (SubclassDlgItem(iCtlID, pParentWnd))
  2136.     {
  2137.       m_bSubclassed = TRUE;
  2138.  
  2139.       //This control can only be used with a read only edit control
  2140.       LONG lStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
  2141.       if (!(lStyle & ES_READONLY))
  2142.       {
  2143.         TRACE0("CDateTimeControl::SubclassEdit -- ES_READONLY style should be set for the edit control\n");
  2144.         ASSERT(FALSE);
  2145.         return FALSE;
  2146.       }
  2147.  
  2148.       return AddEditButton();
  2149.     }
  2150.     else
  2151.     {
  2152.       TRACE0("CDateTimeControl::SubclassEdit -- Could not subclass edit control!\n");
  2153.       ASSERT(FALSE);
  2154.       return FALSE;
  2155.     }
  2156.   }
  2157.   else    //parent is not of CDialog or CFormView class
  2158.   {  
  2159.     TRACE0("CDateTimeControl::SubclassEdit -- Parent class is not a CFormView or CDialog!\n");
  2160.     return FALSE;
  2161.   }  
  2162. }
  2163.  
  2164.  
  2165. BOOL CDateTimeControl::SubclassEdit(HWND hEdit)
  2166. {   
  2167.   //test our inputs
  2168.   ASSERT(this);
  2169.   if (!IsWindow(hEdit))
  2170.   {
  2171.     ASSERT(FALSE);
  2172.     TRACE0("CDateTimeControl::SubclassEdit -- window handle is invalid!\n");
  2173.     return FALSE;
  2174.   }                
  2175.   
  2176.   //subclass the control
  2177.   if (SubclassWindow(hEdit))
  2178.   {
  2179.     m_bSubclassed = TRUE;
  2180.     
  2181.     //This control can only be used with a read only edit control
  2182.     LONG lStyle = GetWindowLong(GetSafeHwnd(), GWL_STYLE);
  2183.     if (!(lStyle & ES_READONLY))
  2184.     {
  2185.       TRACE0("CDateTimeControl::SubclassEdit -- ES_READONLY style should be set for the edit control\n");
  2186.       return FALSE;
  2187.     }
  2188.  
  2189.     return AddEditButton();
  2190.   }
  2191.   else
  2192.   {
  2193.     TRACE0("CDateTimeControl::SubclassEdit -- Could not subclass static control!\n");
  2194.     return FALSE;
  2195.   }
  2196. }
  2197.  
  2198.  
  2199. BOOL CDateTimeControl::AddEditButton()
  2200. {
  2201.   CRect Rect;
  2202.   GetWindowRect(Rect);
  2203.   GetParent()->ScreenToClient(Rect);
  2204.   Rect.left = Rect.right;
  2205.   Rect.right = Rect.left + (Rect.Height()*8/10);  //width is 8/10 of height
  2206.  
  2207.   //dynamically create the edit control
  2208.   CString sEditControlText;
  2209.   if (!sEditControlText.LoadString(IDS_EDIT_TEXT))
  2210.     ASSERT(FALSE);
  2211.   BOOL bSuccess = m_Edit.Create(sEditControlText, WS_VISIBLE | WS_CHILD | WS_GROUP, 
  2212.                                 Rect, GetParent(), DTIME_EDIT_CONTROL_ID);
  2213.  
  2214.   //tell the button to send click notifications to this window
  2215.   m_Edit.SetBuddy(this);
  2216.  
  2217.   //ensure it is using the same font as the parent
  2218.   m_Edit.SetFont(GetParent()->GetFont());
  2219.  
  2220.   return bSuccess;
  2221. }
  2222.  
  2223.  
  2224.  
  2225.  
  2226.  
  2227.  
  2228.  
  2229.  
  2230.  
  2231. //////////////////////// CDateControl implementation //////////////////////////
  2232.  
  2233. BEGIN_MESSAGE_MAP(CDateControl, CDateTimeControl)
  2234.   //{{AFX_MSG_MAP(CDateControl)
  2235.   ON_MESSAGE(UWM_BN_CLICKED, OnEditClick)
  2236.   //}}AFX_MSG_MAP
  2237. END_MESSAGE_MAP()
  2238.  
  2239.  
  2240. CDateControl::CDateControl()
  2241. {
  2242. }
  2243.  
  2244.  
  2245. CDateControl::~CDateControl()
  2246. {
  2247. }
  2248.  
  2249.  
  2250. LRESULT CDateControl::OnEditClick(WPARAM /*wParam*/, LPARAM /*lParam*/)
  2251. {
  2252.     CCDateSheet dlg(IDS_ENTER_CDATE, NULL, 0, m_dwFlags);
  2253.   dlg.SetCDate(m_Value);
  2254.   if (dlg.DoModal() == IDOK)
  2255.     SetValue(dlg.GetCDate());
  2256.  
  2257.   return 0;
  2258. }
  2259.  
  2260.  
  2261. void CDateControl::SetValue(const CDate& value)
  2262. {
  2263.   m_Value = value;
  2264.   SetWindowText(m_Value.Format());
  2265. }
  2266.  
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273. //////////////////////// CCLTimeSpanControl implementation ////////////////////
  2274.  
  2275. BEGIN_MESSAGE_MAP(CLTimeSpanControl, CDateTimeControl)
  2276.   //{{AFX_MSG_MAP(CLTimeSpanControl)
  2277.   ON_MESSAGE(UWM_BN_CLICKED, OnEditClick)
  2278.   //}}AFX_MSG_MAP
  2279. END_MESSAGE_MAP()
  2280.  
  2281.  
  2282. CLTimeSpanControl::CLTimeSpanControl()
  2283. {
  2284. }
  2285.  
  2286.  
  2287. CLTimeSpanControl::~CLTimeSpanControl()
  2288. {
  2289. }
  2290.  
  2291.  
  2292. LRESULT CLTimeSpanControl::OnEditClick(WPARAM /*wParam*/, LPARAM /*lParam*/)
  2293. {
  2294.     CCLTimeSpanSheet dlg(IDS_ENTER_CLTIMESPAN, NULL, 0, m_dwFlags);
  2295.   dlg.SetCLTimeSpan(m_Value);
  2296.   if (dlg.DoModal() == IDOK)
  2297.     SetValue(dlg.GetCLTimeSpan());
  2298.  
  2299.   return 0;
  2300. }
  2301.  
  2302.  
  2303. void CLTimeSpanControl::SetValue(const CLTimeSpan& value)
  2304. {
  2305.   m_Value = value;
  2306.  
  2307.   if (m_dwFlags & DT_NOSECONDS)
  2308.     SetWindowText(m_Value.Format(DTF_NOSECOND));
  2309.   else
  2310.     SetWindowText(m_Value.Format());
  2311. }
  2312.  
  2313.  
  2314.  
  2315.  
  2316.  
  2317.  
  2318. //////////////////////// CCLTimeOfDayControl implementation ///////////////////
  2319.  
  2320. BEGIN_MESSAGE_MAP(CLTimeOfDayControl, CDateTimeControl)
  2321.   //{{AFX_MSG_MAP(CLTimeOfDayControl)
  2322.   ON_MESSAGE(UWM_BN_CLICKED, OnEditClick)
  2323.   //}}AFX_MSG_MAP
  2324. END_MESSAGE_MAP()
  2325.  
  2326.  
  2327. CLTimeOfDayControl::CLTimeOfDayControl()
  2328. {
  2329. }
  2330.  
  2331.  
  2332. CLTimeOfDayControl::~CLTimeOfDayControl()
  2333. {
  2334. }
  2335.  
  2336.  
  2337. LRESULT CLTimeOfDayControl::OnEditClick(WPARAM /*wParam*/, LPARAM /*lParam*/)
  2338. {
  2339.     CCLTimeOfDaySheet dlg(IDS_ENTER_CLTIMEOFDAY, NULL, 0, m_dwFlags);
  2340.   dlg.SetCLTimeOfDay(m_Value);
  2341.   if (dlg.DoModal() == IDOK)
  2342.     SetValue(dlg.GetCLTimeOfDay());
  2343.  
  2344.   return 0;
  2345. }
  2346.  
  2347.  
  2348. void CLTimeOfDayControl::SetValue(const CLTimeOfDay& value)
  2349. {
  2350.   m_Value = value;
  2351.  
  2352.   if (m_dwFlags & DT_NOSECONDS)
  2353.     SetWindowText(m_Value.Format(DTF_NOSECOND));
  2354.   else
  2355.     SetWindowText(m_Value.Format());
  2356. }
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363. //////////////////////// CCLDateControl implementation ////////////////////////
  2364.  
  2365. BEGIN_MESSAGE_MAP(CLDateControl, CDateTimeControl)
  2366.   //{{AFX_MSG_MAP(CLDateControl)
  2367.   ON_MESSAGE(UWM_BN_CLICKED, OnEditClick)
  2368.   //}}AFX_MSG_MAP
  2369. END_MESSAGE_MAP()
  2370.  
  2371.  
  2372. CLDateControl::CLDateControl()
  2373. {
  2374. }
  2375.  
  2376.  
  2377. CLDateControl::~CLDateControl()
  2378. {
  2379. }
  2380.  
  2381.  
  2382. LRESULT CLDateControl::OnEditClick(WPARAM /*wParam*/, LPARAM /*lParam*/)
  2383. {
  2384.     CCLDateSheet dlg(IDS_ENTER_CLDATE, NULL, 0, m_dwFlags);
  2385.   dlg.SetCLDate(m_Value);
  2386.   if (dlg.DoModal() == IDOK)
  2387.     SetValue(dlg.GetCLDate());
  2388.  
  2389.   return 0;
  2390. }
  2391.  
  2392.  
  2393. void CLDateControl::SetValue(const CLDate& value)
  2394. {
  2395.   m_Value = value;
  2396.  
  2397.   DWORD dwFlags = 0;
  2398.   if (m_dwFlags & DT_NOSECONDS)
  2399.     dwFlags |= DTF_NOSECOND;
  2400.  
  2401.   if ((m_dwFlags & DT_NOET_TIMEFRAME) && 
  2402.       (m_dwFlags & DT_NOUCT_TIMEFRAME) &&
  2403.       (m_dwFlags & DT_NOLOCAL_TIMEFRAME))
  2404.     dwFlags |= DTF_NOTIMEFRAME;
  2405.  
  2406.  
  2407.   //If the Timeframe of the value being set 
  2408.   //is not allowed to be displayed then convert
  2409.   //the value to the allowable timeframe
  2410.   TimeFrame tf = m_Value.GetTimeFrame();
  2411.  
  2412.   if (tf == UCT)
  2413.   {
  2414.     if (m_dwFlags & DT_NOUCT_TIMEFRAME)
  2415.     {
  2416.       if (!(m_dwFlags & DT_NOLOCAL_TIMEFRAME))
  2417.       {
  2418.         TRACE0("Forced to modify timeframe of a CLDate to LOCAL during CLDateControl::SetValue!\n");
  2419.         m_Value.SetTimeFrame(LOCAL);
  2420.       }
  2421.       else if (!(m_dwFlags & DT_NOET_TIMEFRAME))
  2422.       {
  2423.         TRACE0("Forced to modify timeframe of a CLDate to ET during CLDateControl::SetValue!\n");
  2424.         m_Value.SetTimeFrame(ET);
  2425.       }
  2426.     }
  2427.   }
  2428.   else if (tf == LOCAL)
  2429.   {
  2430.     if (m_dwFlags & DT_NOLOCAL_TIMEFRAME)
  2431.     {
  2432.       if (!(m_dwFlags & DT_NOUCT_TIMEFRAME))
  2433.       {
  2434.         TRACE0("Forced to modify timeframe of a CLDate to UCT during CLDateControl::SetValue!\n");
  2435.         m_Value.SetTimeFrame(UCT);
  2436.       }
  2437.       else if (!(m_dwFlags & DT_NOET_TIMEFRAME))
  2438.       {
  2439.         TRACE0("Forced to modify timeframe of a CLDate to ET during CLDateControl::SetValue!\n");
  2440.         m_Value.SetTimeFrame(ET);
  2441.       }
  2442.     }
  2443.   }
  2444.   else if (tf == ET)
  2445.   {
  2446.     if (m_dwFlags & DT_NOET_TIMEFRAME)
  2447.     {
  2448.       if (!(m_dwFlags & DT_NOUCT_TIMEFRAME))
  2449.       {
  2450.         TRACE0("Forced to modify timeframe of a CLDate to UCT during CLDateControl::SetValue!\n");
  2451.         m_Value.SetTimeFrame(UCT);
  2452.       }
  2453.       else if (!(m_dwFlags & DT_NOLOCAL_TIMEFRAME))
  2454.       {
  2455.         TRACE0("Forced to modify timeframe of a CLDate to LOCAL during CLDateControl::SetValue!\n");
  2456.         m_Value.SetTimeFrame(LOCAL);
  2457.       }
  2458.     }
  2459.   }
  2460.  
  2461.   SetWindowText(m_Value.Format(dwFlags));
  2462. }
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471. //////////////////////// CDTimeReminderDlg implementation /////////////////////
  2472.  
  2473. BEGIN_MESSAGE_MAP(CDTimeReminderDlg, CDialog)
  2474.     //{{AFX_MSG_MAP(CDTimeReminderDlg)
  2475.     //}}AFX_MSG_MAP
  2476. END_MESSAGE_MAP()
  2477.  
  2478.  
  2479. CDTimeReminderDlg::CDTimeReminderDlg(CWnd* pParent /*=NULL*/)
  2480.     : CDialog(CDTimeReminderDlg::IDD, pParent)
  2481. {
  2482.     //{{AFX_DATA_INIT(CDTimeReminderDlg)
  2483.     //}}AFX_DATA_INIT
  2484. }
  2485.  
  2486.  
  2487. void CDTimeReminderDlg::DoDataExchange(CDataExchange* pDX)
  2488. {
  2489.     CDialog::DoDataExchange(pDX);
  2490.     //{{AFX_DATA_MAP(CDTimeReminderDlg)
  2491.     //}}AFX_DATA_MAP
  2492. }
  2493.  
  2494.  
  2495. BOOL CDTimeReminderDlg::OnInitDialog() 
  2496. {
  2497.     BOOL rVal = CDialog::OnInitDialog();
  2498.     
  2499.   WORD wDTimeVer = GetDTimeVersion();
  2500.   CString sVer;
  2501.   sVer.Format(_T("%d.%02d"), HIBYTE(wDTimeVer), LOBYTE(wDTimeVer));
  2502.  
  2503.     CString sVersionString;
  2504.   AfxFormatString1(sVersionString, IDS_SHAREWARE_CAPTION, sVer);
  2505.  
  2506.   SetDlgItemText(IDC_VERSION, sVersionString);
  2507.     
  2508.     return rVal;
  2509. }
  2510.  
  2511.  
  2512.  
  2513.  
  2514.  
  2515.  
  2516.  
  2517. //////////////////////// Free subprogram implementation ///////////////////////
  2518.  
  2519. void DDX_CDateControl(CDataExchange* pDX, int nIDC, CDateControl& rCDateControl, DWORD dwFlags)
  2520.   HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  2521.   if (!pDX->m_bSaveAndValidate && rCDateControl.m_hWnd == NULL)    // not subclassed yet
  2522.   {
  2523.     if (!rCDateControl.SubclassEdit(hWndCtrl))
  2524.     {
  2525.       ASSERT(FALSE);      // possibly trying to subclass twice ?
  2526.       AfxThrowNotSupportedException();
  2527.     }
  2528.   }
  2529.   rCDateControl.SetFlags(dwFlags);
  2530. }
  2531.  
  2532.  
  2533. void DDX_CLTimeSpanControl(CDataExchange* pDX, int nIDC, CLTimeSpanControl& rCLTimeSpanControl, DWORD dwFlags)
  2534. {
  2535.   HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  2536.   if (!pDX->m_bSaveAndValidate && rCLTimeSpanControl.m_hWnd == NULL)    // not subclassed yet
  2537.   {
  2538.     if (!rCLTimeSpanControl.SubclassEdit(hWndCtrl))
  2539.     {
  2540.       ASSERT(FALSE);      // possibly trying to subclass twice ?
  2541.       AfxThrowNotSupportedException();
  2542.     }
  2543.   }
  2544.   rCLTimeSpanControl.SetFlags(dwFlags);
  2545. }
  2546.  
  2547.  
  2548. void DDX_CLTimeOfDayControl(CDataExchange* pDX, int nIDC, CLTimeOfDayControl& rCLTimeOfDayControl, DWORD dwFlags)
  2549. {
  2550.   HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  2551.   if (!pDX->m_bSaveAndValidate && rCLTimeOfDayControl.m_hWnd == NULL)    // not subclassed yet
  2552.   {
  2553.     if (!rCLTimeOfDayControl.SubclassEdit(hWndCtrl))
  2554.     {
  2555.       ASSERT(FALSE);      // possibly trying to subclass twice ?
  2556.       AfxThrowNotSupportedException();
  2557.     }
  2558.   }
  2559.   rCLTimeOfDayControl.SetFlags(dwFlags);
  2560. }
  2561.  
  2562.  
  2563. void DDX_CLDateControl(CDataExchange* pDX, int nIDC, CLDateControl& rCLDateControl, DWORD dwFlags)
  2564. {
  2565.   HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
  2566.   if (!pDX->m_bSaveAndValidate && rCLDateControl.m_hWnd == NULL)    // not subclassed yet
  2567.   {
  2568.     if (!rCLDateControl.SubclassEdit(hWndCtrl))
  2569.     {
  2570.       ASSERT(FALSE);      // possibly trying to subclass twice ?
  2571.       AfxThrowNotSupportedException();
  2572.     }
  2573.   }
  2574.   rCLDateControl.SetFlags(dwFlags);
  2575. }
  2576.  
  2577.  
  2578. void DDX_CDate(CDataExchange* pDX, CDateControl& rCDateStatic, CDate& value)
  2579. {
  2580.   if (rCDateStatic.m_hWnd != NULL)
  2581.   {
  2582.     if (pDX->m_bSaveAndValidate)
  2583.     {
  2584.       rCDateStatic.GetValue(value);
  2585.     }
  2586.     else
  2587.     {
  2588.       rCDateStatic.SetValue(value);
  2589.     }
  2590.   }
  2591. }
  2592.  
  2593.  
  2594. void DDX_CLTimeSpan(CDataExchange* pDX, CLTimeSpanControl& rCLTimeSpanControl, CLTimeSpan& value)
  2595. {
  2596.   if (rCLTimeSpanControl.m_hWnd != NULL)
  2597.   {
  2598.     if (pDX->m_bSaveAndValidate)
  2599.     {
  2600.       rCLTimeSpanControl.GetValue(value);
  2601.     }
  2602.     else
  2603.     {
  2604.       rCLTimeSpanControl.SetValue(value);
  2605.     }
  2606.   }
  2607. }
  2608.  
  2609.  
  2610. void DDX_CLTimeOfDay(CDataExchange* pDX, CLTimeOfDayControl& rCLTimeOfDayControl, CLTimeOfDay& value)
  2611. {
  2612.   if (rCLTimeOfDayControl.m_hWnd != NULL)
  2613.   {
  2614.     if (pDX->m_bSaveAndValidate)
  2615.     {
  2616.       rCLTimeOfDayControl.GetValue(value);
  2617.     }
  2618.     else
  2619.     {
  2620.       rCLTimeOfDayControl.SetValue(value);
  2621.     }
  2622.   }
  2623. }
  2624.  
  2625.  
  2626. void DDX_CLDate(CDataExchange* pDX, CLDateControl& rCLDateControl, CLDate& value)
  2627. {
  2628.   if (rCLDateControl.m_hWnd != NULL)
  2629.   {
  2630.     if (pDX->m_bSaveAndValidate)
  2631.     {
  2632.       rCLDateControl.GetValue(value);
  2633.     }
  2634.     else
  2635.     {
  2636.       rCLDateControl.SetValue(value);
  2637.     }
  2638.   }
  2639. }
  2640.  
  2641.  
  2642. void DDV_MinMaxCDate(CDataExchange* pDX, CDate& value, CDate& minVal, CDate& maxVal)
  2643. {
  2644.   ASSERT(value.IsValid() && minVal.IsValid() && maxVal.IsValid());
  2645.   if (pDX->m_bSaveAndValidate && ((value < minVal) || (value > maxVal)))
  2646.   {
  2647.     AfxMessageBox(IDS_INVALID_DATE_RANGE, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_DATE_RANGE);
  2648.     pDX->Fail();
  2649.   }
  2650. }
  2651.  
  2652.  
  2653. void DDV_GreaterThanCDate(CDataExchange* pDX, CDate& value, CDate& minVal)
  2654. {
  2655.   ASSERT(value.IsValid() && minVal.IsValid());
  2656.   if (pDX->m_bSaveAndValidate && (value < minVal))
  2657.   {
  2658.     AfxMessageBox(IDS_INVALID_DATE_MIN, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_DATE_MIN);
  2659.     pDX->Fail();
  2660.   }
  2661. }
  2662.  
  2663.  
  2664. void DDV_LessThanCDate(CDataExchange* pDX, CDate& value, CDate& maxVal)
  2665. {
  2666.   ASSERT(value.IsValid() && maxVal.IsValid());
  2667.   if (pDX->m_bSaveAndValidate && (value > maxVal))
  2668.   {
  2669.     AfxMessageBox(IDS_INVALID_DATE_MAX, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_DATE_MAX);
  2670.     pDX->Fail();
  2671.   }
  2672. }
  2673.  
  2674.  
  2675. void DDV_MinMaxCLTimeSpan(CDataExchange* pDX, CLTimeSpan& value, CLTimeSpan& minVal, CLTimeSpan& maxVal)
  2676. {
  2677.   ASSERT(value.IsValid() && minVal.IsValid() && maxVal.IsValid());
  2678.   if (pDX->m_bSaveAndValidate && ((value < minVal) || (value > maxVal)))
  2679.   {
  2680.     AfxMessageBox(IDS_INVALID_TIMESPAN_RANGE, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMESPAN_RANGE);
  2681.     pDX->Fail();
  2682.   }
  2683. }
  2684.  
  2685.  
  2686. void DDV_GreaterThanCLTimeSpan(CDataExchange* pDX, CLTimeSpan& value, CLTimeSpan& minVal)
  2687. {
  2688.   ASSERT(value.IsValid() && minVal.IsValid());
  2689.   if (pDX->m_bSaveAndValidate && (value < minVal))
  2690.   {
  2691.     AfxMessageBox(IDS_INVALID_TIMESPAN_MIN, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMESPAN_MIN);
  2692.     pDX->Fail();
  2693.   }
  2694. }
  2695.  
  2696.  
  2697. void DDV_LessThanCLTimeSpan(CDataExchange* pDX, CLTimeSpan& value, CLTimeSpan& maxVal)
  2698. {
  2699.   ASSERT(value.IsValid() && maxVal.IsValid());
  2700.   if (pDX->m_bSaveAndValidate && (value > maxVal))
  2701.   {
  2702.     AfxMessageBox(IDS_INVALID_TIMESPAN_MAX, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMESPAN_MAX);
  2703.     pDX->Fail();
  2704.   }
  2705. }
  2706.  
  2707.  
  2708. void DDV_IsValidCLTimeSpan(CDataExchange* pDX, CLTimeSpan& value)
  2709. {
  2710.   if (pDX->m_bSaveAndValidate && (!value.IsValid()))
  2711.   {
  2712.     AfxMessageBox(IDS_INVALID_TIMESPAN, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMESPAN);
  2713.     pDX->Fail();
  2714.   }
  2715. }
  2716.  
  2717.  
  2718. void DDV_MinMaxCLTimeOfDay(CDataExchange* pDX, CLTimeOfDay& value, CLTimeOfDay& minVal, CLTimeOfDay& maxVal)
  2719. {
  2720.   ASSERT(value.IsValid() && minVal.IsValid() && maxVal.IsValid());
  2721.   if (pDX->m_bSaveAndValidate && ((value < minVal) || (value > maxVal)))
  2722.   {
  2723.     AfxMessageBox(IDS_INVALID_TIMEOFDAY_RANGE, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMEOFDAY_RANGE);
  2724.     pDX->Fail();
  2725.   }
  2726. }
  2727.  
  2728.  
  2729. void DDV_GreaterThanCLTimeOfDay(CDataExchange* pDX, CLTimeOfDay& value, CLTimeOfDay& minVal)
  2730. {
  2731.   ASSERT(value.IsValid() && minVal.IsValid());
  2732.   if (pDX->m_bSaveAndValidate && (value < minVal))
  2733.   {
  2734.     AfxMessageBox(IDS_INVALID_TIMEOFDAY_MIN, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMEOFDAY_MIN);
  2735.     pDX->Fail();
  2736.   }
  2737. }
  2738.  
  2739.  
  2740. void DDV_LessThanCLTimeOfDay(CDataExchange* pDX, CLTimeOfDay& value, CLTimeOfDay& maxVal)
  2741. {
  2742.   ASSERT(value.IsValid() && maxVal.IsValid());
  2743.   if (pDX->m_bSaveAndValidate && (value > maxVal))
  2744.   {
  2745.     AfxMessageBox(IDS_INVALID_TIMEOFDAY_MAX, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_TIMEOFDAY_MAX);
  2746.     pDX->Fail();
  2747.   }
  2748. }
  2749.  
  2750.  
  2751. void DDV_MinMaxCLDate(CDataExchange* pDX, CLDate& value, CLDate& minVal, CLDate& maxVal)
  2752. {
  2753.   ASSERT(value.IsValid() && minVal.IsValid() && maxVal.IsValid());
  2754.   if (pDX->m_bSaveAndValidate && ((value < minVal) || (value > maxVal)))
  2755.   {
  2756.     AfxMessageBox(IDS_INVALID_DATE_RANGE, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_DATE_RANGE);
  2757.     pDX->Fail();
  2758.   }
  2759. }
  2760.  
  2761.  
  2762. void DDV_GreaterThanCLDate(CDataExchange* pDX, CLDate& value, CLDate& minVal)
  2763. {
  2764.   ASSERT(value.IsValid() && minVal.IsValid());
  2765.   if (pDX->m_bSaveAndValidate && (value < minVal))
  2766.   {
  2767.     AfxMessageBox(IDS_INVALID_LDATE_MIN, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_LDATE_MIN);
  2768.     pDX->Fail();
  2769.   }
  2770. }
  2771.  
  2772.  
  2773. void DDV_LessThanCLDate(CDataExchange* pDX, CLDate& value, CLDate& maxVal)
  2774. {
  2775.   ASSERT(value.IsValid() && maxVal.IsValid());
  2776.   if (pDX->m_bSaveAndValidate && (value > maxVal))
  2777.   {
  2778.     AfxMessageBox(IDS_INVALID_LDATE_MAX, MB_OK | MB_ICONEXCLAMATION, DT_IDS_INVALID_LDATE_MAX);
  2779.     pDX->Fail();
  2780.   }
  2781. }
  2782.  
  2783.  
  2784.  
  2785.  
  2786.  
  2787.  
  2788.  
  2789.  
  2790.  
  2791.  
  2792.  
  2793.