From e978dfa13c20bf6a3a929f15c6336834dd3ae969 Mon Sep 17 00:00:00 2001 From: richie Date: Fri, 30 Aug 2019 19:16:32 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fanruan/api/design/macro/UIConstants.java | 5 + .../design/ui/component/UIRoundedBorder.java | 11 +- .../design/ui/component/UITitledBorder.java | 72 +++++ .../ui/container/DialogActionAdapter.java | 6 +- .../design/work/DatabaseConnectionPane.java | 246 +++++++++++++++++- .../fanruan/api/macro/EncodeConstants.java | 14 + 6 files changed, 344 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/fanruan/api/design/ui/component/UITitledBorder.java 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 471cae3..bfdf0d9 100644 --- a/src/main/java/com/fanruan/api/design/macro/UIConstants.java +++ b/src/main/java/com/fanruan/api/design/macro/UIConstants.java @@ -12,6 +12,11 @@ public interface UIConstants { */ Color LINE_COLOR = new Color(153, 153, 153); + /** + * 带标题的边框的颜色 + */ + Color TITLED_BORDER_COLOR = new Color(0xe8e8e9); + /** * 圆角弧度 */ 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/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/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/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 + }; }