1 /*******************************************************************************
2 * Copyright (c) 2013 Ericsson
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 * Marc-Andre Laperle - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.importexport
;
16 import java
.lang
.reflect
.InvocationTargetException
;
17 import java
.text
.MessageFormat
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 import org
.eclipse
.core
.resources
.IProject
;
22 import org
.eclipse
.core
.resources
.ResourcesPlugin
;
23 import org
.eclipse
.core
.runtime
.IProgressMonitor
;
24 import org
.eclipse
.core
.runtime
.IStatus
;
25 import org
.eclipse
.jface
.dialogs
.IDialogConstants
;
26 import org
.eclipse
.jface
.dialogs
.IDialogSettings
;
27 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
28 import org
.eclipse
.jface
.operation
.IRunnableWithProgress
;
29 import org
.eclipse
.jface
.viewers
.CheckboxTreeViewer
;
30 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
31 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.Activator
;
32 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.model
.TmfImportHelper
;
33 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.AbstractTracePackageOperation
;
34 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.AbstractTracePackageWizardPage
;
35 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageElement
;
36 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageFilesElement
;
37 import org
.eclipse
.linuxtools
.internal
.tmf
.ui
.project
.wizards
.tracepkg
.TracePackageTraceElement
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.TmfCommonConstants
;
39 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfNavigatorContentProvider
;
40 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfProjectRegistry
;
41 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceElement
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TmfTraceFolder
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.project
.model
.TraceUtils
;
44 import org
.eclipse
.swt
.SWT
;
45 import org
.eclipse
.swt
.events
.SelectionAdapter
;
46 import org
.eclipse
.swt
.events
.SelectionEvent
;
47 import org
.eclipse
.swt
.events
.TraverseEvent
;
48 import org
.eclipse
.swt
.events
.TraverseListener
;
49 import org
.eclipse
.swt
.layout
.GridData
;
50 import org
.eclipse
.swt
.layout
.GridLayout
;
51 import org
.eclipse
.swt
.widgets
.Button
;
52 import org
.eclipse
.swt
.widgets
.Combo
;
53 import org
.eclipse
.swt
.widgets
.Composite
;
54 import org
.eclipse
.swt
.widgets
.Event
;
55 import org
.eclipse
.swt
.widgets
.Label
;
56 import org
.eclipse
.swt
.widgets
.Listener
;
57 import org
.eclipse
.swt
.widgets
.Text
;
58 import org
.eclipse
.ui
.dialogs
.ElementListSelectionDialog
;
59 import org
.eclipse
.ui
.model
.WorkbenchLabelProvider
;
62 * Wizard page for the import trace package wizard
64 * @author Marc-Andre Laperle
66 public class ImportTracePackageWizardPage
extends AbstractTracePackageWizardPage
{
68 private static final String ICON_PATH
= "icons/wizban/trace_import_wiz.png"; //$NON-NLS-1$
69 private static final String PAGE_NAME
= "ImportTracePackagePage"; //$NON-NLS-1$
70 private static final String STORE_PROJECT_NAME_ID
= PAGE_NAME
+ ".STORE_PROJECT_NAME_ID"; //$NON-NLS-1$
72 private String fValidatedFilePath
;
73 private TmfTraceFolder fTmfTraceFolder
;
74 private Text fProjectText
;
75 private List
<IProject
> fOpenedTmfProjects
;
78 * Constructor for the import trace package wizard page
81 * the current object selection
83 public ImportTracePackageWizardPage(IStructuredSelection selection
) {
84 super(PAGE_NAME
, Messages
.ImportTracePackageWizardPage_Title
, Activator
.getDefault().getImageDescripterFromPath(ICON_PATH
), selection
);
86 if (getSelection().getFirstElement() instanceof TmfTraceFolder
) {
87 fTmfTraceFolder
= (TmfTraceFolder
) getSelection().getFirstElement();
92 public void createControl(Composite parent
) {
93 initializeDialogUnits(parent
);
95 Composite composite
= new Composite(parent
, SWT
.NULL
);
96 composite
.setLayout(new GridLayout());
97 composite
.setLayoutData(new GridData(GridData
.VERTICAL_ALIGN_FILL
98 | GridData
.HORIZONTAL_ALIGN_FILL
));
99 composite
.setFont(parent
.getFont());
101 createFilePathGroup(composite
, Messages
.ImportTracePackageWizardPage_FromArchive
, SWT
.OPEN
);
102 createElementViewer(composite
);
103 createButtonsGroup(composite
);
104 if (fTmfTraceFolder
== null) {
105 createProjectSelectionGroup(composite
);
108 restoreWidgetValues();
109 setMessage(Messages
.ImportTracePackageWizardPage_Message
);
110 updatePageCompletion();
112 setControl(composite
);
115 private void createProjectSelectionGroup(Composite parent
) {
117 Composite projectSelectionGroup
= new Composite(parent
, SWT
.NONE
);
118 GridLayout layout
= new GridLayout();
119 layout
.numColumns
= 3;
120 projectSelectionGroup
.setLayout(layout
);
121 projectSelectionGroup
.setLayoutData(new GridData(
122 GridData
.HORIZONTAL_ALIGN_FILL
| GridData
.VERTICAL_ALIGN_FILL
));
124 Label projectLabel
= new Label(projectSelectionGroup
, SWT
.NONE
);
125 projectLabel
.setText(Messages
.ImportTracePackageWizardPage_Project
);
127 fProjectText
= new Text(projectSelectionGroup
, SWT
.BORDER
| SWT
.SINGLE
| SWT
.READ_ONLY
);
128 GridData data
= new GridData(GridData
.HORIZONTAL_ALIGN_FILL
129 | GridData
.GRAB_HORIZONTAL
);
130 data
.grabExcessHorizontalSpace
= true;
131 fProjectText
.setLayoutData(data
);
133 fOpenedTmfProjects
= TraceUtils
.getOpenedTmfProjects();
135 // No project to import to, create a default project if it doesn't exist
136 if (fOpenedTmfProjects
.isEmpty()) {
137 IProject defaultProject
= ResourcesPlugin
.getWorkspace().getRoot().getProject(TmfCommonConstants
.DEFAULT_TRACE_PROJECT_NAME
);
138 if (!defaultProject
.exists()) {
139 IProject project
= TmfProjectRegistry
.createProject(TmfCommonConstants
.DEFAULT_TRACE_PROJECT_NAME
, null, null);
140 TmfImportHelper
.forceFolderRefresh(project
.getFolder(TmfTraceFolder
.TRACE_FOLDER_NAME
));
141 fOpenedTmfProjects
.add(project
);
145 if (!fOpenedTmfProjects
.isEmpty()) {
146 selectProject(fOpenedTmfProjects
.get(0));
149 Button button
= new Button(projectSelectionGroup
,
151 button
.setText(Messages
.ImportTracePackageWizardPage_SelectProjectButton
);
152 button
.addListener(SWT
.Selection
, new Listener() {
154 public void handleEvent(Event event
) {
155 ElementListSelectionDialog d
= new ElementListSelectionDialog(getContainer().getShell(), new WorkbenchLabelProvider());
157 d
.setBlockOnOpen(true);
158 d
.setTitle(Messages
.ImportTracePackageWizardPage_SelectProjectDialogTitle
);
160 d
.setElements(fOpenedTmfProjects
.toArray(new IProject
[] {}));
163 if (d
.getFirstResult() != null) {
164 IProject project
= (IProject
) d
.getFirstResult();
165 selectProject(project
);
169 setButtonLayoutData(button
);
173 protected void restoreWidgetValues() {
174 super.restoreWidgetValues();
175 IDialogSettings settings
= getDialogSettings();
176 if (settings
!= null && fProjectText
!= null) {
178 // Restore last selected project
179 String projectName
= settings
.get(STORE_PROJECT_NAME_ID
);
180 if (projectName
!= null && !projectName
.isEmpty()) {
181 for (IProject project
: fOpenedTmfProjects
) {
182 if (project
.getName().equals(projectName
)) {
183 selectProject(project
);
192 protected void saveWidgetValues() {
193 super.saveWidgetValues();
195 IDialogSettings settings
= getDialogSettings();
196 if (settings
!= null) {
197 settings
.put(STORE_PROJECT_NAME_ID
, fTmfTraceFolder
.getProject().getResource().getName());
201 private void selectProject(IProject project
) {
202 fProjectText
.setText(project
.getName());
203 new TmfNavigatorContentProvider().getChildren(project
);
204 fTmfTraceFolder
= TmfProjectRegistry
.getProject(project
).getTracesFolder();
205 updatePageCompletion();
209 protected boolean determinePageCompletion() {
210 return super.determinePageCompletion() && fTmfTraceFolder
!= null;
214 protected Object
createElementViewerInput() {
216 final TracePackageExtractManifestOperation op
= new TracePackageExtractManifestOperation(getFilePathValue());
219 getContainer().run(true, true, new IRunnableWithProgress() {
222 public void run(IProgressMonitor monitor
) throws InvocationTargetException
, InterruptedException
{
223 monitor
.beginTask(Messages
.ImportTracePackageWizardPage_ReadingPackage
, 10);
230 IStatus status
= op
.getStatus();
231 if (status
.getSeverity() == IStatus
.ERROR
) {
232 handleErrorStatus(status
);
234 } catch (InvocationTargetException e1
) {
235 handleError(Messages
.TracePackageExtractManifestOperation_ErrorReadingManifest
, e1
);
236 } catch (InterruptedException e1
) {
240 TracePackageElement
[] resultElements
= op
.getResultElement();
241 if (resultElements
== null || resultElements
.length
== 0) {
245 return resultElements
;
249 protected void createFilePathGroup(Composite parent
, String label
, int fileDialogStyle
) {
250 super.createFilePathGroup(parent
, label
, fileDialogStyle
);
252 Combo filePathCombo
= getFilePathCombo();
253 filePathCombo
.addSelectionListener(new SelectionAdapter() {
255 public void widgetSelected(SelectionEvent e
) {
256 updateWithFilePathSelection();
260 // User can type-in path and press return to validate
261 filePathCombo
.addTraverseListener(new TraverseListener() {
263 public void keyTraversed(TraverseEvent e
) {
264 if (e
.detail
== SWT
.TRAVERSE_RETURN
) {
266 updateWithFilePathSelection();
273 protected void updateWithFilePathSelection() {
274 if (!isFilePathValid()) {
275 setErrorMessage(Messages
.ImportTracePackageWizardPage_ErrorFileNotFound
);
276 getElementViewer().setInput(null);
279 setErrorMessage(null);
281 getContainer().getShell().getDisplay().asyncExec(new Runnable() {
284 CheckboxTreeViewer elementViewer
= getElementViewer();
285 Object elementViewerInput
= createElementViewerInput();
286 elementViewer
.setInput(elementViewerInput
);
287 if (elementViewerInput
!= null) {
288 elementViewer
.expandToLevel(2);
289 setAllChecked(elementViewer
, false, true);
290 fValidatedFilePath
= getFilePathValue();
293 updatePageCompletion();
298 private boolean isFilePathValid() {
299 return new File(getFilePathValue()).exists();
303 * Finish the wizard page
305 * @return true on success
307 public boolean finish() {
308 if (!checkForOverwrite()) {
314 Object input
= getElementViewer().getInput();
315 TracePackageElement
[] traceElements
= (TracePackageElement
[]) input
;
316 final TracePackageImportOperation importOperation
= new TracePackageImportOperation(fValidatedFilePath
, traceElements
, fTmfTraceFolder
);
319 getContainer().run(true, true, new IRunnableWithProgress() {
321 public void run(IProgressMonitor monitor
) throws InvocationTargetException
, InterruptedException
{
322 importOperation
.run(monitor
);
326 IStatus status
= importOperation
.getStatus();
327 if (status
.getSeverity() == IStatus
.ERROR
) {
328 handleErrorStatus(status
);
331 } catch (InvocationTargetException e
) {
332 handleError(Messages
.ImportTracePackageWizardPage_ErrorOperation
, e
);
333 } catch (InterruptedException e
) {
336 return importOperation
.getStatus().getSeverity() == IStatus
.OK
;
339 private boolean checkForOverwrite() {
340 TracePackageElement
[] traceElements
= (TracePackageElement
[]) getElementViewer().getInput();
341 List
<TracePackageTraceElement
> noImportTraces
= new ArrayList
<>();
342 boolean noToAll
= false;
343 for (TracePackageElement packageElement
: traceElements
) {
344 TracePackageTraceElement traceElement
= (TracePackageTraceElement
) packageElement
;
345 if (!AbstractTracePackageOperation
.isFilesChecked(traceElement
)) {
350 noImportTraces
.add(traceElement
);
354 String traceName
= traceElement
.getText();
355 if (traceExists(traceName
)) {
356 int returnCode
= promptForOverwrite(traceName
);
357 final String
[] response
= new String
[] { IDialogConstants
.NO_TO_ALL_LABEL
, IDialogConstants
.NO_LABEL
, IDialogConstants
.YES_TO_ALL_LABEL
, IDialogConstants
.YES_LABEL
};
358 if (response
[returnCode
].equals(IDialogConstants
.YES_TO_ALL_LABEL
)) {
360 } else if (response
[returnCode
].equals(IDialogConstants
.NO_TO_ALL_LABEL
)) {
362 noImportTraces
.add(traceElement
);
363 } else if (response
[returnCode
].equals(IDialogConstants
.NO_LABEL
)) {
364 noImportTraces
.add(traceElement
);
369 // Unselect the traces that the user decided not to import
370 for (TracePackageTraceElement t
: noImportTraces
) {
371 for (TracePackageElement e
: t
.getChildren()) {
372 if (e
instanceof TracePackageFilesElement
) {
373 ((TracePackageFilesElement
) e
).setChecked(false);
381 private boolean traceExists(String traceName
) {
382 List
<TmfTraceElement
> traces
= fTmfTraceFolder
.getTraces();
383 for (TmfTraceElement t
: traces
) {
384 if (t
.getName().equals(traceName
)) {
392 private int promptForOverwrite(String traceName
) {
393 final MessageDialog dialog
= new MessageDialog(getContainer()
394 .getShell(), null, null, MessageFormat
.format(Messages
.ImportTracePackageWizardPage_AlreadyExists
, traceName
),
395 MessageDialog
.QUESTION
, new String
[] {
396 IDialogConstants
.NO_TO_ALL_LABEL
,
397 IDialogConstants
.NO_LABEL
,
398 IDialogConstants
.YES_TO_ALL_LABEL
,
399 IDialogConstants
.YES_LABEL
,
402 protected int getShellStyle() {
403 return super.getShellStyle() | SWT
.SHEET
;
406 return dialog
.open();