lyx_mirror/src/mathed/InsetMathHull.h

312 lines
8.4 KiB
C
Raw Normal View History

// -*- C++ -*-
/**
* \file InsetMathHull.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#ifndef MATH_HULLINSET_H
#define MATH_HULLINSET_H
#include "InsetMathGrid.h"
#include "DocIterator.h"
#include "OutputEnums.h"
#include "support/unique_ptr.h"
namespace lyx {
class InsetLabel;
class MacroNameSet;
class ParConstIterator;
class RenderPreview;
/// This provides an interface between "LyX insets" and "LyX math insets"
class InsetMathHull : public InsetMathGrid {
public:
/// How a line is numbered
enum Numbered {
/// not numbered, LaTeX code \\nonumber if line differs from inset
NONUMBER,
/// numbered, LaTeX code \\number if line differs from inset
NUMBER,
/// not numbered, LaTeX code \\notag if line differs from inset
NOTAG
};
///
explicit InsetMathHull(Buffer * buf);
///
InsetMathHull(Buffer * buf, HullType type);
///
virtual ~InsetMathHull();
///
void setBuffer(Buffer &) override;
///
void updateBuffer(ParIterator const &, UpdateType, bool const deleted = false) override;
///
2015-09-27 06:05:00 +00:00
void addToToc(DocIterator const & di, bool output_active,
UpdateType utype, TocBackend & backend) const override;
///
InsetMathHull & operator=(InsetMathHull const &);
///
mode_type currentMode() const override;
///
void metrics(MetricsInfo & mi, Dimension & dim) const override;
2017-07-03 17:45:58 +00:00
///
void drawBackground(PainterInfo & pi, int x, int y) const override;
///
void draw(PainterInfo &, int x, int y) const override;
///
void metricsT(TextMetricsInfo const & mi, Dimension & dim) const override;
///
void drawT(TextPainter &, int x, int y) const override;
///
docstring label(row_type row) const;
///
void label(row_type row, docstring const & label);
///
std::vector<InsetLabel *> const & getLabels() { return label_; }
///
ColorCode backgroundColor(PainterInfo const &) const override;
///
void numbered(row_type row, bool num) { numbered(row, num ? NUMBER : NONUMBER); }
///
void numbered(row_type row, Numbered num);
///
bool numbered(row_type row) const;
///
bool numberedType() const override;
///
bool ams() const;
///
bool outerDisplay() const;
///
CtObject getCtObject(OutputParams const &) const override;
///
void validate(LaTeXFeatures & features) const override;
/// identifies HullInset
InsetMathHull const * asHullInset() const override { return this; }
/// identifies HullInset
InsetMathHull * asHullInset() override { return this; }
/// add a row
void addRow(row_type row) override;
/// delete a row
void delRow(row_type row) override;
/// swap two rows
void swapRow(row_type row) override;
/// add a column
void addCol(col_type col) override;
/// delete a column
void delCol(col_type col) override;
/// get type
HullType getType() const override;
/// is mutation implemented for this type?
static bool isMutable(HullType type);
/// change type
void mutate(HullType newtype) override;
///
int defaultColSpace(col_type col) override;
///
int displayColSpace(col_type col) const override;
///
char defaultColAlign(col_type col) override;
///
char displayColAlign(idx_type idx) const override;
///
2020-12-26 19:04:36 +00:00
void write(TeXMathStream & os) const override;
///
void normalize(NormalStream &) const override;
///
void infoize(odocstream & os) const override;
///
void write(std::ostream & os) const override;
///
2020-12-26 19:04:36 +00:00
void header_write(TeXMathStream &) const;
///
2020-12-26 19:04:36 +00:00
void footer_write(TeXMathStream &) const;
///
void read(Lexer & lex) override;
///
bool readQuiet(Lexer & lex);
///
2017-07-03 17:45:58 +00:00
int plaintext(odocstringstream &, OutputParams const &,
size_t max_length = INT_MAX) const override;
///
void docbook(XMLStream &, OutputParams const &) const override;
///
docstring xhtml(XMLStream &, OutputParams const &) const override;
///
2020-12-26 19:02:46 +00:00
void mathmlize(MathMLStream &) const override;
///
void htmlize(HtmlStream &) const override;
///
2020-12-26 19:04:36 +00:00
void mathAsLatex(TeXMathStream &) const;
2017-07-03 17:45:58 +00:00
///
void toString(odocstream &) const override;
///
void forOutliner(docstring &, size_t const, bool const) const override;
/// get notification when the cursor leaves this inset
bool notifyCursorLeaves(Cursor const & old, Cursor & cur) override;
///
//bool insetAllowed(InsetCode code) const override;
///
void addPreview(DocIterator const & inset_pos,
graphics::PreviewLoader &) const override;
/// Recreates the preview if preview is enabled.
void reloadPreview(DocIterator const & pos) const;
///
void usedMacros(MathData const & md, DocIterator const & pos,
MacroNameSet & macros, MacroNameSet & defs) const;
///
void initUnicodeMath() const override;
/// Force inset into LTR environment if surroundings are RTL
bool forceLTR(OutputParams const &) const override { return true; }
///
void recordLocation(DocIterator const & di);
///
std::string contextMenuName() const override;
///
InsetCode lyxCode() const override { return MATH_HULL_CODE; }
///
bool canPaintChange(BufferView const &) const override;
///
bool confirmDeletion() const override { return nargs() != 1 || !cell(0).empty(); }
protected:
InsetMathHull(InsetMathHull const &);
void doDispatch(Cursor & cur, FuncRequest & cmd) override;
/// do we want to handle this event?
bool getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus & status) const override;
/// override to set to 0 for inline equation
int leftMargin() const override;
/// override to set to 0 for inline equation
int rightMargin() const override;
/// override to set to 0 for inline equation
int border() const override;
///
docstring eolString(row_type row, bool fragile, bool latex,
bool last_eoln) const override;
private:
Inset * clone() const override;
/// Prepare the preview if preview is enabled.
/// \param forexport: whether this is intended for export
/// If so, we ignore LyXRC and wait for the image to be generated.
void preparePreview(DocIterator const & pos,
bool forexport = false) const;
2017-07-03 17:45:58 +00:00
/// like reloadPreview, but forces load
/// used by image export
void loadPreview(DocIterator const & pos) const;
///
void setType(HullType type);
///
void validate1(LaTeXFeatures & features);
///
docstring nicelabel(row_type row) const;
///
void doExtern(Cursor & cur, FuncRequest & func);
///
void glueall(HullType type);
/*!
* split every row at the first relation operator.
* The number of columns must be 1. One column is added.
* The first relation operator and everything after it goes to the
* second column.
*/
void splitTo2Cols();
/*!
* split every row at the first relation operator.
* The number of columns must be < 3. One or two columns are added.
* The first relation operator goes to the second column.
* Everything after it goes to the third column.
*/
void splitTo3Cols();
/// change number of columns, split or combine columns if necessary.
void changeCols(col_type);
///
std::string standardFont() const;
Index: src/mathed/InsetMathHull.cpp =================================================================== --- src/mathed/InsetMathHull.cpp (revisione 34304) +++ src/mathed/InsetMathHull.cpp (copia locale) @@ -328,6 +328,23 @@ docstring InsetMathHull::standardFont() } +docstring InsetMathHull::standardColor() const +{ + docstring color; + switch (type_) { + case hullRegexp: + color = from_ascii("foreground"); + break; + case hullNone: + color = from_ascii("foreground"); + break; + default: + color = from_ascii("math"); + } + return color; +} + + bool InsetMathHull::previewState(BufferView * bv) const { if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) { @@ -417,8 +434,11 @@ void InsetMathHull::draw(PainterInfo & p return; } + bool const really_change_color = pi.base.font.color() == Color_none; + ColorChanger dummy0(pi.base.font, standardColor(), really_change_color); FontSetChanger dummy1(pi.base, standardFont()); StyleChanger dummy2(pi.base, display() ? LM_ST_DISPLAY : LM_ST_TEXT); + InsetMathGrid::draw(pi, x + 1, y); if (numberedType()) { Index: src/mathed/MathSupport.cpp =================================================================== --- src/mathed/MathSupport.cpp (revisione 34311) +++ src/mathed/MathSupport.cpp (copia locale) @@ -653,6 +653,13 @@ bool isMathFont(docstring const & name) } +bool isTextFont(docstring const & name) +{ + fontinfo * f = lookupFont(name); + return f && f->color_ == Color_foreground; +} + + FontInfo getFont(docstring const & name) { FontInfo font; Index: src/mathed/MathSupport.h =================================================================== --- src/mathed/MathSupport.h (revisione 34311) +++ src/mathed/MathSupport.h (copia locale) @@ -51,6 +51,8 @@ bool isFontName(docstring const & name); bool isMathFont(docstring const & name); +bool isTextFont(docstring const & name); + // converts single cell to string docstring asString(MathData const & ar); // converts single inset to string Index: src/mathed/InsetMathHull.h =================================================================== --- src/mathed/InsetMathHull.h (revisione 34304) +++ src/mathed/InsetMathHull.h (copia locale) @@ -197,6 +197,8 @@ private: void changeCols(col_type); /// docstring standardFont() const; + /// + docstring standardColor() const; /// consistency check void check() const; /// can this change its number of rows? Index: src/MetricsInfo.cpp =================================================================== --- src/MetricsInfo.cpp (revisione 34312) +++ src/MetricsInfo.cpp (copia locale) @@ -235,11 +235,15 @@ FontSetChanger::FontSetChanger(MetricsBa save_ = mb; FontSize oldsize = save_.font.size(); ColorCode oldcolor = save_.font.color(); + docstring const oldname = from_ascii(save_.fontname); mb.fontname = name; mb.font = sane_font; augmentFont(mb.font, from_ascii(name)); mb.font.setSize(oldsize); - mb.font.setColor(oldcolor); + if (string(name) != "lyxtex" + && ((isTextFont(oldname) && oldcolor != Color_foreground) + || (isMathFont(oldname) && oldcolor != Color_math))) + mb.font.setColor(oldcolor); } } @@ -252,11 +256,15 @@ FontSetChanger::FontSetChanger(MetricsBa save_ = mb; FontSize oldsize = save_.font.size(); ColorCode oldcolor = save_.font.color(); + docstring const oldname = from_ascii(save_.fontname); mb.fontname = to_utf8(name); mb.font = sane_font; augmentFont(mb.font, name); mb.font.setSize(oldsize); - mb.font.setColor(oldcolor); + if (name != "lyxtex" + && ((isTextFont(oldname) && oldcolor != Color_foreground) + || (isMathFont(oldname) && oldcolor != Color_math))) + mb.font.setColor(oldcolor); } } @@ -294,17 +302,21 @@ WidthChanger::~WidthChanger() // ///////////////////////////////////////////////////////////////////////// -ColorChanger::ColorChanger(FontInfo & font, string const & color) - : Changer<FontInfo, string>(font) +ColorChanger::ColorChanger(FontInfo & font, docstring const & color, + bool really_change_color) + : Changer<FontInfo, ColorCode>(font), change_(really_change_color) { - save_ = lcolor.getFromLyXName(color); - font.setColor(lcolor.getFromLyXName(color)); + if (change_) { + save_ = font.color(); + font.setColor(lcolor.getFromLyXName(to_utf8(color))); + } } ColorChanger::~ColorChanger() { - orig_.setColor(lcolor.getFromLyXName(save_)); + if (change_) + orig_.setColor(save_); } Index: src/MetricsInfo.h =================================================================== --- src/MetricsInfo.h (revisione 34312) +++ src/MetricsInfo.h (copia locale) @@ -222,12 +222,16 @@ public: // temporarily change the used color -class ColorChanger : public Changer<FontInfo, std::string> { +class ColorChanger : public Changer<FontInfo, ColorCode> { public: /// - ColorChanger(FontInfo & font, std::string const & color); + ColorChanger(FontInfo & font, docstring const & color, + bool really_change_color = true); /// ~ColorChanger(); +private: + /// + bool change_; }; } // namespace lyx git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34320 a592a061-630c-0410-9148-cb99ea01b6c8
2010-04-28 01:40:11 +00:00
///
ColorCode standardColor() const;
/// consistency check
void check() const;
/// does it understand tabular-feature commands?
bool allowsTabularFeatures() const;
/// can this change its number of rows?
bool rowChangeOK() const;
/// can this change its number of cols?
bool colChangeOK() const;
/// are any of the equations numbered?
bool haveNumbers() const;
/// draw four angular markers
void drawMarkers(PainterInfo & pi, int x, int y) const override;
/// "none", "simple", "display", "eqnarray",...
HullType type_;
///
std::vector<Numbered> numbered_;
///
std::vector<docstring> numbers_;
///
std::vector<InsetLabel *> label_;
///
unique_ptr<RenderPreview> preview_;
///
DocIterator docit_;
///
typedef std::map<docstring, int> CounterMap;
/// used to store current values of important counters
CounterMap counter_map;
//
// Incorporate me
//
public:
///
virtual void mutateToText();
///
bool editable() const override { return true; }
///
2017-07-03 17:45:58 +00:00
void edit(Cursor & cur, bool front,
EntryDirection entry_from = ENTRY_DIRECTION_IGNORE) override;
///
Inset * editXY(Cursor & cur, int x, int y) override;
///
RowFlags rowFlags() const override;
/// helper function
bool display() const { return rowFlags() & Display; }
///
int indent(BufferView const &) const override;
protected:
///
void handleFont(Cursor & cur, docstring const & arg,
docstring const & font);
///
void handleFont2(Cursor & cur, docstring const & arg);
///
bool previewState(BufferView const * const bv) const;
};
} // namespace lyx
#endif