tdf#130857 qt weld: Support mail merge "Server Auth" dialog
[LibreOffice.git] / include / svx / EnhancedCustomShapeFunctionParser.hxx
blob28d2491c77f826cdaa0eaa175e3325e21610582b
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
21 #define INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
23 #include <config_options.h>
24 #include <sal/config.h>
25 #include <com/sun/star/drawing/EnhancedCustomShapeParameter.hpp>
26 #include <memory>
27 #include <ostream>
28 #include <string_view>
29 #include <vector>
31 #include <svx/svxdllapi.h>
33 struct EnhancedCustomShapeEquation
35 sal_Int32 nOperation;
36 sal_Int32 nPara[ 3 ];
38 EnhancedCustomShapeEquation() :
39 nOperation ( 0 )
41 nPara[ 0 ] = nPara[ 1 ] = nPara[ 2 ] = 0;
45 class EnhancedCustomShape2d;
47 namespace EnhancedCustomShape {
49 enum class ExpressionFunct
51 Const,
53 EnumPi,
54 EnumLeft,
55 EnumTop,
56 EnumRight,
57 EnumBottom,
58 EnumXStretch,
59 EnumYStretch,
60 EnumHasStroke,
61 EnumHasFill,
62 EnumWidth,
63 EnumHeight,
64 EnumLogWidth,
65 EnumLogHeight,
66 EnumAdjustment,
67 EnumEquation,
69 UnaryAbs,
70 UnarySqrt,
71 UnarySin,
72 UnaryCos,
73 UnaryTan,
74 UnaryAtan,
75 UnaryNeg,
77 BinaryPlus,
78 BinaryMinus,
79 BinaryMul,
80 BinaryDiv,
81 BinaryMin,
82 BinaryMax,
83 BinaryAtan2,
85 TernaryIf
88 template< typename charT, typename traits >
89 inline std::basic_ostream<charT, traits> & operator <<(
90 std::basic_ostream<charT, traits> & stream, const ExpressionFunct& eFunc )
92 switch (eFunc)
94 case ExpressionFunct::Const : return stream << "const";
96 case ExpressionFunct::EnumPi : return stream << "pi";
97 case ExpressionFunct::EnumLeft : return stream << "left";
98 case ExpressionFunct::EnumTop : return stream << "top";
99 case ExpressionFunct::EnumRight : return stream << "right";
100 case ExpressionFunct::EnumBottom : return stream << "bottom";
101 case ExpressionFunct::EnumXStretch : return stream << "xstretch";
102 case ExpressionFunct::EnumYStretch : return stream << "ystretch";
103 case ExpressionFunct::EnumHasStroke : return stream << "hasstroke";
104 case ExpressionFunct::EnumHasFill : return stream << "hasfill";
105 case ExpressionFunct::EnumWidth : return stream << "width";
106 case ExpressionFunct::EnumHeight : return stream << "height";
107 case ExpressionFunct::EnumLogWidth : return stream << "logwidth";
108 case ExpressionFunct::EnumLogHeight : return stream << "logheight";
109 case ExpressionFunct::EnumAdjustment : return stream << "adjustment";
110 case ExpressionFunct::EnumEquation : return stream << "equation";
112 case ExpressionFunct::UnaryAbs : return stream << "abs";
113 case ExpressionFunct::UnarySqrt : return stream << "sqrt";
114 case ExpressionFunct::UnarySin : return stream << "sin";
115 case ExpressionFunct::UnaryCos : return stream << "cos";
116 case ExpressionFunct::UnaryTan : return stream << "tan";
117 case ExpressionFunct::UnaryAtan : return stream << "atan";
118 case ExpressionFunct::UnaryNeg : return stream << "neg";
120 case ExpressionFunct::BinaryPlus : return stream << "plus";
121 case ExpressionFunct::BinaryMinus : return stream << "minus";
122 case ExpressionFunct::BinaryMul : return stream << "mul";
123 case ExpressionFunct::BinaryDiv : return stream << "div";
124 case ExpressionFunct::BinaryMin : return stream << "min";
125 case ExpressionFunct::BinaryMax : return stream << "max";
126 case ExpressionFunct::BinaryAtan2 : return stream << "atan2";
128 case ExpressionFunct::TernaryIf : return stream << "if";
130 default: return stream << "?(" << static_cast<int>(eFunc) << ")";
134 #define EXPRESSION_FLAG_SUMANGLE_MODE 1
136 SVXCORE_DLLPUBLIC void FillEquationParameter( const css::drawing::EnhancedCustomShapeParameter&, const sal_Int32, EnhancedCustomShapeEquation& );
138 class SAL_DLLPUBLIC_RTTI ExpressionNode
140 public:
141 virtual ~ExpressionNode();
143 /** Predicate whether this node is constant.
145 This predicate returns true, if this node is
146 neither time- nor ViewInfo dependent. This allows
147 for certain optimizations, i.e. not the full
148 expression tree needs be represented by
149 ExpressionNodes.
151 @returns true, if the note is constant
153 virtual bool isConstant() const = 0;
155 /** Operator to calculate function value.
157 This method calculates the function value.
159 virtual double operator()() const = 0;
161 /** Operator to retrieve the type of expression node
163 virtual ExpressionFunct getType() const = 0;
165 /** Operator to retrieve the ms version of expression
167 virtual css::drawing::EnhancedCustomShapeParameter fillNode(
168 std::vector< EnhancedCustomShapeEquation >& rEquations, ExpressionNode* pOptionalArg, sal_uInt32 nFlags ) = 0;
171 /** This exception is thrown, when the arithmetic expression
172 parser failed to parse a string.
174 struct ParseError
176 ParseError( const char* ) {}
179 class FunctionParser
181 public:
183 /** Parse a string
185 The following grammar is accepted by this method:
186 <code>
188 number_digit = '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
190 number = number number_digit | number_digit
192 identifier = 'pi'|'left'|'top'|'right'|'bottom'|'xstretch'|'ystretch'|
193 'hasstroke'|'hasfill'|'width'|'height'|'logwidth'|'logheight'
195 unary_function = 'abs'|'sqrt'|'sin'|'cos'|'tan'|'atan'
196 binary_function = 'min'|'max'|'atan2'
197 ternary_function = 'if'
199 function_reference = '?' 'a-z,A-Z,0-9' ' '
200 modifier_reference = '$' '0-9' ' '
202 basic_expression =
203 number |
204 identifier |
205 function_reference |
206 unary_function '(' additive_expression ')' |
207 binary_function '(' additive_expression ',' additive_expression ')' |
208 ternary_function '(' additive_expression ',' additive_expression ',
209 ' additive_expression ')' | '(' additive_expression ')'
211 unary_expression = '-' basic_expression
213 multiplicative_expression =
214 basic_expression |
215 multiplicative_expression '*' basic_expression |
216 multiplicative_expression '/' basic_expression
218 additive_expression =
219 multiplicative_expression |
220 additive_expression '+' multiplicative_expression |
221 additive_expression '-' multiplicative_expression
223 </code>
225 @param rFunction
226 The string to parse
228 @param rCustoShape
229 The CustomShape is required for calculation of dynamic values such
230 "hasstroke", function references and or modifier references ...
232 @throws ParseError if an invalid expression is given.
234 @return the generated function object.
237 UNLESS_MERGELIBS(SVXCORE_DLLPUBLIC) static std::shared_ptr<ExpressionNode> const & parseFunction( std::u16string_view rFunction, const EnhancedCustomShape2d& rCustoShape );
239 // this is a singleton
240 FunctionParser() = delete;
241 FunctionParser(const FunctionParser&) = delete;
242 FunctionParser& operator=( const FunctionParser& ) = delete;
247 #endif // INCLUDED_SVX_ENHANCEDCUSTOMSHAPEFUNCTIONPARSER_HXX
249 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */