a87a2320fef5f335cdada7d9383720874f0f1556
[deliverable/tracecompass.git] / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / internal / tmf / ui / project / handlers / OffsetTraceHandler.java
1 /*******************************************************************************
2 * Copyright (c) 2014, 2015 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Matthew Khouzam - Initial API and implementation
11 * Patrick Tasse - Initial API and implementation
12 *******************************************************************************/
13
14 package org.eclipse.tracecompass.internal.tmf.ui.project.handlers;
15
16 import java.lang.reflect.InvocationTargetException;
17 import java.util.HashSet;
18 import java.util.Iterator;
19 import java.util.LinkedHashMap;
20 import java.util.Map;
21 import java.util.Set;
22
23 import org.eclipse.core.commands.AbstractHandler;
24 import org.eclipse.core.commands.ExecutionEvent;
25 import org.eclipse.core.commands.ExecutionException;
26 import org.eclipse.core.runtime.CoreException;
27 import org.eclipse.core.runtime.IProgressMonitor;
28 import org.eclipse.core.runtime.OperationCanceledException;
29 import org.eclipse.jface.dialogs.MessageDialog;
30 import org.eclipse.jface.viewers.ISelection;
31 import org.eclipse.jface.viewers.StructuredSelection;
32 import org.eclipse.jface.window.Window;
33 import org.eclipse.swt.widgets.Display;
34 import org.eclipse.swt.widgets.Shell;
35 import org.eclipse.tracecompass.internal.tmf.ui.project.dialogs.offset.OffsetDialog;
36 import org.eclipse.tracecompass.internal.tmf.ui.project.operations.TmfWorkspaceModifyOperation;
37 import org.eclipse.tracecompass.tmf.core.synchronization.ITmfTimestampTransform;
38 import org.eclipse.tracecompass.tmf.core.synchronization.TimestampTransformFactory;
39 import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
40 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
41 import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
42 import org.eclipse.ui.PlatformUI;
43 import org.eclipse.ui.handlers.HandlerUtil;
44
45 /**
46 * Offset Handler
47 *
48 * @author Matthew Khouzam
49 */
50 public class OffsetTraceHandler extends AbstractHandler {
51
52 // ------------------------------------------------------------------------
53 // Execution
54 // ------------------------------------------------------------------------
55
56 @Override
57 public Object execute(final ExecutionEvent event) throws ExecutionException {
58
59 ISelection selection = HandlerUtil.getCurrentSelection(event);
60
61 // Get the set of selected trace elements
62 final Set<TmfTraceElement> traceElements = new HashSet<>();
63 if (selection instanceof StructuredSelection) {
64 Iterator<Object> iterator = ((StructuredSelection) selection).iterator();
65 while (iterator.hasNext()) {
66 Object element = iterator.next();
67 if (element instanceof TmfTraceElement) {
68 TmfTraceElement trace = (TmfTraceElement) element;
69 traceElements.add(trace.getElementUnderTraceFolder());
70 } else if (element instanceof TmfExperimentElement) {
71 TmfExperimentElement exp = (TmfExperimentElement) element;
72 for (TmfTraceElement trace : exp.getTraces()) {
73 traceElements.add(trace.getElementUnderTraceFolder());
74 }
75 } else if (element instanceof TmfTraceFolder) {
76 TmfTraceFolder folder = (TmfTraceFolder) element;
77 traceElements.addAll(folder.getTraces());
78 }
79 }
80 }
81
82 if (traceElements.isEmpty()) {
83 return null;
84 }
85
86 final Map<TmfTraceElement, Long> offsets = new LinkedHashMap<>(traceElements.size());
87 for (TmfTraceElement trace : traceElements) {
88 offsets.put(trace, 0L);
89 }
90
91 Shell shell = HandlerUtil.getActiveShellChecked(event);
92 OffsetDialog dialog = new OffsetDialog(shell, offsets);
93 dialog.open();
94
95 if (dialog.getReturnCode() != Window.OK) {
96 return null;
97 }
98
99 TmfWorkspaceModifyOperation operation = new TmfWorkspaceModifyOperation() {
100 @Override
101 public void execute(IProgressMonitor monitor) throws CoreException {
102 for (final TmfTraceElement trace : offsets.keySet()) {
103 if (monitor.isCanceled()) {
104 throw new OperationCanceledException();
105 }
106 Long offset = offsets.get(trace);
107 if (offset != 0 && trace.getResource().exists()) {
108 Display.getDefault().syncExec(new Runnable() {
109 @Override
110 public void run() {
111 trace.closeEditors();
112 }
113 });
114 long previousOffset = TimestampTransformFactory.getTimestampTransform(trace.getResource()).transform(0);
115 ITmfTimestampTransform transform = TimestampTransformFactory.createWithOffset(previousOffset + offset);
116 trace.deleteSupplementaryResources();
117 // make sure the supplementary folder exists
118 trace.refreshSupplementaryFolder();
119 TimestampTransformFactory.setTimestampTransform(trace.getResource(), transform);
120 trace.refreshSupplementaryFolder();
121 }
122 }
123 }
124 };
125 try {
126 PlatformUI.getWorkbench().getProgressService().run(true, true, operation);
127 } catch (InterruptedException e) {
128 return null;
129 } catch (InvocationTargetException e) {
130 MessageDialog.openError(shell, e.toString(), e.getTargetException().toString());
131 return null;
132 }
133
134 return null;
135 }
136 }
This page took 0.03448 seconds and 4 git commands to generate.