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)#include "ui/views/border.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/painter.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/view.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple border with different thicknesses on each side and single color.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SidedSolidBorder : public Border {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SidedSolidBorder(int top, int left, int bottom, int right, SkColor color);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Border:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Insets GetInsets() const OVERRIDE;
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const SkColor color_;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets_;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SidedSolidBorder);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SidedSolidBorder::SidedSolidBorder(int top,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int left,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int bottom,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int right,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   SkColor color)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : color_(color),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      insets_(top, left, bottom, right) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SidedSolidBorder::Paint(const View& view, gfx::Canvas* canvas) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Top border.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->FillRect(gfx::Rect(0, 0, view.width(), insets_.top()), color_);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Left border.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->FillRect(gfx::Rect(0, 0, insets_.left(), view.height()), color_);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bottom border.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->FillRect(gfx::Rect(0, view.height() - insets_.bottom(), view.width(),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             insets_.bottom()), color_);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Right border.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->FillRect(gfx::Rect(view.width() - insets_.right(), 0, insets_.right(),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             view.height()), color_);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Insets SidedSolidBorder::GetInsets() const {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return insets_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)gfx::Size SidedSolidBorder::GetMinimumSize() const {
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return gfx::Size(insets_.width(), insets_.height());
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A variation of SidedSolidBorder, where each side has the same thickness.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SolidBorder : public SidedSolidBorder {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SolidBorder(int thickness, SkColor color)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : SidedSolidBorder(thickness, thickness, thickness, thickness, color) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SolidBorder);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EmptyBorder : public Border {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EmptyBorder(int top, int left, int bottom, int right)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : insets_(top, left, bottom, right) {}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Border:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Insets GetInsets() const OVERRIDE {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return insets_;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return gfx::Size();
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EmptyBorder);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BorderPainter : public Border {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit BorderPainter(Painter* painter, const gfx::Insets& insets)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : painter_(painter),
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        insets_(insets) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(painter);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BorderPainter() {}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from Border:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Painter::PaintPainterAt(canvas, painter_.get(), view.GetLocalBounds());
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Insets GetInsets() const OVERRIDE {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return insets_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return painter_->GetMinimumSize();
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Painter> painter_;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Insets insets_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BorderPainter);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Border::Border() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Border::~Border() {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<Border> Border::NullBorder() {
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<Border>();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<Border> Border::CreateSolidBorder(int thickness, SkColor color) {
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<Border>(new SolidBorder(thickness, color));
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<Border> Border::CreateEmptyBorder(int top,
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int left,
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int bottom,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                             int right) {
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<Border>(new EmptyBorder(top, left, bottom, right));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<Border> Border::CreateSolidSidedBorder(int top,
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  int left,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  int bottom,
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  int right,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  SkColor color) {
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<Border>(
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new SidedSolidBorder(top, left, bottom, right, color));
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// static
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<Border> Border::CreateBorderPainter(Painter* painter,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               const gfx::Insets& insets) {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<Border>(new BorderPainter(painter, insets));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
170