1 | package de.uka.ipd.sdq.workflow.pcm.runconfig; |
2 | |
3 | |
4 | import org.eclipse.core.runtime.CoreException; |
5 | import org.eclipse.debug.core.ILaunchConfiguration; |
6 | import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; |
7 | import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; |
8 | import org.eclipse.swt.SWT; |
9 | import org.eclipse.swt.custom.ScrolledComposite; |
10 | import org.eclipse.swt.events.ModifyEvent; |
11 | import org.eclipse.swt.events.ModifyListener; |
12 | import org.eclipse.swt.events.SelectionAdapter; |
13 | import org.eclipse.swt.events.SelectionEvent; |
14 | import org.eclipse.swt.events.SelectionListener; |
15 | import org.eclipse.swt.graphics.Image; |
16 | import org.eclipse.swt.layout.GridData; |
17 | import org.eclipse.swt.layout.GridLayout; |
18 | import org.eclipse.swt.widgets.Button; |
19 | import org.eclipse.swt.widgets.Composite; |
20 | import org.eclipse.swt.widgets.Group; |
21 | import org.eclipse.swt.widgets.Label; |
22 | import org.eclipse.swt.widgets.Text; |
23 | |
24 | import de.uka.ipd.sdq.workflow.launchconfig.RunConfigImages; |
25 | import de.uka.ipd.sdq.workflow.launchconfig.RunConfigPlugin; |
26 | import de.uka.ipd.sdq.workflow.launchconfig.tabs.TabHelper; |
27 | import de.uka.ipd.sdq.workflow.pcm.ConstantsContainer; |
28 | |
29 | /**Configuration of an analysis method. |
30 | * Represents configuration settings which are independent of the solving method. |
31 | * |
32 | * @author groenda |
33 | * @author Roman Andrej |
34 | */ |
35 | public class ConfigurationTab extends AbstractLaunchConfigurationTab { |
36 | |
37 | /** The id of this plug-in. */ |
38 | public static final String PLUGIN_ID = "de.uka.ipd.sdq.workflow.pcm"; |
39 | /** The path to the image file for the tab icon. */ |
40 | public static final String CONFIGURATION_TAB_IMAGE_PATH = "icons/configuration_tab.gif"; |
41 | |
42 | /** Title of the accuracy information group. */ |
43 | private static final String GROUP_ACCURACY_LABEL = "Accuracy influence analysis"; |
44 | /** Label for the accuracy influence analysis setting. */ |
45 | private static final String BUTTON_SIMULATE_ACCURACY_LABEL = "Analyse accuracy influence"; |
46 | /** Label of the file selection field for the accuracy information model file. */ |
47 | private static final String DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE_LABEL = "Quality Annotation File"; |
48 | |
49 | /** Text field for name of the plug-in project containing temporary data. */ |
50 | protected Text temporaryLocationField; |
51 | /** Label for the temporary data plug-in project name field. */ |
52 | private Label temporaryLocationLabel; |
53 | /** Button stating if the default location should be selected. */ |
54 | protected Button defaultLocationButton; |
55 | /** Button stating if the temporary data should be deleted after an analysis. */ |
56 | protected Button clearButton; |
57 | /** Button used to enable/disable accuracy influence checking. */ |
58 | private Button simulateAccuracyButton; |
59 | /** Text containing the location of the file containing quality annotations for PCM specifications. */ |
60 | private Text textAccuracyQualityAnnotationFile; |
61 | |
62 | protected ModifyListener modifyListener; |
63 | protected SelectionListener selectionListener; |
64 | |
65 | /* (non-Javadoc) |
66 | * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage() |
67 | */ |
68 | public Image getImage() { |
69 | return RunConfigImages.getTabImage(PLUGIN_ID,CONFIGURATION_TAB_IMAGE_PATH); |
70 | } |
71 | |
72 | /* (non-Javadoc) |
73 | * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite) |
74 | */ |
75 | public void createControl(Composite parent) { |
76 | |
77 | modifyListener = new ModifyListener(){ |
78 | |
79 | /* (non-Javadoc) |
80 | * @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent) |
81 | */ |
82 | public void modifyText(ModifyEvent e) { |
83 | ConfigurationTab.this.setDirty(true); |
84 | ConfigurationTab.this.updateLaunchConfigurationDialog(); |
85 | } |
86 | }; |
87 | selectionListener = new SelectionAdapter() { |
88 | |
89 | /* (non-Javadoc) |
90 | * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
91 | */ |
92 | public void widgetSelected(SelectionEvent e) { |
93 | ConfigurationTab.this.setDirty(true); |
94 | ConfigurationTab.this.updateLaunchConfigurationDialog(); |
95 | } |
96 | }; |
97 | |
98 | // Create a new Composite to hold the page's controls. |
99 | // The composite will show scroll bars if the size of |
100 | // the dialog decreases below the minimum size of the |
101 | // contained controls: |
102 | ScrolledComposite container = new ScrolledComposite(parent, |
103 | SWT.H_SCROLL | SWT.V_SCROLL); |
104 | container.setExpandHorizontal(true); |
105 | container.setExpandVertical(true); |
106 | Composite contentContainer = new Composite(container, SWT.NONE); |
107 | container.setContent(contentContainer); |
108 | GridLayout layout = new GridLayout(); |
109 | contentContainer.setLayout(layout); |
110 | |
111 | // Sets the scrolled composite to be the displayed |
112 | // top-level control in this tab: |
113 | setControl(container); |
114 | |
115 | // Create temporary data location section |
116 | createTemporaryDataLocationSection(contentContainer); |
117 | createDeleteTemporaryDataAfterAnalysisSection(contentContainer); |
118 | createAccuracySection(contentContainer); |
119 | |
120 | // Create further sections as required: |
121 | createFurtherSections(contentContainer); |
122 | |
123 | // disabled widget |
124 | setTemporaryLocationElementsEnabled(false); |
125 | |
126 | |
127 | // After all internal controls have been created, |
128 | // calculate the minimal size of the contentContainer. |
129 | // Scrollbars will be shown if the dialog size decreases |
130 | // below the calculated min size: |
131 | container.setMinSize(contentContainer.computeSize(SWT.DEFAULT, |
132 | SWT.DEFAULT)); |
133 | } |
134 | |
135 | /**Creates the section for the accuracy analysis. |
136 | * @param container Container in which teh elements are created. |
137 | */ |
138 | protected void createAccuracySection(Composite container) { |
139 | // Create accuracy section |
140 | final Group accuracyGroup = new Group(container, SWT.NONE); |
141 | accuracyGroup.setText(GROUP_ACCURACY_LABEL); |
142 | final GridData gd_accuracyGroup = new GridData(SWT.FILL, SWT.CENTER, true, false); |
143 | accuracyGroup.setLayoutData(gd_accuracyGroup); |
144 | accuracyGroup.setLayout(new GridLayout()); |
145 | simulateAccuracyButton = new Button(accuracyGroup, SWT.CHECK); |
146 | simulateAccuracyButton.setLayoutData(gd_accuracyGroup); |
147 | simulateAccuracyButton.setText(BUTTON_SIMULATE_ACCURACY_LABEL); |
148 | simulateAccuracyButton.setSelection(false); |
149 | simulateAccuracyButton.addSelectionListener(selectionListener); |
150 | textAccuracyQualityAnnotationFile = new Text(accuracyGroup, SWT.SINGLE | SWT.BORDER); |
151 | textAccuracyQualityAnnotationFile.setLayoutData(gd_accuracyGroup); |
152 | textAccuracyQualityAnnotationFile.addModifyListener(modifyListener); |
153 | TabHelper.createFileInputSection(accuracyGroup, modifyListener, |
154 | DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE_LABEL, |
155 | ConstantsContainer.ACCURACY_QUALITY_ANNOTATION_EXTENSION, |
156 | textAccuracyQualityAnnotationFile, getShell(), ConstantsContainer.DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE); |
157 | } |
158 | |
159 | /**Creates the section for the deletion of temporary data. |
160 | * @param container Container in which the elements are created. |
161 | */ |
162 | protected void createDeleteTemporaryDataAfterAnalysisSection(Composite container) { |
163 | final Group clearGroup = new Group(container, SWT.NONE); |
164 | clearGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); |
165 | clearGroup.setText("Temporary Data"); |
166 | clearGroup.setLayout(new GridLayout()); |
167 | clearButton = new Button(clearGroup, |
168 | SWT.CHECK); |
169 | clearButton.setLayoutData( new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1)); |
170 | clearButton.setText("Delete temporary data after analysis"); |
171 | clearButton.addSelectionListener(selectionListener); |
172 | } |
173 | |
174 | /**Creates the section for the selection of the temporary data location. |
175 | * @param container Container in which the elements are created. |
176 | * @param modifyListener The lister to use on modifications. |
177 | */ |
178 | protected void createTemporaryDataLocationSection(Composite container) { |
179 | final Group outputPathGroup = new Group(container, SWT.NONE); |
180 | outputPathGroup.setText("Location of temporary data"); |
181 | final GridLayout gridLayout = new GridLayout(); |
182 | gridLayout.numColumns = 4; |
183 | outputPathGroup.setLayout(gridLayout); |
184 | final GridData gd_outputPathGroup = new GridData(SWT.FILL, SWT.CENTER, true, false); |
185 | outputPathGroup.setLayoutData(gd_outputPathGroup); |
186 | |
187 | /** default temporary location button */ |
188 | defaultLocationButton = new Button(outputPathGroup, |
189 | SWT.CHECK); |
190 | final GridData gridData_dl = new GridData(SWT.LEFT, SWT.CENTER, false, false, 4, 1); |
191 | defaultLocationButton.setLayoutData(gridData_dl); |
192 | defaultLocationButton.setText("Use default location"); |
193 | defaultLocationButton.setSelection(true); |
194 | defaultLocationButton.addSelectionListener(new SelectionAdapter() { |
195 | |
196 | /* (non-Javadoc) |
197 | * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
198 | */ |
199 | public void widgetSelected(SelectionEvent e) { |
200 | setTemporaryLocationElementsEnabled(!defaultLocationButton.getSelection()); |
201 | |
202 | if (defaultLocationButton.getSelection() == true) { |
203 | temporaryLocationField.setText(ConstantsContainer.DEFAULT_TEMPORARY_DATA_LOCATION); |
204 | } |
205 | ConfigurationTab.this.setDirty(true); |
206 | ConfigurationTab.this.updateLaunchConfigurationDialog(); |
207 | } |
208 | }); |
209 | |
210 | temporaryLocationLabel = new Label(outputPathGroup, SWT.NONE); |
211 | temporaryLocationLabel.setLayoutData(new GridData(48, SWT.DEFAULT)); |
212 | temporaryLocationLabel.setText("Location:"); |
213 | |
214 | temporaryLocationField = new Text(outputPathGroup, SWT.BORDER); |
215 | final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, |
216 | false); |
217 | gridData.widthHint = 20; |
218 | temporaryLocationField.setLayoutData(gridData); |
219 | temporaryLocationField.setText(ConstantsContainer.DEFAULT_TEMPORARY_DATA_LOCATION); |
220 | temporaryLocationField.addModifyListener(modifyListener); |
221 | } |
222 | |
223 | /** |
224 | * Derived classes may add further sections here. |
225 | * @param container Container in which the elements are created. |
226 | */ |
227 | protected void createFurtherSections(Composite container) { |
228 | } |
229 | |
230 | /**Set the enable-state for the elements in the temporary location section. |
231 | * @param enable |
232 | */ |
233 | private void setTemporaryLocationElementsEnabled(boolean enable) { |
234 | temporaryLocationLabel.setEnabled(enable); |
235 | temporaryLocationField.setEnabled(enable); |
236 | } |
237 | |
238 | /** |
239 | /* (non-Javadoc) |
240 | * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName() |
241 | */ |
242 | public String getName() { |
243 | return "Analysis Configuration"; |
244 | } |
245 | |
246 | /* (non-Javadoc) |
247 | * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration) |
248 | */ |
249 | public void initializeFrom(ILaunchConfiguration configuration) { |
250 | try { |
251 | temporaryLocationField.setText(configuration.getAttribute( |
252 | ConstantsContainer.TEMPORARY_DATA_LOCATION, ConstantsContainer.DEFAULT_TEMPORARY_DATA_LOCATION)); |
253 | // set default selection button state |
254 | if (temporaryLocationField.getText().equals(ConstantsContainer.DEFAULT_TEMPORARY_DATA_LOCATION)) { |
255 | defaultLocationButton.setSelection(true); |
256 | setTemporaryLocationElementsEnabled(false); |
257 | } else { |
258 | defaultLocationButton.setSelection(false); |
259 | setTemporaryLocationElementsEnabled(true); |
260 | } |
261 | } catch (CoreException e) { |
262 | RunConfigPlugin.errorLogger(getName(),"Temporary Location Settings", e.getMessage()); |
263 | defaultLocationButton.setSelection(true); |
264 | } |
265 | try { |
266 | clearButton |
267 | .setSelection(configuration |
268 | .getAttribute( |
269 | ConstantsContainer.DELETE_TEMPORARY_DATA_AFTER_ANALYSIS, |
270 | ConstantsContainer.DEFAULT_DELETE_TEMPORARY_DATA_AFTER_ANALYSIS)); |
271 | } catch (CoreException e) { |
272 | RunConfigPlugin.errorLogger(getName(), "Delete temporaray data after analysis.", e.getMessage()); |
273 | } |
274 | try { |
275 | simulateAccuracyButton.setSelection(configuration.getAttribute( |
276 | ConstantsContainer.ANALYSE_ACCURACY, |
277 | ConstantsContainer.DEFAULT_ANALYSE_ACCURACY)); |
278 | textAccuracyQualityAnnotationFile.setText(configuration.getAttribute( |
279 | ConstantsContainer.ACCURACY_QUALITY_ANNOTATION_FILE, |
280 | ConstantsContainer.DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE)); |
281 | } catch (CoreException e) { |
282 | simulateAccuracyButton.setSelection(ConstantsContainer.DEFAULT_ANALYSE_ACCURACY); |
283 | textAccuracyQualityAnnotationFile.setText(ConstantsContainer.DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE); |
284 | } |
285 | } |
286 | |
287 | /* (non-Javadoc) |
288 | * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) |
289 | */ |
290 | public void performApply(ILaunchConfigurationWorkingCopy configuration) { |
291 | configuration.setAttribute(ConstantsContainer.TEMPORARY_DATA_LOCATION, |
292 | temporaryLocationField.getText()); |
293 | configuration.setAttribute( |
294 | ConstantsContainer.DELETE_TEMPORARY_DATA_AFTER_ANALYSIS, |
295 | clearButton.getSelection()); |
296 | configuration.setAttribute(ConstantsContainer.ANALYSE_ACCURACY, |
297 | this.simulateAccuracyButton.getSelection()); |
298 | configuration.setAttribute( |
299 | ConstantsContainer.ACCURACY_QUALITY_ANNOTATION_FILE, |
300 | this.textAccuracyQualityAnnotationFile.getText()); |
301 | } |
302 | |
303 | /* (non-Javadoc) |
304 | * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy) |
305 | */ |
306 | public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { |
307 | configuration.setAttribute(ConstantsContainer.TEMPORARY_DATA_LOCATION, |
308 | ConstantsContainer.DEFAULT_TEMPORARY_DATA_LOCATION); |
309 | configuration |
310 | .setAttribute( |
311 | ConstantsContainer.DELETE_TEMPORARY_DATA_AFTER_ANALYSIS, |
312 | ConstantsContainer.DEFAULT_DELETE_TEMPORARY_DATA_AFTER_ANALYSIS); |
313 | configuration.setAttribute(ConstantsContainer.ANALYSE_ACCURACY, |
314 | ConstantsContainer.DEFAULT_ANALYSE_ACCURACY); |
315 | configuration.setAttribute( |
316 | ConstantsContainer.ACCURACY_QUALITY_ANNOTATION_FILE, |
317 | ConstantsContainer.DEFAULT_ACCURACY_QUALITY_ANNOTATION_FILE); |
318 | } |
319 | |
320 | public boolean isValid(ILaunchConfiguration launchConfig) { |
321 | setErrorMessage(null); |
322 | |
323 | if (temporaryLocationField.getText().equals("")){ |
324 | setErrorMessage("The location for temporary data is missing."); |
325 | return false; |
326 | } |
327 | if (simulateAccuracyButton.getSelection() == true |
328 | && !TabHelper.validateFilenameExtension( |
329 | textAccuracyQualityAnnotationFile.getText(), |
330 | ConstantsContainer.ACCURACY_QUALITY_ANNOTATION_EXTENSION)) { |
331 | setErrorMessage("Quality Annotation File must be present for accuracy influence analysis."); |
332 | return false; |
333 | } |
334 | return true; |
335 | } |
336 | |
337 | @Override |
338 | public void activated(ILaunchConfigurationWorkingCopy workingCopy) { |
339 | // Leave this method empty to prevent unnecessary invocation of |
340 | // initializeFrom() and multiple resulting invocations of |
341 | // performApply(). |
342 | } |
343 | |
344 | @Override |
345 | public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) { |
346 | // intentionally left blank |
347 | } |
348 | |
349 | } |