summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views/detachable_toolbar_view.cc
diff options
context:
space:
mode:
authorfinnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-14 23:40:15 +0000
committerfinnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-14 23:40:15 +0000
commit447a51cad97fe5413535c28dae5265ee1ad3c9cc (patch)
treea0914e5f83908a2290f7bae3d7c1f280682627ec /chrome/browser/views/detachable_toolbar_view.cc
parentfec7dc520f31a2234bffe060a33c4356fe4a5d4c (diff)
downloadchromium_src-447a51cad97fe5413535c28dae5265ee1ad3c9cc.zip
chromium_src-447a51cad97fe5413535c28dae5265ee1ad3c9cc.tar.gz
chromium_src-447a51cad97fe5413535c28dae5265ee1ad3c9cc.tar.bz2
ExtensionShelf now uses the BookmarkExtensionBackground, just like the BookmarkBarView.
Changed the WebKit API to add an optional |id| parameter to the insertStyleText, which is needed to be able to replace style sheets that have been previously added. Added an interface that both BookmarkBarView and ExtensionShelf implement. This new interface tells us whether we are located at the top or at the bottom and whether we are detached from the frame or not. Factored out some of the duplicate painting-related code to a namespace of its own. Not happy with the name (welcome suggestions). Moved the check for whether extensions are on top to new class and now cache the value for the lifetime of the process. Toolstrip text color values are no longer hard-coded but use the color specified in the theme. Decreased the timeouts for showing and hiding the toolstrip handle. Replaced the pressed background image and the hover background image for the toolstrip to match what the bookmark bar uses. Known issues: Some themes expose the fact that: - The background for the extension shelf when in detached mode (and located on the bottom) does not seamlessly blend in with background of new tab page. Still works surprisingly well when it breaks, though. - Didn't spend much time theming the shelf handle (just used the solid color from the theme). BUG=18452, 21272, 21273 TEST=Install a theme for Chrome and make sure everything looks correct and is updated on a theme change. Also make sure painting problems in bugs 21272 and 21273 are fixed. Review URL: http://codereview.chromium.org/203034 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26178 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/detachable_toolbar_view.cc')
-rw-r--r--chrome/browser/views/detachable_toolbar_view.cc262
1 files changed, 262 insertions, 0 deletions
diff --git a/chrome/browser/views/detachable_toolbar_view.cc b/chrome/browser/views/detachable_toolbar_view.cc
new file mode 100644
index 0000000..9cc81d2
--- /dev/null
+++ b/chrome/browser/views/detachable_toolbar_view.cc
@@ -0,0 +1,262 @@
+// 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 "chrome/browser/views/detachable_toolbar_view.h"
+
+#include "app/gfx/canvas.h"
+#include "chrome/browser/browser_theme_provider.h"
+#include "grit/theme_resources.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+
+// How round the 'new tab' style bookmarks bar is.
+static const int kNewtabBarRoundness = 5;
+
+// static
+void DetachableToolbarView::PaintBackgroundDetachedMode(gfx::Canvas* canvas,
+ views::View* view) {
+ int browser_height = view->GetParent()->GetBounds(
+ views::View::APPLY_MIRRORING_TRANSFORMATION).height();
+
+ // Draw the background to match the new tab page.
+ ThemeProvider* tp = view->GetThemeProvider();
+ canvas->FillRectInt(tp->GetColor(BrowserThemeProvider::COLOR_NTP_BACKGROUND),
+ 0, 0, view->width(), view->height());
+
+ if (tp->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
+ int tiling = BrowserThemeProvider::NO_REPEAT;
+ tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_TILING,
+ &tiling);
+ int alignment;
+ if (tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT,
+ &alignment)) {
+ SkBitmap* ntp_background = tp->GetBitmapNamed(IDR_THEME_NTP_BACKGROUND);
+
+ if (alignment & BrowserThemeProvider::ALIGN_TOP) {
+ PaintThemeBackgroundTopAligned(
+ canvas, ntp_background, tiling, alignment,
+ view->width(), view->height());
+ } else {
+ PaintThemeBackgroundBottomAligned(
+ canvas, ntp_background, tiling, alignment,
+ view->width(), view->height(), browser_height);
+ }
+ }
+ }
+}
+
+// static
+void DetachableToolbarView::PaintBackgroundAttachedMode(gfx::Canvas* canvas,
+ views::View* view) {
+ gfx::Rect bounds =
+ view->GetBounds(views::View::APPLY_MIRRORING_TRANSFORMATION);
+
+ ThemeProvider* tp = view->GetThemeProvider();
+ SkColor theme_toolbar_color =
+ tp->GetColor(BrowserThemeProvider::COLOR_TOOLBAR);
+ canvas->FillRectInt(theme_toolbar_color, 0, 0,
+ view->width(), view->height());
+
+ canvas->TileImageInt(*tp->GetBitmapNamed(IDR_THEME_TOOLBAR),
+ view->GetParent()->GetBounds(
+ views::View::APPLY_MIRRORING_TRANSFORMATION).x() + bounds.x(),
+ bounds.y(), 0, 0, view->width(), view->height());
+}
+
+// static
+void DetachableToolbarView::CalculateContentArea(
+ double animation_state, double horizontal_padding,
+ double vertical_padding, SkRect* rect,
+ double* roundness, views::View* view) {
+ // The 0.5 is to correct for Skia's "draw on pixel boundaries"ness.
+ rect->set(SkDoubleToScalar(horizontal_padding - 0.5),
+ SkDoubleToScalar(vertical_padding - 0.5),
+ SkDoubleToScalar(view->width() - horizontal_padding - 0.5),
+ SkDoubleToScalar(view->height() - vertical_padding - 0.5));
+
+ *roundness = static_cast<double>(kNewtabBarRoundness) * animation_state;
+}
+
+// static
+void DetachableToolbarView::PaintHorizontalBorder(gfx::Canvas* canvas,
+ DetachableToolbarView* view) {
+ // Border can be at the top or at the bottom of the view depending on whether
+ // the view (bar/shelf) is at the top/at the bottom and whether it is attached
+ // or detached.
+ int y = view->IsOnTop() == !view->IsDetached() ? view->height() - 1 : 0;
+ canvas->FillRectInt(ResourceBundle::toolbar_separator_color,
+ 0, y, view->width(), 1);
+}
+
+// static
+void DetachableToolbarView::PaintContentAreaBackground(
+ gfx::Canvas* canvas, ThemeProvider* theme_provider,
+ const SkRect& rect, double roundness) {
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setColor(theme_provider->GetColor(BrowserThemeProvider::COLOR_TOOLBAR));
+
+ canvas->drawRoundRect(
+ rect, SkDoubleToScalar(roundness), SkDoubleToScalar(roundness), paint);
+}
+
+// static
+void DetachableToolbarView::PaintContentAreaBorder(
+ gfx::Canvas* canvas, ThemeProvider* theme_provider,
+ const SkRect& rect, double roundness) {
+ SkPaint border_paint;
+ border_paint.setColor(
+ theme_provider->GetColor(BrowserThemeProvider::COLOR_NTP_HEADER));
+ border_paint.setStyle(SkPaint::kStroke_Style);
+ border_paint.setAlpha(96);
+ border_paint.setAntiAlias(true);
+
+ canvas->drawRoundRect(rect,
+ SkDoubleToScalar(roundness),
+ SkDoubleToScalar(roundness), border_paint);
+}
+
+// static
+void DetachableToolbarView::PaintVerticalDivider(
+ gfx::Canvas* canvas, int x, int height, int vertical_padding,
+ const SkColor& top_color,
+ const SkColor& middle_color,
+ const SkColor& bottom_color) {
+ // Draw the upper half of the divider.
+ SkPaint paint;
+ paint.setShader(skia::CreateGradientShader(vertical_padding + 1,
+ height / 2,
+ top_color,
+ middle_color))->safeUnref();
+ SkRect rc = { SkIntToScalar(x),
+ SkIntToScalar(vertical_padding + 1),
+ SkIntToScalar(x + 1),
+ SkIntToScalar(height / 2) };
+ canvas->drawRect(rc, paint);
+
+ // Draw the lower half of the divider.
+ SkPaint paint_down;
+ paint_down.setShader(skia::CreateGradientShader(height / 2,
+ height - vertical_padding,
+ middle_color,
+ bottom_color))->safeUnref();
+ SkRect rc_down = { SkIntToScalar(x),
+ SkIntToScalar(height / 2),
+ SkIntToScalar(x + 1),
+ SkIntToScalar(height - vertical_padding) };
+ canvas->drawRect(rc_down, paint_down);
+}
+
+// static
+void DetachableToolbarView::PaintThemeBackgroundTopAligned(
+ gfx::Canvas* canvas, SkBitmap* ntp_background, int tiling, int alignment,
+ int width, int height) {
+ if (alignment & BrowserThemeProvider::ALIGN_LEFT) {
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, 0, 0, width, height);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, 0, 0, width,
+ ntp_background->height());
+ } else {
+ canvas->TileImageInt(*ntp_background, 0, 0,
+ ntp_background->width(), ntp_background->height());
+ }
+ } else if (alignment & BrowserThemeProvider::ALIGN_RIGHT) {
+ int x_pos = width % ntp_background->width() - ntp_background->width();
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, x_pos, 0,
+ width + ntp_background->width(), height);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, x_pos,
+ 0, width + ntp_background->width(), ntp_background->height());
+ } else {
+ canvas->TileImageInt(*ntp_background, width - ntp_background->width(),
+ 0, ntp_background->width(), ntp_background->height());
+ }
+ } else { // ALIGN == CENTER
+ int x_pos = width > ntp_background->width() ?
+ ((width / 2 - ntp_background->width() / 2) %
+ ntp_background->width()) - ntp_background->width() :
+ width / 2 - ntp_background->width() / 2;
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, x_pos, 0,
+ width + ntp_background->width(), height);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, x_pos, 0,
+ width + ntp_background->width(),
+ ntp_background->height());
+ } else {
+ canvas->TileImageInt(*ntp_background,
+ width / 2 - ntp_background->width() / 2,
+ 0, ntp_background->width(), ntp_background->height());
+ }
+ }
+}
+
+// static
+void DetachableToolbarView::PaintThemeBackgroundBottomAligned(
+ gfx::Canvas* canvas, SkBitmap* ntp_background, int tiling, int alignment,
+ int width, int height, int browser_height) {
+ int border_width = 5;
+ int y_pos = ((tiling == BrowserThemeProvider::REPEAT_X) ||
+ (tiling == BrowserThemeProvider::NO_REPEAT)) ?
+ browser_height - ntp_background->height() - height - border_width :
+ browser_height % ntp_background->height() - height - border_width -
+ ntp_background->height();
+
+ if (alignment & BrowserThemeProvider::ALIGN_LEFT) {
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, 0, y_pos, width,
+ 2 * height + ntp_background->height() + 5);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, 0, y_pos, width,
+ ntp_background->height());
+ } else if (tiling == BrowserThemeProvider::REPEAT_Y) {
+ canvas->TileImageInt(*ntp_background, 0, y_pos,
+ ntp_background->width(),
+ 2 * height + ntp_background->height() + 5);
+ } else {
+ canvas->TileImageInt(*ntp_background, 0, y_pos, ntp_background->width(),
+ ntp_background->height());
+ }
+ } else if (alignment & BrowserThemeProvider::ALIGN_RIGHT) {
+ int x_pos = width % ntp_background->width() - ntp_background->width();
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, x_pos, y_pos,
+ width + ntp_background->width(),
+ 2 * height + ntp_background->height() + 5);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, x_pos, y_pos,
+ width + ntp_background->width(), ntp_background->height());
+ } else if (tiling == BrowserThemeProvider::REPEAT_Y) {
+ canvas->TileImageInt(*ntp_background, width - ntp_background->width(),
+ y_pos, ntp_background->width(),
+ 2 * height + ntp_background->height() + 5);
+ } else {
+ canvas->TileImageInt(*ntp_background, width - ntp_background->width(),
+ y_pos, ntp_background->width(), ntp_background->height());
+ }
+ } else { // ALIGN == CENTER
+ int x_pos = width > ntp_background->width() ?
+ ((width / 2 - ntp_background->width() / 2) %
+ ntp_background->width()) - ntp_background->width() :
+ width / 2 - ntp_background->width() / 2;
+ if (tiling == BrowserThemeProvider::REPEAT) {
+ canvas->TileImageInt(*ntp_background, x_pos, y_pos,
+ width + ntp_background->width(),
+ 2 * height + ntp_background->height() + 5);
+ } else if (tiling == BrowserThemeProvider::REPEAT_X) {
+ canvas->TileImageInt(*ntp_background, x_pos, y_pos,
+ width + ntp_background->width(), ntp_background->height());
+ } else if (tiling == BrowserThemeProvider::REPEAT_Y) {
+ canvas->TileImageInt(*ntp_background,
+ width / 2 - ntp_background->width() / 2,
+ y_pos, ntp_background->width(),
+ 2 * height + ntp_background->height() + 5);
+ } else {
+ canvas->TileImageInt(*ntp_background,
+ width / 2 - ntp_background->width() / 2,
+ y_pos, ntp_background->width(), ntp_background->height());
+ }
+ }
+}