Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1059 lines
28 KiB

/****************************************************************************\
*
* picsdlg.cpp
*
* Created: William Taylor (wtaylor) 01/22/01
*
* MS Ratings Pics Ratings Property Page
*
\****************************************************************************/
#include "msrating.h"
#include "mslubase.h"
#include "picsdlg.h" // CPicsDialog
#include "debug.h" // TraceMsg()
#include <contxids.h> // Help Context ID's
#include <mluisupp.h> // SHWinHelpOnDemandWrap() and MLLoadStringA()
/*Helpers---------------------------------------------------------------------*/
int g_nKeys, g_nLock; // indexes of the images
DWORD CPicsDialog::aIds[] = {
IDC_STATIC1, IDH_RATINGS_CATEGORY_LABEL,
IDC_PT_TREE, IDH_RATINGS_CATEGORY_LIST,
IDC_RATING_LABEL, IDH_RATINGS_RATING_LABEL,
IDC_PT_TB_SELECT, IDH_RATINGS_RATING_LABEL,
IDC_PT_T_RSN_SDESC, IDH_RATINGS_RATING_TEXT,
IDC_STATIC2, IDH_RATINGS_DESCRIPTION_LABEL,
IDC_PT_T_RSN_LDESC, IDH_RATINGS_DESCRIPTION_TEXT,
IDC_STATIC3, IDH_RATINGS_VIEW_PROVIDER_PAGE,
IDC_DETAILSBUTTON, IDH_RATINGS_VIEW_PROVIDER_PAGE,
0,0
};
CPicsDialog::CPicsDialog( PRSD * p_pPRSD )
{
ASSERT( p_pPRSD );
m_pPRSD = p_pPRSD;
}
LRESULT CPicsDialog::OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
TV_ITEM tvm;
TreeNode *pTN;
InitTreeViewImageLists(GetDlgItem(IDC_PT_TREE));
//force the trackbar to redraw its background with the new color
PRSD * pPRSD = m_pPRSD;
ZeroMemory(&tvm,sizeof(tvm));
tvm.hItem=TreeView_GetSelection(GetDlgItem(IDC_PT_TREE));
tvm.mask=TVIF_PARAM;
TreeView_GetItem(GetDlgItem(IDC_PT_TREE),&tvm);
pTN=(TreeNode *) tvm.lParam;
ASSERT( pTN );
if ( ! pTN )
{
TraceMsg( TF_ERROR, "CPicsDialog::OnSysColorChange() - pTN is NULL!" );
return 0L;
}
ControlsShow( pTN->tne );
switch(pTN->tne)
{
case tneRatingSystemInfo:
{
SelectRatingSystemInfo( (PicsRatingSystem*) pTN->pData );
break;
}
case tneRatingSystemNode:
{
SelectRatingSystemNode( (PicsCategory*) pTN->pData );
break;
}
}
return 0L;
}
LRESULT CPicsDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PicsDlgInit();
bHandled = FALSE;
return 1L; // Let the system set the focus
}
LRESULT CPicsDialog::OnScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
switch (LOWORD(wParam)){
case TB_THUMBTRACK:
case TB_BOTTOM:
case TB_ENDTRACK:
case TB_LINEDOWN:
case TB_LINEUP:
case TB_PAGEDOWN:
case TB_PAGEUP:
case TB_THUMBPOSITION:
case TB_TOP:
NewTrackbarPosition();
MarkChanged();
break;
}
return 0L;
}
LRESULT CPicsDialog::OnDetails(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
LaunchRatingSystemSite();
return 0L;
}
LRESULT CPicsDialog::OnSetActive(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::OnSetActive() - pPRSD is NULL!" );
return 0L;
}
if (pPRSD->fNewProviders)
{
//Means that user changed list of provider files
HWND hwndTree;
hwndTree = GetDlgItem(IDC_PT_TREE);
KillTree(hwndTree , TreeView_GetRoot(hwndTree));
pPRSD->fNewProviders = FALSE;
PicsDlgInit();
}
bHandled = FALSE;
return 0L;
}
LRESULT CPicsDialog::OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY) pnmh;
/*do apply stuff*/
PicsDlgSave();
if ( ! lpPSHNotify->lParam )
{
// Apply
return PSNRET_NOERROR;
}
// Do this if hit OK or Cancel, not Apply
OnReset( idCtrl, pnmh, bHandled );
return PSNRET_NOERROR;
}
LRESULT CPicsDialog::OnReset(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
// Do this if hit OK or Cancel, not Apply
HWND hDlg = m_hWnd;
ASSERT( hDlg );
SendMessage(hDlg,WM_SETREDRAW, FALSE,0L);
PicsDlgUninit();
SendMessage(hDlg,WM_SETREDRAW, TRUE,0L);
return 0L;
}
LRESULT CPicsDialog::OnTreeItemExpanding(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTREEVIEW pNMTreeView = (LPNMTREEVIEW)pnmh;
if ( ! pNMTreeView )
{
return 0L;
}
if (pNMTreeView->action == TVE_COLLAPSE)
{
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, TRUE);
return 1L; //Suppress expanding tree.
}
return 0L;
}
LRESULT CPicsDialog::OnTreeSelChanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
LPNMTREEVIEW pNMTreeView = (LPNMTREEVIEW)pnmh;
TreeNode *pTN = pNMTreeView ? ((TreeNode*) pNMTreeView->itemNew.lParam) : NULL;
if ( ! pTN )
{
TraceMsg( TF_ERROR, "CPicsDialog::OnTreeSelChanged() - pTN is NULL!" );
return 0L;
}
PRSD * pPRSD = m_pPRSD;
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::OnTreeSelChanged() - pPRSD is NULL!" );
return 0L;
}
if (pPRSD->fNewProviders)
{
return 1L; /* tree is being cleaned up, ignore sel changes */
}
ControlsShow( pTN->tne );
switch(pTN->tne)
{
case tneRatingSystemInfo:
SelectRatingSystemInfo( (PicsRatingSystem*) pTN->pData );
break;
case tneRatingSystemNode:
SelectRatingSystemNode( (PicsCategory*) pTN->pData );
break;
}
return 1L;
}
LRESULT CPicsDialog::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SHWinHelpOnDemandWrap((HWND)((LPHELPINFO)lParam)->hItemHandle, ::szHelpFile,
HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
return 0L;
}
LRESULT CPicsDialog::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SHWinHelpOnDemandWrap((HWND)wParam, ::szHelpFile, HELP_CONTEXTMENU,
(DWORD_PTR)(LPVOID)aIds);
return 0L;
}
// InitTreeViewImageLists - creates an image list, adds three bitmaps to
// it, and associates the image list with a tree-view control.
// Returns TRUE if successful or FALSE otherwise.
// hwndTV - handle of the tree-view control
//
#define NUM_BITMAPS 2
#define CX_BITMAP 16
#define CY_BITMAP 16
void CPicsDialog::SetTreeImages( HWND hwndTV, HIMAGELIST himl )
{
HIMAGELIST oldHiml; // handle of image list
// Associate the image list with the tree-view control.
oldHiml = TreeView_SetImageList( hwndTV, himl, TVSIL_NORMAL );
if ( oldHiml != NULL )
{
ImageList_Destroy( oldHiml );
}
}
BOOL CPicsDialog::InitTreeViewImageLists(HWND hwndTV)
{
HIMAGELIST himl; // handle of image list
HBITMAP hbmp; // handle of bitmap
// Create the image list.
if ((himl = ImageList_Create(CX_BITMAP, CY_BITMAP,
FALSE, NUM_BITMAPS, 0)) == NULL)
{
TraceMsg( TF_WARNING, "CPicsDialog::InitTreeViewImageLists() - himl Image List Creation Failed!" );
return FALSE;
}
// Add the open file, closed file, and document bitmaps.
hbmp=(HBITMAP) LoadImage(g_hInstance,
MAKEINTRESOURCE(IDB_KEYS),
IMAGE_BITMAP,
0,
0,
LR_LOADTRANSPARENT|LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);
g_nKeys = ImageList_Add(himl, hbmp, (HBITMAP) NULL);
DeleteObject(hbmp);
hbmp=(HBITMAP) LoadImage(g_hInstance,
MAKEINTRESOURCE(IDB_LOCK),
IMAGE_BITMAP,
0,
0,
LR_LOADTRANSPARENT|LR_DEFAULTCOLOR|LR_CREATEDIBSECTION);
g_nLock = ImageList_Add(himl, hbmp, (HBITMAP) NULL);
DeleteObject(hbmp);
// Fail if not all of the images were added.
if (ImageList_GetImageCount(himl) < NUM_BITMAPS)
{
TraceMsg( TF_WARNING, "CPicsDialog::InitTreeViewImageLists() - Not all images were added!" );
return FALSE;
}
// Associate the image list with the tree-view control.
SetTreeImages( hwndTV, himl );
return TRUE;
}
void CPicsDialog::LaunchRatingSystemSite( void )
{
HWND hDlg = m_hWnd;
TreeNode *pTN = TreeView_GetSelectionLParam(GetDlgItem(IDC_PT_TREE));
if (pTN == NULL)
return;
PicsRatingSystem *pPRS = NULL;
if (pTN->tne == tneRatingSystemInfo)
pPRS = (PicsRatingSystem *)pTN->pData;
else if (pTN->tne == tneRatingSystemNode) {
if ((PicsCategory *)pTN->pData != NULL)
pPRS = ((PicsCategory *)pTN->pData)->pPRS;
}
if (pPRS != NULL) {
BOOL fSuccess = FALSE;
HINSTANCE hShell32 = ::LoadLibrary(::szShell32);
if (hShell32 != NULL) {
PFNSHELLEXECUTE pfnShellExecute = (PFNSHELLEXECUTE)::GetProcAddress(hShell32, ::szShellExecute);
if (pfnShellExecute != NULL) {
fSuccess = (*pfnShellExecute)(hDlg, NULL, pPRS->etstrRatingService.Get(),
NULL, NULL, SW_SHOW) != NULL;
}
::FreeLibrary(hShell32);
}
if (!fSuccess) {
NLS_STR nlsMessage(MAX_RES_STR_LEN);
if(nlsMessage)
{
NLS_STR nlsTemp(STR_OWNERALLOC, pPRS->etstrRatingSystem.Get());
const NLS_STR *apnls[] = { &nlsTemp, NULL };
if ( WN_SUCCESS == (nlsMessage.LoadString(IDS_CANT_LAUNCH, apnls)) )
{
MyMessageBox(hDlg, nlsMessage.QueryPch(), IDS_GENERIC, MB_OK | MB_ICONSTOP);
}
}
}
}
}
void CPicsDialog::PicsDlgInit( void )
{
HTREEITEM hTree;
TreeNode *pTN;
HWND hwndTree;
int x,z;
HWND hDlg = m_hWnd;
ASSERT( hDlg );
if ( ! hDlg )
{
TraceMsg( TF_ERROR, "CPicsDialog::PicsDlgInit() - hDlg is NULL!" );
return;
}
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::PicsDlgInit() - pPRSD is NULL!" );
return;
}
hwndTree = GetDlgItem(IDC_PT_TREE);
/* Note, if there are installed providers but they all failed, there
* will be dummy entries for them in the array. So we will not attempt
* to install RSACi automatically unless there really are no providers
* installed at all.
*/
if (!pPRSD->pPRSI->arrpPRS.Length())
{
// There are no providers.
if ( ! InstallDefaultProvider() )
{
MyMessageBox(hDlg, IDS_INSTALL_INFO, IDS_GENERIC, MB_OK);
ControlsShow( tneNone );
return;
}
}
/*make the tree listing*/
/*Individual Rating Systems*/
InitTreeViewImageLists(hwndTree);
BOOL fAnyInvalid = FALSE;
BOOL fAnyValid = FALSE;
for (z = 0; z < pPRSD->pPRSI->arrpPRS.Length(); ++z)
{
PicsRatingSystem *pPRS = pPRSD->pPRSI->arrpPRS[z];
if (!(pPRS->dwFlags & PRS_ISVALID))
{
fAnyInvalid = TRUE;
continue;
}
fAnyValid = TRUE;
pTN = new TreeNode(tneRatingSystemInfo, pPRS);
ASSERT(pTN);
hTree = AddOneItem(hwndTree, NULL, (char*) pPRS->etstrName.Get(), TVI_SORT, (LPARAM) pTN, g_nLock);
for (x = 0; x < pPRS->arrpPC.Length(); ++x)
{
AddCategory(pPRS->arrpPC[x], hwndTree, hTree);
}
TreeView_Expand(hwndTree, hTree, TVE_EXPAND);
}
if (fAnyInvalid)
{
MyMessageBox(hDlg, IDS_INVALID_PROVIDERS, IDS_GENERIC, MB_OK | MB_ICONWARNING);
}
if (fAnyValid)
{
HTREEITEM hTreeItem;
hTreeItem=TreeView_GetNextItem(hwndTree, TreeView_GetRoot(hwndTree),TVGN_CHILD);
if(hTreeItem!=NULL)
{
TreeView_SelectItem(hwndTree, hTreeItem);
pTN = TreeView_GetSelectionLParam(GetDlgItem(IDC_PT_TREE));
if (pTN)
{
ControlsShow( pTN->tne );
switch(pTN->tne)
{
case tneRatingSystemInfo:
SelectRatingSystemInfo( (PicsRatingSystem*) pTN->pData );
break;
case tneRatingSystemNode:
SelectRatingSystemNode( (PicsCategory*) pTN->pData );
break;
}
}
}
else
{
TreeView_SelectItem(hwndTree, TreeView_GetRoot(hwndTree));
pTN = TreeView_GetSelectionLParam(GetDlgItem(IDC_PT_TREE));
ControlsShow( tneRatingSystemInfo );
if ( pTN )
{
SelectRatingSystemInfo( (PicsRatingSystem*) pTN->pData );
}
}
}
else
{
ControlsShow( tneNone );
}
}
void CPicsDialog::KillTree(HWND hwndTree, HTREEITEM hTree)
{
ASSERT( hwndTree );
while (hTree != NULL)
{
/* If this node has any items under it, delete them as well. */
HTREEITEM hChild = TreeView_GetChild( hwndTree, hTree );
if (hChild != NULL)
{
KillTree( hwndTree, hChild );
}
HTREEITEM hNext = TreeView_GetNextSibling( hwndTree, hTree );
TreeView_SelectItem( hwndTree, hTree );
delete TreeView_GetSelectionLParam( hwndTree );
TreeView_DeleteItem( hwndTree, hTree );
hTree = hNext;
}
}
void CPicsDialog::PicsDlgUninit( void )
{
HWND hwndTree;
hwndTree = GetDlgItem(IDC_PT_TREE);
KillTree( hwndTree, TreeView_GetRoot(hwndTree) );
// Remove the image list from the tree-view control.
SetTreeImages( hwndTree, NULL );
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
/* If we have a temporary copy of the user's ratings list, destroy it. */
if ( pPRSD && pPRSD->pTempRatings != NULL )
{
DestroyRatingSystemList(pPRSD->pTempRatings);
pPRSD->pTempRatings = NULL;
}
ControlsShow( tneNone );
}
void CPicsDialog::PicsDlgSave( void )
{
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::PicsDlgSave() - pPRSD is NULL!" );
return;
}
/* To save changes, throw away the user's ratings list and steal the
* temporary copy we're using in the dialog. As an optimization, we
* don't copy it here, because in the case of OK, we'd just be destroying
* the original immediately after this. If the user hit Apply, we'll
* re-clone a new temp ratings list for the dialog's purpose the next
* time we need one.
*
* If there is no temporary copy, then PicsDlgSave is a nop.
*/
if (pPRSD->pTempRatings != NULL)
{
DestroyRatingSystemList(pPRSD->pPU->m_pRatingSystems);
pPRSD->pPU->m_pRatingSystems = pPRSD->pTempRatings;
pPRSD->pTempRatings = NULL;
}
}
#ifdef RATING_LOAD_GRAPHICS /* loading icon out of msrating.dll? completely bogus. */
POINT CPicsDialog::BitmapWindowCoord( int nID )
{
POINT pt;
RECT rD, rI;
pt.x = ::GetWindowRect(GetDlgItem(nID), &rI);
pt.y = GetWindowRect(&rD);
pt.x = rI.left - rD.left;
pt.y = rI.top - rD.top;
return pt;
}
void CPicsDialog::LoadGraphic( char *pIcon, POINT pt )
{
HICON hIcon;
int i;
MyAtoi(pIcon, &i);
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::LoadGraphic() - pPRSD is NULL!" );
return;
}
// No need to pull from msratelc.dll for non-localized icons.
hIcon = pIcon ? LoadIcon( g_hInstance, MAKEINTRESOURCE(i) ) : NULL;
if (hIcon)
{
HWND hwndBitmapCategory;
HWND hDlg = m_hWnd;
ASSERT( hDlg );
if ( ! hDlg )
{
TraceMsg( TF_ERROR, "CPicsDialog::LoadGraphic() - hDlg is NULL!" );
return;
}
hwndBitmapCategory = CreateWindow("Static",NULL,SS_ICON|WS_CHILD, pt.x, pt.y,0,0,hDlg, NULL,NULL,0);
::ShowWindow( hwndBitmapCategory, SW_SHOW );
DeleteObject( (HGDIOBJ) SendMessage( hwndBitmapCategory, STM_SETIMAGE, IMAGE_ICON, (LPARAM) hIcon) );
pPRSD->hwndBitmapCategory = hwndBitmapCategory;
}
}
#endif /* RATING_LOAD_GRAPHICS */
PicsEnum* CPicsDialog::PosToEnum(PicsCategory *pPC, LPARAM lPos)
{
int z, diff=-1, temp;
PicsEnum *pPE=NULL;
for (z=0;z<pPC->arrpPE.Length();++z){
temp = (int) (lPos-pPC->arrpPE[z]->etnValue.Get());
if (temp>=0){
if (temp<diff || diff==-1){
diff = temp;
pPE = pPC->arrpPE[z];
}
}
}
return pPE;
}
void CPicsDialog::NewTrackbarPosition( void )
{
signed long lPos;
TreeNode *pTN;
PicsEnum *pPE;
PicsCategory *pPC;
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::NewTrackbarPosition() - pPRSD is NULL!" );
return;
}
DeleteBitmapWindow( pPRSD->hwndBitmapLabel );
pTN = TreeView_GetSelectionLParam(GetDlgItem(IDC_PT_TREE));
if (pTN == NULL)
return;
pPC = (PicsCategory*) pTN->pData;
BOOL fLabelled = pPC->etfLabelled.fIsInit() && pPC->etfLabelled.Get();
lPos = (long) SendMessage(GetDlgItem(IDC_PT_TB_SELECT), TBM_GETPOS, 0, 0);
pPE = PosToEnum(pPC, fLabelled ? (LPARAM) pPC->arrpPE[lPos]->etnValue.Get() : lPos);
if (pPE)
{
::SetWindowText(GetDlgItem(IDC_PT_T_RSN_SDESC), pPE->etstrName.Get());
::SetWindowText(GetDlgItem(IDC_PT_T_RSN_LDESC),
pPE->etstrDesc.fIsInit() ? pPE->etstrDesc.Get() : szNULL);
}
else
{
char pszBuf[MAXPATHLEN];
char rgBuf[sizeof(pszBuf) + 12]; // big enough to insert a number
MLLoadStringA(IDS_VALUE, pszBuf, sizeof(pszBuf));
wsprintf(rgBuf, pszBuf, lPos);
::SetWindowText(GetDlgItem(IDC_PT_T_RSN_SDESC), rgBuf);
::SetWindowText(GetDlgItem(IDC_PT_T_RSN_LDESC),
pPC->etstrDesc.fIsInit() ? pPC->etstrDesc.Get() : szNULL);
}
/* save the selected value into the temporary ratings list */
UserRating *pRating = GetTempRating( pPC );
if (pRating != NULL)
{
pRating->m_nValue = (int) (fLabelled ? pPC->arrpPE[lPos]->etnValue.Get() : lPos);
}
}
void CPicsDialog::SelectRatingSystemNode( PicsCategory *pPC )
{
HWND hwnd;
BOOL fLabelOnly;
LPARAM lValue;
int z;
ASSERT( pPC );
if ( ! pPC )
{
TraceMsg( TF_ERROR, "CPicsDialog::SelectRatingSystemNode() - pPC is NULL!" );
return;
}
#ifdef RATING_LOAD_GRAPHICS
/*Category Icon*/
if (pPC->etstrIcon.fIsInit())
{
// Load Graphic to m_pPRSD->hwndBitmapCategory
LoadGraphic( pPC->etstrIcon.Get(), BitmapWindowCoord( IDC_PT_T_BITMAP_LABEL ) );
}
#endif
/*Setup Trackbar*/
if ((pPC->etnMax.fIsInit() && P_INFINITY==pPC->etnMax.Get())
||
(pPC->etnMin.fIsInit() && N_INFINITY==pPC->etnMin.Get())
||
(!(pPC->etnMin.fIsInit() && pPC->etnMax.fIsInit()))
)
{
ShowHideControl( IDC_PT_T_RSN_SDESC, FALSE );
ShowHideControl( IDC_PT_T_RSN_LDESC, FALSE );
ShowHideControl( IDC_PT_TB_SELECT, FALSE );
}
else
{
hwnd = GetDlgItem(IDC_PT_TB_SELECT);
SendMessage(hwnd, TBM_CLEARTICS, TRUE, 0);
fLabelOnly = pPC->etfLabelled.fIsInit() && pPC->etfLabelled.Get();
/*Ranges*/
if (pPC->etnMax.fIsInit())
{
lValue = (LPARAM) ( fLabelOnly ? pPC->arrpPE.Length()-1 : pPC->etnMax.Get() );
SendMessage(hwnd, TBM_SETRANGEMAX, TRUE, lValue);
ASSERT(lValue == SendMessage(hwnd, TBM_GETRANGEMAX, 0,0));
}
if (pPC->etnMin.fIsInit())
{
lValue = (LPARAM) ( fLabelOnly ? 0 : pPC->etnMin.Get() );
SendMessage(hwnd, TBM_SETRANGEMIN, TRUE, lValue);
ASSERT(lValue == SendMessage(hwnd, TBM_GETRANGEMIN, 0,0));
}
/*Ticks*/
for (z=0;z<pPC->arrpPE.Length();++z)
{
lValue = (LPARAM) ( fLabelOnly ? z : pPC->arrpPE[z]->etnValue.Get());
SendMessage(hwnd, TBM_SETTIC, 0, lValue);
}
/*Initial Position of trackbar*/
UserRating *pRating = GetTempRating( pPC );
if (pRating != NULL)
{
if (fLabelOnly)
{
for (z=0;z<pPC->arrpPE.Length();++z)
{
if (pPC->arrpPE[z]->etnValue.Get() == pRating->m_nValue)
{
lValue=z;
break;
}
}
}
else
{
lValue = (LPARAM) pRating->m_nValue;
}
}
else
{
lValue = (LPARAM) ( fLabelOnly ? 0 : pPC->etnMin.Get());
}
SendMessage(hwnd, TBM_SETPOS, TRUE, lValue);
// On dialog close, setting the trackbar position fails.
// ASSERT(lValue == SendMessage(hwnd, TBM_GETPOS, 0,0));
NewTrackbarPosition();
}
}
void CPicsDialog::SelectRatingSystemInfo( PicsRatingSystem *pPRS )
{
ASSERT( pPRS );
if ( ! pPRS )
{
TraceMsg( TF_ERROR, "CPicsDialog::SelectRatingSystemInfo() - pPRS is NULL!" );
return;
}
::SetWindowText(GetDlgItem(IDC_PT_T_RSN_LDESC), pPRS->etstrDesc.Get());
#ifdef RATING_LOAD_GRAPHICS
if (pPRS->etstrIcon.fIsInit())
{
// Load Graphic to m_pPRSD->hwndBitmapCategory
LoadGraphic( pPRS->etstrIcon.Get(), BitmapWindowCoord( IDC_PT_T_BITMAP_LABEL ) );
}
#endif
}
void CPicsDialog::DeleteBitmapWindow( HWND & p_rhwnd )
{
if (p_rhwnd)
{
DeleteObject( (HGDIOBJ) SendMessage(p_rhwnd, STM_GETIMAGE, IMAGE_BITMAP, 0));
::DestroyWindow(p_rhwnd);
p_rhwnd = 0;
}
}
void CPicsDialog::ControlsShow( TreeNodeEnum tne )
{
BOOL fEnable;
/*Bitmap placeholders never need to be seen*/
ShowHideControl( IDC_PT_T_BITMAP_CATEGORY, FALSE );
ShowHideControl( IDC_PT_T_BITMAP_LABEL, FALSE );
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
/*Kill old graphic windows*/
if ( pPRSD )
{
DeleteBitmapWindow( pPRSD->hwndBitmapCategory );
DeleteBitmapWindow( pPRSD->hwndBitmapLabel );
}
/*RatingSystemNode Controls*/
fEnable = (tne == tneRatingSystemNode);
ShowHideControl( IDC_PT_T_RSN_SDESC, fEnable );
ShowHideControl( IDC_PT_TB_SELECT, fEnable );
ShowHideControl( IDC_RATING_LABEL, fEnable );
/*RatingSystemInfo Controls*/
fEnable = (tne==tneRatingSystemInfo || tne==tneRatingSystemNode);
ShowHideControl( IDC_PT_T_RSN_LDESC, fEnable);
ShowHideControl( IDC_DETAILSBUTTON, fEnable);
}
TreeNode* CPicsDialog::TreeView_GetSelectionLParam(HWND hwndTree){
TV_ITEM tv;
tv.mask = TVIF_HANDLE | TVIF_PARAM;
tv.hItem = TreeView_GetSelection(hwndTree);
if (SendMessage(hwndTree, TVM_GETITEM, 0, (LPARAM) &tv)) return (TreeNode*) tv.lParam;
else return 0;
}
HTREEITEM CPicsDialog::AddOneItem(HWND hwndTree, HTREEITEM hParent, LPSTR szText, HTREEITEM hInsAfter, LPARAM lpData, int iImage){
HTREEITEM hItem;
TV_ITEM tvI;
TV_INSERTSTRUCT tvIns;
// The .pszText is filled in.
tvI.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvI.iSelectedImage = iImage;
tvI.iImage = iImage;
tvI.pszText = szText;
tvI.cchTextMax = strlenf(szText);
tvI.lParam = lpData;
tvIns.item = tvI;
tvIns.hInsertAfter = hInsAfter;
tvIns.hParent = hParent;
// Insert the item into the tree.
hItem = (HTREEITEM)SendMessage(hwndTree, TVM_INSERTITEM, 0, (LPARAM)(LPTV_INSERTSTRUCT)&tvIns);
return (hItem);
}
void CPicsDialog::AddCategory(PicsCategory *pPC, HWND hwndTree, HTREEITEM hParent){
int z;
char *pc;
TreeNode *pTN;
/*if we have a real name, us it, else use transmission name*/
if (pPC->etstrName.fIsInit())
{
pc = pPC->etstrName.Get();
}
else if (pPC->etstrDesc.fIsInit())
{
pc = pPC->etstrDesc.Get();
}
else
{
pc = (char*) pPC->etstrTransmitAs.Get();
}
/*Category Tab*/
pTN = new TreeNode(tneRatingSystemNode, pPC);
ASSERT(pTN);
/*insert self*/
hParent = AddOneItem(hwndTree, hParent, pc, TVI_SORT, (LPARAM) pTN, g_nKeys);
/*insert children*/
int cChildren = pPC->arrpPC.Length();
if (cChildren > 0) {
for (z = 0; z < cChildren; ++z)
AddCategory(pPC->arrpPC[z], hwndTree, hParent);
TreeView_Expand(hwndTree, hParent, TVE_EXPAND);
}
}
BOOL CPicsDialog::InstallDefaultProvider( void )
{
NLS_STR nlsFilename(MAXPATHLEN);
BOOL fRet = FALSE;
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::InstallDefaultProvider() - pPRSD is NULL!" );
return fRet;
}
if (nlsFilename.QueryError() != ERROR_SUCCESS)
{
TraceMsg( TF_ERROR, "CPicsDialog::InstallDefaultProvider() - nlsFilename Allocation Failed!" );
return fRet;
}
CHAR * pszFileName = nlsFilename.Party();
if (pszFileName)
{
GetSystemDirectory(pszFileName, nlsFilename.QueryAllocSize());
nlsFilename.DonePartying();
LPSTR pszBackslash = ::strrchrf(nlsFilename.QueryPch(), '\\');
if (pszBackslash == NULL || *(pszBackslash+1) != '\0')
nlsFilename.strcat(szBACKSLASH);
nlsFilename.strcat(szDEFAULTRATFILE);
PicsRatingSystem *pPRS;
HRESULT hres = LoadRatingSystem(nlsFilename.QueryPch(), &pPRS);
if (pPRS != NULL)
{
pPRSD->pPRSI->arrpPRS.Append(pPRS);
fRet = TRUE;
}
pPRSD->pPRSI->fRatingInstalled = fRet;
CheckUserSettings(pPRS); /* give user default settings for all categories */
}
else
{
nlsFilename.DonePartying();
}
return fRet;
}
/* GetTempRatingList returns the dialog's temporary copy of the user's rating
* system list. If we don't have any such temporary copy yet, we make one.
*/
UserRatingSystem * CPicsDialog::GetTempRatingList( void )
{
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
if ( ! pPRSD )
{
TraceMsg( TF_ERROR, "CPicsDialog::GetTempRatingList() - pPRSD is NULL!" );
return NULL;
}
if (pPRSD->pTempRatings == NULL)
{
pPRSD->pTempRatings = DuplicateRatingSystemList(pPRSD->pPU->m_pRatingSystems);
}
return pPRSD->pTempRatings;
}
UserRating * CPicsDialog::GetTempRating( PicsCategory *pPC )
{
UserRating *pRating = NULL;
/* save the selected value into the temporary ratings list */
UserRatingSystem *pURS = GetTempRatingList();
LPSTR pszRatingService = pPC->pPRS->etstrRatingService.Get();
if (pURS != NULL)
{
pURS = FindRatingSystem(pURS, pszRatingService);
}
if (pURS == NULL)
{
pURS = new UserRatingSystem;
if (pURS == NULL)
{
TraceMsg( TF_ERROR, "CPicsDialog::GetTempRating() - pURS is NULL!" );
return NULL;
}
PRSD * pPRSD = m_pPRSD;
ASSERT( pPRSD );
pURS->SetName(pszRatingService);
pURS->m_pNext = pPRSD ? pPRSD->pTempRatings : NULL;
pURS->m_pPRS = pPC->pPRS;
if ( pPRSD )
{
pPRSD->pTempRatings = pURS;
}
}
LPSTR pszRatingName = pPC->etstrTransmitAs.Get();
pRating = pURS->FindRating(pszRatingName);
if (pRating == NULL)
{
pRating = new UserRating;
if (pRating == NULL)
{
TraceMsg( TF_ERROR, "CPicsDialog::GetTempRating() - pRating is NULL!" );
return NULL;
}
pRating->SetName(pszRatingName);
pRating->m_pPC = pPC;
if (!pPC->etnMin.fIsInit() || (pPC->etfLabelled.fIsInit() && pPC->etfLabelled.Get()))
{
pRating->m_nValue = 0;
}
else
{
pRating->m_nValue = pPC->etnMin.Get();
}
pURS->AddRating(pRating);
}
return pRating;
}