mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 22:25:30 +00:00
436 lines
9.8 KiB
C++
436 lines
9.8 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.
|
||
|
*/
|
||
|
|
||
|
// dlghtmrp.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "msgcom.h"
|
||
|
#include "dlghtmrp.h"
|
||
|
#include "nethelp.h"
|
||
|
#include "xp_help.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////
|
||
|
///CListBoxRecipients list box for Prefers HTML and Does not Prefer HTML
|
||
|
|
||
|
CListBoxRecipients::CListBoxRecipients(): CListBox()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
int CListBoxRecipients::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
|
||
|
{
|
||
|
int value1 = ((MSG_RecipientList*)(lpCompareItemStruct->itemData1))->value;
|
||
|
int value2 = ((MSG_RecipientList*)(lpCompareItemStruct->itemData2))->value;
|
||
|
|
||
|
if (value1 < value2)
|
||
|
{
|
||
|
return -1; //sorts before
|
||
|
}
|
||
|
else if (value1 == value2)
|
||
|
{
|
||
|
return 0; //sorts same
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return 1; //sorts after
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CListBoxRecipients::DeleteItem( LPDELETEITEMSTRUCT lpDeleteItemStruct)
|
||
|
{
|
||
|
//not implemented
|
||
|
}
|
||
|
|
||
|
void CListBoxRecipients::SetColumnPositions(int iPosIndex, int iPosName, int iPosStatus)
|
||
|
{
|
||
|
m_iPosIndex = iPosIndex;
|
||
|
m_iPosName = iPosName;
|
||
|
m_iPosStatus = iPosStatus;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CListBoxRecipients::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
|
||
|
{
|
||
|
HDC hDC = lpDrawItemStruct->hDC;
|
||
|
RECT rcItem = lpDrawItemStruct->rcItem;
|
||
|
MSG_RecipientList *itemData = (MSG_RecipientList *) lpDrawItemStruct->itemData;
|
||
|
HBRUSH hBrushFill = NULL;
|
||
|
COLORREF oldBk, oldText;
|
||
|
|
||
|
if ( lpDrawItemStruct->itemState & ODS_SELECTED ) {
|
||
|
hBrushFill = ::CreateSolidBrush( GetSysColor( COLOR_HIGHLIGHT ) );
|
||
|
oldBk = ::SetBkColor( hDC, GetSysColor( COLOR_HIGHLIGHT ) );
|
||
|
oldText = ::SetTextColor( hDC, GetSysColor( COLOR_HIGHLIGHTTEXT ) );
|
||
|
} else {
|
||
|
hBrushFill = ::CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
||
|
oldBk = ::SetBkColor( hDC, GetSysColor( COLOR_WINDOW ) );
|
||
|
oldText = ::SetTextColor( hDC, GetSysColor( COLOR_WINDOWTEXT ) );
|
||
|
}
|
||
|
|
||
|
if ( lpDrawItemStruct->itemID != -1 && itemData) {
|
||
|
RECT rcTemp = rcItem;
|
||
|
::FillRect( hDC, &rcItem, hBrushFill );
|
||
|
|
||
|
::DrawText( hDC, itemData->name, -1,
|
||
|
&rcTemp, DT_VCENTER|DT_LEFT );
|
||
|
}
|
||
|
|
||
|
if ( lpDrawItemStruct->itemAction & ODA_FOCUS ) {
|
||
|
::DrawFocusRect( hDC, &lpDrawItemStruct->rcItem );
|
||
|
}
|
||
|
|
||
|
if (hBrushFill)
|
||
|
VERIFY( ::DeleteObject( hBrushFill ) );
|
||
|
|
||
|
::SetBkColor( hDC, oldBk );
|
||
|
::SetTextColor( hDC, oldText );
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CHtmlRecipientsDlg dialog
|
||
|
|
||
|
CHtmlRecipientsDlg::CHtmlRecipientsDlg(MSG_Pane* pComposePane,
|
||
|
MSG_RecipientList* nohtml,
|
||
|
MSG_RecipientList* htmlok,
|
||
|
CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CHtmlRecipientsDlg::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CHtmlRecipientsDlg)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
m_pComposePane = pComposePane;
|
||
|
m_pNoHtml = nohtml;
|
||
|
m_pHtmlOk = htmlok;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CHtmlRecipientsDlg::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CHtmlRecipientsDlg)
|
||
|
// NOTE: the ClassWizard will add DDX and DDV calls here
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CHtmlRecipientsDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CHtmlRecipientsDlg)
|
||
|
ON_BN_CLICKED(IDC_HELP_RECIPIENTS, OnHelp)
|
||
|
ON_BN_CLICKED(ID_BTN_ADD, OnBtnAdd)
|
||
|
ON_BN_CLICKED(ID_BTN_REMOVE, OnBtnRemove)
|
||
|
ON_LBN_SETFOCUS(IDC_LIST1, OnSetfocusList1)
|
||
|
ON_LBN_SETFOCUS(IDC_LIST2, OnSetfocusList2)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CHtmlRecipientsDlg message handlers
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnSetfocusList1()
|
||
|
{
|
||
|
// TODO: Add your control notification handler code here
|
||
|
CWnd *pWnd = GetDlgItem(ID_BTN_ADD);
|
||
|
if (pWnd)
|
||
|
pWnd->EnableWindow(TRUE);
|
||
|
pWnd = GetDlgItem(ID_BTN_REMOVE);
|
||
|
if (pWnd)
|
||
|
pWnd->EnableWindow(FALSE);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnSetfocusList2()
|
||
|
{
|
||
|
CWnd *pWnd = GetDlgItem(ID_BTN_REMOVE);
|
||
|
if (pWnd)
|
||
|
pWnd->EnableWindow(TRUE);
|
||
|
pWnd = GetDlgItem(ID_BTN_ADD);
|
||
|
if (pWnd)
|
||
|
pWnd->EnableWindow(FALSE);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnCancel()
|
||
|
{
|
||
|
MSG_ResultsRecipients(m_pComposePane,
|
||
|
TRUE,
|
||
|
0, /* List of IDs, terminated
|
||
|
with a negative entry. */
|
||
|
0/* Another list of IDs. */
|
||
|
);
|
||
|
CDialog::OnCancel();
|
||
|
}
|
||
|
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnOK()
|
||
|
{
|
||
|
BOOL bFailure = FALSE;
|
||
|
|
||
|
int nCount1 = m_ListBox1.GetCount();
|
||
|
int nCount2 = m_ListBox2.GetCount();
|
||
|
|
||
|
int32 *pNoHTML = new int32[nCount1 +1];
|
||
|
int32 *pHtmlOK = new int32[nCount2 +1];
|
||
|
|
||
|
MSG_RecipientList *itemData = NULL;
|
||
|
|
||
|
if (!pNoHTML || !pHtmlOK)
|
||
|
bFailure = TRUE;
|
||
|
else
|
||
|
{
|
||
|
//get the first list
|
||
|
for ( int i = 0; i < nCount1; i++)
|
||
|
{
|
||
|
itemData = (MSG_RecipientList *)m_ListBox1.GetItemData(i);
|
||
|
if (itemData)
|
||
|
pNoHTML[i] = itemData->value;
|
||
|
else
|
||
|
{
|
||
|
bFailure = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
//terminate the array
|
||
|
if (!bFailure)
|
||
|
pNoHTML[nCount1] = -1;
|
||
|
|
||
|
|
||
|
//get the second list
|
||
|
for ( i = 0; i < nCount2; i++)
|
||
|
{
|
||
|
itemData = (MSG_RecipientList *)m_ListBox2.GetItemData(i);
|
||
|
if (itemData)
|
||
|
pHtmlOK[i] = itemData->value;
|
||
|
else
|
||
|
{
|
||
|
bFailure = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
//terminate the second array
|
||
|
if (!bFailure)
|
||
|
pHtmlOK[nCount2] = -1;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
if (!bFailure)
|
||
|
{ //send back the lists
|
||
|
MSG_ResultsRecipients(m_pComposePane,
|
||
|
FALSE,
|
||
|
pNoHTML, /* List of IDs, terminated
|
||
|
with a negative entry. */
|
||
|
pHtmlOK/* Another list of IDs. */
|
||
|
);
|
||
|
CDialog::OnOK();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
MSG_ResultsRecipients(m_pComposePane,
|
||
|
TRUE,
|
||
|
0, /* List of IDs, terminated
|
||
|
with a negative entry. */
|
||
|
0/* Another list of IDs. */
|
||
|
);
|
||
|
CDialog::OnOK();
|
||
|
//Failed to modify recipients list!
|
||
|
}
|
||
|
//clean up the lists
|
||
|
if (pNoHTML && pHtmlOK)
|
||
|
{
|
||
|
delete [] pNoHTML;
|
||
|
delete [] pHtmlOK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnHelp()
|
||
|
{
|
||
|
NetHelp(HELP_HTML_MAIL_QUESTION_RECIPIENT);
|
||
|
}
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnBtnAdd()
|
||
|
{
|
||
|
CWnd *pWnd = GetDlgItem(ID_BTN_ADD);
|
||
|
CWnd *pListWnd2 = GetDlgItem(IDC_LIST2);
|
||
|
|
||
|
if (pWnd)
|
||
|
{
|
||
|
if (pWnd->IsWindowEnabled())
|
||
|
{
|
||
|
int nCount = m_ListBox1.GetSelCount();
|
||
|
if (nCount <= 0 || nCount == LB_ERR)
|
||
|
return;
|
||
|
|
||
|
LPINT lpIndexes = new int[nCount];
|
||
|
|
||
|
int err = m_ListBox1.GetSelItems(nCount,lpIndexes);
|
||
|
|
||
|
if (err == LB_ERR)
|
||
|
{
|
||
|
if (lpIndexes)
|
||
|
delete [] lpIndexes;
|
||
|
return;
|
||
|
}
|
||
|
if (lpIndexes && pListWnd2)
|
||
|
{
|
||
|
MSG_RecipientList* itemData = NULL;
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
itemData = (MSG_RecipientList*)m_ListBox1.GetItemData(lpIndexes[i]);
|
||
|
if (itemData)
|
||
|
{
|
||
|
::SendMessage( pListWnd2->m_hWnd, LB_ADDSTRING, (WPARAM) 0, (LPARAM) itemData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for ( i = nCount -1 ; i >= 0; i--)
|
||
|
{
|
||
|
::SendMessage(m_ListBox1.m_hWnd, LB_DELETESTRING, lpIndexes[i], (LPARAM) NULL);
|
||
|
}
|
||
|
|
||
|
delete [] lpIndexes;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CHtmlRecipientsDlg::OnBtnRemove()
|
||
|
{
|
||
|
CWnd *pWnd = GetDlgItem(ID_BTN_REMOVE);
|
||
|
CWnd *pListWnd1 = GetDlgItem(IDC_LIST1);
|
||
|
|
||
|
if (pWnd)
|
||
|
{
|
||
|
if (pWnd->IsWindowEnabled())
|
||
|
{
|
||
|
int nCount = m_ListBox2.GetSelCount();
|
||
|
if (nCount <= 0 || nCount == LB_ERR)
|
||
|
return;
|
||
|
|
||
|
LPINT lpIndexes = new int[nCount];
|
||
|
|
||
|
int err = m_ListBox2.GetSelItems(nCount,lpIndexes);
|
||
|
|
||
|
if (err == LB_ERR)
|
||
|
{
|
||
|
if (lpIndexes)
|
||
|
delete [] lpIndexes;
|
||
|
return;
|
||
|
}
|
||
|
if (lpIndexes && pListWnd1)
|
||
|
{
|
||
|
MSG_RecipientList* itemData = NULL;
|
||
|
for (int i = 0; i < nCount; i++)
|
||
|
{
|
||
|
itemData = (MSG_RecipientList*)m_ListBox2.GetItemData(lpIndexes[i]);
|
||
|
if (itemData)
|
||
|
{
|
||
|
::SendMessage( pListWnd1->m_hWnd, LB_ADDSTRING, (WPARAM) 0, (LPARAM) itemData);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
for ( i = nCount -1 ; i >= 0; i--)
|
||
|
{
|
||
|
::SendMessage(m_ListBox2.m_hWnd, LB_DELETESTRING, lpIndexes[i], (LPARAM) NULL);
|
||
|
|
||
|
}
|
||
|
|
||
|
delete [] lpIndexes;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL CHtmlRecipientsDlg::OnInitDialog()
|
||
|
{
|
||
|
BOOL ret = CDialog::OnInitDialog();
|
||
|
|
||
|
m_ListBox1.SubclassDlgItem( IDC_LIST1, this );
|
||
|
m_ListBox2.SubclassDlgItem( IDC_LIST2, this);
|
||
|
|
||
|
RECT rcText;
|
||
|
int iPosName;
|
||
|
|
||
|
::SetRect( &rcText, 0, 0, 64, 64 );
|
||
|
|
||
|
iPosName = rcText.right;;
|
||
|
|
||
|
m_ListBox1.SetColumnPositions( 0, iPosName, 0 );
|
||
|
m_ListBox2.SetColumnPositions( 0, iPosName, 0 );
|
||
|
|
||
|
PopulateLists();
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL CHtmlRecipientsDlg::PopulateLists()
|
||
|
{
|
||
|
|
||
|
CWnd *pList1 = (CListBox *)GetDlgItem(IDC_LIST1);
|
||
|
CWnd *pList2 = (CListBox *)GetDlgItem(IDC_LIST2);
|
||
|
|
||
|
if (!pList1 || !pList2)
|
||
|
return 0;
|
||
|
|
||
|
int i = 0; //array index into recipient list
|
||
|
int err;
|
||
|
for (; m_pNoHtml[i].name != NULL; i++)
|
||
|
{
|
||
|
if (m_pNoHtml[i].value == -1 || m_pNoHtml[i].name == NULL)
|
||
|
break;
|
||
|
|
||
|
err = ::SendMessage( pList1->m_hWnd, LB_ADDSTRING, (WPARAM) 0, (LPARAM) &(m_pNoHtml[i]));
|
||
|
}
|
||
|
|
||
|
//i is reset in the for loop
|
||
|
for (i = 0; m_pHtmlOk[i].name != NULL; i++)
|
||
|
{
|
||
|
if (m_pHtmlOk[i].value == -1 || m_pHtmlOk[i].name == NULL)
|
||
|
break;
|
||
|
err = ::SendMessage( pList2->m_hWnd, LB_ADDSTRING, (WPARAM) 0, (LPARAM) &(m_pHtmlOk[i]));
|
||
|
}
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//Used to launch the dialog when passed in as a callback
|
||
|
int CreateRecipientsDialog(MSG_Pane* composepane, void* closure,
|
||
|
MSG_RecipientList* nohtml,
|
||
|
MSG_RecipientList* htmlok,
|
||
|
void *pWnd)
|
||
|
{
|
||
|
CHtmlRecipientsDlg rRecipientsDlg(composepane, nohtml, htmlok, (CWnd*)pWnd);
|
||
|
|
||
|
int ret = rRecipientsDlg.DoModal();
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|