X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInset.cpp;h=0935b06278fb2c65c168e51ff912080f8a071714;hb=c7d29be153debac82e3d2e8865fcc849f0a5f40d;hp=58be78c951fe5870ce1b338fd556f1e821d13900;hpb=0585f2b2b4be956c8eef2e57dda4d6205d711f8f;p=lyx.git diff --git a/src/insets/Inset.cpp b/src/insets/Inset.cpp index 58be78c951..0935b06278 100644 --- a/src/insets/Inset.cpp +++ b/src/insets/Inset.cpp @@ -28,8 +28,10 @@ #include "FuncRequest.h" #include "FuncStatus.h" #include "MetricsInfo.h" +#include "output_xhtml.h" #include "Text.h" #include "TextClass.h" +#include "TocBackend.h" #include "frontends/Application.h" #include "frontends/Painter.h" @@ -49,76 +51,133 @@ namespace lyx { class InsetName { public: - InsetName(string const & n, InsetCode c) : name(n), code(c) {} + InsetName(string const & n = string(), docstring const & dn = docstring()) + : name(n), display_name(dn) {} string name; - InsetCode code; + docstring display_name; }; -typedef map TranslatorMap; - - -static TranslatorMap const build_translator() -{ - InsetName const insetnames[] = { - 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", MATHMACROARG_CODE), - InsetName("listings", LISTINGS_CODE), - InsetName("info", INFO_CODE), - InsetName("collapsable", COLLAPSABLE_CODE), - InsetName("newpage", NEWPAGE_CODE), - InsetName("tablecell", CELL_CODE) - }; - - size_t const insetnames_size = - sizeof(insetnames) / sizeof(insetnames[0]); - - map data; - for (size_t i = 0; i != insetnames_size; ++i) { - InsetName const & var = insetnames[i]; - data[var.name] = var.code; - } - - return data; +static InsetName insetnames[INSET_CODE_SIZE]; + + +// This list should be kept in sync with the list of dialogs in +// src/frontends/qt4/GuiView.cpp, I.e., if a dialog goes with an +// inset, the dialog should have the same name as the inset. +// Changes should be also recorded in LFUN_DIALOG_SHOW doxygen +// docs in LyXAction.cpp. +static void build_translator() +{ + static bool passed = false; + if (passed) + return; + insetnames[TOC_CODE] = InsetName("toc"); + insetnames[QUOTE_CODE] = InsetName("quote"); + insetnames[REF_CODE] = InsetName("ref"); + insetnames[HYPERLINK_CODE] = InsetName("href"); + insetnames[SEPARATOR_CODE] = InsetName("separator"); + insetnames[ENDING_CODE] = InsetName("ending"); + insetnames[LABEL_CODE] = InsetName("label"); + insetnames[NOTE_CODE] = InsetName("note"); + insetnames[PHANTOM_CODE] = InsetName("phantom"); + insetnames[ACCENT_CODE] = InsetName("accent"); + insetnames[MATH_CODE] = InsetName("math"); + insetnames[INDEX_CODE] = InsetName("index"); + insetnames[NOMENCL_CODE] = InsetName("nomenclature"); + insetnames[INCLUDE_CODE] = InsetName("include"); + insetnames[GRAPHICS_CODE] = InsetName("graphics"); + insetnames[BIBITEM_CODE] = InsetName("bibitem", _("Bibliography Entry")); + insetnames[BIBTEX_CODE] = InsetName("bibtex"); + insetnames[TEXT_CODE] = InsetName("text"); + insetnames[ERT_CODE] = InsetName("ert", _("TeX Code")); + insetnames[FOOT_CODE] = InsetName("foot"); + insetnames[MARGIN_CODE] = InsetName("margin"); + insetnames[FLOAT_CODE] = InsetName("float", _("Float")); + insetnames[WRAP_CODE] = InsetName("wrap"); + insetnames[SPECIALCHAR_CODE] = InsetName("specialchar"); + insetnames[IPA_CODE] = InsetName("ipa"); + insetnames[IPACHAR_CODE] = InsetName("ipachar"); + insetnames[IPADECO_CODE] = InsetName("ipadeco"); + insetnames[TABULAR_CODE] = InsetName("tabular", _("Table")); + insetnames[EXTERNAL_CODE] = InsetName("external"); + insetnames[CAPTION_CODE] = InsetName("caption"); + insetnames[MATHMACRO_CODE] = InsetName("mathmacro"); + insetnames[CITE_CODE] = InsetName("citation"); + insetnames[FLOAT_LIST_CODE] = InsetName("floatlist"); + insetnames[INDEX_PRINT_CODE] = InsetName("index_print"); + insetnames[NOMENCL_PRINT_CODE] = InsetName("nomencl_print"); + insetnames[ARG_CODE] = InsetName("optarg"); + insetnames[NEWLINE_CODE] = InsetName("newline"); + insetnames[LINE_CODE] = InsetName("line"); + insetnames[BRANCH_CODE] = InsetName("branch", _("Branch")); + insetnames[BOX_CODE] = InsetName("box", _("Box")); + insetnames[FLEX_CODE] = InsetName("flex"); + insetnames[SPACE_CODE] = InsetName("space", _("Horizontal Space")); + insetnames[VSPACE_CODE] = InsetName("vspace", _("Vertical Space")); + insetnames[MATH_MACROARG_CODE] = InsetName("mathmacroarg"); + insetnames[LISTINGS_CODE] = InsetName("listings"); + insetnames[INFO_CODE] = InsetName("info", _("Info")); + insetnames[COLLAPSIBLE_CODE] = InsetName("collapsible"); + insetnames[NEWPAGE_CODE] = InsetName("newpage"); + insetnames[SCRIPT_CODE] = InsetName("script"); + insetnames[CELL_CODE] = InsetName("tablecell"); + insetnames[MATH_AMSARRAY_CODE] = InsetName("mathamsarray"); + insetnames[MATH_ARRAY_CODE] = InsetName("matharray"); + insetnames[MATH_BIG_CODE] = InsetName("mathbig"); + insetnames[MATH_BOLDSYMBOL_CODE] = InsetName("mathboldsymbol"); + insetnames[MATH_BOX_CODE] = InsetName("mathbox"); + insetnames[MATH_BRACE_CODE] = InsetName("mathbrace"); + insetnames[MATH_CANCEL_CODE] = InsetName("mathcancel"); + insetnames[MATH_CANCELTO_CODE] = InsetName("mathcancelto"); + insetnames[MATH_CASES_CODE] = InsetName("mathcases"); + insetnames[MATH_CHAR_CODE] = InsetName("mathchar"); + insetnames[MATH_COLOR_CODE] = InsetName("mathcolor"); + insetnames[MATH_COMMENT_CODE] = InsetName("mathcomment"); + insetnames[MATH_DECORATION_CODE] = InsetName("mathdecoration"); + insetnames[MATH_DELIM_CODE] = InsetName("mathdelim"); + insetnames[MATH_DIFF_CODE] = InsetName("mathdiff"); + insetnames[MATH_DOTS_CODE] = InsetName("mathdots"); + insetnames[MATH_ENSUREMATH_CODE] = InsetName("mathensuremath"); + insetnames[MATH_ENV_CODE] = InsetName("mathenv"); + insetnames[MATH_EXFUNC_CODE] = InsetName("mathexfunc"); + insetnames[MATH_EXINT_CODE] = InsetName("mathexint"); + insetnames[MATH_FONT_CODE] = InsetName("mathfont"); + insetnames[MATH_FONTOLD_CODE] = InsetName("mathfontold"); + insetnames[MATH_FRAC_CODE] = InsetName("mathfrac"); + insetnames[MATH_GRID_CODE] = InsetName("mathgrid"); + insetnames[MATH_CODE] = InsetName("math"); + insetnames[MATH_HULL_CODE] = InsetName("mathhull"); + insetnames[MATH_KERN_CODE] = InsetName("mathkern"); + insetnames[MATH_LEFTEQN_CODE] = InsetName("mathlefteqn"); + insetnames[MATH_LIM_CODE] = InsetName("mathlim"); + insetnames[MATH_MATRIX_CODE] = InsetName("mathmatrix"); + insetnames[MATH_MBOX_CODE] = InsetName("mathmbox"); + insetnames[MATH_NEST_CODE] = InsetName("mathnest"); + insetnames[MATH_NUMBER_CODE] = InsetName("mathnumber"); + insetnames[MATH_OVERSET_CODE] = InsetName("mathoverset"); + insetnames[MATH_PAR_CODE] = InsetName("mathpar"); + insetnames[MATH_PHANTOM_CODE] = InsetName("mathphantom"); + insetnames[MATH_REF_CODE] = InsetName("mathref"); + insetnames[MATH_ROOT_CODE] = InsetName("mathroot"); + insetnames[MATH_SCRIPT_CODE] = InsetName("mathscript"); + insetnames[MATH_SIZE_CODE] = InsetName("mathsize"); + insetnames[MATH_SPACE_CODE] = InsetName("mathspace", _("Horizontal Math Space")); + insetnames[MATH_SPECIALCHAR_CODE] = InsetName("mathspecialchar"); + insetnames[MATH_SPLIT_CODE] = InsetName("mathsplit"); + insetnames[MATH_SQRT_CODE] = InsetName("mathsqrt"); + insetnames[MATH_STACKREL_CODE] = InsetName("mathstackrel"); + insetnames[MATH_STRING_CODE] = InsetName("mathstring"); + insetnames[MATH_SUBSTACK_CODE] = InsetName("mathsubstack"); + insetnames[MATH_SYMBOL_CODE] = InsetName("mathsymbol"); + insetnames[MATH_TABULAR_CODE] = InsetName("mathtabular"); + insetnames[MATH_UNDERSET_CODE] = InsetName("mathunderset"); + insetnames[MATH_UNKNOWN_CODE] = InsetName("mathunknown"); + insetnames[MATH_XARROW_CODE] = InsetName("mathxarrow"); + insetnames[MATH_XYMATRIX_CODE] = InsetName("mathxymatrix"); + insetnames[MATH_DIAGRAM_CODE] = InsetName("mathdiagram"); + insetnames[MATH_MACRO_CODE] = InsetName("mathmacro"); + + passed = true; } @@ -128,14 +187,22 @@ void Inset::setBuffer(Buffer & buffer) } +void Inset::resetBuffer() +{ + buffer_ = nullptr; +} + + Buffer & Inset::buffer() { if (!buffer_) { odocstringstream s; - lyxerr << "LyX Code: " << lyxCode() << " name: " << name() << std::endl; - s << "LyX Code: " << lyxCode() << " name: " << name(); - LASSERT(false, /**/); - throw ExceptionMessage(BufferException, + string const iname = insetName(lyxCode()); + LYXERR0("Inset: " << this << " LyX Code: " << lyxCode() + << " name: " << iname); + s << "LyX Code: " << lyxCode() << " name: " << from_ascii(iname); + LATTEST(false); + throw ExceptionMessage(BufferException, from_ascii("Inset::buffer_ member not initialized!"), s.str()); } return *buffer_; @@ -148,19 +215,26 @@ Buffer const & Inset::buffer() const } -bool Inset::isBufferValid() const +bool Inset::isBufferLoaded() const { return buffer_ && theBufferList().isLoaded(buffer_); } -docstring Inset::name() const +bool Inset::isBufferValid() const +{ + return buffer_ + && (isBufferLoaded() || buffer_->isInternal() || buffer_->isClone()); +} + + +docstring Inset::layoutName() const { return from_ascii("unknown"); } -bool Inset::isFreeSpacing() const +bool Inset::isFreeSpacing() const { return getLayout().isFreeSpacing(); } @@ -171,15 +245,16 @@ bool Inset::allowEmpty() const return getLayout().isKeepEmpty(); } -bool Inset::forceLTR() const + +bool Inset::forceLTR(OutputParams const &) const { return getLayout().forceLTR(); } -void Inset::initView() + +bool Inset::isInToc() const { - if (isLabeled()) - buffer().updateLabels(); + return getLayout().isInToc(); } @@ -189,9 +264,20 @@ docstring Inset::toolTip(BufferView const &, int, int) const } -docstring Inset::contextMenu(BufferView const &, int, int) const +void Inset::forOutliner(docstring &, size_t const, bool const) const { - return docstring(); +} + + +string Inset::contextMenu(BufferView const &, int, int) const +{ + return contextMenuName(); +} + + +string Inset::contextMenuName() const +{ + return string(); } @@ -203,44 +289,74 @@ Dimension const Inset::dimension(BufferView const & bv) const InsetCode insetCode(string const & name) { - static TranslatorMap const translator = build_translator(); - - TranslatorMap::const_iterator it = translator.find(name); - return it == translator.end() ? NO_CODE : it->second; + build_translator(); + for (int i = 1; i != int(INSET_CODE_SIZE); ++i) { + if (insetnames[i].name == name) + return InsetCode(i); + } + return NO_CODE; } -string insetName(InsetCode c) +string insetName(InsetCode c) { - static TranslatorMap const translator = build_translator(); + build_translator(); + return insetnames[c].name; +} - 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(); + +docstring insetDisplayName(InsetCode c) +{ + build_translator(); + return insetnames[c].display_name; } void Inset::dispatch(Cursor & cur, FuncRequest & cmd) { - LASSERT(cur.buffer() == &buffer(), return); - cur.updateFlags(Update::Force | Update::FitCursor); + 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.screenUpdateFlags(Update::Force | Update::FitCursor); cur.dispatched(); doDispatch(cur, cmd); } +bool Inset::showInsetDialog(BufferView * bv) const +{ + InsetCode const code = lyxCode(); + switch (code){ + case ERT_CODE: + case FLOAT_CODE: + case BOX_CODE: + case BIBITEM_CODE: + case BRANCH_CODE: + case INFO_CODE: + case MATH_SPACE_CODE: + case SPACE_CODE: + case TABULAR_CODE: + case VSPACE_CODE: + bv->showDialog(insetName(code)); + break; + default: + return false; + } + return true; +} + + void Inset::doDispatch(Cursor & cur, FuncRequest &cmd) { - switch (cmd.action) { + 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()) { + && clickable(cur.bv(), cmd.x(), cmd.y()) && hasSettings()) { FuncRequest tmpcmd(LFUN_INSET_SETTINGS); dispatch(cur, tmpcmd); } @@ -255,7 +371,7 @@ void Inset::doDispatch(Cursor & cur, FuncRequest &cmd) break; default: - cur.noUpdate(); + cur.noScreenUpdate(); cur.undispatched(); break; } @@ -269,11 +385,11 @@ bool Inset::getStatus(Cursor &, FuncRequest const & cmd, // be applied. This is either changed to LFUN_INSET_MODIFY (if the // dialog belongs to us) or LFUN_INSET_INSERT (if the dialog does // not belong to us, i. e. the dialog was open, and the user moved - // the cursor in our inset) in LyXFunc::getStatus(). + // the cursor in our inset) in lyx::getStatus(). // Dialogs::checkStatus() ensures that the dialog is deactivated if // LFUN_INSET_APPLY is disabled. - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: // Allow modification of our data. // This needs to be handled in the doDispatch method of our @@ -294,10 +410,19 @@ bool Inset::getStatus(Cursor &, FuncRequest const & cmd, flag.setEnabled(enable); return true; } else { - flag.setEnabled(false); return false; } + case LFUN_IN_MATHMACROTEMPLATE: + // By default we're not in a InsetMathMacroTemplate inset + flag.setEnabled(false); + return true; + + case LFUN_IN_IPA: + // By default we're not in an IPA inset + flag.setEnabled(false); + return true; + default: break; } @@ -346,12 +471,13 @@ int Inset::docbook(odocstream &, OutputParams const &) const } -docstring Inset::xhtml(odocstream & od, OutputParams const &) const +docstring Inset::xhtml(XHTMLStream & xs, OutputParams const &) const { - od << "[[Inset: " << from_ascii(insetName(lyxCode())) << "]]"; + xs << "[[Inset: " << from_ascii(insetName(lyxCode())) << "]]"; return docstring(); } + bool Inset::directWrite() const { return false; @@ -401,9 +527,19 @@ void Inset::metricsMarkers2(Dimension & dim, int framesize) const } +void Inset::drawBackground(PainterInfo & pi, int x, int y) const +{ + if (pi.full_repaint && backgroundColor(pi) == Color_none) + return; + Dimension const dim = dimension(*pi.base.bv); + pi.pain.fillRectangle(x, y - dim.asc, dim.wid, dim.asc + dim.des, + pi.backgroundColor(this)); +} + + void Inset::drawMarkers(PainterInfo & pi, int x, int y) const { - ColorCode pen_color = mouseHovered() || editing(pi.base.bv)? + ColorCode pen_color = mouseHovered(pi.base.bv) || editing(pi.base.bv)? Color_mathframe : Color_mathcorners; Dimension const dim = dimension(*pi.base.bv); @@ -414,24 +550,6 @@ void Inset::drawMarkers(PainterInfo & pi, int x, int y) const pi.pain.line(t, d - 3, t, d, pen_color); pi.pain.line(x, d, x + 3, d, pen_color); pi.pain.line(t - 3, d, t, d, pen_color); - setPosCache(pi, x, y); -} - - -void Inset::drawMarkers2(PainterInfo & pi, int x, int y) const -{ - ColorCode pen_color = mouseHovered() || editing(pi.base.bv)? - Color_mathframe : Color_mathcorners; - - drawMarkers(pi, x, y); - Dimension const dim = dimension(*pi.base.bv); - int const t = x + dim.width() - 1; - int const a = y - dim.ascent(); - pi.pain.line(x, a + 3, x, a, pen_color); - pi.pain.line(t, a + 3, t, a, pen_color); - pi.pain.line(x, a, x + 3, a, pen_color); - pi.pain.line(t - 3, a, t, a, pen_color); - setPosCache(pi, x, y); } @@ -461,7 +579,9 @@ bool Inset::covers(BufferView const & bv, int x, int y) const InsetLayout const & Inset::getLayout() const { - return buffer().params().documentClass().insetLayout(name()); + if (!buffer_) + return DocumentClass::plainInsetLayout(); + return buffer().params().documentClass().insetLayout(layoutName()); } @@ -478,7 +598,7 @@ void Inset::dump() const } -ColorCode Inset::backgroundColor() const +ColorCode Inset::backgroundColor(PainterInfo const & /*pi*/) const { return Color_none; } @@ -490,26 +610,25 @@ ColorCode Inset::labelColor() const } -void Inset::setPosCache(PainterInfo const & pi, int x, int y) const -{ - //LYXERR("Inset: set position cache to " << x << " " << y); - pi.base.bv->coordCache().insets().add(this, x, y); -} - - -void Inset::setDimCache(MetricsInfo const & mi, Dimension const & dim) const +Buffer const * Inset::updateFrontend() const { - mi.base.bv->coordCache().insets().add(this, dim); + //FIXME (Abdel 03/12/10): see bugs #6814 and #6949 + // If the Buffer is null and we end up here this is most probably because we + // are in the CutAndPaste stack. See InsetGraphics, RenderGraphics and + // RenderPreview. + if (!buffer_) + return 0; + return theApp() ? theApp()->updateInset(this) : 0; } -Buffer const * Inset::updateFrontend() const +bool Inset::resetFontEdit() const { - return theApp() ? theApp()->updateInset(this) : 0; + return getLayout().resetsFont() || !inheritFont(); } -docstring Inset::completionPrefix(Cursor const &) const +docstring Inset::completionPrefix(Cursor const &) const { return docstring(); }