1 package org.thestaticvoid.iriverter;
2 
3 import org.eclipse.swt.*;
4 import org.eclipse.swt.widgets.*;
5 import org.eclipse.swt.layout.*;
6 import org.eclipse.swt.custom.*;
7 import org.eclipse.swt.graphics.*;
8 import org.eclipse.swt.events.*;
9 import org.eclipse.swt.dnd.*;
10 
11 import java.io.*;
12 import java.util.*;
13 
14 public class ConverterUI implements SelectionListener, CTabFolder2Listener, DropTargetListener {
15 	private Display display;
16 	private Shell shell;
17 	private ToolItem convertTool, newSingleVideoTool, newDirectoryTool, newDVDTool;
18 	private CTabFolder tabFolder;
19 	private Map profileMenuItems, dimensionsMenuItems;
20 	private MenuItem convert, playFile, newSingleVideo, newDirectory, newDVD, advancedJobs, manualSplit, joinVideos, moveUp, moveDown, closeJob, closeAllJobs, quit, bitrate, videoSize, panAndScan, advancedOptions, audioSync, automaticallySplit, volume, contents, logViewer, about;
21 	private Menu videoSizeMenu;
22 	private DropTarget target;
23 	private String fileName;
24 	private Process proc;
25 	private ProgressDialog progressDialog;
26 
ConverterUI()27 	public ConverterUI() {
28 		display = new Display();
29 
30 		shell = new Shell(display);
31 		shell.setText("iriverter");
32 		InputStream is = getClass().getResourceAsStream("icons/iriverter.png");
33 		shell.setImage(new Image(display, is));
34 		GridLayout gridLayout = new GridLayout();
35 		gridLayout.horizontalSpacing = 0;
36 		gridLayout.marginHeight = 0;
37 		gridLayout.marginWidth = 0;
38 		gridLayout.verticalSpacing = 0;
39 		shell.setLayout(gridLayout);
40 
41 		setupMenus();
42 		setupToolBar();
43 
44 		tabFolder = new CTabFolder(shell, SWT.CLOSE);
45 		tabFolder.setSimple(false);
46 		tabFolder.setBorderVisible(true);
47 		tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
48 		tabFolder.addSelectionListener(this);
49 		tabFolder.addCTabFolder2Listener(this);
50 
51 		target = new DropTarget(shell, DND.DROP_MOVE | DND.DROP_COPY);
52 		target.setTransfer(new Transfer[]{FileTransfer.getInstance()});
53 		target.addDropListener(this);
54 
55 		shell.setMinimumSize(400, 267);
56 		shell.setSize(500, 334);
57 		shell.open();
58 		while (!shell.isDisposed())
59 			if (!display.readAndDispatch())
60 				display.sleep();
61 
62 		display.dispose();
63 	}
64 
setupMenus()65 	public void setupMenus() {
66 		Menu menu = new Menu(shell, SWT.BAR);
67 		shell.setMenuBar(menu);
68 
69 		MenuItem jobs = new MenuItem(menu, SWT.CASCADE);
70 		jobs.setText("&Jobs");
71 
72 		Menu jobsMenu = new Menu(shell, SWT.DROP_DOWN);
73 		jobs.setMenu(jobsMenu);
74 
75 		convert = new MenuItem(jobsMenu, SWT.PUSH);
76 		convert.setText("&Convert...\tShift+Ctrl+C");
77 		convert.setAccelerator(SWT.SHIFT + SWT.CTRL + 'C');
78 		convert.addSelectionListener(this);
79 
80 		playFile = new MenuItem(jobsMenu, SWT.PUSH);
81 		playFile.setText("&Play File...\tShift+Ctrl+F");
82 		playFile.setAccelerator(SWT.SHIFT + SWT.CTRL + 'F');
83 		playFile.addSelectionListener(this);
84 
85 		new MenuItem(jobsMenu, SWT.SEPARATOR);
86 
87 		MenuItem newJob = new MenuItem(jobsMenu, SWT.CASCADE);
88 		newJob.setText("&New");
89 
90 		Menu newJobMenu = new Menu(shell, SWT.DROP_DOWN);
91 		newJob.setMenu(newJobMenu);
92 
93 		newSingleVideo = new MenuItem(newJobMenu, SWT.PUSH);
94 		newSingleVideo.setText("&Single Video\tShift+Ctrl+S");
95 		newSingleVideo.setAccelerator(SWT.SHIFT + SWT.CTRL + 'S');
96 		newSingleVideo.addSelectionListener(this);
97 
98 		newDirectory = new MenuItem(newJobMenu, SWT.PUSH);
99 		newDirectory.setText("&Directory\tShift+Ctrl+D");
100 		newDirectory.setAccelerator(SWT.SHIFT + SWT.CTRL + 'D');
101 		newDirectory.addSelectionListener(this);
102 
103 		newDVD = new MenuItem(newJobMenu, SWT.PUSH);
104 		newDVD.setText("D&VD\tShift+Ctrl+V");
105 		newDVD.setAccelerator(SWT.SHIFT + SWT.CTRL + 'V');
106 		newDVD.addSelectionListener(this);
107 
108 		advancedJobs = new MenuItem(newJobMenu, SWT.CASCADE);
109 		advancedJobs.setText("&Advanced");
110 
111 		advancedJobs.setEnabled(ConverterOptions.getCurrentProfile().getWrapperFormat().equals("avi"));
112 
113 		Menu advancedJobsMenu = new Menu(shell, SWT.DROP_DOWN);
114 		advancedJobs.setMenu(advancedJobsMenu);
115 
116 		manualSplit = new MenuItem(advancedJobsMenu, SWT.PUSH);
117 		manualSplit.setText("Manual &Split");
118 		manualSplit.addSelectionListener(this);
119 
120 		joinVideos = new MenuItem(advancedJobsMenu, SWT.PUSH);
121 		joinVideos.setText("&Join Videos");
122 		joinVideos.addSelectionListener(this);
123 
124 		new MenuItem(jobsMenu, SWT.SEPARATOR);
125 
126 		moveUp = new MenuItem(jobsMenu, SWT.PUSH);
127 		moveUp.setText("Move &Up\tPage Up");
128 		moveUp.setAccelerator(SWT.PAGE_UP);
129 		moveUp.setEnabled(false);
130 		moveUp.addSelectionListener(this);
131 
132 		moveDown = new MenuItem(jobsMenu, SWT.PUSH);
133 		moveDown.setText("Move &Down\tPage Down");
134 		moveDown.setAccelerator(SWT.PAGE_DOWN);
135 		moveDown.setEnabled(false);
136 		moveDown.addSelectionListener(this);
137 
138 		new MenuItem(jobsMenu, SWT.SEPARATOR);
139 
140 		closeJob = new MenuItem(jobsMenu, SWT.PUSH);
141 		closeJob.setText("&Close\tCtrl+W");
142 		closeJob.setAccelerator(SWT.CTRL + 'W');
143 		closeJob.setEnabled(false);
144 		closeJob.addSelectionListener(this);
145 
146 		closeAllJobs = new MenuItem(jobsMenu, SWT.PUSH);
147 		closeAllJobs.setText("&Close All\tShift+Ctrl+W");
148 		closeAllJobs.setAccelerator(SWT.SHIFT + SWT.CTRL + 'W');
149 		closeAllJobs.setEnabled(false);
150 		closeAllJobs.addSelectionListener(this);
151 
152 		quit = new MenuItem(jobsMenu, SWT.PUSH);
153 		quit.setText("&Quit\tCtrl+Q");
154 		quit.setAccelerator(SWT.CTRL + 'Q');
155 		quit.addSelectionListener(this);
156 
157 		MenuItem options = new MenuItem(menu, SWT.CASCADE);
158 		options.setText("&Options");
159 
160 		Menu optionsMenu = new Menu(shell, SWT.DROP_DOWN);
161 		options.setMenu(optionsMenu);
162 
163 		MenuItem device = new MenuItem(optionsMenu, SWT.CASCADE);
164 		device.setText("&Device");
165 
166 		Menu deviceMenu = new Menu(shell, SWT.DROP_DOWN);
167 		device.setMenu(deviceMenu);
168 
169 		profileMenuItems = new HashMap();
170 		Profile[] profiles = Profile.getAllProfiles();
171 		Profile currentProfile = ConverterOptions.getCurrentProfile();
172 
173 		Map deviceToProfile = new HashMap();
174 		Map brandToDevices = new TreeMap();
175 		for (int i = 0; i < profiles.length; i++) {
176 			Set devices = (Set) brandToDevices.get(profiles[i].getBrand());
177 			if (devices == null) {
178 				devices = new TreeSet();
179 				brandToDevices.put(profiles[i].getBrand(), devices);
180 			}
181 
182 			devices.add(profiles[i].getDevice());
183 			deviceToProfile.put(profiles[i].getDevice(), profiles[i]);
184 		}
185 
186 		Iterator brandItr = brandToDevices.keySet().iterator();
187 		for (int i = 0; brandItr.hasNext(); i++) {
188 			String brand = (String) brandItr.next();
189 
190 			MenuItem brandMenuItem = new MenuItem(deviceMenu, SWT.CASCADE);
191 			brandMenuItem.setText("&" + (i + 1) + " " + brand);
192 
193 			Menu brandMenu = new Menu(shell, SWT.DROP_DOWN);
194 			brandMenuItem.setMenu(brandMenu);
195 
196 			Iterator deviceItr = ((Set) brandToDevices.get(brand)).iterator();
197 			for (int j = 0; deviceItr.hasNext(); j++) {
198 				String deviceStr = (String) deviceItr.next();
199 				Profile profile = (Profile) deviceToProfile.get(deviceStr);
200 
201 				MenuItem profileMenuItem = new MenuItem(brandMenu, SWT.RADIO);
202 				profileMenuItem.setText("&" + (j + 1) + " " + deviceStr);
203 				profileMenuItem.setSelection(profile.getProfileName().equals(currentProfile.getProfileName()));
204 				profileMenuItem.addSelectionListener(this);
205 
206 				profileMenuItems.put(profileMenuItem, profile.getProfileName());
207 			}
208 		}
209 
210 		new MenuItem(optionsMenu, SWT.SEPARATOR);
211 
212 		bitrate = new MenuItem(optionsMenu, SWT.PUSH);
213 		bitrate.setText("&Bitrate...\tShift+Ctrl+B");
214 		bitrate.setAccelerator(SWT.SHIFT + SWT.CTRL + 'B');
215 		bitrate.addSelectionListener(this);
216 
217 		new MenuItem(optionsMenu, SWT.SEPARATOR);
218 
219 		videoSize = new MenuItem(optionsMenu, SWT.CASCADE);
220 		videoSize.setText("Video &Size");
221 
222 		videoSizeMenu = new Menu(shell, SWT.DROP_DOWN);
223 		videoSize.setMenu(videoSizeMenu);
224 
225 		new MenuItem(optionsMenu, SWT.SEPARATOR);
226 
227 		panAndScan = new MenuItem(optionsMenu, SWT.CHECK);
228 		panAndScan.setText("&Pan and Scan\tShift+Ctrl+P");
229 		panAndScan.setAccelerator(SWT.SHIFT + SWT.CTRL + 'P');
230 		panAndScan.setSelection(ConverterOptions.getPanAndScan());
231 		panAndScan.addSelectionListener(this);
232 
233 		advancedOptions = new MenuItem(optionsMenu, SWT.CASCADE);
234 		advancedOptions.setText("&Advanced");
235 
236 		Menu advancedOptionsMenu = new Menu(shell, SWT.DROP_DOWN);
237 		advancedOptions.setMenu(advancedOptionsMenu);
238 
239 		audioSync = new MenuItem(advancedOptionsMenu, SWT.PUSH);
240 		audioSync.setText("Audio &Sync...");
241 		audioSync.addSelectionListener(this);
242 
243 		automaticallySplit = new MenuItem(advancedOptionsMenu, SWT.PUSH);
244 		automaticallySplit.setText("&Automatically Split...");
245 		automaticallySplit.addSelectionListener(this);
246 
247 		automaticallySplit.setEnabled(ConverterOptions.getCurrentProfile().getWrapperFormat().equals("avi"));
248 
249 		volume = new MenuItem(advancedOptionsMenu, SWT.PUSH);
250 		volume.setText("&Volume...");
251 		volume.addSelectionListener(this);
252 
253 		MenuItem help = new MenuItem(menu, SWT.CASCADE);
254 		help.setText("&Help");
255 
256 		Menu helpMenu = new Menu(shell, SWT.DROP_DOWN);
257 		help.setMenu(helpMenu);
258 
259 		contents = new MenuItem(helpMenu, SWT.PUSH);
260 		contents.setText("&Contents\tF1");
261 		contents.setAccelerator(SWT.F1);
262 		contents.addSelectionListener(this);
263 
264 		logViewer = new MenuItem(helpMenu, SWT.PUSH);
265 		logViewer.setText("&Log Viewer");
266 		logViewer.addSelectionListener(this);
267 
268 		new MenuItem(helpMenu, SWT.SEPARATOR);
269 
270 		about = new MenuItem(helpMenu, SWT.PUSH);
271 		about.setText("&About");
272 		about.addSelectionListener(this);
273 
274 		dimensionsMenuItems = new HashMap();
275 		profileChanged();
276 	}
277 
setupToolBar()278 	public void setupToolBar() {
279 		ToolBar toolBar = new ToolBar(shell, SWT.HORIZONTAL | SWT.FLAT);
280 		toolBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
281 
282 		convertTool = new ToolItem(toolBar, SWT.PUSH);
283 		InputStream is = getClass().getResourceAsStream("icons/convert-24.png");
284 		convertTool.setImage(new Image(display, is));
285 		convertTool.setToolTipText("Convert");
286 		convertTool.addSelectionListener(this);
287 
288 		new ToolItem(toolBar, SWT.SEPARATOR);
289 
290 		newSingleVideoTool = new ToolItem(toolBar, SWT.PUSH);
291 		is = getClass().getResourceAsStream("icons/singlevideo-24.png");
292 		newSingleVideoTool.setImage(new Image(display, is));
293 		newSingleVideoTool.setToolTipText("Single Video");
294 		newSingleVideoTool.addSelectionListener(this);
295 
296 		newDirectoryTool = new ToolItem(toolBar, SWT.PUSH);
297 		is = getClass().getResourceAsStream("icons/directory-24.png");
298 		newDirectoryTool.setImage(new Image(display, is));
299 		newDirectoryTool.setToolTipText("Directory");
300 		newDirectoryTool.addSelectionListener(this);
301 
302 		newDVDTool = new ToolItem(toolBar, SWT.PUSH);
303 		is = getClass().getResourceAsStream("icons/dvd-24.png");
304 		newDVDTool.setImage(new Image(display, is));
305 		newDVDTool.setToolTipText("DVD");
306 		newDVDTool.addSelectionListener(this);
307 	}
308 
widgetDefaultSelected(SelectionEvent e)309 	public void widgetDefaultSelected(SelectionEvent e) {
310 		// empty
311 	}
312 
widgetSelected(SelectionEvent e)313 	public void widgetSelected(SelectionEvent e) {
314 		if (e.getSource() == tabFolder)
315 			tabChanged(false);
316 
317 		if (e.getSource() == convert || e.getSource() == convertTool) {
318 			java.util.List jobs = new ArrayList();
319 			for (int i = 0; i < tabFolder.getItemCount(); i++)
320 				jobs.add(tabFolder.getItem(i).getControl());
321 
322 			progressDialog = new ProgressDialog(shell, SWT.NONE);
323 			Converter converter = new Converter(jobs, progressDialog);
324 			converter.start();
325 			progressDialog.open();
326 			converter.cancel();
327 		}
328 
329 		if (e.getSource() == playFile) {
330 			FileDialog fileDialog = new FileDialog(shell, SWT.OPEN);
331 			fileDialog.setText("Input Video");
332 			fileDialog.setFilterExtensions(new String[]{"*.avi;*.vob;*.mkv;*.mpg;*.mpeg;*.ogm;*.mov;*.rm;*.ram;*.wmv;*.asf", "*.avi", "*.vob", "*.mkv", "*.mpg;*.mpeg", "*.ogm", "*.mov", "*.rm;*.ram", "*.wmv;*.asf"});
333 			fileDialog.setFilterNames(new String[]{"All Video Files", "AVI Video (*.avi)", "DVD Video Object (*.vob)", "Matroska Video (*.mkv)", "MPEG Video (*.mpg, *.mpeg)", "Ogg Video (*.ogm)", "Quicktime Movie (*.mov)", "Real Video (*.rm, *.ram)", "Windows Media Video (*.wmv, *.asf)"});
334 			String file = fileDialog.open();
335 
336 			if (file != null) {
337 				try {
338 					proc = Runtime.getRuntime().exec(new String[]{MPlayerInfo.getMPlayerPath() + "mplayer", file});
339 				} catch (IOException io) {
340 					io.printStackTrace();
341 				}
342 			}
343 		}
344 
345 		if (e.getSource() == newSingleVideo || e.getSource() == newSingleVideoTool)
346 			newSingleVideo();
347 
348 		if (e.getSource() == newDirectory || e.getSource() == newDirectoryTool)
349 			newDirectory();
350 
351 		if (e.getSource() == newDVD || e.getSource() == newDVDTool)
352 			newDVD();
353 
354 		if (e.getSource() == manualSplit)
355 			newManualSplit();
356 
357 		if (e.getSource() == joinVideos)
358 			newJoinVideos();
359 
360 		if (e.getSource() == moveUp) {
361 			Image image = tabFolder.getSelection().getImage();
362 			String title = tabFolder.getSelection().getText();
363 			Control control = tabFolder.getSelection().getControl();
364 			int index = tabFolder.getSelectionIndex();
365 
366 			tabFolder.getSelection().dispose();
367 			CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE, --index);
368 			tabItem.setImage(image);
369 			tabItem.setText(title);
370 			tabItem.setControl(control);
371 			((TabItemControl) control).setTabItem(tabItem);
372 			tabFolder.setSelection(index);
373 
374 			tabChanged(false);
375 		}
376 
377 		if (e.getSource() == moveDown) {
378 			Image image = tabFolder.getSelection().getImage();
379 			String title = tabFolder.getSelection().getText();
380 			Control control = tabFolder.getSelection().getControl();
381 			int index = tabFolder.getSelectionIndex();
382 
383 			tabFolder.getSelection().dispose();
384 			CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE, ++index);
385 			tabItem.setImage(image);
386 			tabItem.setText(title);
387 			tabItem.setControl(control);
388 			((TabItemControl) control).setTabItem(tabItem);
389 			tabFolder.setSelection(index);
390 
391 			tabChanged(false);
392 		}
393 
394 		if (e.getSource() == closeJob) {
395 			tabFolder.getSelection().dispose();
396 			tabChanged(false);
397 		}
398 
399 		if (e.getSource() == closeAllJobs) {
400 			CTabItem[] tabItems = tabFolder.getItems();
401 			for (int i = 0; i < tabItems.length; i++)
402 				tabItems[i].dispose();
403 			tabChanged(false);
404 		}
405 
406 		if (e.getSource() == quit)
407 			shell.dispose();
408 
409 		// Consider putting the actual profile in the map
410 		if (profileMenuItems.containsKey(e.getSource())) {
411 			MenuItem selectedMenuItem = (MenuItem) e.getSource();
412 			String selectedProfileName = (String) profileMenuItems.get(selectedMenuItem);
413 
414 			if (selectedProfileName.equals(ConverterOptions.getCurrentProfile().getProfileName()))
415 				return;
416 
417 			for (Iterator i = profileMenuItems.keySet().iterator(); i.hasNext();)
418 				((MenuItem) i.next()).setSelection(false);
419 			selectedMenuItem.setSelection(true);
420 
421 			ConverterOptions.setCurrentProfile(Profile.getProfile(selectedProfileName));
422 			profileChanged();
423 		}
424 
425 		if (e.getSource() == bitrate) {
426 			BitrateDialog bitrateDialog = new BitrateDialog(shell, SWT.NONE, new Bitrate(ConverterOptions.getCurrentProfile().getMaxVideoBitrate(), ConverterOptions.getCurrentProfile().getMaxAudioBitrate()), new Bitrate(ConverterOptions.getVideoBitrate(), ConverterOptions.getAudioBitrate()));
427 			Bitrate newBitrate = bitrateDialog.open();
428 			ConverterOptions.writeOption("videoBitrate", "" + newBitrate.getVideo());
429 			ConverterOptions.writeOption("audioBitrate", "" + newBitrate.getAudio());
430 		}
431 
432 		if (dimensionsMenuItems.containsKey(e.getSource())) {
433 
434 		}
435 
436 		if (e.getSource() == panAndScan)
437 			ConverterOptions.writeOption("panAndScan", "" + panAndScan.getSelection());
438 
439 		if (e.getSource() == audioSync) {
440 			int audioDelay = new AudioSyncDialog(shell, SWT.NONE, (ConverterOptions.getAutoSync()) ? AudioSyncDialog.AUTO_SYNC : ConverterOptions.getAudioDelay()).open();
441 
442 			if (audioDelay == AudioSyncDialog.AUTO_SYNC) {
443 				ConverterOptions.writeOption("autoSync", "true");
444 				ConverterOptions.writeOption("audioDelay", "0");
445 			} else {
446 				ConverterOptions.writeOption("autoSync", "false");
447 				ConverterOptions.writeOption("audioDelay", "" + audioDelay);
448 			}
449 		}
450 
451 		if (e.getSource() == automaticallySplit) {
452 			int splitTime = new AutomaticallySplitDialog(shell, SWT.NONE, ConverterOptions.getAutoSplit(), ConverterOptions.getSplitTime()).open();
453 
454 			if (splitTime == AutomaticallySplitDialog.NO_SPLIT)
455 				ConverterOptions.writeOption("autoSplit", "false");
456 			else {
457 				ConverterOptions.writeOption("autoSplit", "true");
458 				ConverterOptions.writeOption("splitTime", "" + splitTime);
459 			}
460 		}
461 
462 		if (e.getSource() == volume) {
463 			double volume = new VolumeDialog(shell, SWT.NONE, ConverterOptions.getVolumeFilter(), ConverterOptions.getGain()).open();
464 
465 			if (volume == VolumeDialog.NONE)
466 				ConverterOptions.writeOption("volumeFilter", "none");
467 			else if (volume == VolumeDialog.VOLNORM)
468 				ConverterOptions.writeOption("volumeFilter", "volnorm");
469 			else {
470 				ConverterOptions.writeOption("volumeFilter", "volume");
471 				ConverterOptions.writeOption("gain", "" + volume);
472 			}
473 		}
474 
475 		if (e.getSource() == contents) {
476 			String index;
477 			if (Config.getPackageDataDir().equals("."))
478 				index = "file://" + System.getProperty("user.dir") + "/doc/html/index.html";
479 			else
480 				index = "file://" + Config.getPackageDataDir() + "/doc/html/index.html";
481 
482 			new HelpBrowser(index);
483 		}
484 
485 		if (e.getSource() == logViewer) {
486 			if (LogViewer.getSingleton() == null)
487 				new LogViewer();
488 			else
489 				LogViewer.getSingleton().getShell().setActive();
490 		}
491 
492 		if (e.getSource() == about)
493 			new AboutDialog(shell, SWT.NONE).open();
494 	}
495 
profileChanged()496 	public void profileChanged() {
497 		for (Iterator i = dimensionsMenuItems.keySet().iterator(); i.hasNext();)
498 			((MenuItem) i.next()).dispose();
499 
500 		dimensionsMenuItems.clear();
501 
502 		Dimensions[] dimensions = ConverterOptions.getCurrentProfile().getDimensions();
503 		Dimensions currentDimensions = ConverterOptions.getDimensions();
504 
505 		for (int i = 0; i < dimensions.length; i++) {
506 			MenuItem dimensionsMenuItem = new MenuItem(videoSizeMenu, SWT.RADIO);
507 			dimensionsMenuItem.setText("&" + (i + 1) + " " + dimensions[i].toString());
508 			dimensionsMenuItem.setSelection(dimensions[i].toString().equals(currentDimensions.toString()));
509 			dimensionsMenuItem.addSelectionListener(this);
510 
511 			dimensionsMenuItems.put(dimensionsMenuItem, dimensions[i]);
512 		}
513 
514 		advancedJobs.setEnabled(ConverterOptions.getCurrentProfile().getWrapperFormat().equals("avi"));
515 		automaticallySplit.setEnabled(ConverterOptions.getCurrentProfile().getWrapperFormat().equals("avi"));
516 	}
517 
close(CTabFolderEvent event)518 	public void close(CTabFolderEvent event) {
519 		tabChanged(true);
520 	}
521 
maximize(CTabFolderEvent event)522 	public void maximize(CTabFolderEvent event) {
523 		// empty
524 	}
525 
minimize(CTabFolderEvent event)526 	public void minimize(CTabFolderEvent event) {
527 		// empty
528 	}
529 
restore(CTabFolderEvent event)530 	public void restore(CTabFolderEvent event) {
531 		// empty
532 	}
533 
showList(CTabFolderEvent event)534 	public void showList(CTabFolderEvent event) {
535 		// empty
536 	}
537 
tabChanged(boolean closed)538 	public void tabChanged(boolean closed) {
539 		int index = tabFolder.getSelectionIndex();
540 		if (closed)
541 			index--;
542 
543 		if (index == -1) {
544 			moveUp.setEnabled(false);
545 			moveDown.setEnabled(false);
546 			closeJob.setEnabled(false);
547 			closeAllJobs.setEnabled(false);
548 		} else {
549 			moveUp.setEnabled(true);
550 			moveDown.setEnabled(true);
551 			closeJob.setEnabled(true);
552 			closeAllJobs.setEnabled(true);
553 
554 			if (index == 0)
555 				moveUp.setEnabled(false);
556 			if (index == (tabFolder.getItemCount() - (closed ? 2 : 1)))
557 				moveDown.setEnabled(false);
558 		}
559 	}
560 
dragEnter(DropTargetEvent e)561 	public void dragEnter(DropTargetEvent e) {
562 
563 	}
564 
dragLeave(DropTargetEvent e)565 	public void dragLeave(DropTargetEvent e) {
566 
567 	}
568 
dragOperationChanged(DropTargetEvent e)569 	public void dragOperationChanged(DropTargetEvent e) {
570 
571 	}
572 
dragOver(DropTargetEvent e)573 	public void dragOver(DropTargetEvent e) {
574 
575 	}
576 
drop(DropTargetEvent e)577 	public void drop(DropTargetEvent e) {
578 		if (e.getSource() == target) {
579 			if (e.data == null) {
580 				e.detail = DND.DROP_NONE;
581 				return;
582 			}
583 
584 			String[] files = (String[]) e.data;
585 			for (int i = 0; i < files.length; i++) {
586 				File file = new File(files[i]);
587 
588 				if (file.isFile() && new VideoFileFilter().accept(file))
589 					newSingleVideo().setInputVideo(files[i]);
590 				else if (file.isDirectory())
591 					if (new File(files[i] + File.separator + "VIDEO_TS").exists())
592 						newDVD().setDrive(files[i]);
593 					else
594 						newDirectory().setInputDirectory(files[i]);
595 			}
596 		}
597 	}
598 
dropAccept(DropTargetEvent e)599 	public void dropAccept(DropTargetEvent e) {
600 
601 	}
602 
newSingleVideo()603 	private SingleVideo newSingleVideo() {
604 		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
605 		SingleVideo singleVideo = new SingleVideo(tabFolder, SWT.NONE, tabItem);
606 		tabItem.setControl(singleVideo);
607 		tabFolder.setSelection(tabItem);
608 		tabChanged(false);
609 
610 		return singleVideo;
611 	}
612 
newDirectory()613 	private Directory newDirectory() {
614 		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
615 		Directory directory = new Directory(tabFolder, SWT.NONE, tabItem);
616 		tabItem.setControl(directory);
617 		tabFolder.setSelection(tabItem);
618 		tabChanged(false);
619 
620 		return directory;
621 	}
622 
newDVD()623 	private DVD newDVD() {
624 		DVD lastDVD = null;
625 		for (int i = tabFolder.getItemCount() - 1; i >= 0 && lastDVD == null; i--)
626 			if (tabFolder.getItem(i).getControl() instanceof DVD)
627 				lastDVD = (DVD) tabFolder.getItem(i).getControl();
628 
629 		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
630 		DVD dvd = new DVD(tabFolder, SWT.NONE, tabItem);
631 		tabItem.setControl(dvd);
632 		tabFolder.setSelection(tabItem);
633 		tabChanged(false);
634 
635 		if (lastDVD != null && !lastDVD.getDrive().equals("")) {
636 			dvd.setDrive(lastDVD.getDrive());
637 			dvd.setTitleInfo(lastDVD.getTitleInfo());
638 		} else
639 			dvd.setTitleCombo();
640 
641 		return dvd;
642 	}
643 
newManualSplit()644 	private ManualSplit newManualSplit() {
645 		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
646 		ManualSplit manualSplit = new ManualSplit(tabFolder, SWT.NONE, tabItem);
647 		tabItem.setControl(manualSplit);
648 		tabFolder.setSelection(tabItem);
649 		tabChanged(false);
650 
651 		return manualSplit;
652 	}
653 
newJoinVideos()654 	private JoinVideos newJoinVideos() {
655 		CTabItem tabItem = new CTabItem(tabFolder, SWT.NONE);
656 		JoinVideos joinVideos = new JoinVideos(tabFolder, SWT.NONE, tabItem);
657 		tabItem.setControl(joinVideos);
658 		tabFolder.setSelection(tabItem);
659 		tabChanged(false);
660 
661 		return joinVideos;
662 	}
663 
main(String[] args)664 	public static void main(String[] args) {
665 		try {
666 			new ConverterUI();
667 		} catch (Throwable t) {
668 			String message = "An unhandled exception occured: " + t.getClass() + "\n" + t.getMessage() + "\n\n";
669 			StackTraceElement[] st = t.getStackTrace();
670 			for (int i = 0; i < st.length; i++)
671 				message += st[i] + "\n";
672 
673 			Logger.logMessage(message, Logger.ERROR);
674 
675 			MessageBox messageBox = new MessageBox(new Shell(Display.getDefault()), SWT.ICON_ERROR | SWT.OK);
676 			messageBox.setText("Error");
677 			messageBox.setMessage("An unhandled exception occured.  The program will close.  Please see the log for details.");
678 			messageBox.open();
679 		}
680 	}
681 }
682