/*
* 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.convoluted.project.droid;
import java.awt.Image;
import java.beans.PropertyChangeListener;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.netbeans.api.annotations.common.StaticResource;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectInformation;
import org.netbeans.spi.project.ProjectState;
import org.netbeans.spi.project.ui.LogicalViewProvider;
import org.netbeans.spi.project.ui.support.CommonProjectActions;
import org.netbeans.spi.project.ui.support.NodeFactorySupport;
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.FilterNode;
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;
import org.openide.util.lookup.ProxyLookup;
//import org.w3c.dom.Node;
/**
*
* @author bjames
*/
public class DroidProject implements Project {
private final FileObject projectDir;
private final ProjectState state;
private Lookup lookup;
// Inner Logical View class
// defines logical view of project as shown in projects window
class DroidProjectLogicalView implements LogicalViewProvider {
@StaticResource()
public static final String DROID_ICON
= "org/convoluted/project/droid/icon.png";
private final DroidProject project;
public DroidProjectLogicalView(DroidProject project) {
this.project = project;
}
@Override
public Node createLogicalView() {
try {
//Obtain the project directory's node:
FileObject projectDirectory = project.getProjectDirectory();
DataFolder projectFolder = DataFolder.findFolder(projectDir);
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);
}
// DroidProject>DroidProjectLogicalView>ProjectNode
private final class ProjectNode extends FilterNode {
final DroidProject project;
public ProjectNode(Node node, DroidProject project)
throws DataObjectNotFoundException {
super(node,
NodeFactorySupport.createCompositeChildren(
project,
"Projects/org-convoluted-botcodestudio/Nodes"
),
//new FilterNode.Children(node),
new ProxyLookup(
new Lookup[] {
Lookups.singleton(project),
node.getLookup()
}
));
this.project = project;
}
@Override
public Action[] getActions
(boolean arg0
) {
CommonProjectActions.newFileAction(),
CommonProjectActions.copyProjectAction(),
CommonProjectActions.deleteProjectAction(),
CommonProjectActions.customizeProjectAction(),
CommonProjectActions.closeProjectAction(),
//
CommonProjectActions.renameProjectAction(),
CommonProjectActions.setAsMainProjectAction(),
CommonProjectActions.setProjectConfigurationAction()
};
}
@Override
public Image getIcon
(int type
) {
return ImageUtilities.loadImage(DROID_ICON);
}
@Override
public Image getOpenedIcon
(int type
) {
return getIcon(type);
}
@Override
public String getDisplayName
() {
return project.getProjectDirectory().getName();
}
}
@Override
public Node findPath
(Node root,
Object target
) {
//leave unimplemented for now
return null;
}
}
// Inner Info class
private final class Info implements ProjectInformation {
@StaticResource()
public static final String DROID_ICON
= "org/convoluted/project/droid/icon.png";
@Override
return new ImageIcon(ImageUtilities.
loadImage(DROID_ICON,
true));
}
@Override
return getProjectDirectory().getName();
}
@Override
public String getDisplayName
() {
return getName();
}
@Override
//do nothing, won't change
}
@Override
//do nothing, won't change
}
@Override
public Project getProject() {
return DroidProject.this;
}
}
DroidProject(FileObject dir, ProjectState state) {
//throw new UnsupportedOperationException("Not yet implemented");
this.projectDir = dir;
this.state = state;
}
@Override public FileObject getProjectDirectory() {
//throw new UnsupportedOperationException("Not supported yet.");
return projectDir;
}
@Override public Lookup getLookup() {
//throw new UnsupportedOperationException("Not supported yet.");
if (lookup == null) {
lookup
= Lookups.
fixed(new Object[] {
this,
new Info(),
new DroidProjectLogicalView(this),
new DroidCustomizerProvider(this)
});
}
return lookup;
}
}