blob: 867f98435eb88f5fc6a8715300b7ffdffa5f5221 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.activities.ActivityManagerEvent;
import org.eclipse.ui.activities.IActivity;
import org.eclipse.ui.activities.IActivityManager;
import org.eclipse.ui.activities.IActivityManagerListener;
import org.eclipse.ui.activities.IActivityRequirementBinding;
import org.eclipse.ui.activities.IWorkbenchActivitySupport;
import org.eclipse.ui.activities.NotDefinedException;
/**
* Utility class that manages the persistance of enabled activities.
*
* @since 3.0
*/
final class ActivityPersistanceHelper {
/**
* Prefix for all activity preferences
*/
protected final static String PREFIX = "UIActivities."; //$NON-NLS-1$
/**
* Singleton instance.
*/
private static ActivityPersistanceHelper singleton;
/**
* The listener that responds to changes in the <code>IActivityManager</code>
*/
private final IActivityManagerListener activityManagerListener = new IActivityManagerListener() {
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.activities.IActivityManagerListener#activityManagerChanged(org.eclipse.ui.activities.ActivityManagerEvent)
*/
public void activityManagerChanged(
ActivityManagerEvent activityManagerEvent) {
//process newly defined activities.
if (activityManagerEvent.haveDefinedActivityIdsChanged()) {
Set delta = new HashSet(activityManagerEvent
.getActivityManager().getDefinedActivityIds());
delta.removeAll(activityManagerEvent
.getPreviouslyDefinedActivityIds());
// whatever is still in delta are new activities - restore their
// state
loadEnabledStates(activityManagerEvent
.getActivityManager().getEnabledActivityIds(), delta);
}
if (activityManagerEvent.haveEnabledActivityIdsChanged()) {
saveEnabledStates();
}
}
};
/**
* The listener that responds to preference changes
*/
private final IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent event) {
// dont process property events if we're in the process of
// serializing state.
if (!saving && event.getProperty().startsWith(PREFIX)) {
String activityId = event.getProperty().substring(PREFIX.length());
IWorkbenchActivitySupport support = PlatformUI.getWorkbench().getActivitySupport();
IActivityManager activityManager = support.getActivityManager();
boolean enabled = Boolean.valueOf(event.getNewValue().toString()).booleanValue();
// if we're turning an activity off we'll need to create its dependency tree to ensuure that all dependencies are also disabled.
Set set = new HashSet(activityManager.getEnabledActivityIds());
if (enabled == false) {
Set dependencies = buildDependencies(activityManager, activityId);
set.removeAll(dependencies);
}
else {
set.add(activityId);
}
support.setEnabledActivityIds(set);
}
}
};
/**
* Whether we are currently saving the state of activities to the preference
* store.
*/
protected boolean saving = false;
/**
* Get the singleton instance of this class.
*
* @return the singleton instance of this class.
*/
public static ActivityPersistanceHelper getInstance() {
if (singleton == null) {
singleton = new ActivityPersistanceHelper();
}
return singleton;
}
/**
* Returns a set of activity IDs that depend on the provided ID in order to be enabled.
*
* @param activityManager the activity manager to query
* @param activityId the activity whos dependencies should be added
* @return a set of activity IDs
*/
protected Set buildDependencies(IActivityManager activityManager, String activityId) {
Set set = new HashSet();
for (Iterator i = activityManager.getDefinedActivityIds().iterator(); i.hasNext(); ) {
IActivity activity = activityManager.getActivity((String) i.next());
for (Iterator j = activity.getActivityRequirementBindings().iterator(); j.hasNext(); ) {
IActivityRequirementBinding binding = (IActivityRequirementBinding) j.next();
if (activityId.equals(binding.getRequiredActivityId())) {
set.addAll(buildDependencies(activityManager, activity.getId()));
}
}
}
set.add(activityId);
return set;
}
/**
* Create a new <code>ActivityPersistanceHelper</code> which will restore
* previously enabled activity states.
*/
private ActivityPersistanceHelper() {
loadEnabledStates();
hookListeners();
}
/**
* Hook the listener that will respond to any activity state changes.
*/
private void hookListeners() {
IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
.getActivitySupport();
IActivityManager activityManager = support.getActivityManager();
activityManager.addActivityManagerListener(activityManagerListener);
IPreferenceStore store = WorkbenchPlugin.getDefault()
.getPreferenceStore();
store.addPropertyChangeListener(propertyChangeListener);
}
/**
* Hook the listener that will respond to any activity state changes.
*/
private void unhookListeners() {
IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
.getActivitySupport();
IActivityManager activityManager = support.getActivityManager();
activityManager.removeActivityManagerListener(activityManagerListener);
IPreferenceStore store = WorkbenchPlugin.getDefault()
.getPreferenceStore();
store.removePropertyChangeListener(propertyChangeListener);
}
/**
* Create the preference key for the activity.
*
* @param activityId the activity id.
* @return String a preference key representing the activity.
*/
private String createPreferenceKey(String activityId) {
return PREFIX + activityId;
}
/**
* Loads the enabled states from the preference store.
*/
void loadEnabledStates() {
loadEnabledStates(Collections.EMPTY_SET, PlatformUI.getWorkbench()
.getActivitySupport().getActivityManager()
.getDefinedActivityIds());
}
/**
* Load the enabled states for the given activity IDs.
*
* @param previouslyEnabledActivities the activity states to maintain. This set must be writabe.
* @param activityIdsToProcess the activity ids to process
*/
protected void loadEnabledStates(Set previouslyEnabledActivities, Set activityIdsToProcess) {
if (activityIdsToProcess.isEmpty()) {
return;
}
Set enabledActivities = new HashSet(previouslyEnabledActivities);
IPreferenceStore store = WorkbenchPlugin.getDefault()
.getPreferenceStore();
IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
.getActivitySupport();
IActivityManager activityManager = support.getActivityManager();
for (Iterator i = activityIdsToProcess.iterator(); i
.hasNext();) {
String activityId = (String) i.next();
String preferenceKey = createPreferenceKey(activityId);
try {
IActivity activity = activityManager.getActivity(activityId);
if (store.isDefault(preferenceKey)
&& !store.contains(preferenceKey)) {
store
.setDefault(preferenceKey, activity
.isDefaultEnabled());
}
} catch (NotDefinedException e) {
// can't happen - we're iterating over defined activities
}
if (store.getBoolean(preferenceKey)) {
enabledActivities.add(activityId);
} else {
enabledActivities.remove(activityId);
}
}
support.setEnabledActivityIds(enabledActivities);
}
/**
* Save the enabled states in the preference store.
*/
protected void saveEnabledStates() {
try {
saving = true;
IPreferenceStore store = WorkbenchPlugin.getDefault()
.getPreferenceStore();
IWorkbenchActivitySupport support = PlatformUI.getWorkbench()
.getActivitySupport();
IActivityManager activityManager = support.getActivityManager();
Iterator values = activityManager.getDefinedActivityIds().iterator();
while (values.hasNext()) {
IActivity activity = activityManager.getActivity((String) values
.next());
store.setValue(createPreferenceKey(activity.getId()), activity
.isEnabled());
}
WorkbenchPlugin.getDefault().savePluginPreferences();
}
finally {
saving = false;
}
}
/**
* Save the enabled state of all activities.
*/
public void shutdown() {
unhookListeners();
saveEnabledStates();
}
}