зеркало из https://github.com/mozilla/gecko-dev.git
294 строки
8.5 KiB
C++
294 строки
8.5 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.
|
|
*/
|
|
|
|
// NSAdrTyp.cpp : implementation file
|
|
// See NSAdrTyp.h for details on how to use this class
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "resource.h"
|
|
#include "nsadrlst.h"
|
|
#include "nsadrtyp.h"
|
|
#include "compfrm.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNSAddressTypeComboBox
|
|
|
|
CNSAddressTypeControl::CNSAddressTypeControl()
|
|
{
|
|
m_iTypeBitmapWidth = 0;
|
|
|
|
penFace.CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNFACE));
|
|
brushFace.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
|
|
#ifdef _WIN32
|
|
pen3dLight.CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DLIGHT));
|
|
pen3dShadow.CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DSHADOW));
|
|
pen3dHilight.CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DHILIGHT));
|
|
pen3dDkShadow.CreatePen(PS_SOLID,1,GetSysColor(COLOR_3DDKSHADOW));
|
|
#else
|
|
pen3dLight.CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
pen3dShadow.CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNSHADOW));
|
|
pen3dHilight.CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT));
|
|
pen3dDkShadow.CreatePen(PS_SOLID,1,GetSysColor(COLOR_BTNSHADOW));
|
|
#endif
|
|
}
|
|
|
|
CNSAddressTypeControl::~CNSAddressTypeControl()
|
|
{
|
|
if (m_cfTextFont) {
|
|
theApp.ReleaseAppFont(m_cfTextFont);
|
|
}
|
|
}
|
|
|
|
BOOL CNSAddressTypeControl::Create( CWnd *pParent )
|
|
{
|
|
BOOL rv = CListBox::Create(
|
|
LBS_NOINTEGRALHEIGHT | LBS_NOTIFY | LBS_WANTKEYBOARDINPUT | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS,
|
|
CRect(0,0,0,0), pParent, (UINT)5000 );
|
|
CBitmap cbitmap;
|
|
cbitmap.LoadBitmap(IDB_ARROW3D);
|
|
BITMAP bitmap;
|
|
cbitmap.GetObject(sizeof(BITMAP), &bitmap);
|
|
m_iTypeBitmapWidth = bitmap.bmWidth;
|
|
cbitmap.DeleteObject();
|
|
return rv;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CNSAddressTypeControl, CListBox)
|
|
//{{AFX_MSG_MAP(CNSAddressTypeControl)
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_SETFOCUS()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_CREATE()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_ENTERIDLE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
void CNSAddressTypeControl::OnKillFocus(CWnd *pNewWnd)
|
|
{
|
|
GetParent()->SendMessage(WM_CHILDLOSTFOCUS);
|
|
CListBox::OnKillFocus(pNewWnd);
|
|
}
|
|
|
|
BOOL CNSAddressTypeControl::PreTranslateMessage( MSG* pMsg )
|
|
{
|
|
if ( (pMsg->message == WM_KEYDOWN) && ( (pMsg->wParam == VK_TAB) || (pMsg->wParam == VK_RETURN) || (pMsg->wParam == VK_BACK) ) )
|
|
return ((CNSAddressList *)GetParent())->OnKeyPress( this, pMsg->wParam, LOWORD( pMsg->lParam ), HIWORD( pMsg->lParam ) );
|
|
|
|
return CListBox::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CNSAddressTypeControl::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
|
|
{
|
|
CDC * pDC = GetDC();
|
|
TEXTMETRIC tm;
|
|
pDC->GetTextMetrics(&tm);
|
|
lpMeasureItemStruct->itemHeight = tm.tmHeight;
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
|
|
void CNSAddressTypeControl::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CListBox::OnSetFocus(pOldWnd);
|
|
}
|
|
|
|
|
|
void CNSAddressTypeControl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
switch (nChar)
|
|
{
|
|
case VK_SPACE:
|
|
GetParent()->PostMessage(WM_DISPLAYTYPELIST);
|
|
return;
|
|
case VK_UP:
|
|
case VK_DOWN:
|
|
case VK_HOME:
|
|
case VK_END:
|
|
case VK_DELETE:
|
|
((CNSAddressList *)GetParent())->OnKeyPress(this,nChar,nRepCnt,nFlags);
|
|
return;
|
|
break;
|
|
}
|
|
CListBox::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
|
|
void DrawTransparentBitmap(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);
|
|
}
|
|
|
|
int CNSAddressTypeControl::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CListBox::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
CComposeFrame * pFrame = (CComposeFrame*)GetParentFrame();
|
|
CDC * pdc = GetDC();
|
|
int16 resource_csid = INTL_CharSetNameToID(INTL_ResourceCharSet());
|
|
LOGFONT lf;
|
|
memset(&lf,0,sizeof(LOGFONT));
|
|
lf.lfPitchAndFamily = FF_MODERN | FIXED_PITCH;
|
|
lf.lfHeight = -MulDiv(NS_ADDRESSFONTSIZE,pdc->GetDeviceCaps(LOGPIXELSY), 72);
|
|
ReleaseDC ( pdc );
|
|
lf.lfQuality = PROOF_QUALITY;
|
|
lf.lfCharSet = IntlGetLfCharset(resource_csid);
|
|
strcpy(lf.lfFaceName, IntlGetUIFixFaceName(resource_csid));
|
|
m_cfTextFont = theApp.CreateAppFont( lf );
|
|
::SendMessage(GetSafeHwnd(), WM_SETFONT, (WPARAM)m_cfTextFont, FALSE);
|
|
// TODO: Add your specialized creation code here
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CNSAddressTypeControl::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
CListBox::OnLButtonDown(nFlags, point);
|
|
GetParent()->PostMessage(WM_DISPLAYTYPELIST);
|
|
}
|
|
|
|
void DrawTypeBitmap(CRect &rect, CDC * pDC, BOOL bPressed, BOOL bHighlight)
|
|
{
|
|
CBitmap cbitmap;
|
|
cbitmap.LoadBitmap(bPressed?IDB_ARROW3D_PRESS:IDB_ARROW3D);
|
|
BITMAP bitmap;
|
|
cbitmap.GetObject(sizeof(BITMAP), &bitmap );
|
|
int center_y = rect.top + (rect.Height() - bitmap.bmHeight)/2;
|
|
DrawTransparentBitmap(
|
|
pDC->GetSafeHdc(),
|
|
(HBITMAP)cbitmap.GetSafeHandle(),
|
|
2,
|
|
center_y,
|
|
RGB( 255, 0, 255 ) );
|
|
cbitmap.DeleteObject();
|
|
}
|
|
|
|
void CNSAddressTypeControl::DrawHighlight(
|
|
HDC hDC,
|
|
CRect &rect,
|
|
HPEN hpenTopLeft,
|
|
HPEN hpenBottomRight)
|
|
{
|
|
HPEN hpenOld = (HPEN) ::SelectObject( hDC, hpenTopLeft );
|
|
|
|
::MoveToEx( hDC, rect.left, rect.bottom, NULL );
|
|
::LineTo( hDC, rect.left, rect.top );
|
|
::LineTo( hDC, rect.right - 1, rect.top );
|
|
|
|
::SelectObject( hDC, hpenBottomRight );
|
|
::LineTo( hDC, rect.right - 1, rect.bottom - 1);
|
|
::LineTo( hDC, rect.left, rect.bottom - 1);
|
|
|
|
::SelectObject( hDC, hpenOld );
|
|
}
|
|
|
|
void CNSAddressTypeControl::DrawRaisedRect(HDC hDC, CRect &rect)
|
|
{
|
|
rect.InflateRect(-1,-1);
|
|
DrawHighlight(hDC,rect,(HPEN)pen3dLight.GetSafeHandle(),(HPEN)pen3dShadow.GetSafeHandle());
|
|
rect.InflateRect(1,1);
|
|
DrawHighlight(hDC,rect,(HPEN)pen3dHilight.GetSafeHandle(),(HPEN)pen3dDkShadow.GetSafeHandle());
|
|
}
|
|
|
|
void CNSAddressTypeControl::DrawItemSoItLooksLikeAButton(
|
|
CDC * pDC, CRect &rect, CString & cs )
|
|
{
|
|
if (rect.Width() > 0 && rect.Height() > 0)
|
|
{
|
|
COLORREF cOldText = pDC->SetTextColor(GetSysColor(COLOR_BTNTEXT));
|
|
COLORREF cOldBk = pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
|
|
|
|
NS_FillSolidRect(pDC->GetSafeHdc(),rect,GetSysColor(COLOR_BTNFACE));
|
|
|
|
CFont *oldFont = pDC->SelectObject(CFont::FromHandle(m_cfTextFont));
|
|
|
|
TEXTMETRIC tm;
|
|
pDC->GetTextMetrics(&tm);
|
|
int y = ((rect.bottom - rect.top) - tm.tmHeight)/2;
|
|
|
|
CBitmap cbitmap;
|
|
cbitmap.LoadBitmap(IDB_ARROW3D);
|
|
BITMAP bitmap;
|
|
cbitmap.GetObject(sizeof(BITMAP), &bitmap );
|
|
|
|
rect.left += bitmap.bmWidth + TEXT_PAD;
|
|
rect.top += y;
|
|
CString csRight = cs.Right(cs.GetLength()-1);
|
|
pDC->DrawText(csRight,csRight.GetLength(),rect,DT_LEFT);
|
|
|
|
pDC->SelectObject(oldFont);
|
|
|
|
rect.top -= y;
|
|
rect.left -= bitmap.bmWidth + TEXT_PAD;
|
|
DrawRaisedRect(pDC->GetSafeHdc(), rect);
|
|
|
|
DrawTransparentBitmap(
|
|
pDC->GetSafeHdc(),
|
|
(HBITMAP)cbitmap.GetSafeHandle(),
|
|
2,
|
|
rect.top + y,
|
|
RGB( 255, 0, 255 ) );
|
|
cbitmap.DeleteObject();
|
|
}
|
|
}
|
|
|
|
void CNSAddressTypeControl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
|
|
{
|
|
if (lpDrawItemStruct->itemID != -1)
|
|
{
|
|
CDC dc;
|
|
dc.Attach(lpDrawItemStruct->hDC);
|
|
CRect rect;
|
|
GetClientRect(rect);
|
|
CString cs;
|
|
GetText(lpDrawItemStruct->itemID,cs);
|
|
DrawItemSoItLooksLikeAButton(&dc,rect,cs);
|
|
if (lpDrawItemStruct->itemState & ODS_FOCUS)
|
|
{
|
|
rect.InflateRect(-4,-3);
|
|
dc.DrawFocusRect(rect);
|
|
}
|
|
dc.Detach();
|
|
ValidateRect(rect);
|
|
}
|
|
}
|
|
|
|
void CNSAddressTypeControl::DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct)
|
|
{
|
|
delete (CNSAddressTypeInfo *)GetItemDataPtr( lpDeleteItemStruct->itemID );
|
|
CListBox::DeleteItem(lpDeleteItemStruct);
|
|
}
|