1 /*******************************************************************************
2 * Copyright (c) 2014, 2015 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 * Matthew Khouzam - Initial API and implementation
11 * Patrick Tasse - Initial API and implementation
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.internal
.tmf
.ui
.project
.handlers
;
16 import java
.lang
.reflect
.InvocationTargetException
;
17 import java
.util
.HashSet
;
18 import java
.util
.Iterator
;
19 import java
.util
.LinkedHashMap
;
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
;
48 * @author Matthew Khouzam
50 public class OffsetTraceHandler
extends AbstractHandler
{
52 // ------------------------------------------------------------------------
54 // ------------------------------------------------------------------------
57 public Object
execute(final ExecutionEvent event
) throws ExecutionException
{
59 ISelection selection
= HandlerUtil
.getCurrentSelection(event
);
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());
75 } else if (element
instanceof TmfTraceFolder
) {
76 TmfTraceFolder folder
= (TmfTraceFolder
) element
;
77 traceElements
.addAll(folder
.getTraces());
82 if (traceElements
.isEmpty()) {
86 final Map
<TmfTraceElement
, Long
> offsets
= new LinkedHashMap
<>(traceElements
.size());
87 for (TmfTraceElement trace
: traceElements
) {
88 offsets
.put(trace
, 0L);
91 Shell shell
= HandlerUtil
.getActiveShellChecked(event
);
92 OffsetDialog dialog
= new OffsetDialog(shell
, offsets
);
95 if (dialog
.getReturnCode() != Window
.OK
) {
99 TmfWorkspaceModifyOperation operation
= new TmfWorkspaceModifyOperation() {
101 public void execute(IProgressMonitor monitor
) throws CoreException
{
102 for (final TmfTraceElement trace
: offsets
.keySet()) {
103 if (monitor
.isCanceled()) {
104 throw new OperationCanceledException();
106 Long offset
= offsets
.get(trace
);
107 if (offset
!= 0 && trace
.getResource().exists()) {
108 Display
.getDefault().syncExec(new Runnable() {
111 trace
.closeEditors();
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();
126 PlatformUI
.getWorkbench().getProgressService().run(true, true, operation
);
127 } catch (InterruptedException e
) {
129 } catch (InvocationTargetException e
) {
130 MessageDialog
.openError(shell
, e
.toString(), e
.getTargetException().toString());