]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiCompare.cpp
Do not compute caret geometry when we are not ready to do so.
[lyx.git] / src / frontends / qt4 / GuiCompare.cpp
index 906d71a5086eba4fb5b2da3348b64c211be0f4ac..4ea7f3578440668e2a052a964f5b50d553db86f9 100644 (file)
-/**\r
- * \file GuiCompare.cpp\r
- * This file is part of LyX, the document processor.\r
- * Licence details can be found in the file COPYING.\r
- *\r
- * \author Vincent van Ravesteijn\r
- *\r
- * Full author contact details are available in file CREDITS.\r
- */\r
-\r
-#include <config.h>\r
-\r
-#include "GuiCompare.h"\r
-\r
-#include "Buffer.h"\r
-#include "BufferView.h"\r
-#include "BufferList.h"\r
-#include "buffer_funcs.h"\r
-#include "FuncRequest.h"\r
-#include "GuiView.h"\r
-#include "LyXRC.h"\r
-#include "qt_helpers.h"\r
-\r
-#include "frontends/alert.h"\r
-\r
-#include "support/debug.h"\r
-#include "support/filetools.h"\r
-#include "support/FileName.h"\r
-#include "support/gettext.h"\r
-\r
-#include <QThread>\r
-\r
-\r
-using namespace std;\r
-using namespace lyx::support;\r
-\r
-namespace lyx {\r
-namespace frontend {\r
-\r
-\r
-GuiCompare::GuiCompare(GuiView & lv)\r
-       : GuiDialog(lv, "compare", qt_("Compare LyX files")),\r
-       compare_(0), dest_buffer_(0)\r
-{\r
-       setupUi(this);\r
-       setModal(Qt::WindowModal);\r
-\r
-       connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));\r
-       connect(closePB, SIGNAL(clicked()), this, SLOT(slotCancel()));\r
-\r
-       connect(newFilePB, SIGNAL(clicked()), this, SLOT(select_newfile()));\r
-       connect(oldFilePB, SIGNAL(clicked()), this, SLOT(select_oldfile()));\r
-\r
-       connect(newFileCB, SIGNAL(currentIndexChanged(int)),\r
-               this, SLOT(change_adaptor()));\r
-       connect(newFileCB, SIGNAL(editTextChanged(const QString &)),\r
-               this, SLOT(change_adaptor()));\r
-       connect(oldFileCB, SIGNAL(currentIndexChanged(int)),\r
-               this, SLOT(change_adaptor()));\r
-       connect(oldFileCB, SIGNAL(editTextChanged(const QString &)),\r
-               this, SLOT(change_adaptor()));\r
-\r
-       newSettingsRB->setChecked(true);\r
-\r
-       progressBar->setValue(0);\r
-       progressBar->setEnabled(false);\r
-\r
-       bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);\r
-       bc().setOK(okPB);\r
-}\r
-\r
-GuiCompare::~GuiCompare()\r
-{\r
-}\r
-\r
-void GuiCompare::closeEvent(QCloseEvent *)\r
-{\r
-       slotCancel();   \r
-}\r
-\r
-\r
-void GuiCompare::change_adaptor()\r
-{\r
-       changed();\r
-}\r
-\r
-\r
-bool GuiCompare::isValid()\r
-{\r
-       bool const valid = !newFileCB->currentText().isEmpty()\r
-               && !oldFileCB->currentText().isEmpty();\r
-       return valid;\r
-}\r
-\r
-\r
-void GuiCompare::updateContents()\r
-{\r
-       QString restore_filename1 = newFileCB->currentText();\r
-       QString restore_filename2 = oldFileCB->currentText();\r
-       newFileCB->clear();\r
-       oldFileCB->clear();\r
-       progressBar->setValue(0);\r
-       BufferList::iterator it = theBufferList().begin();\r
-       BufferList::iterator const end = theBufferList().end();\r
-       for (; it != end; ++it) {\r
-               QString filename = toqstr((*it)->absFileName());\r
-               newFileCB->addItem(filename);\r
-               oldFileCB->addItem(filename);\r
-       }\r
-       if (lyxview().documentBufferView())\r
-               newFileCB->setEditText(toqstr(buffer().absFileName()));\r
-       else\r
-               newFileCB->setEditText(restore_filename1);\r
-\r
-       if (!restore_filename2.isEmpty())\r
-               oldFileCB->setEditText(restore_filename2);\r
-       else\r
-               oldFileCB->clearEditText();\r
-\r
-       if (isValid()) {\r
-               bc().setValid(isValid());\r
-               bc().apply();\r
-       }\r
-}\r
-\r
-\r
-void GuiCompare::select_newfile()\r
-{\r
-       QString name = browse(newFileCB->currentText());\r
-       if (!name.isEmpty())\r
-               newFileCB->setEditText(name);\r
-       changed();\r
-}\r
-\r
-\r
-void GuiCompare::select_oldfile()\r
-{\r
-       QString name = browse(oldFileCB->currentText());\r
-       if (!name.isEmpty())\r
-               oldFileCB->setEditText(name);\r
-       changed();\r
-}\r
-\r
-\r
-QString GuiCompare::browse(QString const & in_name) const\r
-{\r
-       QString const title = qt_("Select document");\r
-\r
-       QStringList const & filters = fileFilters(qt_("LyX Documents (*.lyx)"));\r
-       \r
-       QString filename;\r
-       if (lyxview().documentBufferView()) {\r
-               QString path = bufferFilepath();\r
-               filename = browseRelFile(in_name, path, title, filters, false, \r
-                       qt_("Documents|#o#O"), toqstr(lyxrc.document_path));\r
-       } else {\r
-               QString path = toqstr(lyxrc.document_path);\r
-               QString rel_filename = browseRelFile(in_name, path, title, filters, false, \r
-                       qt_("Documents|#o#O"), toqstr(lyxrc.document_path));\r
-               filename = makeAbsPath(rel_filename, path);\r
-       }\r
-       return filename;        \r
-}\r
-\r
-\r
-void GuiCompare::enableControls(bool enable) const\r
-{\r
-       newFileLA->setEnabled(enable);\r
-       newFilePB->setEnabled(enable);\r
-       newFileCB->setEnabled(enable);\r
-       oldFileLA->setEnabled(enable);\r
-       oldFilePB->setEnabled(enable);\r
-       oldFileCB->setEnabled(enable);\r
-       okPB->setEnabled(enable);\r
-       groupBox->setEnabled(enable);\r
-       progressBar->setEnabled(!enable);\r
-\r
-       if (enable)\r
-               closePB->setText(qt_("Close"));\r
-       else\r
-               closePB->setText(qt_("Cancel"));\r
-}\r
-\r
-\r
-void GuiCompare::finished(bool aborted)\r
-{\r
-       enableControls(true);\r
-       \r
-       if (aborted) {\r
-               dest_buffer_->markClean();\r
-               theBufferList().release(dest_buffer_);\r
-               setWindowTitle(window_title_);\r
-               progressBar->setValue(0);\r
-       } else {\r
-               hideView();\r
-               bc().ok();\r
-               dispatch(FuncRequest(LFUN_BUFFER_SWITCH, dest_buffer_->absFileName()));\r
-       }\r
-}\r
-\r
-\r
-void GuiCompare::nextIt(int val)\r
-{\r
-       progressBar->setValue(progressBar->value() + val);\r
-}\r
-\r
-\r
-void GuiCompare::progress_max(int max) const\r
-{\r
-       progressBar->setMaximum(max);\r
-}\r
-       \r
-\r
-void GuiCompare::slotOK()\r
-{\r
-       enableControls(false);\r
-       if (!run()) {\r
-               Alert::error(_("Error"),\r
-                       _("Unable to compare files."));\r
-               finished(true);\r
-       }\r
-}\r
-\r
-\r
-void GuiCompare::slotCancel()\r
-{\r
-       GuiDialog::slotClose();\r
-       progressBar->setValue(0);\r
-}\r
-\r
-\r
-Buffer const * GuiCompare::bufferFromFileName(string const & file) const\r
-{\r
-       FileName fname;\r
-       if (FileName::isAbsolute(file))\r
-               fname.set(file);\r
-       else if (lyxview().documentBufferView())\r
-               fname = support::makeAbsPath(file, fromqstr(bufferFilepath()));\r
-\r
-       if (fname.empty()\r
-                       || (!fname.exists() && !theBufferList().getBuffer(fname))) {\r
-               LYXERR0( "Unable to read: " << file);\r
-               return 0;\r
-       }\r
-       return loadIfNeeded(fname);\r
-}\r
-\r
-\r
-int GuiCompare::run()\r
-{\r
-       progressBar->setValue(0);\r
-\r
-       new_buffer_ = bufferFromFileName(fromqstr(newFileCB->currentText()));\r
-       old_buffer_ = bufferFromFileName(fromqstr(oldFileCB->currentText()));\r
-\r
-       // new buffer that will carry the output\r
-       FileName initpath(lyxrc.document_path);\r
-       dest_buffer_ = newUnnamedFile(initpath, to_utf8(_("differences")));\r
-       dest_buffer_->changed();\r
-       dest_buffer_->markDirty();\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-Dialog * createGuiCompare(GuiView & lv) { return new GuiCompare(lv); }\r
-\r
-\r
-} // namespace frontend\r
-} // namespace lyx\r
-\r
-\r
-#include "moc_GuiCompare.cpp"\r
+/**
+ * \file GuiCompare.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Vincent van Ravesteijn
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "GuiCompare.h"
+
+#include "Buffer.h"
+#include "BufferView.h"
+#include "BufferList.h"
+#include "buffer_funcs.h"
+#include "Compare.h"
+#include "FuncRequest.h"
+#include "GuiView.h"
+#include "LyXRC.h"
+#include "qt_helpers.h"
+
+#include "frontends/alert.h"
+
+#include "support/debug.h"
+#include "support/filetools.h"
+#include "support/FileName.h"
+#include "support/gettext.h"
+
+#include <QThread>
+
+
+using namespace std;
+using namespace lyx::support;
+
+namespace lyx {
+namespace frontend {
+
+
+GuiCompare::GuiCompare(GuiView & lv)
+       : GuiDialog(lv, "compare", qt_("Compare LyX files")),
+       compare_(0), dest_buffer_(0), old_buffer_(0), new_buffer_(0)
+{
+       setupUi(this);
+       setModal(Qt::WindowModal);
+
+       connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
+       connect(closePB, SIGNAL(clicked()), this, SLOT(slotCancel()));
+
+       connect(newFilePB, SIGNAL(clicked()), this, SLOT(selectNewFile()));
+       connect(oldFilePB, SIGNAL(clicked()), this, SLOT(selectOldFile()));
+
+       connect(newFileCB, SIGNAL(currentIndexChanged(int)),
+               this, SLOT(changeAdaptor()));
+       connect(newFileCB, SIGNAL(editTextChanged(const QString &)),
+               this, SLOT(changeAdaptor()));
+       connect(oldFileCB, SIGNAL(currentIndexChanged(int)),
+               this, SLOT(changeAdaptor()));
+       connect(oldFileCB, SIGNAL(editTextChanged(const QString &)),
+               this, SLOT(changeAdaptor()));
+
+       newSettingsRB->setChecked(true);
+       trackingCB->setChecked(true);
+
+       closePB->setCursor(Qt::ArrowCursor);
+
+       bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);
+       bc().setOK(okPB);
+}
+
+GuiCompare::~GuiCompare()
+{
+       if (compare_)
+               delete compare_;
+}
+
+void GuiCompare::closeEvent(QCloseEvent *)
+{
+       slotCancel();
+}
+
+
+void GuiCompare::changeAdaptor()
+{
+       changed();
+}
+
+
+bool GuiCompare::isValid()
+{
+       bool const valid = !newFileCB->currentText().isEmpty()
+               && !oldFileCB->currentText().isEmpty();
+       return valid;
+}
+
+
+void GuiCompare::updateContents()
+{
+       if (compare_ && compare_->isRunning())
+               return;
+
+       QString restore_filename1 = newFileCB->currentText();
+       QString restore_filename2 = oldFileCB->currentText();
+       newFileCB->clear();
+       oldFileCB->clear();
+       progressBar->setValue(0);
+       statusBar->clearMessage();
+       BufferList::iterator it = theBufferList().begin();
+       BufferList::iterator const end = theBufferList().end();
+       for (; it != end; ++it) {
+               QString filename = toqstr((*it)->absFileName());
+               newFileCB->addItem(filename);
+               oldFileCB->addItem(filename);
+       }
+       if (!restore_filename1.isEmpty())
+               newFileCB->setEditText(restore_filename1);
+       else if (lyxview().documentBufferView())
+               newFileCB->setEditText(toqstr(buffer().absFileName()));
+
+       if (!restore_filename2.isEmpty())
+               oldFileCB->setEditText(restore_filename2);
+       else
+               oldFileCB->clearEditText();
+
+       if (isValid()) {
+               bc().setValid(isValid());
+               bc().apply();
+       }
+}
+
+
+void GuiCompare::selectNewFile()
+{
+       QString name = browse(newFileCB->currentText());
+       if (!name.isEmpty())
+               newFileCB->setEditText(name);
+       changed();
+}
+
+
+void GuiCompare::selectOldFile()
+{
+       QString name = browse(oldFileCB->currentText());
+       if (!name.isEmpty())
+               oldFileCB->setEditText(name);
+       changed();
+}
+
+
+QString GuiCompare::browse(QString const & in_name) const
+{
+       QString const title = qt_("Select document");
+
+       QStringList const & filters = fileFilters(qt_("LyX Documents (*.lyx)"));
+
+       QString filename;
+       if (lyxview().documentBufferView()) {
+               QString path = bufferFilePath();
+               filename = browseRelToParent(in_name, path, title, filters, false,
+                       qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+       } else {
+               QString path = toqstr(lyxrc.document_path);
+               QString rel_filename = browseRelToParent(in_name, path, title, filters, false,
+                       qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
+               filename = makeAbsPath(rel_filename, path);
+       }
+       return filename;
+}
+
+
+void GuiCompare::enableControls(bool enable)
+{
+       // Set the hourglass cursor for the dialog, but
+       // never for the cancel button.
+       setCursor(enable ? Qt::ArrowCursor : Qt::WaitCursor);
+
+       newFileLA->setEnabled(enable);
+       newFilePB->setEnabled(enable);
+       newFileCB->setEnabled(enable);
+       oldFileLA->setEnabled(enable);
+       oldFilePB->setEnabled(enable);
+       oldFileCB->setEnabled(enable);
+       okPB->setEnabled(enable);
+       groupBox->setEnabled(enable);
+       progressBar->setEnabled(!enable);
+
+       if (enable)
+               closePB->setText(qt_("Close"));
+       else
+               closePB->setText(qt_("Cancel"));
+}
+
+
+void GuiCompare::error()
+{
+       Alert::error(_("Error"), _("Error while comparing documents."));
+       finished(true);
+}
+
+void GuiCompare::finished(bool aborted)
+{
+       enableControls(true);
+
+       if (compare_) {
+               delete compare_;
+               compare_ = 0;
+       }
+
+       if (aborted) {
+               if (dest_buffer_) {
+                       dest_buffer_->markClean();
+                       theBufferList().release(dest_buffer_);
+               }
+               progressBar->setValue(0);
+               statusBar->showMessage(qt_("Aborted"), 5000);
+       } else {
+               hideView();
+               bc().ok();
+               if (dest_buffer_) {
+                       dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
+                               dest_buffer_->absFileName()));
+                       if (trackingCB->isChecked()) {
+                               dispatch(FuncRequest(LFUN_CHANGES_OUTPUT));
+                               dispatch(FuncRequest(LFUN_CHANGES_TRACK));
+                       }
+               }
+               statusBar->showMessage(qt_("Finished"), 5000);
+       }
+}
+
+
+void GuiCompare::progress(int val)
+{
+       progressBar->setValue(progressBar->value() + val);
+}
+
+
+void GuiCompare::progressMax(int max) const
+{
+       progressBar->setMaximum(max);
+}
+
+
+void GuiCompare::setStatusMessage(QString msg)
+{
+       statusBar->showMessage(msg);
+}
+
+
+void GuiCompare::slotOK()
+{
+       enableControls(false);
+       if (!run())
+               error();
+}
+
+
+void GuiCompare::slotCancel()
+{
+       if (compare_ && compare_->isRunning()) {
+               statusBar->showMessage(qt_("Aborting process..."));
+               compare_->abort();
+       } else {
+               GuiDialog::slotClose();
+               progressBar->setValue(0);
+               statusBar->clearMessage();
+       }
+}
+
+
+Buffer const * GuiCompare::bufferFromFileName(string const & file) const
+{
+       FileName fname;
+       if (FileName::isAbsolute(file))
+               fname.set(file);
+       else if (lyxview().documentBufferView())
+               fname = support::makeAbsPath(file, fromqstr(bufferFilePath()));
+
+       if (fname.empty()
+                       || (!fname.exists() && !theBufferList().getBuffer(fname))) {
+               LYXERR0( "Unable to read: " << file);
+               return 0;
+       }
+       return loadIfNeeded(fname);
+}
+
+
+int GuiCompare::run()
+{
+       progressBar->setValue(0);
+
+       new_buffer_ = bufferFromFileName(fromqstr(newFileCB->currentText()));
+       old_buffer_ = bufferFromFileName(fromqstr(oldFileCB->currentText()));
+
+       // new buffer that will carry the output
+       FileName initpath(lyxrc.document_path);
+       dest_buffer_ = newUnnamedFile(initpath, to_utf8(_("differences")));
+
+       if (!new_buffer_ || !old_buffer_ || !dest_buffer_)
+               return 0;
+
+       dest_buffer_->changed(true);
+       dest_buffer_->markDirty();
+
+       // get the options from the dialog
+       CompareOptions options;
+       options.settings_from_new = newSettingsRB->isChecked();
+
+       // init the compare object and start it
+       compare_ = new Compare(new_buffer_, old_buffer_, dest_buffer_, options);
+       connect(compare_, SIGNAL(error()), this, SLOT(error()));
+       connect(compare_, SIGNAL(finished(bool)), this, SLOT(finished(bool)));
+       connect(compare_, SIGNAL(progress(int)), this, SLOT(progress(int)));
+       connect(compare_, SIGNAL(progressMax(int)), this, SLOT(progressMax(int)));
+       connect(compare_, SIGNAL(statusMessage(QString)),
+               this, SLOT(setStatusMessage(QString)));
+       compare_->start(QThread::LowPriority);
+       return 1;
+}
+
+bool GuiCompare::initialiseParams(std::string const &par)
+{
+       //just for the sake of parsing arguments
+       FuncRequest cmd(LFUN_UNKNOWN_ACTION, par);
+       if (cmd.getArg(0) == "run") {
+               oldFileCB->setEditText(toqstr(cmd.getArg(1)));
+               newFileCB->setEditText(toqstr(cmd.getArg(2)));
+               slotOK();
+       }
+
+       progressBar->setValue(0);
+       progressBar->setEnabled(false);
+       progressBar->setMaximum(1);
+
+       return true;
+}
+
+Dialog * createGuiCompare(GuiView & lv) { return new GuiCompare(lv); }
+
+
+} // namespace frontend
+} // namespace lyx
+
+
+#include "moc_GuiCompare.cpp"