1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/ui/views/uninstall_view.h" 6 7#include "base/message_loop.h" 8#include "base/process_util.h" 9#include "base/string16.h" 10#include "base/utf_string_conversions.h" 11#include "chrome/browser/shell_integration.h" 12#include "chrome/installer/util/browser_distribution.h" 13#include "chrome/installer/util/shell_util.h" 14#include "content/common/result_codes.h" 15#include "grit/chromium_strings.h" 16#include "ui/base/l10n/l10n_util.h" 17#include "views/controls/button/checkbox.h" 18#include "views/controls/label.h" 19#include "views/layout/grid_layout.h" 20#include "views/layout/layout_constants.h" 21 22UninstallView::UninstallView(int& user_selection) 23 : confirm_label_(NULL), 24 delete_profile_(NULL), 25 change_default_browser_(NULL), 26 browsers_combo_(NULL), 27 browsers_(NULL), 28 user_selection_(user_selection) { 29 SetupControls(); 30} 31 32UninstallView::~UninstallView() { 33 // Exit the message loop we were started with so that uninstall can continue. 34 MessageLoop::current()->Quit(); 35} 36 37void UninstallView::SetupControls() { 38 using views::ColumnSet; 39 using views::GridLayout; 40 41 GridLayout* layout = GridLayout::CreatePanel(this); 42 SetLayoutManager(layout); 43 44 // Message to confirm uninstallation. 45 int column_set_id = 0; 46 ColumnSet* column_set = layout->AddColumnSet(column_set_id); 47 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 48 GridLayout::USE_PREF, 0, 0); 49 layout->StartRow(0, column_set_id); 50 confirm_label_ = new views::Label(UTF16ToWide( 51 l10n_util::GetStringUTF16(IDS_UNINSTALL_VERIFY))); 52 confirm_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT); 53 layout->AddView(confirm_label_); 54 55 layout->AddPaddingRow(0, views::kUnrelatedControlVerticalSpacing); 56 57 // The "delete profile" check box. 58 ++column_set_id; 59 column_set = layout->AddColumnSet(column_set_id); 60 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 61 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 62 GridLayout::USE_PREF, 0, 0); 63 layout->StartRow(0, column_set_id); 64 delete_profile_ = new views::Checkbox( 65 UTF16ToWide(l10n_util::GetStringUTF16(IDS_UNINSTALL_DELETE_PROFILE))); 66 layout->AddView(delete_profile_); 67 68 // Set default browser combo box 69 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); 70 if (dist->CanSetAsDefault() && 71 ShellIntegration::IsDefaultBrowser()) { 72 browsers_.reset(new BrowsersMap()); 73 ShellUtil::GetRegisteredBrowsers(dist, browsers_.get()); 74 if (!browsers_->empty()) { 75 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 76 77 ++column_set_id; 78 column_set = layout->AddColumnSet(column_set_id); 79 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 80 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 81 GridLayout::USE_PREF, 0, 0); 82 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing); 83 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0, 84 GridLayout::USE_PREF, 0, 0); 85 layout->StartRow(0, column_set_id); 86 change_default_browser_ = new views::Checkbox(UTF16ToWide( 87 l10n_util::GetStringUTF16(IDS_UNINSTALL_SET_DEFAULT_BROWSER))); 88 change_default_browser_->set_listener(this); 89 layout->AddView(change_default_browser_); 90 browsers_combo_ = new views::Combobox(this); 91 layout->AddView(browsers_combo_); 92 browsers_combo_->SetEnabled(false); 93 } 94 } 95 96 layout->AddPaddingRow(0, views::kRelatedControlSmallVerticalSpacing); 97} 98 99bool UninstallView::Accept() { 100 user_selection_ = ResultCodes::NORMAL_EXIT; 101 if (delete_profile_->checked()) 102 user_selection_ = ResultCodes::UNINSTALL_DELETE_PROFILE; 103 if (change_default_browser_ && change_default_browser_->checked()) { 104 int index = browsers_combo_->selected_item(); 105 BrowsersMap::const_iterator it = browsers_->begin(); 106 std::advance(it, index); 107 base::LaunchApp((*it).second, false, true, NULL); 108 } 109 return true; 110} 111 112bool UninstallView::Cancel() { 113 user_selection_ = ResultCodes::UNINSTALL_USER_CANCEL; 114 return true; 115} 116 117std::wstring UninstallView::GetDialogButtonLabel( 118 MessageBoxFlags::DialogButton button) const { 119 // We only want to give custom name to OK button - 'Uninstall'. Cancel 120 // button remains same. 121 std::wstring label = L""; 122 if (button == MessageBoxFlags::DIALOGBUTTON_OK) 123 label = UTF16ToWide(l10n_util::GetStringUTF16(IDS_UNINSTALL_BUTTON_TEXT)); 124 return label; 125} 126 127void UninstallView::ButtonPressed( 128 views::Button* sender, const views::Event& event) { 129 if (change_default_browser_ == sender) { 130 // Disable the browsers combobox if the user unchecks the checkbox. 131 DCHECK(browsers_combo_); 132 browsers_combo_->SetEnabled(change_default_browser_->checked()); 133 } 134} 135 136std::wstring UninstallView::GetWindowTitle() const { 137 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_UNINSTALL_CHROME)); 138} 139 140views::View* UninstallView::GetContentsView() { 141 return this; 142} 143 144int UninstallView::GetItemCount() { 145 DCHECK(!browsers_->empty()); 146 return browsers_->size(); 147} 148 149string16 UninstallView::GetItemAt(int index) { 150 DCHECK(index < (int) browsers_->size()); 151 BrowsersMap::const_iterator it = browsers_->begin(); 152 std::advance(it, index); 153 return WideToUTF16Hack((*it).first); 154} 155