X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxvc.C;h=835408913fea55f57274c2e2cb01f4e54d9aa795;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=9ef4c774bb84f69427db0001046f413f01ffa855;hpb=3660343dc7da7cb40b93448949dca02a579505d5;p=lyx.git diff --git a/src/lyxvc.C b/src/lyxvc.C index 9ef4c774bb..835408913f 100644 --- a/src/lyxvc.C +++ b/src/lyxvc.C @@ -1,56 +1,71 @@ -#include - -#ifdef __GNUG__ -#pragma implementation -#endif +/** + * \file lyxvc.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * \author Angus Leeming + * \author John Levon + * \author André Pönitz + * \author Allan Rae + * + * Full author contact details are available in file CREDITS. + */ -#include +#include -#include FORMS_H_LOCATION #include "lyxvc.h" #include "vc-backend.h" #include "debug.h" -#include "lyx_gui_misc.h" #include "buffer.h" #include "gettext.h" + +#include "frontends/Alert.h" + #include "support/filetools.h" -#include "lyxfunc.h" -#include "LyXView.h" +#include "support/lyxlib.h" + + +namespace lyx { + +using support::bformat; +using support::FileName; +using support::isFileReadable; +using support::makeAbsPath; +using support::makeDisplayPath; +using support::tempName; + +using std::endl; +using std::string; +using std::pair; + +namespace Alert = frontend::Alert; LyXVC::LyXVC() { - vcs = 0; - browser = 0; owner_ = 0; } +// for the sake of boost::scoped_ptr LyXVC::~LyXVC() -{ - if (browser) { - if (browser->LaTeXLog->visible) - fl_hide_form(browser->LaTeXLog); - fl_free_form(browser->LaTeXLog); - } - if (vcs) { - delete vcs; - } -} +{} -bool LyXVC::file_found_hook(string const & fn) +bool LyXVC::file_found_hook(FileName const & fn) { - string found_file; + FileName found_file; // Check if file is under RCS if (!(found_file = RCS::find_file(fn)).empty()) { - vcs = new RCS(found_file); + vcs.reset(new RCS(found_file)); vcs->owner(owner_); return true; } // Check if file is under CVS if (!(found_file = CVS::find_file(fn)).empty()) { - vcs = new CVS(found_file, fn); + vcs.reset(new CVS(found_file, fn)); vcs->owner(owner_); return true; } @@ -59,9 +74,13 @@ bool LyXVC::file_found_hook(string const & fn) } -bool LyXVC::file_not_found_hook(string const &) +bool LyXVC::file_not_found_hook(FileName const & fn) { - // file is not under any VCS. + // Check if file is under RCS + if (!RCS::find_file(fn).empty()) + return true; + if (!CVS::find_file(fn).empty()) + return true; return false; } @@ -74,95 +93,89 @@ void LyXVC::buffer(Buffer * buf) void LyXVC::registrer() { + FileName const filename(owner_->fileName()); + + // there must be a file to save + if (!isFileReadable(filename)) { + Alert::error(_("Document not saved"), + _("You must save the document " + "before it can be registered.")); + return; + } + // it is very likely here that the vcs is not created yet... - // so... we use RCS as default, later this should perhaps be - // a lyxrc option. if (!vcs) { - vcs = new RCS(owner_->getFileName()); - vcs->owner(owner_); - } - - // If the document is changed, we might want to save it - if (!vcs->owner()->isLyxClean() && - AskQuestion(_("Changes in document:"), - MakeDisplayPath(vcs->owner()->getFileName(),50), - _("Save document and proceed?"))) { - vcs->owner()->getUser()->owner() - ->getLyXFunc()->Dispatch(LFUN_MENUWRITE); - } + FileName const cvs_entries(makeAbsPath("CVS/Entries")); + + if (isFileReadable(cvs_entries)) { + lyxerr[Debug::LYXVC] + << "LyXVC: registering " + << to_utf8(makeDisplayPath(filename.absFilename())) + << " with CVS" << endl; + vcs.reset(new CVS(cvs_entries, filename)); + + } else { + lyxerr[Debug::LYXVC] + << "LyXVC: registering " + << to_utf8(makeDisplayPath(filename.absFilename())) + << " with RCS" << endl; + vcs.reset(new RCS(filename)); + } - // Maybe the save fails, or we answered "no". In both cases, - // the document will be dirty, and we abort. - if (!vcs->owner()->isLyxClean()) { - return; + vcs->owner(owner_); } lyxerr[Debug::LYXVC] << "LyXVC: registrer" << endl; - string tmp = askForText(_("LyX VC: Initial description"), - _("(no initial description)")); - if (tmp.empty()) { + pair tmp = + Alert::askForText(_("LyX VC: Initial description"), + _("(no initial description)")); + if (!tmp.first || tmp.second.empty()) { + // should we insist on checking tmp.second.empty()? lyxerr[Debug::LYXVC] << "LyXVC: user cancelled" << endl; - WriteAlert(_("Info"), _("This document has NOT been registered.")); return; } - - vcs->registrer(tmp); + + vcs->registrer(to_utf8(tmp.second)); } void LyXVC::checkIn() { - // If the document is changed, we might want to save it - if (!vcs->owner()->isLyxClean() && - AskQuestion(_("Changes in document:"), - MakeDisplayPath(vcs->owner()->getFileName(),50), - _("Save document and proceed?"))) { - vcs->owner()->getUser()->owner() - ->getLyXFunc()->Dispatch(LFUN_MENUWRITE); - } - - // Maybe the save fails, or we answered "no". In both cases, - // the document will be dirty, and we abort. - if (!vcs->owner()->isLyxClean()) { - return; - } lyxerr[Debug::LYXVC] << "LyXVC: checkIn" << endl; - string tmp = askForText(_("LyX VC: Log Message")); - if (tmp.empty()) tmp = "(no log msg)"; - - vcs->checkIn(tmp); - + pair tmp = Alert::askForText(_("LyX VC: Log Message")); + if (tmp.first) { + if (tmp.second.empty()) { + tmp.second = _("(no log message)"); + } + vcs->checkIn(to_utf8(tmp.second)); + } else { + lyxerr[Debug::LYXVC] << "LyXVC: user cancelled" << endl; + } } void LyXVC::checkOut() { lyxerr[Debug::LYXVC] << "LyXVC: checkOut" << endl; - if (!vcs->owner()->isLyxClean() - && !AskQuestion(_("Changes in document:"), - MakeDisplayPath(vcs->owner()->getFileName(),50), - _("Ignore changes and proceed with check out?"))) { - return; - } vcs->checkOut(); - } void LyXVC::revert() { lyxerr[Debug::LYXVC] << "LyXVC: revert" << endl; - // Here we should check if the buffer is dirty. And if it is - // we should warn the user that reverting will discard all - // changes made since the last check in. - if (AskQuestion(_("When you revert, you will loose all changes made"), - _("to the document since the last check in."), - _("Do you still want to do it?"))) { + docstring const file = makeDisplayPath(owner_->fileName(), 20); + docstring text = bformat(_("Reverting to the stored version of the " + "document %1$s will lose all current changes.\n\n" + "Do you want to revert to the saved version?"), file); + int const ret = Alert::prompt(_("Revert to stored version of document?"), + text, 0, 1, _("&Revert"), _("&Cancel")); + + if (ret == 0) vcs->revert(); - } } @@ -174,7 +187,7 @@ void LyXVC::undoLast() void LyXVC::toggleReadOnly() { - switch (vcs->stat()) { + switch (vcs->status()) { case VCS::UNLOCKED: lyxerr[Debug::LYXVC] << "LyXVC: toggle to locked" << endl; checkOut(); @@ -194,9 +207,14 @@ bool LyXVC::inUse() } -string const & LyXVC::version() const +//string const & LyXVC::version() const +//{ +// return vcs->version(); +//} + +string const LyXVC::versionString() const { - return vcs->version(); + return vcs->versionString(); } @@ -206,83 +224,21 @@ string const & LyXVC::locker() const } -// This is a hack anyway so I'll put it here in the mean time. -void LyXVC::logClose(FL_OBJECT * obj, long) -{ - LyXVC * This = static_cast(obj->form->u_vdata); - fl_hide_form(This->browser->LaTeXLog); -} - - -// and, hack over hack, here is a C wrapper :) -extern "C" void C_LyXVC_logClose(FL_OBJECT * ob, long data) -{ - LyXVC::logClose(ob, data); -} - - -void LyXVC::logUpdate(FL_OBJECT * obj, long) -{ - LyXVC * This = static_cast(obj->form->u_vdata); - This->showLog(); -} - -extern "C" void C_LyXVC_logUpdate(FL_OBJECT *ob, long data) -{ - LyXVC::logUpdate(ob, data); -} - - -void LyXVC::viewLog(string const & fil) +string const LyXVC::getLogFile() const { - static int ow = -1, oh; - - if (!browser) { - FL_OBJECT * obj; - browser = (FD_LaTeXLog *) fl_calloc(1, sizeof(*browser)); - - browser->LaTeXLog = fl_bgn_form(FL_NO_BOX, 470, 380); - browser->LaTeXLog->u_vdata = this; - obj = fl_add_box(FL_UP_BOX, 0, 0, 470, 380, ""); - browser->browser_latexlog = fl_add_browser(FL_NORMAL_BROWSER, - 10, 10, - 450, 320, ""); - obj = fl_add_button(FL_RETURN_BUTTON, 270, 340, 90, 30, - _("Close")); - fl_set_object_lsize(obj, FL_NORMAL_SIZE); - fl_set_object_callback(obj, C_LyXVC_logClose, 0); - obj = fl_add_button(FL_NORMAL_BUTTON,370,340,90,30, - idex(_("Update|#Uu"))); - fl_set_button_shortcut(obj,scex(_("Update|#Uu")),1); - fl_set_object_lsize(obj,FL_NORMAL_SIZE); - fl_set_object_callback(obj, C_LyXVC_logUpdate,0); - fl_end_form(); - fl_set_form_atclose(browser->LaTeXLog, CancelCloseBoxCB, 0); - } + if (!vcs) + return string(); - if (!fl_load_browser(browser->browser_latexlog, fil.c_str())) - fl_add_browser_line(browser->browser_latexlog, - _("No VC History!")); - - if (browser->LaTeXLog->visible) { - fl_raise_form(browser->LaTeXLog); - } else { - fl_show_form(browser->LaTeXLog, - FL_PLACE_MOUSE | FL_FREE_SIZE, FL_FULLBORDER, - _("VC History")); - if (ow < 0) { - ow = browser->LaTeXLog->w; - oh = browser->LaTeXLog->h; - } - fl_set_form_minsize(browser->LaTeXLog, ow, oh); + FileName const tmpf(tempName(FileName(), "lyxvclog")); + if (tmpf.empty()) { + lyxerr[Debug::LYXVC] << "Could not generate logfile " + << tmpf << endl; + return string(); } + lyxerr[Debug::LYXVC] << "Generating logfile " << tmpf << endl; + vcs->getLog(tmpf); + return tmpf.absFilename(); } -void LyXVC::showLog() -{ - string tmpf = tmpnam(0); - vcs->getLog(tmpf); - viewLog(tmpf); - unlink(tmpf.c_str()); -} +} // namespace lyx