15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_view_state.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/base/cursor/cursor.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/gfx/canvas.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/link_listener.h" 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/native_cursor.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char Link::kViewClassName[] = "Link"; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Link::Link() : Label(base::string16()) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Link::Link(const base::string16& title) : Label(title) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Link::~Link() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochSkColor Link::GetDefaultEnabledColor() { 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return color_utils::GetSysSkColor(COLOR_HOTLIGHT); 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return SkColorSetRGB(0, 51, 153); 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* Link::GetClassName() const { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return kViewClassName; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor Link::GetCursor(const ui::MouseEvent& event) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enabled()) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::kNullCursor; 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetNativeHandCursor(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool Link::CanProcessEventsWithinSubtree() const { 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Links need to be able to accept events (e.g., clicking) even though 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // in general Labels do not. 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return View::CanProcessEventsWithinSubtree(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Link::OnMousePressed(const ui::MouseEvent& event) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enabled() || 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!event.IsLeftMouseButton() && !event.IsMiddleMouseButton())) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(true); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Link::OnMouseDragged(const ui::MouseEvent& event) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(enabled() && 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) && 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestPoint(event.location())); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::OnMouseReleased(const ui::MouseEvent& event) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the highlight first just in case this instance is deleted 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // while calling the controller 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnMouseCaptureLost(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enabled() && 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event.IsLeftMouseButton() || event.IsMiddleMouseButton()) && 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HitTestPoint(event.location())) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focus the link on click. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestFocus(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->LinkClicked(this, event.flags()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::OnMouseCaptureLost() { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(false); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Link::OnKeyPressed(const ui::KeyEvent& event) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool activate = ((event.key_code() == ui::VKEY_SPACE) || 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event.key_code() == ui::VKEY_RETURN)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!activate) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(false); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focus the link on key pressed. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestFocus(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->LinkClicked(this, event.flags()); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Link::OnGestureEvent(ui::GestureEvent* event) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!enabled()) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event->type() == ui::ET_GESTURE_TAP_DOWN) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(true); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (event->type() == ui::ET_GESTURE_TAP) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestFocus(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (listener_) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_->LinkClicked(this, event->flags()); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPressed(false); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event->SetHandled(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Link::SkipDefaultKeyEventProcessing(const ui::KeyEvent& event) { 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Make sure we don't process space or enter as accelerators. 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return (event.key_code() == ui::VKEY_SPACE) || 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (event.key_code() == ui::VKEY_RETURN); 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Link::GetAccessibleState(ui::AXViewState* state) { 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::GetAccessibleState(state); 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_LINK; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Link::OnEnabledChanged() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecalculateFont(); 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) View::OnEnabledChanged(); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Link::OnFocus() { 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::OnFocus(); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We render differently focused. 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Link::OnBlur() { 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::OnBlur(); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We render differently focused. 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SchedulePaint(); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Link::SetFontList(const gfx::FontList& font_list) { 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::SetFontList(font_list); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecalculateFont(); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Link::SetText(const base::string16& text) { 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::SetText(text); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Disable focusability for empty links. Otherwise Label::GetInsets() will 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // give them an unconditional 1-px. inset on every side to allow for a focus 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // border, when in this case we probably wanted zero width. 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFocusable(!text.empty()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::SetEnabledColor(SkColor color) { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_enabled_color_ = color; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pressed_) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label::SetEnabledColor(requested_enabled_color_); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::SetPressedColor(SkColor color) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_pressed_color_ = color; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pressed_) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label::SetEnabledColor(requested_pressed_color_); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Link::SetUnderline(bool underline) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (underline_ == underline) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) underline_ = underline; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RecalculateFont(); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::Init() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) listener_ = NULL; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressed_ = false; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) underline_ = true; 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetEnabledColor(GetDefaultEnabledColor()); 1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 1947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetDisabledColor(color_utils::GetSysSkColor(COLOR_WINDOWTEXT)); 1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetPressedColor(SkColorSetRGB(200, 0, 0)); 1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // TODO(beng): source from theme provider. 1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetDisabledColor(SK_ColorBLACK); 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetPressedColor(SK_ColorRED); 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecalculateFont(); 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Label::Init() calls SetText(), but if that's being called from Label(), our 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SetText() override will not be reached (because the constructed class is 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // only a Label at the moment, not yet a Link). So so the set_focusable() 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // call explicitly here. 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetFocusable(!text().empty()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::SetPressed(bool pressed) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pressed_ != pressed) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pressed_ = pressed; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Label::SetEnabledColor(pressed_ ? 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) requested_pressed_color_ : requested_enabled_color_); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RecalculateFont(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Link::RecalculateFont() { 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Underline the link iff it is enabled and |underline_| is true. 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int style = font_list().GetFontStyle(); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int intended_style = (enabled() && underline_) ? 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (style | gfx::Font::UNDERLINE) : (style & ~gfx::Font::UNDERLINE); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style != intended_style) 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Label::SetFontList(font_list().DeriveWithStyle(intended_style)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 230