зеркало из https://github.com/mozilla/gecko-dev.git
285 строки
7.1 KiB
C++
285 строки
7.1 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.
|
|
*/
|
|
|
|
// NSAdrNam.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "nsadrlst.h"
|
|
#include "nsadrnam.h"
|
|
#include "addrbook.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNSAddressNameEditField
|
|
|
|
CNSAddressNameEditField::CNSAddressNameEditField()
|
|
{
|
|
m_pIAddressParent = NULL;
|
|
m_bNameCompletion = FALSE;
|
|
m_bAttemptNameCompletion = TRUE;
|
|
m_bSetTimerForCompletion = FALSE;
|
|
m_uTypedownClock = 0;
|
|
}
|
|
|
|
CNSAddressNameEditField::~CNSAddressNameEditField()
|
|
{
|
|
}
|
|
|
|
|
|
BOOL CNSAddressNameEditField::Create( CWnd *pParent )
|
|
{
|
|
return CGenericEdit::Create(ES_MULTILINE|ES_WANTRETURN|ES_LEFT|ES_AUTOHSCROLL, CRect(0,0,0,0), pParent, (UINT)IDC_STATIC );
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CNSAddressNameEditField, CGenericEdit)
|
|
//{{AFX_MSG_MAP(CNSAddressNameEditField)
|
|
ON_WM_KILLFOCUS()
|
|
ON_WM_TIMER ()
|
|
ON_WM_CHAR()
|
|
ON_WM_CREATE()
|
|
ON_WM_KEYDOWN()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CNSAddressNameEditField message handlers
|
|
|
|
|
|
BOOL CNSAddressNameEditField::PreTranslateMessage( MSG* pMsg )
|
|
{
|
|
if (pMsg->message == WM_KEYDOWN)
|
|
{
|
|
if (pMsg->wParam == 'v' || pMsg->wParam == 'V')
|
|
{
|
|
if (GetKeyState(VK_CONTROL)&0x8000)
|
|
{
|
|
Paste();
|
|
return TRUE;
|
|
}
|
|
}
|
|
else if (pMsg->wParam == VK_INSERT)
|
|
{
|
|
if (GetKeyState(VK_SHIFT)&0x8000)
|
|
{
|
|
Paste();
|
|
return TRUE;
|
|
}
|
|
else if (GetKeyState(VK_CONTROL)&0x8000)
|
|
{
|
|
Copy();
|
|
return TRUE;
|
|
}
|
|
}
|
|
else if (pMsg->wParam == 'x' || pMsg->wParam == 'X')
|
|
{
|
|
if (GetKeyState(VK_CONTROL)&0x8000)
|
|
{
|
|
Cut();
|
|
return TRUE;
|
|
}
|
|
}
|
|
else if (pMsg->wParam == 'c' || pMsg->wParam == 'C')
|
|
{
|
|
if (GetKeyState(VK_CONTROL)&0x8000)
|
|
{
|
|
Copy();
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
return CGenericEdit::PreTranslateMessage(pMsg);
|
|
}
|
|
|
|
void CNSAddressNameEditField::OnKillFocus(CWnd * pNewWnd)
|
|
{
|
|
if (GetParent()->SendMessage(WM_NOTIFYSELECTIONCHANGE))
|
|
CGenericEdit::OnKillFocus(pNewWnd);
|
|
else
|
|
SetSel(0, -1);
|
|
}
|
|
|
|
void CNSAddressNameEditField::DrawNameCompletion()
|
|
{
|
|
if (m_pIAddressParent)
|
|
{
|
|
CString cs;
|
|
GetWindowText(cs);
|
|
char * pName = m_pIAddressParent->NameCompletion((char*)((const char *)cs));
|
|
CDC * pDC = GetDC();
|
|
UINT iPre = cs.GetLength();
|
|
CFont * pOldFont = pDC->SelectObject(CFont::FromHandle(m_cfTextFont));
|
|
int iPixOffset = pDC->GetTextExtent(cs,iPre).cx;
|
|
CRect rect;
|
|
GetClientRect(rect);
|
|
rect.left = iPixOffset;
|
|
if (pName)
|
|
{
|
|
m_bNameCompletion = TRUE;
|
|
COLORREF crOld = pDC->SetTextColor(RGB(150,150,150));
|
|
COLORREF crOldBk = pDC->SetBkColor(GetSysColor(COLOR_WINDOW));
|
|
if (iPre < strlen(pName))
|
|
pDC->DrawText(&pName[iPre],strlen(&pName[iPre]),rect,DT_VCENTER|DT_LEFT);
|
|
pDC->SetTextColor(crOld);
|
|
pDC->SetBkColor(crOldBk);
|
|
free(pName);
|
|
}
|
|
else
|
|
{
|
|
m_bNameCompletion = FALSE;
|
|
InvalidateRect(rect);
|
|
}
|
|
pDC->SelectObject(pOldFont);
|
|
ReleaseDC(pDC);
|
|
}
|
|
}
|
|
|
|
|
|
#define NAME_COMPLETION_TIMER 12
|
|
#define COMPLETION_SPEED 750
|
|
|
|
void CNSAddressNameEditField::OnTimer(UINT nID)
|
|
{
|
|
if (nID == NAME_COMPLETION_TIMER) {
|
|
KillTimer(m_uTypedownClock);
|
|
m_uTypedownClock = 0;
|
|
DrawNameCompletion();
|
|
}
|
|
}
|
|
|
|
|
|
void CNSAddressNameEditField::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags )
|
|
{
|
|
switch (nChar)
|
|
{
|
|
case VK_ESCAPE:
|
|
return;
|
|
case VK_DELETE:
|
|
break;
|
|
default:
|
|
if ( ((CNSAddressList *)GetParent())->OnKeyPress( this, nChar, nRepCnt, nFlags ) )
|
|
return;
|
|
}
|
|
CGenericEdit::OnChar( nChar, nRepCnt, nFlags );
|
|
if (m_bAttemptNameCompletion)
|
|
{
|
|
if (m_bSetTimerForCompletion)
|
|
{
|
|
if (m_uTypedownClock) {
|
|
KillTimer(m_uTypedownClock);
|
|
}
|
|
m_uTypedownClock = SetTimer(NAME_COMPLETION_TIMER, COMPLETION_SPEED, NULL);
|
|
}
|
|
else
|
|
DrawNameCompletion();
|
|
}
|
|
}
|
|
|
|
int CNSAddressNameEditField::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CGenericEdit::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
uint32 count;
|
|
DIR_Server* pab = NULL;
|
|
|
|
DIR_GetPersonalAddressBook (theApp.m_directories, &pab);
|
|
if (pab) {
|
|
AB_GetEntryCount(pab, theApp.m_pABook, &count, ABTypeAll, NULL);
|
|
if (count > 1500)
|
|
m_bSetTimerForCompletion = TRUE;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void CNSAddressNameEditField::SetCSID(int16 iCSID)
|
|
{
|
|
if(m_hWnd)
|
|
{
|
|
CDC * pdc = GetDC();
|
|
if (m_cfTextFont) {
|
|
theApp.ReleaseAppFont(m_cfTextFont);
|
|
}
|
|
LOGFONT lf;
|
|
memset(&lf,0,sizeof(LOGFONT));
|
|
|
|
lf.lfPitchAndFamily = FF_MODERN | FIXED_PITCH;
|
|
strcpy(lf.lfFaceName, IntlGetUIFixFaceName(iCSID));
|
|
lf.lfHeight = -MulDiv(NS_ADDRESSFONTSIZE,pdc->GetDeviceCaps(LOGPIXELSY),72);
|
|
lf.lfQuality = PROOF_QUALITY;
|
|
lf.lfCharSet = IntlGetLfCharset(iCSID);
|
|
m_cfTextFont = theApp.CreateAppFont( lf );
|
|
if (!(lf.lfPitchAndFamily & FIXED_PITCH))
|
|
m_bAttemptNameCompletion = FALSE;
|
|
::SendMessage(GetSafeHwnd(), WM_SETFONT, (WPARAM)m_cfTextFont, FALSE);
|
|
TEXTMETRIC tm;
|
|
pdc->GetTextMetrics(&tm);
|
|
m_iTextHeight = tm.tmHeight;
|
|
|
|
ReleaseDC(pdc);
|
|
}
|
|
}
|
|
void CNSAddressNameEditField::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
switch (nChar)
|
|
{
|
|
case VK_HOME:
|
|
{
|
|
int nStart, nEnd;
|
|
GetSel(nStart,nEnd);
|
|
if ((!nStart)&&(!nEnd))
|
|
((CNSAddressList *)GetParent())->OnKeyPress(this,nChar,nRepCnt,nFlags);
|
|
}
|
|
break;
|
|
case VK_END:
|
|
{
|
|
int nStart, nEnd;
|
|
GetSel(nStart,nEnd);
|
|
if (nStart == nEnd)
|
|
if (nStart == LineLength())
|
|
((CNSAddressList *)GetParent())->OnKeyPress(this,nChar,nRepCnt,nFlags);
|
|
}
|
|
break;
|
|
case VK_UP:
|
|
case VK_DOWN:
|
|
((CNSAddressList *)GetParent())->OnKeyPress(this,nChar,nRepCnt,nFlags);
|
|
break;
|
|
case VK_DELETE:
|
|
{
|
|
CString cs;
|
|
GetWindowText(cs);
|
|
if (!cs.GetLength())
|
|
{
|
|
((CNSAddressList *)GetParent())->OnKeyPress(this,nChar,nRepCnt,nFlags);
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
CGenericEdit::OnKeyDown(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
void CNSAddressNameEditField::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
SetSel(0,-1);
|
|
}
|
|
|