package net.cbaines.suca; import java.awt.BorderLayout; import java.awt.GridLayout; 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.JApplet; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; 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 String calendarCSVString = null; private String calendarICALString = null; private JTabbedPane stageTabbedPane; // The panel used for the file fetch stuff private JPanel csvFileFetchPanel; private JLabel csvFileFetchInstructions; private JTextField usernameTextField; private JPasswordField passwordTextField; private JButton go; private JProgressBar fetchProgress; private JButton csvFileSelectorButton; private JTextArea csvTextArea; private CalendarApplet instance; // Panel for the stage controls private JPanel controlsPanel; // Panel for the calendar creation private JPanel calendarCreationPanel; private JPanel calendarCreationOptions; // This is more of a development feature....? private JTextArea calendarPreviewTextArea; 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 { stageTabbedPane = new JTabbedPane(); // Create the first screen csvFileFetchPanel = new JPanel(new GridLayout(1, 2)); JTabbedPane csvFileFetchMethodsTabbedPane = new JTabbedPane(); JPanel loginPanel = new JPanel(); JLabel usernameLabel = new JLabel("Username"); loginPanel.add(usernameLabel); usernameTextField = new JTextField(10); loginPanel.add(usernameTextField); JLabel passwordLabel = new JLabel("Password"); loginPanel.add(passwordLabel); passwordTextField = new JPasswordField(10); loginPanel.add(passwordTextField); go = new JButton("Go"); loginPanel.add(go); fetchProgress = new JProgressBar(); fetchProgress.setIndeterminate(true); fetchProgress.setVisible(false); loginPanel.add(fetchProgress); csvFileFetchMethodsTabbedPane.addTab("Download", loginPanel); JPanel csvFileLoadPanel = new JPanel(); csvFileSelectorButton = new JButton("Load csv file"); csvFileLoadPanel.add(csvFileSelectorButton); csvFileFetchMethodsTabbedPane.addTab("Load", csvFileLoadPanel); csvFileFetchMethodsTabbedPane.setEnabledAt(1, false); csvFileFetchPanel.add(csvFileFetchMethodsTabbedPane); csvTextArea = new JTextArea(100, 100); csvFileFetchPanel.add(new JScrollPane(csvTextArea)); go.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { go.setEnabled(false); new FetchThread().start(); } }); stageTabbedPane.addTab("Calendar Fetch", csvFileFetchPanel); // Calendar creation panel calendarCreationPanel = new JPanel(new GridLayout(1, 2)); calendarCreationOptions = new JPanel(); JButton createCalendarButton = new JButton("Create Calendar"); createCalendarButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { SotonCalendarParser calParser = new SotonCalendarParser(); CalendarBuilder builder = new CalendarBuilder(calParser); try { Calendar calendar = builder.build(new StringReader(calendarCSVString)); calendarICALString = calendar.toString(); calendarPreviewTextArea.setText(calendarICALString); System.out.println(calendarICALString); } catch (ParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); calendarCreationOptions.add(createCalendarButton); JButton saveCalendarButton = new JButton("Save Calendar"); saveCalendarButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { JFileChooser fc = new JFileChooser(); int returnVal = fc.showSaveDialog(instance); // this = Applet if (returnVal == JFileChooser.APPROVE_OPTION) { File aFile = fc.getSelectedFile(); try { BufferedWriter out = new BufferedWriter(new FileWriter(aFile)); out.write(calendarICALString); } catch (IOException e) { e.printStackTrace(); } } } }); calendarCreationOptions.add(saveCalendarButton); calendarCreationPanel.add(calendarCreationOptions); calendarPreviewTextArea = new JTextArea(); calendarCreationPanel.add(new JScrollPane(calendarPreviewTextArea)); stageTabbedPane.addTab("Calendar Creation", calendarCreationPanel); controlsPanel = new JPanel(); controlsPanel.add(new JButton("Previous")); controlsPanel.add(new JButton("Next")); getContentPane().add(stageTabbedPane, BorderLayout.CENTER); getContentPane().add(controlsPanel, BorderLayout.SOUTH); } catch (Exception e) { e.printStackTrace(); } } private class FetchThread extends Thread { public FetchThread() { super(); } @Override public void run() { System.out.println("Starting fetch thread"); String csvString; try { fetchProgress.setVisible(true); csvString = new SotonCalendarFetcher(usernameTextField.getText(), String.valueOf(passwordTextField .getPassword())).fetchAndParseTimetable(); System.out.println("Finished fetch"); fetchProgress.setIndeterminate(false); fetchProgress.setValue(100); fetchProgress.setString("Finished"); calendarCSVString = csvString; csvTextArea.setText(calendarCSVString); go.setEnabled(true); System.out.println("Finished fetch thread"); } catch (LoginException e) { fetchProgress.setIndeterminate(false); fetchProgress.setValue(0); fetchProgress.setString("Login Error"); } } } }