Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

213 lines
6.2 KiB

/******************************************************************************
Source File: Add Code Points.CPP
This implements the CAddCodePoints class, which manages a dialog that allows
the user to add additional code points to a glyph set.
Copyright (c) 1997 by Microsoft Corporation. All rights Reserved.
A Pretty Penny Enterprises Production
Change History:
03-01-1997 [email protected] Created it
******************************************************************************/
#include "StdAfx.H"
#include "MiniDev.H"
#include "addcdpt.h"
#include "codepage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static CCodePageInformation* pccpi = NULL ;
/******************************************************************************
CAddCodePoints::CAddCodePoints
The class constructor primarily initializes the base class and reference
members.
******************************************************************************/
CAddCodePoints::CAddCodePoints(CWnd* pParent, CMapWordToDWord& cmw2d,
CDWordArray& cda, CString csItemName)
: CDialog(CAddCodePoints::IDD, pParent), m_cmw2dPoints(cmw2d),
m_cdaPages(cda) {
m_csItem = csItemName;
// Allocate a CCodePageInformation class if needed.
if (pccpi == NULL)
pccpi = new CCodePageInformation ;
for (int i= 0; i < m_cdaPages.GetSize(); i++)
m_csaNames.Add(pccpi->Name(m_cdaPages[i]));
m_pos = 0;
m_uTimer = 0;
//{{AFX_DATA_INIT(CAddCodePoints)
//}}AFX_DATA_INIT
}
/******************************************************************************
CAddCodePoints::DoDataExchange
DDX override for the dialog- I'm not sure I need to keep this around.
******************************************************************************/
void CAddCodePoints::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAddCodePoints)
DDX_Control(pDX, IDC_Banner, m_cpcBanner);
DDX_Control(pDX, IDC_GlyphList, m_clbList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAddCodePoints, CDialog)
//{{AFX_MSG_MAP(CAddCodePoints)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/******************************************************************************
CAddCodePoints::OnInitDialog
This is the primary dialog intialization member. It uses the passed
information to customize the title, then kicks off a timer so the UI appears
while the list box is filled.
******************************************************************************/
BOOL CAddCodePoints::OnInitDialog() {
CDialog::OnInitDialog();
GetWindowText(m_csHolder);
SetWindowText(m_csHolder + m_csItem);
m_uTimer = (unsigned)SetTimer(IDD, 10, NULL);
if (!m_uTimer) { // No timer- fall back to filling the box slowly
CWaitCursor cwc;
OnTimer(m_uTimer);
}
return TRUE; // No need to change the default focus
}
/******************************************************************************
CAddCodePoints::OnOK
This is called when the OK button is pressed. We check the selection state
of each item in the list. If it is not selected, we remove it from the map.
Thus, we return a map with only the desired entries to the caller.
******************************************************************************/
void CAddCodePoints::OnOK() {
CWaitCursor cwc; // This could get slow
for (unsigned u = 0; u < (unsigned) m_clbList.GetCount(); u++)
if (!m_clbList.GetSel(u))
m_cmw2dPoints.RemoveKey((WORD) m_clbList.GetItemData(u));
CDialog::OnOK();
}
/******************************************************************************
CAddCodePoints::OnInitDialog
This is invoked after the timer expires. It uses the passed information to
fill the code point list.
******************************************************************************/
void CAddCodePoints::OnTimer(UINT nIDEvent) {
if (nIDEvent != m_uTimer) {
CDialog::OnTimer(nIDEvent);
return;
}
WORD wKey;
DWORD dwIndex;
CString csWork;
if (m_uTimer)
::KillTimer(m_hWnd, m_uTimer);
if (!m_pos) {
m_cpcBanner.SetRange(0, (int)m_cmw2dPoints.GetCount() - 1);
m_cpcBanner.SetStep(1);
m_cpcBanner.SetPos(0);
csWork.LoadString(IDS_WaitToFill);
CDC *pcdc = m_cpcBanner.GetDC();
CRect crBanner;
m_cpcBanner.GetClientRect(crBanner);
pcdc -> SetBkMode(TRANSPARENT);
pcdc -> DrawText(csWork, crBanner, DT_CENTER | DT_VCENTER);
m_cpcBanner.ReleaseDC(pcdc);
if (m_uTimer)
m_clbList.EnableWindow(FALSE);
else {
m_clbList.LockWindowUpdate();
m_clbList.ResetContent();
}
m_pos = m_cmw2dPoints.GetStartPosition();
}
// Put in just 100 items, unless the timer is off
for (unsigned u = 0; m_pos && (!m_uTimer || u < 100); u++) {
m_cmw2dPoints.GetNextAssoc(m_pos, wKey, dwIndex);
csWork.Format(_TEXT("%4.4X: "), wKey);
csWork += m_csaNames[dwIndex];
int id = m_clbList.AddString(csWork);
m_clbList.SetItemData(id, wKey);
}
if (!m_pos) {
if (m_uTimer)
m_clbList.EnableWindow(TRUE);
else
m_clbList.UnlockWindowUpdate();
m_uTimer = 0;
m_cpcBanner.SetPos(0);
m_cpcBanner.ShowWindow(SW_HIDE);
SetFocus();
}
if (m_uTimer) {
m_cpcBanner.OffsetPos(u);
csWork.LoadString(IDS_WaitToFill);
CDC *pcdc = m_cpcBanner.GetDC();
CRect crBanner;
m_cpcBanner.GetClientRect(crBanner);
pcdc -> SetBkMode(TRANSPARENT);
pcdc -> DrawText(csWork, crBanner, DT_CENTER | DT_VCENTER);
m_cpcBanner.ReleaseDC(pcdc);
m_uTimer = (unsigned)SetTimer(IDD, 10, NULL);
if (!m_uTimer) {
CWaitCursor cwc; // Might be a while...
m_clbList.EnableWindow(TRUE);
m_clbList.LockWindowUpdate();
OnTimer(m_uTimer);
}
}
}