diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-26 23:55:29 +0000 |
commit | 09911bf300f1a419907a9412154760efd0b7abc3 (patch) | |
tree | f131325fb4e2ad12c6d3504ab75b16dd92facfed /chrome/browser/views/clear_browsing_data.cc | |
parent | 586acc5fe142f498261f52c66862fa417c3d52d2 (diff) | |
download | chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.zip chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.gz chromium_src-09911bf300f1a419907a9412154760efd0b7abc3.tar.bz2 |
Add chrome to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views/clear_browsing_data.cc')
-rw-r--r-- | chrome/browser/views/clear_browsing_data.cc | 403 |
1 files changed, 403 insertions, 0 deletions
diff --git a/chrome/browser/views/clear_browsing_data.cc b/chrome/browser/views/clear_browsing_data.cc new file mode 100644 index 0000000..17341cd --- /dev/null +++ b/chrome/browser/views/clear_browsing_data.cc @@ -0,0 +1,403 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "chrome/browser/views/clear_browsing_data.h" + +#include "chrome/app/locales/locale_settings.h" +#include "chrome/browser/profile.h" +#include "chrome/browser/standard_layout.h" +#include "chrome/browser/template_url_model.h" +#include "chrome/common/l10n_util.h" +#include "chrome/views/background.h" +#include "chrome/views/checkbox.h" +#include "chrome/views/label.h" +#include "chrome/views/native_button.h" +#include "chrome/views/throbber.h" +#include "chrome/views/window.h" +#include "net/url_request/url_request_context.h" + +#include "generated_resources.h" + +// The combo box is vertically aligned to the 'time-period' label, which makes +// the combo box look a little too close to the check box above it when we use +// standard layout to separate them. We therefore add a little extra margin to +// the label, giving it a little breathing space. +static const int kExtraMarginForTimePeriodLabel = 3; + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, public: + +ClearBrowsingDataView::ClearBrowsingDataView(Profile* profile) + : dialog_(NULL), + del_history_checkbox_(NULL), + del_downloads_checkbox_(NULL), + del_cache_checkbox_(NULL), + del_cookies_checkbox_(NULL), + del_passwords_checkbox_(NULL), + time_period_label_(NULL), + time_period_combobox_(NULL), + delete_in_progress_(false), + profile_(profile) { + DCHECK(profile); + Init(); +} + +ClearBrowsingDataView::~ClearBrowsingDataView(void) { +} + +void ClearBrowsingDataView::Init() { + // Views we will add to the *parent* of this dialog, since it will display + // next to the buttons which we don't draw ourselves. + throbber_.reset(new ChromeViews::Throbber(50, true)); + throbber_->SetParentOwned(false); + throbber_->SetVisible(false); + + status_label_.SetText(l10n_util::GetString(IDS_CLEAR_DATA_DELETING)); + status_label_.SetVisible(false); + status_label_.SetParentOwned(false); + + // Regular view controls we draw by ourself. First, we add the dialog label. + delete_all_label_ = new ChromeViews::Label( + l10n_util::GetString(IDS_CLEAR_BROWSING_DATA_LABEL)); + AddChildView(delete_all_label_); + + // Add all the check-boxes. + del_history_checkbox_ = + AddCheckbox(l10n_util::GetString(IDS_DEL_BROWSING_HISTORY_CHKBOX), true); + + del_downloads_checkbox_ = + AddCheckbox(l10n_util::GetString(IDS_DEL_DOWNLOAD_HISTORY_CHKBOX), true); + + del_cache_checkbox_ = + AddCheckbox(l10n_util::GetString(IDS_DEL_CACHE_CHKBOX), true); + + del_cookies_checkbox_ = + AddCheckbox(l10n_util::GetString(IDS_DEL_COOKIES_CHKBOX), true); + + del_passwords_checkbox_ = + AddCheckbox(l10n_util::GetString(IDS_DEL_PASSWORDS_CHKBOX), false); + + // Add a label which appears before the combo box for the time period. + time_period_label_ = new ChromeViews::Label( + l10n_util::GetString(IDS_CLEAR_BROWSING_DATA_TIME_LABEL)); + AddChildView(time_period_label_); + + // Add the combo box showing how far back in time we want to delete. + time_period_combobox_ = new ChromeViews::ComboBox(this); + AddChildView(time_period_combobox_); +} + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, ChromeViews::View implementation: + +void ClearBrowsingDataView::GetPreferredSize(CSize *out) { + DCHECK(out); + *out = ChromeViews::Window::GetLocalizedContentsSize( + IDS_CLEARDATA_DIALOG_WIDTH_CHARS, + IDS_CLEARDATA_DIALOG_HEIGHT_LINES).ToSIZE(); +} + +void ClearBrowsingDataView::Layout() { + CSize panel_size; + GetPreferredSize(&panel_size); + + CSize sz; + + // Delete All label goes to the top left corner. + delete_all_label_->GetPreferredSize(&sz); + delete_all_label_->SetBounds(kPanelHorizMargin, kPanelVertMargin, + sz.cx, sz.cy); + + // Check-boxes go beneath it (with a little indentation). + del_history_checkbox_->GetPreferredSize(&sz); + del_history_checkbox_->SetBounds(2 * kPanelHorizMargin, + delete_all_label_->GetY() + + delete_all_label_->GetHeight() + + kRelatedControlVerticalSpacing, + sz.cx, sz.cy); + + del_downloads_checkbox_->GetPreferredSize(&sz); + del_downloads_checkbox_->SetBounds(2 * kPanelHorizMargin, + del_history_checkbox_->GetY() + + del_history_checkbox_->GetHeight() + + kRelatedControlVerticalSpacing, + sz.cx, sz.cy); + + del_cache_checkbox_->GetPreferredSize(&sz); + del_cache_checkbox_->SetBounds(2 * kPanelHorizMargin, + del_downloads_checkbox_->GetY() + + del_downloads_checkbox_->GetHeight() + + kRelatedControlVerticalSpacing, + sz.cx, sz.cy); + + del_cookies_checkbox_->GetPreferredSize(&sz); + del_cookies_checkbox_->SetBounds(2 * kPanelHorizMargin, + del_cache_checkbox_->GetY() + + del_cache_checkbox_->GetHeight() + + kRelatedControlVerticalSpacing, + sz.cx, sz.cy); + + del_passwords_checkbox_->GetPreferredSize(&sz); + del_passwords_checkbox_->SetBounds(2 * kPanelHorizMargin, + del_cookies_checkbox_->GetY() + + del_cookies_checkbox_->GetHeight() + + kRelatedControlVerticalSpacing, + sz.cx, sz.cy); + + // Time period label is next below the combo boxes. + time_period_label_->GetPreferredSize(&sz); + time_period_label_->SetBounds(kPanelHorizMargin, + del_passwords_checkbox_->GetY() + + del_passwords_checkbox_->GetHeight() + + kRelatedControlVerticalSpacing + + kExtraMarginForTimePeriodLabel, + sz.cx, sz.cy); + + // Time period combo box goes on the right of the label, and we align it + // vertically to the label as well. + int label_y_size = sz.cy; + time_period_combobox_->GetPreferredSize(&sz); + time_period_combobox_->SetBounds(time_period_label_->GetX() + + time_period_label_->GetWidth() + + kRelatedControlVerticalSpacing, + time_period_label_->GetY() - + ((sz.cy - label_y_size) / 2), + sz.cx, sz.cy); + + // Get the y-coordinate of our parent so we can position the throbber and + // status message at the bottom of the panel. + CRect parent_bounds; + GetParent()->GetLocalBounds(&parent_bounds, false); + + throbber_->GetPreferredSize(&sz); + int throbber_topleft_x = kPanelHorizMargin; + int throbber_topleft_y = parent_bounds.bottom - sz.cy - + kButtonVEdgeMargin - 3; + throbber_->SetBounds(throbber_topleft_x, throbber_topleft_y, sz.cx, sz.cy); + + // The status label should be at the bottom of the screen, to the right of + // the throbber. + status_label_.GetPreferredSize(&sz); + int status_label_x = throbber_->GetX() + throbber_->GetWidth() + + kRelatedControlHorizontalSpacing; + status_label_.SetHorizontalAlignment(ChromeViews::Label::ALIGN_LEFT); + status_label_.SetBounds(status_label_x, + throbber_topleft_y + 1, + sz.cx, + sz.cy); +} + +void ClearBrowsingDataView::ViewHierarchyChanged(bool is_add, + ChromeViews::View* parent, + ChromeViews::View* child) { + // Since we want the some of the controls to show up in the same visual row + // as the buttons, which are provided by the framework, we must add the + // buttons to the non-client view, which is the parent of this view. + // Similarly, when we're removed from the view hierarchy, we must take care + // to remove these items as well. + if (child == this) { + if (is_add) { + parent->AddChildView(&status_label_); + parent->AddChildView(throbber_.get()); + } else { + parent->RemoveChildView(&status_label_); + parent->RemoveChildView(throbber_.get()); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, ChromeViews::DialogDelegate implementation: + +std::wstring ClearBrowsingDataView::GetDialogButtonLabel( + DialogButton button) const { + if (button == DIALOGBUTTON_OK) { + return l10n_util::GetString(IDS_CLEAR_BROWSING_DATA_COMMIT); + } else { + return std::wstring(); + } +} + +bool ClearBrowsingDataView::IsDialogButtonEnabled(DialogButton button) const { + if (delete_in_progress_) + return false; + + if (button == DIALOGBUTTON_OK) { + return del_history_checkbox_->IsSelected() || + del_downloads_checkbox_->IsSelected() || + del_cache_checkbox_->IsSelected() || + del_cookies_checkbox_->IsSelected() || + del_passwords_checkbox_->IsSelected(); + } + + return true; +} + +bool ClearBrowsingDataView::CanResize() const { + return false; +} + +bool ClearBrowsingDataView::CanMaximize() const { + return false; +} + +bool ClearBrowsingDataView::IsAlwaysOnTop() const { + return false; +} + +bool ClearBrowsingDataView::HasAlwaysOnTopMenu() const { + return false; +} + +bool ClearBrowsingDataView::IsModal() const { + return true; +} + +std::wstring ClearBrowsingDataView::GetWindowTitle() const { + return l10n_util::GetString(IDS_CLEAR_BROWSING_DATA_TITLE); +} + +bool ClearBrowsingDataView::Accept() { + if (!IsDialogButtonEnabled(DIALOGBUTTON_OK)) { + return false; + } + + OnDelete(); + return false; // We close the dialog in OnDeletionDone(). +} + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, ChromeViews::ComboBox::Model implementation: + +int ClearBrowsingDataView::GetItemCount(ChromeViews::ComboBox* source) { + DCHECK(source == time_period_combobox_); + return 4; +} + +std::wstring ClearBrowsingDataView::GetItemAt(ChromeViews::ComboBox* source, + int index) { + DCHECK(source == time_period_combobox_); + switch (index) { + case 0: return l10n_util::GetString(IDS_CLEAR_DATA_DAY); + case 1: return l10n_util::GetString(IDS_CLEAR_DATA_WEEK); + case 2: return l10n_util::GetString(IDS_CLEAR_DATA_4WEEKS); + case 3: return l10n_util::GetString(IDS_CLEAR_DATA_EVERYTHING); + default: NOTREACHED() << L"Missing item"; + return L"?"; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, ChromeViews::ButtonListener implementation: + +void ClearBrowsingDataView::ButtonPressed(ChromeViews::NativeButton* sender) { + // When no checkbox is checked we should not have the action button enabled. + // This forces the button to evaluate what state they should be in. + dialog_->UpdateDialogButtons(); +} + +//////////////////////////////////////////////////////////////////////////////// +// ClearBrowsingDataView, private: + +ChromeViews::CheckBox* ClearBrowsingDataView::AddCheckbox( + const std::wstring& text, bool checked) { + ChromeViews::CheckBox* checkbox = new ChromeViews::CheckBox(text); + checkbox->SetIsSelected(checked); + checkbox->SetListener(this); + AddChildView(checkbox); + return checkbox; +} + +void ClearBrowsingDataView::UpdateControlEnabledState() { + dialog_->EnableClose(!delete_in_progress_); + + del_history_checkbox_->SetEnabled(!delete_in_progress_); + del_downloads_checkbox_->SetEnabled(!delete_in_progress_); + del_cache_checkbox_->SetEnabled(!delete_in_progress_); + del_cookies_checkbox_->SetEnabled(!delete_in_progress_); + del_passwords_checkbox_->SetEnabled(!delete_in_progress_); + time_period_combobox_->SetEnabled(!delete_in_progress_); + + status_label_.SetVisible(delete_in_progress_); + throbber_->SetVisible(delete_in_progress_); + if (delete_in_progress_) + throbber_->Start(); + else + throbber_->Stop(); + + // Make sure to update the state for OK and Cancel buttons. + dialog_->UpdateDialogButtons(); +} + +// Convenience method that returns true if the supplied checkbox is selected +// and enabled. +static bool IsCheckBoxEnabledAndSelected(ChromeViews::CheckBox* cb) { + return (cb->IsEnabled() && cb->IsSelected()); +} + +void ClearBrowsingDataView::OnDelete() { + TimeDelta diff; + Time delete_begin = Time::Now(); + + int period_selected = time_period_combobox_->GetSelectedItem(); + switch (period_selected) { + case 0: diff = TimeDelta::FromHours(24); break; // Last day. + case 1: diff = TimeDelta::FromHours(7*24); break; // Last week. + case 2: diff = TimeDelta::FromHours(4*7*24); break; // Four weeks. + case 3: delete_begin = Time(); break; // Everything. + default: NOTREACHED() << L"Missing item"; break; + } + + delete_begin = delete_begin - diff; + + int remove_mask = 0; + if (IsCheckBoxEnabledAndSelected(del_history_checkbox_)) + remove_mask |= BrowsingDataRemover::REMOVE_HISTORY; + if (IsCheckBoxEnabledAndSelected(del_downloads_checkbox_)) + remove_mask |= BrowsingDataRemover::REMOVE_DOWNLOADS; + if (IsCheckBoxEnabledAndSelected(del_cookies_checkbox_)) + remove_mask |= BrowsingDataRemover::REMOVE_COOKIES; + if (IsCheckBoxEnabledAndSelected(del_passwords_checkbox_)) + remove_mask |= BrowsingDataRemover::REMOVE_PASSWORDS; + if (IsCheckBoxEnabledAndSelected(del_cache_checkbox_)) + remove_mask |= BrowsingDataRemover::REMOVE_CACHE; + + delete_in_progress_ = true; + UpdateControlEnabledState(); + + // BrowsingDataRemover deletes itself when done. + BrowsingDataRemover* remover = + new BrowsingDataRemover(profile_, delete_begin, Time()); + remover->AddObserver(this); + remover->Remove(remove_mask); +} + +void ClearBrowsingDataView::OnBrowsingDataRemoverDone() { + dialog_->Close(); +} |