1 package com.nexuiz.demorecorder.ui.swinggui;
\r
3 import java.awt.Dimension;
\r
4 import java.awt.Frame;
\r
5 import java.awt.Toolkit;
\r
6 import java.awt.event.ActionEvent;
\r
7 import java.awt.event.ActionListener;
\r
9 import java.util.HashMap;
\r
10 import java.util.Map;
\r
11 import java.util.Properties;
\r
12 import java.util.Set;
\r
14 import javax.swing.JButton;
\r
15 import javax.swing.JCheckBox;
\r
16 import javax.swing.JComponent;
\r
17 import javax.swing.JDialog;
\r
18 import javax.swing.JFileChooser;
\r
19 import javax.swing.JLabel;
\r
20 import javax.swing.JPanel;
\r
21 import javax.swing.JScrollPane;
\r
22 import javax.swing.JTextArea;
\r
23 import javax.swing.JTextField;
\r
24 import javax.swing.ScrollPaneConstants;
\r
25 import javax.swing.border.EmptyBorder;
\r
26 import javax.swing.filechooser.FileFilter;
\r
28 import net.miginfocom.swing.MigLayout;
\r
30 import org.jdesktop.swingx.JXTable;
\r
31 import org.jdesktop.swingx.JXTitledSeparator;
\r
33 import com.nexuiz.demorecorder.application.DemoRecorderApplication;
\r
34 import com.nexuiz.demorecorder.application.DemoRecorderUtils;
\r
35 import com.nexuiz.demorecorder.application.NDRPreferences;
\r
36 import com.nexuiz.demorecorder.application.jobs.RecordJob;
\r
37 import com.nexuiz.demorecorder.application.plugins.EncoderPlugin;
\r
38 import com.nexuiz.demorecorder.ui.swinggui.tablemodels.RecordJobTemplatesTableModel;
\r
39 import com.nexuiz.demorecorder.ui.swinggui.utils.SwingGUIUtils;
\r
42 * Shows the dialog that allows to create a new job, create one from a template
\r
43 * or edit an existing job.
\r
46 public class JobDialog extends JDialog implements ActionListener {
\r
47 private static final long serialVersionUID = 6926246716804560522L;
\r
48 public static final int CREATE_NEW_JOB = 0;
\r
49 public static final int EDIT_JOB = 1;
\r
50 public static final int CREATE_NEW_TEMPLATE = 2;
\r
51 public static final int EDIT_TEMPLATE = 3;
\r
52 public static final int CREATE_JOB_FROM_TEMPLATE = 4;
\r
54 private DemoRecorderApplication appLayer;
\r
55 private RecordJobTemplatesTableModel tableModel;
\r
56 // private JXTable templatesTable;
\r
57 private Frame parentFrame;
\r
58 private int dialogType;
\r
59 private RecordJob job = null;
\r
60 private JPanel inputPanel;
\r
61 private JPanel buttonPanel;
\r
63 private JTextField templateNameField;
\r
64 private JTextField templateSummaryField;
\r
65 private JTextField enginePathField;
\r
66 private JButton enginePathChooserButton;
\r
67 private JTextField engineParameterField;
\r
68 private JTextField dpVideoDirField;
\r
69 private JButton dpVideoDirChooserButton;
\r
70 private JTextField relativeDemoPathField;
\r
71 private JTextField jobNameField;
\r
72 private JTextField demoFileField;
\r
73 private JButton demoFileChooserButton;
\r
74 private JTextField startSecondField;
\r
75 private JTextField endSecondField;
\r
76 private JTextArea execBeforeField;
\r
77 private JTextArea execAfterField;
\r
78 private JTextField videoDestinationField;
\r
79 private JButton videoDestinationChooserButton;
\r
81 private JButton createButton;
\r
82 private JButton cancelButton;
\r
85 private JFileChooser enginePathFC;
\r
86 private JFileChooser dpVideoDirFC;
\r
87 private JFileChooser demoFileFC;
\r
88 private JFileChooser videoDestinationFC;
\r
90 private FileFilter userDirFilter = new NexuizUserDirFilter();
\r
92 private Map<String, JComponent> pluginDialogSettings = new HashMap<String, JComponent>();
\r
95 * Constructor to create a dialog when creating a new job.
\r
99 public JobDialog(Frame owner, DemoRecorderApplication appLayer) {
\r
100 super(owner, true);
\r
101 this.parentFrame = owner;
\r
102 this.dialogType = CREATE_NEW_JOB;
\r
103 this.appLayer = appLayer;
\r
104 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
\r
106 setTitle("Create new job");
\r
108 this.setupLayout();
\r
112 * Constructor to create a dialog when creating a new template.
\r
114 * @param dialogType
\r
117 public JobDialog(Frame owner, RecordJobTemplatesTableModel tableModel, JXTable templatesTable, DemoRecorderApplication appLayer) {
\r
118 super(owner, true);
\r
119 this.parentFrame = owner;
\r
120 this.dialogType = CREATE_NEW_TEMPLATE;
\r
121 this.tableModel = tableModel;
\r
122 this.appLayer = appLayer;
\r
123 // this.templatesTable = templatesTable; seems we don't need it
\r
124 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
\r
125 setTitle("Create new template");
\r
127 this.setupLayout();
\r
131 * Constructor to use when creating a new job from a template, or when editing a template.
\r
134 * @param type either CREATE_JOB_FROM_TEMPLATE or EDIT_TEMPLATE
\r
136 public JobDialog(Frame owner, RecordJobTemplate template, DemoRecorderApplication appLayer, int type) {
\r
137 super(owner, true);
\r
138 this.parentFrame = owner;
\r
140 this.job = template;
\r
141 this.appLayer = appLayer;
\r
142 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
\r
144 if (type != CREATE_JOB_FROM_TEMPLATE && type != EDIT_TEMPLATE) {
\r
145 throw new RuntimeException("Illegal paraameter \"type\"");
\r
148 this.dialogType = type;
\r
149 if (type == CREATE_JOB_FROM_TEMPLATE) {
\r
150 setTitle("Create job from template");
\r
152 setTitle("Edit template");
\r
155 this.setupLayout();
\r
159 * Constructor to create a dialog to be used when editing an existing job.
\r
163 public JobDialog(Frame owner, RecordJob job, DemoRecorderApplication appLayer) {
\r
164 super(owner, true);
\r
165 this.parentFrame = owner;
\r
166 this.dialogType = EDIT_JOB;
\r
167 this.appLayer = appLayer;
\r
168 setDefaultCloseOperation(DISPOSE_ON_CLOSE);
\r
170 setTitle("Edit job");
\r
173 this.setupLayout();
\r
178 public void showDialog() {
\r
180 Toolkit t = Toolkit.getDefaultToolkit();
\r
181 Dimension screenSize = t.getScreenSize();
\r
182 if (getHeight() > screenSize.height) {
\r
183 Dimension newPreferredSize = getPreferredSize();
\r
184 newPreferredSize.height = screenSize.height - 100;
\r
185 setPreferredSize(newPreferredSize);
\r
188 this.setLocationRelativeTo(this.parentFrame);
\r
189 this.setVisible(true);
\r
192 private void setupLayout() {
\r
193 // setLayout(new MigLayout("wrap 1", "[grow,fill]", "[]20[]"));
\r
194 setLayout(new MigLayout("wrap 1", "[grow,fill]", "[][]"));
\r
195 this.setupInputMask();
\r
196 this.setupButtonPart();
\r
200 private void setupInputMask() {
\r
201 inputPanel = new JPanel(new MigLayout("insets 0,wrap 3", "[][250::,grow,fill][30::]"));
\r
202 JScrollPane inputScrollPane = new JScrollPane(inputPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
\r
203 inputScrollPane.setBorder(new EmptyBorder(0,0,0,0));
\r
205 JXTitledSeparator environmentHeading = new JXTitledSeparator("Environment settings");
\r
206 inputPanel.add(environmentHeading, "span 3,grow");
\r
208 this.setupTemplateNameAndSummary();
\r
209 this.setupEnginePath();
\r
210 this.setupEngineParameters();
\r
211 this.setupDPVideoDir();
\r
212 this.setupRelativeDemoPath();
\r
214 JXTitledSeparator jobSettingsHeading = new JXTitledSeparator("Job settings");
\r
215 inputPanel.add(jobSettingsHeading, "span 3,grow");
\r
217 this.setupJobName();
\r
218 this.setupDemoFile();
\r
219 this.setupStartSecond();
\r
220 this.setupEndSecond();
\r
221 this.setupExecBefore();
\r
222 this.setupExecAfter();
\r
223 this.setupVideoDestination();
\r
225 this.setupPluginPreferences();
\r
227 getContentPane().add(inputScrollPane);
\r
230 private void setupTemplateNameAndSummary() {
\r
231 if (this.dialogType != CREATE_NEW_TEMPLATE && this.dialogType != EDIT_TEMPLATE) {
\r
236 inputPanel.add(new JLabel("Template name:"));
\r
237 templateNameField = new JTextField();
\r
238 inputPanel.add(templateNameField, "wrap");
\r
240 inputPanel.add(new JLabel("Summary:"));
\r
241 templateSummaryField = new JTextField();
\r
242 inputPanel.add(templateSummaryField, "wrap");
\r
245 if (this.dialogType == EDIT_TEMPLATE) {
\r
246 RecordJobTemplate template = (RecordJobTemplate) this.job;
\r
247 templateNameField.setText(template.getName());
\r
248 templateSummaryField.setText(template.getSummary());
\r
252 private void setupEnginePath() {
\r
254 inputPanel.add(new JLabel("Engine:"));
\r
255 enginePathField = new JTextField();
\r
256 enginePathField.setEditable(false);
\r
257 inputPanel.add(enginePathField);
\r
258 enginePathChooserButton = new FileChooserButton();
\r
259 inputPanel.add(enginePathChooserButton);
\r
262 this.enginePathFC = createConfiguredFileChooser();
\r
263 enginePathChooserButton.addActionListener(this);
\r
264 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
265 this.enginePathFC.setSelectedFile(this.job.getEnginePath());
\r
266 this.enginePathField.setText(this.job.getEnginePath().getAbsolutePath());
\r
270 private void setupEngineParameters() {
\r
272 inputPanel.add(new JLabel("Engine parameters:"));
\r
273 engineParameterField = new JTextField();
\r
274 inputPanel.add(engineParameterField, "wrap");
\r
277 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
278 engineParameterField.setText(this.job.getEngineParameters());
\r
282 private void setupDPVideoDir() {
\r
284 inputPanel.add(new JLabel("DPVideo directory:"));
\r
285 dpVideoDirField = new JTextField();
\r
286 dpVideoDirField.setEditable(false);
\r
287 inputPanel.add(dpVideoDirField);
\r
288 dpVideoDirChooserButton = new FileChooserButton();
\r
289 inputPanel.add(dpVideoDirChooserButton);
\r
292 dpVideoDirChooserButton.addActionListener(this);
\r
293 this.dpVideoDirFC = createConfiguredFileChooser();
\r
294 this.dpVideoDirFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
\r
295 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
296 this.dpVideoDirFC.setSelectedFile(this.job.getDpVideoPath());
\r
297 this.dpVideoDirField.setText(this.job.getDpVideoPath().getAbsolutePath());
\r
301 private void setupRelativeDemoPath() {
\r
303 inputPanel.add(new JLabel("Relative demo path:"));
\r
304 relativeDemoPathField = new JTextField();
\r
305 inputPanel.add(relativeDemoPathField, "wrap 20");
\r
308 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == CREATE_NEW_TEMPLATE) {
\r
309 relativeDemoPathField.setText("demos");
\r
311 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
312 relativeDemoPathField.setText(this.job.getRelativeDemoPath());
\r
316 private void setupJobName() {
\r
317 inputPanel.add(new JLabel("Job name:"));
\r
319 jobNameField = new JTextField();
\r
320 inputPanel.add(jobNameField, "wrap");
\r
323 if (this.dialogType != CREATE_NEW_TEMPLATE && this.dialogType != CREATE_NEW_JOB) {
\r
324 jobNameField.setText(this.job.getJobName());
\r
328 private void setupDemoFile() {
\r
330 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == EDIT_JOB || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
331 label = "Demo file:";
\r
333 label = "Demo directory:";
\r
337 inputPanel.add(new JLabel(label));
\r
338 demoFileField = new JTextField();
\r
339 demoFileField.setEditable(false);
\r
340 inputPanel.add(demoFileField);
\r
341 demoFileChooserButton = new FileChooserButton();
\r
342 inputPanel.add(demoFileChooserButton);
\r
345 this.demoFileFC = createConfiguredFileChooser();
\r
346 demoFileChooserButton.addActionListener(this);
\r
347 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
348 if (this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
349 this.demoFileFC.setCurrentDirectory(this.job.getDemoFile());
\r
351 this.demoFileFC.setSelectedFile(this.job.getDemoFile());
\r
354 this.demoFileField.setText(this.job.getDemoFile().getAbsolutePath());
\r
357 //only specify directories for templates
\r
358 if (this.dialogType == CREATE_NEW_TEMPLATE || this.dialogType == EDIT_TEMPLATE) {
\r
359 this.demoFileFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
\r
363 private void setupStartSecond() {
\r
364 //only exists for jobs, not for templates
\r
365 if (this.dialogType != CREATE_NEW_JOB && this.dialogType != EDIT_JOB && this.dialogType != CREATE_JOB_FROM_TEMPLATE) {
\r
370 inputPanel.add(new JLabel("Start second:"));
\r
371 startSecondField = new JTextField();
\r
372 inputPanel.add(startSecondField, "wrap");
\r
375 if (this.dialogType == EDIT_JOB) {
\r
376 startSecondField.setText(String.valueOf( this.job.getStartSecond() ));
\r
380 private void setupEndSecond() {
\r
381 //only exists for jobs, not for templates
\r
382 if (this.dialogType != CREATE_NEW_JOB && this.dialogType != EDIT_JOB && this.dialogType != CREATE_JOB_FROM_TEMPLATE) {
\r
387 inputPanel.add(new JLabel("End second:"));
\r
388 endSecondField = new JTextField();
\r
389 inputPanel.add(endSecondField, "wrap");
\r
392 if (this.dialogType == EDIT_JOB) {
\r
393 endSecondField.setText(String.valueOf( this.job.getEndSecond() ));
\r
397 private void setupExecBefore() {
\r
399 inputPanel.add(new JLabel("Exec before capture:"));
\r
400 execBeforeField = new JTextArea(3, 1);
\r
401 inputPanel.add(new JScrollPane(execBeforeField), "wrap");
\r
404 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
405 execBeforeField.setText(this.job.getExecuteBeforeCap());
\r
409 private void setupExecAfter() {
\r
411 inputPanel.add(new JLabel("Exec after capture:"));
\r
412 execAfterField = new JTextArea(3, 1);
\r
413 inputPanel.add(new JScrollPane(execAfterField), "wrap");
\r
416 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
417 execAfterField.setText(this.job.getExecuteAfterCap());
\r
421 private void setupVideoDestination() {
\r
423 inputPanel.add(new JLabel("Video destination:"));
\r
424 videoDestinationField = new JTextField();
\r
425 videoDestinationField.setEditable(false);
\r
426 inputPanel.add(videoDestinationField);
\r
427 videoDestinationChooserButton = new FileChooserButton();
\r
428 inputPanel.add(videoDestinationChooserButton, "wrap 20");
\r
431 videoDestinationChooserButton.addActionListener(this);
\r
432 this.videoDestinationFC = createConfiguredFileChooser();
\r
433 if (this.dialogType == EDIT_JOB || this.dialogType == EDIT_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
434 if (this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
435 this.videoDestinationFC.setCurrentDirectory(this.job.getVideoDestination());
\r
437 this.videoDestinationFC.setSelectedFile(this.job.getVideoDestination());
\r
440 this.videoDestinationField.setText(this.job.getVideoDestination().getAbsolutePath());
\r
442 if (this.dialogType == CREATE_NEW_TEMPLATE || this.dialogType == EDIT_TEMPLATE) {
\r
443 this.videoDestinationFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
\r
447 private void setupPluginPreferences() {
\r
448 for (EncoderPlugin plugin : this.appLayer.getEncoderPlugins()) {
\r
449 String pluginName = plugin.getName();
\r
450 //only display settings if the plugin actually has any...
\r
451 Properties jobSpecificDefaultPluginPreferences = plugin.getJobSpecificPreferences();
\r
452 Properties jobPluginPreferences = null;
\r
453 if (this.job != null) {
\r
454 jobPluginPreferences = this.job.getEncoderPluginSettings(plugin);
\r
456 if (jobSpecificDefaultPluginPreferences.size() > 0 && plugin.isEnabled()) {
\r
458 JXTitledSeparator pluginHeading = new JXTitledSeparator(pluginName + " plugin settings");
\r
459 inputPanel.add(pluginHeading, "span 3,grow");
\r
461 for (String pluginPreferenceKey : plugin.getJobSpecificPreferencesOrder()) {
\r
462 String value = jobSpecificDefaultPluginPreferences.getProperty(pluginPreferenceKey);
\r
463 if (this.job != null) {
\r
464 if (jobPluginPreferences.containsKey(pluginPreferenceKey)) {
\r
465 value = jobPluginPreferences.getProperty(pluginPreferenceKey);
\r
469 this.setupSinglePluginSetting(plugin, pluginPreferenceKey, value);
\r
475 private void setupSinglePluginSetting(EncoderPlugin plugin, String key, String value) {
\r
476 inputPanel.add(new JLabel(key + ":"));
\r
478 if (SwingGUIUtils.isBooleanValue(value)) {
\r
479 JCheckBox checkbox = new JCheckBox();
\r
480 checkbox.setSelected(Boolean.valueOf(value));
\r
481 inputPanel.add(checkbox, "wrap");
\r
482 this.pluginDialogSettings.put(NDRPreferences.getConcatenatedKey(plugin.getName(), key), checkbox);
\r
483 } else if (SwingGUIUtils.isFileChooser(value)) {
\r
484 final JFileChooser fc = new JFileChooser();
\r
485 fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
\r
486 JButton fcButton = new JButton("...");
\r
487 final JTextField filePathField = new JTextField();
\r
488 filePathField.setEditable(false);
\r
489 inputPanel.add(filePathField);
\r
490 fcButton.addActionListener(new ActionListener() {
\r
492 public void actionPerformed(ActionEvent e) {
\r
493 int returnValue = fc.showOpenDialog(JobDialog.this);
\r
494 if (returnValue == JFileChooser.APPROVE_OPTION) {
\r
495 File selectedFile = fc.getSelectedFile();
\r
496 filePathField.setText(selectedFile.getAbsolutePath());
\r
502 File selectedFile = new File(value);
\r
503 if (selectedFile.exists()) {
\r
504 fc.setSelectedFile(selectedFile);
\r
505 filePathField.setText(selectedFile.getAbsolutePath());
\r
507 } catch (Throwable e) {}
\r
508 this.pluginDialogSettings.put(NDRPreferences.getConcatenatedKey(plugin.getName(), key), fc);
\r
509 inputPanel.add(fcButton);
\r
512 JTextField textField = new JTextField();
\r
513 textField.setText(value);
\r
514 this.pluginDialogSettings.put(NDRPreferences.getConcatenatedKey(plugin.getName(), key), textField);
\r
515 inputPanel.add(textField, "wrap");
\r
519 private void setupButtonPart() {
\r
520 String createButtonText;
\r
521 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == CREATE_NEW_TEMPLATE || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
522 createButtonText = "Create";
\r
524 createButtonText = "Save";
\r
526 buttonPanel = new JPanel(new MigLayout("insets 0"));
\r
527 createButton = new JButton(createButtonText);
\r
528 createButton.addActionListener(this);
\r
529 cancelButton = new JButton("Cancel");
\r
530 cancelButton.addActionListener(this);
\r
532 buttonPanel.add(createButton);
\r
533 buttonPanel.add(cancelButton);
\r
535 getContentPane().add(buttonPanel);
\r
539 public void actionPerformed(ActionEvent e) {
\r
540 if (e.getSource() == enginePathChooserButton) {
\r
541 int returnValue = this.enginePathFC.showOpenDialog(this);
\r
542 if (returnValue == JFileChooser.APPROVE_OPTION) {
\r
543 File selectedFile = this.enginePathFC.getSelectedFile();
\r
544 this.enginePathField.setText(selectedFile.getAbsolutePath());
\r
546 } else if (e.getSource() == dpVideoDirChooserButton) {
\r
547 int returnValue = this.dpVideoDirFC.showOpenDialog(this);
\r
548 if (returnValue == JFileChooser.APPROVE_OPTION) {
\r
549 File selectedFile = this.dpVideoDirFC.getSelectedFile();
\r
550 this.dpVideoDirField.setText(selectedFile.getAbsolutePath());
\r
552 } else if (e.getSource() == demoFileChooserButton) {
\r
553 int returnValue = this.demoFileFC.showOpenDialog(this);
\r
554 if (returnValue == JFileChooser.APPROVE_OPTION) {
\r
555 File selectedFile = this.demoFileFC.getSelectedFile();
\r
556 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == EDIT_JOB || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {
\r
557 this.demoFileField.setText(DemoRecorderUtils.getJustFileNameOfPath(selectedFile));
\r
559 //template, show full path of directory
\r
560 this.demoFileField.setText(selectedFile.getAbsolutePath());
\r
564 } else if (e.getSource() == videoDestinationChooserButton) {
\r
565 int returnValue = this.videoDestinationFC.showSaveDialog(this);
\r
566 if (returnValue == JFileChooser.APPROVE_OPTION) {
\r
567 File selectedFile = this.videoDestinationFC.getSelectedFile();
\r
568 this.videoDestinationField.setText(selectedFile.getAbsolutePath());
\r
570 } else if (e.getSource() == createButton) {
\r
571 switch (this.dialogType) {
\r
572 case CREATE_NEW_JOB:
\r
573 case CREATE_JOB_FROM_TEMPLATE:
\r
574 this.requestNewRecordJob(); break;
\r
575 case CREATE_NEW_TEMPLATE:
\r
576 this.createNewTemplate();
\r
581 case EDIT_TEMPLATE:
\r
582 this.editTemplate();
\r
585 } else if (e.getSource() == cancelButton) {
\r
590 private void requestNewRecordJob() {
\r
591 float startSecond, endSecond = -1;
\r
593 startSecond = Float.valueOf(this.startSecondField.getText());
\r
594 endSecond = Float.valueOf(this.endSecondField.getText());
\r
595 } catch (Exception e) {
\r
596 DemoRecorderUtils.showNonCriticalErrorDialog("Make sure that start and end second are floating point numbers", e, true);
\r
601 RecordJob j = this.appLayer.createRecordJob(
\r
602 this.jobNameField.getText(),
\r
603 this.enginePathFC.getSelectedFile(),
\r
604 this.engineParameterField.getText(),
\r
605 this.demoFileFC.getSelectedFile(),
\r
606 this.relativeDemoPathField.getText(),
\r
607 this.dpVideoDirFC.getSelectedFile(),
\r
608 this.videoDestinationFC.getSelectedFile(),
\r
609 this.execBeforeField.getText(),
\r
610 this.execAfterField.getText(),
\r
614 this.saveEncoderPluginSettings(j);
\r
616 } catch (Exception e) {
\r
617 DemoRecorderUtils.showNonCriticalErrorDialog(e);
\r
623 private void editJob() {
\r
624 float startSecond, endSecond = -1;
\r
626 startSecond = Float.valueOf(this.startSecondField.getText());
\r
627 endSecond = Float.valueOf(this.endSecondField.getText());
\r
628 } catch (Exception e) {
\r
629 DemoRecorderUtils.showNonCriticalErrorDialog("Make sure that start and end second are floating point numbers", e, true);
\r
634 this.job.setJobName(this.jobNameField.getText());
\r
635 this.job.setEnginePath(this.enginePathFC.getSelectedFile());
\r
636 this.job.setEngineParameters(this.engineParameterField.getText());
\r
637 this.job.setDemoFile(this.demoFileFC.getSelectedFile());
\r
638 this.job.setRelativeDemoPath(this.relativeDemoPathField.getText());
\r
639 this.job.setDpVideoPath(this.dpVideoDirFC.getSelectedFile());
\r
640 this.job.setVideoDestination(this.videoDestinationFC.getSelectedFile());
\r
641 this.job.setExecuteBeforeCap(this.execBeforeField.getText());
\r
642 this.job.setExecuteAfterCap(this.execAfterField.getText());
\r
643 this.job.setStartSecond(startSecond);
\r
644 this.job.setEndSecond(endSecond);
\r
645 this.saveEncoderPluginSettings(this.job);
\r
646 this.appLayer.fireUserInterfaceUpdate(this.job);
\r
648 } catch (Exception e) {
\r
649 DemoRecorderUtils.showNonCriticalErrorDialog(e);
\r
655 private void createNewTemplate() {
\r
657 RecordJobTemplate templ = new RecordJobTemplate(
\r
658 this.templateNameField.getText(),
\r
659 this.templateSummaryField.getText(),
\r
660 this.jobNameField.getText(),
\r
661 this.enginePathFC.getSelectedFile(),
\r
662 this.engineParameterField.getText(),
\r
663 this.demoFileFC.getSelectedFile(),
\r
664 this.relativeDemoPathField.getText(),
\r
665 this.dpVideoDirFC.getSelectedFile(),
\r
666 this.videoDestinationFC.getSelectedFile(),
\r
667 this.execBeforeField.getText(),
\r
668 this.execAfterField.getText()
\r
670 this.saveEncoderPluginSettings(templ);
\r
671 this.tableModel.addRecordJobTemplate(templ);
\r
673 } catch (NullPointerException e) {
\r
674 DemoRecorderUtils.showNonCriticalErrorDialog("Make sure that you chose a file/directory in each case!", e, true);
\r
675 } catch (Exception e) {
\r
676 DemoRecorderUtils.showNonCriticalErrorDialog(e);
\r
681 private void editTemplate() {
\r
683 RecordJobTemplate template = (RecordJobTemplate) this.job;
\r
684 template.setName(this.templateNameField.getText());
\r
685 template.setSummary(this.templateSummaryField.getText());
\r
686 template.setJobName(this.jobNameField.getText());
\r
687 template.setEnginePath(this.enginePathFC.getSelectedFile());
\r
688 template.setEngineParameters(this.engineParameterField.getText());
\r
689 template.setDpVideoPath(this.dpVideoDirFC.getSelectedFile());
\r
690 template.setRelativeDemoPath(this.relativeDemoPathField.getText());
\r
691 template.setDemoFile(this.demoFileFC.getSelectedFile());
\r
692 template.setExecuteBeforeCap(this.execBeforeField.getText());
\r
693 template.setExecuteAfterCap(this.execAfterField.getText());
\r
694 template.setVideoDestination(this.videoDestinationFC.getSelectedFile());
\r
695 this.saveEncoderPluginSettings(template);
\r
697 } catch (Exception e) {
\r
698 DemoRecorderUtils.showNonCriticalErrorDialog(e);
\r
703 private void saveEncoderPluginSettings(RecordJob job) {
\r
704 Set<String> keys = this.pluginDialogSettings.keySet();
\r
705 //remember, the keys are concatenated, containing both the category and actual key
\r
706 for (String key : keys) {
\r
707 JComponent component = this.pluginDialogSettings.get(key);
\r
708 if (component instanceof JCheckBox) {
\r
709 JCheckBox checkbox = (JCheckBox) component;
\r
710 job.setEncoderPluginSetting(NDRPreferences.getCategory(key), NDRPreferences.getKey(key), String.valueOf(checkbox.isSelected()));
\r
711 } else if (component instanceof JFileChooser) {
\r
712 JFileChooser fileChooser = (JFileChooser) component;
\r
713 if (fileChooser.getSelectedFile() != null) {
\r
714 String path = fileChooser.getSelectedFile().getAbsolutePath();
\r
715 job.setEncoderPluginSetting(NDRPreferences.getCategory(key), NDRPreferences.getKey(key), path);
\r
717 } else if (component instanceof JTextField) {
\r
718 JTextField textField = (JTextField) component;
\r
719 job.setEncoderPluginSetting(NDRPreferences.getCategory(key), NDRPreferences.getKey(key), textField.getText());
\r
724 private static class FileChooserButton extends JButton {
\r
725 private static final long serialVersionUID = 1335571540372856959L;
\r
726 public FileChooserButton() {
\r
731 private JFileChooser createConfiguredFileChooser() {
\r
732 JFileChooser fc = new JFileChooser();
\r
733 fc.setFileHidingEnabled(false);
\r
734 fc.setFileFilter(userDirFilter);
\r