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