update_view.cc revision c407dc5cd9bdc5668497f21b26b09d988ab439de
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/update_view.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/l10n_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/resource_bundle.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/rounded_rect_painter.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/login/update_screen.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/border.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/progress_bar.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/focus_manager.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/widget/widget.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::Background;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::Label;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::View;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing views::Widget;
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Y offset for the 'installing updates' label.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kInstallingUpdatesLabelY = 200;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Y offset for the progress bar.
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kProgressBarY = 250;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Y offset for the 'ESCAPE to skip' label.
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kEscapeToSkipLabelY = 290;
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Progress bar width.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kProgressBarWidth = 450;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Horizontal spacing (ex. min left and right margins for label on the screen).
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kHorizontalSpacing = 25;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Label color.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kLabelColor = 0xFF000000;
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst SkColor kSkipLabelColor = 0xFFAA0000;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUpdateView::UpdateView(chromeos::ScreenObserver* observer)
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : escape_accelerator_(base::VKEY_ESCAPE, false, false, false),
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      installing_updates_label_(NULL),
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      progress_bar_(NULL),
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      observer_(observer) {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochUpdateView::~UpdateView() {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::Init() {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use rounded-rect background.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::Painter* painter = chromeos::CreateWizardPainter(
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &chromeos::BorderDefinition::kScreenBorder);
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  set_background(views::Background::CreateBackgroundPainter(true, painter));
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceBundle& res_bundle = ResourceBundle::GetSharedInstance();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Font base_font = res_bundle.GetFont(ResourceBundle::BaseFont);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InitLabel(&installing_updates_label_);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  installing_updates_label_->SetFont(base_font);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  progress_bar_ = new views::ProgressBar();
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(progress_bar_);
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  UpdateLocalizedStrings();
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OFFICIAL_BUILD)
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  escape_to_skip_label_ = new views::Label();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  escape_to_skip_label_->SetColor(kSkipLabelColor);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  escape_to_skip_label_->SetFont(base_font);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  escape_to_skip_label_->SetText(
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"Press ESCAPE to skip (Non-official builds only)");
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(escape_to_skip_label_);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::Reset() {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  progress_bar_->SetProgress(0);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OFFICIAL_BUILD)
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddAccelerator(escape_accelerator_);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::UpdateLocalizedStrings() {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  installing_updates_label_->SetText(
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      l10n_util::GetStringF(IDS_INSTALLING_UPDATE,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            l10n_util::GetString(IDS_PRODUCT_OS_NAME)));
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::AddProgress(int ticks) {
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  progress_bar_->AddProgress(ticks);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sets the bounds of the view, placing it at the center of the screen
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with the |y| coordinate provided. |width| could specify desired view width
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// otherwise preferred width/height are used.
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// |x_center| specifies screen center.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void setViewBounds(
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    views::View* view, int x_center, int y, int width = -1) {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int preferred_width = (width >= 0) ? width : view->GetPreferredSize().width();
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int preferred_height = view->GetPreferredSize().height();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  view->SetBounds(
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      x_center - preferred_width / 2,
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      y,
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      preferred_width,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      preferred_height);
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::Layout() {
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int x_center = width() / 2;
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int max_width = width() - GetInsets().width() - 2 * kHorizontalSpacing;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  installing_updates_label_->SizeToFit(max_width);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  setViewBounds(installing_updates_label_, x_center, kInstallingUpdatesLabelY);
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  setViewBounds(progress_bar_, x_center, kProgressBarY, kProgressBarWidth);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OFFICIAL_BUILD)
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  setViewBounds(escape_to_skip_label_, x_center, kEscapeToSkipLabelY);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SchedulePaint();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool UpdateView::AcceleratorPressed(const views::Accelerator& a) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OFFICIAL_BUILD)
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RemoveAccelerator(escape_accelerator_);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (a.GetKeyCode() == base::VKEY_ESCAPE) {
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (controller_ != NULL) {
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller_->CancelUpdate();
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid UpdateView::InitLabel(views::Label** label) {
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *label = new views::Label();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  (*label)->SetColor(kLabelColor);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  (*label)->SetHorizontalAlignment(views::Label::ALIGN_CENTER);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  (*label)->SetMultiLine(true);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AddChildView(*label);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
150