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 ); // Stash the selected printer if any printer = psheet->GetSelectedPrinter(); // initialize the browse list...this will remove everything currently // in it, and add the no printers item InitBrowseList(); // Populate the list with any printers that we currently know about for ( it = psheet->m_printers.begin(); it != psheet->m_printers.end(); it++ ) { OnAddPrinter( *it, false ); } if ( ( !printer && ( psheet->m_printers.size() > 0 ) ) || ( printer != psheet->GetSelectedPrinter() ) ) { if ( !printer ) { printer = psheet->m_printers.front(); } psheet->SetSelectedPrinter( printer ); } if ( printer ) { m_browseList.SelectItem( printer->item ); ::SetFocus( m_browseList ); } exit: return b; }
// Printer::EventHandler implementation OSStatus CSecondPage::OnAddPrinter( Printer * printer, bool moreComing ) { CPrinterSetupWizardSheet * psheet; Printer * selectedPrinter; OSStatus err = kNoErr; check( IsWindow( m_hWnd ) ); m_browseList.SetRedraw(FALSE); psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); selectedPrinter = psheet->GetSelectedPrinter(); printer->item = m_browseList.InsertItem(printer->displayName); m_browseList.SetItemData( printer->item, (DWORD_PTR) printer ); m_browseList.SortChildren(TVI_ROOT); // // if the searching item is still in the list // get rid of it // // note that order is important here. Insert the printer // item before removing the placeholder so we always have // an item in the list to avoid experiencing the bug // in Microsoft's implementation of CTreeCtrl // if (m_emptyListItem != NULL) { m_browseList.DeleteItem(m_emptyListItem); m_emptyListItem = NULL; m_browseList.EnableWindow(TRUE); } if ( !selectedPrinter ) { psheet->SetSelectedPrinter( printer ); m_browseList.SelectItem( printer->item ); ::SetFocus( m_browseList ); } exit: if (!moreComing) { m_browseList.SetRedraw(TRUE); m_browseList.Invalidate(); } return err; }
BOOL CSecondPage::OnSetActive() { CPrinterSetupWizardSheet * psheet; Printer * printer; OSStatus err = kNoErr; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_action( psheet, exit, err = kUnknownErr ); if ( ( printer = psheet->GetSelectedPrinter() ) != NULL ) { psheet->SetSelectedPrinter( NULL ); delete printer; } // // initialize the browse list...this will remove everything currently // in it, and add the no rendezvous printers item // InitBrowseList(); // // start browing // err = StartBrowse(); require_noerr( err, exit ); exit: if ( err != kNoErr ) { if ( err == kDNSServiceErr_Firewall ) { CString text, caption; text.LoadString( IDS_FIREWALL ); caption.LoadString( IDS_FIREWALL_CAPTION ); MessageBox(text, caption, MB_OK|MB_ICONEXCLAMATION); } else { CPrinterSetupWizardSheet::WizardException exc; exc.text.LoadString( IDS_NO_MDNSRESPONDER_SERVICE_TEXT ); exc.caption.LoadString( IDS_ERROR_CAPTION ); throw(exc); } } return CPropertyPage::OnSetActive(); }
void CThirdPage::OnBnClickedDefaultPrinter() { CPrinterSetupWizardSheet * psheet; Printer * printer; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); printer = psheet->GetSelectedPrinter(); require_quiet( printer, exit ); printer->deflt = ( m_defaultPrinterCtrl.GetCheck() == BST_CHECKED ) ? true : false; exit: return; }
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 ); // Stash the selected printer if any printer = psheet->GetSelectedPrinter(); // initialize the browse list...this will remove everything currently // in it, and add the no printers item InitBrowseList(); // Populate the list with any printers that we currently know about for ( it = psheet->m_printers.begin(); it != psheet->m_printers.end(); it++ ) { OnAddPrinter( *it, false ); } // And if we hit 'Back' from page 3, then re-select printer if ( ( psheet->GetLastPage() == psheet->GetPage( 2 ) ) && printer ) { psheet->SetSelectedPrinter( printer ); m_browseList.Select( printer->item, TVGN_FIRSTVISIBLE ); } exit: return b; }
void CThirdPage::OnLvnItemchangedPrinterModel(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); CPrinterSetupWizardSheet * psheet; Printer * printer; Service * service; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); printer = psheet->GetSelectedPrinter(); require_quiet( printer, exit ); service = printer->services.front(); require_quiet( service, exit ); check ( m_manufacturerSelected ); POSITION p = m_modelListCtrl.GetFirstSelectedItemPosition(); int nSelected = m_modelListCtrl.GetNextSelectedItem(p); if (nSelected != -1) { m_modelSelected = (Model*) m_modelListCtrl.GetItemData(nSelected); CopyPrinterSettings( printer, service, m_manufacturerSelected, m_modelSelected ); psheet->SetWizardButtons(PSWIZB_BACK|PSWIZB_NEXT); } else { psheet->SetWizardButtons(PSWIZB_BACK); } exit: *pResult = 0; }
void CThirdPage::OnBnClickedHaveDisk() { CPrinterSetupWizardSheet * psheet; Printer * printer; Service * service; Manufacturers manufacturers; CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_FILEMUSTEXIST, L"Setup Information (*.inf)|*.inf||", this); psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); printer = psheet->GetSelectedPrinter(); require_quiet( printer, exit ); service = printer->services.front(); require_quiet( service, exit ); for ( ;; ) { if ( dlg.DoModal() == IDOK ) { CString filename = dlg.GetPathName(); LoadPrintDriverDefsFromFile( manufacturers, filename, true ); // Sanity check if ( manufacturers.size() > 0 ) { PopulateUI( manufacturers ); if ( MatchPrinter( manufacturers, printer, service, false ) != kNoErr ) { CString errorMessage; CString errorCaption; errorMessage.LoadString( IDS_NO_MATCH_INF_FILE ); errorCaption.LoadString( IDS_NO_MATCH_INF_FILE_CAPTION ); MessageBox( errorMessage, errorCaption, MB_OK ); } break; } else { CString errorMessage; CString errorCaption; errorMessage.LoadString( IDS_BAD_INF_FILE ); errorCaption.LoadString( IDS_BAD_INF_FILE_CAPTION ); MessageBox( errorMessage, errorCaption, MB_OK ); } } else { break; } } exit: FreeManufacturers( manufacturers ); return; }
BOOL CThirdPage::OnSetActive() { CPrinterSetupWizardSheet * psheet; Printer * printer; Service * service; psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent()); require_quiet( psheet, exit ); psheet->SetWizardButtons( PSWIZB_BACK ); printer = psheet->GetSelectedPrinter(); require_quiet( printer, exit ); service = printer->services.front(); require_quiet( service, exit ); // // call OnInitPage once // if (!m_initialized) { OnInitPage(); m_initialized = true; } // // <rdar://problem/4580061> mDNS: Printers added using Bonjour should be set as the default printer. // if ( DefaultPrinterExists() ) { m_defaultPrinterCtrl.SetCheck( BST_UNCHECKED ); printer->deflt = false; } else { m_defaultPrinterCtrl.SetCheck( BST_CHECKED ); printer->deflt = true; } // // update the UI with the printer name // m_printerName.SetWindowText(printer->displayName); // // populate the list controls with the manufacturers and models // from ntprint.inf // PopulateUI( m_manufacturers ); // // and try and match the printer // if ( psheet->GetLastPage() == psheet->GetPage(0) ) { MatchPrinter( m_manufacturers, printer, service, true ); if ( ( m_manufacturerSelected != NULL ) && ( m_modelSelected != NULL ) ) { GetParent()->PostMessage(PSM_SETCURSEL, 2 ); } } else { SelectMatch(printer, service, m_manufacturerSelected, m_modelSelected); } exit: return CPropertyPage::OnSetActive(); }
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 ); // The strange code here is to workaround a bug in the CTreeCtrl, whereupon the item // we selected isn't passed through correctly to this callback routine. if ( !m_gotChoice ) { printer = psheet->GetSelectedPrinter(); // If we really haven't selected a printer, then re-select NULL and exit if ( !printer ) { m_browseList.SelectItem( NULL ); goto exit; } // If we already have selected a printer, fake like we've clicked on it, but only // if the CTreeCtrl hasn't already selected it 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 ); // // this call will trigger a resolve. When the resolve is complete, // our OnResolve will be called. // err = psheet->StartResolve( printer ); require_noerr( err, exit ); // // And clear out the printer information box // 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; }