Wednesday Dec 26, 2012

File Browser

import java.awt.BorderLayout;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ActionMap;
import javax.swing.text.DefaultEditorKit;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.ExplorerUtils;
import org.openide.explorer.view.BeanTreeView;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.util.NbBundle;
import org.openide.windows.TopComponent;

@TopComponent.Description(
        preferredID = "FileBrowserTopComponent",
        persistenceType = TopComponent.PERSISTENCE_ALWAYS)
@TopComponent.Registration(
        mode = "explorer", 
        openAtStartup = true)
@ActionID(
        category = "Window", 
        id = "com.mycompany.FileBrowserTopComponent")
@ActionReference(
        path = "Menu/Window")
@TopComponent.OpenActionRegistration(
        displayName = "#CTL_FileBrowserTopComponentAction",
        preferredID = "FileBrowserTopComponent")
@NbBundle.Messages({
    "CTL_FileBrowserTopComponentAction=Open File Browser",
    "CTL_FileBrowserTopComponent=File Browser",
})
public class FileBrowserTopComponent extends TopComponent implements ExplorerManager.Provider  {
 
    private ExplorerManager mgr = new ExplorerManager();

    public FileBrowserTopComponent() throws DataObjectNotFoundException {
        setDisplayName(Bundle.CTL_FileBrowserTopComponent());
        setLayout(new BorderLayout());
        add(new BeanTreeView(), BorderLayout.CENTER);
        File file = new File(System.getProperty("user.home"));
        FileObject fo = FileUtil.toFileObject(FileUtil.normalizeFile(file));
        DataObject dob = DataObject.find(fo);
        Node rootNode = dob.getNodeDelegate();
        mgr.setRootContext(new FileFilterNode(rootNode));
        ActionMap map = this.getActionMap();
        map.put(DefaultEditorKit.copyAction, ExplorerUtils.actionCopy(mgr));
        map.put(DefaultEditorKit.cutAction, ExplorerUtils.actionCut(mgr));
        map.put(DefaultEditorKit.pasteAction, ExplorerUtils.actionPaste(mgr));
        map.put("delete", ExplorerUtils.actionDelete(mgr, true)); // or false
        associateLookup(ExplorerUtils.createLookup(mgr, map));
    }

    @Override
    public ExplorerManager getExplorerManager() {
        return mgr;
    }
 
    public class FileFilterNode extends FilterNode {
        public FileFilterNode(Node original) {
            super(original, new FileFilterNodeChildren(original));
        }
        //Override e.g., icons here...
    }

    public class FileFilterNodeChildren extends FilterNode.Children {
        public FileFilterNodeChildren(Node original) {
            super(original);
        }
        @Override
        protected Node[] createNodes(Node object) {
            List<Node> result = new ArrayList<Node>();
            for (Node node : super.createNodes(object)) {
                if (accept(node)) {
                    result.add(node);
                }
            }
            return result.toArray(new Node[0]);
        }
        //Example filter for children, e.g., don't include if folder:
        private boolean accept(Node node) {
            return node.getLookup().lookup(DataFolder.class) == null;
        }
    }
 
}

Thanks to Tim Boudreau for help with the above.

About

Geertjan Wielenga (@geertjanw) is a Principal Product Manager in the Oracle Developer Tools group living & working in Amsterdam. He is a Java technology enthusiast, evangelist, trainer, speaker, and writer. He blogs here daily.

The focus of this blog is mostly on NetBeans (a development tool primarily for Java programmers), with an occasional reference to NetBeans, and sometimes diverging to topics relating to NetBeans. And then there are days when NetBeans is mentioned, just for a change.

Search

Archives
« December 2012 »
SunMonTueWedThuFriSat
      
1
15
23
24
25
29
     
Today