package org.netbeans.gradle.project;
import java.beans.PropertyChangeListener;
import java.util.concurrent.atomic.AtomicReference;
import javax.swing.Icon;
import org.jtrim.property.PropertyFactory;
import org.jtrim.property.PropertySource;
import org.jtrim.swing.concurrent.SwingTaskExecutor;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectInformation;
import org.netbeans.gradle.project.properties.SwingPropertyChangeForwarder;
public final class GradleProjectInformation implements ProjectInformation {
private final NbGradleProject project;
private final AtomicReference<SwingPropertyChangeForwarder> changeListenersRef;
public GradleProjectInformation(NbGradleProject project) {
this.project = project;
this.changeListenersRef = new AtomicReference<>(null);
}
private SwingPropertyChangeForwarder getChangeListeners() {
SwingPropertyChangeForwarder result = changeListenersRef.get();
if (result == null) {
SwingPropertyChangeForwarder.Builder combinedListeners
= new SwingPropertyChangeForwarder.Builder(SwingTaskExecutor.getStrictExecutor(false));
PropertySource<String> displayName = PropertyFactory.lazilyNotifiedSource(project.getDisplayInfo().displayName());
combinedListeners.addProperty(PROP_DISPLAY_NAME, displayName);
result = combinedListeners.create();
if (!changeListenersRef.compareAndSet(null, result)) {
result = changeListenersRef.get();
}
}
return result;
}
@Override
public Icon getIcon() {
return NbIcons.getGradleIconAsIcon();
}
@Override
public String getName() {
return project.getName();
}
@Override
public String getDisplayName() {
return project.getDisplayInfo().displayName().getValue();
}
@Override
public void addPropertyChangeListener(PropertyChangeListener pcl) {
getChangeListeners().addPropertyChangeListener(pcl);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener pcl) {
getChangeListeners().removePropertyChangeListener(pcl);
}
@Override
public Project getProject() {
return project;
}
}