/**
   * 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
  /**
   * Try to add a breakpoint at the last clicked class and line. Displays an appropriate error
   * message if needed.
   *
   * @param session Session.
   * @param bpman breakpoint manager.
   * @return new breakpoint if successful, null if error.
   */
  protected Breakpoint addBreakpoint(Session session, BreakpointManager bpman) {
    if (lastClickedClass == null) {
      // Fall back on default behavior.
      return super.addBreakpoint(session, bpman);
    }

    try {
      String fname = sourceSrc.getName();
      Breakpoint bp = new LineBreakpoint(lastClickedClass, fname, lastClickedLine);
      bpman.addNewBreakpoint(bp);
      return bp;
    } catch (ClassNotFoundException cnfe) {
      session
          .getUIAdapter()
          .showMessage(
              UIAdapter.MESSAGE_ERROR,
              Bundle.getString("AddBreak.invalidClassMsg") + ' ' + lastClickedClass);
      return null;
    } catch (ResolveException re) {
      session.getUIAdapter().showMessage(UIAdapter.MESSAGE_ERROR, re.errorMessage());
      return null;
    }
  } // addBreakpoint
 /**
  * Creates a JavaSourceViewPopup object.
  *
  * @param src source object.
  */
 public JavaSourceViewPopup(SourceSource src) {
   super(src);
   menuItemTable.put(
       PARSER_ERROR_STRING, new JMenuItem(Bundle.getString("SourceViewPopup.parserErrorMsg")));
 } // JavaSourceViewPopup