22#include <starmath.hrc>
30#include <document.hxx>
42#include <unordered_map>
47typedef std::tuple<std::string_view, TranslateId, std::u16string_view, TranslateId> SmElementDescr;
51const SmElementDescr s_a5UnaryBinaryOperatorsList[] =
81const SmElementDescr s_a5RelationsList[] =
122const SmElementDescr s_a5SetOperationsList[] =
150const SmElementDescr s_a5FunctionsList[] =
157 {
RID_EX, RID_EX_HELP, {}, {}},
158 {
RID_LNX, RID_LNX_HELP, {}, {}},
183const SmElementDescr s_a5OperatorsList[] =
245 {
RID_OPERX, RID_OPERX_HELP,
u"oper \xE22B <?>", {}},
246 {
RID_OPER_FROMX, RID_OPER_FROMX_HELP,
u"oper \xE22B from <?> <?>", {}},
247 {
RID_OPER_TOX, RID_OPER_TOX_HELP,
u"oper \xE22B to <?> <?>", {}},
248 {
RID_OPER_FROMTOX, RID_OPER_FROMTOX_HELP,
u"oper \xE22B from <?> to <?> <?>", {}},
251const SmElementDescr s_a5AttributesList[] =
278 {
RID_SIZEXY, RID_SIZEXY_HELP,
u"\"$1\"", STR_SIZE},
279 {
RID_FONTXY, RID_FONTXY_HELP,
u"\"$1\"", STR_FONT},
282 {
RID_COLORX_BLUE, RID_COLORX_BLUE_HELP,
u"color blue { \"$1\" }", STR_BLUE},
284 {
RID_COLORX_RED, RID_COLORX_RED_HELP,
u"color red { \"$1\" }", STR_RED},
285 {
RID_COLORX_AQUA, RID_COLORX_AQUA_HELP,
u"color aqua { \"$1\" }", STR_AQUA},
288 {
RID_COLORX_GRAY, RID_COLORX_GRAY_HELP,
u"color gray { \"$1\" }", STR_GRAY},
289 {
RID_COLORX_LIME, RID_COLORX_LIME_HELP,
u"color lime { \"$1\" }", STR_LIME},
291 {
RID_COLORX_NAVY, RID_COLORX_NAVY_HELP,
u"color navy { \"$1\" }", STR_NAVY},
295 {
RID_COLORX_TEAL, RID_COLORX_TEAL_HELP,
u"color teal { \"$1\" }", STR_TEAL},
296 {
RID_COLORX_RGB, RID_COLORX_RGB_HELP,
u"color rgb 0 0 0 { \"$1\" }", STR_RGB},
298 {
RID_COLORX_HEX, RID_COLORX_HEX_HELP,
u"color hex 000000 { \"$1\" }", STR_HEX},
301 {
RID_COLORX_MIDNIGHT, RID_COLORX_MIDNIGHT_HELP,
u"color midnightblue { \"$1\" }", STR_MIDNIGHT},
310 {
RID_COLORX_SNOW, RID_COLORX_SNOW_HELP,
u"color snow { \"$1\" }", STR_SNOW},
313const SmElementDescr s_a5BracketsList[] =
328 {
RID_SLRPARENTX, RID_SLRPARENTX_HELP,
u"left ( binom{<?>}{<?>} right )", {}},
329 {
RID_SLRBRACKETX, RID_SLRBRACKETX_HELP,
u"left [ binom{<?>}{<?>} right ]", {}},
330 {
RID_SLRDBRACKETX, RID_SLRDBRACKETX_HELP,
u"left ldbracket binom{<?>}{<?>} right rdbracket", {}},
331 {
RID_SLRBRACEX, RID_SLRBRACEX_HELP,
u"left lbrace binom{<?>}{<?>} right rbrace", {}},
332 {
RID_SLRANGLEX, RID_SLRANGLEX_HELP,
u"left langle binom{<?>}{<?>} right rangle", {}},
333 {
RID_SLMRANGLEXY, RID_SLMRANGLEXY_HELP,
u"left langle binom{<?>}{<?>} mline binom{<?>}{<?>} right rangle", {}},
334 {
RID_SLRCEILX, RID_SLRCEILX_HELP,
u"left lceil binom{<?>}{<?>} right rceil", {}},
335 {
RID_SLRFLOORX, RID_SLRFLOORX_HELP,
u"left lfloor binom{<?>}{<?>} right rfloor", {}},
336 {
RID_SLRLINEX, RID_SLRLINEX_HELP,
u"left lline binom{<?>}{<?>} right rline", {}},
337 {
RID_SLRDLINEX, RID_SLRDLINEX_HELP,
u"left ldline binom{<?>}{<?>} right rdline", {}},
339 {
RID_XOVERBRACEY, RID_XOVERBRACEY_HELP,
u"{<?><?><?>} overbrace {<?>}", {}},
348const SmElementDescr s_a5FormatsList[] =
361 {
RID_ALIGNLX, RID_ALIGNLX_HELP,
u"\"$1\"", STR_ALIGN_LEFT},
362 {
RID_ALIGNCX, RID_ALIGNCX_HELP,
u"\"$1\"", STR_ALIGN_CENTER},
363 {
RID_ALIGNRX, RID_ALIGNRX_HELP,
u"\"$1\"", STR_ALIGN_RIGHT},
370const SmElementDescr s_a5OthersList[] =
380 {
RID_RE, RID_RE_HELP, {}, {}},
381 {
RID_IM, RID_IM_HELP, {}, {}},
382 {
RID_WP, RID_WP_HELP, {}, {}},
399const SmElementDescr s_a5ExamplesList[] =
401 {
"{func e}^{i %pi} + 1 = 0", RID_EXAMPLE_EULER_IDENTITY_HELP, {}, {}},
402 {
"C = %pi cdot d = 2 cdot %pi cdot r", RID_EXAMPLE_CIRCUMFERENCE_HELP, {}, {}},
403 {
"c = sqrt{ a^2 + b^2 }", RID_EXAMPLE_PYTHAGOREAN_THEO_HELP, {}, {}},
404 {
"vec F = m times vec a", RID_EXAMPLE_2NEWTON, {}, {}},
405 {
"E = m c^2", RID_EXAMPLE_MASS_ENERGY_EQUIV_HELP, {}, {}},
406 {
"G_{%mu %nu} + %LAMBDA g_{%mu %nu}= frac{8 %pi G}{c^4} T_{%mu %nu}", RID_EXAMPLE_GENERAL_RELATIVITY_HELP, {}, {}},
407 {
"%DELTA t' = { %DELTA t } over sqrt{ 1 - v^2 over c^2 }", RID_EXAMPLE_SPECIAL_RELATIVITY_HELP, {}, {}},
408 {
"d over dt left( {partial L}over{partial dot q} right) = {partial L}over{partial q}", RID_EXAMPLE_EULER_LAGRANGE_HELP, {}, {}},
409 {
"int from a to b f'(x) dx = f(b) - f(a)", RID_EXAMPLE_FTC_HELP, {}, {}},
410 {
"ldline %delta bold{r}(t) rdline approx e^{%lambda t} ldline %delta { bold{r} }_0 rdline", RID_EXAMPLE_CHAOS_HELP, {}, {}},
411 {
"f(x) = sum from { n=0 } to { infinity } { {f^{(n)}(x_0) } over { fact{n} } (x-x_0)^n }", RID_EXAMPLE_A_TAYLOR_SERIES_HELP, {}, {}},
412 {
"f(x) = {1} over { %sigma sqrt{2 %pi} } func e^-{ {(x-%mu)^2} over {2 %sigma^2} }", RID_EXAMPLE_GAUSS_DISTRIBUTION_HELP, {}, {}},
415const std::vector<TranslateId> s_a5Categories{
416 RID_CATEGORY_UNARY_BINARY_OPERATORS,
417 RID_CATEGORY_RELATIONS,
418 RID_CATEGORY_SET_OPERATIONS,
419 RID_CATEGORY_FUNCTIONS,
420 RID_CATEGORY_OPERATORS,
421 RID_CATEGORY_ATTRIBUTES,
422 RID_CATEGORY_BRACKETS,
423 RID_CATEGORY_FORMATS,
425 RID_CATEGORY_EXAMPLES,
429constexpr std::pair<const SmElementDescr*, size_t> asPair(
const SmElementDescr (&category)[N])
431 return { category,
N };
434const std::vector<std::pair<const SmElementDescr*, size_t>> s_a5CategoryDescriptions{
435 { asPair(s_a5UnaryBinaryOperatorsList) },
436 { asPair(s_a5RelationsList) },
437 { asPair(s_a5SetOperationsList) },
438 { asPair(s_a5FunctionsList) },
439 { asPair(s_a5OperatorsList) },
440 { asPair(s_a5AttributesList) },
441 { asPair(s_a5BracketsList) },
442 { asPair(s_a5FormatsList) },
443 { asPair(s_a5OthersList) },
444 { asPair(s_a5ExamplesList) },
452 return s_a5Categories;
459 ElementData(
const OUString& aElementSource,
const OUString& aHelpText)
468 , mnCurrentSetIndex(-1)
469 , m_nSmSyntaxVersion(
SM_MOD()->GetConfig()->GetDefaultSmSyntaxVersion())
470 , mpIconView(
std::move(pIconView))
473 maParser->SetImportSymbolNames(
true);
507 : m_aAutoColor(aAutoColor)
516 for (
size_t i = 0;
i < nNodes; ++
i)
529 std::unique_ptr<SmNode> pNode =
maParser->ParseExpression(aElementVisual);
532 pDevice->SetDrawMode(DrawModeFlags::Default);
545 Size aSize = pDevice->LogicToPixel(
Size(pNode->GetWidth(), pNode->GetHeight()));
547 pDevice->SetOutputSizePixel(aSize);
550 maItemDatas.push_back(std::make_unique<ElementData>(aElementSource, aHelpText));
552 mpIconView->insert(-1,
nullptr, &aId, pDevice,
nullptr);
559 return weld::fromId<ElementData*>(itemId)->maElementSource;
564 return weld::fromId<ElementData*>(itemId)->maHelpText;
582 assert(nCategory >= 0 &&
o3tl::make_unsigned(nCategory) < s_a5CategoryDescriptions.size());
584 const auto& [aElementsArray, aElementsArraySize] = s_a5CategoryDescriptions[nCategory];
586 for (
size_t i = 0;
i < aElementsArraySize;
i++)
588 const auto& [element, elementHelp, elementVisual, visualTranslatable] = aElementsArray[
i];
595 OUString aElement(OUString::createFromAscii(element));
596 OUString aVisual(elementVisual.empty() ? aElement : OUString(elementVisual));
597 if (visualTranslatable)
598 aVisual = aVisual.replaceFirst(
"$1",
SmResId(visualTranslatable));
599 OUString aHelp(elementHelp ?
SmResId(elementHelp) : OUString());
617 throw std::range_error(
"parser version limit");
627 maParser->SetImportSymbolNames(
true);
635 if (
const OUString
id = mpIconView->get_id(iter); !
id.isEmpty())
636 return GetElementHelpText(
id);
642 if (
const OUString
id = mpIconView->get_selected_id(); !
id.isEmpty())
643 maSelectHdlLink.Call(GetElementSource(
id));
645 mpIconView->unselect_all();
IMPL_LINK(SmElementsControl, QueryTooltipHandler, const weld::TreeIter &, iter, OUString)
IMPL_LINK_NOARG(SmElementsControl, ElementActivatedHandler, weld::IconView &, bool)
const StyleSettings & GetStyleSettings() const
static const AllSettings & GetSettings()
void extendBy(tools::Long x, tools::Long y)
constexpr tools::Long Width() const
Visitor that uses DefaultVisit for handling visits by default.
virtual void DefaultVisit(SmNode *pNode)=0
Method invoked by Visit methods by default.
Visitor for drawing SmNodes to OutputDevice.
std::unique_ptr< weld::IconView > mpIconView
std::unique_ptr< AbstractSmParser > maParser
static Color GetControlBackground()
void addElements(int nCategory)
sal_uInt16 m_nSmSyntaxVersion
static OUString GetElementSource(const OUString &itemId)
SmElementsControl(std::unique_ptr< weld::IconView > pIconView)
void addElement(const OUString &aElementVisual, const OUString &aElementSource, const OUString &aHelpText)
void setElementSetIndex(int nSetIndex)
static const std::vector< TranslateId > & categories()
void setSmSyntaxVersion(sal_uInt16 nSmSyntaxVersion)
static Color GetTextColor()
std::vector< std::unique_ptr< ElementData > > maItemDatas
static OUString GetElementHelpText(const OUString &itemId)
virtual size_t GetNumSubNodes() const =0
Gets the number of subnodes.
virtual SmNode * GetSubNode(size_t nIndex)=0
Gets the subnode of index nIndex.
const SmFace & GetFont() const
Gets the font.
const Color & GetFieldTextColor() const
const Color & GetFieldColor() const
reference_type * get() const
void SetColor(const Color &)
const Color & GetColor() const
#define LINK(Instance, Class, Member)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
AbstractSmParser * GetVersionSmParser(sal_uInt16 nVersion)
OUString toId(const void *pValue)
OUString SmResId(TranslateId aId)
#define RID_XPRECEDESEQUALY
#define RID_XSETQUOTIENTY
#define RID_IIINT_FROMTOX
#define RID_COLORX_SILVER
#define RID_XINTERSECTIONY
#define RID_XPRECEDESEQUIVY
#define RID_LLINT_FROMTOX
#define RID_COLORX_ORANGE
#define RID_XNOTSUCCEEDSY
#define RID_XSUCCEEDSEQUIVY
#define RID_COLORX_SEAGREEN
#define RID_COLORX_YELLOW
#define RID_COLORX_INDIGO
#define RID_LIMSUP_FROMTOX
#define RID_COLORX_ORANGERED
#define RID_COLORX_HOTPINK
#define RID_COPROD_FROMTOX
#define RID_COLORX_MAROON
#define RID_COLORX_FUCHSIA
#define RID_LLLINT_FROMTOX
#define RID_COLORX_PURPLE
#define RID_COLORX_CRIMSON
#define RID_XNOTPRECEDESY
#define RID_COLORX_LAVENDER
#define RID_COLORX_MIDNIGHT
#define RID_COLORX_VIOLET
#define RID_LIMINF_FROMTOX
#define RID_XSUCCEEDSEQUALY
ElementData(const OUString &aElementSource, const OUString &aHelpText)