]> 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 c5166ea3cfd88d3439b2d72e0874f9d6ceb955c9..4ea7f3578440668e2a052a964f5b50d553db86f9 100644 (file)
@@ -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); }