commit 5a3f1a731f0911427a3a5720393939f7d033b350
Author: Juergen Spitzmueller <[email protected]>
Date:   Mon Jan 27 08:01:24 2014 +0100

    Extend environment-split to an 'outer' split function
    
    This fixes a major beamer UI flaw reported by several users.

diff --git a/lib/bind/de/menus.bind b/lib/bind/de/menus.bind
index be09417..1c4045b 100644
--- a/lib/bind/de/menus.bind
+++ b/lib/bind/de/menus.bind
@@ -112,6 +112,10 @@ Format 1
 \bind "M-a Up"                 "outline-up"
 \bind "M-a Down"               "outline-down"
 
+
+\bind "M-a Return"             "environment-split"
+\bind "M-a S-Return"           "environment-split outer"
+
 # Obsolete Tastenbelegung: in die persönliche *.bind Datei kopieren und
 # auskommentieren wenn diese Tastenbelegung gewünscht ist.
 # \bind "M-a S-quotedbl"       "layout Section*"       # M-a S-2
diff --git a/lib/bind/menus.bind b/lib/bind/menus.bind
index cfe48bb..ddb66ff 100644
--- a/lib/bind/menus.bind
+++ b/lib/bind/menus.bind
@@ -125,6 +125,9 @@ Format 1
 \bind "M-p Up"                 "outline-up"
 \bind "M-p Down"               "outline-down"
 
+\bind "M-p Return"             "environment-split"
+\bind "M-p S-Return"           "environment-split outer"
+
 
 # These are kept for backwards compatibility (only make sense on US keyboard)
 \bind "M-p S-at"               "layout Section*"       # M-p S-2
diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc
index 79595c1..b4cc2c6 100644
--- a/lib/ui/stdcontext.inc
+++ b/lib/ui/stdcontext.inc
@@ -318,6 +318,8 @@ Menuset
                Item "Move Paragraph Up|o" "paragraph-move-up"
                Item "Move Paragraph Down|v" "paragraph-move-down"
                Separator
+               EnvironmentSeparators
+               Separator
                OptItem "Promote Section|r" "outline-out"
                OptItem "Demote Section|m" "outline-in"
                OptItem "Move Section Down|D" "outline-down"
diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc
index 81d0b1c..02d05f6 100644
--- a/lib/ui/stdmenus.inc
+++ b/lib/ui/stdmenus.inc
@@ -133,6 +133,7 @@ Menuset
 # obvious what the context is for the others)
                OptItem "Increase List Depth|I" "depth-increment"
                OptItem "Decrease List Depth|D" "depth-decrement"
+               EnvironmentSeparators
                OptItem "Dissolve Inset" "inset-dissolve"
                OptItem "TeX Code Settings...|C" "inset-settings ert"
 # 'a' shortcut to match Insert entry, shouldn't clash with Table Settings
@@ -150,7 +151,6 @@ Menuset
 # This is in the Table submenu instead for now.
 #      OptItem "Table Settings...|a" "inset-settings tabular"
                OptItem "Table Settings...|a" "layout-tabular"
-               OptItem "Split Environment|l" "environment-split"
        End
 
        Menu "edit_paste"
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index f1f99dc..2413a23 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -3682,7 +3682,9 @@ void LyXAction::init()
 /*!
  * \var lyx::FuncCode lyx::LFUN_ENVIRONMENT_SPLIT
  * \li Action: Splits the current environment with a Separator.
- * \li Syntax: environment-split
+ * \li Syntax: environment-split [outer]
+ * \li Params: outer: If this is given, LyX will split the outermost 
environment in
+ *                    the current nesting hierarchy.
  * \li Origin: spitz, 23 Dec 2012
  * \endvar
  */
diff --git a/src/Text3.cpp b/src/Text3.cpp
index 34f6af1..e46270c 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -1378,10 +1378,32 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_ENVIRONMENT_SPLIT: {
+               bool const outer = cmd.argument() == "outer";
                Paragraph const & para = cur.paragraph();
-               docstring const layout = para.layout().name();
+               docstring layout = para.layout().name();
+               depth_type split_depth = cur.paragraph().params().depth();
+               if (outer) {
+                       // check if we have an environment in our nesting 
hierarchy
+                       pit_type pit = cur.pit();
+                       Paragraph cpar = pars_[pit];
+                       while (true) {
+                               if (pit == 0 || cpar.params().depth() == 0)
+                                       break;
+                               --pit;
+                               cpar = pars_[pit];
+                               if (cpar.params().depth() < split_depth
+                                   && cpar.layout().isEnvironment()) {
+                                               layout = cpar.layout().name();
+                                               split_depth = 
cpar.params().depth();
+                               }
+                       }
+               }
                if (cur.pos() > 0)
                        lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK));
+               if (outer) {
+                       while (cur.paragraph().params().depth() > split_depth)
+                               
lyx::dispatch(FuncRequest(LFUN_DEPTH_DECREMENT));
+               }
                bool const morecont = cur.lastpos() > cur.pos();
                lyx::dispatch(FuncRequest(LFUN_LAYOUT, "Separator"));
                lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse"));
@@ -2892,8 +2914,28 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & 
cmd,
                break;
        
        case LFUN_ENVIRONMENT_SPLIT: {
-               if (cur.paragraph().layout().isEnvironment()
-                   && 
cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) {
+               if 
(!cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) {
+                       enable = false;
+                       break;
+               }
+               if (cmd.argument() == "outer") {
+                       // check if we have an environment in our nesting 
hierarchy
+                       bool res = false;
+                       depth_type const current_depth = 
cur.paragraph().params().depth();
+                       pit_type pit = cur.pit();
+                       Paragraph cpar = pars_[pit];
+                       while (true) {
+                               if (pit == 0 || cpar.params().depth() == 0)
+                                       break;
+                               --pit;
+                               cpar = pars_[pit];
+                               if (cpar.params().depth() < current_depth)
+                                       res = cpar.layout().isEnvironment();
+                       }
+                       enable = res;
+                       break;
+               }
+               else if (cur.paragraph().layout().isEnvironment()) {
                        enable = true;
                        break;
                }
diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp
index d4a687b..af4e6fa 100644
--- a/src/frontends/qt4/Menus.cpp
+++ b/src/frontends/qt4/Menus.cpp
@@ -47,10 +47,12 @@
 #include "LyXRC.h"
 #include "lyxfind.h"
 #include "Paragraph.h"
+#include "ParagraphParameters.h"
 #include "ParIterator.h"
 #include "Session.h"
 #include "SpellChecker.h"
 #include "TextClass.h"
+#include "Text.h"
 #include "TocBackend.h"
 #include "Toolbars.h"
 #include "WordLangTuple.h"
@@ -185,7 +187,9 @@ public:
                Captions,
                /** This is the list of captions available
                in the InsetCaption context menu. */
-               SwitchCaptions
+               SwitchCaptions,
+               /** Commands to separate environments. */
+               EnvironmentSeparation
        };
 
        explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@@ -363,6 +367,7 @@ public:
        void expandLanguageSelector(Buffer const * buf);
        void expandArguments(BufferView const *, bool switcharg = false);
        void expandCaptions(Buffer const * buf, bool switchcap = false);
+       void expandEnvironmentSeparators(BufferView const *);
        ///
        ItemList items_;
        ///
@@ -474,7 +479,8 @@ void MenuDefinition::read(Lexer & lex)
                md_arguments,
                md_switcharguments,
                md_captions,
-               md_switchcaptions
+               md_switchcaptions,
+               md_env_separators
        };
 
        LexerKeyword menutags[] = {
@@ -488,6 +494,7 @@ void MenuDefinition::read(Lexer & lex)
                { "documents", md_documents },
                { "elements", md_elements },
                { "end", md_endmenu },
+               { "environmentseparators", md_env_separators },
                { "exportformats", md_exportformats },
                { "floatinsert", md_floatinsert },
                { "floatlistinsert", md_floatlistinsert },
@@ -651,6 +658,10 @@ void MenuDefinition::read(Lexer & lex)
                        add(MenuItem(MenuItem::SwitchCaptions));
                        break;
 
+               case md_env_separators:
+                       add(MenuItem(MenuItem::EnvironmentSeparation));
+                       break;
+
                case md_optsubmenu:
                case md_submenu: {
                        lex.next(true);
@@ -1649,6 +1660,47 @@ void MenuDefinition::expandCaptions(Buffer const * buf, 
bool switchcap)
        }
 }
 
+
+void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv)
+{
+       if (!bv)
+               return;
+
+       Paragraph const par = bv->cursor().paragraph();
+       docstring const curlayout = par.layout().name();
+       docstring outerlayout;
+       depth_type current_depth = par.params().depth();
+       // check if we have an environment in our nesting hierarchy
+       pit_type pit = bv->cursor().pit();
+       Paragraph cpar = bv->buffer().text().getPar(pit);
+       while (true) {
+               if (pit == 0 || cpar.params().depth() == 0)
+                       break;
+               --pit;
+               cpar = bv->buffer().text().getPar(pit);
+               if (cpar.params().depth() < current_depth
+                   && cpar.layout().isEnvironment()) {
+                               outerlayout = cpar.layout().name();
+                               current_depth = cpar.params().depth();
+               }
+       }
+       if (par.layout().isEnvironment()) {
+               docstring const label =
+                           bformat(_("Start New Environment (%1$s)"),
+                                   translateIfPossible(curlayout));
+               add(MenuItem(MenuItem::Command, toqstr(label),
+                            FuncRequest(LFUN_ENVIRONMENT_SPLIT)));
+       }
+       if (!outerlayout.empty()) {
+           docstring const label =
+                       bformat(_("Start New Parent Environment (%1$s)"),
+                               translateIfPossible(outerlayout));
+           add(MenuItem(MenuItem::Command, toqstr(label),
+                            FuncRequest(LFUN_ENVIRONMENT_SPLIT,
+                                        from_ascii("outer"))));
+       }
+}
+
 } // namespace anon
 
 
@@ -1793,7 +1845,8 @@ struct Menus::Impl {
        /** The entries with the following kind are expanded to a
            sequence of Command MenuItems: Lastfiles, Documents,
            ViewFormats, ExportFormats, UpdateFormats, Branches,
-           Indices, Arguments, SwitchArguments, Captions, SwitchCaptions
+           Indices, Arguments, SwitchArguments, Captions, SwitchCaptions,
+           EnvironmentSeparation
        */
        void expand(MenuDefinition const & frommenu, MenuDefinition & tomenu,
                BufferView const *) const;
@@ -2030,6 +2083,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandCaptions(buf, true);
                        break;
 
+               case MenuItem::EnvironmentSeparation:
+                       tomenu.expandEnvironmentSeparators(bv);
+                       break;
+
                case MenuItem::Submenu: {
                        MenuItem item(*cit);
                        item.setSubmenu(MenuDefinition(cit->submenuname()));

Reply via email to