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 13namespace views { 14 15namespace { 16 17// A simple border with different thicknesses on each side and single color. 18class 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 34SidedSolidBorder::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 43void 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 56gfx::Insets SidedSolidBorder::GetInsets() const { 57 return insets_; 58} 59 60gfx::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. 65class 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 75class 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 97class 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 129Border::Border() { 130} 131 132Border::~Border() { 133} 134 135// static 136scoped_ptr<Border> Border::NullBorder() { 137 return scoped_ptr<Border>(); 138} 139 140// static 141scoped_ptr<Border> Border::CreateSolidBorder(int thickness, SkColor color) { 142 return scoped_ptr<Border>(new SolidBorder(thickness, color)); 143} 144 145// static 146scoped_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 154scoped_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 164scoped_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