package net.java.nboglpack.glslcompiler.actions;
import net.java.nboglpack.glslcompiler.GLSLCompilerService;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.nodes.Node;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.actions.NodeAction;
/**
* Created on 6. March 2007, 15:48
* @author Michael Bien
*/
public final class LinkShaderAction extends NodeAction {
protected void performAction(Node[] activatedNodes) {
DataObject[] daos = new DataObject[activatedNodes.length];
for(int i = 0; i < activatedNodes.length; i++)
daos[i] = activatedNodes[i].getLookup().lookup(DataObject.class);
GLSLCompilerService compiler = Lookup.getDefault().lookup(GLSLCompilerService.class);
compiler.compileAndLinkProgram(daos, true);
}
protected boolean enable(Node[] nodes) {
// just one fragment, vertex, and geometry shader can be linked together to a program
if(nodes.length > 3)
return false;
DataObject[] daos = new DataObject[nodes.length];
boolean containsFragmentFile = false;
boolean containsVertexFile = false;
boolean containsGeometryFile = false;
for (int i = 0; i < daos.length; i++) {
daos[i] = nodes[i].getLookup().lookup(DataObject.class);
if(daos[i] == null)
return false;
String mimeType = FileUtil.getMIMEType(daos[i].getPrimaryFile());
if(mimeType == null)
return false;
if(mimeType.equals("text/x-glsl-vertex-shader")){
if(containsVertexFile)
return false;
containsVertexFile = true;
}else if(mimeType.equals("text/x-glsl-fragment-shader")) {
if(containsFragmentFile)
return false;
containsFragmentFile = true;
}else if(mimeType.equals("text/x-glsl-geometry-shader")) {
if(containsGeometryFile)
return false;
containsGeometryFile = true;
}else{
return false;
}
}
return true;
}
public String getName() {
return NbBundle.getMessage(LinkShaderAction.class, "CTL_LinkShaderAction");
}
@Override
protected void initialize() {
super.initialize();
// see org.openide.util.actions.SystemAction.iconResource() javadoc for more details
putValue("noIconInMenu", Boolean.TRUE);
}
public HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
@Override
protected boolean asynchronous() {
return false;
}
}