Compare commits

...

34 Commits
9.0 ... master

Author SHA1 Message Date
richie 9381d26599 弹窗位置 3 years ago
richie a40557eb9f 兼容jdk11的显示 4 years ago
richie af8fcf04fc 改为gradle打包 4 years ago
richie 1eb3bd588b Merge branch 'master' of stan.yang/demo-formula-script into master 4 years ago
stan.yang 8f55821378 搜索方法修改 4 years ago
richie 9cc80eea9c 222 4 years ago
richie f9bb949946 11 4 years ago
richie a06d025a7a 错误修正 4 years ago
richie 8b22bef548 测试 4 years ago
richie 68417d9fde 修改 4 years ago
richie 99915e7126 更新版本 4 years ago
richie 9863bb7070 仅支持10.0 4 years ago
richie ca633300cb Merge branch 'master' of git.fanruan.com:fanruan/demo-formula-script 5 years ago
richie 248e34b8a1 bug修复 5 years ago
richie c57e33759a Merge branch 'master' of zack/demo-formula-script into master 5 years ago
zack 6690b13003 国际化多了反斜杠 5 years ago
richie de5005c774 去掉不需要的引用 5 years ago
richie e41d5bc4c9 去掉不规范的依赖 5 years ago
richie ab162f1ad2 解耦合 5 years ago
richie 9984fcc55e SDK更新 5 years ago
richie c7c409a81c 增加依赖jar 5 years ago
richie 1e9668c254 漏改的 5 years ago
richie 58abec4ff4 进一步修改增长公式编辑器插件中的内容 5 years ago
richie 5f7ca80376 Merge branch 'master' of Kalven/demo-formula-script into master 5 years ago
Kalven 75c8ce4a28 KERNEL-1117 根据finekit继续修改 5 years ago
Kalven 367a4bebaf KERNEL-1117 去掉注释 5 years ago
Kalven 47ace1db7c KERNEL-1117 去掉注释,同时根据fineKit进一步修改 5 years ago
Kalven 0b61f63497 KERNEL-1117 改回6老版本可以不过不能支持fineKit的部分 5 years ago
Kalven 27c3bd34e0 KERNEL-1117 按要求修改插件 5 years ago
Kalven 1a41e36975 KERNEL-1117 再次修改 5 years ago
Kalven 8cf21f7c40 KERNEL-1117 插件基本改写完成 5 years ago
Kalven 315f6fd730 KERNEL-1117 由于finekit改变,改变相应的地方 5 years ago
Kalven 70078b3780 KERNEL-1117 删除多余的无用代码,完善之前工作 5 years ago
Kalven 86904e54b5 KERNEL-1117 完成了插件部分SDK实现 5 years ago
  1. 123
      build.gradle
  2. 4
      build.xml
  3. 13
      encrypt.xml
  4. BIN
      lib/finekit-10.0.jar
  5. 13
      plugin.xml
  6. 15
      pom.xml
  7. 4
      readme.md
  8. 37
      src/main/java/com/fr/solution/plugin/design/formula/compat/AbstractNameAndDescription.java
  9. 7
      src/main/java/com/fr/solution/plugin/design/formula/compat/DesignToolkit.java
  10. 92
      src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionConstants.java
  11. 28
      src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionDefNAD.java
  12. 51
      src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionNAD.java
  13. 41
      src/main/java/com/fr/solution/plugin/design/formula/compat/NameAndFunctionList.java
  14. 29
      src/main/java/com/fr/solution/plugin/design/formula/compat/NameAndTypeAndFunctionList.java
  15. 159
      src/main/java/com/fr/solution/plugin/design/formula/ui/GroupFormulaPane.java
  16. 9
      src/main/java/com/fr/solution/plugin/design/formula/ui/GroupFormulaPaneWhenReserveFormula.java
  17. 35
      src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java
  18. 21
      src/main/java/com/fr/solution/plugin/design/formula/ui/type/CategoryFormulaPane.java
  19. 6
      src/main/java/com/fr/solution/plugin/design/formula/ui/type/CommonEvent.java
  20. 43
      src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/BasicFormulaPane.java
  21. 48
      src/main/java/com/fr/solution/plugin/design/formula/ui/type/impl/ScriptFormulaPane.java
  22. 2
      src/main/resources/com/fr/solution/plugin/design/formula/locale/formula.properties
  23. 2
      src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_en_US.properties
  24. 2
      src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_ja_JP.properties
  25. 2
      src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_zh_CN.properties
  26. 2
      src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_zh_TW.properties

123
build.gradle

@ -0,0 +1,123 @@
apply plugin: 'java'
ext {
/**
* jar的路径
* 1.jar需要打包到zip中,lib根目录下
* 2.jar仅仅是编译时需要lib下子目录下即可
*/
libPath = "$projectDir/../webroot/WEB-INF/lib"
/**
* class进行加密保护
*/
guard = true
def pluginInfo = getPluginInfo()
pluginPre = "fine-plugin"
pluginName = pluginInfo.id
pluginVersion = pluginInfo.version
outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes"
}
group = 'com.fr.plugin'
version = '10.0'
sourceCompatibility = 8
targetCompatibility = 8
sourceSets {
main {
java.outputDir = file(outputPath)
output.resourcesDir = file(outputPath)
}
}
ant.importBuild("encrypt.xml")
//ant变量
ant.projectDir = projectDir
ant.references["compile.classpath"] = ant.path {
fileset(dir: libPath, includes: '**/*.jar')
fileset(dir: ".",includes:"**/*.jar" )
}
classes.dependsOn('clean')
task copyFiles(type: Copy,dependsOn: 'classes'){
from outputPath
into "$projectDir/classes"
}
task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){
from "$projectDir/classes"
into "$projectDir/transform-classes"
include "**/*.*"
}
jar.dependsOn("preJar")
task makeJar(type: Jar,dependsOn: preJar){
from fileTree(dir: "$projectDir/transform-classes")
baseName pluginPre
appendix pluginName
version pluginVersion
destinationDir = file("$buildDir/libs")
doLast(){
delete file("$projectDir/classes")
delete file("$projectDir/transform-classes")
}
}
task copyFile(type: Copy,dependsOn: ["makeJar"]){
from "$buildDir/libs"
from("$projectDir/lib") {
include "*.jar"
}
from "$projectDir/plugin.xml"
into file("$buildDir/temp/plugin")
}
task zip(type:Zip,dependsOn:["copyFile"]){
from "$buildDir/temp/plugin"
destinationDir file("$buildDir/install")
baseName pluginPre
appendix pluginName
version pluginVersion
}
//build时包含哪些文件,
processResources {
// exclude everything
// *.css没效果
// exclude '**/*.css'
// except this file
// include 'xx.xml'
}
/*读取plugin.xml中的version*/
def getPluginInfo(){
def xmlFile = file("plugin.xml")
if (!xmlFile.exists()) {
return ["id":"none", "version":"1.0.0"]
}
def plugin = new XmlParser().parse(xmlFile)
def version = plugin.version[0].text()
def id = plugin.id[0].text()
return ["id":id,"version":version]
}
repositories {
mavenLocal()
maven {
url = uri('http://mvn.finedevelop.com/repository/maven-public/')
}
}
dependencies {
//使jar
implementation fileTree(dir: 'lib', include: ['**/*.jar'])
implementation fileTree(dir: libPath, include: ['**/*.jar'])
}

4
build.xml

@ -88,8 +88,8 @@
<param name="resources_from" value="${basedir}"/>
</antcall>
<antcall target="compile_javas">
<param name="source_jdk_version" value="1.6"/>
<param name="target_jdk_version" value="1.6"/>
<param name="source_jdk_version" value="1.8"/>
<param name="target_jdk_version" value="1.8"/>
<param name="compile_jdk_version" value="${jdk.home}"/>
<param name="compile_files" value="${basedir}/src"/>
</antcall>

13
encrypt.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project>
<target name="compile_encrypt_javas" depends="copyFiles">
<echo message="加密文件"/>
<echo message="${projectDir}"/>
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask">
<classpath refid="compile.classpath"/>
</taskdef>
<pretreatment baseDir="${projectDir}"/>
</target>
<target name="compile_plain_javas" depends="copyFiles">
</target>
</project>

BIN
lib/finekit-10.0.jar

Binary file not shown.

13
plugin.xml

@ -1,15 +1,20 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<plugin>
<main-package>com.fr.solution.plugin</main-package>
<id>com.fr.solution.plugin.design.formula.script</id>
<id>com.fr.solution.plugin.design.formula.script.v10</id>
<name><![CDATA[增强公式编辑器]]></name>
<active>yes</active>
<version>4.5</version>
<env-version>9.0~10.0</env-version>
<jartime>2017-10-20</jartime>
<version>4.9.4</version>
<env-version>10.0</env-version>
<jartime>2019-10-20</jartime>
<vendor>richie</vendor>
<description><![CDATA[可以在公式中直接使用JavaScript脚本,进行更灵活的计算。]]></description>
<change-notes><![CDATA[
[2020-12-11]修复有时候显示结果的弹框不在最前面的问题。<br/>
[2020-11-23]兼容jdk11。<br/>
[2020-07-15]修复搜索函数时无序的问题。<br/>
[2019-12-25]仅支持10.0版本。<br/>
[2019-10-31]修复参数无法实时计算的问题。<br/>
[2019-05-23]脚本公式可以正确的校验公式的合法性。<br/>
[2019-03-21]一个国际化问题。<br/>
[2019-03-19]修复在9.0中无法打开的问题。<br/>

15
pom.xml

@ -12,6 +12,17 @@
<packaging>jar</packaging>
<artifactId>demo-formula-script</artifactId>
<dependencies>
<dependency>
<groupId>com.fanruan.api</groupId>
<artifactId>finekit</artifactId>
<version>10.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/finekit-10.0.jar</systemPath>
</dependency>
</dependencies>
<build>
<!---如果要更改调试插件,改这里的配置就可以了-->
<outputDirectory>${project.basedir}/../webroot/WEB-INF/plugins/plugin-com.fr.solution.plugin.design.formula.script-1.0/classes</outputDirectory>
@ -20,8 +31,8 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>

4
readme.md

@ -64,16 +64,18 @@ var a2 = int('${A2}'); // 将A2格子的值转换为整数,参数JS运算
var a3 = number('${A3}'); // 将A3格子的值转换为浮点数,参数JS运算
```
3、如果明确格子或者参数是数字,可以写成(这种写法一般不推荐)
```
var a = ${A1};
```
这种写法,a作为数字参与后续的运算;
如果有可能是其他类型,需要写为
```
var a = '${A1}';
```
这种写法,a作为字符串参后续的运算;
这种写法,a作为字符串参后续的运算;
3、脚本公式在返回数组类型的时候,和常规公式的ARRAY表现一致。

37
src/main/java/com/fr/solution/plugin/design/formula/compat/AbstractNameAndDescription.java

@ -0,0 +1,37 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fanruan.api.util.StringKit;
import com.fr.design.formula.NameAndDescription;
/**
* @author richie
* @version 10.0
* Created by richie on 2019-09-03
*/
public abstract class AbstractNameAndDescription implements NameAndDescription {
@Override
public String searchResult(String keyWord, boolean findDescription) {
String functionName = getName();
if (StringKit.isBlank(functionName)) {
return null;
}
int sign = 1;
int length = keyWord.length();
String temp = functionName.toUpperCase();
for (int j = 0; j < length; j++) {
String check = keyWord.substring(j, j + 1);
int index = temp.indexOf(check.toUpperCase());
if (index == -1) {
sign = 0;
break;
} else {
temp = temp.substring(index + 1);
}
}
if (sign == 1) {
return functionName;
}
return null;
}
}

7
src/main/java/com/fr/solution/plugin/design/formula/compat/DesignToolkit.java

@ -1,7 +1,8 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fr.general.Inter;
import com.fr.stable.ProductConstants;
import com.fanruan.api.i18n.I18nKit;
import com.fanruan.api.macro.ProductConstants;
/**
* @author richie
@ -14,7 +15,7 @@ public class DesignToolkit {
public static String getLocText(String key) {
if (version < 10) {
return Inter.getLocText(key);
return I18nKit.getLocText(key);
} else {
try {
return (String) Class.forName("com.fr.design.i18n.Toolkit").getMethod("i18nText", new Class[]{String.class}).invoke(null, key);

92
src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionConstants.java

@ -1,11 +1,14 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fr.design.formula.FunctionDefNAD;
import com.fanruan.api.function.FunctionKit;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.macro.EncodeConstants;
import com.fanruan.api.util.GeneralKit;
import com.fanruan.api.util.OperatingKit;
import com.fanruan.api.util.StringKit;
import com.fanruan.api.util.TypeKit;
import com.fr.design.formula.FunctionGroup;
import com.fr.design.formula.NameAndDescription;
import com.fr.design.formula.NameAndFunctionList;
import com.fr.design.formula.NameAndTypeAndFunctionList;
import com.fr.file.FunctionManager;
import com.fr.function.AVERAGE;
import com.fr.function.CHAR;
import com.fr.function.COUNT;
@ -15,14 +18,7 @@ import com.fr.function.MIN;
import com.fr.function.RANGE;
import com.fr.function.SUM;
import com.fr.function.TIME;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger;
import com.fr.general.GeneralUtils;
import com.fr.plugin.ExtraClassManager;
import com.fr.stable.EncodeConstants;
import com.fr.stable.OperatingSystem;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.fun.FunctionDefContainer;
import com.fr.stable.fun.mark.Mutable;
import com.fr.stable.script.Function;
@ -64,7 +60,8 @@ public final class FunctionConstants {
/**
* Don't let anyone instantiate this class.
*/
private FunctionConstants() {}
private FunctionConstants() {
}
private static void loadEmbededFunctions() {
String pkgName = "com.fr.function";
@ -74,7 +71,7 @@ public final class FunctionConstants {
try {
urlEnumeration = classloader.getResources(pkgName.replace('.', '/'));
} catch (IOException e) {
FRLogger.getLogger().error(e.getMessage());
LogKit.error(e.getMessage());
return;
}
while (urlEnumeration.hasMoreElements()) {
@ -87,18 +84,18 @@ public final class FunctionConstants {
try {
classFilePath = URLDecoder.decode(classFilePath, EncodeConstants.ENCODING_UTF_8);
} catch (UnsupportedEncodingException e1) {
FRLogger.getLogger().error(e1.getMessage(), e1);
LogKit.error(e1.getMessage(), e1);
}
FRLogger.getLogger().info("ClassFilePath:" + classFilePath);
LogKit.info("ClassFilePath:" + classFilePath);
if (isCustomFormulaPath(classFilePath)) {
continue;
}
for (String fileName : findClassNamesUnderFilePath(classFilePath)) {
try {
Class<?> cls = Class.forName(pkgName + "." + fileName.substring(0, fileName.length() - 6));
if (StableUtils.classInstanceOf(cls, iface)) {
if (TypeKit.classInstanceOf(cls, iface)) {
Function inst;
inst = (Function)cls.newInstance();
inst = (Function) cls.newInstance();
for (NameAndTypeAndFunctionList EMBFUNCTION : EMBFUNCTIONS) {
if (EMBFUNCTION.test(inst)) {
break;
@ -108,7 +105,7 @@ public final class FunctionConstants {
} catch (Exception ignore) {
} catch (Throwable e) {
// 不要因为个别公式加载失败,而导致整个函数面板无法启动
FRLogger.getLogger().error(e.getMessage());
LogKit.error(e.getMessage());
}
}
}
@ -119,7 +116,7 @@ public final class FunctionConstants {
}
private static boolean isNotDebugMode() {
return GeneralUtils.readBuildNO().contains("-");
return GeneralKit.readBuildNO().contains("-");
}
private static boolean isJarPath(String classFilePath) {
@ -128,24 +125,26 @@ public final class FunctionConstants {
/**
* 将函数分组插件中的函数添加到对应的列表中
*
* @param listModel
*/
public static void addFunctionGroupFromPlugins(DefaultListModel listModel){
public static void addFunctionGroupFromPlugins(DefaultListModel listModel) {
//hugh:自定义函数分组
Set<Mutable> containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING);
if(!containers.isEmpty()){
for(Mutable container : containers){
listModel.addElement(createFunctionGroup((FunctionDefContainer)container));
if (!containers.isEmpty()) {
for (Mutable container : containers) {
listModel.addElement(createFunctionGroup((FunctionDefContainer) container));
}
}
}
/**
* 创建一个新的分组
*
* @param container
* @return
*/
private static FunctionGroup createFunctionGroup(final FunctionDefContainer container){
private static FunctionGroup createFunctionGroup(final FunctionDefContainer container) {
return new FunctionGroup() {
@Override
public String getGroupName() {
@ -157,7 +156,7 @@ public final class FunctionConstants {
FunctionDef[] fs = container.getFunctionDefs();
int count = fs.length;
FunctionDefNAD[] nads = new FunctionDefNAD[count];
for (int i = 0; i < count; i ++) {
for (int i = 0; i < count; i++) {
nads[i] = new FunctionDefNAD(fs[i]);
}
return nads;
@ -168,20 +167,17 @@ public final class FunctionConstants {
private static String[] findClassNamesUnderFilePath(String filePath) {
java.util.List<String> classNameList = new ArrayList<String>();
/*
* alex:如果是jar包中的class文件
* file:/D:/opt/FineReport6.5/WebReport/WEB-INF/lib/fr-server-6.5.jar!/com/fr/rpt/script/function
*/
if (isJarPath(filePath)) {
String[] arr = filePath.split("!/");
String jarPath = arr[0].substring(6); // alex:substring(6)去掉前面的file:/这六个字符
String jarPath = arr[0].substring(6);
String classPath = arr[1];
if(classPath.endsWith("/")){
if (classPath.endsWith("/")) {
classPath = classPath.substring(0, classPath.length() - 1);
}
if (!OperatingSystem.isWindows()){
if (!OperatingKit.isWindows()) {
//windows里substring后是d:\123\456, mac下substring后是Application/123/456
jarPath = StringUtils.perfectStart(jarPath, "/");
jarPath = StringKit.perfectStart(jarPath, "/");
}
ZipFile zip;
@ -202,7 +198,7 @@ public final class FunctionConstants {
classNameList.add(entryName.substring(classPath.length() + 1));
}
} catch (IOException e) {
FRLogger.getLogger().error(e.getMessage(), e);
LogKit.error(e.getMessage(), e);
}
} else {
File dir = new File(filePath);
@ -232,7 +228,7 @@ public final class FunctionConstants {
FunctionDef[] fs = ExtraClassManager.getInstance().getFunctionDef();
int count = fs.length;
FunctionDefNAD[] nads = new FunctionDefNAD[count];
for (int i = 0; i < count; i ++) {
for (int i = 0; i < count; i++) {
nads[i] = new FunctionDefNAD(fs[i]);
}
return nads;
@ -249,31 +245,19 @@ public final class FunctionConstants {
@Override
public NameAndDescription[] getDescriptions() {
FunctionManager funtionManager = FunctionManager.getInstance();
if (funtionManager != null) {
int functionDefCount = funtionManager.getFunctionDefCount();
FunctionDefNAD[] nads = new FunctionDefNAD[functionDefCount];
for (int i = 0; i < functionDefCount; i++) {
nads[i] = new FunctionDefNAD(funtionManager.getFunctionDef(i));
}
return nads;
}
return new NameAndDescription[0];
return FunctionKit.getDescription();
}
};
}
private static NameAndFunctionList getCommonFunctionList() {
return new NameAndFunctionList(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Most_Recently_Used"), new Function[] {
return new NameAndFunctionList(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Most_Recently_Used"), new Function[]{
new SUM(), new COUNT(), new AVERAGE(), new CHAR(), new DATE(), new MAX(), new MIN(), new TIME(), new RANGE()
});
}
private static NameAndTypeAndFunctionList[] getEmbededFunctionListArray() {
return new NameAndTypeAndFunctionList[] {
return new NameAndTypeAndFunctionList[]{
new NameAndTypeAndFunctionList(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Math_&_Trig"), Function.MATH),
new NameAndTypeAndFunctionList(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Text"), Function.TEXT),
new NameAndTypeAndFunctionList(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Date_&_Time"), Function.DATETIME),
@ -302,16 +286,16 @@ public final class FunctionConstants {
Collections.addAll(all, CUSTOM.getDescriptions());
//hugh:自定义函数分组
Set<Mutable> containers = ExtraClassManager.getInstance().getArray(FunctionDefContainer.MARK_STRING);
if(!containers.isEmpty()){
for(Mutable container : containers){
Collections.addAll(all,createFunctionGroup(((FunctionDefContainer)container)).getDescriptions());
if (!containers.isEmpty()) {
for (Mutable container : containers) {
Collections.addAll(all, createFunctionGroup(((FunctionDefContainer) container)).getDescriptions());
}
}
Collections.sort(all, new Comparator<NameAndDescription>() {
@Override
public int compare(NameAndDescription o1, NameAndDescription o2) {
return ComparatorUtils.compare(o1.getName(), o2.getName());
return GeneralKit.compare(o1.getName(), o2.getName());
}
});

28
src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionDefNAD.java

@ -0,0 +1,28 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fanruan.api.util.StringKit;
import com.fr.stable.script.FunctionDef;
/**
* 函数名和描述
*
* @author Kalven
* @version 10.0
* Created by Kalven on 2019/8/31
*/
public class FunctionDefNAD extends AbstractNameAndDescription {
private FunctionDef def;
public FunctionDefNAD(FunctionDef def) {
this.def = def;
}
public String getName() {
return this.def == null ? StringKit.EMPTY : this.def.getName();
}
public String getDesc() {
return this.def == null ? StringKit.EMPTY : this.def.getDescription();
}
}

51
src/main/java/com/fr/solution/plugin/design/formula/compat/FunctionNAD.java

@ -0,0 +1,51 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fanruan.api.util.GeneralKit;
import com.fanruan.api.util.StringKit;
import com.fr.stable.script.Function;
import java.util.Locale;
/**
* @author richie
* @version 10.0
* Created by richie on 2019-09-03
*/
public class FunctionNAD extends AbstractNameAndDescription {
private static final String LOCALE_PREFIX = "Fine-Core_Formula_";
private Function fn;
FunctionNAD(Function fn) {
this.fn = fn;
}
public String getName() {
return fn == null ? StringKit.EMPTY : fn.getClass().getSimpleName();
}
public String getDesc() {
if (fn == null) {
return StringKit.EMPTY;
}
Locale locale = GeneralKit.getLocale();
String describtion = fn.getDescription(locale);
if (describtion.startsWith(LOCALE_PREFIX)) {
return Locale.CHINA.equals(locale) ? fn.getCN() : fn.getEN();
}
return describtion;
}
@Override
public String searchResult(String keyWord, boolean findDescription) {
String functionName = getName();
String des = getDesc();
if (findDescription && des.contains(keyWord)) {
return functionName;
} else {
return super.searchResult(keyWord, findDescription);
}
}
}

41
src/main/java/com/fr/solution/plugin/design/formula/compat/NameAndFunctionList.java

@ -0,0 +1,41 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fr.design.formula.FunctionGroup;
import com.fr.design.formula.NameAndDescription;
import com.fr.stable.script.Function;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 名称对应的函数列表
*
* @author Kalven
* @version 10.0
* Created by Kalven on 2019/8/31
*/
public class NameAndFunctionList implements FunctionGroup {
protected String name;
protected List<Function> fnList = new ArrayList<>();
public NameAndFunctionList(String var1, Function[] var2) {
this.name = var1;
this.fnList.addAll(Arrays.asList(var2));
}
public String getGroupName() {
return this.name;
}
public NameAndDescription[] getDescriptions() {
NameAndDescription[] var1 = new NameAndDescription[this.fnList.size()];
for (int var2 = 0; var2 < var1.length; ++var2) {
var1[var2] = new FunctionNAD(this.fnList.get(var2));
}
return var1;
}
}

29
src/main/java/com/fr/solution/plugin/design/formula/compat/NameAndTypeAndFunctionList.java

@ -0,0 +1,29 @@
package com.fr.solution.plugin.design.formula.compat;
import com.fr.stable.script.Function;
/**
* 名字和类型对应的函数列表
*
* @author Kalven
* @version 10.0
* Created by Kalven on 2019/8/31
*/
public class NameAndTypeAndFunctionList extends NameAndFunctionList {
private Function.Type type;
public NameAndTypeAndFunctionList(String name, Function.Type type) {
super(name, new Function[0]);
this.type = type;
}
public boolean test(Function fn) {
if (fn != null && fn.getType() == this.type) {
return fnList.add(fn);
}
return false;
}
}

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

@ -1,46 +1,41 @@
package com.fr.solution.plugin.design.formula.ui;
import com.fanruan.api.cal.CalculatorKit;
import com.fanruan.api.cal.ParameterKit;
import com.fanruan.api.design.DesignKit;
import com.fanruan.api.design.macro.UIConstants;
import com.fanruan.api.design.ui.action.UpdateAction;
import com.fanruan.api.design.ui.component.UIButton;
import com.fanruan.api.design.ui.component.UILabel;
import com.fanruan.api.design.ui.component.UIQuickList;
import com.fanruan.api.design.ui.component.UIRoundedBorder;
import com.fanruan.api.design.ui.component.UITextArea;
import com.fanruan.api.design.ui.component.UITextField;
import com.fanruan.api.design.ui.container.BasicPane;
import com.fanruan.api.design.ui.container.UIScrollPane;
import com.fanruan.api.design.util.GUICoreKit;
import com.fanruan.api.design.work.ParameterInputPane;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.macro.EncodeConstants;
import com.fanruan.api.util.ArrayKit;
import com.fanruan.api.util.GeneralKit;
import com.fanruan.api.util.IOKit;
import com.fanruan.api.util.StringKit;
import com.fr.base.BaseFormula;
import com.fr.base.BaseUtils;
import com.fr.base.FRContext;
import com.fr.base.Parameter;
import com.fr.base.ParameterMapNameSpace;
import com.fr.base.io.IOFile;
import com.fr.data.TableDataSource;
import com.fr.design.actions.UpdateAction;
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.FunctionGroup;
import com.fr.design.formula.NameAndDescription;
import com.fr.design.formula.UIFormula;
import com.fr.design.formula.VariableResolver;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ilist.QuickList;
import com.fr.design.gui.itextarea.UITextArea;
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.FRLogger;
import com.fr.general.GeneralUtils;
import com.fr.report.core.namespace.SimpleCellValueNameSpace;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.compat.DesignToolkit;
import com.fr.solution.plugin.design.formula.compat.FunctionConstants;
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;
import com.fr.stable.ParameterProvider;
import com.fr.stable.script.CalculatorProvider;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
@ -69,6 +64,10 @@ import java.io.StringReader;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 组合了普通公式和脚本公式的编辑器面板
@ -85,7 +84,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
private DefaultListModel listModel = new DefaultListModel();
private DefaultListModel functionTypeListModel = new DefaultListModel();
private QuickList functionTypeList;
private UIQuickList functionTypeList;
private DefaultListModel functionNameModel;
private JList functionNameList;
@ -120,9 +119,9 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
protected void initComponents() {
this.setLayout(new BorderLayout(4, 4));
// text
JPanel textPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
JPanel textPane = GUICoreKit.createBorderLayoutPane();
this.add(textPane, BorderLayout.CENTER);
JPanel checkBoxAndButtonPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
JPanel checkBoxAndButtonPane = GUICoreKit.createFlowPane();
UILabel formulaLabel = new UILabel(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Input_Formula_In_The_Text_Area_Below") + ":"
+ " ");
formulaLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
@ -142,10 +141,10 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
UIButton calculateButton = new UIButton(DesignToolkit.getLocText("Plugin-Design_Group_Formula_Calculate"));
calculateButton.addActionListener(calculateActionListener);
JPanel checkBoxPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane();
checkBoxPane.setPreferredSize(new Dimension(450, 30));
JPanel checkBoxPane = GUICoreKit.createFlowPane();
checkBoxPane.setPreferredSize(new Dimension(440, 30));
checkBoxAndButtonPane.add(checkBoxPane, BorderLayout.WEST);
checkBoxAndButtonPane.add(GUICoreUtils.createFlowPane(checkValidButton, calculateButton), BorderLayout.EAST);
checkBoxAndButtonPane.add(GUICoreKit.createFlowPane(checkValidButton, calculateButton), BorderLayout.CENTER);
extendCheckBoxPane(checkBoxPane);
variableTreeAndDescriptionArea = new VariableTreeAndDescriptionArea();
this.add(variableTreeAndDescriptionArea, BorderLayout.SOUTH);
@ -248,15 +247,19 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
if (keyWord.length() != 0) {
NameAndDescription[] descriptions = FunctionConstants.ALL.getDescriptions();
int lengthOfDes = descriptions.length;
List<String> list = new ArrayList<String>();
for (int i = 0; i < lengthOfDes; i++) {
NameAndDescription and = descriptions[i];
String functionName = and.searchResult(keyWord, findDescription);
if (StringUtils.isNotBlank(functionName)) {
listModel.addElement(functionName);
if (StringKit.isNotBlank(functionName)) {
list.add(functionName);
}
}
Collections.sort(list, new SimilarComparator(keyWord));
for (String name : list) {
listModel.addElement(name);
}
if (!listModel.isEmpty()) {
tipsList.setSelectedIndex(0);
refreshDescriptionTextArea((String) listModel.getElementAt(0));
@ -322,41 +325,54 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
private ActionListener calculateActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Calculator calculator = Calculator.createCalculator();
JTemplate<?, ?> template = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
CalculatorProvider calculator = CalculatorKit.createCalculator();
JTemplate<?, ?> template = DesignKit.getCurrentEditingTemplate();
if (template != null) {
IOFile file = (IOFile) template.getTarget();
TableDataSource file = (TableDataSource) template.getTarget();
calculator.setAttribute(TableDataSource.class, file);
calculator.pushNameSpace(SimpleCellValueNameSpace.getInstance());
calculator.pushNameSpace(CalculatorKit.createSimpleCellValueNameSpace());
}
BaseFormula formula = GroupFormulaPane.this.update();
String message = calculate(formula, formulaPane.analyze4Parameters(calculator), calculator);
JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), message);
JOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(GroupFormulaPane.this), message);
}
};
private String calculate(BaseFormula formula, Parameter[] parameters, Calculator calculator) {
private String calculate(BaseFormula formula, ParameterProvider[] parameters, CalculatorProvider calculator) {
final Map<String, Object> parameterMap = new HashMap<String, Object>();
if (ArrayUtils.isNotEmpty(parameters)) {
if (ArrayKit.isNotEmpty(parameters)) {
final ParameterInputPane pPane = new ParameterInputPane(parameters);
pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() {
pPane.showSmallWindow(DesignKit.getDesignerFrame(), new DialogActionAdapter() {
@Override
public void doOk() {
parameterMap.putAll(pPane.update());
}
}).setVisible(true);
}
calculator.pushNameSpace(ParameterMapNameSpace.create(parameterMap));
calculator.pushNameSpace(ParameterKit.createParameterMapNameSpace(realMap(parameterMap)));
String message;
try {
Object result = formula.evalValue(calculator);
message = DesignToolkit.getLocText("Plugin-Design_Group_Formula_Result") + ":" + GeneralUtils.objectToString(result);
} catch (UtilEvalError utilEvalError) {
message = DesignToolkit.getLocText("Plugin-Design_Group_Formula_Result") + ":" + GeneralKit.objectToString(result);
} catch (Exception utilEvalError) {
message = DesignToolkit.getLocText("Plugin-Design_Group_Formula_Calculate_Error") + ":" + utilEvalError.getMessage();
}
return message;
}
private Map<String, Object> realMap(Map<String, Object> source) {
Map<String, Object> map = new HashMap<String, Object>();
for (Map.Entry<String, Object> entry : source.entrySet()) {
String name = entry.getKey();
if (name.startsWith("$")) {
map.put(name.substring(1), entry.getValue());
} else {
map.put(name, entry.getValue());
}
}
return map;
}
public class VariableTreeAndDescriptionArea extends JPanel {
private JTree variablesTree;
@ -367,7 +383,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
}
private void initFunctionTypeList(JPanel functionPane) {
functionTypeList = new QuickList(functionTypeListModel);
functionTypeList = new UIQuickList(functionTypeListModel);
UIScrollPane functionTypeScrollPane = new UIScrollPane(functionTypeList);
functionTypeScrollPane.setBorder(new UIRoundedBorder(UIConstants.LINE_COLOR, 1, UIConstants.ARC));
functionTypeScrollPane.setPreferredSize(new Dimension(140, 200));
@ -474,7 +490,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
popupMenu.add(lookDetailAction);
// peter: 只有弹出菜单有子菜单的时候,才需要弹出来.
GUICoreUtils.showPopupMenu(popupMenu, functionNameList, evt.getX() - 1, evt.getY() - 1);
GUICoreKit.showPopupMenu(popupMenu, functionNameList, evt.getX() - 1, evt.getY() - 1);
}
}
});
@ -518,7 +534,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
private StringBuilder getText(TextUserObject selectedValue, String path) throws IOException {
Reader desReader;
StringBuilder desBuf = new StringBuilder();
InputStream desInputStream = BaseUtils.readResource(path + (selectedValue).displayText + ".txt");
InputStream desInputStream = IOKit.readResource(path + (selectedValue).displayText + ".txt");
if (desInputStream == null) {
String description = "";
desReader = new StringReader(description);
@ -548,7 +564,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
StringBuilder desBuf = new StringBuilder();
try {
String path;
Locale locale = FRContext.getLocale();
Locale locale = GeneralKit.getLocale();
if (locale.equals(Locale.CHINA)) {
path = "/com/fr/design/insert/formula/variable/cn/";
} else {
@ -558,7 +574,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
desBuf = getText((TextUserObject) selectedValue, path);
}
} catch (IOException exp) {
FRLogger.getLogger().error(exp.getMessage(), exp);
LogKit.error(exp.getMessage(), exp);
}
descriptionTextArea.setText(desBuf.toString());
descriptionTextArea.moveCaretPosition(0);
@ -603,7 +619,7 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
public LookDetailAction() {
this.setName(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaPane_Function_Detail"));
this.setMnemonic('L');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png"));
this.setSmallIcon(IOKit.readIcon("/com/fr/design/images/m_file/preview.png"));
}
// 弹出的窗口中显示函数的用法明细
@ -619,12 +635,11 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
return DesignToolkit.getLocText("Plugin-Design_Basic_FormulaPane_Function_Detail");
}
};
basicPane.setLayout(FRGUIPaneFactory.createBorderLayout());
basicPane.setLayout(new BorderLayout());
UITextArea desArea = new UITextArea();
// desArea。setEnabled(false);
desArea.setText(this.getTextAreaText());
basicPane.add(new UIScrollPane(desArea), BorderLayout.CENTER);
BasicDialog dialog = basicPane.showWindow(DesignerContext.getDesignerFrame());
BasicDialog dialog = basicPane.showWindow(DesignKit.getDesignerFrame());
dialog.setVisible(true);
}
@ -706,24 +721,24 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
}
rootNode.add(new TextFolderUserObject(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaD_Data_Fields"),
BaseUtils.readIcon("/com/fr/design/images/dialog/table.png"),
IOKit.readIcon("/com/fr/design/images/dialog/table.png"),
variableResolver.resolveColumnNames()).createMutableTreeNode());
// Set cutReport Variable
rootNode.add(new TextFolderUserObject(DesignToolkit.getLocText("Plugin-Design_Basic_FormulaPane_Variables"),
BaseUtils.readIcon("/com/fr/design/images/dialog/variable.png"),
IOKit.readIcon("/com/fr/design/images/dialog/variable.png"),
variableResolver.resolveCurReportVariables()).createMutableTreeNode());
rootNode.add(new TextFolderUserObject(DesignToolkit.getLocText("Plugin-Design_Basic_Parameter_Source_Type_Tabledata"),
BaseUtils.readIcon("/com/fr/design/images/dialog/parameter.gif"),
IOKit.readIcon("/com/fr/design/images/dialog/parameter.gif"),
variableResolver.resolveTableDataParameterVariables()).createMutableTreeNode());
rootNode.add(new TextFolderUserObject(DesignToolkit.getLocText("Plugin-Design_Basic_ParameterD_Report_Parameter"),
BaseUtils.readIcon("/com/fr/design/images/m_report/p.gif"),
IOKit.readIcon("/com/fr/design/images/m_report/p.gif"),
variableResolver.resolveReportParameterVariables()).createMutableTreeNode());
rootNode.add(new TextFolderUserObject(DesignToolkit.getLocText("Plugin-Design_Basic_M_Server_Global_Parameters"),
BaseUtils.readIcon("/com/fr/design/images/dialog/parameter.gif"),
IOKit.readIcon("/com/fr/design/images/dialog/parameter.gif"),
variableResolver.resolveGlobalParameterVariables()).createMutableTreeNode());
variableModel.reload();
@ -765,6 +780,26 @@ public class GroupFormulaPane extends BasicPane implements UIFormula, OperateLis
}
}
public static class SimilarComparator implements Comparator<String> {
private String searchKey;
public SimilarComparator(String searchKey) {
this.searchKey = searchKey.toLowerCase();
}
@Override
public int compare(String o1, String o2) {
if (o1.toLowerCase().startsWith(searchKey)) {
return -1;
}
if (o2.toLowerCase().startsWith(searchKey)) {
return 1;
}
return o2.compareTo(o1);
}
}
public static class TextUserObject {
public TextUserObject(String text) {

9
src/main/java/com/fr/solution/plugin/design/formula/ui/GroupFormulaPaneWhenReserveFormula.java

@ -1,8 +1,9 @@
package com.fr.solution.plugin.design.formula.ui;
import com.fanruan.api.design.ui.component.UICheckBox;
import com.fanruan.api.design.util.GUICoreKit;
import com.fr.base.BaseFormula;
import com.fr.design.formula.VariableResolver;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.solution.plugin.design.formula.compat.DesignToolkit;
import javax.swing.*;
@ -36,8 +37,8 @@ public class GroupFormulaPaneWhenReserveFormula extends GroupFormulaPane {
reserveCheckBox4Write = new UICheckBox(DesignToolkit.getLocText("Plugin-Design_Basic_Write_Save_Formula"));
reserveCheckBox4Write.setSelected(false);
checkBoxPane.add(reserveCheckBox4Result, BorderLayout.CENTER);
checkBoxPane.add(reserveCheckBox4Write, BorderLayout.SOUTH);
checkBoxPane.add(reserveCheckBox4Result);
checkBoxPane.add(reserveCheckBox4Write);
}
@Override
@ -49,7 +50,7 @@ public class GroupFormulaPaneWhenReserveFormula extends GroupFormulaPane {
@Override
public BaseFormula update() {
BaseFormula formula = super.update();
BaseFormula formula = super.update();
if (formula != null) {
formula.setReserveInResult(this.reserveCheckBox4Result.isSelected());
formula.setReserveOnWriteOrAnaly(this.reserveCheckBox4Write.isSelected());

35
src/main/java/com/fr/solution/plugin/design/formula/ui/type/BaseFormulaPane.java

@ -1,20 +1,14 @@
package com.fr.solution.plugin.design.formula.ui.type;
import com.fanruan.api.design.ui.component.code.UISyntaxTextArea;
import com.fanruan.api.i18n.I18nKit;
import com.fr.base.BaseFormula;
import com.fanruan.api.macro.ProductConstants;
import com.fanruan.api.util.StringKit;
import com.fanruan.api.design.ui.container.UIScrollPane;
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.RSyntaxTextArea;
import com.fr.general.FRLogger;
import com.fr.general.Inter;
import com.fr.log.FineLoggerFactory;
import com.fr.parser.FRLexer;
import com.fr.parser.FRParser;
import com.fr.script.Calculator;
import com.fr.solution.plugin.design.formula.ui.evt.OperateListener;
import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.script.Expression;
import com.fr.third.antlr.ANTLRException;
import javax.swing.*;
import java.awt.*;
@ -23,7 +17,6 @@ import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.StringReader;
public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasicBeanPane<T> implements CommonEvent, KeyListener {
@ -35,7 +28,7 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
private static final int KEY_40 = 40;
private RSyntaxTextArea formulaTextArea;
private UISyntaxTextArea formulaTextArea;
private int currentPosition = 0;
private int beginPosition = 0;
private int insertPosition = 0;
@ -66,7 +59,7 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
formulaTextArea.setForeground(Color.black);
String text = formulaTextArea.getText();
// 判断在中文输入状态是否还包含提示符 要删掉
String tip = "\n\n\n" + Inter.getLocText("Plugin-Design_Basic_FormulaPane_Tips");
String tip = "\n\n\n" + I18nKit.getLocText("Plugin-Design_Basic_FormulaPane_Tips");
if (text.contains(tip)) {
text = text.substring(0, text.indexOf(tip));
insertPosition = 0;
@ -149,12 +142,12 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
}
protected abstract RSyntaxTextArea createContentEditor();
protected abstract UISyntaxTextArea createContentEditor();
protected void fixContent(String content) {
if (content.trim().equals("=")) {
this.formulaTextArea.setForeground(Color.gray);
this.formulaTextArea.setText("\n\n\n" + Inter.getLocText("Plugin-Design_Basic_FormulaPane_Tips"));
this.formulaTextArea.setText("\n\n\n" + I18nKit.getLocText("Plugin-Design_Basic_FormulaPane_Tips"));
this.formulaTextArea.setCaretPosition(0);
ifHasBeenWritten = 0;
operateListener.clearMathListModel();
@ -205,7 +198,7 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
@Override
public void keyPressed(KeyEvent e) {
if (ifHasBeenWritten == 0) {
this.formulaTextArea.setText(StringUtils.EMPTY);
this.formulaTextArea.setText(StringKit.EMPTY);
}
}
@ -307,10 +300,10 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
public void checkContentValid() {
// Execute Formula default cell element.
String formulaText = formulaTextArea.getText().trim();
if (StringUtils.isNotEmpty(formulaText)) {
if (StringKit.isNotEmpty(formulaText)) {
JOptionPane.showMessageDialog(
BaseFormulaPane.this,
(isValidFormula(formulaText) ? Inter.getLocText("Plugin-Design_Basic_FormulaD_Valid_Formula") : Inter.getLocText("Plugin-Design_Basic_FormulaD_Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME,
(isValidFormula(formulaText) ? I18nKit.getLocText("Plugin-Design_Basic_FormulaD_Valid_Formula") : I18nKit.getLocText("Plugin-Design_Basic_FormulaD_Invalid_Formula")) + ".", ProductConstants.PRODUCT_NAME,
JOptionPane.INFORMATION_MESSAGE);
}
}
@ -328,6 +321,6 @@ public abstract class BaseFormulaPane<T extends BaseFormula> extends FurtherBasi
@Override
public String title4PopupWindow() {
return Inter.getLocText("Plugin-Design_Group_Formula_Basic_Title");
return I18nKit.getLocText("Plugin-Design_Group_Formula_Basic_Title");
}
}

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

@ -1,18 +1,23 @@
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.fanruan.api.design.ui.component.UIRadioPane;
import com.fr.stable.ParameterProvider;
import com.fr.stable.script.CalculatorProvider;
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;
/**
* 有问题子类无法重写abstract方法的参数无法修改
*/
import com.fr.design.beans.FurtherBasicBeanPane;
import com.fr.base.BaseFormula;
import java.util.ArrayList;
import java.util.List;
public class CategoryFormulaPane extends UIRadioPane<BaseFormula>{
public class CategoryFormulaPane extends UIRadioPane<BaseFormula> {
private static final long serialVersionUID = 6102846618673364636L;
private List<CommonEvent> events;
@ -28,7 +33,7 @@ public class CategoryFormulaPane extends UIRadioPane<BaseFormula>{
list.add(script);
if (events == null) {
events = new ArrayList<CommonEvent>();
events = new ArrayList<>();
}
events.add(normal);
events.add(script);
@ -62,7 +67,7 @@ public class CategoryFormulaPane extends UIRadioPane<BaseFormula>{
}
}
public Parameter[] analyze4Parameters(Calculator calculator) {
public ParameterProvider[] analyze4Parameters(CalculatorProvider calculator) {
return events.get(cardNamesPane.getSelectedIndex()).analyze4Parameters(calculator);
}

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

@ -1,8 +1,8 @@
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;
import com.fr.stable.ParameterProvider;
import com.fr.stable.script.CalculatorProvider;
public interface CommonEvent {
@ -18,5 +18,5 @@ public interface CommonEvent {
void setOperateListener(OperateListener listener);
Parameter[] analyze4Parameters(Calculator calculator);
ParameterProvider[] analyze4Parameters(CalculatorProvider calculator);
}

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

@ -1,17 +1,17 @@
package com.fr.solution.plugin.design.formula.ui.type.impl;
import com.fanruan.api.cal.FormulaKit;
import com.fanruan.api.cal.ParameterKit;
import com.fanruan.api.design.ui.component.code.SyntaxConstants;
import com.fanruan.api.design.ui.component.code.UISyntaxTextArea;
import com.fanruan.api.util.StringKit;
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;
import com.fr.stable.ParameterProvider;
import com.fr.stable.script.CalculatorProvider;
public class BasicFormulaPane extends BaseFormulaPane<Formula> {
@ -36,7 +36,7 @@ public class BasicFormulaPane extends BaseFormulaPane<Formula> {
@Override
protected Formula createFormula(String content) {
Formula formula;
if (StringUtils.isEmpty(content) || content.trim().charAt(0) == '=') {
if (StringKit.isEmpty(content) || content.trim().charAt(0) == '=') {
formula = new Formula(content);
} else {
formula = new Formula("=" + content);
@ -46,13 +46,13 @@ public class BasicFormulaPane extends BaseFormulaPane<Formula> {
@Override
protected RSyntaxTextArea createContentEditor() {
RSyntaxTextArea formulaTextArea = new RSyntaxTextArea();
protected UISyntaxTextArea createContentEditor() {
UISyntaxTextArea formulaTextArea = new UISyntaxTextArea();
configFormulaArea(formulaTextArea);
return formulaTextArea;
}
protected void configFormulaArea(RSyntaxTextArea formulaTextArea) {
protected void configFormulaArea(UISyntaxTextArea formulaTextArea) {
formulaTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_FORMULA);
formulaTextArea.setAnimateBracketMatching(true);
formulaTextArea.setAntiAliasingEnabled(true);
@ -68,26 +68,19 @@ public class BasicFormulaPane extends BaseFormulaPane<Formula> {
@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;
return FormulaKit.checkFormulaContent(formulaText);
}
@Override
public Parameter[] analyze4Parameters(Calculator calculator) {
public ParameterProvider[] analyze4Parameters(CalculatorProvider calculator) {
Formula formula = updateBean();
if (formula == null) {
return new Parameter[0];
return new ParameterProvider[0];
}
String[] arr = formula.dependence(calculator);
Parameter[] parameters = new Parameter[arr.length];
ParameterProvider[] parameters = new ParameterProvider[arr.length];
for (int i = 0, len = arr.length; i < len; i ++) {
parameters[i] = new Parameter(arr[i]);
parameters[i] = ParameterKit.newParameter(arr[i]);
}
return parameters;
}

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

@ -1,19 +1,19 @@
package com.fr.solution.plugin.design.formula.ui.type.impl;
import com.fr.base.Parameter;
import com.fr.base.ParameterHelper;
import com.fanruan.api.cal.CalculatorKit;
import com.fanruan.api.cal.ParameterKit;
import com.fanruan.api.design.ui.component.code.SyntaxConstants;
import com.fanruan.api.design.ui.component.code.UISyntaxTextArea;
import com.fanruan.api.i18n.I18nKit;
import com.fanruan.api.log.LogKit;
import com.fanruan.api.script.ScriptKit;
import com.fanruan.api.util.RenderKit;
import com.fanruan.api.util.StringKit;
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 com.fr.stable.ParameterProvider;
import com.fr.stable.script.CalculatorProvider;
import javax.script.ScriptException;
import java.util.HashMap;
import java.util.Map;
@ -25,8 +25,8 @@ public class ScriptFormulaPane extends BaseFormulaPane<ScriptFormula> {
"})();";
@Override
protected RSyntaxTextArea createContentEditor() {
RSyntaxTextArea formulaTextArea = new RSyntaxTextArea();
protected UISyntaxTextArea createContentEditor() {
UISyntaxTextArea formulaTextArea = new UISyntaxTextArea();
formulaTextArea.setCloseCurlyBraces(true);
formulaTextArea.setLineWrap(true);
formulaTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT);
@ -56,7 +56,7 @@ public class ScriptFormulaPane extends BaseFormulaPane<ScriptFormula> {
@Override
protected ScriptFormula createFormula(String content) {
ScriptFormula formula;
if (StringUtils.isEmpty(content) || content.trim().charAt(0) == '=') {
if (StringKit.isEmpty(content) || content.trim().charAt(0) == '=') {
formula = new ScriptFormula(content);
} else {
formula = new ScriptFormula("=" + content);
@ -81,12 +81,12 @@ public class ScriptFormulaPane extends BaseFormulaPane<ScriptFormula> {
@Override
protected boolean isValidFormula(String formulaText) {
Calculator calculator = Calculator.createCalculator();
CalculatorProvider calculator = CalculatorKit.createCalculator();
ScriptFormula formula = createFormula(formulaText);
Parameter[] parameters = analyze4Parameters(calculator);
ParameterProvider[] parameters = analyze4Parameters(calculator);
Map<String, Object> map = new HashMap<String, Object>();
for (Parameter parameter : parameters) {
for (ParameterProvider parameter : parameters) {
String name = parameter.getName();
Object value = parameter.getValue();
if (value instanceof Boolean) {
@ -99,26 +99,26 @@ public class ScriptFormulaPane extends BaseFormulaPane<ScriptFormula> {
}
try {
String content = TemplateUtils.renderParameter4Tpl(formula.getPureContent(), map);
ScriptFactory.newSingletonScriptEngine().eval(String.format(FUN_TPL, content));
String content = RenderKit.renderParameter4Tpl(formula.getPureContent(), map);
ScriptKit.newScriptEngine().eval(String.format(FUN_TPL, content));
} catch (Exception e) {
FRLogger.getLogger().error(e.getMessage(), e);
LogKit.error(e.getMessage(), e);
return false;
}
return true;
}
@Override
public Parameter[] analyze4Parameters(Calculator calculator) {
public ParameterProvider[] analyze4Parameters(CalculatorProvider calculator) {
ScriptFormula scriptFormula = updateBean();
if (scriptFormula == null) {
return new Parameter[0];
return new ParameterProvider[0];
}
return ParameterHelper.analyze4Parameters(scriptFormula.getContent(), true);
return ParameterKit.analyze4Parameters(scriptFormula.getContent(), true);
}
@Override
public String title4PopupWindow() {
return Inter.getLocText("Plugin-Design_Group_Formula_Script_Title");
return I18nKit.getLocText("Plugin-Design_Group_Formula_Script_Title");
}
}

2
src/main/resources/com/fr/solution/plugin/design/formula/locale/formula.properties

@ -18,7 +18,7 @@ Plugin-Design_Basic_ParameterD_Report_Parameter=Report Parameter
Plugin-Design_Basic_M_Server_Global_Parameters=Global Parameters
Plugin-Design_Basic_Export_Save_Formula=Preserve formula when export
Plugin-Design_Basic_Write_Save_Formula=Preserve formula when fill
Plugin-Design_Basic_FormulaPane_Tips=Tips\\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaPane_Tips=Tips\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaD_Valid_Formula=Valid Formula
Plugin-Design_Basic_FormulaD_Invalid_Formula=Invalid Formula
Plugin-Design_Basic_FormulaD_Math_&_Trig=Math & Trig

2
src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_en_US.properties

@ -18,7 +18,7 @@ Plugin-Design_Basic_ParameterD_Report_Parameter=Report Parameter
Plugin-Design_Basic_M_Server_Global_Parameters=Global Parameters
Plugin-Design_Basic_Export_Save_Formula=Preserve formula when export
Plugin-Design_Basic_Write_Save_Formula=Preserve formula when fill
Plugin-Design_Basic_FormulaPane_Tips=Tips\\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaPane_Tips=Tips\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaD_Valid_Formula=Valid Formula
Plugin-Design_Basic_FormulaD_Invalid_Formula=Invalid Formula
Plugin-Design_Basic_FormulaD_Math_&_Trig=Math & Trig

2
src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_ja_JP.properties

@ -18,7 +18,7 @@ Plugin-Design_Basic_ParameterD_Report_Parameter=Report Parameter
Plugin-Design_Basic_M_Server_Global_Parameters=Global Parameters
Plugin-Design_Basic_Export_Save_Formula=Preserve formula when export
Plugin-Design_Basic_Write_Save_Formula=Preserve formula when fill
Plugin-Design_Basic_FormulaPane_Tips=Tips\\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaPane_Tips=Tips\:You_Can_Input_B1_To_Input_The_Data_Of_The_First_Row_Second_Column
Plugin-Design_Basic_FormulaD_Valid_Formula=Valid Formula
Plugin-Design_Basic_FormulaD_Invalid_Formula=Invalid Formula
Plugin-Design_Basic_FormulaD_Math_&_Trig=\u6570\u5B66\u3068\u4E09\u89D2\u95A2\u6570

2
src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_zh_CN.properties

@ -18,7 +18,7 @@ Plugin-Design_Basic_ParameterD_Report_Parameter=\u62A5\u8868\u53C2\u6570
Plugin-Design_Basic_M_Server_Global_Parameters=\u5168\u5C40\u53C2\u6570
Plugin-Design_Basic_Export_Save_Formula=\u5BFC\u51FA/\u7F16\u8F91\u7ED3\u679C\u65F6,\u4FDD\u7559\u516C\u5F0F
Plugin-Design_Basic_Write_Save_Formula=\u586B\u62A5/\u5206\u6790\u65F6\uFF0C\u4FDD\u7559\u516C\u5F0F\u7528\u4E8E\u8BA1\u7B97
Plugin-Design_Basic_FormulaPane_Tips=\u63D0\u793A\\:\u60A8\u53EF\u4EE5\u901A\u8FC7\u8F93\u5165B1\u6765\u5199\u5165\u7B2C\u4E00\u884C\u7B2C\u4E8C\u5217\u7684\u6570\u636E\u3002
Plugin-Design_Basic_FormulaPane_Tips=\u63D0\u793A\:\u60A8\u53EF\u4EE5\u901A\u8FC7\u8F93\u5165B1\u6765\u5199\u5165\u7B2C\u4E00\u884C\u7B2C\u4E8C\u5217\u7684\u6570\u636E\u3002
Plugin-Design_Basic_FormulaD_Valid_Formula=\u5408\u6CD5\u7684\u516C\u5F0F
Plugin-Design_Basic_FormulaD_Invalid_Formula=\u975E\u6CD5\u7684\u516C\u5F0F
Plugin-Design_Basic_FormulaD_Math_&_Trig=\u6570\u5B66\u548C\u4E09\u89D2\u51FD\u6570

2
src/main/resources/com/fr/solution/plugin/design/formula/locale/formula_zh_TW.properties

@ -18,7 +18,7 @@ Plugin-Design_Basic_ParameterD_Report_Parameter=\u5831\u8868\u53C3\u6578
Plugin-Design_Basic_M_Server_Global_Parameters=\u5168\u57DF\u53C3\u6578
Plugin-Design_Basic_Export_Save_Formula=\u532F\u51FA/\u7DE8\u8F2F\u7D50\u679C\u6642\uFF0C\u4FDD\u7559\u516C\u5F0F
Plugin-Design_Basic_Write_Save_Formula=\u586B\u5831/\u5206\u6790\u6642\uFF0C\u4FDD\u7559\u516C\u5F0F\u7528\u65BC\u8A08\u7B97
Plugin-Design_Basic_FormulaPane_Tips=\u63D0\u793A\\:\u60A8\u53EF\u4EE5\u901A\u904E\u8F38\u5165B1\u4F86\u5BEB\u5165\u7B2C\u4E00\u884C\u7B2C\u4E8C\u5217\u7684\u6578\u64DA\u3002
Plugin-Design_Basic_FormulaPane_Tips=\u63D0\u793A\:\u60A8\u53EF\u4EE5\u901A\u904E\u8F38\u5165B1\u4F86\u5BEB\u5165\u7B2C\u4E00\u884C\u7B2C\u4E8C\u5217\u7684\u6578\u64DA\u3002
Plugin-Design_Basic_FormulaD_Valid_Formula=\u5408\u6CD5\u7684\u516C\u5F0F
Plugin-Design_Basic_FormulaD_Invalid_Formula=\u975E\u6CD5\u7684\u516C\u5F0F
Plugin-Design_Basic_FormulaD_Math_&_Trig=\u6578\u5B78\u548C\u4E09\u89D2\u51FD\u6578

Loading…
Cancel
Save