зеркало из https://github.com/mozilla/gecko-dev.git
317 строки
7.7 KiB
C++
317 строки
7.7 KiB
C++
#include "stdafx.h"
|
|
#include "embdlist.h"
|
|
#include "genframe.h"
|
|
|
|
#define BITMAP_WIDTH 16
|
|
#define BITMAP_HEIGHT 16
|
|
|
|
BEGIN_MESSAGE_MAP(CEmbeddedAttachList, 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()
|
|
|
|
IMPLEMENT_DYNCREATE(CEmbeddedAttachList, CListBox)
|
|
|
|
void DrawTransBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, COLORREF cTransparentColor );
|
|
|
|
void DrawTransBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, COLORREF cTransparentColor )
|
|
{
|
|
HDC hSrcDC = CreateCompatibleDC(hdc);
|
|
SelectObject(hSrcDC, hBitmap);
|
|
|
|
BITMAP bm;
|
|
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
|
|
|
|
POINT ptSize;
|
|
ptSize.x = bm.bmWidth;
|
|
ptSize.y = bm.bmHeight;
|
|
DPtoLP(hSrcDC, &ptSize, 1);
|
|
|
|
HPALETTE hPalette = (HPALETTE)GetCurrentObject(hdc, OBJ_PAL);
|
|
|
|
FEU_TransBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hSrcDC, 0, 0, hPalette, cTransparentColor);
|
|
|
|
DeleteDC(hSrcDC);
|
|
}
|
|
|
|
CEmbeddedAttachList::CEmbeddedAttachList()
|
|
:m_numattachments(0),m_attachmentlist(NULL)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
CEmbeddedAttachList::~CEmbeddedAttachList()
|
|
{
|
|
for (int i = 0; i< m_numattachments; i++)
|
|
XP_FREE(m_attachmentlist[i]);
|
|
XP_FREE(m_attachmentlist);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CEmbeddedAttachList::Create(CWnd *pWnd, UINT id)
|
|
{
|
|
BOOL bRetVal = CListBox::Create (
|
|
WS_CLIPCHILDREN|WS_CHILD|WS_BORDER|WS_VISIBLE|WS_VSCROLL|LBS_OWNERDRAWFIXED|
|
|
LBS_HASSTRINGS|LBS_NOTIFY|LBS_WANTKEYBOARDINPUT|LBS_NOINTEGRALHEIGHT,
|
|
CRect(0,0,0,0), pWnd, id);
|
|
return bRetVal;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CEmbeddedAttachList::OnDelete()
|
|
{
|
|
if (GetFocus() == this)
|
|
{
|
|
int idx = GetCurSel();
|
|
if (idx != LB_ERR)
|
|
{
|
|
DeleteString(idx);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int
|
|
CEmbeddedAttachList::OnCreate( LPCREATESTRUCT lpCreateStruct )
|
|
{
|
|
int iRet = CListBox::OnCreate(lpCreateStruct);
|
|
|
|
CGenericFrame * pFrame = (CGenericFrame*)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);
|
|
|
|
|
|
#if 0
|
|
const MSG_AttachmentData * pDataList = MSG_GetAttachmentList(GetMsgPane());
|
|
#endif //0
|
|
|
|
DragAcceptFiles();
|
|
|
|
return(iRet);
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CEmbeddedAttachList::OnDestroy()
|
|
{
|
|
CListBox::OnDestroy();
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CEmbeddedAttachList::OnDropFiles(HDROP hDropInfo)
|
|
{
|
|
CListBox::OnDropFiles(hDropInfo);
|
|
UINT wNumFilesDropped = ::DragQueryFile(hDropInfo,(UINT)-1,NULL,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);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CEmbeddedAttachList::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
CListBox::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
|
|
|
|
void CEmbeddedAttachList::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 CEmbeddedAttachList::RemoveAttachment()
|
|
{
|
|
int idx = GetCurSel();
|
|
if (idx != LB_ERR)
|
|
{
|
|
DeleteString(idx);
|
|
if (idx >= GetCount())
|
|
SetCurSel(idx-1);
|
|
}
|
|
}
|
|
|
|
|
|
void CEmbeddedAttachList::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);
|
|
|
|
char *t_pFile = m_attachmentlist[lpDrawItemStruct->itemID];
|
|
char *pszString = NULL;
|
|
if (t_pFile)
|
|
{
|
|
/* 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);
|
|
}*/
|
|
|
|
pszString = t_pFile; // rhp - move this into the conditional - or crash in MAPI
|
|
// pszString = pFilePath;
|
|
}
|
|
// else
|
|
// idBitmap = IDB_WEBATTACHMENT;
|
|
|
|
rect.left += BITMAP_WIDTH + 4;
|
|
dc.DrawText(pszString,strlen(pszString),rect,DT_LEFT|DT_VCENTER);
|
|
rect.left -= BITMAP_WIDTH + 4;
|
|
|
|
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;
|
|
DrawTransBitmap(
|
|
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 CEmbeddedAttachList::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
|
|
{
|
|
lpMeasureItemStruct->itemHeight = BITMAP_HEIGHT + 2;
|
|
}
|
|
|
|
|
|
|
|
//================================================================ DeleteItem
|
|
void CEmbeddedAttachList::DeleteItem( LPDELETEITEMSTRUCT lpDeleteItemStruct )
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void CEmbeddedAttachList::AttachFile()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
void CEmbeddedAttachList::AttachUrl(char *pUrl /*= NULL*/)
|
|
{
|
|
if (pUrl)
|
|
AddString(pUrl);
|
|
}
|
|
|
|
|
|
|
|
void CEmbeddedAttachList::AddAttachment(char * pName)
|
|
{
|
|
if (pName)
|
|
{
|
|
AddString(pName);
|
|
char **t_list = m_attachmentlist;
|
|
m_attachmentlist = new char *[m_numattachments+1];
|
|
if (t_list)
|
|
XP_MEMCPY(m_attachmentlist,t_list,m_numattachments*sizeof(char *));
|
|
m_attachmentlist[m_numattachments++]=XP_STRDUP(pName);
|
|
UpdateWindow();
|
|
}
|
|
}
|