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