1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/toolbar/reload_button.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/search/search_model.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/theme_provider.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/metrics.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contents of the Reload drop-down menu. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kReloadMenuItems[] = { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_RELOAD_MENU_HARD_RELOAD_ITEM, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDS_RELOAD_MENU_EMPTY_AND_HARD_RELOAD_ITEM, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ReloadButton --------------------------------------------------------------- 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char ReloadButton::kViewClassName[] = "ReloadButton"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 390529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochReloadButton::ReloadButton(CommandUpdater* command_updater) 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : ToolbarButton(this, CreateMenuModel()), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_(command_updater), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intended_mode_(MODE_RELOAD), 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_mode_(MODE_RELOAD), 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_click_timer_delay_( 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta::FromMilliseconds(views::GetDoubleClickInterval())), 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stop_to_reload_timer_delay_(base::TimeDelta::FromMilliseconds(1350)), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) menu_enabled_(false), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_mouse_hovered_(false), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_reload_count_(0) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ReloadButton::~ReloadButton() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ChangeMode(Mode mode, bool force) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) intended_mode_ = mode; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the change is forced, or the user isn't hovering the icon, or it's safe 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to change it to the other image type, make the change immediately; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise we'll let it happen later. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (force || (!IsMouseHovered() && !testing_mouse_hovered_) || 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((mode == MODE_STOP) ? 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !double_click_timer_.IsRunning() : (visible_mode_ != MODE_STOP))) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_click_timer_.Stop(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stop_to_reload_timer_.Stop(); 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mode != visible_mode_) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ChangeModeInternal(mode); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetEnabled(true); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We want to disable the button if we're preventing a change from stop to 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reload due to hovering, but not if we're preventing a change from reload to 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stop due to the double-click timer running. (Disabled reload state is only 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // applicable when instant extended API is enabled and mode is NTP, which is 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // handled just above.) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (visible_mode_ != MODE_RELOAD) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEnabled(false); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Go ahead and change to reload after a bit, which allows repeated reloads 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // without moving the mouse. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!stop_to_reload_timer_.IsRunning()) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stop_to_reload_timer_.Start(FROM_HERE, stop_to_reload_timer_delay_, this, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReloadButton::OnStopToReloadTimer); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ReloadButton::LoadImages() { 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ChangeModeInternal(visible_mode_); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreferredSizeChanged(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ReloadButton::OnMouseExited(const ui::MouseEvent& event) { 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ToolbarButton::OnMouseExited(event); 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!IsMenuShowing()) 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ChangeMode(intended_mode_, true); 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ReloadButton::GetTooltipText(const gfx::Point& p, 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* tooltip) const { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int reload_tooltip = menu_enabled_ ? 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_TOOLTIP_RELOAD_WITH_MENU : IDS_TOOLTIP_RELOAD; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int text_id = (visible_mode_ == MODE_RELOAD) ? 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch reload_tooltip : IDS_TOOLTIP_STOP; 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tooltip->assign(l10n_util::GetStringUTF16(text_id)); 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char* ReloadButton::GetClassName() const { 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return kViewClassName; 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ReloadButton::GetAccessibleState(ui::AXViewState* state) { 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (menu_enabled_) 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ToolbarButton::GetAccessibleState(state); 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else 1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CustomButton::GetAccessibleState(state); 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ReloadButton::ShouldShowMenu() { 1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return menu_enabled_ && (visible_mode_ == MODE_RELOAD); 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ReloadButton::ShowDropDownMenu(ui::MenuSourceType source_type) { 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ToolbarButton::ShowDropDownMenu(source_type); // Blocks. 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ChangeMode(intended_mode_, true); 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ButtonPressed(views::Button* /* button */, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClearPendingMenu(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible_mode_ == MODE_STOP) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (command_updater_) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_updater_->ExecuteCommandWithDisposition(IDC_STOP, CURRENT_TAB); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The user has clicked, so we can feel free to update the button, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even if the mouse is still hovering. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeMode(MODE_RELOAD, true); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!double_click_timer_.IsRunning()) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shift-clicking or ctrl-clicking the reload button means we should ignore 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any cached content. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int command; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags = event.flags(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.IsShiftDown() || event.IsControlDown()) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command = IDC_RELOAD_IGNORING_CACHE; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mask off Shift and Control so they don't affect the disposition below. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags &= ~(ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command = IDC_RELOAD; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start a timer - while this timer is running, the reload button cannot be 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed to a stop button. We do not set |intended_mode_| to MODE_STOP 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // here as the browser will do that when it actually starts loading (which 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may happen synchronously, thus the need to do this before telling the 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // browser to execute the reload command). 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double_click_timer_.Start(FROM_HERE, double_click_timer_delay_, this, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReloadButton::OnDoubleClickTimer); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteBrowserCommand(command, flags); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++testing_reload_count_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdChecked(int command_id) const { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdEnabled(int command_id) const { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::IsCommandIdVisible(int command_id) const { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ReloadButton::GetAcceleratorForCommandId(int command_id, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator* accelerator) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (command_id) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->GetAccelerator(IDC_RELOAD, accelerator); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDS_RELOAD_MENU_HARD_RELOAD_ITEM: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->GetAccelerator(IDC_RELOAD_IGNORING_CACHE, accelerator); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetWidget()->GetAccelerator(command_id, accelerator); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ExecuteCommand(int command_id, int event_flags) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int browser_command = 0; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (command_id) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDS_RELOAD_MENU_NORMAL_RELOAD_ITEM: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command = IDC_RELOAD; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDS_RELOAD_MENU_HARD_RELOAD_ITEM: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command = IDC_RELOAD_IGNORING_CACHE; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IDS_RELOAD_MENU_EMPTY_AND_HARD_RELOAD_ITEM: 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_command = IDC_RELOAD_CLEARING_CACHE; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteBrowserCommand(browser_command, event_flags); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::SimpleMenuModel* ReloadButton::CreateMenuModel() { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::SimpleMenuModel* menu_model = new ui::SimpleMenuModel(this); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(kReloadMenuItems); ++i) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) menu_model->AddItemWithStringId(kReloadMenuItems[i], kReloadMenuItems[i]); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return menu_model; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ExecuteBrowserCommand(int command, int event_flags) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!command_updater_) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) command_updater_->ExecuteCommandWithDisposition( 22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) command, ui::DispositionFromEventFlags(event_flags)); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::ChangeModeInternal(Mode mode) { 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::ThemeProvider* tp = GetThemeProvider(); 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |tp| can be NULL in unit tests. 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (tp) { 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetImage(views::Button::STATE_NORMAL, *(tp->GetImageSkiaNamed( 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (mode == MODE_RELOAD) ? IDR_RELOAD : IDR_STOP))); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetImage(views::Button::STATE_DISABLED, *(tp->GetImageSkiaNamed( 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (mode == MODE_RELOAD) ? IDR_RELOAD_D : IDR_STOP_D))); 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visible_mode_ = mode; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::OnDoubleClickTimer() { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsMenuShowing()) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeMode(intended_mode_, false); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ReloadButton::OnStopToReloadTimer() { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!IsMenuShowing()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChangeMode(intended_mode_, true); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 247