gecko-dev/cmd/winfe/eddialog.cpp

1465 строки
43 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
// eddialog.cpp : Dialogs used by the CNetscapeEditView class
//
//
// Created 10/11/96 by CLM
//
#include "stdafx.h"
#include "edview.h"
#include "edt.h"
#include "secnav.h"
#include "prefapi.h"
#include "nethelp.h"
#include "xp_help.h"
// the dialog box & string resources are in edtrcdll DLL
#include "edtrcdll\src\resource.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern char *EDT_NEW_DOC_NAME;
/////////////////////////////////////////////////////////////////////////////
// CLoadingImageDlg dialog
//
CLoadingImageDlg::CLoadingImageDlg(CWnd* pParent, MWContext * pMWContext)
: CDialog(CLoadingImageDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoadingImageDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
ASSERT(pParent);
ASSERT(pMWContext);
m_pMWContext = pMWContext;
if (!CDialog::Create(CLoadingImageDlg::IDD, pParent))
{
TRACE0("Warning: creation of CLoadingImageDlg dialog failed\n");
return;
}
// Center the window relative to parent
CRect cRectParent;
CRect cRectDlg;
pParent->GetWindowRect(&cRectParent);
GetWindowRect(&cRectDlg);
int iTop = 200;
int iLeft = 200;
if ( cRectParent.Height() > cRectDlg.Height() ){
iTop = cRectParent.top + ( (cRectParent.Height() - cRectDlg.Height()) / 2 );
}
if ( cRectParent.Width() > cRectDlg.Width() ){
iLeft = cRectParent.left + ( (cRectParent.Width() - cRectDlg.Width()) / 2 );
}
SetWindowPos( &wndTopMost, iLeft, iTop, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
// Switch back to NETSCAPE.EXE for resource hInstance
m_ResourceSwitcher.Reset();
}
void CLoadingImageDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoadingImageDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoadingImageDlg, CDialog)
//{{AFX_MSG_MAP(CLoadingImageDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoadingImageDlg message handlers
void CLoadingImageDlg::OnCancel()
{
// Tell edit core to end loading
// Note: This will result in call to FE_ImageLoadDialogDestroy,
// which will do DestroyWindow();
EDT_ImageLoadCancel(m_pMWContext);
}
void CLoadingImageDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
/////////////////////////////////////////////////////////////////////
CSaveNewDlg::CSaveNewDlg(CWnd * pParent)
: CDialog(CSaveNewDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSaveNewDlg)
//}}AFX_DATA_INIT
}
BOOL CSaveNewDlg::OnInitDialog()
{
// Switch back to NETSCAPE.EXE for resource hInstance
m_ResourceSwitcher.Reset();
CDialog::OnInitDialog();
CStatic * wndIcon = (CStatic *)GetDlgItem(IDC_INFO_ICON);
wndIcon->SetIcon(theApp.LoadStandardIcon(IDI_ASTERISK));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BEGIN_MESSAGE_MAP(CSaveNewDlg, CDialog)
//{{AFX_MSG_MAP(CSaveNewDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaveFileDlg dialog
//
CSaveFileDlg::CSaveFileDlg(CWnd* pParent,
MWContext * pMWContext,
int iFileCount,
ED_SaveDialogType saveType )
: CDialog(CSaveFileDlg::IDD, pParent),
m_pParent(pParent),
m_hTimer(0)
{
ASSERT(pMWContext);
m_pMWContext = pMWContext;
m_iFileCount = iFileCount;
m_iCurrentFile = 0;
m_bUpload = saveType == ED_SAVE_DLG_PUBLISH;
// For simplicity, create right here
if (!CDialog::Create(CSaveFileDlg::IDD, pParent))
{
TRACE0("Warning: creation of CSaveFileDlg dialog failed\n");
return;
}
// Change dialog caption and message to use for uploading;
UINT nID = 0;
BOOL bPublishing = TRUE;
UINT nIDCaption = IDS_PUBLISHING_DOCUMENT;
switch ( saveType ){
case ED_SAVE_DLG_SAVE_LOCAL:
nID = IDS_SAVING_FILE;
bPublishing = FALSE; // Use Caption in dialog resource
break;
case ED_SAVE_DLG_PREPARE_PUBLISH:
nID = IDS_PREPARING_PUBLISH;
break;
case ED_SAVE_DLG_PUBLISH:
nID = IDS_UPLOADING_FILE;
break;
}
if( bPublishing ){
SetWindowText(szLoadString(IDS_PUBLISHING_DOCUMENT));
}
if( nID ){
GetDlgItem(IDC_SAVE_FILE_LABEL)->SetWindowText(szLoadString(nID));
}
// Clear our place-holder string
GetDlgItem(IDC_FILE_COUNT_MSG)->SetWindowText("");
// Start a short timer -- we don't show window until timer is hit
// This prevents ugly flashing of this dialog when saving proceeds
// real quick on local drive
m_hTimer = SetTimer(1, 200, NULL);
// Why doesn't this center on parent window automatically!
CRect cRectParent;
CRect cRectDlg;
GetWindowRect(&cRectDlg);
// Center in screen
int iLeft;
int iTop;
UINT nStyle = SWP_NOSIZE;
if( pParent ){
pParent->GetWindowRect(&cRectParent);
if ( cRectParent.Height() > cRectDlg.Height() ){
iTop = cRectParent.top + ( (cRectParent.Height() - cRectDlg.Height()) / 2 );
} else {
iTop = cRectParent.top + GetSystemMetrics(SM_CYCAPTION);
}
if ( cRectParent.Width() > cRectDlg.Width() ){
iLeft = cRectParent.left + ( (cRectParent.Width() - cRectDlg.Width()) / 2 );
} else {
iLeft = cRectParent.left;
}
} else {
iLeft = (sysInfo.m_iScreenWidth / 2) - (cRectDlg.Width()/2);
iTop = (sysInfo.m_iScreenHeight / 2) - (cRectDlg.Height()/2);
}
if( m_hTimer ){
// Hide window until timer fires or File system closes us
nStyle |= SWP_HIDEWINDOW;
} else {
// No timer - we better show the dialog now
nStyle |= SWP_SHOWWINDOW;
}
// Don't use &wndTopmost because CSaveFileOverwriteDlg
// will be popping up over us.
SetWindowPos(NULL, iLeft, iTop, 0, 0, nStyle);
}
void CSaveFileDlg::OnTimer(UINT nIDEvent)
{
ShowWindow(SW_SHOW);
KillTimer(1);
m_hTimer = 0;
TRACE("CSaveFileDlg::OnTimer - Show window now\n");
}
void CSaveFileDlg::StartFileSave(char * pFilename)
{
GetDlgItem(IDC_SAVE_FILENAME)->SetWindowText(pFilename);
// Report file number if we have more than 1 total
if( m_iFileCount > 1 ){
m_iCurrentFile++;
CString csFileCount;
csFileCount.Format(szLoadString(IDS_FILE_COUNT_FORMAT), m_iCurrentFile, m_iFileCount );
GetDlgItem(IDC_FILE_COUNT_MSG)->SetWindowText(csFileCount);
}
}
void CSaveFileDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSaveFileDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSaveFileDlg, CDialog)
//{{AFX_MSG_MAP(CSaveFileDlg)
ON_WM_TIMER()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaveFileDlg message handlers
void CSaveFileDlg::OnDestroy()
{
if( m_hTimer ){
KillTimer(1);
}
}
void CSaveFileDlg::OnCancel()
{
if( m_bUpload ){
// Get a window context from MWContext
CWinCX *pContext = VOID2CX(m_pMWContext->fe.cx, CWinCX);
if( pContext ){
pContext->Interrupt();
}
// NET_SilentInterruptWindow(m_pMWContext);
} else {
EDT_SaveCancel(m_pMWContext);
}
// Do NOT call CDialog::OnCancel(),
// Edit core will call to destroy us
}
void CSaveFileDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
}
/////////////////////////////////////////////////////////////////////////////
// CSaveFileOverwriteDlg dialog
CSaveFileOverwriteDlg::CSaveFileOverwriteDlg(CWnd* pParent /*=NULL*/,
char * pFilename,
CSaveFileDlg * pSaveDlg)
: CDialog(CSaveFileOverwriteDlg::IDD, pParent )
{
//{{AFX_DATA_INIT(CSaveFileOverwriteDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_pFilename = pFilename;
m_pSaveFileDlg = pSaveDlg;
}
BOOL CSaveFileOverwriteDlg::OnInitDialog()
{
// Switch back to NETSCAPE.EXE for resource hInstance
m_ResourceSwitcher.Reset();
CDialog::OnInitDialog();
CFont * pfontBold = CFont::FromHandle((HFONT)GetStockObject(SYSTEM_FONT));
CWnd * pWnd = GetDlgItem(IDC_SAVE_FILENAME);
if ( pWnd ) {
pWnd->SetFont(pfontBold);
if ( m_pFilename ) {
char *pName = XP_STRRCHR(m_pFilename, '\\');
if( pName ){
pName++;
} else {
pName = m_pFilename;
}
pWnd->SetWindowText(pName);
}
}
// Set the question icon
CStatic * wndIcon = (CStatic *)GetDlgItem(IDC_OVERWRITE_ICON);
wndIcon->SetIcon(theApp.LoadStandardIcon(IDI_EXCLAMATION)); // sIDI_QUESTION));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSaveFileOverwriteDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSaveFileOverwriteDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSaveFileOverwriteDlg, CDialog)
//{{AFX_MSG_MAP(CSaveFileOverwriteDlg)
ON_BN_CLICKED(IDC_DONT_OVERWRITE_ALL, OnDontOverwriteAll)
ON_BN_CLICKED(IDC_DONT_OVERWRITE_ONE, OnDontOverwriteOne)
ON_BN_CLICKED(IDC_OVERWRITE_ALL, OnOverwriteAll)
ON_BN_CLICKED(IDC_OVERWRITE_ONE, OnOverwriteOne)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaveFileOverwriteDlg message handlers
int CSaveFileOverwriteDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// Offset dialog to upper left of parent
// Gives a cascade look relative to CSaveFileDlg
if ( m_pSaveFileDlg ) {
RECT rectParent;
m_pSaveFileDlg->GetClientRect(&rectParent);
m_pSaveFileDlg->ClientToScreen(&rectParent);
SetWindowPos( 0, /*&wndTopMost,*/
rectParent.left, rectParent.top,
0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
return 0;
}
void CSaveFileOverwriteDlg::OnOK()
{
CDialog::OnOK();
}
void CSaveFileOverwriteDlg::OnDontOverwriteAll()
{
m_Result = ED_SAVE_DONT_OVERWRITE_ALL;
OnOK();
}
void CSaveFileOverwriteDlg::OnDontOverwriteOne()
{
m_Result = ED_SAVE_DONT_OVERWRITE_THIS;
OnOK();
}
void CSaveFileOverwriteDlg::OnOverwriteAll()
{
m_Result = ED_SAVE_OVERWRITE_ALL;
OnOK();
}
void CSaveFileOverwriteDlg::OnOverwriteOne()
{
m_Result = ED_SAVE_OVERWRITE_THIS;
OnOK();
}
void CSaveFileOverwriteDlg::OnCancel()
{
m_Result = ED_SAVE_CANCEL;
OnOK();
}
/////////////////////////////////////////////////////////////////////////////
// Local helpers for publish string manipulation
static void FreeStrings(char ** pStrings)
{
if(pStrings){
int i = 0;
while( pStrings[i] ){
XP_FREE(pStrings[i]);
pStrings[i] = NULL;
i++;
}
XP_FREE(pStrings);
}
}
/////////////////////////////////////////////////////////////////////////////
// CPublishDlg dialog
CPublishDlg::CPublishDlg(CWnd *pParent,
MWContext *pMWContext,
char *pUrl)
: CDialog(CPublishDlg::IDD, pParent),
m_pMWContext(pMWContext),
m_pCurrentUrl(pUrl),
m_pCurrentFile(0),
m_pCurrentDirectory(0),
m_pImageFiles(0),
m_pSelectedDefault(0),
m_ppAllFiles(0),
m_bIsRootDirectory(0),
m_ppUserList(0),
m_ppPasswordList(0),
m_pFullLocation(0),
m_ppImageList(0),
m_iFileCount(0)
{
// m_pCurrentFile may be NULL, but m_pCurrentUrl won't be.
// m_pCurrentFile will be non-NULL iff we are publishing a local file.
//
// if (pUrl != file:///Untitled)
if (XP_STRCMP(pUrl,EDT_NEW_DOC_NAME)) {
XP_ConvertUrlToLocalFile( pUrl, &m_pCurrentFile );
}
//{{AFX_DATA_INIT(CPublishDlg)
m_csUserName = _T("");
m_csPassword = _T("");
m_csTitle = _T("");
m_csFilename = _T("");
m_bRememberPassword = TRUE;
//}}AFX_DATA_INIT
ASSERT( pMWContext );
}
CPublishDlg::~CPublishDlg()
{
XP_FREEIF(m_pCurrentFile);
XP_FREEIF(m_pCurrentDirectory);
XP_FREEIF(m_pImageFiles);
XP_FREEIF(m_pSelectedDefault);
XP_FREEIF(m_pFullLocation);
FreeStrings(m_ppImageList);
FreeStrings(m_ppAllFiles);
FreeStrings(m_ppUserList);
FreeStrings(m_ppPasswordList);
//NOTE: DO NOT try to free m_ppIncludedFiles list - EDT_PublishFile will do that
}
void CPublishDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPublishDlg)
DDX_Text(pDX, IDC_PUBLISH_USER, m_csUserName);
DDX_Text(pDX, IDC_PUBLISH_PASSWORD, m_csPassword);
DDX_Text(pDX, IDC_DOC_TITLE, m_csTitle);
DDX_Text(pDX, IDC_PUBLISH_FILENAME, m_csFilename);
DDX_Check(pDX, IDC_PUBLISH_REMEMBER_PASSWORD, m_bRememberPassword);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPublishDlg, CDialog)
//{{AFX_MSG_MAP(CPublishDlg)
ON_BN_CLICKED(ID_HELP, OnHelp)
ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)
ON_BN_CLICKED(IDC_SELECT_NONE, OnSelectNone)
ON_BN_CLICKED(IDC_INCLUDE_ALL_FILES, OnIncludeAllFiles)
ON_BN_CLICKED(IDC_INCLUDE_IMAGE_FILES, OnIncludeImageFiles)
ON_CBN_KILLFOCUS(IDC_PUBLISH_LOCATION_LIST, OnKillfocusPublishLocationList)
ON_BN_CLICKED(IDC_PUBLISH_DEFAULT_LOCATION, OnPublishDefaultLocation)
ON_CBN_SELCHANGE(IDC_PUBLISH_LOCATION_LIST, OnSelchangePublishLocation)
//}}AFX_MSG_MAP
#ifdef XP_WIN32
ON_WM_HELPINFO()
#endif //XP_WIN32
END_MESSAGE_MAP()
BOOL CPublishDlg::OnInitDialog()
{
// Switch back to NETSCAPE.EXE for resource hInstance
m_ResourceSwitcher.Reset();
// TODO: Compress long url name, so fits in list box.
CString csURL = m_pCurrentFile ? m_pCurrentFile : m_pCurrentUrl;
WFE_CondenseURL(csURL, 50, FALSE);
CString csCaption;
csCaption.Format(szLoadString(IDS_PUBLISH_CAPTION), csURL);
// Display the main filepath (or URL) in dialog Caption
SetWindowText(csCaption);
CComboBox *pLocationComboBox;
VERIFY(pLocationComboBox = (CComboBox*)GetDlgItem(IDC_PUBLISH_LOCATION_LIST));
XP_Bool bRem;
PREF_GetBoolPref("editor.publish_save_password",&bRem);
m_bRememberPassword = bRem;
char * pPassword = NULL;
char * pFilename = NULL;
char * pLastLoc = NULL;
char * pInitLocation = NULL;
char * pInitUserName = NULL;
// Get the default publish URL and password
pInitLocation = EDT_GetDefaultPublishURL(m_pMWContext, &pFilename, &pInitUserName, &pPassword);
if( pFilename ){
m_csFilename = pFilename;
// Don't free yet - we may use it for title
}
if( pPassword ){
m_csPassword = pPassword;
XP_FREEIF(pPassword);
}
// It would be nice to use CString::GetBuffer, but we can't XP_FREE its contents!
m_csLocation = pInitLocation;
m_csUserName = pInitUserName;
// Don't use DDX for this
pLocationComboBox->SetWindowText(pInitLocation);
XP_FREEIF(m_pFullLocation);
XP_FREEIF(pInitUserName);
EDT_PageData * pPageData = EDT_GetPageData(m_pMWContext);
if( pPageData ){
m_csTitle = pPageData->pTitle;
EDT_FreePageData(pPageData);
}
// If empty, fill in title with Filename without extension
if( m_csTitle.IsEmpty() && pFilename ){
char * pTitle = EDT_GetPageTitleFromFilename(pFilename);
if( pTitle ){
m_csTitle = pTitle;
XP_FREE(pTitle);
}
}
XP_FREEIF(pFilename);
// Enable the "Default location" button only if we have a preference
char *prefStr = NULL;
PREF_CopyCharPref("editor.publish_location", &prefStr);
if (prefStr) XP_FREE(prefStr);
// Build lists of 10 most-recently-visited sites saved in preferences
// ComboBox will contain locations,
// we store username and password in local lists, same order (no sorting)
VERIFY(m_ppUserList = (char**) XP_ALLOC((MAX_PUBLISH_LOCATIONS+1) * sizeof(char*)));
VERIFY(m_ppPasswordList = (char**) XP_ALLOC((MAX_PUBLISH_LOCATIONS+1) * sizeof(char*)));
// Fill the lists of user names and passwords that maps
// to the preference list. First item = most recently-added
int i;
BOOL bLocationFound = FALSE;
for( i= 0; i < MAX_PUBLISH_LOCATIONS; i++ ){
m_ppUserList[i] = NULL;
m_ppPasswordList[i] = NULL;
char *pLocation = NULL;
if( EDT_GetPublishingHistory( i, &pLocation, &m_ppUserList[i], &m_ppPasswordList[i] ) &&
pLocation && *pLocation ){
pLocationComboBox->AddString(pLocation);
// If previous location = the initial new location,
// then use the previous username and password
if( !bLocationFound && !strcmp(pLocation, pInitLocation) ){
// Should there ever be an existing initial username? (not likely!)
//if( m_csUserName.IsEmpty() ){
m_csUserName = m_ppUserList[i];
m_csPassword = m_ppPasswordList[i];
// Don't check again once we found the most recent entry
bLocationFound = TRUE;
}
} else {
break;
}
XP_FREEIF(pLocation);
}
// Terminate the lists
m_ppUserList[i] = NULL;
m_ppPasswordList[i] = NULL;
XP_FREEIF(pInitLocation);
// Copy the directory part of our source file
// Weird: XP_OPENDIR needs a slash at beginning!
if (m_pCurrentFile) {
m_pCurrentDirectory = (char*)XP_ALLOC(XP_STRLEN(m_pCurrentFile)+2);
}
// Space for "/."
else {
m_pCurrentDirectory = (char*)XP_ALLOC(3);
}
if( !m_pCurrentDirectory ){
// No memory!
TRACE0("Not enough memory for publish string creation.\n");
EndDialog(IDCANCEL);
return TRUE;
}
XP_STRCPY(m_pCurrentDirectory,"/"); // So trailing \0 if m_pCurrentFile is NULL.
// *m_pCurrentDirectory = '/';
if (m_pCurrentFile) {
XP_STRCPY((m_pCurrentDirectory+1),m_pCurrentFile);
}
// Find last slash '\'
char *pSlash = strrchr(m_pCurrentDirectory, '\\');
if( pSlash ){
// Keep terminal slash if we are a root directory
if( *(pSlash-1) == ':' ){
m_bIsRootDirectory = TRUE;
pSlash++;
}
*pSlash = '\0';
} else {
// No directory? Assume current?
XP_STRCPY((m_pCurrentDirectory+1),".");
}
// Fill the list with image files contained in this document
XP_FREEIF(m_pSelectedDefault);
XP_Bool bKeepImages;
PREF_GetBoolPref("editor.publish_keep_images",&bKeepImages);
m_pImageFiles = EDT_GetAllDocumentFilesSelected( m_pMWContext, &m_pSelectedDefault, bKeepImages );
if( m_pImageFiles ){
// Start with just the list of images in current file
OnIncludeImageFiles();
} else {
// No images, disable buttons
GetDlgItem(IDC_INCLUDE_IMAGE_FILES)->EnableWindow(FALSE);
GetDlgItem(IDC_SELECT_ALL)->EnableWindow(FALSE);
GetDlgItem(IDC_SELECT_NONE)->EnableWindow(FALSE);
}
if( !m_pCurrentFile ) {
GetDlgItem(IDC_INCLUDE_ALL_FILES)->EnableWindow(FALSE);
}
((CButton*)GetDlgItem(IDC_INCLUDE_IMAGE_FILES))->SetCheck(m_pImageFiles ? 1 : 0);
CDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPublishDlg::OnOK()
{
UpdateData(TRUE);
// Extract any username:password@ and filename from location editbox
// into m_csUserName, m_csPassword, and m_csFilename
OnKillfocusPublishLocationList();
m_csFilename.TrimLeft();
m_csFilename.TrimRight();
m_csTitle.TrimLeft();
m_csTitle.TrimRight();
// Prompt for a filename
if( m_csFilename.IsEmpty() &&
IDNO == MessageBox( szLoadString(IDS_ENTER_PUBLISH_FILENAME),
szLoadString(IDS_PUBLISH_PAGE),
MB_ICONEXCLAMATION | MB_YESNO) ){
GetDlgItem(IDC_PUBLISH_FILENAME)->SetFocus();
return;
}
if( m_csTitle.IsEmpty() ){
char * pSuggested = EDT_GetPageTitleFromFilename((char*)LPCSTR(m_csFilename));
// Use same dialog we use after SaveAs to prompt user for a title
CPageTitleDlg dlg(this, &pSuggested);
if( dlg.DoModal() == IDOK ){
m_csTitle = pSuggested;
} else {
// User canceled. Put them back in Publish dialog
GetDlgItem(IDC_DOC_TITLE)->SetFocus();
XP_FREEIF(pSuggested);
return;
}
XP_FREEIF(pSuggested);
}
EDT_PageData * pPageData = EDT_GetPageData(m_pMWContext);
if( pPageData ){
char *pNewTitle;
if( m_csTitle.IsEmpty() ){
pNewTitle = NULL;
} else {
pNewTitle = XP_STRDUP(LPCSTR(m_csTitle));
}
// Only set if value has changed. O.W. Messes up the editor dirty flag.
if (XP_STRCMP(pPageData->pTitle ? pPageData->pTitle : "",
pNewTitle ? pNewTitle : "")) {
XP_FREEIF(pPageData->pTitle);
pPageData->pTitle = pNewTitle;
EDT_SetPageData(m_pMWContext, pPageData);
}
else {
XP_FREEIF(pNewTitle);
}
EDT_FreePageData(pPageData);
}
((CComboBox*)GetDlgItem(IDC_PUBLISH_LOCATION_LIST))->GetWindowText(m_csLocation);
m_csLocation.TrimLeft();
m_csLocation.TrimRight();
int type = NET_URL_Type((char*)LPCSTR(m_csLocation));
if( type == FTP_TYPE_URL ||
type == HTTP_TYPE_URL ||
type == SECURE_HTTP_TYPE_URL ){
m_csUserName.TrimLeft();
m_csUserName.TrimRight();
m_csPassword.TrimLeft();
m_csPassword.TrimRight();
m_csLocation.TrimLeft();
m_csLocation.TrimRight();
// Assemble a string WITH password to do actual upload
char * pLocation = NULL;
NET_MakeUploadURL( &pLocation, (char*)LPCSTR(m_csLocation),
(char*)LPCSTR(m_csUserName),
(char*)LPCSTR(m_csPassword) );
// Add filename to end of location URL for validation
// This is final string used by Publishing
m_pFullLocation = EDT_ReplaceFilename(pLocation, (char*)LPCSTR(m_csFilename), TRUE);
XP_FREEIF(pLocation);
// HARDTS:
// Tell user the URL they are publishing looks like it might be wrong.
// e.g. ends in a slash or does not have a file extension.
// Give the user the option of attempting to publish to the
// specified URL even if it looks suspicious.
if (!EDT_CheckPublishURL(m_pMWContext,m_pFullLocation)) {
return;
}
CListBox * pIncludeListBox = (CListBox*)GetDlgItem(IDC_PUBLISH_OTHER_FILES);
int iCount = pIncludeListBox->GetSelCount();
// Plus one extra string to terminate array
m_ppIncludedFiles = (char**) XP_ALLOC((iCount+1) * sizeof(char*));
if( !m_ppIncludedFiles ){
// Unlikely! Not enough memory!
EndDialog(IDCANCEL);
return;
}
BOOL bUseImageList = ((CButton*)GetDlgItem(IDC_INCLUDE_IMAGE_FILES))->GetCheck();
// Construct an array of included files
// from just the selected items in listbox
if( iCount ){
int *pIndexes = (int*)XP_ALLOC(iCount * sizeof(int));
if( pIndexes ){
pIncludeListBox->GetSelItems(iCount, pIndexes);
CString csItem;
for( int i=0; i < iCount; i++ ){
if( bUseImageList ){
// Copy the URL from the original, sorted list of image URLs
csItem = m_ppImageList[pIndexes[i]];
} else {
pIncludeListBox->GetText(pIndexes[i], csItem);
}
m_ppIncludedFiles[i] = XP_STRDUP(LPCSTR(csItem));
}
XP_FREE(pIndexes);
}
}
// Terminate array
m_ppIncludedFiles[iCount] = NULL;
// Don't use CDialog::OnOK() -- it will overwrite our changed m_csLocation
EndDialog(IDOK);
} else {
// Tell user they must use "ftp://" or "http://"
MessageBox(szLoadString(IDS_BAD_PUBLISH_URL),
szLoadString(IDS_PUBLISH_FILES),
MB_ICONEXCLAMATION | MB_OK);
}
}
void CPublishDlg::OnHelp()
{
NetHelp(HELP_PUBLISH_FILES);
}
#ifdef XP_WIN32
BOOL CPublishDlg::OnHelpInfo(HELPINFO *)//32bit messagemapping.
{
OnHelp();
return TRUE;
}
#endif//XP_WIN32
void CPublishDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
// Implemented in edprops.cpp
extern int CompareStrings( const void *arg1, const void *arg2 );
// Maximum number of characters of a URL in the Included Files listbox
#define ED_MAX_URL_LENGTH 55
void CPublishDlg::OnIncludeImageFiles()
{
if( m_pImageFiles ){
FreeStrings(m_ppImageList);
m_iFileCount = 0;
char * pString = m_pImageFiles;
int iLen;
// Scan list once to count items
while( (iLen = XP_STRLEN(pString)) > 0 ) {
pString += iLen+1;
m_iFileCount++;
}
m_ppImageList = (char**)XP_ALLOC((m_iFileCount+1) * sizeof(char*));
if(!m_ppImageList){
return;
}
int i = 0;
pString = m_pImageFiles;
for( i = 0; i< m_iFileCount; i++){
iLen = XP_STRLEN(pString) + 1;
// Allocate room for string + 1 char at end for selected signal
// (cause index list we have will be useless once names are sorted)
char * pItem = (char*)XP_ALLOC((iLen+1) * sizeof(char));
if( pItem ){
strcpy(pItem,pString);
pItem[iLen] = m_pSelectedDefault[i] ? ' ' : '\0';
m_ppImageList[i] = pItem;
} else {
FreeStrings(m_ppImageList);
m_ppImageList = NULL;
m_iFileCount = 0;
return;
}
pString += iLen;
}
// Terminate the list
m_ppImageList[i] = NULL;
// Sort the strings
qsort( (void *)m_ppImageList, (size_t)m_iFileCount, sizeof( char * ), CompareStrings );
CListBox * pIncludeListBox = (CListBox*)GetDlgItem(IDC_PUBLISH_OTHER_FILES);
pIncludeListBox->ResetContent();
for(i = 0; i < m_iFileCount; i++){
// add to the end of the list
pString = m_ppImageList[i];
iLen = strlen(pString);
if( iLen > ED_MAX_URL_LENGTH ){
CString csItem = pString;
WFE_CondenseURL(csItem, ED_MAX_URL_LENGTH, FALSE);
pIncludeListBox->AddString(LPCSTR(csItem));
} else {
pIncludeListBox->AddString(pString);
}
char SelChar = pString[strlen(pString)+1];
// Last character past '\0' is " " for selected, or 0 if not selected by default
pIncludeListBox->SetSel(i, SelChar ? 1 : 0);
}
GetDlgItem(IDC_SELECT_ALL)->EnableWindow(TRUE);
GetDlgItem(IDC_SELECT_NONE)->EnableWindow(TRUE);
}
}
void CPublishDlg::OnIncludeAllFiles()
{
// Shouldn't be here when editing a remote URL.
if (!m_pCurrentFile) {
ASSERT(0);
}
FreeStrings(m_ppAllFiles);
// Always reread directory list in case use changes
// with another program
m_ppAllFiles = NET_AssembleAllFilesInDirectory(m_pMWContext,
m_pCurrentDirectory);
// Get the count of items
int i = 0;
while( m_ppAllFiles[i] ){
i++;
}
// Sort the strings
qsort( (void *)m_ppAllFiles, (size_t)i, sizeof( char * ), CompareStrings );
int iCount = 0;
if( m_ppAllFiles && *m_ppAllFiles ){
CListBox * pIncludeListBox = (CListBox*)GetDlgItem(IDC_PUBLISH_OTHER_FILES);
pIncludeListBox->ResetContent();
// Get current file without the directory
char *pMainFile = m_pCurrentFile + XP_STRLEN(m_pCurrentFile);
while( pMainFile != m_pCurrentFile && *pMainFile != '\\') pMainFile--;
if( pMainFile != m_pCurrentFile ) pMainFile++;
i = 0;
char * pFilename;
while( m_ppAllFiles[i] ){
// Find just filename (skip over included directory)
pFilename = strrchr(m_ppAllFiles[i], '\\');
if( ! pFilename ){
pFilename = strrchr(m_ppAllFiles[i], '/');
}
if( pFilename ){
pFilename++;
} else {
pFilename = m_ppAllFiles[i];
}
// Don't include the main file in the list
if( 0 != strcmpi(pFilename, pMainFile) ){
pIncludeListBox->AddString(pFilename);
iCount++;
}
i++;
}
pIncludeListBox->SetSel(-1, TRUE);
}
// If no other files in the directory, clear button
// (Note: we don't disable in case user copies files to
// directory while dialog is still active)
if( iCount == 0 ){
((CButton*)GetDlgItem(IDC_INCLUDE_ALL_FILES))->SetCheck(0);
}
GetDlgItem(IDC_SELECT_ALL)->EnableWindow(iCount > 0);
GetDlgItem(IDC_SELECT_NONE)->EnableWindow(iCount > 0);
}
void CPublishDlg::OnSelectAll()
{
// Select all strings in the listbox
((CListBox*)GetDlgItem(IDC_PUBLISH_OTHER_FILES))->SetSel(-1, TRUE);
}
void CPublishDlg::OnSelectNone()
{
// Unselect all strings in the listbox
((CListBox*)GetDlgItem(IDC_PUBLISH_OTHER_FILES))->SetSel(-1, FALSE);
}
void CPublishDlg::OnSelchangePublishLocation()
{
// Get the corresponding username and passwords
// to show in edit boxes
int i = ((CComboBox*)GetDlgItem(IDC_PUBLISH_LOCATION_LIST))->GetCurSel();
if( i >= 0 && m_ppUserList && m_ppPasswordList ){
// This is lame. We can't use UpdateData
// or setting selected item doesn't work right!
GetDlgItem(IDC_PUBLISH_USER)->SetWindowText(m_ppUserList[i]);
GetDlgItem(IDC_PUBLISH_PASSWORD)->SetWindowText(m_ppPasswordList[i]);
}
}
// Parse editfield location into URL, Filename, UserName, and Password
// NOTE: Anything found in this Location will override contents of
// individual Filename, UserName, and Password edit boxes
void CPublishDlg::OnKillfocusPublishLocationList()
{
// If user included a filename, user name, or password within location string,
// use that instead of current edit fields
UpdateData(TRUE);
char *pUserName = NULL;
char *pPassword = NULL;
char *pLocation = NULL;
char *pFilename = NULL;
GetDlgItem(IDC_PUBLISH_LOCATION_LIST)->GetWindowText(m_csLocation);
m_csLocation.TrimLeft();
m_csLocation.TrimRight();
NET_ParseUploadURL( (char*)LPCSTR(m_csLocation), &pLocation,
&pUserName, &pPassword );
if( pUserName ){
CString csUser = pUserName;
csUser.TrimLeft();
csUser.TrimRight();
if( !csUser.IsEmpty() ){
m_csUserName = csUser;
}
XP_FREE(pUserName);
}
if( pPassword ){
CString csPassword = pPassword;
csPassword.TrimLeft();
csPassword.TrimRight();
if( !csPassword.IsEmpty() ){
m_csPassword = csPassword;
}
XP_FREE(pPassword);
}
if( pLocation ){
// Extract filename at end of Location
// ONLY if it ends in ".htm" or ".html" or ".shtml"
pFilename = EDT_GetFilename(pLocation, TRUE);
// Put in check for pFilename to be NULL. hardts
char * pDot = pFilename ? strchr(pFilename, '.') : NULL;
if( pFilename && *pFilename && pDot &&
(0 == stricmp(".htm", pDot) || 0 == stricmp(".html", pDot) || 0 == stricmp(".shtml", pDot)) ){
m_csFilename = pFilename;
XP_FREE(pFilename);
// Save version with filename stripped off
char * pURL = EDT_ReplaceFilename(pLocation, NULL, TRUE);
m_csLocation = pURL;
GetDlgItem(IDC_PUBLISH_LOCATION_LIST)->SetWindowText(pURL);
XP_FREEIF(pURL);
} else {
m_csLocation = pLocation;
}
XP_FREE(pLocation);
}
// Update Filename, User name, and password controls
UpdateData(FALSE);
}
void CPublishDlg::OnPublishDefaultLocation()
{
UpdateData(TRUE);
GetDlgItem(IDC_PUBLISH_LOCATION_LIST)->GetWindowText(m_csLocation);
char * pDefaultLocation = NULL;
PREF_CopyCharPref("editor.publish_location", &pDefaultLocation);
if( !pDefaultLocation){
return;
}
char *pLocation = NULL;
char *pUserName = NULL;
// Parse the preference string to extract Username
// password is separate for security munging
NET_ParseUploadURL( pDefaultLocation, &pLocation,
&pUserName, NULL );
// It would be nice to use CString::GetBuffer, but we can't XP_FREE its contents!
m_csLocation = pLocation;
m_csUserName = pUserName;
char * pPass = NULL;
PREF_CopyCharPref("editor.publish_password", &pPass);
char * pPassword = SECNAV_UnMungeString(pPass);
m_csPassword = pPassword;
XP_FREEIF(pPassword);
GetDlgItem(IDC_PUBLISH_LOCATION_LIST)->SetWindowText(pLocation);
XP_FREEIF(pDefaultLocation);
XP_FREEIF(pLocation);
XP_FREEIF(pUserName);
XP_FREEIF(pPass);
UpdateData(FALSE);
}
/////////////////////////////////////////////////////////////////////////////
// CEditHintDlg dialog
CEditHintDlg::CEditHintDlg(CWnd* pParent,
UINT nID_Msg,
UINT nID_Caption,
BOOL bYesNo) // Default style is MB_OK
: CDialog(CEditHintDlg::IDD, pParent),
m_nID_Msg(nID_Msg),
m_nID_Caption(nID_Caption),
m_bYesNo(bYesNo)
{
//{{AFX_DATA_INIT(CEditHintDlg)
m_bDontShowAgain = FALSE;
m_cHintText = _T("");
//}}AFX_DATA_INIT
}
void CEditHintDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEditHintDlg)
DDX_Check(pDX, IDC_SHOW_HINT_AGAIN, m_bDontShowAgain);
DDX_Text(pDX, IDC_EDIT_HINT, m_cHintText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEditHintDlg, CDialog)
//{{AFX_MSG_MAP(CEditHintDlg)
ON_BN_CLICKED(IDYES, OnYes)
ON_BN_CLICKED(IDNO, OnNo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEditHintDlg message handlers
BOOL CEditHintDlg::OnInitDialog()
{
m_ResourceSwitcher.Reset();
CStatic * wndIcon = (CStatic *)GetDlgItem(IDC_INFO_ICON);
wndIcon->SetIcon(theApp.LoadStandardIcon(IDI_ASTERISK));
if( m_nID_Caption ){
SetWindowText(szLoadString(m_nID_Caption));
}
if( m_nID_Msg ){
m_cHintText.LoadString(m_nID_Msg);
}
if( m_bYesNo ){
// Switch to Yes/No button pair
GetDlgItem(IDOK)->ShowWindow(SW_HIDE);
GetDlgItem(IDYES)->ShowWindow(SW_SHOW);
GetDlgItem(IDNO)->ShowWindow(SW_SHOW);
}
CDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CEditHintDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
void CEditHintDlg::OnYes()
{
OnOK();
}
void CEditHintDlg::OnNo()
{
CDialog::OnCancel();
}
/////////////////////////////////////////////////////////////////////////////
CGetLocationDlg::CGetLocationDlg(CWnd* pParent,
UINT nID_Msg,
UINT nID_Caption,
UINT nID_FileCaption)
: CDialog(CGetLocationDlg::IDD, pParent),
m_nID_Msg(nID_Msg),
m_nID_Caption(nID_Caption),
m_nID_FileCaption(nID_FileCaption)
{
//{{AFX_DATA_INIT(CGetLocationDlg)
m_csLocation = _T("");
//}}AFX_DATA_INIT
}
void CGetLocationDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGetLocationDlg)
DDX_Text(pDX, IDC_LOCATION, m_csLocation);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGetLocationDlg, CDialog)
//{{AFX_MSG_MAP(CGetLocationDlg)
ON_BN_CLICKED(IDC_BROWSE_FILE, OnChooseFile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGetLocationDlg message handlers
BOOL CGetLocationDlg::OnInitDialog()
{
m_ResourceSwitcher.Reset();
if( m_nID_Caption ){
SetWindowText(szLoadString(m_nID_Caption));
}
if( m_nID_Msg ){
GetDlgItem(IDC_PREF_STRING_MSG)->SetWindowText(szLoadString(m_nID_Msg));
}
CDialog::OnInitDialog();
return TRUE;
}
void CGetLocationDlg::OnOK()
{
CDialog::OnOK();
m_csLocation.TrimLeft();
m_csLocation.TrimRight();
// In case user entered a local filename instead of using "Choose File"
CString csLocation;
WFE_ConvertFile2Url(csLocation, LPCSTR(m_csLocation));
m_csLocation = csLocation;
}
void CGetLocationDlg::OnChooseFile()
{
char * szFilename = wfe_GetExistingImageFileName(this->m_hWnd,
szLoadString(m_nID_FileCaption), TRUE);
if ( szFilename != NULL ){
WFE_ConvertFile2Url(m_csLocation, szFilename);
UpdateData(FALSE);
}
}
/////////////////////////////////////////////////////////////////////////////
COpenTemplateDlg::COpenTemplateDlg(CWnd* pParent)
: CDialog(COpenTemplateDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(COpenTemplateDlg)
m_csLocation = _T("");
//}}AFX_DATA_INIT
}
void COpenTemplateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COpenTemplateDlg)
DDX_Text(pDX, IDC_LOCATION, m_csLocation);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COpenTemplateDlg, CDialog)
//{{AFX_MSG_MAP(COpenTemplateDlg)
ON_BN_CLICKED(IDC_BROWSE_FILE, OnChooseFile)
ON_BN_CLICKED(IDC_NETSCAPE_TEMPLATES, OnGotoNetscapeTemplates)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COpenTemplateDlg message handlers
BOOL COpenTemplateDlg::OnInitDialog()
{
m_ResourceSwitcher.Reset();
CComboBox *pCombo =
(CComboBox*)(GetDlgItem(IDC_LOCATION));
m_iTemplateLocationCount = theApp.m_iTemplateLocationCount;
m_pHistoryBase = "editor.template_history_%d";
//PREF_GetCharPref(,szLocation);
if( m_iTemplateLocationCount ){
// ComboBox will contain locations,
// we store username and password in local lists, same order (no sorting)
VERIFY(m_pLocationList = (char**) XP_ALLOC((m_iTemplateLocationCount+1) * sizeof(char*)));
// Fill the lists of user names and passwords that maps
// to the preference list. First item = most recently-added
int i;
for( i= 0; i < m_iTemplateLocationCount; i++ ){
m_pLocationList[i] = NULL;
char pLoc[128];
char *pLocation = NULL;
wsprintf(pLoc, m_pHistoryBase,i);
// Get the preference value - RETURNS NULL IF EMPTY STRING!
PREF_CopyCharPref(pLoc,&pLocation);
if( pLocation && pLocation[0] ){
pCombo->AddString(pLocation);
}
XP_FREEIF(pLocation);
}
// Terminate list
m_pLocationList[i] = NULL;
}
CDialog::OnInitDialog();
pCombo->SetCurSel(0);
return TRUE;
}
void COpenTemplateDlg::OnOK()
{
CDialog::OnOK();
m_csLocation.TrimLeft();
m_csLocation.TrimRight();
// In case user entered a local filename instead of using "Choose File"
CString csLocation;
WFE_ConvertFile2Url(csLocation, LPCSTR(m_csLocation));
m_csLocation = csLocation;
}
void COpenTemplateDlg::OnChooseFile()
{
char * pFilename = wfe_GetExistingFileName(this->m_hWnd,
szLoadString(IDS_SELECT_TEMPLATE_CAPTION), HTM_ONLY, TRUE);
if ( pFilename != NULL ){
WFE_ConvertFile2Url(m_csLocation, pFilename);
UpdateData(FALSE);
}
}
void COpenTemplateDlg::OnGotoNetscapeTemplates()
{
char * pDefault;
PREF_CopyCharPref("editor.default_template_location", &pDefault);
m_csLocation = pDefault;
XP_FREEIF(pDefault);
UpdateData(FALSE);
EndDialog(IDOK);
}
/////////////////////////////////////////////////////////////////////////////
CPageTitleDlg::CPageTitleDlg(CWnd* pParent, char** ppTitle)
: CDialog(CPageTitleDlg::IDD, pParent),
m_ppTitle(ppTitle)
{
//{{AFX_DATA_INIT(CPageTitleDlg)
m_csTitle = _T("");
//}}AFX_DATA_INIT
}
void CPageTitleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPageTitleDlg)
DDX_Text(pDX, IDC_DOC_TITLE, m_csTitle);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPageTitleDlg, CDialog)
//{{AFX_MSG_MAP(CPageTitleDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPageTitleDlg message handlers
BOOL CPageTitleDlg::OnInitDialog()
{
m_ResourceSwitcher.Reset();
if( m_ppTitle && *m_ppTitle ){
m_csTitle = *m_ppTitle;
}
CDialog::OnInitDialog();
return TRUE;
}
void CPageTitleDlg::OnOK()
{
CDialog::OnOK();
m_csTitle.TrimLeft();
m_csTitle.TrimRight();
// Return new string at location supplied
if( m_ppTitle ){
XP_FREEIF(*m_ppTitle);
*m_ppTitle = XP_STRDUP(LPCSTR(m_csTitle));
}
}
/////////////////////////////////////////////////////////////////////////////
// CGetColumnsDlg dialog
CGetColumnsDlg::CGetColumnsDlg(CWnd* pParent)
: CDialog(CGetColumnsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CEditHintDlg)
m_iColumns = 1;
//}}AFX_DATA_INIT
}
BEGIN_MESSAGE_MAP(CGetColumnsDlg, CDialog)
//{{AFX_MSG_MAP(CGetColumnsDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CGetColumnsDlg::OnInitDialog()
{
m_ResourceSwitcher.Reset();
CDialog::OnInitDialog();
return TRUE;
}
void CGetColumnsDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
void CGetColumnsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGetColumnsDlg)
DDX_Text(pDX, IDC_TABLE_COLUMNS, m_iColumns);
DDV_MinMaxInt(pDX, m_iColumns, 1, 100 /*MAX_TABLE_COLUMNS*/);
//}}AFX_DATA_MAP
}