Home | History | Annotate | Download | only in views
      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 #include "ui/views/view.h"
     12 
     13 namespace views {
     14 
     15 namespace {
     16 
     17 // A simple border with different thicknesses on each side and single color.
     18 class SidedSolidBorder : public Border {
     19  public:
     20   SidedSolidBorder(int top, int left, int bottom, int right, SkColor color);
     21 
     22   // Overridden from Border:
     23   virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE;
     24   virtual gfx::Insets GetInsets() const OVERRIDE;
     25   virtual gfx::Size GetMinimumSize() const OVERRIDE;
     26 
     27  private:
     28   const SkColor color_;
     29   const gfx::Insets insets_;
     30 
     31   DISALLOW_COPY_AND_ASSIGN(SidedSolidBorder);
     32 };
     33 
     34 SidedSolidBorder::SidedSolidBorder(int top,
     35                                    int left,
     36                                    int bottom,
     37                                    int right,
     38                                    SkColor color)
     39     : color_(color),
     40       insets_(top, left, bottom, right) {
     41 }
     42 
     43 void SidedSolidBorder::Paint(const View& view, gfx::Canvas* canvas) {
     44   // Top border.
     45   canvas->FillRect(gfx::Rect(0, 0, view.width(), insets_.top()), color_);
     46   // Left border.
     47   canvas->FillRect(gfx::Rect(0, 0, insets_.left(), view.height()), color_);
     48   // Bottom border.
     49   canvas->FillRect(gfx::Rect(0, view.height() - insets_.bottom(), view.width(),
     50                              insets_.bottom()), color_);
     51   // Right border.
     52   canvas->FillRect(gfx::Rect(view.width() - insets_.right(), 0, insets_.right(),
     53                              view.height()), color_);
     54 }
     55 
     56 gfx::Insets SidedSolidBorder::GetInsets() const {
     57   return insets_;
     58 }
     59 
     60 gfx::Size SidedSolidBorder::GetMinimumSize() const {
     61   return gfx::Size(insets_.width(), insets_.height());
     62 }
     63 
     64 // A variation of SidedSolidBorder, where each side has the same thickness.
     65 class SolidBorder : public SidedSolidBorder {
     66  public:
     67   SolidBorder(int thickness, SkColor color)
     68       : SidedSolidBorder(thickness, thickness, thickness, thickness, color) {
     69   }
     70 
     71  private:
     72   DISALLOW_COPY_AND_ASSIGN(SolidBorder);
     73 };
     74 
     75 class EmptyBorder : public Border {
     76  public:
     77   EmptyBorder(int top, int left, int bottom, int right)
     78       : insets_(top, left, bottom, right) {}
     79 
     80   // Overridden from Border:
     81   virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {}
     82 
     83   virtual gfx::Insets GetInsets() const OVERRIDE {
     84     return insets_;
     85   }
     86 
     87   virtual gfx::Size GetMinimumSize() const OVERRIDE {
     88     return gfx::Size();
     89   }
     90 
     91  private:
     92   const gfx::Insets insets_;
     93 
     94   DISALLOW_COPY_AND_ASSIGN(EmptyBorder);
     95 };
     96 
     97 class BorderPainter : public Border {
     98  public:
     99   explicit BorderPainter(Painter* painter, const gfx::Insets& insets)
    100       : painter_(painter),
    101         insets_(insets) {
    102     DCHECK(painter);
    103   }
    104 
    105   virtual ~BorderPainter() {}
    106 
    107   // Overridden from Border:
    108   virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {
    109     Painter::PaintPainterAt(canvas, painter_.get(), view.GetLocalBounds());
    110   }
    111 
    112   virtual gfx::Insets GetInsets() const OVERRIDE {
    113     return insets_;
    114   }
    115 
    116   virtual gfx::Size GetMinimumSize() const OVERRIDE {
    117     return painter_->GetMinimumSize();
    118   }
    119 
    120  private:
    121   scoped_ptr<Painter> painter_;
    122   const gfx::Insets insets_;
    123 
    124   DISALLOW_COPY_AND_ASSIGN(BorderPainter);
    125 };
    126 
    127 }  // namespace
    128 
    129 Border::Border() {
    130 }
    131 
    132 Border::~Border() {
    133 }
    134 
    135 // static
    136 scoped_ptr<Border> Border::NullBorder() {
    137   return scoped_ptr<Border>();
    138 }
    139 
    140 // static
    141 scoped_ptr<Border> Border::CreateSolidBorder(int thickness, SkColor color) {
    142   return scoped_ptr<Border>(new SolidBorder(thickness, color));
    143 }
    144 
    145 // static
    146 scoped_ptr<Border> Border::CreateEmptyBorder(int top,
    147                                              int left,
    148                                              int bottom,
    149                                              int right) {
    150   return scoped_ptr<Border>(new EmptyBorder(top, left, bottom, right));
    151 }
    152 
    153 // static
    154 scoped_ptr<Border> Border::CreateSolidSidedBorder(int top,
    155                                                   int left,
    156                                                   int bottom,
    157                                                   int right,
    158                                                   SkColor color) {
    159   return scoped_ptr<Border>(
    160       new SidedSolidBorder(top, left, bottom, right, color));
    161 }
    162 
    163 // static
    164 scoped_ptr<Border> Border::CreateBorderPainter(Painter* painter,
    165                                                const gfx::Insets& insets) {
    166   return scoped_ptr<Border>(new BorderPainter(painter, insets));
    167 }
    168 
    169 }  // namespace views
    170