diff options
Diffstat (limited to 'views/controls/link.cc')
-rw-r--r-- | views/controls/link.cc | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/views/controls/link.cc b/views/controls/link.cc new file mode 100644 index 0000000..aae254503 --- /dev/null +++ b/views/controls/link.cc @@ -0,0 +1,183 @@ +// Copyright (c) 2006-2008 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 "views/controls/link.h" + +#include "app/gfx/chrome_font.h" +#include "views/event.h" + +namespace views { + +static HCURSOR g_hand_cursor = NULL; + +// Default colors used for links. +static const SkColor kHighlightedColor = SkColorSetRGB(255, 0x00, 0x00); +static const SkColor kNormalColor = SkColorSetRGB(0, 51, 153); +static const SkColor kDisabledColor = SkColorSetRGB(0, 0, 0); + +const char Link::kViewClassName[] = "views/Link"; + +Link::Link() : Label(L""), + controller_(NULL), + highlighted_(false), + highlighted_color_(kHighlightedColor), + disabled_color_(kDisabledColor), + normal_color_(kNormalColor) { + Init(); + SetFocusable(true); +} + +Link::Link(const std::wstring& title) : Label(title), + controller_(NULL), + highlighted_(false), + highlighted_color_(kHighlightedColor), + disabled_color_(kDisabledColor), + normal_color_(kNormalColor) { + Init(); + SetFocusable(true); +} + +void Link::Init() { + SetColor(normal_color_); + ValidateStyle(); +} + +Link::~Link() { +} + +void Link::SetController(LinkController* controller) { + controller_ = controller; +} + +const LinkController* Link::GetController() { + return controller_; +} + +std::string Link::GetClassName() const { + return kViewClassName; +} + +void Link::SetHighlightedColor(const SkColor& color) { + normal_color_ = color; + ValidateStyle(); +} + +void Link::SetDisabledColor(const SkColor& color) { + disabled_color_ = color; + ValidateStyle(); +} + +void Link::SetNormalColor(const SkColor& color) { + normal_color_ = color; + ValidateStyle(); +} + +bool Link::OnMousePressed(const MouseEvent& e) { + if (!enabled_ || (!e.IsLeftMouseButton() && !e.IsMiddleMouseButton())) + return false; + SetHighlighted(true); + return true; +} + +bool Link::OnMouseDragged(const MouseEvent& e) { + SetHighlighted(enabled_ && + (e.IsLeftMouseButton() || e.IsMiddleMouseButton()) && + HitTest(e.location())); + return true; +} + +void Link::OnMouseReleased(const MouseEvent& e, bool canceled) { + // Change the highlight first just in case this instance is deleted + // while calling the controller + SetHighlighted(false); + if (enabled_ && !canceled && + (e.IsLeftMouseButton() || e.IsMiddleMouseButton()) && + HitTest(e.location())) { + // Focus the link on click. + RequestFocus(); + + if (controller_) + controller_->LinkActivated(this, e.GetFlags()); + } +} + +bool Link::OnKeyPressed(const KeyEvent& e) { + if ((e.GetCharacter() == VK_SPACE) || (e.GetCharacter() == VK_RETURN)) { + SetHighlighted(false); + + // Focus the link on key pressed. + RequestFocus(); + + if (controller_) + controller_->LinkActivated(this, e.GetFlags()); + + return true; + } + return false; +} + +bool Link::OverrideAccelerator(const Accelerator& accelerator) { + return (accelerator.GetKeyCode() == VK_SPACE) || + (accelerator.GetKeyCode() == VK_RETURN); +} + +void Link::SetHighlighted(bool f) { + if (f != highlighted_) { + highlighted_ = f; + ValidateStyle(); + SchedulePaint(); + } +} + +void Link::ValidateStyle() { + ChromeFont font = GetFont(); + + if (enabled_) { + if ((font.style() & ChromeFont::UNDERLINED) == 0) { + Label::SetFont(font.DeriveFont(0, font.style() | + ChromeFont::UNDERLINED)); + } + } else { + if ((font.style() & ChromeFont::UNDERLINED) != 0) { + Label::SetFont(font.DeriveFont(0, font.style() & + ~ChromeFont::UNDERLINED)); + } + } + + if (enabled_) { + if (highlighted_) { + Label::SetColor(highlighted_color_); + } else { + Label::SetColor(normal_color_); + } + } else { + Label::SetColor(disabled_color_); + } +} + +void Link::SetFont(const ChromeFont& font) { + Label::SetFont(font); + ValidateStyle(); +} + +void Link::SetEnabled(bool f) { + if (f != enabled_) { + enabled_ = f; + ValidateStyle(); + SchedulePaint(); + } +} + +HCURSOR Link::GetCursorForPoint(Event::EventType event_type, int x, int y) { + if (enabled_) { + if (!g_hand_cursor) { + g_hand_cursor = LoadCursor(NULL, IDC_HAND); + } + return g_hand_cursor; + } else { + return NULL; + } +} + +} // namespace views |