Browse Source

示例问题

9.0
RichieJi 6 years ago
parent
commit
97486565b5
  1. 2
      build.xml
  2. 63
      readme.md
  3. BIN
      screenshots/input.png
  4. BIN
      screenshots/preview.png
  5. BIN
      screenshots/result.png
  6. BIN
      screenshots/show.png
  7. BIN
      screenshots/tpl.png
  8. 40
      src/com/fr/solution/plugin/design/formula/ui/GroupFormulaPane.java
  9. 6
      src/com/fr/solution/plugin/design/formula/ui/type/CategoryFormulaPane.java
  10. 4
      src/com/fr/solution/plugin/design/formula/ui/type/CommonEvent.java
  11. 18
      src/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java
  12. 12
      src/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java

2
build.xml

@ -112,6 +112,6 @@
<include name="${plugin-folder}/plugin.xml"/>
</zip>
<xmlproperty file="${basedir}/plugin.xml"/>
<move file="${plugin-folder}.zip" todir="${destLoc}/${plugin.name}"/>
<move file="${plugin-folder}.zip" todir="${destLoc}/install"/>
</target>
</project>

63
readme.md

@ -1 +1,62 @@
# 脚本公式编辑器插件
# 增强公式编辑器插件
该插件提供两个功能:公式支持JavaScript脚本、公式支持实时查看计算结果。
## 公式编辑器视图
插件提供的公式编辑器图示如下:
![formula](screenshots/show.png)
可以在看到增加的两部分都使用红字标了出来。
## 具体使用
1、新建一个模板,在A1中设置一个值为12;
2、在B1中增加一个常规公式,内容为
```
"A1的值" + if (A1 > 10, "大于10","小于等于10")
```
3、在B2中增加一个脚本公式,内容为
```
var a1 = '${A1}';
return "A1的值" + (a1 > 10 ? "大于10" : "小于等于10");
```
模板的设置如下图所示:
![tpl](screenshots/tpl.png)
预览该模板,可以看到结果是一样的:
![preview](screenshots/preview.png)
## 实时计算
在脚本公式中,写入下面的脚本内容:
```
var a1 = ${A1};
var a2 = ${A2};
return "A1 + A2的值" + (a1 + a2 > 10 ? "大于10" : "小于等于10");
```
点击实时计算按钮,会弹出来要求输入A1和A2的值,输入后,就可以看到正确的计算结果了:
![input](screenshots/input.png)
结果为如下图所示:
![result](screenshots/result.png)
## 注意事项
常规公式和脚本公式都支持实时计算。

BIN
screenshots/input.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

BIN
screenshots/preview.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
screenshots/result.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

BIN
screenshots/show.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

BIN
screenshots/tpl.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

40
src/com/fr/solution/plugin/design/formula/ui/GroupFormulaPane.java

@ -3,6 +3,9 @@ package com.fr.solution.plugin.design.formula.ui;
import com.fr.base.BaseFormula;
import com.fr.base.BaseUtils;
import com.fr.base.FRContext;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fr.base.ParameterMapNameSpace;
import com.fr.base.io.IOFile;
import com.fr.data.TableDataSource;
import com.fr.design.actions.UpdateAction;
@ -10,6 +13,7 @@ import com.fr.design.border.UIRoundedBorder;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.BasicDialog;
import com.fr.design.dialog.BasicPane;
import com.fr.design.dialog.DialogActionAdapter;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.formula.FunctionConstants;
import com.fr.design.formula.FunctionGroup;
@ -25,6 +29,7 @@ import com.fr.design.gui.itextfield.UITextField;
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.GeneralUtils;
import com.fr.general.Inter;
@ -32,6 +37,7 @@ import com.fr.report.core.namespace.SimpleCellValueNameSpace;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.evt.OperateListener;
import com.fr.solution.plugin.design.formula.ui.type.CategoryFormulaPane;
import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.UtilEvalError;
@ -60,7 +66,9 @@ import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 组合了普通公式和脚本公式的编辑器面板
@ -321,18 +329,34 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
calculator.setAttribute(TableDataSource.class, file);
calculator.pushNameSpace(SimpleCellValueNameSpace.getInstance());
}
String message;
try {
BaseFormula formula = GroupFormulaPane.this.update();
Object result = formula.evalValue(calculator);
message = Inter.getLocText("FR-Designer_Group_Formula_Result") + ":" + GeneralUtils.objectToString(result);
} catch (UtilEvalError utilEvalError) {
message = Inter.getLocText("FR-Designer_Group_Formula_Calculate_Error") + ":" + utilEvalError.getMessage();
}
BaseFormula formula = GroupFormulaPane.this.update();
String message = calculate(formula, formulaPane.analyze4Parameters(calculator), calculator);
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), message);
}
};
private String calculate(BaseFormula formula, Parameter[] parameters, Calculator calculator) {
final Map<String, Object> parameterMap = new HashMap<String, Object>();
if (ArrayUtils.isNotEmpty(parameters)) {
final ParameterInputPane pPane = new ParameterInputPane(parameters);
pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
@Override
public void doOk() {
parameterMap.putAll(pPane.update());
}
}).setVisible(true);
}
calculator.pushNameSpace(ParameterMapNameSpace.create(parameterMap));
String message;
try {
Object result = formula.evalValue(calculator);
message = Inter.getLocText("FR-Designer_Group_Formula_Result") + ":" + GeneralUtils.objectToString(result);
} catch (UtilEvalError utilEvalError) {
message = Inter.getLocText("FR-Designer_Group_Formula_Calculate_Error") + ":" + utilEvalError.getMessage();
}
return message;
}
public class VariableTreeAndDescriptionArea extends JPanel {
private JTree variablesTree;

6
src/com/fr/solution/plugin/design/formula/ui/type/CategoryFormulaPane.java

@ -1,8 +1,10 @@
package com.fr.solution.plugin.design.formula.ui.type;
import com.fr.base.BaseFormula;
import com.fr.base.Parameter;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.gui.frpane.UIRadioPane;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.evt.OperateListener;
import com.fr.solution.plugin.design.formula.ui.type.impl.BasicFormulaPane;
import com.fr.solution.plugin.design.formula.ui.type.impl.ScriptFormulaPane;
@ -60,6 +62,10 @@ public class CategoryFormulaPane extends UIRadioPane<BaseFormula>{
}
}
public Parameter[] analyze4Parameters(Calculator calculator) {
return events.get(cardNamesPane.getSelectedIndex()).analyze4Parameters(calculator);
}
@Override
protected String title4PopupWindow() {
return "Formula";

4
src/com/fr/solution/plugin/design/formula/ui/type/CommonEvent.java

@ -1,5 +1,7 @@
package com.fr.solution.plugin.design.formula.ui.type;
import com.fr.base.Parameter;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.evt.OperateListener;
public interface CommonEvent {
@ -15,4 +17,6 @@ public interface CommonEvent {
void onSearch();
void setOperateListener(OperateListener listener);
Parameter[] analyze4Parameters(Calculator calculator);
}

18
src/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java

@ -1,11 +1,15 @@
package com.fr.solution.plugin.design.formula.ui.type.impl;
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.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.type.BaseFormulaPane;
import com.fr.stable.StringUtils;
import java.util.Set;
public class BasicFormulaPane extends BaseFormulaPane<Formula> {
@Override
@ -57,4 +61,18 @@ public class BasicFormulaPane extends BaseFormulaPane<Formula> {
formulaTextArea.setCloseMarkupTags(true);
formulaTextArea.setLineWrap(true);
}
@Override
public Parameter[] analyze4Parameters(Calculator calculator) {
Formula formula = updateBean();
if (formula == null) {
return new Parameter[0];
}
String[] arr = formula.dependence(calculator);
Parameter[] parameters = new Parameter[arr.length];
for (int i = 0, len = arr.length; i < len; i ++) {
parameters[i] = new Parameter(arr[i]);
}
return parameters;
}
}

12
src/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java

@ -1,9 +1,12 @@
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.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
import com.fr.general.Inter;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.type.BaseFormulaPane;
import com.fr.stable.StringUtils;
@ -64,6 +67,15 @@ public class ScriptFormulaPane extends BaseFormulaPane<ScriptFormula> {
return "'${" + text + "}'";
}
@Override
public Parameter[] analyze4Parameters(Calculator calculator) {
ScriptFormula scriptFormula = updateBean();
if (scriptFormula == null) {
return new Parameter[0];
}
return ParameterHelper.analyze4Parameters(scriptFormula.getContent(), true);
}
@Override
public String title4PopupWindow() {
return Inter.getLocText("FR-Designer_Group_Formula_Script_Title");

Loading…
Cancel
Save