SpecsPage.cpp. #1

  • //
  • guest/
  • YourUncleBob/
  • p4win/
  • main/
  • gui/
  • OptionsDlg/
  • SpecsPage.cpp.
  • View
  • Commits
  • Open Download .zip Download (12 KB)
/*
 * Copyright 1999 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */



// SpecsPage.cpp : implementation file
//

#include "stdafx.h"
#include "..\p4win.h"
#include "SpecsPage.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSpecsPage property page

IMPLEMENT_DYNCREATE(CSpecsPage, CPropertyPage)

CSpecsPage::CSpecsPage() : CPropertyPage(CSpecsPage::IDD)
{
	//{{AFX_DATA_INIT(CSpecsPage)
	m_FontFace = _T("");
	m_FontSize = _T("");
	m_FontStyle = _T("");
	m_MinMultiLineSize = _T("");
	m_DescWrapSw = FALSE;
	m_DescWrap = _T("");
	//}}AFX_DATA_INIT

	m_Inited = FALSE;
}

CSpecsPage::~CSpecsPage()
{
}

void CSpecsPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSpecsPage)
	DDX_Control(pDX, IDC_AUTOMINEDITDLG, m_AutoMinEditDlg);
	DDX_Control(pDX, IDC_ALLOWPROMPTABOVE, m_AllowPromptAbove);
	DDX_Control(pDX, IDC_PRESERVESPECFORMAT, m_PreserveSpecFormat);
	DDX_Text(pDX, IDC_MINMULTILINESIZE, m_MinMultiLineSize);
	DDV_MaxChars(pDX, m_MinMultiLineSize, 1);
	DDX_Check(pDX, IDC_DESCWRAPSW, m_DescWrapSw);
	DDX_Text(pDX, IDC_DESCWRAP, m_DescWrap);
	DDV_MaxChars(pDX, m_DescWrap, 3);
	DDX_Control(pDX, IDC_FONT, m_FontCombo);
	DDX_Control(pDX, IDC_FONTSIZE, m_SizeCombo);
	DDX_Control(pDX, IDC_STYLE, m_StyleCombo);
	DDX_Control(pDX, IDC_SAMPLE, m_Sample);
	DDX_CBString(pDX, IDC_FONT, m_FontFace);
	DDX_CBString(pDX, IDC_FONTSIZE, m_FontSize);
	DDX_CBString(pDX, IDC_STYLE, m_FontStyle);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSpecsPage, CPropertyPage)
	//{{AFX_MSG_MAP(CSpecsPage)
	ON_CBN_SELCHANGE(IDC_FONTSIZE, OnSelChange)
	ON_CBN_SELCHANGE(IDC_STYLE, OnSelChange)
	ON_CBN_KILLFOCUS(IDC_FONT, OnSelchangeFont)
	ON_CBN_KILLFOCUS(IDC_FONTSIZE, OnSelChange)
	ON_CBN_KILLFOCUS(IDC_STYLE, OnSelChange)
	ON_CBN_SELCHANGE(IDC_FONT, OnSelchangeFont)
	ON_BN_CLICKED(IDC_DESCWRAPSW, OnDescWrapSw)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSpecsPage message handlers

BOOL CSpecsPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// Create the current fixed width font
	CWindowDC dc(GetDesktopWindow() );
	m_cyPixelsPerInch = GetDeviceCaps(dc, LOGPIXELSY);	

	// Get the current dialog font from the registry 
	//
	CString face= GET_P4REGPTR()->GetFontFace();
	int size= - abs(GET_P4REGPTR()->GetFontSize());
	int weight= GET_P4REGPTR()->GetFontWeight();
	BOOL isItalic= GET_P4REGPTR()->GetFontItalic();

	// Attempt to create the font that is referred to in the
	// registry.  Windows may substitute an alternative
	LOGFONT logFont;
	memset( &logFont, 0, sizeof(LOGFONT) );
	lstrcpy( logFont.lfFaceName, face );
	logFont.lfCharSet= DEFAULT_CHARSET;
	logFont.lfHeight= size;
	logFont.lfWeight= weight;
	logFont.lfItalic= (unsigned char) isItalic;
	logFont.lfPitchAndFamily= FIXED_PITCH | FF_DONTCARE;
	m_FontSample.CreateFontIndirect( &logFont );
	m_FontSample.GetLogFont( &logFont );	

	m_FontFace = logFont.lfFaceName;
	m_FontSize.Format( _T("%d"), abs(MulDiv( logFont.lfHeight, 72, m_cyPixelsPerInch)) );
	m_FontStyle = LoadStringResource(IDS_FONT_REGULAR);
	if( logFont.lfWeight >= 700 && logFont.lfItalic)
		m_FontStyle = LoadStringResource(IDS_FONT_BOLD_ITALIC);
	else if( logFont.lfItalic )
		m_FontStyle = LoadStringResource(IDS_FONT_ITALIC);
	else if ( logFont.lfWeight >= 700 )
		m_FontStyle = LoadStringResource(IDS_FONT_BOLD);

	// Now get the names of all the fixed width fonts
	memset( &logFont, 0, sizeof(LOGFONT) );
	logFont.lfPitchAndFamily= FIXED_PITCH | FF_DONTCARE;
	logFont.lfCharSet= DEFAULT_CHARSET; 
	CWindowDC dcthis(this);
	EnumFontFamiliesEx( dcthis.m_hDC, &logFont, (FONTENUMPROC)FontEnumProc, (LPARAM) this, 0 );		

	// Fill Style combobox with "common" styles
	m_StyleCombo.AddString( LoadStringResource(IDS_FONT_REGULAR) );	
	m_StyleCombo.AddString( LoadStringResource(IDS_FONT_BOLD) );
	m_StyleCombo.AddString( LoadStringResource(IDS_FONT_ITALIC) );
	m_StyleCombo.AddString( LoadStringResource(IDS_FONT_BOLD_ITALIC) );

	// Load non-font stuff
	m_AutoMinEditDlg.SetCheck(GET_P4REGPTR()->AutoMinEditDlg());
	m_AllowPromptAbove.SetCheck(GET_P4REGPTR()->AllowPromptAbove());
	m_PreserveSpecFormat.SetCheck(GET_P4REGPTR()->PreserveSpecFormat()); 
	m_MinMultiLineSize = GET_P4REGPTR()->GetMinMultiLineSize();

	m_DescWrapSw = GET_P4REGPTR()->GetDescWrapSw();
	TCHAR str[8];
	_stprintf(str, _T("%d"), GET_P4REGPTR()->GetDescWrap());
	m_DescWrap = str;

	// Update input fields
	UpdateData(FALSE);
	OnSelchangeFont();
	OnDescWrapSw();
		
	m_Inited = TRUE;
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

int CALLBACK CSpecsPage::FontEnumProc( ENUMLOGFONTEX *enumLogFontEx, NEWTEXTMETRICEX *newTextMetric,
		int fontType, CSpecsPage *specsPage )
{
	BOOL fixedPitch= FALSE;

	if( enumLogFontEx->elfLogFont.lfPitchAndFamily & FIXED_PITCH )
		fixedPitch= TRUE;
	
    if( fixedPitch && (lstrlen((LPCTSTR)enumLogFontEx->elfFullName) < 32)
		&& (specsPage->m_FontCombo.FindStringExact( 0, 
							(LPCTSTR)enumLogFontEx->elfFullName) == CB_ERR ) )
	{
		int index= specsPage->m_FontCombo.AddString( (LPCTSTR)enumLogFontEx->elfFullName );
		specsPage->m_FontCombo.SetItemData( index, (DWORD) fontType );	
	}
	return 1;
}

void CSpecsPage::OnSelChange() 
{
	// The selection hasn't changed yet, so change it	
	if( IsChild( GetFocus() ) && GetFocus()->GetParent()->IsKindOf( RUNTIME_CLASS( CComboBox ) ) )	
	{
		CComboBox *cb = (CComboBox *)GetFocus()->GetParent();		
		CString text;
		if( cb->GetCurSel() != CB_ERR )		
		{			
			cb->GetLBText( cb->GetCurSel(), text );
			cb->SetWindowText( text );		
		}	
	}
	
	UpdateData(TRUE);		
	UpdateSampleFont();
}

void CSpecsPage::UpdateSampleFont()
{
	LOGFONT logFont;

	memset( &logFont, 0, sizeof(LOGFONT) );
	logFont.lfPitchAndFamily= FIXED_PITCH | FF_DONTCARE;
	lstrcpy(logFont.lfFaceName,m_FontFace.GetBuffer(m_FontFace.GetLength()));
	logFont.lfHeight= -MulDiv(_ttoi(m_FontSize), m_cyPixelsPerInch, 72);	 
	logFont.lfWeight = 400;			//Regular	
	logFont.lfItalic = FALSE;
    logFont.lfCharSet = DEFAULT_CHARSET;
	if( m_FontStyle.Find( LoadStringResource(IDS_FONT_ITALIC) ) != -1 )		
		logFont.lfItalic = TRUE;
	if( m_FontStyle.Find( LoadStringResource(IDS_FONT_BOLD) ) != -1 )		
		logFont.lfWeight = 700;

	m_FontSample.DeleteObject();	
	m_FontSample.CreateFontIndirect( &logFont );
 	m_Sample.SetFont(&m_FontSample);	
}


void CSpecsPage::OnOK() 
{
	if (!m_Inited)
		return;

	// This bit of silliness is required to trick the font edit
	// fields into providing their data to the UpdateData() routine
	GotoDlgCtrl(GetParent()->GetDlgItem(IDC_APPLY));

	m_ErrorCount = 0;
	if( UpdateData(TRUE) )
	{
		int i;
		LOGFONT logFont;

		m_FontSample.GetLogFont( &logFont );

		if( !GET_P4REGPTR()->SetFontFace( logFont.lfFaceName ) ) 
			m_ErrorCount++;
		if( !GET_P4REGPTR()->SetFontWeight( logFont.lfWeight ) ) 
			m_ErrorCount++;
		if( !GET_P4REGPTR()->SetFontSize( abs(logFont.lfHeight) ) ) 
			m_ErrorCount++;
		if( !GET_P4REGPTR()->SetFontItalic( logFont.lfItalic ) ) 
			m_ErrorCount++;

		BOOL autoMinEditDlg = TRUE;
		if( m_AutoMinEditDlg.GetCheck() == 0 )
			autoMinEditDlg = FALSE;
		if( autoMinEditDlg != GET_P4REGPTR()->AutoMinEditDlg( ) )
			if(!GET_P4REGPTR()->SetAutoMinEditDlg( autoMinEditDlg ) )
				m_ErrorCount++;

		BOOL allowPromptAbove = TRUE;
		if( m_AllowPromptAbove.GetCheck() == 0 )
			allowPromptAbove = FALSE;
		if( allowPromptAbove != GET_P4REGPTR()->AllowPromptAbove( ) )
			if(!GET_P4REGPTR()->SetAllowPromptAbove( allowPromptAbove ) )
				m_ErrorCount++;

		BOOL preserveSpecFormat = TRUE;
		if( m_PreserveSpecFormat.GetCheck() == 0 )
			preserveSpecFormat = FALSE;
		if( preserveSpecFormat != GET_P4REGPTR()->PreserveSpecFormat( ) )
			if(!GET_P4REGPTR()->SetPreserveSpecFormat( preserveSpecFormat ) )
				m_ErrorCount++;

		if (!m_ErrorCount)
		{
			m_MinMultiLineSize.TrimRight();
			m_MinMultiLineSize.TrimLeft();
			if (m_MinMultiLineSize < _T("2"))
				m_MinMultiLineSize = _T("2");
			if(!GET_P4REGPTR()->SetMinMultiLineSize( m_MinMultiLineSize ) )
				m_ErrorCount++;
		}

		m_DescWrap.TrimLeft();
		i = _tstoi(m_DescWrap);
		if (m_DescWrapSw && i < 10)
			AfxMessageBox( IDS_DESC_WRAP_VALUE_MUST_BE_GREATER_THAN_9, MB_ICONEXCLAMATION );
		if (!m_ErrorCount)
		{
			if (i < 10)
				m_DescWrapSw = FALSE;
			if(!GET_P4REGPTR()->SetDescWrap( i ) )
				m_ErrorCount++;
		}
		// do this after m_DescWrap because it might set m_DescWrapSw
		if (!m_ErrorCount)
		{
			if(!GET_P4REGPTR()->SetDescWrapSw( m_DescWrapSw ) )
				m_ErrorCount++;
		}
		
		if(m_ErrorCount)
			AfxMessageBox(IDS_BAD_REGISTRY, MB_ICONSTOP);
	}

	if(m_ErrorCount)
		MessageBox(LoadStringResource(IDS_BAD_REGISTRY), LoadStringResource(IDS_P4WIN_ERROR),  MB_ICONSTOP);
}

void CSpecsPage::OnSelchangeFont() 
{
	int	cursel;

	// Change the selection
	if( (cursel = m_FontCombo.GetCurSel()) != CB_ERR )		
	{			
		CString text;
		m_FontCombo.GetLBText( m_FontCombo.GetCurSel(), text );
		m_FontCombo.SetWindowText( text );		
	}

	// Fill in the size list
	m_SizeCombo.ResetContent();
	
	// Fill with "real" sizes
	CString faceName;
	if (cursel >= 0)
		 m_FontCombo.GetLBText(cursel, faceName);
	else m_FontCombo.GetWindowText(faceName);

	if (faceName.GetLength() > 31)
	{
		AfxMessageBox(IDS_MICROSOFT_NO_SUPPORT_FONTNAMES_LONGER_THAN_31_CHAR, MB_OK | MB_ICONEXCLAMATION);
		m_FontCombo.SetWindowText( _T("") );
		m_FontCombo.SetCurSel(-1);
		return;
	}

	CClientDC dc(NULL);

	DWORD fontType= (cursel >= 0) ? m_FontCombo.GetItemData( m_FontCombo.GetCurSel() ) : 0;

	// Check if we have a font that is either a vector or Truettype font
	if ( fontType != RASTER_FONTTYPE)
	{
		static TCHAR* Defaults[] = 
		{	_T("8"), _T("9"), _T("10"), _T("11"), _T("12"), _T("14"),
			_T("16"), _T("18"), _T("20"), _T("22"), _T("24"), _T("26"), 
			_T("28"), _T("36"), _T("48") 
		};

		// Fill with "common" sizes
		for (int i = 0; i < sizeof(Defaults)/sizeof(Defaults[0]); i++)
			m_SizeCombo.AddString( Defaults[i] );
	}
	else	// Enum the fontname to get all the sizes
		EnumFontFamilies(dc.GetSafeHdc(), faceName, (FONTENUMPROC) CSpecsPage::SizeEnumProc, (LPARAM) this);

	// Set the point size
	if (m_SizeCombo.FindString(-1, m_FontSize) != CB_ERR)
	{
		// Attempt to select proper list item
		m_SizeCombo.SelectString(-1, m_FontSize);
	}
	else
	{
		// Point size is not in the list so just fill the edit box
		// and don't select anything from the list
		m_SizeCombo.SetCurSel(-1);
		m_SizeCombo.SetWindowText(m_FontSize);
	}

	// Redraw the sample
	UpdateData(TRUE);
	UpdateSampleFont();
}

//	This callback is called once for each font on the system that has the same name
//	as the current font in the font name combobox.  It does nothing for non-Raster fonts;
//	for raster fonts, it adds the various font sizes to the font size combobox.
//	Because the fonts come in random order, to be able to get the sizes in ascending
//	order, we have to paw thru those already loaded to figure where to insert this size.
//	We cannot us the CB_SORT style becuase that is an alpha sort and 7 would come after 10.

int CALLBACK CSpecsPage::SizeEnumProc( ENUMLOGFONT *enumLogFont, 
									  NEWTEXTMETRIC *newTextMetric, int fontType, 
									  CSpecsPage *specsPage)
{
	int	i, hy;
	ASSERT(specsPage != NULL);

	if (fontType & RASTER_FONTTYPE)
	{
		int height = newTextMetric->tmHeight - newTextMetric->tmInternalLeading;
		CString h;
		h.Format(_T("%d"), hy = MulDiv(height, 72, specsPage->m_cyPixelsPerInch) );

		// First look to see if this size is already in the combox
		// If so (i.e. != -1), there is nothing to do
		if (specsPage->m_SizeCombo.FindStringExact( -1, h ) == -1)
		{
			CString buf;
			// now look thru the size already loaded and find one bigger than this
			for (i = -1; specsPage->m_SizeCombo.GetLBTextLen(++i) != CB_ERR; )
			{
				specsPage->m_SizeCombo.GetLBText(i, buf);
				int y = _ttoi(buf);
				if (y > hy)	// if this one is bigger than the new one
				{			//	insert the new one in front of it
					specsPage->m_SizeCombo.InsertString(i, h);
					i = -1;	// signal that we did the insert
					break;
				}
			}
			if (i != -1)	// i != -1 means we didn't find a bigger one, so append this one at the end
				specsPage->m_SizeCombo.AddString(h);
		}
	}

	return 1;
}


void CSpecsPage::OnDescWrapSw() 
{
	UpdateData();
	CWnd *pwnd=GetDlgItem(IDC_DESCWRAP);
	if( m_DescWrapSw )
	{
		pwnd->EnableWindow(TRUE);
		if (m_Inited)
			GotoDlgCtrl(pwnd);
	}
	else
		pwnd->EnableWindow(FALSE);
}
# Change User Description Committed
#1 19924 YourUncleBob Populate -o //guest/perforce_software/p4win/...
//guest/YourUncleBob/p4win/.....
//guest/perforce_software/p4win/main/gui/OptionsDlg/SpecsPage.cpp
#1 16169 perforce_software Move files to follow new path scheme for branches.
//guest/perforce_software/p4win/gui/OptionsDlg/SpecsPage.cpp
#1 8562 Matt Attaway These feet never stop running.

Initial commit of the P4Win source code.  To the best of our knowledge this
compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes
as we refine the build process. Please post any build issues to the forums.