X
  • Thursday, December 27, 2012

File Browser

By: Geertjan Wielenga | Product Manager
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.

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.Captcha