15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_VIEWS_BUBBLE_BUBBLE_BORDER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_BUBBLE_BUBBLE_BORDER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/image/image_skia.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/border.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Rect;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Painter;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace internal {
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// A helper that combines each border image-set painter with arrows and metrics.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct BorderImages {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BorderImages(const int border_image_ids[],
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               const int arrow_image_ids[],
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               int border_interior_thickness,
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               int arrow_interior_thickness,
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               int corner_radius);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~BorderImages();
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<Painter> border_painter;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ImageSkia left_arrow;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ImageSkia top_arrow;
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ImageSkia right_arrow;
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::ImageSkia bottom_arrow;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The thickness of border and arrow images and their interior areas.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Thickness is the width of left/right and the height of top/bottom images.
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The interior is measured without including stroke or shadow pixels.
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int border_thickness;
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int border_interior_thickness;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int arrow_thickness;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int arrow_interior_thickness;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The corner radius of the bubble's rounded-rect interior area.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int corner_radius;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace internal
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renders a border, with optional arrow, and a custom dropshadow.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This can be used to produce floating "bubble" objects with rounded corners.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT BubbleBorder : public Border {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Possible locations for the (optional) arrow.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0 bit specifies left or right.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 bit specifies top or bottom.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2 bit specifies horizontal or vertical.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3 bit specifies whether the arrow at the center of its residing edge.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum ArrowMask {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RIGHT    = 0x01,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOTTOM   = 0x02,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VERTICAL = 0x04,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CENTER   = 0x08,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum Arrow {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOP_LEFT      = 0,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOP_RIGHT     = RIGHT,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOTTOM_LEFT   = BOTTOM,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOTTOM_RIGHT  = BOTTOM | RIGHT,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LEFT_TOP      = VERTICAL,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RIGHT_TOP     = VERTICAL | RIGHT,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LEFT_BOTTOM   = VERTICAL | BOTTOM,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RIGHT_BOTTOM  = VERTICAL | BOTTOM | RIGHT,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TOP_CENTER    = CENTER,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOTTOM_CENTER = CENTER | BOTTOM,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LEFT_CENTER   = CENTER | VERTICAL,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RIGHT_CENTER  = CENTER | VERTICAL | RIGHT,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NONE  = 16,  // No arrow. Positioned under the supplied rect.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FLOAT = 17,  // No arrow. Centered over the supplied rect.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Shadow {
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    NO_SHADOW = 0,
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    NO_SHADOW_OPAQUE_BORDER,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BIG_SHADOW,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SMALL_SHADOW,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SHADOW_COUNT,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The position of the bubble in relation to the anchor.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum BubbleAlignment {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The tip of the arrow points to the middle of the anchor.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ALIGN_ARROW_TO_MID_ANCHOR,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The edge nearest to the arrow is lined up with the edge of the anchor.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ALIGN_EDGE_TO_ANCHOR_EDGE,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The way the arrow should be painted.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum ArrowPaintType {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Fully render the arrow.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PAINT_NORMAL,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Leave space for the arrow, but do not paint it.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PAINT_TRANSPARENT,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Neither paint nor leave space for the arrow.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PAINT_NONE,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BubbleBorder(Arrow arrow, Shadow shadow, SkColor color);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual ~BubbleBorder();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the radius of the corner of the border.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(xiyuan): Get rid of this since it's part of BorderImages now?
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetCornerRadius() {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We can't safely calculate a border radius by comparing the sizes of the
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // side and corner images, because either may have been extended in various
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // directions in order to do more subtle dropshadow fading or other effects.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // So we hardcode the most accurate value.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 4;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool has_arrow(Arrow a) { return a < NONE; }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool is_arrow_on_left(Arrow a) {
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return has_arrow(a) && (a == LEFT_CENTER || !(a & (RIGHT | CENTER)));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool is_arrow_on_top(Arrow a) {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return has_arrow(a) && (a == TOP_CENTER || !(a & (BOTTOM | CENTER)));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool is_arrow_on_horizontal(Arrow a) {
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return a >= NONE ? false : !(a & VERTICAL);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static bool is_arrow_at_center(Arrow a) {
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return has_arrow(a) && !!(a & CENTER);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static Arrow horizontal_mirror(Arrow a) {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return (a == TOP_CENTER || a == BOTTOM_CENTER || a >= NONE) ?
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        a : static_cast<Arrow>(a ^ RIGHT);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static Arrow vertical_mirror(Arrow a) {
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return (a == LEFT_CENTER || a == RIGHT_CENTER || a >= NONE) ?
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        a : static_cast<Arrow>(a ^ BOTTOM);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or set the arrow type.
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_arrow(Arrow arrow) { arrow_ = arrow; }
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Arrow arrow() const { return arrow_; }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or set the bubble alignment.
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_alignment(BubbleAlignment alignment) { alignment_ = alignment; }
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BubbleAlignment alignment() const { return alignment_; }
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the shadow type.
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shadow shadow() const { return shadow_; }
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get or set the background color for the bubble and arrow body.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_background_color(SkColor color) { background_color_ = color; }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor background_color() const { return background_color_; }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // If true, the background color should be determined by the host's
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // NativeTheme.
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void set_use_theme_background_color(bool use_theme_background_color) {
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    use_theme_background_color_ = use_theme_background_color;
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool use_theme_background_color() { return use_theme_background_color_; }
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Sets a desired pixel distance between the arrow tip and the outside edge of
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the neighboring border image. For example:    |----offset----|
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // '(' represents shadow around the '{' edge:    ((({           ^   })))
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The arrow will still anchor to the same location but the bubble will shift
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // location to place the arrow |offset| pixels from the perpendicular edge.
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_arrow_offset(int offset) { arrow_offset_ = offset; }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the way the arrow is actually painted.  Default is PAINT_NORMAL.
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_paint_arrow(ArrowPaintType value) { arrow_paint_type_ = value; }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the desired widget bounds (in screen coordinates) given the anchor rect
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and bubble content size; calculated from shadow and arrow image dimensions.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual gfx::Rect GetBounds(const gfx::Rect& anchor_rect,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Size& contents_size) const;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Get the border exterior thickness, including stroke and shadow, in pixels.
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int GetBorderThickness() const;
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the corner radius of the current image set.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetBorderCornerRadius() const;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the arrow offset to use.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetArrowOffset(const gfx::Size& border_size) const;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Border:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE;
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Insets GetInsets() const OVERRIDE;
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FRIEND_TEST_ALL_PREFIXES(BubbleBorderTest, GetSizeForContentsSizeTest);
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FRIEND_TEST_ALL_PREFIXES(BubbleBorderTest, GetBoundsOriginTest);
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The border and arrow stroke size used in image assets, in pixels.
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static const int kStroke;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  gfx::Size GetSizeForContentsSize(const gfx::Size& contents_size) const;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::ImageSkia* GetArrowImage() const;
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect GetArrowRect(const gfx::Rect& bounds) const;
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DrawArrow(gfx::Canvas* canvas, const gfx::Rect& arrow_bounds) const;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  internal::BorderImages* GetImagesForTest() const;
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Arrow arrow_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int arrow_offset_;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ArrowPaintType arrow_paint_type_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BubbleAlignment alignment_;
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Shadow shadow_;
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  internal::BorderImages* images_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SkColor background_color_;
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool use_theme_background_color_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BubbleBorder);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Background that clips itself to the specified BubbleBorder and uses
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the background color of the BubbleBorder.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT BubbleBackground : public Background {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit BubbleBackground(BubbleBorder* border) : border_(border) {}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Background:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(gfx::Canvas* canvas, View* view) const OVERRIDE;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BubbleBorder* border_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BubbleBackground);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_BUBBLE_BUBBLE_BORDER_H_
247