diff options
-rw-r--r-- | chrome/browser/chromeos/main_menu.cc | 40 | ||||
-rw-r--r-- | chrome/browser/chromeos/main_menu.h | 5 | ||||
-rw-r--r-- | chrome/browser/views/location_bar_view.cc | 4 | ||||
-rw-r--r-- | views/painter.cc | 141 | ||||
-rw-r--r-- | views/painter.h | 62 |
5 files changed, 132 insertions, 120 deletions
diff --git a/chrome/browser/chromeos/main_menu.cc b/chrome/browser/chromeos/main_menu.cc index 0b80e3b..5d57217 100644 --- a/chrome/browser/chromeos/main_menu.cc +++ b/chrome/browser/chromeos/main_menu.cc @@ -4,6 +4,7 @@ #include "chrome/browser/chromeos/main_menu.h" +#include "app/gfx/insets.h" #include "app/resource_bundle.h" #include "base/message_loop.h" #include "chrome/browser/browser.h" @@ -17,14 +18,26 @@ #include "grit/app_resources.h" #include "grit/generated_resources.h" #include "third_party/skia/include/core/SkBitmap.h" -#include "views/controls/image_view.h" +#include "views/background.h" +#include "views/painter.h" +#include "views/widget/root_view.h" #include "views/widget/widget_gtk.h" +// Initial size of the renderer. This is contained within a window whose size +// is set to the size of the image IDR_MAIN_MENU_BUTTON_DROP_DOWN. static const int kRendererX = 0; static const int kRendererY = 25; static const int kRendererWidth = 250; static const int kRendererHeight = 400; +// Insets defining the regions that are stretched and titled to create the +// background of the popup. These constants are fed into +// Painter::CreateImagePainter as the insets, see it for details. +static const int kBackgroundImageTop = 27; +static const int kBackgroundImageLeft = 85; +static const int kBackgroundImageBottom = 10; +static const int kBackgroundImageRight = 8; + // URL of the page to load. static const char kMenuURL[] = "http://goto.ext.google.com/crux-menu"; @@ -50,8 +63,6 @@ MainMenu::MainMenu(Browser* browser) void MainMenu::ShowImpl() { SkBitmap* drop_down_image = ResourceBundle::GetSharedInstance(). GetBitmapNamed(IDR_MAIN_MENU_BUTTON_DROP_DOWN); - views::ImageView* background_view = new views::ImageView(); - background_view->SetImage(drop_down_image); views::WidgetGtk* menu_popup = new views::WidgetGtk(views::WidgetGtk::TYPE_POPUP); @@ -61,7 +72,12 @@ void MainMenu::ShowImpl() { menu_popup->Init(NULL, gfx::Rect(0, 0, drop_down_image->width(), drop_down_image->height())); - menu_popup->SetContentsView(background_view); + views::Painter* painter = views::Painter::CreateImagePainter( + *drop_down_image, + gfx::Insets(kBackgroundImageTop, kBackgroundImageLeft, + kBackgroundImageBottom, kBackgroundImageRight)); + menu_popup->GetRootView()->set_background( + views::Background::CreateBackgroundPainter(true, painter)); GURL menu_url(kMenuURL); site_instance_ = SiteInstance::CreateSiteInstanceForURL(browser_->profile(), @@ -124,6 +140,22 @@ gboolean MainMenu::OnButtonPressEvent(GtkWidget* widget, return FALSE; } +void MainMenu::RequestMove(const gfx::Rect& new_bounds) { + SkBitmap* drop_down_image = ResourceBundle::GetSharedInstance(). + GetBitmapNamed(IDR_MAIN_MENU_BUTTON_DROP_DOWN); + int new_w = drop_down_image->width() + (new_bounds.width() - kRendererWidth); + int new_h = drop_down_image->height() + + (new_bounds.height() - kRendererHeight); + // Invoking PositionChild results in a gtk signal that triggers attempting to + // to resize the window. We need to set the size request so that it resizes + // correctly when this happens. + gtk_widget_set_size_request(popup_->GetNativeView(), new_w, new_h); + popup_->PositionChild(rwhv_->GetNativeView(), kRendererX, kRendererY, + new_bounds.width(), new_bounds.height()); + popup_->SetBounds(gfx::Rect(0, 0, new_w, new_h)); + rwhv_->SetSize(new_bounds.size()); +} + void MainMenu::CreateNewWindow(int route_id, base::WaitableEvent* modal_dialog_event) { if (pending_contents_.get()) { diff --git a/chrome/browser/chromeos/main_menu.h b/chrome/browser/chromeos/main_menu.h index acb6fed..0f4f257 100644 --- a/chrome/browser/chromeos/main_menu.h +++ b/chrome/browser/chromeos/main_menu.h @@ -17,7 +17,7 @@ class RenderWidgetHostViewGtk; class SiteInstance; namespace views { -class Widget; +class WidgetGtk; } // MainMenu manages showing the main menu. The menu is currently an HTML page. @@ -114,6 +114,7 @@ class MainMenu : public RenderViewHostDelegate, virtual RenderViewHostDelegate::View* GetViewDelegate() { return this; } + virtual void RequestMove(const gfx::Rect& new_bounds); // RenderViewHostDelegate::View overrides. virtual void CreateNewWindow(int route_id, @@ -141,7 +142,7 @@ class MainMenu : public RenderViewHostDelegate, Browser* browser_; // The widget displaying the rwvh_. - views::Widget* popup_; + views::WidgetGtk* popup_; // SiteInstance for the RenderViewHosts we create. SiteInstance* site_instance_; diff --git a/chrome/browser/views/location_bar_view.cc b/chrome/browser/views/location_bar_view.cc index ad21eeb..e558dd2 100644 --- a/chrome/browser/views/location_bar_view.cc +++ b/chrome/browser/views/location_bar_view.cc @@ -736,8 +736,8 @@ void LocationBarView::SetAccessibleName(const std::wstring& name) { // SelectedKeywordView ------------------------------------------------------- -// The background is drawn using ImagePainter3. This is the left/center/right -// image names. +// The background is drawn using HorizontalPainter. This is the +// left/center/right image names. static const int kBorderImages[] = { IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_L, IDR_LOCATION_BAR_SELECTED_KEYWORD_BACKGROUND_C, diff --git a/views/painter.cc b/views/painter.cc index 438c851..c710158 100644 --- a/views/painter.cc +++ b/views/painter.cc @@ -1,10 +1,11 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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 "views/painter.h" #include "app/gfx/canvas.h" +#include "app/gfx/insets.h" #include "app/resource_bundle.h" #include "base/logging.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -54,7 +55,77 @@ class GradientPainter : public Painter { }; -} +class ImagePainter : public Painter { + public: + ImagePainter(const SkBitmap& image, const gfx::Insets& insets) + : image_(image), + insets_(insets) { + DCHECK(image.width() > insets.width() && + image.height() > insets.height()); + } + + // Paints the images. + virtual void Paint(int w, int h, gfx::Canvas* canvas) { + if (w == image_.width() && h == image_.height()) { + // Early out if the size we're to render at equals the size of the image. + canvas->DrawBitmapInt(image_, 0, 0); + return; + } + // Upper left. + canvas->DrawBitmapInt(image_, 0, 0, insets_.left(), insets_.top(), + 0, 0, insets_.left(), insets_.top(), true); + // Top edge. + canvas->DrawBitmapInt( + image_, + insets_.left(), 0, image_.width() - insets_.width(), insets_.top(), + insets_.left(), 0, w - insets_.width(), insets_.top(), true); + // Upper right. + canvas->DrawBitmapInt( + image_, + image_.width() - insets_.right(), 0, insets_.right(), insets_.top(), + w - insets_.right(), 0, insets_.right(), insets_.top(), true); + // Right edge. + canvas->DrawBitmapInt( + image_, + image_.width() - insets_.right(), insets_.top(), + insets_.right(), image_.height() - insets_.height(), + w - insets_.right(), insets_.top(), insets_.right(), + h - insets_.height(), true); + // Bottom right. + canvas->DrawBitmapInt( + image_, + image_.width() - insets_.right(), image_.height() - insets_.bottom(), + insets_.right(), insets_.bottom(), + w - insets_.right(), h - insets_.bottom(), insets_.right(), + insets_.bottom(), true); + // Bottom edge. + canvas->DrawBitmapInt( + image_, + insets_.left(), image_.height() - insets_.bottom(), + image_.width() - insets_.width(), insets_.bottom(), + insets_.left(), h - insets_.bottom(), w - insets_.width(), + insets_.bottom(), true); + // Bottom left. + canvas->DrawBitmapInt( + image_, + 0, image_.height() - insets_.bottom(), insets_.left(), + insets_.bottom(), + 0, h - insets_.bottom(), insets_.left(), insets_.bottom(), true); + // Left. + canvas->DrawBitmapInt( + image_, + 0, insets_.top(), insets_.left(), image_.height() - insets_.height(), + 0, insets_.top(), insets_.left(), h - insets_.height(), true); + } + + private: + const SkBitmap image_; + const gfx::Insets insets_; + + DISALLOW_COPY_AND_ASSIGN(ImagePainter); +}; + +} // namespace // static void Painter::PaintPainterAt(int x, int y, int w, int h, @@ -68,66 +139,6 @@ void Painter::PaintPainterAt(int x, int y, int w, int h, canvas->restore(); } -ImagePainter::ImagePainter(const int image_resource_names[], - bool draw_center) - : draw_center_(draw_center) { - DCHECK(image_resource_names); - ResourceBundle& rb = ResourceBundle::GetSharedInstance(); - for (int i = 0, max = draw_center ? 9 : 8; i < max; ++i) - images_.push_back(rb.GetBitmapNamed(image_resource_names[i])); -} - -void ImagePainter::Paint(int w, int h, gfx::Canvas* canvas) { - canvas->DrawBitmapInt(*images_[BORDER_TOP_LEFT], 0, 0); - canvas->TileImageInt(*images_[BORDER_TOP], - images_[BORDER_TOP_LEFT]->width(), - 0, - w - images_[BORDER_TOP_LEFT]->width() - - images_[BORDER_TOP_RIGHT]->width(), - images_[BORDER_TOP_LEFT]->height()); - canvas->DrawBitmapInt(*images_[BORDER_TOP_RIGHT], - w - images_[BORDER_TOP_RIGHT]->width(), - 0); - canvas->TileImageInt(*images_[BORDER_RIGHT], - w - images_[BORDER_RIGHT]->width(), - images_[BORDER_TOP_RIGHT]->height(), - images_[BORDER_RIGHT]->width(), - h - images_[BORDER_TOP_RIGHT]->height() - - images_[BORDER_BOTTOM_RIGHT]->height()); - canvas->DrawBitmapInt(*images_[BORDER_BOTTOM_RIGHT], - w - images_[BORDER_BOTTOM_RIGHT]->width(), - h - images_[BORDER_BOTTOM_RIGHT]->height()); - canvas->TileImageInt(*images_[BORDER_BOTTOM], - images_[BORDER_BOTTOM_LEFT]->width(), - h - images_[BORDER_BOTTOM]->height(), - w - images_[BORDER_BOTTOM_LEFT]->width() - - images_[BORDER_BOTTOM_RIGHT]->width(), - images_[BORDER_BOTTOM]->height()); - canvas->DrawBitmapInt(*images_[BORDER_BOTTOM_LEFT], - 0, - h - images_[BORDER_BOTTOM_LEFT]->height()); - canvas->TileImageInt(*images_[BORDER_LEFT], - 0, - images_[BORDER_TOP_LEFT]->height(), - images_[BORDER_LEFT]->width(), - h - images_[BORDER_TOP_LEFT]->height() - - images_[BORDER_BOTTOM_LEFT]->height()); - if (draw_center_) { - canvas->DrawBitmapInt(*images_[BORDER_CENTER], - 0, - 0, - images_[BORDER_CENTER]->width(), - images_[BORDER_CENTER]->height(), - images_[BORDER_TOP_LEFT]->width(), - images_[BORDER_TOP_LEFT]->height(), - w - images_[BORDER_TOP_LEFT]->width() - - images_[BORDER_TOP_RIGHT]->width(), - h - images_[BORDER_TOP_LEFT]->height() - - images_[BORDER_TOP_RIGHT]->height(), - false); - } -} - // static Painter* Painter::CreateHorizontalGradient(SkColor c1, SkColor c2) { return new GradientPainter(true, c1, c2); @@ -138,6 +149,12 @@ Painter* Painter::CreateVerticalGradient(SkColor c1, SkColor c2) { return new GradientPainter(false, c1, c2); } +// static +Painter* Painter::CreateImagePainter(const SkBitmap& image, + const gfx::Insets& insets) { + return new ImagePainter(image, insets); +} + HorizontalPainter::HorizontalPainter(const int image_resource_names[]) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); for (int i = 0; i < 3; ++i) diff --git a/views/painter.h b/views/painter.h index 9cef45f..40e5db3 100644 --- a/views/painter.h +++ b/views/painter.h @@ -1,17 +1,16 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. #ifndef VIEWS_PAINTER_H_ #define VIEWS_PAINTER_H_ -#include <vector> - #include "base/basictypes.h" #include "third_party/skia/include/core/SkColor.h" namespace gfx { class Canvas; +class Insets; } class SkBitmap; @@ -31,58 +30,21 @@ class Painter { static Painter* CreateHorizontalGradient(SkColor c1, SkColor c2); static Painter* CreateVerticalGradient(SkColor c1, SkColor c2); + // Creates a painter that divides |image| into nine regions. The four corners + // are rendered at the size specified in insets (for example, the upper + // left corners is rendered at 0x0 with a size of + // insets.left()xinsets.right()). The four edges are stretched to fill the + // destination size. + // Ownership is passed to the caller. + static Painter* CreateImagePainter(const SkBitmap& image, + const gfx::Insets& insets); + virtual ~Painter() {} // Paints the painter in the specified region. virtual void Paint(int w, int h, gfx::Canvas* canvas) = 0; }; -// ImagePainter paints 8 (or 9) images into a box. The four corner -// images are drawn at the size of the image, the top/left/bottom/right -// images are tiled to fit the area, and the center (if rendered) is -// stretched. -class ImagePainter : public Painter { - public: - enum BorderElements { - BORDER_TOP_LEFT = 0, - BORDER_TOP, - BORDER_TOP_RIGHT, - BORDER_RIGHT, - BORDER_BOTTOM_RIGHT, - BORDER_BOTTOM, - BORDER_BOTTOM_LEFT, - BORDER_LEFT, - BORDER_CENTER - }; - - // Constructs a new ImagePainter loading the specified image names. - // The images must be in the order defined by the BorderElements. - // If draw_center is false, there must be 8 image names, if draw_center - // is true, there must be 9 image names with the last giving the name - // of the center image. - ImagePainter(const int image_resource_names[], - bool draw_center); - - virtual ~ImagePainter() {} - - // Paints the images. - virtual void Paint(int w, int h, gfx::Canvas* canvas); - - // Returns the specified image. The returned image should NOT be deleted. - SkBitmap* GetImage(BorderElements element) { - return images_[element]; - } - - private: - bool tile_; - bool draw_center_; - bool tile_center_; - // NOTE: the images are owned by ResourceBundle. Don't free them. - std::vector<SkBitmap*> images_; - - DISALLOW_EVIL_CONSTRUCTORS(ImagePainter); -}; - // HorizontalPainter paints 3 images into a box: left, center and right. The // left and right images are drawn to size at the left/right edges of the // region. The center is tiled in the remaining space. All images must have the @@ -114,7 +76,7 @@ class HorizontalPainter : public Painter { // NOTE: the images are owned by ResourceBundle. Don't free them. SkBitmap* images_[3]; - DISALLOW_EVIL_CONSTRUCTORS(HorizontalPainter); + DISALLOW_COPY_AND_ASSIGN(HorizontalPainter); }; } // namespace views |