package net.cbaines.suca; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.StringReader; import javax.security.auth.login.LoginException; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JProgressBar; import javax.swing.JTextField; import net.fortuna.ical4j.data.CalendarBuilder; import net.fortuna.ical4j.data.ParserException; import net.fortuna.ical4j.model.Calendar; @SuppressWarnings("serial") public class CalendarApplet extends JApplet { private CalendarApplet instance; // The panel holding the stages private Container stages; // Load University Calendar private JPanel calendarLoadingPanel; private JTextField usernameTextField; private JPasswordField passwordTextField; private JButton fetchCalendarButton; private JProgressBar fetchCalendarProgress; // iCal Calendar Creation Options private JPanel calendarCreationOptions; private JCheckBox mergeDuplicateEventsWithSeperateLocations = new JCheckBox( "Merge Duplicate Events with Seperate Locations", true); private JCheckBox showTerms = new JCheckBox("Show Terms", true); private JCheckBox showSemesters = new JCheckBox("Show Semesters", true); private JCheckBox showSemesterWeeks = new JCheckBox("Show Semester Weeks", true); private JCheckBox mergeHeaders = new JCheckBox("Merge Headers", false); // Download Calendar private JPanel downloadCalendarPanel; private JButton donwloadCalendarButton; // Data private volatile String calendarCSVString = null; private volatile String calendarICALString = null; public void init() { // Execute a job on the event-dispatching thread: // creating this applet's GUI. try { javax.swing.SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } } void createGUI() { try { stages = getContentPane(); stages.setLayout(new BoxLayout(stages, BoxLayout.PAGE_AXIS)); // Load University Calendar Stage calendarLoadingPanel = new JPanel(); calendarLoadingPanel.setBorder(BorderFactory.createTitledBorder("Load University Calendar")); JPanel usernamePanel = new JPanel(); usernamePanel.add(new JLabel("Username")); usernameTextField = new JTextField(10); usernamePanel.add(usernameTextField); calendarLoadingPanel.add(usernamePanel); JPanel passwordPanel = new JPanel(); passwordPanel.add(new JLabel("Password")); passwordTextField = new JPasswordField(10); passwordPanel.add(passwordTextField); calendarLoadingPanel.add(passwordPanel); fetchCalendarButton = new JButton("Fetch Calendar"); fetchCalendarButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { new FetchThread().start(); } }); calendarLoadingPanel.add(fetchCalendarButton); fetchCalendarProgress = new JProgressBar(); fetchCalendarProgress.setIndeterminate(false); fetchCalendarProgress.setValue(0); calendarLoadingPanel.add(fetchCalendarProgress); stages.add(calendarLoadingPanel); // iCal Calendar Creation Options calendarCreationOptions = new JPanel(); calendarCreationOptions.setBorder(BorderFactory.createTitledBorder("Calendar Options")); calendarCreationOptions.add(mergeDuplicateEventsWithSeperateLocations); calendarCreationOptions.add(showTerms); calendarCreationOptions.add(showSemesters); calendarCreationOptions.add(showSemesterWeeks); calendarCreationOptions.add(mergeHeaders); stages.add(calendarCreationOptions); // Calendar Download downloadCalendarPanel = new JPanel(); downloadCalendarPanel.setBorder(BorderFactory.createTitledBorder("Download Calendar (iCal)")); donwloadCalendarButton = new JButton("Download Calendar"); donwloadCalendarButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { CreationThread creationThread = new CreationThread(); creationThread.start(); JFileChooser fc = new JFileChooser(); int returnVal = fc.showSaveDialog(instance); // this = Applet if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); try { creationThread.join(); } catch (InterruptedException e1) { e1.printStackTrace(); } try { BufferedWriter out = new BufferedWriter(new FileWriter(file)); out.write(calendarICALString); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }); downloadCalendarPanel.add(donwloadCalendarButton); stages.add(downloadCalendarPanel); } catch (Exception e) { e.printStackTrace(); } } private class FetchThread extends Thread { public FetchThread() { super(); } @Override public void run() { System.out.println("Start of fetch thread"); fetchCalendarButton.setEnabled(false); fetchCalendarProgress.setIndeterminate(true); fetchCalendarProgress.setValue(0); String csvString; try { csvString = new SotonCalendarFetcher(usernameTextField.getText(), String.valueOf(passwordTextField .getPassword())).fetchAndParseTimetable(); System.out.println("Finished fetch"); calendarCSVString = csvString; System.out.println("Finished fetch thread"); fetchCalendarButton.setEnabled(true); fetchCalendarProgress.setIndeterminate(false); fetchCalendarProgress.setValue(100); } catch (LoginException e) { fetchCalendarButton.setEnabled(true); fetchCalendarProgress.setIndeterminate(false); fetchCalendarProgress.setValue(0); JOptionPane.showMessageDialog(instance, "LoginException: Error logging in, try again, and perhaps also try logging in to SUSSED", "Inane error", JOptionPane.ERROR_MESSAGE); } catch (IOException e) { fetchCalendarButton.setEnabled(true); fetchCalendarProgress.setIndeterminate(false); fetchCalendarProgress.setValue(0); JOptionPane.showMessageDialog(instance, "IOException: Error logging in, try again, and perhaps also try logging in to SUSSED", "Inane error", JOptionPane.ERROR_MESSAGE); } } } private class CreationThread extends Thread { public CreationThread() { super(); } @Override public void run() { System.out.println("Starting creation thread"); SotonCalendarParser calParser = new SotonCalendarParser(); calParser.setMergeDuplicateEventsWithSeperateLocations(mergeDuplicateEventsWithSeperateLocations .isSelected()); calParser.setMergeHeaders(mergeHeaders.isSelected()); calParser.setShowSemesters(showSemesters.isSelected()); calParser.setShowSemesterWeeks(showSemesterWeeks.isSelected()); calParser.setShowTerms(showTerms.isSelected()); CalendarBuilder builder = new CalendarBuilder(calParser); try { Calendar calendar = builder.build(new StringReader(calendarCSVString)); calendarICALString = calendar.toString(); } catch (ParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }