]> git.lyx.org Git - features.git/blobdiff - src/insets/insetert.C
skak support, John's ERT fixes, loclae blunder fix
[features.git] / src / insets / insetert.C
index 376621a801d9cb28f5f7f2bd7092c0435a78597c..f1bef0a34f01e0646536ec8b19aecc9c97559c36 100644 (file)
@@ -23,6 +23,8 @@
 #include "BufferView.h"
 #include "LyXView.h"
 #include "lyxtext.h"
+#include "frontends/Dialogs.h"
+#include "debug.h"
 
 using std::ostream;
 
@@ -34,17 +36,23 @@ void InsetERT::init()
        labelfont.decSize();
        labelfont.setColor(LColor::latex);
        setInsetName("ERT");
+               
 }
 
 
-InsetERT::InsetERT() : InsetCollapsable()
+InsetERT::InsetERT(bool collapsed)
+       : InsetCollapsable(collapsed)
 {
+       if (collapsed)
+               status_ = Collapsed;
+       else
+               status_ = Open;
        init();
 }
 
 
 InsetERT::InsetERT(InsetERT const & in, bool same_id)
-       : InsetCollapsable(in, same_id)
+       : InsetCollapsable(in, same_id), status_(in.status_)
 {
        init();
 }
@@ -59,7 +67,15 @@ Inset * InsetERT::clone(Buffer const &, bool same_id) const
 InsetERT::InsetERT(string const & contents, bool collapsed)
        : InsetCollapsable(collapsed)
 {
+       if (collapsed)
+               status_ = Collapsed;
+       else
+               status_ = Open;
+#ifndef INHERIT_LANG
+       LyXFont font(LyXFont::ALL_INHERIT, latex_language);
+#else 
        LyXFont font(LyXFont::ALL_INHERIT);
+#endif
        font.setFamily(LyXFont::TYPEWRITER_FAMILY);
        font.setColor(LColor::latex);
        string::const_iterator cit = contents.begin();
@@ -74,18 +90,128 @@ InsetERT::InsetERT(string const & contents, bool collapsed)
 }
 
 
+InsetERT::~InsetERT()
+{
+       hideDialog();
+}
+
+
 void InsetERT::read(Buffer const * buf, LyXLex & lex)
 {
-       InsetCollapsable::read(buf, lex);
+       bool token_found = false;
+       if (lex.isOK()) {
+               lex.next();
+               string const token = lex.getString();
+               if (token == "status") {
+                       lex.next();
+                       string const tmp_token = lex.getString();
+                       
+                       if (tmp_token == "Inlined") {
+                               status(0, Inlined);
+                       } else if (tmp_token == "Collapsed") {
+                               status(0, Collapsed);
+                       } else {
+                               // leave this as default!
+                               status(0, Open);
+                       }
+                       
+                       token_found = true;
+               } else {
+                       lyxerr << "InsetERT::Read: Missing 'status'-tag!"
+                                  << std::endl;
+                       // take countermeasures
+                       lex.pushToken(token);
+               }
+       }
+#warning this should be really short lived only for compatibility to
+#warning files written 07/08/2001 so this has to go before 1.2.0! (Jug)
+       if (lex.isOK()) {
+               lex.next();
+               string const token = lex.getString();
+               if (token == "collapsed") {
+                       lex.next();
+                       collapsed_ = lex.getBool();
+               } else {
+                       // Take countermeasures
+                       lex.pushToken(token);
+               }
+       }
+       inset.read(buf, lex);
+
+#ifndef INHERIT_LANG
+       LyXFont font(LyXFont::ALL_INHERIT, latex_language);
+#else 
+       LyXFont font(LyXFont::ALL_INHERIT);
+#endif
+
+       font.setFamily(LyXFont::TYPEWRITER_FAMILY);
+       font.setColor(LColor::latex);
+       Paragraph * par = inset.paragraph();
+       while (par) {
+               Paragraph::size_type siz = par->size();
+               for (Paragraph::size_type i = 0; i < siz; ++i) {
+                       par->setFont(i, font);
+               }
+               par = par->next();
+       }
 
+       if (!token_found) {
+               if (collapsed_) {
+                       status(0, Collapsed);
+               } else {
+                       status(0, Open);
+               }
+       }
        setButtonLabel();
 }
 
 
 void InsetERT::write(Buffer const * buf, ostream & os) const 
 {
-       os << getInsetName() << "\n";
-       InsetCollapsable::write(buf, os);
+       string st;
+
+       switch(status_) {
+       case Open: 
+               st = "Open";
+               break;
+       case Collapsed:
+               st = "Collapsed";
+               break;
+       case Inlined:
+               st = "Inlined";
+               break;
+       }
+
+       os << getInsetName() << "\n"
+          << "status "<< st << "\n";
+
+       //inset.writeParagraphData(buf, os);
+       string const layout =
+               textclasslist.NameOfLayout(buf->params.textclass, 0);
+       Paragraph * par = inset.paragraph();
+       while (par) {
+               os << "\n\\layout " << layout << "\n";
+               Paragraph::size_type siz = par->size();
+               for (Paragraph::size_type i = 0; i < siz; ++i) {
+                       Paragraph::value_type c = par->getChar(i);
+                       switch (c) {
+                       case Paragraph::META_INSET:
+                       case Paragraph::META_HFILL:
+                               lyxerr << "Element is not allowed in insertERT"
+                                      << std::endl;
+                       case Paragraph::META_NEWLINE:
+                               os << "\n\\newline \n";
+                               break;
+                       case '\\':
+                               os << "\n\\backslash \n";
+                               break;
+                       default:
+                               os << c;
+                               break;
+                       }
+               }
+               par = par->next();
+       }
 }
 
 
@@ -112,52 +238,67 @@ void InsetERT::setFont(BufferView *, LyXFont const &, bool, bool selectall)
 }
 
 
+void InsetERT::updateStatus(BufferView * bv, bool swap) const
+{
+       if (status_ != Inlined) {
+               if (collapsed_) {
+                       status(bv, swap ? Open : Collapsed);
+               } else {
+                       status(bv, swap ? Collapsed : Open);
+               }
+       }
+}
+
 void InsetERT::edit(BufferView * bv, int x, int y, unsigned int button)
 {
+       if (button == 3)
+               return;
        InsetCollapsable::edit(bv, x, y, button);
+       updateStatus(0);
        set_latex_font(bv);
 }
 
 
+Inset::EDITABLE InsetERT::editable() const
+{
+       if (status_ == Collapsed)
+               return IS_EDITABLE;
+       return HIGHLY_EDITABLE;
+}
+
+
 void InsetERT::edit(BufferView * bv, bool front)
 {
        InsetCollapsable::edit(bv, front);
+       updateStatus(0);
        set_latex_font(bv);
 }
 
 
-void InsetERT::insetButtonRelease(BufferView * bv,
-                                 int x, int y, int button)
+void InsetERT::insetButtonRelease(BufferView * bv, int x, int y, int button)
 {
-       if ((x >= 0)  && (x < button_length) &&
-           (y >= button_top_y) &&  (y <= button_bottom_y))
-       {
-               if (button == 2) {
-                       inlined(bv, !inlined());
-                       return;
-               }
-               if (collapsed_) {
-                       setLabel(_("ERT"));
-               } else {
-                       setLabel(get_new_label());
-               }
-               if (collapsed_) {
-                       collapsed_ = false;
-                       inset.insetButtonRelease(bv, 0, 0, button);
-                       inset.setUpdateStatus(bv, InsetText::FULL);
-                       bv->updateInset(this, true);
-               } else {
-                       collapsed_ = true;
-                       bv->unlockInset(this);
-                       bv->updateInset(this, true);
-               }
-       } else if (!collapsed_ && (y > button_bottom_y)) {
+       if (button == 3) {
+               showInsetDialog(bv);
+               return;
+       }
+       if (status_ != Inlined && (x >= 0)  && (x < button_length) &&
+           (y >= button_top_y) &&  (y <= button_bottom_y)) {
+               updateStatus(bv, true);
+       } else {
                LyXFont font(LyXFont::ALL_SANE);
-               int yy = ascent(bv, font) + y -
-                   (ascent_collapsed() +
-                    descent_collapsed() +
-                    inset.ascent(bv, font));
-               inset.insetButtonRelease(bv, x, yy, button);
+               int yy = ascent(bv, font) + y - inset.ascent(bv, font);
+               // inlined is special - the text appears above 
+               // button_bottom_y
+               if (status_ == Inlined) {
+                       inset.insetButtonRelease(bv, x, yy, button);
+               } else if (!collapsed_ && (y > button_bottom_y)) {
+                       yy -= (ascent_collapsed() + descent_collapsed());
+                       inset.insetButtonRelease(bv, x, yy, button);
+               }
        }
 }
 
@@ -166,13 +307,15 @@ int InsetERT::latex(Buffer const *, std::ostream & os, bool /*fragile*/,
                    bool /*free_spc*/) const
 {
        Paragraph * par = inset.paragraph();
+       int lines = 0;
        while (par) {
-               Paragraph::size_type siz = inset.paragraph()->size();
-               for (Paragraph::size_type i = 0; i != siz; ++i) {
-                       char c = inset.paragraph()->getChar(i);
+               Paragraph::size_type siz = par->size();
+               for (Paragraph::size_type i = 0; i < siz; ++i) {
+                       Paragraph::value_type c = par->getChar(i);
                        switch (c) {
                        case Paragraph::META_NEWLINE:
                                os << '\n';
+                               ++lines;
                                break;
                        default:
                                os << c;
@@ -180,9 +323,13 @@ int InsetERT::latex(Buffer const *, std::ostream & os, bool /*fragile*/,
                        }
                }
                par = par->next();
+               if (par) {
+                       os << "\n\n";
+                       lines += 2;
+               }
        }
        
-       return 1;
+       return lines;
 }
 
 
@@ -193,15 +340,61 @@ int InsetERT::ascii(Buffer const *,
 }
 
 
-int InsetERT::linuxdoc(Buffer const *, std::ostream &) const
+int InsetERT::linuxdoc(Buffer const *, std::ostream & os) const
 {
-       return 0;
+       Paragraph * par = inset.paragraph();
+       int lines = 0;
+       while (par) {
+               Paragraph::size_type siz = par->size();
+               for (Paragraph::size_type i = 0; i < siz; ++i) {
+                       Paragraph::value_type c = par->getChar(i);
+                       switch (c) {
+                       case Paragraph::META_NEWLINE:
+                               os << '\n';
+                               ++lines;
+                               break;
+                       default:
+                               os << c;
+                               break;
+                       }
+               }
+               par = par->next();
+               if (par) {
+                       os << "\n";
+                       lines ++;
+               }
+       }
+       
+       return lines;
 }
 
 
-int InsetERT::docBook(Buffer const *, std::ostream &) const
+int InsetERT::docbook(Buffer const *, std::ostream & os) const
 {
-       return 0;
+       Paragraph * par = inset.paragraph();
+       int lines = 0;
+       while (par) {
+               Paragraph::size_type siz = par->size();
+               for (Paragraph::size_type i = 0; i < siz; ++i) {
+                       Paragraph::value_type c = par->getChar(i);
+                       switch (c) {
+                       case Paragraph::META_NEWLINE:
+                               os << '\n';
+                               ++lines;
+                               break;
+                       default:
+                               os << c;
+                               break;
+                       }
+               }
+               par = par->next();
+               if (par) {
+                       os << "\n";
+                       lines ++;
+               }
+       }
+       
+       return lines;
 }
 
 
@@ -224,6 +417,12 @@ InsetERT::localDispatch(BufferView * bv, kb_action action, string const & arg)
        switch(action) {
        case LFUN_BREAKPARAGRAPH:
        case LFUN_BREAKPARAGRAPHKEEPLAYOUT:
+       case LFUN_BACKSPACE:
+       case LFUN_BACKSPACE_SKIP:
+       case LFUN_DELETE:
+       case LFUN_DELETE_SKIP:
+       case LFUN_DELETE_LINE_FORWARD:
+       case LFUN_CUT:
                set_latex_font(bv);
                break;
        
@@ -259,9 +458,9 @@ string const InsetERT::get_new_label() const
 }
 
 
-void InsetERT::setButtonLabel() 
+void InsetERT::setButtonLabel() const
 {
-       if (collapsed_) {
+       if (status_ == Collapsed) {
                setLabel(get_new_label());
        } else {
                setLabel(_("ERT"));
@@ -271,7 +470,11 @@ void InsetERT::setButtonLabel()
 
 bool InsetERT::checkInsertChar(LyXFont & font)
 {
+#ifndef INHERIT_LANG
+       LyXFont f(LyXFont::ALL_INHERIT, latex_language);
+#else 
        LyXFont f(LyXFont::ALL_INHERIT);
+#endif
        font = f;
        font.setFamily(LyXFont::TYPEWRITER_FAMILY);
        font.setColor(LColor::latex);
@@ -279,15 +482,33 @@ bool InsetERT::checkInsertChar(LyXFont & font)
 }
 
 
-void InsetERT::inlined(BufferView * bv, bool flag)
+int InsetERT::ascent(BufferView * bv, LyXFont const & font) const
 {
-       if (flag != inset.getAutoBreakRows())
-               return;
-       
-       inset.setAutoBreakRows(!flag);
-       bv->updateInset(this, true);
+       if (!inlined())
+               return InsetCollapsable::ascent(bv, font);
+
+       return inset.ascent(bv, font);
 }
 
+
+int InsetERT::descent(BufferView * bv, LyXFont const & font) const
+{
+       if (!inlined())
+               return InsetCollapsable::descent(bv, font);
+
+       return inset.descent(bv, font);
+}
+
+
+int InsetERT::width(BufferView * bv, LyXFont const & font) const
+{
+       if (!inlined())
+               return InsetCollapsable::width(bv, font);
+
+       return inset.width(bv, font);
+}
+
+
 void InsetERT::draw(BufferView * bv, LyXFont const & f, 
                     int baseline, float & x, bool cleared) const
 {
@@ -322,6 +543,7 @@ void InsetERT::draw(BufferView * bv, LyXFont const & f,
        }
 
        top_x = int(x);
+       topx_set = true;
        top_baseline = baseline;
 
        int const bl = baseline - ascent(bv, f) + ascent_collapsed();
@@ -340,9 +562,72 @@ void InsetERT::draw(BufferView * bv, LyXFont const & f,
 
 void InsetERT::set_latex_font(BufferView * bv)
 {
+#ifndef INHERIT_LANG
+       LyXFont font(LyXFont::ALL_INHERIT, latex_language);
+#else 
        LyXFont font(LyXFont::ALL_INHERIT);
+#endif
 
        font.setFamily(LyXFont::TYPEWRITER_FAMILY);
        font.setColor(LColor::latex);
-       inset.setFont(bv, font);
+       inset.getLyXText(bv)->setFont(bv, font, false);
+}
+
+
+void InsetERT::status(BufferView * bv, ERTStatus const st) const
+{
+       if (st != status_) {
+               status_ = st;
+               switch(st) {
+               case Inlined:
+                       inset.setAutoBreakRows(false);
+                       break;
+               case Open:
+                       inset.setAutoBreakRows(true);
+                       collapsed_ = false;
+                       need_update = FULL;
+                       setButtonLabel();
+                       break;
+               case Collapsed:
+                       inset.setAutoBreakRows(true);
+                       collapsed_ = true;
+                       need_update = FULL;
+                       setButtonLabel();
+                       if (bv)
+                               bv->unlockInset(const_cast<InsetERT *>(this));
+                       break;
+               }
+               if (bv)
+                       bv->updateInset(const_cast<InsetERT *>(this), false);
+       }
+}
+
+
+bool InsetERT::showInsetDialog(BufferView * bv) const
+{
+       bv->owner()->getDialogs()->showERT(const_cast<InsetERT *>(this));
+       return true;
+}
+
+
+void InsetERT::open(BufferView * bv)
+{
+       if (!collapsed_)
+               return;
+       status(bv, Open);
+}
+
+
+void InsetERT::close(BufferView * bv) const
+{
+       if (collapsed_)
+               return;
+       status(bv, Collapsed);
+}
+
+
+string const InsetERT::selectNextWordToSpellcheck(BufferView * bv,float &) const
+{
+        bv->unlockInset(const_cast<InsetERT *>(this));
+       return string();
 }