/**
   * Attempt to find the breakpoint the user has clicked on, using as much information as is
   * available to this popup.
   *
   * @param bpman breakpoint manager to search through.
   * @return breakpoint if found, null if not.
   * @throws ViewException if the line does not contain code.
   */
  protected Breakpoint findBreakpoint(BreakpointManager bpman) throws ViewException {
    if (classLines == null) {
      // Fall back on the default behavior.
      return super.findBreakpoint(bpman);
    }

    // Get the class at this line.
    lastClickedClass = ClassDefinition.findClassForLine(classLines, lastClickedLine);
    if (lastClickedClass == null) {
      throw new NonCodeLineException();
    }

    // Query existing set of breakpoints for this class and line.
    return bpman.getBreakpoint(lastClickedClass, lastClickedLine);
  } // findBreakpoint
  /**
   * Set the lists of class and method definitions.
   *
   * @param classes list of ClassDefinition objects.
   * @param methods list of MethodDefinition objects.
   */
  void setClassDefinitions(List classes, List methods) {
    classLines = classes;
    if (classLines == null || methods == null) {
      methodsMenu = null;
      return;
    }

    // Add the class names to the method definitions. Granted, this
    // is slow, but hopefully there are few classes and few methods
    // in those classes.
    Iterator iter = methods.iterator();
    while (iter.hasNext()) {
      MethodDefinition def = (MethodDefinition) iter.next();
      if (def.getClassName() == null) {
        // Set the class name if not already set.
        String cname = ClassDefinition.findClassForLine(classLines, def.getLine());
        def.setClassName(cname);
      }
    }

    // Build a submenu of the sorted method definitions.
    JMenu menu = new JMenu(Bundle.getString("SourceViewPopup.methodsMenuLabel"), true);
    Collections.sort(methods, new MDComparator());
    iter = methods.iterator();
    Preferences prefs = Preferences.userRoot().node("com/bluemarsh/jswat/view");
    boolean shortDesc =
        prefs.getBoolean("shortMethodDescInPopup", Defaults.VIEW_POPUP_SHORT_METHOD_DESC);
    while (iter.hasNext()) {
      MethodDefinition def = (MethodDefinition) iter.next();
      // Keep the description short, if so desired.
      String desc = shortDesc ? def.getMethodDescShort() : def.getMethodDesc();
      if (desc.length() > 80) {
        desc = desc.substring(0, 78) + "...";
      }
      JMenuItem item = new JMenuItem(desc);
      menu.add(item);
      item.setActionCommand(String.valueOf(def.getLine()));
      item.addActionListener(this);
    }
    if (menu.getMenuComponentCount() > 0) {
      methodsMenu = menu;
    }
  } // setClassDefinitions