/Users/johnr/Desktop/IA pdf Downloads/Criteria__P__-_Coding_Project_Upload_all_2022-05-03/IdanIA/src/idania/MainGUI.java
   1 /*
   2  * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
   3  * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/Application.java to edit this template
   4  */
   5 package idania;
   6 
   7 import java.io.BufferedInputStream;
   8 import java.io.BufferedReader;
   9 import java.io.File;
  10 import java.io.FileInputStream;
  11 import java.io.FileReader;
  12 import java.util.ArrayList;
  13 import javax.swing.JOptionPane;
  14 import javax.swing.ListSelectionModel;
  15 import javax.swing.table.DefaultTableModel;
  16 import javax.swing.JFileChooser;
  17 import javax.swing.table.TableModel;
  18 import java.util.HashMap;
  19 import java.util.Calendar;
  20 import javazoom.jl.player.Player;
  21 
  22 /**
  23  *
  24  * @author Idan
  25  */
  26 public class MainGUI extends javax.swing.JFrame {
  27 
  28     ArrayList<Client> clientList = new ArrayList<>();
  29 
  30     
  31 
  32     /**
  33      * Creates new form MainGUI
  34      */
  35     public MainGUI() {
  36         initComponents();
  37         runSetup();
  38     }
  39 
  40     private void playSound() {
  41         try {
  42 //            Clip clip = AudioSystem.getClip();
  43 //            clip.open(AudioSystem.getAudioInputStream(new File("C:\\Users\\Idan\\NetBeans Projects\\IdanIA\\src\\idania\\wav\\mixkit-air-woosh-1489_1.wav")));
  44 //            clip.start();
  45 //            clip.close();
  46             String seperator = Character.toString(File.separatorChar);
  47             String cwd = System.getProperty("user.dir");
  48             String mp3Path = cwd.concat("*src*idania*wav*mixkit-air-woosh-1489_1.mp3".replace("*", seperator));
  49             BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(mp3Path));
  50             Player player = new Player(buffer);
  51             player.play();
  52             player.close();
  53 
  54         } catch (Exception ex) {
  55             System.out.println("Error while playing sound.");
  56             ex.printStackTrace();
  57         }
  58     }
  59 
  60     private void runSetup() {
  61         // Get the latest data from sqlite satabase
  62         clientList = new DatabaseManager().getClients();
  63 
  64         // Get data from database
  65         HashMap<Integer, ArrayList<Object>> payments = new DatabaseManager().getPayments();
  66         HashMap<Integer, Integer> sessions = new DatabaseManager().getSessions();
  67 
  68         DefaultTableModel dtm = (DefaultTableModel) clientTable.getModel();
  69         dtm.setRowCount(0);
  70         for (int i = 0; i < clientList.size(); i++) {
  71             dtm.addRow(clientList.get(i).getAsRow());
  72         }
  73 
  74         dtm = (DefaultTableModel) emailTable.getModel();
  75         dtm.setRowCount(0);
  76         for (int i = 0; i < clientList.size(); i++) {
  77             // Turnary conditional statement
  78             String type = (clientList.get(i).isStudent) ? "student" : (clientList.get(i).isTeacher) ? "teacher" : "neither";
  79 
  80             Object[] objectRow = {false, clientList.get(i).firstName + " " + clientList.get(i).lastName, clientList.get(i).emailAddress, type, false};
  81             dtm.addRow(objectRow);
  82         }
  83         emailTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
  84 
  85         dtm = (DefaultTableModel) paymentTable.getModel();
  86         dtm.setRowCount(0);
  87         for (int i = 0; i < clientList.size(); i++) {
  88             String lastPaymentDate = "NA";
  89             String paymentStatus = "NA";
  90 
  91             if (payments.get(clientList.get(i).clientID) != null) {
  92                 lastPaymentDate = payments.get(clientList.get(i).clientID).get(0).toString();
  93                 paymentStatus =  (boolean) payments.get(clientList.get(i).clientID).get(1) ? "PAID" : "UNPAID";
  94             }
  95             Object[] objectRow = {false, clientList.get(i).clientID, clientList.get(i).fullName() , lastPaymentDate, paymentStatus};
  96             dtm.addRow(objectRow);
  97         }
  98         
  99         dtm = (DefaultTableModel) sessionsTable.getModel();
 100         dtm.setRowCount(0);
 101         
 102         for (int i = 0; i < clientList.size(); i++) {
 103             String lastPaymentDate = "NA";
 104             if (payments.get(clientList.get(i).clientID) != null) {
 105                 lastPaymentDate = payments.get(clientList.get(i).clientID).get(0).toString();
 106             }
 107             
 108             int clientSessions = sessions.get(clientList.get(i).clientID) != null ? sessions.get(clientList.get(i).clientID) : 0;
 109 
 110             Object[] objectRow = {false, clientList.get(i).clientID, clientList.get(i).fullName(), lastPaymentDate, clientSessions};
 111             dtm.addRow(objectRow);
 112         }
 113     }
 114 
 115         
 116     /**
 117      * This method is called from within the constructor to initialize the form.
 118      * WARNING: Do NOT modify this code. The content of this method is always
 119      * regenerated by the Form Editor.
 120      */
 121     @SuppressWarnings("unchecked")
 122     // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
 123     private void initComponents() {
 124 
 125         jTabbedPane1 = new javax.swing.JTabbedPane();
 126         jPanel3 = new javax.swing.JPanel();
 127         jLabel5 = new javax.swing.JLabel();
 128         jLabel6 = new javax.swing.JLabel();
 129         jLabel7 = new javax.swing.JLabel();
 130         jLabel8 = new javax.swing.JLabel();
 131         jLabel9 = new javax.swing.JLabel();
 132         jLabel10 = new javax.swing.JLabel();
 133         jLabel11 = new javax.swing.JLabel();
 134         firstNameInput = new javax.swing.JTextField();
 135         lastNameInput = new javax.swing.JTextField();
 136         emailAddressInput = new javax.swing.JTextField();
 137         addClientButton = new javax.swing.JButton();
 138         isTeacherInput = new javax.swing.JCheckBox();
 139         isStudentInput = new javax.swing.JCheckBox();
 140         jScrollPane2 = new javax.swing.JScrollPane();
 141         clientTable = new javax.swing.JTable();
 142         removeClientButton = new javax.swing.JButton();
 143         dateJoinedPicker = new org.jdesktop.swingx.JXDatePicker();
 144         ageInput = new javax.swing.JSpinner();
 145         jPanel5 = new javax.swing.JPanel();
 146         jLabel3 = new javax.swing.JLabel();
 147         jScrollPane5 = new javax.swing.JScrollPane();
 148         sessionsTable = new javax.swing.JTable();
 149         searchClientSessions = new javax.swing.JTextField();
 150         packageSelection = new javax.swing.JComboBox<>();
 151         jLabel4 = new javax.swing.JLabel();
 152         jButton1 = new javax.swing.JButton();
 153         jLabel12 = new javax.swing.JLabel();
 154         sessionsToRemove = new javax.swing.JSpinner();
 155         removeSessionButton = new javax.swing.JButton();
 156         jPanel4 = new javax.swing.JPanel();
 157         paymentStatusSelection = new javax.swing.JComboBox<>();
 158         jLabel2 = new javax.swing.JLabel();
 159         searchClient = new javax.swing.JTextField();
 160         jScrollPane4 = new javax.swing.JScrollPane();
 161         paymentTable = new javax.swing.JTable();
 162         updatePaymentStatusButton = new javax.swing.JButton();
 163         jPanel1 = new javax.swing.JPanel();
 164         jScrollPane3 = new javax.swing.JScrollPane();
 165         emailTable = new javax.swing.JTable();
 166         emailTableSelection = new javax.swing.JComboBox<>();
 167         sendEmail = new javax.swing.JButton();
 168         jLabel1 = new javax.swing.JLabel();
 169         emailSubject = new javax.swing.JTextField();
 170         jScrollPane1 = new javax.swing.JScrollPane();
 171         emailBody = new javax.swing.JTextArea();
 172         uploadFileButton = new javax.swing.JButton();
 173 
 174         setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 175 
 176         jLabel5.setText("First Name");
 177 
 178         jLabel6.setText("Last Name");
 179 
 180         jLabel7.setText("Teacher");
 181 
 182         jLabel8.setText("Student");
 183 
 184         jLabel9.setText("Age");
 185 
 186         jLabel10.setText("Email Address");
 187 
 188         jLabel11.setText("Date Joined");
 189 
 190         firstNameInput.addActionListener(new java.awt.event.ActionListener() {
 191             public void actionPerformed(java.awt.event.ActionEvent evt) {
 192                 firstNameInputActionPerformed(evt);
 193             }
 194         });
 195 
 196         addClientButton.setForeground(new java.awt.Color(102, 153, 255));
 197         addClientButton.setText("Add Client");
 198         addClientButton.addMouseListener(new java.awt.event.MouseAdapter() {
 199             public void mouseClicked(java.awt.event.MouseEvent evt) {
 200                 addClientButtonMouseClicked(evt);
 201             }
 202         });
 203         addClientButton.addActionListener(new java.awt.event.ActionListener() {
 204             public void actionPerformed(java.awt.event.ActionEvent evt) {
 205                 addClientButtonActionPerformed(evt);
 206             }
 207         });
 208 
 209         isStudentInput.addActionListener(new java.awt.event.ActionListener() {
 210             public void actionPerformed(java.awt.event.ActionEvent evt) {
 211                 isStudentInputActionPerformed(evt);
 212             }
 213         });
 214 
 215         clientTable.setModel(new javax.swing.table.DefaultTableModel(
 216             new Object [][] {
 217 
 218             },
 219             new String [] {
 220                 "ID", "Full Name", "Age", "Email Address", "Student/ Teacher", "Date Joined"
 221             }
 222         ) {
 223             Class[] types = new Class [] {
 224                 java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.Object.class, java.lang.String.class, java.lang.String.class
 225             };
 226             boolean[] canEdit = new boolean [] {
 227                 false, false, false, false, false, false
 228             };
 229 
 230             public Class getColumnClass(int columnIndex) {
 231                 return types [columnIndex];
 232             }
 233 
 234             public boolean isCellEditable(int rowIndex, int columnIndex) {
 235                 return canEdit [columnIndex];
 236             }
 237         });
 238         clientTable.getTableHeader().setReorderingAllowed(false);
 239         clientTable.addFocusListener(new java.awt.event.FocusAdapter() {
 240             public void focusGained(java.awt.event.FocusEvent evt) {
 241                 clientTableFocusGained(evt);
 242             }
 243         });
 244         jScrollPane2.setViewportView(clientTable);
 245         if (clientTable.getColumnModel().getColumnCount() > 0) {
 246             clientTable.getColumnModel().getColumn(0).setResizable(false);
 247         }
 248 
 249         removeClientButton.setForeground(new java.awt.Color(255, 0, 0));
 250         removeClientButton.setText("Remove Client");
 251         removeClientButton.setEnabled(false);
 252         removeClientButton.addMouseListener(new java.awt.event.MouseAdapter() {
 253             public void mouseClicked(java.awt.event.MouseEvent evt) {
 254                 removeClientButtonMouseClicked(evt);
 255             }
 256         });
 257         removeClientButton.addActionListener(new java.awt.event.ActionListener() {
 258             public void actionPerformed(java.awt.event.ActionEvent evt) {
 259                 removeClientButtonActionPerformed(evt);
 260             }
 261         });
 262 
 263         javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
 264         jPanel3.setLayout(jPanel3Layout);
 265         jPanel3Layout.setHorizontalGroup(
 266             jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 267             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
 268                 .addContainerGap()
 269                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
 270                     .addGroup(jPanel3Layout.createSequentialGroup()
 271                         .addComponent(jLabel9)
 272                         .addGap(18, 18, 18)
 273                         .addComponent(ageInput, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE))
 274                     .addGroup(jPanel3Layout.createSequentialGroup()
 275                         .addComponent(jLabel10)
 276                         .addGap(18, 18, 18)
 277                         .addComponent(emailAddressInput, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE))
 278                     .addGroup(jPanel3Layout.createSequentialGroup()
 279                         .addComponent(jLabel11)
 280                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 281                         .addComponent(dateJoinedPicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 282                     .addGroup(jPanel3Layout.createSequentialGroup()
 283                         .addComponent(jLabel6)
 284                         .addGap(18, 18, 18)
 285                         .addComponent(lastNameInput, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE))
 286                     .addGroup(jPanel3Layout.createSequentialGroup()
 287                         .addComponent(jLabel5)
 288                         .addGap(18, 18, 18)
 289                         .addComponent(firstNameInput))
 290                     .addGroup(jPanel3Layout.createSequentialGroup()
 291                         .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 292                             .addGroup(jPanel3Layout.createSequentialGroup()
 293                                 .addGap(10, 10, 10)
 294                                 .addComponent(isTeacherInput))
 295                             .addComponent(jLabel7))
 296                         .addGap(50, 50, 50)
 297                         .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 298                             .addComponent(jLabel8)
 299                             .addGroup(jPanel3Layout.createSequentialGroup()
 300                                 .addGap(10, 10, 10)
 301                                 .addComponent(isStudentInput, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE))))
 302                     .addGroup(jPanel3Layout.createSequentialGroup()
 303                         .addGap(53, 53, 53)
 304                         .addComponent(addClientButton)))
 305                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 316, Short.MAX_VALUE)
 306                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 307                     .addComponent(removeClientButton)
 308                     .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 549, javax.swing.GroupLayout.PREFERRED_SIZE))
 309                 .addGap(68, 68, 68))
 310         );
 311         jPanel3Layout.setVerticalGroup(
 312             jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 313             .addGroup(jPanel3Layout.createSequentialGroup()
 314                 .addContainerGap()
 315                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 316                     .addComponent(jLabel5)
 317                     .addComponent(firstNameInput, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 318                 .addGap(18, 18, 18)
 319                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 320                     .addComponent(jLabel6)
 321                     .addComponent(lastNameInput, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 322                 .addGap(20, 20, 20)
 323                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 324                     .addComponent(jLabel11)
 325                     .addComponent(dateJoinedPicker, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 326                 .addGap(18, 18, 18)
 327                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 328                     .addGroup(jPanel3Layout.createSequentialGroup()
 329                         .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 330                             .addComponent(jLabel7)
 331                             .addComponent(jLabel8))
 332                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 333                         .addComponent(isTeacherInput))
 334                     .addComponent(isStudentInput, javax.swing.GroupLayout.Alignment.TRAILING))
 335                 .addGap(18, 18, 18)
 336                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 337                     .addComponent(jLabel9)
 338                     .addComponent(ageInput, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 339                 .addGap(18, 18, 18)
 340                 .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 341                     .addComponent(jLabel10)
 342                     .addComponent(emailAddressInput, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 343                 .addGap(18, 18, 18)
 344                 .addComponent(addClientButton)
 345                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 346             .addGroup(jPanel3Layout.createSequentialGroup()
 347                 .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 348                 .addGap(18, 18, 18)
 349                 .addComponent(removeClientButton)
 350                 .addGap(0, 98, Short.MAX_VALUE))
 351         );
 352 
 353         jTabbedPane1.addTab("Add Clients", jPanel3);
 354 
 355         jLabel3.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
 356         jLabel3.setText("Add/Remove Sessions");
 357 
 358         sessionsTable.setModel(new javax.swing.table.DefaultTableModel(
 359             new Object [][] {
 360 
 361             },
 362             new String [] {
 363                 "Select", "Client ID", "Full Name", "Last Payment Made", "Current Sessions"
 364             }
 365         ) {
 366             Class[] types = new Class [] {
 367                 java.lang.Boolean.class, java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
 368             };
 369 
 370             public Class getColumnClass(int columnIndex) {
 371                 return types [columnIndex];
 372             }
 373         });
 374         jScrollPane5.setViewportView(sessionsTable);
 375 
 376         searchClientSessions.setText("Search Client");
 377         searchClientSessions.addMouseListener(new java.awt.event.MouseAdapter() {
 378             public void mouseClicked(java.awt.event.MouseEvent evt) {
 379                 searchClientSessionsMouseClicked(evt);
 380             }
 381         });
 382         searchClientSessions.addActionListener(new java.awt.event.ActionListener() {
 383             public void actionPerformed(java.awt.event.ActionEvent evt) {
 384                 searchClientSessionsActionPerformed(evt);
 385             }
 386         });
 387         searchClientSessions.addKeyListener(new java.awt.event.KeyAdapter() {
 388             public void keyReleased(java.awt.event.KeyEvent evt) {
 389                 searchClientSessionsKeyReleased(evt);
 390             }
 391         });
 392 
 393         packageSelection.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "10 Sessions Package", "30 Sessions Package", "45 Sessions Package", "60 Sessions Package" }));
 394 
 395         jLabel4.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
 396         jLabel4.setText("Select Amount Of Sessions To Add");
 397 
 398         jButton1.setText("Add Sessions");
 399         jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
 400             public void mouseClicked(java.awt.event.MouseEvent evt) {
 401                 jButton1MouseClicked(evt);
 402             }
 403         });
 404 
 405         jLabel12.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
 406         jLabel12.setText("Select Amount Of Sessions To Remove");
 407 
 408         removeSessionButton.setText("Remove Session");
 409         removeSessionButton.addMouseListener(new java.awt.event.MouseAdapter() {
 410             public void mouseClicked(java.awt.event.MouseEvent evt) {
 411                 removeSessionButtonMouseClicked(evt);
 412             }
 413         });
 414 
 415         javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
 416         jPanel5.setLayout(jPanel5Layout);
 417         jPanel5Layout.setHorizontalGroup(
 418             jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 419             .addGroup(jPanel5Layout.createSequentialGroup()
 420                 .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 421                     .addGroup(jPanel5Layout.createSequentialGroup()
 422                         .addGap(501, 501, 501)
 423                         .addComponent(searchClientSessions, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE))
 424                     .addGroup(jPanel5Layout.createSequentialGroup()
 425                         .addGap(340, 340, 340)
 426                         .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 427                     .addGroup(jPanel5Layout.createSequentialGroup()
 428                         .addGap(387, 387, 387)
 429                         .addComponent(jLabel3))
 430                     .addGroup(jPanel5Layout.createSequentialGroup()
 431                         .addGap(235, 235, 235)
 432                         .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 433                             .addGroup(jPanel5Layout.createSequentialGroup()
 434                                 .addComponent(jLabel4)
 435                                 .addGap(88, 88, 88)
 436                                 .addComponent(jLabel12))
 437                             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
 438                                 .addComponent(packageSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 439                                 .addGap(278, 278, 278)
 440                                 .addComponent(sessionsToRemove, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
 441                                 .addGap(120, 120, 120))))
 442                     .addGroup(jPanel5Layout.createSequentialGroup()
 443                         .addGap(326, 326, 326)
 444                         .addComponent(jButton1)
 445                         .addGap(279, 279, 279)
 446                         .addComponent(removeSessionButton)))
 447                 .addContainerGap(228, Short.MAX_VALUE))
 448         );
 449         jPanel5Layout.setVerticalGroup(
 450             jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 451             .addGroup(jPanel5Layout.createSequentialGroup()
 452                 .addContainerGap()
 453                 .addComponent(jLabel3)
 454                 .addGap(18, 18, 18)
 455                 .addComponent(searchClientSessions, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 456                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 457                 .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
 458                     .addGroup(jPanel5Layout.createSequentialGroup()
 459                         .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)
 460                         .addGap(18, 18, 18)
 461                         .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 462                             .addComponent(jLabel4)
 463                             .addComponent(jLabel12))
 464                         .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 465                         .addComponent(sessionsToRemove, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE))
 466                     .addComponent(packageSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 467                 .addGap(35, 35, 35)
 468                 .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
 469                     .addComponent(jButton1)
 470                     .addComponent(removeSessionButton))
 471                 .addContainerGap(161, Short.MAX_VALUE))
 472         );
 473 
 474         jTabbedPane1.addTab("Sessions Status", jPanel5);
 475 
 476         paymentStatusSelection.setFont(new java.awt.Font("Tahoma", 0, 20)); // NOI18N
 477         paymentStatusSelection.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Update Client Payment Status...", "Paid", "Unpaid" }));
 478 
 479         jLabel2.setFont(new java.awt.Font("Tahoma", 0, 30)); // NOI18N
 480         jLabel2.setText("Client Payment Status");
 481 
 482         searchClient.setHorizontalAlignment(javax.swing.JTextField.CENTER);
 483         searchClient.setText("Search Client");
 484         searchClient.addMouseListener(new java.awt.event.MouseAdapter() {
 485             public void mouseClicked(java.awt.event.MouseEvent evt) {
 486                 searchClientMouseClicked(evt);
 487             }
 488         });
 489         searchClient.addActionListener(new java.awt.event.ActionListener() {
 490             public void actionPerformed(java.awt.event.ActionEvent evt) {
 491                 searchClientActionPerformed(evt);
 492             }
 493         });
 494         searchClient.addKeyListener(new java.awt.event.KeyAdapter() {
 495             public void keyReleased(java.awt.event.KeyEvent evt) {
 496                 searchClientKeyReleased(evt);
 497             }
 498         });
 499 
 500         paymentTable.setModel(new javax.swing.table.DefaultTableModel(
 501             new Object [][] {
 502 
 503             },
 504             new String [] {
 505                 "Select", "Client ID", "Full Name", "Last Payment Made", "Payment Status"
 506             }
 507         ) {
 508             Class[] types = new Class [] {
 509                 java.lang.Boolean.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
 510             };
 511             boolean[] canEdit = new boolean [] {
 512                 true, true, false, false, true
 513             };
 514 
 515             public Class getColumnClass(int columnIndex) {
 516                 return types [columnIndex];
 517             }
 518 
 519             public boolean isCellEditable(int rowIndex, int columnIndex) {
 520                 return canEdit [columnIndex];
 521             }
 522         });
 523         jScrollPane4.setViewportView(paymentTable);
 524 
 525         updatePaymentStatusButton.setFont(new java.awt.Font("Tahoma", 0, 20)); // NOI18N
 526         updatePaymentStatusButton.setText("Update Status");
 527         updatePaymentStatusButton.addMouseListener(new java.awt.event.MouseAdapter() {
 528             public void mouseClicked(java.awt.event.MouseEvent evt) {
 529                 updatePaymentStatusButtonMouseClicked(evt);
 530             }
 531         });
 532 
 533         javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
 534         jPanel4.setLayout(jPanel4Layout);
 535         jPanel4Layout.setHorizontalGroup(
 536             jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 537             .addGroup(jPanel4Layout.createSequentialGroup()
 538                 .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 539                     .addGroup(jPanel4Layout.createSequentialGroup()
 540                         .addGap(281, 281, 281)
 541                         .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 542                     .addGroup(jPanel4Layout.createSequentialGroup()
 543                         .addGap(429, 429, 429)
 544                         .addComponent(searchClient, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE))
 545                     .addGroup(jPanel4Layout.createSequentialGroup()
 546                         .addGap(363, 363, 363)
 547                         .addComponent(jLabel2))
 548                     .addGroup(jPanel4Layout.createSequentialGroup()
 549                         .addGap(347, 347, 347)
 550                         .addComponent(paymentStatusSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 551                     .addGroup(jPanel4Layout.createSequentialGroup()
 552                         .addGap(425, 425, 425)
 553                         .addComponent(updatePaymentStatusButton)))
 554                 .addContainerGap(402, Short.MAX_VALUE))
 555         );
 556         jPanel4Layout.setVerticalGroup(
 557             jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 558             .addGroup(jPanel4Layout.createSequentialGroup()
 559                 .addContainerGap()
 560                 .addComponent(jLabel2)
 561                 .addGap(49, 49, 49)
 562                 .addComponent(searchClient, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 563                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 564                 .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE)
 565                 .addGap(32, 32, 32)
 566                 .addComponent(paymentStatusSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 567                 .addGap(43, 43, 43)
 568                 .addComponent(updatePaymentStatusButton)
 569                 .addContainerGap(66, Short.MAX_VALUE))
 570         );
 571 
 572         jTabbedPane1.addTab("Payment Status", jPanel4);
 573 
 574         emailTable.setModel(new javax.swing.table.DefaultTableModel(
 575             new Object [][] {
 576 
 577             },
 578             new String [] {
 579                 "Selected", "Full Name", "Email", "Teacher/ Student", "Payment Status"
 580             }
 581         ) {
 582             Class[] types = new Class [] {
 583                 java.lang.Boolean.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
 584             };
 585             boolean[] canEdit = new boolean [] {
 586                 true, false, false, false, false
 587             };
 588 
 589             public Class getColumnClass(int columnIndex) {
 590                 return types [columnIndex];
 591             }
 592 
 593             public boolean isCellEditable(int rowIndex, int columnIndex) {
 594                 return canEdit [columnIndex];
 595             }
 596         });
 597         emailTable.getTableHeader().setReorderingAllowed(false);
 598         jScrollPane3.setViewportView(emailTable);
 599         if (emailTable.getColumnModel().getColumnCount() > 0) {
 600             emailTable.getColumnModel().getColumn(0).setResizable(false);
 601         }
 602 
 603         emailTableSelection.setFont(new java.awt.Font("Tahoma", 0, 13)); // NOI18N
 604         emailTableSelection.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "Select...", "All", "All Students", "All Teachers", "All Paid", "All Unpaid" }));
 605         emailTableSelection.addItemListener(new java.awt.event.ItemListener() {
 606             public void itemStateChanged(java.awt.event.ItemEvent evt) {
 607                 emailTableSelectionItemStateChanged(evt);
 608             }
 609         });
 610         emailTableSelection.addMouseListener(new java.awt.event.MouseAdapter() {
 611             public void mouseClicked(java.awt.event.MouseEvent evt) {
 612                 emailTableSelectionMouseClicked(evt);
 613             }
 614         });
 615         emailTableSelection.addActionListener(new java.awt.event.ActionListener() {
 616             public void actionPerformed(java.awt.event.ActionEvent evt) {
 617                 emailTableSelectionActionPerformed(evt);
 618             }
 619         });
 620 
 621         sendEmail.setFont(new java.awt.Font("Tahoma", 0, 13)); // NOI18N
 622         sendEmail.setText("Send Email");
 623         sendEmail.addMouseListener(new java.awt.event.MouseAdapter() {
 624             public void mouseClicked(java.awt.event.MouseEvent evt) {
 625                 sendEmailMouseClicked(evt);
 626             }
 627         });
 628 
 629         jLabel1.setFont(new java.awt.Font("Tahoma", 0, 15)); // NOI18N
 630         jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
 631         jLabel1.setText("Select Recipient/s:");
 632 
 633         emailSubject.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
 634         emailSubject.setText("Subject");
 635         emailSubject.setForeground(new java.awt.Color(204, 204, 204));
 636         emailSubject.addMouseListener(new java.awt.event.MouseAdapter() {
 637             public void mouseClicked(java.awt.event.MouseEvent evt) {
 638                 emailSubjectMouseClicked(evt);
 639             }
 640         });
 641         emailSubject.addActionListener(new java.awt.event.ActionListener() {
 642             public void actionPerformed(java.awt.event.ActionEvent evt) {
 643                 emailSubjectActionPerformed(evt);
 644             }
 645         });
 646 
 647         emailBody.setColumns(20);
 648         emailBody.setRows(5);
 649         jScrollPane1.setViewportView(emailBody);
 650 
 651         uploadFileButton.setText("Upload Text File");
 652         uploadFileButton.addActionListener(new java.awt.event.ActionListener() {
 653             public void actionPerformed(java.awt.event.ActionEvent evt) {
 654                 uploadFileButtonActionPerformed(evt);
 655             }
 656         });
 657 
 658         javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
 659         jPanel1.setLayout(jPanel1Layout);
 660         jPanel1Layout.setHorizontalGroup(
 661             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 662             .addGroup(jPanel1Layout.createSequentialGroup()
 663                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 664                     .addGroup(jPanel1Layout.createSequentialGroup()
 665                         .addGap(178, 178, 178)
 666                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 667                             .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 587, javax.swing.GroupLayout.PREFERRED_SIZE)
 668                             .addGroup(jPanel1Layout.createSequentialGroup()
 669                                 .addGap(166, 166, 166)
 670                                 .addComponent(emailSubject, javax.swing.GroupLayout.PREFERRED_SIZE, 235, javax.swing.GroupLayout.PREFERRED_SIZE))))
 671                     .addGroup(jPanel1Layout.createSequentialGroup()
 672                         .addGap(351, 351, 351)
 673                         .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE)))
 674                 .addGap(0, 370, Short.MAX_VALUE))
 675             .addGroup(jPanel1Layout.createSequentialGroup()
 676                 .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 677                     .addGroup(jPanel1Layout.createSequentialGroup()
 678                         .addGap(410, 410, 410)
 679                         .addComponent(emailTableSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
 680                     .addGroup(jPanel1Layout.createSequentialGroup()
 681                         .addGap(399, 399, 399)
 682                         .addComponent(sendEmail))
 683                     .addGroup(jPanel1Layout.createSequentialGroup()
 684                         .addGap(274, 274, 274)
 685                         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 686                             .addComponent(uploadFileButton)
 687                             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 378, javax.swing.GroupLayout.PREFERRED_SIZE))))
 688                 .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
 689         );
 690         jPanel1Layout.setVerticalGroup(
 691             jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 692             .addGroup(jPanel1Layout.createSequentialGroup()
 693                 .addContainerGap()
 694                 .addComponent(jLabel1)
 695                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 696                 .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 108, javax.swing.GroupLayout.PREFERRED_SIZE)
 697                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
 698                 .addComponent(emailTableSelection, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 699                 .addGap(18, 18, 18)
 700                 .addComponent(emailSubject, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
 701                 .addGap(18, 18, 18)
 702                 .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 145, javax.swing.GroupLayout.PREFERRED_SIZE)
 703                 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
 704                 .addComponent(uploadFileButton)
 705                 .addGap(20, 20, 20)
 706                 .addComponent(sendEmail)
 707                 .addContainerGap(107, Short.MAX_VALUE))
 708         );
 709 
 710         emailSubject.getAccessibleContext().setAccessibleDescription("");
 711 
 712         jTabbedPane1.addTab("Email", jPanel1);
 713 
 714         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
 715         getContentPane().setLayout(layout);
 716         layout.setHorizontalGroup(
 717             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 718             .addComponent(jTabbedPane1)
 719         );
 720         layout.setVerticalGroup(
 721             layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
 722             .addComponent(jTabbedPane1)
 723         );
 724 
 725         pack();
 726     }// </editor-fold>                        
 727 
 728     private void uploadFileButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                 
 729         JFileChooser chooser = new JFileChooser();
 730         chooser.showOpenDialog(null);
 731         File f = chooser.getSelectedFile();
 732         String filename = f.getAbsolutePath();
 733         try {
 734             FileReader reader = new FileReader(filename);
 735             BufferedReader br = new BufferedReader(reader);
 736             emailBody.read(br, null);
 737             br.close();
 738             emailBody.requestFocus();
 739         } catch (Exception e) {
 740             JOptionPane.showMessageDialog(null, e);
 741         }        // TODO add your handling code here:
 742     }                                                
 743 
 744     private void emailSubjectActionPerformed(java.awt.event.ActionEvent evt) {                                             
 745         // TODO add your handling code here:
 746     }                                            
 747 
 748     private void emailSubjectMouseClicked(java.awt.event.MouseEvent evt) {                                          
 749         emailSubject.setText("");
 750     }                                         
 751 
 752     private void sendEmailMouseClicked(java.awt.event.MouseEvent evt) {                                       
 753         ArrayList<String> recipients = new ArrayList<String>();
 754         // Get the clients selected
 755         TableModel model = emailTable.getModel();
 756 
 757         // Populate recipients list with selected values
 758         for(int i = 0; i < emailTable.getRowCount(); i++) {
 759             boolean isSelected = (boolean) model.getValueAt(i, 0);
 760             if (isSelected) recipients.add(model.getValueAt(i, 2).toString());
 761         }
 762         // Convert array list to static array
 763         String [] recipientsAsArray = new String[recipients.size()];
 764         recipientsAsArray = recipients.toArray(recipientsAsArray);
 765 
 766         // Get subject and body content
 767         String subject = emailSubject.getText();
 768         String body = emailBody.getText();
 769         Email email = new Email(recipientsAsArray, subject, body);
 770         email.sendEmail();
 771 
 772         // Play Audio For Send Button
 773         playSound();
 774         // Email sent successfully message
 775         JOptionPane.showMessageDialog(this, "Email Sent Successfully");
 776     }                                      
 777 
 778     private void emailTableSelectionActionPerformed(java.awt.event.ActionEvent evt) {                                                    
 779         // TODO add your handling code here:
 780     }                                                   
 781 
 782 //Unselect row in emailTable
 783     private void emailTableSelectionMouseClicked(java.awt.event.MouseEvent evt) {                                                 
 784         for (int i = 0; i < emailTable.getRowCount(); i++) {
 785             emailTable.getModel().setValueAt(false, i, 0);
 786         }
 787     }                                                
 788 
 789     private void emailTableSelectionItemStateChanged(java.awt.event.ItemEvent evt) {                                                     
 790         int selectedIndex = emailTableSelection.getSelectedIndex();
 791         if (selectedIndex == 1) {
 792             // All
 793             for (int i = 0; i < emailTable.getRowCount(); i++) {
 794                 emailTable.getModel().setValueAt(true, i, 0);
 795             }
 796         } else if (selectedIndex == 2) {
 797             //Students
 798             for (int i = 0; i < emailTable.getRowCount(); i++) {
 799                 String type = (String) emailTable.getModel().getValueAt(i, 3);
 800                 if (type.equalsIgnoreCase("student")) {
 801                     //                    emailTable.getSelectionModel().addSelectionInterval(i, i);
 802                     emailTable.getModel().setValueAt(true, i, 0);
 803 
 804                 }
 805             }
 806         } else if (selectedIndex == 3) {
 807             for (int i = 0; i < emailTable.getRowCount(); i++) {
 808                 String type = (String) emailTable.getModel().getValueAt(i, 3);
 809                 if (type.equalsIgnoreCase("teacher")) {
 810                     //                  emailTable.getSelectionModel().addSelectionInterval(i, i);
 811                     emailTable.getModel().setValueAt(true, i, 0);
 812 
 813                 }
 814             }
 815         } else if (selectedIndex == 4) {
 816             for (int i = 0; i < emailTable.getRowCount(); i++) {
 817                 boolean paid = (boolean) emailTable.getModel().getValueAt(i, 4);
 818                 if (paid) {
 819                     //                    emailTable.getSelectionModel().addSelectionInterval(i, i);
 820                     emailTable.getModel().setValueAt(true, i, 0);
 821                 }
 822 
 823             }
 824         } else if (selectedIndex == 5) {
 825             for (int i = 0; i < emailTable.getRowCount(); i++) {
 826                 boolean paid = (boolean) emailTable.getModel().getValueAt(i, 4);
 827                 if (!paid) {
 828                     //                    emailTable.getSelectionModel().addSelectionInterval(i, i);
 829                     emailTable.getModel().setValueAt(true, i, 0);
 830                 }
 831 
 832             }
 833         } else if (selectedIndex == 0) {
 834             for (int i = 0; i < emailTable.getRowCount(); i++) {
 835                 emailTable.getModel().setValueAt(false, i, 0);
 836             }
 837         }
 838     }                                                    
 839 
 840     private void updatePaymentStatusButtonMouseClicked(java.awt.event.MouseEvent evt) {                                                       
 841 
 842         ArrayList<Integer> clientIDs = new ArrayList<Integer>();
 843 
 844         // Get the clients selected
 845         TableModel model = paymentTable.getModel();
 846 
 847         // Populate clientIDs list with selected values
 848         for(int i = 0; i < paymentTable.getRowCount(); i++) {
 849             boolean isSelected = (boolean) model.getValueAt(i, 0);
 850 
 851             if(isSelected) {
 852                 int clientID = (int) model.getValueAt(i, 1);
 853                 String date = model.getValueAt(i, 3).toString();
 854                 // Update the status for the client
 855                 updatePayment(clientID, date);
 856             }
 857         }
 858 
 859         runSetup();
 860         JOptionPane.showMessageDialog(null, "Clients payment status successfully updated!");
 861     }                                                      
 862 
 863     private void searchClientKeyReleased(java.awt.event.KeyEvent evt) {                                         
 864         String searchInput = searchClient.getText();
 865 
 866         ArrayList<Client> results = new ArrayList<>();
 867 
 868         // Add all possible matching clients
 869         for(Client client : clientList) {
 870             if (client.fullName().toLowerCase().contains(searchInput.toLowerCase())) {
 871                 results.add(client);
 872             }
 873         }
 874 
 875         // Populate table with results
 876         ((DefaultTableModel) paymentTable.getModel()).setRowCount(0);
 877 
 878         HashMap<Integer, ArrayList<Object>> payments = new DatabaseManager().getPayments();
 879 
 880         for(Client client : results) {
 881             String lastPaymentDate = "NA";
 882             String paymentStatus = "NA";
 883 
 884             if (payments.get(client.clientID) != null) {
 885                 lastPaymentDate = payments.get(client.clientID).get(0).toString();
 886                 paymentStatus =  (boolean) payments.get(client.clientID).get(1) ? "PAID" : "UNPAID";
 887             }
 888 
 889             Object[] objectRow = {false, client.clientID, client.fullName(), lastPaymentDate, paymentStatus};
 890             ((DefaultTableModel) paymentTable.getModel()).addRow(objectRow);
 891         }
 892     }                                        
 893 
 894     private void searchClientActionPerformed(java.awt.event.ActionEvent evt) {                                             
 895         // TODO add your handling code here:
 896     }                                            
 897 
 898     private void searchClientMouseClicked(java.awt.event.MouseEvent evt) {                                          
 899         searchClient.setText("");
 900     }                                         
 901 
 902     private void removeSessionButtonMouseClicked(java.awt.event.MouseEvent evt) {                                                 
 903         ArrayList<Integer> clientIDs = new ArrayList<Integer>();
 904         // Get the clients selected
 905         TableModel model = sessionsTable.getModel();
 906 
 907         // Populate clientIDs list with selected values
 908         for(int i = 0; i < sessionsTable.getRowCount(); i++) {
 909             boolean isSelected = (boolean) model.getValueAt(i, 0);
 910             if (isSelected) clientIDs.add((int)model.getValueAt(i, 1));
 911         }
 912 
 913         // Update sessions for all IDs
 914         int toRemove = (int) sessionsToRemove.getValue();
 915 
 916         DatabaseManager dm = new DatabaseManager();
 917 
 918         HashMap<Integer, Integer> sessions = dm.getSessions();
 919 
 920         // Use enhanced for loop
 921         for(int id : clientIDs) {
 922             int currentSessions = sessions.get(id) == null ? 0 : sessions.get(id);
 923             String query = dm.getSessionsUpdateQuery(id, currentSessions  - toRemove);
 924             dm.writeToDB(query);
 925         }
 926 
 927         // Run setup again to update table values
 928         runSetup();
 929     }                                                
 930 
 931     private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
 932 
 933         ArrayList<Integer> clientIDs = new ArrayList<Integer>();
 934         // Get the clients selected
 935         TableModel model = sessionsTable.getModel();
 936 
 937         // Populate clientIDs list with selected values
 938         for(int i = 0; i < sessionsTable.getRowCount(); i++) {
 939             boolean isSelected = (boolean) model.getValueAt(i, 0);
 940             if (isSelected) clientIDs.add((int)model.getValueAt(i, 1));
 941         }
 942 
 943         // Update sessions for all IDs
 944         int selectedPackage = 0;
 945 
 946         switch(packageSelection.getSelectedIndex()) {
 947             case 0:
 948             selectedPackage = 10;
 949             break;
 950             case 1:
 951             selectedPackage = 30;
 952             break;
 953             case 2:
 954             selectedPackage = 45;
 955             break;
 956             case 3:
 957             selectedPackage = 60;
 958             break;
 959         }
 960 
 961         DatabaseManager dm = new DatabaseManager();
 962 
 963         HashMap<Integer, Integer> sessions = dm.getSessions();
 964 
 965         // Use enhanced for loop
 966         for(int id : clientIDs) {
 967             int currentSessions = sessions.get(id) == null ? 0 : sessions.get(id);
 968             String query = dm.getSessionsUpdateQuery(id, currentSessions  + selectedPackage);
 969             dm.writeToDB(query);
 970         }
 971 
 972         // Run setup again to update table values
 973         runSetup();
 974     }                                     
 975 
 976     private void searchClientSessionsActionPerformed(java.awt.event.ActionEvent evt) {                                                     
 977         // TODO add your handling code here:
 978     }                                                    
 979 
 980     private void removeClientButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                   
 981         // TODO add your handling code here:
 982     }                                                  
 983 
 984     private void removeClientButtonMouseClicked(java.awt.event.MouseEvent evt) {                                                
 985         DefaultTableModel dtm = (DefaultTableModel) clientTable.getModel();
 986         DatabaseManager dm = new DatabaseManager();
 987         int[] rowsSelected = clientTable.getSelectedRows();
 988         for (int i = rowsSelected.length - 1; i >= 0; i--) {
 989             int clientID = (int) clientTable.getModel().getValueAt(rowsSelected[i], 0);
 990             dm.writeToDB(dm.getDeleteClientQuery(clientID));
 991             dtm.removeRow(i);
 992         }
 993 
 994         JOptionPane.showMessageDialog(this, "Removed Client Successfully");
 995         removeClientButton.setEnabled(false);
 996 
 997         runSetup();
 998     }                                               
 999 
1000     private void clientTableFocusGained(java.awt.event.FocusEvent evt) {                                        
1001         // TODO add your handling code here:
1002         removeClientButton.setEnabled(true);
1003     }                                       
1004 
1005     private void isStudentInputActionPerformed(java.awt.event.ActionEvent evt) {                                               
1006         // TODO add your handling code here:
1007     }                                              
1008 
1009     private void addClientButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                
1010 
1011     }                                               
1012 
1013     private void addClientButtonMouseClicked(java.awt.event.MouseEvent evt) {                                             
1014         // Error Handling: Check Inputs are Inputted and not empty
1015 
1016         if (firstNameInput.getText().isEmpty()) { 
1017             JOptionPane.showMessageDialog(this, "First Name Is Empty");
1018             return;
1019         }
1020         if (lastNameInput.getText().isEmpty()) {
1021             JOptionPane.showMessageDialog(this, "Last Name Is Empty");
1022             return;
1023         }
1024         if (emailAddressInput.getText().isEmpty()){
1025             JOptionPane.showMessageDialog(this, "Email Address Is Empty");
1026             return;
1027         }
1028         if (dateJoinedPicker.getEditor().getText().isEmpty()){
1029             JOptionPane.showMessageDialog(this, "Date Joined Is Empty");
1030             return;
1031         }
1032         try {
1033             int testAge = (int) ageInput.getValue();
1034         } catch(Exception ignore) {
1035             JOptionPane.showMessageDialog(this, "Invalid Age Input"); 
1036             return;
1037 
1038         }
1039         // Get inputs from text fields
1040         String firstName = firstNameInput.getText();
1041         String lastName = lastNameInput.getText();
1042         boolean isTeacher = isTeacherInput.isSelected();
1043         boolean isStudent = isStudentInput.isSelected();
1044         int age = (int) ageInput.getValue();
1045         String emailAddress = emailAddressInput.getText();
1046 
1047         // Error Handling: Check that data is valid
1048         if (age < 10){
1049             JOptionPane.showMessageDialog(this, "Invalid Age (Below 10)");
1050             return;
1051         }
1052         
1053         if (!emailAddressInput.getText().contains("@")){
1054             JOptionPane.showMessageDialog(this, "Invalid Email Address");
1055             return;
1056         }
1057 
1058         // Get selected date and conver Date object to Calendar object
1059         Calendar dateSelection = Calendar.getInstance();
1060         dateSelection.setTime(dateJoinedPicker.getDate());
1061 
1062         String dateJoined = dateSelection.get(Calendar.YEAR) + "/" + dateSelection.get(Calendar.DATE) + "/" + (dateSelection.get(Calendar.MONTH) + 1);
1063 
1064         Client client = new Client(firstName, lastName, isTeacher, isStudent, age, emailAddress, dateJoined);
1065         // TODO Set the id of the new client to be the largest current id + 1
1066         DatabaseManager dm = new DatabaseManager();
1067 
1068         dm.writeToDB(dm.getInsertClientQuery(client));
1069 
1070         //Empty text fields
1071         firstNameInput.setText("");
1072         lastNameInput.setText("");
1073         isTeacherInput.setSelected(false);
1074         isStudentInput.setSelected(false);
1075         ageInput.setValue(0);
1076         emailAddressInput.setText("");
1077         dateJoinedPicker.getEditor().setText("");
1078 
1079         runSetup();
1080         // Popup Message for addClient Button
1081         JOptionPane.showMessageDialog(this, "Added Client Successfully");
1082     }                                            
1083 
1084     private void firstNameInputActionPerformed(java.awt.event.ActionEvent evt) {                                               
1085         // TODO add your handling code here:
1086     }                                              
1087 
1088     private void searchClientSessionsMouseClicked(java.awt.event.MouseEvent evt) {                                                  
1089         searchClientSessions.setText("");
1090     }                                                 
1091 
1092     private void searchClientSessionsKeyReleased(java.awt.event.KeyEvent evt) {                                                 
1093         String searchInput = searchClientSessions.getText();
1094 
1095         ArrayList<Client> results = new ArrayList<>();
1096 
1097         // Add all possible matching clients
1098         for(Client client : clientList) {
1099             if (client.fullName().toLowerCase().contains(searchInput.toLowerCase())) {
1100                 results.add(client);
1101             }
1102         }
1103 
1104         // Populate table with results
1105         ((DefaultTableModel) sessionsTable.getModel()).setRowCount(0);
1106 
1107         HashMap<Integer, ArrayList<Object>> payments = new DatabaseManager().getPayments();
1108         HashMap<Integer, Integer> sessions = new DatabaseManager().getSessions();
1109         
1110 
1111         for(Client client : results) {
1112             String lastPaymentDate = "NA";
1113 
1114             if (payments.get(client.clientID) != null) {
1115                 lastPaymentDate = payments.get(client.clientID).get(0).toString();
1116             }
1117             
1118             int clientSessions = sessions.get(client.clientID) != null ? sessions.get(client.clientID) : 0;
1119 
1120 
1121             Object[] objectRow = {false, client.clientID, client.fullName(), lastPaymentDate, clientSessions};
1122             ((DefaultTableModel) sessionsTable.getModel()).addRow(objectRow);
1123         }
1124     }                                                
1125 
1126     private void updatePayment(int clientID, String date) {
1127         DatabaseManager dm = new DatabaseManager();
1128 
1129         // Get the status
1130         String query = "";
1131 
1132         switch (paymentStatusSelection.getSelectedIndex()) {
1133             case 1:
1134                 query = dm.getUpdatePaymentQuery(clientID, date, true);
1135                 break;
1136             case 2:
1137                 date = java.time.LocalDate.now().toString();
1138                 query = dm.getAddPaymentQuery(clientID, date);
1139                 break;
1140         }
1141 
1142         dm.writeToDB(query);
1143     }
1144 
1145 
1146     /**
1147      * @param args the command line arguments
1148      */
1149     public static void main(String args[]) {
1150 
1151         /* Set the Nimbus look and feel */
1152         //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
1153         /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
1154          * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
1155          */
1156         try {
1157             for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
1158                 if ("Nimbus".equals(info.getName())) {
1159                     javax.swing.UIManager.setLookAndFeel(info.getClassName());
1160                     break;
1161                 }
1162             }
1163         } catch (ClassNotFoundException ex) {
1164             java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1165         } catch (InstantiationException ex) {
1166             java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1167         } catch (IllegalAccessException ex) {
1168             java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1169         } catch (javax.swing.UnsupportedLookAndFeelException ex) {
1170             java.util.logging.Logger.getLogger(MainGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
1171         }
1172         //</editor-fold>
1173 
1174         /* Create and display the form */
1175         java.awt.EventQueue.invokeLater(new Runnable() {
1176             public void run() {
1177                 new MainGUI().setVisible(true);
1178             }
1179         });
1180     }
1181 
1182     // Variables declaration - do not modify                     
1183     private org.jdesktop.swingx.JXDatePicker dateJoinedPicker;
1184     private javax.swing.JButton addClientButton;
1185     private javax.swing.JSpinner ageInput;
1186     private javax.swing.JTable clientTable;
1187     private javax.swing.JTextField emailAddressInput;
1188     private javax.swing.JTextArea emailBody;
1189     private javax.swing.JTextField emailSubject;
1190     private javax.swing.JTable emailTable;
1191     private javax.swing.JComboBox<String> emailTableSelection;
1192     private javax.swing.JTextField firstNameInput;
1193     private javax.swing.JCheckBox isStudentInput;
1194     private javax.swing.JCheckBox isTeacherInput;
1195     private javax.swing.JButton jButton1;
1196     private javax.swing.JLabel jLabel1;
1197     private javax.swing.JLabel jLabel10;
1198     private javax.swing.JLabel jLabel11;
1199     private javax.swing.JLabel jLabel12;
1200     private javax.swing.JLabel jLabel2;
1201     private javax.swing.JLabel jLabel3;
1202     private javax.swing.JLabel jLabel4;
1203     private javax.swing.JLabel jLabel5;
1204     private javax.swing.JLabel jLabel6;
1205     private javax.swing.JLabel jLabel7;
1206     private javax.swing.JLabel jLabel8;
1207     private javax.swing.JLabel jLabel9;
1208     private javax.swing.JPanel jPanel1;
1209     private javax.swing.JPanel jPanel3;
1210     private javax.swing.JPanel jPanel4;
1211     private javax.swing.JPanel jPanel5;
1212     private javax.swing.JScrollPane jScrollPane1;
1213     private javax.swing.JScrollPane jScrollPane2;
1214     private javax.swing.JScrollPane jScrollPane3;
1215     private javax.swing.JScrollPane jScrollPane4;
1216     private javax.swing.JScrollPane jScrollPane5;
1217     private javax.swing.JTabbedPane jTabbedPane1;
1218     private javax.swing.JTextField lastNameInput;
1219     private javax.swing.JComboBox<String> packageSelection;
1220     private javax.swing.JComboBox<String> paymentStatusSelection;
1221     private javax.swing.JTable paymentTable;
1222     private javax.swing.JButton removeClientButton;
1223     private javax.swing.JButton removeSessionButton;
1224     private javax.swing.JTextField searchClient;
1225     private javax.swing.JTextField searchClientSessions;
1226     private javax.swing.JButton sendEmail;
1227     private javax.swing.JTable sessionsTable;
1228     private javax.swing.JSpinner sessionsToRemove;
1229     private javax.swing.JButton updatePaymentStatusButton;
1230     private javax.swing.JButton uploadFileButton;
1231     // End of variables declaration                   
1232 
1233 }