//============================================================================= // (c) Copyright Wang Laboratories, Inc. 1995 All rights reserved. //----------------------------------------------------------------------------- // Project: Norway - Scan OCX // // Component: Scan UI (Dialog Prompt) // // File Name: scandlg.cpp // // Class: CScanDlg // // Functions: //----------------------------------------------------------------------------- // Maintenance Log: /* $Header: S:\products\wangview\norway\scanocx\scandlg.cpv 1.66 15 Mar 1996 12:36:52 PXJ53677 $ $Log: S:\products\wangview\norway\scanocx\scandlg.cpv $ Rev 1.66 15 Mar 1996 12:36:52 PXJ53677 Added support for the location in scan new dialog. Rev 1.65 12 Mar 1996 11:12:50 PXJ53677 Update setup button and the show UI flag. Rev 1.64 21 Feb 1996 13:34:12 PAJ Fix bug with filters. Rev 1.63 20 Feb 1996 11:35:42 PAJ Added new compression dialog. Rev 1.62 14 Feb 1996 10:01:44 RWR Rename "scan.h" to "ocxscan.h" to fix header file name conflict Rev 1.61 09 Feb 1996 10:12:50 PAJ Added AWD support flag. Rev 1.60 30 Nov 1995 14:31:20 PAJ Added MB_TASKMODAL to messageboxes after TWAIN calls. Rev 1.59 17 Nov 1995 10:49:36 PAJ Change title and message for 32-bit TWAIN missing. Rev 1.58 16 Nov 1995 16:18:38 PAJ Added TWAIN error abort. Rev 1.57 16 Nov 1995 13:40:08 PAJ Fix browse file not found. Rev 1.56 16 Nov 1995 12:56:52 PAJ Merge developement and release. Fix Fax Cancel bug 5294 and browse bug 5287. Rev 1.55 13 Oct 1995 14:17:06 PAJ Fix hang on dialog exit (MUST CALL EndDialog() for modal dialogs). Rev 1.54 12 Oct 1995 15:10:10 PAJ Changes to IMGFileDeletepages call to compile in 4.0. Rev 1.53 05 Oct 1995 11:41:18 PAJ Do not set color(pagetype) or filetype on return from pageoptions dialog. They are not changed in the dialog. Rev 1.52 03 Oct 1995 11:22:20 PAJ Fix bug with a scanned page followed by setup, enabling was then incorrect. Rev 1.51 28 Sep 1995 13:47:04 PAJ Change scanner strint size to 34. Rev 1.50 27 Sep 1995 16:14:06 PAJ Handle compression better. Rev 1.49 22 Sep 1995 14:49:40 PAJ Fix accelerator and focus handling. Rev 1.48 22 Sep 1995 11:40:00 PAJ Disable rescan after faxing. Rev 1.47 21 Sep 1995 11:18:04 PAJ Add generated tempfiles to the tempfile list in the contol for deletion. Rev 1.46 21 Sep 1995 08:49:56 PAJ Fix bmp message in page dialog to append pages, and change the fax temp file prrefix from Fax to ~Fx . Rev 1.45 17 Sep 1995 10:33:48 PAJ Do not allow BMP file type for scan to fax (uses MSPaint). Rev 1.44 16 Sep 1995 08:37:00 PAJ Insure correct page number for overwrites and update page dialog message after scanning. Rev 1.43 15 Sep 1995 15:54:10 PAJ Change selectstring calls in comdobox to findexact. Rev 1.42 14 Sep 1995 13:10:54 PAJ Check for zero page rescan indicating cancel or error, and leave the original scanned pages. Rev 1.41 12 Sep 1995 11:10:04 PAJ Small bug fixes. Rev 1.40 11 Sep 1995 15:54:56 PAJ Fix bug with filenames with no extention or dot. Rev 1.39 11 Sep 1995 11:09:22 PAJ Fix rescan to not skip pages. Message boxes reflect correct name. Rev 1.38 10 Sep 1995 11:28:42 PAJ Use Oi defines for saveas filter indicies. Rev 1.37 10 Sep 1995 10:48:08 PAJ Fixes and improvements to scanner list handling. Rev 1.36 08 Sep 1995 13:27:44 PAJ Fix problems with select combo. Rev 1.35 07 Sep 1995 15:19:46 PAJ Open the scanner before getting the list of scanners (performance). Rev 1.34 07 Sep 1995 13:40:10 PAJ Fix the scanner select handling. Rev 1.33 06 Sep 1995 15:20:38 PAJ Added external name handling. Rev 1.32 01 Sep 1995 16:04:00 PAJ Fix temp name generation for scan to fax. Rev 1.31 01 Sep 1995 09:20:12 PAJ Added delete of rescaned pages (scan3, rescan2, delete1 @ close or scan). Rev 1.30 31 Aug 1995 15:29:40 PAJ Delete underscanned pages when rescanning (ie. scan3, rescan2 will delete1). Rev 1.29 31 Aug 1995 14:26:54 PAJ Fix Setup (internal error), fax handling, pagetype handling, and options. Rev 1.28 28 Aug 1995 15:25:36 PAJ Several fixes to the rushed changes added yesterday. Rev 1.27 27 Aug 1995 17:01:18 PAJ Removed template, and display only. Expanded ScanEnable routine to handle all enabling and disabling in the dialog. Added support for multipage scans off the glass. Removed multipage handling... Rev 1.26 24 Aug 1995 13:08:54 MFH Gets names of file types from registry. More enabling/disabling fixes. Comments. Rev 1.25 14 Aug 1995 16:53:42 MFH Changed default for file type to be 0 (tiff) SetForegroundWindow at end of InitDialog so focus returns Rev 1.24 10 Aug 1995 17:40:30 MFH More Enabling/Disabling of Scan/Rescan buttons Rev 1.23 09 Aug 1995 18:31:50 MFH Has text field for scanner instead of combo box. Change in member variables and processing. Disables scan when clicked. More work tbd on enabling/disabling scan. New private function EnableScan Rev 1.22 08 Aug 1995 13:12:26 PAJ Changed scan and rescan to check errors and handle them locally. Rev 1.21 07 Aug 1995 13:46:18 PAJ General changes. Rev 1.20 03 Aug 1995 16:09:26 PAJ Added help IDs to table of controls. Rev 1.19 01 Aug 1995 16:40:30 PAJ Made changes to support help. Rev 1.18 28 Jul 1995 14:22:14 PAJ Removed unused routine. Rev 1.17 26 Jul 1995 15:11:22 PAJ Change the browse from an OPEN type to a SAVEAS. Make use of the O/i Filters. Rev 1.16 21 Jul 1995 10:43:52 PAJ Change select scanner. Use string resources in comboboxes. Change to use global property defines. Rev 1.15 12 Jul 1995 11:34:52 PAJ Added code to set the filetype before entering the compression options dlg. Rev 1.14 30 Jun 1995 14:48:44 MFH Changed call to ShowPageTypeDlg to call CPagePropSheet class functions Rev 1.13 23 Jun 1995 15:10:32 PAJ Modified the handling for image name, and enabling & showing dialog items. Rev 1.12 19 Jun 1995 10:48:58 PAJ Removed all win31(16 bit) code. Use the O/i common browse dialog to get filenames and paths. Rev 1.11 14 Jun 1995 09:17:44 PAJ Made changes to support multiByte character sets. Made changes to use the template parsing routine to get template info. Rev 1.10 08 Jun 1995 09:15:46 MFH Removed dependency on oihelp.h for now. Rev 1.9 07 Jun 1995 12:41:56 PAJ Cleanup defines. Rev 1.8 06 Jun 1995 11:01:08 PAJ Change a call to GetNameTemplate to access the property directly. Rev 1.7 01 Jun 1995 09:05:18 PAJ Change GET and SET template handlings to directly use the member variables. Rev 1.6 17 May 1995 15:17:30 PAJ Initial updates to port to 32 bit environment. Rev 1.5 16 May 1995 15:36:08 MFH Fixed bug - use m_szScanPageText in SetDlgType instead of old var m_szPageText Rev 1.4 16 May 1995 15:11:30 MFH Added all pageoptions to SetDlgType Rev 1.3 15 May 1995 12:03:40 MFH Enable/disable controls based on filetype and scan destination Moved cleanup to OnDestroy from OnCancel New message handler OnChangeName (to change from rescan to scan if filename changes Rev 1.2 10 May 1995 14:02:28 PAJ Changed OpenScanner and CloseScanner calls to OpenScan and CloseScan internal routines. Changed m_bScannerOpen = TRUE to == TRUE. Rev 1.1 09 May 1995 12:01:52 MFH New page count field, changed when multipage is disabled, only open scanner if m_pScanCtrl->m_hScanner is NULL Rev 1.0 08 May 1995 18:38:30 MFH Initial entry */ //============================================================================= // ----------------------------> Includes <------------------------------- #include "stdafx.h" #include #include #include #include "imagscan.h" #include "scandlg.h" #include "imagsctl.h" #include "disphids.h" #include "ctlhids.h" #include "ocxscan.h" extern "C" { #include #include #include #include #include } extern BOOL g_bSupportAWD; // Flag to specify AWD support #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define NUMBUFF 64 char szNameBuffer[MAXSCANNERLENGTH][MAXSCANNERLENGTH]; static const DWORD MenuHelpIDs[ ] = { IDC_LABEL_SCANTO, HIDC_SCAN_SCANPROMPT_LABEL_SCANTO, IDC_COMBO_SCANTO, HIDC_SCAN_SCANPROMPT_COMBO_SCANTO, IDC_CHECK_MULTIPAGE,HIDC_SCAN_SCANPROMPT_CHECK_MULTIPAGE, IDC_LABEL_NUMPAGES, HIDC_SCAN_SCANPROMPT_LABEL_NUMPAGES, IDC_EDIT_COUNT, HIDC_SCAN_SCANPROMPT_EDIT_COUNT, IDC_LABEL_NAME, HIDC_SCAN_SCANPROMPT_LABEL_NAME, IDC_EDIT_FILENAME, HIDC_SCAN_SCANPROMPT_EDIT_FILENAME, IDC_BUTTON_BROWSE, HIDC_SCAN_SCANPROMPT_BUTTON_BROWSE, IDC_LABEL_FILETYPE, HIDC_SCAN_SCANPROMPT_LABEL_FILETYPE, IDC_COMBO_FILETYPE, HIDC_SCAN_SCANPROMPT_COMBO_FILETYPE, IDC_BUTTON_OPTS, HIDC_SCAN_SCANPROMPT_BUTTON_OPTS, IDC_LABEL_SCANNER, HIDC_SCAN_SCANPROMPT_LABEL_SCANNER, IDC_TEXT_SCANNER, HIDC_SCAN_SCANPROMPT_TEXT_SCANNER, IDC_BUTTON_SETUP, HIDC_SCAN_SCANPROMPT_BUTTON_SETUP, IDC_BUTTON_SCAN, HIDC_SCAN_SCANPROMPT_BUTTON_SCAN, IDC_BUTTON_RESCAN, HIDC_SCAN_SCANPROMPT_BUTTON_RESCAN, IDC_BUTTON_STOP, HIDC_SCAN_SCANPROMPT_BUTTON_STOP, IDCANCEL, HIDC_SCAN_SCANPROMPT_CANCEL, IDC_LABEL_SCANPAGE, HIDC_SCAN_SCANPROMPT_LABEL_SCANPAGE, 0,0 }; ///////////////////////////////////////////////////////////////////////////// // CScanDlg dialog ///////////////////////////////////////////////////////////////////////////// // CScanDlg::CScanDlg - Constructor CScanDlg::CScanDlg() { m_bModal = FALSE; InitScanDlg(); } CScanDlg::CScanDlg(CWnd* pParent /*=NULL*/) : CDialog(CScanDlg::IDD, pParent) { m_bModal = TRUE; InitScanDlg(); } void CScanDlg::InitScanDlg() { //{{AFX_DATA_INIT(CScanDlg) m_bMultiPage = TRUE; m_nFileType = 0; m_nScanToIndex = 0; m_szScanPageText = _T(""); m_szName = _T(""); m_nPageCount = 0; //}}AFX_DATA_INIT m_nType = SCAN_NEW; m_pScanCtrl = NULL; m_bTemplate = FALSE; m_bScanner = FALSE; m_bOpenScanner = FALSE; m_bReScan = FALSE; m_szFile.Empty(); m_szTemplate.Empty(); m_nPageOption = 0; m_bForceType = FALSE; m_szBrowseTitle.LoadString(IDS_BROWSE_TITLE); m_nScanTo = CTL_SCAN_SCANTO_FILE_DISPLAY; m_bScanning = FALSE; m_szImageToFax.Empty(); m_nScanCount = 1; return; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::DoDataExchange // Retrieve/Set data in controls void CScanDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CScanDlg) DDX_Control(pDX, IDC_TEXT_SCANNER, m_ScannerCombo); DDX_Control(pDX, IDC_COMBO_SCANTO, m_ScanTo); DDX_Control(pDX, IDC_COMBO_FILETYPE, m_FileType); DDX_Check(pDX, IDC_CHECK_MULTIPAGE, m_bMultiPage); DDX_CBIndex(pDX, IDC_COMBO_FILETYPE, m_nFileType); DDX_CBIndex(pDX, IDC_COMBO_SCANTO, m_nScanToIndex); DDX_Text(pDX, IDC_LABEL_SCANPAGE, m_szScanPageText); DDX_Text(pDX, IDC_EDIT_FILENAME, m_szName); DDX_Text(pDX, IDC_EDIT_COUNT, m_nPageCount); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CScanDlg, CDialog) //{{AFX_MSG_MAP(CScanDlg) ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnBrowse) ON_BN_CLICKED(IDC_BUTTON_OPTS, OnPageOptions) ON_BN_CLICKED(IDC_BUTTON_RESCAN, OnRescan) ON_BN_CLICKED(IDC_BUTTON_SCAN, OnScan) ON_BN_CLICKED(IDC_BUTTON_SETUP, OnScannerSetup) ON_BN_CLICKED(IDC_BUTTON_STOP, OnStop) ON_BN_CLICKED(ID_HELP, OnHelpButton) ON_CBN_SELCHANGE(IDC_COMBO_SCANTO, OnChangeScanto) ON_CBN_SELCHANGE(IDC_COMBO_FILETYPE, OnChangeFiletype) ON_WM_DESTROY() ON_EN_CHANGE(IDC_EDIT_FILENAME, OnChangeName) ON_CBN_SELCHANGE(IDC_TEXT_SCANNER, OnChangeScanner) //}}AFX_MSG_MAP ON_MESSAGE(WM_HELP, OnHelp) ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu) ON_MESSAGE(WM_COMMANDHELP, OnCommandHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CScanDlg Overrides ///////////////////////////////////////////////////////////////////////////// // CScanDlg::Create // Overridden to make it public instead of protected. BOOL CScanDlg::Create(UINT nID, CWnd * pWnd) { return CDialog::Create(nID,pWnd); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::PostNcDestroy // Reset pointer to this dialog in scan control and delete this // since it's a modeless dialog box. void CScanDlg::PostNcDestroy() { CDialog::PostNcDestroy(); if ( m_bModal == FALSE ) { if (m_pScanCtrl != NULL) m_pScanCtrl->m_pScanDlg = NULL; delete this; // This is a modeless dialog box } } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::PreTranslateMessage // Catches mnemonic messages and tabs for dialog box BOOL CScanDlg::PreTranslateMessage( MSG *msg ) { if( (m_bModal == FALSE) && IsDialogMessage(msg) ) return TRUE; else return CDialog::PreTranslateMessage(msg); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg message handlers ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnInitDialog // Set initial values // Arrays for getting file type description from Registry // Array of recognized extensions we write to: #define NUMWRITEFILE 3 char aszExtensions[NUMWRITEFILE][5] = { ".tif", ".awd", ".bmp" }; #define DATABUFFSIZE 256 BOOL CScanDlg::OnInitDialog() { CDialog::OnInitDialog(); // Load strings into Scan To combo box WORD wString; CString szTemp; m_szFilter = _T(""); for (wString=IDS_SCANDLG_DISPLAY; wString<=IDS_SCANDLG_FAX; wString++) { szTemp.LoadString(wString); // FORCE - Remove template options in combo if ( (wString !=IDS_SCANDLG_DISPLAY) && (wString !=IDS_SCANDLG_TEMPLATE) && (wString !=IDS_SCANDLG_DISPLAYANDTEMPLATE) ) m_ScanTo.AddString(szTemp); } // Load strings for file types from registry // Get file type descriptions from registry HKEY hKey; unsigned char acData[DATABUFFSIZE]; DWORD dwType; DWORD dwSize = DATABUFFSIZE; for (wString = 0; wString < NUMWRITEFILE; wString++) { szTemp.LoadString(wString+IDS_SCANDLG_TIFF); // Load Default // Get category for extension, then name from category if (::RegOpenKeyEx(HKEY_CLASSES_ROOT,aszExtensions[wString], 0,KEY_EXECUTE, &hKey) != ERROR_SUCCESS); else if (::RegQueryValueEx(hKey, _T(""), NULL, &dwType, acData, &dwSize) != ERROR_SUCCESS); else if (::RegOpenKeyEx(HKEY_CLASSES_ROOT, (const char *)acData, 0,KEY_EXECUTE, &hKey) == ERROR_SUCCESS) { dwSize = DATABUFFSIZE; if (::RegQueryValueEx(hKey, _T(""), NULL, &dwType, acData, &dwSize) == ERROR_SUCCESS) szTemp = acData + CString(" (") + szTemp + _T(")"); } if ( (g_bSupportAWD) || (wString != CTL_SCAN_FILETYPE_AWD-1) ) { m_FileType.AddString(szTemp); m_szFilter += acData + CString(" (*"); m_szFilter += aszExtensions[wString]; m_szFilter += _T(")|*"); m_szFilter += aszExtensions[wString]; m_szFilter += _T("|"); } // Save the BMP string for ScanTo options (scan to fax) if ( wString == (CTL_SCAN_FILETYPE_BMP-1) ) m_szBmpFileType = szTemp; } // Change the '|' characters to NULL characters while( (wString = m_szFilter.ReverseFind('|')) != 65535) m_szFilter.SetAt(wString,'\0'); if (m_pScanCtrl != NULL) // Get default values from scan ocx { m_bMultiPage = TRUE; /* FORCE m_pScanCtrl->GetMultiPage() */ // Multipage boolean m_nFileType = m_pScanCtrl->GetFileType()-1; // File type if ( (!g_bSupportAWD) && (m_nFileType >= CTL_SCAN_FILETYPE_AWD) ) m_nFileType--; m_nScanTo = m_pScanCtrl->GetScanTo(); // Where to scan to // FORCE if ((m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE) ) { m_nScanToIndex = CTL_SCAN_SCANTO_FILE_DISPLAY-1; // Adjust for no Display m_nScanTo = CTL_SCAN_SCANTO_FILE_DISPLAY; } else if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) { m_nScanToIndex = CTL_SCAN_SCANTO_FAX-3; // Adjust for no Display, or either template option // BMP entry is going away adjust file type if ( (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) ) m_nFileType = CTL_SCAN_FILETYPE_TIFF-1; m_FileType.DeleteString(CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2)); } else m_nScanToIndex = m_nScanTo-1; // Adjust for no Display // FORCE m_nPageCount = OISCAN_DEF_MAXPAGESPERFILE; /* FORCE m_pScanCtrl->GetPageCount()*/ // Num pages to scan m_szFile = m_pScanCtrl->GetImage(); // File name to scan to // Template string - Add path m_szTemplate = m_pScanCtrl->m_szTemplatePath; // If path does not end in '\', add '\', then template name, then '*' if (!m_szTemplate.IsEmpty() && (m_szTemplate.ReverseFind('\\') != m_szTemplate.GetLength() - 1)) m_szTemplate += "\\"; m_szTemplate += m_pScanCtrl->m_szNameTemplate; m_szTemplate += "*"; if (m_nType == SCAN_NEW) // For Scan New { // If template scan, put template name in File name field if ((m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE)) { m_szName = m_szTemplate; UpdateData(FALSE); m_bTemplate = TRUE; } // Only TIFF files support multipage, so disable // multipage if not scanning in TIFF format if ( (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) || (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY)) { m_nPageCount = 1; } else m_nPageCount = OISCAN_DEF_MAXPAGESPERFILE; // FORCE if (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) m_szName.Empty(); else m_szName = m_szFile; m_pScanCtrl->SetPage(1); // Get Current Directory CString szLocation, szLoc; _TCHAR* lpszLocation = szLocation.GetBuffer(_MAX_PATH); ::GetCurrentDirectory(_MAX_PATH, lpszLocation); // Get the shorter version CRecentFileList RFL(0,NULL,NULL,1); RFL.Add(lpszLocation); RFL.GetDisplayName(szLoc, 0, NULL, 0); // Release the buffers and add the short path szLocation.ReleaseBuffer(); SetDlgItemText(IDC_LABEL_NAME2, szLoc); } // Add no selection as a default entry szTemp.LoadString(IDS_SCANDLG_NOSCANNER); m_ScannerCombo.AddString(szTemp); // Open current scanner m_pScanCtrl->m_bInternal = TRUE; if (m_pScanCtrl->m_hScanner != NULL) m_bScanner = TRUE; // Scanner already open else { m_bOpenScanner = TRUE; // Scan dialog is responsible for close // If there isn't a scanner don't try to open it. if ( (!m_pScanCtrl->m_szScannerName.IsEmpty()) && (m_pScanCtrl->m_szScannerName.CompareNoCase(szTemp)) && (m_pScanCtrl->m_szScannerName.CompareNoCase(SCANOCX_TWAIN)) ) { if ( m_pScanCtrl->OpenScan() == IMGSE_SUCCESS ) m_bScanner = TRUE; // Scanner opened } } m_pScanCtrl->m_bInternal = FALSE; // Get list of scanners _TCHAR* lpszScannerName = m_pScanCtrl->m_szScannerName.GetBuffer(MAXSCANNERLENGTH); memset((LPSTR)szNameBuffer, 0, sizeof(szNameBuffer)); if ( IMGOpenScanner(m_pScanCtrl->m_hDestImageWnd, lpszScannerName, &(m_pScanCtrl->m_hScanner), &szNameBuffer[0][0]) ) { // TWAIN software doesn't exist! Clean-up and leave. m_pScanCtrl->m_szScannerName.ReleaseBuffer(); // Get the correct caption CString szDlgCaption; CWinApp* pApp=AfxGetApp(); szDlgCaption.LoadString((m_nType==SCAN_NEW)?IDS_SCANDLG_NEW:IDS_SCANDLG_PAGE); const char* pszSave = pApp->m_pszAppName; pApp->m_pszAppName = szDlgCaption; // Tell the user the bad news AfxMessageBox(IDS_SCANDLG_TWAIN_ERROR); // Restore caption pApp->m_pszAppName = pszSave; // Leave the dialog, no reason to continue... OnCancel(); return FALSE; } m_pScanCtrl->m_szScannerName.ReleaseBuffer(); // Get all data sources and put in combo box int i; for (i=0; im_szScannerName); if ( CB_ERR == nIndex ) m_ScannerCombo.SetCurSel(0); else m_ScannerCombo.SetCurSel(nIndex); } else m_ScannerCombo.SetCurSel(0); if ( m_nType == SCAN_NEW ) // For Scan New { // Set the default compression for the file type UpdateData(FALSE); OnChangeFiletype(); } EnableScan(); // Checks if ok to enable scan ((CButton*)GetDlgItem(IDC_BUTTON_SETUP))->SetCheck(m_pScanCtrl->GetShowSetupBeforeScan()); // Save page option for when overwritten by Rescan m_nPageOption = m_pScanCtrl->GetPageOption(); // Do any updates to dialog based on settings SetDlgType(m_nType); } // End if scan control is not null SetForegroundWindow(); UpdateData(FALSE); return FALSE; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnCancel // Close any open scanner, dereg window, destroy window (modeless dlg) void CScanDlg::OnCancel() { int nRet = IDYES; if ( !m_szImageToFax.IsEmpty() ) { CString szMsg; szMsg.LoadString(IDS_SCANDLG_FAXIT); /* // Prompt with the name of file to fax if ( m_pScanCtrl->m_szImageTitle.IsEmpty() ) AfxFormatString1(szMsg, IDS_SCANDLG_FAXIT, m_szImageToFax); else AfxFormatString1(szMsg, IDS_SCANDLG_FAXIT, m_pScanCtrl->m_szImageTitle); */ CString szDlgCaption; GetWindowText(szDlgCaption); nRet = MessageBox(szMsg,szDlgCaption, MB_YESNOCANCEL); } if ( nRet == IDYES ) { if ( m_bReScan ) { // If rescan was zero then error or cancel occured on first page // (just leave previous scanned pages) // Overwrote less then scanned while rescanning. // Adjust the file before continuing. if ( (m_nReScanCount != 0) && (m_nReScanCount < m_nScanCount) ) { UINT nDeleteCount = m_nScanCount - m_nReScanCount; UINT nStartPage = m_nReScanPageStart + m_nReScanCount; IMGFileDeletePages(m_hWnd, (char*)(LPCTSTR)m_pScanCtrl->GetImage(), nStartPage, nDeleteCount); m_nScanCount = m_nReScanCount; } } // Get the path and launch the FAX wizard, if Faxing if ( !m_szImageToFax.IsEmpty() ) { // Get the path and launch the FAX wizard m_bScanning = TRUE; EnableScan(); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); // Force disabled ! m_bScanning = FALSE; // Oh, let's just disable the whole window. Don't want users // clicking the 'x' before setup is done. EnableWindow(FALSE); m_pScanCtrl->FaxIt(m_hWnd, m_szImageToFax); m_szImageToFax.Empty(); EnableWindow(TRUE); } } else if ( nRet == IDNO ) // Only from faxit dialog DeleteFile(m_szImageToFax); // cleanup leftovers if ( nRet != IDCANCEL ) // Only from faxit dialog { if ( m_bModal == FALSE ) DestroyWindow(); else EndDialog(TRUE); } return; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnDestroy // Window is going to be destroyed, clean up void CScanDlg::OnDestroy() { if ( (m_pScanCtrl != NULL) && (m_bScanner == TRUE) && (m_bOpenScanner == TRUE) ) { m_pScanCtrl->CloseScan(); } m_pScanCtrl->m_szImageTitle.Empty(); CDialog::OnDestroy(); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnBrowse // Show a file dialog box to browse for a file name (or path) void CScanDlg::OnBrowse() { CString szFile; CString szPath; OI_FILESAVEASPARM FileParm; DWORD dwMode; szFile.Empty(); szPath.Empty(); _fmemset((LPSTR)&FileParm, 0, sizeof(OI_FILESAVEASPARM)); FileParm.ofn.lStructSize = sizeof(OPENFILENAME); FileParm.lStructSize = sizeof( OI_FILESAVEASPARM); FileParm.ofn.hwndOwner = this->GetSafeHwnd(); // Let O/i set the filter and default index LPSTR lpFilter = m_szFilter.GetBuffer(m_szFilter.GetLength()); FileParm.ofn.lpstrFilter = lpFilter; int nFileType = m_nFileType+1; if ( (!g_bSupportAWD) && (nFileType >= CTL_SCAN_FILETYPE_AWD) ) nFileType++; FileParm.ofn.nFilterIndex = m_nFileType+1; switch(nFileType) { case CTL_SCAN_FILETYPE_TIFF: FileParm.ofn.lpstrDefExt = _T("tif"); break; case CTL_SCAN_FILETYPE_AWD: FileParm.ofn.lpstrDefExt = _T("awd"); break; case CTL_SCAN_FILETYPE_BMP: FileParm.ofn.lpstrDefExt = _T("bmp"); break; default: break; } LPSTR lpTitle = m_szBrowseTitle.GetBuffer(m_szBrowseTitle.GetLength()); FileParm.ofn.lpstrTitle = lpTitle; dwMode = OI_UIFILESAVEASGETNAME; if ( m_bTemplate ) FileParm.ofn.Flags = OFN_PATHMUSTEXIST | OFN_SHAREAWARE; else { FileParm.ofn.Flags = OFN_SHAREAWARE; int nLastSlash = m_szName.ReverseFind('\\'); if ( nLastSlash == -1 ) nLastSlash = m_szName.ReverseFind(':'); szFile = ( nLastSlash == -1 )?m_szName:m_szName.Mid(nLastSlash+1); szPath = ( nLastSlash == -1 )?_T(""):m_szName.Left(nLastSlash+1); } FileParm.ofn.lpstrFile = szFile.GetBuffer(MAXFILESPECLENGTH); FileParm.ofn.lpstrInitialDir = szPath.GetBuffer(MAXFILESPECLENGTH); FileParm.ofn.nMaxFile = MAXFILESPECLENGTH; WORD status = OiUIFileGetNameCommDlg((void far *)&FileParm, dwMode); if ( status == FNERR_INVALIDFILENAME ) { szFile.ReleaseBuffer(); szPath.ReleaseBuffer(); szFile.Empty(); szPath.Empty(); FileParm.ofn.lpstrFile = szFile.GetBuffer(MAXFILESPECLENGTH); FileParm.ofn.lpstrInitialDir = szPath.GetBuffer(MAXFILESPECLENGTH); status = OiUIFileGetNameCommDlg((void far *)&FileParm, dwMode); } szFile.ReleaseBuffer(); szPath.ReleaseBuffer(); m_szBrowseTitle.ReleaseBuffer(); m_szFilter.ReleaseBuffer(); // Get Current Directory CString szLocation, szLoc; _TCHAR* lpszLocation = szLocation.GetBuffer(_MAX_PATH); ::GetCurrentDirectory(_MAX_PATH, lpszLocation); // Get the shorter version CRecentFileList RFL(0,NULL,NULL,1); RFL.Add(lpszLocation); RFL.GetDisplayName(szLoc, 0, NULL, 0); // Release the buffers and add the short path szLocation.ReleaseBuffer(); SetDlgItemText(IDC_LABEL_NAME2, szLoc); if (status == 0) { if (m_bTemplate == TRUE) { CImagscanCtrl::ParseImageProperty(m_nScanTo, szFile, m_pScanCtrl->m_szTemplatePath, m_pScanCtrl->m_szNameTemplate); m_szTemplate = szFile; } else m_szFile = szFile; SetDlgItemText(IDC_EDIT_FILENAME, szFile); FileParm.ofn.nFilterIndex--; if ( m_nFileType != (int)FileParm.ofn.nFilterIndex ) { m_nFileType = FileParm.ofn.nFilterIndex; UpdateData(FALSE); OnChangeFiletype(); } } EnableScan(); // Enable/disable scanning } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnPageOptions // Show page options dialog (just colors and compression tabs) void CScanDlg::OnPageOptions() { if (m_pScanCtrl == NULL) return; m_pScanCtrl->m_bInternal = TRUE; m_pScanCtrl->ShowScanPreferences(); m_pScanCtrl->m_bInternal = FALSE; EnableScan(); // Enable/disable scanning } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnRescan // Scan the same page again void CScanDlg::OnRescan() { if (m_pScanCtrl == NULL) return; UpdateData(); m_pScanCtrl->m_bInternal = TRUE; m_pScanCtrl->SetPageOption(CTL_SCAN_PAGEOPTION_OVERWRITE); if ( m_nScanTo == CTL_SCAN_SCANTO_DISPLAY ) m_pScanCtrl->SetPageCount(1); else m_pScanCtrl->SetPageCount(m_nReScanPageStart+m_nScanCount-1); m_pScanCtrl->SetPage( m_nReScanPageStart ); m_bScanning = TRUE; CString szDlgCaption; GetWindowText(szDlgCaption); CWinApp* pApp=AfxGetApp(); const char* pszSave = pApp->m_pszAppName; pApp->m_pszAppName = szDlgCaption; EnableScan(); // Do the scan long lRetCode = m_pScanCtrl->StartScan(); m_bScanning = FALSE; // Make sure not just cancel if ( lRetCode != IMGSE_CANCEL ) { // Set error first else it may never get set if ( lRetCode ) AfxMessageBox(m_pScanCtrl->m_szThrowString, MB_OK|MB_TASKMODAL, m_pScanCtrl->m_nThrowHelpID); } pApp->m_pszAppName = pszSave; // Get the pages rescanned m_nReScanCount = m_pScanCtrl->m_nPagesScanned; EnableScan(); m_pScanCtrl->SetPageCount(m_nPageCount); m_pScanCtrl->SetPageOption(m_nPageOption); // Reset page option m_pScanCtrl->m_bInternal = FALSE; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnScan // Scan a new page void CScanDlg::OnScan() { if (m_pScanCtrl == NULL) return; if ( m_bReScan ) { // If rescan was zero then error or cancel occured on first page // (just leave previous scanned pages) // Overwrote less then scanned while rescanning. // Adjust the file before continuing. if ( (m_nReScanCount != 0) && (m_nReScanCount < m_nScanCount) ) { UINT nDeleteCount = m_nScanCount - m_nReScanCount; UINT nStartPage = m_nReScanPageStart + m_nReScanCount; IMGFileDeletePages(m_hWnd, (char*)(LPCTSTR)m_pScanCtrl->GetImage(), nStartPage, nDeleteCount); m_nScanCount = m_nReScanCount; } } long lRetCode = 0; UpdateData(); // Set common stuff m_pScanCtrl->m_bInternal = TRUE; int nFileType = m_nFileType+1; if ( (!g_bSupportAWD) && (nFileType >= CTL_SCAN_FILETYPE_AWD) ) nFileType++; m_pScanCtrl->SetFileType(nFileType); m_pScanCtrl->SetScanTo(m_nScanTo); if (m_nType == SCAN_NEW) { if (m_bTemplate == TRUE) { CImagscanCtrl::ParseImageProperty(m_nScanTo, m_szName, m_pScanCtrl->m_szTemplatePath, m_pScanCtrl->m_szNameTemplate); m_szTemplate = m_szName; } else { if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) { m_pScanCtrl->SetScanTo(CTL_SCAN_SCANTO_FILE); CString szName; if ( m_bReScan ) szName = m_szImageToFax; else { OFSTRUCT OpenFile; CString szPath; _TCHAR* lpszBuffer = szPath.GetBuffer(MAXPATHLENGTH); ::GetTempPath(MAXPATHLENGTH, lpszBuffer); szPath.ReleaseBuffer(); do { lpszBuffer = szName.GetBuffer(MAXPATHLENGTH); ::GetTempFileName(szPath, _T("~Fx"), ::GetTickCount(), lpszBuffer); szName.ReleaseBuffer(); int nFileType = m_nFileType; if ( (!g_bSupportAWD) && (nFileType >= CTL_SCAN_FILETYPE_AWD) ) nFileType++; szName = szName.Left(szName.Find('.')) + aszExtensions[nFileType]; } while(::OpenFile(szName, &OpenFile, OF_EXIST) != HFILE_ERROR); } m_pScanCtrl->SetImage(szName); m_pScanCtrl->m_szTempFiles.AddTail(szName); // Add to tempfile delete list } else { m_szFile = m_szName; // Check for an extention (O/i forces default if one is not provided) if ( (-1) == m_szFile.ReverseFind('.') ) { // No extention found, add the default int nFileType = m_nFileType; if ( (!g_bSupportAWD) && (nFileType >= CTL_SCAN_FILETYPE_AWD) ) nFileType++; m_szFile += aszExtensions[nFileType]; m_szName = m_szFile; GetDlgItem(IDC_EDIT_FILENAME)->SetWindowText(m_szFile); } m_pScanCtrl->SetImage(m_szFile); m_pScanCtrl->m_szImageTitle = m_szFile; } } m_pScanCtrl->SetMultiPage(m_bMultiPage); m_pScanCtrl->SetPageCount(m_nPageCount); } // Display is always 1 page for now if ( m_nScanTo == CTL_SCAN_SCANTO_DISPLAY ) m_pScanCtrl->SetPageCount(1); // Get the file information CString szName = m_pScanCtrl->GetImage(); FIO_INFORMATION FileInfo; FileInfo.filename = (char*)(const char*)szName; FileInfo.page_number = 1; lRetCode = IMGFileGetInfo(NULL, m_pScanCtrl->m_hDestImageWnd, &FileInfo, NULL, NULL); // Get Current Page m_nReScanPageStart = m_pScanCtrl->GetPage(); // Past first scan if ( m_bReScan ) { // Yes, adjust for new page switch( m_pScanCtrl->GetPageOption() ) { case CTL_SCAN_PAGEOPTION_APPEND: case CTL_SCAN_PAGEOPTION_CREATE: case CTL_SCAN_PAGEOPTION_CREATE_PROMPT: m_pScanCtrl->SetPageOption(CTL_SCAN_PAGEOPTION_APPEND); m_nReScanPageStart = FileInfo.page_count+1; break; case CTL_SCAN_PAGEOPTION_INSERT: m_pScanCtrl->SetPage( (m_nReScanPageStart+=m_nScanCount) ); break; case CTL_SCAN_PAGEOPTION_OVERWRITE_ALLPAGES: m_pScanCtrl->SetPageOption(CTL_SCAN_PAGEOPTION_OVERWRITE); case CTL_SCAN_PAGEOPTION_OVERWRITE: case CTL_SCAN_PAGEOPTION_OVERWRITE_PROMPT: m_nReScanPageStart += m_nScanCount; m_pScanCtrl->SetPage(m_nReScanPageStart); if ( m_nReScanPageStart > (int)FileInfo.page_count ) m_pScanCtrl->SetPageOption(CTL_SCAN_PAGEOPTION_APPEND); break; } } else { // Not passed first scan switch( m_pScanCtrl->GetPageOption() ) { case CTL_SCAN_PAGEOPTION_APPEND: m_nReScanPageStart = FileInfo.page_count+1; case CTL_SCAN_PAGEOPTION_CREATE: case CTL_SCAN_PAGEOPTION_CREATE_PROMPT: case CTL_SCAN_PAGEOPTION_INSERT: case CTL_SCAN_PAGEOPTION_OVERWRITE_ALLPAGES: case CTL_SCAN_PAGEOPTION_OVERWRITE: case CTL_SCAN_PAGEOPTION_OVERWRITE_PROMPT: break; } } m_bScanning = TRUE; CString szDlgCaption; GetWindowText(szDlgCaption); CWinApp* pApp=AfxGetApp(); const char* pszSave = pApp->m_pszAppName; pApp->m_pszAppName = szDlgCaption; EnableScan(); // Do the scan lRetCode = m_pScanCtrl->StartScan(); // Do the scan m_bScanning = FALSE; // Make sure not just cancel if ( lRetCode != IMGSE_CANCEL ) { // Set error first else it may never get set if ( lRetCode ) AfxMessageBox(m_pScanCtrl->m_szThrowString, MB_OK|MB_TASKMODAL, m_pScanCtrl->m_nThrowHelpID); else { // Save the name for faxing when done if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) m_szImageToFax = m_pScanCtrl->GetImage(); m_bReScan = TRUE; // Start rescanning } } pApp->m_pszAppName = pszSave; EnableScan(); // Enable buttons // Get the pages added or overwritten m_nScanCount = m_pScanCtrl->m_nPagesScanned; m_nReScanCount = m_pScanCtrl->m_nPagesScanned; if ( (m_nType == SCAN_PAGE) && (m_nFileType != (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) ) { long lPage = m_pScanCtrl->GetPage() + m_nScanCount; CString szPage; _stprintf(szPage.GetBuffer(NUMBUFF), _T("%ld"), lPage); szPage.ReleaseBuffer(); switch( m_pScanCtrl->GetPageOption() ) { case CTL_SCAN_PAGEOPTION_APPEND: case CTL_SCAN_PAGEOPTION_CREATE: case CTL_SCAN_PAGEOPTION_CREATE_PROMPT: AfxFormatString1(m_szScanPageText, IDS_PAGE_APPEND, m_pScanCtrl->m_szImageTitle); break; case CTL_SCAN_PAGEOPTION_INSERT: AfxFormatString2(m_szScanPageText, IDS_PAGE_INSERT, szPage, m_pScanCtrl->m_szImageTitle); break; case CTL_SCAN_PAGEOPTION_OVERWRITE: case CTL_SCAN_PAGEOPTION_OVERWRITE_PROMPT: case CTL_SCAN_PAGEOPTION_OVERWRITE_ALLPAGES: if ( lPage > (int)FileInfo.page_count ) AfxFormatString1(m_szScanPageText, IDS_PAGE_APPEND, m_pScanCtrl->m_szImageTitle); else AfxFormatString2(m_szScanPageText, IDS_PAGE_OVERWRITE, szPage, m_pScanCtrl->m_szImageTitle); break; } GetDlgItem(IDC_LABEL_SCANPAGE)->SetWindowText(m_szScanPageText); } // Reset page count and option m_pScanCtrl->SetPageCount(m_nPageCount); m_pScanCtrl->SetPageOption(m_nPageOption); m_pScanCtrl->m_bInternal = FALSE; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnScannerSetup // Show setup dialog for selected scanner // First allow user to select the scanner void CScanDlg::OnScannerSetup() { if (m_pScanCtrl == NULL) return; /* // Disable stuff so user can't click them until this is done m_bScanning = TRUE; EnableScan(); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); // Force disabled ! m_bScanning = FALSE; // Oh, let's just disable the whole window. Don't want users // clicking the 'x' before setup is done. EnableWindow(FALSE); m_pScanCtrl->m_bInternal = TRUE; if (m_pScanCtrl->ShowScannerSetup() != 0) { CString szDlgCaption; GetWindowText(szDlgCaption); CWinApp* pApp=AfxGetApp(); const char* pszSave = pApp->m_pszAppName; pApp->m_pszAppName = szDlgCaption; AfxMessageBox(m_pScanCtrl->m_szThrowString, MB_OK|MB_TASKMODAL, m_pScanCtrl->m_nThrowHelpID); pApp->m_pszAppName = pszSave; } EnableWindow(TRUE); EnableScan(); // Enable/Disable scan m_pScanCtrl->m_bInternal = FALSE; SetForegroundWindow(); */ m_pScanCtrl->SetShowSetupBeforeScan(((CButton*)GetDlgItem(IDC_BUTTON_SETUP))->GetCheck()); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnStop // Stop scanning void CScanDlg::OnStop() { if (m_pScanCtrl == NULL) return; if ( m_bScanning ) m_pScanCtrl->StopScan(); else { if (m_nType == SCAN_NEW) { if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) { if ( !m_szImageToFax.IsEmpty() ) { // Get the path and launch the FAX wizard m_bScanning = TRUE; EnableScan(); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); // Force disabled ! m_bScanning = FALSE; // Oh, let's just disable the whole window. Don't want users // clicking the 'x' before setup is done. EnableWindow(FALSE); m_pScanCtrl->FaxIt(m_hWnd, m_szImageToFax); m_szImageToFax.Empty(); EnableWindow(TRUE); } } // Reset dialog new m_bReScan = FALSE; m_pScanCtrl->SetPage(1); m_pScanCtrl->m_szImageTitle.Empty(); } EnableScan(); } } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnChangeScanners // See if selection in Scanner combo box has changed and open // new scanner void CScanDlg::OnChangeScanner() { if (m_pScanCtrl == NULL) return; UpdateData(); int nCurSel = m_ScannerCombo.GetCurSel(); if ( nCurSel == CB_ERR ) return; CString szScanner; m_ScannerCombo.GetLBText(nCurSel, szScanner); // Same scanner ? if ( !szScanner.CompareNoCase(m_pScanCtrl->m_szScannerName) ) return; m_pScanCtrl->m_bInternal = TRUE; // Close old scanner if loaded if ( m_bScanner ) { m_pScanCtrl->CloseScan(); m_bScanner = FALSE; } // Set the new scanner selection m_pScanCtrl->m_szScannerName = szScanner; // Check if scanner is NO SCANNER (DON'T try to OPEN it!) CString szTemp; szTemp.LoadString(IDS_SCANDLG_NOSCANNER); if ( szScanner.CompareNoCase(szTemp) ) { // Get (Open) new scanner if ( m_pScanCtrl->OpenScan() != IMGSE_SUCCESS ) { // Failed, set no scanner; m_bScanner is already FALSE m_ScannerCombo.SetCurSel(0); } else { // Select the new scanner m_bScanner = TRUE; OiWriteStringtoReg(SCANOCX_OI, SCANOCX_SCANNER, m_pScanCtrl->m_szScannerName); } } EnableScan(); m_pScanCtrl->m_bInternal = FALSE; SetForegroundWindow(); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnChangeScanto // User has changed the Destination selection in the scanto combo box void CScanDlg::OnChangeScanto() { if (m_pScanCtrl == NULL) return; UpdateData(); // FORCE int nBmpIndex = m_FileType.FindStringExact(-1, m_szBmpFileType); if ( m_nScanToIndex == CTL_SCAN_SCANTO_FAX-3 ) { m_nScanTo = CTL_SCAN_SCANTO_FAX; if ( CB_ERR != nBmpIndex ) { // BMP entry is going away adjust file type if ( m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2)) ) { m_nFileType = CTL_SCAN_FILETYPE_TIFF-1; UpdateData(FALSE); OnChangeFiletype(); } m_FileType.DeleteString(nBmpIndex); } } else { m_nScanTo = m_nScanToIndex+1; if ( CB_ERR == nBmpIndex ) m_FileType.AddString(m_szBmpFileType); } // FORCE BOOL m_bMulti = TRUE; // Multipage is allowed BOOL bEnableName = TRUE; // Start with Name Enabled if ((m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE)) { m_szName = m_szTemplate; m_bTemplate = TRUE; } else { m_bTemplate = FALSE; if (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) // Disable name and multipage { m_bMulti = FALSE; bEnableName = FALSE; m_szName.Empty(); } else if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) m_szName.Empty(); else m_szName = m_szFile; } EnableScan(); // Checks if okay to enable scan // Disable multipage if doing page scan or not TIFF file if ( (m_nType != SCAN_NEW) || (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) ) { m_bMulti = FALSE; } if (TRUE != m_bMulti) // If not multipage, can only scan 1 page m_nPageCount = 1; // Enable/disable multipage UpdateData(FALSE); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnChangeName // If user alters the filename, then enable Scan button and // disable the Rescan button. void CScanDlg::OnChangeName() { UpdateData(); // EnableScan() Enable/disable scanning button if ( m_szName.IsEmpty() ) GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); else GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(TRUE); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnChangeFiletype // User has selected a new file type void CScanDlg::OnChangeFiletype() { UpdateData(); int nFileType = m_nFileType+1; if ( (!g_bSupportAWD) && (nFileType >= CTL_SCAN_FILETYPE_AWD) ) nFileType++; m_pScanCtrl->SetFileType(nFileType); // Update Filetype m_pScanCtrl->SetFileOptions(); // Save and Reset the file options m_pScanCtrl->GetPageType(); // Get actual new page type BOOL m_bMulti; if ( (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) || (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) ) { m_bMulti = FALSE; m_nPageCount = 1; } else { m_nPageCount = OISCAN_DEF_MAXPAGESPERFILE; // FORCE m_bMulti = TRUE; } UpdateData(FALSE); EnableScan(); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg Other Operations ///////////////////////////////////////////////////////////////////////////// // CScanDlg::SetDlgType // The scan dialog has two modes: Scan New and Scan Page. // This function enables,shows/disables,hides the appropriate controls // for the specified mode // Comments: // This method is called by the ShowScanDlg function in IMAGSCTL.CPP. If // the dialog is to be modeless, then the function is called after the // windows are created and they can be enabled, disabled, hidden etc. // But if the dialog is modal, then the function is called BEFORE the // DoModal call which creates the windows so the controls cannot be // processed yet. Therefore this function is also called from OnInitDialog // to make sure the right controls are enabled, etc. // When that happens and this function is called before DoModal and the // type is not the default type of the dialog (i.e. ScanNew), then the // GetSafeHwnd function below will return NULL, and m_bForceType will be // set to TRUE. When this function is then called by OnInitDialog, the // first 'if' below will fail and the controls will be processed after // they are created. void CScanDlg::SetDlgType(ScanDlgType nType) { if ( (m_nType == nType) && (m_bForceType == FALSE) ) return; // Hide/Show appropriate controls m_nType = nType; if ( GetSafeHwnd() == NULL ) // If no window yet { m_bForceType = TRUE; // Wait until OnInitDialog return; } else m_bForceType = FALSE; int nNewShow, nPageShow; BOOL bNewEnable, bPageEnable; CString szDlgCaption; if (m_nType == SCAN_NEW) { nNewShow = SW_SHOWNORMAL; bNewEnable = TRUE; nPageShow = SW_HIDE; bPageEnable = FALSE; szDlgCaption.LoadString(IDS_SCANDLG_NEW); // Reinitialize if reusing dialog in response to the // ShowScanNew method and values have changed if (m_pScanCtrl != NULL) { m_nScanTo = m_pScanCtrl->GetScanTo(); // FORCE if ((m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE) ) { m_nScanToIndex = CTL_SCAN_SCANTO_FILE_DISPLAY-1; // Adjust for no Display m_nScanTo = CTL_SCAN_SCANTO_FILE_DISPLAY; } else if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) m_nScanToIndex = CTL_SCAN_SCANTO_FAX-3; // Adjust for no Display, or either template option else m_nScanToIndex = m_nScanTo-1; // Adjust for no Display // FORCE m_szName = m_pScanCtrl->GetImage(); m_nFileType = m_pScanCtrl->GetFileType()-1; // File type if ( (!g_bSupportAWD) && (m_nFileType >= CTL_SCAN_FILETYPE_AWD) ) m_nFileType--; // Set the default compression for the file type OnChangeFiletype(); m_pScanCtrl->m_szImageTitle.Empty(); } } else { nNewShow = SW_HIDE; bNewEnable = FALSE; nPageShow = SW_SHOW; bPageEnable = TRUE; int nOption; long lPage; if (m_pScanCtrl != NULL) // Set page text based on page option { m_szName = m_pScanCtrl->GetImage(); nOption = m_pScanCtrl->GetPageOption(); lPage = m_pScanCtrl->GetPage(); m_nScanTo = m_pScanCtrl->GetScanTo(); // FORCE if ((m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE_DISPLAY) || (m_nScanTo == CTL_SCAN_SCANTO_TEMPLATE) ) { m_nScanToIndex = CTL_SCAN_SCANTO_FILE_DISPLAY-1; // Adjust for no Display m_nScanTo = CTL_SCAN_SCANTO_FILE_DISPLAY; } else if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) m_nScanToIndex = CTL_SCAN_SCANTO_FAX-3; // Adjust for no Display, or either template option else m_nScanToIndex = m_nScanTo-1; // Adjust for no Display // FORCE m_nFileType = m_pScanCtrl->GetFileType()-1; // File type if ( (!g_bSupportAWD) && (m_nFileType >= CTL_SCAN_FILETYPE_AWD) ) m_nFileType--; } else { nOption = CTL_SCAN_PAGEOPTION_INSERT; lPage = 1; } if ( m_nScanTo == CTL_SCAN_SCANTO_DISPLAY ) { m_szScanPageText.LoadString(IDS_PAGE_DISPLAY); } else { CString szPage; _stprintf(szPage.GetBuffer(NUMBUFF), _T("%ld"), lPage); szPage.ReleaseBuffer(); if ( m_pScanCtrl->m_szImageTitle.IsEmpty() ) m_pScanCtrl->m_szImageTitle = m_szName; switch(nOption) { case CTL_SCAN_PAGEOPTION_APPEND: case CTL_SCAN_PAGEOPTION_CREATE: case CTL_SCAN_PAGEOPTION_CREATE_PROMPT: AfxFormatString1(m_szScanPageText, IDS_PAGE_APPEND, m_pScanCtrl->m_szImageTitle); break; case CTL_SCAN_PAGEOPTION_INSERT: AfxFormatString2(m_szScanPageText, IDS_PAGE_INSERT, szPage, m_pScanCtrl->m_szImageTitle); break; case CTL_SCAN_PAGEOPTION_OVERWRITE: case CTL_SCAN_PAGEOPTION_OVERWRITE_PROMPT: case CTL_SCAN_PAGEOPTION_OVERWRITE_ALLPAGES: AfxFormatString2(m_szScanPageText, IDS_PAGE_OVERWRITE, szPage, m_pScanCtrl->m_szImageTitle); } } szDlgCaption.LoadString(IDS_SCANDLG_PAGE); } // Dialog Caption SetWindowText(szDlgCaption); // New controls GetDlgItem(IDC_LABEL_SCANTO)->ShowWindow(nNewShow); GetDlgItem(IDC_COMBO_SCANTO)->ShowWindow(nNewShow); GetDlgItem(IDC_LABEL_NAME)->ShowWindow(nNewShow); GetDlgItem(IDC_LABEL_NAME2)->ShowWindow(nNewShow); GetDlgItem(IDC_LABEL_NAME3)->ShowWindow(nNewShow); GetDlgItem(IDC_EDIT_FILENAME)->ShowWindow(nNewShow); GetDlgItem(IDC_BUTTON_BROWSE)->ShowWindow(nNewShow); // FORCE GetDlgItem(IDC_CHECK_MULTIPAGE)->ShowWindow(nNewShow); // FORCE GetDlgItem(IDC_LABEL_NUMPAGES)->ShowWindow(nNewShow); // FORCE GetDlgItem(IDC_EDIT_COUNT)->ShowWindow(nNewShow); // Page controls GetDlgItem(IDC_LABEL_SCANPAGE)->ShowWindow(nPageShow); m_bReScan = FALSE; // Reset if scanned once EnableScan(); // Checks if okay to enable scan // Finish reinitializing if reusing dialog and values have changed m_nFileType = m_pScanCtrl->GetFileType()-1; // File type if ( (!g_bSupportAWD) && (m_nFileType >= CTL_SCAN_FILETYPE_AWD) ) m_nFileType--; UpdateData(FALSE); return; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnHelpButton // User has clicked the Help button void CScanDlg::OnHelpButton() { ::WinHelp(this->GetSafeHwnd(), _T("WangOcx.hlp"),HELP_INDEX,IDH_IMGSCAN_CONTENTS); return; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnHelp // User has clicked on Help afx_msg LRESULT CScanDlg::OnHelp(WPARAM wParam, LPARAM lParam) { LPHELPINFO lpHelpInfo; lpHelpInfo = (LPHELPINFO)lParam; // All tabs have same ID so can't give tab specific help if (lpHelpInfo->iCtrlId == AFX_IDC_TAB_CONTROL) return 0L; if (lpHelpInfo->iContextType == HELPINFO_WINDOW) // must be for a control { ::WinHelp ((HWND)lpHelpInfo->hItemHandle, "WangOcx.hlp", HELP_WM_HELP, (DWORD)(LPVOID)MenuHelpIDs); } return 1L; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnContextMenu // User has clicked on Help afx_msg LRESULT CScanDlg::OnContextMenu(WPARAM wParam, LPARAM lParam) { // All tabs have same ID so can't give tab specific help if ( ::GetDlgCtrlID((HWND)wParam) == AFX_IDC_TAB_CONTROL ) return 0L; return ::WinHelp ((HWND)wParam,"WangOcx.hlp", HELP_CONTEXTMENU, (DWORD)(LPVOID)MenuHelpIDs); } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::OnCommandHelp // User has clicked 'F1' and this has been sent by the application // to the dialog. Dialog will also get the WM_HELP message after this // so just return TRUE and let other routine handle help. afx_msg LRESULT CScanDlg::OnCommandHelp(WPARAM, LPARAM) { return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CScanDlg::EnableScan - Private function // Enables either the Scan or ReScan button when appropriate // Scan button is enabled when // File Name field has text (for ScanNew to other than display) // Have an available scanner // Have not scanned anything yet to file name (else enable rescan) void CScanDlg::EnableScan() { CString szStopButton; if (m_bScanner == TRUE) // Scanner is available { if ( m_bScanning ) { GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME3)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_OPTS)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE); GetDlgItem(IDC_TEXT_SCANNER)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_SCANNER)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_MULTIPAGE)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NUMPAGES)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(FALSE); GetDlgItem(IDCANCEL)->EnableWindow(FALSE); szStopButton.LoadString(IDS_SCANDLG_STOPTEXT); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_STOP)->SetWindowText(szStopButton); UpdateWindow(); GetDlgItem(IDC_BUTTON_STOP)->SetFocus(); return; } else { if ( ((m_nScanTo != CTL_SCAN_SCANTO_DISPLAY) || (m_nType == SCAN_PAGE)) && (m_nFileType == (CTL_SCAN_FILETYPE_TIFF-1)) ) GetDlgItem(IDC_BUTTON_OPTS)->EnableWindow(TRUE); else GetDlgItem(IDC_BUTTON_OPTS)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(TRUE); GetDlgItem(IDC_TEXT_SCANNER)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_SCANNER)->EnableWindow(TRUE); // Disable multipage if doing page scan or not TIFF file BOOL bMulti = TRUE; if ( (m_nType != SCAN_NEW) || (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) || (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) ) bMulti = FALSE; // Enable/disable multipage GetDlgItem(IDC_CHECK_MULTIPAGE)->EnableWindow(bMulti); GetDlgItem(IDC_LABEL_NUMPAGES)->EnableWindow(bMulti); GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(bMulti); GetDlgItem(IDCANCEL)->EnableWindow(TRUE); if ( (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nType == SCAN_PAGE) || (!m_bReScan) ) { szStopButton.LoadString(IDS_SCANDLG_STOPTEXT); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); } else { if ( m_nScanTo == CTL_SCAN_SCANTO_FAX ) szStopButton.LoadString(IDS_SCANDLG_FAXTEXT); else szStopButton.LoadString(IDS_SCANDLG_NEWTEXT); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); } GetDlgItem(IDC_BUTTON_STOP)->SetWindowText(szStopButton); } // If scanning to display or type is ScanPage // then if we've scanned once, then rescanning, else enable scan if ( ((m_nScanTo == CTL_SCAN_SCANTO_FAX) && (!m_bReScan)) || (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nType == SCAN_PAGE) ) { GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(TRUE); // Also disable label, browse, filetype, options if scan to display or page GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME3)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE); BOOL bEnable = ( (m_nScanTo == CTL_SCAN_SCANTO_FAX) && (m_nType == SCAN_NEW) ); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(bEnable); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(bEnable); if ( (m_nScanTo == CTL_SCAN_SCANTO_DISPLAY) || (m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2))) ) { if ( m_bReScan == TRUE ) { GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(TRUE); } else { GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); } } else { GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(TRUE); if ( m_bReScan == TRUE ) GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(TRUE); else GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); } UpdateWindow(); if ( GetDlgItem(IDC_BUTTON_SCAN)->IsWindowEnabled() ) GetDlgItem(IDC_BUTTON_SCAN)->SetFocus(); else GetDlgItem(IDC_BUTTON_RESCAN)->SetFocus(); return; } // Otherwise, if name field is empty, nothing is enabled else if ( (m_nScanTo != CTL_SCAN_SCANTO_FAX) && (m_szName.IsEmpty()) ) { GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME3)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(TRUE); UpdateWindow(); GetDlgItem(IDC_EDIT_FILENAME)->SetFocus(); return; } // Otherwise, if we've scanned once if ( m_bReScan ) { // Allow glass scan only if not a one page type if ( m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2)) ) GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); // One page Only! else GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(FALSE); UpdateWindow(); if ( m_nFileType == (CTL_SCAN_FILETYPE_BMP-((g_bSupportAWD)?1:2)) ) GetDlgItem(IDC_BUTTON_RESCAN)->SetFocus(); else GetDlgItem(IDC_BUTTON_SCAN)->SetFocus(); return; } // Otherwise - Enable Scan!!! GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_NAME3)->EnableWindow(TRUE); GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(TRUE); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(TRUE); UpdateWindow(); if ( m_szName.IsEmpty() ) GetDlgItem(IDC_EDIT_FILENAME)->SetFocus(); else GetDlgItem(IDC_BUTTON_SCAN)->SetFocus(); return; } GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_SCANTO)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME2)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NAME3)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_FILENAME)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_BROWSE)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_FILETYPE)->EnableWindow(FALSE); GetDlgItem(IDC_COMBO_FILETYPE)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_RESCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SCAN)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_OPTS)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_SETUP)->EnableWindow(FALSE); GetDlgItem(IDC_TEXT_SCANNER)->EnableWindow(TRUE); GetDlgItem(IDC_LABEL_SCANNER)->EnableWindow(TRUE); GetDlgItem(IDC_CHECK_MULTIPAGE)->EnableWindow(FALSE); GetDlgItem(IDC_LABEL_NUMPAGES)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(FALSE); szStopButton.LoadString(IDS_SCANDLG_STOPTEXT); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->SetWindowText(szStopButton); GetDlgItem(IDCANCEL)->EnableWindow(TRUE); UpdateWindow(); GetDlgItem(IDCANCEL)->SetFocus(); return; }