]> git.lyx.org Git - lyx.git/blobdiff - src/Buffer.cpp
Compute and output numbers for numerical citations.
[lyx.git] / src / Buffer.cpp
index 01a72f287951c4a9e9e412f7bac6b03de6a5f8be..014dcd6929cb8df769eee32b63d8aedb727635a4 100644 (file)
@@ -452,13 +452,17 @@ Buffer::~Buffer()
                // if we're the master buffer, then we should get rid of the list
                // of clones
                if (!parent()) {
-                       // if this is not empty, we have leaked something. worse, one of the
-                       // children still has a reference to this list.
-                       LASSERT(d->clone_list_->empty(), /* */);
+                       // If this is not empty, we have leaked something. Worse, one of the
+                       // children still has a reference to this list. But we will try to
+                       // continue, rather than shut down.
+                       LATTEST(d->clone_list_->empty());
                        list<CloneList *>::iterator it =
                                find(cloned_buffers.begin(), cloned_buffers.end(), d->clone_list_);
-                       LASSERT(it != cloned_buffers.end(), /* */);
-                       cloned_buffers.erase(it);
+                       if (it == cloned_buffers.end()) {
+                               // We will leak in this case, but it is safe to continue.
+                               LATTEST(false);
+                       } else
+                               cloned_buffers.erase(it);
                        delete d->clone_list_;
                }
                // FIXME Do we really need to do this right before we delete d?
@@ -603,7 +607,7 @@ void Buffer::changed(bool update_metrics) const
 
 frontend::WorkAreaManager & Buffer::workAreaManager() const
 {
-       LASSERT(d->wa_, /**/);
+       LBUFERR(d->wa_);
        return *d->wa_;
 }
 
@@ -832,7 +836,8 @@ int Buffer::readHeader(Lexer & lex)
        params().html_latex_end.clear();
        params().html_math_img_scale = 1.0;
        params().output_sync_macro.erase();
-       params().local_layout.clear();
+       params().setLocalLayout(string(), false);
+       params().setLocalLayout(string(), true);
 
        for (int i = 0; i < 4; ++i) {
                params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i];
@@ -1981,7 +1986,7 @@ int Buffer::runChktex()
        if (res == -1) {
                Alert::error(_("chktex failure"),
                             _("Could not run chktex successfully."));
-       } else if (res > 0) {
+       } else {
                ErrorList & errlist = d->errorLists["ChkTeX"];
                errlist.clear();
                bufferErrors(terr, errlist);
@@ -2242,57 +2247,70 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
 
        switch (cmd.action()) {
 
-               case LFUN_BUFFER_TOGGLE_READ_ONLY:
-                       flag.setOnOff(isReadonly());
-                       break;
+       case LFUN_BUFFER_TOGGLE_READ_ONLY:
+               flag.setOnOff(isReadonly());
+               break;
 
                // FIXME: There is need for a command-line import.
                //case LFUN_BUFFER_IMPORT:
 
-               case LFUN_BUFFER_AUTO_SAVE:
-                       break;
+       case LFUN_BUFFER_AUTO_SAVE:
+               break;
 
-               case LFUN_BUFFER_EXPORT_CUSTOM:
-                       // FIXME: Nothing to check here?
-                       break;
+       case LFUN_BUFFER_EXPORT_CUSTOM:
+               // FIXME: Nothing to check here?
+               break;
 
-               case LFUN_BUFFER_EXPORT: {
-                       docstring const arg = cmd.argument();
-                       if (arg == "custom") {
-                               enable = true;
-                               break;
-                       }
-                       string format = to_utf8(arg);
-                       size_t pos = format.find(' ');
-                       if (pos != string::npos)
-                               format = format.substr(0, pos);
-                       enable = params().isExportable(format);
-                       if (!enable)
-                               flag.message(bformat(
-                                       _("Don't know how to export to format: %1$s"), arg));
+       case LFUN_BUFFER_EXPORT: {
+               docstring const arg = cmd.argument();
+               if (arg == "custom") {
+                       enable = true;
                        break;
                }
+               string format = to_utf8(arg);
+               size_t pos = format.find(' ');
+               if (pos != string::npos)
+                       format = format.substr(0, pos);
+               enable = params().isExportable(format);
+               if (!enable)
+                       flag.message(bformat(
+                                            _("Don't know how to export to format: %1$s"), arg));
+               break;
+       }
 
-               case LFUN_BUFFER_CHKTEX:
-                       enable = params().isLatex() && !lyxrc.chktex_command.empty();
-                       break;
+       case LFUN_BUFFER_CHKTEX:
+               enable = params().isLatex() && !lyxrc.chktex_command.empty();
+               break;
 
-               case LFUN_BUILD_PROGRAM:
-                       enable = params().isExportable("program");
-                       break;
+       case LFUN_BUILD_PROGRAM:
+               enable = params().isExportable("program");
+               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!
-                       break;
+       case LFUN_BRANCH_ACTIVATE:
+       case LFUN_BRANCH_DEACTIVATE:
+       case LFUN_BRANCH_MASTER_ACTIVATE:
+       case LFUN_BRANCH_MASTER_DEACTIVATE: {
+               bool const master = (cmd.action() == LFUN_BRANCH_MASTER_ACTIVATE
+                                    || cmd.action() == LFUN_BRANCH_MASTER_DEACTIVATE);
+               BranchList const & branchList = master ? masterBuffer()->params().branchlist()
+                       : params().branchlist();
+               docstring const branchName = cmd.argument();
+               flag.setEnabled(!branchName.empty() && branchList.find(branchName));
+               break;
+       }
 
-               case LFUN_BUFFER_LANGUAGE:
-                       enable = !isReadonly();
-                       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!
+               break;
 
-               default:
-                       return false;
+       case LFUN_BUFFER_LANGUAGE:
+               enable = !isReadonly();
+               break;
+
+       default:
+               return false;
        }
        flag.setEnabled(enable);
        return true;
@@ -2400,6 +2418,42 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                resetAutosaveTimers();
                break;
 
+       case LFUN_BRANCH_ACTIVATE:
+       case LFUN_BRANCH_DEACTIVATE:
+       case LFUN_BRANCH_MASTER_ACTIVATE:
+       case LFUN_BRANCH_MASTER_DEACTIVATE: {
+               bool const master = (func.action() == LFUN_BRANCH_MASTER_ACTIVATE
+                                    || func.action() == LFUN_BRANCH_MASTER_DEACTIVATE);
+               Buffer * buf = master ? const_cast<Buffer *>(masterBuffer())
+                                     : this;
+
+               docstring const branch_name = func.argument();
+               // the case without a branch name is handled elsewhere
+               if (branch_name.empty()) {
+                       dispatched = false;
+                       break;
+               }
+               Branch * branch = buf->params().branchlist().find(branch_name);
+               if (!branch) {
+                       LYXERR0("Branch " << branch_name << " does not exist.");
+                       dr.setError(true);
+                       docstring const msg =
+                               bformat(_("Branch \"%1$s\" does not exist."), branch_name);
+                       dr.setMessage(msg);
+                       break;
+               }
+               bool const activate = (func.action() == LFUN_BRANCH_ACTIVATE
+                                      || func.action() == LFUN_BRANCH_MASTER_ACTIVATE);
+               if (branch->isSelected() != activate) {
+                       buf->undo().recordUndoFullDocument(CursorData());
+                       branch->setSelected(activate);
+                       dr.setError(false);
+                       dr.screenUpdate(Update::Force);
+                       dr.forceBufferUpdate();
+               }
+               break;
+       }
+
        case LFUN_BRANCH_ADD: {
                docstring branch_name = func.argument();
                if (branch_name.empty()) {
@@ -2600,8 +2654,8 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
 
 void Buffer::changeLanguage(Language const * from, Language const * to)
 {
-       LASSERT(from, /**/);
-       LASSERT(to, /**/);
+       LASSERT(from, return);
+       LASSERT(to, return);
 
        for_each(par_iterator_begin(),
                 par_iterator_end(),
@@ -2712,7 +2766,7 @@ bool Buffer::isClean() const
 
 bool Buffer::isExternallyModified(CheckMethod method) const
 {
-       LASSERT(d->filename.exists(), /**/);
+       LASSERT(d->filename.exists(), return false);
        // if method == timestamp, check timestamp before checksum
        return (method == checksum_method
                || d->timestamp_ != d->filename.lastModified())
@@ -3359,12 +3413,9 @@ void Buffer::clearReferenceCache() const
 }
 
 
-void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to,
-       InsetCode code)
+void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to)
 {
        //FIXME: This does not work for child documents yet.
-       LASSERT(code == CITE_CODE, /**/);
-
        reloadBibInfoCache();
 
        // Check if the label 'from' appears more than once
@@ -3382,14 +3433,12 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to,
 
        string const paramName = "key";
        for (InsetIterator it = inset_iterator_begin(inset()); it; ++it) {
-               if (it->lyxCode() == code) {
-                       InsetCommand * inset = it->asInsetCommand();
-                       if (!inset)
-                               continue;
-                       docstring const oldValue = inset->getParam(paramName);
-                       if (oldValue == from)
-                               inset->setParam(paramName, to);
-               }
+               if (it->lyxCode() != CITE_CODE) 
+                       continue;
+               InsetCommand * inset = it->asInsetCommand();
+               docstring const oldValue = inset->getParam(paramName);
+               if (oldValue == from)
+                       inset->setParam(paramName, to);
        }
 }
 
@@ -4257,13 +4306,17 @@ void Buffer::setBuffersForInsets() const
 
 void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
 {
+       LBUFERR(!text().paragraphs().empty());
+
        // Use the master text class also for child documents
        Buffer const * const master = masterBuffer();
        DocumentClass const & textclass = master->params().documentClass();
 
        // do this only if we are the top-level Buffer
-       if (master == this)
+       if (master == this) {
+               textclass.counters().reset(from_ascii("bibitem"));
                reloadBibInfoCache();
+       }
 
        // keep the buffers to be children in this set. If the call from the
        // master comes back we can see which of them were actually seen (i.e.
@@ -4297,8 +4350,6 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const
 
        Buffer & cbuf = const_cast<Buffer &>(*this);
 
-       LASSERT(!text().paragraphs().empty(), /**/);
-
        // do the real work
        ParIterator parit = cbuf.par_iterator_begin();
        updateBuffer(parit, utype);
@@ -4370,7 +4421,7 @@ static depth_type getItemDepth(ParIterator const & it)
 static bool needEnumCounterReset(ParIterator const & it)
 {
        Paragraph const & par = *it;
-       LASSERT(par.layout().labeltype == LABEL_ENUMERATE, /**/);
+       LASSERT(par.layout().labeltype == LABEL_ENUMERATE, return false);
        depth_type const cur_depth = par.getDepth();
        ParIterator prev_it = it;
        while (prev_it.pit()) {
@@ -4523,6 +4574,7 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
 
 void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
 {
+       // LASSERT: Is it safe to continue here, or should we just return?
        LASSERT(parit.pit() == 0, /**/);
 
        // Set the position of the text in the buffer to be able