+/**\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