#include "stdafx.h"
#include "PrinterSetupWizardApp.h"
#include "PrinterSetupWizardSheet.h"
#include "SecondPage.h"
#include "DebugServices.h"
#include "WinServices.h"
#include <winspool.h>
#pragma warning(disable:4189)
IMPLEMENT_DYNAMIC(CSecondPage, CPropertyPage)
CSecondPage::CSecondPage()
: CPropertyPage(CSecondPage::IDD)
{
m_psp.dwFlags &= ~(PSP_HASHELP);
m_psp.dwFlags |= PSP_DEFAULT|PSP_USEHEADERTITLE|PSP_USEHEADERSUBTITLE;
m_psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_BROWSE_TITLE);
m_psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_BROWSE_SUBTITLE);
m_emptyListItem = NULL;
m_initialized = false;
m_waiting = false;
}
CSecondPage::~CSecondPage()
{
}
void
CSecondPage::InitBrowseList()
{
CPrinterSetupWizardSheet * psheet;
CString text;
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
psheet->SetSelectedPrinter( NULL );
m_gotChoice = false;
m_browseList.Select( NULL, TVGN_FIRSTVISIBLE );
text.LoadString(IDS_NO_PRINTERS);
LoadTextAndDisableWindow( text );
psheet->SetWizardButtons(PSWIZB_BACK);
SetPrinterInformationState( FALSE );
m_descriptionField.SetWindowText( L"" );
m_locationField.SetWindowText( L"" );
exit:
return;
}
void CSecondPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BROWSE_LIST, m_browseList);
DDX_Control(pDX, IDC_PRINTER_INFORMATION, m_printerInformation);
DDX_Control(pDX, IDC_DESCRIPTION_LABEL, m_descriptionLabel);
DDX_Control(pDX, IDC_DESCRIPTION_FIELD, m_descriptionField);
DDX_Control(pDX, IDC_LOCATION_LABEL, m_locationLabel);
DDX_Control(pDX, IDC_LOCATION_FIELD, m_locationField);
}
afx_msg BOOL
CSecondPage::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message)
{
DEBUG_UNUSED(pWnd);
DEBUG_UNUSED(nHitTest);
DEBUG_UNUSED(message);
CPrinterSetupWizardSheet * psheet;
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
SetCursor(psheet->GetCursor());
exit:
return TRUE;
}
BOOL
CSecondPage::OnSetActive()
{
CPrinterSetupWizardSheet * psheet;
Printer * printer;
Printers::iterator it;
OSStatus err = kNoErr;
BOOL b;
b = CPropertyPage::OnSetActive();
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_action( psheet, exit, err = kUnknownErr );
printer = psheet->GetSelectedPrinter();
InitBrowseList();
for ( it = psheet->m_printers.begin(); it != psheet->m_printers.end(); it++ )
{
OnAddPrinter( *it, false );
}
if ( ( psheet->GetLastPage() == psheet->GetPage( 2 ) ) && printer )
{
psheet->SetSelectedPrinter( printer );
m_browseList.Select( printer->item, TVGN_FIRSTVISIBLE );
}
exit:
return b;
}
BOOL
CSecondPage::OnKillActive()
{
CPrinterSetupWizardSheet * psheet;
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
psheet->SetLastPage(this);
exit:
return CPropertyPage::OnKillActive();
}
BEGIN_MESSAGE_MAP(CSecondPage, CPropertyPage)
ON_NOTIFY(TVN_SELCHANGED, IDC_BROWSE_LIST, OnTvnSelchangedBrowseList)
ON_NOTIFY(NM_CLICK, IDC_BROWSE_LIST, OnNmClickBrowseList)
ON_NOTIFY(TVN_KEYDOWN, IDC_BROWSE_LIST, OnTvnKeyDownBrowseList)
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
OSStatus
CSecondPage::OnAddPrinter(
Printer * printer,
bool moreComing )
{
CPrinterSetupWizardSheet * psheet;
OSStatus err = kNoErr;
check( IsWindow( m_hWnd ) );
m_browseList.SetRedraw(FALSE);
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
printer->item = m_browseList.InsertItem(printer->displayName);
m_browseList.SetItemData( printer->item, (DWORD_PTR) printer );
m_browseList.SortChildren(TVI_ROOT);
if (m_emptyListItem != NULL)
{
m_browseList.DeleteItem(m_emptyListItem);
m_emptyListItem = NULL;
m_browseList.EnableWindow(TRUE);
}
exit:
if (!moreComing)
{
m_browseList.SetRedraw(TRUE);
m_browseList.Invalidate();
}
return err;
}
OSStatus
CSecondPage::OnRemovePrinter(
Printer * printer,
bool moreComing)
{
CPrinterSetupWizardSheet * psheet;
OSStatus err = kNoErr;
check( IsWindow( m_hWnd ) );
check( printer );
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
m_browseList.SetRedraw(FALSE);
if (m_browseList.GetCount() > 1)
{
m_browseList.DeleteItem( printer->item );
}
else
{
InitBrowseList();
}
exit:
if ( !moreComing )
{
m_browseList.SetRedraw(TRUE);
m_browseList.Invalidate();
}
return err;
}
void
CSecondPage::OnResolveService( Service * service )
{
CPrinterSetupWizardSheet * psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_quiet( psheet, exit );
check( service );
Queue * q = service->SelectedQueue();
check( q );
m_selectedName = service->printer->name;
SetPrinterInformationState( TRUE );
m_descriptionField.SetWindowText( q->description );
m_locationField.SetWindowText( q->location );
SetCursor(psheet->m_active);
exit:
return;
}
void CSecondPage::OnTvnSelchangedBrowseList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
CPrinterSetupWizardSheet * psheet;
Printer * printer;
int err = 0;
psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
require_action( psheet, exit, err = kUnknownErr );
if ( !m_gotChoice )
{
printer = psheet->GetSelectedPrinter();
if ( !printer )
{
m_browseList.SelectItem( NULL );
goto exit;
}
else if ( printer->item != m_browseList.GetSelectedItem() )
{
m_gotChoice = true;
m_browseList.SelectItem( printer->item );
goto exit;
}
}
HTREEITEM item = m_browseList.GetSelectedItem();
require_quiet( item, exit );
printer = reinterpret_cast<Printer*>(m_browseList.GetItemData( item ) );
require_quiet( printer, exit );
err = psheet->StartResolve( printer );
require_noerr( err, exit );
SetPrinterInformationState( FALSE );
m_descriptionField.SetWindowText(L"");
m_locationField.SetWindowText(L"");
exit:
if (err != 0)
{
CString text;
CString caption;
text.LoadString(IDS_ERROR_SELECTING_PRINTER_TEXT);
caption.LoadString(IDS_ERROR_SELECTING_PRINTER_CAPTION);
MessageBox(text, caption, MB_OK|MB_ICONEXCLAMATION);
}
*pResult = 0;
}
void CSecondPage::OnNmClickBrowseList(NMHDR *pNMHDR, LRESULT *pResult)
{
DEBUG_UNUSED( pNMHDR );
m_gotChoice = true;
*pResult = 0;
}
void CSecondPage::OnTvnKeyDownBrowseList( NMHDR * pNMHDR, LRESULT * pResult)
{
DEBUG_UNUSED( pNMHDR );
m_gotChoice = true;
*pResult = 0;
}
void
CSecondPage::LoadTextAndDisableWindow( CString & text )
{
m_emptyListItem = m_browseList.InsertItem( text, 0, 0, NULL, TVI_FIRST );
m_browseList.SelectItem( NULL );
if ( m_emptyListItem )
{
HTREEITEM item = m_browseList.GetNextVisibleItem( m_emptyListItem );
while ( item )
{
m_browseList.DeleteItem( item );
item = m_browseList.GetNextVisibleItem( m_emptyListItem );
}
}
m_browseList.EnableWindow( FALSE );
}
void
CSecondPage::SetPrinterInformationState( BOOL state )
{
m_printerInformation.EnableWindow( state );
m_descriptionLabel.EnableWindow( state );
m_descriptionField.EnableWindow( state );
m_locationLabel.EnableWindow( state );
m_locationField.EnableWindow( state );
}