border.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/views/border.h"
6
7#include "base/logging.h"
8#include "base/memory/scoped_ptr.h"
9#include "ui/gfx/canvas.h"
10#include "ui/views/painter.h"
11
12namespace views {
13
14namespace {
15
16// A simple border with different thicknesses on each side and single color.
17class SidedSolidBorder : public Border {
18 public:
19  SidedSolidBorder(int top, int left, int bottom, int right, SkColor color);
20
21  // Overridden from Border:
22  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE;
23  virtual gfx::Insets GetInsets() const OVERRIDE;
24
25 private:
26  const SkColor color_;
27  const gfx::Insets insets_;
28
29  DISALLOW_COPY_AND_ASSIGN(SidedSolidBorder);
30};
31
32SidedSolidBorder::SidedSolidBorder(int top,
33                                   int left,
34                                   int bottom,
35                                   int right,
36                                   SkColor color)
37    : color_(color),
38      insets_(top, left, bottom, right) {
39}
40
41void SidedSolidBorder::Paint(const View& view, gfx::Canvas* canvas) {
42  // Top border.
43  canvas->FillRect(gfx::Rect(0, 0, view.width(), insets_.top()), color_);
44  // Left border.
45  canvas->FillRect(gfx::Rect(0, 0, insets_.left(), view.height()), color_);
46  // Bottom border.
47  canvas->FillRect(gfx::Rect(0, view.height() - insets_.bottom(), view.width(),
48                             insets_.bottom()), color_);
49  // Right border.
50  canvas->FillRect(gfx::Rect(view.width() - insets_.right(), 0, insets_.right(),
51                             view.height()), color_);
52}
53
54gfx::Insets SidedSolidBorder::GetInsets() const {
55  return insets_;
56}
57
58// A variation of SidedSolidBorder, where each side has the same thickness.
59class SolidBorder : public SidedSolidBorder {
60 public:
61  SolidBorder(int thickness, SkColor color)
62      : SidedSolidBorder(thickness, thickness, thickness, thickness, color) {
63  }
64
65 private:
66  DISALLOW_COPY_AND_ASSIGN(SolidBorder);
67};
68
69class EmptyBorder : public Border {
70 public:
71  EmptyBorder(int top, int left, int bottom, int right)
72      : insets_(top, left, bottom, right) {}
73
74  // Overridden from Border:
75  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {}
76
77  virtual gfx::Insets GetInsets() const OVERRIDE {
78    return insets_;
79  }
80
81 private:
82  const gfx::Insets insets_;
83
84  DISALLOW_COPY_AND_ASSIGN(EmptyBorder);
85};
86
87class BorderPainter : public Border {
88 public:
89  explicit BorderPainter(Painter* painter, const gfx::Insets& insets)
90      : painter_(painter),
91        insets_(insets) {
92    DCHECK(painter);
93  }
94
95  virtual ~BorderPainter() {}
96
97  // Overridden from Border:
98  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {
99    Painter::PaintPainterAt(canvas, painter_.get(), view.GetLocalBounds());
100  }
101
102  virtual gfx::Insets GetInsets() const OVERRIDE {
103    return insets_;
104  }
105
106 private:
107  scoped_ptr<Painter> painter_;
108  const gfx::Insets insets_;
109
110  DISALLOW_COPY_AND_ASSIGN(BorderPainter);
111};
112
113}  // namespace
114
115Border::Border() {
116}
117
118Border::~Border() {
119}
120
121// static
122Border* Border::CreateSolidBorder(int thickness, SkColor color) {
123  return new SolidBorder(thickness, color);
124}
125
126// static
127Border* Border::CreateEmptyBorder(int top, int left, int bottom, int right) {
128  return new EmptyBorder(top, left, bottom, right);
129}
130
131// static
132Border* Border::CreateSolidSidedBorder(int top,
133                                       int left,
134                                       int bottom,
135                                       int right,
136                                       SkColor color) {
137  return new SidedSolidBorder(top, left, bottom, right, color);
138}
139
140// static
141Border* Border::CreateBorderPainter(Painter* painter,
142                                    const gfx::Insets& insets) {
143  return new BorderPainter(painter, insets);
144}
145
146TextButtonBorder* Border::AsTextButtonBorder() {
147  return NULL;
148}
149
150const TextButtonBorder* Border::AsTextButtonBorder() const {
151  return NULL;
152}
153
154}  // namespace views
155