Skip to content

Commit

Permalink
Adds the ability for script to resize the menu.
Browse files Browse the repository at this point in the history
BUG=23261
TEST=none

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27403 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
sky@chromium.org committed Sep 28, 2009
1 parent 2598096 commit 3676406
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 120 deletions.
40 changes: 36 additions & 4 deletions chrome/browser/chromeos/main_menu.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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";

Expand All @@ -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);
Expand All @@ -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(),
Expand Down Expand Up @@ -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()) {
Expand Down
5 changes: 3 additions & 2 deletions chrome/browser/chromeos/main_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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_;
Expand Down
4 changes: 2 additions & 2 deletions chrome/browser/views/location_bar_view.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
141 changes: 79 additions & 62 deletions views/painter.cc
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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,
Expand All @@ -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);
Expand All @@ -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)
Expand Down
62 changes: 12 additions & 50 deletions views/painter.h
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3676406

Please sign in to comment.