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.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.*; 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 com.fr.design.beans.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"; } } }