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