0

Printing: Remove unused PageOverlay since header/footers are drawn in PrintWebViewHelper.

BUG=none
TEST=none

Review URL: http://codereview.chromium.org/7585015

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@95951 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
thestig@chromium.org
2011-08-09 06:06:58 +00:00
parent ce80f5f9b5
commit dcd1e88686
12 changed files with 2 additions and 637 deletions

@ -1,209 +0,0 @@
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "printing/page_overlays.h"
#include "base/logging.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "printing/printed_document.h"
#include "printing/printed_page.h"
namespace {
// Replaces a subpart of a string by other value, and returns the position right
// after the new value.
size_t ReplaceKey(std::wstring* string,
size_t offset,
size_t old_string_len,
const std::wstring& new_string) {
string->replace(offset, old_string_len, new_string);
return offset + new_string.size();
}
} // namespace
namespace printing {
const wchar_t* const PageOverlays::kTitle = L"{title}";
const wchar_t* const PageOverlays::kTime = L"{time}";
const wchar_t* const PageOverlays::kDate = L"{date}";
const wchar_t* const PageOverlays::kPage = L"{page}";
const wchar_t* const PageOverlays::kPageCount = L"{pagecount}";
const wchar_t* const PageOverlays::kPageOnTotal = L"{pageontotal}";
const wchar_t* const PageOverlays::kUrl = L"{url}";
PageOverlays::PageOverlays()
: top_left(kDate),
top_center(kTitle),
top_right(),
bottom_left(kUrl),
bottom_center(),
bottom_right(kPageOnTotal) {
}
PageOverlays::~PageOverlays() {}
bool PageOverlays::Equals(const PageOverlays& rhs) const {
return top_left == rhs.top_left &&
top_center == rhs.top_center &&
top_right == rhs.top_right &&
bottom_left == rhs.bottom_left &&
bottom_center == rhs.bottom_center &&
bottom_right == rhs.bottom_right;
}
const std::wstring& PageOverlays::GetOverlay(HorizontalPosition x,
VerticalPosition y) const {
switch (x) {
case LEFT:
switch (y) {
case TOP:
return top_left;
case BOTTOM:
return bottom_left;
}
break;
case CENTER:
switch (y) {
case TOP:
return top_center;
case BOTTOM:
return bottom_center;
}
break;
case RIGHT:
switch (y) {
case TOP:
return top_right;
case BOTTOM:
return bottom_right;
}
break;
}
NOTREACHED();
return EmptyWString();
}
void PageOverlays::SetOverlay(HorizontalPosition x,
VerticalPosition y,
const std::wstring& input) {
switch (x) {
case LEFT:
switch (y) {
case TOP:
top_left = input;
break;
case BOTTOM:
bottom_left = input;
break;
default:
NOTREACHED();
break;
}
break;
case CENTER:
switch (y) {
case TOP:
top_center = input;
break;
case BOTTOM:
bottom_center = input;
break;
default:
NOTREACHED();
break;
}
break;
case RIGHT:
switch (y) {
case TOP:
top_right = input;
break;
case BOTTOM:
bottom_right = input;
break;
default:
NOTREACHED();
break;
}
break;
default:
NOTREACHED();
break;
}
}
// static
std::wstring PageOverlays::ReplaceVariables(const std::wstring& input,
const PrintedDocument& document,
const PrintedPage& page) {
std::wstring output(input);
for (size_t offset = output.find(L'{', 0);
offset != std::wstring::npos;
offset = output.find(L'{', offset)) {
if (0 == output.compare(offset,
wcslen(kTitle),
kTitle)) {
offset = ReplaceKey(&output,
offset,
wcslen(kTitle),
UTF16ToWideHack(document.name()));
} else if (0 == output.compare(offset,
wcslen(kTime),
kTime)) {
offset = ReplaceKey(&output,
offset,
wcslen(kTime),
UTF16ToWideHack(document.time()));
} else if (0 == output.compare(offset,
wcslen(kDate),
kDate)) {
offset = ReplaceKey(&output,
offset,
wcslen(kDate),
UTF16ToWideHack(document.date()));
} else if (0 == output.compare(offset,
wcslen(kPage),
kPage)) {
offset = ReplaceKey(&output,
offset,
wcslen(kPage),
UTF8ToWide(base::IntToString(page.page_number())));
} else if (0 == output.compare(offset,
wcslen(kPageCount),
kPageCount)) {
offset = ReplaceKey(&output,
offset,
wcslen(kPageCount),
UTF8ToWide(base::IntToString(document.page_count())));
} else if (0 == output.compare(offset,
wcslen(kPageOnTotal),
kPageOnTotal)) {
std::wstring replacement;
replacement = UTF8ToWide(base::IntToString(page.page_number()));
replacement += L"/";
replacement += UTF8ToWide(base::IntToString(document.page_count()));
offset = ReplaceKey(&output,
offset,
wcslen(kPageOnTotal),
replacement);
} else if (0 == output.compare(offset,
wcslen(kUrl),
kUrl)) {
// TODO(maruel): http://b/1126373 ui::ElideUrl(document.url(), ...)
offset = ReplaceKey(&output,
offset,
wcslen(kUrl),
UTF8ToWide(document.url().spec()));
} else {
// There is just a { in the string.
++offset;
}
}
return output;
}
} // namespace printing

@ -1,82 +0,0 @@
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PRINTING_PAGE_OVERLAYS_H_
#define PRINTING_PAGE_OVERLAYS_H_
#include <string>
namespace printing {
class PrintedDocument;
class PrintedPage;
// Page's overlays, i.e. headers and footers. Contains the strings that will be
// printed in the overlays, with actual values as variables. The variables are
// replaced by their actual values with ReplaceVariables().
class PageOverlays {
public:
// Position of the header/footer.
enum HorizontalPosition {
LEFT,
CENTER,
RIGHT,
};
// Position of the header/footer.
enum VerticalPosition {
TOP,
BOTTOM,
};
PageOverlays();
~PageOverlays();
// Equality operator.
bool Equals(const PageOverlays& rhs) const;
// Returns the string of an overlay according to its x,y position.
const std::wstring& GetOverlay(HorizontalPosition x,
VerticalPosition y) const;
// Sets the string of an overlay according to its x,y position.
void SetOverlay(HorizontalPosition x,
VerticalPosition y,
const std::wstring& input);
// Replaces the variables in |input| with their actual values according to the
// properties of the current printed document and the current printed page.
static std::wstring ReplaceVariables(const std::wstring& input,
const PrintedDocument& document,
const PrintedPage& page);
// Keys that are dynamically replaced in the header and footer by their actual
// values.
// Web page's title.
static const wchar_t* const kTitle;
// Print job's start time.
static const wchar_t* const kTime;
// Print job's start date.
static const wchar_t* const kDate;
// Printed page's number.
static const wchar_t* const kPage;
// Print job's total page count.
static const wchar_t* const kPageCount;
// Printed page's number on total page count.
static const wchar_t* const kPageOnTotal;
// Web page's displayed url.
static const wchar_t* const kUrl;
// Actual headers and footers.
std::wstring top_left;
std::wstring top_center;
std::wstring top_right;
std::wstring bottom_left;
std::wstring bottom_center;
std::wstring bottom_right;
};
} // namespace printing
#endif // PRINTING_PAGE_OVERLAYS_H_

@ -1,92 +0,0 @@
// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/message_loop.h"
#include "base/string16.h"
#include "base/stringprintf.h"
#include "base/utf_string_conversions.h"
#include "printing/page_overlays.h"
#include "printing/print_settings.h"
#include "printing/printed_document.h"
#include "printing/printed_page.h"
#include "printing/printed_pages_source.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
struct Keys {
const wchar_t* key;
const wchar_t* expected;
};
const Keys kOverlayKeys[] = {
{ printing::PageOverlays::kTitle, L"Foobar Document" },
{ printing::PageOverlays::kTime, L"" },
{ printing::PageOverlays::kDate, L"" },
{ printing::PageOverlays::kPage, L"1" },
{ printing::PageOverlays::kPageCount, L"2" },
{ printing::PageOverlays::kPageOnTotal, L"1/2" },
{ printing::PageOverlays::kUrl, L"http://www.perdu.com/" },
};
class PagesSource : public printing::PrintedPagesSource {
public:
virtual string16 RenderSourceName() {
return ASCIIToUTF16("Foobar Document");
}
virtual GURL RenderSourceUrl() {
return GURL("http://www.perdu.com");
}
};
} // namespace
class PageOverlaysTest : public testing::Test {
private:
MessageLoop message_loop_;
};
TEST_F(PageOverlaysTest, StringConversion) {
printing::PageOverlays overlays;
overlays.GetOverlay(printing::PageOverlays::LEFT,
printing::PageOverlays::BOTTOM);
printing::PrintSettings settings;
PagesSource source;
int cookie = 1;
scoped_refptr<printing::PrintedDocument> doc(
new printing::PrintedDocument(settings, &source, cookie));
doc->set_page_count(2);
gfx::Size page_size(100, 100);
gfx::Rect page_content_area(5, 5, 90, 90);
scoped_refptr<printing::PrintedPage> page(
new printing::PrintedPage(1, NULL, page_size, page_content_area, true));
std::wstring input;
std::wstring out;
for (size_t i = 0; i < arraysize(kOverlayKeys); ++i) {
input = base::StringPrintf(L"foo%lsbar", kOverlayKeys[i].key);
out = printing::PageOverlays::ReplaceVariables(input, *doc.get(),
*page.get());
EXPECT_FALSE(out.empty());
if (wcslen(kOverlayKeys[i].expected) == 0)
continue;
std::wstring expected =
base::StringPrintf(L"foo%lsbar", kOverlayKeys[i].expected);
EXPECT_EQ(expected, out) << kOverlayKeys[i].key;
}
// Check if SetOverlay really sets the page overlay.
overlays.SetOverlay(printing::PageOverlays::LEFT,
printing::PageOverlays::TOP,
L"Page {page}");
input = overlays.GetOverlay(printing::PageOverlays::LEFT,
printing::PageOverlays::TOP);
EXPECT_EQ(input, L"Page {page}");
// Replace the variables to see if the page number is correct.
out = printing::PageOverlays::ReplaceVariables(input, *doc.get(),
*page.get());
EXPECT_EQ(out, L"Page 1");
}

@ -82,7 +82,6 @@ bool PrintSettings::Equals(const PrintSettings& rhs) const {
min_shrink == rhs.min_shrink &&
max_shrink == rhs.max_shrink &&
desired_dpi == rhs.desired_dpi &&
overlays.Equals(rhs.overlays) &&
device_name_ == rhs.device_name_ &&
page_setup_device_units_.Equals(rhs.page_setup_device_units_) &&
dpi_ == rhs.dpi_ &&

@ -5,7 +5,8 @@
#ifndef PRINTING_PRINT_SETTINGS_H_
#define PRINTING_PRINT_SETTINGS_H_
#include "printing/page_overlays.h"
#include <string>
#include "printing/page_range.h"
#include "printing/page_setup.h"
#include "ui/gfx/rect.h"
@ -78,9 +79,6 @@ class PrintSettings {
// scaled to ScreenDpi/dpix*desired_dpi.
int desired_dpi;
// The various overlays (headers and footers).
PageOverlays overlays;
// Indicates if the user only wants to print the current selection.
bool selection_only;

@ -19,7 +19,6 @@
#include "base/utf_string_conversions.h"
#include "base/i18n/time_formatting.h"
#include "printing/page_number.h"
#include "printing/page_overlays.h"
#include "printing/printed_pages_source.h"
#include "printing/printed_page.h"
#include "printing/units.h"
@ -180,85 +179,11 @@ int PrintedDocument::expected_page_count() const {
return mutable_.expected_page_count_;
}
void PrintedDocument::PrintHeaderFooter(gfx::NativeDrawingContext context,
const PrintedPage& page,
PageOverlays::HorizontalPosition x,
PageOverlays::VerticalPosition y,
const gfx::Font& font) const {
const PrintSettings& settings = immutable_.settings_;
if (!settings.use_overlays || !page.has_visible_overlays()) {
return;
}
const std::wstring& line = settings.overlays.GetOverlay(x, y);
if (line.empty()) {
return;
}
std::wstring output(PageOverlays::ReplaceVariables(line, *this, page));
if (output.empty()) {
// May happen if document name or url is empty.
return;
}
const gfx::Size string_size(font.GetStringWidth(WideToUTF16Hack(output)),
font.GetHeight());
gfx::Rect bounding;
bounding.set_height(string_size.height());
const gfx::Rect& overlay_area(
settings.page_setup_device_units().overlay_area());
// Hard code .25 cm interstice between overlays. Make sure that some space is
// kept between each headers.
const int interstice = ConvertUnit(250, kHundrethsMMPerInch,
settings.device_units_per_inch());
const int max_width = overlay_area.width() / 3 - interstice;
const int actual_width = std::min(string_size.width(), max_width);
switch (x) {
case PageOverlays::LEFT:
bounding.set_x(overlay_area.x());
bounding.set_width(max_width);
break;
case PageOverlays::CENTER:
bounding.set_x(overlay_area.x() +
(overlay_area.width() - actual_width) / 2);
bounding.set_width(actual_width);
break;
case PageOverlays::RIGHT:
bounding.set_x(overlay_area.right() - actual_width);
bounding.set_width(actual_width);
break;
}
DCHECK_LE(bounding.right(), overlay_area.right());
switch (y) {
case PageOverlays::BOTTOM:
bounding.set_y(overlay_area.bottom() - string_size.height());
break;
case PageOverlays::TOP:
bounding.set_y(overlay_area.y());
break;
}
if (string_size.width() > bounding.width()) {
if (line == PageOverlays::kUrl) {
output = UTF16ToWideHack(ui::ElideUrl(url(), font, bounding.width(),
std::string()));
} else {
output = UTF16ToWideHack(ui::ElideText(WideToUTF16Hack(output),
font, bounding.width(), false));
}
}
DrawHeaderFooter(context, output, bounding);
}
void PrintedDocument::DebugDump(const PrintedPage& page) {
if (!g_debug_dump_info.Get().enabled)
return;
string16 filename;
filename += date();
filename += ASCIIToUTF16("_");
filename += time();
filename += ASCIIToUTF16("_");
filename += name();
filename += ASCIIToUTF16("_");
filename += ASCIIToUTF16(StringPrintf("%02d", page.page_number()));
@ -303,7 +228,6 @@ PrintedDocument::Immutable::Immutable(const PrintSettings& settings,
name_(source->RenderSourceName()),
url_(source->RenderSourceUrl()),
cookie_(cookie) {
SetDocumentDate();
}
PrintedDocument::Immutable::~Immutable() {

@ -98,8 +98,6 @@ class PrintedDocument : public base::RefCountedThreadSafe<PrintedDocument> {
return immutable_.name_;
}
const GURL& url() const { return immutable_.url_; }
const string16& date() const { return immutable_.date_; }
const string16& time() const { return immutable_.time_; }
int cookie() const { return immutable_.cookie_; }
// Sets a path where to dump printing output files for debugging. If never set
@ -154,9 +152,6 @@ class PrintedDocument : public base::RefCountedThreadSafe<PrintedDocument> {
int cookie);
~Immutable();
// Sets the document's |date_| and |time_|.
void SetDocumentDate();
// Print settings used to generate this document. Immutable.
PrintSettings settings_;
@ -169,12 +164,6 @@ class PrintedDocument : public base::RefCountedThreadSafe<PrintedDocument> {
// URL that generated this document. Immutable.
GURL url_;
// The date on which this job started. Immutable.
string16 date_;
// The time at which this job started. Immutable.
string16 time_;
// Cookie to uniquely identify this document. It is used to make sure that a
// PrintedPage is correctly belonging to the PrintedDocument. Since
// PrintedPage generation is completely asynchronous, it could be easy to
@ -184,23 +173,6 @@ class PrintedDocument : public base::RefCountedThreadSafe<PrintedDocument> {
int cookie_;
};
// Prints the headers and footers for one page in the specified context
// according to the current settings.
void PrintHeaderFooter(gfx::NativeDrawingContext context,
const PrintedPage& page,
PageOverlays::HorizontalPosition x,
PageOverlays::VerticalPosition y,
const gfx::Font& font) const;
// Draws the computed |text| into |context| taking into account the bounding
// region |bounds|. |bounds| is the position in which to draw |text| and
// the minimum area needed to contain |text| which may not be larger than the
// header or footer itself.
// TODO(jhawkins): string16.
void DrawHeaderFooter(gfx::NativeDrawingContext context,
std::wstring text,
gfx::Rect bounds) const;
void DebugDump(const PrintedPage& page);
// All writable data member access must be guarded by this lock. Needs to be

@ -34,10 +34,4 @@ void PrintedDocument::RenderPrintedPage(
#endif // !defined(OS_CHROMEOS)
}
void PrintedDocument::DrawHeaderFooter(gfx::NativeDrawingContext context,
std::wstring text,
gfx::Rect bounds) const {
NOTIMPLEMENTED();
}
} // namespace printing

@ -35,14 +35,6 @@ void PrintedDocument::RenderPrintedPage(
const int page_number = 1;
metafile->RenderPage(page_number, context, content_area.ToCGRect(),
false, false, false, false);
// TODO(stuartmorgan): Print the header and footer.
}
void PrintedDocument::DrawHeaderFooter(gfx::NativeDrawingContext context,
std::wstring text,
gfx::Rect bounds) const {
NOTIMPLEMENTED();
}
} // namespace printing

@ -1,21 +0,0 @@
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "printing/printed_document.h"
#include "base/i18n/time_formatting.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
using base::Time;
namespace printing {
void PrintedDocument::Immutable::SetDocumentDate() {
Time now = Time::Now();
date_ = base::TimeFormatShortDateNumeric(now);
time_ = base::TimeFormatTimeOfDay(now);
}
} // namespace printing

@ -5,15 +5,11 @@
#include "printing/printed_document.h"
#include "base/logging.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "printing/page_number.h"
#include "printing/page_overlays.h"
#include "printing/printed_pages_source.h"
#include "printing/printed_page.h"
#include "printing/units.h"
#include "skia/ext/platform_device.h"
#include "ui/gfx/font.h"
namespace {
@ -33,46 +29,6 @@ void DrawRect(HDC context, gfx::Rect rect) {
Rectangle(context, rect.x(), rect.y(), rect.right(), rect.bottom());
}
// Creates a string interpretation of the time of day represented by the given
// SYSTEMTIME that's appropriate for the user's default locale.
// Format can be an empty string (for the default format), or a "format picture"
// as specified in the Windows documentation for GetTimeFormat().
string16 FormatSystemTime(const SYSTEMTIME& time, const string16& format) {
// If the format string is empty, just use the default format.
LPCTSTR format_ptr = NULL;
if (!format.empty())
format_ptr = format.c_str();
int buffer_size = GetTimeFormat(LOCALE_USER_DEFAULT, NULL, &time, format_ptr,
NULL, 0);
string16 output;
GetTimeFormat(LOCALE_USER_DEFAULT, NULL, &time, format_ptr,
WriteInto(&output, buffer_size), buffer_size);
return output;
}
// Creates a string interpretation of the date represented by the given
// SYSTEMTIME that's appropriate for the user's default locale.
// Format can be an empty string (for the default format), or a "format picture"
// as specified in the Windows documentation for GetDateFormat().
string16 FormatSystemDate(const SYSTEMTIME& date, const string16& format) {
// If the format string is empty, just use the default format.
LPCTSTR format_ptr = NULL;
if (!format.empty())
format_ptr = format.c_str();
int buffer_size = GetDateFormat(LOCALE_USER_DEFAULT, NULL, &date, format_ptr,
NULL, 0);
string16 output;
GetDateFormat(LOCALE_USER_DEFAULT, NULL, &date, format_ptr,
WriteInto(&output, buffer_size), buffer_size);
return output;
}
} // namespace
namespace printing {
@ -122,68 +78,6 @@ void PrintedDocument::RenderPrintedPage(
DCHECK_NE(res, 0);
}
// Print the header and footer. Offset by printable area offset (see comment
// above).
SimpleModifyWorldTransform(
context,
-page_setup.printable_area().x(),
-page_setup.printable_area().y(),
1);
int base_font_size = gfx::Font().GetHeight();
int new_font_size = ConvertUnit(10,
immutable_.settings_.desired_dpi,
immutable_.settings_.device_units_per_inch());
DCHECK_GT(new_font_size, base_font_size);
gfx::Font font(gfx::Font().DeriveFont(new_font_size - base_font_size));
HGDIOBJ old_font = SelectObject(context, font.GetNativeFont());
DCHECK(old_font != NULL);
// We don't want a white square around the text ever if overflowing.
SetBkMode(context, TRANSPARENT);
// Disabling printing the header/footer on Windows for now to make the
// behavior consistent with Mac/Linux.
// TODO(thestig) re-enable this for print preview.
#if 0
PrintHeaderFooter(context, page, PageOverlays::LEFT, PageOverlays::TOP,
font);
PrintHeaderFooter(context, page, PageOverlays::CENTER, PageOverlays::TOP,
font);
PrintHeaderFooter(context, page, PageOverlays::RIGHT, PageOverlays::TOP,
font);
PrintHeaderFooter(context, page, PageOverlays::LEFT, PageOverlays::BOTTOM,
font);
PrintHeaderFooter(context, page, PageOverlays::CENTER, PageOverlays::BOTTOM,
font);
PrintHeaderFooter(context, page, PageOverlays::RIGHT, PageOverlays::BOTTOM,
font);
#endif
int res = RestoreDC(context, saved_state);
DCHECK_NE(res, 0);
}
void PrintedDocument::Immutable::SetDocumentDate() {
// Use the native time formatting for printing on Windows.
SYSTEMTIME systemtime;
GetLocalTime(&systemtime);
date_ =
WideToUTF16Hack(FormatSystemDate(systemtime, std::wstring()));
time_ =
WideToUTF16Hack(FormatSystemTime(systemtime, std::wstring()));
}
void PrintedDocument::DrawHeaderFooter(gfx::NativeDrawingContext context,
std::wstring text,
gfx::Rect bounds) const {
// Save the state for the clipping region.
int saved_state = SaveDC(context);
DCHECK_NE(saved_state, 0);
int result = IntersectClipRect(context, bounds.x(), bounds.y(),
bounds.right() + 1, bounds.bottom() + 1);
DCHECK(result == SIMPLEREGION || result == COMPLEXREGION);
TextOut(context,
bounds.x(), bounds.y(),
text.c_str(),
static_cast<int>(text.size()));
int res = RestoreDC(context, saved_state);
DCHECK_NE(res, 0);
}

@ -42,8 +42,6 @@
'metafile_skia_wrapper.cc',
'page_number.cc',
'page_number.h',
'page_overlays.cc',
'page_overlays.h',
'page_range.cc',
'page_range.h',
'page_setup.cc',
@ -58,7 +56,6 @@
'printed_document.cc',
'printed_document.h',
'printed_document_mac.cc',
'printed_document_posix.cc',
'printed_document_win.cc',
'printed_page.cc',
'printed_page.h',
@ -171,7 +168,6 @@
'emf_win_unittest.cc',
'printing_test.h',
'page_number_unittest.cc',
'page_overlays_unittest.cc',
'page_range_unittest.cc',
'page_setup_unittest.cc',
'pdf_metafile_cairo_linux_unittest.cc',