blob: f19fa9c36ac660fd76719ffde4fcadd4d4c8f2c0 [file] [log] [blame]
// Copyright 2013 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 "ash/shelf/overflow_bubble.h"
#include "ash/common/system/tray/tray_background_view.h"
#include "ash/shelf/overflow_bubble_view.h"
#include "ash/shelf/shelf.h"
#include "ash/shelf/shelf_view.h"
#include "ash/shelf/shelf_widget.h"
#include "ash/shell.h"
#include "ui/events/event.h"
#include "ui/views/widget/widget.h"
namespace ash {
OverflowBubble::OverflowBubble()
: bubble_(NULL), anchor_(NULL), shelf_view_(NULL) {
Shell::GetInstance()->AddPointerWatcher(this);
}
OverflowBubble::~OverflowBubble() {
Hide();
Shell::GetInstance()->RemovePointerWatcher(this);
}
void OverflowBubble::Show(views::View* anchor, ShelfView* shelf_view) {
Hide();
bubble_ = new OverflowBubbleView();
bubble_->InitOverflowBubble(anchor, shelf_view);
shelf_view_ = shelf_view;
anchor_ = anchor;
TrayBackgroundView::InitializeBubbleAnimations(bubble_->GetWidget());
bubble_->GetWidget()->AddObserver(this);
bubble_->GetWidget()->Show();
}
void OverflowBubble::Hide() {
if (!IsShowing())
return;
bubble_->GetWidget()->RemoveObserver(this);
bubble_->GetWidget()->Close();
bubble_ = NULL;
anchor_ = NULL;
shelf_view_ = NULL;
}
void OverflowBubble::HideBubbleAndRefreshButton() {
if (!IsShowing())
return;
views::View* anchor = anchor_;
Hide();
// Update overflow button (|anchor|) status when overflow bubble is hidden
// by outside event of overflow button.
anchor->SchedulePaint();
}
void OverflowBubble::ProcessPressedEvent(
const gfx::Point& event_location_in_screen) {
if (IsShowing() && !shelf_view_->IsShowingMenu() &&
!bubble_->GetBoundsInScreen().Contains(event_location_in_screen) &&
!anchor_->GetBoundsInScreen().Contains(event_location_in_screen)) {
HideBubbleAndRefreshButton();
}
}
void OverflowBubble::OnMousePressed(const ui::MouseEvent& event,
const gfx::Point& location_in_screen,
views::Widget* target) {
ProcessPressedEvent(location_in_screen);
}
void OverflowBubble::OnTouchPressed(const ui::TouchEvent& event,
const gfx::Point& location_in_screen,
views::Widget* target) {
ProcessPressedEvent(location_in_screen);
}
void OverflowBubble::OnWidgetDestroying(views::Widget* widget) {
DCHECK(widget == bubble_->GetWidget());
bubble_ = NULL;
anchor_ = NULL;
shelf_view_->shelf()->SchedulePaint();
shelf_view_ = NULL;
}
} // namespace ash