| Index: ui/message_center/views/desktop_popup_alignment_delegate.cc
|
| diff --git a/ui/message_center/views/desktop_popup_alignment_delegate.cc b/ui/message_center/views/desktop_popup_alignment_delegate.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ec01ded2832c9d4569d2009903178e689416c40a
|
| --- /dev/null
|
| +++ b/ui/message_center/views/desktop_popup_alignment_delegate.cc
|
| @@ -0,0 +1,104 @@
|
| +// Copyright 2014 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 "ui/message_center/views/desktop_popup_alignment_delegate.h"
|
| +
|
| +#include "ui/gfx/display.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| +#include "ui/gfx/screen.h"
|
| +#include "ui/message_center/message_center_style.h"
|
| +#include "ui/message_center/views/message_popup_collection.h"
|
| +
|
| +namespace message_center {
|
| +
|
| +DesktopPopupAlignmentDelegate::DesktopPopupAlignmentDelegate()
|
| + : alignment_(POPUP_ALIGNMENT_BOTTOM | POPUP_ALIGNMENT_RIGHT),
|
| + display_id_(gfx::Display::kInvalidDisplayID),
|
| + screen_(NULL) {
|
| +}
|
| +
|
| +DesktopPopupAlignmentDelegate::~DesktopPopupAlignmentDelegate() {
|
| + if (screen_)
|
| + screen_->RemoveObserver(this);
|
| +}
|
| +
|
| +void DesktopPopupAlignmentDelegate::StartObserving(gfx::Screen* screen) {
|
| + if (screen_ || !screen)
|
| + return;
|
| +
|
| + screen_ = screen;
|
| + screen_->AddObserver(this);
|
| + gfx::Display display = screen_->GetPrimaryDisplay();
|
| + display_id_ = display.id();
|
| + RecomputeAlignment(display);
|
| +}
|
| +
|
| +int DesktopPopupAlignmentDelegate::GetToastOriginX(
|
| + const gfx::Rect& toast_bounds) const {
|
| + if (IsFromLeft())
|
| + return work_area_.x() + kMarginBetweenItems;
|
| + return work_area_.right() - kMarginBetweenItems - toast_bounds.width();
|
| +}
|
| +
|
| +int DesktopPopupAlignmentDelegate::GetBaseLine() const {
|
| + return IsTopDown()
|
| + ? work_area_.y() + kMarginBetweenItems
|
| + : work_area_.bottom() - kMarginBetweenItems;
|
| +}
|
| +
|
| +int DesktopPopupAlignmentDelegate::GetWorkAreaBottom() const {
|
| + return work_area_.bottom();
|
| +}
|
| +
|
| +bool DesktopPopupAlignmentDelegate::IsTopDown() const {
|
| + return (alignment_ & POPUP_ALIGNMENT_TOP) != 0;
|
| +}
|
| +
|
| +bool DesktopPopupAlignmentDelegate::IsFromLeft() const {
|
| + return (alignment_ & POPUP_ALIGNMENT_LEFT) != 0;
|
| +}
|
| +
|
| +void DesktopPopupAlignmentDelegate::RecomputeAlignment(
|
| + const gfx::Display& display) {
|
| + if (work_area_ == display.work_area())
|
| + return;
|
| +
|
| + work_area_ = display.work_area();
|
| +
|
| + // If the taskbar is at the top, render notifications top down. Some platforms
|
| + // like Gnome can have taskbars at top and bottom. In this case it's more
|
| + // likely that the systray is on the top one.
|
| + alignment_ = work_area_.y() > display.bounds().y() ? POPUP_ALIGNMENT_TOP
|
| + : POPUP_ALIGNMENT_BOTTOM;
|
| +
|
| + // If the taskbar is on the left show the notifications on the left. Otherwise
|
| + // show it on right since it's very likely that the systray is on the right if
|
| + // the taskbar is on the top or bottom.
|
| + // Since on some platforms like Ubuntu Unity there's also a launcher along
|
| + // with a taskbar (panel), we need to check that there is really nothing at
|
| + // the top before concluding that the taskbar is at the left.
|
| + alignment_ |= (work_area_.x() > display.bounds().x() &&
|
| + work_area_.y() == display.bounds().y())
|
| + ? POPUP_ALIGNMENT_LEFT
|
| + : POPUP_ALIGNMENT_RIGHT;
|
| +}
|
| +
|
| +void DesktopPopupAlignmentDelegate::OnDisplayAdded(
|
| + const gfx::Display& new_display) {
|
| +}
|
| +
|
| +void DesktopPopupAlignmentDelegate::OnDisplayRemoved(
|
| + const gfx::Display& old_display) {
|
| +}
|
| +
|
| +void DesktopPopupAlignmentDelegate::OnDisplayMetricsChanged(
|
| + const gfx::Display& display,
|
| + uint32_t metrics) {
|
| + if (display.id() == display_id_) {
|
| + RecomputeAlignment(display);
|
| + DoUpdateIfPossible();
|
| + }
|
| +}
|
| +
|
| +} // namespace message_center
|
|
|