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