mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 08:12:05 +00:00
772 lines
21 KiB
C++
772 lines
21 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 "xp.h"
|
|
#include "forward.h"
|
|
#include "compfile.h"
|
|
#include "compfrm.h"
|
|
#include "compbar.h"
|
|
#include "ole2.h"
|
|
#include "abdefn.h"
|
|
#include "wfemsg.h"
|
|
#include "mailmisc.h"
|
|
#include "nsadrlst.h"
|
|
#include "addrfrm.h"
|
|
|
|
extern char* wfe_ConstructFilterString(int type);
|
|
extern char* XP_NetToDosFileName(const char * NetName);
|
|
|
|
#define BITMAP_WIDTH 16
|
|
#define BITMAP_HEIGHT 16
|
|
|
|
BEGIN_MESSAGE_MAP(CNSAttachmentList, CListBox)
|
|
ON_WM_CREATE()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_DROPFILES()
|
|
ON_WM_DESTROY()
|
|
ON_COMMAND(ID_EDIT_DELETE,OnDelete)
|
|
END_MESSAGE_MAP()
|
|
|
|
CNSAttachmentList::CNSAttachmentList(MSG_Pane * pPane)
|
|
{
|
|
m_pPane = pPane;
|
|
m_pDropTarget = NULL;
|
|
}
|
|
|
|
CNSAttachmentList::~CNSAttachmentList()
|
|
{
|
|
if (m_pDropTarget)
|
|
{
|
|
m_pDropTarget->Revoke();
|
|
delete m_pDropTarget;
|
|
}
|
|
}
|
|
|
|
BOOL CNSAttachmentList::Create(CWnd * pWnd, UINT id)
|
|
{
|
|
BOOL bRetVal = CListBox::Create (
|
|
WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_OWNERDRAWFIXED|
|
|
LBS_HASSTRINGS|LBS_NOTIFY|LBS_WANTKEYBOARDINPUT|LBS_NOINTEGRALHEIGHT,
|
|
CRect(0,0,0,0), pWnd, id);
|
|
return bRetVal;
|
|
}
|
|
|
|
void CNSAttachmentList::OnDelete()
|
|
{
|
|
if (GetFocus() == this)
|
|
{
|
|
int idx = GetCurSel();
|
|
if (idx != LB_ERR)
|
|
{
|
|
DeleteString(idx);
|
|
CComposeBar * pComposeBar = (CComposeBar*)GetParent();
|
|
pComposeBar->UpdateAttachmentInfo(GetCount());
|
|
UpdateAttachments();
|
|
}
|
|
}
|
|
}
|
|
|
|
void CNSAttachmentList::OnUpdateDelete(CCmdUI * pCmdUI)
|
|
{
|
|
if (GetFocus() == this)
|
|
pCmdUI->Enable(GetCount()>0);
|
|
}
|
|
|
|
int CNSAttachmentList::OnCreate( LPCREATESTRUCT lpCreateStruct )
|
|
{
|
|
int iRet = CListBox::OnCreate(lpCreateStruct);
|
|
|
|
CComposeFrame * pFrame = (CComposeFrame*)GetParentFrame();
|
|
CDC * pdc = GetDC();
|
|
|
|
LOGFONT lf;
|
|
memset(&lf,0,sizeof(LOGFONT));
|
|
lf.lfPitchAndFamily = FF_SWISS;
|
|
if (INTL_DefaultWinCharSetID(0) == CS_LATIN1)
|
|
strcpy(lf.lfFaceName, "MS Sans Serif");
|
|
else
|
|
strcpy(lf.lfFaceName, IntlGetUIPropFaceName(0));
|
|
lf.lfCharSet = IntlGetLfCharset(pFrame->m_iCSID);
|
|
lf.lfHeight = -MulDiv(8,pdc->GetDeviceCaps(LOGPIXELSY), 72);
|
|
lf.lfQuality = PROOF_QUALITY;
|
|
m_cfTextFont = theApp.CreateAppFont( lf );
|
|
::SendMessage(GetSafeHwnd(), WM_SETFONT, (WPARAM)m_cfTextFont, FALSE);
|
|
|
|
ReleaseDC(pdc);
|
|
|
|
|
|
BOOL bDisableButtons = TRUE;
|
|
if(GetMsgPane())
|
|
{
|
|
const MSG_AttachmentData * pDataList = MSG_GetAttachmentList(GetMsgPane());
|
|
if(pDataList)
|
|
{
|
|
bDisableButtons = FALSE;
|
|
for (int i = 0; pDataList[i].url!=NULL; i++)
|
|
{
|
|
int idx;
|
|
MSG_AttachmentData * pEntry =
|
|
(MSG_AttachmentData*)XP_CALLOC(1,sizeof(MSG_AttachmentData));
|
|
ASSERT(pEntry);
|
|
pEntry->url = XP_STRDUP(pDataList[i].url);
|
|
if (pDataList[i].real_type)
|
|
pEntry->real_type = XP_STRDUP(pDataList[i].real_type);
|
|
if (pDataList[i].description)
|
|
pEntry->description = XP_STRDUP(pDataList[i].description);
|
|
if (pDataList[i].real_name)
|
|
pEntry->real_name = XP_STRDUP(pDataList[i].real_name);
|
|
if (pDataList[i].real_name)
|
|
idx = AddString (pEntry->real_name);
|
|
else
|
|
idx = AddString(pEntry->url);
|
|
#ifdef DEBUG_bienvenu
|
|
MSG_MessageLine msgLine;
|
|
int ret = MSG_GetMessageLineForURL(WFE_MSGGetMaster(), pEntry->url, &msgLine);
|
|
#endif
|
|
ASSERT(idx!=LB_ERR);
|
|
SetItemData(idx,(DWORD)pEntry);
|
|
ASSERT(pEntry->url);
|
|
if (pDataList[i].desired_type)
|
|
{
|
|
pEntry->desired_type = XP_STRDUP(pDataList[i].desired_type);
|
|
ASSERT(pEntry->desired_type);
|
|
}
|
|
}
|
|
SetCurSel(0);
|
|
}
|
|
}
|
|
|
|
if(!m_pDropTarget) {
|
|
m_pDropTarget = new CNSAttachDropTarget;
|
|
m_pDropTarget->Register(this);
|
|
}
|
|
|
|
DragAcceptFiles();
|
|
|
|
return(iRet);
|
|
}
|
|
|
|
void CNSAttachmentList::AttachUrl(char * pUrl)
|
|
{
|
|
CWnd * pFocusWnd = GetFocus();
|
|
CLocationDlg LocationDlg(pUrl,this);
|
|
if (LocationDlg.DoModal()==IDOK)
|
|
{
|
|
MSG_AttachmentData * pAttach =
|
|
(MSG_AttachmentData *)XP_CALLOC(1,sizeof(MSG_AttachmentData));
|
|
ASSERT(pAttach);
|
|
pAttach->url = XP_STRDUP(LocationDlg.m_Location);
|
|
ASSERT(pAttach->url);
|
|
int idx = AddString(pAttach->url);
|
|
ASSERT(idx!=LB_ERR);
|
|
SetItemData(idx,(DWORD)pAttach);
|
|
SetCurSel(idx);
|
|
CComposeBar * pComposeBar = (CComposeBar*)GetParent();
|
|
pComposeBar->UpdateAttachmentInfo(GetCount());
|
|
UpdateAttachments();
|
|
}
|
|
pFocusWnd->SetFocus();
|
|
}
|
|
|
|
void CNSAttachmentList::AddAttachment(char * pName)
|
|
{
|
|
if(pName)
|
|
{
|
|
MSG_AttachmentData * pAttach =
|
|
(MSG_AttachmentData *)XP_CALLOC(1,sizeof(MSG_AttachmentData));
|
|
CString cs;
|
|
WFE_ConvertFile2Url(cs,(const char *)pName);
|
|
pAttach->url = XP_STRDUP(cs);
|
|
ASSERT(pAttach->url);
|
|
|
|
int idx = AddString(pAttach->url);
|
|
CComposeBar * pComposeBar = (CComposeBar*)GetParent();
|
|
pComposeBar->UpdateAttachmentInfo(GetCount());
|
|
ASSERT(idx!=LB_ERR);
|
|
SetItemData(idx,(DWORD)pAttach);
|
|
SetCurSel(idx);
|
|
}
|
|
}
|
|
|
|
void CNSAttachmentList::AttachFile()
|
|
{
|
|
CWnd * pFocusWnd = GetFocus();
|
|
CString cs;
|
|
cs.LoadString(IDS_FILETOATTACH);
|
|
char * pName = GetAttachmentName( (char*)((const char *)cs), ALL, TRUE);
|
|
char * part = NULL;
|
|
char * filename = NULL;
|
|
char * full_path = NULL;
|
|
if (pName) {
|
|
// this assumes that there are space separators between filenames
|
|
// if the dialog getting the filenames changes to explorer style
|
|
// then this should change
|
|
if (part = strstr(pName, " ")) {
|
|
full_path = (char *) XP_ALLOC(_MAX_PATH * sizeof(char));
|
|
if(!full_path){
|
|
XP_FREEIF(pName);
|
|
return;
|
|
}
|
|
*part = NULL;
|
|
part++;
|
|
while (part) {
|
|
XP_STRCPY (full_path, "");
|
|
XP_STRCAT (full_path, pName);
|
|
if (*(full_path + strlen (full_path) - 1) != '\\')
|
|
XP_STRCAT (full_path, "\\");
|
|
filename = strstr(part, " ");
|
|
if (filename) {
|
|
*filename = NULL;
|
|
filename++;
|
|
}
|
|
XP_STRCAT (full_path, part);
|
|
AddAttachment(full_path);
|
|
part = filename;
|
|
}
|
|
XP_FREE(full_path);
|
|
}
|
|
else
|
|
AddAttachment(pName);
|
|
|
|
}
|
|
if (pName)
|
|
XP_FREE(pName);
|
|
pFocusWnd->SetFocus();
|
|
UpdateAttachments();
|
|
}
|
|
|
|
void CNSAttachmentList::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
switch (nChar)
|
|
{
|
|
case VK_INSERT:
|
|
AttachFile();
|
|
break;
|
|
|
|
case VK_DELETE:
|
|
RemoveAttachment();
|
|
break;
|
|
}
|
|
CListBox::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void CNSAttachmentList::RemoveAttachment()
|
|
{
|
|
int idx = GetCurSel();
|
|
if (idx != LB_ERR)
|
|
{
|
|
MSG_AttachmentData * pAttach =
|
|
(MSG_AttachmentData*)GetItemData(idx);
|
|
ASSERT(pAttach);
|
|
if (pAttach == NULL)
|
|
return;
|
|
XP_FREE(pAttach);
|
|
DeleteString(idx);
|
|
CComposeBar * pComposeBar = (CComposeBar*)GetParent();
|
|
pComposeBar->UpdateAttachmentInfo(GetCount());
|
|
if (idx >= GetCount())
|
|
SetCurSel(idx-1);
|
|
UpdateAttachments();
|
|
}
|
|
}
|
|
|
|
void CNSAttachmentList::Cleanup()
|
|
{
|
|
int iCount = GetCount();
|
|
for (int i = 0; i<iCount; i++) {
|
|
MSG_AttachmentData * pAttach =
|
|
(MSG_AttachmentData*)GetItemData(i);
|
|
if (pAttach != NULL)
|
|
{
|
|
if (pAttach->url)
|
|
XP_FREE((void*)pAttach->url);
|
|
if (pAttach->desired_type)
|
|
XP_FREE((void*)pAttach->desired_type);
|
|
if (pAttach->real_type)
|
|
XP_FREE((void*)pAttach->real_type);
|
|
if (pAttach->description)
|
|
XP_FREE((void*)pAttach->description);
|
|
if (pAttach->real_name)
|
|
XP_FREE((void*)pAttach->real_name);
|
|
}
|
|
SetItemData(i,NULL);
|
|
}
|
|
}
|
|
|
|
void CNSAttachmentList::UpdateAttachments()
|
|
{
|
|
int iCount = GetCount();
|
|
if (iCount != LB_ERR)
|
|
{
|
|
MSG_AttachmentData * pAttachList =
|
|
(MSG_AttachmentData *)XP_CALLOC(iCount+1,sizeof(MSG_AttachmentData));
|
|
if (!pAttachList)
|
|
return;
|
|
for (int i = 0; i<iCount; i++) {
|
|
MSG_AttachmentData * pAttach =
|
|
(MSG_AttachmentData*)GetItemData(i);
|
|
if (pAttach != NULL)
|
|
XP_MEMCPY(&pAttachList[i],pAttach,sizeof(MSG_AttachmentData));
|
|
}
|
|
ASSERT(GetMsgPane());
|
|
MSG_SetAttachmentList(GetMsgPane(),pAttachList);
|
|
XP_FREE(pAttachList);
|
|
}
|
|
}
|
|
|
|
char * CNSAttachmentList::GetAttachmentName(
|
|
char * prompt, int type, XP_Bool bMustExist, BOOL * pOpenIntoEditor)
|
|
{
|
|
|
|
OPENFILENAME fname;
|
|
char * full_path = NULL;
|
|
char name[_MAX_FNAME];
|
|
|
|
char* filter = wfe_ConstructFilterString(type);
|
|
|
|
/* initialize the OPENFILENAME struct */
|
|
|
|
BOOL result;
|
|
UINT index = (type == HTM_ONLY) ? 1 : type;
|
|
|
|
// space for the full path name
|
|
full_path = (char *) XP_ALLOC(_MAX_PATH * sizeof(char));
|
|
if(!full_path){
|
|
XP_FREE(filter);
|
|
return(NULL);
|
|
}
|
|
name[0] = '\0';
|
|
full_path[0] = '\0';
|
|
|
|
// set up the entries
|
|
fname.lStructSize = sizeof(OPENFILENAME);
|
|
fname.hwndOwner = m_hWnd;
|
|
fname.lpstrFilter = filter;
|
|
fname.lpstrCustomFilter = NULL;
|
|
fname.nFilterIndex = index;
|
|
fname.lpstrFile = full_path;
|
|
fname.nMaxFile = _MAX_PATH;
|
|
fname.lpstrFileTitle = name;
|
|
fname.nMaxFileTitle = _MAX_FNAME;
|
|
fname.lpstrInitialDir = NULL;
|
|
fname.lpstrTitle = prompt;
|
|
fname.Flags = OFN_HIDEREADONLY;
|
|
fname.lpstrDefExt = NULL;
|
|
|
|
if(bMustExist)
|
|
fname.Flags |= OFN_FILEMUSTEXIST;
|
|
|
|
if (!pOpenIntoEditor)
|
|
fname.Flags |= OFN_ALLOWMULTISELECT;
|
|
|
|
result = FEU_GetOpenFileName(&fname);
|
|
|
|
XP_FREE(filter);
|
|
|
|
// see if the user selects a file or hits cancel
|
|
if(result) {
|
|
return(full_path);
|
|
} else {
|
|
// user hit cancel
|
|
if(full_path) XP_FREE(full_path);
|
|
return(NULL);
|
|
}
|
|
}
|
|
|
|
UINT CNSAttachmentList::ItemFromPoint(CPoint pt, BOOL& bOutside) const
|
|
{
|
|
RECT rect;
|
|
GetClientRect(&rect);
|
|
|
|
int iHeight = GetItemHeight(0);
|
|
int iCount = GetCount();
|
|
int iTopIndex = GetTopIndex();
|
|
|
|
int iListHeight = iHeight * ( iCount - iTopIndex );
|
|
rect.bottom = rect.bottom < iListHeight ? rect.bottom : iListHeight;
|
|
|
|
bOutside = !::PtInRect(&rect, pt);
|
|
|
|
if ( bOutside ) {
|
|
return 0;
|
|
}
|
|
|
|
return (pt.y / iHeight) + iTopIndex;
|
|
}
|
|
|
|
//=============================================================== OnLButtonDown
|
|
void CNSAttachmentList::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
CListBox::OnLButtonDown(nFlags, point);
|
|
BOOL bOutside;
|
|
if (!GetCount())
|
|
{
|
|
AttachFile();
|
|
return;
|
|
}
|
|
int nNewSelect = ItemFromPoint( point, bOutside );
|
|
CRect rect;
|
|
GetItemRect(nNewSelect,rect);
|
|
if (((point.y+rect.Height())/rect.Height())+GetTopIndex()>GetCount())
|
|
{
|
|
AttachFile();
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLocationDlg dialog
|
|
|
|
|
|
CLocationDlg::CLocationDlg(char * pUrl, CWnd* pParent /*=NULL*/)
|
|
: CDialog(CLocationDlg::IDD, pParent)
|
|
{
|
|
//{{AFX_DATA_INIT(CLocationDlg)
|
|
m_Location = pUrl;
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
|
|
void CLocationDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CLocationDlg)
|
|
DDX_Control(pDX, IDC_EDIT1, m_LocationBox);
|
|
DDX_Text(pDX, IDC_EDIT1, m_Location);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CLocationDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CLocationDlg)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CLocationDlg message handlers
|
|
|
|
|
|
BOOL CLocationDlg::OnInitDialog()
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
// TODO: Add extra initialization here
|
|
|
|
m_LocationBox.SetFocus();
|
|
m_LocationBox.SetSel(0,-1);
|
|
|
|
return FALSE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
BOOL wfe_GetBookmarkData( COleDataObject* pDataObject, char ** ppURL, char ** ppTitle );
|
|
|
|
|
|
BOOL CNSAttachmentList::ProcessDropTarget(COleDataObject * pDataObject)
|
|
{
|
|
HGLOBAL hString = NULL;
|
|
char * pString = NULL;
|
|
UINT clipFormat;
|
|
// Get any string data
|
|
if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_BOOKMARK_FORMAT)))
|
|
{
|
|
char * pURL = NULL, *pTitle = NULL;
|
|
wfe_GetBookmarkData(pDataObject, &pURL, &pTitle);
|
|
if (pURL)
|
|
{
|
|
if (!strnicmp(pURL,"addbook",7))
|
|
return FALSE;
|
|
if (!strnicmp(pURL,"mailto",6))
|
|
return FALSE;
|
|
|
|
AddAttachment(pURL);
|
|
UpdateAttachments();
|
|
}
|
|
return TRUE;
|
|
}
|
|
else if (pDataObject->IsDataAvailable(
|
|
clipFormat=::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT)))
|
|
{
|
|
HGLOBAL hContent = pDataObject->GetGlobalData (clipFormat);
|
|
MailNewsDragData *pDragData = (MailNewsDragData *) GlobalLock(hContent);
|
|
|
|
if (pDragData != NULL)
|
|
{
|
|
for (int i = 0; i< pDragData->m_count; i++)
|
|
{
|
|
ASSERT(pDragData->m_indices);
|
|
MessageKey key = MSG_GetMessageKey(pDragData->m_pane, pDragData->m_indices[i]);
|
|
URL_Struct* pUrl = MSG_ConstructUrlForMessage(pDragData->m_pane, key);
|
|
if (pUrl != NULL)
|
|
{
|
|
if (pUrl->address)
|
|
AddAttachment(pUrl->address);
|
|
NET_FreeURLStruct(pUrl);
|
|
}
|
|
}
|
|
UpdateAttachments();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CNSAttachmentList::OnDropFiles( HDROP hDropInfo )
|
|
{
|
|
UINT wNumFilesDropped = ::DragQueryFile(hDropInfo,(UINT)-1,NULL,0);
|
|
if (wNumFilesDropped > 0)
|
|
{
|
|
for (UINT x = 0; x < wNumFilesDropped; x++)
|
|
{
|
|
int wPathnameSize = ::DragQueryFile(hDropInfo, x, NULL, 0);
|
|
char * pStr = (char*)XP_CALLOC(1,wPathnameSize+2);
|
|
ASSERT(pStr);
|
|
// Copy the pathname into the buffer & add to listbox
|
|
::DragQueryFile(hDropInfo, x, pStr, wPathnameSize+1);
|
|
AddAttachment(pStr);
|
|
XP_FREE(pStr);
|
|
}
|
|
UpdateAttachments();
|
|
}
|
|
}
|
|
|
|
void CNSAttachmentList::OnDestroy(void)
|
|
{
|
|
Cleanup();
|
|
CListBox::OnDestroy();
|
|
}
|
|
|
|
void CNSAttachmentList::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
|
|
{
|
|
if (lpDrawItemStruct->itemID != -1)
|
|
{
|
|
CDC dc;
|
|
dc.Attach(lpDrawItemStruct->hDC);
|
|
|
|
HBRUSH hRegBrush = ::CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );
|
|
HPEN hRegPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_WINDOW ) );
|
|
HBRUSH hHighBrush = ::CreateSolidBrush( GetSysColor( COLOR_HIGHLIGHT ) );
|
|
HPEN hHighPen = ::CreatePen( PS_SOLID, 1, GetSysColor ( COLOR_HIGHLIGHT ) );
|
|
|
|
HBRUSH hOldBrush = (HBRUSH) dc.SelectObject ( hRegBrush );
|
|
HPEN hOldPen = (HPEN) dc.SelectObject ( hRegPen );
|
|
COLORREF cOldText = dc.SetTextColor ( GetSysColor ( COLOR_WINDOWTEXT ) );
|
|
COLORREF cOldBk = dc.SetBkColor ( GetSysColor ( COLOR_WINDOW ) );
|
|
|
|
CRect rect(lpDrawItemStruct->rcItem);
|
|
BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED;
|
|
|
|
if (bSelected && (GetFocus()==this))
|
|
{
|
|
dc.SelectObject ( hHighBrush );
|
|
dc.SelectObject ( hHighPen );
|
|
dc.SetTextColor ( GetSysColor ( COLOR_HIGHLIGHTTEXT ) );
|
|
dc.SetBkColor ( GetSysColor ( COLOR_HIGHLIGHT ) );
|
|
}
|
|
|
|
dc.Rectangle(rect);
|
|
|
|
MSG_AttachmentData * pAttach = (MSG_AttachmentData *)lpDrawItemStruct->itemData;
|
|
if (pAttach)
|
|
{
|
|
char* pFilePath = NULL;
|
|
char * pszString =
|
|
(pAttach->real_name && strlen(pAttach->real_name)) ? pAttach->real_name : pAttach->url;
|
|
int idBitmap = 0;
|
|
if (!strnicmp(pAttach->url, "file:", strlen("file:")))
|
|
{
|
|
idBitmap = IDB_FILEATTACHMENT;
|
|
if (XP_STRCHR(pAttach->url, '#'))
|
|
{
|
|
char* pTemp = XP_STRCHR(pAttach->url, ':');
|
|
pFilePath = XP_NetToDosFileName(pTemp + 4); // remove :/// 4 bytes
|
|
}
|
|
else if (pszString == pAttach->url)
|
|
{
|
|
XP_ConvertUrlToLocalFile(pAttach->url, &pFilePath);
|
|
}
|
|
if (pFilePath)
|
|
{
|
|
char fname[_MAX_FNAME];
|
|
char ext[_MAX_EXT];
|
|
_splitpath(pFilePath, NULL, NULL, fname, ext);
|
|
*pFilePath = '\0';
|
|
strcat(pFilePath, fname);
|
|
strcat(pFilePath, ext);
|
|
|
|
pszString = pFilePath; // rhp - move this into the conditional - or crash in MAPI
|
|
}
|
|
// pszString = pFilePath;
|
|
}
|
|
else if (MSG_RequiresNewsWindow(pAttach->url))
|
|
idBitmap = IDB_NEWSARTICLE;
|
|
else if (MSG_RequiresMailWindow(pAttach->url))
|
|
idBitmap = IDB_MAILMESSAGE;
|
|
else if (MSG_RequiresBrowserWindow(pAttach->url))
|
|
idBitmap = IDB_WEBATTACHMENT;
|
|
else
|
|
idBitmap = IDB_WEBATTACHMENT;
|
|
|
|
rect.left += BITMAP_WIDTH + 4;
|
|
dc.DrawText(pszString,strlen(pszString),rect,DT_LEFT|DT_VCENTER);
|
|
rect.left -= BITMAP_WIDTH + 4;
|
|
|
|
if (pFilePath)
|
|
XP_FREE(pFilePath);
|
|
|
|
BITMAP bitmap;
|
|
CBitmap cbitmap;
|
|
cbitmap.LoadBitmap(MAKEINTRESOURCE(idBitmap));
|
|
cbitmap.GetObject(sizeof(BITMAP),&bitmap);
|
|
int center_x = 2;
|
|
int center_y = rect.top + (rect.Height()-bitmap.bmHeight)/2;
|
|
DrawTransparentBitmap(
|
|
dc.GetSafeHdc(),
|
|
(HBITMAP)cbitmap.GetSafeHandle(),
|
|
center_x, center_y,
|
|
RGB(255,0,255));
|
|
cbitmap.DeleteObject();
|
|
}
|
|
|
|
if (bSelected)
|
|
dc.DrawFocusRect(rect);
|
|
|
|
dc.SetTextColor ( cOldText );
|
|
dc.SetBkColor ( cOldBk );
|
|
dc.SelectObject ( hOldPen );
|
|
dc.SelectObject ( hOldBrush );
|
|
|
|
dc.Detach();
|
|
|
|
VERIFY(DeleteObject( hRegBrush ));
|
|
VERIFY(DeleteObject( hRegPen ));
|
|
VERIFY(DeleteObject( hHighBrush ));
|
|
VERIFY(DeleteObject( hHighPen ));
|
|
}
|
|
}
|
|
|
|
|
|
//=============================================================== MeasureItem
|
|
void CNSAttachmentList::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
|
|
{
|
|
lpMeasureItemStruct->itemHeight = BITMAP_HEIGHT + 2;
|
|
}
|
|
|
|
|
|
//================================================================ DeleteItem
|
|
void CNSAttachmentList::DeleteItem( LPDELETEITEMSTRUCT lpDeleteItemStruct )
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// CNSAttachDropTarget
|
|
|
|
DROPEFFECT CNSAttachDropTarget::OnDragEnter(CWnd *, COleDataObject *, DWORD, CPoint)
|
|
{
|
|
DROPEFFECT DropEffect = DROPEFFECT_NONE;
|
|
return(DropEffect);
|
|
}
|
|
|
|
DROPEFFECT CNSAttachDropTarget::OnDragOver(CWnd * pWnd,
|
|
COleDataObject * pDataObject, DWORD dwKeyState, CPoint point)
|
|
{
|
|
DROPEFFECT deReturn = DROPEFFECT_NONE;
|
|
// Only interested in bookmarks
|
|
if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_BOOKMARK_FORMAT)))
|
|
{
|
|
deReturn = DROPEFFECT_COPY;
|
|
}
|
|
else if (pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(NETSCAPE_MESSAGE_FORMAT)))
|
|
{
|
|
deReturn = DROPEFFECT_COPY;
|
|
}
|
|
else if(pDataObject->IsDataAvailable(
|
|
::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
deReturn = DROPEFFECT_COPY;
|
|
}
|
|
|
|
return(deReturn);
|
|
|
|
}
|
|
|
|
void CNSAttachDropTarget::OnDragLeave(CWnd *)
|
|
{
|
|
}
|
|
|
|
static LPSTR getDataObjectNewsURL(COleDataObject * pDataObject)
|
|
{
|
|
if (!pDataObject->IsDataAvailable(::RegisterClipboardFormat(NETSCAPE_BOOKMARK_FORMAT)))
|
|
return FALSE;
|
|
|
|
char * szURL = NULL;
|
|
char * szTitle = NULL;
|
|
wfe_GetBookmarkData(pDataObject, &szURL, &szTitle);
|
|
if((strnicmp(szURL, "news", 4) == 0) || (strnicmp(szURL, "snews", 5) == 0))
|
|
return szURL;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
BOOL CNSAttachDropTarget::OnDrop(CWnd * pWnd, COleDataObject * pDataObject, DROPEFFECT effect, CPoint point)
|
|
{
|
|
CComposeFrame * pFrame = (CComposeFrame*)pWnd->GetParentFrame();
|
|
CComposeBar * pComposeBar = pFrame->GetComposeBar();
|
|
#ifdef MOZ_NEWADDR
|
|
if(pDataObject->IsDataAvailable(::RegisterClipboardFormat(ADDRESSBOOK_INDEX_FORMAT)))
|
|
{
|
|
pComposeBar->OnAddressTab();
|
|
pComposeBar->UpdateWindow();
|
|
pComposeBar->ProcessAddressBookIndexFormat(pDataObject,effect, point);
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
#endif
|
|
if(pDataObject->IsDataAvailable(::RegisterClipboardFormat(vCardClipboardFormat)) )
|
|
{
|
|
pComposeBar->OnAddressTab();
|
|
pComposeBar->UpdateWindow();
|
|
return pComposeBar->ProcessVCardData(pDataObject,point);
|
|
}
|
|
else
|
|
{
|
|
// do not put news URLs to attachment
|
|
char * szURL = getDataObjectNewsURL(pDataObject);
|
|
if(szURL != NULL)
|
|
{
|
|
pComposeBar->OnAddressTab();
|
|
pComposeBar->UpdateWindow();
|
|
return pComposeBar->AddURLToAddressPane(pDataObject, point, szURL);
|
|
}
|
|
else
|
|
{
|
|
pComposeBar->OnAttachTab();
|
|
pComposeBar->UpdateWindow();
|
|
return pComposeBar->m_pAttachmentList->ProcessDropTarget(pDataObject);
|
|
}
|
|
}
|
|
}
|
|
|