blob: d607c5e144d59f96618b283eefd7fd83965221ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2019 IBM Corporation 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
*
* Contributors:
* IBM Corporation - initial API and implementation
* Patrick Tasse - extracted code from org.eclipse.debug.ui plug-in
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.perspectives;
import java.text.MessageFormat;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.ITmfUIPreferences;
import org.eclipse.tracecompass.internal.tmf.ui.Messages;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceTypeUIUtils;
import org.eclipse.tracecompass.tmf.ui.project.model.TraceUtils;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
/**
* The perspective manager manages the 'perspective' setting defined in the
* 'tracetypeui' extension point. Specifically it:
* <ul>
* <li>manages the user preference to allow perspective switch
* <li>changes to the associated perspective when a trace is opened
* </ul>
*/
public class TmfPerspectiveManager {
private static TmfPerspectiveManager fInstance;
/**
* Flag used to indicate that the user is already being prompted to
* switch perspectives. This flag allows us to not open multiple
* prompts at the same time.
*/
private boolean fPrompting;
/**
* Constructor
*/
public TmfPerspectiveManager() {
TmfSignalManager.register(this);
}
/**
* Initializes the perspective manager.
*/
public static synchronized void init() {
if (fInstance == null) {
fInstance = new TmfPerspectiveManager();
}
}
/**
* Disposes the perspective manager.
*/
public static synchronized void dispose() {
if (fInstance != null) {
TmfSignalManager.deregister(fInstance);
fInstance = null;
}
}
/**
* Signal handler for the traceOpened signal.
*
* @param signal
* The incoming signal
*/
@TmfSignalHandler
public synchronized void traceOpened(final TmfTraceOpenedSignal signal) {
Display.getDefault().asyncExec(() -> {
String id = TmfTraceTypeUIUtils.getPerspectiveId(signal.getTrace());
if (id == null) {
/*
* For experiments, switch only if all traces have the same
* associated perspective id.
*/
for (ITmfTrace trace : TmfTraceManager.getTraceSet(signal.getTrace())) {
String perspectiveId = TmfTraceTypeUIUtils.getPerspectiveId(trace);
if (id != null && !id.equals(perspectiveId)) {
return;
}
id = perspectiveId;
}
}
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (id != null && window != null && shouldSwitchPerspective(window, id, ITmfUIPreferences.SWITCH_TO_PERSPECTIVE)) {
switchToPerspective(window, id);
}
});
}
/**
* Returns whether or not the user wishes to switch to the specified
* perspective when a launch occurs.
*
* @param perspectiveName
* the name of the perspective that will be presented to the user
* for confirmation if they've asked to be prompted about
* perspective switching
* @param message
* a message to be presented to the user. This message is
* expected to contain a slot for the perspective name to be
* inserted ("{0}").
* @param preferenceKey
* the preference key of the perspective switching preference
* @return whether or not the user wishes to switch to the specified
* perspective automatically
*/
private boolean shouldSwitchPerspective(IWorkbenchWindow window, String perspectiveId, String preferenceKey) {
if (isCurrentPerspective(window, perspectiveId)) {
return false;
}
IPerspectiveDescriptor perspective = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
String perspectiveName = (perspective == null) ? null : perspective.getLabel();
if (perspectiveName == null) {
return false;
}
String switchPerspective = Activator.getDefault().getPreferenceStore().getString(preferenceKey);
if (MessageDialogWithToggle.ALWAYS.equals(switchPerspective)) {
return true;
} else if (MessageDialogWithToggle.NEVER.equals(switchPerspective)) {
return false;
}
Shell shell= window.getShell();
if (shell == null || fPrompting) {
return false;
}
fPrompting = true;
MessageDialogWithToggle dialog = MessageDialogWithToggle.openYesNoQuestion(
shell,
Messages.TmfPerspectiveManager_SwitchPerspectiveDialogTitle,
MessageFormat.format(Messages.TmfPerspectiveManager_SwitchPerspectiveDialogMessage, perspectiveName),
null,
false,
Activator.getDefault().getPreferenceStore(),
preferenceKey);
boolean answer = (dialog.getReturnCode() == IDialogConstants.YES_ID);
synchronized (this) {
fPrompting= false;
notifyAll();
}
if (isCurrentPerspective(window, perspectiveId)) {
answer = false;
}
return answer;
}
/**
* Returns whether the given perspective identifier matches the identifier
* of the current perspective.
*
* @param window
* the workbench window
*
* @param perspectiveId
* the identifier
* @return whether the given perspective identifier matches the identifier
* of the current perspective
*/
private static boolean isCurrentPerspective(IWorkbenchWindow window, String perspectiveId) {
boolean isCurrent= false;
if (window != null) {
IWorkbenchPage page = window.getActivePage();
if (page != null) {
IPerspectiveDescriptor perspectiveDescriptor = page.getPerspective();
if (perspectiveDescriptor != null) {
isCurrent= perspectiveId.equals(perspectiveDescriptor.getId());
}
}
}
return isCurrent;
}
/**
* Switches to the specified perspective.
*
* @param window
* the workbench window
* @param id
* perspective identifier
*/
protected void switchToPerspective(IWorkbenchWindow window, String id) {
try {
window.getWorkbench().showPerspective(id, window);
} catch (WorkbenchException e) {
TraceUtils.displayErrorMsg(
Messages.TmfPerspectiveManager_SwitchPerspectiveErrorTitle,
Messages.TmfPerspectiveManager_SwitchPerspectiveErrorMessage,
e);
}
}
}