Index: chrome/browser/views/password_manager_exceptions_view.cc |
diff --git a/chrome/browser/views/password_manager_exceptions_view.cc b/chrome/browser/views/password_manager_exceptions_view.cc |
new file mode 100755 |
index 0000000000000000000000000000000000000000..b12d471ed2645eb6f46075ae2141339c84151a64 |
--- /dev/null |
+++ b/chrome/browser/views/password_manager_exceptions_view.cc |
@@ -0,0 +1,243 @@ |
+// 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 "base/string_util.h" |
+#include "chrome/common/l10n_util.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/browser/views/password_manager_exceptions_view.h" |
+#include "chrome/browser/views/standard_layout.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/pref_service.h" |
+#include "chrome/views/background.h" |
+#include "chrome/views/grid_layout.h" |
+#include "chrome/views/native_button.h" |
+ |
+#include "generated_resources.h" |
+ |
+using views::ColumnSet; |
+using views::GridLayout; |
+ |
+// We can only have one PasswordManagerExceptionsView at a time. |
+static PasswordManagerExceptionsView* instance_ = NULL; |
+ |
+static const int kDefaultWindowWidth = 530; |
+static const int kDefaultWindowHeight = 240; |
+ |
+//////////////////////////////////////////////////////////////////// |
+// PasswordManagerExceptionsTableModel |
+PasswordManagerExceptionsTableModel::PasswordManagerExceptionsTableModel( |
+ Profile* profile) : PasswordManagerTableModel(profile) { |
+} |
+ |
+PasswordManagerExceptionsTableModel::~PasswordManagerExceptionsTableModel() { |
+} |
+ |
+std::wstring PasswordManagerExceptionsTableModel::GetText(int row, int col_id) { |
+ DCHECK_EQ(col_id, IDS_PASSWORD_MANAGER_VIEW_SITE_COLUMN); |
+ return PasswordManagerTableModel::GetText(row, col_id); |
+} |
+ |
+int PasswordManagerExceptionsTableModel::CompareValues(int row1, int row2, |
+ int col_id) { |
+ DCHECK_EQ(col_id, IDS_PASSWORD_MANAGER_VIEW_SITE_COLUMN); |
+ return PasswordManagerTableModel::CompareValues(row1, row2, col_id); |
+} |
+ |
+void PasswordManagerExceptionsTableModel::GetAllExceptionsForProfile() { |
+ DCHECK(!pending_login_query_); |
+ pending_login_query_ = web_data_service()->GetAllLogins(this); |
+} |
+ |
+void PasswordManagerExceptionsTableModel::OnWebDataServiceRequestDone( |
+ WebDataService::Handle h, |
+ const WDTypedResult* result) { |
+ DCHECK_EQ(pending_login_query_, h); |
+ pending_login_query_ = NULL; |
+ |
+ if (!result) |
+ return; |
+ |
+ DCHECK(result->GetType() == PASSWORD_RESULT); |
+ |
+ // Get the result from the database into a useable form. |
+ const WDResult<std::vector<PasswordForm*> >* r = |
+ static_cast<const WDResult<std::vector<PasswordForm*> >*>(result); |
+ std::vector<PasswordForm*> rows = r->GetValue(); |
+ STLDeleteElements<PasswordRows>(&saved_signons_); |
+ std::wstring languages = |
+ profile_->GetPrefs()->GetString(prefs::kAcceptLanguages); |
+ for (size_t i = 0; i < rows.size(); ++i) { |
+ if (rows[i]->blacklisted_by_user) { |
+ saved_signons_.push_back(new PasswordRow( |
+ gfx::SortedDisplayURL(rows[i]->origin, languages), rows[i])); |
+ } |
+ } |
+ if (observer_) |
+ observer_->OnModelChanged(); |
+} |
+ |
+////////////////////////////////////////////////////////////////////// |
+// PasswordManagerExceptionsView |
+ |
+// static |
+void PasswordManagerExceptionsView::Show(Profile* profile) { |
+ DCHECK(profile); |
+ if (!instance_) { |
+ instance_ = new PasswordManagerExceptionsView(profile); |
+ |
+ // manager is owned by the dialog window, so Close() will delete it. |
+ views::Window::CreateChromeWindow(NULL, gfx::Rect(), instance_); |
+ } |
+ if (!instance_->window()->IsVisible()) { |
+ instance_->window()->Show(); |
+ } else { |
+ instance_->window()->Activate(); |
+ } |
+} |
+ |
+PasswordManagerExceptionsView::PasswordManagerExceptionsView(Profile* profile) |
+ : remove_button_(l10n_util::GetString( |
+ IDS_PASSWORD_MANAGER_EXCEPTIONS_VIEW_REMOVE_BUTTON)), |
+ remove_all_button_(l10n_util::GetString( |
+ IDS_PASSWORD_MANAGER_EXCEPTIONS_VIEW_REMOVE_ALL_BUTTON)), |
+ table_model_(profile) { |
+ Init(); |
+} |
+ |
+void PasswordManagerExceptionsView::SetupTable() { |
+ // Creates the different columns for the table. |
+ // The float resize values are the result of much tinkering. |
+ std::vector<views::TableColumn> columns; |
+ columns.push_back(views::TableColumn( |
+ IDS_PASSWORD_MANAGER_VIEW_SITE_COLUMN, |
+ views::TableColumn::LEFT, -1, 0.55f)); |
+ columns.back().sortable = true; |
+ table_view_ = new views::TableView(&table_model_, columns, views::TEXT_ONLY, |
+ true, true, true); |
+ // Make the table initially sorted by host. |
+ views::TableView::SortDescriptors sort; |
+ sort.push_back(views::TableView::SortDescriptor( |
+ IDS_PASSWORD_MANAGER_VIEW_SITE_COLUMN, true)); |
+ table_view_->SetSortDescriptors(sort); |
+ table_view_->SetObserver(this); |
+} |
+ |
+void PasswordManagerExceptionsView::SetupButtons() { |
+ // Tell View not to delete class stack allocated views. |
+ |
+ remove_button_.SetParentOwned(false); |
+ remove_button_.SetListener(this); |
+ remove_button_.SetEnabled(false); |
+ |
+ remove_all_button_.SetParentOwned(false); |
+ remove_all_button_.SetListener(this); |
+} |
+ |
+void PasswordManagerExceptionsView::Init() { |
+ // Configure the background and view elements (buttons, labels, table). |
+ SetupButtons(); |
+ SetupTable(); |
+ |
+ // Do the layout thing. |
+ const int column_set_id = 0; |
+ GridLayout* layout = CreatePanelGridLayout(this); |
+ SetLayoutManager(layout); |
+ |
+ // Design the grid. |
+ ColumnSet* column_set = layout->AddColumnSet(column_set_id); |
+ column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, |
+ GridLayout::FIXED, 300, 0); |
+ column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing); |
+ column_set->AddColumn(GridLayout::FILL, GridLayout::LEADING, 0, |
+ GridLayout::USE_PREF, 0, 0); |
+ |
+ // Fill the grid. |
+ layout->StartRow(0.05f, column_set_id); |
+ layout->AddView(table_view_); |
+ layout->AddView(&remove_button_); |
+ |
+ // Ask the database for exception data. |
+ table_model_.GetAllExceptionsForProfile(); |
+} |
+ |
+PasswordManagerExceptionsView::~PasswordManagerExceptionsView() { |
+} |
+ |
+void PasswordManagerExceptionsView::Layout() { |
+ GetLayoutManager()->Layout(this); |
+ |
+ // Manually lay out the Remove All button in the same row as |
+ // the close button. |
+ gfx::Rect parent_bounds = GetParent()->GetLocalBounds(false); |
+ gfx::Size prefsize = remove_all_button_.GetPreferredSize(); |
+ int button_y = |
+ parent_bounds.bottom() - prefsize.height() - kButtonVEdgeMargin; |
+ remove_all_button_.SetBounds(kPanelHorizMargin, button_y, prefsize.width(), |
+ prefsize.height()); |
+} |
+ |
+gfx::Size PasswordManagerExceptionsView::GetPreferredSize() { |
+ return gfx::Size(kDefaultWindowWidth, kDefaultWindowHeight); |
+} |
+ |
+void PasswordManagerExceptionsView::ViewHierarchyChanged(bool is_add, |
+ views::View* parent, |
+ views::View* child) { |
+ if (child == this) { |
+ // Add and remove the Remove All button from the ClientView's hierarchy. |
+ if (is_add) { |
+ parent->AddChildView(&remove_all_button_); |
+ } else { |
+ parent->RemoveChildView(&remove_all_button_); |
+ } |
+ } |
+} |
+ |
+void PasswordManagerExceptionsView::OnSelectionChanged() { |
+ bool has_selection = table_view_->SelectedRowCount() > 0; |
+ remove_button_.SetEnabled(has_selection); |
+} |
+ |
+int PasswordManagerExceptionsView::GetDialogButtons() const { |
+ return DIALOGBUTTON_CANCEL; |
+} |
+ |
+std::wstring PasswordManagerExceptionsView::GetWindowTitle() const { |
+ return l10n_util::GetString(IDS_PASSWORD_MANAGER_EXCEPTIONS_VIEW_TITLE); |
+} |
+ |
+void PasswordManagerExceptionsView::ButtonPressed(views::NativeButton* sender) { |
+ DCHECK(window()); |
+ // Close will result in our destruction. |
+ if (sender == &remove_all_button_) { |
+ table_model_.ForgetAndRemoveAllSignons(); |
+ return; |
+ } |
+ |
+ // The following require a selection (and only one, since table is single- |
+ // select only). |
+ views::TableSelectionIterator iter = table_view_->SelectionBegin(); |
+ int row = *iter; |
+ PasswordForm* selected = table_model_.GetPasswordFormAt(row); |
+ DCHECK(++iter == table_view_->SelectionEnd()); |
+ |
+ if (sender == &remove_button_) { |
+ table_model_.ForgetAndRemoveSignon(row); |
+ } else { |
+ NOTREACHED() << "Invalid button."; |
+ } |
+} |
+ |
+void PasswordManagerExceptionsView::WindowClosing() { |
+ // The table model will be deleted before the table view, so detach it. |
+ table_view_->SetModel(NULL); |
+ |
+ // Clear the static instance so the next time Show() is called, a new |
+ // instance is created. |
+ instance_ = NULL; |
+} |
+ |
+views::View* PasswordManagerExceptionsView::GetContentsView() { |
+ return this; |
+} |