X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=979b37ed5f27d220bfce3cec9f8954e5a8a4fc5c;hb=86fab2cefa122a5b0c0ee4ade472e41d9a3ff1cf;hp=627159826a4a5ea0b9b2b3e0f1292fd1d05b6311;hpb=5e01b2dfa1740c11f4b7c6c43b74f71d13212ddb;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 627159826a..979b37ed5f 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -69,6 +69,7 @@ #include "insets/InsetBibitem.h" #include "insets/InsetBibtex.h" +#include "insets/InsetBranch.h" #include "insets/InsetInclude.h" #include "insets/InsetText.h" @@ -126,7 +127,7 @@ namespace { // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -int const LYX_FORMAT = 362; // jspitzm: support applemac encoding +int const LYX_FORMAT = 364; // spitz: branch suffixes for filenames typedef map DepClean; typedef map > RefCache; @@ -439,12 +440,29 @@ Undo & Buffer::undo() string Buffer::latexName(bool const no_path) const { - FileName latex_name = makeLatexName(d->filename); + FileName latex_name = + makeLatexName(exportFileName()); return no_path ? latex_name.onlyFileName() : latex_name.absFilename(); } +FileName Buffer::exportFileName() const +{ + docstring const branch_suffix = + params().branchlist().getFilenameSuffix(); + if (branch_suffix.empty()) + return fileName(); + + string const name = fileName().onlyFileNameWithoutExt() + + to_utf8(branch_suffix); + FileName res(fileName().onlyPath().absFilename() + "/" + name); + res.changeExtension(fileName().extension()); + + return res; +} + + string Buffer::logName(LogType * type) const { string const filename = latexName(false); @@ -486,8 +504,8 @@ string Buffer::logName(LogType * type) const return bname.absFilename(); // If we have a newer master file log or only a master log, show this } else if (fname != masterfname - && (!fname.exists() && masterfname.exists() - || fname.lastModified() < masterfname.lastModified())) { + && (!fname.exists() && (masterfname.exists() + || fname.lastModified() < masterfname.lastModified()))) { LYXERR(Debug::FILES, "Log name calculated as: " << masterfname); if (type) *type = mtype; @@ -1621,6 +1639,8 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag) break; } + case LFUN_BRANCH_ADD: + case LFUN_BRANCHES_RENAME: case LFUN_BUFFER_PRINT: // if no Buffer is present, then of course we won't be called! flag.setEnabled(true); @@ -1657,6 +1677,28 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) break; } + case LFUN_BRANCH_ADD: { + BranchList & branchList = params().branchlist(); + docstring const branchName = func.argument(); + if (branchName.empty()) { + dispatched = false; + break; + } + Branch * branch = branchList.find(branchName); + if (branch) { + LYXERR0("Branch " << branchName << " does already exist."); + dr.setError(true); + docstring const msg = + bformat(_("Branch \"%1$s\" does already exist."), branchName); + dr.setMessage(msg); + } else { + branchList.add(branchName); + dr.setError(false); + dr.update(Update::Force); + } + break; + } + case LFUN_BRANCH_ACTIVATE: case LFUN_BRANCH_DEACTIVATE: { BranchList & branchList = params().branchlist(); @@ -1681,6 +1723,41 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) break; } + case LFUN_BRANCHES_RENAME: { + if (func.argument().empty()) + break; + + docstring const oldname = from_utf8(func.getArg(0)); + docstring const newname = from_utf8(func.getArg(1)); + InsetIterator it = inset_iterator_begin(inset()); + InsetIterator const end = inset_iterator_end(inset()); + bool success = false; + for (; it != end; ++it) { + if (it->lyxCode() == BRANCH_CODE) { + InsetBranch & ins = static_cast(*it); + if (ins.branch() == oldname) { + undo().recordUndo(it); + ins.rename(newname); + success = true; + continue; + } + } + if (it->lyxCode() == INCLUDE_CODE) { + // get buffer of external file + InsetInclude const & ins = + static_cast(*it); + Buffer * child = ins.getChildBuffer(); + if (!child) + continue; + child->dispatch(func, dr); + } + } + + if (success) + dr.update(Update::Force); + break; + } + case LFUN_BUFFER_PRINT: { // we'll assume there's a problem until we succeed dr.setError(true); @@ -2328,6 +2405,35 @@ void Buffer::updateMacros() const } +void Buffer::getUsedBranches(std::list & result, bool const from_master) const +{ + InsetIterator it = inset_iterator_begin(inset()); + InsetIterator const end = inset_iterator_end(inset()); + for (; it != end; ++it) { + if (it->lyxCode() == BRANCH_CODE) { + InsetBranch & br = static_cast(*it); + docstring const name = br.branch(); + if (!from_master && !params().branchlist().find(name)) + result.push_back(name); + else if (from_master && !masterBuffer()->params().branchlist().find(name)) + result.push_back(name); + continue; + } + if (it->lyxCode() == INCLUDE_CODE) { + // get buffer of external file + InsetInclude const & ins = + static_cast(*it); + Buffer * child = ins.getChildBuffer(); + if (!child) + continue; + child->getUsedBranches(result, true); + } + } + // remove duplicates + result.unique(); +} + + void Buffer::updateMacroInstances() const { LYXERR(Debug::MACROS, "updateMacroInstances for " @@ -2869,7 +2975,7 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir, return true; } - result_file = changeExtension(absFileName(), ext); + result_file = changeExtension(exportFileName().absFilename(), ext); // We need to copy referenced files (e. g. included graphics // if format == "dvi") to the result dir. vector const files = @@ -3106,7 +3212,7 @@ void Buffer::updateLabels(UpdateScope scope) const // Do this here in case the master has no gui associated with it. Then, // the TocModel is not updated and TocModel::toc_ is invalid (bug 5699). if (!master->gui_) - structureChanged(); + structureChanged(); // was buf referenced from the master (i.e. not in bufToUpdate anymore)? if (bufToUpdate.find(this) == bufToUpdate.end()) @@ -3234,7 +3340,7 @@ static void setLabel(Buffer const & buf, ParIterator & it) if (layout.margintype == MARGIN_MANUAL || layout.latextype == LATEX_BIB_ENVIRONMENT) { if (par.params().labelWidthString().empty()) - par.params().labelWidthString(par.translateIfPossible(layout.labelstring(), bp)); + par.params().labelWidthString(par.expandLabel(layout, bp)); } else { par.params().labelWidthString(docstring()); } @@ -3300,7 +3406,8 @@ static void setLabel(Buffer const & buf, ParIterator & it) counters.reset(enumcounter); counters.step(enumcounter); - par.params().labelString(counters.theCounter(enumcounter)); + string const & lang = par.getParLanguage(bp)->code(); + par.params().labelString(counters.theCounter(enumcounter, lang)); break; } @@ -3313,10 +3420,11 @@ static void setLabel(Buffer const & buf, ParIterator & it) else { docstring name = buf.B_(textclass.floats().getType(type).name()); if (counters.hasCounter(from_utf8(type))) { + string const & lang = par.getParLanguage(bp)->code(); counters.step(from_utf8(type)); full_label = bformat(from_ascii("%1$s %2$s:"), name, - counters.theCounter(from_utf8(type))); + counters.theCounter(from_utf8(type), lang)); } else full_label = bformat(from_ascii("%1$s #:"), name); } @@ -3333,8 +3441,7 @@ static void setLabel(Buffer const & buf, ParIterator & it) case LABEL_CENTERED_TOP_ENVIRONMENT: case LABEL_STATIC: case LABEL_BIBLIO: - par.params().labelString( - par.translateIfPossible(layout.labelstring(), bp)); + par.params().labelString(par.expandLabel(layout, bp)); break; } } @@ -3385,8 +3492,10 @@ int Buffer::spellCheck(DocIterator & from, DocIterator & to, while (from.inMathed()) from.forwardInset(); to = from; - if (from.paragraph().spellCheck(from.pos(), to.pos(), wl, suggestions)) + if (from.paragraph().spellCheck(from.pos(), to.pos(), wl, suggestions)) { + word_lang = wl; break; + } from = to; ++progress; }