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_CONTROLS_IMAGE_VIEW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_CONTROLS_IMAGE_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Canvas; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Painter; 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////// 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ImageView class. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An ImageView can display an image from an ImageSkia. If a size is provided, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the ImageView will resize the provided image to fit if it is too big or will 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// center the image if smaller. Otherwise, the preferred size matches the 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provided image size. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT ImageView : public View { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Alignment { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LEADING = 0, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CENTER, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRAILING 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageView(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ImageView(); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the image that should be displayed. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetImage(const gfx::ImageSkia& img); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the image that should be displayed from a pointer. Reset the image 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the pointer is NULL. The pointer contents is copied in the receiver's 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // image. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetImage(const gfx::ImageSkia* image_skia); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the image currently displayed or NULL of none is currently set. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The returned image is still owned by the ImageView. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& GetImage(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the desired image size for the receiving ImageView. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetImageSize(const gfx::Size& image_size); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the preferred size for the receiving view. Returns false if the 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // preferred size is not defined, which means that the view uses the image 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // size. 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool GetImageSize(gfx::Size* image_size) const; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the actual bounds of the visible image inside the view. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetImageBounds() const; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the image size to the current image dimensions. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResetImageSize(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set / Get the horizontal alignment. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHorizontalAlignment(Alignment ha); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alignment GetHorizontalAlignment() const; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set / Get the vertical alignment. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetVerticalAlignment(Alignment va); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alignment GetVerticalAlignment() const; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set / Get the tooltip text. 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetTooltipText(const base::string16& tooltip); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 GetTooltipText() const; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_interactive(bool interactive) { interactive_ = interactive; } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetFocusPainter(scoped_ptr<Painter> focus_painter); 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden from View: 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnFocus() OVERRIDE; 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnBlur() OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool GetTooltipText(const gfx::Point& p, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16* tooltip) const OVERRIDE; 9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool CanProcessEventsWithinSubtree() const OVERRIDE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnPaintImage(gfx::Canvas* canvas); 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if |img| is the same as the last image we painted. This is 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // intended to be a quick check, not exhaustive. In other words it's possible 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for this to return false even though the images are in fact equal. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsImageEqual(const gfx::ImageSkia& img) const; 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the image origin given the desired size and the receiver alignment 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // properties. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point ComputeImageOrigin(const gfx::Size& image_size) const; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the image size is set. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool image_size_set_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The actual image size. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size image_size_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The underlying image. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ImageSkia image_; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Horizontal alignment. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alignment horiz_alignment_; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Vertical alignment. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Alignment vert_alignment_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The current tooltip text. 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 tooltip_text_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A flag controlling hit test handling for interactivity. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool interactive_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Scale last painted at. 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) float last_paint_scale_; 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Address of bytes we last painted. This is used only for comparison, so its 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // safe to cache. 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void* last_painted_bitmap_pixels_; 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<views::Painter> focus_painter_; 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ImageView); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_VIEWS_CONTROLS_IMAGE_VIEW_H_ 140