1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/views/button_drag_utils.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "grit/ui_resources.h"
9#include "ui/base/dragdrop/drag_utils.h"
10#include "ui/base/dragdrop/os_exchange_data.h"
11#include "ui/base/resource/resource_bundle.h"
12#include "ui/gfx/canvas.h"
13#include "ui/gfx/image/image.h"
14#include "ui/views/controls/button/text_button.h"
15#include "ui/views/drag_utils.h"
16#include "url/gurl.h"
17
18namespace button_drag_utils {
19
20// Maximum width of the link drag image in pixels.
21static const int kLinkDragImageMaxWidth = 200;
22
23void SetURLAndDragImage(const GURL& url,
24                        const string16& title,
25                        const gfx::ImageSkia& icon,
26                        ui::OSExchangeData* data,
27                        views::Widget* widget) {
28  DCHECK(url.is_valid() && data);
29
30  data->SetURL(url, title);
31
32  // Create a button to render the drag image for us.
33  views::TextButton button(NULL,
34                           title.empty() ? UTF8ToUTF16(url.spec()) : title);
35  button.set_max_width(kLinkDragImageMaxWidth);
36  if (icon.isNull()) {
37    button.SetIcon(*ui::ResourceBundle::GetSharedInstance().GetImageNamed(
38                   IDR_DEFAULT_FAVICON).ToImageSkia());
39  } else {
40    button.SetIcon(icon);
41  }
42  gfx::Size prefsize = button.GetPreferredSize();
43  button.SetBounds(0, 0, prefsize.width(), prefsize.height());
44
45  // Render the image.
46  scoped_ptr<gfx::Canvas> canvas(
47      views::GetCanvasForDragImage(widget, prefsize));
48  button.PaintButton(canvas.get(), views::TextButton::PB_FOR_DRAG);
49  drag_utils::SetDragImageOnDataObject(*canvas, prefsize,
50      gfx::Vector2d(prefsize.width() / 2, prefsize.height() / 2), data);
51}
52
53}  // namespace button_drag_utils
54