private VirtualFile[] getVirtualFileArray() {
   ArrayList<VirtualFile> result = new ArrayList<VirtualFile>();
   TreePath[] selectionPaths = myTree.getSelectionPaths();
   if (selectionPaths != null) {
     for (TreePath selectionPath : selectionPaths) {
       AbstractTreeNode treeNode = (AbstractTreeNode) selectionPath.getLastPathComponent();
       result.addAll(treeNode.getVirtualFiles());
     }
   }
   return VfsUtil.toVirtualFileArray(result);
 }
 @Nullable
 private File[] getFileArray() {
   ArrayList<File> result = new ArrayList<File>();
   TreePath[] selectionPaths = myTree.getSelectionPaths();
   if (selectionPaths != null) {
     for (TreePath selectionPath : selectionPaths) {
       AbstractTreeNode treeNode = (AbstractTreeNode) selectionPath.getLastPathComponent();
       result.addAll(treeNode.getFiles());
     }
   }
   if (result.isEmpty()) return null;
   return result.toArray(new File[result.size()]);
 }
 public static Object extractUserObject(DefaultMutableTreeNode node) {
   Object userObject = node.getUserObject();
   Object element = null;
   if (userObject instanceof AbstractTreeNode) {
     AbstractTreeNode descriptor = (AbstractTreeNode) userObject;
     element = descriptor.getValue();
   } else if (userObject instanceof NodeDescriptor) {
     NodeDescriptor descriptor = (NodeDescriptor) userObject;
     element = descriptor.getElement();
     if (element instanceof AbstractTreeNode) {
       element = ((AbstractTreeNode) element).getValue();
     }
   } else if (userObject != null) {
     element = userObject;
   }
   return element;
 }
 @Nullable
 protected final Object getParentValue() {
   AbstractTreeNode parent = getParent();
   return parent == null ? null : parent.getValue();
 }