| Index: chrome/browser/views/options/geolocation_exceptions_view.cc
|
| ===================================================================
|
| --- chrome/browser/views/options/geolocation_exceptions_view.cc (revision 0)
|
| +++ chrome/browser/views/options/geolocation_exceptions_view.cc (revision 0)
|
| @@ -0,0 +1,180 @@
|
| +// 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/options/geolocation_exceptions_view.h"
|
| +
|
| +#include <algorithm>
|
| +#include <vector>
|
| +
|
| +#include "app/l10n_util.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "grit/locale_settings.h"
|
| +#include "gfx/rect.h"
|
| +#include "views/controls/button/native_button.h"
|
| +#include "views/controls/table/table_view.h"
|
| +#include "views/grid_layout.h"
|
| +#include "views/standard_layout.h"
|
| +#include "views/window/window.h"
|
| +
|
| +static const int kExceptionsViewInsetSize = 5;
|
| +static GeolocationExceptionsView* instance = NULL;
|
| +
|
| +// static
|
| +void GeolocationExceptionsView::ShowExceptionsWindow(
|
| + gfx::NativeWindow parent,
|
| + GeolocationContentSettingsMap* map) {
|
| + if (!instance) {
|
| + instance = new GeolocationExceptionsView(map);
|
| + views::Window::CreateChromeWindow(parent, gfx::Rect(), instance);
|
| + }
|
| +
|
| + // This will show invisible windows and bring visible windows to the front.
|
| + instance->window()->Show();
|
| +}
|
| +
|
| +GeolocationExceptionsView::~GeolocationExceptionsView() {
|
| + instance = NULL;
|
| + table_->SetModel(NULL);
|
| +}
|
| +
|
| +void GeolocationExceptionsView::OnSelectionChanged() {
|
| + UpdateButtonState();
|
| +}
|
| +
|
| +void GeolocationExceptionsView::OnTableViewDelete(
|
| + views::TableView* table_view) {
|
| + Remove();
|
| +}
|
| +
|
| +void GeolocationExceptionsView::ButtonPressed(views::Button* sender,
|
| + const views::Event& event) {
|
| + switch (sender->tag()) {
|
| + case IDS_EXCEPTIONS_REMOVEALL_BUTTON:
|
| + RemoveAll();
|
| + break;
|
| + case IDS_EXCEPTIONS_REMOVE_BUTTON:
|
| + Remove();
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +}
|
| +
|
| +void GeolocationExceptionsView::Layout() {
|
| + views::NativeButton* buttons[] = { remove_button_, remove_all_button_ };
|
| +
|
| + // The buttons are placed in the parent, but we need to lay them out.
|
| + int max_y = GetParent()->GetLocalBounds(false).bottom() - kButtonVEdgeMargin;
|
| + int x = kPanelHorizMargin;
|
| +
|
| + for (size_t i = 0; i < arraysize(buttons); ++i) {
|
| + gfx::Size pref = buttons[i]->GetPreferredSize();
|
| + buttons[i]->SetBounds(x, max_y - pref.height(), pref.width(),
|
| + pref.height());
|
| + x += pref.width() + kRelatedControlHorizontalSpacing;
|
| + }
|
| +
|
| + // Lay out the rest of this view.
|
| + View::Layout();
|
| +}
|
| +
|
| +gfx::Size GeolocationExceptionsView::GetPreferredSize() {
|
| + return gfx::Size(views::Window::GetLocalizedContentsSize(
|
| + IDS_GEOLOCATION_EXCEPTION_DIALOG_WIDTH_CHARS,
|
| + IDS_GEOLOCATION_EXCEPTION_DIALOG_HEIGHT_LINES));
|
| +}
|
| +
|
| +void GeolocationExceptionsView::ViewHierarchyChanged(bool is_add,
|
| + views::View* parent,
|
| + views::View* child) {
|
| + if (is_add && child == this)
|
| + Init();
|
| +}
|
| +
|
| +std::wstring GeolocationExceptionsView::GetWindowTitle() const {
|
| + return l10n_util::GetString(IDS_GEOLOCATION_EXCEPTION_TITLE);
|
| +}
|
| +
|
| +GeolocationExceptionsView::GeolocationExceptionsView(
|
| + GeolocationContentSettingsMap* map)
|
| + : model_(map),
|
| + table_(NULL),
|
| + remove_button_(NULL),
|
| + remove_all_button_(NULL) {
|
| +}
|
| +
|
| +void GeolocationExceptionsView::Init() {
|
| + if (table_)
|
| + return; // We've already Init'd.
|
| +
|
| + using views::GridLayout;
|
| +
|
| + std::vector<TableColumn> columns;
|
| + columns.push_back(
|
| + TableColumn(IDS_EXCEPTIONS_HOSTNAME_HEADER, TableColumn::LEFT, -1, .75));
|
| + columns.back().sortable = true;
|
| + columns.push_back(
|
| + TableColumn(IDS_EXCEPTIONS_ACTION_HEADER, TableColumn::LEFT, -1, .25));
|
| + columns.back().sortable = true;
|
| + table_ = new views::TableView(&model_, columns, views::TEXT_ONLY, false, true,
|
| + false);
|
| + views::TableView::SortDescriptors sort;
|
| + sort.push_back(
|
| + views::TableView::SortDescriptor(IDS_EXCEPTIONS_HOSTNAME_HEADER, true));
|
| + table_->SetSortDescriptors(sort);
|
| + table_->SetObserver(this);
|
| +
|
| + remove_button_ = new views::NativeButton(
|
| + this, l10n_util::GetString(IDS_EXCEPTIONS_REMOVE_BUTTON));
|
| + remove_button_->set_tag(IDS_EXCEPTIONS_REMOVE_BUTTON);
|
| + remove_all_button_ = new views::NativeButton(
|
| + this, l10n_util::GetString(IDS_EXCEPTIONS_REMOVEALL_BUTTON));
|
| + remove_all_button_->set_tag(IDS_EXCEPTIONS_REMOVEALL_BUTTON);
|
| +
|
| + View* parent = GetParent();
|
| + parent->AddChildView(remove_button_);
|
| + parent->AddChildView(remove_all_button_);
|
| +
|
| + GridLayout* layout = new GridLayout(this);
|
| + layout->SetInsets(kExceptionsViewInsetSize, kExceptionsViewInsetSize,
|
| + kExceptionsViewInsetSize, kExceptionsViewInsetSize);
|
| + SetLayoutManager(layout);
|
| +
|
| + const int single_column_layout_id = 0;
|
| + views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
|
| + column_set->AddPaddingColumn(0, kRelatedControlHorizontalSpacing);
|
| + column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
|
| + GridLayout::USE_PREF, 0, 0);
|
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| +
|
| + layout->StartRow(1, single_column_layout_id);
|
| + layout->AddView(table_);
|
| + layout->AddPaddingRow(0, kRelatedControlVerticalSpacing);
|
| +
|
| + UpdateButtonState();
|
| +}
|
| +
|
| +GeolocationContentSettingsTableModel::Rows
|
| + GeolocationExceptionsView::GetSelectedRows() const {
|
| + GeolocationContentSettingsTableModel::Rows rows;
|
| + for (views::TableView::iterator i(table_->SelectionBegin());
|
| + i != table_->SelectionEnd(); ++i)
|
| + rows.insert(*i);
|
| + return rows;
|
| +}
|
| +
|
| +void GeolocationExceptionsView::UpdateButtonState() {
|
| + remove_button_->SetEnabled(model_.CanRemoveExceptions(GetSelectedRows()));
|
| + remove_all_button_->SetEnabled(model_.RowCount() > 0);
|
| +}
|
| +
|
| +void GeolocationExceptionsView::Remove() {
|
| + model_.RemoveExceptions(GetSelectedRows());
|
| + UpdateButtonState();
|
| +}
|
| +
|
| +void GeolocationExceptionsView::RemoveAll() {
|
| + model_.RemoveAll();
|
| + UpdateButtonState();
|
| +}
|
|
|
| Property changes on: chrome/browser/views/options/geolocation_exceptions_view.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|