blob: 151badfc6600f8e46c8344a61e001bfdeeacb425 [file] [log] [blame]
// 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/importer_view.h"
#include "app/l10n_util.h"
#include "chrome/browser/browser_list.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/importer/importer_data_types.h"
#include "grit/generated_resources.h"
#include "grit/locale_settings.h"
#include "views/controls/button/checkbox.h"
#include "views/controls/label.h"
#include "views/grid_layout.h"
#include "views/standard_layout.h"
#include "views/widget/widget.h"
#include "views/window/window.h"
using views::ColumnSet;
using views::GridLayout;
namespace browser {
// Declared in browser_dialogs.h so caller's don't have to depend on our header.
void ShowImporterView(views::Widget* parent,
Profile* profile) {
views::Window::CreateChromeWindow(parent->GetNativeView(), gfx::Rect(),
new ImporterView(profile, importer::ALL))->Show();
}
} // namespace browser
ImporterView::ImporterView(Profile* profile, int initial_state)
: import_from_label_(NULL),
profile_combobox_(NULL),
import_items_label_(NULL),
history_checkbox_(NULL),
favorites_checkbox_(NULL),
passwords_checkbox_(NULL),
search_engines_checkbox_(NULL),
profile_(profile),
importer_host_(new ImporterHost()),
initial_state_(initial_state) {
DCHECK(profile);
SetupControl();
}
ImporterView::~ImporterView() {
}
void ImporterView::SetupControl() {
// Adds all controls.
import_from_label_ =
new views::Label(l10n_util::GetString(IDS_IMPORT_FROM_LABEL));
profile_combobox_ = new views::Combobox(this);
profile_combobox_->set_listener(this);
profile_combobox_->SetAccessibleName(import_from_label_->GetText());
import_items_label_ =
new views::Label(l10n_util::GetString(IDS_IMPORT_ITEMS_LABEL));
history_checkbox_ =
InitCheckbox(l10n_util::GetString(IDS_IMPORT_HISTORY_CHKBOX),
(initial_state_ & importer::HISTORY) != 0);
favorites_checkbox_ =
InitCheckbox(l10n_util::GetString(IDS_IMPORT_FAVORITES_CHKBOX),
(initial_state_ & importer::FAVORITES) != 0);
passwords_checkbox_ =
InitCheckbox(l10n_util::GetString(IDS_IMPORT_PASSWORDS_CHKBOX),
(initial_state_ & importer::PASSWORDS) != 0);
search_engines_checkbox_ =
InitCheckbox(l10n_util::GetString(IDS_IMPORT_SEARCH_ENGINES_CHKBOX),
(initial_state_ & importer::SEARCH_ENGINES) != 0);
// Arranges controls by using GridLayout.
const int column_set_id = 0;
GridLayout* layout = CreatePanelGridLayout(this);
SetLayoutManager(layout);
ColumnSet* column_set = layout->AddColumnSet(column_set_id);
column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
GridLayout::USE_PREF, 0, 0);
column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
column_set->AddColumn(GridLayout::FILL, GridLayout::CENTER, 0,
GridLayout::FIXED, 200, 0);
layout->StartRow(0, column_set_id);
layout->AddView(import_from_label_);
layout->AddView(profile_combobox_);
layout->AddPaddingRow(0, kUnrelatedControlVerticalSpacing);
layout->StartRow(0, column_set_id);
layout->AddView(import_items_label_, 3, 1);
layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
layout->StartRow(0, column_set_id);
layout->AddView(favorites_checkbox_, 3, 1);
layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
layout->StartRow(0, column_set_id);
layout->AddView(search_engines_checkbox_, 3, 1);
layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
layout->StartRow(0, column_set_id);
layout->AddView(passwords_checkbox_, 3, 1);
layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
layout->StartRow(0, column_set_id);
layout->AddView(history_checkbox_, 3, 1);
layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
}
gfx::Size ImporterView::GetPreferredSize() {
return gfx::Size(views::Window::GetLocalizedContentsSize(
IDS_IMPORT_DIALOG_WIDTH_CHARS,
IDS_IMPORT_DIALOG_HEIGHT_LINES));
}
void ImporterView::Layout() {
GetLayoutManager()->Layout(this);
}
std::wstring ImporterView::GetDialogButtonLabel(
MessageBoxFlags::DialogButton button) const {
if (button == MessageBoxFlags::DIALOGBUTTON_OK) {
return l10n_util::GetString(IDS_IMPORT_COMMIT);
} else {
return std::wstring();
}
}
bool ImporterView::IsDialogButtonEnabled(
MessageBoxFlags::DialogButton button) const {
if (button == MessageBoxFlags::DIALOGBUTTON_OK) {
return history_checkbox_->checked() ||
favorites_checkbox_->checked() ||
passwords_checkbox_->checked() ||
search_engines_checkbox_->checked();
}
return true;
}
bool ImporterView::IsModal() const {
return true;
}
std::wstring ImporterView::GetWindowTitle() const {
return l10n_util::GetString(IDS_IMPORT_SETTINGS_TITLE);
}
bool ImporterView::Accept() {
if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) {
return false;
}
uint16 items = GetCheckedItems();
int selected_index = profile_combobox_->selected_item();
StartImportingWithUI(GetWidget()->GetNativeView(), items,
importer_host_.get(),
importer_host_->GetSourceProfileInfoAt(selected_index),
profile_, this, false);
// We return false here to prevent the window from being closed. We will be
// notified back by our implementation of ImportObserver when the import is
// complete so that we can close ourselves.
return false;
}
views::View* ImporterView::GetContentsView() {
return this;
}
void ImporterView::ButtonPressed(
views::Button* sender, const views::Event& event) {
// When no checkbox is checked we should disable the "Import" button.
// This forces the button to evaluate what state they should be in.
GetDialogClientView()->UpdateDialogButtons();
}
int ImporterView::GetItemCount() {
DCHECK(importer_host_.get());
int item_count = importer_host_->GetAvailableProfileCount();
if (checkbox_items_.size() < static_cast<size_t>(item_count))
checkbox_items_.resize(item_count, initial_state_);
return item_count;
}
std::wstring ImporterView::GetItemAt(int index) {
DCHECK(importer_host_.get());
return importer_host_->GetSourceProfileNameAt(index);
}
void ImporterView::ItemChanged(views::Combobox* combobox,
int prev_index, int new_index) {
DCHECK(combobox);
DCHECK(checkbox_items_.size() >=
static_cast<size_t>(importer_host_->GetAvailableProfileCount()));
if (prev_index == new_index)
return;
// Save the current state
uint16 prev_items = GetCheckedItems();
checkbox_items_[prev_index] = prev_items;
// Enable/Disable the checkboxes for this Item
uint16 new_enabled_items = importer_host_->GetSourceProfileInfoAt(
new_index).services_supported;
SetCheckedItemsState(new_enabled_items);
// Set the checked items for this Item
uint16 new_items = checkbox_items_[new_index];
SetCheckedItems(new_items);
}
void ImporterView::ImportCanceled() {
ImportComplete();
}
void ImporterView::ImportComplete() {
// Now close this window since the import completed or was canceled.
window()->Close();
}
views::Checkbox* ImporterView::InitCheckbox(const std::wstring& text,
bool checked) {
views::Checkbox* checkbox = new views::Checkbox(text);
checkbox->SetChecked(checked);
checkbox->set_listener(this);
return checkbox;
}
uint16 ImporterView::GetCheckedItems() {
uint16 items = importer::NONE;
if (history_checkbox_->IsEnabled() && history_checkbox_->checked())
items |= importer::HISTORY;
if (favorites_checkbox_->IsEnabled() && favorites_checkbox_->checked())
items |= importer::FAVORITES;
if (passwords_checkbox_->IsEnabled() && passwords_checkbox_->checked())
items |= importer::PASSWORDS;
if (search_engines_checkbox_->IsEnabled() &&
search_engines_checkbox_->checked())
items |= importer::SEARCH_ENGINES;
return items;
}
void ImporterView::SetCheckedItemsState(uint16 items) {
if (items & importer::HISTORY) {
history_checkbox_->SetEnabled(true);
} else {
history_checkbox_->SetEnabled(false);
history_checkbox_->SetChecked(false);
}
if (items & importer::FAVORITES) {
favorites_checkbox_->SetEnabled(true);
} else {
favorites_checkbox_->SetEnabled(false);
favorites_checkbox_->SetChecked(false);
}
if (items & importer::PASSWORDS) {
passwords_checkbox_->SetEnabled(true);
} else {
passwords_checkbox_->SetEnabled(false);
passwords_checkbox_->SetChecked(false);
}
if (items & importer::SEARCH_ENGINES) {
search_engines_checkbox_->SetEnabled(true);
} else {
search_engines_checkbox_->SetEnabled(false);
search_engines_checkbox_->SetChecked(false);
}
}
void ImporterView::SetCheckedItems(uint16 items) {
if (history_checkbox_->IsEnabled())
history_checkbox_->SetChecked(!!(items & importer::HISTORY));
if (favorites_checkbox_->IsEnabled())
favorites_checkbox_->SetChecked(!!(items & importer::FAVORITES));
if (passwords_checkbox_->IsEnabled())
passwords_checkbox_->SetChecked(!!(items & importer::PASSWORDS));
if (search_engines_checkbox_->IsEnabled())
search_engines_checkbox_->SetChecked(!!(items &
importer::SEARCH_ENGINES));
}