/**
  * Construct a preference screen corresponding to a configured parser category
  *
  * @param parserCategory parser category
  * @param screen preference screen being set up
  * @param multi true if we are setting up a mutiple location selection menu
  * @param locMgr Location manager
  */
 private void buildLocationMenu(
     ParserCategory parserCategory,
     PreferenceScreen screen,
     boolean multi,
     LocationManager locMgr) {
   for (ParserEntry entry : parserCategory.getParserList()) {
     if (!entry.isCategory())
       throw new RuntimeException(
           "Top level parser entry " + entry.getParserName() + " must be a category");
     Preference pref = buildLocationItem(entry.getCategory(), screen, multi, locMgr);
     screen.addPreference(pref);
   }
 }
  /**
   * Construct a prefence item corresponding to a single parser entry
   *
   * @param category root preference category
   * @param parent parent preference screen
   * @param multi true if we are setting up multiple location selection menu
   * @param locMgr location manager
   * @return constructed preference
   */
  private Preference buildLocationItem(
      ParserCategory category, PreferenceScreen parent, boolean multi, LocationManager locMgr) {

    // Current rules are that category must contain only  subcategory or only parser entries.  See
    // which this is
    String catName = category.getName();
    ParserEntry[] entries = category.getParserList();
    boolean subcat = false;
    boolean plist = false;
    for (ParserEntry entry : entries) {
      if (entry.isCategory()) subcat = true;
      else plist = true;
    }
    if (subcat && plist)
      throw new RuntimeException("Parser group " + catName + " mixes parser and category entries");
    if (!subcat && !plist) throw new RuntimeException("Parser group " + catName + " is empty");

    // If it only contains subcategories, build a new preference screen with them
    if (subcat) {
      PreferenceScreen sub = getPreferenceManager().createPreferenceScreen(this);
      sub.setTitle(catName);
      buildLocationMenu(category, sub, multi, locMgr);
      return sub;
    }

    // Otherwise we are handing a parser list
    // What we do next depends on whether this is a single or multiple selection menu

    // If we are doing multiple selections, create a new preference screen and fill it
    // a location checkbox for each parser entry
    if (multi) {
      PreferenceScreen sub = getPreferenceManager().createPreferenceScreen(this);
      sub.setTitle(catName);
      for (ParserEntry entry : entries) {
        sub.addPreference(
            new LocationCheckBoxPreference(
                this, entry.getParserName(), stripStateAbbrv(entry.getLocName()), locMgr));
      }
      return sub;
    }

    // If we are doing single location selections, build a list preference
    // that can select from any of the parsers in this category
    LocationListPreference list = new LocationListPreference(this, locMgr, parent);
    list.setTitle(catName);
    list.setDialogTitle(catName);

    String[] values = new String[entries.length];
    String[] names = new String[entries.length];
    for (int ndx = 0; ndx < entries.length; ndx++) {
      ParserEntry entry = entries[ndx];
      values[ndx] = entry.getParserName();
      names[ndx] = stripStateAbbrv(entry.getLocName());
    }
    list.setEntryValues(values);
    list.setEntries(names);
    return list;
  }