diff --git a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java index a7a513a..1ac6fde 100644 --- a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java +++ b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java @@ -308,20 +308,15 @@ public abstract class BaseFormulaPane extends FurtherBasi // Execute Formula default cell element. String formulaText = formulaTextArea.getText().trim(); if (StringUtils.isNotEmpty(formulaText)) { - Calculator calculator = Calculator.createCalculator(); - Expression expression = null; - try { - expression = calculator.parse(formulaText); - } catch (ANTLRException e) { - FRLogger.getLogger().error(e.getMessage(), e); - } JOptionPane.showMessageDialog( BaseFormulaPane.this, - (expression != null ? Inter.getLocText("Plugin-Design_Basic_FormulaD_Valid_Formula") : Inter.getLocText("Plugin-Design_Basic_FormulaD_Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME, + (isValidFormula(formulaText) ? Inter.getLocText("Plugin-Design_Basic_FormulaD_Valid_Formula") : Inter.getLocText("Plugin-Design_Basic_FormulaD_Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME, JOptionPane.INFORMATION_MESSAGE); } } + protected abstract boolean isValidFormula(String formulaText); + public void onSearch() { formulaTextArea.requestFocusInWindow(); } diff --git a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java index d662fe0..1635d3b 100644 --- a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java +++ b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java @@ -4,9 +4,12 @@ import com.fr.base.Formula; import com.fr.base.Parameter; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; +import com.fr.general.FRLogger; import com.fr.script.Calculator; import com.fr.solution.plugin.design.formula.ui.type.BaseFormulaPane; import com.fr.stable.StringUtils; +import com.fr.stable.script.Expression; +import com.fr.third.antlr.ANTLRException; import java.util.Set; @@ -41,6 +44,7 @@ public class BasicFormulaPane extends BaseFormulaPane { return formula; } + @Override protected RSyntaxTextArea createContentEditor() { RSyntaxTextArea formulaTextArea = new RSyntaxTextArea(); @@ -62,6 +66,18 @@ public class BasicFormulaPane extends BaseFormulaPane { formulaTextArea.setLineWrap(true); } + @Override + protected boolean isValidFormula(String formulaText) { + Formula formula = createFormula(formulaText); + Expression expression = null; + try { + expression = formula.parse(Calculator.createCalculator()); + } catch (ANTLRException e) { + FRLogger.getLogger().error(e.getMessage(), e); + } + return expression != null; + } + @Override public Parameter[] analyze4Parameters(Calculator calculator) { Formula formula = updateBean(); diff --git a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java index 43a3c70..8cee59a 100644 --- a/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java +++ b/src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java @@ -3,15 +3,27 @@ package com.fr.solution.plugin.design.formula.ui.type.impl; import com.fr.base.Parameter; import com.fr.base.ParameterHelper; import com.fr.base.ScriptFormula; +import com.fr.base.TemplateUtils; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea; import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants; +import com.fr.general.FRLogger; import com.fr.general.Inter; import com.fr.script.Calculator; +import com.fr.script.ScriptFactory; import com.fr.solution.plugin.design.formula.ui.type.BaseFormulaPane; import com.fr.stable.StringUtils; +import javax.script.ScriptException; +import java.util.HashMap; +import java.util.Map; + public class ScriptFormulaPane extends BaseFormulaPane { + private static final String FUN_TPL = "(function() {\n" + + " var array = function(str) {return str ? str.split(\",\") : [];},int = function(str) {return parseInt(str);},number = function(str) {return parseFloat(str);};\n" + + " %s\n" + + "})();"; + @Override protected RSyntaxTextArea createContentEditor() { RSyntaxTextArea formulaTextArea = new RSyntaxTextArea(); @@ -67,6 +79,35 @@ public class ScriptFormulaPane extends BaseFormulaPane { return "'${" + text + "}'"; } + @Override + protected boolean isValidFormula(String formulaText) { + Calculator calculator = Calculator.createCalculator(); + ScriptFormula formula = createFormula(formulaText); + Parameter[] parameters = analyze4Parameters(calculator); + + Map map = new HashMap(); + for (Parameter parameter : parameters) { + String name = parameter.getName(); + Object value = parameter.getValue(); + if (value instanceof Boolean) { + map.put(name, true); + } else if (value instanceof Number) { + map.put(name, 1); + } else { + map.put(name, "1"); + } + } + + try { + String content = TemplateUtils.renderParameter4Tpl(formula.getPureContent(), map); + ScriptFactory.newSingletonScriptEngine().eval(String.format(FUN_TPL, content)); + } catch (Exception e) { + FRLogger.getLogger().error(e.getMessage(), e); + return false; + } + return true; + } + @Override public Parameter[] analyze4Parameters(Calculator calculator) { ScriptFormula scriptFormula = updateBean();