aboutsummaryrefslogtreecommitdiff
path: root/src/net/cbaines/suca/CalendarApplet.java
blob: 816084f57036de14d8687893368006bcc036a261 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
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();
			}

		}
	}

}