2007-12-05 Luca Bruno <lethalman88@gmail.com>
[WebKit-https.git] / WebCore / platform / gtk / PasteboardGtk.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.  All rights reserved.
3  * Copyright (C) 2007 Holger Hans Peter Freyther
4  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1.  Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer. 
12  * 2.  Redistributions in binary form must reproduce the above copyright
13  *     notice, this list of conditions and the following disclaimer in the
14  *     documentation and/or other materials provided with the distribution. 
15  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16  *     its contributors may be used to endorse or promote products derived
17  *     from this software without specific prior written permission. 
18  *
19  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #include "Pasteboard.h"
33
34 #include "CString.h"
35 #include "DocumentFragment.h"
36 #include "Frame.h"
37 #include "NotImplemented.h"
38 #include "PlatformString.h"
39 #include "Image.h"
40 #include "RenderImage.h"
41 #include "KURL.h"
42 #include "markup.h"
43
44 #include <gtk/gtk.h>
45
46 namespace WebCore {
47
48 Pasteboard* Pasteboard::generalPasteboard()
49 {
50     static Pasteboard* pasteboard = new Pasteboard();
51     return pasteboard;
52 }
53
54 Pasteboard::Pasteboard()
55 {
56     notImplemented();
57 }
58
59 Pasteboard::~Pasteboard()
60 {
61     notImplemented();
62 }
63
64 void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame)
65 {
66     GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
67
68     String text = frame->selectedText();
69     gtk_clipboard_set_text(clipboard, text.utf8().data(), text.utf8().length());
70 }
71
72 void Pasteboard::writeURL(const KURL&, const String&, Frame*)
73 {
74     notImplemented();
75 }
76
77 void Pasteboard::writeImage(Node* node, const KURL&, const String&)
78 {
79     // TODO: Enable this when Image gets GdkPixbuf support
80
81     /*
82     GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
83
84     ASSERT(node && node->renderer() && node->renderer()->isImage());
85     RenderImage* renderer = static_cast<RenderImage*>(node->renderer());
86     CachedImage* cachedImage = static_cast<CachedImage*>(renderer->cachedImage());
87     ASSERT(cachedImage);
88     Image* image = cachedImage->image();
89     ASSERT(image);
90
91     gtk_clipboard_set_image(clipboard, image->pixbuf());
92     */
93
94     notImplemented();
95 }
96
97 void Pasteboard::clear()
98 {
99     GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
100
101     gtk_clipboard_clear(clipboard);
102 }
103
104 bool Pasteboard::canSmartReplace()
105 {
106     notImplemented();
107     return false;
108 }
109
110 PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range> context,
111                                                           bool allowPlainText, bool& chosePlainText)
112 {
113 #if GLIB_CHECK_VERSION(2,10,0)
114     GdkAtom textHtml = gdk_atom_intern_static_string("text/html");
115 #else
116     GdkAtom textHtml = gdk_atom_intern("text/html", false);
117 #endif
118     GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
119     chosePlainText = false;
120
121     if (GtkSelectionData* data = gtk_clipboard_wait_for_contents(clipboard, textHtml)) {
122         ASSERT(data->data);
123         String html = String::fromUTF8(reinterpret_cast<gchar*>(data->data), data->length * data->format / 8);
124         gtk_selection_data_free(data);
125
126         if (!html.isEmpty()) {
127             RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), html, "");
128             if (fragment)
129                 return fragment.release();
130         }
131     }
132
133     if (!allowPlainText)
134         return 0;
135
136     if (gchar* utf8 = gtk_clipboard_wait_for_text(clipboard)) {
137         String text = String::fromUTF8(utf8);
138         g_free(utf8);
139
140         chosePlainText = true;
141         RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), text);
142         if (fragment)
143             return fragment.release();
144     }
145
146     return 0;
147 }
148
149 String Pasteboard::plainText(Frame*)
150 {
151     GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
152
153     gchar* utf8 = gtk_clipboard_wait_for_text(clipboard);
154
155     if (!utf8)
156         return String();
157
158     String text = String::fromUTF8(utf8);
159     g_free(utf8);
160
161     return text;
162 }
163 }