OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/views/status_bubble_views.h" | 5 #include "chrome/browser/views/status_bubble_views.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "app/gfx/canvas.h" | 9 #include "app/gfx/canvas.h" |
10 #include "app/gfx/text_elider.h" | 10 #include "app/gfx/text_elider.h" |
(...skipping 553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 GetCursorPos(&tmp); | 564 GetCursorPos(&tmp); |
565 cursor_location = tmp; | 565 cursor_location = tmp; |
566 #else | 566 #else |
567 NOTIMPLEMENTED(); | 567 NOTIMPLEMENTED(); |
568 #endif | 568 #endif |
569 | 569 |
570 // Get the position of the frame. | 570 // Get the position of the frame. |
571 gfx::Point top_left; | 571 gfx::Point top_left; |
572 views::RootView* root = frame_->GetRootView(); | 572 views::RootView* root = frame_->GetRootView(); |
573 views::View::ConvertPointToScreen(root, &top_left); | 573 views::View::ConvertPointToScreen(root, &top_left); |
| 574 int window_width = root->GetLocalBounds(true).width(); // border included. |
574 | 575 |
575 // Get the cursor position relative to the popup. | 576 // Get the cursor position relative to the popup. |
576 cursor_location.set_x(cursor_location.x() - (top_left.x() + position_.x())); | 577 if (view_->UILayoutIsRightToLeft()) { |
| 578 int top_right_x = top_left.x() + window_width; |
| 579 cursor_location.set_x(top_right_x - cursor_location.x()); |
| 580 } else { |
| 581 cursor_location.set_x(cursor_location.x() - (top_left.x() + position_.x())); |
| 582 } |
577 cursor_location.set_y(cursor_location.y() - (top_left.y() + position_.y())); | 583 cursor_location.set_y(cursor_location.y() - (top_left.y() + position_.y())); |
578 | 584 |
579 // If the mouse is in a position where we think it would move the | 585 // If the mouse is in a position where we think it would move the |
580 // status bubble, figure out where and how the bubble should be moved. | 586 // status bubble, figure out where and how the bubble should be moved. |
581 if (cursor_location.y() > -kMousePadding && | 587 if (cursor_location.y() > -kMousePadding && |
582 cursor_location.x() < size_.width() + kMousePadding) { | 588 cursor_location.x() < size_.width() + kMousePadding) { |
583 int offset = kMousePadding + cursor_location.y(); | 589 int offset = kMousePadding + cursor_location.y(); |
584 | 590 |
585 // Make the movement non-linear. | 591 // Make the movement non-linear. |
586 offset = offset * offset / kMousePadding; | 592 offset = offset * offset / kMousePadding; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 NOTIMPLEMENTED(); | 624 NOTIMPLEMENTED(); |
619 #endif | 625 #endif |
620 const int bubble_bottom_y = top_left.y() + position_.y() + size_.height(); | 626 const int bubble_bottom_y = top_left.y() + position_.y() + size_.height(); |
621 | 627 |
622 if (bubble_bottom_y + offset > monitor_rect.height()) { | 628 if (bubble_bottom_y + offset > monitor_rect.height()) { |
623 // The offset is still too large. Move the bubble to the right and reset | 629 // The offset is still too large. Move the bubble to the right and reset |
624 // Y offset_ to zero. | 630 // Y offset_ to zero. |
625 view_->SetStyle(StatusView::STYLE_STANDARD_RIGHT); | 631 view_->SetStyle(StatusView::STYLE_STANDARD_RIGHT); |
626 offset_ = 0; | 632 offset_ = 0; |
627 | 633 |
628 int root_width = root->GetLocalBounds(true).width(); // border included. | |
629 // Substract border width + bubble width. | 634 // Substract border width + bubble width. |
630 int right_position_x = root_width - (position_.x() + size_.width()); | 635 int right_position_x = window_width - (position_.x() + size_.width()); |
631 popup_->SetBounds(gfx::Rect(top_left.x() + right_position_x, | 636 popup_->SetBounds(gfx::Rect(top_left.x() + right_position_x, |
632 top_left.y() + position_.y(), | 637 top_left.y() + position_.y(), |
633 size_.width(), size_.height())); | 638 size_.width(), size_.height())); |
634 } else { | 639 } else { |
635 offset_ = offset; | 640 offset_ = offset; |
636 popup_->SetBounds(gfx::Rect(top_left.x() + position_.x(), | 641 popup_->SetBounds(gfx::Rect(top_left.x() + position_.x(), |
637 top_left.y() + position_.y() + offset_, | 642 top_left.y() + position_.y() + offset_, |
638 size_.width(), size_.height())); | 643 size_.width(), size_.height())); |
639 } | 644 } |
640 } else if (offset_ != 0 || | 645 } else if (offset_ != 0 || |
(...skipping 25 matching lines...) Expand all Loading... |
666 frame_->GetBounds(&frame_bounds, false); | 671 frame_->GetBounds(&frame_bounds, false); |
667 int mirrored_x = frame_bounds.width() - x - w; | 672 int mirrored_x = frame_bounds.width() - x - w; |
668 position_.SetPoint(mirrored_x, y); | 673 position_.SetPoint(mirrored_x, y); |
669 } else { | 674 } else { |
670 position_.SetPoint(x, y); | 675 position_.SetPoint(x, y); |
671 } | 676 } |
672 | 677 |
673 size_.SetSize(w, h); | 678 size_.SetSize(w, h); |
674 Reposition(); | 679 Reposition(); |
675 } | 680 } |
OLD | NEW |