1 /*
2 * Copyright (C) 2007 Holger Hans Peter Freyther
3 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #include "config.h"
21 #include "Pasteboard.h"
22
23 #include "DataObjectGtk.h"
24 #include "DocumentFragment.h"
25 #include "Frame.h"
26 #include "NotImplemented.h"
27 #include "PlatformString.h"
28 #include "TextResourceDecoder.h"
29 #include "Image.h"
30 #include "RenderImage.h"
31 #include "KURL.h"
32 #include "markup.h"
33 #include <wtf/gobject/GRefPtr.h>
34 #include <wtf/text/CString.h>
35
36 #include <gtk/gtk.h>
37
38 namespace WebCore {
39
generalPasteboard()40 Pasteboard* Pasteboard::generalPasteboard()
41 {
42 static Pasteboard* pasteboard = new Pasteboard();
43 return pasteboard;
44 }
45
Pasteboard()46 Pasteboard::Pasteboard()
47 {
48 notImplemented();
49 }
50
~Pasteboard()51 Pasteboard::~Pasteboard()
52 {
53 delete m_helper;
54 }
55
helper()56 PasteboardHelper* Pasteboard::helper()
57 {
58 return m_helper;
59 }
60
setHelper(PasteboardHelper * helper)61 void Pasteboard::setHelper(PasteboardHelper* helper)
62 {
63 m_helper = helper;
64 }
65
writeSelection(Range * selectedRange,bool canSmartCopyOrDelete,Frame * frame)66 void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame)
67 {
68 GtkClipboard* clipboard = m_helper->getClipboard(frame);
69 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
70 dataObject->setText(frame->editor()->selectedText());
71 dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
72 m_helper->writeClipboardContents(clipboard);
73 }
74
writePlainText(const String & text)75 void Pasteboard::writePlainText(const String& text)
76 {
77 GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
78 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
79 dataObject->setText(text);
80 m_helper->writeClipboardContents(clipboard);
81 }
82
writeURL(const KURL & url,const String & label,Frame * frame)83 void Pasteboard::writeURL(const KURL& url, const String& label, Frame* frame)
84 {
85 if (url.isEmpty())
86 return;
87
88 GtkClipboard* clipboard = m_helper->getClipboard(frame);
89 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
90 dataObject->setURL(url, label);
91 m_helper->writeClipboardContents(clipboard);
92 }
93
writeImage(Node * node,const KURL &,const String &)94 void Pasteboard::writeImage(Node* node, const KURL&, const String&)
95 {
96 GtkClipboard* clipboard = gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD);
97
98 ASSERT(node && node->renderer() && node->renderer()->isImage());
99 RenderImage* renderer = toRenderImage(node->renderer());
100 CachedImage* cachedImage = renderer->cachedImage();
101 if (!cachedImage || cachedImage->errorOccurred())
102 return;
103 Image* image = cachedImage->image();
104 ASSERT(image);
105
106 GRefPtr<GdkPixbuf> pixbuf = adoptGRef(image->getGdkPixbuf());
107 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
108 dataObject->setImage(pixbuf.get());
109 m_helper->writeClipboardContents(clipboard);
110 }
111
clear()112 void Pasteboard::clear()
113 {
114 gtk_clipboard_clear(gtk_clipboard_get_for_display(gdk_display_get_default(), GDK_SELECTION_CLIPBOARD));
115 }
116
canSmartReplace()117 bool Pasteboard::canSmartReplace()
118 {
119 notImplemented();
120 return false;
121 }
122
documentFragment(Frame * frame,PassRefPtr<Range> context,bool allowPlainText,bool & chosePlainText)123 PassRefPtr<DocumentFragment> Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range> context,
124 bool allowPlainText, bool& chosePlainText)
125 {
126 GtkClipboard* clipboard = m_helper->getCurrentClipboard(frame);
127 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
128 m_helper->getClipboardContents(clipboard);
129
130 chosePlainText = false;
131
132 if (dataObject->hasMarkup()) {
133 RefPtr<DocumentFragment> fragment = createFragmentFromMarkup(frame->document(), dataObject->markup(), "", FragmentScriptingNotAllowed);
134 if (fragment)
135 return fragment.release();
136 }
137
138 if (!allowPlainText)
139 return 0;
140
141 if (dataObject->hasText()) {
142 chosePlainText = true;
143 RefPtr<DocumentFragment> fragment = createFragmentFromText(context.get(), dataObject->text());
144 if (fragment)
145 return fragment.release();
146 }
147
148 return 0;
149 }
150
plainText(Frame * frame)151 String Pasteboard::plainText(Frame* frame)
152 {
153 GtkClipboard* clipboard = m_helper->getCurrentClipboard(frame);
154 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
155
156 m_helper->getClipboardContents(clipboard);
157 return dataObject->text();
158 }
159
160 }
161