1 /*******************************************************************************
2 * Copyright (c) 2009, 2014 Ericsson, École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Francois Chouinard - Copied and adapted from NewFolderDialog
11 * Geneviève Bastien - Add support of experiment types
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ui
.project
.wizards
;
16 import java
.lang
.reflect
.InvocationTargetException
;
18 import org
.eclipse
.core
.resources
.IContainer
;
19 import org
.eclipse
.core
.resources
.IFolder
;
20 import org
.eclipse
.core
.resources
.IResource
;
21 import org
.eclipse
.core
.resources
.IWorkspace
;
22 import org
.eclipse
.core
.resources
.IWorkspaceRoot
;
23 import org
.eclipse
.core
.runtime
.CoreException
;
24 import org
.eclipse
.core
.runtime
.IConfigurationElement
;
25 import org
.eclipse
.core
.runtime
.IPath
;
26 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
27 import org
.eclipse
.core
.runtime
.IStatus
;
28 import org
.eclipse
.core
.runtime
.InvalidRegistryObjectException
;
29 import org
.eclipse
.core
.runtime
.OperationCanceledException
;
30 import org
.eclipse
.core
.runtime
.Path
;
31 import org
.eclipse
.core
.runtime
.Status
;
32 import org
.eclipse
.jface
.dialogs
.IDialogConstants
;
33 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
34 import org
.eclipse
.osgi
.util
.NLS
;
35 import org
.eclipse
.swt
.SWT
;
36 import org
.eclipse
.swt
.graphics
.Font
;
37 import org
.eclipse
.swt
.layout
.GridData
;
38 import org
.eclipse
.swt
.layout
.GridLayout
;
39 import org
.eclipse
.swt
.widgets
.Composite
;
40 import org
.eclipse
.swt
.widgets
.Control
;
41 import org
.eclipse
.swt
.widgets
.Event
;
42 import org
.eclipse
.swt
.widgets
.Label
;
43 import org
.eclipse
.swt
.widgets
.Listener
;
44 import org
.eclipse
.swt
.widgets
.Shell
;
45 import org
.eclipse
.swt
.widgets
.Text
;
46 import org
.eclipse
.tracecompass
.internal
.tmf
.ui
.Activator
;
47 import org
.eclipse
.tracecompass
.tmf
.core
.TmfCommonConstants
;
48 import org
.eclipse
.tracecompass
.tmf
.core
.project
.model
.TmfTraceType
;
49 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TmfExperimentFolder
;
50 import org
.eclipse
.ui
.PlatformUI
;
51 import org
.eclipse
.ui
.actions
.WorkspaceModifyOperation
;
52 import org
.eclipse
.ui
.dialogs
.SelectionStatusDialog
;
55 * Implementation of new experiment dialog that creates the experiment element.
59 * @author Francois Chouinard
61 public class NewExperimentDialog
extends SelectionStatusDialog
{
63 // ------------------------------------------------------------------------
65 // ------------------------------------------------------------------------
67 private Text fExperimentName
;
68 private final IContainer fExperimentFolder
;
70 // ------------------------------------------------------------------------
72 // ------------------------------------------------------------------------
78 * @param experimentFolder
79 * The parent experiment folder element
81 public NewExperimentDialog(Shell shell
, TmfExperimentFolder experimentFolder
) {
83 fExperimentFolder
= experimentFolder
.getResource();
84 setTitle(Messages
.NewExperimentDialog_DialogTitle
);
85 setStatusLineAboveButtons(true);
88 // ------------------------------------------------------------------------
90 // ------------------------------------------------------------------------
93 protected Control
createDialogArea(Composite parent
) {
94 Composite composite
= (Composite
) super.createDialogArea(parent
);
95 composite
.setLayout(new GridLayout());
96 composite
.setLayoutData(new GridData(GridData
.FILL_BOTH
));
98 createExperimentNameGroup(composite
);
102 private void createExperimentNameGroup(Composite parent
) {
103 Font font
= parent
.getFont();
104 Composite folderGroup
= new Composite(parent
, SWT
.NONE
);
105 GridLayout layout
= new GridLayout();
106 layout
.numColumns
= 2;
107 folderGroup
.setLayout(layout
);
108 folderGroup
.setLayoutData(new GridData(GridData
.FILL_HORIZONTAL
));
110 // New experiment label
111 Label experimentLabel
= new Label(folderGroup
, SWT
.NONE
);
112 experimentLabel
.setFont(font
);
113 experimentLabel
.setText(Messages
.NewExperimentDialog_ExperimentName
);
115 // New experiment name entry field
116 fExperimentName
= new Text(folderGroup
, SWT
.BORDER
);
117 GridData data
= new GridData(GridData
.FILL_HORIZONTAL
);
118 data
.widthHint
= IDialogConstants
.ENTRY_FIELD_WIDTH
;
119 fExperimentName
.setLayoutData(data
);
120 fExperimentName
.setFont(font
);
121 fExperimentName
.addListener(SWT
.Modify
, new Listener() {
123 public void handleEvent(Event event
) {
124 validateNewExperimentName();
129 private void validateNewExperimentName() {
131 String name
= fExperimentName
.getText();
132 IWorkspace workspace
= fExperimentFolder
.getWorkspace();
133 IStatus nameStatus
= workspace
.validateName(name
, IResource
.FOLDER
);
135 if ("".equals(name
)) { //$NON-NLS-1$
136 updateStatus(new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
, IStatus
.ERROR
, Messages
.Dialog_EmptyNameError
, null));
140 if (!nameStatus
.isOK()) {
141 updateStatus(nameStatus
);
145 IPath path
= new Path(name
);
146 if (fExperimentFolder
.getFolder(path
).exists() || fExperimentFolder
.getFile(path
).exists()) {
147 updateStatus(new Status(IStatus
.ERROR
, Activator
.PLUGIN_ID
, IStatus
.ERROR
, Messages
.Dialog_ExistingNameError
, null));
151 updateStatus(new Status(IStatus
.OK
, Activator
.PLUGIN_ID
, "")); //$NON-NLS-1$
154 // ------------------------------------------------------------------------
155 // SelectionStatusDialog
156 // ------------------------------------------------------------------------
159 protected void computeResult() {
163 public void create() {
165 getButton(IDialogConstants
.OK_ID
).setEnabled(false);
169 protected void okPressed() {
170 IFolder folder
= createNewExperiment(fExperimentName
.getText());
171 if (folder
== null) {
174 setSelectionResult(new IFolder
[] { folder
});
178 private IFolder
createNewExperiment(String experimentName
) {
180 final IFolder experimentFolder
= createExperiment(experimentName
);
182 WorkspaceModifyOperation operation
= new WorkspaceModifyOperation() {
184 public void execute(IProgressMonitor monitor
) throws CoreException
{
186 monitor
.beginTask("", 1000); //$NON-NLS-1$
187 if (monitor
.isCanceled()) {
188 throw new OperationCanceledException();
190 experimentFolder
.create(false, true, monitor
);
193 * Experiments can be set to the default experiment type. No
194 * need to force user to select an experiment type
196 IConfigurationElement ce
= TmfTraceType
.getTraceAttributes(TmfTraceType
.DEFAULT_EXPERIMENT_TYPE
);
199 experimentFolder
.setPersistentProperty(TmfCommonConstants
.TRACETYPE
, ce
.getAttribute(TmfTraceType
.ID_ATTR
));
200 } catch (InvalidRegistryObjectException
| CoreException e
) {
203 if (monitor
.isCanceled()) {
204 throw new OperationCanceledException();
212 PlatformUI
.getWorkbench().getProgressService().busyCursorWhile(operation
);
213 } catch (InterruptedException
| RuntimeException exception
) {
215 } catch (InvocationTargetException exception
) {
216 MessageDialog
.openError(getShell(), "", NLS
.bind("", exception
.getTargetException().getMessage())); //$NON-NLS-1$ //$NON-NLS-2$
220 return experimentFolder
;
223 private IFolder
createExperiment(String experimentName
) {
224 IWorkspaceRoot workspaceRoot
= fExperimentFolder
.getWorkspace().getRoot();
225 IPath folderPath
= fExperimentFolder
.getFullPath().append(experimentName
);
226 IFolder folder
= workspaceRoot
.getFolder(folderPath
);