From 660245b951d4139404f42aa1ed74c5efabb44f7b Mon Sep 17 00:00:00 2001 From: BangMaple Date: Sun, 5 Apr 2020 17:26:48 +0700 Subject: [PATCH] Add files via upload --- nbactions.xml | 46 + pom.xml | 54 + .../CutCopyPasteActionSupport.java | 58 + .../jdbcgenerator/DraggableTabbedPane.java | 135 + .../jdbcgenerator/MainController.form | 1545 +++++++++++ .../jdbcgenerator/MainController.java | 2472 +++++++++++++++++ .../bangmaple/jdbcgenerator/MotionPanel.java | 53 + src/main/resources/icons8_minus_18px_1.png | Bin 0 -> 127 bytes src/main/resources/icons8_multiply_18px_1.png | Bin 0 -> 260 bytes .../icons8_rectangle_stroked_18px.png | Bin 0 -> 169 bytes src/main/resources/jdbc.png | Bin 0 -> 13738 bytes src/main/resources/logo.png | Bin 0 -> 37223 bytes 12 files changed, 4363 insertions(+) create mode 100644 nbactions.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/bangmaple/jdbcgenerator/CutCopyPasteActionSupport.java create mode 100644 src/main/java/com/bangmaple/jdbcgenerator/DraggableTabbedPane.java create mode 100644 src/main/java/com/bangmaple/jdbcgenerator/MainController.form create mode 100644 src/main/java/com/bangmaple/jdbcgenerator/MainController.java create mode 100644 src/main/java/com/bangmaple/jdbcgenerator/MotionPanel.java create mode 100644 src/main/resources/icons8_minus_18px_1.png create mode 100644 src/main/resources/icons8_multiply_18px_1.png create mode 100644 src/main/resources/icons8_rectangle_stroked_18px.png create mode 100644 src/main/resources/jdbc.png create mode 100644 src/main/resources/logo.png diff --git a/nbactions.xml b/nbactions.xml new file mode 100644 index 0000000..5a8be95 --- /dev/null +++ b/nbactions.xml @@ -0,0 +1,46 @@ + + + + run + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -classpath %classpath com.bangmaple.jdbcgenerator.MainController + java + + + + debug + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address} -classpath %classpath com.bangmaple.jdbcgenerator.MainController + java + true + + + + profile + + jar + + + process-classes + org.codehaus.mojo:exec-maven-plugin:1.5.0:exec + + + -classpath %classpath com.bangmaple.jdbcgenerator.MainController + java + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ef2d030 --- /dev/null +++ b/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + com.bangmaple + BangMapleJDBCGenerator + 1.0-SNAPSHOT + jar + + + UTF-8 + 1.8 + 1.8 + + + + io.github.vincenzopalazzo + material-ui-swing + 1.1.1_pre-release_6.1 + + + com.microsoft.sqlserver + sqljdbc4 + 4.0 + + + + + + maven-assembly-plugin + 3.2.0 + + + jar-with-dependencies + + + + com.bangmaple.jdbcgenerator.MainController + + + + + + make-assembly + package + + single + + + + + + + BangMapleJDBCGenerator + diff --git a/src/main/java/com/bangmaple/jdbcgenerator/CutCopyPasteActionSupport.java b/src/main/java/com/bangmaple/jdbcgenerator/CutCopyPasteActionSupport.java new file mode 100644 index 0000000..65ad2a3 --- /dev/null +++ b/src/main/java/com/bangmaple/jdbcgenerator/CutCopyPasteActionSupport.java @@ -0,0 +1,58 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.bangmaple.jdbcgenerator; + +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; +import javax.swing.AbstractAction; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.text.DefaultEditorKit; +import javax.swing.text.JTextComponent; +import javax.swing.text.TextAction; + +/** + * + * @author bangmaple + */ +public class CutCopyPasteActionSupport { + private JMenu jMenu; + JPopupMenu popupMenu = new JPopupMenu(); + + public CutCopyPasteActionSupport() { + init(); + } + + private void init() { + jMenu = new JMenu("Edit"); + addAction(new DefaultEditorKit.CutAction(), KeyEvent.VK_X, "Cut" ); + addAction(new DefaultEditorKit.CopyAction(), KeyEvent.VK_C, "Copy" ); + addAction(new DefaultEditorKit.PasteAction(), KeyEvent.VK_V, "Paste" ); + } + + private void addAction(TextAction action, int key, String text) { + action.putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(key, InputEvent.CTRL_DOWN_MASK)); + action.putValue(AbstractAction.NAME, text); + jMenu.add(new JMenuItem(action)); + popupMenu.add(new JMenuItem(action)); + } + + public void setPopup(JTextComponent... components){ + if(components == null){ + return; + } + for (JTextComponent tc : components) { + tc.setComponentPopupMenu(popupMenu); + } + } + + public JMenu getMenu() { + return jMenu; + } +} \ No newline at end of file diff --git a/src/main/java/com/bangmaple/jdbcgenerator/DraggableTabbedPane.java b/src/main/java/com/bangmaple/jdbcgenerator/DraggableTabbedPane.java new file mode 100644 index 0000000..168d5fd --- /dev/null +++ b/src/main/java/com/bangmaple/jdbcgenerator/DraggableTabbedPane.java @@ -0,0 +1,135 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.bangmaple.jdbcgenerator; + +/** + * + * @author bangmaple + */ +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Image; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import java.awt.image.BufferedImage; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JTabbedPane; + +public class DraggableTabbedPane extends JTabbedPane { + + private boolean dragging = false; + private Image tabImage = null; + private Point currentMouseLocation = null; + private int draggedTabIndex = 0; + + public DraggableTabbedPane(final JFrame parent) { + super(); + addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + + if (!dragging) { + // Gets the tab index based on the mouse position + int tabNumber = getUI().tabForCoordinate(DraggableTabbedPane.this, e.getX(), e.getY()); + + if (tabNumber >= 0) { + draggedTabIndex = tabNumber; + Rectangle bounds = getUI().getTabBounds(DraggableTabbedPane.this, tabNumber); + + // Paint the tabbed pane to a buffer + Image totalImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics totalGraphics = totalImage.getGraphics(); + totalGraphics.setClip(bounds); + // Don't be double buffered when painting to a static image. + setDoubleBuffered(false); + paintComponent(totalGraphics); + + // Paint just the dragged tab to the buffer + tabImage = new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_ARGB); + Graphics graphics = tabImage.getGraphics(); + graphics.drawImage(totalImage, 0, 0, bounds.width, bounds.height, bounds.x, bounds.y, bounds.x + bounds.width, bounds.y + bounds.height, DraggableTabbedPane.this); + + dragging = true; + repaint(); + } + int thisX = parent.getLocation().x; + int thisY = parent.getLocation().y; + + int xMoved = e.getX() - currentMouseLocation.x; + int yMoved = e.getY() - currentMouseLocation.y; + + int X = thisX + xMoved; + int Y = thisY + yMoved; + parent.setLocation(X, Y); + } else { + currentMouseLocation = e.getPoint(); + + // Need to repaint + repaint(); + } + + super.mouseDragged(e); + } + }); + + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + currentMouseLocation = e.getPoint(); + getComponentAt(currentMouseLocation); + } + + @Override + public void mouseReleased(MouseEvent e) { + + if (dragging) { + int tabNumber = getUI().tabForCoordinate(DraggableTabbedPane.this, e.getX(), 10); + + if (tabNumber >= 0) { + Component comp = getComponentAt(draggedTabIndex); + String title = getTitleAt(draggedTabIndex); + removeTabAt(draggedTabIndex); + insertTab(title, null, comp, null, tabNumber); + } + } + + dragging = false; + tabImage = null; + } + }); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + // Are we dragging? + if (dragging && currentMouseLocation != null && tabImage != null) { + // Draw the dragged tab + g.drawImage(tabImage, currentMouseLocation.x, currentMouseLocation.y, this); + } + } + +// public static void main(String[] args) { +// JFrame test = new JFrame("Tab test"); +// test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); +// test.setSize(400, 400); +// +// DraggableTabbedPane tabs = new DraggableTabbedPane(); +// tabs.addTab("One", new JButton("One")); +// tabs.addTab("Two", new JButton("Two")); +// tabs.addTab("Three", new JButton("Three")); +// tabs.addTab("Four", new JButton("Four")); +// +// test.add(tabs); +// test.setVisible(true); +// } +} diff --git a/src/main/java/com/bangmaple/jdbcgenerator/MainController.form b/src/main/java/com/bangmaple/jdbcgenerator/MainController.form new file mode 100644 index 0000000..651d60c --- /dev/null +++ b/src/main/java/com/bangmaple/jdbcgenerator/MainController.form @@ -0,0 +1,1545 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
diff --git a/src/main/java/com/bangmaple/jdbcgenerator/MainController.java b/src/main/java/com/bangmaple/jdbcgenerator/MainController.java new file mode 100644 index 0000000..958c30a --- /dev/null +++ b/src/main/java/com/bangmaple/jdbcgenerator/MainController.java @@ -0,0 +1,2472 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.bangmaple.jdbcgenerator; + +import java.awt.Component; +import java.awt.HeadlessException; +import java.awt.event.ActionEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.StringTokenizer; +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import mdlaf.MaterialLookAndFeel; +import mdlaf.themes.JMarsDarkTheme; +import javax.swing.JFileChooser; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; + +/** + * + * @author bangmaple + */ +public class MainController extends javax.swing.JFrame { + + private static String SAVE_FILE_PATH = ""; + private static Boolean HAVE_A_PACKAGE_NAME = Boolean.FALSE; + private static String SYSTEM_SLASH = "/"; + + public MainController() { + initFrame(); + popupMenu(); + loadLogo(); + changeSlash(); + } + + private void initFrame() { + this.setResizable(false); + this.setUndecorated(true); + this.setLayout(null); + initComponents(); + this.setLocationRelativeTo(null); + setTableColumnSize(); + chkPublic.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (!chkPublic.isSelected()) { + JOptionPane.showMessageDialog(null, new StringBuilder("Remember when removing ") + .append("\"public\" modifier could make other classes in ") + .append("other packages can't access to this.").toString()); + } + } + }); + chkFinal.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (chkFinal.isSelected()) { + JOptionPane.showMessageDialog(null, new StringBuilder("Remember when adding ") + .append("\"final\" modifier make this class can't be inherited!").toString()); + } + } + }); + } + + private void changeSlash() { + if (System.getProperty("os.name").toUpperCase().contains("WINDOWS")) { + SYSTEM_SLASH = "\\"; + } + } + + private void setTableColumnSize() { + int[] columnsWidth = {90, 85, 200, 75, 70}; + int i = 0; + for (int columnWidthSize : columnsWidth) { + TableColumn column = jTable1.getColumnModel().getColumn(i++); + column.setMinWidth(columnWidthSize); + column.setMaxWidth(columnWidthSize); + column.setPreferredWidth(columnWidthSize); + } + } + + private void loadLogo() { + Icon logoIcon = new ImageIcon(new ImageIcon(getClass() + .getResource("/logo.png")).getImage() + .getScaledInstance(250, 45, java.awt.Image.SCALE_SMOOTH)); + lblLogo.setIcon(logoIcon); + Icon logoJDBC = new ImageIcon(new ImageIcon(getClass() + .getResource("/jdbc.png")).getImage() + .getScaledInstance(120, 50, java.awt.Image.SCALE_SMOOTH)); + lblLogoJDBC.setIcon(logoJDBC); + Icon closeIcon = new ImageIcon(new ImageIcon(getClass() + .getResource("/icons8_multiply_18px_1.png")).getImage() + .getScaledInstance(18, 18, java.awt.Image.SCALE_SMOOTH)); + lblClose.setIcon(closeIcon); + + Icon minMaxIcon = new ImageIcon(new ImageIcon(getClass() + .getResource("/icons8_rectangle_stroked_18px.png")).getImage() + .getScaledInstance(18, 18, java.awt.Image.SCALE_SMOOTH)); + lblMaxMin.setIcon(minMaxIcon); + + Icon minIcon = new ImageIcon(new ImageIcon(getClass() + .getResource("/icons8_minus_18px_1.png")).getImage() + .getScaledInstance(18, 18, java.awt.Image.SCALE_SMOOTH)); + lblMin.setIcon(minIcon); + + } + + private void popupMenu() { + CutCopyPasteActionSupport support = new CutCopyPasteActionSupport(); + support.setPopup(txtProjectName, txtClassNameJDBC, + txtClassNameJDBCDAO, txtDBName, txtClassName, + txtClassNameJDBCDAO, txtPassword, txtUsername, txtPackageName, + txtExtendsDTO, txtImplementsDTO, txtGetConnection); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + jPanel9 = new javax.swing.JPanel(); + jTabbedPane1 = new DraggableTabbedPane(this); + jPanel1 = new MotionPanel(this); + jSeparator1 = new javax.swing.JSeparator(); + jLabel11 = new javax.swing.JLabel(); + jPanel11 = new javax.swing.JPanel(); + jLabel10 = new javax.swing.JLabel(); + txtClassName = new javax.swing.JTextField(); + chkPublicDTO = new javax.swing.JCheckBox(); + jLabel15 = new javax.swing.JLabel(); + txtExtendsDTO = new javax.swing.JTextField(); + jLabel16 = new javax.swing.JLabel(); + txtImplementsDTO = new javax.swing.JTextField(); + jSeparator2 = new javax.swing.JSeparator(); + chkFinalDTO = new javax.swing.JCheckBox(); + chkSerializableDTO = new javax.swing.JCheckBox(); + btnGenerateEntity = new javax.swing.JButton(); + jScrollPane2 = new javax.swing.JScrollPane(); + jTable1 = new javax.swing.JTable(); + jLabel18 = new javax.swing.JLabel(); + jPanel2 = new MotionPanel(this); + jPanel3 = new javax.swing.JPanel(); + jLabel3 = new javax.swing.JLabel(); + txtIP = new javax.swing.JTextField(); + jLabel4 = new javax.swing.JLabel(); + txtPort = new javax.swing.JTextField(); + jLabel5 = new javax.swing.JLabel(); + txtUsername = new javax.swing.JTextField(); + jLabel6 = new javax.swing.JLabel(); + txtPassword = new javax.swing.JPasswordField(); + jLabel7 = new javax.swing.JLabel(); + txtDBName = new javax.swing.JTextField(); + jLabel8 = new javax.swing.JLabel(); + jPanel13 = new javax.swing.JPanel(); + txtClassNameJDBC = new javax.swing.JTextField(); + jLabel1 = new javax.swing.JLabel(); + chkPublic = new javax.swing.JCheckBox(); + chkFinal = new javax.swing.JCheckBox(); + chkSerializable = new javax.swing.JCheckBox(); + btnChooseProject = new javax.swing.JButton(); + btnConnect = new javax.swing.JButton(); + jPanel8 = new javax.swing.JPanel(); + jLabel9 = new javax.swing.JLabel(); + jLabel14 = new javax.swing.JLabel(); + txtGetConnection = new javax.swing.JTextField(); + cbGetConnection = new javax.swing.JComboBox<>(); + jPanel6 = new MotionPanel(this); + jPanel12 = new javax.swing.JPanel(); + txtClassNameJDBCDAO = new javax.swing.JTextField(); + jLabel12 = new javax.swing.JLabel(); + chkPublicJDBCDAO = new javax.swing.JCheckBox(); + chkFinalJDBCDAO = new javax.swing.JCheckBox(); + btnGenerateJDBCDAO = new javax.swing.JButton(); + chkImplSerializable = new javax.swing.JCheckBox(); + jPanel7 = new javax.swing.JPanel(); + chkConnection = new javax.swing.JCheckBox(); + chkPreparedStatement = new javax.swing.JCheckBox(); + chkResultSet = new javax.swing.JCheckBox(); + chkGetterConnectionJDBCDAO = new javax.swing.JCheckBox(); + chkGetterPreparedStatementJDBCDAO = new javax.swing.JCheckBox(); + chkSetterPreparedStatementJDBCDAO = new javax.swing.JCheckBox(); + chkSetterConnectionJDBCDAO = new javax.swing.JCheckBox(); + cbPreparedStatementModifier = new javax.swing.JComboBox<>(); + cbConnectionModifier = new javax.swing.JComboBox<>(); + cbResultSetModifier = new javax.swing.JComboBox<>(); + chkGetterResultSetJDBCDAO = new javax.swing.JCheckBox(); + chkSetterResultSetJDBCDAO = new javax.swing.JCheckBox(); + jSeparator5 = new javax.swing.JSeparator(); + jSeparator6 = new javax.swing.JSeparator(); + jPanel10 = new javax.swing.JPanel(); + chkAddJDBCDAO = new javax.swing.JCheckBox(); + chkRemoveJDBCDAO = new javax.swing.JCheckBox(); + chkFindJDBCDAO = new javax.swing.JCheckBox(); + chkUpdateJDBCDAO = new javax.swing.JCheckBox(); + chkgetAllJDBCDAO = new javax.swing.JCheckBox(); + chkCloseConnection = new javax.swing.JCheckBox(); + cbAddModifier = new javax.swing.JComboBox<>(); + cbGetAllModifier = new javax.swing.JComboBox<>(); + cbUpdateModifier = new javax.swing.JComboBox<>(); + cbFindModifier = new javax.swing.JComboBox<>(); + cbRemoveModifier = new javax.swing.JComboBox<>(); + cbCloseConnectionModifier = new javax.swing.JComboBox<>(); + lblMaxMin = new javax.swing.JLabel(); + lblMin = new javax.swing.JLabel(); + lblClose = new javax.swing.JLabel(); + lblLogo = new javax.swing.JLabel(); + lblLogoJDBC = new javax.swing.JLabel(); + txtProjectName = new javax.swing.JTextField(); + txtPackageName = new javax.swing.JTextField(); + jLabel2 = new javax.swing.JLabel(); + jLabel13 = new javax.swing.JLabel(); + jLabel17 = new javax.swing.JLabel(); + txtInfo = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + + jLabel11.setText("Class attribute(s)"); + + jPanel11.setBorder(javax.swing.BorderFactory.createTitledBorder("Class generation")); + + jLabel10.setText("Class name:"); + + txtClassName.setText("GenericDTO"); + + chkPublicDTO.setSelected(true); + chkPublicDTO.setText("public"); + + jLabel15.setText("extends"); + + jLabel16.setText("implements (separating by ,)"); + + chkFinalDTO.setText("final"); + + chkSerializableDTO.setText("implements java.io.Serializable"); + + javax.swing.GroupLayout jPanel11Layout = new javax.swing.GroupLayout(jPanel11); + jPanel11.setLayout(jPanel11Layout); + jPanel11Layout.setHorizontalGroup( + jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSeparator2) + .addGroup(jPanel11Layout.createSequentialGroup() + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel11Layout.createSequentialGroup() + .addGap(6, 6, 6) + .addComponent(jLabel10) + .addGap(18, 18, 18) + .addComponent(txtClassName, javax.swing.GroupLayout.PREFERRED_SIZE, 430, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel11Layout.createSequentialGroup() + .addContainerGap() + .addComponent(chkSerializableDTO))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 26, Short.MAX_VALUE) + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(chkFinalDTO) + .addComponent(chkPublicDTO)) + .addGap(19, 19, 19)) + .addGroup(jPanel11Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel15) + .addComponent(jLabel16)) + .addGap(18, 18, 18) + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(txtExtendsDTO, javax.swing.GroupLayout.DEFAULT_SIZE, 390, Short.MAX_VALUE) + .addComponent(txtImplementsDTO)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel11Layout.setVerticalGroup( + jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel11Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel10) + .addComponent(txtClassName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chkPublicDTO)) + .addGap(12, 12, 12) + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkSerializableDTO) + .addComponent(chkFinalDTO)) + .addGap(3, 3, 3) + .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel15) + .addComponent(txtExtendsDTO, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(txtImplementsDTO, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel16)) + .addGap(15, 15, 15)) + ); + + btnGenerateEntity.setText("Select project path and generate..."); + btnGenerateEntity.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnGenerateEntityActionPerformed(evt); + } + }); + + jTable1.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {"private", "String", "id", new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", "String", "name", new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)}, + {"", null, null, new Boolean(true), new Boolean(true), new Boolean(false)} + }, + new String [] { + "Modifier", "Type", "Name", "Getter", "Setter", "Constructor" + } + ) { + Class[] types = new Class [] { + java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Boolean.class, java.lang.Boolean.class, java.lang.Boolean.class + }; + + public Class getColumnClass(int columnIndex) { + return types [columnIndex]; + } + }); + jScrollPane2.setViewportView(jTable1); + + jLabel18.setText("Input the properties into the cells before generating if you want"); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 735, Short.MAX_VALUE) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(154, 154, 154) + .addComponent(btnGenerateEntity, javax.swing.GroupLayout.PREFERRED_SIZE, 365, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(262, 262, 262) + .addComponent(jLabel11)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(120, 120, 120) + .addComponent(jLabel18)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 660, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(jLabel18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 184, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel11) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(btnGenerateEntity, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + jTabbedPane1.addTab("Class (DTO)", jPanel1); + + jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("SQL Connection")); + + jLabel3.setText("IP Address:"); + + txtIP.setText("127.0.0.1"); + + jLabel4.setText("Port:"); + + txtPort.setText("1433"); + + jLabel5.setText("Username:"); + + txtUsername.setText("sa"); + + jLabel6.setText("Password:"); + + jLabel7.setText("Database name:"); + + jLabel8.setText("(Leave blank for 'master')"); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(jLabel7) + .addGap(18, 18, 18)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addComponent(jLabel5) + .addGap(52, 52, 52))) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(jLabel3) + .addGap(48, 48, 48))) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(txtUsername, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtIP, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 200, Short.MAX_VALUE) + .addComponent(txtDBName)) + .addGap(46, 46, 46) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel8) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGap(15, 15, 15) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel6) + .addComponent(jLabel4)) + .addGap(18, 18, 18) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(txtPort, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE) + .addComponent(txtPassword)))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(txtIP, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel4) + .addComponent(txtPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel5) + .addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel6) + .addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel7) + .addComponent(txtDBName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel8)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jPanel13.setBorder(javax.swing.BorderFactory.createTitledBorder("Class generation")); + jPanel13.setPreferredSize(new java.awt.Dimension(400, 148)); + + txtClassNameJDBC.setText("DBUtils"); + + jLabel1.setText("Class name:"); + + chkPublic.setSelected(true); + chkPublic.setText("public"); + + chkFinal.setText("final"); + + chkSerializable.setText("implements Serializable"); + + btnChooseProject.setText("Select project path and generate..."); + btnChooseProject.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnChooseProjectActionPerformed(evt); + } + }); + + btnConnect.setText("Check connection only"); + btnConnect.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnConnectActionPerformed(evt); + } + }); + + javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13); + jPanel13.setLayout(jPanel13Layout); + jPanel13Layout.setHorizontalGroup( + jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel13Layout.createSequentialGroup() + .addGroup(jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel13Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(jPanel13Layout.createSequentialGroup() + .addComponent(jLabel1) + .addGap(18, 18, 18) + .addComponent(txtClassNameJDBC, javax.swing.GroupLayout.PREFERRED_SIZE, 520, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel13Layout.createSequentialGroup() + .addComponent(chkPublic) + .addGap(18, 18, 18) + .addComponent(chkFinal) + .addGap(18, 18, 18) + .addComponent(chkSerializable) + .addGap(49, 49, 49) + .addComponent(btnConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addGroup(jPanel13Layout.createSequentialGroup() + .addGap(145, 145, 145) + .addComponent(btnChooseProject, javax.swing.GroupLayout.PREFERRED_SIZE, 340, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addContainerGap(7, Short.MAX_VALUE)) + ); + jPanel13Layout.setVerticalGroup( + jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel13Layout.createSequentialGroup() + .addGap(12, 12, 12) + .addGroup(jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel1) + .addComponent(txtClassNameJDBC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkPublic) + .addComponent(chkSerializable) + .addComponent(chkFinal) + .addComponent(btnConnect)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(btnChooseProject) + .addContainerGap(26, Short.MAX_VALUE)) + ); + + jPanel8.setBorder(javax.swing.BorderFactory.createTitledBorder("Connection - Method generation")); + + jLabel9.setText("Method name:"); + + jLabel14.setText("Method type:"); + + txtGetConnection.setText("getConnection"); + + cbGetConnection.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + + javax.swing.GroupLayout jPanel8Layout = new javax.swing.GroupLayout(jPanel8); + jPanel8.setLayout(jPanel8Layout); + jPanel8Layout.setHorizontalGroup( + jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel8Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel9) + .addComponent(jLabel14)) + .addGap(18, 18, 18) + .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtGetConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbGetConnection, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel8Layout.setVerticalGroup( + jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel8Layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel9) + .addComponent(txtGetConnection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addGroup(jPanel8Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel14) + .addComponent(cbGetConnection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jPanel13, javax.swing.GroupLayout.DEFAULT_SIZE, 639, Short.MAX_VALUE) + .addComponent(jPanel8, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(0, 0, 0)) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel2Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jPanel13, javax.swing.GroupLayout.DEFAULT_SIZE, 180, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(jPanel8, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + + jTabbedPane1.addTab("JDBC Utils", jPanel2); + + jPanel12.setBorder(javax.swing.BorderFactory.createTitledBorder("Class generation")); + + txtClassNameJDBCDAO.setText("GenericDAO"); + + jLabel12.setText("Class name:"); + + chkPublicJDBCDAO.setSelected(true); + chkPublicJDBCDAO.setText("public"); + + chkFinalJDBCDAO.setText("final"); + + btnGenerateJDBCDAO.setText("Select project path and generate..."); + btnGenerateJDBCDAO.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnGenerateJDBCDAOActionPerformed(evt); + } + }); + + chkImplSerializable.setText("impl. Serializable"); + + javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12); + jPanel12.setLayout(jPanel12Layout); + jPanel12Layout.setHorizontalGroup( + jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel12Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel12Layout.createSequentialGroup() + .addComponent(jLabel12) + .addGap(29, 29, 29) + .addComponent(txtClassNameJDBCDAO)) + .addGroup(jPanel12Layout.createSequentialGroup() + .addComponent(chkPublicJDBCDAO) + .addGap(18, 18, 18) + .addComponent(chkFinalJDBCDAO) + .addGap(18, 18, 18) + .addComponent(chkImplSerializable) + .addGap(18, 18, 18) + .addComponent(btnGenerateJDBCDAO, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addContainerGap()) + ); + jPanel12Layout.setVerticalGroup( + jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel12Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(txtClassNameJDBCDAO, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel12)) + .addGap(21, 21, 21) + .addGroup(jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkPublicJDBCDAO) + .addComponent(chkFinalJDBCDAO) + .addComponent(btnGenerateJDBCDAO) + .addComponent(chkImplSerializable)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jPanel7.setBorder(javax.swing.BorderFactory.createTitledBorder("Properties")); + + chkConnection.setSelected(true); + chkConnection.setText("Connection"); + chkConnection.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkConnectionItemStateChanged(evt); + } + }); + + chkPreparedStatement.setSelected(true); + chkPreparedStatement.setText("PreparedStatement"); + chkPreparedStatement.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkPreparedStatementItemStateChanged(evt); + } + }); + + chkResultSet.setSelected(true); + chkResultSet.setText("ResultSet"); + chkResultSet.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkResultSetItemStateChanged(evt); + } + }); + + chkGetterConnectionJDBCDAO.setText("Getter"); + + chkGetterPreparedStatementJDBCDAO.setText("Getter"); + + chkSetterPreparedStatementJDBCDAO.setText("Setter"); + + chkSetterConnectionJDBCDAO.setText("Setter"); + + cbPreparedStatementModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "private", "", "public", "protected" })); + + cbConnectionModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "private", "", "public", "protected" })); + + cbResultSetModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "private", "", "public", "protected" })); + + chkGetterResultSetJDBCDAO.setText("Getter"); + + chkSetterResultSetJDBCDAO.setText("Setter"); + + javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7); + jPanel7.setLayout(jPanel7Layout); + jPanel7Layout.setHorizontalGroup( + jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGap(53, 53, 53) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jSeparator5) + .addComponent(jSeparator6) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(chkPreparedStatement) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(cbPreparedStatementModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(chkConnection) + .addComponent(chkResultSet)) + .addGap(87, 87, 87) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(cbConnectionModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbResultSetModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addGap(18, 18, 18) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(chkGetterConnectionJDBCDAO) + .addGap(18, 18, 18) + .addComponent(chkSetterConnectionJDBCDAO, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(chkGetterPreparedStatementJDBCDAO) + .addGap(18, 18, 18) + .addComponent(chkSetterPreparedStatementJDBCDAO, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel7Layout.createSequentialGroup() + .addComponent(chkGetterResultSetJDBCDAO) + .addGap(18, 18, 18) + .addComponent(chkSetterResultSetJDBCDAO, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE))))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel7Layout.setVerticalGroup( + jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createSequentialGroup() + .addGap(0, 0, 0) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(chkGetterConnectionJDBCDAO, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(chkSetterConnectionJDBCDAO)) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkConnection) + .addComponent(cbConnectionModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(10, 10, 10) + .addComponent(jSeparator5, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(2, 2, 2) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkPreparedStatement) + .addComponent(cbPreparedStatementModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chkGetterPreparedStatementJDBCDAO) + .addComponent(chkSetterPreparedStatementJDBCDAO)) + .addGap(10, 10, 10) + .addComponent(jSeparator6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(6, 6, 6) + .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(cbResultSetModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chkGetterResultSetJDBCDAO) + .addComponent(chkSetterResultSetJDBCDAO) + .addComponent(chkResultSet)) + .addGap(0, 16, Short.MAX_VALUE)) + ); + + jPanel10.setBorder(javax.swing.BorderFactory.createTitledBorder("Generate method")); + + chkAddJDBCDAO.setText("add"); + chkAddJDBCDAO.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkAddJDBCDAOItemStateChanged(evt); + } + }); + + chkRemoveJDBCDAO.setText("remove"); + chkRemoveJDBCDAO.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkRemoveJDBCDAOItemStateChanged(evt); + } + }); + + chkFindJDBCDAO.setText("find"); + chkFindJDBCDAO.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkFindJDBCDAOItemStateChanged(evt); + } + }); + + chkUpdateJDBCDAO.setText("update"); + chkUpdateJDBCDAO.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkUpdateJDBCDAOItemStateChanged(evt); + } + }); + + chkgetAllJDBCDAO.setText("getAll"); + chkgetAllJDBCDAO.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkgetAllJDBCDAOItemStateChanged(evt); + } + }); + + chkCloseConnection.setSelected(true); + chkCloseConnection.setText("closeConnection"); + chkCloseConnection.addItemListener(new java.awt.event.ItemListener() { + public void itemStateChanged(java.awt.event.ItemEvent evt) { + chkCloseConnectionItemStateChanged(evt); + } + }); + + cbAddModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + cbAddModifier.setEnabled(false); + + cbGetAllModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + cbGetAllModifier.setEnabled(false); + + cbUpdateModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + cbUpdateModifier.setEnabled(false); + + cbFindModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + cbFindModifier.setEnabled(false); + + cbRemoveModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "public", "", "protected", "private" })); + cbRemoveModifier.setEnabled(false); + + cbCloseConnectionModifier.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "private", "", "public", "protected" })); + + javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10); + jPanel10.setLayout(jPanel10Layout); + jPanel10Layout.setHorizontalGroup( + jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel10Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel10Layout.createSequentialGroup() + .addComponent(chkCloseConnection) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(cbCloseConnectionModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel10Layout.createSequentialGroup() + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel10Layout.createSequentialGroup() + .addComponent(chkAddJDBCDAO) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbAddModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel10Layout.createSequentialGroup() + .addComponent(chkFindJDBCDAO) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbFindModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(26, 26, 26) + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(chkgetAllJDBCDAO, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(chkRemoveJDBCDAO, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel10Layout.createSequentialGroup() + .addComponent(cbRemoveModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(30, 30, 30) + .addComponent(chkUpdateJDBCDAO) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbUpdateModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(cbGetAllModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + jPanel10Layout.setVerticalGroup( + jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel10Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkAddJDBCDAO) + .addComponent(cbAddModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(chkRemoveJDBCDAO) + .addComponent(chkUpdateJDBCDAO) + .addComponent(cbUpdateModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbRemoveModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkFindJDBCDAO) + .addComponent(chkgetAllJDBCDAO) + .addComponent(cbFindModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(cbGetAllModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(chkCloseConnection) + .addComponent(cbCloseConnectionModifier, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap()) + ); + + javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6); + jPanel6.setLayout(jPanel6Layout); + jPanel6Layout.setHorizontalGroup( + jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel6Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(jPanel12, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) + .addContainerGap(161, Short.MAX_VALUE)) + ); + jPanel6Layout.setVerticalGroup( + jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel6Layout.createSequentialGroup() + .addGap(11, 11, 11) + .addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(28, Short.MAX_VALUE)) + ); + + jTabbedPane1.addTab("JDBC DAO", jPanel6); + + lblMaxMin.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblMaxMinMouseClicked(evt); + } + }); + + lblMin.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblMinMouseClicked(evt); + } + }); + + lblClose.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblCloseMouseClicked(evt); + } + }); + + lblLogo.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblLogoMouseClicked(evt); + } + }); + + lblLogoJDBC.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + lblLogoJDBCMouseClicked(evt); + } + }); + + txtProjectName.setEditable(false); + txtProjectName.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtProjectNameActionPerformed(evt); + } + }); + + jLabel2.setText("Package name:"); + + jLabel13.setText("Project path:"); + + jLabel17.setText("fb.com/BangMaple
github.com/BangMaple"); + + javax.swing.GroupLayout jPanel9Layout = new javax.swing.GroupLayout(jPanel9); + jPanel9.setLayout(jPanel9Layout); + jPanel9Layout.setHorizontalGroup( + jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel9Layout.createSequentialGroup() + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel9Layout.createSequentialGroup() + .addContainerGap() + .addComponent(lblLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 265, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(lblLogoJDBC, javax.swing.GroupLayout.PREFERRED_SIZE, 162, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblMin, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, 0) + .addComponent(lblMaxMin, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel9Layout.createSequentialGroup() + .addGap(63, 63, 63) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(txtInfo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(jPanel9Layout.createSequentialGroup() + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel13) + .addComponent(jLabel2)) + .addGap(18, 18, 18) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(txtPackageName, javax.swing.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE) + .addComponent(txtProjectName)))) + .addGap(0, 0, Short.MAX_VALUE))) + .addGap(0, 0, 0) + .addComponent(lblClose, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel9Layout.createSequentialGroup() + .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 737, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 0, Short.MAX_VALUE)) + ); + jPanel9Layout.setVerticalGroup( + jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel9Layout.createSequentialGroup() + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblClose, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblMaxMin, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(jPanel9Layout.createSequentialGroup() + .addContainerGap() + .addComponent(lblLogo, javax.swing.GroupLayout.DEFAULT_SIZE, 36, Short.MAX_VALUE)) + .addComponent(lblLogoJDBC, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(lblMin, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel9Layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) + .addComponent(jTabbedPane1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel2) + .addComponent(txtPackageName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel9Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(txtProjectName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel13)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(txtInfo, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(9, 9, 9)) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel9, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel9, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + + pack(); + }//
//GEN-END:initComponents + + private boolean checkDBConnection() { + Connection conn = null; + boolean check = false; + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + conn = DriverManager.getConnection(new StringBuilder("jdbc:sqlserver://") + .append(txtIP.getText()).append(":").append(txtPort.getText()) + .append(";databaseName=").append(txtDBName.getText()) + .append(";username=").append(txtUsername.getText()) + .append(";password=").append(txtPassword.getText()).toString()); + if (conn != null) { + check = true; + } + } catch (SQLException | ClassNotFoundException e) { + check = false; + } finally { + if (conn != null) { + try { + conn.close(); + } catch (SQLException ex) { + check = false; + } + } + } + return check; + } + + private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed + // TODO add your handling code here: + if (validateConnection()) { + if (checkDBConnection()) { + txtInfo.setText("(+) Successfully connected to the given database name."); + } else { + txtInfo.setText("(-) Failed to connect to the given database name."); + JOptionPane.showMessageDialog(this, new StringBuilder("Trying to ") + .append("connect to database failed!\n") + .append("Please try to leave the database name blank to ") + .append("use the default database or check again\n") + .append("the IP Address and the port. Even the username ") + .append("and password must be correct.\n") + .append("If this happen again, please check if you already ") + .append("opened the IP forwarding in SQL Server ") + .append("Configuration Wizard.").toString(), + new StringBuilder("Error while connecting ") + .append("to database").toString(), JOptionPane.ERROR_MESSAGE); + } + } + }//GEN-LAST:event_btnConnectActionPerformed + private class MyFileChooser extends JFileChooser { + + public MyFileChooser(String path) { + super(path); + } + + @Override + public JDialog createDialog(Component parent) throws HeadlessException { + return super.createDialog(parent); + } + + } + + private void generateJDBCUtils() { + String publicModifier = ""; + String implementsSerializable = ""; + String serializable = ""; + String finalModifier = ""; + String getConnectionModifier = cbGetConnection.getModel().getSelectedItem() + " "; + if (getConnectionModifier.equals(" ")) { + getConnectionModifier = ""; + } + if (chkPublic.isSelected()) { + publicModifier = "public "; + } + if (chkSerializable.isSelected()) { + implementsSerializable = " implements Serializable"; + serializable = "import java.io.Serializable;"; + } + if (chkFinal.isSelected()) { + finalModifier = "final "; + } + BufferedWriter bw = null; + String packagePathName = ""; + if (!txtPackageName.getText().trim().isEmpty()) { + packagePathName = txtPackageName.getText().trim().replace(".", SYSTEM_SLASH); + } + File path = new File(new StringBuilder(SAVE_FILE_PATH).append(packagePathName).toString()); + if (!path.isDirectory()) { + path.mkdirs(); + } + try { + bw = new BufferedWriter(new PrintWriter( + new StringBuilder(SAVE_FILE_PATH).append(packagePathName) + .append(SYSTEM_SLASH).append(txtClassNameJDBC.getText() + .trim()).append(".java").toString())); + bw.newLine(); + bw.write("/**"); + bw.newLine(); + bw.write(" * This class was generated by BangMaple Class Generator"); + bw.newLine(); + bw.write(new StringBuilder(" * Date: ").append( + new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date())) + .toString()); + bw.newLine(); + bw.write(" */"); + if (HAVE_A_PACKAGE_NAME) { + bw.newLine(); + bw.write(new StringBuilder("package ") + .append(txtPackageName.getText().trim()).append(";").toString()); + bw.newLine(); + } + bw.newLine(); + bw.write("import java.sql.SQLException;"); + bw.newLine(); + bw.write("import java.sql.Connection;"); + bw.newLine(); + bw.write("import java.sql.DriverManager;"); + bw.newLine(); + if (!serializable.equals("")) { + bw.write(serializable); + bw.newLine(); + } + bw.newLine(); + bw.write(new StringBuilder(publicModifier).append(finalModifier) + .append("class ").append(txtClassNameJDBC.getText()) + .append(implementsSerializable).append(" {").toString()); + bw.newLine(); + bw.newLine(); + bw.write(new StringBuilder(" ").append(getConnectionModifier) + .append("Connection ").append(txtGetConnection.getText()) + .append("() {").toString()); + bw.newLine(); + bw.newLine(); + bw.write("\tConnection conn = null;"); + bw.newLine(); + bw.write("\ttry {"); + bw.newLine(); + bw.write("\t Class.forName(\"com.microsoft.sqlserver.SQLServerDriver\");"); + bw.newLine(); + bw.write("\t conn = DriverManager.getConnection(\"jdbc:sqlserver://"); + bw.write(new StringBuilder(txtIP.getText()).append(":") + .append(txtPort.getText()).append(";databaseName=") + .append(txtDBName.getText()).append(";username=") + .append(txtUsername.getText()).append(";password=") + .append(txtPassword.getText()).append("\");").toString()); + bw.newLine(); + bw.write("\t} catch (SQLException | ClassNotFoundException e) {"); + bw.newLine(); + bw.write(new StringBuilder("\t System.out.println(\"Error at ") + .append(txtClassNameJDBC.getText()) + .append(": \" + e.getMessage());").toString()); + bw.newLine(); + bw.write("\t}"); + bw.newLine(); + bw.write("\treturn conn;"); + bw.newLine(); + bw.write(" }"); + bw.newLine(); + bw.write("}"); + bw.newLine(); + JOptionPane.showMessageDialog(this, "Successfully generated this java class file."); + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", "Error while generating class", JOptionPane.ERROR_MESSAGE); + } finally { + try { + if (bw != null) { + bw.close(); + } + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", "Error while generating class", JOptionPane.ERROR_MESSAGE); + } + } + } + + private void getDataFromDTOTable(final List varList, + final List attributeList, final List getterList, + final List setterList, final List constructorList) { + DefaultTableModel tblModel = (DefaultTableModel) jTable1.getModel(); + for (int i = 0; i < tblModel.getRowCount(); i++) { + if (tblModel.getValueAt(i, 2) == null) { + break; + } + String var = ""; + if (!String.valueOf(tblModel.getValueAt(i, 0)).trim().isEmpty()) { + var = new StringBuilder(var).append(tblModel.getValueAt(i, 0)).append(" ").toString(); + } + var = new StringBuilder(var).append(tblModel.getValueAt(i, 1)).toString(); + var = new StringBuilder(var).append(" ").append(tblModel.getValueAt(i, 2)).toString(); + var = new StringBuilder(var).append(" ").append(tblModel.getValueAt(i, 3)).toString(); + var = new StringBuilder(var).append(" ").append(tblModel.getValueAt(i, 4)).toString(); + var = new StringBuilder(var).append(" ").append(tblModel.getValueAt(i, 5)).toString(); + varList.add(var); + } + for (int i = 0; i < varList.size(); i++) { + StringTokenizer stk = new StringTokenizer(varList.get(i), " "); + while (stk.hasMoreTokens()) { + String getter = ""; + String setter = ""; + String var = ""; + if (stk.countTokens() == 6) { + var = new StringBuilder(var).append(stk.nextToken()) + .append(" ").toString(); + } + String type = stk.nextToken(); + String name = stk.nextToken(); + var = new StringBuilder(var).append(type).append(" ") + .append(name).append(";").toString(); + if (stk.nextToken().equals("true")) { + getter = new StringBuilder(getter).append("\n public ") + .append(type).append(" get") + .append(name.substring(0, 1).toUpperCase()) + .append(name.substring(1)).append("() {\n") + .append("\treturn ").append(name).append(";\n") + .append(" }\n").toString(); + } + if (stk.nextToken().equals("true")) { + setter = new StringBuilder(setter) + .append("\n public void set") + .append(name.substring(0, 1).toUpperCase()) + .append(name.substring(1)).append("(") + .append(type).append(" ").append(name).append(") {\n") + .append("\tthis.").append(name).append(" = ") + .append(name).append(";\n") + .append(" }\n").toString(); + } + attributeList.add(var); + getterList.add(getter); + setterList.add(setter); + if (stk.nextToken().equals("true")) { + constructorList.add(new StringBuilder(type).append(" ").append(name).toString()); + } + } + } + } + + private String getGetterDTO(final List getterList) { + String getter = ""; + if (getterList.size() > 0) { + for (int i = 0; i < getterList.size(); i++) { + getter = new StringBuilder(getter).append(getterList.get(i)).toString(); + } + } + return getter; + } + + private String getSetterDTO(final List setterList) { + String setter = ""; + if (setterList.size() > 0) { + for (int i = 0; i < setterList.size(); i++) { + setter = new StringBuilder(setter).append(setterList.get(i)).toString(); + } + } + return setter; + } + + private String getAttributesDTO(final List attributeList) { + String var = ""; + for (int i = 0; i < attributeList.size(); i++) { + var = new StringBuilder(var).append(" ") + .append(attributeList.get(i)).append("\n").toString(); + } + return var; + } + + private String getConstructorDTO(final List constructorList) { + String constructor = new StringBuilder(" public ") + .append(txtClassName.getText()).append("(").toString(); + if (constructorList.size() > 0) { + for (int i = 0; i < constructorList.size(); i++) { + if (i != constructorList.size() - 1) { + constructor = new StringBuilder(constructor) + .append(constructorList.get(i)).append(", ").toString(); + } else { + constructor = new StringBuilder(constructor) + .append(constructorList.get(i)).toString(); + } + } + constructor = new StringBuilder(constructor).append(") {\n").toString(); + for (int i = 0; i < constructorList.size(); i++) { + String testVar = constructorList.get(i) + .substring(constructorList.get(i).lastIndexOf(" ") + 1, + constructorList.get(i).length()); + constructor = new StringBuilder(constructor).append("\tthis.") + .append(testVar).append(" = ").append(testVar) + .append(";\n").toString(); + } + constructor = new StringBuilder(constructor).append(" }\n\n") + .append(" public ").append(txtClassName.getText()) + .append("() {\n").append(" }").toString(); + + } else { + constructor = new StringBuilder(constructor).append(") {\n") + .append(" }").toString(); + } + return constructor; + } + + private void generateDTO() { + List varList = new ArrayList<>(); + List attributeList = new ArrayList<>(); + List getterList = new ArrayList<>(); + List setterList = new ArrayList<>(); + List constructorList = new ArrayList<>(); + + getDataFromDTOTable(varList, attributeList, getterList, setterList, constructorList); + String var = getAttributesDTO(attributeList); + String getter = getGetterDTO(getterList); + String setter = getSetterDTO(setterList); + String constructor = getConstructorDTO(constructorList); + + String publicModifier = ""; + String implementsSerializable = ""; + String serializable = ""; + String finalModifier = ""; + String extendClass = ""; + + if (!txtExtendsDTO.getText().isEmpty()) { + extendClass = " extends " + txtExtendsDTO.getText().trim(); + } + + if (chkPublicDTO.isSelected()) { + publicModifier = "public "; + } + if (chkSerializableDTO.isSelected()) { + implementsSerializable = " implements Serializable"; + serializable = "import java.io.Serializable;"; + } + if (!txtImplementsDTO.getText().trim().isEmpty()) { + if (implementsSerializable.isEmpty()) { + implementsSerializable = " implements"; + } + if (txtImplementsDTO.getText().contains(",")) { + + String[] split = txtImplementsDTO.getText().trim().split(","); + for (int i = 0; i < split.length; i++) { + if (i == 0 && serializable.isEmpty()) { + implementsSerializable = new StringBuilder(implementsSerializable).append(" ") + .append(split[i].trim()).toString(); + } else { + implementsSerializable = new StringBuilder(implementsSerializable) + .append(", ").append(split[i].trim()).toString(); + } + } + } else { + if (!serializable.isEmpty()) { + implementsSerializable += ", " + txtImplementsDTO.getText().trim(); + } else { + implementsSerializable += txtImplementsDTO.getText().trim(); + } + } + } + if (chkFinalDTO.isSelected()) { + finalModifier = "final "; + } + BufferedWriter bw = null; + String packagePathName = ""; + if (!txtPackageName.getText().trim().isEmpty()) { + packagePathName = txtPackageName.getText().trim().replace(".", SYSTEM_SLASH); + } + File path = new File(new StringBuilder(SAVE_FILE_PATH) + .append(packagePathName).toString()); + if (!path.isDirectory()) { + path.mkdirs(); + } + try { + bw = new BufferedWriter(new PrintWriter(new StringBuilder(SAVE_FILE_PATH) + .append(packagePathName).append(SYSTEM_SLASH) + .append(txtClassName.getText().trim()).append(".java").toString())); + bw.newLine(); + bw.write("/**"); + bw.newLine(); + bw.write(" * This class was generated by BangMaple Class Generator"); + bw.newLine(); + bw.write(new StringBuilder(" * Date: ").append(new SimpleDateFormat( + "dd/MM/yyyy HH:mm:ss").format(new Date())).toString()); + bw.newLine(); + bw.write(" */"); + if (HAVE_A_PACKAGE_NAME) { + bw.newLine(); + bw.write(new StringBuilder("package ") + .append(txtPackageName.getText().trim()).append(";").toString()); + bw.newLine(); + } + bw.newLine(); + if (!implementsSerializable.isEmpty()) { + bw.write(serializable); + bw.newLine(); + } + bw.newLine(); + bw.write(new StringBuilder(publicModifier).append(finalModifier) + .append("class ").append(txtClassName.getText()).append(extendClass) + .append(implementsSerializable).append(" {").toString()); + bw.newLine(); + bw.write(new StringBuilder("\n").append(var).toString()); + bw.newLine(); + bw.write(constructor); + bw.newLine(); + bw.write(getter); + bw.newLine(); + bw.write(setter); + bw.newLine(); + bw.write("}"); + bw.newLine(); + JOptionPane.showMessageDialog(this, "Successfully generated this java class file."); + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + } finally { + try { + if (bw != null) { + bw.close(); + } + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + } + } + } + + private void chooseSaveDialogStrategy(final MyFileChooser chooser, final String type) { + chooser.setDialogType(JFileChooser.SAVE_DIALOG); + switch (type) { + case "jdbcUtils": + chooser.setSelectedFile(new File(new StringBuilder( + txtClassNameJDBC.getText()).append(".java").toString())); + break; + case "jdbcDAO": + chooser.setSelectedFile(new File(new StringBuilder( + txtClassNameJDBCDAO.getText()).append(".java").toString())); + break; + default: + chooser.setSelectedFile(new File(new StringBuilder( + txtClassName.getText()).append(".java").toString())); + break; + } + chooser.setFileFilter(new FileNameExtensionFilter("Only accept NetBeans project folder!", + "java")); + + } + + private void initSaveDialog(String type) { + MyFileChooser chooser = new MyFileChooser("."); + chooseSaveDialogStrategy(chooser, type); + final JDialog dialog = chooser.createDialog(null); + chooser.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent evt) { + JFileChooser chooser = (JFileChooser) evt.getSource(); + if (JFileChooser.APPROVE_SELECTION.equals(evt.getActionCommand())) { + String filename = chooser.getSelectedFile().getAbsolutePath(); + if (!filename.endsWith(".java")) { + filename = new StringBuilder(filename).append(".java").toString(); + } + SAVE_FILE_PATH = new StringBuilder(filename.substring(0, + filename.lastIndexOf(SYSTEM_SLASH))) + .append(SYSTEM_SLASH).toString(); + String projectPath = new StringBuilder(filename.substring(0, + filename.lastIndexOf(SYSTEM_SLASH))) + .append(SYSTEM_SLASH).toString(); + txtProjectName.setText(projectPath); + + dialog.setVisible(false); + } else if (JFileChooser.CANCEL_SELECTION.equals(evt.getActionCommand())) { + dialog.setVisible(false); + } + } + }); + + dialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + dialog.setVisible(false); + } + }); + + dialog.setVisible(true); + } + + private boolean validateJDBCUtilsData() { + if (txtClassNameJDBC.getText().matches("^[\\_a-zA-Z0-9]{1,255}$")) { + if (txtClassNameJDBC.getText().substring(0, 1).matches("^[0-9]$") + || txtClassNameJDBC.getText().substring(0, 1).matches("^[\\.]$")) { + JOptionPane.showMessageDialog(this, new StringBuilder("Can't generate due to class name is not valid!\n") + .append("The first letter must not a number.").toString()); + return false; + } + } else { + JOptionPane.showMessageDialog(this, "Can't generate due to class name is not valid!"); + return false; + } + if (txtGetConnection.getText().trim().isEmpty()) { + JOptionPane.showMessageDialog(this, "getConnection method name musn't be blank!"); + return false; + } else { + if (!txtGetConnection.getText().trim().matches("^[a-zA-Z0-9]{1,}$") + || String.valueOf(txtGetConnection.getText().charAt(0)).matches("^[0-9]$")) { + JOptionPane.showMessageDialog(this, "Please follow the correct method name format."); + return false; + } + } + return true; + } + + private void btnChooseProjectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnChooseProjectActionPerformed + if (!validateConnection()) { + return; + } + if (!validateJDBCUtilsData()) { + return; + } + selectProjectPath("jdbcUtils"); + }//GEN-LAST:event_btnChooseProjectActionPerformed + + private void setSaveFilePath(boolean check, String type) { + if (!check) { + initSaveDialog(type); + String projectPath; + try { + projectPath = new StringBuilder(SAVE_FILE_PATH + .substring(0, SAVE_FILE_PATH.lastIndexOf(SYSTEM_SLASH))) + .append(SYSTEM_SLASH).toString(); + } catch (StringIndexOutOfBoundsException e) { + return; + } + File f1 = new File(new StringBuilder(projectPath).append("build.xml") + .toString()); + File f2 = new File(new StringBuilder(projectPath).append("pom.xml") + .toString()); + if (f1.isFile() || f2.isFile()) { + if (f2.isFile()) { + SAVE_FILE_PATH = new StringBuilder(SAVE_FILE_PATH) + .append("src").append(SYSTEM_SLASH).append("main") + .append(SYSTEM_SLASH).append("java") + .append(SYSTEM_SLASH).toString(); + } else { + SAVE_FILE_PATH = new StringBuilder(SAVE_FILE_PATH) + .append("src").append(SYSTEM_SLASH).toString(); + } + switch (type) { + case "jdbcUtils": + generateJDBCUtils(); + break; + case "jdbcDAO": + System.out.println("dao"); + generateJDBCDAO(); + break; + case "dto": + generateDTO(); + break; + default: + break; + } + } else { + txtProjectName.setText(""); + JOptionPane.showMessageDialog(this, + new StringBuilder("Only accept NetBeansProjects's project folder.") + .append("\nJava with Ant or Maven is acceptable!").toString()); + } + } else { + SAVE_FILE_PATH = new StringBuilder(SAVE_FILE_PATH.substring(0, + SAVE_FILE_PATH.lastIndexOf(SYSTEM_SLASH))) + .append(SYSTEM_SLASH).toString(); + switch (type) { + case "jdbcUtils": + generateJDBCUtils(); + break; + case "jdbcDAO": + generateJDBCDAO(); + break; + default: + generateDTO(); + break; + } + } + } + + private void selectProjectPath(String type) { + boolean check = false; + if (txtPackageName.getText().trim().isEmpty()) { + HAVE_A_PACKAGE_NAME = false; + int choice = JOptionPane.showConfirmDialog(this, + "Are you sure you don't want a package name?"); + if (choice != JOptionPane.OK_OPTION) { + JOptionPane.showMessageDialog(this, + "Please enter the corresponding package name then\ntry generating again!"); + return; + } + } else { + HAVE_A_PACKAGE_NAME = true; + } + + if (!txtProjectName.getText().trim().isEmpty()) { + int choice = JOptionPane.showConfirmDialog(this, + "Do you want to change another project path?"); + if (choice != JOptionPane.OK_OPTION) { + check = true; + } + } + System.out.println(check); + setSaveFilePath(check, type); + } + + private boolean validateJDBCDAOClassName() { + if (txtClassNameJDBCDAO.getText().matches("^[\\_a-zA-Z0-9]{1,255}$")) { + if (txtClassNameJDBCDAO.getText().substring(0, 1).matches("^[0-9]$") + || txtClassNameJDBCDAO.getText().substring(0, 1).matches("^[\\.]$")) { + JOptionPane.showMessageDialog(this, new StringBuilder("Can't generate due to class name is not valid!\n") + .append("The first letter must not a number.").toString()); + return false; + } + } else { + JOptionPane.showMessageDialog(this, "Can't generate due to class name is not valid!"); + return false; + } + return true; + } + + private void generateJDBCDAO() { + String closeConnection = ""; + String importConnection = ""; + String importPreparedStatement = ""; + String importResultSet = ""; + String importSQLException = ""; + String finalModifier = ""; + String getter = ""; + String setter = ""; + String addMethod = ""; + String updateMethod = ""; + String deleteMethod = ""; + String findMethod = ""; + String getAllMethod = ""; + String importSerializable = ""; + String serializableModifier = ""; + String importListAndLinkedList = ""; + + String connectionModifier = cbConnectionModifier.getModel().getSelectedItem() + " "; + String preparedStatementModifier = cbPreparedStatementModifier.getModel().getSelectedItem() + " "; + String resultSetModifier = cbResultSetModifier.getModel().getSelectedItem() + " "; + String addModifier = cbAddModifier.getModel().getSelectedItem() + " "; + String findModifier = cbFindModifier.getModel().getSelectedItem() + " "; + String removeModifier = cbRemoveModifier.getModel().getSelectedItem() + " "; + String getAllModifier = cbGetAllModifier.getModel().getSelectedItem() + " "; + String updateModifier = cbUpdateModifier.getModel().getSelectedItem() + " "; + String closeConnectionModifier = cbCloseConnectionModifier.getModel().getSelectedItem() + " "; + + if (!validateJDBCDAOClassName()) { + return; + } + if (chkImplSerializable.isSelected()) { + importSerializable = "import java.io.Serializable;"; + serializableModifier = "implements Serializable "; + } + if (chkFinalJDBCDAO.isSelected()) { + finalModifier = " final"; + } + if (connectionModifier.equals(" ")) { + connectionModifier = ""; + } + if (preparedStatementModifier.equals(" ")) { + preparedStatementModifier = ""; + } + if (resultSetModifier.equals(" ")) { + resultSetModifier = ""; + } + if (addModifier.equals(" ")) { + addModifier = ""; + } + if (removeModifier.equals(" ")) { + removeModifier = ""; + } + if (updateModifier.equals(" ")) { + updateModifier = ""; + } + if (findModifier.equals(" ")) { + findModifier = ""; + } + if (getAllModifier.equals(" ")) { + getAllModifier = ""; + } + if (closeConnectionModifier.equals(" ")) { + closeConnectionModifier = ""; + } + + if (chkConnection.isSelected()) { + importConnection = "import java.sql.Connection;"; + } + if (chkPreparedStatement.isSelected()) { + importPreparedStatement = "import java.sql.PreparedStatement;"; + } + if (chkResultSet.isSelected()) { + importResultSet = "import java.sql.ResultSet;"; + } + + if (chkGetterConnectionJDBCDAO.isSelected()) { + getter = new StringBuilder(getter) + .append("\n public Connection getConnection() {\n") + .append("\treturn conn;\n") + .append(" }\n").toString(); + } + if (chkGetterPreparedStatementJDBCDAO.isSelected()) { + getter = new StringBuilder(getter) + .append("\n public PreparedStatement getPreparedStatement() {\n") + .append("\treturn prStm;\n") + .append(" }\n").toString(); + } + if (chkGetterResultSetJDBCDAO.isSelected()) { + getter = new StringBuilder(getter) + .append("\n public ResultSet getResultSet() {\n") + .append("\treturn rs;\n") + .append(" }\n").toString(); + } + + if (chkgetAllJDBCDAO.isSelected()) { + importListAndLinkedList = new StringBuilder("import java.util.List;\n") + .append("import java.util.LinkedList;").toString(); + } + if (chkSetterConnectionJDBCDAO.isSelected()) { + setter = new StringBuilder(setter) + .append("\n public void setConnection(Connection conn) {\n") + .append("\tthis.conn = conn;\n") + .append(" }\n").toString(); + } + if (chkSetterPreparedStatementJDBCDAO.isSelected()) { + setter = new StringBuilder(setter) + .append("\n public void setPreparedStatement(PreparedStatement prStm) {\n") + .append("\tthis.prStm = prStm;\n") + .append(" }\n").toString(); + } + if (chkSetterResultSetJDBCDAO.isSelected()) { + setter = new StringBuilder(setter) + .append("\n public void setResultSet(ResultSet rs) {\n") + .append("\tthis.rs = rs;\n") + .append(" }\n").toString(); + } + + if (chkAddJDBCDAO.isSelected()) { + addMethod = new StringBuilder().append("\n ") + .append(addModifier).append("void persist(Object object) {\n") + .append("\tthis.conn = null; //TODO assign with getConnection();\n") + .append("\ttry {\n") + .append("\t if (conn != null) {\n") + .append("\t String sql = \"INSERT INTO TODO_TABLE VALUES(?)\";\n") + .append("\t prStm = conn.prepareStatement(sql);\n") + .append("\t prStm.setObject(1, object);\n") + .append("\t prStm.executeUpdate();\n") + .append(" }\n") + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at persist method of ") + .append(txtClassNameJDBCDAO.getText()).append(": \" + e.getMessage());\n") + .append("\t} finally {\n") + .append("\t closeConnection();\n") + .append("\t}\n") + .append(" }\n").toString(); + } + if (chkUpdateJDBCDAO.isSelected()) { + updateMethod = new StringBuilder().append("\n ") + .append(updateModifier).append("void merge(Object object) {\n") + .append("\tthis.conn = null; //TODO assign with getConnection();\n") + .append("\ttry {\n") + .append("\t if (conn != null) {\n") + .append("\t String sql = \"UPDATE TODO_TABLE SET TODO_VAR = ? WHERE TODO_VAR2 = ?\";\n") + .append("\t prStm = conn.prepareStatement(sql);\n") + .append("\t //TODO binding parameters\n") + .append("\t prStm.setObject(1, object);\n") + .append("\t prStm.setObject(2, object);\n") + .append("\t prStm.executeUpdate();\n") + .append(" }\n") + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at merge method of ") + .append(txtClassNameJDBCDAO.getText()).append(": \" + e.getMessage());\n") + .append("\t} finally {\n") + .append("\t closeConnection();\n") + .append("\t}\n") + .append(" }\n").toString(); + } + if (chkRemoveJDBCDAO.isSelected()) { + deleteMethod = new StringBuilder("\n ").append(removeModifier) + .append("void remove(Object object) {\n") + .append("\tthis.conn = null; //TODO assign with getConnection();\n") + .append("\ttry {\n") + .append("\t if (conn != null) {\n") + .append("\t String sql = \"DELETE FROM TODO_TABLE WHERE TODO_VAR = ?\";\n") + .append("\t prStm = conn.prepareStatement(sql);\n") + .append("\t //TODO binding parameters\n") + .append("\t prStm.setObject(1, object);\n") + .append("\t prStm.executeUpdate();\n") + .append(" }\n") + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at remove method of ") + .append(txtClassNameJDBCDAO.getText()).append(": \" + e.getMessage());\n") + .append("\t} finally {\n") + .append("\t closeConnection();\n") + .append("\t}\n") + .append(" }\n").toString(); + } + if (chkFindJDBCDAO.isSelected()) { + findMethod = new StringBuilder("\n ").append(findModifier) + .append("Object get(Object object) {\n") + .append("\tthis.conn = null; //TODO assign with getConnection();\n") + .append("\tObject obj = null; //TODO change the object type\n") + .append("\ttry {\n") + .append("\t if (conn != null) {\n") + .append("\t String sql = \"SELECT * FROM TODO_TABLE WHERE TODO_VAR = ?\";\n") + .append("\t prStm = conn.prepareStatement(sql);\n") + .append("\t //TODO binding parameters\n") + .append("\t prStm.setObject(1, object);\n") + .append("\t rs = prStm.executeQuery();\n") + .append("\t if (rs.next()) {\n") + .append("\t\t //TODO change the object type\n") + .append("\t\t obj = rs.getObject(\"TODO-SELECTED\");\n") + .append("\t }\n") + .append(" }\n") + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at find method of ") + .append(txtClassNameJDBCDAO.getText()).append(": \" + e.getMessage());\n") + .append("\t} finally {\n") + .append("\t closeConnection();\n") + .append("\t}\n") + .append("\treturn obj;\n") + .append(" }\n").toString(); + } + if (chkgetAllJDBCDAO.isSelected()) { + getAllMethod = new StringBuilder().append("\n ") + .append(getAllModifier).append("List getAll(Object object) {\n") + .append("\tthis.conn = null; //TODO assign with getConnection();\n") + .append("\tList list = null;\n") + .append("\ttry {\n") + .append("\t if (conn != null) {\n") + .append("\t String sql = \"SELECT * FROM TODO_TABLE WHERE TODO_VAR = ?\";\n") + .append("\t prStm = conn.prepareStatement(sql);\n") + .append("\t //TODO binding parameters\n") + .append("\t prStm.setObject(1, object);\n") + .append("\t rs = prStm.executeQuery();\n") + .append("\t list = new LinkedList();\n") + .append("\t while (rs.next()) {\n") + .append("\t\t //TODO change the object type\n") + .append("\t\t list.add(rs.getObject(\"TODO-SELECTED\"));\n") + .append("\t }\n") + .append(" }\n") + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at remove method of ") + .append(txtClassNameJDBCDAO.getText()) + .append(": \" + e.getMessage());\n") + .append("\t} finally {\n") + .append("\t closeConnection();\n") + .append("\t}\n") + .append("\treturn list;\n") + .append(" }\n").toString(); + } + + if (chkCloseConnection.isSelected()) { + importSQLException = "import java.sql.SQLException;"; + closeConnection = new StringBuilder(" ").append(closeConnectionModifier) + .append("void closeConnection() {\n") + .append("\ttry {\n").toString(); + } + if (chkConnection.isSelected()) { + closeConnection = new StringBuilder(closeConnection) + .append("\t if (conn != null) {\n") + .append("\t conn.close();\n") + .append("\t }\n").toString(); + } + if (chkPreparedStatement.isSelected()) { + closeConnection = new StringBuilder(closeConnection) + .append("\t if (prStm != null) {\n") + .append("\t prStm.close();\n") + .append("\t }\n").toString(); + } + if (chkResultSet.isSelected()) { + closeConnection = new StringBuilder(closeConnection) + .append("\t if (rs != null) {\n") + .append("\t rs.close();\n") + .append("\t }\n").toString(); + } + if (chkCloseConnection.isSelected()) { + closeConnection = new StringBuilder(closeConnection) + .append("\t} catch (SQLException e) {\n") + .append("\t System.out.println(\"Error at ") + .append(txtClassNameJDBCDAO.getText()).append(": \" + e.getMessage());\n") + .append(" }\n") + .append(" }\n").toString(); + } + + String packagePathName = ""; + if (!txtPackageName.getText().trim().isEmpty()) { + packagePathName = txtPackageName.getText().trim().replace(".", SYSTEM_SLASH); + } + File path = new File(new StringBuilder(SAVE_FILE_PATH).append(packagePathName).toString()); + if (!path.isDirectory()) { + path.mkdirs(); + } + BufferedWriter bw = null; + try { + bw = new BufferedWriter( + new PrintWriter(new StringBuilder(SAVE_FILE_PATH) + .append(packagePathName).append(SYSTEM_SLASH) + .append(txtClassNameJDBCDAO.getText().trim()) + .append(".java").toString())); + bw.newLine(); + bw.write("/**"); + bw.newLine(); + bw.write(" * This class was generated by BangMaple Class Generator"); + bw.newLine(); + bw.write(new StringBuilder(" * Date: ") + .append(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss") + .format(new Date())).toString()); + bw.newLine(); + bw.write(" */"); + if (HAVE_A_PACKAGE_NAME) { + bw.newLine(); + bw.write(new StringBuilder("package ") + .append(txtPackageName.getText().trim()) + .append(";").toString()); + bw.newLine(); + } + bw.newLine(); + bw.write(importConnection); + bw.newLine(); + bw.write(importPreparedStatement); + bw.newLine(); + bw.write(importResultSet); + bw.newLine(); + bw.write(importSQLException); + bw.newLine(); + bw.write(importSerializable); + bw.newLine(); + bw.write(importListAndLinkedList); + bw.newLine(); + bw.newLine(); + bw.write(new StringBuilder("public").append(finalModifier) + .append(" class ") + .append(txtClassNameJDBCDAO.getText()).append(" ") + .append(serializableModifier).append("{\n").toString()); + if (chkConnection.isSelected()) { + bw.newLine(); + bw.write(new StringBuilder(" ") + .append(connectionModifier) + .append("Connection conn;").toString()); + } + if (chkPreparedStatement.isSelected()) { + bw.newLine(); + bw.write(new StringBuilder(" ") + .append(preparedStatementModifier) + .append("PreparedStatement prStm;").toString()); + } + if (chkResultSet.isSelected()) { + bw.newLine(); + bw.write(new StringBuilder(" ").append(resultSetModifier) + .append("ResultSet rs;").toString()); + } + bw.newLine(); + bw.newLine(); + bw.write(closeConnection); + bw.write(addMethod); + bw.write(updateMethod); + bw.write(deleteMethod); + bw.write(findMethod); + bw.write(getAllMethod); + bw.write(getter); + bw.write(setter); + bw.newLine(); + bw.write("}"); + bw.newLine(); + JOptionPane.showMessageDialog(this, "Successfully generated this java class file."); + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + } finally { + try { + if (bw != null) { + bw.close(); + } + } catch (IOException ex) { + JOptionPane.showMessageDialog(this, "Error while generating class file.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + } + } + } + + + private void btnGenerateJDBCDAOActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGenerateJDBCDAOActionPerformed + if (!validateJDBCDAOClassName()) { + return; + } + selectProjectPath("jdbcDAO"); + + }//GEN-LAST:event_btnGenerateJDBCDAOActionPerformed + + private void txtProjectNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtProjectNameActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_txtProjectNameActionPerformed + + private void lblMaxMinMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblMaxMinMouseClicked + // TODO add your handling code here: + + }//GEN-LAST:event_lblMaxMinMouseClicked + + private void lblCloseMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblCloseMouseClicked + System.exit(0); + }//GEN-LAST:event_lblCloseMouseClicked + + private void lblMinMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblMinMouseClicked + setExtendedState(JFrame.ICONIFIED); + }//GEN-LAST:event_lblMinMouseClicked + + private void lblLogoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblLogoMouseClicked + // TODO add your handling code here: + }//GEN-LAST:event_lblLogoMouseClicked + + private void lblLogoJDBCMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lblLogoJDBCMouseClicked + // TODO add your handling code here: + }//GEN-LAST:event_lblLogoJDBCMouseClicked + private void checkEnableCloseConnection() { + if (!chkConnection.isSelected() && !chkPreparedStatement.isSelected() && !chkResultSet.isSelected()) { + chkCloseConnection.setSelected(false); + chkCloseConnection.setEnabled(false); + } + if (chkConnection.isSelected() || chkPreparedStatement.isSelected() || chkResultSet.isSelected()) { + chkCloseConnection.setSelected(true); + chkCloseConnection.setEnabled(true); + } + } + private void chkConnectionItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkConnectionItemStateChanged + // TODO add your handling code here: + if (chkConnection.isSelected()) { + chkSetterConnectionJDBCDAO.setEnabled(true); + chkGetterConnectionJDBCDAO.setEnabled(true); + chkResultSet.setEnabled(true); + chkPreparedStatement.setSelected(true); + chkPreparedStatement.setEnabled(true); + cbConnectionModifier.setEnabled(true); + } else { + chkSetterConnectionJDBCDAO.setSelected(false); + chkGetterConnectionJDBCDAO.setSelected(false); + chkSetterConnectionJDBCDAO.setEnabled(false); + chkGetterConnectionJDBCDAO.setEnabled(false); + chkResultSet.setSelected(false); + chkResultSet.setEnabled(false); + chkPreparedStatement.setSelected(false); + chkPreparedStatement.setEnabled(false); + cbConnectionModifier.setEnabled(false); + } + checkEnableCloseConnection(); + }//GEN-LAST:event_chkConnectionItemStateChanged + + private void chkPreparedStatementItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkPreparedStatementItemStateChanged + // TODO add your handling code here: + if (chkPreparedStatement.isSelected()) { + chkSetterPreparedStatementJDBCDAO.setEnabled(true); + chkGetterPreparedStatementJDBCDAO.setEnabled(true); + chkAddJDBCDAO.setEnabled(true); + chkRemoveJDBCDAO.setEnabled(true); + chkUpdateJDBCDAO.setEnabled(true); + chkResultSet.setEnabled(true); + cbPreparedStatementModifier.setEnabled(true); + cbResultSetModifier.setEnabled(true); + } else { + chkSetterPreparedStatementJDBCDAO.setSelected(false); + chkGetterPreparedStatementJDBCDAO.setSelected(false); + chkSetterPreparedStatementJDBCDAO.setEnabled(false); + chkGetterPreparedStatementJDBCDAO.setEnabled(false); + chkAddJDBCDAO.setEnabled(false); + chkAddJDBCDAO.setSelected(false); + chkRemoveJDBCDAO.setEnabled(false); + chkRemoveJDBCDAO.setSelected(false); + chkUpdateJDBCDAO.setEnabled(false); + chkUpdateJDBCDAO.setSelected(false); + chkResultSet.setSelected(false); + chkResultSet.setEnabled(false); + cbResultSetModifier.setEnabled(false); + cbPreparedStatementModifier.setEnabled(false); + } + checkEnableCloseConnection(); + }//GEN-LAST:event_chkPreparedStatementItemStateChanged + + private void chkResultSetItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkResultSetItemStateChanged + // TODO add your handling code here: + if (chkResultSet.isSelected()) { + chkSetterResultSetJDBCDAO.setEnabled(true); + chkGetterResultSetJDBCDAO.setEnabled(true); + chkgetAllJDBCDAO.setEnabled(true); + chkFindJDBCDAO.setEnabled(true); + } else { + chkSetterResultSetJDBCDAO.setSelected(false); + chkGetterResultSetJDBCDAO.setSelected(false); + chkSetterResultSetJDBCDAO.setEnabled(false); + chkGetterResultSetJDBCDAO.setEnabled(false); + chkgetAllJDBCDAO.setSelected(false); + chkgetAllJDBCDAO.setEnabled(false); + chkFindJDBCDAO.setSelected(false); + chkFindJDBCDAO.setEnabled(false); + } + checkEnableCloseConnection(); + }//GEN-LAST:event_chkResultSetItemStateChanged + + private void chkCloseConnectionItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkCloseConnectionItemStateChanged + // TODO add your handling code here: + if (chkCloseConnection.isSelected()) { + cbCloseConnectionModifier.setEnabled(true); + } else { + cbCloseConnectionModifier.setEnabled(false); + } + }//GEN-LAST:event_chkCloseConnectionItemStateChanged + + private void chkFindJDBCDAOItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkFindJDBCDAOItemStateChanged + // TODO add your handling code here: + if (chkFindJDBCDAO.isSelected()) { + cbFindModifier.setEnabled(true); + } else { + cbFindModifier.setEnabled(false); + } + }//GEN-LAST:event_chkFindJDBCDAOItemStateChanged + + private void chkgetAllJDBCDAOItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkgetAllJDBCDAOItemStateChanged + // TODO add your handling code here: + if (chkgetAllJDBCDAO.isSelected()) { + cbGetAllModifier.setEnabled(true); + } else { + cbGetAllModifier.setEnabled(false); + } + }//GEN-LAST:event_chkgetAllJDBCDAOItemStateChanged + + private void chkAddJDBCDAOItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkAddJDBCDAOItemStateChanged + // TODO add your handling code here: + if (chkAddJDBCDAO.isSelected()) { + cbAddModifier.setEnabled(true); + } else { + cbAddModifier.setEnabled(false); + } + }//GEN-LAST:event_chkAddJDBCDAOItemStateChanged + + private void chkRemoveJDBCDAOItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkRemoveJDBCDAOItemStateChanged + // TODO add your handling code here: + if (chkRemoveJDBCDAO.isSelected()) { + cbRemoveModifier.setEnabled(true); + } else { + cbRemoveModifier.setEnabled(false); + } + }//GEN-LAST:event_chkRemoveJDBCDAOItemStateChanged + + private void chkUpdateJDBCDAOItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkUpdateJDBCDAOItemStateChanged + // TODO add your handling code here: + if (chkUpdateJDBCDAO.isSelected()) { + cbUpdateModifier.setEnabled(true); + } else { + cbUpdateModifier.setEnabled(false); + } + }//GEN-LAST:event_chkUpdateJDBCDAOItemStateChanged + + private boolean validateClassNameDTO() { + String className = txtClassName.getText(); + if (!className.trim().isEmpty()) { + String tmpStr = String.valueOf(className.charAt(0)); + if (!tmpStr.matches("^[a-zA-Z]$")) { + JOptionPane.showMessageDialog(this, + "First letter of class name must be alphabet." + + "\nPlease try again."); + return false; + } else { + if (!className.matches("^[a-zA-Z0-9\\_]{1,256}$")) { + JOptionPane.showMessageDialog(this, + "You must follow the class naming format." + + "\nPlease try again later."); + return false; + } + } + } else { + JOptionPane.showMessageDialog(this, + "Please don't leave class name blank."); + return false; + } + return true; + } + + private boolean validateIfExistExtendingOrImplementing() { + if (!txtExtendsDTO.getText().trim().isEmpty()) { + if (!String.valueOf(txtExtendsDTO.getText().trim().charAt(0)).matches("^[a-zA-Z]$")) { + JOptionPane.showMessageDialog(this, + "First letter of class name or package name must be alphabet." + + "\nPlease try again."); + return false; + } else { + if (!txtExtendsDTO.getText().trim().matches("^[a-zA-Z0-9\\_]{1,256}$")) { + JOptionPane.showMessageDialog(this, + "You must follow the class naming format." + + "\nPlease try again later."); + return false; + } + } + } + if (!txtImplementsDTO.getText().trim().isEmpty()) { + if (!String.valueOf(txtImplementsDTO.getText().trim().charAt(0)).matches("^[a-zA-Z]$")) { + JOptionPane.showMessageDialog(this, + "First letter of class name or package name must be alphabet." + + "\nPlease try again."); + return false; + } else { + if (!txtImplementsDTO.getText().trim().matches("^[a-zA-Z0-9\\,\\_\\.\\s]{1,256}$")) { + JOptionPane.showMessageDialog(this, + "You must follow the class naming format." + + "\nPlease try again later."); + return false; + } + } + } + return true; + } + + private void btnGenerateEntityActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGenerateEntityActionPerformed + // TODO add your handling code here: + if (!validateClassNameDTO()) { + return; + } + if (!validateIfExistExtendingOrImplementing()) { + return; + } + selectProjectPath("dto"); + }//GEN-LAST:event_btnGenerateEntityActionPerformed + + private boolean validateConnection() { + if (txtDBName.getText().trim().isEmpty()) { + txtDBName.setText("master"); + } + if (!txtDBName.getText().matches("^[a-zA-Z0-9]{1,254}$")) { + JOptionPane.showMessageDialog(this, "Only accept valid character.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + + if (txtUsername.getText().trim().isEmpty()) { + JOptionPane.showMessageDialog(this, "Please don't leave username blank.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } else { + if (!txtUsername.getText().matches("^[a-zA-Z0-9]{1,254}$")) { + JOptionPane.showMessageDialog(this, "Only accept valid character.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + } + if (txtPassword.getText().trim().isEmpty()) { + JOptionPane.showMessageDialog(this, "Please don't leave password blank.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + if (txtIP.getText().trim().isEmpty()) { + JOptionPane.showMessageDialog(this, "Please don't leave username blank.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } else { + if (!txtIP.getText().matches("^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$")) { + if (!txtIP.getText().matches("^[a-zA-Z0-9\\.]{1,254}$")) { + JOptionPane.showMessageDialog(this, "Only accept valid IP Address.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + } + } + if (txtPort.getText().trim().isEmpty()) { + JOptionPane.showMessageDialog(this, "Please don't leave port blank.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } else { + if (!txtIP.getText().matches("^[0-9]{1,5}$")) { + if (!txtIP.getText().matches("^[a-zA-Z0-9\\.]{1,254}$")) { + JOptionPane.showMessageDialog(this, "Only accept valid IP Address.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + } + try { + Integer.parseInt(txtPort.getText()); + } catch (NumberFormatException e) { + JOptionPane.showMessageDialog(this, "Only accept valid port.", + "Error while generating class", JOptionPane.ERROR_MESSAGE); + return false; + } + } + if (!txtPackageName.getText().trim().isEmpty()) { + if (txtPackageName.getText().trim().charAt(0) == '.') { + JOptionPane.showMessageDialog(this, new StringBuilder("Package name ") + .append("musn't be started with a dot. Please try again.").toString()); + return false; + } else { + if (!txtPackageName.getText().trim().matches("^[a-zA-Z0-9\\.]{1,256}$")) { + JOptionPane.showMessageDialog(this, new StringBuilder("Package ") + .append("name is not correct! Please follow the right format.").toString()); + return false; + } + } + } + return true; + } + + public static void main(String args[]) { + try { + javax.swing.UIManager.setLookAndFeel(new MaterialLookAndFeel(new JMarsDarkTheme())); + } catch (UnsupportedLookAndFeelException e) { + System.exit(0); + } + java.awt.EventQueue.invokeLater(() -> { + new MainController().setVisible(true); + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton btnChooseProject; + private javax.swing.JButton btnConnect; + private javax.swing.JButton btnGenerateEntity; + private javax.swing.JButton btnGenerateJDBCDAO; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JComboBox cbAddModifier; + private javax.swing.JComboBox cbCloseConnectionModifier; + private javax.swing.JComboBox cbConnectionModifier; + private javax.swing.JComboBox cbFindModifier; + private javax.swing.JComboBox cbGetAllModifier; + private javax.swing.JComboBox cbGetConnection; + private javax.swing.JComboBox cbPreparedStatementModifier; + private javax.swing.JComboBox cbRemoveModifier; + private javax.swing.JComboBox cbResultSetModifier; + private javax.swing.JComboBox cbUpdateModifier; + private javax.swing.JCheckBox chkAddJDBCDAO; + private javax.swing.JCheckBox chkCloseConnection; + private javax.swing.JCheckBox chkConnection; + private javax.swing.JCheckBox chkFinal; + private javax.swing.JCheckBox chkFinalDTO; + private javax.swing.JCheckBox chkFinalJDBCDAO; + private javax.swing.JCheckBox chkFindJDBCDAO; + private javax.swing.JCheckBox chkGetterConnectionJDBCDAO; + private javax.swing.JCheckBox chkGetterPreparedStatementJDBCDAO; + private javax.swing.JCheckBox chkGetterResultSetJDBCDAO; + private javax.swing.JCheckBox chkImplSerializable; + private javax.swing.JCheckBox chkPreparedStatement; + private javax.swing.JCheckBox chkPublic; + private javax.swing.JCheckBox chkPublicDTO; + private javax.swing.JCheckBox chkPublicJDBCDAO; + private javax.swing.JCheckBox chkRemoveJDBCDAO; + private javax.swing.JCheckBox chkResultSet; + private javax.swing.JCheckBox chkSerializable; + private javax.swing.JCheckBox chkSerializableDTO; + private javax.swing.JCheckBox chkSetterConnectionJDBCDAO; + private javax.swing.JCheckBox chkSetterPreparedStatementJDBCDAO; + private javax.swing.JCheckBox chkSetterResultSetJDBCDAO; + private javax.swing.JCheckBox chkUpdateJDBCDAO; + private javax.swing.JCheckBox chkgetAllJDBCDAO; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel10; + private javax.swing.JLabel jLabel11; + private javax.swing.JLabel jLabel12; + private javax.swing.JLabel jLabel13; + private javax.swing.JLabel jLabel14; + private javax.swing.JLabel jLabel15; + private javax.swing.JLabel jLabel16; + private javax.swing.JLabel jLabel17; + private javax.swing.JLabel jLabel18; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JLabel jLabel5; + private javax.swing.JLabel jLabel6; + private javax.swing.JLabel jLabel7; + private javax.swing.JLabel jLabel8; + private javax.swing.JLabel jLabel9; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel10; + private javax.swing.JPanel jPanel11; + private javax.swing.JPanel jPanel12; + private javax.swing.JPanel jPanel13; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JPanel jPanel6; + private javax.swing.JPanel jPanel7; + private javax.swing.JPanel jPanel8; + private javax.swing.JPanel jPanel9; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JSeparator jSeparator2; + private javax.swing.JSeparator jSeparator5; + private javax.swing.JSeparator jSeparator6; + private javax.swing.JTabbedPane jTabbedPane1; + private javax.swing.JTable jTable1; + private javax.swing.JLabel lblClose; + private javax.swing.JLabel lblLogo; + private javax.swing.JLabel lblLogoJDBC; + private javax.swing.JLabel lblMaxMin; + private javax.swing.JLabel lblMin; + private javax.swing.JTextField txtClassName; + private javax.swing.JTextField txtClassNameJDBC; + private javax.swing.JTextField txtClassNameJDBCDAO; + private javax.swing.JTextField txtDBName; + private javax.swing.JTextField txtExtendsDTO; + private javax.swing.JTextField txtGetConnection; + private javax.swing.JTextField txtIP; + private javax.swing.JTextField txtImplementsDTO; + private javax.swing.JLabel txtInfo; + private javax.swing.JTextField txtPackageName; + private javax.swing.JPasswordField txtPassword; + private javax.swing.JTextField txtPort; + private javax.swing.JTextField txtProjectName; + private javax.swing.JTextField txtUsername; + // End of variables declaration//GEN-END:variables +} diff --git a/src/main/java/com/bangmaple/jdbcgenerator/MotionPanel.java b/src/main/java/com/bangmaple/jdbcgenerator/MotionPanel.java new file mode 100644 index 0000000..c6a1c5f --- /dev/null +++ b/src/main/java/com/bangmaple/jdbcgenerator/MotionPanel.java @@ -0,0 +1,53 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.bangmaple.jdbcgenerator; + +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; +import javax.swing.JFrame; +import javax.swing.JPanel; + +/** + * + * @author bangmaple + */ +public class MotionPanel extends JPanel { + private Point initialClick; + private final JFrame parent; + + public MotionPanel(final JFrame parent){ + this.parent = parent; + + addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + initialClick = e.getPoint(); + getComponentAt(initialClick); + } + }); + + addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + + // get location of Window + int thisX = parent.getLocation().x; + int thisY = parent.getLocation().y; + + // Determine how much the mouse moved since the initial click + int xMoved = e.getX() - initialClick.x; + int yMoved = e.getY() - initialClick.y; + + // Move window to this position + int X = thisX + xMoved; + int Y = thisY + yMoved; + parent.setLocation(X, Y); + } + }); + } +} diff --git a/src/main/resources/icons8_minus_18px_1.png b/src/main/resources/icons8_minus_18px_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e092b35d870f5be0ac3e5577d13ec379bbb80551 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|wj^(N7l!{JxM1({$v_bkPZ!4! z3&G?B3D(7m4wW1RhkAbe{{EiD&CQKjV!p($|NsAs&zL!r+aYVF!x0TR-o}GMObjav WIam%pNPPv=&*16m=d#Wzp$PzXv?s{` literal 0 HcmV?d00001 diff --git a/src/main/resources/icons8_multiply_18px_1.png b/src/main/resources/icons8_multiply_18px_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ebae9c08e4b7c4a72a444d6a7e81ab641619ba80 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|wj^(N7l!{JxM1({$v}~vo-U3d z7J^SFJMuL-@VItPPdIK`s@yGDUd4ED@wuM$zS)nGE*T~+T{3st{rmpj2@?MvuiEPO z!|;~aInMdBY`Tgymp+@5uPd~5cfo^s(K1IB<61px9PBhsDDF%Mi*86-{LuM~%eD0` ze+)ZxukDzWKkd8kBPBV(3n!~w?!7-S+xC>z6XkbiQqR5@PGMX2u~g{i(Pg)mh-n`X zQ0n#1_HoEcIJqHWjp`yVnY&3GXH)z6g%;M<2`>AuSk0Jc`8W4KNiQqV6AYfNelF{r G5}E)i&})?d literal 0 HcmV?d00001 diff --git a/src/main/resources/icons8_rectangle_stroked_18px.png b/src/main/resources/icons8_rectangle_stroked_18px.png new file mode 100644 index 0000000000000000000000000000000000000000..1aab40d106efed25eff258cdec13c41912faf23d GIT binary patch literal 169 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 LNkvXXu0mjfN`uB6 literal 0 HcmV?d00001