]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCollapsable.cpp
Restore XHTML output for InsetListings.
[lyx.git] / src / insets / InsetCollapsable.cpp
index e35ad10cba607cfa6b7732c26e00f778432577f1..4497e937d33990477bec993d8ee4561ee2d5977c 100644 (file)
 #include "BufferView.h"
 #include "Cursor.h"
 #include "Dimension.h"
-#include "DispatchResult.h"
 #include "FloatList.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
 #include "InsetLayout.h"
-#include "InsetList.h"
-#include "Language.h"
-#include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
-#include "output_xhtml.h"
-#include "paragraph_funcs.h"
-#include "ParagraphParameters.h"
-#include "sgml.h"
-#include "TextClass.h"
+#include "OutputParams.h"
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
@@ -49,6 +41,29 @@ using namespace std;
 
 namespace lyx {
 
+InsetCollapsable::InsetCollapsable(Buffer * buf, InsetText::UsePlain ltype)
+       : InsetText(buf, ltype), status_(Open),
+         openinlined_(false), mouse_hover_(false)
+{
+       setAutoBreakRows(true);
+       setDrawFrame(true);
+       setFrameColor(Color_collapsableframe);
+}
+
+
+InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs)
+       : InsetText(rhs),
+         status_(rhs.status_),
+         labelstring_(rhs.labelstring_),
+         button_dim(rhs.button_dim),
+         openinlined_(rhs.openinlined_),
+         auto_open_(rhs.auto_open_),
+         // the sole purpose of this copy constructor
+         mouse_hover_(false)
+{
+}
+
+
 InsetCollapsable::CollapseStatus InsetCollapsable::status(BufferView const & bv) const
 {
        if (decoration() == InsetLayout::CONGLOMERATE)
@@ -105,31 +120,6 @@ InsetCollapsable::Geometry InsetCollapsable::geometry() const
 }
 
 
-InsetCollapsable::InsetCollapsable(Buffer const & buf, InsetText::UsePlain ltype)
-       : InsetText(buf, ltype), status_(Inset::Open),
-         openinlined_(false), mouse_hover_(false)
-{
-       setLayout(&buf.params().documentClass());
-       setAutoBreakRows(true);
-       setDrawFrame(true);
-       setFrameColor(Color_collapsableframe);
-}
-
-
-InsetCollapsable::InsetCollapsable(InsetCollapsable const & rhs)
-       : InsetText(rhs),
-         status_(rhs.status_),
-         layout_(rhs.layout_),
-         labelstring_(rhs.labelstring_),
-         button_dim(rhs.button_dim),
-         openinlined_(rhs.openinlined_),
-         auto_open_(rhs.auto_open_),
-         // the sole purpose of this copy constructor
-         mouse_hover_(false)
-{
-}
-
-
 docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const
 {
        Dimension dim = dimensionCollapsed(bv);
@@ -146,26 +136,6 @@ docstring InsetCollapsable::toolTip(BufferView const & bv, int x, int y) const
 }
 
 
-void InsetCollapsable::setLayout()
-{
-       setLayout(buffer().params().documentClassPtr());
-}
-
-
-void InsetCollapsable::setLayout(DocumentClass const * const dc)
-{
-       if (dc) {
-               layout_ = &(dc->insetLayout(name()));
-               labelstring_ = translateIfPossible(getLayout().labelstring());
-       } else {
-               layout_ = &DocumentClass::plainInsetLayout();
-               labelstring_ = _("UNDEFINED");
-       }
-
-       setButtonLabel();
-}
-
-
 void InsetCollapsable::write(ostream & os) const
 {
        os << "status ";
@@ -178,7 +148,7 @@ void InsetCollapsable::write(ostream & os) const
                break;
        }
        os << "\n";
-       text().write(buffer(), os);
+       text().write(os);
 }
 
 
@@ -191,27 +161,13 @@ void InsetCollapsable::read(Lexer & lex)
        if (tmp_token == "open")
                status_ = Open;
 
-       // this must be set before we enter InsetText::read()
-       setLayout();
        InsetText::read(lex);
-       // set button label again as the inset contents was not read yet at
-       // setLayout() time.
        setButtonLabel();
-
-       // Force default font, if so requested
-       // This avoids paragraphs in buffer language that would have a
-       // foreign language after a document language change, and it ensures
-       // that all new text in ERT and similar gets the "latex" language,
-       // since new text inherits the language from the last position of the
-       // existing text.  As a side effect this makes us also robust against
-       // bugs in LyX that might lead to font changes in ERT in .lyx files.
-       resetParagraphsFont();
 }
 
 
 Dimension InsetCollapsable::dimensionCollapsed(BufferView const & bv) const
 {
-       LASSERT(layout_, /**/);
        Dimension dim;
        theFontMetrics(getLayout().labelfont()).buttonText(
                buttonLabel(bv), dim.wid, dim.asc, dim.des);
@@ -298,9 +254,9 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
        // Draw button first -- top, left or only
        Dimension dimc = dimensionCollapsed(bv);
 
-       if (geometry(*pi.base.bv) == TopButton ||
-           geometry(*pi.base.bv) == LeftButton ||
-           geometry(*pi.base.bv) == ButtonOnly) {
+       if (geometry(bv) == TopButton ||
+           geometry(bv) == LeftButton ||
+           geometry(bv) == ButtonOnly) {
                button_dim.x1 = x + 0;
                button_dim.x2 = x + dimc.width();
                button_dim.y1 = y - dimc.asc;
@@ -411,7 +367,6 @@ void InsetCollapsable::cursorPos(BufferView const & bv,
 {
        if (geometry(bv) == ButtonOnly)
                status_ = Open;
-       LASSERT(geometry(bv) != ButtonOnly, /**/);
 
        InsetText::cursorPos(bv, sl, boundary, x, y);
        Dimension const textdim = InsetText::dimension(bv);
@@ -442,9 +397,9 @@ bool InsetCollapsable::editable() const
 }
 
 
-bool InsetCollapsable::descendable() const
+bool InsetCollapsable::descendable(BufferView const & bv) const
 {
-       return geometry() != ButtonOnly;
+       return geometry(bv) != ButtonOnly;
 }
 
 
@@ -583,228 +538,17 @@ void InsetCollapsable::doDispatch(Cursor & cur, FuncRequest & cmd)
                cur.dispatched();
                break;
 
-       case LFUN_PASTE:
-       case LFUN_CLIPBOARD_PASTE:
-       case LFUN_SELECTION_PASTE:
-       case LFUN_PRIMARY_SELECTION_PASTE: {
-               InsetText::doDispatch(cur, cmd);
-               // Since we can only store plain text, we must reset all
-               // attributes.
-               // FIXME: Change only the pasted paragraphs
-
-               resetParagraphsFont();
-               break;
-       }
-
-       case LFUN_TAB_INSERT: {
-               bool const multi_par_selection = cur.selection() &&
-                       cur.selBegin().pit() != cur.selEnd().pit();
-               if (multi_par_selection) {
-                       // If there is a multi-paragraph selection, a tab is inserted
-                       // at the beginning of each paragraph.
-                       cur.recordUndoSelection();
-                       pit_type const pit_end = cur.selEnd().pit();
-                       for (pit_type pit = cur.selBegin().pit(); pit <= pit_end; pit++) {
-                               paragraphs()[pit].insertChar(0, '\t', 
-                                       buffer().params().trackChanges);
-                               // Update the selection pos to make sure the selection does not
-                               // change as the inserted tab will increase the logical pos.
-                               if (cur.anchor_.pit() == pit)
-                                       cur.anchor_.forwardPos();
-                               if (cur.pit() == pit)
-                                       cur.forwardPos();
-                       }
-                       cur.finishUndo();
-               } else {
-                       // Maybe we shouldn't allow tabs within a line, because they
-                       // are not (yet) aligned as one might do expect.
-                       FuncRequest cmd(LFUN_SELF_INSERT, from_ascii("\t"));
-                       dispatch(cur, cmd);     
-               }
-               break;
-       }
-
-       case LFUN_TAB_DELETE:
-               if (cur.selection()) {
-                       // If there is a selection, a tab (if present) is removed from
-                       // the beginning of each paragraph.
-                       cur.recordUndoSelection();
-                       pit_type const pit_end = cur.selEnd().pit();
-                       for (pit_type pit = cur.selBegin().pit(); pit <= pit_end; pit++) {
-                               Paragraph & par = paragraphs()[pit];
-                               if (par.getChar(0) == '\t') {
-                                       if (cur.pit() == pit)
-                                               cur.posBackward();
-                                       if (cur.anchor_.pit() == pit && cur.anchor_.pos() > 0 )
-                                               cur.anchor_.backwardPos();
-
-                                       par.eraseChar(0, buffer().params().trackChanges);
-                               } else 
-                                       // If no tab was present, try to remove up to four spaces.
-                                       for (int n_spaces = 0;
-                                               par.getChar(0) == ' ' && n_spaces < 4; ++n_spaces) {
-                                                       if (cur.pit() == pit)
-                                                               cur.posBackward();
-                                                       if (cur.anchor_.pit() == pit && cur.anchor_.pos() > 0 )
-                                                               cur.anchor_.backwardPos();
-
-                                                       par.eraseChar(0, buffer().params().trackChanges);
-                                       }
-                       }
-                       cur.finishUndo();
-               } else {
-                       // If there is no selection, try to remove a tab or some spaces 
-                       // before the position of the cursor.
-                       Paragraph & par = paragraphs()[cur.pit()];
-                       pos_type const pos = cur.pos();
-
-                       if (pos == 0)
-                               break;
-
-                       char_type const c = par.getChar(pos - 1);
-                       cur.recordUndo();
-                       if (c == '\t') {
-                               cur.posBackward();
-                               par.eraseChar(cur.pos(), buffer().params().trackChanges);
-                       } else
-                               for (int n_spaces = 0; cur.pos() > 0
-                                       && par.getChar(cur.pos() - 1) == ' ' && n_spaces < 4;
-                                       ++n_spaces) {
-                                               cur.posBackward();
-                                               par.eraseChar(cur.pos(), buffer().params().trackChanges);
-                               }
-                               cur.finishUndo();
-               }
-               break;
-
        default:
-               if (getLayout().isForceLtr()) {
-                       // Force any new text to latex_language
-                       // FIXME: This should only be necessary in constructor, but
-                       // new paragraphs that are created by pressing enter at the
-                       // start of an existing paragraph get the buffer language
-                       // and not latex_language, so we take this brute force
-                       // approach.
-                       cur.current_font.setLanguage(latex_language);
-                       cur.real_current_font.setLanguage(latex_language);
-               }
                InsetText::doDispatch(cur, cmd);
                break;
        }
 }
 
 
-void InsetCollapsable::resetParagraphsFont()
-{
-       Font font(inherit_font, buffer().params().language);
-       if (getLayout().isForceLtr())
-               font.setLanguage(latex_language);
-       if (getLayout().isPassThru()) {
-               ParagraphList::iterator par = paragraphs().begin();
-               ParagraphList::iterator const end = paragraphs().end();
-               while (par != end) {
-                       par->resetFonts(font);
-                       par->params().clear();
-                       ++par;
-               }
-       }
-}
-
-
 bool InsetCollapsable::getStatus(Cursor & cur, FuncRequest const & cmd,
                FuncStatus & flag) const
 {
        switch (cmd.action) {
-       // FIXME At present, these are being enabled and disabled according to
-       // whether PASSTHRU has been set in the InsetLayout. This makes some
-       // sense, but there are other checks that should really be done. E.g.,
-       // one should not be able to inset IndexPrint inside an optional argument!!
-       case LFUN_ACCENT_ACUTE:
-       case LFUN_ACCENT_BREVE:
-       case LFUN_ACCENT_CARON:
-       case LFUN_ACCENT_CEDILLA:
-       case LFUN_ACCENT_CIRCLE:
-       case LFUN_ACCENT_CIRCUMFLEX:
-       case LFUN_ACCENT_DOT:
-       case LFUN_ACCENT_GRAVE:
-       case LFUN_ACCENT_HUNGARIAN_UMLAUT:
-       case LFUN_ACCENT_MACRON:
-       case LFUN_ACCENT_OGONEK:
-       case LFUN_ACCENT_TIE:
-       case LFUN_ACCENT_TILDE:
-       case LFUN_ACCENT_UMLAUT:
-       case LFUN_ACCENT_UNDERBAR:
-       case LFUN_ACCENT_UNDERDOT:
-       case LFUN_APPENDIX:
-       case LFUN_BOX_INSERT:
-       case LFUN_BRANCH_INSERT:
-       case LFUN_CAPTION_INSERT:
-       case LFUN_DEPTH_DECREMENT:
-       case LFUN_DEPTH_INCREMENT:
-       case LFUN_ERT_INSERT:
-       case LFUN_FILE_INSERT:
-       case LFUN_FLEX_INSERT:
-       case LFUN_FLOAT_INSERT:
-       case LFUN_FLOAT_LIST_INSERT:
-       case LFUN_FLOAT_WIDE_INSERT:
-       case LFUN_FONT_BOLD:
-       case LFUN_FONT_BOLDSYMBOL:
-       case LFUN_FONT_TYPEWRITER:
-       case LFUN_FONT_DEFAULT:
-       case LFUN_FONT_EMPH:
-       case LFUN_FONT_NOUN:
-       case LFUN_FONT_ROMAN:
-       case LFUN_FONT_SANS:
-       case LFUN_FONT_FRAK:
-       case LFUN_FONT_ITAL:
-       case LFUN_FONT_SIZE:
-       case LFUN_FONT_STATE:
-       case LFUN_FONT_UNDERLINE:
-       case LFUN_FONT_STRIKEOUT:
-       case LFUN_FONT_UULINE:
-       case LFUN_FONT_UWAVE:
-       case LFUN_FOOTNOTE_INSERT:
-       case LFUN_HYPERLINK_INSERT:
-       case LFUN_INDEX_INSERT:
-       case LFUN_INDEX_PRINT:
-       case LFUN_INSET_INSERT:
-       case LFUN_LABEL_GOTO:
-       case LFUN_LABEL_INSERT:
-       case LFUN_LAYOUT_TABULAR:
-       case LFUN_LINE_INSERT:
-       case LFUN_MARGINALNOTE_INSERT:
-       case LFUN_MATH_DISPLAY:
-       case LFUN_MATH_INSERT:
-       case LFUN_MATH_AMS_MATRIX:
-       case LFUN_MATH_MATRIX:
-       case LFUN_MATH_MODE:
-       case LFUN_MENU_OPEN:
-       case LFUN_NEWLINE_INSERT:
-       case LFUN_NEWPAGE_INSERT:
-       case LFUN_NOACTION:
-       case LFUN_NOMENCL_INSERT:
-       case LFUN_NOMENCL_PRINT:
-       case LFUN_NOTE_INSERT:
-       case LFUN_NOTE_NEXT:
-       case LFUN_OPTIONAL_INSERT:
-       case LFUN_PHANTOM_INSERT:
-       case LFUN_REFERENCE_NEXT:
-       case LFUN_SERVER_GOTO_FILE_ROW:
-       case LFUN_SERVER_NOTIFY:
-       case LFUN_SERVER_SET_XY:
-       case LFUN_SPACE_INSERT:
-       case LFUN_SPECIALCHAR_INSERT:
-       case LFUN_TABULAR_INSERT:
-       case LFUN_TEXTSTYLE_APPLY:
-       case LFUN_TEXTSTYLE_UPDATE:
-       case LFUN_TOC_INSERT:
-       case LFUN_WRAP_INSERT:
-               if (getLayout().isPassThru()) {
-                       flag.setEnabled(false);
-                       return true;
-               }
-               return InsetText::getStatus(cur, cmd, flag);
-
        case LFUN_INSET_TOGGLE:
                if (cmd.argument() == "open")
                        flag.setEnabled(status_ != Open);
@@ -817,22 +561,6 @@ bool InsetCollapsable::getStatus(Cursor & cur, FuncRequest const & cmd,
                        flag.setEnabled(false);
                return true;
 
-       case LFUN_LANGUAGE:
-               flag.setEnabled(!getLayout().isForceLtr());
-               return InsetText::getStatus(cur, cmd, flag);
-
-       case LFUN_BREAK_PARAGRAPH:
-               flag.setEnabled(getLayout().isMultiPar());
-               return true;
-
-       case LFUN_TAB_INSERT:
-       case LFUN_TAB_DELETE:
-               if (getLayout().isPassThru()) {
-                       flag.setEnabled(true);
-                       return true;
-               }
-               return InsetText::getStatus(cur, cmd, flag);
-
        default:
                return InsetText::getStatus(cur, cmd, flag);
        }
@@ -845,6 +573,13 @@ void InsetCollapsable::setLabel(docstring const & l)
 }
 
 
+docstring const InsetCollapsable::buttonLabel(BufferView const &) const
+{
+       return labelstring_.empty() ? 
+               translateIfPossible(getLayout().labelstring()) : labelstring_;
+}
+
+
 void InsetCollapsable::setStatus(Cursor & cur, CollapseStatus status)
 {
        status_ = status;
@@ -873,112 +608,6 @@ InsetLayout::InsetDecoration InsetCollapsable::decoration() const
 }
 
 
-int InsetCollapsable::latex(odocstream & os,
-                         OutputParams const & runparams) const
-{
-       // This implements the standard way of handling the LaTeX output of
-       // a collapsable inset, either a command or an environment. Standard 
-       // collapsable insets should not redefine this, non-standard ones may
-       // call this.
-       if (!getLayout().latexname().empty()) {
-               if (getLayout().latextype() == InsetLayout::COMMAND) {
-                       // FIXME UNICODE
-                       if (runparams.moving_arg)
-                               os << "\\protect";
-                       os << '\\' << from_utf8(getLayout().latexname());
-                       if (!getLayout().latexparam().empty())
-                               os << from_utf8(getLayout().latexparam());
-                       os << '{';
-               } else if (getLayout().latextype() == InsetLayout::ENVIRONMENT) {
-                       os << "%\n\\begin{" << from_utf8(getLayout().latexname()) << "}\n";
-                       if (!getLayout().latexparam().empty())
-                               os << from_utf8(getLayout().latexparam());
-               }
-       }
-       OutputParams rp = runparams;
-       if (getLayout().isPassThru())
-               rp.verbatim = true;
-       if (getLayout().isNeedProtect())
-               rp.moving_arg = true;
-       int i = InsetText::latex(os, rp);
-       if (!getLayout().latexname().empty()) {
-               if (getLayout().latextype() == InsetLayout::COMMAND) {
-                       os << "}";
-               } else if (getLayout().latextype() == InsetLayout::ENVIRONMENT) {
-                       os << "\n\\end{" << from_utf8(getLayout().latexname()) << "}\n";
-                       i += 4;
-               }
-       }
-       return i;
-}
-
-
-// FIXME It seems as if it ought to be possible to do this more simply,
-// maybe by calling InsetText::docbook() in the middle there.
-int InsetCollapsable::docbook(odocstream & os, OutputParams const & runparams) const
-{
-       ParagraphList::const_iterator const beg = paragraphs().begin();
-       ParagraphList::const_iterator par = paragraphs().begin();
-       ParagraphList::const_iterator const end = paragraphs().end();
-
-       if (!undefined())
-               sgml::openTag(os, getLayout().latexname(),
-                             par->getID(buffer(), runparams) + getLayout().latexparam());
-
-       for (; par != end; ++par) {
-               par->simpleDocBookOnePar(buffer(), os, runparams,
-                                        outerFont(distance(beg, par),
-                                                  paragraphs()));
-       }
-
-       if (!undefined())
-               sgml::closeTag(os, getLayout().latexname());
-
-       return 0;
-}
-
-
-docstring InsetCollapsable::xhtml(odocstream & os, OutputParams const & runparams) const
-{
-       InsetLayout const & il = getLayout();
-       if (undefined())
-               return InsetText::xhtml(os, runparams);
-
-       bool const opened = html::openTag(os, il.htmltag(), il.htmlattr());
-       if (!il.counter().empty()) {
-               BufferParams const & bp = buffer().masterBuffer()->params();
-               Counters & cntrs = bp.documentClass().counters();
-               cntrs.step(il.counter());
-               // FIXME: translate to paragraph language
-               if (!il.htmllabel().empty())
-                       os << cntrs.counterLabel(from_utf8(il.htmllabel()), bp.language->code());
-       }
-       bool innertag_opened = false;
-       if (!il.htmlinnertag().empty())
-               innertag_opened = html::openTag(os, il.htmlinnertag(), il.htmlinnerattr());
-       docstring deferred = InsetText::xhtml(os, runparams);
-       if (innertag_opened)
-               html::closeTag(os, il.htmlinnertag());
-       if (opened)
-               html::closeTag(os, il.htmltag());
-       return deferred;
-}
-
-
-void InsetCollapsable::validate(LaTeXFeatures & features) const
-{
-       features.useInsetLayout(getLayout());
-       InsetText::validate(features);
-}
-
-
-bool InsetCollapsable::undefined() const
-{
-       docstring const & n = getLayout().name();
-       return n.empty() || n == DocumentClass::plainInsetLayout().name();
-}
-
-
 docstring InsetCollapsable::contextMenu(BufferView const & bv, int x,
        int y) const
 {
@@ -995,12 +624,4 @@ docstring InsetCollapsable::contextMenu(BufferView const & bv, int x,
        return InsetText::contextMenu(bv, x, y);
 }
 
-void InsetCollapsable::tocString(odocstream & os) const
-{
-       if (!getLayout().isInToc())
-               return;
-       os << text().asString(0, 1, AS_STR_LABEL | AS_STR_INSETS);
-}
-
-
 } // namespace lyx