3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Vincent van Ravesteijn
8 * Full author contact details are available in file CREDITS.
13 #include "GuiCompare.h"
16 #include "BufferView.h"
17 #include "BufferList.h"
18 #include "buffer_funcs.h"
20 #include "FuncRequest.h"
23 #include "qt_helpers.h"
25 #include "frontends/alert.h"
27 #include "support/debug.h"
28 #include "support/filetools.h"
29 #include "support/FileName.h"
30 #include "support/gettext.h"
36 using namespace lyx::support;
42 GuiCompare::GuiCompare(GuiView & lv)
43 : GuiDialog(lv, "compare", qt_("Compare LyX files")),
44 compare_(0), dest_buffer_(0), old_buffer_(0), new_buffer_(0)
47 setModal(Qt::WindowModal);
49 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
50 connect(closePB, SIGNAL(clicked()), this, SLOT(slotCancel()));
52 connect(newFilePB, SIGNAL(clicked()), this, SLOT(selectNewFile()));
53 connect(oldFilePB, SIGNAL(clicked()), this, SLOT(selectOldFile()));
55 connect(newFileCB, SIGNAL(currentIndexChanged(int)),
56 this, SLOT(changeAdaptor()));
57 connect(newFileCB, SIGNAL(editTextChanged(const QString &)),
58 this, SLOT(changeAdaptor()));
59 connect(oldFileCB, SIGNAL(currentIndexChanged(int)),
60 this, SLOT(changeAdaptor()));
61 connect(oldFileCB, SIGNAL(editTextChanged(const QString &)),
62 this, SLOT(changeAdaptor()));
64 newSettingsRB->setChecked(true);
65 trackingCB->setChecked(true);
67 closePB->setCursor(Qt::ArrowCursor);
69 bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);
73 GuiCompare::~GuiCompare()
79 void GuiCompare::closeEvent(QCloseEvent *)
85 void GuiCompare::changeAdaptor()
91 bool GuiCompare::isValid()
93 bool const valid = !newFileCB->currentText().isEmpty()
94 && !oldFileCB->currentText().isEmpty();
99 void GuiCompare::updateContents()
101 if (compare_ && compare_->isRunning())
104 QString restore_filename1 = newFileCB->currentText();
105 QString restore_filename2 = oldFileCB->currentText();
108 progressBar->setValue(0);
109 statusBar->clearMessage();
110 BufferList::iterator it = theBufferList().begin();
111 BufferList::iterator const end = theBufferList().end();
112 for (; it != end; ++it) {
113 QString filename = toqstr((*it)->absFileName());
114 newFileCB->addItem(filename);
115 oldFileCB->addItem(filename);
117 if (!restore_filename1.isEmpty())
118 newFileCB->setEditText(restore_filename1);
119 else if (lyxview().documentBufferView())
120 newFileCB->setEditText(toqstr(buffer().absFileName()));
122 if (!restore_filename2.isEmpty())
123 oldFileCB->setEditText(restore_filename2);
125 oldFileCB->clearEditText();
128 bc().setValid(isValid());
134 void GuiCompare::selectNewFile()
136 QString name = browse(newFileCB->currentText());
138 newFileCB->setEditText(name);
143 void GuiCompare::selectOldFile()
145 QString name = browse(oldFileCB->currentText());
147 oldFileCB->setEditText(name);
152 QString GuiCompare::browse(QString const & in_name) const
154 QString const title = qt_("Select document");
156 QStringList const & filters = fileFilters(qt_("LyX Documents (*.lyx)"));
159 if (lyxview().documentBufferView()) {
160 QString path = bufferFilePath();
161 filename = browseRelToParent(in_name, path, title, filters, false,
162 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
164 QString path = toqstr(lyxrc.document_path);
165 QString rel_filename = browseRelToParent(in_name, path, title, filters, false,
166 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
167 filename = makeAbsPath(rel_filename, path);
173 void GuiCompare::enableControls(bool enable)
175 // Set the hourglass cursor for the dialog, but
176 // never for the cancel button.
177 setCursor(enable ? Qt::ArrowCursor : Qt::WaitCursor);
179 newFileLA->setEnabled(enable);
180 newFilePB->setEnabled(enable);
181 newFileCB->setEnabled(enable);
182 oldFileLA->setEnabled(enable);
183 oldFilePB->setEnabled(enable);
184 oldFileCB->setEnabled(enable);
185 okPB->setEnabled(enable);
186 groupBox->setEnabled(enable);
187 progressBar->setEnabled(!enable);
190 closePB->setText(qt_("Close"));
192 closePB->setText(qt_("Cancel"));
196 void GuiCompare::error()
198 Alert::error(_("Error"), _("Error while comparing documents."));
202 void GuiCompare::finished(bool aborted)
204 enableControls(true);
213 dest_buffer_->markClean();
214 theBufferList().release(dest_buffer_);
216 progressBar->setValue(0);
217 statusBar->showMessage(qt_("Aborted"), 5000);
222 dispatch(FuncRequest(LFUN_BUFFER_SWITCH,
223 dest_buffer_->absFileName()));
224 if (trackingCB->isChecked()) {
225 dispatch(FuncRequest(LFUN_CHANGES_OUTPUT));
226 dispatch(FuncRequest(LFUN_CHANGES_TRACK));
229 statusBar->showMessage(qt_("Finished"), 5000);
234 void GuiCompare::progress(int val)
236 progressBar->setValue(progressBar->value() + val);
240 void GuiCompare::progressMax(int max) const
242 progressBar->setMaximum(max);
246 void GuiCompare::setStatusMessage(QString msg)
248 statusBar->showMessage(msg);
252 void GuiCompare::slotOK()
254 enableControls(false);
260 void GuiCompare::slotCancel()
262 if (compare_ && compare_->isRunning()) {
263 statusBar->showMessage(qt_("Aborting process..."));
266 GuiDialog::slotClose();
267 progressBar->setValue(0);
268 statusBar->clearMessage();
273 Buffer const * GuiCompare::bufferFromFileName(string const & file) const
276 if (FileName::isAbsolute(file))
278 else if (lyxview().documentBufferView())
279 fname = support::makeAbsPath(file, fromqstr(bufferFilePath()));
282 || (!fname.exists() && !theBufferList().getBuffer(fname))) {
283 LYXERR0( "Unable to read: " << file);
286 return loadIfNeeded(fname);
290 int GuiCompare::run()
292 progressBar->setValue(0);
294 new_buffer_ = bufferFromFileName(fromqstr(newFileCB->currentText()));
295 old_buffer_ = bufferFromFileName(fromqstr(oldFileCB->currentText()));
297 // new buffer that will carry the output
298 FileName initpath(lyxrc.document_path);
299 dest_buffer_ = newUnnamedFile(initpath, to_utf8(_("differences")));
301 if (!new_buffer_ || !old_buffer_ || !dest_buffer_)
304 dest_buffer_->changed(true);
305 dest_buffer_->markDirty();
307 // get the options from the dialog
308 CompareOptions options;
309 options.settings_from_new = newSettingsRB->isChecked();
311 // init the compare object and start it
312 compare_ = new Compare(new_buffer_, old_buffer_, dest_buffer_, options);
313 connect(compare_, SIGNAL(error()), this, SLOT(error()));
314 connect(compare_, SIGNAL(finished(bool)), this, SLOT(finished(bool)));
315 connect(compare_, SIGNAL(progress(int)), this, SLOT(progress(int)));
316 connect(compare_, SIGNAL(progressMax(int)), this, SLOT(progressMax(int)));
317 connect(compare_, SIGNAL(statusMessage(QString)),
318 this, SLOT(setStatusMessage(QString)));
319 compare_->start(QThread::LowPriority);
323 bool GuiCompare::initialiseParams(std::string const &par)
325 //just for the sake of parsing arguments
326 FuncRequest cmd(LFUN_UNKNOWN_ACTION, par);
327 if (cmd.getArg(0) == "run") {
328 oldFileCB->setEditText(toqstr(cmd.getArg(1)));
329 newFileCB->setEditText(toqstr(cmd.getArg(2)));
333 progressBar->setValue(0);
334 progressBar->setEnabled(false);
335 progressBar->setMaximum(1);
340 Dialog * createGuiCompare(GuiView & lv) { return new GuiCompare(lv); }
343 } // namespace frontend
347 #include "moc_GuiCompare.cpp"