/* -*- 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. */ ///////////////////////////////////////////////////////////////////////////// // printpag.cpp : implementation file // contains the printer page setup code. This files contains // two objects: the page setup dialog box and the page // setup default setting object which also implements the // IPrinter interface. - jre // #include "stdafx.h" #include #include #include "printpag.h" // print page setup #include "apipage.h" // page setup api #include "prefapi.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif #define MEASURE_US 1 #define MEASURE_METRIC 2 // metric or US measurement flag static int measureUnit = -1; // conversions #define TWIPSPERINCH 1440 #define TWIPSPERCENTIMETER 567 ///////////////////////////////////////////////////////////////////////////// // CPrintPageSetup dialog CPrintPageSetup::CPrintPageSetup(CWnd* pParent /*=NULL*/) : CDialog(CPrintPageSetup::IDD, pParent) { //{{AFX_DATA_INIT(CPrintPageSetup) m_bLinesBlack = FALSE; m_bPrintBkImage = FALSE; m_bTextBlack = FALSE; m_bDate = FALSE; m_bPageNo = FALSE; m_bSolidLines = FALSE; m_bTitle = FALSE; m_bTotal = FALSE; m_bURL = FALSE; //}}AFX_DATA_INIT // Initializes the measurement setting based on the locale SetLocaleUnit ( ); ApiPageSetup(api,0); api->GetPageSize ( &lWidth, &lHeight ); api->GetMargins (&m_InitialLeft, &m_InitialRight, &m_InitialTop, &m_InitialBottom ); } void CPrintPageSetup::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPrintPageSetup) DDX_Control(pDX, IDC_PAGESETUP_SAMPLE, m_PagePreview); DDX_Control(pDX, IDC_PAGESETUP_MARGINBOX, m_MarginBox); DDX_Control(pDX, IDC_PAGESETUP_MBOTTOM, m_BottomMargin); DDX_Control(pDX, IDC_PAGESETUP_MLEFT, m_LeftMargin); DDX_Control(pDX, IDC_PAGESETUP_MRIGHT, m_RightMargin); DDX_Control(pDX, IDC_PAGESETUP_MTOP, m_TopMargin); DDX_Check(pDX, IDC_PAGESETUP_ALLLINESBLACK, m_bLinesBlack); DDX_Check(pDX, IDC_PAGESETUP_ALLTEXTBLACK, m_bTextBlack); DDX_Check(pDX, IDC_PAGESETUP_DATE, m_bDate); DDX_Check(pDX, IDC_PAGESETUP_PAGENUMBERS, m_bPageNo); DDX_Check(pDX, IDC_PAGESETUP_SOLIDLINES, m_bSolidLines); DDX_Check(pDX, IDC_PAGESETUP_TITLE, m_bTitle); DDX_Check(pDX, IDC_PAGESETUP_TOTAL, m_bTotal); DDX_Check(pDX, IDC_PAGESETUP_URL, m_bURL); DDX_Check(pDX, IDC_PAGESETUP_REVERSEORDER, m_bReverseOrder); #ifdef XP_WIN32 DDX_Check(pDX, IDC_PRINTBKIMAGE, m_bPrintBkImage); #endif //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMarginEdit, CGenericEdit) ON_WM_CHAR() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Filter out any unwanted characters. Only allow valid margin characters. void CMarginEdit::OnChar( UINT nChar, UINT nRepCnt, UINT nFlags ) { if ( ( nChar == VK_BACK ) || strchr ( " 0123456789.,cm\"", tolower(nChar) ) ) CWnd::OnChar ( nChar, nRepCnt, nFlags ); } BEGIN_MESSAGE_MAP(CPrintPageSetup, CDialog) //{{AFX_MSG_MAP(CPrintPageSetup) //}}AFX_MSG_MAP END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CPagePreview,CStatic) ON_WM_PAINT() END_MESSAGE_MAP() void CPagePreview::OnPaint() { CStatic::OnPaint(); CClientDC dc(this); // device context for painting CPrintPageSetup * pDialog = (CPrintPageSetup *)GetOwner ( ); if ( pDialog != NULL ) pDialog->ShowPagePreview ( dc ); } ///////////////////////////////////////////////////////////////////////////// // CPrintPageSetup message handlers // ShowPagePreview displays the small page layout in the the page setup // control. The printer coordinates are adjusted to screen coordinates for // proper proportion. void CPrintPageSetup::ShowPagePreview ( CClientDC & pdc ) { RECT rect, shade, margins; // working rectangles long mtop, mbottom, mleft, mright; // margins in twips ApiPageSetup(api,0); // Get the page setup API int iX, // width of page in pixels iY, // height of page in pixels AspectXY; // aspect ratio mul 1000 // get the bounding rectangle of the sample area m_PagePreview.GetClientRect ( &rect ); // compute the width and height int width = rect.right - rect.left; int height = rect.bottom - rect.top; // get the margin to display the sample text api->GetMargins ( &mleft, &mright, &mtop, &mbottom ); // check page orientation and base on height if normal orientation // or on width for landscape... make best use of screen space if ( lHeight > lWidth ) { iY = height - ( height / 4 ); // use .75 of the height // compute the aspect ration ( percentage width to height ) AspectXY = CASTINT(( lWidth * 1000 ) / lHeight); // get the preview item height in inches long lPreviewHeight = ( long(iY) * 1000L ) / pdc.GetDeviceCaps ( LOGPIXELSY ); // compute the inches the width should be from the aspect long lX = lPreviewHeight * AspectXY; lX /= 1000; // how many pixels does that translate to? lX *= pdc.GetDeviceCaps ( LOGPIXELSX ); iX = LOWORD(lX/1000); } else { iX = width - ( width / 4 ); // use .75 of the width // compute the aspect ration ( percentage width to height ) AspectXY = CASTINT(( lHeight * 1000 ) / lWidth); // get the preview item width in inches long lPreviewWidth = ( long(iX) * 1000L ) / pdc.GetDeviceCaps ( LOGPIXELSX ); // compute the inches the height should be from the aspect long lY = lPreviewWidth * AspectXY; lY /= 1000; // how many pixels does that translate to? lY *= pdc.GetDeviceCaps ( LOGPIXELSY ); iY = LOWORD(lY/1000); } // compute the number of twips per pixel for margin computation long iXTwipsPerPixel = lWidth / iX; long iYTwipsPerPixel = lHeight / iY; HDC hdc = pdc.GetSafeHdc(); // create a black pen for borders // CPen blackPen (PS_SOLID,1,RGB(0,0,0)); // pdc.SelectObject(&blackPen); ::SelectObject(hdc, (HPEN)::GetStockObject(BLACK_PEN)); // center the page in the sample area rect.left += ( width - iX ) / 2; rect.top += ( height - iY ) / 2; rect.right = rect.left + iX; rect.bottom = rect.top + iY; // CBrush brWindow ( GetSysColor(COLOR_WINDOW) ); HBRUSH brWindow = (HBRUSH)::CreateSolidBrush(GetSysColor(COLOR_WINDOW) ); // pdc.SelectObject ( &brWindow ); ::SelectObject(hdc, (HBRUSH)brWindow); // draw the small folded over flap on the top left handl corner int iFoldOver = height / 15; ::MoveToEx( hdc, rect.left, rect.top + iFoldOver, NULL); ::LineTo (hdc, rect.left, rect.bottom ); ::LineTo (hdc, rect.right, rect.bottom ); ::LineTo (hdc, rect.right, rect.top ); ::LineTo (hdc, rect.left + iFoldOver, rect.top ); ::LineTo (hdc, rect.left, rect.top + iFoldOver ); ::FloodFill (hdc, rect.right / 2, rect.bottom / 2, RGB(0,0,0) ); ::LineTo (hdc, rect.left + iFoldOver, rect.top + iFoldOver ); ::LineTo (hdc, rect.left + iFoldOver, rect.top ); #if 0 pdc.MoveTo ( rect.left, rect.top + iFoldOver ); pdc.LineTo ( rect.left, rect.bottom ); pdc.LineTo ( rect.right, rect.bottom ); pdc.LineTo ( rect.right, rect.top ); pdc.LineTo ( rect.left + iFoldOver, rect.top ); pdc.LineTo ( rect.left, rect.top + iFoldOver ); pdc.FloodFill ( rect.right / 2, rect.bottom / 2, RGB(0,0,0) ); pdc.LineTo ( rect.left + iFoldOver, rect.top + iFoldOver ); pdc.LineTo ( rect.left + iFoldOver, rect.top ); #endif // compute the text area from the margin layout memcpy ( &margins, &rect, sizeof(rect) ); margins.left += CASTINT( mleft / iXTwipsPerPixel ); margins.right -= CASTINT( mright / iXTwipsPerPixel ); margins.top += CASTINT( mtop / iYTwipsPerPixel ); margins.bottom -= CASTINT( mbottom / iYTwipsPerPixel ); if ( ( margins.left < margins.right ) && ( margins.top < margins.bottom ) ) { // create a gray pen to display the sample text // CPen greyPen ( PS_SOLID, 1, GetSysColor(COLOR_ACTIVECAPTION) ); // pdc.SelectObject ( &greyPen ); HPEN greyPen = ::CreatePen(PS_SOLID, 1,GetSysColor(COLOR_ACTIVECAPTION)); HPEN hOldPen = (HPEN)::SelectObject(hdc, (HPEN)greyPen); int iy, iline; BOOL bIndent = TRUE; // draw lines for text layout the entire print area minus margins for ( iy = 0, iline = 0; iy <= ( margins.bottom - margins.top ); iy++ ) { if ( !( iy % 4 ) ) // every 4 pixel rows draw a line { if ( bIndent ) // is this the beginning of a paragraph? { // don't draw the line in the little fold over flap if ( ( ( iy + margins.top ) < ( rect.top + iFoldOver ) ) && ( ( margins.left + ( iX / 10 ) ) < ( rect.left + iFoldOver ) ) ) // pdc.MoveTo ( rect.left + iFoldOver, iy + margins.top ); ::MoveToEx (hdc, rect.left + iFoldOver, iy + margins.top, NULL ); else // pdc.MoveTo ( margins.left + ( iX / 10 ), iy + margins.top ); ::MoveToEx ( hdc, margins.left + ( iX / 10 ), iy + margins.top, NULL ); // pdc.LineTo ( margins.right, iy + margins.top ); ::LineTo ( hdc, margins.right, iy + margins.top ); bIndent = FALSE; } else if ( !( iline % 5 ) ) // is this the end of a paragraph? { // pdc.MoveTo ( margins.left, iy + margins.top ); // pdc.LineTo ( margins.left + ( iX / 3 ), iy + margins.top ); ::MoveToEx ( hdc, margins.left, iy + margins.top, NULL ); ::LineTo ( hdc, margins.left + ( iX / 3 ), iy + margins.top ); bIndent = TRUE; } else // just draw a normal straight across line { // don't draw the line in the little fold over flap if ( ( ( iy + margins.top ) < ( rect.top + iFoldOver ) ) && ( margins.left < ( rect.left + iFoldOver ) ) ) ::MoveToEx ( hdc, rect.left + iFoldOver, iy + margins.top, NULL); else ::MoveToEx ( hdc, margins.left, iy + margins.top, NULL); ::LineTo (hdc, margins.right, iy + margins.top ); } iline++; } } ::SelectObject(hdc, (HPEN)hOldPen); ::DeleteObject(greyPen); } // draw the shading around the sample // shade.left = rect.right; // shade.right = rect.right + 3; // shade.top = rect.top + 6; // shade.bottom = rect.bottom + 3; ::SelectObject(hdc, (HPEN)::GetStockObject(BLACK_PEN)); ::SelectObject(hdc, (HBRUSH)::GetStockObject(BLACK_BRUSH)); // pdc.Rectangle ( &shade ); ::Rectangle(hdc,rect.right, rect.top + 6, rect.right + 3, rect.bottom + 3); // shade.left = rect.left + 6; // shade.top = rect.bottom; // pdc.Rectangle ( &shade ); ::Rectangle(hdc,rect.left + 6, rect.bottom, rect.right + 3, rect.bottom + 3); ::SelectObject(hdc, (HPEN)::GetStockObject(NULL_PEN)); ::SelectObject(hdc, (HBRUSH)::GetStockObject(NULL_BRUSH )); ::DeleteObject(brWindow); } void CPrintPageSetup::MarginError ( char * szTitle ) { MessageBox ( "The margin value entered was not valid. Try a smaller number.", szTitle, MB_OK | MB_ICONEXCLAMATION ); } // function reads all the margin text from the margin controls, converts // it from the locale measurement units and stores the values back in the // page setup object. int CPrintPageSetup::UpdateMargins ( BOOL check ) { char szBuffer[ 10 ]; // buffer holds edit control data long mtop, mbottom, mleft, mright; // margins in twips long mtopold, mbottomold, mleftold, mrightold; ApiPageSetup(api,0); // Get the page setup API api->GetMargins ( &mleftold, &mrightold, &mtopold, &mbottomold ); // get the margin text from the edit controls and convert it // to twips memset ( szBuffer, '\0', sizeof(szBuffer) ); m_TopMargin.GetLine ( 0, szBuffer, sizeof(szBuffer) ); strlwr ( szBuffer ); mtop = LocaleUnitToTwips ( szBuffer ); // if we are range checking, check to see if this is a valid margin if ( check && ( mtop < 0 ) ) { MarginError ( szLoadString(IDS_TOPMARGINERROR) ); m_TopMargin.SetFocus ( ); m_TopMargin.SetSel ( 0, -1 ); return 1; } memset ( szBuffer, '\0', sizeof(szBuffer) ); m_BottomMargin.GetLine ( 0, szBuffer, sizeof(szBuffer) ); strlwr ( szBuffer ); mbottom = LocaleUnitToTwips ( szBuffer ); if ( check && ( mbottom < 0 ) ) { MarginError ( szLoadString(IDS_BOTTOMMARGINERROR) ); m_BottomMargin.SetFocus ( ); m_BottomMargin.SetSel ( 0, -1 ); return 1; } memset ( szBuffer, '\0', sizeof(szBuffer) ); m_LeftMargin.GetLine ( 0, szBuffer, sizeof(szBuffer) ); strlwr ( szBuffer ); mleft = LocaleUnitToTwips ( szBuffer ); if ( check && ( mleft < 0 ) ) { MarginError ( szLoadString(IDS_LEFTMARGINERROR) ); m_LeftMargin.SetFocus ( ); m_LeftMargin.SetSel ( 0, -1 ); return 1; } memset ( szBuffer, '\0', sizeof(szBuffer) ); m_RightMargin.GetLine ( 0, szBuffer, sizeof(szBuffer) ); strlwr ( szBuffer ); mright = LocaleUnitToTwips ( szBuffer ); if ( check && ( mright < 0 ) ) { MarginError ( szLoadString(IDS_RIGHTMARGINERROR) ); m_RightMargin.SetFocus ( ); m_RightMargin.SetSel ( 0, -1 ); return 1; } // 1 inch x 1 inch minimum space. if(check) { if(mtop + mbottom >= lHeight - TWIPSPERINCH) { // Send them to the top/bottom margin for editing the problem. if(mtop >= mbottom) { MarginError ( szLoadString(IDS_TOPMARGINERROR) ); m_TopMargin.SetFocus ( ); m_TopMargin.SetSel ( 0, -1 ); } else { MarginError ( szLoadString(IDS_BOTTOMMARGINERROR) ); m_BottomMargin.SetFocus ( ); m_BottomMargin.SetSel ( 0, -1 ); } return 1; } else if(mleft + mright >= lWidth - TWIPSPERINCH) { // Send them to left/right margin for editing the problem. if(mleft >= mright) { MarginError ( szLoadString(IDS_LEFTMARGINERROR) ); m_LeftMargin.SetFocus ( ); m_LeftMargin.SetSel ( 0, -1 ); } else { MarginError ( szLoadString(IDS_RIGHTMARGINERROR) ); m_RightMargin.SetFocus ( ); m_RightMargin.SetSel ( 0, -1 ); } return 1; } } // update the preview area only if margins have changed if ( ( mright != mrightold ) || ( mleft != mleftold ) || ( mbottom != mbottomold ) || ( mtop != mtopold ) ) { m_PagePreview.Invalidate ( ); // set the margins in the page setup object api->SetMargins ( mleft, mright, mtop, mbottom ); } return 0; } void CPrintPageSetup::OnCancel() { ApiPageSetup(api,0); // Get the page setup API api->SetMargins (m_InitialLeft, m_InitialRight, m_InitialTop, m_InitialBottom ); CDialog::OnCancel(); } // processed when the user presses OK button. Does all margin validations // etc. Sets up the printer page setup object with the selected options. void CPrintPageSetup::OnOK() { ApiPageSetup(api,0); // Get the page setup API UpdateData ( ); if ( UpdateMargins ( TRUE ) ) return; // set up the header information api->Header ( ( m_bTitle ? PRINT_TITLE : 0 ) | ( m_bURL ? PRINT_URL : 0 ) ); // set the footer information api->Footer ( ( m_bPageNo ? PRINT_PAGENO : 0 ) | ( m_bDate ? PRINT_DATE : 0 ) | ( m_bTotal ? PRINT_PAGECOUNT : 0 ) ); // set up the miscellaneous page options api->BlackLines ( m_bLinesBlack ); api->BlackText( m_bTextBlack ); api->SolidLines ( !m_bSolidLines ); api->ReverseOrder ( m_bReverseOrder ); api->SetPrintingBkImage ( m_bPrintBkImage ); CDialog::OnOK(); } // OnCommand handler looks at the KILLFOCUS messages from the edit controls. // The new margin values are retrieved and the layout area is updated. Also, // the values are normalized and restored back in the edit control BOOL CPrintPageSetup::OnCommand(WPARAM wParam, LPARAM lParam) { #ifdef WIN32 if ( HIWORD(wParam) == EN_KILLFOCUS ) #else if ( HIWORD(lParam) == EN_KILLFOCUS ) #endif { if ( ( LOWORD(wParam) == IDC_PAGESETUP_MTOP ) || ( LOWORD(wParam) == IDC_PAGESETUP_MBOTTOM ) || ( LOWORD(wParam) == IDC_PAGESETUP_MLEFT ) || ( LOWORD(wParam) == IDC_PAGESETUP_MRIGHT ) ) { UpdateMargins ( ); // update the margin values - relayout // get the edit control and normalize the value CMarginEdit * pEdit = (CMarginEdit *) GetDlgItem ( LOWORD(wParam) ); if ( pEdit ) { char szBuffer[10]; long lTwips; memset ( szBuffer, '\0', sizeof(szBuffer) ); pEdit->GetLine ( 0, szBuffer, sizeof(szBuffer) ); strlwr ( szBuffer ); lTwips = LocaleUnitToTwips ( szBuffer ); pEdit->SetWindowText( TwipsToLocaleUnit ( lTwips ) ); } } } return CDialog::OnCommand(wParam, lParam); } // function converts twips to centimeters or inches based on the // conversion and the locale. char * CPrintPageSetup::TwipsToString ( long twips, long conversion ) { static char szBuffer[ 10 ]; // load the centimeter abbreviation CString cs; cs.LoadString( IDS_PAGESETUP_CM ); // Save to static buffer rounding to 2 dec places sprintf( szBuffer, "%.2f", (float)twips/(float)conversion ); #ifdef XP_WIN32 char buf[10]; GetNumberFormat(LOCALE_SYSTEM_DEFAULT, NULL, szBuffer, NULL, buf, 10); strcpy(szBuffer, buf); #endif strcat(szBuffer, ( measureUnit == MEASURE_US ) ? "\"" : (const char *)cs); return szBuffer; // return conversion } // function takes a text buffer and converts it to twips from // inches or centimeters. If the text contains a ", it assumed // inches. If the text is preceded by 'cm' it is assumed // metric. Locale can be overriden by specifying one of the formentioned // identifiers. // 1440 twips/inch // 567 twips/cm long CPrintPageSetup::StringToTwips ( char * szBuffer, long conversion ) { int len = strlen ( szBuffer ); // string length to parse long lDecPart = 0; // decimal part long lFracPart = 0; // fractional part int precision = 0; // make sure at least 2 decimal points int i; BOOL decimal = TRUE; // what part are we currently parsing // process the entire string for ( i = 0; i < len; i++ ) { // ignore anything but digits for numeric processing if ( isdigit ( szBuffer[ i ] ) ) { // are we processing the decimal or fractional part if ( decimal ) lDecPart = ( lDecPart * 10 ) + ( szBuffer[ i ] - '0' ); else { lFracPart = ( lFracPart * 10 ) + ( szBuffer[ i ] - '0' ); precision++; } } // toggle the dec/frac flag when we hit a decimal point else if ( szBuffer[ i ] == '.' || szBuffer[ i ] == ',' ) decimal = FALSE; } lFracPart *= conversion; while ( precision-- ) lFracPart /= 10; // final conversion for total twips return (( lDecPart * conversion ) + lFracPart); } // function checks the locale and sets the units of measurement to either // US or metric. void CPrintPageSetup::SetLocaleUnit ( void ) { // check only if the flag hasn't been initialized if ( measureUnit == -1 ) { #ifdef WIN32 char szLCStr[2]; GetLocaleInfo ( GetSystemDefaultLCID(), // current locale LOCALE_IMEASURE, // measurement system szLCStr, // will return '0'-metric,'1'-US sizeof(szLCStr) ); if ( szLCStr[ 0 ] == '0' ) measureUnit = MEASURE_METRIC; else measureUnit = MEASURE_US; #else if (GetProfileInt("intl", "iMeasure", 0) == 0) measureUnit = MEASURE_METRIC; else measureUnit = MEASURE_US; #endif } } // function converts twip count to a text string representing the // value in centimeters or inches based on the locale char * CPrintPageSetup::TwipsToLocaleUnit ( long lTwips ) { switch ( measureUnit ) { case MEASURE_US: return TwipsToString ( lTwips, TWIPSPERINCH ); break; case MEASURE_METRIC: return TwipsToString ( lTwips, TWIPSPERCENTIMETER ); break; } return 0; } // function accepts a text string representing either inches or // centimeters and converts it to twips. The locale can be overriden // by adding either a '"' for inches or 'cm' for centimeters. long CPrintPageSetup::LocaleUnitToTwips ( char * szBuffer ) { CString cs; cs.LoadString ( IDS_PAGESETUP_CM ); // get the centimeter abrv. // check for locale override if ( strstr ( szBuffer, cs ) ) return StringToTwips ( szBuffer, TWIPSPERCENTIMETER ); else if ( strchr ( szBuffer, '\"' ) ) return StringToTwips ( szBuffer, TWIPSPERINCH ); // no locale overrides, convert based on system locale if ( measureUnit == MEASURE_US ) return StringToTwips ( szBuffer, TWIPSPERINCH ); else return StringToTwips ( szBuffer, TWIPSPERCENTIMETER ); return 0; } // called to preinitialize the page setup dialog. This function takes // the values from the page setup object and initializes the page setup // dialog with them. BOOL CPrintPageSetup::OnInitDialog() { CString cs, SampleText; long mright, mleft, mtop, mbottom; ApiPageSetup(api,0); // page setup api // get the margins from the object api->GetMargins ( &mleft, &mright, &mtop, &mbottom ); CDialog::OnInitDialog(); // print the paer size on the sample window char szSize[50], szWidth[10], szHeight[10], szSample[50]; strcpy ( szWidth, TwipsToLocaleUnit ( lWidth ) ); if ( strchr ( szWidth, '\"' ) ) * strchr ( szWidth, '\"' ) = '\0'; strcpy ( szHeight, TwipsToLocaleUnit ( lHeight ) ); if ( strchr ( szHeight, '\"' ) ) * strchr ( szHeight, '\"' ) = '\0'; wsprintf ( szSize, " (%s x %s)", szWidth, szHeight ); CStatic * pBox = (CStatic *)GetDlgItem(IDC_PAGESETUP_SAMPLE); GetDlgItemText(IDC_PAGESETUP_SAMPLE, szSample, 50); SampleText = szSample; SampleText+=szSize; pBox->SetWindowText ( SampleText ); // load the inches or centimeters message based on the locale if ( measureUnit == MEASURE_METRIC ) cs.LoadString ( IDS_PAGESETUP_CENTIMETERS ); else cs.LoadString ( IDS_PAGESETUP_INCHES ); // set the 'Margins (Inches)' or 'Margins (Centimeters)' heading m_MarginBox.SetWindowText ( cs ); // convert from twips and initialize the dialog with the default // types m_RightMargin.SetWindowText( TwipsToLocaleUnit ( mright ) ); m_TopMargin.SetWindowText( TwipsToLocaleUnit ( mtop ) ); m_BottomMargin.SetWindowText( TwipsToLocaleUnit ( mbottom ) ); m_LeftMargin.SetWindowText( TwipsToLocaleUnit ( mleft ) ); // initialize the focus to the first margin setting selected m_TopMargin.SetFocus ( ); m_TopMargin.SetSel ( 0, -1 ); // initialize the check boxes m_bLinesBlack = api->BlackLines(); m_bTextBlack = api->BlackText(); m_bSolidLines = api->SolidLines(); m_bTitle = ( api->Header() & PRINT_TITLE ) ? TRUE : FALSE; m_bURL = ( api->Header() & PRINT_URL ) ? TRUE : FALSE; m_bPageNo = ( api->Footer() & PRINT_PAGENO ) ? TRUE : FALSE; m_bTotal = ( api->Footer() & PRINT_PAGECOUNT ) ? TRUE : FALSE; m_bDate = ( api->Footer() & PRINT_DATE ) ? TRUE : FALSE; m_bPrintBkImage = api->IsPrintingBkImage(); m_bReverseOrder = api->ReverseOrder(); ( (CButton *) GetDlgItem(IDC_PAGESETUP_SOLIDLINES) )->SetCheck ( !m_bSolidLines ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_ALLTEXTBLACK) )->SetCheck ( m_bTextBlack ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_ALLLINESBLACK) )->SetCheck ( m_bLinesBlack ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_TITLE) )->SetCheck ( m_bTitle ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_PAGENUMBERS) )->SetCheck ( m_bPageNo); ( (CButton *) GetDlgItem(IDC_PAGESETUP_URL) )->SetCheck ( m_bURL ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_DATE) )->SetCheck( m_bDate ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_TOTAL) )->SetCheck ( m_bTotal ); ( (CButton *) GetDlgItem(IDC_PAGESETUP_REVERSEORDER) )->SetCheck ( m_bReverseOrder ); #ifdef XP_WIN32 ( (CButton *) GetDlgItem(IDC_PRINTBKIMAGE) )->SetCheck ( m_bPrintBkImage ); #endif // return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE return FALSE; } // Default page setup options. This is a class that is statically instantiated // which implements the IPageSetup API. class CPageSetupInfo : public IUnknown, public IPageSetup { protected: ULONG m_ulRefCount; // page setup values long m_lLeftMargin; long m_lRightMargin; long m_lTopMargin; long m_lBottomMargin; int m_iHeader; int m_iFooter; int m_iSolidLines; int m_iBlackText; int m_iBlackLines; int m_iReverseOrder; BOOL m_bPrintBkImage; long lWidth, lHeight; public: CPageSetupInfo ( ); ~CPageSetupInfo ( ); // IUnknown Interface STDMETHODIMP QueryInterface(REFIID,LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IClassFactory Interface STDMETHODIMP CreateInstance(LPUNKNOWN,REFIID,LPVOID*); STDMETHODIMP LockServer(BOOL); // IPageSetup Interface void GetMargins ( long *, long *, long *, long * ); void SetMargins ( long, long, long, long ); void GetPageSize ( long *, long * ); void SetPageSize ( long, long ); int Header ( int flag ); int Footer ( int flag ); int SolidLines ( int flag ); int BlackText ( int flag ); int BlackLines ( int flag ); int ReverseOrder ( int flag ); void SetPrintingBkImage (BOOL flag); BOOL IsPrintingBkImage (void); }; class CPageSetupInfoFactory : public IClassFactory { protected: ULONG m_ulRefCount; public: CPageSetupInfoFactory(); // IUnknown Interface STDMETHODIMP QueryInterface(REFIID,LPVOID *); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IClassFactory Interface STDMETHODIMP CreateInstance(LPUNKNOWN,REFIID,LPVOID*); STDMETHODIMP LockServer(BOOL); }; CPageSetupInfoFactory::CPageSetupInfoFactory() { ApiApiPtr(api); api->RegisterClassFactory(APICLASS_PAGESETUP,(LPCLASSFACTORY)this); api->CreateClassInstance(APICLASS_PAGESETUP); } STDMETHODIMP CPageSetupInfoFactory::QueryInterface(REFIID refiid, LPVOID * ppv) { *ppv = NULL; if (IsEqualIID(refiid,IID_IUnknown)) *ppv = (LPUNKNOWN) this; else if (IsEqualIID(refiid,IID_IClassFactory)) *ppv = (LPCLASSFACTORY) this; if (*ppv != NULL) { AddRef(); return NOERROR; } return ResultFromScode(E_NOINTERFACE); } STDMETHODIMP_(ULONG) CPageSetupInfoFactory::AddRef(void) { return ++m_ulRefCount; } STDMETHODIMP_(ULONG) CPageSetupInfoFactory::Release(void) { ULONG ulRef; ulRef = --m_ulRefCount; if (m_ulRefCount == 0) delete this; return ulRef; } STDMETHODIMP CPageSetupInfoFactory::CreateInstance( LPUNKNOWN pUnkOuter,REFIID refiid, LPVOID * ppvObj) { *ppvObj = NULL; CPageSetupInfo * pRepository = new CPageSetupInfo; return pRepository->QueryInterface(refiid,ppvObj); } STDMETHODIMP CPageSetupInfoFactory::LockServer(BOOL fLock) { return NOERROR; } // Constructor initializes the default values and registers the object // as the implementor of the IPrinter interface. CPageSetupInfo::CPageSetupInfo ( ) { m_ulRefCount = 0; m_lLeftMargin = 720; // 0.5 inches m_lRightMargin = 720; m_lTopMargin = 720; m_lBottomMargin = 720; m_iHeader = PRINT_TITLE | PRINT_URL; m_iFooter = PRINT_PAGENO | PRINT_PAGECOUNT | PRINT_DATE; m_iSolidLines = FALSE; m_iBlackText = FALSE; m_iBlackLines = FALSE; m_iReverseOrder = FALSE; lWidth = lHeight = 0; } // constructor releases the default API which causes it to automatically // unregister based on a zero reference count. The API will not dissapear // until everyone is done with it. CPageSetupInfo::~CPageSetupInfo ( ) { } STDMETHODIMP CPageSetupInfo::QueryInterface(REFIID refiid, LPVOID * ppv) { *ppv = NULL; if (IsEqualIID(refiid,IID_IUnknown)) *ppv = (LPUNKNOWN) this; else if (IsEqualIID(refiid,IID_IPageSetup)) *ppv = (LPPAGESETUP) this; if (*ppv != NULL) { AddRef(); return NOERROR; } return ResultFromScode(E_NOINTERFACE); } STDMETHODIMP_(ULONG) CPageSetupInfo::AddRef(void) { return ++m_ulRefCount; } STDMETHODIMP_(ULONG) CPageSetupInfo::Release(void) { ULONG ulRef; ulRef = --m_ulRefCount; if (m_ulRefCount == 0) delete this; return ulRef; } void CPageSetupInfo::SetPrintingBkImage (BOOL flag) { PREF_SetBoolPref("browser.print_background",flag); m_bPrintBkImage = flag; } BOOL CPageSetupInfo::IsPrintingBkImage (void) { if (PREF_GetBoolPref("browser.print_background",&m_bPrintBkImage) != PREF_OK) m_bPrintBkImage = FALSE; return m_bPrintBkImage; } // function sets the margins in twips void CPageSetupInfo::SetMargins ( long lLeft, long lRight, long lTop, long lBottom ) { m_lLeftMargin = lLeft; m_lRightMargin = lRight; m_lTopMargin = lTop; m_lBottomMargin = lBottom; } // gets the margins void CPageSetupInfo::GetMargins ( long * plLeft, long * plRight, long * plTop, long * plBottom ) { *plLeft = m_lLeftMargin; *plRight = m_lRightMargin; *plTop = m_lTopMargin; *plBottom = m_lBottomMargin; } // get-set the header flags, -1 gets the value (default) // flags are: PRINT_TITLE | PRINT_URL int CPageSetupInfo::Header ( int flag ) { if ( flag == -1 ) return m_iHeader; int temp = m_iHeader; m_iHeader = flag; return temp; } // get-set the footer flag, -1 gets the value (default) // flags are: PRINT_PAGENO | PRINT_PAGECOUNT | PRINT_DATE int CPageSetupInfo::Footer ( int flag ) { if ( flag == -1 ) return m_iFooter; int temp = m_iFooter; m_iFooter = flag; return temp; } // get-set solid line flag. Control printing of textured bevels int CPageSetupInfo::SolidLines ( int flag ) { if ( flag == -1 ) return m_iSolidLines; int temp = m_iSolidLines; m_iSolidLines = flag; return temp; } // get-set all text black flag. If set to TRUE, all text is printed // in black int CPageSetupInfo::BlackText ( int flag ) { if ( flag == -1 ) return m_iBlackText; int temp = m_iBlackText; m_iBlackText = flag; return temp; } // get-set all line black flag int CPageSetupInfo::BlackLines ( int flag ) { if ( flag == -1 ) return m_iBlackLines; int temp = m_iBlackLines; m_iBlackLines = flag; return temp; } void CPageSetupInfo::SetPageSize ( long lw, long lh ) { lWidth = lw; lHeight = lh; } void CPageSetupInfo::GetPageSize ( long * plWidth, long * plHeight ) { CPrintDialog printDialog ( FALSE ); if ( printDialog.GetDefaults ( ) ) { HDC hPrintDC = printDialog.GetPrinterDC ( ); if ( hPrintDC != NULL ) { POINT point; ::Escape ( hPrintDC, GETPHYSPAGESIZE, NULL, NULL, &point ); lWidth = point.x; lHeight = point.y; lWidth = ( lWidth * TWIPSPERINCH ) / ::GetDeviceCaps ( hPrintDC, LOGPIXELSX ); lHeight = ( lHeight * TWIPSPERINCH ) / ::GetDeviceCaps ( hPrintDC, LOGPIXELSY ); } ::DeleteDC(hPrintDC); ::GlobalFree(printDialog.m_pd.hDevNames); ::GlobalFree(printDialog.m_pd.hDevMode); } if ( !lWidth || !lHeight ) { lWidth = (TWIPSPERINCH * 85L ) / 10; lHeight = TWIPSPERINCH * 11; } *plWidth = lWidth; *plHeight = lHeight; } int CPageSetupInfo::ReverseOrder ( int flag ) { if ( flag == -1 ) return m_iReverseOrder; int temp = m_iReverseOrder; m_iReverseOrder = flag; return temp; } static CPageSetupInfoFactory _defSettings; // static instantiation of page setup object