private void remove() {
    final SimpleNode[] nodes = myTree.getSelectedNodesIfUniform();
    for (final SimpleNode node : nodes) {

      if (node instanceof FileSetNode) {
        final OfbizFileSet fileSet = ((FileSetNode) node).mySet;
        if (fileSet.getFiles().isEmpty()) {
          myBuffer.remove(fileSet);
          return;
        }

        final int result =
            Messages.showYesNoDialog(
                myPanel,
                String.format("Remove File Set '%s' ?", fileSet.getName()),
                "Confirm removal",
                Messages.getQuestionIcon());
        if (result == DialogWrapper.OK_EXIT_CODE) {
          if (fileSet.isAutodetected()) {
            fileSet.setRemoved(true);
            myBuffer.add(fileSet);
          } else {
            myBuffer.remove(fileSet);
          }
        }
      } else if (node instanceof ConfigFileNode) {
        final VirtualFilePointer filePointer = ((ConfigFileNode) node).myFilePointer;
        final OfbizFileSet fileSet = ((FileSetNode) node.getParent()).mySet;
        fileSet.removeFile(filePointer);
      }
    }
  }
 private void selectFileSet(final OfbizFileSet fileSet) {
   myTree.select(
       myBuilder,
       new SimpleNodeVisitor() {
         public boolean accept(final SimpleNode simpleNode) {
           if (simpleNode instanceof FileSetNode) {
             if (((FileSetNode) simpleNode).mySet.equals(fileSet)) {
               return true;
             }
           }
           return false;
         }
       },
       false);
 }
 @Nullable
 private FileSetNode getCurrentFileSetNode() {
   final SimpleNode selectedNode = myTree.getSelectedNode();
   if (selectedNode == null) {
     return null;
   }
   if (selectedNode instanceof FileSetNode) {
     return (FileSetNode) selectedNode;
   } else if (selectedNode.getParent() instanceof FileSetNode) {
     return (FileSetNode) selectedNode.getParent();
   } else {
     final SimpleNode parent = selectedNode.getParent();
     if (parent != null && parent.getParent() instanceof FileSetNode) {
       return (FileSetNode) selectedNode.getParent().getParent();
     }
   }
   return null;
 }
  public ComponentFileSetConfigurationTab(
      @NotNull final OfbizFacetConfiguration strutsFacetConfiguration,
      @NotNull final FacetEditorContext facetEditorContext) {
    originalConfiguration = strutsFacetConfiguration;
    module = facetEditorContext.getModule();
    myConfigsSercher = new OfbizComponentConfigsSearcher(module);

    // init tree
    final SimpleTreeStructure structure =
        new SimpleTreeStructure() {
          public Object getRootElement() {
            return myRootNode;
          }
        };
    myTree.setRootVisible(false);
    myTree.setShowsRootHandles(true); // show expand/collapse handles
    myBuilder =
        new SimpleTreeBuilder(myTree, (DefaultTreeModel) myTree.getModel(), structure, null);
    myBuilder.initRoot();

    final DumbService dumbService = DumbService.getInstance(facetEditorContext.getProject());
    myTree
        .getSelectionModel()
        .addTreeSelectionListener(
            new TreeSelectionListener() {
              public void valueChanged(final TreeSelectionEvent e) {
                final OfbizFileSet fileSet = getCurrentFileSet();
                myEditButton.setEnabled(fileSet != null && !dumbService.isDumb());
                myRemoveButton.setEnabled(fileSet != null);
              }
            });

    myAddSetButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(final ActionEvent e) {
            final OfbizFileSet fileSet =
                new OfbizFileSet(
                    OfbizFileSet.getUniqueId(myBuffer),
                    OfbizFileSet.getUniqueName("My Component Fileset", myBuffer),
                    originalConfiguration) {
                  public boolean isNew() {
                    return true;
                  }
                };

            final FileSetEditor editor =
                new FileSetEditor(myPanel, fileSet, facetEditorContext, myConfigsSercher);
            editor.show();
            if (editor.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
              final OfbizFileSet editedFileSet = editor.getEditedFileSet();
              Disposer.register(strutsFacetConfiguration, editedFileSet);
              myBuffer.add(editedFileSet);
              myModified = true;
              myBuilder.updateFromRoot();
              selectFileSet(fileSet);
            }
            myTree.requestFocus();
          }
        });

    myEditButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(final ActionEvent e) {
            final OfbizFileSet fileSet = getCurrentFileSet();
            if (fileSet != null) {
              final FileSetEditor editor =
                  new FileSetEditor(myPanel, fileSet, facetEditorContext, myConfigsSercher);
              editor.show();
              if (editor.getExitCode() == DialogWrapper.OK_EXIT_CODE) {
                myModified = true;
                myBuffer.remove(fileSet);
                final OfbizFileSet edited = editor.getEditedFileSet();
                Disposer.register(strutsFacetConfiguration, edited);
                myBuffer.add(edited);
                edited.setAutodetected(false);
                myBuilder.updateFromRoot();
                selectFileSet(edited);
              }
              myTree.requestFocus();
            }
          }
        });

    myRemoveButton.addActionListener(
        new ActionListener() {
          public void actionPerformed(final ActionEvent e) {
            remove();
            myModified = true;
            myBuilder.updateFromRoot();
            myTree.requestFocus();
          }
        });

    dumbService.makeDumbAware(myAddSetButton, this);
    dumbService.makeDumbAware(myEditButton, this);
  }