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