gecko-dev/cmd/winfe/advprosh.cpp

533 строки
13 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.
*/
#include "stdafx.h"
#include "windowsx.h"
#include "wfemsg.h"
#include "prefapi.h"
#include "nethelp.h"
#include "advprosh.h"
/*-----------------------------------------------------------------*/
/* */
/* Search options page */
/* */
/*-----------------------------------------------------------------*/
CSearchOptionsPage::CSearchOptionsPage(CWnd *pParent, UINT nID)
: CNetscapePropertyPage(nID)
{
m_pParent = pParent;
m_bHasBeenViewed = FALSE;
}
CSearchOptionsPage::~CSearchOptionsPage()
{
}
void CSearchOptionsPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAdvSearchOptionsDlg)
DDX_Check(pDX, IDC_CHECK_SUBFOLDERS, m_bIncludeSubfolders);
DDX_Check(pDX, IDC_CHECK_SEARCH_LOCALLY, m_iSearchArea);
//}}AFX_DATA_MAP
}
BOOL CSearchOptionsPage::OnInitDialog()
{
XP_Bool bSubFolders = FALSE;
XP_Bool bSearchServer = FALSE;
PREF_GetBoolPref("mailnews.searchSubFolders",&bSubFolders);
m_bIncludeSubfolders = bSubFolders;
m_bOffline = NET_IsOffline();
if(!m_bOffline)
PREF_GetBoolPref("mailnews.searchServer",&bSearchServer);
else
{
CWnd * pCheck = GetDlgItem(IDC_CHECK_SEARCH_LOCALLY);
if(pCheck != NULL)
pCheck->EnableWindow(FALSE);
}
m_iSearchArea = bSearchServer ? 0 : 1;
UpdateData(FALSE);
m_bHasBeenViewed = TRUE;
BOOL ret = CNetscapePropertyPage::OnInitDialog();
return ret;
}
void CSearchOptionsPage::OnOK()
{
if(!m_bHasBeenViewed)
return;
UpdateData();
PREF_SetBoolPref("mailnews.searchSubFolders",(XP_Bool)m_bIncludeSubfolders);
if(!m_bOffline)
{
XP_Bool bSearchServer = m_iSearchArea ? 0 : 1;
PREF_SetBoolPref("mailnews.searchServer", bSearchServer);
}
}
void CSearchOptionsPage::OnCancel()
{
CNetscapePropertyPage::OnCancel();
}
BOOL CSearchOptionsPage::OnSetActive()
{
if(!CNetscapePropertyPage::OnSetActive())
return FALSE;
return TRUE ;
}
BOOL CSearchOptionsPage::OnKillActive()
{
return CNetscapePropertyPage::OnKillActive();
}
BEGIN_MESSAGE_MAP(CSearchOptionsPage, CNetscapePropertyPage)
END_MESSAGE_MAP()
/*-----------------------------------------------------------------*/
/* */
/* Edit headers page */
/* */
/*-----------------------------------------------------------------*/
CCustomHeadersPage::CCustomHeadersPage(CWnd *pParent, UINT nID)
: CNetscapePropertyPage(nID)
{
m_pParent = pParent;
m_bHasBeenViewed = FALSE;
}
CCustomHeadersPage::~CCustomHeadersPage()
{
}
void CCustomHeadersPage::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BOOL CCustomHeadersPage::OnInitDialog()
{
MSG_FolderInfo *pInbox = NULL;
MSG_GetFoldersWithFlag (WFE_MSGGetMaster(), MSG_FOLDER_FLAG_INBOX, &pInbox, 1);
uint16 numItems;
MSG_GetNumAttributesForFilterScopes (WFE_MSGGetMaster(), scopeMailFolder, (void**)&pInbox, 1, &numItems);
MSG_SearchMenuItem * pHeaderItems = new MSG_SearchMenuItem [numItems];
if (!pHeaderItems)
return FALSE;
MSG_GetAttributesForFilterScopes (WFE_MSGGetMaster(), scopeMailFolder, (void**)&pInbox, 1, pHeaderItems, &numItems);
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
for (int i=0; i < numItems; i++)
{
if ( (pHeaderItems[i].attrib == attribOtherHeader) && pHeaderItems[i].isEnabled )
pList->AddString(pHeaderItems[i].name);
}
delete pHeaderItems;
updateUI();
m_bHasBeenViewed = TRUE;
return CNetscapePropertyPage::OnInitDialog();
}
void CCustomHeadersPage::OnAddHeader()
{
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NEW_HEADER);
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
char szString[256] = {'\0'};
pEdit->GetWindowText(szString, sizeof(szString));
if(strlen(szString) == 0)
return;
pList->AddString(szString);
pEdit->SetWindowText("");
pEdit->SetFocus();
}
void CCustomHeadersPage::OnRemoveHeader()
{
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
int iSel = pList->GetCurSel();
if(iSel < 0)
return;
pList->DeleteString(iSel);
int iNewCount = pList->GetCount();
if(iNewCount > 0)
pList->SetCurSel((iSel >= iNewCount) ? iNewCount - 1 : iSel);
OnSelChangeHeaderList();
if(iNewCount == 0)
{
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NEW_HEADER);
pEdit->SetFocus();
}
}
void CCustomHeadersPage::OnReplaceHeader()
{
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NEW_HEADER);
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
char szString[256] = {'\0'};
pEdit->GetWindowText(szString, sizeof(szString));
if(strlen(szString) == 0)
return;
int iSel = pList->GetCurSel();
if(iSel != LB_ERR)
{
pList->DeleteString(iSel);
pList->InsertString(iSel, szString);
}
else
pList->AddString(szString);
updateUI();
pEdit->SetFocus();
}
void CCustomHeadersPage::OnChangeEditHeader()
{
updateUI();
char szString[256];
GetDlgItemText(IDC_EDIT_NEW_HEADER, szString, sizeof(szString));
if(strlen(szString) > 0)
SetDefID(IDC_ADD_HEADER);
}
void CCustomHeadersPage::OnSelChangeHeaderList()
{
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NEW_HEADER);
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
char szString[256] = {'\0'};
int iSel = pList->GetCurSel();
if(iSel >= 0)
{
pList->GetText(iSel, szString);
pEdit->SetWindowText(szString);
}
else
pEdit->SetWindowText("");
updateUI();
}
BOOL CCustomHeadersPage::OnSetActive()
{
if(!CNetscapePropertyPage::OnSetActive())
return FALSE;
return TRUE ;
}
BOOL CCustomHeadersPage::OnKillActive()
{
return CNetscapePropertyPage::OnKillActive();
}
void CCustomHeadersPage::OnOK()
{
if(!m_bHasBeenViewed)
return;
CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT_NEW_HEADER);
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
int iCount = pList->GetCount();
if(iCount != 0)
{
CString strTemp;
pList->GetText(0, strTemp);
CString strHeaderPrefList = strTemp;
for (int i = 1; i < iCount; i++)
{
pList->GetText(i,strTemp);
strHeaderPrefList += ": " + strTemp;
}
PREF_SetCharPref("mailnews.customHeaders", strHeaderPrefList);
}
else
{
PREF_SetCharPref("mailnews.customHeaders","");
}
CPropertyPage::OnOK();
}
void CCustomHeadersPage::OnCancel()
{
CNetscapePropertyPage::OnCancel();
}
void CCustomHeadersPage::enableDlgItem(int iId, BOOL bEnable)
{
CWnd * pItem = GetDlgItem(iId);
if(pItem == NULL)
return;
pItem->EnableWindow(bEnable);
}
void CCustomHeadersPage::updateUI()
{
CListBox * pList = (CListBox *)GetDlgItem(IDC_HEADER_LIST);
char szString[256] = {'\0'};
int iSel = pList->GetCurSel();
GetDlgItemText(IDC_EDIT_NEW_HEADER, szString, sizeof(szString));
enableDlgItem(IDC_ADD_HEADER, (strlen(szString) > 0));
enableDlgItem(IDC_REMOVE_HEADER, (iSel >= 0));
char szToReplace[256] = {'\0'};
pList->GetText(iSel, szToReplace);
enableDlgItem(IDC_REPLACE_HEADER, ((strlen(szString) > 0) && (iSel >= 0) && (0 != strcmp(szString, szToReplace))));
}
BEGIN_MESSAGE_MAP(CCustomHeadersPage, CNetscapePropertyPage)
ON_BN_CLICKED(IDC_ADD_HEADER, OnAddHeader)
ON_BN_CLICKED(IDC_REMOVE_HEADER, OnRemoveHeader)
ON_BN_CLICKED(IDC_REPLACE_HEADER, OnReplaceHeader)
ON_EN_CHANGE(IDC_EDIT_NEW_HEADER, OnChangeEditHeader)
ON_LBN_SELCHANGE(IDC_HEADER_LIST, OnSelChangeHeaderList)
END_MESSAGE_MAP()
/*-----------------------------------------------------------------*/
/* */
/* Advanced search property sheet */
/* */
/*-----------------------------------------------------------------*/
CAdvancedOptionsPropertySheet::CAdvancedOptionsPropertySheet(CWnd *pParent,
const char* pName,
DWORD dwPagesBitFlag)
: CNetscapePropertySheet(pName, pParent, 0, NULL),
m_pParent(pParent),
m_iReturnCode(IDCANCEL),
m_dwPagesBitFlag(dwPagesBitFlag),
m_OptionsPage(NULL),
m_HeadersPage(NULL)
{
assert(m_dwPagesBitFlag != AOP_NOPAGES);
if(m_dwPagesBitFlag & AOP_SEARCH_OPTIONS)
{
m_OptionsPage = new CSearchOptionsPage(pParent, IDD_ADVANCED_SEARCH);
AddPage(m_OptionsPage);
}
if(m_dwPagesBitFlag & AOP_CUSTOM_HEADERS)
{
m_HeadersPage = new CCustomHeadersPage(pParent, IDD_HEADER_LIST);
AddPage(m_HeadersPage);
}
}
CAdvancedOptionsPropertySheet::~CAdvancedOptionsPropertySheet()
{
if(m_OptionsPage!= NULL)
delete m_OptionsPage;
if(m_HeadersPage!= NULL)
delete m_HeadersPage;
}
CNetscapePropertyPage * CAdvancedOptionsPropertySheet::GetCurrentPage()
{
return (CNetscapePropertyPage *)GetActivePage();
}
BOOL CAdvancedOptionsPropertySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
#ifdef _WIN32
int id = LOWORD(wParam);
#else
int id = (int)wParam;
#endif
if((id == IDOK) || (id == IDCANCEL))
{
m_iReturnCode = id;
OnClose();
return TRUE;
}
return CNetscapePropertySheet::OnCommand(wParam, lParam);
}
#define BUTTON_CONTAINER 33
#define BUTTON_WIDTH 75
#define BUTTON_HEIGHT 23
#define BUTTON_TO_RIGHT 9
#define BUTTON_TO_BOTTOM 10
#define BUTTON_TO_BUTTON 6
#define X_ADJUSTMENT 9
#define Y_ADJUSTMENT 3
#define SetWinFont(hwnd, hfont, fRedraw) FORWARD_WM_SETFONT((hwnd), (hfont), (fRedraw), ::SendMessage)
#define GetWinFont(hwnd) FORWARD_WM_GETFONT((hwnd), ::SendMessage)
#ifdef _WIN32
BOOL CAdvancedOptionsPropertySheet::OnInitDialog()
{
BOOL ret = CNetscapePropertySheet::OnInitDialog();
#else
int CAdvancedOptionsPropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int ret = CNetscapePropertySheet::OnCreate(lpCreateStruct);
#endif
if(m_pParent && ::IsWindow(m_pParent->m_hWnd))
m_pParent->EnableWindow(FALSE);
EnableWindow(TRUE);
RECT rc;
GetWindowRect(&rc);
int iWidth = rc.right - rc.left;
int iHeight = rc.bottom - rc.top + BUTTON_CONTAINER;
SetWindowPos(NULL,0,0, iWidth, iHeight, SWP_NOZORDER | SWP_NOMOVE);
DWORD dwStyle = WS_VISIBLE | WS_CHILD;
HINSTANCE hInst = AfxGetInstanceHandle();
GetClientRect(&rc);
HFONT hFont = GetWinFont(m_hWnd);
int y = rc.bottom - rc.top - BUTTON_TO_BOTTOM - BUTTON_HEIGHT + Y_ADJUSTMENT;
int w = BUTTON_WIDTH;
int h = BUTTON_HEIGHT;
int x;
HWND hWnd;
x = rc.right - rc.left - BUTTON_TO_RIGHT - (BUTTON_TO_BUTTON + BUTTON_WIDTH) + X_ADJUSTMENT;
hWnd = CreateWindow("button", "Help", dwStyle, x,y, w, h, m_hWnd, (HMENU)IDHELP, hInst, NULL);
SetWinFont(hWnd, hFont, TRUE);
x -= BUTTON_TO_BUTTON + BUTTON_WIDTH;
hWnd = CreateWindow("button", "Cancel", dwStyle, x,y, w, h, m_hWnd, (HMENU)IDCANCEL, hInst, NULL);
SetWinFont(hWnd, hFont, TRUE);
x -= BUTTON_TO_BUTTON + BUTTON_WIDTH;
hWnd = CreateWindow("button", "OK", dwStyle, x,y, w, h, m_hWnd, (HMENU)IDOK, hInst, NULL);
SetWinFont(hWnd, hFont, TRUE);
return ret;
}
void CAdvancedOptionsPropertySheet::OnDestroy()
{
CNetscapePropertySheet::OnDestroy();
}
void CAdvancedOptionsPropertySheet::OnClose()
{
if(m_dwPagesBitFlag & AOP_SEARCH_OPTIONS)
{
if(m_iReturnCode == IDOK)
m_OptionsPage->OnOK();
m_pParent->PostMessage(WM_ADVANCED_OPTIONS_DONE, 0, m_iReturnCode);
}
if(m_dwPagesBitFlag & AOP_CUSTOM_HEADERS)
{
if(m_iReturnCode == IDOK)
m_HeadersPage->OnOK();
m_pParent->PostMessage(WM_EDIT_CUSTOM_DONE, 0, m_iReturnCode);
}
if(m_pParent && ::IsWindow(m_pParent->m_hWnd))
m_pParent->EnableWindow(TRUE);
DestroyWindow();
}
void CAdvancedOptionsPropertySheet::OnNcDestroy()
{
delete this;
}
void CAdvancedOptionsPropertySheet::OnHelp()
{
if(GetActivePage() == m_OptionsPage)
NetHelp(HELP_SEARCH_MAILNEWS_OPTIONS);
if(GetActivePage() == m_HeadersPage)
NetHelp(HELP_SEARCH_MAILNEWS_HEADERS);
}
BOOL CAdvancedOptionsPropertySheet::PreTranslateMessage(MSG * pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch ((int)pMsg->wParam)
{
case VK_ESCAPE:
OnClose();
break;
default:
return CNetscapePropertySheet::PreTranslateMessage(pMsg);
break;
}
return TRUE;
}
return CNetscapePropertySheet::PreTranslateMessage(pMsg);
}
BEGIN_MESSAGE_MAP(CAdvancedOptionsPropertySheet, CNetscapePropertySheet)
#ifndef _WIN32
ON_WM_CREATE()
#endif
ON_WM_CLOSE()
ON_WM_DESTROY()
END_MESSAGE_MAP()