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