At the moment, only the events table will be refreshed.
Change-Id: I7b9933d8e52e7e7fc821a3b41f1e688bf4c81d09
Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/57137
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceContext;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTraceProperties;
}
+ private void initFile() throws TmfTraceException {
+ closeFile();
+ try {
+ fFileInput = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
+ } catch (IOException e) {
+ throw new TmfTraceException(e.getMessage(), e);
+ }
+ }
+
+ private void closeFile() {
+ if (fFileInput != null) {
+ try {
+ fFileInput.close();
+ } catch (IOException e) {
+ } finally {
+ fFileInput = null;
+ }
+ }
+ }
+
@Override
public IStatus validate(IProject project, String path) {
File file = new File(path);
super.dispose();
}
+ @TmfSignalHandler
+ @Override
+ public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+ if (signal.getTrace() == this) {
+ try {
+ synchronized (this) {
+ // Reset the file handle in case it has reached the end of the
+ // file already. Otherwise, it will not be able to read new data
+ // pass the previous end.
+ initFile();
+ }
+ } catch (TmfTraceException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ }
+ }
+ super.traceRangeUpdated(signal);
+ }
}
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceDefinition.InputLine;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
@Override
public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
super.initTrace(resource, path, eventType);
+ initFile();
+ }
+
+ private void initFile() throws TmfTraceException {
+ closeFile();
try {
fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
} catch (IOException e) {
@Override
public synchronized void dispose() {
super.dispose();
+ closeFile();
+ }
+
+ private void closeFile() {
if (fFile != null) {
try {
fFile.close();
}
return traceTypeId;
}
+
+ @TmfSignalHandler
+ @Override
+ public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+ if (signal.getTrace() == this) {
+ try {
+ synchronized (this) {
+ // Reset the file handle in case it has reached the end of the
+ // file already. Otherwise, it will not be able to read new data
+ // pass the previous end.
+ initFile();
+ }
+ } catch (TmfTraceException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ }
+ }
+ super.traceRangeUpdated(signal);
+ }
}
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.TmfContext;
@Override
public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType) throws TmfTraceException {
super.initTrace(resource, path, eventType);
+ initFile();
+ }
+
+ private void initFile() throws TmfTraceException {
+ closeFile();
try {
fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
} catch (IOException e) {
@Override
public synchronized void dispose() {
super.dispose();
+ closeFile();
+ }
+
+ private void closeFile() {
if (fFile != null) {
try {
fFile.close();
}
return traceTypeId;
}
+
+ @TmfSignalHandler
+ @Override
+ public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+ if (signal.getTrace() == this) {
+ try {
+ synchronized (this) {
+ // Reset the file handle in case it has reached the end of the
+ // file already. Otherwise, it will not be able to read new data
+ // pass the previous end.
+ initFile();
+ }
+ } catch (TmfTraceException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ }
+ }
+ super.traceRangeUpdated(signal);
+ }
}
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.io.BufferedRandomAccessFile;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
@Override
public void initTrace(IResource resource, String path, Class<? extends ITmfEvent> type) throws TmfTraceException {
super.initTrace(resource, path, type);
+ initFile();
+ }
+
+ private void initFile() throws TmfTraceException {
+ closeFile();
try {
fFile = new BufferedRandomAccessFile(getPath(), "r"); //$NON-NLS-1$
} catch (IOException e) {
@Override
public synchronized void dispose() {
super.dispose();
+ closeFile();
+ }
+
+ private void closeFile() {
if (fFile != null) {
try {
fFile.close();
public ITmfLocation restoreLocation(ByteBuffer bufferIn) {
return new TmfLongLocation(bufferIn);
}
+
+ @TmfSignalHandler
+ @Override
+ public void traceRangeUpdated(TmfTraceRangeUpdatedSignal signal) {
+ if (signal.getTrace() == this) {
+ try {
+ synchronized (this) {
+ // Reset the file handle in case it has reached the end of the
+ // file already. Otherwise, it will not be able to read new data
+ // pass the previous end.
+ initFile();
+ }
+ } catch (TmfTraceException e) {
+ Activator.logError(e.getLocalizedMessage(), e);
+ }
+ }
+ super.traceRangeUpdated(signal);
+ }
}
commands.uml2sd.showstart = Show node start
commands.uml2sd.showstart.description = Show the node start
+commands.sync.refresh.tracecontent = Refresh
</with>
</visibleWhen>
</command>
+ <command
+ commandId="org.eclipse.ui.file.refresh"
+ label="%commands.sync.refresh.tracecontent"
+ style="push">
+ <visibleWhen
+ checkEnabled="false">
+ <or>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <or>
+ <and>
+ <instanceof
+ value="org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement">
+ </instanceof>
+ <not>
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.linuxtools.tmf.ui.isExperimentTrace">
+ </test>
+ </not>
+ </and>
+ </or>
+ </iterate>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor">
+ </instanceof>
+ </with>
+ </or>
+ </visibleWhen>
+ </command>
</menuContribution>
<menuContribution
allPopups="false"
</with>
</activeWhen>
</handler>
+ <handler
+ class="org.eclipse.tracecompass.internal.tmf.ui.project.handlers.RefreshTraceContentHandler"
+ commandId="org.eclipse.ui.file.refresh">
+ <activeWhen>
+ <or>
+ <iterate
+ ifEmpty="false"
+ operator="and">
+ <or>
+ <and>
+ <instanceof
+ value="org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement">
+ </instanceof>
+ <not>
+ <test
+ forcePluginActivation="true"
+ property="org.eclipse.linuxtools.tmf.ui.isExperimentTrace">
+ </test>
+ </not>
+ </and>
+ </or>
+ </iterate>
+ <with
+ variable="activePart">
+ <instanceof
+ value="org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor">
+ </instanceof>
+ </with>
+ </or>
+ </activeWhen>
+ </handler>
</extension>
<extension point="org.eclipse.ui.bindings">
<key
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2015 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Marc-Andre Laperle - Initial API and implementation.
+ *******************************************************************************/
+package org.eclipse.tracecompass.internal.tmf.ui.project.handlers;
+
+import java.util.Iterator;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceRangeUpdatedSignal;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
+import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
+import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Refresh the content of a trace in order to see new events.
+ */
+public class RefreshTraceContentHandler extends AbstractHandler {
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+
+ // Get the selection
+ ISelection selection = HandlerUtil.getCurrentSelection(event);
+ if (!(selection instanceof IStructuredSelection)) {
+ return null;
+ }
+ final Iterator<Object> iterator = ((IStructuredSelection) selection).iterator();
+
+ while (iterator.hasNext()) {
+ Object element = iterator.next();
+ if (element instanceof TmfTraceElement) {
+ TmfTraceElement trace = (TmfTraceElement) element;
+ refreshTrace(trace);
+
+ } else if (element instanceof TmfTraceFolder) {
+ TmfTraceFolder tmfTraceFolder = (TmfTraceFolder) element;
+ for (TmfTraceElement e : tmfTraceFolder.getTraces()) {
+ refreshTrace(e);
+ }
+ } else if (element instanceof ITmfEvent) {
+ ITmfEvent iTmfEvent = (ITmfEvent) element;
+ refreshTrace(iTmfEvent.getTrace());
+ }
+ }
+ return null;
+ }
+
+ private static void refreshTrace(TmfTraceElement t) {
+ final TmfTraceElement traceElement = t.getElementUnderTraceFolder();
+ ITmfTrace trace = traceElement.getTrace();
+ refreshTrace(trace);
+ }
+
+ private static void refreshTrace(ITmfTrace trace) {
+ TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
+ TmfTraceRangeUpdatedSignal signal = new TmfTraceRangeUpdatedSignal(trace, trace, range);
+ trace.broadcastAsync(signal);
+ }
+
+}
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IGotoMarker;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.views.properties.IPropertySheetPage;
/* change the input to a FileEditorInput to allow open handlers to find this editor */
super.setInput(new FileEditorInput(fFile));
createAndInitializeTable();
+ // The table was swapped for a new one, make sure it gets focus if
+ // the editor is active. Otherwise, the new table will not get focus
+ // because the editor already had focus.
+ if (!PlatformUI.getWorkbench().isClosing() && PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart() == getSite().getPart()) {
+ fEventsTable.setFocus();
+ }
fParent.layout();
}
}
if (fTrace != null) {
setPartName(fTrace.getName());
fEventsTable = createEventsTable(fParent, fTrace.getCacheSize());
+ fEventsTable.registerContextMenus(getSite());
fEventsTable.setColumnOrder(TmfTraceColumnManager.loadColumnOrder(fTrace.getTraceTypeId()));
fEventsTable.addSelectionChangedListener(this);
fEventsTable.setTrace(fTrace, true);
import org.eclipse.tracecompass.tmf.ui.views.filter.FilterManager;
import org.eclipse.tracecompass.tmf.ui.widgets.rawviewer.TmfRawEventViewer;
import org.eclipse.tracecompass.tmf.ui.widgets.virtualtable.TmfVirtualTable;
+import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.dialogs.ListDialog;
fTable.setFocus();
}
+ /**
+ * Registers context menus with a site for extension. This method can be
+ * called for part sites so that context menu contributions can be added.
+ *
+ * @param site
+ * the site that the context menus will be registered for
+ *
+ * @since 2.0
+ */
+ public void registerContextMenus(IWorkbenchPartSite site) {
+ if (site instanceof IEditorSite) {
+ IEditorSite editorSite = (IEditorSite) site;
+ // Don't use the editor input when adding contributions, otherwise
+ // we get too many unwanted things.
+ editorSite.registerContextMenu(fTablePopupMenuManager, this, false);
+ }
+ }
+
/**
* Assign a new trace to this event table.
*