diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..002ad57 --- /dev/null +++ b/.classpath @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..03d5945 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + finekit + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..1b6e1ef --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/src/main/java/com/fanruan/api/cal/CalculatorKit.java b/src/main/java/com/fanruan/api/cal/CalculatorKit.java index 4a370e5..5cdfb6b 100644 --- a/src/main/java/com/fanruan/api/cal/CalculatorKit.java +++ b/src/main/java/com/fanruan/api/cal/CalculatorKit.java @@ -5,24 +5,25 @@ import com.fanruan.api.session.SessionKit; import com.fr.base.ParameterMapNameSpace; import com.fr.base.TableDataNameSpace; import com.fr.data.TableDataSource; +import com.fr.report.core.namespace.SimpleCellValueNameSpace; import com.fr.report.report.Report; import com.fr.script.Calculator; import com.fr.stable.StringUtils; import com.fr.stable.script.CalculatorProvider; import com.fr.stable.script.NameSpace; import com.fr.stable.web.SessionProvider; -import org.jetbrains.annotations.Nullable; import com.fr.web.core.ReportSessionIDInfor; import com.fr.web.core.TemplateSessionIDInfo; import com.fr.web.session.SessionIDInfo; +import org.jetbrains.annotations.Nullable; import java.util.Map; /** * @author zack - * @date 2019/8/23 * @version 10.0 * 帆软算子工具类(主要用于公式计算) + * @date 2019/8/23 */ public class CalculatorKit { /** @@ -79,9 +80,19 @@ public class CalculatorKit { /** * 返回服务器数据集的算子空间(可以通过调用calculator.pushNameSpace()将算子空间塞进算子实例,从而支持服务器数据集相关的函数计算) - * @return 算子空间对象 + * + * @return 服务器数据集名字空间 */ - public static NameSpace getServerTableDataNameSpace(){ + public static NameSpace getServerTableDataNameSpace() { return TableDataNameSpace.getInstance(); } + + /** + * 用于计算单元格的名字空间 + * + * @return 单元格名字空间 + */ + public static NameSpace createSimpleCellValueNameSpace() { + return SimpleCellValueNameSpace.getInstance(); + } } \ No newline at end of file diff --git a/src/main/java/com/fanruan/api/cal/FormulaKit.java b/src/main/java/com/fanruan/api/cal/FormulaKit.java index e863d2c..93cd52a 100644 --- a/src/main/java/com/fanruan/api/cal/FormulaKit.java +++ b/src/main/java/com/fanruan/api/cal/FormulaKit.java @@ -1,7 +1,9 @@ package com.fanruan.api.cal; import com.fanruan.api.err.KitError; +import com.fanruan.api.util.GeneralKit; import com.fr.base.BaseFormula; +import com.fr.base.ScriptFormula; import com.fr.log.FineLoggerFactory; import com.fr.script.Calculator; import com.fr.stable.FormulaProvider; @@ -54,10 +56,20 @@ public class FormulaKit { * @param content 公式的内容 * @return 公式对象 */ - public static @NotNull FormulaProvider newFormula(Object content) { + public static @NotNull BaseFormula newFormula(Object content) { return BaseFormula.createFormulaBuilder().build(content); } + /** + * 生成脚本公式对象 + * + * @param content 公式的内容,是一段javascript脚本 + * @return 脚本公式 + */ + public @NotNull static BaseFormula newScriptFormula(Object content) { + return new ScriptFormula(GeneralKit.objectToString(content)); + } + /** * 检查公式内容合法性 * diff --git a/src/main/java/com/fanruan/api/conf/BaseConfiguration.java b/src/main/java/com/fanruan/api/conf/BaseConfiguration.java index 29147d6..c6b7066 100644 --- a/src/main/java/com/fanruan/api/conf/BaseConfiguration.java +++ b/src/main/java/com/fanruan/api/conf/BaseConfiguration.java @@ -30,7 +30,7 @@ public abstract class BaseConfiguration extends DefaultConfiguration { * @param 类型 * @return 配置对象 */ - static T getConfigInstance(final Class clazz) { + public static T getConfigInstance(final Class clazz) { return ConfigContext.getConfigInstance(clazz); } } diff --git a/src/main/java/com/fanruan/api/conf/ConfigurationKit.java b/src/main/java/com/fanruan/api/conf/ConfigurationKit.java new file mode 100644 index 0000000..b433465 --- /dev/null +++ b/src/main/java/com/fanruan/api/conf/ConfigurationKit.java @@ -0,0 +1,41 @@ +package com.fanruan.api.conf; + +import com.fr.config.Configuration; +import com.fr.config.holder.ConfigChangeListener; +import com.fr.transaction.Configurations; +import com.fr.transaction.ValidateProxy; +import com.fr.transaction.WorkerFacade; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + * 配置监听管理器 + */ +public class ConfigurationKit { + + /** + * 注册监听配置变化的监听器 + * + * @param listener 监听器 + */ + public static void registerListener(ConfigChangeListener listener) { + ValidateProxy.getInstance().getValidateManager().registerListener(listener); + } + + /** + * 保存配置 + * + * @param type 配置的类型 + * @param action 保存动作 + */ + public static void modify(Class type, Runner action) { + Configurations.modify(new WorkerFacade(type) { + @Override + public void run() { + action.run(); + } + }); + } + +} diff --git a/src/main/java/com/fanruan/api/conf/Runner.java b/src/main/java/com/fanruan/api/conf/Runner.java new file mode 100644 index 0000000..b80c76e --- /dev/null +++ b/src/main/java/com/fanruan/api/conf/Runner.java @@ -0,0 +1,11 @@ +package com.fanruan.api.conf; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + */ +public interface Runner { + + void run(); +} diff --git a/src/main/java/com/fanruan/api/conf/xml/XmlHolderKit.java b/src/main/java/com/fanruan/api/conf/xml/XmlHolderKit.java new file mode 100644 index 0000000..85c156d --- /dev/null +++ b/src/main/java/com/fanruan/api/conf/xml/XmlHolderKit.java @@ -0,0 +1,26 @@ +package com.fanruan.api.conf.xml; + +import com.fr.config.holder.Conf; +import com.fr.config.holder.impl.xml.XmlConf; +import com.fr.stable.xml.XMLable; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + * 将xml文件写入fine_conf_entity的帮助类,不建议使用 + */ +public class XmlHolderKit { + + /** + * 创建一个要写入配置的xml多项 + * @param t 配置对象 + * @param clazz 类型 + * @param xmlTag xml标签 + * @param 类型 + * @return 配置对象 + */ + public static Conf obj(T t, Class clazz, String xmlTag) { + return new XmlConf(t, clazz, xmlTag); + } +} diff --git a/src/main/java/com/fanruan/api/data/ConnectionKit.java b/src/main/java/com/fanruan/api/data/ConnectionKit.java index ed64b99..3931a38 100644 --- a/src/main/java/com/fanruan/api/data/ConnectionKit.java +++ b/src/main/java/com/fanruan/api/data/ConnectionKit.java @@ -2,6 +2,7 @@ package com.fanruan.api.data; import com.fanruan.api.util.TypeKit; import com.fr.data.impl.Connection; +import com.fr.data.impl.NameDatabaseConnection; import com.fr.file.ConnectionConfig; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +18,7 @@ public class ConnectionKit { * @param name 名字 * @return 数据连接 */ - public @Nullable Connection getConnection(@NotNull String name) { + public static @Nullable Connection getConnection(@NotNull String name) { return ConnectionConfig.getInstance().getConnection(name); } @@ -28,11 +29,21 @@ public class ConnectionKit { * @param type 类型 * @return 数据连接 */ - public @Nullable T getConnection(@NotNull String name, Class type) { + public static @Nullable T getConnection(@NotNull String name, Class type) { Connection connection = getConnection(name); if (TypeKit.objectInstanceOf(connection, type)) { return (T) connection; } return null; } + + /** + * 生成一个使用名字来引用的数据连接对象 + * + * @param name 数据连接的名字 + * @return 数据连接 + */ + public static Connection createNameConnection(String name) { + return new NameDatabaseConnection(name); + } } diff --git a/src/main/java/com/fanruan/api/design/macro/UIConstants.java b/src/main/java/com/fanruan/api/design/macro/UIConstants.java index 96206c1..bfdf0d9 100644 --- a/src/main/java/com/fanruan/api/design/macro/UIConstants.java +++ b/src/main/java/com/fanruan/api/design/macro/UIConstants.java @@ -2,8 +2,23 @@ package com.fanruan.api.design.macro; import java.awt.*; -public class UIConstants { - Color UIPOPUPMENU_LINE_COLOR = new Color(13158861); +/** + * 设计器界面使用的一些常量 + */ +public interface UIConstants { + + /** + * 边框线颜色 + */ Color LINE_COLOR = new Color(153, 153, 153); + + /** + * 带标题的边框的颜色 + */ + Color TITLED_BORDER_COLOR = new Color(0xe8e8e9); + + /** + * 圆角弧度 + */ int ARC = 0; } diff --git a/src/main/java/com/fanruan/api/design/ui/component/UIPlaceholderTextField.java b/src/main/java/com/fanruan/api/design/ui/component/UIPlaceholderTextField.java index f8147ac..158c391 100644 --- a/src/main/java/com/fanruan/api/design/ui/component/UIPlaceholderTextField.java +++ b/src/main/java/com/fanruan/api/design/ui/component/UIPlaceholderTextField.java @@ -14,6 +14,10 @@ public class UIPlaceholderTextField extends PlaceholderTextField { super(); } + public UIPlaceholderTextField(int columns) { + super(columns); + } + public UIPlaceholderTextField(String placeHolder) { super(); setPlaceholder(placeHolder); diff --git a/src/main/java/com/fanruan/api/design/ui/component/UIRoundedBorder.java b/src/main/java/com/fanruan/api/design/ui/component/UIRoundedBorder.java index 37b33e5..17922a6 100644 --- a/src/main/java/com/fanruan/api/design/ui/component/UIRoundedBorder.java +++ b/src/main/java/com/fanruan/api/design/ui/component/UIRoundedBorder.java @@ -1,11 +1,12 @@ package com.fanruan.api.design.ui.component; + import java.awt.*; -/* -* UI组件的边框 -* */ -public class UIRoundedBorder extends com.fr.design.border.UIRoundedBorder{ - public UIRoundedBorder(Color color){ +/** + * 圆角形状的边框 + */ +public class UIRoundedBorder extends com.fr.design.border.UIRoundedBorder { + public UIRoundedBorder(Color color) { super(color); } diff --git a/src/main/java/com/fanruan/api/design/ui/component/UITitledBorder.java b/src/main/java/com/fanruan/api/design/ui/component/UITitledBorder.java new file mode 100644 index 0000000..2a39415 --- /dev/null +++ b/src/main/java/com/fanruan/api/design/ui/component/UITitledBorder.java @@ -0,0 +1,72 @@ +package com.fanruan.api.design.ui.component; + +import com.fanruan.api.design.macro.UIConstants; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + * 带标题的边框 + */ +public class UITitledBorder extends TitledBorder { + + private static final long serialVersionUID = 1L; + + public static UITitledBorder createBorderWithTitle(String title) { + return new UITitledBorder(title); + } + + public static UITitledBorder createBorderWithTitle(String title, int roundedCorner) { + return new UITitledBorder(title, roundedCorner); + } + + private UITitledBorder(String title) { + super( + BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder( + 0, + 0, + 5, + 0), + new UIRoundedBorder( + UIConstants.TITLED_BORDER_COLOR, + 1, + 10) + ), + title, + TitledBorder.LEADING, + TitledBorder.TOP, + null, + new Color(1, 159, 222) + ); + } + + /** + * @param title title + * @param roundedCorner corner width 圆弧宽度,即圆角直径 + */ + private UITitledBorder(String title, int roundedCorner) { + super( + BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder( + 0, + 0, + 5, + 0), + new UIRoundedBorder( + UIConstants.TITLED_BORDER_COLOR, + 1, + roundedCorner) + ), + title, + TitledBorder.LEADING, + TitledBorder.TOP, + null, + new Color(1, 159, 222) + ); + } +} diff --git a/src/main/java/com/fanruan/api/design/ui/component/UIToolbar.java b/src/main/java/com/fanruan/api/design/ui/component/UIToolbar.java index ddd8efb..d097378 100644 --- a/src/main/java/com/fanruan/api/design/ui/component/UIToolbar.java +++ b/src/main/java/com/fanruan/api/design/ui/component/UIToolbar.java @@ -1,9 +1,7 @@ package com.fanruan.api.design.ui.component; -import com.fr.design.gui.itoolbar.UIToolBarUI; - -public class UIToolbar extends com.fr.design.gui.itoolbar.UIToolbar{ - public UIToolbar(){ +public class UIToolbar extends com.fr.design.gui.itoolbar.UIToolbar { + public UIToolbar() { } diff --git a/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java b/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java index ec72cbf..2ffc211 100644 --- a/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java +++ b/src/main/java/com/fanruan/api/design/ui/container/BasicBeanPane.java @@ -1,4 +1,4 @@ package com.fanruan.api.design.ui.container; -public abstract class BasicBeanPane extends com.fr.design.beans.BasicBeanPane{ +public abstract class BasicBeanPane extends com.fr.design.beans.BasicBeanPane { } diff --git a/src/main/java/com/fanruan/api/design/ui/container/BasicDialog.java b/src/main/java/com/fanruan/api/design/ui/container/BasicDialog.java index 5a65107..dcea5c2 100644 --- a/src/main/java/com/fanruan/api/design/ui/container/BasicDialog.java +++ b/src/main/java/com/fanruan/api/design/ui/container/BasicDialog.java @@ -1,36 +1,40 @@ package com.fanruan.api.design.ui.container; -import com.fanruan.api.design.ui.container.BasicPane; - import java.awt.*; -public class BasicDialog extends com.fr.design.dialog.BasicDialog{ - public BasicDialog(Dialog parent){ +public class BasicDialog extends com.fr.design.dialog.BasicDialog { + + public BasicDialog(Dialog parent) { super(parent); } - public BasicDialog(Dialog parent, BasicPane pane){ + public BasicDialog(Dialog parent, BasicPane pane) { super(parent, pane); } - public BasicDialog(Dialog parent, BasicPane pane, boolean isNeedButton){ + public BasicDialog(Dialog parent, BasicPane pane, boolean isNeedButton) { super(parent, pane, isNeedButton); } - public BasicDialog(Frame parent){ + public BasicDialog(Frame parent) { super(parent); } - public BasicDialog(Frame parent, BasicPane pane){ + public BasicDialog(Frame parent, BasicPane pane) { super(parent, pane); } - public BasicDialog(Frame parent, BasicPane pane, boolean isNedButtonPane){ + public BasicDialog(Frame parent, BasicPane pane, boolean isNedButtonPane) { super(parent, pane, isNedButtonPane); } @Override - public void checkValid(){ + protected void setBasicDialogSize(Dimension dimension) { + super.setBasicDialogSize(dimension); + } + + @Override + public void checkValid() throws Exception { } } diff --git a/src/main/java/com/fanruan/api/design/ui/container/BasicPane.java b/src/main/java/com/fanruan/api/design/ui/container/BasicPane.java index c089e0c..f3052fe 100644 --- a/src/main/java/com/fanruan/api/design/ui/container/BasicPane.java +++ b/src/main/java/com/fanruan/api/design/ui/container/BasicPane.java @@ -1,5 +1,98 @@ package com.fanruan.api.design.ui.container; + +import com.fanruan.api.design.util.GUICoreKit; +import com.fr.design.dialog.DialogActionListener; +import com.fr.design.dialog.UIDialog; + +import java.awt.*; + public abstract class BasicPane extends com.fr.design.dialog.BasicPane { + /** + * 显示窗口 + * + * @param window 窗口 + * @return 对话框 + */ + public BasicDialog showWindow(Window window) { + return this.showWindow(window, null); + } + + + /** + * 显示窗口 + * + * @param window 窗口 + * @param l 对话框监听器 + * @return 对话框 + */ + public BasicDialog showWindow(Window window, DialogActionListener l) { + return showWindowWithCustomSize(window, l, BasicDialog.DEFAULT); + } + + public BasicDialog showWindowWithCustomSize(Window window, DialogActionListener l, Dimension dimension) { + BasicDialog dg; + if (window instanceof Frame) { + dg = new DIALOG((Frame) window); + } else { + dg = new DIALOG((Dialog) window); + } + + if (l != null) { + dg.addDialogActionListener(l); + } + dg.setBasicDialogSize(dimension); + GUICoreKit.centerWindow(dg); + dg.setResizable(false); + return dg; + } + + private class DIALOG extends BasicDialog { + public DIALOG(Frame parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + public DIALOG(Dialog parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public DIALOG(Frame parent, boolean isNeedButtonPane) { + super(parent, BasicPane.this, isNeedButtonPane); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public DIALOG(Dialog parent, boolean isNeedButtonPane) { + super(parent, BasicPane.this, isNeedButtonPane); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public void checkValid() throws Exception { + BasicPane.this.checkValid(); + } + + } + + private class UnsizedDialog extends UIDialog { + + public UnsizedDialog(Frame parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + public UnsizedDialog(Dialog parent) { + super(parent, BasicPane.this); + this.setTitle(BasicPane.this.title4PopupWindow()); + } + + + public void checkValid() throws Exception { + BasicPane.this.checkValid(); + } + } } diff --git a/src/main/java/com/fanruan/api/design/ui/container/DialogActionAdapter.java b/src/main/java/com/fanruan/api/design/ui/container/DialogActionAdapter.java index c7a5db5..d624c63 100644 --- a/src/main/java/com/fanruan/api/design/ui/container/DialogActionAdapter.java +++ b/src/main/java/com/fanruan/api/design/ui/container/DialogActionAdapter.java @@ -1,8 +1,8 @@ package com.fanruan.api.design.ui.container; -import com.fr.design.layout.FRGUIPaneFactory; -public class DialogActionAdapter extends com.fr.design.dialog.DialogActionAdapter{ - public DialogActionAdapter(){ +public class DialogActionAdapter extends com.fr.design.dialog.DialogActionAdapter { + + public DialogActionAdapter() { } } diff --git a/src/main/java/com/fanruan/api/design/ui/toolbar/ToolBarDef.java b/src/main/java/com/fanruan/api/design/ui/toolbar/ToolBarDef.java index 131e71e..cfbf3c8 100644 --- a/src/main/java/com/fanruan/api/design/ui/toolbar/ToolBarDef.java +++ b/src/main/java/com/fanruan/api/design/ui/toolbar/ToolBarDef.java @@ -1,10 +1,36 @@ package com.fanruan.api.design.ui.toolbar; -/* -* 用来定义工具栏 -* */ -public class ToolBarDef extends com.fr.design.menu.ToolBarDef{ - public ToolBarDef() { +import com.fanruan.api.design.ui.component.UIToolbar; +import com.fr.design.gui.itoolbar.UIToolBarUI; + +import javax.swing.*; +import java.awt.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + */ +public class ToolBarDef extends com.fr.design.menu.ToolBarDef { + + public static UIToolbar createJToolBar(final Color background) { + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); + toolbar.setUI(new UIToolBarUI() { + @Override + public void paint(Graphics g, JComponent c) { + Graphics2D g2 = (Graphics2D) g; + g2.setColor(background); + g2.fillRect(0, 0, c.getWidth(), c.getHeight()); + } + }); + toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + return toolbar; + } + + public static UIToolbar createJToolBar() { + UIToolbar toolbar = new UIToolbar(FlowLayout.LEFT); + toolbar.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + return toolbar; } } diff --git a/src/main/java/com/fanruan/api/design/util/GUICoreKit.java b/src/main/java/com/fanruan/api/design/util/GUICoreKit.java index 8446f02..1ff5155 100644 --- a/src/main/java/com/fanruan/api/design/util/GUICoreKit.java +++ b/src/main/java/com/fanruan/api/design/util/GUICoreKit.java @@ -1,7 +1,7 @@ package com.fanruan.api.design.util; -import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.utils.gui.GUICoreUtils; import javax.swing.*; import java.awt.*; @@ -100,20 +100,39 @@ public class GUICoreKit { public static void showPopupMenu(JPopupMenu menu, Component component, int x, int y) { GUICoreUtils.showPopupMenu(menu, component, x, y); } + /** * 创建一个带有左空边框的面板 * * @return 返回一个JPanel对象 */ - public static JPanel createNormalFlowInnerContainerPane(){ + public static JPanel createNormalFlowInnerContainerPane() { return FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); } + /** * 创建一个带有边框面板 * * @return 返回一个JPanel对象 */ - public static JPanel createBorderLayoutPane(){ + public static JPanel createBorderLayoutPane() { return FRGUIPaneFactory.createBorderLayout_S_Pane(); } + + /** + * 设置一个窗口居中 + */ + public static void centerWindow(Window win) { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + + Dimension winSize = win.getSize(); + + if (winSize.height > screenSize.height) { + winSize.height = screenSize.height; + } + if (winSize.width > screenSize.width) { + winSize.width = screenSize.width; + } + win.setLocation((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / 2 - 20); + } } diff --git a/src/main/java/com/fanruan/api/design/work/AbstractTableDataPane.java b/src/main/java/com/fanruan/api/design/work/AbstractTableDataPane.java new file mode 100644 index 0000000..a0bd87a --- /dev/null +++ b/src/main/java/com/fanruan/api/design/work/AbstractTableDataPane.java @@ -0,0 +1,12 @@ +package com.fanruan.api.design.work; + +import com.fr.base.TableData; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-08-30 + * 数据插件继承此抽象类 + */ +public abstract class AbstractTableDataPane extends com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane { +} diff --git a/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java b/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java index 0c5eaf9..4d6d086 100644 --- a/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java +++ b/src/main/java/com/fanruan/api/design/work/DatabaseConnectionPane.java @@ -1,7 +1,249 @@ package com.fanruan.api.design.work; +import com.fanruan.api.design.ui.component.UIButton; +import com.fanruan.api.design.ui.component.UIComboBox; +import com.fanruan.api.design.ui.component.UILabel; +import com.fanruan.api.design.ui.container.BasicBeanPane; +import com.fanruan.api.log.LogKit; +import com.fanruan.api.macro.EncodeConstants; +import com.fanruan.api.util.ArrayKit; +import com.fanruan.api.util.StringKit; +import com.fr.data.impl.Connection; +import com.fr.data.impl.JDBCDatabaseConnection; +import com.fr.data.impl.JNDIDatabaseConnection; +import com.fr.data.operator.DataOperator; +import com.fr.design.data.datapane.connect.JDBCDefPane; +import com.fr.design.data.datapane.connect.JNDIDefPane; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.scrollruler.ModLineBorder; +import com.fr.design.utils.gui.GUICoreUtils; + import javax.swing.*; -public abstract class DatabaseConnectionPane extends com.fr.design.data.datapane.connect.DatabaseConnectionPane{ +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +/** + * 数据连接面板 + * + * @param 数据连接类型 + */ +public abstract class DatabaseConnectionPane extends BasicBeanPane { + + private UILabel message; + private UIButton okButton; + private UIButton cancelButton; + private JDialog dialog; + private UILabel uiLabel; + + private UIComboBox charSetComboBox; + private String originalCharSet = null; + + public DatabaseConnectionPane() { + this.initComponents(); + } + + protected void initComponents() { + message = new UILabel(); + uiLabel = new UILabel(); + okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); + cancelButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); + String[] defaultEncode = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Encode_Auto")}; + charSetComboBox = new UIComboBox<>(ArrayKit.addAll(defaultEncode, EncodeConstants.ENCODING_ARRAY)); + this.setLayout(new BorderLayout()); + JPanel northPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + this.add(northPane, BorderLayout.NORTH); + + JPanel testPane = FRGUIPaneFactory.createNormalFlowInnerContainer_M_Pane(); + northPane.add(testPane, BorderLayout.NORTH); + UIButton testButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection")); + testPane.add(testButton); + testButton.addActionListener(testConnectionActionListener); + testPane.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 4)); + + northPane.add(mainPanel(), BorderLayout.CENTER); + + JPanel chartSetPane = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(2); + northPane.add(chartSetPane); + chartSetPane.setBorder(BorderFactory.createTitledBorder( + new ModLineBorder(ModLineBorder.TOP), + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Advanced") + )); + chartSetPane.add(GUICoreUtils.createNamedPane(charSetComboBox, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Charset") + ":")); + } + + protected abstract JPanel mainPanel(); + + @Override + public void populateBean(com.fr.data.impl.Connection ob) { + this.originalCharSet = ob.getOriginalCharsetName(); + if (StringKit.isBlank(originalCharSet)) { + this.charSetComboBox.setSelectedItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Encode_Auto")); + } else { + this.charSetComboBox.setSelectedItem(ob.getOriginalCharsetName()); + } + + populateSubDatabaseConnectionBean((E) ob); + } + + protected abstract void populateSubDatabaseConnectionBean(E ob); + + @Override + public com.fr.data.impl.Connection updateBean() { + E ob = updateSubDatabaseConnectionBean(); + + ob.setOriginalCharsetName(this.originalCharSet); + if (this.charSetComboBox.getSelectedIndex() == 0) { + ob.setNewCharsetName(null); + ob.setOriginalCharsetName(null); + } else { + ob.setNewCharsetName(EncodeConstants.ENCODING_GBK); + ob.setOriginalCharsetName(((String) this.charSetComboBox.getSelectedItem())); + + } + + return ob; + } + + protected abstract E updateSubDatabaseConnectionBean(); + + ActionListener testConnectionActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + + final SwingWorker connectionThread = new SwingWorker() { + protected Object doInBackground() throws Exception { + try { + com.fr.data.impl.Connection database = DatabaseConnectionPane.this.updateBean(); + boolean connect = DataOperator.getInstance().testConnection(database); + okButton.setEnabled(true); + message.setText(database.connectMessage(connect)); + if (connect) { + uiLabel.setIcon(UIManager.getIcon("OptionPane.informationIcon")); + message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Connection_Successfully")); + } else { + uiLabel.setIcon(UIManager.getIcon("OptionPane.errorIcon")); + message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Failed")); + } + } catch (Exception exp) { + LogKit.error(exp.getMessage(), exp); + } + return null; + } + }; + + connectionThread.execute(); + initDialogPane(); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + } + }); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.dispose(); + connectionThread.cancel(true); + } + }); + + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + connectionThread.cancel(true); + } + }); + + dialog.show(); + dialog.dispose(); + } + }; + + private void initDialogPane() { + + message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection") + "..."); + message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); + okButton.setEnabled(false); + + dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(DatabaseConnectionPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection"), true); + dialog.setSize(new Dimension(268, 118)); + okButton.setEnabled(false); + JPanel jp = new JPanel(); + JPanel upPane = new JPanel(); + JPanel downPane = new JPanel(); + uiLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); + + upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); + upPane.add(uiLabel); + upPane.add(message); + downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); + downPane.add(okButton); + downPane.add(cancelButton); + jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); + jp.add(upPane); + jp.add(downPane); + dialog.add(jp); + dialog.setResizable(false); + dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(DatabaseConnectionPane.this)); + } + + + public static class JDBC extends com.fr.design.data.datapane.connect.DatabaseConnectionPane { + private static JDBCDefPane jdbcDefPane = new JDBCDefPane(); + + @Override + protected JPanel mainPanel() { + return jdbcDefPane; + } + + @Override + protected boolean isFineBI() { + return false; + } + + @Override + protected void populateSubDatabaseConnectionBean(JDBCDatabaseConnection ob) { + jdbcDefPane.populate(ob); + } + + @Override + protected JDBCDatabaseConnection updateSubDatabaseConnectionBean() { + return jdbcDefPane.update(); + } + + @Override + protected String title4PopupWindow() { + return "JDBC"; + } + } + + public static class JNDI extends com.fr.design.data.datapane.connect.DatabaseConnectionPane { + private static JNDIDefPane jndiDefPane = new JNDIDefPane(); + + @Override + protected JPanel mainPanel() { + return jndiDefPane; + } + + @Override + protected boolean isFineBI() { + return false; + } + + @Override + protected void populateSubDatabaseConnectionBean(JNDIDatabaseConnection ob) { + jndiDefPane.populate(ob); + } + + @Override + protected JNDIDatabaseConnection updateSubDatabaseConnectionBean() { + return jndiDefPane.update(); + } + + @Override + protected String title4PopupWindow() { + return "JNDI"; + } + } -} +} \ No newline at end of file diff --git a/src/main/java/com/fanruan/api/err/UtilEvalError.java b/src/main/java/com/fanruan/api/err/UtilEvalError.java index fed9c53..db4ef1f 100644 --- a/src/main/java/com/fanruan/api/err/UtilEvalError.java +++ b/src/main/java/com/fanruan/api/err/UtilEvalError.java @@ -1,4 +1,15 @@ package com.fanruan.api.err; -public class UtilEvalError extends com.fr.stable.UtilEvalError{ +/** + * 公式计算异常 + */ +public class UtilEvalError extends com.fr.stable.UtilEvalError { + + public UtilEvalError() { + + } + + public UtilEvalError(String message) { + super(message); + } } diff --git a/src/main/java/com/fanruan/api/macro/Constants.java b/src/main/java/com/fanruan/api/macro/Constants.java new file mode 100644 index 0000000..1663ebd --- /dev/null +++ b/src/main/java/com/fanruan/api/macro/Constants.java @@ -0,0 +1,23 @@ +package com.fanruan.api.macro; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-09-02 + * 常量 + */ +public interface Constants { + + int CENTER = 0; + + int TOP = 1; + + + int LEFT = 2; + + + int BOTTOM = 3; + + + int RIGHT = 4; +} diff --git a/src/main/java/com/fanruan/api/macro/EncodeConstants.java b/src/main/java/com/fanruan/api/macro/EncodeConstants.java index a26e822..b917229 100644 --- a/src/main/java/com/fanruan/api/macro/EncodeConstants.java +++ b/src/main/java/com/fanruan/api/macro/EncodeConstants.java @@ -45,4 +45,18 @@ public interface EncodeConstants { * cp850编码 */ String ENCODING_CP850 = com.fr.stable.EncodeConstants.ENCODING_CP850; + + /** + * 所有编码的集合 + */ + String[] ENCODING_ARRAY = { + ENCODING_GBK, + ENCODING_BIG5, + ENCODING_ISO_8859_1, + ENCODING_UTF_8, + ENCODING_UTF_16, + ENCODING_EUC_JP, + ENCODING_EUC_KR, + ENCODING_CP850 + }; } diff --git a/src/main/java/com/fanruan/api/net/CloudKit.java b/src/main/java/com/fanruan/api/net/CloudKit.java index 775ea6e..27eae54 100644 --- a/src/main/java/com/fanruan/api/net/CloudKit.java +++ b/src/main/java/com/fanruan/api/net/CloudKit.java @@ -20,7 +20,7 @@ public class CloudKit { * @param defaultSiteUrl 默认值 * @return 键对应的值,如果没有值则返回默认值 */ - public @Nullable String acquireUrlByKind(@NotNull String kind, @NotNull String defaultSiteUrl) { + public static @Nullable String acquireUrlByKind(@NotNull String kind, @NotNull String defaultSiteUrl) { return CloudCenter.getInstance().acquireUrlByKind(kind, defaultSiteUrl); } @@ -30,7 +30,7 @@ public class CloudKit { * @param kind 键 * @return 键对应的值,如果没有值则返回空 */ - public @Nullable String acquireUrlByKind(@NotNull String kind) { + public static @Nullable String acquireUrlByKind(@NotNull String kind) { return CloudCenter.getInstance().acquireUrlByKind(kind); } } diff --git a/src/main/java/com/fanruan/api/util/AssistKit.java b/src/main/java/com/fanruan/api/util/AssistKit.java index 5fd70ae..4f52ac3 100644 --- a/src/main/java/com/fanruan/api/util/AssistKit.java +++ b/src/main/java/com/fanruan/api/util/AssistKit.java @@ -5,8 +5,8 @@ import com.fr.stable.AssistUtils; public class AssistKit { /** * 比较两个双精度浮点型数据是否相等 - * @param parm1 - * @param parm2 + * @param parm1 第一个double数据 + * @param parm2 第二个double数据 * @return 相等返回true 错误返回false */ public static boolean equals(double parm1, double parm2) { @@ -15,8 +15,8 @@ public class AssistKit { /** * 比较两个单精度浮点型数据是否相等 - * @param parm1 - * @param parm2 + * @param parm1 第一个float数据 + * @param parm2 第二个float数据 * @return 相等返回true 错误返回false */ public static boolean equals(float parm1, float parm2) { @@ -25,8 +25,8 @@ public class AssistKit { /** * 判断两个Object类型数据是否相等 - * @param parm1 - * @param parm2 + * @param parm1 第一个Object数据 + * @param parm2 第二个 * @return 相等返回true 错误返回false */ public static boolean equals(Object parm1, Object parm2) { @@ -35,8 +35,8 @@ public class AssistKit { /** * 判断两个int类型数据是否相等 - * @param parm1 - * @param parm2 + * @param parm1 第一个int数据 + * @param parm2 第二个int数据 * @return 相等返回0,如果parm1大于parm2 返回1否则返回-1 */ public static int compare(int parm1, int parm2) { @@ -45,8 +45,8 @@ public class AssistKit { /** * 判断两个long类型数据是否相等 - * @param parm1 - * @param parm2 + * @param parm1 第一个long数据 + * @param parm2 第二个long数据 * @return 相等返回0,如果parm1大于parm2 返回1否则返回-1 */ public static int compare(long parm1, long parm2) { @@ -55,7 +55,7 @@ public class AssistKit { /** * 生成对象的哈希码值 - * @param parm + * @param parm 需要获取hashcode的Object数据 * @return 返回对象的哈希码值 */ public static int hashCode(Object... parm) { @@ -64,22 +64,11 @@ public class AssistKit { /** * 返回反映这个对象的字符串 - * @param parm + * @param parm 需要获取描述字符串的Object数据 * @return 返回反映这个对象的字符串 */ public static String toString(Object parm) { return AssistUtils.toString(parm); } - /** - * - * @param parm1 - * @param parm2 - * @return - */ -// public static String toString(Object parm1, String... parm2) { -// return AssistUtils.toString(parm1, parm2); -// } - - } diff --git a/src/main/java/com/fanruan/api/util/IOKit.java b/src/main/java/com/fanruan/api/util/IOKit.java index 5b223e7..d7b560d 100644 --- a/src/main/java/com/fanruan/api/util/IOKit.java +++ b/src/main/java/com/fanruan/api/util/IOKit.java @@ -125,6 +125,19 @@ public class IOKit { return CommonIOUtils.inputStream2String(is, charset.toString()); } + /** + * 从输入流中按指定的编码读取字符串 + * + * @param is 输入流 + * @param charset 读取字符串的编码方式 + * @return 读取出来的字符串 + * @throws UnsupportedEncodingException 编码类型不支持则抛出此异常 + */ + public static String inputStream2String(InputStream is, String charset) + throws UnsupportedEncodingException { + return CommonIOUtils.inputStream2String(is, charset); + } + /** * 将输入流转为byte数组 *

@@ -214,6 +227,7 @@ public class IOKit { /** * 关闭通道 + * * @param device 通道 */ public static void close(Channel device) { @@ -222,6 +236,7 @@ public class IOKit { /** * 关闭输出流 + * * @param stream 输出流 */ public static void close(OutputStream stream) { @@ -230,6 +245,7 @@ public class IOKit { /** * 关闭输入流 + * * @param stream 输入流 */ public static void close(InputStream stream) { diff --git a/src/main/java/com/fanruan/api/xml/XmlKit.java b/src/main/java/com/fanruan/api/xml/XmlKit.java index 921739f..89de42a 100644 --- a/src/main/java/com/fanruan/api/xml/XmlKit.java +++ b/src/main/java/com/fanruan/api/xml/XmlKit.java @@ -1,9 +1,13 @@ package com.fanruan.api.xml; -import com.fr.stable.xml.*; import com.fr.data.core.DataCoreXmlUtils; import com.fr.data.impl.Connection; import com.fr.general.xml.GeneralXMLTools; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLTools; +import com.fr.stable.xml.XMLable; +import com.fr.stable.xml.XMLableReader; import java.io.InputStream; @@ -42,21 +46,34 @@ public class XmlKit { public static void writeXMLable(XMLPrintWriter writer, XMLable xml, String tagName) { GeneralXMLTools.writeXMLable(writer, xml, tagName); } + /** * 读取connection对象 + * * @param reader XMLableReader对象 * @return Connection对象 - * */ public static Connection readXMLConnectionMap(XMLableReader reader) { return DataCoreXmlUtils.readXMLConnectionMap(reader); } + + /** + * 从xml中读取数据连接对象 + * @param reader xml读取器 + * @return 数据连接对象 + */ + public static Connection readXMLConnection(XMLableReader reader) { + return DataCoreXmlUtils.readXMLConnection(reader); + } + /** * 写connection对象 - * @param writer XMLPrintWriter对象 + * + * @param writer XMLPrintWriter对象 * @param connection Connection对象 */ public static void writeXMLConnection(XMLPrintWriter writer, Connection connection) { DataCoreXmlUtils.writeXMLConnection(writer, connection); } + } diff --git a/src/test/java/com/fanruan/api/cal/FormulaKitTest.java b/src/test/java/com/fanruan/api/cal/FormulaKitTest.java index c54ec7f..abed6cb 100644 --- a/src/test/java/com/fanruan/api/cal/FormulaKitTest.java +++ b/src/test/java/com/fanruan/api/cal/FormulaKitTest.java @@ -2,9 +2,11 @@ package com.fanruan.api.cal; import com.fanruan.api.Prepare; import com.fanruan.api.err.KitError; +import com.fr.base.BaseFormula; import com.fr.base.Formula; import com.fr.base.ParameterMapNameSpace; import com.fr.script.Calculator; +import com.fr.stable.UtilEvalError; import com.fr.stable.script.CalculatorProvider; import org.junit.Assert; import org.junit.Test; @@ -43,6 +45,19 @@ public class FormulaKitTest extends Prepare { Assert.fail(); } } + + @Test + public void testScriptFormula() { + BaseFormula formula = FormulaKit.newScriptFormula("=return Math.abs(-1)"); + CalculatorProvider provider = CalculatorKit.createCalculator(); + try { + Object r = formula.evalValue(provider); + Assert.assertEquals(1, r); + } catch (Exception e) { + e.printStackTrace(); + } + } + @Test public void testCheckFormulaContent() { assertEquals(true, FormulaKit.checkFormulaContent(new Formula(""))); diff --git a/src/test/java/com/fanruan/api/net/http/HttpKitTest.java b/src/test/java/com/fanruan/api/net/http/HttpKitTest.java index a034a4a..b038634 100644 --- a/src/test/java/com/fanruan/api/net/http/HttpKitTest.java +++ b/src/test/java/com/fanruan/api/net/http/HttpKitTest.java @@ -1,6 +1,7 @@ package com.fanruan.api.net.http; import com.fanruan.api.Prepare; +import com.fanruan.api.macro.EncodeConstants; import com.fanruan.api.net.http.rs.HttpRequest; import com.fanruan.api.net.http.rs.HttpResponseType; import com.fanruan.api.net.http.rs.StreamResponseHandle; @@ -72,6 +73,8 @@ public class HttpKitTest extends Prepare { InputStream in = HttpKit.post("https://cloud.fanruan.com/site", map, HttpResponseType.STREAM); String text = IOKit.inputStream2String(in, StandardCharsets.UTF_8); assertEquals("{\"value\":\"http://bbs.fanruan.com/\"}", text); + String text2 = IOKit.inputStream2String(in, EncodeConstants.ENCODING_UTF_8); + assertEquals("{\"value\":\"http://bbs.fanruan.com/\"}", text2); } catch (SocketTimeoutException ignore) { } catch (Exception e) { e.printStackTrace();