1424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "ash/shelf/overflow_bubble.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/root_window_controller.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/overflow_bubble_view.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/shelf/shelf_view.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/shelf/shelf_widget.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/aura/client/screen_position_client.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OverflowBubble::OverflowBubble()
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : bubble_(NULL),
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      anchor_(NULL),
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      shelf_view_(NULL) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)OverflowBubble::~OverflowBubble() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Hide();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void OverflowBubble::Show(views::View* anchor, ShelfView* shelf_view) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Hide();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bubble_ = new OverflowBubbleView();
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bubble_->InitOverflowBubble(anchor, shelf_view);
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_ = shelf_view;
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  anchor_ = anchor;
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Shell::GetInstance()->AddPreTargetHandler(this);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RootWindowController::ForWindow(anchor->GetWidget()->GetNativeView())->
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetSystemTray()->InitializeBubbleAnimations(bubble_->GetWidget());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_->GetWidget()->AddObserver(this);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_->GetWidget()->Show();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverflowBubble::Hide() {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsShowing())
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Shell::GetInstance()->RemovePreTargetHandler(this);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_->GetWidget()->RemoveObserver(this);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_->GetWidget()->Close();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_ = NULL;
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  anchor_ = NULL;
578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_ = NULL;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void OverflowBubble::HideBubbleAndRefreshButton() {
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!IsShowing())
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return;
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  views::View* anchor = anchor_;
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Hide();
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Update overflow button (|anchor|) status when overflow bubble is hidden
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // by outside event of overflow button.
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  anchor->SchedulePaint();
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void OverflowBubble::ProcessPressedEvent(ui::LocatedEvent* event) {
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  aura::Window* target = static_cast<aura::Window*>(event->target());
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  gfx::Point event_location_in_screen = event->location();
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  aura::client::GetScreenPositionClient(target->GetRootWindow())->
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ConvertPointToScreen(target, &event_location_in_screen);
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (!shelf_view_->IsShowingMenu() &&
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !bubble_->GetBoundsInScreen().Contains(event_location_in_screen) &&
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      !anchor_->GetBoundsInScreen().Contains(event_location_in_screen)) {
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    HideBubbleAndRefreshButton();
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void OverflowBubble::OnMouseEvent(ui::MouseEvent* event) {
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (event->type() == ui::ET_MOUSE_PRESSED)
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ProcessPressedEvent(event);
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void OverflowBubble::OnTouchEvent(ui::TouchEvent* event) {
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (event->type() == ui::ET_TOUCH_PRESSED)
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ProcessPressedEvent(event);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OverflowBubble::OnWidgetDestroying(views::Widget* widget) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(widget == bubble_->GetWidget());
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_ = NULL;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  anchor_ = NULL;
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  shelf_view_ = NULL;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ShelfLayoutManager::ForShelf(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      widget->GetNativeView())->shelf_widget()->shelf()->SchedulePaint();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
103