/*******************************************************************************
* Copyright (c) 2007 Spring IDE Developers
* 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:
* Spring IDE Developers - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.ui.workingsets.actions;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.IExtensionActivationListener;
import org.eclipse.ui.navigator.IExtensionStateModel;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.springframework.ide.eclipse.ui.workingsets.WorkingSetsViewerFilter;
import org.springframework.ide.eclipse.ui.workingsets.WorkingSetContentProvider;
/**
* @author Christian Dupuis
* @since 2.0
*/
public class WorkingSetActionProvider extends CommonActionProvider {
private static final String TAG_CURRENT_WORKING_SET_NAME = "currentWorkingSetName"; //$NON-NLS-1$
private boolean contributedToViewMenu = false;
private boolean ready = false;
private StructuredViewer viewer;
private INavigatorContentService contentService;
private WorkingSetFilterActionGroup workingSetActionGroup;
private WorkingSetRootModeActionGroup workingSetRootModeActionGroup;
private Object originalViewerInput = ResourcesPlugin.getWorkspace()
.getRoot();
private IExtensionStateModel extensionStateModel;
private WorkingSetsViewerFilter workingSetFilter = null;
public class WorkingSetManagerListener implements IPropertyChangeListener {
private boolean listening = false;
public void propertyChange(PropertyChangeEvent event) {
Object input = viewer.getInput();
if (input instanceof IWorkingSet) {
IWorkingSet workingSet = (IWorkingSet) input;
String property = event.getProperty();
Object newValue = event.getNewValue();
Object oldValue = event.getOldValue();
if (IWorkingSetManager.CHANGE_WORKING_SET_REMOVE
.equals(property)
&& oldValue == workingSet) {
if (viewer != null) {
viewer.setInput(originalViewerInput);
}
}
else if (IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE
.equals(property)
&& newValue == workingSet) {
}
else if (IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE
.equals(property)
&& newValue == workingSet) {
if (viewer != null) {
viewer.refresh();
}
}
}
}
/**
* Begin listening to the correct source if not already listening.
*/
public synchronized void listen() {
if (!listening) {
PlatformUI.getWorkbench().getWorkingSetManager()
.addPropertyChangeListener(managerChangeListener);
listening = true;
}
}
/**
* Begin listening to the correct source if not already listening.
*/
public synchronized void ignore() {
if (listening) {
PlatformUI.getWorkbench().getWorkingSetManager()
.removePropertyChangeListener(managerChangeListener);
listening = false;
}
}
}
private IPropertyChangeListener filterChangeListener = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
IWorkingSet oldWorkingSet = (IWorkingSet) event.getOldValue();
IWorkingSet newWorkingSet = (IWorkingSet) event.getNewValue();
if (newWorkingSet != null
&& !contentService
.isActive(WorkingSetContentProvider.EXTENSION_ID)) {
contentService
.getActivationService()
.activateExtensions(
new String[] { WorkingSetContentProvider.EXTENSION_ID },
false);
contentService.getActivationService()
.persistExtensionActivations();
}
if (viewer != null) {
if (newWorkingSet == null) {
workingSetFilter.setWorkingSet(null);
viewer.setInput(ResourcesPlugin.getWorkspace().getRoot());
}
else if (oldWorkingSet != newWorkingSet) {
workingSetFilter.setWorkingSet(newWorkingSet);
viewer.setInput(newWorkingSet);
}
}
}
};
private WorkingSetManagerListener managerChangeListener = new WorkingSetManagerListener();
private IExtensionActivationListener activationListener = new IExtensionActivationListener() {
private IWorkingSet workingSet;
public void onExtensionActivation(String aViewerId,
String[] theNavigatorExtensionIds, boolean isActive) {
for (int i = 0; i < theNavigatorExtensionIds.length; i++) {
if (WorkingSetContentProvider.EXTENSION_ID
.equals(theNavigatorExtensionIds[i])) {
if (isActive) {
extensionStateModel = contentService
.findStateModel(WorkingSetContentProvider.EXTENSION_ID);
workingSetRootModeActionGroup
.setStateModel(extensionStateModel);
if (workingSet != null) {
viewer.setInput(workingSet);
workingSetActionGroup.setWorkingSet(workingSet);
workingSetFilter.setWorkingSet(workingSet);
workingSetRootModeActionGroup
.setShowTopLevelWorkingSets(true);
}
managerChangeListener.listen();
}
else {
Object input = viewer.getInput();
if (input instanceof IWorkingSet) {
workingSet = (IWorkingSet) input;
if (viewer != null && input != originalViewerInput) {
viewer.setInput(originalViewerInput);
}
workingSetFilter.setWorkingSet(workingSet);
}
else {
workingSet = null;
workingSetFilter.setWorkingSet(null);
}
managerChangeListener.ignore();
workingSetActionGroup.setWorkingSet(null);
workingSetRootModeActionGroup
.setShowTopLevelWorkingSets(false);
}
}
}
}
};
public void init(ICommonActionExtensionSite aSite) {
viewer = aSite.getStructuredViewer();
workingSetFilter = new WorkingSetsViewerFilter();
viewer.addFilter(workingSetFilter);
contentService = aSite.getContentService();
extensionStateModel = contentService
.findStateModel(WorkingSetContentProvider.EXTENSION_ID);
workingSetActionGroup = new WorkingSetFilterActionGroup(aSite
.getViewSite().getShell(), filterChangeListener);
if (extensionStateModel != null) {
workingSetRootModeActionGroup = new WorkingSetRootModeActionGroup(
viewer, extensionStateModel);
}
if (contentService.isActive(WorkingSetContentProvider.EXTENSION_ID)) {
managerChangeListener.listen();
}
contentService.getActivationService().addExtensionActivationListener(
activationListener);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.navigator.CommonActionProvider#restoreState(org.eclipse.ui.IMemento)
*/
public void restoreState(IMemento aMemento) {
super.restoreState(aMemento);
boolean showWorkingSets = true;
if (aMemento != null) {
Integer showWorkingSetsInt = aMemento
.getInteger(WorkingSetContentProvider.SHOW_TOP_LEVEL_WORKING_SETS);
showWorkingSets = showWorkingSetsInt == null
|| showWorkingSetsInt.intValue() == 1;
extensionStateModel.setBooleanProperty(
WorkingSetContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
showWorkingSets);
workingSetRootModeActionGroup
.setShowTopLevelWorkingSets(showWorkingSets);
if (viewer != null) {
String lastWorkingSetName = aMemento
.getString(TAG_CURRENT_WORKING_SET_NAME);
IWorkingSetManager workingSetManager = PlatformUI
.getWorkbench().getWorkingSetManager();
IWorkingSet lastWorkingSet = workingSetManager
.getWorkingSet(lastWorkingSetName);
viewer.setInput(lastWorkingSet);
workingSetFilter.setWorkingSet(lastWorkingSet);
workingSetActionGroup.setWorkingSet(lastWorkingSet);
}
ready = true;
}
}
public void saveState(IMemento aMemento) {
super.saveState(aMemento);
if (aMemento != null) {
int showWorkingSets = extensionStateModel
.getBooleanProperty(WorkingSetContentProvider.SHOW_TOP_LEVEL_WORKING_SETS) ? 1
: 0;
aMemento.putInteger(
WorkingSetContentProvider.SHOW_TOP_LEVEL_WORKING_SETS,
showWorkingSets);
if (viewer != null) {
Object input = viewer.getInput();
if (input instanceof IWorkingSet) {
IWorkingSet workingSet = (IWorkingSet) input;
aMemento.putString(TAG_CURRENT_WORKING_SET_NAME, workingSet
.getName());
}
}
}
}
public void fillActionBars(IActionBars actionBars) {
if (ready) {
if (!contributedToViewMenu) {
try {
super.fillActionBars(actionBars);
workingSetActionGroup.fillActionBars(actionBars);
if (workingSetRootModeActionGroup != null) {
workingSetRootModeActionGroup
.fillActionBars(actionBars);
}
}
finally {
contributedToViewMenu = true;
}
}
}
}
public void dispose() {
super.dispose();
workingSetActionGroup.dispose();
if (workingSetRootModeActionGroup != null) {
workingSetRootModeActionGroup.dispose();
}
managerChangeListener.ignore();
contentService.getActivationService()
.removeExtensionActivationListener(activationListener);
}
}