summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/main_menu.cc40
-rw-r--r--chrome/browser/chromeos/main_menu.h5
-rw-r--r--chrome/browser/views/location_bar_view.cc4
-rw-r--r--views/painter.cc141
-rw-r--r--views/painter.h62
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