1 /* 2 * Copyright (C) 2009 Apple Inc. All Rights Reserved. 3 * Copyright (C) 2009 Brent Fulgham. All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include "stdafx.h" 28 #include "PrintWebUIDelegate.h" 29 30 #include <WebKit/WebKitCOMAPI.h> 31 #include <commctrl.h> 32 #include <commdlg.h> 33 #include <objbase.h> 34 #include <shlwapi.h> 35 #include <wininet.h> 36 37 static const int MARGIN = 20; 38 39 HRESULT PrintWebUIDelegate::QueryInterface(REFIID riid, void** ppvObject) 40 { 41 *ppvObject = 0; 42 if (IsEqualIID(riid, IID_IUnknown)) 43 *ppvObject = static_cast<IWebUIDelegate*>(this); 44 else if (IsEqualIID(riid, IID_IWebUIDelegate)) 45 *ppvObject = static_cast<IWebUIDelegate*>(this); 46 else 47 return E_NOINTERFACE; 48 49 AddRef(); 50 return S_OK; 51 } 52 53 ULONG PrintWebUIDelegate::AddRef(void) 54 { 55 return ++m_refCount; 56 } 57 58 ULONG PrintWebUIDelegate::Release(void) 59 { 60 ULONG newRef = --m_refCount; 61 if (!newRef) 62 delete this; 63 64 return newRef; 65 } 66 67 HRESULT PrintWebUIDelegate::webViewPrintingMarginRect(IWebView* view, RECT* rect) 68 { 69 if (!view || !rect) 70 return E_POINTER; 71 72 IWebFrame* mainFrame = 0; 73 if (FAILED(view->mainFrame(&mainFrame))) 74 return E_FAIL; 75 76 IWebFramePrivate* privateFrame = 0; 77 if (FAILED(mainFrame->QueryInterface(&privateFrame))) { 78 mainFrame->Release(); 79 return E_FAIL; 80 } 81 82 privateFrame->frameBounds(rect); 83 84 rect->left += MARGIN; 85 rect->top += MARGIN; 86 HDC dc = ::GetDC(0); 87 rect->right = (::GetDeviceCaps(dc, LOGPIXELSX) * 6.5) - MARGIN; 88 rect->bottom = (::GetDeviceCaps(dc, LOGPIXELSY) * 11) - MARGIN; 89 ::ReleaseDC(0, dc); 90 91 privateFrame->Release(); 92 mainFrame->Release(); 93 94 return S_OK; 95 } 96 97 HRESULT PrintWebUIDelegate::webViewHeaderHeight(IWebView* webView, float* height) 98 { 99 if (!webView || !height) 100 return E_POINTER; 101 102 HDC dc = ::GetDC(0); 103 104 TEXTMETRIC textMetric; 105 ::GetTextMetrics(dc, &textMetric); 106 ::ReleaseDC(0, dc); 107 108 *height = 1.1 * textMetric.tmHeight; 109 110 return S_OK; 111 } 112 113 HRESULT PrintWebUIDelegate::webViewFooterHeight(IWebView* webView, float* height) 114 { 115 if (!webView || !height) 116 return E_POINTER; 117 118 HDC dc = ::GetDC(0); 119 120 TEXTMETRIC textMetric; 121 ::GetTextMetrics(dc, &textMetric); 122 ::ReleaseDC(0, dc); 123 124 *height = 1.1 * textMetric.tmHeight; 125 126 return S_OK; 127 } 128 129 HRESULT PrintWebUIDelegate::drawHeaderInRect( 130 /* [in] */ IWebView* webView, 131 /* [in] */ RECT* rect, 132 /* [in] */ OLE_HANDLE drawingContext) 133 { 134 if (!webView || !rect) 135 return E_POINTER; 136 137 // Turn off header for now. 138 HDC dc = reinterpret_cast<HDC>(drawingContext); 139 140 HGDIOBJ hFont = ::GetStockObject(ANSI_VAR_FONT); 141 HGDIOBJ hOldFont = ::SelectObject(dc, hFont); 142 143 LPCWSTR header = L"[Sample Header]"; 144 size_t length = wcslen(header); 145 146 int rc = ::DrawTextW(dc, header, length, rect, DT_LEFT | DT_NOCLIP | DT_VCENTER | DT_SINGLELINE); 147 ::SelectObject(dc, hOldFont); 148 149 if (!rc) 150 return E_FAIL; 151 152 ::MoveToEx(dc, rect->left, rect->bottom, 0); 153 HGDIOBJ hPen = ::GetStockObject(BLACK_PEN); 154 HGDIOBJ hOldPen = ::SelectObject(dc, hPen); 155 ::LineTo(dc, rect->right, rect->bottom); 156 ::SelectObject(dc, hOldPen); 157 158 return S_OK; 159 } 160 161 HRESULT PrintWebUIDelegate::drawFooterInRect( 162 /* [in] */ IWebView* webView, 163 /* [in] */ RECT* rect, 164 /* [in] */ OLE_HANDLE drawingContext, 165 /* [in] */ UINT pageIndex, 166 /* [in] */ UINT pageCount) 167 { 168 if (!webView || !rect) 169 return E_POINTER; 170 171 HDC dc = reinterpret_cast<HDC>(drawingContext); 172 173 HGDIOBJ hFont = ::GetStockObject(ANSI_VAR_FONT); 174 HGDIOBJ hOldFont = ::SelectObject(dc, hFont); 175 176 LPCWSTR footer = L"[Sample Footer]"; 177 size_t length = wcslen(footer); 178 179 // Add a line, 1/10th inch above the footer text from left margin to right margin. 180 ::MoveToEx(dc, rect->left, rect->top, 0); 181 HGDIOBJ hPen = ::GetStockObject(BLACK_PEN); 182 HGDIOBJ hOldPen = ::SelectObject(dc, hPen); 183 ::LineTo(dc, rect->right, rect->top); 184 ::SelectObject(dc, hOldPen); 185 186 int rc = ::DrawTextW(dc, footer, length, rect, DT_LEFT | DT_NOCLIP | DT_VCENTER | DT_SINGLELINE); 187 ::SelectObject(dc, hOldFont); 188 189 if (!rc) 190 return E_FAIL; 191 192 return S_OK; 193 } 194