static {
   HEADING_LIST.put("H1 head line", 35);
   HEADING_LIST.put("H2 head line", 30);
   HEADING_LIST.put("H3 head line", 25);
   HEADING_LIST.put("H4 head line", 20);
   HEADING_LIST.put("H5 head line", 15);
   HEADING_LIST.put("Paragraph", 10);
   HEADING_LIST.put("Quote", 10);
 }
  /**
   * Returns the <code>Format.Field</code> constants associated with the text at <code>offset</code>
   * . If <code>offset</code> is not a valid location into the current text, this will return an
   * empty array.
   *
   * @param offset offset into text to be examined
   * @return Format.Field constants associated with the text at the given position.
   */
  public Format.Field[] getFields(int offset) {
    if (getAllowsInvalid()) {
      // This will work if the currently edited value is valid.
      updateMask();
    }

    Map attrs = getAttributes(offset);

    if (attrs != null && attrs.size() > 0) {
      ArrayList al = new ArrayList();

      al.addAll(attrs.keySet());
      return (Format.Field[]) al.toArray(EMPTY_FIELD_ARRAY);
    }
    return EMPTY_FIELD_ARRAY;
  }
  protected boolean getRegionText(BaleRegion br, int off, int len, Segment text)
      throws BadLocationException {
    int soff = br.getStart();
    int eoff = br.getEnd();

    if (region_map != null) {
      validateRegions();
      RegionData rd = region_map.get(br);
      Segment rtext = new Segment();
      base_document.getText(soff, eoff - soff, rtext);
      return rd.getText(rtext, off, len, text);
    }

    int doff = off + soff;
    int dlen = len;

    boolean lastbad = false;
    if (br.includesEol()) {
      if (doff + dlen > eoff) dlen = eoff - off;
      base_document.getText(doff, len, text);
    } else {
      if (doff + dlen > eoff) dlen = eoff - off + 1;
      base_document.getText(doff, len, text);
      lastbad = (doff + len > eoff); // if last character might be bad
    }

    return lastbad;
  }
 private void _setUpResources() {
   DefaultComboBoxModel dlm = new DefaultComboBoxModel();
   Set<String> keys = HEADING_LIST.keySet();
   for (String key : keys) {
     dlm.addElement(key);
   }
   mHeadingComboBox.setModel(dlm);
 }
 private void fixupOffset(BaleRegion br, int off, boolean edit) {
   if (edit && region_map != null) {
     validateRegions();
     RegionData rd = region_map.get(br);
     rd.fixupOffset(br, off);
   }
   validateRegions();
 }
  private void validateRegions() {
    if (region_map == null) return;

    synchronized (region_map) {
      if (regions_valid) return;

      Segment s = new Segment();

      region_map.clear();

      for (BaleRegion br : fragment_regions) {
        RegionData rd = new RegionData(indent_size);
        region_map.put(br, rd);
        int soff = br.getStart();
        int eoff = br.getEnd();
        if (eoff < soff) continue;
        try {
          base_document.getText(soff, eoff - soff, s);
        } catch (BadLocationException e) {
          BoardLog.logE("BALE", "Problem getting region indentation", e);
          continue;
        }
        int ln = s.length();

        LineData ld;
        boolean sol = true;
        for (int i = 0; i < ln; ++i) {
          char c = s.charAt(i);
          if (sol) {
            ld = computeLineData(i, s);
            rd.add(ld);
            sol = false;
          }
          if (c == '\n') sol = true;
        }
        if (!sol) {
          ld = computeLineData(ln, s);
          rd.add(ld);
          ++ln;
        }
      }

      regions_valid = true;
    }
  }
  protected int mapViewOffsetToRegion(BaleRegion br, int offset, boolean edit) {
    if (region_map != null) {
      fixupOffset(br, offset, edit);
      RegionData rd = region_map.get(br);
      return rd.getRegionOffset(br, offset);
    }

    return offset;
  }
  protected int mapRegionOffsetToView(BaleRegion br, int offset) {
    if (region_map != null) {
      validateRegions();
      RegionData rd = region_map.get(br);
      return rd.getViewOffset(offset);
    }

    return offset;
  }
  public void refreshErrorDisplay() {
    if (parseErrorHighlightKey != null)
      editor.getHighlighter().removeHighlight(parseErrorHighlightKey);

    /* Mapping for gutter */
    Map<Integer, String> errorLines = new HashMap<Integer, String>();

    if (parseError != null && parseError.hasLineNumbers()) {
      String error = parseError.getMessage();

      // Just the first line.
      errorLines.put(parseError.getBeginLine(), error);

      // If error spans multiple lines, this code will put
      // an error in every line of the gutter.
      /*for (int line = parseError.getBeginLine();
           line <= parseError.getEndLine();
           line++)
      {
      	errorLines.put(line, error);
      }*/
    }

    gutter.setParseErrors(errorLines);

    /* Highlighting errors in editor */
    if (parseError != null && parseError.hasLineNumbers()) {
      /* Remove existing highlight */
      try {
        parseErrorHighlightKey =
            editor
                .getHighlighter()
                .addHighlight(
                    computeDocumentOffset(parseError.getBeginLine(), parseError.getBeginColumn()),
                    computeDocumentOffset(parseError.getEndLine(), parseError.getEndColumn()) + 1,
                    errorHighlightPainter);
      } catch (BadLocationException e) {

      }
    }
  }
  /** ***************************************************************************** */
  protected int getRegionLength(BaleRegion br) {
    int len = br.getEnd() - br.getStart();

    if (!br.includesEol()) len += 1;

    if (region_map != null) {
      validateRegions();
      RegionData rd = region_map.get(br);
      len += rd.getDeltaLength();
    }

    return len;
  }
  /**
   * Outputs the maps as elements. Maps are not stored as elements in the document, and as such this
   * is used to output them.
   */
  void writeMaps(Enumeration maps) throws IOException {
    if (maps != null) {
      while (maps.hasMoreElements()) {
        Map map = (Map) maps.nextElement();
        String name = map.getName();

        incrIndent();
        indent();
        write("<map");
        if (name != null) {
          write(" name=\"");
          write(name);
          write("\">");
        } else {
          write('>');
        }
        writeLineSeparator();
        incrIndent();

        // Output the areas
        AttributeSet[] areas = map.getAreas();
        if (areas != null) {
          for (int counter = 0, maxCounter = areas.length; counter < maxCounter; counter++) {
            indent();
            write("<area");
            writeAttributes(areas[counter]);
            write("></area>");
            writeLineSeparator();
          }
        }
        decrIndent();
        indent();
        write("</map>");
        writeLineSeparator();
        decrIndent();
      }
    }
  }
 /** Returns true if <code>attributes</code> is null or empty. */
 boolean isLiteral(Map attributes) {
   return ((attributes == null) || attributes.size() == 0);
 }