|
|
|
@ -5,6 +5,7 @@ import com.fr.base.BaseUtils;
|
|
|
|
|
import com.fr.base.Parameter; |
|
|
|
|
import com.fr.base.ParameterMapNameSpace; |
|
|
|
|
import com.fr.base.TableDataNameSpace; |
|
|
|
|
import com.fr.base.io.IOFile; |
|
|
|
|
import com.fr.data.TableDataSource; |
|
|
|
|
import com.fr.design.actions.UpdateAction; |
|
|
|
|
import com.fr.design.border.UIRoundedBorder; |
|
|
|
@ -27,13 +28,19 @@ import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
|
|
|
|
|
import com.fr.design.i18n.Toolkit; |
|
|
|
|
import com.fr.design.layout.FRGUIPaneFactory; |
|
|
|
|
import com.fr.design.mainframe.DesignerContext; |
|
|
|
|
import com.fr.design.mainframe.JTemplate; |
|
|
|
|
import com.fr.design.parameter.ParameterInputPane; |
|
|
|
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
import com.fr.general.FArray; |
|
|
|
|
import com.fr.log.FineLoggerFactory; |
|
|
|
|
import com.fr.main.impl.WorkBook; |
|
|
|
|
import com.fr.parser.ArrayExpression; |
|
|
|
|
import com.fr.parser.BlockIntervalLiteral; |
|
|
|
|
import com.fr.parser.ColumnRowRangeInPage; |
|
|
|
|
import com.fr.parser.FRLexer; |
|
|
|
|
import com.fr.parser.FRParser; |
|
|
|
|
import com.fr.parser.FunctionCall; |
|
|
|
|
import com.fr.parser.SheetIntervalLiteral; |
|
|
|
|
import com.fr.report.core.namespace.SimpleCellValueNameSpace; |
|
|
|
|
import com.fr.script.Calculator; |
|
|
|
|
import com.fr.script.ScriptConstants; |
|
|
|
@ -93,6 +100,7 @@ import java.io.InputStreamReader;
|
|
|
|
|
import java.io.Reader; |
|
|
|
|
import java.io.StringReader; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Arrays; |
|
|
|
|
import java.util.Collections; |
|
|
|
|
import java.util.Comparator; |
|
|
|
|
import java.util.HashMap; |
|
|
|
@ -111,6 +119,8 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
|
|
|
|
|
public static final String VALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Valid_Formula"); |
|
|
|
|
public static final String INVALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula"); |
|
|
|
|
public static final int DEFUAL_FOMULA_LENGTH = 103; |
|
|
|
|
public static final String ELLIPSIS = "..."; |
|
|
|
|
private VariableTreeAndDescriptionArea variableTreeAndDescriptionArea; |
|
|
|
|
private RSyntaxTextArea formulaTextArea; |
|
|
|
|
private UITextField keyWordTextField = new UITextField(18); |
|
|
|
@ -675,6 +685,9 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
StringBuilder errorMsg = new StringBuilder(functionName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Error_Tips") + ":"); |
|
|
|
|
for (int i = 0; i < rules.size(); i++) { |
|
|
|
|
errorMsg.append("("); |
|
|
|
|
if (rules.get(i).getParameterList().isEmpty()) { |
|
|
|
|
errorMsg.append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_No_Param")); |
|
|
|
|
} |
|
|
|
|
for (FunctionParameterType functionParameterType : rules.get(i).getParameterList()) { |
|
|
|
|
errorMsg.append(getTypeString(functionParameterType)).append(","); |
|
|
|
|
} |
|
|
|
@ -716,46 +729,75 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
@Override |
|
|
|
|
public void actionPerformed(ActionEvent e) { |
|
|
|
|
String formulaText = formulaTextArea.getText().trim(); |
|
|
|
|
String formulaValidMessage = getFormulaValidMessage(formulaText); |
|
|
|
|
if (formulaValidMessage.equals(INVALID_FORMULA)) { |
|
|
|
|
if (containsUnsupportedSimulationFormulas(formulaText)) { |
|
|
|
|
FineJOptionPane.showMessageDialog( |
|
|
|
|
FormulaPane.this, |
|
|
|
|
formulaValidMessage, |
|
|
|
|
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas"), |
|
|
|
|
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
|
|
|
|
JOptionPane.INFORMATION_MESSAGE); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
String formulaValidMessage = getFormulaValidMessage(formulaText); |
|
|
|
|
String messageTips; |
|
|
|
|
if (formulaValidMessage.equals(INVALID_FORMULA)) { |
|
|
|
|
messageTips = INVALID_FORMULA; |
|
|
|
|
} else { |
|
|
|
|
String messageTips = formulaValidMessage.equals(VALID_FORMULA) ? "" : formulaValidMessage + "\n"; |
|
|
|
|
messageTips = formulaValidMessage.equals(VALID_FORMULA) ? "" : formulaValidMessage + "\n"; |
|
|
|
|
Map<String, Object> paramsMap = setParamsIfExist(formulaText); |
|
|
|
|
Calculator calculator = Calculator.createCalculator(); |
|
|
|
|
ParameterMapNameSpace parameterMapNameSpace = ParameterMapNameSpace.create(paramsMap); |
|
|
|
|
calculator.pushNameSpace(parameterMapNameSpace); |
|
|
|
|
|
|
|
|
|
WorkBook workBook = (WorkBook) HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTarget(); |
|
|
|
|
calculator.pushNameSpace(SimpleCellValueNameSpace.getInstance()); |
|
|
|
|
TableDataSource tableDataSource = workBook.getReport(0).getTableDataSource(); |
|
|
|
|
calculator.setAttribute(TableDataSource.KEY, tableDataSource); |
|
|
|
|
JTemplate<?, ?> currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
|
|
|
if (currentEditingTemplate != null) { |
|
|
|
|
IOFile file = (IOFile) currentEditingTemplate.getTarget(); |
|
|
|
|
calculator.setAttribute(TableDataSource.KEY, file); |
|
|
|
|
calculator.pushNameSpace(TableDataNameSpace.getInstance()); |
|
|
|
|
calculator.pushNameSpace(SimpleCellValueNameSpace.getInstance()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
BaseFormula baseFormula = BaseFormula.createFormulaBuilder().build(formulaText); |
|
|
|
|
try { |
|
|
|
|
Object value = calculator.evalValue(baseFormula); |
|
|
|
|
messageTips = messageTips + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Result") + ":" + EssentialUtils.objectToString(value); |
|
|
|
|
String objectToString = EssentialUtils.objectToString(value); |
|
|
|
|
String result = objectToString.length() > DEFUAL_FOMULA_LENGTH ? |
|
|
|
|
objectToString.substring(0, DEFUAL_FOMULA_LENGTH - ELLIPSIS.length()) + ELLIPSIS : objectToString; |
|
|
|
|
messageTips = messageTips + |
|
|
|
|
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Result") + ":" + result; |
|
|
|
|
FineLoggerFactory.getLogger().info("value:{}", value); |
|
|
|
|
} catch (UtilEvalError utilEvalError) { |
|
|
|
|
FineLoggerFactory.getLogger().error("", utilEvalError); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
FineJOptionPane.showMessageDialog( |
|
|
|
|
FormulaPane.this, |
|
|
|
|
messageTips, |
|
|
|
|
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), |
|
|
|
|
JOptionPane.INFORMATION_MESSAGE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
private boolean containsUnsupportedSimulationFormulas(String formulaText) { |
|
|
|
|
try { |
|
|
|
|
Expression expression = Calculator.createCalculator().parse(formulaText); |
|
|
|
|
String name = ((FunctionCall) expression.getConditionalExpression()).getName(); |
|
|
|
|
if (UnsupportedSimulationFormulaHunter.isUnsupportedFomula(name)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
UnsupportedSimulationFormulaHunter unsupportedSimulationFormulaHunter = new UnsupportedSimulationFormulaHunter(); |
|
|
|
|
expression.traversal4Tiny(unsupportedSimulationFormulaHunter); |
|
|
|
|
return !unsupportedSimulationFormulaHunter.isSupported(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
FineLoggerFactory.getLogger().error("", e); |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Map<String, Object> setParamsIfExist(String formulaText) { |
|
|
|
|
Map<String, Object> parameterMap = new HashMap<>(); |
|
|
|
|
try { |
|
|
|
|
Expression expression = Calculator.createCalculator().parse(formulaText); |
|
|
|
|
Calculator calculator = Calculator.createCalculator(); |
|
|
|
|
Expression expression = calculator.parse(formulaText); |
|
|
|
|
ParameterCellHunter parameterCellHunter = new ParameterCellHunter(); |
|
|
|
|
expression.traversal4Tiny(parameterCellHunter); |
|
|
|
|
Parameter[] parameters = parameterCellHunter.getParameterBooty(); |
|
|
|
@ -770,10 +812,18 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
parameterMap.putAll(pPane.update()); |
|
|
|
|
} |
|
|
|
|
}).setVisible(true); |
|
|
|
|
//过滤出数组参数,如:[1,2]
|
|
|
|
|
for (Map.Entry<String, Object> entry : parameterMap.entrySet()) { |
|
|
|
|
if (entry.getValue().toString().startsWith("[") && entry.getValue().toString().startsWith("]")) { |
|
|
|
|
Expression parse = calculator.parse(entry.getValue()); |
|
|
|
|
ArrayExpression arrayExpression = (ArrayExpression) parse.getConditionalExpression(); |
|
|
|
|
FArray<Node> fArray = new FArray<>(arrayExpression.getArrays()); |
|
|
|
|
parameterMap.put(entry.getKey(), fArray); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
FineLoggerFactory.getLogger().error("", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return parameterMap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -782,7 +832,6 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
private final Set<Parameter> parameterList = new HashSet<>(); |
|
|
|
|
|
|
|
|
|
Parameter[] getParameterBooty() { |
|
|
|
|
|
|
|
|
|
return parameterList.toArray(new Parameter[0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -790,12 +839,35 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula {
|
|
|
|
|
String statement = tiny.getStatement(); |
|
|
|
|
if (StringUtils.isNotBlank(statement) && statement.startsWith(ScriptConstants.DETAIL_TAG)) { |
|
|
|
|
parameterList.add(new Parameter(statement.substring(1))); |
|
|
|
|
} else if (tiny.getClass().equals(ColumnRowRange.class)) { |
|
|
|
|
} else if (tiny.getClass() == ColumnRowRange.class || tiny.getClass() == ColumnRowRangeInPage.class || |
|
|
|
|
tiny.getClass() == SheetIntervalLiteral.class || tiny.getClass() == BlockIntervalLiteral.class) { |
|
|
|
|
parameterList.add(new Parameter(tiny.toString())); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static class UnsupportedSimulationFormulaHunter extends TinyHunter { |
|
|
|
|
public final static String[] UNSUPPORTED_FORMULAS = new String[]{"PROPORTION", "TOIMAGE", |
|
|
|
|
"WEBIMAGE", "SORT", "CROSSLAYERTOTAL", "CIRCULAR", "LAYERTOTAL", "MOM", "HIERARCHY"}; |
|
|
|
|
|
|
|
|
|
private boolean supported = true; |
|
|
|
|
|
|
|
|
|
public boolean isSupported() { |
|
|
|
|
return supported; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public void hunter4Tiny(Tiny tiny) { |
|
|
|
|
String statement = tiny.getStatement().toUpperCase(); |
|
|
|
|
if (Arrays.asList(UNSUPPORTED_FORMULAS).contains(statement)) { |
|
|
|
|
supported = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static boolean isUnsupportedFomula(String formula) { |
|
|
|
|
return Arrays.asList(UNSUPPORTED_FORMULAS).contains(formula); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public class VariableTreeAndDescriptionArea extends JPanel { |
|
|
|
|
|
|
|
|
|
private JTree variablesTree; |
|
|
|
|