From f078edace3c34929fefcbec8115ae9faf20cf0b4 Mon Sep 17 00:00:00 2001 From: "jhawkins@google.com" Date: Fri, 17 Dec 2010 01:49:53 +0000 Subject: Views: Implement the ImporterList::Observer in ImporterView to enable the correct asynchronous version of Importer. BUG=none TEST=none Review URL: http://codereview.chromium.org/5873005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@69502 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/importer/importer.h | 5 +++++ chrome/browser/importer/importer_list.cc | 7 ++++++- chrome/browser/importer/importer_list.h | 3 +++ chrome/browser/ui/views/importer_view.cc | 35 ++++++++++++++++++++++---------- chrome/browser/ui/views/importer_view.h | 16 +++++++++------ 5 files changed, 48 insertions(+), 18 deletions(-) (limited to 'chrome/browser') diff --git a/chrome/browser/importer/importer.h b/chrome/browser/importer/importer.h index bc25850..e994036 100644 --- a/chrome/browser/importer/importer.h +++ b/chrome/browser/importer/importer.h @@ -184,6 +184,11 @@ class ImporterHost : public base::RefCountedThreadSafe, return importer_list_->GetSourceProfileInfoForBrowserType(browser_type); } + // Returns true if the source profiles have been loaded. + bool source_profiles_loaded() const { + return importer_list_->source_profiles_loaded(); + } + protected: friend class base::RefCountedThreadSafe; diff --git a/chrome/browser/importer/importer_list.cc b/chrome/browser/importer/importer_list.cc index e38cc5e..10e1101 100644 --- a/chrome/browser/importer/importer_list.cc +++ b/chrome/browser/importer/importer_list.cc @@ -98,7 +98,8 @@ void DetectFirefoxProfiles(std::vector* profiles) { profiles->push_back(firefox); } -void DetectGoogleToolbarProfiles(std::vector* profiles) { +void DetectGoogleToolbarProfiles( + std::vector* profiles) { if (FirstRun::IsChromeFirstRun()) return; @@ -196,6 +197,10 @@ const importer::ProfileInfo& ImporterList::GetSourceProfileInfoForBrowserType( return *(new importer::ProfileInfo()); } +bool ImporterList::source_profiles_loaded() const { + return source_profiles_loaded_; +} + void ImporterList::DetectSourceProfilesWorker() { // TODO(jhawkins): Remove this condition once DetectSourceProfileHack is // removed. |observer_| is NULL when said method is called. diff --git a/chrome/browser/importer/importer_list.h b/chrome/browser/importer/importer_list.h index fc801fc..f3db148 100644 --- a/chrome/browser/importer/importer_list.h +++ b/chrome/browser/importer/importer_list.h @@ -61,6 +61,9 @@ class ImporterList : public base::RefCountedThreadSafe { const importer::ProfileInfo& GetSourceProfileInfoForBrowserType( int browser_type) const; + // Returns true if the source profiles have been loaded. + bool source_profiles_loaded() const; + private: friend class base::RefCountedThreadSafe; diff --git a/chrome/browser/ui/views/importer_view.cc b/chrome/browser/ui/views/importer_view.cc index 4ef686f..cbbfba7 100644 --- a/chrome/browser/ui/views/importer_view.cc +++ b/chrome/browser/ui/views/importer_view.cc @@ -5,7 +5,7 @@ #include "chrome/browser/views/importer_view.h" #include "app/l10n_util.h" -#include "base/string16.h" +#include "base/compiler_specific.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_list.h" #include "chrome/browser/browser_window.h" @@ -42,7 +42,7 @@ ImporterView::ImporterView(Profile* profile, int initial_state) passwords_checkbox_(NULL), search_engines_checkbox_(NULL), profile_(profile), - importer_host_(new ImporterHost()), + ALLOW_THIS_IN_INITIALIZER_LIST(importer_host_(new ImporterHost(this))), initial_state_(initial_state) { DCHECK(profile); SetupControl(); @@ -149,9 +149,8 @@ std::wstring ImporterView::GetWindowTitle() const { } bool ImporterView::Accept() { - if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) { + if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) return false; - } uint16 items = GetCheckedItems(); @@ -179,15 +178,16 @@ void ImporterView::ButtonPressed( int ImporterView::GetItemCount() { DCHECK(importer_host_.get()); - int item_count = importer_host_->GetAvailableProfileCount(); - if (checkbox_items_.size() < static_cast(item_count)) - checkbox_items_.resize(item_count, initial_state_); - return item_count; + return checkbox_items_.size(); } string16 ImporterView::GetItemAt(int index) { DCHECK(importer_host_.get()); - return WideToUTF16Hack(importer_host_->GetSourceProfileNameAt(index)); + + if (!importer_host_->source_profiles_loaded()) + return l10n_util::GetStringUTF16(IDS_IMPORT_LOADING_PROFILES); + else + return WideToUTF16Hack(importer_host_->GetSourceProfileNameAt(index)); } void ImporterView::ItemChanged(views::Combobox* combobox, @@ -199,6 +199,11 @@ void ImporterView::ItemChanged(views::Combobox* combobox, if (prev_index == new_index) return; + if (!importer_host_->source_profiles_loaded()) { + SetCheckedItemsState(0); + return; + } + // Save the current state uint16 prev_items = GetCheckedItems(); checkbox_items_[prev_index] = prev_items; @@ -213,6 +218,15 @@ void ImporterView::ItemChanged(views::Combobox* combobox, SetCheckedItems(new_items); } +void ImporterView::SourceProfilesLoaded() { + DCHECK(importer_host_->source_profiles_loaded()); + checkbox_items_.resize( + importer_host_->GetAvailableProfileCount(), initial_state_); + + // Reload the profile combobox. + profile_combobox_->ModelChanged(); +} + void ImporterView::ImportCanceled() { ImportComplete(); } @@ -282,6 +296,5 @@ void ImporterView::SetCheckedItems(uint16 items) { passwords_checkbox_->SetChecked(!!(items & importer::PASSWORDS)); if (search_engines_checkbox_->IsEnabled()) - search_engines_checkbox_->SetChecked(!!(items & - importer::SEARCH_ENGINES)); + search_engines_checkbox_->SetChecked(!!(items & importer::SEARCH_ENGINES)); } diff --git a/chrome/browser/ui/views/importer_view.h b/chrome/browser/ui/views/importer_view.h index ca1ce1c..0d06485 100644 --- a/chrome/browser/ui/views/importer_view.h +++ b/chrome/browser/ui/views/importer_view.h @@ -31,6 +31,7 @@ class ImporterView : public views::View, public views::ButtonListener, public ComboboxModel, public views::Combobox::Listener, + public ImporterList::Observer, public ImportObserver { public: // Creates a new ImporterView. |initial_state| is a bitmask of ImportItems. @@ -38,11 +39,11 @@ class ImporterView : public views::View, ImporterView(Profile* profile, int initial_state); virtual ~ImporterView(); - // Overridden from views::View: + // views::View implementation. virtual gfx::Size GetPreferredSize(); virtual void Layout(); - // Overridden from views::DialogDelegate: + // views::DialogDelegate implementation. virtual std::wstring GetDialogButtonLabel( MessageBoxFlags::DialogButton button) const; virtual bool IsDialogButtonEnabled( @@ -52,19 +53,22 @@ class ImporterView : public views::View, virtual bool Accept(); virtual views::View* GetContentsView(); - // Overridden from views::ButtonListener: + // views::ButtonListener implementation. virtual void ButtonPressed(views::Button* sender, const views::Event& event); - // Overridden from ComboboxModel: + // ComboboxModel implementation. virtual int GetItemCount(); virtual string16 GetItemAt(int index); - // Overridden from ChromeViews::Combobox::Listener: + // ChromeViews::Combobox::Listener implementation. virtual void ItemChanged(views::Combobox* combobox, int prev_index, int new_index); - // Overridden from ImportObserver: + // ImporterList::Observer implementation. + virtual void SourceProfilesLoaded(); + + // ImportObserver implementation. virtual void ImportCanceled(); virtual void ImportComplete(); -- cgit v1.1