]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetERT.cpp
Add override statements to please clang
[lyx.git] / src / insets / InsetERT.cpp
index 80b3af3890b0d0025f454424c7aff5cfdc1c210d..25665471038b733c7c063e838b72a380136902f4 100644 (file)
 #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"
 #include "Layout.h"
 #include "Lexer.h"
-#include "LyXRC.h"
 #include "LyXAction.h"
-#include "MetricsInfo.h"
 #include "OutputParams.h"
 #include "ParagraphParameters.h"
 #include "Paragraph.h"
 #include "TextClass.h"
 
-#include "graphics/PreviewImage.h"
-
-#include "insets/RenderPreview.h"
-
-#include "frontends/alert.h"
-#include "frontends/Application.h"
-
-#include "support/debug.h"
+#include "support/docstream.h"
+#include "support/FileName.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
+#include "support/TempFile.h"
 
 #include <sstream>
 
@@ -50,43 +45,36 @@ using namespace lyx::support;
 namespace lyx {
 
 InsetERT::InsetERT(Buffer * buf, CollapseStatus status)
-       : InsetCollapsable(buf), preview_(new RenderPreview(this))
+       : InsetCollapsible(buf)
 {
        status_ = status;
 }
 
 
-InsetERT::InsetERT(InsetERT const & other) : InsetCollapsable(other)
-{
-       operator=(other);
-}
+// 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::operator=(InsetERT const & other)
+
+InsetERT & InsetERT::operator=(InsetERT const & that)
 {
-       if (this == &other)
+       if (&that == this)
                return *this;
-       InsetCollapsable::operator=(other);
-       buffer_ = other.buffer_;
-       preview_.reset(new RenderPreview(*other.preview_, this));
-
+       tempfile_.reset();
        return *this;
 }
 
 
-InsetERT::~InsetERT()
-{
-       hideDialogs("ert", this);
-}
-
-
 void InsetERT::write(ostream & os) const
 {
        os << "ERT" << "\n";
-       InsetCollapsable::write(os);
+       InsetCollapsible::write(os);
 }
 
 
-int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const
+int InsetERT::plaintext(odocstringstream & os,
+        OutputParams const & rp, size_t max_length) const
 {
        if (!rp.inIndexEntry)
                // do not output TeX code
@@ -95,7 +83,7 @@ int InsetERT::plaintext(odocstream & os, OutputParams const & rp) const
        ParagraphList::const_iterator par = paragraphs().begin();
        ParagraphList::const_iterator end = paragraphs().end();
 
-       while (par != end) {
+       while (par != end && os.str().size() <= max_length) {
                pos_type siz = par->size();
                for (pos_type i = 0; i < siz; ++i) {
                        char_type const c = par->getChar(i);
@@ -140,32 +128,95 @@ int InsetERT::docbook(odocstream & os, OutputParams const &) const
 
 void InsetERT::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
-       switch (cmd.action) {
-       case LFUN_INSET_MODIFY: {
-               setStatus(cur, string2params(to_utf8(cmd.argument())));
+       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);
+                       setStatus(cur, string2params(to_utf8(cmd.argument())));
+                       break;
+               }
+               //fall-through
        default:
-               InsetCollapsable::doDispatch(cur, cmd);
+               InsetCollapsible::doDispatch(cur, cmd);
                break;
        }
+
 }
 
 
 bool InsetERT::getStatus(Cursor & cur, FuncRequest const & cmd,
        FuncStatus & status) const
 {
-       switch (cmd.action) {
-       case LFUN_INSET_MODIFY:
-               status.setEnabled(true);
+       switch (cmd.action()) {
+       case LFUN_INSET_EDIT:
+               status.setEnabled(tempfile_ == 0);
                return true;
-               
+       case LFUN_INSET_END_EDIT:
+               status.setEnabled(tempfile_ != 0);
+               return true;
+       case LFUN_INSET_MODIFY:
+               if (cmd.getArg(0) == "ert") {
+                       status.setEnabled(true);
+                       return true;
+               }
+               //fall through
+
        default:
-               return InsetCollapsable::getStatus(cur, cmd, status);
+               return InsetCollapsible::getStatus(cur, cmd, status);
        }
 }
 
 
+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
 {
        if (decoration() == InsetLayout::CLASSIC)
@@ -175,15 +226,7 @@ docstring const InsetERT::buttonLabel(BufferView const & bv) const
 }
 
 
-bool InsetERT::showInsetDialog(BufferView * bv) const
-{
-       bv->showDialog("ert", params2string(status(*bv)), 
-               const_cast<InsetERT *>(this));
-       return true;
-}
-
-
-InsetCollapsable::CollapseStatus InsetERT::string2params(string const & in)
+InsetCollapsible::CollapseStatus InsetERT::string2params(string const & in)
 {
        if (in.empty())
                return Collapsed;
@@ -211,89 +254,4 @@ docstring InsetERT::xhtml(XHTMLStream &, OutputParams const &) const
        return docstring();
 }
 
-
-bool InsetERT::previewState(BufferView * bv) const
-{
-       if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) {
-               graphics::PreviewImage const * pimage =
-                       preview_->getPreviewImage(bv->buffer());
-               return pimage && pimage->image();
-       }
-       return false;
-}
-
-
-void InsetERT::addPreview(DocIterator const & inset_pos,
-       graphics::PreviewLoader & ploader) const
-{
-       preparePreview(inset_pos);
-}
-
-
-void InsetERT::preparePreview(DocIterator const & pos) const  
-{
-       odocstringstream str;  
-       OutputParams runparams(&pos.buffer()->params().encoding());
-       latex(str, runparams);
-       docstring const snippet = str.str();
-       LYXERR(Debug::MACROS, "Preview snippet: " << snippet);  
-       preview_->addPreview(snippet, *pos.buffer());  
-}
-
-
-void InsetERT::reloadPreview(DocIterator const & pos) const
-{
-       preparePreview(pos);
-       preview_->startLoading(*pos.buffer());
-}
-
-
-bool InsetERT::notifyCursorLeaves(Cursor const & old, Cursor & cur)
-{
-       reloadPreview(old);
-       cur.updateFlags(Update::Force);
-       return InsetCollapsable::notifyCursorLeaves(old, cur);
-}
-
-
-void InsetERT::draw(PainterInfo & pi, int x, int y) const
-{
-       use_preview_ = previewState(pi.base.bv);
-
-       if (use_preview_) {
-               // one pixel gap in front
-               preview_->draw(pi, x + 1, y);
-               setPosCache(pi, x, y);
-               return;
-       }
-       InsetCollapsable::draw(pi, x, y);
-}
-
-
-Inset * InsetERT::editXY(Cursor & cur, int x, int y)
-{
-       if (use_preview_) {
-               edit(cur, true);
-               return this;
-       }
-       return InsetCollapsable::editXY(cur, x, y);
-}
-
-
-void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const
-{
-       if (previewState(mi.base.bv)) {
-               preview_->metrics(mi, dim);
-               // insert a one pixel gap in front of the formula
-               dim.wid += 1;
-               // Cache the inset dimension.
-               setDimCache(mi, dim);
-               Dimension dim_dummy = dim;
-               MetricsInfo mi_dummy = mi;
-               InsetCollapsable::metrics(mi_dummy, dim_dummy);
-               return;
-       }
-       InsetCollapsable::metrics(mi, dim);
-}
-
 } // namespace lyx