initial import
[vuplus_webkit] / Tools / WinLauncher / PrintWebUIDelegate.cpp
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 }