blob: 1cb94748cfec3df1aa269888314ee729d5decf17 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2016, 2017 EfficiOS Inc. and others
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.tracecompass.tmf.ui.views;
import java.text.MessageFormat;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.ITmfImageConstants;
import org.eclipse.tracecompass.internal.tmf.ui.Messages;
import org.eclipse.tracecompass.internal.tmf.ui.project.model.TmfEditorLinkHelper;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfCommonProjectElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfOpenTraceHelper.OpenProjectElementJob;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.part.FileEditorInput;
/**
* Action to instantiate a new instance of views that support it.
* @author Jonathan Rajotte Julien
* @since 3.2
*/
public class NewTmfViewAction extends Action {
private final @NonNull String fViewId;
private final @Nullable ITmfTrace fPinnedTrace;
private final boolean fNewInstance;
/**
* Creates an action that opens a new view.
*
* @param view
* The view for which the action is created
*/
public NewTmfViewAction(TmfView view) {
super(MessageFormat.format(Messages.TmfView_NewViewActionText, view.getTitle()));
setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_NEW_VIEW));
fViewId = view.getViewId();
fPinnedTrace = null;
fNewInstance = false;
}
/**
* Creates an action that opens a new pinnable view, optionally pinned.
*
* @param view
* The view for which the action is created
* @param pinnedTrace
* The trace to which the view should be pinned, or null for unpinned
*/
public NewTmfViewAction(TmfView view, ITmfTrace pinnedTrace) {
super();
if (pinnedTrace == null) {
setText(Messages.TmfView_NewViewActionUnpinnedText);
setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_UNPINNED_VIEW));
} else {
setText(MessageFormat.format(Messages.TmfView_NewViewActionPinnedText, TmfTraceManager.getInstance().getTraceUniqueName(pinnedTrace)));
setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PIN_VIEW));
}
fViewId = view.getViewId();
fPinnedTrace = pinnedTrace;
fNewInstance = false;
}
/**
* Creates an action that opens a new pinned view, optionally on a new instance
* of the specified trace.
*
* @param view
* The view for which the action is created
* @param pinnedTrace
* The trace to which the view should be pinned
* @param newInstance
* true if a new instance of the pinned trace should be used
*/
public NewTmfViewAction(TmfView view, @NonNull ITmfTrace pinnedTrace, boolean newInstance) {
super(MessageFormat.format(Messages.TmfView_NewViewActionPinnedNewInstanceText, pinnedTrace.getName()));
setImageDescriptor(Activator.getDefault().getImageDescripterFromPath(ITmfImageConstants.IMG_UI_PIN_VIEW));
fViewId = view.getViewId();
fPinnedTrace = pinnedTrace;
fNewInstance = newInstance;
}
@Override
public void run() {
ITmfTrace pinnedTrace = fPinnedTrace;
if (fNewInstance) {
if (pinnedTrace == null) {
return;
}
/* We need to wait for the trace to be opened before opening the view */
IFile file = TmfTraceManager.getInstance().getTraceContext(pinnedTrace).getEditorFile();
Object element = new TmfEditorLinkHelper().findSelection(new FileEditorInput(file)).getFirstElement();
if (element instanceof TmfCommonProjectElement) {
OpenProjectElementJob openJob = new OpenProjectElementJob((TmfCommonProjectElement) element, file);
openJob.schedule();
Thread waitThread = new Thread() {
@Override
public void run() {
while (!TmfTraceManager.getInstance().getOpenedTraces().contains(openJob.getTrace())) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
Display.getDefault().asyncExec(() -> {
IViewPart view = TmfViewFactory.newView(fViewId, true);
if (view instanceof ITmfPinnable) {
((ITmfPinnable) view).setPinned(openJob.getTrace());
}
});
}
};
waitThread.start();
}
return;
}
IViewPart view = TmfViewFactory.newView(fViewId, true);
if (pinnedTrace != null && view instanceof ITmfPinnable) {
((ITmfPinnable) view).setPinned(pinnedTrace);
}
}
}