// Copyright (c) 2006-2008 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.
#ifndef CHROME_BROWSER_BOOKMARKS_BOOKMARK_DROP_INFO_H_
#define CHROME_BROWSER_BOOKMARKS_BOOKMARK_DROP_INFO_H_
#pragma once
#include "base/basictypes.h"
#include "base/timer.h"
#include "chrome/browser/bookmarks/bookmark_node_data.h"
#include "ui/gfx/native_widget_types.h"
namespace views {
class DropTargetEvent;
}
// BookmarkDropInfo is a pure virtual class that provides auto-scrolling
// behavior and a handful of fields used for managing a bookmark drop.
// BookmarkDropInfo is used by both BookmarkTableView and
// BookmarksFolderTreeView.
class BookmarkDropInfo {
public:
BookmarkDropInfo(gfx::NativeWindow hwnd, int top_margin);
virtual ~BookmarkDropInfo();
// Invoke this from OnDragUpdated. It resets source_operations,
// is_control_down, last_y and updates the autoscroll timer as necessary.
void Update(const views::DropTargetEvent& event);
// Data from the drag.
void SetData(const BookmarkNodeData& data) { data_ = data; }
BookmarkNodeData& data() { return data_; }
// Value of event.GetSourceOperations when Update was last invoked.
int source_operations() const { return source_operations_; }
// Whether the control key was down last time Update was invoked.
bool is_control_down() const { return is_control_down_; }
// Y position of the event last passed to Update.
int last_y() { return last_y_; }
// The drop operation that should occur. This is not updated by
// BookmarkDropInfo, but provided for subclasses.
void set_drop_operation(int drop_operation) {
drop_operation_ = drop_operation;
}
int drop_operation() const { return drop_operation_; }
protected:
// Invoked if we autoscroll. When invoked subclasses need to determine
// whether the drop is valid again as what is under the mouse has likely
// scrolled.
virtual void Scrolled() = 0;
private:
// Invoked from the timer. Scrolls up/down a line.
void Scroll();
BookmarkNodeData data_;
int source_operations_;
bool is_control_down_;
int last_y_;
int drop_operation_;
gfx::NativeWindow wnd_;
// Margin in addition to views::kAutoscrollSize that the mouse is allowed to
// be over before we autoscroll.
int top_margin_;
// When autoscrolling this determines if we're scrolling up or down.
bool scroll_up_;
// Used when autoscrolling.
base::RepeatingTimer<BookmarkDropInfo> scroll_timer_;
DISALLOW_COPY_AND_ASSIGN(BookmarkDropInfo);
};
#endif // CHROME_BROWSER_BOOKMARKS_BOOKMARK_DROP_INFO_H_