From a64885d6eb8ecc74dd2c908870195dd55534b7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Thu, 14 Oct 2021 16:42:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?REPORT-59545=20=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E5=BE=88=E5=A4=9A=E6=8A=A5=E9=94=99=E6=8F=90=E7=A4=BA=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E7=9A=84=E4=BA=A4=E4=BA=92=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/formula/FormulaChecker.java | 17 +++--- .../formula/FormulaCheckerException.java | 11 ++++ .../com/fr/design/formula/FormulaPane.java | 60 ++++++++++++------- 3 files changed, 61 insertions(+), 27 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java b/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java index 093f26edf..59446169d 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaChecker.java @@ -25,7 +25,7 @@ public class FormulaChecker { private static final String INVALID_FORMULA = Toolkit.i18nText("Fine-Design_Basic_FormulaD_Invalid_Formula"); public static final String COLON = ":"; - public static String check(String formulaText) { + public static String check(String formulaText) throws FormulaCheckerException { StringReader in = new StringReader(formulaText); FRLexer lexer = new FRLexer(in); @@ -34,12 +34,15 @@ public class FormulaChecker { try { Expression expression = parser.parse(); Node node = expression.getConditionalExpression(); - return FunctionCheckerDispatcher.getInstance() - .getFunctionChecker(node) - .checkFunction(node) ? VALID_FORMULA : INVALID_FORMULA; + boolean valid = FunctionCheckerDispatcher.getInstance().getFunctionChecker(node).checkFunction(node); + if (valid) { + return VALID_FORMULA; + } else { + throw new FormulaCheckerException(INVALID_FORMULA); + } } catch (ConditionCheckWrongException cce) { String functionName = cce.getFunctionName(); - return functionName + Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Condition_Tips") + COLON; + throw new FormulaCheckerException(functionName + Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Condition_Tips") + COLON); } catch (FunctionCheckWrongException ce) { List rules = ce.getRules(); String functionName = ce.getFunctionName(); @@ -60,10 +63,10 @@ public class FormulaChecker { errorMsg.append(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Check_Or")); } } - return errorMsg.toString(); + throw new FormulaCheckerException(errorMsg.toString()); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); - return INVALID_FORMULA; + throw new FormulaCheckerException(INVALID_FORMULA); // alex:继续往下面走,expression为null时告知不合法公式 } } diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java b/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java new file mode 100644 index 000000000..42fc585cb --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaCheckerException.java @@ -0,0 +1,11 @@ +package com.fr.design.formula; + +public class FormulaCheckerException extends Exception { + public FormulaCheckerException() { + + } + + public FormulaCheckerException(String message) { + super(message); + } +} diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 447421a41..6012bba19 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -650,12 +650,14 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { public void actionPerformed(ActionEvent evt) { // Execute Formula default cell element. String formulaText = formulaTextArea.getText().trim(); - String formulaValidMessage = FormulaChecker.check(formulaText); - FineJOptionPane.showMessageDialog( - FormulaPane.this, - formulaValidMessage + ".", - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), - JOptionPane.WARNING_MESSAGE); + String formulaValidMessage; + try { + formulaValidMessage = FormulaChecker.check(formulaText); + showMessageDialog(formulaValidMessage + "."); + } catch (FormulaCheckerException e) { + formulaValidMessage = e.getMessage(); + showMessageDialog(formulaValidMessage + ".", false); + } } }; @@ -663,22 +665,26 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { @Override public void actionPerformed(ActionEvent e) { String formulaText = formulaTextArea.getText().trim(); - String formulaValidMessage = FormulaChecker.check(formulaText); - ; String unSupportFormula = containsUnsupportedSimulationFormulas(formulaText); if (unSupportFormula != null) { - FineJOptionPane.showMessageDialog( - FormulaPane.this, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), - JOptionPane.INFORMATION_MESSAGE); + showMessageDialog(Toolkit.i18nText("Fine-Design_Basic_Formula_Unsupported_Formulas") + ":" + unSupportFormula, false); return; } + + String formulaValidMessage; + boolean formulaValid; + try { + formulaValidMessage = FormulaChecker.check(formulaText); + formulaValid = true; + } catch (FormulaCheckerException formulaCheckerException) { + formulaValidMessage = formulaCheckerException.getMessage(); + formulaValid = false; + } String messageTips; - if (formulaValidMessage.equals(INVALID_FORMULA)) { + if (ComparatorUtils.equals(formulaValidMessage, INVALID_FORMULA)) { messageTips = INVALID_FORMULA; } else { - messageTips = formulaValidMessage.equals(VALID_FORMULA) ? "" : formulaValidMessage + "\n"; + messageTips = ComparatorUtils.equals(formulaValidMessage, VALID_FORMULA) ? "" : formulaValidMessage + "\n"; Map paramsMap = setParamsIfExist(formulaText); Calculator calculator = Calculator.createCalculator(); ParameterMapNameSpace parameterMapNameSpace = ParameterMapNameSpace.create(paramsMap); @@ -699,19 +705,33 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { 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; + Toolkit.i18nText("Fine-Design_Basic_Formula_Cal_Result") + ":" + result; FineLoggerFactory.getLogger().info("value:{}", value); } catch (UtilEvalError utilEvalError) { FineLoggerFactory.getLogger().error("", utilEvalError); } } + showMessageDialog(messageTips, formulaValid); + } + }; + + private void showMessageDialog(String message) { + showMessageDialog(message, true); + } + + private void showMessageDialog(String message, boolean formulaValid) { + if (formulaValid) { + FineJOptionPane.showMessageDialog( + FormulaPane.this, + message); + } else { FineJOptionPane.showMessageDialog( FormulaPane.this, - messageTips, - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), - JOptionPane.INFORMATION_MESSAGE); + message, + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + JOptionPane.WARNING_MESSAGE); } - }; + } private String containsUnsupportedSimulationFormulas(String formulaText) { try { From 10a55919ae344a8f8ee7dada36d0f0d892785160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Thu, 14 Oct 2021 17:45:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?REPORT-60900=20=E8=A7=86=E8=A7=89=E5=88=87?= =?UTF-8?q?=E5=9B=BE=E6=8F=90=E4=BE=9B=E7=9A=84=E6=9C=89=E7=82=B9=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=89=BE=E8=A7=86=E8=A7=89=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BA=86=E5=88=87=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form/layouts/images/simple_style_18.png | Bin 10548 -> 9640 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 designer-form/src/main/resources/com/fr/design/form/layouts/images/simple_style_18.png diff --git a/designer-form/src/main/resources/com/fr/design/form/layouts/images/simple_style_18.png b/designer-form/src/main/resources/com/fr/design/form/layouts/images/simple_style_18.png old mode 100644 new mode 100755 index 656494c55a8c9cbae8796d4f67ebf7e428ad1339..362a57cf5ebc72a58cdc6b4c664ad6416fa2f13c GIT binary patch literal 9640 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 WLuIq7D%|K59#~yhtzOkW>i+;ptqi>Y literal 10548 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