X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiCompare.cpp;h=4ea7f3578440668e2a052a964f5b50d553db86f9;hb=b7f6b979d0f889f08e735f35378bb20ba3788b4b;hp=c5166ea3cfd88d3439b2d72e0874f9d6ceb955c9;hpb=36a874529131375f65255e7b21fdc1fc66056818;p=lyx.git diff --git a/src/frontends/qt4/GuiCompare.cpp b/src/frontends/qt4/GuiCompare.cpp index c5166ea3cf..4ea7f35784 100644 --- a/src/frontends/qt4/GuiCompare.cpp +++ b/src/frontends/qt4/GuiCompare.cpp @@ -16,6 +16,7 @@ #include "BufferView.h" #include "BufferList.h" #include "buffer_funcs.h" +#include "Compare.h" #include "FuncRequest.h" #include "GuiView.h" #include "LyXRC.h" @@ -40,7 +41,7 @@ namespace frontend { GuiCompare::GuiCompare(GuiView & lv) : GuiDialog(lv, "compare", qt_("Compare LyX files")), - compare_(0), dest_buffer_(0) + compare_(0), dest_buffer_(0), old_buffer_(0), new_buffer_(0) { setupUi(this); setModal(Qt::WindowModal); @@ -48,22 +49,22 @@ GuiCompare::GuiCompare(GuiView & lv) connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK())); connect(closePB, SIGNAL(clicked()), this, SLOT(slotCancel())); - connect(newFilePB, SIGNAL(clicked()), this, SLOT(select_newfile())); - connect(oldFilePB, SIGNAL(clicked()), this, SLOT(select_oldfile())); + connect(newFilePB, SIGNAL(clicked()), this, SLOT(selectNewFile())); + connect(oldFilePB, SIGNAL(clicked()), this, SLOT(selectOldFile())); connect(newFileCB, SIGNAL(currentIndexChanged(int)), - this, SLOT(change_adaptor())); + this, SLOT(changeAdaptor())); connect(newFileCB, SIGNAL(editTextChanged(const QString &)), - this, SLOT(change_adaptor())); + this, SLOT(changeAdaptor())); connect(oldFileCB, SIGNAL(currentIndexChanged(int)), - this, SLOT(change_adaptor())); + this, SLOT(changeAdaptor())); connect(oldFileCB, SIGNAL(editTextChanged(const QString &)), - this, SLOT(change_adaptor())); + this, SLOT(changeAdaptor())); newSettingsRB->setChecked(true); + trackingCB->setChecked(true); - progressBar->setValue(0); - progressBar->setEnabled(false); + closePB->setCursor(Qt::ArrowCursor); bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy); bc().setOK(okPB); @@ -71,15 +72,17 @@ GuiCompare::GuiCompare(GuiView & lv) GuiCompare::~GuiCompare() { + if (compare_) + delete compare_; } void GuiCompare::closeEvent(QCloseEvent *) { - slotCancel(); + slotCancel(); } -void GuiCompare::change_adaptor() +void GuiCompare::changeAdaptor() { changed(); } @@ -95,11 +98,15 @@ bool GuiCompare::isValid() 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) { @@ -107,10 +114,10 @@ void GuiCompare::updateContents() newFileCB->addItem(filename); oldFileCB->addItem(filename); } - if (lyxview().documentBufferView()) - newFileCB->setEditText(toqstr(buffer().absFileName())); - else + 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); @@ -124,7 +131,7 @@ void GuiCompare::updateContents() } -void GuiCompare::select_newfile() +void GuiCompare::selectNewFile() { QString name = browse(newFileCB->currentText()); if (!name.isEmpty()) @@ -133,7 +140,7 @@ void GuiCompare::select_newfile() } -void GuiCompare::select_oldfile() +void GuiCompare::selectOldFile() { QString name = browse(oldFileCB->currentText()); if (!name.isEmpty()) @@ -147,24 +154,28 @@ 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 = browseRelFile(in_name, path, title, filters, false, + 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 = browseRelFile(in_name, path, title, filters, false, + 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; + return filename; } -void GuiCompare::enableControls(bool enable) const +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); @@ -182,50 +193,80 @@ void GuiCompare::enableControls(bool enable) const } +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) { - dest_buffer_->markClean(); - theBufferList().release(dest_buffer_); - setWindowTitle(window_title_); + if (dest_buffer_) { + dest_buffer_->markClean(); + theBufferList().release(dest_buffer_); + } progressBar->setValue(0); + statusBar->showMessage(qt_("Aborted"), 5000); } else { hideView(); bc().ok(); - dispatch(FuncRequest(LFUN_BUFFER_SWITCH, dest_buffer_->absFileName())); + 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::nextIt(int val) +void GuiCompare::progress(int val) { progressBar->setValue(progressBar->value() + val); } -void GuiCompare::progress_max(int max) const +void GuiCompare::progressMax(int max) const { progressBar->setMaximum(max); } - + + +void GuiCompare::setStatusMessage(QString msg) +{ + statusBar->showMessage(msg); +} + void GuiCompare::slotOK() { enableControls(false); - if (!run()) { - Alert::error(_("Error"), - _("Unable to compare files.")); - finished(true); - } + if (!run()) + error(); } void GuiCompare::slotCancel() { - GuiDialog::slotClose(); - progressBar->setValue(0); + if (compare_ && compare_->isRunning()) { + statusBar->showMessage(qt_("Aborting process...")); + compare_->abort(); + } else { + GuiDialog::slotClose(); + progressBar->setValue(0); + statusBar->clearMessage(); + } } @@ -235,7 +276,7 @@ Buffer const * GuiCompare::bufferFromFileName(string const & file) const if (FileName::isAbsolute(file)) fname.set(file); else if (lyxview().documentBufferView()) - fname = support::makeAbsPath(file, fromqstr(bufferFilepath())); + fname = support::makeAbsPath(file, fromqstr(bufferFilePath())); if (fname.empty() || (!fname.exists() && !theBufferList().getBuffer(fname))) { @@ -256,12 +297,45 @@ int GuiCompare::run() // new buffer that will carry the output FileName initpath(lyxrc.document_path); dest_buffer_ = newUnnamedFile(initpath, to_utf8(_("differences"))); - dest_buffer_->changed(); + + if (!new_buffer_ || !old_buffer_ || !dest_buffer_) + return 0; + + dest_buffer_->changed(true); dest_buffer_->markDirty(); - return 0; + // 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); }