/* * 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 nl.fontys.sofa.limo.view.project; import java.beans.PropertyChangeListener; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; import nl.fontys.sofa.limo.view.project.actions.util.SupplyDefaultCopyOperation; import nl.fontys.sofa.limo.view.project.actions.util.SupplyDefaultMoveOrRenameOperation; import nl.fontys.sofa.limo.view.project.supplychain.ChainNodeList; import org.netbeans.api.annotations.common.StaticResource; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectInformation; import org.netbeans.spi.project.ActionProvider; import org.netbeans.spi.project.DeleteOperationImplementation; import org.netbeans.spi.project.ProjectState; import org.netbeans.spi.project.ui.LogicalViewProvider; import org.netbeans.spi.project.ui.support.DefaultProjectOperations; import org.openide.filesystems.FileObject; import org.openide.loaders.DataFolder; import org.openide.loaders.DataObjectNotFoundException; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; import org.openide.nodes.Node; import org.openide.util.Exceptions; import org.openide.util.ImageUtilities; import org.openide.util.Lookup; import org.openide.util.lookup.Lookups; /** * * @author nilsh */ public class SupplyProject implements Project { private final FileObject projectDir; private final ProjectState state; private Lookup lkp; private ChainNodeList chainNodeList; public SupplyProject() { this.projectDir = null; this.state = null; } public SupplyProject(FileObject dir, ProjectState state) { this.projectDir = dir; this.state = state; } @Override public FileObject getProjectDirectory() { return projectDir; } @Override public Lookup getLookup() { if (lkp == null) { lkp = Lookups.fixed(new Object[]{ this, new Info(), new SupplyProjectLogicalView(this), new SupplyActionProvider(), new SupplyDefaultMoveOrRenameOperation(), new SupplyDefaultCopyOperation(), new SupplyProjectDeleteOperation(this) }); } return lkp; } public void addChainNodeList(ChainNodeList aThis) { chainNodeList = aThis; } public ChainNodeList getChainNodeList() { return chainNodeList; } private final class Info implements ProjectInformation { @StaticResource() public static final String CUSTOMER_ICON = "icons/ProcedureCategory_16x16.png"; @Override public Icon getIcon() { return new ImageIcon(ImageUtilities.loadImage(CUSTOMER_ICON)); } @Override public String getName() { return getProjectDirectory().getName(); } @Override public String getDisplayName() { return getName(); } @Override public void addPropertyChangeListener(PropertyChangeListener pcl) { //do nothing, won't change } @Override public void removePropertyChangeListener(PropertyChangeListener pcl) { //do nothing, won't change } @Override public Project getProject() { return SupplyProject.this; } } private class SupplyProjectLogicalView implements LogicalViewProvider { @StaticResource() public static final String CUSTOMER_ICON = "icons/ProcedureCategory_16x16.png"; private final SupplyProject project; public SupplyProjectLogicalView(SupplyProject project) { this.project = project; } @Override public Node createLogicalView() { try { //Obtain the project directory's node: FileObject projectDirectory = project.getProjectDirectory(); DataFolder projectFolder = DataFolder.findFolder(projectDirectory); Node nodeOfProjectFolder = projectFolder.getNodeDelegate(); //Decorate the project directory's node: return new ProjectNode(nodeOfProjectFolder, project); } catch (DataObjectNotFoundException donfe) { Exceptions.printStackTrace(donfe); //Fallback-the directory couldn't be created - //read-only filesystem or something evil happened return new AbstractNode(Children.LEAF); } } @Override public Node findPath(Node root, Object target) { //leave unimplemented for now return null; } } private class SupplyActionProvider implements ActionProvider { @Override public String[] getSupportedActions() { return new String[]{ ActionProvider.COMMAND_RENAME, ActionProvider.COMMAND_MOVE, ActionProvider.COMMAND_COPY, ActionProvider.COMMAND_DELETE }; } @Override public void invokeAction(String string, Lookup lkp) throws IllegalArgumentException { if (string.equalsIgnoreCase(ActionProvider.COMMAND_RENAME)) { DefaultProjectOperations.performDefaultRenameOperation( SupplyProject.this, ""); } if (string.equalsIgnoreCase(ActionProvider.COMMAND_MOVE)) { DefaultProjectOperations.performDefaultMoveOperation( SupplyProject.this); } if (string.equalsIgnoreCase(ActionProvider.COMMAND_COPY)) { DefaultProjectOperations.performDefaultCopyOperation( SupplyProject.this); } if (string.equalsIgnoreCase(ActionProvider.COMMAND_DELETE)) { DefaultProjectOperations.performDefaultDeleteOperation( SupplyProject.this); } } @Override public boolean isActionEnabled(String command, Lookup lkp) throws IllegalArgumentException { switch (command) { case ActionProvider.COMMAND_RENAME: return true; case ActionProvider.COMMAND_MOVE: return true; case ActionProvider.COMMAND_COPY: return true; case ActionProvider.COMMAND_DELETE: return true; default: break; } return false; } } private final class SupplyProjectDeleteOperation implements DeleteOperationImplementation { private final SupplyProject project; public SupplyProjectDeleteOperation(SupplyProject project) { this.project = project; } @Override public List<FileObject> getMetadataFiles() { return new ArrayList<>(); } @Override public List<FileObject> getDataFiles() { List<FileObject> files = new ArrayList<>(); FileObject[] projectChildren = project.getProjectDirectory().getChildren(); for (FileObject fileObject : projectChildren) { addFile(project.getProjectDirectory(), fileObject.getNameExt(), files); } return files; } private void addFile(FileObject projectDirectory, String fileName, List<FileObject> result) { FileObject file = projectDirectory.getFileObject(fileName); if (file != null) { result.add(file); } } @Override public void notifyDeleting() throws IOException { } @Override public void notifyDeleted() throws IOException { } } }