#include "insets/InsetBibitem.h"
#include "insets/InsetBibtex.h"
+#include "insets/InsetBranch.h"
#include "insets/InsetInclude.h"
#include "insets/InsetText.h"
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;
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);
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();
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<InsetBranch &>(*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<InsetInclude const &>(*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);
}
+void Buffer::getUsedBranches(std::list<docstring> & 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<InsetBranch &>(*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<InsetInclude const &>(*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 "
// 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())
}
-bool Buffer::nextWord(DocIterator & from, DocIterator & to,
- docstring & word) const
-{
- bool inword = false;
- bool ignoreword = false;
- string lang_code;
- // Go backward a bit if needed in order to return the word currently
- // pointed by 'from'.
- while (from && from.pos() && isLetter(from))
- from.backwardPos();
- // OK, we start from here.
- to = from;
- while (to.depth()) {
- if (isLetter(to)) {
- if (!inword) {
- inword = true;
- ignoreword = false;
- from = to;
- word.clear();
- lang_code = to.paragraph().getFontSettings(params(),
- to.pos()).language()->code();
- }
- // Insets like optional hyphens and ligature
- // break are part of a word.
- if (!to.paragraph().isInset(to.pos())) {
- char_type const c = to.paragraph().getChar(to.pos());
- word += c;
- if (isDigit(c))
- ignoreword = true;
- }
- } else { // !isLetter(cur)
- if (inword && !word.empty() && !ignoreword)
- return true;
- inword = false;
- }
- to.forwardPos();
- }
- from = to;
- word.clear();
- return false;
-}
-
-
int Buffer::spellCheck(DocIterator & from, DocIterator & to,
WordLangTuple & word_lang, docstring_list & suggestions) const
{
int progress = 0;
- SpellChecker::Result res = SpellChecker::OK;
- SpellChecker * speller = theSpellChecker();
+ WordLangTuple wl;
suggestions.clear();
- docstring word;
- while (nextWord(from, to, word)) {
- ++progress;
- string const lang_code = lyxrc.spellchecker_alt_lang.empty()
- ? from.paragraph().getFontSettings(params(), from.pos()).language()->code()
- : lyxrc.spellchecker_alt_lang;
- WordLangTuple wl(word, lang_code);
- res = speller->check(wl);
- // ... just bail out if the spellchecker reports an error.
- if (!speller->error().empty()) {
- throw ExceptionMessage(WarningException,
- _("The spellchecker has failed."), speller->error());
- }
- if (res != SpellChecker::OK && res != SpellChecker::IGNORED_WORD) {
+ word_lang = WordLangTuple();
+ // OK, we start from here.
+ DocIterator const end = doc_iterator_end(this);
+ for (; from != end; from.forwardPos()) {
+ // We are only interested in text so remove the math CursorSlice.
+ while (from.inMathed())
+ from.forwardInset();
+ to = from;
+ if (from.paragraph().spellCheck(from.pos(), to.pos(), wl, suggestions)) {
word_lang = wl;
break;
}
from = to;
+ ++progress;
}
- while (!(word = speller->nextMiss()).empty())
- suggestions.push_back(word);
return progress;
}