public void selectTool(final String actionId) {
   Object root = myTree.getModel().getRoot();
   if (root == null || !(root instanceof CheckedTreeNode)) {
     return;
   }
   final List<CheckedTreeNode> nodes = new ArrayList<CheckedTreeNode>();
   new Object() {
     @SuppressWarnings("unchecked")
     public void collect(CheckedTreeNode node) {
       if (node.isLeaf()) {
         Object userObject = node.getUserObject();
         if (userObject instanceof Tool && actionId.equals(((Tool) userObject).getActionId())) {
           nodes.add(node);
         }
       } else {
         for (int i = 0; i < node.getChildCount(); i++) {
           final TreeNode child = node.getChildAt(i);
           if (child instanceof CheckedTreeNode) {
             collect((CheckedTreeNode) child);
           }
         }
       }
     }
   }.collect((CheckedTreeNode) root);
   if (nodes.isEmpty()) {
     return;
   }
   myTree.getSelectionModel().setSelectionPath(new TreePath(nodes.get(0).getPath()));
 }
 private void insertNewTool(final Tool newTool, boolean setSelection) {
   CheckedTreeNode groupNode = findGroupNode(newTool.getGroup());
   if (groupNode == null) {
     groupNode = insertNewGroup(new ToolsGroup(newTool.getGroup()));
     nodeWasInserted(groupNode);
   }
   CheckedTreeNode tool = insertNewTool(groupNode, newTool);
   if (setSelection) {
     TreePath treePath = new TreePath(tool.getPath());
     myTree.expandPath(treePath);
     myTree.getSelectionModel().setSelectionPath(treePath);
   }
   myIsModified = true;
 }
 private CheckedTreeNode getSelectedNode() {
   TreePath selectionPath = myTree.getSelectionPath();
   if (selectionPath != null) {
     return (CheckedTreeNode) selectionPath.getLastPathComponent();
   }
   return null;
 }
 private void removeSelected() {
   CheckedTreeNode node = getSelectedToolNode();
   if (node != null) {
     int result =
         Messages.showYesNoDialog(
             this,
             ToolsBundle.message("tools.delete.confirmation"),
             CommonBundle.getWarningTitle(),
             Messages.getWarningIcon());
     if (result != 0) {
       return;
     }
     myIsModified = true;
     if (node.getUserObject() instanceof Tool) {
       Tool tool = (Tool) node.getUserObject();
       CheckedTreeNode parentNode = (CheckedTreeNode) node.getParent();
       ((ToolsGroup) parentNode.getUserObject()).removeElement(tool);
       removeNodeFromParent(node);
       if (parentNode.getChildCount() == 0) {
         removeNodeFromParent(parentNode);
       }
     } else if (node.getUserObject() instanceof ToolsGroup) {
       removeNodeFromParent(node);
     }
     update();
     myTree.requestFocus();
   }
 }
  private void update() {
    CheckedTreeNode node = getSelectedToolNode();
    Tool selectedTool = getSelectedTool();
    ToolsGroup selectedGroup = getSelectedToolGroup();

    if (selectedTool != null) {
      myAddButton.setEnabled(true);
      myCopyButton.setEnabled(true);
      myEditButton.setEnabled(true);
      myMoveDownButton.setEnabled(isMovingAvailable(node, Direction.DOWN));
      myMoveUpButton.setEnabled(isMovingAvailable(node, Direction.UP));
      myRemoveButton.setEnabled(true);
    } else if (selectedGroup != null) {
      myAddButton.setEnabled(true);
      myCopyButton.setEnabled(false);
      myEditButton.setEnabled(false);
      myMoveDownButton.setEnabled(isMovingAvailable(node, Direction.DOWN));
      myMoveUpButton.setEnabled(isMovingAvailable(node, Direction.UP));
      myRemoveButton.setEnabled(true);
    } else {
      myAddButton.setEnabled(true);
      myCopyButton.setEnabled(false);
      myEditButton.setEnabled(false);
      myMoveDownButton.setEnabled(false);
      myMoveUpButton.setEnabled(false);
      myRemoveButton.setEnabled(false);
    }

    (getModel()).nodeStructureChanged(null);

    myTree.repaint();
  }
 private void moveNode(final Direction direction) {
   CheckedTreeNode node = getSelectedNode();
   if (node != null) {
     if (isMovingAvailable(node, direction)) {
       moveNode(node, direction);
       if (node.getUserObject() instanceof Tool) {
         ToolsGroup group = (ToolsGroup) (((CheckedTreeNode) node.getParent()).getUserObject());
         Tool tool = (Tool) node.getUserObject();
         moveElementInsideGroup(tool, group, direction);
       }
       TreePath path = new TreePath(node.getPath());
       myTree.getSelectionModel().setSelectionPath(path);
       myTree.expandPath(path);
       myTree.requestFocus();
     }
   }
 }
  void reset() {
    ToolsGroup[] groups = ToolManager.getInstance().getGroups();

    for (ToolsGroup group : groups) {
      insertNewGroup((ToolsGroup) group.copy());
    }

    if ((getTreeRoot()).getChildCount() > 0) {
      myTree.setSelectionInterval(0, 0);
    } else {
      myTree.getSelectionModel().clearSelection();
    }
    (getModel()).nodeStructureChanged(null);

    TreeUtil.expand(myTree, 5);

    myIsModified = false;

    update();
  }
 @Nullable
 Tool getSingleSelectedTool() {
   final TreePath[] selectionPaths = myTree.getSelectionPaths();
   if (selectionPaths == null || selectionPaths.length != 1) {
     return null;
   }
   Object toolOrToolGroup =
       ((CheckedTreeNode) selectionPaths[0].getLastPathComponent()).getUserObject();
   if (toolOrToolGroup instanceof Tool) {
     return (Tool) toolOrToolGroup;
   }
   return null;
 }
  private ToolsGroup[] getGroupList() {
    ArrayList<ToolsGroup> result = new ArrayList<ToolsGroup>();
    MutableTreeNode root = (MutableTreeNode) myTree.getModel().getRoot();
    for (int i = 0; i < root.getChildCount(); i++) {
      final CheckedTreeNode node = (CheckedTreeNode) root.getChildAt(i);
      for (int j = 0; j < node.getChildCount(); j++) {
        final CheckedTreeNode toolNode = (CheckedTreeNode) node.getChildAt(j);
        ((Tool) toolNode.getUserObject()).setEnabled(toolNode.isChecked());
      }

      result.add((ToolsGroup) node.getUserObject());
    }

    return result.toArray(new ToolsGroup[result.size()]);
  }
  ToolsPanel() {

    myTree =
        new CheckboxTree(
            new CheckboxTree.CheckboxTreeCellRenderer() {
              public void customizeRenderer(
                  final JTree tree,
                  final Object value,
                  final boolean selected,
                  final boolean expanded,
                  final boolean leaf,
                  final int row,
                  final boolean hasFocus) {
                if (!(value instanceof CheckedTreeNode)) return;
                Object object = ((CheckedTreeNode) value).getUserObject();

                if (object instanceof ToolsGroup) {
                  final String groupName = ((ToolsGroup) object).getName();
                  if (groupName != null) {
                    getTextRenderer()
                        .append(groupName, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
                  } else {
                    getTextRenderer()
                        .append("[unnamed group]", SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
                  }
                } else if (object instanceof Tool) {
                  getTextRenderer()
                      .append(
                          ((Tool) object).getName(), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
                }
              }
            },
            new CheckedTreeNode(null)) {
          @Override
          protected void onDoubleClick(final CheckedTreeNode node) {
            editSelected();
          }

          @Override
          protected void onNodeStateChanged(final CheckedTreeNode node) {
            myIsModified = true;
          }
        };

    myTree.setRootVisible(false);
    myTree.getEmptyText().setText(ToolsBundle.message("tools.not.configured"));
    myTree.setSelectionModel(new DefaultTreeSelectionModel());
    myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);

    setLayout(new BorderLayout());
    add(
        ToolbarDecorator.createDecorator(myTree)
            .setAddAction(
                new AnActionButtonRunnable() {
                  @Override
                  public void run(AnActionButton button) {
                    ToolEditorDialog dlg = new ToolEditorDialog(ToolsPanel.this);
                    Tool tool = new Tool();
                    tool.setUseConsole(true);
                    tool.setFilesSynchronizedAfterRun(true);
                    tool.setShownInMainMenu(true);
                    tool.setShownInEditor(true);
                    tool.setShownInProjectViews(true);
                    tool.setShownInSearchResultsPopup(true);
                    tool.setEnabled(true);
                    dlg.setData(tool, getGroups());
                    dlg.show();
                    if (dlg.isOK()) {
                      insertNewTool(dlg.getData(), true);
                    }
                    myTree.requestFocus();
                  }
                })
            .setRemoveAction(
                new AnActionButtonRunnable() {
                  @Override
                  public void run(AnActionButton button) {
                    removeSelected();
                  }
                })
            .setEditAction(
                new AnActionButtonRunnable() {
                  @Override
                  public void run(AnActionButton button) {
                    editSelected();
                    myTree.requestFocus();
                  }
                })
            .setMoveUpAction(
                new AnActionButtonRunnable() {
                  @Override
                  public void run(AnActionButton button) {
                    moveNode(Direction.UP);
                    myIsModified = true;
                  }
                })
            .setMoveDownAction(
                new AnActionButtonRunnable() {
                  @Override
                  public void run(AnActionButton button) {
                    moveNode(Direction.DOWN);
                    myIsModified = true;
                  }
                })
            .addExtraAction(
                myCopyButton =
                    new AnActionButton(
                        ToolsBundle.message("tools.copy.button"), PlatformIcons.COPY_ICON) {
                      @Override
                      public void actionPerformed(AnActionEvent e) {
                        Tool originalTool = getSelectedTool();

                        if (originalTool != null) {
                          ToolEditorDialog dlg = new ToolEditorDialog(ToolsPanel.this);
                          Tool toolCopy = new Tool();
                          toolCopy.copyFrom(originalTool);
                          dlg.setData(toolCopy, getGroups());
                          dlg.show();
                          if (dlg.isOK()) {
                            insertNewTool(dlg.getData(), true);
                          }
                          myTree.requestFocus();
                        }
                      }
                    })
            .setButtonComparator("Add", "Copy", "Edit", "Remove", "Up", "Down")
            .createPanel(),
        BorderLayout.CENTER);

    myAddButton = ToolbarDecorator.findAddButton(this);
    myEditButton = ToolbarDecorator.findEditButton(this);
    myRemoveButton = ToolbarDecorator.findRemoveButton(this);
    myMoveUpButton = ToolbarDecorator.findUpButton(this);
    myMoveDownButton = ToolbarDecorator.findDownButton(this);

    // TODO check edit and delete

    myTree
        .getSelectionModel()
        .addTreeSelectionListener(
            new TreeSelectionListener() {
              public void valueChanged(TreeSelectionEvent e) {
                update();
              }
            });
  }
 private DefaultTreeModel getModel() {
   return (DefaultTreeModel) myTree.getModel();
 }
 private CheckedTreeNode getTreeRoot() {
   return (CheckedTreeNode) myTree.getModel().getRoot();
 }
 void addSelectionListener(TreeSelectionListener listener) {
   myTree.getSelectionModel().addTreeSelectionListener(listener);
 }