gecko-dev/cmd/winfe/embdlist.cpp

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();
}
}