|
|
// RatGenPg.cpp : implementation file
//
#include "stdafx.h"
#include <iadmw.h>
#include "cnfgprts.h"
#include "parserat.h"
#include "RatData.h"
#include "RatGenPg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
// enumerate the tree icon indexes
enum { IMAGE_SERVICE = 0, IMAGE_CATEGORY };
/////////////////////////////////////////////////////////////////////////////
// CRatGenPage property page
IMPLEMENT_DYNCREATE(CRatGenPage, CPropertyPage)
//--------------------------------------------------------------------------
CRatGenPage::CRatGenPage() : CPropertyPage(CRatGenPage::IDD), m_fInititialized( FALSE ) { //{{AFX_DATA_INIT(CRatGenPage)
m_sz_description = _T(""); m_bool_enable = FALSE; m_sz_moddate = _T(""); m_sz_person = _T(""); //}}AFX_DATA_INIT
}
//--------------------------------------------------------------------------
CRatGenPage::~CRatGenPage() { }
//--------------------------------------------------------------------------
void CRatGenPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CRatGenPage)
DDX_Control(pDX, IDC_MOD_DATE, m_cstatic_moddate); DDX_Control(pDX, IDC_STATIC_MOD_DATE, m_cstatic_moddate_title); DDX_Control(pDX, IDC_TREE, m_ctree_tree); DDX_Control(pDX, IDC_TITLE, m_cstatic_title); DDX_Control(pDX, IDC_STATIC_RATING, m_cstatic_rating); DDX_Control(pDX, IDC_STATIC_ICON, m_cstatic_icon); DDX_Control(pDX, IDC_STATIC_EXPIRES, m_cstatic_expires); DDX_Control(pDX, IDC_STATIC_EMAIL, m_cstatic_email); DDX_Control(pDX, IDC_STATIC_CATEGORY, m_cstatic_category); DDX_Control(pDX, IDC_SLIDER, m_cslider_slider); DDX_Control(pDX, IDC_NAME_PERSON, m_cedit_person); DDX_Control(pDX, IDC_DESCRIPTION, m_cstatic_description); DDX_Text(pDX, IDC_DESCRIPTION, m_sz_description); DDX_Check(pDX, IDC_ENABLE, m_bool_enable); DDX_Text(pDX, IDC_MOD_DATE, m_sz_moddate); DDX_Text(pDX, IDC_NAME_PERSON, m_sz_person); DDV_MaxChars(pDX, m_sz_person, 200); //}}AFX_DATA_MAP
DDX_Control(pDX, IDC_DTP_ABS_DATE, m_dtpDate); }
//--------------------------------------------------------------------------
BEGIN_MESSAGE_MAP(CRatGenPage, CPropertyPage) //{{AFX_MSG_MAP(CRatGenPage)
ON_BN_CLICKED(IDC_ENABLE, OnEnable) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree) ON_WM_HSCROLL() ON_WM_DESTROY() ON_EN_CHANGE(IDC_NAME_PERSON, OnChangeNamePerson) ON_EN_CHANGE(IDC_MOD_DATE, OnChangeModDate) //}}AFX_MSG_MAP
ON_COMMAND(ID_HELP_FINDER, DoHelp) ON_COMMAND(ID_HELP, DoHelp) ON_COMMAND(ID_CONTEXT_HELP, DoHelp) ON_COMMAND(ID_DEFAULT_HELP, DoHelp) END_MESSAGE_MAP()
//---------------------------------------------------------------------------
void CRatGenPage::DoHelp() { DebugTraceHelp(HIDD_RATINGS_RATING); WinHelp( HIDD_RATINGS_RATING ); }
//--------------------------------------------------------------------------
void CRatGenPage::EnableButtons() { UpdateData( TRUE );
// enabling is based on whether or not things are enabled
if ( m_bool_enable ) { m_ctree_tree.EnableWindow( TRUE ); m_cstatic_title.EnableWindow( TRUE ); m_cstatic_rating.EnableWindow( TRUE ); m_cstatic_icon.EnableWindow( TRUE ); m_cstatic_expires.EnableWindow( TRUE ); m_cstatic_email.EnableWindow( TRUE ); m_cstatic_category.EnableWindow( TRUE ); m_cslider_slider.EnableWindow( TRUE ); m_cedit_person.EnableWindow( TRUE ); m_cstatic_moddate.EnableWindow( TRUE ); m_cstatic_moddate_title.EnableWindow( TRUE ); m_cstatic_description.EnableWindow( TRUE ); m_dtpDate.EnableWindow(TRUE);
// also need to take care of the slider bar
UpdateRatingItems(); } else { // not enabled
m_ctree_tree.EnableWindow( FALSE ); m_cstatic_title.EnableWindow( FALSE ); m_cstatic_rating.EnableWindow( FALSE ); m_cstatic_icon.EnableWindow( FALSE ); m_cstatic_email.EnableWindow( FALSE ); m_cstatic_category.EnableWindow( FALSE ); m_cedit_person.EnableWindow( FALSE ); m_cstatic_moddate.EnableWindow( FALSE ); m_cstatic_moddate_title.EnableWindow( FALSE ); m_dtpDate.EnableWindow(FALSE);
// don't just disable the slider and description - hide them!
m_cslider_slider.ShowWindow( SW_HIDE ); m_cstatic_description.ShowWindow( SW_HIDE ); } }
//--------------------------------------------------------------------------
void CRatGenPage::UpdateRatingItems() { // get the selected item in the tree
HTREEITEM hItem = m_ctree_tree.GetSelectedItem();
// get the item category
PicsCategory* pCat = GetTreeItemCategory( hItem );
// if there is no item, or it is the root, hide the sliders
if ( !pCat ) { // don't just disable the slider and description - hide them!
m_cslider_slider.ShowWindow( SW_HIDE ); m_cstatic_description.ShowWindow( SW_HIDE ); } else { // make sure the windows are showing and enabled
m_cslider_slider.ShowWindow( SW_SHOW ); m_cstatic_description.ShowWindow( SW_SHOW ); m_cslider_slider.EnableWindow( TRUE ); m_cstatic_description.EnableWindow( TRUE );
// get the item category
PicsCategory* pCat = GetTreeItemCategory( hItem );
// set up the slider
m_cslider_slider.SetRangeMin( 0 ); m_cslider_slider.SetRangeMax( pCat->arrpPE.Length() - 1, TRUE );
// set current value of the slider
m_cslider_slider.SetPos( pCat->currentValue );
// set up the description
UpdateDescription(); } }
//--------------------------------------------------------------------------
PicsCategory* CRatGenPage::GetTreeItemCategory( HTREEITEM hItem ) { DWORD iRat; DWORD iCat = 0;
// get the item's parent in the tree
HTREEITEM hParent = m_ctree_tree.GetParentItem(hItem);
// get the cat
// IA64 - OK to cast as this is an index
iCat = (DWORD)m_ctree_tree.GetItemData( hItem );
// if the parent is null, return NULL to indicate that this is a root item
if ( !hParent ) return NULL;
// if the parent is a root though, we can simply return the category
if ( !m_ctree_tree.GetParentItem(hParent) ) { // get the rat and the cat
// IA64 - OK to cast as this is an index
iRat = (DWORD)m_ctree_tree.GetItemData( hParent ); // return the category
return m_pRatData->rgbRats[iRat]->arrpPC[iCat]; } else { // we are deeper in the tree. Get the parent category first
PicsCategory* pParentCat = GetTreeItemCategory( hParent ); // return the category
return pParentCat->arrpPC[iCat]; } // shouldn't get here
return NULL; }
//--------------------------------------------------------------------------
void CRatGenPage::UpdateDateStrings() { CString sz; TCHAR chBuff[MAX_PATH]; int i;
SYSTEMTIME sysTime;
UpdateData( TRUE );
// start with the epxiration date
ZeroMemory( chBuff, sizeof(chBuff) ); ZeroMemory( &sysTime, sizeof(sysTime) ); sysTime.wDay = m_pRatData->m_expire_day; sysTime.wMonth = m_pRatData->m_expire_month; sysTime.wYear = m_pRatData->m_expire_year;
m_dtpDate.SetTime(&sysTime);
// now the modified date and time
ZeroMemory( chBuff, sizeof(chBuff) ); ZeroMemory( &sysTime, sizeof(sysTime) ); sysTime.wDay = m_pRatData->m_start_day; sysTime.wMonth = m_pRatData->m_start_month; sysTime.wYear = m_pRatData->m_start_year; sysTime.wMinute = m_pRatData->m_start_minute; sysTime.wHour = m_pRatData->m_start_hour;
i = GetDateFormat( LOCALE_USER_DEFAULT, DATE_LONGDATE, &sysTime, NULL, chBuff, sizeof(chBuff)/sizeof(TCHAR) ); m_sz_moddate = chBuff;
ZeroMemory( chBuff, sizeof(chBuff) ); i = GetTimeFormat( LOCALE_USER_DEFAULT, TIME_NOSECONDS, &sysTime, NULL, chBuff, sizeof(chBuff)/sizeof(TCHAR) ); m_sz_moddate += ", "; m_sz_moddate += chBuff;
// CTime timeModified( sysTime );
// m_sz_moddate = timeModified.Format( "%#c" );
// put it back
UpdateData( FALSE ); }
//--------------------------------------------------------------------------
// Update the text displayed in the description
void CRatGenPage::UpdateDescription() { // get the selected item in the tree
HTREEITEM hItem = m_ctree_tree.GetSelectedItem(); if ( !hItem ) return;
// get the selected category object
PicsCategory* pCat = GetTreeItemCategory( hItem );
// shouldn't be any problem, but might as well check
if ( !pCat ) return;
// get the current value
WORD value = pCat->currentValue;
// build the description string
m_sz_description = pCat->arrpPE[value]->etstrName.Get(); UpdateData( FALSE ); }
//--------------------------------------------------------------------------
// tell it to query the metabase and get any defaults
BOOL CRatGenPage::FInit() { UpdateData( TRUE );
HIMAGELIST hImage = ImageList_LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_RATLIST), 16, 3, 0x00FF00FF, IMAGE_BITMAP, LR_DEFAULTCOLOR); if (hImage != NULL) { m_ctree_tree.SetImageList(CImageList::FromHandle(hImage), TVSIL_NORMAL); } // start with the parsed rat files
if ( !FLoadRatFiles() ) return FALSE;
// do the right thing based on the ratings being enabled
if ( m_pRatData->m_fEnabled ) { // ratings are enabled.
m_bool_enable = TRUE; m_sz_person = m_pRatData->m_szEmail; } else { // ratings are not enabled.
m_bool_enable = FALSE; }
// do the dates
// if the mod date is not set give date today's as a default moddate
if ( m_pRatData->m_start_year == 0 ) { SetCurrentModDate(); }
//
// Set the minimum of the date picker to today
// and the maximum to Dec 31, 2035.
// taken from Ron's code
//
CTime m_tmNow(CTime::GetCurrentTime()); CTime tmThen(2035, 12, 31, 23, 59, 59); m_dtpDate.SetRange(&m_tmNow, &tmThen);
// if there is no expire date, set it for one year after the mod date
if ( m_pRatData->m_expire_year == 0 ) { m_pRatData->m_expire_minute = 0; m_pRatData->m_expire_hour = 12; m_pRatData->m_expire_day = m_pRatData->m_start_day; m_pRatData->m_expire_month = m_pRatData->m_start_month; m_pRatData->m_expire_year = m_pRatData->m_start_year + 1; }
// update the date strings
UpdateDateStrings();
// update the name string and the enabled switch as well
m_sz_person = m_pRatData->m_szEmail; m_bool_enable = m_pRatData->m_fEnabled;
// put the data back
UpdateData( FALSE );
EnableButtons();
// success
return TRUE; }
//--------------------------------------------------------------------------
// load the parsed rat files into the tree
BOOL CRatGenPage::FLoadRatFiles() { HTREEITEM hRoot; HTREEITEM hItem; CString sz;
// how many rat files are there?
DWORD nRatFiles = (DWORD)m_pRatData->rgbRats.GetSize(); // loop them
for ( DWORD iRat = 0; iRat < nRatFiles; iRat++ ) { // get the rating system
PicsRatingSystem* pRating = m_pRatData->rgbRats[iRat];
// get the root node name
sz = pRating->etstrName.Get();
// add the root node to the tree
hRoot = m_ctree_tree.InsertItem( sz ); // because the list is alphabetized, embed the iRat number in the item
m_ctree_tree.SetItemData( hRoot, iRat ); m_ctree_tree.SetItemImage( hRoot, IMAGE_SERVICE, IMAGE_SERVICE );
// add the subnodes to the tree as well
DWORD nCats = pRating->arrpPC.Length(); // loop them
for ( DWORD iCat = 0; iCat < nCats; iCat++ ) { // get the category node name
sz = pRating->arrpPC[iCat]->etstrName.Get();
// add the category node to the tree
hItem = m_ctree_tree.InsertItem( sz, hRoot );
// because the list is alphabetized, embed the iCat number in the item
m_ctree_tree.SetItemData( hItem, iCat ); m_ctree_tree.SetItemImage( hItem, IMAGE_CATEGORY, IMAGE_CATEGORY );
// even though there aren't any now, add any sub-categories
LoadSubCategories( pRating->arrpPC[iCat], hItem ); }
// expand the rat node
m_ctree_tree.Expand( hRoot, TVE_EXPAND ); }
return TRUE; }
//--------------------------------------------------------------------------
void CRatGenPage::LoadSubCategories( PicsCategory* pParentCat, HTREEITEM hParent ) { CString sz; HTREEITEM hItem;
// add the subnodes to the tree as well
DWORD nCats = pParentCat->arrpPC.Length(); // loop them
for ( DWORD iCat = 0; iCat < nCats; iCat++ ) { // get the category node name
sz = pParentCat->arrpPC[iCat]->etstrName.Get();
// add the category node to the tree
hItem = m_ctree_tree.InsertItem( sz, hParent );
// because the list is alphabetized, embed the iCat number in the item
m_ctree_tree.SetItemData( hItem, iCat ); m_ctree_tree.SetItemImage( hItem, IMAGE_CATEGORY, IMAGE_CATEGORY );
// even though there aren't any now, add any sub-categories
LoadSubCategories( pParentCat->arrpPC[iCat], hItem ); }
// if there were sub-categories, expand the parental node in the tree
if ( nCats > 0 ) m_ctree_tree.Expand( hParent, TVE_EXPAND ); }
//--------------------------------------------------------------------------
void CRatGenPage::SetModifiedTime() { SetCurrentModDate(); UpdateDateStrings(); SetModified(); }
/////////////////////////////////////////////////////////////////////////////
// CRatGenPage message handlers
//--------------------------------------------------------------------------
void CRatGenPage::OnEnable() { EnableButtons(); SetModified(); }
//--------------------------------------------------------------------------
BOOL CRatGenPage::OnSetActive() { // if it hasn't been initialized yet, do so
if ( !m_fInititialized ) { FInit(); m_fInititialized = TRUE; }
// enable the button appropriately
EnableButtons();
return CPropertyPage::OnSetActive(); }
//--------------------------------------------------------------------------
void CRatGenPage::OnOK() { CPropertyPage::OnOK(); }
//--------------------------------------------------------------------------
BOOL CRatGenPage::OnApply() { UpdateData( TRUE );
// make sure there are no quote symbols in the name
if ( m_sz_person.Find(_T('\"')) >= 0 ) { AfxMessageBox( IDS_RAT_NAME_ERROR ); return FALSE; }
// put the data into place
m_pRatData->m_fEnabled = m_bool_enable; m_pRatData->m_szEmail = m_sz_person;
// set the expire date
SYSTEMTIME sysTime; ZeroMemory( &sysTime, sizeof(sysTime) ); // get the date from the control
m_dtpDate.GetTime(&sysTime); // set the date into place
m_pRatData->m_expire_day = sysTime.wDay; m_pRatData->m_expire_month = sysTime.wMonth; m_pRatData->m_expire_year = sysTime.wYear;
// generate the label and save it into the metabase
m_pRatData->SaveTheLabel();
// we can now apply
SetModified( FALSE ); return CPropertyPage::OnApply(); }
//--------------------------------------------------------------------------
void CRatGenPage::SetCurrentModDate() { SYSTEMTIME time; GetLocalTime( &time );
m_pRatData->m_start_day = time.wDay; m_pRatData->m_start_month = time.wMonth; m_pRatData->m_start_year = time.wYear; m_pRatData->m_start_minute = time.wMinute; m_pRatData->m_start_hour = time.wHour; }
//--------------------------------------------------------------------------
void CRatGenPage::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; UpdateRatingItems(); *pResult = 0; }
//--------------------------------------------------------------------------
void CRatGenPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // get the value of the slider
WORD iPos = (WORD)m_cslider_slider.GetPos();
// get the current item
HTREEITEM hItem = m_ctree_tree.GetSelectedItem();
// get the selected category object
PicsCategory* pCat = GetTreeItemCategory( hItem );
// shouldn't be any problem, but might as well check
if ( !pCat ) return;
// set the category value
pCat->currentValue = iPos;
// update the description
UpdateDescription();
// we can now apply
SetModifiedTime();
// update the mod date
SetCurrentModDate(); CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar); }
//--------------------------------------------------------------------------
void CRatGenPage::OnChangeNamePerson() { // we can now apply
SetModifiedTime(); }
//--------------------------------------------------------------------------
void CRatGenPage::OnChangeModDate() { // we can now apply
SetModifiedTime(); }
//--------------------------------------------------------------------------
// Stolen from w3scfg - the httppage.cpp file
BOOL CRatGenPage::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT * pResult ) /*++
Routine Description:
Handle notification changes
Arguments:
WPARAM wParam : Control ID LPARAM lParam : NMHDR * LRESULT * pResult : Result pointer
Return Value:
TRUE if handled, FALSE if not
--*/ { //
// Message cracker crashes - so checking this here instead
//
if (wParam == IDC_DTP_ABS_DATE) { NMHDR * pHdr = (NMHDR *)lParam; if (pHdr->code == DTN_DATETIMECHANGE) { SetModified(); } }
//
// Default behaviour -- go to the message map
//
return CPropertyPage::OnNotify(wParam, lParam, pResult); }
void CRatGenPage::OnDestroy() { CPropertyPage::OnDestroy(); CImageList * pImage = m_ctree_tree.SetImageList(CImageList::FromHandle(NULL), TVSIL_NORMAL); if (pImage != NULL && pImage->m_hImageList != NULL) { ImageList_Destroy(pImage->m_hImageList); } }
|