/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.netbeans.gradle.javaee.web.nodes;
import org.netbeans.gradle.javaee.web.WebModuleExtension;
import org.netbeans.gradle.project.api.event.NbListenerRef;
import org.netbeans.gradle.project.api.nodes.GradleProjectExtensionNodes;
import org.netbeans.gradle.project.api.nodes.ManualRefreshedNodes;
import org.netbeans.gradle.project.api.nodes.SingleNodeFactory;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataFolder;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import java.util.List;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.gradle.javaee.web.ModelReloadListener;
import org.netbeans.gradle.javaee.models.NbWebModel;
import org.netbeans.gradle.project.api.event.NbListenerRefs;
import org.openide.util.ChangeSupport;
/**
*
* @author Ed
*/
@ManualRefreshedNodes
public class WebModuleExtensionNodes implements GradleProjectExtensionNodes, ModelReloadListener {
private static final Logger LOGGER = Logger.getLogger(WebModuleExtensionNodes.class.getName());
private final WebModuleExtension webModule;
private final ChangeSupport nodeChanges;
public WebModuleExtensionNodes(WebModuleExtension webModule) {
this.webModule = webModule;
this.nodeChanges = new ChangeSupport(this);
}
private static boolean hasChanged(NbWebModel prevModel, NbWebModel newModel) {
if (prevModel == newModel) {
return false;
}
if (prevModel == null || newModel == null) {
return true;
}
return !Objects.equals(prevModel.getWebAppDir(), newModel.getWebAppDir());
}
@Override
public void onModelChange(NbWebModel prevModel, NbWebModel newModel) {
if (hasChanged(prevModel, newModel)) {
nodeChanges.fireChange();
}
}
@Override
public NbListenerRef addNodeChangeListener(final Runnable listener) {
final ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
listener.run();
}
};
nodeChanges.addChangeListener(changeListener);
return NbListenerRefs.fromRunnable(new Runnable() {
@Override
public void run() {
nodeChanges.removeChangeListener(changeListener);
}
});
}
@Override
public List<SingleNodeFactory> getNodeFactories() {
List<SingleNodeFactory> returnValue = new java.util.LinkedList<>();
addWebDir(returnValue);
return returnValue;
}
private void addWebDir(List<SingleNodeFactory> list) {
FileObject webDir = webModule.getWebDir();
LOGGER.log(Level.FINEST, "webDir = {0}", webDir);
if (webDir != null) {
final DataFolder listedFolder = DataFolder.findFolder(webDir);
LOGGER.log(Level.FINEST, "listedFolder = {0}", listedFolder);
list.add(new SingleNodeFactory() {
@Override
public Node createNode() {
return new FilterNode(listedFolder.getNodeDelegate().cloneNode()) {
@Override
public String getDisplayName() {
return "Web Pages";
}
};
}
});
}
}
}