15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/partial_screenshot_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <algorithm>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/mouse_cursor_event_filter.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screenshot_delegate.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/overlay_event_filter.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/capture_client.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/widget_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A self-owned object to handle the cancel and the finish of current partial
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screenshot session.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PartialScreenshotView::OverlayDelegate
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : public OverlayEventFilter::Delegate,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public views::WidgetObserver {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverlayDelegate() {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Shell::GetInstance()->overlay_filter()->Activate(this);
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RegisterWidget(views::Widget* widget) {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widgets_.push_back(widget);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->AddObserver(this);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from OverlayEventFilter::Delegate:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Cancel() OVERRIDE {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure the mouse_warp_mode allows warping. It can be stopped by a
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // partial screenshot view.
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    MouseCursorEventFilter* mouse_cursor_filter =
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Shell::GetInstance()->mouse_cursor_filter();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mouse_cursor_filter->set_mouse_warp_mode(
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        MouseCursorEventFilter::WARP_ALWAYS);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < widgets_.size(); ++i)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      widgets_[i]->Close();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsCancelingKeyEvent(ui::KeyEvent* event) OVERRIDE {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return event->key_code() == ui::VKEY_ESCAPE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual aura::Window* GetWindow() OVERRIDE {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Just returns NULL because this class does not handle key events in
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // OverlayEventFilter, except for cancel keys.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from views::WidgetObserver:
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widget->RemoveObserver(this);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    widgets_.erase(std::remove(widgets_.begin(), widgets_.end(), widget));
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (widgets_.empty())
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      delete this;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverlayDelegate() {
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Shell::GetInstance()->overlay_filter()->Deactivate(this);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<views::Widget*> widgets_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverlayDelegate);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::vector<PartialScreenshotView*>
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PartialScreenshotView::StartPartialScreenshot(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScreenshotDelegate* screenshot_delegate) {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<PartialScreenshotView*> views;
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (Shell::GetInstance()->overlay_filter()->IsActive())
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return views;
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverlayDelegate* overlay_delegate = new OverlayDelegate();
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window::Windows root_windows = Shell::GetAllRootWindows();
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (aura::Window::Windows::iterator it = root_windows.begin();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != root_windows.end(); ++it) {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PartialScreenshotView* new_view = new PartialScreenshotView(
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        overlay_delegate, screenshot_delegate);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_view->Init(*it);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    views.push_back(new_view);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return views;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::PartialScreenshotView(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PartialScreenshotView::OverlayDelegate* overlay_delegate,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScreenshotDelegate* screenshot_delegate)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : is_dragging_(false),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overlay_delegate_(overlay_delegate),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      screenshot_delegate_(screenshot_delegate) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PartialScreenshotView::~PartialScreenshotView() {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlay_delegate_ = NULL;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  screenshot_delegate_ = NULL;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PartialScreenshotView::Init(aura::Window* root_window) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget* widget = new views::Widget;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Widget::InitParams params(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Widget::InitParams::TYPE_WINDOW_FRAMELESS);
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.delegate = this;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The partial screenshot rectangle has to be at the real top of
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the screen.
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  params.parent =
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Shell::GetContainer(root_window, kShellWindowId_OverlayContainer);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(params);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->SetContentsView(this);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->SetBounds(root_window->GetBoundsInScreen());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->GetNativeView()->SetName("PartialScreenshotView");
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->StackAtTop();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Show();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Releases the mouse capture to let mouse events come to the view. This
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // will close the context menu.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::CaptureClient* capture_client =
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::client::GetCaptureClient(root_window);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (capture_client->GetCaptureWindow())
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    capture_client->ReleaseCapture(capture_client->GetCaptureWindow());
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overlay_delegate_->RegisterWidget(widget);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect PartialScreenshotView::GetScreenshotRect() const {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int left = std::min(start_position_.x(), current_position_.x());
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int top = std::min(start_position_.y(), current_position_.y());
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int width = ::abs(start_position_.x() - current_position_.x());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int height = ::abs(start_position_.y() - current_position_.y());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Rect(left, top, width, height);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionStarted(const gfx::Point& position) {
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  start_position_ = position;
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionChanged(const gfx::Point& position) {
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (is_dragging_ && current_position_ == position)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  current_position_ = position;
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SchedulePaint();
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_dragging_ = true;
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnSelectionFinished() {
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overlay_delegate_->Cancel();
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!is_dragging_)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  is_dragging_ = false;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (screenshot_delegate_) {
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    aura::Window*root_window =
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        GetWidget()->GetNativeWindow()->GetRootWindow();
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    screenshot_delegate_->HandleTakePartialScreenshot(
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        root_window,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        gfx::IntersectRects(root_window->bounds(), GetScreenshotRect()));
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor PartialScreenshotView::GetCursor(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::MouseEvent& event) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Always use "crosshair" cursor.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::kCursorCross;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnPaint(gfx::Canvas* canvas) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_dragging_) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Screenshot area representation: black rectangle with white
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // rectangle inside.  To avoid capturing these rectangles when mouse
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // release, they should be outside of the actual capturing area.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect screenshot_rect = GetScreenshotRect();
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screenshot_rect.Inset(-1, -1, -1, -1);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas->DrawRect(screenshot_rect, SK_ColorWHITE);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    screenshot_rect.Inset(-1, -1, -1, -1);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas->DrawRect(screenshot_rect, SK_ColorBLACK);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMousePressed(const ui::MouseEvent& event) {
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prevent moving across displays during drag. Capturing a screenshot across
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the displays is not supported yet.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mukai): remove this restriction.
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MouseCursorEventFilter* mouse_cursor_filter =
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Shell::GetInstance()->mouse_cursor_filter();
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  mouse_cursor_filter->set_mouse_warp_mode(MouseCursorEventFilter::WARP_NONE);
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnSelectionStarted(event.location());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseDragged(const ui::MouseEvent& event) {
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnSelectionChanged(event.location());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PartialScreenshotView::OnMouseWheel(const ui::MouseWheelEvent& event) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do nothing but do not propagate events futhermore.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PartialScreenshotView::OnMouseReleased(const ui::MouseEvent& event) {
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnSelectionFinished();
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnMouseCaptureLost() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_dragging_ = false;
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OnSelectionFinished();
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PartialScreenshotView::OnGestureEvent(ui::GestureEvent* event) {
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  switch(event->type()) {
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnSelectionStarted(event->location());
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnSelectionChanged(event->location());
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OnSelectionFinished();
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    default:
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      break;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  event->SetHandled();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
246