]> git.xonotic.org Git - xonotic/xonotic.git/blob - misc/tools/NexuizDemoRecorder/main/src/main/java/com/nexuiz/demorecorder/ui/swinggui/JobDialog.java
initial checkin from nexuiz svn r8756
[xonotic/xonotic.git] / misc / tools / NexuizDemoRecorder / main / src / main / java / com / nexuiz / demorecorder / ui / swinggui / JobDialog.java
1 package com.nexuiz.demorecorder.ui.swinggui;\r
2 \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
8 import java.io.File;\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
13 \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
27 \r
28 import net.miginfocom.swing.MigLayout;\r
29 \r
30 import org.jdesktop.swingx.JXTable;\r
31 import org.jdesktop.swingx.JXTitledSeparator;\r
32 \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
40 \r
41 /**\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
44  */\r
45 \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
53 \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
62 \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
80         \r
81         private JButton createButton;\r
82         private JButton cancelButton;\r
83         \r
84         //file choosers\r
85         private JFileChooser enginePathFC;\r
86         private JFileChooser dpVideoDirFC;\r
87         private JFileChooser demoFileFC;\r
88         private JFileChooser videoDestinationFC;\r
89         \r
90         private FileFilter userDirFilter = new NexuizUserDirFilter();\r
91         \r
92         private Map<String, JComponent> pluginDialogSettings = new HashMap<String, JComponent>();\r
93 \r
94         /**\r
95          * Constructor to create a dialog when creating a new job.\r
96          * @param owner\r
97          * @param appLayer\r
98          */\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
105 \r
106                 setTitle("Create new job");\r
107 \r
108                 this.setupLayout();\r
109         }\r
110         \r
111         /**\r
112          * Constructor to create a dialog when creating a new template.\r
113          * @param owner\r
114          * @param dialogType\r
115          * @param appLayer\r
116          */\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
126 \r
127                 this.setupLayout();\r
128         }\r
129         \r
130         /**\r
131          * Constructor to use when creating a new job from a template, or when editing a template.\r
132          * @param owner\r
133          * @param template\r
134          * @param type either CREATE_JOB_FROM_TEMPLATE or EDIT_TEMPLATE\r
135          */\r
136         public JobDialog(Frame owner, RecordJobTemplate template, DemoRecorderApplication appLayer, int type) {\r
137                 super(owner, true);\r
138                 this.parentFrame = owner;\r
139                 \r
140                 this.job = template;\r
141                 this.appLayer = appLayer;\r
142                 setDefaultCloseOperation(DISPOSE_ON_CLOSE);\r
143                 \r
144                 if (type != CREATE_JOB_FROM_TEMPLATE && type != EDIT_TEMPLATE) {\r
145                         throw new RuntimeException("Illegal paraameter \"type\"");\r
146                 }\r
147                 \r
148                 this.dialogType = type;\r
149                 if (type == CREATE_JOB_FROM_TEMPLATE) {\r
150                         setTitle("Create job from template");\r
151                 } else {\r
152                         setTitle("Edit template");\r
153                 }\r
154 \r
155                 this.setupLayout();\r
156         }\r
157         \r
158         /**\r
159          * Constructor to create a dialog to be used when editing an existing job.\r
160          * @param owner\r
161          * @param job\r
162          */\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
169 \r
170                 setTitle("Edit job");\r
171                 this.job = job;\r
172 \r
173                 this.setupLayout();\r
174         }\r
175         \r
176         \r
177         \r
178         public void showDialog() {\r
179                 this.pack();\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
186                         this.pack();\r
187                 }\r
188                 this.setLocationRelativeTo(this.parentFrame);\r
189                 this.setVisible(true);\r
190         }\r
191 \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
197 \r
198         }\r
199 \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
204                 \r
205                 JXTitledSeparator environmentHeading = new JXTitledSeparator("Environment settings");\r
206                 inputPanel.add(environmentHeading, "span 3,grow");\r
207 \r
208                 this.setupTemplateNameAndSummary();\r
209                 this.setupEnginePath();\r
210                 this.setupEngineParameters();\r
211                 this.setupDPVideoDir();\r
212                 this.setupRelativeDemoPath();\r
213 \r
214                 JXTitledSeparator jobSettingsHeading = new JXTitledSeparator("Job settings");\r
215                 inputPanel.add(jobSettingsHeading, "span 3,grow");\r
216 \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
224                 \r
225                 this.setupPluginPreferences();\r
226 \r
227                 getContentPane().add(inputScrollPane);\r
228         }\r
229         \r
230         private void setupTemplateNameAndSummary() {\r
231                 if (this.dialogType != CREATE_NEW_TEMPLATE && this.dialogType != EDIT_TEMPLATE) {\r
232                         return;\r
233                 }\r
234                 \r
235                 //layout stuff\r
236                 inputPanel.add(new JLabel("Template name:"));\r
237                 templateNameField = new JTextField();\r
238                 inputPanel.add(templateNameField, "wrap");\r
239                 \r
240                 inputPanel.add(new JLabel("Summary:"));\r
241                 templateSummaryField = new JTextField();\r
242                 inputPanel.add(templateSummaryField, "wrap");\r
243                 \r
244                 //UI logic stuff\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
249                 }\r
250         }\r
251         \r
252         private void setupEnginePath() {\r
253                 //layout stuff\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
260                 \r
261                 //UI logic stuff\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
267                 }\r
268         }\r
269         \r
270         private void setupEngineParameters() {\r
271                 //layout stuff\r
272                 inputPanel.add(new JLabel("Engine parameters:"));\r
273                 engineParameterField = new JTextField();\r
274                 inputPanel.add(engineParameterField, "wrap");\r
275                 \r
276                 //UI logic stuff\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
279                 }\r
280         }\r
281         \r
282         private void setupDPVideoDir() {\r
283                 //layout stuff\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
290                 \r
291                 //UI logic stuff\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
298                 }\r
299         }\r
300         \r
301         private void setupRelativeDemoPath() {\r
302                 //layout stuff\r
303                 inputPanel.add(new JLabel("Relative demo path:"));\r
304                 relativeDemoPathField = new JTextField();\r
305                 inputPanel.add(relativeDemoPathField, "wrap 20");\r
306                 \r
307                 //UI logic stuff\r
308                 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == CREATE_NEW_TEMPLATE) {\r
309                         relativeDemoPathField.setText("demos");\r
310                 }\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
313                 }\r
314         }\r
315         \r
316         private void setupJobName() {\r
317                 inputPanel.add(new JLabel("Job name:"));\r
318                 \r
319                 jobNameField = new JTextField();\r
320                 inputPanel.add(jobNameField, "wrap");\r
321                 \r
322                 //UI logic stuff\r
323                 if (this.dialogType != CREATE_NEW_TEMPLATE && this.dialogType != CREATE_NEW_JOB) {\r
324                         jobNameField.setText(this.job.getJobName());\r
325                 }\r
326         }\r
327         \r
328         private void setupDemoFile() {\r
329                 String label;\r
330                 if (this.dialogType == CREATE_NEW_JOB || this.dialogType == EDIT_JOB || this.dialogType == CREATE_JOB_FROM_TEMPLATE) {\r
331                         label = "Demo file:";\r
332                 } else {\r
333                         label = "Demo directory:";\r
334                 }\r
335                 \r
336                 //layout stuff\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
343                 \r
344                 //UI logic stuff\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
350                         } else {\r
351                                 this.demoFileFC.setSelectedFile(this.job.getDemoFile());\r
352                         }\r
353                         \r
354                         this.demoFileField.setText(this.job.getDemoFile().getAbsolutePath());\r
355                 }\r
356                 \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
360                 }\r
361         }\r
362         \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
366                         return;\r
367                 }\r
368                 \r
369                 //layout stuff\r
370                 inputPanel.add(new JLabel("Start second:"));\r
371                 startSecondField = new JTextField();\r
372                 inputPanel.add(startSecondField, "wrap");\r
373                 \r
374                 //UI logic stuff\r
375                 if (this.dialogType == EDIT_JOB) {\r
376                         startSecondField.setText(String.valueOf( this.job.getStartSecond() ));\r
377                 }\r
378         }\r
379         \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
383                         return;\r
384                 }\r
385                 \r
386                 //layout stuff\r
387                 inputPanel.add(new JLabel("End second:"));\r
388                 endSecondField = new JTextField();\r
389                 inputPanel.add(endSecondField, "wrap");\r
390                 \r
391                 //UI logic stuff\r
392                 if (this.dialogType == EDIT_JOB) {\r
393                         endSecondField.setText(String.valueOf( this.job.getEndSecond() ));\r
394                 }\r
395         }\r
396         \r
397         private void setupExecBefore() {\r
398                 //layout stuff\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
402                 \r
403                 //UI logic stuff\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
406                 }\r
407         }\r
408         \r
409         private void setupExecAfter() {\r
410                 //layout stuff\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
414                 \r
415                 //UI logic stuff\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
418                 }\r
419         }\r
420         \r
421         private void setupVideoDestination() {\r
422                 //layout stuff\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
429                 \r
430                 //UI logic stuff\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
436                         } else {\r
437                                 this.videoDestinationFC.setSelectedFile(this.job.getVideoDestination());\r
438                         }\r
439                         \r
440                         this.videoDestinationField.setText(this.job.getVideoDestination().getAbsolutePath());\r
441                 }\r
442                 if (this.dialogType == CREATE_NEW_TEMPLATE || this.dialogType == EDIT_TEMPLATE) {\r
443                         this.videoDestinationFC.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);\r
444                 }\r
445         }\r
446         \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
455                         }\r
456                         if (jobSpecificDefaultPluginPreferences.size() > 0 && plugin.isEnabled()) {\r
457                                 //add heading\r
458                                 JXTitledSeparator pluginHeading = new JXTitledSeparator(pluginName + " plugin settings");\r
459                                 inputPanel.add(pluginHeading, "span 3,grow");\r
460                                 \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
466                                                 }\r
467                                         }\r
468                                         \r
469                                         this.setupSinglePluginSetting(plugin, pluginPreferenceKey, value);\r
470                                 }\r
471                         }\r
472                 }\r
473         }\r
474         \r
475         private void setupSinglePluginSetting(EncoderPlugin plugin, String key, String value) {\r
476                 inputPanel.add(new JLabel(key + ":"));\r
477                 \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
491                                 @Override\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
497                                         }\r
498                                 }\r
499                         });\r
500                         \r
501                         try {\r
502                                 File selectedFile = new File(value);\r
503                                 if (selectedFile.exists()) {\r
504                                         fc.setSelectedFile(selectedFile);\r
505                                         filePathField.setText(selectedFile.getAbsolutePath());\r
506                                 }\r
507                         } catch (Throwable e) {}\r
508                         this.pluginDialogSettings.put(NDRPreferences.getConcatenatedKey(plugin.getName(), key), fc);\r
509                         inputPanel.add(fcButton);\r
510                 } else {\r
511                         //textfield\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
516                 }\r
517         }\r
518 \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
523                 } else {\r
524                         createButtonText = "Save";\r
525                 }\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
531                 \r
532                 buttonPanel.add(createButton);\r
533                 buttonPanel.add(cancelButton);\r
534 \r
535                 getContentPane().add(buttonPanel);\r
536         }\r
537         \r
538         \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
545                         }\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
551                         }\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
558                                 } else {\r
559                                         //template, show full path of directory\r
560                                         this.demoFileField.setText(selectedFile.getAbsolutePath());\r
561                                 }\r
562                                 \r
563                         }\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
569                         }\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
577                                 break;\r
578                         case EDIT_JOB:\r
579                                 this.editJob();\r
580                                 break;\r
581                         case EDIT_TEMPLATE:\r
582                                 this.editTemplate();\r
583                                 break;\r
584                         }\r
585                 } else if (e.getSource() == cancelButton) {\r
586                         dispose();\r
587                 }\r
588         }\r
589         \r
590         private void requestNewRecordJob() {\r
591                 float startSecond, endSecond = -1;\r
592                 try {\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
597                         return;\r
598                 }\r
599                 \r
600                 try {\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
611                                 startSecond,\r
612                                 endSecond\r
613                         );\r
614                         this.saveEncoderPluginSettings(j);\r
615                         dispose();\r
616                 } catch (Exception e) {\r
617                         DemoRecorderUtils.showNonCriticalErrorDialog(e);\r
618                         return;\r
619                 }\r
620                 \r
621         }\r
622         \r
623         private void editJob() {\r
624                 float startSecond, endSecond = -1;\r
625                 try {\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
630                         return;\r
631                 }\r
632                 \r
633                 try {\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
647                         dispose();\r
648                 } catch (Exception e) {\r
649                         DemoRecorderUtils.showNonCriticalErrorDialog(e);\r
650                         return;\r
651                 }\r
652                 \r
653         }\r
654         \r
655         private void createNewTemplate() {\r
656                 try {\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
669                         );\r
670                         this.saveEncoderPluginSettings(templ);\r
671                         this.tableModel.addRecordJobTemplate(templ);\r
672                         dispose();\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
677                         return;\r
678                 }\r
679         }\r
680         \r
681         private void editTemplate() {\r
682                 try {\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
696                         dispose();\r
697                 } catch (Exception e) {\r
698                         DemoRecorderUtils.showNonCriticalErrorDialog(e);\r
699                         return;\r
700                 }\r
701         }\r
702         \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
716                                 }\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
720                         }\r
721                 }\r
722         }\r
723         \r
724         private static class FileChooserButton extends JButton {\r
725                 private static final long serialVersionUID = 1335571540372856959L;\r
726                 public FileChooserButton() {\r
727                         super("...");\r
728                 }\r
729         }\r
730         \r
731         private JFileChooser createConfiguredFileChooser() {\r
732                 JFileChooser fc = new JFileChooser();\r
733                 fc.setFileHidingEnabled(false);\r
734                 fc.setFileFilter(userDirFilter);\r
735                 return fc;\r
736         }\r
737 }\r