home *** CD-ROM | disk | FTP | other *** search
- // seqdlg.cpp : implementation file
- //
- // Copyright (c) 1985-1998, Microsoft Corporation. All rights reserved.
- //
-
- #include "stdafx.h"
- #include "customwz.h"
- #include "seqdlg.h"
- #include "sampleaw.h"
- #include "typedlg.h"
- #include "options.h"
- #include "paint.h"
-
- #ifdef _PSEUDO_DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
-
- // Retrieve language suffix ("enu" or "fra", etc.)
- void GetLangSuffix(CString& strLang)
- {
- int nLeftParen = strLang.Find(_T('('));
- ASSERT(nLeftParen != -1);
- strLang = strLang.Mid(nLeftParen+1); // Now, strLang starts at the DLL name
- strLang.MakeLower();
- int nPeriod = strLang.Find(_T('.'));
- ASSERT(nPeriod != -1);
- ASSERT(strLang.Left(5) == _T("appwz"));
- strLang = strLang.Mid(5, nPeriod-5);
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CSequenceDlg dialog
-
-
- CSequenceDlg::CSequenceDlg()
- : CAppWizStepDlg(CSequenceDlg::IDD)
- {
- //{{AFX_DATA_INIT(CSequenceDlg)
- m_nApwzSeq = APWZSEQ_EXE;
- //}}AFX_DATA_INIT
- SetSeqBitmap();
- DefineDefaultLangMacros();
- }
-
- void CSequenceDlg::DoDataExchange(CDataExchange* pDX)
- {
- CAppWizStepDlg::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CSequenceDlg)
- DDX_Radio(pDX, IDC_APWZ_SEQ, m_nApwzSeq);
- //}}AFX_DATA_MAP
- }
-
-
- BEGIN_MESSAGE_MAP(CSequenceDlg, CAppWizStepDlg)
- //{{AFX_MSG_MAP(CSequenceDlg)
- ON_COMMAND_EX(IDC_APWZ_SEQ, OnClickedRadio)
- ON_WM_PAINT()
- ON_COMMAND_EX(IDC_APWZ_SEQ2, OnClickedRadio)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CSequenceDlg message handlers
-
- #define STEP2AB_LEFT 8
- #define STEP2AB_TOP 40
- #define STEP2AB_WIDTH 179
- #define STEP2AB_HEIGHT 180
-
- // Override OnPaint to draw pictures on the left side
- void CSequenceDlg::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
-
- PaintBackground(&dc, this);
-
- CDC dcMem;
- if (!dcMem.CreateCompatibleDC(&dc))
- return;
-
- // picture
- PaintBitmap(m_nSeqBitmap, STEP2AB_LEFT, STEP2AB_TOP, STEP2AB_WIDTH, STEP2AB_HEIGHT, &dc, &dcMem);
- }
-
- // Set member variable to the bitmap ID corresponding to the currently
- // selected AppWizard sequence
- void CSequenceDlg::SetSeqBitmap()
- {
- static UINT nBmps[] = {IDB_STEP2A, IDB_STEP2B};
- ASSERT (m_nApwzSeq == 0 || m_nApwzSeq == 1);
- m_nSeqBitmap = nBmps[m_nApwzSeq];
- }
-
- // This handler allows us to dynamically change the bitmap as soon
- // as a new AppWizard sequence is selected.
- BOOL CSequenceDlg::OnClickedRadio(UINT nID)
- {
- UpdateData(TRUE);
- SetSeqBitmap();
-
- // Invalidate the portion of this dialog on which we draw the picture
- CRect rect(STEP2AB_LEFT, STEP2AB_TOP, STEP2AB_LEFT + STEP2AB_WIDTH, STEP2AB_TOP + STEP2AB_HEIGHT);
- RedrawWindow(&rect, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
-
- EnableLangListbox(m_nApwzSeq == APWZSEQ_EXE);
-
- return TRUE;
- }
-
- void CSequenceDlg::DefineDefaultLangMacros()
- {
- ScanForAvailableLanguages(m_strlLanguages);
-
- // m_strlLanguages is now a stringlist whose entries are of the form:
- // "U.S. English (appwzenu.dll);0x040904e4" For the purposes of the
- // listbox, we want to strip out the translation identifiers
- // (0x040904e4). However, we retain the POSITION in m_strlLanguages
- // for each entry, so that when we generate the custom AppWizard, its
- // code will correctly call SetSupportedLanguages with the original
- // entries that AppWizard gave us here, complete with the translation
- // identifiers (see InitLangList() below).
-
- POSITION pos = m_strlLanguages.GetHeadPosition();
- int nLanguageCount = 0;
- CString strSupportedLangs;
- while (pos != NULL)
- {
- CString strLang = m_strlLanguages.GetNext(pos);
- strSupportedLangs += _T("\\n") + strLang;
- GetLangSuffix(strLang);
- DefineStringMacro(_T("CUSTOM_LANG_SUFFIX"), nLanguageCount++, strLang);
- }
-
- ASSERT(!strSupportedLangs.IsEmpty());
- strSupportedLangs = strSupportedLangs.Mid(2); // Chop off leading '\n'
- DefineStringMacro(_T("SUPPORTED_LANGS"), strSupportedLangs);
- DefineIntMacro(_T("NUM_CUSTOM_LANGS"), nLanguageCount);
- }
-
- // Set macros corresponding to the languages selected
- #define MAX_SELECTED_LANGS 32
- BOOL CSequenceDlg::DefineLangMacros()
- {
- CString strSupportedLangs;
- int pnSelectedLangs[MAX_SELECTED_LANGS];
- CListBox* pList = (CListBox*) GetDlgItem(IDC_LANGS);
- int nSelCount = pList->GetSelCount();
-
- if (nSelCount > MAX_SELECTED_LANGS)
- {
- // We use a stack-allocated, static-size array for storing the
- // listbox selections, since it's cheaper than using the heap.
- // Print error in the unlikely event there are over 32 languages
- // installed & selected.
- CString strPrompt;
- strPrompt.LoadString(IDP_TOO_MANY_LANGS);
- strPrompt.Format(strPrompt, MAX_SELECTED_LANGS);
- AfxMessageBox(strPrompt);
- return FALSE;
- }
-
- // Make sure at least one language is selected
- if (nSelCount == 0)
- {
- AfxMessageBox(IDP_NO_LANGS_SELECTED);
- return FALSE;
- }
-
- // Go through listbox and make a string of the names of the selected
- // languages. The string will be of the form:
- // "U.S. English (appwzenu.dll)\nFrench (appwzfra.dll)"
- pList->GetSelItems(MAX_SELECTED_LANGS, pnSelectedLangs);
-
- for (int i=0; i < nSelCount; i++)
- {
- POSITION pos = (POSITION) pList->GetItemData(pnSelectedLangs[i]);
- CString strLang = m_strlLanguages.GetAt(pos);
- strSupportedLangs += _T("\\n") + strLang;
-
- // Retrieve language suffix ("enu" or "fra", etc.)
- GetLangSuffix(strLang);
- DefineStringMacro(_T("CUSTOM_LANG_SUFFIX"), i, strLang);
- }
-
- ASSERT(!strSupportedLangs.IsEmpty());
- strSupportedLangs = strSupportedLangs.Mid(2); // Chop off leading '\n'
- DefineStringMacro(_T("SUPPORTED_LANGS"), strSupportedLangs);
- DefineIntMacro(_T("NUM_CUSTOM_LANGS"), nSelCount);
-
- return TRUE;
- }
-
-
- // Set step-related template macros before dismissing
- BOOL CSequenceDlg::OnDismiss()
- {
- if (!UpdateData(TRUE))
- return FALSE;
-
- if (m_nApwzSeq == APWZSEQ_EXE && !DefineLangMacros())
- return FALSE;
-
- g_options.m_nApwzSeq = m_nApwzSeq;
- g_options.DefineDlgMacros();
-
- return TRUE;
- }
-
- void CSequenceDlg::EnableLangListbox(BOOL bEnable)
- {
- GetDlgItem(IDC_LANGS)->EnableWindow(bEnable);
- GetDlgItem(IDC_LANGS_STATIC)->EnableWindow(bEnable);
- }
-
- void CSequenceDlg::InitLangList()
- {
- CListBox* pList = (CListBox*) GetDlgItem(IDC_LANGS);
-
- int i = 0;
- POSITION pos = m_strlLanguages.GetHeadPosition();
- while (pos != NULL)
- {
- POSITION posCurrent = pos;
- CString strLang = m_strlLanguages.GetNext(pos);
- int nSemicolon = strLang.Find(_T(';'));
- ASSERT(nSemicolon != -1);
-
- // Add the entry minus the translation ID to the listbox
- i = pList->AddString(strLang.Left(nSemicolon));
-
- // Retain original POSITION for use when generating the wizard
- pList->SetItemData(i, (DWORD) posCurrent);
- }
-
- // By default, the custom AppWizard will support the languages AppWizard
- // supports. Thus, we start off the listbox by selecting all languages.
- if (i == 0)
- pList->SetSel(0, TRUE);
- else
- pList->SelItemRange(TRUE, 0, i);
-
- EnableLangListbox(m_nApwzSeq == APWZSEQ_EXE);
- }
-
-
- BOOL CSequenceDlg::OnInitDialog()
- {
- CAppWizStepDlg::OnInitDialog();
- InitLangList();
-
- return TRUE;
- }
-