]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - Clients/PrinterSetupWizard/SecondPage.cpp
mDNSResponder-87.tar.gz
[apple/mdnsresponder.git] / Clients / PrinterSetupWizard / SecondPage.cpp
diff --git a/Clients/PrinterSetupWizard/SecondPage.cpp b/Clients/PrinterSetupWizard/SecondPage.cpp
new file mode 100644 (file)
index 0000000..abf4fa0
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+
+    Change History (most recent first):
+    
+$Log: SecondPage.cpp,v $
+Revision 1.3  2004/09/13 21:26:15  shersche
+<rdar://problem/3796483> Use the moreComing flag to determine whether drawing should take place in OnAddPrinter and OnRemovePrinter callbacks
+Bug #: 3796483
+
+Revision 1.2  2004/06/26 03:19:57  shersche
+clean up warning messages
+
+Submitted by: herscher
+
+Revision 1.1  2004/06/18 04:36:57  rpantos
+First checked in
+
+
+*/
+
+#include "stdafx.h"
+#include "PrinterSetupWizardApp.h"
+#include "PrinterSetupWizardSheet.h"
+#include "SecondPage.h"
+#include "DebugServices.h"
+
+// local variable is initialize but not referenced
+#pragma warning(disable:4189)
+
+
+// CSecondPage dialog
+
+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_resolver                      =       NULL;
+       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 );
+
+       //
+       // load the no rendezvous printers message until something shows up in the browse list
+       //
+       text.LoadString(IDS_NO_RENDEZVOUS_PRINTERS);
+
+       m_emptyListItem = m_browseList.InsertItem( text, 0, 0, NULL, TVI_FIRST );
+
+       //
+       // this will remove everything else in the list...we might be navigating
+       // back to this window, and the browse list might have changed since
+       // we last displayed it.
+       //
+       if ( m_emptyListItem )
+       {
+               HTREEITEM item = m_browseList.GetNextVisibleItem( m_emptyListItem );
+  
+               while ( item )
+               {
+                       m_browseList.DeleteItem( item );
+                       item = m_browseList.GetNextVisibleItem( m_emptyListItem );
+               }
+       }
+
+       //
+       // disable the next button until there's a printer to select
+       //
+       psheet->SetWizardButtons(PSWIZB_BACK);
+
+       //
+       // disable the window until there's a printer to select
+       //
+       m_browseList.EnableWindow( FALSE );
+
+exit:
+
+       return;
+}
+
+
+void CSecondPage::DoDataExchange(CDataExchange* pDX)
+{
+       CPropertyPage::DoDataExchange(pDX);
+       DDX_Control(pDX, IDC_BROWSE_LIST, m_browseList);
+}
+
+
+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()
+{
+       CString                                                 noPrinters;
+       CPrinterSetupWizardSheet        *       psheet;
+
+       psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
+       require_quiet( psheet, exit );
+  
+       //
+       // initialize the browse list...this will remove everything currently
+       // in it, and add the no rendezvous printers item
+       //
+       InitBrowseList();
+
+       //
+       // this will invoke OnAddPrinter for all the printers that we have
+       // browsed
+       //
+       psheet->InstallEventHandler(this);
+
+exit:
+
+       return CPropertyPage::OnSetActive();
+}
+
+
+BOOL
+CSecondPage::OnKillActive()
+{
+       CPrinterSetupWizardSheet * psheet;
+
+       psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
+       require_quiet( psheet, exit );
+
+       //
+       // we don't want our event handlers called when we don't have
+       // anywhere to put the data
+       //
+       psheet->RemoveEventHandler(this);
+
+exit:
+
+       return CPropertyPage::OnKillActive();
+}
+
+
+BEGIN_MESSAGE_MAP(CSecondPage, CPropertyPage)
+       ON_NOTIFY(TVN_SELCHANGED, IDC_BROWSE_LIST, OnTvnSelchangedBrowseList)
+       ON_WM_SETCURSOR()
+END_MESSAGE_MAP()
+
+
+// Printer::EventHandler implementation
+void
+CSecondPage::OnAddPrinter(
+                                               Printer *       printer,
+                                               bool                    moreComing)
+{
+       check( IsWindow( m_hWnd ) );
+
+       m_browseList.SetRedraw(FALSE);
+
+       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 (!moreComing)
+       {
+               m_browseList.SetRedraw(TRUE);
+               m_browseList.Invalidate();
+       }
+}
+
+
+void
+CSecondPage::OnRemovePrinter(
+                                               Printer *       printer,
+                                               bool                    moreComing)
+{
+       check( IsWindow( m_hWnd ) );
+
+       m_browseList.SetRedraw(FALSE);
+
+       //
+       // check to make sure if we're the only item in the control...i.e.
+       // the list size is 1.
+       //
+       if (m_browseList.GetCount() > 1)
+       {
+               //
+               // if we're not the only thing in the list, then
+               // simply remove it from the list
+               //
+               m_browseList.DeleteItem( printer->item );
+       }
+       else
+       {
+               //
+               // if we're the only thing in the list, then redisplay
+               // it with the no rendezvous printers message
+               //
+               InitBrowseList();
+       }
+
+       if (!moreComing)
+       {
+               m_browseList.SetRedraw(TRUE);
+               m_browseList.Invalidate();
+       }
+}
+
+
+void
+CSecondPage::OnResolvePrinter(
+                                               Printer * printer)
+{
+       DEBUG_UNUSED(printer);
+
+       check( IsWindow( m_hWnd ) );
+
+       CPrinterSetupWizardSheet * psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
+       require_quiet( psheet, exit );
+   
+       //
+       // setup the sheet to enable the next button if we've successfully
+       // resolved
+       //
+       psheet->SetWizardButtons( PSWIZB_BACK|PSWIZB_NEXT );
+
+exit:
+
+       return;
+}
+
+
+void CSecondPage::OnTvnSelchangedBrowseList(NMHDR *pNMHDR, LRESULT *pResult)
+{
+       LPNMTREEVIEW                                    pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
+       CPrinterSetupWizardSheet        *       psheet;
+       int                                                             err = 0;
+
+       HTREEITEM item = m_browseList.GetSelectedItem();
+       require_quiet( item, exit );
+
+       psheet = reinterpret_cast<CPrinterSetupWizardSheet*>(GetParent());
+       require_action( psheet, exit, err = kUnknownErr );      
+
+       Printer * printer;
+
+       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->SetSelectedPrinter(printer);
+       require_noerr( err, exit );
+
+       //
+       // setup the sheet to disable the next button until we've successfully
+       // resolved this printer
+       //
+       psheet->SetWizardButtons( PSWIZB_BACK );
+
+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;
+}