]> git.lyx.org Git - lyx.git/blobdiff - src/insets/Inset.cpp
Restore XHTML output for InsetListings.
[lyx.git] / src / insets / Inset.cpp
index 252e399e826ef3e922198f8e078945696caa0c4d..82a5426cbe43147d609dec5f3dc8dfbea2a9c61a 100644 (file)
@@ -4,10 +4,10 @@
  * Licence details can be found in the file COPYING.
  *
  * \author Alejandro Aguilar Sierra
- * \author Jürgen Vigna
- * \author Lars Gullik Bjønnes
+ * \author Jürgen Vigna
+ * \author Lars Gullik Bjønnes
  * \author Matthias Ettrich
- * \author André Pönitz
+ * \author André Pönitz
  *
  * Full author contact details are available in file CREDITS.
  */
 
 #include "Inset.h"
 
+#include "buffer_funcs.h"
 #include "Buffer.h"
+#include "BufferList.h"
 #include "BufferParams.h"
 #include "BufferView.h"
-#include "Color.h"
 #include "CoordCache.h"
 #include "Cursor.h"
-#include "debug.h"
 #include "Dimension.h"
 #include "DispatchResult.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
-#include "gettext.h"
+#include "MetricsInfo.h"
+#include "output_xhtml.h"
 #include "Text.h"
 #include "TextClass.h"
-#include "MetricsInfo.h"
-#include "MetricsInfo.h"
 
+#include "frontends/Application.h"
 #include "frontends/Painter.h"
 
-#include "support/convert.h"
-
-#include <boost/current_function.hpp>
+#include "support/debug.h"
+#include "support/docstream.h"
+#include "support/ExceptionMessage.h"
+#include "support/gettext.h"
+#include "support/lassert.h"
 
 #include <map>
-#include <typeinfo>
 
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 
 class InsetName {
 public:
-       InsetName(std::string const & n, Inset::Code c)
-               : name(n), code(c) {}
-       std::string name;
-       Inset::Code code;
+       InsetName(string const & n, InsetCode c) : name(n), code(c) {}
+       string name;
+       InsetCode code;
 };
 
 
-typedef std::map<std::string, Inset::Code> TranslatorMap;
+typedef map<string, InsetCode> TranslatorMap;
 
 
 static TranslatorMap const build_translator()
 {
        InsetName const insetnames[] = {
-               InsetName("toc", Inset::TOC_CODE),
-               InsetName("quote", Inset::QUOTE_CODE),
-               InsetName("ref", Inset::REF_CODE),
-               InsetName("url", Inset::URL_CODE),
-               InsetName("htmlurl", Inset::HTMLURL_CODE),
-               InsetName("separator", Inset::SEPARATOR_CODE),
-               InsetName("ending", Inset::ENDING_CODE),
-               InsetName("label", Inset::LABEL_CODE),
-               InsetName("note", Inset::NOTE_CODE),
-               InsetName("accent", Inset::ACCENT_CODE),
-               InsetName("math", Inset::MATH_CODE),
-               InsetName("index", Inset::INDEX_CODE),
-               InsetName("nomenclature", Inset::NOMENCL_CODE),
-               InsetName("include", Inset::INCLUDE_CODE),
-               InsetName("graphics", Inset::GRAPHICS_CODE),
-               InsetName("bibitem", Inset::BIBITEM_CODE),
-               InsetName("bibtex", Inset::BIBTEX_CODE),
-               InsetName("text", Inset::TEXT_CODE),
-               InsetName("ert", Inset::ERT_CODE),
-               InsetName("foot", Inset::FOOT_CODE),
-               InsetName("margin", Inset::MARGIN_CODE),
-               InsetName("float", Inset::FLOAT_CODE),
-               InsetName("wrap", Inset::WRAP_CODE),
-               InsetName("specialchar", Inset::SPECIALCHAR_CODE),
-               InsetName("tabular", Inset::TABULAR_CODE),
-               InsetName("external", Inset::EXTERNAL_CODE),
-               InsetName("caption", Inset::CAPTION_CODE),
-               InsetName("mathmacro", Inset::MATHMACRO_CODE),
-               InsetName("cite", Inset::CITE_CODE),
-               InsetName("float_list", Inset::FLOAT_LIST_CODE),
-               InsetName("index_print", Inset::INDEX_PRINT_CODE),
-               InsetName("nomencl_print", Inset::NOMENCL_PRINT_CODE),
-               InsetName("optarg", Inset::OPTARG_CODE),
-               InsetName("environment", Inset::ENVIRONMENT_CODE),
-               InsetName("hfill", Inset::HFILL_CODE),
-               InsetName("newline", Inset::NEWLINE_CODE),
-               InsetName("line", Inset::LINE_CODE),
-               InsetName("branch", Inset::BRANCH_CODE),
-               InsetName("box", Inset::BOX_CODE),
-               InsetName("flex", Inset::FLEX_CODE),
-               InsetName("vspace", Inset::VSPACE_CODE),
-               InsetName("mathmacroarg", Inset::MATHMACROARG_CODE),
-               InsetName("listings", Inset::LISTINGS_CODE),
+               InsetName("toc", TOC_CODE),
+               InsetName("quote", QUOTE_CODE),
+               InsetName("ref", REF_CODE),
+               InsetName("href", HYPERLINK_CODE),
+               InsetName("separator", SEPARATOR_CODE),
+               InsetName("ending", ENDING_CODE),
+               InsetName("label", LABEL_CODE),
+               InsetName("note", NOTE_CODE),
+               InsetName("phantom", PHANTOM_CODE),
+               InsetName("accent", ACCENT_CODE),
+               InsetName("math", MATH_CODE),
+               InsetName("index", INDEX_CODE),
+               InsetName("nomenclature", NOMENCL_CODE),
+               InsetName("include", INCLUDE_CODE),
+               InsetName("graphics", GRAPHICS_CODE),
+               InsetName("bibitem", BIBITEM_CODE),
+               InsetName("bibtex", BIBTEX_CODE),
+               InsetName("text", TEXT_CODE),
+               InsetName("ert", ERT_CODE),
+               InsetName("foot", FOOT_CODE),
+               InsetName("margin", MARGIN_CODE),
+               InsetName("float", FLOAT_CODE),
+               InsetName("wrap", WRAP_CODE),
+               InsetName("specialchar", SPECIALCHAR_CODE),
+               InsetName("tabular", TABULAR_CODE),
+               InsetName("external", EXTERNAL_CODE),
+               InsetName("caption", CAPTION_CODE),
+               InsetName("mathmacro", MATHMACRO_CODE),
+               InsetName("citation", CITE_CODE),
+               InsetName("floatlist", FLOAT_LIST_CODE),
+               InsetName("index_print", INDEX_PRINT_CODE),
+               InsetName("nomencl_print", NOMENCL_PRINT_CODE),
+               InsetName("optarg", OPTARG_CODE),
+               InsetName("newline", NEWLINE_CODE),
+               InsetName("line", LINE_CODE),
+               InsetName("branch", BRANCH_CODE),
+               InsetName("box", BOX_CODE),
+               InsetName("flex", FLEX_CODE),
+               InsetName("space", SPACE_CODE),
+               InsetName("vspace", VSPACE_CODE),
+               InsetName("mathmacroarg", MATH_MACROARG_CODE),
+               InsetName("listings", LISTINGS_CODE),
+               InsetName("info", INFO_CODE),
+               InsetName("collapsable", COLLAPSABLE_CODE),
+               InsetName("newpage", NEWPAGE_CODE),
+               InsetName("tablecell", CELL_CODE),
+               InsetName("mathamsarray", MATH_AMSARRAY_CODE),
+               InsetName("matharray", MATH_ARRAY_CODE),
+               InsetName("mathbig", MATH_BIG_CODE),
+               InsetName("mathboldsymbol", MATH_BOLDSYMBOL_CODE),
+               InsetName("mathbox", MATH_BOX_CODE),
+               InsetName("mathbrace", MATH_BRACE_CODE),
+               InsetName("mathcases", MATH_CASES_CODE),
+               InsetName("mathchar", MATH_CHAR_CODE),
+               InsetName("mathcolor", MATH_COLOR_CODE),
+               InsetName("mathcomment", MATH_COMMENT_CODE),
+               InsetName("mathdecoration", MATH_DECORATION_CODE),
+               InsetName("mathdelim", MATH_DELIM_CODE),
+               InsetName("mathdiff", MATH_DIFF_CODE),
+               InsetName("mathdots", MATH_DOTS_CODE),
+               InsetName("mathensuremath", MATH_ENSUREMATH_CODE),
+               InsetName("mathenv", MATH_ENV_CODE),
+               InsetName("mathexfunc", MATH_EXFUNC_CODE),
+               InsetName("mathexint", MATH_EXINT_CODE),
+               InsetName("mathfont", MATH_FONT_CODE),
+               InsetName("mathfontold", MATH_FONTOLD_CODE),
+               InsetName("mathfrac", MATH_FRAC_CODE),
+               InsetName("mathgrid", MATH_GRID_CODE),
+               InsetName("math", MATH_CODE),
+               InsetName("mathhull", MATH_HULL_CODE),
+               InsetName("mathkern", MATH_KERN_CODE),
+               InsetName("mathlefteqn", MATH_LEFTEQN_CODE),
+               InsetName("mathlim", MATH_LIM_CODE),
+               InsetName("mathmatrix", MATH_MATRIX_CODE),
+               InsetName("mathmbox", MATH_MBOX_CODE),
+               InsetName("mathnest", MATH_NEST_CODE),
+               InsetName("mathnumber", MATH_NUMBER_CODE),
+               InsetName("mathoverset", MATH_OVERSET_CODE),
+               InsetName("mathpar", MATH_PAR_CODE),
+               InsetName("mathphantom", MATH_PHANTOM_CODE),
+               InsetName("mathref", MATH_REF_CODE),
+               InsetName("mathroot", MATH_ROOT_CODE),
+               InsetName("mathscript", MATH_SCRIPT_CODE),
+               InsetName("mathsize", MATH_SIZE_CODE),
+               InsetName("mathspace", MATH_SPACE_CODE),
+               InsetName("mathspecialchar", MATH_SPECIALCHAR_CODE),
+               InsetName("mathsplit", MATH_SPLIT_CODE),
+               InsetName("mathsqrt", MATH_SQRT_CODE),
+               InsetName("mathstackrel", MATH_STACKREL_CODE),
+               InsetName("mathstring", MATH_STRING_CODE),
+               InsetName("mathsubstack", MATH_SUBSTACK_CODE),
+               InsetName("mathsymbol", MATH_SYMBOL_CODE),
+               InsetName("mathtabular", MATH_TABULAR_CODE),
+               InsetName("mathunderset", MATH_UNDERSET_CODE),
+               InsetName("mathunknown", MATH_UNKNOWN_CODE),
+               InsetName("mathxarrow", MATH_XARROW_CODE),
+               InsetName("mathxyarrow", MATH_XYARROW_CODE),
+               InsetName("mathxymatrix", MATH_XYMATRIX_CODE),
+               InsetName("mathmacro", MATH_MACRO_CODE),
        };
 
-       std::size_t const insetnames_size =
+       size_t const insetnames_size =
                sizeof(insetnames) / sizeof(insetnames[0]);
 
-       std::map<std::string, Inset::Code> data;
-       for (std::size_t i = 0; i != insetnames_size; ++i) {
+       map<string, InsetCode> data;
+       for (size_t i = 0; i != insetnames_size; ++i) {
                InsetName const & var = insetnames[i];
                data[var.name] = var.code;
        }
@@ -118,8 +176,80 @@ static TranslatorMap const build_translator()
 }
 
 
-Inset::Inset()
-{}
+void Inset::setBuffer(Buffer & buffer)
+{
+       buffer_ = &buffer;
+}
+
+
+Buffer & Inset::buffer()
+{
+       if (!buffer_) {
+               odocstringstream s;
+               lyxerr << "Inset: " << this
+                                       << " LyX Code: " << lyxCode()
+                                       << " name: " << insetName(lyxCode())
+                                       << std::endl;
+               s << "LyX Code: " << lyxCode() << " name: " << name();
+               LASSERT(false, /**/);
+               throw ExceptionMessage(BufferException, 
+                       from_ascii("Inset::buffer_ member not initialized!"), s.str());
+       }
+       return *buffer_;
+}
+
+
+Buffer const & Inset::buffer() const
+{
+       return const_cast<Inset *>(this)->buffer();
+}
+
+
+bool Inset::isBufferValid() const
+{
+       return buffer_ && theBufferList().isLoaded(buffer_);
+}
+
+
+docstring Inset::name() const
+{
+       return from_ascii("unknown");
+}
+
+
+bool Inset::isFreeSpacing() const 
+{
+       return getLayout().isFreeSpacing();
+}
+
+
+bool Inset::allowEmpty() const
+{
+       return getLayout().isKeepEmpty();
+}
+
+bool Inset::forceLTR() const
+{
+       return getLayout().forceLTR();
+}
+
+void Inset::initView()
+{
+       if (isLabeled())
+               buffer().updateLabels();
+}
+
+
+docstring Inset::toolTip(BufferView const &, int, int) const
+{
+       return docstring();
+}
+
+
+docstring Inset::contextMenu(BufferView const &, int, int) const
+{
+       return docstring();
+}
 
 
 Dimension const Inset::dimension(BufferView const & bv) const
@@ -128,7 +258,7 @@ Dimension const Inset::dimension(BufferView const & bv) const
 }
 
 
-Inset::Code Inset::translate(std::string const & name)
+InsetCode insetCode(string const & name)
 {
        static TranslatorMap const translator = build_translator();
 
@@ -137,18 +267,59 @@ Inset::Code Inset::translate(std::string const & name)
 }
 
 
+string insetName(InsetCode c) 
+{
+       static TranslatorMap const translator = build_translator();
+
+       TranslatorMap::const_iterator it =  translator.begin();
+       TranslatorMap::const_iterator end = translator.end();
+       for (; it != end; ++it) {
+               if (it->second == c)
+                       return it->first;
+       }
+       return string();
+}
+
+
 void Inset::dispatch(Cursor & cur, FuncRequest & cmd)
 {
+       if (buffer_ == 0) {
+               lyxerr << "Unassigned buffer_ member in Inset::dispatch()" << std::endl;
+               lyxerr << "LyX Code: " << lyxCode() << " name: " << insetName(lyxCode()) << std::endl;
+       } else if (cur.buffer() != buffer_)
+               lyxerr << "cur.buffer() != buffer_ in Inset::dispatch()" << std::endl;
        cur.updateFlags(Update::Force | Update::FitCursor);
        cur.dispatched();
        doDispatch(cur, cmd);
 }
 
 
-void Inset::doDispatch(Cursor & cur, FuncRequest &)
+void Inset::doDispatch(Cursor & cur, FuncRequest &cmd)
 {
-       cur.noUpdate();
-       cur.undispatched();
+       switch (cmd.action) {
+       case LFUN_MOUSE_RELEASE:
+               // if the derived inset did not explicitly handle mouse_release,
+               // we assume we request the settings dialog
+               if (!cur.selection() && cmd.button() == mouse_button::button1
+                         && hasSettings()) {
+                       FuncRequest tmpcmd(LFUN_INSET_SETTINGS);
+                       dispatch(cur, tmpcmd);
+               }
+               break;
+
+       case LFUN_INSET_SETTINGS:
+               if (cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode())) {
+                       showInsetDialog(&cur.bv());
+                       cur.dispatched();
+               } else
+                       cur.undispatched();
+               break;
+
+       default:
+               cur.noUpdate();
+               cur.undispatched();
+               break;
+       }
 }
 
 
@@ -168,34 +339,42 @@ bool Inset::getStatus(Cursor &, FuncRequest const & cmd,
                // Allow modification of our data.
                // This needs to be handled in the doDispatch method of our
                // instantiatable children.
-               flag.enabled(true);
+               flag.setEnabled(true);
                return true;
 
        case LFUN_INSET_INSERT:
                // Don't allow insertion of new insets.
                // Every inset that wants to allow new insets from open
                // dialogs needs to override this.
-               flag.enabled(false);
+               flag.setEnabled(false);
                return true;
 
+       case LFUN_INSET_SETTINGS:
+               if (cmd.argument().empty() || cmd.getArg(0) == insetName(lyxCode())) {
+                       bool const enable = hasSettings();
+                       flag.setEnabled(enable);
+                       return true;
+               } else {
+                       flag.setEnabled(false);
+                       return false;
+               }
+
        default:
-               return false;
+               break;
        }
+       return false;
 }
 
 
-void Inset::edit(Cursor &, bool)
+void Inset::edit(Cursor &, bool, EntryDirection)
 {
-       LYXERR(Debug::INSETS) << BOOST_CURRENT_FUNCTION
-                             << ": edit left/right" << std::endl;
+       LYXERR(Debug::INSETS, "edit left/right");
 }
 
 
 Inset * Inset::editXY(Cursor &, int x, int y)
 {
-       LYXERR(Debug::INSETS) << BOOST_CURRENT_FUNCTION
-                             << ": x=" << x << " y= " << y
-                             << std::endl;
+       LYXERR(Debug::INSETS, "x: " << x << " y: " << y);
        return this;
 }
 
@@ -203,11 +382,9 @@ Inset * Inset::editXY(Cursor &, int x, int y)
 Inset::idx_type Inset::index(row_type row, col_type col) const
 {
        if (row != 0)
-               lyxerr << BOOST_CURRENT_FUNCTION
-                      << ": illegal row: " << row << std::endl;
+               LYXERR0("illegal row: " << row);
        if (col != 0)
-               lyxerr << BOOST_CURRENT_FUNCTION
-                      << ": illegal col: " << col << std::endl;
+               LYXERR0("illegal col: " << col);
        return 0;
 }
 
@@ -224,41 +401,53 @@ bool Inset::idxUpDown(Cursor &, bool) const
 }
 
 
-int Inset::docbook(Buffer const &,
-       odocstream &, OutputParams const &) const
+int Inset::docbook(odocstream &, OutputParams const &) const
 {
        return 0;
 }
 
 
+docstring Inset::xhtml(XHTMLStream & xs, OutputParams const &) const
+{
+       xs << "[[Inset: " << from_ascii(insetName(lyxCode())) << "]]";
+       return docstring();
+}
+
+docstring Inset::xhtml(odocstream & od, OutputParams const &) const
+{
+       od << "[[Inset: " << from_ascii(insetName(lyxCode())) << "]]";
+       return docstring();
+}
+
 bool Inset::directWrite() const
 {
        return false;
 }
 
 
-Inset::EDITABLE Inset::editable() const
+bool Inset::editable() const
 {
-       return NOT_EDITABLE;
+       return false;
 }
 
 
-bool Inset::autoDelete() const
+bool Inset::hasSettings() const
 {
        return false;
 }
 
 
-docstring const Inset::editMessage() const
+
+bool Inset::autoDelete() const
 {
-       return _("Opened inset");
+       return false;
 }
 
 
 void Inset::cursorPos(BufferView const & /*bv*/, CursorSlice const &,
                bool, int & x, int & y) const
 {
-       lyxerr << "Inset::cursorPos called directly" << std::endl;
+       LYXERR0("Inset::cursorPos called directly");
        x = 100;
        y = 100;
 }
@@ -281,8 +470,8 @@ void Inset::metricsMarkers2(Dimension & dim, int framesize) const
 
 void Inset::drawMarkers(PainterInfo & pi, int x, int y) const
 {
-       Color::color pen_color = mouseHovered() || editing(pi.base.bv)?
-               Color::mathframe : Color::mathcorners;
+       ColorCode pen_color = mouseHovered() || editing(pi.base.bv)?
+               Color_mathframe : Color_mathcorners;
 
        Dimension const dim = dimension(*pi.base.bv);
 
@@ -298,8 +487,8 @@ void Inset::drawMarkers(PainterInfo & pi, int x, int y) const
 
 void Inset::drawMarkers2(PainterInfo & pi, int x, int y) const
 {
-       Color::color pen_color = mouseHovered() || editing(pi.base.bv)?
-               Color::mathframe : Color::mathcorners;
+       ColorCode pen_color = mouseHovered() || editing(pi.base.bv)?
+               Color_mathframe : Color_mathcorners;
 
        drawMarkers(pi, x, y);
        Dimension const dim = dimension(*pi.base.bv);
@@ -313,7 +502,7 @@ void Inset::drawMarkers2(PainterInfo & pi, int x, int y) const
 }
 
 
-bool Inset::editing(BufferView * bv) const
+bool Inset::editing(BufferView const * bv) const
 {
        return bv->cursor().isInside(this);
 }
@@ -333,44 +522,44 @@ int Inset::yo(BufferView const & bv) const
 
 bool Inset::covers(BufferView const & bv, int x, int y) const
 {
-       //lyxerr << "Inset::covers, x: " << x << " y: " << y
-       //      << " xo: " << xo(bv) << " yo: " << yo()
-       //      << " x1: " << xo(bv) << " x2: " << xo() + width()
-       //      << " y1: " << yo(bv) - ascent() << " y2: " << yo() + descent()
-       //      << std::endl;
+       return bv.coordCache().getInsets().covers(this, x, y);
+}
 
-       Dimension const dim = dimension(bv);
 
-       return bv.coordCache().getInsets().has(this)
-                       && x >= xo(bv)
-                       && x <= xo(bv) + dim.width()
-                       && y >= yo(bv) - dim.ascent()
-                       && y <= yo(bv) + dim.descent();
+InsetLayout const & Inset::getLayout() const
+{
+       return buffer().params().documentClass().insetLayout(name());
 }
 
 
-InsetLayout const & Inset::getLayout(BufferParams const & bp) const
+bool Inset::undefined() const
 {
-       return bp.getTextClass().insetlayout(name());  
+       docstring const & n = getLayout().name();
+       return n.empty() || n == DocumentClass::plainInsetLayout().name();
 }
 
 
 void Inset::dump() const
 {
-       Buffer buf("foo", 1);
-       write(buf, lyxerr);
+       write(lyxerr);
 }
 
 
-Color_color Inset::backgroundColor() const
+ColorCode Inset::backgroundColor() const
 {
-       return Color::background;
+       return Color_none;
+}
+
+
+ColorCode Inset::labelColor() const
+{
+       return Color_foreground;
 }
 
 
 void Inset::setPosCache(PainterInfo const & pi, int x, int y) const
 {
-       //lyxerr << "Inset:: position cache to " << x << " " << y << std::endl;
+       //LYXERR("Inset: set position cache to " << x << " " << y);
        pi.base.bv->coordCache().insets().add(this, x, y);
 }
 
@@ -381,19 +570,15 @@ void Inset::setDimCache(MetricsInfo const & mi, Dimension const & dim) const
 }
 
 
-
-/////////////////////////////////////////
-
-bool isEditableInset(Inset const * inset)
+Buffer const * Inset::updateFrontend() const
 {
-       return inset && inset->editable();
+       return theApp() ? theApp()->updateInset(this) : 0;
 }
 
 
-bool isHighlyEditableInset(Inset const * inset)
+docstring Inset::completionPrefix(Cursor const &) const 
 {
-       return inset && inset->editable() == Inset::HIGHLY_EDITABLE;
+       return docstring();
 }
 
-
 } // namespace lyx