| OLD | NEW | 
|    1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |    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 |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "ui/views/controls/button/custom_button.h" |    5 #include "ui/views/controls/button/custom_button.h" | 
|    6  |    6  | 
|    7 #include "ui/accessibility/ax_view_state.h" |    7 #include "ui/accessibility/ax_view_state.h" | 
|    8 #include "ui/base/material_design/material_design_controller.h" |    8 #include "ui/base/material_design/material_design_controller.h" | 
|    9 #include "ui/events/event.h" |    9 #include "ui/events/event.h" | 
|   10 #include "ui/events/event_utils.h" |   10 #include "ui/events/event_utils.h" | 
|   11 #include "ui/events/keycodes/keyboard_codes.h" |   11 #include "ui/events/keycodes/keyboard_codes.h" | 
|   12 #include "ui/gfx/animation/throb_animation.h" |   12 #include "ui/gfx/animation/throb_animation.h" | 
|   13 #include "ui/gfx/canvas.h" |  | 
|   14 #include "ui/gfx/color_palette.h" |   13 #include "ui/gfx/color_palette.h" | 
|   15 #include "ui/native_theme/native_theme.h" |   14 #include "ui/native_theme/native_theme.h" | 
|   16 #include "ui/views/animation/ink_drop_delegate.h" |   15 #include "ui/views/animation/ink_drop_delegate.h" | 
|   17 #include "ui/views/animation/ink_drop_hover.h" |   16 #include "ui/views/animation/ink_drop_hover.h" | 
|   18 #include "ui/views/controls/button/blue_button.h" |   17 #include "ui/views/controls/button/blue_button.h" | 
|   19 #include "ui/views/controls/button/checkbox.h" |   18 #include "ui/views/controls/button/checkbox.h" | 
|   20 #include "ui/views/controls/button/image_button.h" |   19 #include "ui/views/controls/button/image_button.h" | 
|   21 #include "ui/views/controls/button/label_button.h" |   20 #include "ui/views/controls/button/label_button.h" | 
|   22 #include "ui/views/controls/button/menu_button.h" |   21 #include "ui/views/controls/button/menu_button.h" | 
|   23 #include "ui/views/controls/button/radio_button.h" |   22 #include "ui/views/controls/button/radio_button.h" | 
|   24 #include "ui/views/widget/widget.h" |   23 #include "ui/views/widget/widget.h" | 
|   25  |   24  | 
|   26 #if defined(USE_AURA) |   25 #if defined(USE_AURA) | 
|   27 #include "ui/aura/client/capture_client.h" |   26 #include "ui/aura/client/capture_client.h" | 
|   28 #include "ui/aura/window.h" |   27 #include "ui/aura/window.h" | 
|   29 #endif |   28 #endif | 
|   30  |   29  | 
|   31 namespace views { |   30 namespace views { | 
|   32  |   31  | 
|   33 namespace { |   32 namespace { | 
|   34  |   33  | 
|   35 // How long the hover animation takes if uninterrupted. |   34 // How long the hover animation takes if uninterrupted. | 
|   36 const int kHoverFadeDurationMs = 150; |   35 const int kHoverFadeDurationMs = 150; | 
|   37  |   36  | 
|   38 // The amount to enlarge the focus border in all directions relative to the |  | 
|   39 // button. |  | 
|   40 const int kFocusBorderOutset = -2; |  | 
|   41  |  | 
|   42 // The corner radius of the focus border roundrect. |  | 
|   43 const int kFocusBorderCornerRadius = 3; |  | 
|   44  |  | 
|   45 class MdFocusRing : public views::View { |  | 
|   46  public: |  | 
|   47   MdFocusRing() { |  | 
|   48     SetPaintToLayer(true); |  | 
|   49     layer()->SetFillsBoundsOpaquely(false); |  | 
|   50   } |  | 
|   51   ~MdFocusRing() override {} |  | 
|   52  |  | 
|   53   bool CanProcessEventsWithinSubtree() const override { |  | 
|   54     return false; |  | 
|   55   } |  | 
|   56  |  | 
|   57   void OnPaint(gfx::Canvas* canvas) override { |  | 
|   58     CustomButton::PaintMdFocusRing(canvas, this); |  | 
|   59   } |  | 
|   60  |  | 
|   61  private: |  | 
|   62   DISALLOW_COPY_AND_ASSIGN(MdFocusRing); |  | 
|   63 }; |  | 
|   64  |  | 
|   65 }  // namespace |   37 }  // namespace | 
|   66  |   38  | 
|   67 //////////////////////////////////////////////////////////////////////////////// |   39 //////////////////////////////////////////////////////////////////////////////// | 
|   68 // CustomButton, public: |   40 // CustomButton, public: | 
|   69  |   41  | 
|   70 // static |   42 // static | 
|   71 const char CustomButton::kViewClassName[] = "CustomButton"; |   43 const char CustomButton::kViewClassName[] = "CustomButton"; | 
|   72  |   44  | 
|   73 // static |   45 // static | 
|   74 const CustomButton* CustomButton::AsCustomButton(const views::View* view) { |   46 const CustomButton* CustomButton::AsCustomButton(const views::View* view) { | 
|   75   return AsCustomButton(const_cast<View*>(view)); |   47   return AsCustomButton(const_cast<View*>(view)); | 
|   76 } |   48 } | 
|   77  |   49  | 
|   78 // static |   50 // static | 
|   79 CustomButton* CustomButton::AsCustomButton(views::View* view) { |   51 CustomButton* CustomButton::AsCustomButton(views::View* view) { | 
|   80   if (view) { |   52   if (view) { | 
|   81     const char* classname = view->GetClassName(); |   53     const char* classname = view->GetClassName(); | 
|   82     if (!strcmp(classname, Checkbox::kViewClassName) || |   54     if (!strcmp(classname, Checkbox::kViewClassName) || | 
|   83         !strcmp(classname, CustomButton::kViewClassName) || |   55         !strcmp(classname, CustomButton::kViewClassName) || | 
|   84         !strcmp(classname, ImageButton::kViewClassName) || |   56         !strcmp(classname, ImageButton::kViewClassName) || | 
|   85         !strcmp(classname, LabelButton::kViewClassName) || |   57         !strcmp(classname, LabelButton::kViewClassName) || | 
|   86         !strcmp(classname, RadioButton::kViewClassName) || |   58         !strcmp(classname, RadioButton::kViewClassName) || | 
|   87         !strcmp(classname, MenuButton::kViewClassName)) { |   59         !strcmp(classname, MenuButton::kViewClassName)) { | 
|   88       return static_cast<CustomButton*>(view); |   60       return static_cast<CustomButton*>(view); | 
|   89     } |   61     } | 
|   90   } |   62   } | 
|   91   return NULL; |   63   return NULL; | 
|   92 } |   64 } | 
|   93  |   65  | 
|   94 // static |  | 
|   95 void CustomButton::PaintMdFocusRing(gfx::Canvas* canvas, views::View* view) { |  | 
|   96   SkPaint paint; |  | 
|   97   paint.setAntiAlias(true); |  | 
|   98   paint.setColor(view->GetNativeTheme()->GetSystemColor( |  | 
|   99       ui::NativeTheme::kColorId_CallToActionColor)); |  | 
|  100   paint.setStyle(SkPaint::kStroke_Style); |  | 
|  101   paint.setStrokeWidth(1); |  | 
|  102   gfx::RectF rect(view->GetLocalBounds()); |  | 
|  103   rect.Inset(gfx::InsetsF(0.5)); |  | 
|  104   canvas->DrawRoundRect(rect, kFocusBorderCornerRadius, paint); |  | 
|  105 } |  | 
|  106  |  | 
|  107 CustomButton::~CustomButton() {} |   66 CustomButton::~CustomButton() {} | 
|  108  |   67  | 
|  109 void CustomButton::SetState(ButtonState state) { |   68 void CustomButton::SetState(ButtonState state) { | 
|  110   if (state == state_) |   69   if (state == state_) | 
|  111     return; |   70     return; | 
|  112  |   71  | 
|  113   if (animate_on_state_change_ && |   72   if (animate_on_state_change_ && | 
|  114       (!is_throbbing_ || !hover_animation_.is_animating())) { |   73       (!is_throbbing_ || !hover_animation_.is_animating())) { | 
|  115     is_throbbing_ = false; |   74     is_throbbing_ = false; | 
|  116     if ((state_ == STATE_HOVERED) && (state == STATE_NORMAL)) { |   75     if ((state_ == STATE_HOVERED) && (state == STATE_NORMAL)) { | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  169   // TODO(bruthig): Is there any reason we are not calling |  128   // TODO(bruthig): Is there any reason we are not calling | 
|  170   // Button::OnEnabledChanged() here? |  129   // Button::OnEnabledChanged() here? | 
|  171   if (enabled() ? (state_ != STATE_DISABLED) : (state_ == STATE_DISABLED)) |  130   if (enabled() ? (state_ != STATE_DISABLED) : (state_ == STATE_DISABLED)) | 
|  172     return; |  131     return; | 
|  173  |  132  | 
|  174   if (enabled()) |  133   if (enabled()) | 
|  175     SetState(ShouldEnterHoveredState() ? STATE_HOVERED : STATE_NORMAL); |  134     SetState(ShouldEnterHoveredState() ? STATE_HOVERED : STATE_NORMAL); | 
|  176   else |  135   else | 
|  177     SetState(STATE_DISABLED); |  136     SetState(STATE_DISABLED); | 
|  178  |  137  | 
|  179   if (ink_drop_delegate_) |  138   if (ink_drop_delegate()) | 
|  180     ink_drop_delegate_->SetHovered(ShouldShowInkDropHover()); |  139     ink_drop_delegate()->SetHovered(ShouldShowInkDropHover()); | 
|  181 } |  140 } | 
|  182  |  141  | 
|  183 const char* CustomButton::GetClassName() const { |  142 const char* CustomButton::GetClassName() const { | 
|  184   return kViewClassName; |  143   return kViewClassName; | 
|  185 } |  144 } | 
|  186  |  145  | 
|  187 bool CustomButton::OnMousePressed(const ui::MouseEvent& event) { |  146 bool CustomButton::OnMousePressed(const ui::MouseEvent& event) { | 
|  188   if (state_ == STATE_DISABLED) |  147   if (state_ == STATE_DISABLED) | 
|  189     return true; |  148     return true; | 
|  190   if (state_ != STATE_PRESSED && ShouldEnterPushedState(event) && |  149   if (state_ != STATE_PRESSED && ShouldEnterPushedState(event) && | 
|  191       HitTestPoint(event.location())) { |  150       HitTestPoint(event.location())) { | 
|  192     SetState(STATE_PRESSED); |  151     SetState(STATE_PRESSED); | 
|  193     if (ink_drop_delegate_) |  152     if (ink_drop_delegate()) | 
|  194       ink_drop_delegate_->OnAction(views::InkDropState::ACTION_PENDING); |  153       ink_drop_delegate()->OnAction(views::InkDropState::ACTION_PENDING); | 
|  195   } |  154   } | 
|  196   if (request_focus_on_press_) |  155   if (request_focus_on_press_) | 
|  197     RequestFocus(); |  156     RequestFocus(); | 
|  198   if (IsTriggerableEvent(event) && notify_action_ == NOTIFY_ON_PRESS) { |  157   if (IsTriggerableEvent(event) && notify_action_ == NOTIFY_ON_PRESS) { | 
|  199     NotifyClick(event); |  158     NotifyClick(event); | 
|  200     // NOTE: We may be deleted at this point (by the listener's notification |  159     // NOTE: We may be deleted at this point (by the listener's notification | 
|  201     // handler). |  160     // handler). | 
|  202   } |  161   } | 
|  203   return true; |  162   return true; | 
|  204 } |  163 } | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  232 } |  191 } | 
|  233  |  192  | 
|  234 void CustomButton::OnMouseCaptureLost() { |  193 void CustomButton::OnMouseCaptureLost() { | 
|  235   // Starting a drag results in a MouseCaptureLost. Reset button state. |  194   // Starting a drag results in a MouseCaptureLost. Reset button state. | 
|  236   // TODO(varkha) While in drag only reset the state with Material Design. |  195   // TODO(varkha) While in drag only reset the state with Material Design. | 
|  237   // The same logic may applies everywhere so gather any feedback and update. |  196   // The same logic may applies everywhere so gather any feedback and update. | 
|  238   bool reset_button_state = |  197   bool reset_button_state = | 
|  239       !InDrag() || ui::MaterialDesignController::IsModeMaterial(); |  198       !InDrag() || ui::MaterialDesignController::IsModeMaterial(); | 
|  240   if (state_ != STATE_DISABLED && reset_button_state) |  199   if (state_ != STATE_DISABLED && reset_button_state) | 
|  241     SetState(STATE_NORMAL); |  200     SetState(STATE_NORMAL); | 
|  242   if (ink_drop_delegate_) |  201   if (ink_drop_delegate()) | 
|  243     ink_drop_delegate_->OnAction(views::InkDropState::HIDDEN); |  202     ink_drop_delegate()->OnAction(views::InkDropState::HIDDEN); | 
|  244 } |  203 } | 
|  245  |  204  | 
|  246 void CustomButton::OnMouseEntered(const ui::MouseEvent& event) { |  205 void CustomButton::OnMouseEntered(const ui::MouseEvent& event) { | 
|  247   if (state_ != STATE_DISABLED) |  206   if (state_ != STATE_DISABLED) | 
|  248     SetState(STATE_HOVERED); |  207     SetState(STATE_HOVERED); | 
|  249 } |  208 } | 
|  250  |  209  | 
|  251 void CustomButton::OnMouseExited(const ui::MouseEvent& event) { |  210 void CustomButton::OnMouseExited(const ui::MouseEvent& event) { | 
|  252   // Starting a drag results in a MouseExited, we need to ignore it. |  211   // Starting a drag results in a MouseExited, we need to ignore it. | 
|  253   if (state_ != STATE_DISABLED && !InDrag()) |  212   if (state_ != STATE_DISABLED && !InDrag()) | 
|  254     SetState(STATE_NORMAL); |  213     SetState(STATE_NORMAL); | 
|  255 } |  214 } | 
|  256  |  215  | 
|  257 void CustomButton::OnMouseMoved(const ui::MouseEvent& event) { |  216 void CustomButton::OnMouseMoved(const ui::MouseEvent& event) { | 
|  258   if (state_ != STATE_DISABLED) |  217   if (state_ != STATE_DISABLED) | 
|  259     SetState(HitTestPoint(event.location()) ? STATE_HOVERED : STATE_NORMAL); |  218     SetState(HitTestPoint(event.location()) ? STATE_HOVERED : STATE_NORMAL); | 
|  260 } |  219 } | 
|  261  |  220  | 
|  262 bool CustomButton::OnKeyPressed(const ui::KeyEvent& event) { |  221 bool CustomButton::OnKeyPressed(const ui::KeyEvent& event) { | 
|  263   if (state_ == STATE_DISABLED) |  222   if (state_ == STATE_DISABLED) | 
|  264     return false; |  223     return false; | 
|  265  |  224  | 
|  266   // Space sets button state to pushed. Enter clicks the button. This matches |  225   // Space sets button state to pushed. Enter clicks the button. This matches | 
|  267   // the Windows native behavior of buttons, where Space clicks the button on |  226   // the Windows native behavior of buttons, where Space clicks the button on | 
|  268   // KeyRelease and Enter clicks the button on KeyPressed. |  227   // KeyRelease and Enter clicks the button on KeyPressed. | 
|  269   if (event.key_code() == ui::VKEY_SPACE) { |  228   if (event.key_code() == ui::VKEY_SPACE) { | 
|  270     SetState(STATE_PRESSED); |  229     SetState(STATE_PRESSED); | 
|  271     if (ink_drop_delegate_ && |  230     if (ink_drop_delegate() && | 
|  272         ink_drop_delegate_->GetTargetInkDropState() != |  231         ink_drop_delegate()->GetTargetInkDropState() != | 
|  273             views::InkDropState::ACTION_PENDING) |  232             views::InkDropState::ACTION_PENDING) | 
|  274       ink_drop_delegate_->OnAction(views::InkDropState::ACTION_PENDING); |  233       ink_drop_delegate()->OnAction(views::InkDropState::ACTION_PENDING); | 
|  275   } else if (event.key_code() == ui::VKEY_RETURN) { |  234   } else if (event.key_code() == ui::VKEY_RETURN) { | 
|  276     SetState(STATE_NORMAL); |  235     SetState(STATE_NORMAL); | 
|  277     NotifyClick(event); |  236     NotifyClick(event); | 
|  278   } else { |  237   } else { | 
|  279     return false; |  238     return false; | 
|  280   } |  239   } | 
|  281   return true; |  240   return true; | 
|  282 } |  241 } | 
|  283  |  242  | 
|  284 bool CustomButton::OnKeyReleased(const ui::KeyEvent& event) { |  243 bool CustomButton::OnKeyReleased(const ui::KeyEvent& event) { | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  338  |  297  | 
|  339 void CustomButton::ShowContextMenu(const gfx::Point& p, |  298 void CustomButton::ShowContextMenu(const gfx::Point& p, | 
|  340                                    ui::MenuSourceType source_type) { |  299                                    ui::MenuSourceType source_type) { | 
|  341   if (!context_menu_controller()) |  300   if (!context_menu_controller()) | 
|  342     return; |  301     return; | 
|  343  |  302  | 
|  344   // We're about to show the context menu. Showing the context menu likely means |  303   // We're about to show the context menu. Showing the context menu likely means | 
|  345   // we won't get a mouse exited and reset state. Reset it now to be sure. |  304   // we won't get a mouse exited and reset state. Reset it now to be sure. | 
|  346   if (state_ != STATE_DISABLED) |  305   if (state_ != STATE_DISABLED) | 
|  347     SetState(STATE_NORMAL); |  306     SetState(STATE_NORMAL); | 
|  348   if (hide_ink_drop_when_showing_context_menu_ && ink_drop_delegate_) { |  307   if (hide_ink_drop_when_showing_context_menu_ && ink_drop_delegate()) { | 
|  349     ink_drop_delegate_->SetHovered(false); |  308     ink_drop_delegate()->SetHovered(false); | 
|  350     ink_drop_delegate_->OnAction(InkDropState::HIDDEN); |  309     ink_drop_delegate()->OnAction(InkDropState::HIDDEN); | 
|  351   } |  310   } | 
|  352   View::ShowContextMenu(p, source_type); |  311   View::ShowContextMenu(p, source_type); | 
|  353 } |  312 } | 
|  354  |  313  | 
|  355 void CustomButton::OnDragDone() { |  314 void CustomButton::OnDragDone() { | 
|  356   // Only reset the state to normal if the button isn't currently disabled |  315   // Only reset the state to normal if the button isn't currently disabled | 
|  357   // (since disabled buttons may still be able to be dragged). |  316   // (since disabled buttons may still be able to be dragged). | 
|  358   if (state_ != STATE_DISABLED) |  317   if (state_ != STATE_DISABLED) | 
|  359     SetState(STATE_NORMAL); |  318     SetState(STATE_NORMAL); | 
|  360   if (ink_drop_delegate_) |  319   if (ink_drop_delegate()) | 
|  361     ink_drop_delegate_->OnAction(InkDropState::HIDDEN); |  320     ink_drop_delegate()->OnAction(InkDropState::HIDDEN); | 
|  362 } |  321 } | 
|  363  |  322  | 
|  364 void CustomButton::GetAccessibleState(ui::AXViewState* state) { |  323 void CustomButton::GetAccessibleState(ui::AXViewState* state) { | 
|  365   Button::GetAccessibleState(state); |  324   Button::GetAccessibleState(state); | 
|  366   switch (state_) { |  325   switch (state_) { | 
|  367     case STATE_HOVERED: |  326     case STATE_HOVERED: | 
|  368       state->AddStateFlag(ui::AX_STATE_HOVERED); |  327       state->AddStateFlag(ui::AX_STATE_HOVERED); | 
|  369       break; |  328       break; | 
|  370     case STATE_PRESSED: |  329     case STATE_PRESSED: | 
|  371       state->AddStateFlag(ui::AX_STATE_PRESSED); |  330       state->AddStateFlag(ui::AX_STATE_PRESSED); | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
|  397 //////////////////////////////////////////////////////////////////////////////// |  356 //////////////////////////////////////////////////////////////////////////////// | 
|  398 // CustomButton, gfx::AnimationDelegate implementation: |  357 // CustomButton, gfx::AnimationDelegate implementation: | 
|  399  |  358  | 
|  400 void CustomButton::AnimationProgressed(const gfx::Animation* animation) { |  359 void CustomButton::AnimationProgressed(const gfx::Animation* animation) { | 
|  401   SchedulePaint(); |  360   SchedulePaint(); | 
|  402 } |  361 } | 
|  403  |  362  | 
|  404 //////////////////////////////////////////////////////////////////////////////// |  363 //////////////////////////////////////////////////////////////////////////////// | 
|  405 // CustomButton, View overrides (public): |  364 // CustomButton, View overrides (public): | 
|  406  |  365  | 
|  407 void CustomButton::Layout() { |  | 
|  408   Button::Layout(); |  | 
|  409   gfx::Rect focus_bounds = GetLocalBounds(); |  | 
|  410   focus_bounds.Inset(gfx::Insets(kFocusBorderOutset)); |  | 
|  411   if (md_focus_ring_) |  | 
|  412     md_focus_ring_->SetBoundsRect(focus_bounds); |  | 
|  413 } |  | 
|  414  |  | 
|  415 void CustomButton::ViewHierarchyChanged( |  366 void CustomButton::ViewHierarchyChanged( | 
|  416     const ViewHierarchyChangedDetails& details) { |  367     const ViewHierarchyChangedDetails& details) { | 
|  417   if (!details.is_add && state_ != STATE_DISABLED) |  368   if (!details.is_add && state_ != STATE_DISABLED) | 
|  418     SetState(STATE_NORMAL); |  369     SetState(STATE_NORMAL); | 
|  419 } |  370 } | 
|  420  |  371  | 
|  421 void CustomButton::OnFocus() { |  | 
|  422   Button::OnFocus(); |  | 
|  423   if (md_focus_ring_) |  | 
|  424     md_focus_ring_->SetVisible(true); |  | 
|  425 } |  | 
|  426  |  | 
|  427 void CustomButton::OnBlur() { |  372 void CustomButton::OnBlur() { | 
|  428   Button::OnBlur(); |  373   Button::OnBlur(); | 
|  429   if (IsHotTracked()) |  374   if (IsHotTracked()) | 
|  430     SetState(STATE_NORMAL); |  375     SetState(STATE_NORMAL); | 
|  431   if (md_focus_ring_) |  376 } | 
|  432     md_focus_ring_->SetVisible(false); |  377  | 
 |  378 bool CustomButton::ShouldShowInkDropForFocus() const { | 
 |  379   return true; | 
|  433 } |  380 } | 
|  434  |  381  | 
|  435 //////////////////////////////////////////////////////////////////////////////// |  382 //////////////////////////////////////////////////////////////////////////////// | 
|  436 // CustomButton, protected: |  383 // CustomButton, protected: | 
|  437  |  384  | 
|  438 CustomButton::CustomButton(ButtonListener* listener) |  385 CustomButton::CustomButton(ButtonListener* listener) | 
|  439     : Button(listener), |  386     : Button(listener), | 
|  440       state_(STATE_NORMAL), |  387       state_(STATE_NORMAL), | 
|  441       hover_animation_(this), |  388       hover_animation_(this), | 
|  442       animate_on_state_change_(true), |  389       animate_on_state_change_(true), | 
|  443       is_throbbing_(false), |  390       is_throbbing_(false), | 
|  444       triggerable_event_flags_(ui::EF_LEFT_MOUSE_BUTTON), |  391       triggerable_event_flags_(ui::EF_LEFT_MOUSE_BUTTON), | 
|  445       request_focus_on_press_(false), |  392       request_focus_on_press_(false), | 
|  446       ink_drop_delegate_(nullptr), |  | 
|  447       notify_action_(NOTIFY_ON_RELEASE), |  393       notify_action_(NOTIFY_ON_RELEASE), | 
|  448       has_ink_drop_action_on_click_(false), |  394       has_ink_drop_action_on_click_(false), | 
|  449       ink_drop_action_on_click_(InkDropState::ACTION_TRIGGERED), |  395       ink_drop_action_on_click_(InkDropState::ACTION_TRIGGERED), | 
|  450       hide_ink_drop_when_showing_context_menu_(true), |  396       hide_ink_drop_when_showing_context_menu_(true), | 
|  451       ink_drop_base_color_(gfx::kPlaceholderColor), |  397       ink_drop_base_color_(gfx::kPlaceholderColor) { | 
|  452       md_focus_ring_(nullptr) { |  | 
|  453   hover_animation_.SetSlideDuration(kHoverFadeDurationMs); |  398   hover_animation_.SetSlideDuration(kHoverFadeDurationMs); | 
|  454 } |  399 } | 
|  455  |  400  | 
|  456 void CustomButton::StateChanged() { |  401 void CustomButton::StateChanged() { | 
|  457 } |  402 } | 
|  458  |  403  | 
|  459 bool CustomButton::IsTriggerableEvent(const ui::Event& event) { |  404 bool CustomButton::IsTriggerableEvent(const ui::Event& event) { | 
|  460   return event.type() == ui::ET_GESTURE_TAP_DOWN || |  405   return event.type() == ui::ET_GESTURE_TAP_DOWN || | 
|  461          event.type() == ui::ET_GESTURE_TAP || |  406          event.type() == ui::ET_GESTURE_TAP || | 
|  462          (event.IsMouseEvent() && |  407          (event.IsMouseEvent() && | 
|  463              (triggerable_event_flags_ & event.flags()) != 0); |  408              (triggerable_event_flags_ & event.flags()) != 0); | 
|  464 } |  409 } | 
|  465  |  410  | 
|  466 bool CustomButton::ShouldEnterPushedState(const ui::Event& event) { |  411 bool CustomButton::ShouldEnterPushedState(const ui::Event& event) { | 
|  467   return IsTriggerableEvent(event); |  412   return IsTriggerableEvent(event); | 
|  468 } |  413 } | 
|  469  |  414  | 
|  470 bool CustomButton::ShouldShowInkDropHover() const { |  415 bool CustomButton::ShouldShowInkDropHover() const { | 
|  471   return enabled() && IsMouseHovered() && !InDrag(); |  416   return enabled() && !InDrag() && | 
 |  417          (IsMouseHovered() || (ShouldShowInkDropForFocus() && HasFocus())); | 
|  472 } |  418 } | 
|  473  |  419  | 
|  474 bool CustomButton::ShouldEnterHoveredState() { |  420 bool CustomButton::ShouldEnterHoveredState() { | 
|  475   if (!visible()) |  421   if (!visible()) | 
|  476     return false; |  422     return false; | 
|  477  |  423  | 
|  478   bool check_mouse_position = true; |  424   bool check_mouse_position = true; | 
|  479 #if defined(USE_AURA) |  425 #if defined(USE_AURA) | 
|  480   // If another window has capture, we shouldn't check the current mouse |  426   // If another window has capture, we shouldn't check the current mouse | 
|  481   // position because the button won't receive any mouse events - so if the |  427   // position because the button won't receive any mouse events - so if the | 
|  482   // mouse was hovered, the button would be stuck in a hovered state (since it |  428   // mouse was hovered, the button would be stuck in a hovered state (since it | 
|  483   // would never receive OnMouseExited). |  429   // would never receive OnMouseExited). | 
|  484   const Widget* widget = GetWidget(); |  430   const Widget* widget = GetWidget(); | 
|  485   if (widget && widget->GetNativeWindow()) { |  431   if (widget && widget->GetNativeWindow()) { | 
|  486     aura::Window* root_window = widget->GetNativeWindow()->GetRootWindow(); |  432     aura::Window* root_window = widget->GetNativeWindow()->GetRootWindow(); | 
|  487     aura::client::CaptureClient* capture_client = |  433     aura::client::CaptureClient* capture_client = | 
|  488         aura::client::GetCaptureClient(root_window); |  434         aura::client::GetCaptureClient(root_window); | 
|  489     aura::Window* capture_window = |  435     aura::Window* capture_window = | 
|  490         capture_client ? capture_client->GetGlobalCaptureWindow() : nullptr; |  436         capture_client ? capture_client->GetGlobalCaptureWindow() : nullptr; | 
|  491     check_mouse_position = !capture_window || capture_window == root_window; |  437     check_mouse_position = !capture_window || capture_window == root_window; | 
|  492   } |  438   } | 
|  493 #endif |  439 #endif | 
|  494  |  440  | 
|  495   return check_mouse_position && IsMouseHovered(); |  441   return check_mouse_position && IsMouseHovered(); | 
|  496 } |  442 } | 
|  497  |  443  | 
|  498 void CustomButton::UseMdFocusRing() { |  | 
|  499   DCHECK(!md_focus_ring_); |  | 
|  500   md_focus_ring_ = new MdFocusRing(); |  | 
|  501   AddChildView(md_focus_ring_); |  | 
|  502   md_focus_ring_->SetVisible(false); |  | 
|  503   set_request_focus_on_press(false); |  | 
|  504 } |  | 
|  505  |  | 
|  506 //////////////////////////////////////////////////////////////////////////////// |  444 //////////////////////////////////////////////////////////////////////////////// | 
|  507 // CustomButton, Button overrides (protected): |  445 // CustomButton, Button overrides (protected): | 
|  508  |  446  | 
|  509 void CustomButton::NotifyClick(const ui::Event& event) { |  447 void CustomButton::NotifyClick(const ui::Event& event) { | 
|  510   if (ink_drop_delegate() && has_ink_drop_action_on_click_) |  448   if (ink_drop_delegate() && has_ink_drop_action_on_click_) | 
|  511     ink_drop_delegate()->OnAction(ink_drop_action_on_click_); |  449     ink_drop_delegate()->OnAction(ink_drop_action_on_click_); | 
|  512   Button::NotifyClick(event); |  450   Button::NotifyClick(event); | 
|  513 } |  451 } | 
|  514  |  452  | 
|  515 void CustomButton::OnClickCanceled(const ui::Event& event) { |  453 void CustomButton::OnClickCanceled(const ui::Event& event) { | 
|  516   if (ink_drop_delegate()) |  454   if (ink_drop_delegate()) | 
|  517     ink_drop_delegate()->OnAction(views::InkDropState::HIDDEN); |  455     ink_drop_delegate()->OnAction(views::InkDropState::HIDDEN); | 
|  518   Button::OnClickCanceled(event); |  456   Button::OnClickCanceled(event); | 
|  519 } |  457 } | 
|  520  |  458  | 
|  521 }  // namespace views |  459 }  // namespace views | 
| OLD | NEW |