Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(432)

Unified Diff: ui/views/bubble/tray_bubble_view.cc

Issue 11819048: Implement message center on Windows (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase on master @fa1d2262 and rearrange dependencies. Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/views/bubble/tray_bubble_view.cc
diff --git a/ui/views/bubble/tray_bubble_view.cc b/ui/views/bubble/tray_bubble_view.cc
index 9a7b0412adfc2183b8aedc2c898b374030fa7a2e..c9600592613ad42aa6847398326e60791ab3bf0a 100644
--- a/ui/views/bubble/tray_bubble_view.cc
+++ b/ui/views/bubble/tray_bubble_view.cc
@@ -43,12 +43,14 @@ class TrayBubbleBorder : public views::BubbleBorder {
public:
TrayBubbleBorder(views::View* owner,
views::View* anchor,
+ gfx::Point anchor_point,
TrayBubbleView::InitParams params)
: views::BubbleBorder(params.arrow_location, params.shadow),
owner_(owner),
anchor_(anchor),
+ anchor_point_(anchor_point.x(), anchor_point.y()),
tray_arrow_offset_(params.arrow_offset) {
- set_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
+ set_alignment(params.arrow_alignment);
set_background_color(params.arrow_color);
}
@@ -59,7 +61,7 @@ class TrayBubbleBorder : public views::BubbleBorder {
// it has no arrow.
virtual gfx::Rect GetBounds(const gfx::Rect& position_relative_to,
const gfx::Size& contents_size) const OVERRIDE {
- if (arrow_location() != NONE) {
+ if (has_arrow(arrow_location())) {
return views::BubbleBorder::GetBounds(position_relative_to,
contents_size);
}
@@ -76,46 +78,51 @@ class TrayBubbleBorder : public views::BubbleBorder {
return gfx::Rect(x, y, border_size.width(), border_size.height());
}
+ // Anchor point is in screen coordinates.
void UpdateArrowOffset() {
+ if (!has_arrow(arrow_location())) {
+ return;
+ }
+
int arrow_offset = 0;
- if (arrow_location() == views::BubbleBorder::BOTTOM_RIGHT ||
- arrow_location() == views::BubbleBorder::BOTTOM_LEFT) {
- // Note: tray_arrow_offset_ is relative to the anchor widget.
- if (tray_arrow_offset_ ==
- TrayBubbleView::InitParams::kArrowDefaultOffset) {
- arrow_offset = kArrowMinOffset;
- } else {
- const int width = owner_->GetWidget()->GetContentsView()->width();
- gfx::Point pt(tray_arrow_offset_, 0);
- views::View::ConvertPointToScreen(
- anchor_->GetWidget()->GetRootView(), &pt);
- views::View::ConvertPointFromScreen(
- owner_->GetWidget()->GetRootView(), &pt);
- arrow_offset = pt.x();
- if (arrow_location() == views::BubbleBorder::BOTTOM_RIGHT)
- arrow_offset = width - arrow_offset;
- arrow_offset = std::max(arrow_offset, kArrowMinOffset);
- }
+ gfx::Point pt(0, 0);
+ if (tray_arrow_offset_ == TrayBubbleView::InitParams::kArrowDefaultOffset) {
+ set_arrow_offset(kArrowMinOffset);
+ return;
+ }
+ // Note: tray_arrow_offset_ is relative to the anchor widget.
+ if (is_arrow_on_horizontal(arrow_location()))
+ pt.set_x(tray_arrow_offset_);
+ else
+ pt.set_y(tray_arrow_offset_);
+
+ if (anchor_) {
+ views::View::ConvertPointToScreen(
+ anchor_->GetWidget()->GetRootView(), &pt);
+ } else {
+ pt.Offset(anchor_point_.x(), anchor_point_.y());
+ }
+
+ views::View::ConvertPointFromScreen(
+ owner_->GetWidget()->GetRootView(), &pt);
+ const int width = owner_->GetWidget()->GetContentsView()->width();
+
+ if (is_arrow_on_horizontal(arrow_location())) {
+ arrow_offset = pt.x();
+ if (!is_arrow_on_left(arrow_location()))
+ arrow_offset = width - arrow_offset;
} else {
- if (tray_arrow_offset_ ==
- TrayBubbleView::InitParams::kArrowDefaultOffset) {
- arrow_offset = kArrowMinOffset;
- } else {
- gfx::Point pt(0, tray_arrow_offset_);
- views::View::ConvertPointToScreen(
- anchor_->GetWidget()->GetRootView(), &pt);
- views::View::ConvertPointFromScreen(
- owner_->GetWidget()->GetRootView(), &pt);
- arrow_offset = pt.y();
- arrow_offset = std::max(arrow_offset, kArrowMinOffset);
- }
+ arrow_offset = pt.y();
}
+
+ arrow_offset = std::max(arrow_offset, kArrowMinOffset);
set_arrow_offset(arrow_offset);
}
private:
views::View* owner_;
views::View* anchor_;
+ gfx::Point anchor_point_;
const int tray_arrow_offset_;
DISALLOW_COPY_AND_ASSIGN(TrayBubbleBorder);
@@ -147,11 +154,15 @@ class TrayBubbleContentMask : public ui::LayerDelegate {
TrayBubbleContentMask::TrayBubbleContentMask(int corner_radius)
: layer_(ui::LAYER_TEXTURED),
corner_radius_(corner_radius) {
+#ifdef USE_AURA
layer_.set_delegate(this);
+#endif
}
TrayBubbleContentMask::~TrayBubbleContentMask() {
+#ifdef USE_AURA
layer_.set_delegate(NULL);
+#endif
}
void TrayBubbleContentMask::OnPaintLayer(gfx::Canvas* canvas) {
@@ -233,7 +244,8 @@ TrayBubbleView::InitParams::InitParams(AnchorType anchor_type,
arrow_color(SK_ColorBLACK),
arrow_location(views::BubbleBorder::NONE),
arrow_offset(kArrowDefaultOffset),
- shadow(views::BubbleBorder::BIG_SHADOW) {
+ shadow(views::BubbleBorder::BIG_SHADOW),
+ arrow_alignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE) {
}
// static
@@ -273,13 +285,19 @@ TrayBubbleView::TrayBubbleView(gfx::NativeView parent_window,
set_notify_enter_exit_on_child(true);
set_close_on_deactivate(init_params.close_on_deactivate);
set_margins(gfx::Insets());
+ bubble_border_ = new TrayBubbleBorder(
+ this,
+ anchor_view(),
+ gfx::Point(init_params.anchor_point_x, init_params.anchor_point_y),
+ params_);
+
+#ifdef USE_AURA
SetPaintToLayer(true);
SetFillsBoundsOpaquely(true);
- bubble_border_ = new TrayBubbleBorder(this, anchor_view(), params_);
-
bubble_content_mask_.reset(
new TrayBubbleContentMask(bubble_border_->GetBorderCornerRadius() - 1));
+#endif //USE_AURA
}
TrayBubbleView::~TrayBubbleView() {
@@ -290,10 +308,12 @@ TrayBubbleView::~TrayBubbleView() {
void TrayBubbleView::InitializeAndShowBubble() {
// Must occur after call to BubbleDelegateView::CreateBubble().
- SetAlignment(views::BubbleBorder::ALIGN_EDGE_TO_ANCHOR_EDGE);
+ SetAlignment(params_.arrow_alignment);
bubble_border_->UpdateArrowOffset();
+#ifdef USE_AURA
layer()->parent()->SetMaskLayer(bubble_content_mask_->layer());
+#endif // USE_AURA
Show();
UpdateBubble();
@@ -301,7 +321,9 @@ void TrayBubbleView::InitializeAndShowBubble() {
void TrayBubbleView::UpdateBubble() {
SizeToContents();
+#ifdef USE_AURA
bubble_content_mask_->layer()->SetBounds(layer()->bounds());
+#endif // USE_AURA
GetWidget()->GetRootView()->SchedulePaint();
}
@@ -401,11 +423,13 @@ void TrayBubbleView::ChildPreferredSizeChanged(View* child) {
void TrayBubbleView::ViewHierarchyChanged(bool is_add,
views::View* parent,
views::View* child) {
+#ifdef USE_AURA
if (is_add && child == this) {
parent->SetPaintToLayer(true);
parent->SetFillsBoundsOpaquely(true);
parent->layer()->SetMasksToBounds(true);
}
+#endif // USE_AURA
}
} // namespace views

Powered by Google App Engine
This is Rietveld 408576698