X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiClipboard.cpp;h=ec6b916e4506c46e86be8620a63b8c1b98defd0f;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=33e53caa0d121a61f1db7b146382f0db86f63f4e;hpb=7090e9d776e6a41fcb1323a5a4899d2550bd2d1e;p=lyx.git diff --git a/src/frontends/qt4/GuiClipboard.cpp b/src/frontends/qt4/GuiClipboard.cpp index 33e53caa0d..ec6b916e45 100644 --- a/src/frontends/qt4/GuiClipboard.cpp +++ b/src/frontends/qt4/GuiClipboard.cpp @@ -21,12 +21,13 @@ #include "BufferView.h" #include "Cursor.h" -#include "support/assert.h" +#include "support/lassert.h" #include "support/convert.h" #include "support/debug.h" #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" + #ifdef Q_WS_MACX #include "support/linkback/LinkBackProxy.h" #endif // Q_WS_MACX @@ -39,205 +40,26 @@ #include #include #include -#include #include #include #include -#ifdef Q_WS_WIN -#include -#include -#if defined(Q_CYGWIN_WIN) || defined(Q_CC_MINGW) -#include -#endif -#include -#endif // Q_WS_WIN - #include #include using namespace std; using namespace lyx::support; -static char const * const lyx_mime_type = "application/x-lyx"; -static char const * const pdf_mime_type = "application/pdf"; -static char const * const emf_mime_type = "image/x-emf"; -static char const * const wmf_mime_type = "image/x-wmf"; namespace lyx { namespace frontend { -#ifdef Q_WS_WIN - -static FORMATETC cfFromMime(QString const & mimetype) -{ - FORMATETC formatetc; - if (mimetype == emf_mime_type) { - formatetc.cfFormat = CF_ENHMETAFILE; - formatetc.tymed = TYMED_ENHMF; - } else if (mimetype == wmf_mime_type) { - formatetc.cfFormat = CF_METAFILEPICT; - formatetc.tymed = TYMED_MFPICT; - } - formatetc.ptd = 0; - formatetc.dwAspect = DVASPECT_CONTENT; - formatetc.lindex = -1; - return formatetc; -} - - -class QWindowsMimeMetafile : public QWindowsMime { -public: - bool canConvertFromMime(FORMATETC const & formatetc, QMimeData const * mimedata) const; - bool canConvertToMime(QString const & mimetype, IDataObject * pDataObj) const; - bool convertFromMime(FORMATETC const & formatetc, const QMimeData * mimedata, STGMEDIUM * pmedium) const; - QVariant convertToMime(QString const & mimetype, IDataObject * pDataObj, QVariant::Type preferredType) const; - QVector formatsForMime(QString const & mimeType, QMimeData const * mimeData) const; - QString mimeForFormat(FORMATETC const &) const; -}; - - -QString QWindowsMimeMetafile::mimeForFormat(FORMATETC const & formatetc) const -{ - QString f; - if (formatetc.cfFormat == CF_ENHMETAFILE) - f = emf_mime_type; - else if (formatetc.cfFormat == CF_METAFILEPICT) - f = wmf_mime_type; - return f; -} - - -bool QWindowsMimeMetafile::canConvertFromMime(FORMATETC const & formatetc, - QMimeData const * mimedata) const -{ - return false; -} - - -bool QWindowsMimeMetafile::canConvertToMime(QString const & mimetype, - IDataObject * pDataObj) const -{ - if (mimetype != emf_mime_type && mimetype != wmf_mime_type) - return false; - FORMATETC formatetc = cfFromMime(mimetype); - return pDataObj->QueryGetData(&formatetc) == S_OK; -} - - -bool QWindowsMimeMetafile::convertFromMime(FORMATETC const & formatetc, - QMimeData const * mimedata, STGMEDIUM * pmedium) const -{ - return false; -} - - -QVariant QWindowsMimeMetafile::convertToMime(QString const & mimetype, - IDataObject * pDataObj, QVariant::Type preferredType) const -{ - QByteArray data; - if (!canConvertToMime(mimetype, pDataObj)) - return data; - - FORMATETC formatetc = cfFromMime(mimetype); - STGMEDIUM s; - if (pDataObj->GetData(&formatetc, &s) != S_OK) - return data; - - int dataSize; - if (s.tymed == TYMED_ENHMF) { - dataSize = GetEnhMetaFileBits(s.hEnhMetaFile, 0, 0); - data.resize(dataSize); - dataSize = GetEnhMetaFileBits(s.hEnhMetaFile, dataSize, (LPBYTE)data.data()); - } else if (s.tymed == TYMED_MFPICT) { - dataSize = GetMetaFileBitsEx((HMETAFILE)s.hMetaFilePict, 0, 0); - data.resize(dataSize); - dataSize = GetMetaFileBitsEx((HMETAFILE)s.hMetaFilePict, dataSize, (LPBYTE)data.data()); - } - data.detach(); - ReleaseStgMedium(&s); - - return data; -} - - -QVector QWindowsMimeMetafile::formatsForMime( - QString const & mimetype, QMimeData const * mimedata) const -{ - QVector formats; - formats += cfFromMime(mimetype); - return formats; -} - -static std::auto_ptr metafileWindowsMime; -#endif // Q_WS_WIN - -#ifdef Q_WS_MACX - -class QMacPasteboardMimeGraphics : public QMacPasteboardMime { -public: - QMacPasteboardMimeGraphics() - : QMacPasteboardMime(MIME_QT_CONVERTOR|MIME_ALL) - {} - QString convertorName(); - QString flavorFor(QString const & mime); - QString mimeFor(QString flav); - bool canConvert(QString const & mime, QString flav); - QVariant convertToMime(QString const & mime, QList data, QString flav); - QList convertFromMime(QString const & mime, QVariant data, QString flav); -}; - - -QString QMacPasteboardMimeGraphics::convertorName() -{ - return "Graphics"; -} - - -QString QMacPasteboardMimeGraphics::flavorFor(QString const & mime) -{ - LYXERR(Debug::ACTION, "flavorFor " << mime); - if (mime == QLatin1String(pdf_mime_type)) - return QLatin1String("com.adobe.pdf"); - return QString(); -} - - -QString QMacPasteboardMimeGraphics::mimeFor(QString flav) -{ - LYXERR(Debug::ACTION, "mimeFor " << flav); - if (flav == QLatin1String("com.adobe.pdf")) - return QLatin1String(pdf_mime_type); - return QString(); -} - - -bool QMacPasteboardMimeGraphics::canConvert(QString const & mime, QString flav) -{ - return mimeFor(flav) == mime; -} - - -QVariant QMacPasteboardMimeGraphics::convertToMime(QString const & mime, QList data, QString) -{ - if(data.count() > 1) - qWarning("QMacPasteboardMimeGraphics: Cannot handle multiple member data"); - return data.first(); -} - - -QList QMacPasteboardMimeGraphics::convertFromMime(QString const & mime, QVariant data, QString) -{ - QList ret; - ret.append(data.toByteArray()); - return ret; -} - -static std::auto_ptr graphicsPasteboardMime; - -#endif // Q_WS_MACX +QString const lyxMimeType(){ return "application/x-lyx"; } +QString const pdfMimeType(){ return "application/pdf"; } +QString const emfMimeType(){ return "image/x-emf"; } +QString const wmfMimeType(){ return "image/x-wmf"; } GuiClipboard::GuiClipboard() @@ -246,24 +68,6 @@ GuiClipboard::GuiClipboard() this, SLOT(on_dataChanged())); // initialize clipboard status. on_dataChanged(); - -#ifdef Q_WS_MACX - if (!graphicsPasteboardMime.get()) - graphicsPasteboardMime.reset(new QMacPasteboardMimeGraphics()); -#endif // Q_WS_MACX - -#ifdef Q_WS_WIN - if (!metafileWindowsMime.get()) - metafileWindowsMime.reset(new QWindowsMimeMetafile()); -#endif // Q_WS_WIN -} - - -GuiClipboard::~GuiClipboard() -{ -#ifdef Q_WS_MACX - closeAllLinkBackLinks(); -#endif // Q_WS_MACX } @@ -279,9 +83,9 @@ string const GuiClipboard::getAsLyX() const return string(); } - if (source->hasFormat(lyx_mime_type)) { + if (source->hasFormat(lyxMimeType())) { // data from ourself or some other LyX instance - QByteArray const ar = source->data(lyx_mime_type); + QByteArray const ar = source->data(lyxMimeType()); string const s(ar.data(), ar.count()); LYXERR(Debug::ACTION, s << "'"); return s; @@ -334,7 +138,7 @@ FileName GuiClipboard::getPastedGraphicsFileName(Cursor const & cur, typeNames[Clipboard::JpegGraphicsType] = _("JPEG"); // find unused filename with primary extension - string document_path = cur.buffer().fileName().onlyPath().absFilename(); + string document_path = cur.buffer()->fileName().onlyPath().absFilename(); unsigned newfile_number = 0; FileName filename; do { @@ -454,10 +258,10 @@ FileName GuiClipboard::getAsGraphics(Cursor const & cur, GraphicsType type) cons // get mime for type QString mime; switch (type) { - case PdfGraphicsType: mime = pdf_mime_type; break; - case LinkBackGraphicsType: mime = pdf_mime_type; break; - case EmfGraphicsType: mime = emf_mime_type; break; - case WmfGraphicsType: mime = wmf_mime_type; break; + case PdfGraphicsType: mime = pdfMimeType(); break; + case LinkBackGraphicsType: mime = pdfMimeType(); break; + case EmfGraphicsType: mime = emfMimeType(); break; + case WmfGraphicsType: mime = wmfMimeType(); break; default: LASSERT(false, /**/); } @@ -507,7 +311,7 @@ docstring const GuiClipboard::getAsText() const if (str.isNull()) return docstring(); - return internalLineEnding(qstring_to_ucs4(str)); + return internalLineEnding(str); } @@ -520,7 +324,7 @@ void GuiClipboard::put(string const & lyx, docstring const & text) QMimeData * data = new QMimeData; if (!lyx.empty()) { QByteArray const qlyx(lyx.c_str(), lyx.size()); - data->setData(lyx_mime_type, qlyx); + data->setData(lyxMimeType(), qlyx); } // Don't test for text.empty() since we want to be able to clear the // clipboard. @@ -534,7 +338,15 @@ bool GuiClipboard::hasLyXContents() const { QMimeData const * const source = qApp->clipboard()->mimeData(QClipboard::Clipboard); - return source && source->hasFormat(lyx_mime_type); + return source && source->hasFormat(lyxMimeType()); +} + + +bool GuiClipboard::hasTextContents() const +{ + QMimeData const * const source = + qApp->clipboard()->mimeData(QClipboard::Clipboard); + return source && source->hasText(); } @@ -557,27 +369,25 @@ bool GuiClipboard::hasGraphicsContents(Clipboard::GraphicsType type) const return source->hasImage(); // handle LinkBack for Mac -#ifdef Q_WS_MACX if (type == LinkBackGraphicsType) +#ifdef Q_WS_MACX return isLinkBackDataInPasteboard(); #else - if (type == LinkBackGraphicsType) return false; #endif // Q_WS_MACX // get mime data QStringList const & formats = source->formats(); LYXERR(Debug::ACTION, "We found " << formats.size() << " formats"); - for (int i = 0; i < formats.size(); ++i) { + for (int i = 0; i < formats.size(); ++i) LYXERR(Debug::ACTION, "Found format " << formats[i]); - } // compute mime for type QString mime; switch (type) { - case EmfGraphicsType: mime = emf_mime_type; break; - case WmfGraphicsType: mime = wmf_mime_type; break; - case PdfGraphicsType: mime = pdf_mime_type; break; + case EmfGraphicsType: mime = emfMimeType(); break; + case WmfGraphicsType: mime = wmfMimeType(); break; + case PdfGraphicsType: mime = pdfMimeType(); break; default: LASSERT(false, /**/); } @@ -639,4 +449,4 @@ bool GuiClipboard::empty() const } // namespace frontend } // namespace lyx -#include "GuiClipboard_moc.cpp" +#include "moc_GuiClipboard.cpp"