diff options
Diffstat (limited to 'chrome/browser/ui/views/importing_progress_view.cc')
-rw-r--r-- | chrome/browser/ui/views/importing_progress_view.cc | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/chrome/browser/ui/views/importing_progress_view.cc b/chrome/browser/ui/views/importing_progress_view.cc new file mode 100644 index 0000000..ae3135e --- /dev/null +++ b/chrome/browser/ui/views/importing_progress_view.cc @@ -0,0 +1,312 @@ +// Copyright (c) 2010 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/importing_progress_view.h" + +#include "app/l10n_util.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" +#include "grit/locale_settings.h" +#include "views/grid_layout.h" +#include "views/controls/label.h" +#include "views/controls/throbber.h" +#include "views/standard_layout.h" +#include "views/window/window.h" + +//////////////////////////////////////////////////////////////////////////////// +// ImportingProgressView, public: + +ImportingProgressView::ImportingProgressView(const std::wstring& source_name, + int16 items, + ImporterHost* coordinator, + ImportObserver* observer, + HWND parent_window, + bool bookmarks_import) + : state_bookmarks_(new views::CheckmarkThrobber), + state_searches_(new views::CheckmarkThrobber), + state_passwords_(new views::CheckmarkThrobber), + state_history_(new views::CheckmarkThrobber), + state_cookies_(new views::CheckmarkThrobber), + label_bookmarks_(new views::Label( + l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_BOOKMARKS))), + label_searches_(new views::Label( + l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_SEARCH))), + label_passwords_(new views::Label( + l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_PASSWORDS))), + label_history_(new views::Label( + l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_HISTORY))), + label_cookies_(new views::Label( + l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_COOKIES))), + parent_window_(parent_window), + coordinator_(coordinator), + import_observer_(observer), + items_(items), + importing_(true), + bookmarks_import_(bookmarks_import) { + std::wstring info_text = bookmarks_import ? + l10n_util::GetString(IDS_IMPORT_BOOKMARKS) : + l10n_util::GetStringF(IDS_IMPORT_PROGRESS_INFO, source_name); + label_info_ = new views::Label(info_text); + coordinator_->SetObserver(this); + label_info_->SetMultiLine(true); + label_info_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + label_bookmarks_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + label_searches_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + label_passwords_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + label_history_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + label_cookies_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); + + // These are scoped pointers, so we don't need the parent to delete them. + state_bookmarks_->set_parent_owned(false); + state_searches_->set_parent_owned(false); + state_passwords_->set_parent_owned(false); + state_history_->set_parent_owned(false); + state_cookies_->set_parent_owned(false); + label_bookmarks_->set_parent_owned(false); + label_searches_->set_parent_owned(false); + label_passwords_->set_parent_owned(false); + label_history_->set_parent_owned(false); + label_cookies_->set_parent_owned(false); +} + +ImportingProgressView::~ImportingProgressView() { + RemoveChildView(state_bookmarks_.get()); + RemoveChildView(state_searches_.get()); + RemoveChildView(state_passwords_.get()); + RemoveChildView(state_history_.get()); + RemoveChildView(state_cookies_.get()); + RemoveChildView(label_bookmarks_.get()); + RemoveChildView(label_searches_.get()); + RemoveChildView(label_passwords_.get()); + RemoveChildView(label_history_.get()); + RemoveChildView(label_cookies_.get()); + + if (importing_) { + // We're being deleted while importing, clean up state so that the importer + // doesn't have a reference to us and cancel the import. We can get here + // if our parent window is closed, which closes our window and deletes us. + importing_ = false; + coordinator_->SetObserver(NULL); + coordinator_->Cancel(); + if (import_observer_) + import_observer_->ImportComplete(); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// ImportingProgressView, ImporterObserver implementation: + +void ImportingProgressView::ImportItemStarted(importer::ImportItem item) { + DCHECK(items_ & item); + switch (item) { + case importer::FAVORITES: + state_bookmarks_->Start(); + break; + case importer::SEARCH_ENGINES: + state_searches_->Start(); + break; + case importer::PASSWORDS: + state_passwords_->Start(); + break; + case importer::HISTORY: + state_history_->Start(); + break; + case importer::COOKIES: + state_cookies_->Start(); + break; + } +} + +void ImportingProgressView::ImportItemEnded(importer::ImportItem item) { + DCHECK(items_ & item); + switch (item) { + case importer::FAVORITES: + state_bookmarks_->Stop(); + state_bookmarks_->SetChecked(true); + break; + case importer::SEARCH_ENGINES: + state_searches_->Stop(); + state_searches_->SetChecked(true); + break; + case importer::PASSWORDS: + state_passwords_->Stop(); + state_passwords_->SetChecked(true); + break; + case importer::HISTORY: + state_history_->Stop(); + state_history_->SetChecked(true); + break; + case importer::COOKIES: + state_cookies_->Stop(); + state_cookies_->SetChecked(true); + break; + } +} + +void ImportingProgressView::ImportStarted() { + importing_ = true; +} + +void ImportingProgressView::ImportEnded() { + // This can happen because: + // - the import completed successfully. + // - the import was canceled by the user. + // - the user chose to skip the import because they didn't want to shut down + // Firefox. + // In every case, we need to close the UI now. + importing_ = false; + coordinator_->SetObserver(NULL); + window()->Close(); + if (import_observer_) + import_observer_->ImportComplete(); +} + +//////////////////////////////////////////////////////////////////////////////// +// ImportingProgressView, views::View overrides: + +gfx::Size ImportingProgressView::GetPreferredSize() { + return gfx::Size(views::Window::GetLocalizedContentsSize( + IDS_IMPORTPROGRESS_DIALOG_WIDTH_CHARS, + IDS_IMPORTPROGRESS_DIALOG_HEIGHT_LINES)); +} + +void ImportingProgressView::ViewHierarchyChanged(bool is_add, + views::View* parent, + views::View* child) { + if (is_add && child == this) + InitControlLayout(); +} + +//////////////////////////////////////////////////////////////////////////////// +// ImportingProgressView, views::DialogDelegate implementation: + +int ImportingProgressView::GetDialogButtons() const { + return MessageBoxFlags::DIALOGBUTTON_CANCEL; +} + +std::wstring ImportingProgressView::GetDialogButtonLabel( + MessageBoxFlags::DialogButton button) const { + DCHECK(button == MessageBoxFlags::DIALOGBUTTON_CANCEL); + return l10n_util::GetString(IDS_IMPORT_PROGRESS_STATUS_CANCEL); +} + +bool ImportingProgressView::IsModal() const { + return parent_window_ != NULL; +} + +std::wstring ImportingProgressView::GetWindowTitle() const { + return l10n_util::GetString(IDS_IMPORT_PROGRESS_TITLE); +} + +bool ImportingProgressView::Cancel() { + // When the user cancels the import, we need to tell the coordinator to stop + // importing and return false so that the window lives long enough to receive + // ImportEnded, which will close the window. Closing the window results in + // another call to this function and at that point we must return true to + // allow the window to close. + if (!importing_) + return true; // We have received ImportEnded, so we can close. + + // Cancel the import and wait for further instructions. + coordinator_->Cancel(); + return false; +} + +views::View* ImportingProgressView::GetContentsView() { + return this; +} + +//////////////////////////////////////////////////////////////////////////////// +// ImportingProgressView, private: + +void ImportingProgressView::InitControlLayout() { + using views::GridLayout; + using views::ColumnSet; + + GridLayout* layout = CreatePanelGridLayout(this); + SetLayoutManager(layout); + + gfx::Size ps = state_history_->GetPreferredSize(); + + const int single_column_view_set_id = 0; + ColumnSet* column_set = layout->AddColumnSet(single_column_view_set_id); + if (bookmarks_import_) { + column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, + GridLayout::FIXED, ps.width(), 0); + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); + } + column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, + GridLayout::USE_PREF, 0, 0); + const int double_column_view_set_id = 1; + column_set = layout->AddColumnSet(double_column_view_set_id); + column_set->AddPaddingColumn(0, kUnrelatedControlLargeHorizontalSpacing); + column_set->AddColumn(GridLayout::CENTER, GridLayout::CENTER, 0, + GridLayout::FIXED, ps.width(), 0); + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); + column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 1, + GridLayout::USE_PREF, 0, 0); + column_set->AddPaddingColumn(0, kUnrelatedControlLargeHorizontalSpacing); + + layout->StartRow(0, single_column_view_set_id); + if (bookmarks_import_) + layout->AddView(state_bookmarks_.get()); + layout->AddView(label_info_); + layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing); + + if (items_ & importer::HISTORY) { + layout->StartRow(0, double_column_view_set_id); + layout->AddView(state_history_.get()); + layout->AddView(label_history_.get()); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } + if (items_ & importer::FAVORITES && !bookmarks_import_) { + layout->StartRow(0, double_column_view_set_id); + layout->AddView(state_bookmarks_.get()); + layout->AddView(label_bookmarks_.get()); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } + if (items_ & importer::SEARCH_ENGINES) { + layout->StartRow(0, double_column_view_set_id); + layout->AddView(state_searches_.get()); + layout->AddView(label_searches_.get()); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } + if (items_ & importer::PASSWORDS) { + layout->StartRow(0, double_column_view_set_id); + layout->AddView(state_passwords_.get()); + layout->AddView(label_passwords_.get()); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } + if (items_ & importer::COOKIES) { + layout->StartRow(0, double_column_view_set_id); + layout->AddView(state_cookies_.get()); + layout->AddView(label_cookies_.get()); + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// StartImportingWithUI + +void StartImportingWithUI(HWND parent_window, + uint16 items, + ImporterHost* coordinator, + const ProfileInfo& source_profile, + Profile* target_profile, + ImportObserver* observer, + bool first_run) { + DCHECK(items != 0); + ImportingProgressView* v = new ImportingProgressView( + source_profile.description, items, coordinator, observer, parent_window, + source_profile.browser_type == importer::BOOKMARKS_HTML); + views::Window* window = + views::Window::CreateChromeWindow(parent_window, gfx::Rect(), v); + + if (!coordinator->is_headless() && !first_run) + window->Show(); + + coordinator->StartImportSettings(source_profile, target_profile, items, + new ProfileWriter(target_profile), + first_run); +} |