]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCollapsable.cpp
move the the latex and validate methods from InsetCollapsable to InsetText; small...
[lyx.git] / src / insets / InsetCollapsable.cpp
index 51c7048a409474d1e2e9cc77eedbd120da704405..5a2e9b67dd58c7f651b024ff23fdf77de08f0582 100644 (file)
 #include "InsetLayout.h"
 #include "InsetList.h"
 #include "Language.h"
-#include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
 #include "output_xhtml.h"
+#include "OutputParams.h"
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
 #include "sgml.h"
@@ -169,18 +169,8 @@ void InsetCollapsable::read(Lexer & lex)
        if (tmp_token == "open")
                status_ = Open;
 
-       // this must be set before we enter InsetText::read()
        InsetText::read(lex);
        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();
 }
 
 
@@ -557,228 +547,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);
@@ -791,22 +570,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);
        }
@@ -819,6 +582,12 @@ void InsetCollapsable::setLabel(docstring const & l)
 }
 
 
+docstring const InsetCollapsable::buttonLabel(BufferView const &) const
+{
+       return labelstring_.empty() ? getLayout().labelstring() : labelstring_;
+}
+
+
 void InsetCollapsable::setStatus(Cursor & cur, CollapseStatus status)
 {
        status_ = status;
@@ -847,46 +616,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
@@ -939,13 +668,6 @@ docstring InsetCollapsable::xhtml(odocstream & os, OutputParams const & runparam
 }
 
 
-void InsetCollapsable::validate(LaTeXFeatures & features) const
-{
-       features.useInsetLayout(getLayout());
-       InsetText::validate(features);
-}
-
-
 bool InsetCollapsable::undefined() const
 {
        docstring const & n = getLayout().name();