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 editSelected() {
    CheckedTreeNode node = getSelectedToolNode();
    if (node != null && node.getUserObject() instanceof Tool) {
      Tool selected = (Tool) node.getUserObject();
      if (selected != null) {
        String oldGroupName = selected.getGroup();
        ToolEditorDialog dlg = new ToolEditorDialog(this);
        dlg.setData(selected, getGroups());
        dlg.show();
        if (dlg.isOK()) {
          selected.copyFrom(dlg.getData());
          String newGroupName = selected.getGroup();
          if (!Comparing.equal(oldGroupName, newGroupName)) {
            CheckedTreeNode oldGroupNode = (CheckedTreeNode) node.getParent();
            removeNodeFromParent(node);
            ((ToolsGroup) oldGroupNode.getUserObject()).removeElement(selected);
            if (oldGroupNode.getChildCount() == 0) {
              removeNodeFromParent(oldGroupNode);
            }

            insertNewTool(selected, true);
          } else {
            (getModel()).nodeChanged(node);
          }
          myIsModified = true;
          update();
        }
      }
    }
  }
 public void customizeCellRenderer(
     final ColoredTreeCellRenderer targetRenderer,
     CheckedTreeNode node,
     boolean selected,
     final boolean checked,
     boolean expanded,
     boolean leaf,
     boolean hasFocus) {
   targetRenderer.setIcon(PlatformIcons.PACKAGE_ICON);
   final String displayName;
   final CheckedTreeNode parent = (CheckedTreeNode) node.getParent();
   if (parent != null && parent.getUserObject() instanceof PackageDescriptor) {
     final String parentPackageInTree =
         ((PackageDescriptor) parent.getUserObject()).getPackageName() + ".";
     displayName =
         myPackageName.startsWith(parentPackageInTree)
             ? myPackageName.substring(parentPackageInTree.length())
             : myPackageName;
   } else {
     displayName = myPackageName;
   }
   targetRenderer.append(
       displayName,
       checked
           ? SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES
           : SimpleTextAttributes.GRAYED_ATTRIBUTES);
 }
 public int compare(CheckedTreeNode o1, CheckedTreeNode o2) {
   final int w1 = getWeight(o1);
   final int w2 = getWeight(o2);
   if (w1 != w2) {
     return w1 - w2;
   }
   final TreeDescriptor d1 = (TreeDescriptor) o1.getUserObject();
   final TreeDescriptor d2 = (TreeDescriptor) o2.getUserObject();
   if (d1 instanceof BreakpointDescriptor && d2 instanceof BreakpointDescriptor) {
     return 0;
   }
   return d1.getDisplayString().compareTo(d2.getDisplayString());
 }
  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()]);
  }
 private int getWeight(CheckedTreeNode node) {
   if (node.getUserObject() instanceof BreakpointDescriptor) {
     return 100;
   }
   if (node.getUserObject() instanceof MethodDescriptor) {
     return 90;
   }
   if (node.getUserObject() instanceof PackageDescriptor) {
     return 80;
   }
   if (node.getUserObject() instanceof ClassDescriptor) {
     return 70;
   }
   return 50;
 }
 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();
     }
   }
 }
 private CheckedTreeNode insertNewTool(final CheckedTreeNode groupNode, final Tool toolCopy) {
   CheckedTreeNode toolNode = new CheckedTreeNode(toolCopy);
   toolNode.setChecked(toolCopy.isEnabled());
   ((ToolsGroup) groupNode.getUserObject()).addElement(toolCopy);
   groupNode.add(toolNode);
   nodeWasInserted(toolNode);
   return toolNode;
 }
 private void rebuildTree() {
   final TreeStateSnapshot treeStateSnapshot = new TreeStateSnapshot(this);
   myRootNode.removeAllChildren();
   myDescriptorToNodeMap.clear();
   myDescriptorToNodeMap.put((TreeDescriptor) myRootNode.getUserObject(), myRootNode);
   // build tree
   for (final Breakpoint breakpoint : myBreakpoints) {
     CheckedTreeNode node = createNode(new BreakpointDescriptor(breakpoint));
     node.setChecked(breakpoint.ENABLED);
     addNode(node);
   }
   // remove all package nodes with one child
   final int count = myRootNode.getChildCount();
   final List<CheckedTreeNode> children = new ArrayList<CheckedTreeNode>();
   for (int idx = 0; idx < count; idx++) {
     CheckedTreeNode child = (CheckedTreeNode) myRootNode.getChildAt(idx);
     if (!(child.getUserObject() instanceof PackageDescriptor)) {
       children.add(child);
       continue;
     }
     while (child.getUserObject() instanceof PackageDescriptor && child.getChildCount() <= 1) {
       child = (CheckedTreeNode) child.getChildAt(0);
     }
     if (!(child.getUserObject() instanceof PackageDescriptor)) {
       child = (CheckedTreeNode) child.getParent();
     }
     for (CheckedTreeNode childToRemove = (CheckedTreeNode) child.getParent();
         !childToRemove.equals(myRootNode);
         childToRemove = (CheckedTreeNode) childToRemove.getParent()) {
       myDescriptorToNodeMap.remove(childToRemove.getUserObject());
     }
     children.add(child);
   }
   for (final CheckedTreeNode aChildren : children) {
     aChildren.removeFromParent();
   }
   myRootNode.removeAllChildren();
   for (final CheckedTreeNode child : children) {
     myRootNode.add(child);
   }
   sortChildren(myRootNode);
   ((DefaultTreeModel) getModel()).nodeStructureChanged(myRootNode);
   treeStateSnapshot.restore(this);
   expandPath(new TreePath(myRootNode));
 }
  private CheckedTreeNode findGroupNode(final String group) {
    for (int i = 0; i < getTreeRoot().getChildCount(); i++) {
      CheckedTreeNode node = (CheckedTreeNode) getTreeRoot().getChildAt(i);
      ToolsGroup g = (ToolsGroup) node.getUserObject();
      if (Comparing.equal(group, g.getName())) return node;
    }

    return null;
  }
 public BreakpointTree(final Project project) {
   super(new BreakpointTreeCellRenderer(), new CheckedTreeNode(new RootDescriptor()));
   myRootNode = (CheckedTreeNode) getModel().getRoot();
   myDescriptorToNodeMap.put((TreeDescriptor) myRootNode.getUserObject(), myRootNode);
   myBreakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
   myNodeUpdateListener =
       new BreakpointManagerListener() {
         public void breakpointsChanged() {
           repaint();
         }
       };
   myBreakpointManager.addBreakpointManagerListener(myNodeUpdateListener);
   getEmptyText().setText(XDebuggerBundle.message("debugger.no.breakpoints"));
 }
 private Breakpoint getSibling(Breakpoint breakpoint, boolean nextSibling) {
   final CheckedTreeNode node = myDescriptorToNodeMap.get(new BreakpointDescriptor(breakpoint));
   if (node == null) {
     return null;
   }
   final CheckedTreeNode sibling =
       (CheckedTreeNode) (nextSibling ? node.getNextSibling() : node.getPreviousSibling());
   if (sibling == null) {
     return null;
   }
   final TreeDescriptor descriptor = (TreeDescriptor) sibling.getUserObject();
   return descriptor instanceof BreakpointDescriptor
       ? ((BreakpointDescriptor) descriptor).getBreakpoint()
       : null;
 }
  @Override
  protected void onNodeStateChanged(final CheckedTreeNode node) {
    final Object descriptor = node.getUserObject();
    final Breakpoint breakpoint;
    if (descriptor instanceof BreakpointDescriptor) {
      breakpoint = ((BreakpointDescriptor) descriptor).getBreakpoint();
      if (myBreakpointManager.findMasterBreakpoint(breakpoint) != null) {
        return;
      }
    } else {
      breakpoint = null;
    }

    if (breakpoint != null) {
      myBreakpointManager.setBreakpointEnabled(breakpoint, node.isChecked());
    }
  }
 @Nullable
 private ToolsGroup getSelectedToolGroup() {
   CheckedTreeNode node = getSelectedToolNode();
   if (node == null) return null;
   return node.getUserObject() instanceof ToolsGroup ? (ToolsGroup) node.getUserObject() : null;
 }
 private static TreeDescriptor getDescriptor(final CheckedTreeNode node) {
   return (TreeDescriptor) node.getUserObject();
 }