/*******************************************************************************
* Copyright (c) 2011 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.te.ui.views.workingsets;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.tm.te.runtime.events.EventManager;
import org.eclipse.tm.te.ui.events.AbstractEventListener;
import org.eclipse.tm.te.ui.views.events.ViewerContentChangeEvent;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.IWorkingSetUpdater;
import org.eclipse.ui.navigator.CommonViewer;
/**
* Working set element updater implementation.
*/
public class WorkingSetElementUpdater extends AbstractEventListener implements IWorkingSetUpdater, IExecutableExtension {
// List of working sets managed by this updater
private final List<IWorkingSet> workingSets = new ArrayList<IWorkingSet>();
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement, java.lang.String, java.lang.Object)
*/
@Override
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
// Register ourself as ViewContentChangeEvent listener
EventManager.getInstance().addEventListener(this, ViewerContentChangeEvent.class);
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#add(org.eclipse.ui.IWorkingSet)
*/
@Override
public void add(IWorkingSet workingSet) {
synchronized (workingSets) {
workingSets.add(workingSet);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#remove(org.eclipse.ui.IWorkingSet)
*/
@Override
public boolean remove(IWorkingSet workingSet) {
synchronized (workingSets) {
return workingSets.remove(workingSet);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#contains(org.eclipse.ui.IWorkingSet)
*/
@Override
public boolean contains(IWorkingSet workingSet) {
synchronized (workingSets) {
return workingSets.contains(workingSet);
}
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkingSetUpdater#dispose()
*/
@Override
public void dispose() {
synchronized (workingSets) {
workingSets.clear();
}
// Remove ourself as event listener
EventManager.getInstance().removeEventListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.tm.te.runtime.interfaces.events.IEventListener#eventFired(java.util.EventObject)
*/
@Override
public void eventFired(EventObject event) {
if (!(event instanceof ViewerContentChangeEvent) && !(((ViewerContentChangeEvent)event).getSource() instanceof CommonViewer)) {
return;
}
// Create a snapshot of the working sets
final IWorkingSet[] snapshot;
synchronized (workingSets) {
snapshot = workingSets.toArray(new IWorkingSet[workingSets.size()]);
}
// Update the working sets
onUpdateWorkingSets((CommonViewer)((ViewerContentChangeEvent)event).getSource(), snapshot);
}
/**
* Update the managed working sets based on the content of the given viewer.
*
* @param viewer The viewer. Must not be <code>null</code>.
* @param workingsets The working sets. Must not be <code>null</code>.
*/
protected void onUpdateWorkingSets(CommonViewer viewer, IWorkingSet[] workingsets) {
Assert.isNotNull(viewer);
Assert.isNotNull(workingsets);
}
}