/*******************************************************************************
* Copyright (c) 2006, 2008 Wind River Systems, Inc. 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:
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.ui.viewsupport;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetManager;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkingSetFilterActionGroup;
import org.eclipse.cdt.core.model.ICElement;
/**
* Wraps {@link WorkingSetFilterActionGroup} and handles the property changed
* events
*/
public abstract class WorkingSetFilterUI {
private IPropertyChangeListener fWorkingSetListener;
private IWorkingSet fWorkingSet;
WorkingSetFilterActionGroup fWorkingSetFilterGroup;
private IViewPart fViewPart;
private WorkingSetFilter fWorkingSetFilter= null;
private IWorkingSetManager fWSManager;
public WorkingSetFilterUI(IViewPart viewPart, IMemento memento, String key) {
fWSManager= PlatformUI.getWorkbench().getWorkingSetManager();
fViewPart= viewPart;
if (memento != null) {
memento= memento.getChild(key);
if (memento != null) {
IWorkingSet ws= fWSManager.createWorkingSet(memento);
if (ws != null) {
fWorkingSet= fWSManager.getWorkingSet(ws.getName());
if (fWorkingSet == null) {
fWorkingSet= ws;
fWSManager.addWorkingSet(ws);
}
}
}
}
fWorkingSetListener = new IPropertyChangeListener() {
public void propertyChange(org.eclipse.jface.util.PropertyChangeEvent event) {
onWorkingSetPropertyChange(event);
}
};
fWSManager.addPropertyChangeListener(fWorkingSetListener);
IPropertyChangeListener workingSetUpdater = new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
onWorkingSetFilterUpdate(event);
}
};
fWorkingSetFilterGroup= new WorkingSetFilterActionGroup(fViewPart.getSite().getShell(), workingSetUpdater);
fWorkingSetFilterGroup.setWorkingSet(fWorkingSet);
}
public void dispose() {
fWSManager.removePropertyChangeListener(fWorkingSetListener);
fWorkingSetFilterGroup.dispose();
}
private void applyWorkingSetFilter() {
if (fWorkingSet == null) {
fWorkingSetFilter = null;
}
else {
fWorkingSetFilter = new WorkingSetFilter();
fWorkingSetFilter.setWorkingSet(fWorkingSet);
}
}
protected void onWorkingSetPropertyChange(PropertyChangeEvent evt) {
if (fWorkingSet == null) {
return;
}
boolean doRefresh = false;
String propertyName = evt.getProperty();
Object newValue = evt.getNewValue();
Object oldValue = evt.getOldValue();
if (propertyName.equals(IWorkingSetManager.CHANGE_WORKING_SET_CONTENT_CHANGE)) {
if (fWorkingSet == newValue) { // weired, but this is how it works
doRefresh = true;
}
}
else if (propertyName.equals(IWorkingSetManager.CHANGE_WORKING_SET_NAME_CHANGE)) {
if (fWorkingSet == newValue) {
onWorkingSetNameChange();
}
}
else if (propertyName.equals(IWorkingSetManager.CHANGE_WORKING_SET_REMOVE)) {
if (fWorkingSet == oldValue) {
fWorkingSet = null;
doRefresh = true;
}
}
if (doRefresh) {
applyWorkingSetFilter();
onWorkingSetChange();
}
}
protected void onWorkingSetFilterUpdate(PropertyChangeEvent event) {
String property = event.getProperty();
if (WorkingSetFilterActionGroup.CHANGE_WORKING_SET.equals(property)) {
Object newValue = event.getNewValue();
if (newValue instanceof IWorkingSet) {
fWorkingSet = (IWorkingSet) newValue;
fWSManager.addRecentWorkingSet(fWorkingSet);
}
else {
fWorkingSet = null;
}
applyWorkingSetFilter();
onWorkingSetChange();
onWorkingSetNameChange();
}
}
protected abstract void onWorkingSetChange();
protected abstract void onWorkingSetNameChange();
public void fillActionBars(IActionBars actionBars) {
fWorkingSetFilterGroup.fillActionBars(actionBars);
}
public boolean isPartOfWorkingSet(ICElement element) {
if (fWorkingSetFilter == null) {
return true;
}
return fWorkingSetFilter.isPartOfWorkingSet(element);
}
public boolean isPartOfWorkingSet(IPath resourceOrExternalPath) {
if (fWorkingSetFilter == null) {
return true;
}
return fWorkingSetFilter.isPartOfWorkingSet(resourceOrExternalPath);
}
public IWorkingSet getWorkingSet() {
return fWorkingSet;
}
public void setWorkingSet(IWorkingSet workingSet) {
fWorkingSet= workingSet;
fWorkingSetFilterGroup.setWorkingSet(fWorkingSet);
}
public List<String> getRecent() {
IWorkingSet[] workingSets= fWSManager.getRecentWorkingSets();
ArrayList<String> result= new ArrayList<String>(workingSets.length);
for (int i = 0; i < workingSets.length; i++) {
result.add(workingSets[i].getName());
}
return result;
}
public void saveState(IMemento memento, String key) {
if (fWorkingSet != null) {
fWorkingSet.saveState(memento.createChild(key));
}
}
}