| Index: ash/common/system/date/date_view.cc
|
| diff --git a/ash/common/system/date/date_view.cc b/ash/common/system/date/date_view.cc
|
| deleted file mode 100644
|
| index 9aa1eb51bb9ceffacd98372a96b3727d7f40a5c7..0000000000000000000000000000000000000000
|
| --- a/ash/common/system/date/date_view.cc
|
| +++ /dev/null
|
| @@ -1,408 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "ash/common/system/date/date_view.h"
|
| -
|
| -#include "ash/common/material_design/material_design_controller.h"
|
| -#include "ash/common/system/tray/system_tray_controller.h"
|
| -#include "ash/common/system/tray/tray_constants.h"
|
| -#include "ash/common/system/tray/tray_popup_item_style.h"
|
| -#include "ash/common/system/tray/tray_popup_utils.h"
|
| -#include "ash/common/system/tray/tray_utils.h"
|
| -#include "ash/common/wm_shell.h"
|
| -#include "ash/strings/grit/ash_strings.h"
|
| -#include "base/i18n/rtl.h"
|
| -#include "base/i18n/time_formatting.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/time/time.h"
|
| -#include "third_party/icu/source/i18n/unicode/datefmt.h"
|
| -#include "third_party/icu/source/i18n/unicode/dtptngen.h"
|
| -#include "third_party/icu/source/i18n/unicode/smpdtfmt.h"
|
| -#include "ui/accessibility/ax_node_data.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/views/border.h"
|
| -#include "ui/views/controls/button/button.h"
|
| -#include "ui/views/controls/label.h"
|
| -#include "ui/views/layout/box_layout.h"
|
| -#include "ui/views/layout/fill_layout.h"
|
| -#include "ui/views/layout/grid_layout.h"
|
| -#include "ui/views/widget/widget.h"
|
| -
|
| -namespace ash {
|
| -namespace tray {
|
| -namespace {
|
| -
|
| -// Amount of slop to add into the timer to make sure we're into the next minute
|
| -// when the timer goes off.
|
| -const int kTimerSlopSeconds = 1;
|
| -
|
| -// Text color of the vertical clock minutes.
|
| -const SkColor kVerticalClockMinuteColor = SkColorSetRGB(0xBA, 0xBA, 0xBA);
|
| -
|
| -// Padding between the left edge of the shelf and the left edge of the vertical
|
| -// clock.
|
| -const int kVerticalClockLeftPadding = 9;
|
| -
|
| -// Offset used to bring the minutes line closer to the hours line in the
|
| -// vertical clock.
|
| -const int kVerticalClockMinutesTopOffset = -4;
|
| -const int kVerticalClockMinutesTopOffsetMD = -2;
|
| -
|
| -// Leading padding used to draw the tray background to the left of the clock
|
| -// when the shelf is vertically aligned.
|
| -const int kClockLeadingPadding = 8;
|
| -
|
| -bool UseMd() {
|
| - return MaterialDesignController::IsSystemTrayMenuMaterial();
|
| -}
|
| -
|
| -base::string16 FormatDateWithPattern(const base::Time& time,
|
| - const char* pattern) {
|
| - UErrorCode status = U_ZERO_ERROR;
|
| - std::unique_ptr<icu::DateTimePatternGenerator> generator(
|
| - icu::DateTimePatternGenerator::createInstance(status));
|
| - DCHECK(U_SUCCESS(status));
|
| - icu::UnicodeString generated_pattern =
|
| - generator->getBestPattern(icu::UnicodeString(pattern), status);
|
| - DCHECK(U_SUCCESS(status));
|
| - icu::SimpleDateFormat simple_formatter(generated_pattern, status);
|
| - DCHECK(U_SUCCESS(status));
|
| - icu::UnicodeString date_string;
|
| - simple_formatter.format(static_cast<UDate>(time.ToDoubleT() * 1000),
|
| - date_string, status);
|
| - DCHECK(U_SUCCESS(status));
|
| - return base::string16(date_string.getBuffer(),
|
| - static_cast<size_t>(date_string.length()));
|
| -}
|
| -
|
| -base::string16 FormatDate(const base::Time& time) {
|
| - if (UseMd()) {
|
| - // Use 'short' month format (e.g., "Oct") followed by non-padded day of
|
| - // month (e.g., "2", "10").
|
| - return FormatDateWithPattern(time, "LLLd");
|
| - } else {
|
| - icu::UnicodeString date_string;
|
| - std::unique_ptr<icu::DateFormat> formatter(
|
| - icu::DateFormat::createDateInstance(icu::DateFormat::kMedium));
|
| - formatter->format(static_cast<UDate>(time.ToDoubleT() * 1000), date_string);
|
| - return base::string16(date_string.getBuffer(),
|
| - static_cast<size_t>(date_string.length()));
|
| - }
|
| -}
|
| -
|
| -base::string16 FormatDayOfWeek(const base::Time& time) {
|
| - // Use 'short' day of week format (e.g., "Wed").
|
| - return FormatDateWithPattern(time, "EEE");
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -BaseDateTimeView::~BaseDateTimeView() {
|
| - timer_.Stop();
|
| -}
|
| -
|
| -void BaseDateTimeView::UpdateText() {
|
| - base::Time now = base::Time::Now();
|
| - UpdateTextInternal(now);
|
| - SchedulePaint();
|
| - SetTimer(now);
|
| -}
|
| -
|
| -void BaseDateTimeView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
|
| - ActionableView::GetAccessibleNodeData(node_data);
|
| - node_data->role = ui::AX_ROLE_TIME;
|
| -}
|
| -
|
| -BaseDateTimeView::BaseDateTimeView(SystemTrayItem* owner)
|
| - : ActionableView(owner, TrayPopupInkDropStyle::INSET_BOUNDS),
|
| - hour_type_(WmShell::Get()->system_tray_controller()->hour_clock_type()) {
|
| - SetTimer(base::Time::Now());
|
| - SetFocusBehavior(FocusBehavior::NEVER);
|
| -}
|
| -
|
| -void BaseDateTimeView::SetTimer(const base::Time& now) {
|
| - // Try to set the timer to go off at the next change of the minute. We don't
|
| - // want to have the timer go off more than necessary since that will cause
|
| - // the CPU to wake up and consume power.
|
| - base::Time::Exploded exploded;
|
| - now.LocalExplode(&exploded);
|
| -
|
| - // Often this will be called at minute boundaries, and we'll actually want
|
| - // 60 seconds from now.
|
| - int seconds_left = 60 - exploded.second;
|
| - if (seconds_left == 0)
|
| - seconds_left = 60;
|
| -
|
| - // Make sure that the timer fires on the next minute. Without this, if it is
|
| - // called just a teeny bit early, then it will skip the next minute.
|
| - seconds_left += kTimerSlopSeconds;
|
| -
|
| - timer_.Stop();
|
| - timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(seconds_left), this,
|
| - &BaseDateTimeView::UpdateText);
|
| -}
|
| -
|
| -void BaseDateTimeView::UpdateTextInternal(const base::Time& now) {
|
| - SetAccessibleName(base::TimeFormatTimeOfDayWithHourClockType(
|
| - now, hour_type_, base::kKeepAmPm) +
|
| - base::ASCIIToUTF16(", ") +
|
| - base::TimeFormatFriendlyDate(now));
|
| -
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_TEXT_CHANGED, true);
|
| -}
|
| -
|
| -void BaseDateTimeView::ChildPreferredSizeChanged(views::View* child) {
|
| - PreferredSizeChanged();
|
| -}
|
| -
|
| -void BaseDateTimeView::OnLocaleChanged() {
|
| - UpdateText();
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -DateView::DateView(SystemTrayItem* owner)
|
| - : BaseDateTimeView(owner), action_(DateAction::NONE) {
|
| - if (UseMd()) {
|
| - // TODO(tdanderson): Tweak spacing and layout for material design.
|
| - views::BoxLayout* box_layout =
|
| - new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0);
|
| - box_layout->set_inside_border_insets(gfx::Insets(0, 12, 0, 0));
|
| - box_layout->set_main_axis_alignment(
|
| - views::BoxLayout::MAIN_AXIS_ALIGNMENT_START);
|
| - box_layout->set_cross_axis_alignment(
|
| - views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
|
| - SetLayoutManager(box_layout);
|
| - } else {
|
| - SetLayoutManager(
|
| - new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0));
|
| - }
|
| - date_label_ = TrayPopupUtils::CreateDefaultLabel();
|
| - date_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
|
| - if (!UseMd())
|
| - date_label_->SetEnabledColor(kHeaderTextColorNormal);
|
| - UpdateTextInternal(base::Time::Now());
|
| - TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::SYSTEM_INFO);
|
| - style.SetupLabel(date_label_);
|
| - AddChildView(date_label_);
|
| -}
|
| -
|
| -DateView::~DateView() {}
|
| -
|
| -void DateView::SetAction(DateAction action) {
|
| - if (action == action_)
|
| - return;
|
| - if (IsMouseHovered() && !UseMd()) {
|
| - date_label_->SetEnabledColor(action == DateAction::NONE
|
| - ? kHeaderTextColorNormal
|
| - : kHeaderTextColorHover);
|
| - SchedulePaint();
|
| - }
|
| - action_ = action;
|
| - SetFocusBehavior(action_ != DateAction::NONE ? FocusBehavior::ALWAYS
|
| - : FocusBehavior::NEVER);
|
| -
|
| - // Disable |this| when not clickable so that the material design ripple is
|
| - // not shown.
|
| - if (UseMd()) {
|
| - SetEnabled(action_ != DateAction::NONE);
|
| - if (action_ != DateAction::NONE)
|
| - SetInkDropMode(views::InkDropHostView::InkDropMode::ON);
|
| - }
|
| -}
|
| -
|
| -void DateView::UpdateTimeFormat() {
|
| - hour_type_ = WmShell::Get()->system_tray_controller()->hour_clock_type();
|
| - UpdateText();
|
| -}
|
| -
|
| -base::HourClockType DateView::GetHourTypeForTesting() const {
|
| - return hour_type_;
|
| -}
|
| -
|
| -void DateView::SetActive(bool active) {
|
| - if (UseMd())
|
| - return;
|
| -
|
| - date_label_->SetEnabledColor(active ? kHeaderTextColorHover
|
| - : kHeaderTextColorNormal);
|
| - SchedulePaint();
|
| -}
|
| -
|
| -void DateView::UpdateTextInternal(const base::Time& now) {
|
| - BaseDateTimeView::UpdateTextInternal(now);
|
| - date_label_->SetText(l10n_util::GetStringFUTF16(
|
| - IDS_ASH_STATUS_TRAY_DATE, FormatDayOfWeek(now), FormatDate(now)));
|
| -}
|
| -
|
| -bool DateView::PerformAction(const ui::Event& event) {
|
| - if (action_ == DateAction::NONE)
|
| - return false;
|
| - if (action_ == DateAction::SHOW_DATE_SETTINGS)
|
| - WmShell::Get()->system_tray_controller()->ShowDateSettings();
|
| - else if (action_ == DateAction::SET_SYSTEM_TIME)
|
| - WmShell::Get()->system_tray_controller()->ShowSetTimeDialog();
|
| - else
|
| - return false;
|
| - CloseSystemBubble();
|
| - return true;
|
| -}
|
| -
|
| -void DateView::OnMouseEntered(const ui::MouseEvent& event) {
|
| - if (action_ == DateAction::NONE)
|
| - return;
|
| - SetActive(true);
|
| -}
|
| -
|
| -void DateView::OnMouseExited(const ui::MouseEvent& event) {
|
| - if (action_ == DateAction::NONE)
|
| - return;
|
| - SetActive(false);
|
| -}
|
| -
|
| -void DateView::OnGestureEvent(ui::GestureEvent* event) {
|
| - if (event->type() == ui::ET_GESTURE_TAP_DOWN) {
|
| - SetActive(true);
|
| - } else if (event->type() == ui::ET_GESTURE_TAP_CANCEL ||
|
| - event->type() == ui::ET_GESTURE_END) {
|
| - SetActive(false);
|
| - }
|
| - BaseDateTimeView::OnGestureEvent(event);
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -TimeView::TimeView(ClockLayout clock_layout) : BaseDateTimeView(nullptr) {
|
| - SetupLabels();
|
| - UpdateTextInternal(base::Time::Now());
|
| - UpdateClockLayout(clock_layout);
|
| -}
|
| -
|
| -TimeView::~TimeView() {}
|
| -
|
| -void TimeView::UpdateTimeFormat() {
|
| - hour_type_ = WmShell::Get()->system_tray_controller()->hour_clock_type();
|
| - UpdateText();
|
| -}
|
| -
|
| -base::HourClockType TimeView::GetHourTypeForTesting() const {
|
| - return hour_type_;
|
| -}
|
| -
|
| -void TimeView::UpdateTextInternal(const base::Time& now) {
|
| - // Just in case |now| is null, do NOT update time; otherwise, it will
|
| - // crash icu code by calling into base::TimeFormatTimeOfDayWithHourClockType,
|
| - // see details in crbug.com/147570.
|
| - if (now.is_null()) {
|
| - LOG(ERROR) << "Received null value from base::Time |now| in argument";
|
| - return;
|
| - }
|
| -
|
| - BaseDateTimeView::UpdateTextInternal(now);
|
| - base::string16 current_time = base::TimeFormatTimeOfDayWithHourClockType(
|
| - now, hour_type_, base::kDropAmPm);
|
| - horizontal_label_->SetText(current_time);
|
| - horizontal_label_->SetTooltipText(base::TimeFormatFriendlyDate(now));
|
| -
|
| - // Calculate vertical clock layout labels.
|
| - size_t colon_pos = current_time.find(base::ASCIIToUTF16(":"));
|
| - base::string16 hour = current_time.substr(0, colon_pos);
|
| - base::string16 minute = current_time.substr(colon_pos + 1);
|
| -
|
| - // Sometimes pad single-digit hours with a zero for aesthetic reasons.
|
| - if (hour.length() == 1 && hour_type_ == base::k24HourClock &&
|
| - !base::i18n::IsRTL())
|
| - hour = base::ASCIIToUTF16("0") + hour;
|
| -
|
| - vertical_label_hours_->SetText(hour);
|
| - vertical_label_minutes_->SetText(minute);
|
| - Layout();
|
| -}
|
| -
|
| -bool TimeView::PerformAction(const ui::Event& event) {
|
| - return false;
|
| -}
|
| -
|
| -bool TimeView::OnMousePressed(const ui::MouseEvent& event) {
|
| - // Let the event fall through.
|
| - return false;
|
| -}
|
| -
|
| -void TimeView::OnGestureEvent(ui::GestureEvent* event) {
|
| - // Skip gesture handling happening in CustomButton so that the container views
|
| - // receive and handle them properly.
|
| - // TODO(mohsen): Refactor TimeView/DateView classes so that they are not
|
| - // ActionableView anymore. Create an ActionableView as a container for when
|
| - // needed.
|
| -}
|
| -
|
| -void TimeView::UpdateClockLayout(ClockLayout clock_layout) {
|
| - SetBorderFromLayout(clock_layout);
|
| - if (clock_layout == ClockLayout::HORIZONTAL_CLOCK) {
|
| - RemoveChildView(vertical_label_hours_.get());
|
| - RemoveChildView(vertical_label_minutes_.get());
|
| - SetLayoutManager(new views::FillLayout());
|
| - AddChildView(horizontal_label_.get());
|
| - } else {
|
| - const bool is_material_design = MaterialDesignController::IsShelfMaterial();
|
| - RemoveChildView(horizontal_label_.get());
|
| - views::GridLayout* layout = new views::GridLayout(this);
|
| - SetLayoutManager(layout);
|
| - const int kColumnId = 0;
|
| - views::ColumnSet* columns = layout->AddColumnSet(kColumnId);
|
| - columns->AddPaddingColumn(0, kVerticalClockLeftPadding);
|
| - columns->AddColumn(views::GridLayout::TRAILING, views::GridLayout::CENTER,
|
| - 0, views::GridLayout::USE_PREF, 0, 0);
|
| - layout->AddPaddingRow(
|
| - 0, is_material_design ? kClockLeadingPadding
|
| - : kTrayLabelItemVerticalPaddingVerticalAlignment);
|
| - layout->StartRow(0, kColumnId);
|
| - layout->AddView(vertical_label_hours_.get());
|
| - layout->StartRow(0, kColumnId);
|
| - layout->AddView(vertical_label_minutes_.get());
|
| - layout->AddPaddingRow(
|
| - 0,
|
| - is_material_design
|
| - ? kTrayImageItemPadding + kVerticalClockMinutesTopOffsetMD
|
| - : kTrayLabelItemVerticalPaddingVerticalAlignment);
|
| - }
|
| - Layout();
|
| -}
|
| -
|
| -void TimeView::SetBorderFromLayout(ClockLayout clock_layout) {
|
| - if (clock_layout == ClockLayout::HORIZONTAL_CLOCK) {
|
| - SetBorder(views::CreateEmptyBorder(
|
| - gfx::Insets(0,
|
| - UseMd() ? kTrayImageItemPadding
|
| - : kTrayLabelItemHorizontalPaddingBottomAlignment)));
|
| - } else {
|
| - SetBorder(views::NullBorder());
|
| - }
|
| -}
|
| -
|
| -void TimeView::SetupLabels() {
|
| - horizontal_label_.reset(new views::Label());
|
| - SetupLabel(horizontal_label_.get());
|
| - vertical_label_hours_.reset(new views::Label());
|
| - SetupLabel(vertical_label_hours_.get());
|
| - vertical_label_minutes_.reset(new views::Label());
|
| - SetupLabel(vertical_label_minutes_.get());
|
| - // TODO(estade): this should use the NativeTheme's secondary text color.
|
| - vertical_label_minutes_->SetEnabledColor(kVerticalClockMinuteColor);
|
| - // Pull the minutes up closer to the hours by using a negative top border.
|
| - vertical_label_minutes_->SetBorder(
|
| - views::CreateEmptyBorder(MaterialDesignController::IsShelfMaterial()
|
| - ? kVerticalClockMinutesTopOffsetMD
|
| - : kVerticalClockMinutesTopOffset,
|
| - 0, 0, 0));
|
| -}
|
| -
|
| -void TimeView::SetupLabel(views::Label* label) {
|
| - label->set_owned_by_client();
|
| - SetupLabelForTray(label);
|
| - label->SetElideBehavior(gfx::NO_ELIDE);
|
| -}
|
| -
|
| -} // namespace tray
|
| -} // namespace ash
|
|
|