]> git.lyx.org Git - features.git/commitdiff
Backport fix for #7872.
authorRichard Heck <rgheck@comcast.net>
Fri, 2 Dec 2011 21:30:40 +0000 (21:30 +0000)
committerRichard Heck <rgheck@comcast.net>
Fri, 2 Dec 2011 21:30:40 +0000 (21:30 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@40335 a592a061-630c-0410-9148-cb99ea01b6c8

src/Buffer.cpp
src/BufferView.cpp
src/insets/InsetBranch.cpp

index 709bc0ac17c0b604797e695f3805a4d64b50b8c6..e43a8cec7673f137164dd6f4733f404858edffe7 100644 (file)
@@ -2028,14 +2028,6 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                        enable = params().isExportable("program");
                        break;
 
-               case LFUN_BRANCH_ACTIVATE: 
-               case LFUN_BRANCH_DEACTIVATE: {
-                       BranchList const & branchList = params().branchlist();
-                       docstring const branchName = cmd.argument();
-                       enable = !branchName.empty() && branchList.find(branchName);
-                       break;
-               }
-
                case LFUN_BRANCH_ADD:
                case LFUN_BRANCHES_RENAME:
                case LFUN_BUFFER_PRINT:
@@ -2187,31 +2179,6 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr)
                break;
        }
 
-       case LFUN_BRANCH_ACTIVATE:
-       case LFUN_BRANCH_DEACTIVATE: {
-               BranchList & branchList = params().branchlist();
-               docstring const branchName = func.argument();
-               // the case without a branch name is handled elsewhere
-               if (branchName.empty()) {
-                       dispatched = false;
-                       break;
-               }
-               Branch * branch = branchList.find(branchName);
-               if (!branch) {
-                       LYXERR0("Branch " << branchName << " does not exist.");
-                       dr.setError(true);
-                       docstring const msg = 
-                               bformat(_("Branch \"%1$s\" does not exist."), branchName);
-                       dr.setMessage(msg);
-               } else {
-                       branch->setSelected(func.action() == LFUN_BRANCH_ACTIVATE);
-                       dr.setError(false);
-                       dr.screenUpdate(Update::Force);
-                       dr.forceBufferUpdate();
-               }
-               break;
-       }
-
        case LFUN_BRANCHES_RENAME: {
                if (func.argument().empty())
                        break;
index 6098b250cfecf7548dc0b5e9a0351cba84a18664..5e7da53ba384b5ceae02eefb6e0b011143a4f5c6 100644 (file)
@@ -1162,6 +1162,17 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
        }
 
+       // FIXME We do not really want this here, but at present we need to
+       // handle their dispatch here, for reasons explained there, so we'll
+       // handle this here, too, for consistency.
+       case LFUN_BRANCH_ACTIVATE:
+       case LFUN_BRANCH_DEACTIVATE: {
+               BranchList const & branchList = buffer().params().branchlist();
+               docstring const branchName = cmd.argument();
+               flag.setEnabled(!branchName.empty() && branchList.find(branchName));
+               break;
+       }
+
        default:
                return false;
        }
@@ -1906,6 +1917,41 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                break;
        }
 
+       // FIXME We do not really want this here, but it has to be at present
+       // because we need a cursor for the recordUndoFullDocument call. What
+       // we would really like is a recordUndoBufferParams call that did not
+       // need a cursor, but we do not have that yet.
+       // So, if this does get fixed, this code can be moved back to Buffer.cpp,
+       // and the corresponding code in getStatus() should be moved back, too.
+       case LFUN_BRANCH_ACTIVATE:
+       case LFUN_BRANCH_DEACTIVATE: {
+               BranchList & branch_list = buffer().params().branchlist();
+               docstring const branch_name = cmd.argument();
+               // the case without a branch name is handled elsewhere
+               if (branch_name.empty()) {
+                       dispatched = false;
+                       break;
+               }
+               Branch * branch = branch_list.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 activate = cmd.action() == LFUN_BRANCH_ACTIVATE;
+               if (branch->isSelected() != activate) {
+                       branch->setSelected(activate);
+                       cur.recordUndoFullDocument();
+                       dr.setError(false);
+                       dr.screenUpdate(Update::Force);
+                       dr.forceBufferUpdate();
+               }
+               break;
+       }
+
        default:
                // OK, so try the Buffer itself...
                buffer_.dispatch(cmd, dr);
index 3a158e93d5b56797d94d482d89315a33d3d42b22..9b06c5ecef226dd85c80b2173d07a35299489b0c 100644 (file)
@@ -126,18 +126,26 @@ void InsetBranch::doDispatch(Cursor & cur, FuncRequest & cmd)
        }
        case LFUN_BRANCH_ACTIVATE:
        case LFUN_BRANCH_DEACTIVATE: {
-               // FIXME: I do not like this cast, but have no other idea...
-               Buffer const * buf = buffer().masterBuffer();
-               BranchList const & branchlist = buf->params().branchlist();
-               Branch * our_branch = const_cast<Branch *>(branchlist.find(params_.branch));
-               if (!our_branch) {
+               Buffer * buf = const_cast<Buffer *>(buffer().masterBuffer());
+               // is the branch in our master buffer?
+               bool branch_in_master = (buf != &buffer());
+
+               Branch * our_branch = buf->params().branchlist().find(params_.branch);
+               if (branch_in_master && !our_branch) {
                        // child only?
                        our_branch = buffer().params().branchlist().find(params_.branch);
                        if (!our_branch)
                                break;
+                       branch_in_master = false;
                }
                bool const activate = (cmd.action() == LFUN_BRANCH_ACTIVATE);
                if (our_branch->isSelected() != activate) {
+                       // FIXME If the branch is in the master document, we cannot
+                       // call recordUndo..., becuase the master may be hidden, and
+                       // the code presently assumes that hidden documents can never
+                       // be dirty. See GuiView::closeBufferAll(), for example.
+                       if (!branch_in_master)
+                               buffer().undo().recordUndoFullDocument(cur);
                        our_branch->setSelected(activate);
                        cur.forceBufferUpdate();
                }