// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/views/border.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/canvas.h"
#include "ui/views/painter.h"
#include "ui/views/view.h"
namespace views {
namespace {
// A simple border with different thicknesses on each side and single color.
class SidedSolidBorder : public Border {
public:
SidedSolidBorder(int top, int left, int bottom, int right, SkColor color);
// Overridden from Border:
virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE;
virtual gfx::Insets GetInsets() const OVERRIDE;
virtual gfx::Size GetMinimumSize() const OVERRIDE;
private:
const SkColor color_;
const gfx::Insets insets_;
DISALLOW_COPY_AND_ASSIGN(SidedSolidBorder);
};
SidedSolidBorder::SidedSolidBorder(int top,
int left,
int bottom,
int right,
SkColor color)
: color_(color),
insets_(top, left, bottom, right) {
}
void SidedSolidBorder::Paint(const View& view, gfx::Canvas* canvas) {
// Top border.
canvas->FillRect(gfx::Rect(0, 0, view.width(), insets_.top()), color_);
// Left border.
canvas->FillRect(gfx::Rect(0, 0, insets_.left(), view.height()), color_);
// Bottom border.
canvas->FillRect(gfx::Rect(0, view.height() - insets_.bottom(), view.width(),
insets_.bottom()), color_);
// Right border.
canvas->FillRect(gfx::Rect(view.width() - insets_.right(), 0, insets_.right(),
view.height()), color_);
}
gfx::Insets SidedSolidBorder::GetInsets() const {
return insets_;
}
gfx::Size SidedSolidBorder::GetMinimumSize() const {
return gfx::Size(insets_.width(), insets_.height());
}
// A variation of SidedSolidBorder, where each side has the same thickness.
class SolidBorder : public SidedSolidBorder {
public:
SolidBorder(int thickness, SkColor color)
: SidedSolidBorder(thickness, thickness, thickness, thickness, color) {
}
private:
DISALLOW_COPY_AND_ASSIGN(SolidBorder);
};
class EmptyBorder : public Border {
public:
EmptyBorder(int top, int left, int bottom, int right)
: insets_(top, left, bottom, right) {}
// Overridden from Border:
virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {}
virtual gfx::Insets GetInsets() const OVERRIDE {
return insets_;
}
virtual gfx::Size GetMinimumSize() const OVERRIDE {
return gfx::Size();
}
private:
const gfx::Insets insets_;
DISALLOW_COPY_AND_ASSIGN(EmptyBorder);
};
class BorderPainter : public Border {
public:
explicit BorderPainter(Painter* painter, const gfx::Insets& insets)
: painter_(painter),
insets_(insets) {
DCHECK(painter);
}
virtual ~BorderPainter() {}
// Overridden from Border:
virtual void Paint(const View& view, gfx::Canvas* canvas) OVERRIDE {
Painter::PaintPainterAt(canvas, painter_.get(), view.GetLocalBounds());
}
virtual gfx::Insets GetInsets() const OVERRIDE {
return insets_;
}
virtual gfx::Size GetMinimumSize() const OVERRIDE {
return painter_->GetMinimumSize();
}
private:
scoped_ptr<Painter> painter_;
const gfx::Insets insets_;
DISALLOW_COPY_AND_ASSIGN(BorderPainter);
};
} // namespace
Border::Border() {
}
Border::~Border() {
}
// static
scoped_ptr<Border> Border::NullBorder() {
return scoped_ptr<Border>();
}
// static
scoped_ptr<Border> Border::CreateSolidBorder(int thickness, SkColor color) {
return scoped_ptr<Border>(new SolidBorder(thickness, color));
}
// static
scoped_ptr<Border> Border::CreateEmptyBorder(int top,
int left,
int bottom,
int right) {
return scoped_ptr<Border>(new EmptyBorder(top, left, bottom, right));
}
// static
scoped_ptr<Border> Border::CreateSolidSidedBorder(int top,
int left,
int bottom,
int right,
SkColor color) {
return scoped_ptr<Border>(
new SidedSolidBorder(top, left, bottom, right, color));
}
// static
scoped_ptr<Border> Border::CreateBorderPainter(Painter* painter,
const gfx::Insets& insets) {
return scoped_ptr<Border>(new BorderPainter(painter, insets));
}
} // namespace views