// 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/history_tab_ui.h" #include "base/string_util.h" #include "chrome/app/theme/theme_resources.h" #include "chrome/browser/history_model.h" #include "chrome/browser/history_view.h" #include "chrome/browser/user_metrics.h" #include "chrome/common/l10n_util.h" #include "chrome/common/resource_bundle.h" #include "chrome/views/checkbox.h" #include "net/base/escape.h" #include "generated_resources.h" // State key used to identify search text. static const wchar_t kSearchTextKey[] = L"st"; // State key used for whether the search is for starred pages only. static const wchar_t kStarredOnlyKey[] = L"starred_only"; // HistoryTabUIFactory ------------------------------------------------------ class HistoryTabUIFactory : public NativeUIFactory { public: HistoryTabUIFactory() {} virtual ~HistoryTabUIFactory() {} virtual NativeUI* CreateNativeUIForURL(const GURL& url, NativeUIContents* contents) { HistoryTabUI* tab_ui = new HistoryTabUI(contents); tab_ui->Init(); return tab_ui; } private: DISALLOW_EVIL_CONSTRUCTORS(HistoryTabUIFactory); }; // HistoryTabUI ------------------------------------------------------------- HistoryTabUI::HistoryTabUI(NativeUIContents* contents) #pragma warning(suppress: 4355) // Okay to pass "this" here. : searchable_container_(this), contents_(contents) { } void HistoryTabUI::Init() { model_ = CreateModel(); searchable_container_.SetContents(CreateHistoryView()); } const std::wstring HistoryTabUI::GetTitle() const { return l10n_util::GetString(IDS_HISTORY_TITLE); } const int HistoryTabUI::GetFavIconID() const { return IDR_HISTORY_FAVICON; } const int HistoryTabUI::GetSectionIconID() const { return IDR_HISTORY_SECTION; } const std::wstring HistoryTabUI::GetSearchButtonText() const { return l10n_util::GetString(IDS_HISTORY_SEARCH_BUTTON); } views::View* HistoryTabUI::GetView() { return &searchable_container_; } void HistoryTabUI::WillBecomeVisible(NativeUIContents* parent) { UserMetrics::RecordAction(L"Destination_History", parent->profile()); } void HistoryTabUI::WillBecomeInvisible(NativeUIContents* parent) { } void HistoryTabUI::Navigate(const PageState& state) { std::wstring search_text; state.GetProperty(kSearchTextKey, &search_text); // Make sure a query starts on navigation, that way if history has changed // since we last issued the query we'll show the right thing. if (model_->GetSearchText() == search_text) model_->Refresh(); else model_->SetSearchText(search_text); searchable_container_.GetSearchField()->SetText(search_text); ChangedModel(); } bool HistoryTabUI::SetInitialFocus() { searchable_container_.GetSearchField()->RequestFocus(); return true; } // static GURL HistoryTabUI::GetURL() { std::string spec(NativeUIContents::GetScheme()); spec.append("://history"); return GURL(spec); } // static NativeUIFactory* HistoryTabUI::GetNativeUIFactory() { return new HistoryTabUIFactory(); } // static const GURL HistoryTabUI::GetHistoryURLWithSearchText( const std::wstring& text) { return GURL(GetURL().spec() + "/params?" + WideToUTF8(kSearchTextKey) + "=" + EscapeQueryParamValue(WideToUTF8(text))); } BaseHistoryModel* HistoryTabUI::CreateModel() { return new HistoryModel(contents_->profile(), std::wstring()); } HistoryView* HistoryTabUI::CreateHistoryView() { return new HistoryView(&searchable_container_, model_, contents_); } void HistoryTabUI::ChangedModel() { HistoryView* history_view = static_cast(searchable_container_.GetContents()); history_view->SetShowDeleteControls(model_->GetSearchText().empty()); if (!model_->GetSearchText().empty()) UserMetrics::RecordAction(L"History_Search", contents_->profile()); } void HistoryTabUI::DoSearch(const std::wstring& text) { if (model_->GetSearchText() == text) return; model_->SetSearchText(text); // Update the page state. PageState* page_state = contents_->page_state().Copy(); page_state->SetProperty(kSearchTextKey, text); contents_->SetPageState(page_state); ChangedModel(); }