blob: 4502a6af71cf55b0b7cd1c314c806a2f9aabe4ac [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2011 See4sys 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:
* See4sys - Initial API and implementation
*
* </copyright>
*/
package org.eclipse.sphinx.xtendxpand.ui.outlet.providers;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
import org.eclipse.sphinx.xtendxpand.outlet.ExtendedOutlet;
import org.eclipse.sphinx.xtendxpand.preferences.OutletsPreference;
import org.eclipse.xpand2.output.Outlet;
public class OutletProvider implements IPreferenceChangeListener {
private IProject project;
private OutletsPreference outletsPreference;
private Set<ExtendedOutlet> allOutlets;
private Set<ExtendedOutlet> unappliedOutlets;
public OutletProvider(OutletsPreference outletPreference) {
this(null, outletPreference);
}
public OutletProvider(IProject project, OutletsPreference outletsPreference) {
Assert.isNotNull(outletsPreference);
this.project = project;
this.outletsPreference = outletsPreference;
allOutlets = new HashSet<ExtendedOutlet>();
unappliedOutlets = new HashSet<ExtendedOutlet>();
allOutlets.addAll(outletsPreference.get(project));
if (project != null) {
outletsPreference.addPreferenceChangeListenerToProject(project, this);
}
}
public IProject getProject() {
return project;
}
public void setProject(IProject project) {
this.project = project;
}
public Set<ExtendedOutlet> getOutlets() {
return Collections.unmodifiableSet(allOutlets);
}
public ExtendedOutlet getDefaultOutlet() {
for (ExtendedOutlet outlet : getOutlets()) {
if (outlet.getName() == null) {
return outlet;
}
}
return null;
}
public Set<ExtendedOutlet> getNamedOutlets() {
Set<ExtendedOutlet> result = getOutlets();
Outlet defaultOutlet = getDefaultOutlet();
if (defaultOutlet != null) {
result.remove(defaultOutlet);
}
return Collections.unmodifiableSet(result);
}
public void addOutlet(ExtendedOutlet outlet) {
unappliedOutlets.add(outlet);
allOutlets.add(outlet);
}
public void removeOutlet(ExtendedOutlet outlet) {
unappliedOutlets.remove(outlet);
allOutlets.remove(outlet);
}
public void setToDefault() {
unappliedOutlets.clear();
allOutlets.clear();
allOutlets.addAll(outletsPreference.getDefaultValueAsObject());
}
public synchronized void store() {
// Unapplied outlets must be cleared before setting the preference into the project or the workspace, otherwise
// newly added outlets will be duplicated.
unappliedOutlets.clear();
if (project != null) {
outletsPreference.setInProject(project, getOutlets());
} else {
outletsPreference.setInWorkspace(getOutlets());
}
}
@Override
public void preferenceChange(PreferenceChangeEvent event) {
if (outletsPreference.getKey().equals(event.getKey())) {
updateOutlets();
}
}
protected void updateOutlets() {
allOutlets.clear();
allOutlets.addAll(outletsPreference.get(project));
allOutlets.addAll(unappliedOutlets);
}
public void dispose() {
if (project != null) {
outletsPreference.removePreferenceChangeListenerFromProject(project, this);
}
allOutlets.clear();
unappliedOutlets.clear();
}
}