commit e5fc7327e398c6b243113f6a8f624ed917287ee4
Author: Richard Kimberly Heck <rikih...@lyx.org>
Date:   Thu Oct 4 13:36:01 2018 -0400

    Extend fix for #7404 to allow any inset collapsible to be edited
    externally.
---
 lib/doc/Customization.lyx       |   31 +++++++++++++++++-
 lib/layouts/litinsets.inc       |    1 +
 lib/layouts/stdinsets.inc       |    1 +
 lib/scripts/layout2layout.py    |    7 +++-
 src/TextClass.cpp               |    2 +-
 src/insets/InsetCollapsible.cpp |   67 ++++++++++++++++++++++++++++++++++++++-
 src/insets/InsetCollapsible.h   |    6 +++
 src/insets/InsetERT.cpp         |   67 +-------------------------------------
 src/insets/InsetERT.h           |   12 +------
 src/insets/InsetLayout.cpp      |    5 +++
 src/insets/InsetLayout.h        |    4 ++
 11 files changed, 122 insertions(+), 81 deletions(-)

diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx
index ad79d65..1fefdd5 100644
--- a/lib/doc/Customization.lyx
+++ b/lib/doc/Customization.lyx
@@ -1,5 +1,5 @@
 #LyX 2.4 created this file. For more info see https://www.lyx.org/
-\lyxformat 564
+\lyxformat 565
 \begin_document
 \begin_header
 \save_transient_properties true
@@ -130,6 +130,7 @@ logicalmkup
 \html_css_as_file 0
 \html_be_strict true
 \author -712698321 "Jürgen Spitzmüller"
+\author 731793113 "Richard Kimberly Heck" rikih...@lyx.org
 \end_header
 
 \begin_body
@@ -18796,6 +18797,34 @@ LatexName
 
  tags.
  Default is true.
+\change_inserted 731793113 1538674858
+
+\end_layout
+
+\begin_layout Description
+
+\change_inserted 731793113 1538674891
+\begin_inset Flex Code
+status open
+
+\begin_layout Plain Layout
+
+\change_inserted 731793113 1538674863
+EditExternal
+\change_unchanged
+
+\end_layout
+
+\end_inset
+
+ [
+\emph on
+0
+\emph default
+,1] Allow the contents of the inset to be edited externally (using whatever
+ editor is defined for the document's output format).
+\change_unchanged
+
 \end_layout
 
 \begin_layout Description
diff --git a/lib/layouts/litinsets.inc b/lib/layouts/litinsets.inc
index 5cd74e1..5d6037f 100644
--- a/lib/layouts/litinsets.inc
+++ b/lib/layouts/litinsets.inc
@@ -52,4 +52,5 @@ InsetLayout "Flex:Chunk"
     ResetsFont            false
     ForceOwnlines         true
     NeedCProtect          true
+    EditExternal          true
 End
diff --git a/lib/layouts/stdinsets.inc b/lib/layouts/stdinsets.inc
index e1705d3..8de9826 100644
--- a/lib/layouts/stdinsets.inc
+++ b/lib/layouts/stdinsets.inc
@@ -220,6 +220,7 @@ InsetLayout ERT
        KeepEmpty             true
        FreeSpacing           true
        ForceLTR              true
+       EditExternal          true
 End
 
 InsetLayout Phantom
diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py
index a131335..20f9e9c 100644
--- a/lib/scripts/layout2layout.py
+++ b/lib/scripts/layout2layout.py
@@ -11,7 +11,7 @@
 # This script will update a .layout file to current format
 
 # The latest layout format is also defined in src/TextClass.cpp
-currentFormat = 69
+currentFormat = 70
 
 
 # Incremented to format 4, 6 April 2007, lasgouttes
@@ -233,6 +233,9 @@ currentFormat = 69
 # Incremented to format 69, 16 August 2018 by spitz
 # New argument type "listpreamble"
 
+# Incremented to format 69, 5 June 2018 by rkh
+# New InsetLayout tag EditExternal
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -482,7 +485,7 @@ def convert(lines, end_format):
                 i += 1
             continue
 
-        if format >= 65 and format <= 68:
+        if format >= 65 and format <= 69:
             # nothing to do.
             i += 1
             continue
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index f012595..7e81362 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -62,7 +62,7 @@ namespace lyx {
 // You should also run the development/tools/updatelayouts.py script,
 // to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 69; //spitz: New argument type listpreamble
+int const LAYOUT_FORMAT = 70; // rkh: InsetLayout EditExternal
 
 
 // Layout format for the current lyx file format. Controls which format is
diff --git a/src/insets/InsetCollapsible.cpp b/src/insets/InsetCollapsible.cpp
index 76b0bc7..3187141 100644
--- a/src/insets/InsetCollapsible.cpp
+++ b/src/insets/InsetCollapsible.cpp
@@ -15,15 +15,19 @@
 #include "InsetCollapsible.h"
 
 #include "Buffer.h"
+#include "BufferParams.h"
 #include "BufferView.h"
+#include "CutAndPaste.h"
 #include "Cursor.h"
 #include "Dimension.h"
+#include "Format.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "InsetLayout.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
 #include "OutputParams.h"
+#include "TextClass.h"
 #include "TocBackend.h"
 
 #include "frontends/FontMetrics.h"
@@ -35,6 +39,7 @@
 #include "support/lassert.h"
 #include "support/lstrings.h"
 #include "support/RefChanger.h"
+#include "support/TempFile.h"
 
 using namespace std;
 
@@ -55,7 +60,18 @@ InsetCollapsible::InsetCollapsible(InsetCollapsible const & 
rhs)
        : InsetText(rhs),
          status_(rhs.status_),
          labelstring_(rhs.labelstring_)
-{}
+{
+       tempfile_.reset();
+}
+
+
+InsetCollapsible const & InsetCollapsible::operator=(InsetCollapsible const & 
that)
+{
+       if (&that == this)
+               return *this;
+       *this = InsetCollapsible(that);
+       return *this;
+}
 
 
 InsetCollapsible::~InsetCollapsible()
@@ -393,6 +409,9 @@ void InsetCollapsible::cursorPos(BufferView const & bv,
 
 bool InsetCollapsible::editable() const
 {
+       if (tempfile_)
+               return false;
+       
        switch (decoration()) {
        case InsetLayout::CLASSIC:
        case InsetLayout::MINIMALISTIC:
@@ -405,6 +424,9 @@ bool InsetCollapsible::editable() const
 
 bool InsetCollapsible::descendable(BufferView const & bv) const
 {
+       if (tempfile_)
+               return false;
+
        return geometry(bv) != ButtonOnly;
 }
 
@@ -550,6 +572,41 @@ void InsetCollapsible::doDispatch(Cursor & cur, 
FuncRequest & cmd)
                cur.dispatched();
                break;
 
+       case LFUN_INSET_EDIT: {
+               cur.push(*this);
+               text().selectAll(cur);
+               string const format =
+                       cur.buffer()->params().documentClass().outputFormat();
+               string const ext = theFormats().extension(format);
+               tempfile_.reset(new support::TempFile("ert_editXXXXXX." + ext));
+               support::FileName const tempfilename = tempfile_->name();
+               string const name = tempfilename.toFilesystemEncoding();
+               ofdocstream os(name.c_str());
+               os << cur.selectionAsString(false);
+               os.close();
+               // Since we lock the inset while the external file is edited,
+               // we need to move the cursor outside and clear any selection 
inside
+               cur.clearSelection();
+               cur.pop();
+               cur.leaveInset(*this);
+               theFormats().edit(buffer(), tempfilename, format);
+               break;
+       }
+       case LFUN_INSET_END_EDIT: {
+               support::FileName const tempfilename = tempfile_->name();
+               docstring const s = tempfilename.fileContents("UTF-8");
+               cur.recordUndoInset(this);
+               cur.push(*this);
+               text().selectAll(cur);
+               cap::replaceSelection(cur);
+               cur.text()->insertStringAsLines(cur, s, cur.current_font);
+               // FIXME (gb) it crashes without this
+               cur.fixIfBroken();
+               tempfile_.reset();
+               cur.pop();
+               break;
+       }
+
        default:
                InsetText::doDispatch(cur, cmd);
                break;
@@ -573,6 +630,14 @@ bool InsetCollapsible::getStatus(Cursor & cur, FuncRequest 
const & cmd,
                        flag.setEnabled(false);
                return true;
 
+       case LFUN_INSET_EDIT:
+               flag.setEnabled(getLayout().editExternally() && tempfile_ == 0);
+               return true;
+
+       case LFUN_INSET_END_EDIT:
+               flag.setEnabled(getLayout().editExternally() && tempfile_ != 0);
+               return true;
+
        default:
                return InsetText::getStatus(cur, cmd, flag);
        }
diff --git a/src/insets/InsetCollapsible.h b/src/insets/InsetCollapsible.h
index 380d9ae..c0fbe3b 100644
--- a/src/insets/InsetCollapsible.h
+++ b/src/insets/InsetCollapsible.h
@@ -25,6 +25,8 @@ namespace lyx {
 class CursorSlice;
 class InsetLayout;
 
+namespace support { class TempFile; }
+
 namespace frontend { class Painter; }
 
 /** A collapsible text inset
@@ -37,6 +39,8 @@ public:
        ///
        InsetCollapsible(InsetCollapsible const & rhs);
        ///
+       InsetCollapsible const & operator=(InsetCollapsible const &);
+       ///
        virtual ~InsetCollapsible();
        ///
        InsetCollapsible * asInsetCollapsible() { return this; }
@@ -169,6 +173,8 @@ private:
        Dimension dimensionCollapsed(BufferView const & bv) const;
        ///
        docstring labelstring_;
+       ///
+       unique_ptr<support::TempFile> tempfile_;
 
        // These variables depend of the view in which the inset is displayed
        struct View
diff --git a/src/insets/InsetERT.cpp b/src/insets/InsetERT.cpp
index 388abe4..f182343 100644
--- a/src/insets/InsetERT.cpp
+++ b/src/insets/InsetERT.cpp
@@ -17,9 +17,7 @@
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "Cursor.h"
-#include "CutAndPaste.h"
 #include "DispatchResult.h"
-#include "Format.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "Language.h"
@@ -29,10 +27,8 @@
 #include "OutputParams.h"
 #include "ParagraphParameters.h"
 #include "Paragraph.h"
-#include "TextClass.h"
 
 #include "support/docstream.h"
-#include "support/FileName.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
 #include "support/TempFile.h"
@@ -51,21 +47,11 @@ InsetERT::InsetERT(Buffer * buf, CollapseStatus status)
 }
 
 
-// Do not copy the temp file on purpose: If a copy of an inset which is
-// currently being edited is made, then we simply copy the current contents.
-InsetERT::InsetERT(InsetERT const & that) : InsetCollapsible(that)
+InsetERT::InsetERT(InsetERT const & old)
+       : InsetCollapsible(old)
 {}
 
 
-InsetERT & InsetERT::operator=(InsetERT const & that)
-{
-       if (&that == this)
-               return *this;
-       tempfile_.reset();
-       return *this;
-}
-
-
 void InsetERT::write(ostream & os) const
 {
        os << "ERT" << "\n";
@@ -129,40 +115,6 @@ int InsetERT::docbook(odocstream & os, OutputParams const 
&) const
 void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
        switch (cmd.action()) {
-       case LFUN_INSET_EDIT: {
-               cur.push(*this);
-               text().selectAll(cur);
-               string const format =
-                       cur.buffer()->params().documentClass().outputFormat();
-               string const ext = theFormats().extension(format);
-               tempfile_.reset(new TempFile("ert_editXXXXXX." + ext));
-               FileName const tempfilename = tempfile_->name();
-               string const name = tempfilename.toFilesystemEncoding();
-               ofdocstream os(name.c_str());
-               os << cur.selectionAsString(false);
-               os.close();
-               // Since we lock the inset while the external file is edited,
-               // we need to move the cursor outside and clear any selection 
inside
-               cur.clearSelection();
-               cur.pop();
-               cur.leaveInset(*this);
-               theFormats().edit(buffer(), tempfilename, format);
-               break;
-       }
-       case LFUN_INSET_END_EDIT: {
-               FileName const tempfilename = tempfile_->name();
-               docstring const s = tempfilename.fileContents("UTF-8");
-               cur.recordUndoInset(this);
-               cur.push(*this);
-               text().selectAll(cur);
-               cap::replaceSelection(cur);
-               cur.text()->insertStringAsLines(cur, s, cur.current_font);
-               // FIXME it crashes without this
-               cur.fixIfBroken();
-               tempfile_.reset();
-               cur.pop();
-               break;
-       }
        case LFUN_INSET_MODIFY:
                if (cmd.getArg(0) == "ert") {
                        cur.recordUndoInset(this);
@@ -204,21 +156,6 @@ bool InsetERT::getStatus(Cursor & cur, FuncRequest const & 
cmd,
 }
 
 
-bool InsetERT::editable() const
-{
-       if (tempfile_)
-               return false;
-       return InsetCollapsible::editable();
-}
-
-
-bool InsetERT::descendable(BufferView const & bv) const
-{
-       if (tempfile_)
-               return false;
-       return InsetCollapsible::descendable(bv);
-}
-
 
 docstring const InsetERT::buttonLabel(BufferView const & bv) const
 {
diff --git a/src/insets/InsetERT.h b/src/insets/InsetERT.h
index fb67bc1..3438a08 100644
--- a/src/insets/InsetERT.h
+++ b/src/insets/InsetERT.h
@@ -28,18 +28,12 @@ namespace lyx {
 
 class Language;
 
-namespace support {
-       class TempFile;
-}
-
 class InsetERT : public InsetCollapsible {
 public:
        ///
        InsetERT(Buffer *, CollapseStatus status = Open);
-       ///
-       InsetERT(InsetERT const &);
        ///
-       InsetERT & operator=(InsetERT const &);
+       InsetERT(InsetERT const & old);
        ///
        static CollapseStatus string2params(std::string const &);
        ///
@@ -70,10 +64,6 @@ private:
        ///
        bool getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus &) 
const;
        ///
-       bool editable() const;
-       ///
-       bool descendable(BufferView const &) const;
-       ///
        Inset * clone() const { return new InsetERT(*this); }
        ///
        docstring const buttonLabel(BufferView const & bv) const;
diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp
index e78b3ff..acef3d1 100644
--- a/src/insets/InsetLayout.cpp
+++ b/src/insets/InsetLayout.cpp
@@ -90,6 +90,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
                IL_CUSTOMPARS,
                IL_DECORATION,
                IL_DISPLAY,
+               IL_EDITEXTERNAL,
                IL_FIXEDWIDTH_PREAMBLE_ENCODING,
                IL_FONT,
                IL_FORCE_LOCAL_FONT_SWITCH,
@@ -146,6 +147,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
                { "custompars", IL_CUSTOMPARS },
                { "decoration", IL_DECORATION },
                { "display", IL_DISPLAY },
+               { "editexternal", IL_EDITEXTERNAL },
                { "end", IL_END },
                { "fixedwidthpreambleencoding", IL_FIXEDWIDTH_PREAMBLE_ENCODING 
},
                { "font", IL_FONT },
@@ -473,6 +475,9 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
                case IL_ISTOCCAPTION:
                        lex >> is_toc_caption_;
                        break;
+               case IL_EDITEXTERNAL:
+                       lex >> edit_external_;
+                       break;
                case IL_END:
                        getout = true;
                        break;
diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h
index b48ea7c..79390e5 100644
--- a/src/insets/InsetLayout.h
+++ b/src/insets/InsetLayout.h
@@ -189,6 +189,8 @@ public:
        std::string tocType() const { return toc_type_; }
        ///
        bool isTocCaption() const { return is_toc_caption_; }
+       ///
+       bool editExternally () const { return edit_external_; }
 private:
        ///
        void makeDefaultCSS() const;
@@ -312,6 +314,8 @@ private:
        std::string toc_type_;
        ///
        bool is_toc_caption_;
+       ///
+       bool edit_external_;
 };
 
 ///

Reply via email to