480 lines
11 KiB
C++
480 lines
11 KiB
C++
/************************************************************************
|
|
|
|
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
|