// 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.

#include "chrome/browser/bookmarks/bookmark_drop_info.h"

#if defined(OS_WIN)
#include <windows.h>
#endif

#include "base/basictypes.h"
#include "views/events/event.h"
#include "views/view_constants.h"

BookmarkDropInfo::BookmarkDropInfo(gfx::NativeWindow wnd, int top_margin)
    : source_operations_(0),
      is_control_down_(false),
      last_y_(0),
      drop_operation_(0),
      wnd_(wnd),
      top_margin_(top_margin),
      scroll_up_(false) {
}

BookmarkDropInfo::~BookmarkDropInfo() {
}

void BookmarkDropInfo::Update(const views::DropTargetEvent& event) {
  source_operations_ = event.source_operations();
  is_control_down_ = event.IsControlDown();
  last_y_ = event.y();

#if defined(OS_WIN)
  RECT client_rect;
  GetClientRect(wnd_, &client_rect);
  bool scroll_down = (last_y_ >= client_rect.bottom - views::kAutoscrollSize);
#else
  // TODO(port): Get the dimensions of the appropriate view/widget.
  NOTIMPLEMENTED();
  bool scroll_down = false;
#endif
  scroll_up_ = (last_y_ <= top_margin_ + views::kAutoscrollSize);
  if (scroll_up_ || scroll_down) {
    if (!scroll_timer_.IsRunning()) {
      scroll_timer_.Start(
          base::TimeDelta::FromMilliseconds(views::kAutoscrollRowTimerMS),
          this,
          &BookmarkDropInfo::Scroll);
    }
  } else {
    scroll_timer_.Stop();
  }
}

void BookmarkDropInfo::Scroll() {
#if defined(OS_WIN)
  SendMessage(wnd_, WM_VSCROLL, scroll_up_ ? SB_LINEUP : SB_LINEDOWN, NULL);
  Scrolled();
#else
  // TODO(port): Scroll the appropriate view/widget.
  NOTIMPLEMENTED();
#endif
}