/* * Copyright (C) 2006 Zack Rusin * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "Pasteboard.h" #include "DocumentFragment.h" #include "Editor.h" #include "Frame.h" #include "Image.h" #include "markup.h" #include "RenderImage.h" #include #include #include #include #include #define methodDebug() qDebug() << "PasteboardQt: " << __FUNCTION__; namespace WebCore { Pasteboard::Pasteboard() : m_selectionMode(false) { } Pasteboard* Pasteboard::generalPasteboard() { static Pasteboard* pasteboard = 0; if (!pasteboard) pasteboard = new Pasteboard(); return pasteboard; } void Pasteboard::writeSelection(Range* selectedRange, bool, Frame* frame) { QMimeData* md = new QMimeData; QString text = frame->selectedText(); text.replace(QChar(0xa0), QLatin1Char(' ')); md->setText(text); QString html = QLatin1String(""); html += createMarkup(selectedRange, 0, AnnotateForInterchange); html += QLatin1String(""); md->setHtml(html); #ifndef QT_NO_CLIPBOARD QApplication::clipboard()->setMimeData(md, m_selectionMode ? QClipboard::Selection : QClipboard::Clipboard); #endif } bool Pasteboard::canSmartReplace() { return false; } String Pasteboard::plainText(Frame*) { #ifndef QT_NO_CLIPBOARD return QApplication::clipboard()->text(m_selectionMode ? QClipboard::Selection : QClipboard::Clipboard); #else return String(); #endif } PassRefPtr Pasteboard::documentFragment(Frame* frame, PassRefPtr context, bool allowPlainText, bool& chosePlainText) { #ifndef QT_NO_CLIPBOARD const QMimeData* mimeData = QApplication::clipboard()->mimeData( m_selectionMode ? QClipboard::Selection : QClipboard::Clipboard); chosePlainText = false; if (mimeData->hasHtml()) { QString html = mimeData->html(); if (!html.isEmpty()) { RefPtr fragment = createFragmentFromMarkup(frame->document(), html, ""); if (fragment) return fragment.release(); } } if (allowPlainText && mimeData->hasText()) { chosePlainText = true; RefPtr fragment = createFragmentFromText(context.get(), mimeData->text()); if (fragment) return fragment.release(); } #endif return 0; } void Pasteboard::writeURL(const KURL& _url, const String&, Frame*) { ASSERT(!_url.isEmpty()); #ifndef QT_NO_CLIPBOARD QMimeData* md = new QMimeData; QString url = _url.string(); md->setText(url); md->setUrls(QList() << QUrl(url)); QApplication::clipboard()->setMimeData(md, m_selectionMode ? QClipboard::Selection : QClipboard::Clipboard); #endif } void Pasteboard::writeImage(Node* node, const KURL&, const String&) { ASSERT(node && node->renderer() && node->renderer()->isImage()); #ifndef QT_NO_CLIPBOARD CachedImage* cachedImage = static_cast(node->renderer())->cachedImage(); ASSERT(cachedImage); Image* image = cachedImage->image(); ASSERT(image); QPixmap* pixmap = image->nativeImageForCurrentFrame(); ASSERT(pixmap); QApplication::clipboard()->setPixmap(*pixmap, QClipboard::Clipboard); #endif } /* This function is called from Editor::tryDHTMLCopy before actually set the clipboard * It introduce a race condition with klipper, which will try to grab the clipboard * It's not required to clear it anyway, since QClipboard take care about replacing the clipboard */ void Pasteboard::clear() { } bool Pasteboard::isSelectionMode() const { return m_selectionMode; } void Pasteboard::setSelectionMode(bool selectionMode) { m_selectionMode = selectionMode; } }