blob: d798b879b1147de48e1166977b0ab66fea5a2ad8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2012 Tasktop Technologies and others.
* 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:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.context.ui.state;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
import org.eclipse.mylyn.internal.context.ui.IContextUiPreferenceContstants;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Saves the active perspective on context deactivation and restores it on activation.
*
* @author Mik Kersten
* @author Shawn Minto
* @author Steffen Pingel
*/
public class PerspectiveStateParticipant extends ContextStateParticipant {
public static final String KEY_ACTIVE_ID = "activeId"; //$NON-NLS-1$
public static final String MEMENTO_PERSPECTIVE = "org.eclipse.mylyn.context.ui.perspectives"; //$NON-NLS-1$
private final IPreferenceStore preferenceStore;
public PerspectiveStateParticipant(IPreferenceStore preferenceStore) {
this.preferenceStore = preferenceStore;
}
@Override
public void clearState(String contextHandle, boolean isActiveContext) {
// ignore
}
public String getActivePerspectiveId() {
if (PlatformUI.isWorkbenchRunning()) {
IWorkbenchWindow launchingWindow = getWorkbenchWindow();
if (launchingWindow != null) {
return getActivePerspectiveId(launchingWindow);
}
}
return null;
}
public IWorkbenchWindow getWorkbenchWindow() {
if (PlatformUI.isWorkbenchRunning()) {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null) {
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
if (windows.length > 0) {
window = windows[0];
}
}
return window;
}
return null;
}
@Override
public boolean isEnabled() {
return ContextUiPlugin.getDefault()
.getPreferenceStore()
.getBoolean(IContextUiPreferenceContstants.AUTO_MANAGE_PERSPECTIVES);
}
@Override
public void restoreDefaultState(ContextState memento) {
String previousPerspectiveId = getDefaultPerspectiveId();
showPerspective(previousPerspectiveId);
}
@Override
public void restoreState(ContextState state) {
IWorkbenchWindow launchingWindow = getWorkbenchWindow();
if (launchingWindow != null) {
// restore perspective
IMemento memento = state.getMemento(MEMENTO_PERSPECTIVE);
if (memento != null) {
String perspectiveId = memento.getString(KEY_ACTIVE_ID);
showPerspective(perspectiveId);
}
}
}
@Override
public void saveDefaultState(ContextState memento) {
String id = getActivePerspectiveId();
if (id != null) {
setDefaultPerspectiveId(id);
}
}
@Override
public void saveState(ContextState state, boolean allowModifications) {
String id = getActivePerspectiveId();
if (id != null) {
IMemento memento = state.createMemento(MEMENTO_PERSPECTIVE);
memento.putString(KEY_ACTIVE_ID, id);
}
}
private String getActivePerspectiveId(IWorkbenchWindow window) {
Assert.isNotNull(window);
IPerspectiveDescriptor descriptor = window.getActivePage().getPerspective();
return descriptor.getId();
}
private String getDefaultPerspectiveId() {
return preferenceStore.getString(IContextUiPreferenceContstants.PERSPECTIVE_NO_ACTIVE_TASK);
}
private void setDefaultPerspectiveId(String perspectiveId) {
preferenceStore.setValue(IContextUiPreferenceContstants.PERSPECTIVE_NO_ACTIVE_TASK, perspectiveId);
}
private void showPerspective(String perspectiveId) {
if (perspectiveId != null && perspectiveId.length() > 0) {
IWorkbenchWindow launchingWindow = getWorkbenchWindow();
if (launchingWindow != null) {
try {
launchingWindow.getShell().setRedraw(false);
PlatformUI.getWorkbench().showPerspective(perspectiveId, launchingWindow);
} catch (Exception e) {
// perspective's preserved id not found, ignore
} finally {
launchingWindow.getShell().setRedraw(true);
}
}
}
}
}