gecko-dev/cmd/winfe/dlghtmrp.cpp

436 строки
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;
}