|
|
/************************************************************************
Copyright (c) Microsoft Corporation 1997-1999 All rights reserved
***************************************************************************/
//
// GROUPS.CPP - Handles the "IntelliMirror Group" IDD_PROP_GROUPS tab
//
#include "pch.h"
#ifdef INTELLIMIRROR_GROUPS
#include "cservice.h"
#include "cgroup.h"
#include "groups.h"
DEFINE_MODULE("IMADMUI") DEFINE_THISCLASS("CGroupsTab") #define THISCLASS CGroupsTab
#define LPTHISCLASS LPCGroupsTab
#define NUM_COLUMNS 4
#define MAX_ITEMLEN 20
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define LG_BITMAP_WIDTH 32
#define LG_BITMAP_HEIGHT 32
DWORD aGroupHelpMap[] = { NULL, NULL };
//
// CreateInstance()
//
LPVOID CGroupsTab_CreateInstance( void ) { TraceFunc( "CGroupsTab_CreateInstance()\n" );
LPTHISCLASS lpcc = new THISCLASS( ); HRESULT hr = THR( lpcc->Init( ) );
if ( hr ) { delete lpcc; RETURN(NULL); }
RETURN((LPVOID) lpcc); }
//
// Constructor
//
THISCLASS::THISCLASS( ) { TraceClsFunc( "CGroupsTab()\n" );
InterlockIncrement( g_cObjects );
TraceFuncExit(); }
//
// Init()
//
STDMETHODIMP THISCLASS::Init( ) { HRESULT hr = S_OK;
TraceClsFunc( "Init()\n" );
HRETURN(hr); }
//
// Destructor
//
THISCLASS::~THISCLASS( ) { TraceClsFunc( "~CGroupsTab()\n" );
if ( _punk ) _punk->Release( );
InterlockDecrement( g_cObjects );
TraceFuncExit(); };
// *************************************************************************
//
// ITab
//
// *************************************************************************
STDMETHODIMP THISCLASS::AddPages( LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam, LPUNKNOWN punk ) { TraceClsFunc( "AddPages( )\n" );
HRESULT hr = S_OK; PROPSHEETPAGE psp; HPROPSHEETPAGE hpage;
psp.dwSize = sizeof(psp); psp.dwFlags = PSP_USEREFPARENT | PSP_USECALLBACK; psp.hInstance = (HINSTANCE) g_hInstance; psp.pszTemplate = MAKEINTRESOURCE(IDD_PROP_GROUPS); psp.pcRefParent = (UINT *) &g_cObjects; psp.pfnCallback = (LPFNPSPCALLBACK) PropSheetPageProc; psp.pfnDlgProc = PropSheetDlgProc; psp.lParam = (LPARAM) this;
hpage = CreatePropertySheetPage( &psp ); if ( hpage ) { if ( !lpfnAddPage( hpage, lParam ) ) { DestroyPropertySheetPage( hpage ); hr = E_FAIL; goto Error; } }
punk->AddRef( ); // matching Release in the destructor
_punk = punk;
Error: HRETURN(hr); }
//
// ReplacePage()
//
STDMETHODIMP THISCLASS::ReplacePage( UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam, LPUNKNOWN punk ) {
TraceClsFunc( "ReplacePage( ) *** NOT_IMPLEMENTED ***\n" );
HRETURN(E_NOTIMPL); }
//
// QueryInformation( )
//
STDMETHODIMP THISCLASS::QueryInformation( LPWSTR pszAttribute, LPWSTR * pszResult ) { TraceClsFunc( "QueryInformation( )\n" );
HRETURN(E_NOTIMPL); }
//
// AllowActivation( )
//
STDMETHODIMP THISCLASS::AllowActivation( BOOL * pfAllow ) { TraceClsFunc( "AllowActivation( )\n" );
HRETURN(E_NOTIMPL); }
// ************************************************************************
//
// Property Sheet Functions
//
// ************************************************************************
//
// _InitDialog( )
//
HRESULT THISCLASS::_InitDialog( HWND hDlg, LPARAM lParam ) { TraceClsFunc( "_InitDialog( )\n" );
HRESULT hr = S_OK; LPSERVICE ps = NULL; ULONG cFetched; HWND hwnd = GetDlgItem( _hDlg, IDC_L_GROUPS ); HICON hIcon; // handle to an icon
int index; // index used in for loops
int iSubItem; // index into column header string table
LV_COLUMN lvC; // list view column structure
LV_ITEM lvI; // list view item structure
WCHAR szText [MAX_PATH]; // place to store some text
IEnumSAPs * penum = NULL; HIMAGELIST hSmall, hLarge; // handles to image lists for small and large icons
_hDlg = hDlg; SetWindowLong( _hDlg, GWL_USERDATA, (LPARAM) this ); _fChanged = TRUE; // prevent Apply button from coming on
// Initialize the list view icons
hSmall = ImageList_Create ( BITMAP_WIDTH, BITMAP_HEIGHT, FALSE, 3, 0 ); hLarge = ImageList_Create ( LG_BITMAP_WIDTH, LG_BITMAP_HEIGHT, FALSE, 3, 0 ); hIcon = LoadIcon ( g_hInstance, MAKEINTRESOURCE( IDI_COMPUTER ) ); if (( ImageList_AddIcon( hSmall, hIcon ) == -1) || ( ImageList_AddIcon( hLarge, hIcon ) == -1)) { hr = THR( E_FAIL ); goto Error; }
// Associate the image lists with the list view control.
ListView_SetImageList( hwnd, hSmall, LVSIL_SMALL ); ListView_SetImageList( hwnd, hLarge, LVSIL_NORMAL );
// Initialize the columns
lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT; // left-align column
lvC.cx = 75; // width of column in pixels
lvC.pszText = szText;
// Add the columns.
for ( index = 0; index < NUM_COLUMNS; index++ ) { DWORD dw; dw = LoadString( g_hInstance, IDS_COLUMN1 + index, szText, ARRAYSIZE ( szText ) ); Assert(dw);
lvC.iSubItem = index;
if ( ListView_InsertColumn( hwnd, index, &lvC ) == -1 ) { hr = THR( E_FAIL ); goto Error; } }
// Finally, add the actual items to the control.
lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0;
hr = THR( _punk->QueryInterface( IID_IEnumSAPs, (void**) &penum ) ); if (hr) goto Error;
index = 0; while( ( hr = penum->Next( 1, &ps, &cFetched ) ) == S_OK ) { LPWSTR pszServerName;
hr = THR( ps->GetServerDN( &pszServerName ) ); if (hr) goto Error;
ps->Release( ); ps = NULL;
// The parent window is responsible for storing the text.
// The list view control will send an LVN_GETDISPINFO
// when it needs the text to display.
lvI.pszText = pszServerName; lvI.iItem = index; lvI.iSubItem = 0; lvI.cchTextMax = MAX_ITEMLEN; lvI.iImage = 0; lvI.lParam = NULL; // DEADISSUE: Ifdef'd out. BUGBUG: should point to a SAPNODE,
if ( ListView_InsertItem( hwnd, &lvI) == -1 ) { hr = THR( E_FAIL ); goto Error; }
for ( iSubItem = 1; iSubItem < NUM_COLUMNS; iSubItem++ ) { ListView_SetItemText( hwnd, index, iSubItem, pszServerName ); } }
// hr should equal S_FALSE
if ( hr != S_FALSE ) { THR(hr); goto Error; }
hr = S_OK;
Cleanup: if ( ps ) ps->Release( ); if ( penum ) penum->Release( );
_fChanged = FALSE;
HRETURN(hr);
Error: switch (hr) { case S_OK: break; default: MessageBoxFromHResult( NULL, IDS_ERROR_OPENNINGGROUPOBJECT, hr ); break; } goto Cleanup; }
//
// _OnCommand( )
//
BOOL THISCLASS::_OnCommand( WPARAM wParam, LPARAM lParam ) { TraceClsFunc( "_OnCommand( " ); TraceMsg( TF_FUNC, "wParam = 0x%08x, lParam = 0x%08x )\n", wParam, lParam );
HRESULT hr; BOOL fChanged = FALSE; BOOL fResult = FALSE; HWND hwndCtl = (HWND) lParam;
switch( LOWORD(wParam) ) { case 0: //dummy;
default: hr = S_FALSE; break; }
if ( fChanged ) { if ( !_fChanged ) { _fChanged = TRUE; SendMessage( GetParent( _hDlg ), PSM_CHANGED, 0, 0 ); } }
RETURN(fResult); }
//
// _OnNotify( )
//
INT THISCLASS::_OnNotify( WPARAM wParam, LPARAM lParam ) { TraceClsFunc( "_OnNotify( " ); TraceMsg( TF_FUNC, "wParam = 0x%08x, lParam = 0x%08x )\n", wParam, lParam );
LPNMHDR lpnmhdr = (LPNMHDR) lParam;
switch( lpnmhdr->code ) { case PSN_APPLY: TraceMsg( TF_WM, TEXT("WM_NOTIFY: PSN_APPLY\n")); AssertMsg( 0, "Need to implement this." ); SetWindowLong( _hDlg, DWL_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE ); _fChanged = FALSE; RETURN(TRUE);
case LVN_GETDISPINFO: break;
default: break; }
RETURN(FALSE); }
//
// PropSheetDlgProc()
//
INT_PTR CALLBACK THISCLASS::PropSheetDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { //TraceMsg( TEXT("PropSheetDlgProc(") );
//TraceMsg( TF_FUNC, TEXT(" hDlg = 0x%08x, uMsg = 0x%08x, wParam = 0x%08x, lParam = 0x%08x )\n"),
// hDlg, uMsg, wParam, lParam );
LPTHISCLASS pcc = (LPTHISCLASS) GetWindowLong( hDlg, GWL_USERDATA );
if ( uMsg == WM_INITDIALOG ) { TraceMsg( TF_WM, TEXT("WM_INITDIALOG\n"));
LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE) lParam; pcc = (LPTHISCLASS) psp->lParam; pcc->_InitDialog( hDlg, lParam ); }
if (pcc) { Assert( hDlg == pcc->_hDlg );
switch ( uMsg ) { case WM_NOTIFY: return pcc->_OnNotify( wParam, lParam );
case WM_COMMAND: TraceMsg( TF_WM, TEXT("WM_COMMAND\n") ); return pcc->_OnCommand( wParam, lParam );
case WM_HELP:// F1
{ LPHELPINFO phelp = (LPHELPINFO) lParam; WinHelp( (HWND) phelp->hItemHandle, g_cszHelpFile, HELP_WM_HELP, (DWORD_PTR) &aGroupHelpMap ); } break; case WM_CONTEXTMENU: // right mouse click
WinHelp((HWND) wParam, g_cszHelpFile, HELP_CONTEXTMENU, (DWORD_PTR) &aGroupHelpMap ); break; } }
return FALSE; }
//
// PropSheetPageProc()
//
UINT CALLBACK THISCLASS::PropSheetPageProc( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp ) { TraceClsFunc( "PropSheetPageProc( " ); TraceMsg( TF_FUNC, TEXT("hwnd = 0x%08x, uMsg = 0x%08x, ppsp= 0x%08x )\n"), hwnd, uMsg, ppsp );
switch ( uMsg ) { case PSPCB_CREATE: RETURN(TRUE); // create it
break;
case PSPCB_RELEASE: LPTHISCLASS pcc = (LPTHISCLASS) ppsp->lParam; delete pcc; break; }
RETURN(FALSE); }
#endif
|