#include "FileDialog.h"
+#include "support/FileName.h"
#include "GuiClipboard.h"
#include "qt_helpers.h"
#include "support/lstrings.h"
#include "support/lyxtime.h"
-#ifdef Q_WS_MACX
+#ifdef Q_OS_MAC
#include "support/linkback/LinkBackProxy.h"
-#endif // Q_WS_MACX
+#endif // Q_OS_MAC
#include "frontends/alert.h"
#include <QString>
#include <QStringList>
#include <QTextDocument>
+#include <QTimer>
#include <boost/crc.hpp>
namespace frontend {
-static QMimeData const * read_clipboard()
+static QMimeData const * read_clipboard()
{
- LYXERR(Debug::ACTION, "Getting Clipboard");
+ LYXERR(Debug::CLIPBOARD, "Getting Clipboard");
QMimeData const * source =
qApp->clipboard()->mimeData(QClipboard::Clipboard);
if (!source) {
void CacheMimeData::update()
{
time_t const start_time = current_time();
- LYXERR(Debug::ACTION, "Creating CacheMimeData object");
+ LYXERR(Debug::CLIPBOARD, "Creating CacheMimeData object");
cached_formats_ = read_clipboard()->formats();
// Qt times out after 5 seconds if it does not recieve a response.
}
-QByteArray CacheMimeData::data(QString const & mimeType) const
+QByteArray CacheMimeData::data(QString const & mimeType) const
{
return read_clipboard()->data(mimeType);
}
connect(qApp->clipboard(), SIGNAL(dataChanged()),
this, SLOT(on_dataChanged()));
// initialize clipboard status.
- on_dataChanged();
+ update();
}
string const GuiClipboard::getAsLyX() const
{
- LYXERR(Debug::ACTION, "GuiClipboard::getAsLyX(): `");
+ LYXERR(Debug::CLIPBOARD, "GuiClipboard::getAsLyX(): `");
// We don't convert encodings here since the encoding of the
// clipboard contents is specified in the data itself
if (cache_.hasFormat(lyxMimeType())) {
// data from ourself or some other LyX instance
QByteArray const ar = cache_.data(lyxMimeType());
string const s(ar.data(), ar.count());
- LYXERR(Debug::ACTION, s << "'");
+ LYXERR(Debug::CLIPBOARD, s << "'");
return s;
}
- LYXERR(Debug::ACTION, "'");
+ LYXERR(Debug::CLIPBOARD, "'");
return string();
}
types.push_back(Clipboard::PngGraphicsType);
if (hasGraphicsContents(Clipboard::JpegGraphicsType))
types.push_back(Clipboard::JpegGraphicsType);
-
+
LASSERT(!types.empty(), return FileName());
-
+
// select prefered type if AnyGraphicsType was passed
if (type == Clipboard::AnyGraphicsType)
type = types.front();
// get image from QImage from clipboard
QImage image = qApp->clipboard()->image();
if (image.isNull()) {
- LYXERR(Debug::ACTION, "No image in clipboard");
+ LYXERR(Debug::CLIPBOARD, "No image in clipboard");
return FileName();
}
image.save(toqstr(filename.absFileName()), "JPEG");
else
LATTEST(false);
-
+
return filename;
}
-
+
// get mime for type
QString mime;
switch (type) {
case WmfGraphicsType: mime = wmfMimeType(); break;
default: LASSERT(false, return FileName());
}
-
+
// get data
if (!cache_.hasFormat(mime))
return FileName();
// data from ourself or some other LyX instance
QByteArray const ar = cache_.data(mime);
- LYXERR(Debug::ACTION, "Getting from clipboard: mime = " << mime.constData()
+ LYXERR(Debug::CLIPBOARD, "Getting from clipboard: mime = " << mime.constData()
<< "length = " << ar.count());
QFile f(toqstr(filename.absFileName()));
if (!f.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
- LYXERR(Debug::ACTION, "Error opening file "
+ LYXERR(Debug::CLIPBOARD, "Error opening file "
<< filename.absFileName() << " for writing");
return FileName();
}
-
+
// write the (LinkBack) PDF data
f.write(ar);
if (type == LinkBackGraphicsType) {
-#ifdef Q_WS_MACX
+#ifdef Q_OS_MAC
void const * linkBackData;
unsigned linkBackLen;
getLinkBackData(&linkBackData, &linkBackLen);
#else
// only non-Mac this should never happen
LATTEST(false);
-#endif // Q_WS_MACX
+#endif // Q_OS_MAC
}
f.close();
break;
}
}
- LYXERR(Debug::ACTION, "GuiClipboard::getAsText(" << type << "): `" << str << "'");
+ LYXERR(Debug::CLIPBOARD, "GuiClipboard::getAsText(" << type << "): `" << str << "'");
if (str.isNull())
return docstring();
}
+void GuiClipboard::put(string const & text) const
+{
+ qApp->clipboard()->setText(toqstr(text));
+}
+
+
void GuiClipboard::put(string const & lyx, docstring const & html, docstring const & text)
{
- LYXERR(Debug::ACTION, "GuiClipboard::put(`" << lyx << "' `"
+ LYXERR(Debug::CLIPBOARD, "GuiClipboard::put(`" << lyx << "' `"
<< to_utf8(html) << "' `" << to_utf8(text) << "')");
// We don't convert the encoding of lyx since the encoding of the
// clipboard contents is specified in the data itself
case LyXTextType:
return cache_.hasFormat(lyxMimeType());
case PlainTextType:
- return cache_.hasText();
+ return cache_.hasText();
case HtmlTextType:
return cache_.hasHtml();
case LaTeXTextType:
// handle LinkBack for Mac
if (type == LinkBackGraphicsType)
-#ifdef Q_WS_MACX
+#ifdef Q_OS_MAC
return isLinkBackDataInPasteboard();
#else
return false;
-#endif // Q_WS_MACX
-
+#endif // Q_OS_MAC
+
// get mime data
QStringList const & formats = cache_.formats();
- LYXERR(Debug::ACTION, "We found " << formats.size() << " formats");
+ LYXERR(Debug::CLIPBOARD, "We found " << formats.size() << " formats");
for (int i = 0; i < formats.size(); ++i)
- LYXERR(Debug::ACTION, "Found format " << formats[i]);
+ LYXERR(Debug::CLIPBOARD, "Found format " << formats[i]);
// compute mime for type
QString mime;
case PdfGraphicsType: mime = pdfMimeType(); break;
default: LASSERT(false, return false);
}
-
+
return cache_.hasFormat(mime);
}
bool GuiClipboard::hasInternal() const
{
// Windows and Mac OS X does not have the concept of ownership;
- // the clipboard is a fully global resource so all applications
+ // the clipboard is a fully global resource so all applications
// are notified of changes. However, on Windows ownership is
// emulated by Qt through the OleIsCurrentClipboard() API, while
// on Mac OS X we deal with this issue by ourself.
-#if (defined(Q_WS_X11) || defined(Q_WS_WIN))
+#ifndef Q_OS_MAC
return true;
#else
return false;
void GuiClipboard::on_dataChanged()
+{
+ update();
+#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN)
+ // Retry on Windows (#10109)
+ if (cache_.formats().count() == 0) {
+ QTimer::singleShot(100, this, SLOT(update()));
+ }
+#endif
+}
+
+void GuiClipboard::update()
{
//Note: we do not really need to run cache_.update() unless the
//data has been changed *and* the GuiClipboard has been queried.
//to time-out waiting for the clipboard.
cache_.update();
QStringList l = cache_.formats();
- LYXERR(Debug::ACTION, "Qt Clipboard changed. We found the following mime types:");
+ LYXERR(Debug::CLIPBOARD, "Qt Clipboard changed. We found the following mime types:");
for (int i = 0; i < l.count(); i++)
- LYXERR(Debug::ACTION, l.value(i));
+ LYXERR(Debug::CLIPBOARD, l.value(i));
plaintext_clipboard_empty_ = qApp->clipboard()->
text(QClipboard::Clipboard).isEmpty();