// 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 "chrome/browser/views/go_button.h" #include "app/l10n_util.h" #include "base/compiler_specific.h" #include "base/message_loop.h" #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/browser.h" #include "chrome/browser/profile.h" #include "chrome/browser/search_engines/template_url_model.h" #include "chrome/browser/views/event_utils.h" #include "chrome/browser/views/location_bar_view.h" #include "grit/generated_resources.h" //////////////////////////////////////////////////////////////////////////////// // GoButton, public: GoButton::GoButton(LocationBarView* location_bar, Browser* browser) : ToggleImageButton(this), ALLOW_THIS_IN_INITIALIZER_LIST(stop_timer_(this)), location_bar_(location_bar), browser_(browser), intended_mode_(MODE_GO), visible_mode_(MODE_GO) { DCHECK(location_bar_); set_triggerable_event_flags(views::Event::EF_LEFT_BUTTON_DOWN | views::Event::EF_MIDDLE_BUTTON_DOWN); } GoButton::~GoButton() { stop_timer_.RevokeAll(); } void GoButton::ChangeMode(Mode mode, bool force) { intended_mode_ = mode; // If the change is forced, or the user isn't hovering the icon, or it's safe // to change it to the other image type, make the change immediately; // otherwise we'll let it happen later. if (force || (state() != BS_HOT) || ((mode == MODE_STOP) ? stop_timer_.empty() : (visible_mode_ != MODE_STOP))) { stop_timer_.RevokeAll(); SetToggled(mode == MODE_STOP); visible_mode_ = mode; } } //////////////////////////////////////////////////////////////////////////////// // GoButton, views::ButtonListener implementation: void GoButton::ButtonPressed(views::Button* button, const views::Event& event) { if (visible_mode_ == MODE_STOP) { browser_->Stop(); // The user has clicked, so we can feel free to update the button, // even if the mouse is still hovering. ChangeMode(MODE_GO, true); } else if (visible_mode_ == MODE_GO && stop_timer_.empty()) { // If the go button is visible and not within the double click timer, go. browser_->Go(event_utils::DispositionFromEventFlags(mouse_event_flags())); // Stop any existing timers. stop_timer_.RevokeAll(); // Start a timer - while this timer is running, the go button // cannot be changed to a stop button. We do not set intended_mode_ // to MODE_STOP here as we want to wait for the browser to tell // us that it has started loading (and this may occur only after // some delay). MessageLoop::current()->PostDelayedTask(FROM_HERE, stop_timer_.NewRunnableMethod(&GoButton::OnButtonTimer), GetDoubleClickTimeMS()); } } //////////////////////////////////////////////////////////////////////////////// // GoButton, View overrides: void GoButton::OnMouseExited(const views::MouseEvent& e) { ChangeMode(intended_mode_, true); if (state() != BS_DISABLED) SetState(BS_NORMAL); } bool GoButton::GetTooltipText(int x, int y, std::wstring* tooltip) { if (visible_mode_ == MODE_STOP) { tooltip->assign(l10n_util::GetString(IDS_TOOLTIP_STOP)); return true; } std::wstring current_text(location_bar_->location_entry()->GetText()); if (current_text.empty()) return false; // Need to make sure the text direction is adjusted based on the locale so // that pure LTR strings are displayed appropriately on RTL locales. For // example, not adjusting the string will cause the URL // "http://www.google.com/" to be displayed in the tooltip as // "/http://www.google.com". // // Note that we mark the URL's text as LTR (instead of examining the // characters and guessing the text directionality) since URLs are always // treated as left-to-right text, even when they contain RTL characters. if (l10n_util::GetTextDirection() == l10n_util::RIGHT_TO_LEFT) l10n_util::WrapStringWithLTRFormatting(¤t_text); AutocompleteEditModel* edit_model = location_bar_->location_entry()->model(); if (edit_model->CurrentTextIsURL()) { tooltip->assign(l10n_util::GetStringF(IDS_TOOLTIP_GO_SITE, current_text)); } else { std::wstring keyword(edit_model->keyword()); TemplateURLModel* template_url_model = location_bar_->profile()->GetTemplateURLModel(); const TemplateURL* provider = (keyword.empty() || edit_model->is_keyword_hint()) ? template_url_model->GetDefaultSearchProvider() : template_url_model->GetTemplateURLForKeyword(keyword); if (!provider) return false; tooltip->assign(l10n_util::GetStringF(IDS_TOOLTIP_GO_SEARCH, provider->AdjustedShortNameForLocaleDirection(), current_text)); } return true; } //////////////////////////////////////////////////////////////////////////////// // GoButton, private: void GoButton::OnButtonTimer() { stop_timer_.RevokeAll(); ChangeMode(intended_mode_, true); }