Index: chrome/browser/views/detachable_toolbar_view.cc |
=================================================================== |
--- chrome/browser/views/detachable_toolbar_view.cc (revision 0) |
+++ chrome/browser/views/detachable_toolbar_view.cc (revision 0) |
@@ -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()); |
+ } |
+ } |
+} |