| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/gtk/tab_contents_drag_source.h" | 5 #include "chrome/browser/gtk/tab_contents_drag_source.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "app/gfx/gtk_util.h" |
| 9 #include "app/gtk_dnd_util.h" | 10 #include "app/gtk_dnd_util.h" |
| 10 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 11 #include "base/mime_util.h" | 12 #include "base/mime_util.h" |
| 12 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 13 #include "chrome/browser/download/download_manager.h" | 14 #include "chrome/browser/download/download_manager.h" |
| 14 #include "chrome/browser/download/drag_download_file.h" | 15 #include "chrome/browser/download/drag_download_file.h" |
| 15 #include "chrome/browser/download/drag_download_util.h" | 16 #include "chrome/browser/download/drag_download_util.h" |
| 16 #include "chrome/browser/gtk/gtk_util.h" | 17 #include "chrome/browser/gtk/gtk_util.h" |
| 17 #include "chrome/browser/renderer_host/render_view_host.h" | 18 #include "chrome/browser/renderer_host/render_view_host.h" |
| 18 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | 19 #include "chrome/browser/renderer_host/render_view_host_delegate.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 gtk_widget_destroy(drag_widget_); | 63 gtk_widget_destroy(drag_widget_); |
| 63 g_object_unref(drag_widget_); | 64 g_object_unref(drag_widget_); |
| 64 drag_widget_ = NULL; | 65 drag_widget_ = NULL; |
| 65 } | 66 } |
| 66 | 67 |
| 67 TabContents* TabContentsDragSource::tab_contents() const { | 68 TabContents* TabContentsDragSource::tab_contents() const { |
| 68 return tab_contents_view_->tab_contents(); | 69 return tab_contents_view_->tab_contents(); |
| 69 } | 70 } |
| 70 | 71 |
| 71 void TabContentsDragSource::StartDragging(const WebDropData& drop_data, | 72 void TabContentsDragSource::StartDragging(const WebDropData& drop_data, |
| 72 GdkEventButton* last_mouse_down) { | 73 GdkEventButton* last_mouse_down, |
| 74 const SkBitmap& image, |
| 75 const gfx::Point& image_offset) { |
| 73 int targets_mask = 0; | 76 int targets_mask = 0; |
| 74 | 77 |
| 75 if (!drop_data.plain_text.empty()) | 78 if (!drop_data.plain_text.empty()) |
| 76 targets_mask |= GtkDndUtil::TEXT_PLAIN; | 79 targets_mask |= GtkDndUtil::TEXT_PLAIN; |
| 77 if (drop_data.url.is_valid()) { | 80 if (drop_data.url.is_valid()) { |
| 78 targets_mask |= GtkDndUtil::TEXT_URI_LIST; | 81 targets_mask |= GtkDndUtil::TEXT_URI_LIST; |
| 79 targets_mask |= GtkDndUtil::CHROME_NAMED_URL; | 82 targets_mask |= GtkDndUtil::CHROME_NAMED_URL; |
| 80 targets_mask |= GtkDndUtil::NETSCAPE_URL; | 83 targets_mask |= GtkDndUtil::NETSCAPE_URL; |
| 81 } | 84 } |
| 82 if (!drop_data.text_html.empty()) | 85 if (!drop_data.text_html.empty()) |
| 83 targets_mask |= GtkDndUtil::TEXT_HTML; | 86 targets_mask |= GtkDndUtil::TEXT_HTML; |
| 84 if (!drop_data.file_contents.empty()) | 87 if (!drop_data.file_contents.empty()) |
| 85 targets_mask |= GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS; | 88 targets_mask |= GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS; |
| 86 if (!drop_data.download_metadata.empty() && | 89 if (!drop_data.download_metadata.empty() && |
| 87 drag_download_util::ParseDownloadMetadata(drop_data.download_metadata, | 90 drag_download_util::ParseDownloadMetadata(drop_data.download_metadata, |
| 88 &wide_download_mime_type_, | 91 &wide_download_mime_type_, |
| 89 &download_file_name_, | 92 &download_file_name_, |
| 90 &download_url_)) { | 93 &download_url_)) { |
| 91 targets_mask |= GtkDndUtil::DIRECT_SAVE_FILE; | 94 targets_mask |= GtkDndUtil::DIRECT_SAVE_FILE; |
| 92 } | 95 } |
| 93 | 96 |
| 94 if (targets_mask == 0) { | 97 if (targets_mask == 0) { |
| 95 NOTIMPLEMENTED(); | 98 NOTIMPLEMENTED(); |
| 96 if (tab_contents()->render_view_host()) | 99 if (tab_contents()->render_view_host()) |
| 97 tab_contents()->render_view_host()->DragSourceSystemDragEnded(); | 100 tab_contents()->render_view_host()->DragSourceSystemDragEnded(); |
| 98 } | 101 } |
| 99 | 102 |
| 100 drop_data_.reset(new WebDropData(drop_data)); | 103 drop_data_.reset(new WebDropData(drop_data)); |
| 104 drag_image_ = image; |
| 105 image_offset_ = image_offset; |
| 101 | 106 |
| 102 GtkTargetList* list = GtkDndUtil::GetTargetListFromCodeMask(targets_mask); | 107 GtkTargetList* list = GtkDndUtil::GetTargetListFromCodeMask(targets_mask); |
| 103 if (targets_mask & GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS) { | 108 if (targets_mask & GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS) { |
| 104 drag_file_mime_type_ = gdk_atom_intern( | 109 drag_file_mime_type_ = gdk_atom_intern( |
| 105 mime_util::GetDataMimeType(drop_data.file_contents).c_str(), FALSE); | 110 mime_util::GetDataMimeType(drop_data.file_contents).c_str(), FALSE); |
| 106 gtk_target_list_add(list, drag_file_mime_type_, | 111 gtk_target_list_add(list, drag_file_mime_type_, |
| 107 0, GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS); | 112 0, GtkDndUtil::CHROME_WEBDROP_FILE_CONTENTS); |
| 108 } | 113 } |
| 109 | 114 |
| 110 drag_failed_ = false; | 115 drag_failed_ = false; |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 GtkDndUtil::GetAtomForTarget( | 301 GtkDndUtil::GetAtomForTarget( |
| 297 GtkDndUtil::DIRECT_SAVE_FILE), | 302 GtkDndUtil::DIRECT_SAVE_FILE), |
| 298 GtkDndUtil::GetAtomForTarget( | 303 GtkDndUtil::GetAtomForTarget( |
| 299 GtkDndUtil::TEXT_PLAIN_NO_CHARSET), | 304 GtkDndUtil::TEXT_PLAIN_NO_CHARSET), |
| 300 8, | 305 8, |
| 301 GDK_PROP_MODE_REPLACE, | 306 GDK_PROP_MODE_REPLACE, |
| 302 reinterpret_cast<const guchar*>( | 307 reinterpret_cast<const guchar*>( |
| 303 generated_download_file_name.value().c_str()), | 308 generated_download_file_name.value().c_str()), |
| 304 generated_download_file_name.value().length()); | 309 generated_download_file_name.value().length()); |
| 305 } | 310 } |
| 311 |
| 312 if (!drag_image_.isNull()) { |
| 313 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&drag_image_); |
| 314 gtk_drag_set_icon_pixbuf(drag_context, pixbuf, |
| 315 image_offset_.x(), image_offset_.y()); |
| 316 // Let the drag take ownership. |
| 317 g_object_unref(pixbuf); |
| 318 } |
| 306 } | 319 } |
| 307 | 320 |
| 308 void TabContentsDragSource::OnDragEnd(GdkDragContext* drag_context, | 321 void TabContentsDragSource::OnDragEnd(GdkDragContext* drag_context, |
| 309 WebDragOperation operation) { | 322 WebDragOperation operation) { |
| 310 MessageLoopForUI::current()->RemoveObserver(this); | 323 MessageLoopForUI::current()->RemoveObserver(this); |
| 311 | 324 |
| 312 if (!download_url_.is_empty()) { | 325 if (!download_url_.is_empty()) { |
| 313 gdk_property_delete(drag_context->source_window, | 326 gdk_property_delete(drag_context->source_window, |
| 314 GtkDndUtil::GetAtomForTarget( | 327 GtkDndUtil::GetAtomForTarget( |
| 315 GtkDndUtil::DIRECT_SAVE_FILE)); | 328 GtkDndUtil::DIRECT_SAVE_FILE)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 327 | 340 |
| 328 if (tab_contents()->render_view_host()) | 341 if (tab_contents()->render_view_host()) |
| 329 tab_contents()->render_view_host()->DragSourceSystemDragEnded(); | 342 tab_contents()->render_view_host()->DragSourceSystemDragEnded(); |
| 330 | 343 |
| 331 drop_data_.reset(); | 344 drop_data_.reset(); |
| 332 } | 345 } |
| 333 | 346 |
| 334 gfx::NativeView TabContentsDragSource::GetContentNativeView() const { | 347 gfx::NativeView TabContentsDragSource::GetContentNativeView() const { |
| 335 return tab_contents_view_->GetContentNativeView(); | 348 return tab_contents_view_->GetContentNativeView(); |
| 336 } | 349 } |
| OLD | NEW |