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
UninstallView(int & user_selection)22 UninstallView::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
~UninstallView()32 UninstallView::~UninstallView() {
33 // Exit the message loop we were started with so that uninstall can continue.
34 MessageLoop::current()->Quit();
35 }
36
SetupControls()37 void 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
Accept()99 bool 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
Cancel()112 bool UninstallView::Cancel() {
113 user_selection_ = ResultCodes::UNINSTALL_USER_CANCEL;
114 return true;
115 }
116
GetDialogButtonLabel(MessageBoxFlags::DialogButton button) const117 std::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
ButtonPressed(views::Button * sender,const views::Event & event)127 void 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
GetWindowTitle() const136 std::wstring UninstallView::GetWindowTitle() const {
137 return UTF16ToWide(l10n_util::GetStringUTF16(IDS_UNINSTALL_CHROME));
138 }
139
GetContentsView()140 views::View* UninstallView::GetContentsView() {
141 return this;
142 }
143
GetItemCount()144 int UninstallView::GetItemCount() {
145 DCHECK(!browsers_->empty());
146 return browsers_->size();
147 }
148
GetItemAt(int index)149 string16 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