border.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_BORDER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_VIEWS_BORDER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/insets.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/views_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx{
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Canvas;
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class Size;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Painter;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class View;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Border class.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The border class is used to display a border around a view.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To set a border on a view, just call SetBorder on the view, for example:
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// view->SetBorder(Border::CreateSolidBorder(1, SkColorSetRGB(25, 25, 112));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Once set on a view, the border is owned by the view.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IMPORTANT NOTE: not all views support borders at this point. In order to
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// support the border, views should make sure to use bounds excluding the
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// border (by calling View::GetLocalBoundsExcludingBorder) when doing layout and
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// painting.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VIEWS_EXPORT Border {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Border();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Border();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Convenience for creating a scoped_ptr with no Border.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<Border> NullBorder();
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a border that is a simple line of the specified thickness and
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // color.
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<Border> CreateSolidBorder(int thickness, SkColor color);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a border for reserving space. The returned border does not
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // paint anything.
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<Border> CreateEmptyBorder(int top,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              int left,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              int bottom,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              int right);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a border of the specified color, and specified thickness on each
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // side.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<Border> CreateSolidSidedBorder(int top,
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   int left,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   int bottom,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   int right,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   SkColor color);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a Border from the specified Painter. The border owns the painter,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // thus the painter is deleted when the Border is deleted.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |insets| define size of an area allocated for a Border.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static scoped_ptr<Border> CreateBorderPainter(Painter* painter,
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                const gfx::Insets& insets);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Renders the border for the specified view.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(const View& view, gfx::Canvas* canvas) = 0;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the border insets.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Insets GetInsets() const = 0;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns the minimum size this border requires.  Note that this may not be
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the same as the insets.  For example, a Border may paint images to draw
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // some graphical border around a view, and this would return the minimum size
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // such that these images would not be clipped or overlapping -- but the
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // insets may be larger or smaller, depending on how the view wanted its
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // content laid out relative to these images.
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const = 0;
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Border);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_VIEWS_BORDER_H_
94