javam

İyul 22, 2010

JEditorPane prevent blocks insert/replace/remove

Filed under: javam.swing — Etiketlər: , , , , , — -- @ 8:07 səhər

For preventing some parts of JEditorPane you can set document filter like that:

((AbstractDocument)jEditorPane.getDocument()).setDocumentFilter(myFilter);

We have html source like that:

<html>
<body>
  <h2>Hello World!!</h2>
  <span type="reserved">This area is guarded html block of JEditorPane</span>
  <p>You can change there</p>
  <span type="reserved">
    <form>
       Name:<input type="text"  name="name"/></br>
       Surname:<input type="text"  name="surname"/></br>
       <input type="submit"  name="submit" value="Ok"/>
    </form>
  </span>
</body>
</html>


We can prevent from changing <span type="reserved"> blocks. You may chose some another patterns:

DocumentFilter myFilter = new DocumentFilter() {

  public void insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attrs) throws BadLocationException {
    System.out.println("in insert string");
    if (isCaretOnReservedObject((HTMLDocument) fb.getDocument(), offset)) {
      throw new BadLocationException("Reserved position", offset);
    } else {
      Object val = attrs.getAttribute(HTML.Attribute.TYPE);
      if ("reserved".equals(val)) {
        super.insertString(fb, offset, string, null);
      } else {
        super.insertString(fb, offset, string, attrs);
      }
    }
  }

  public void remove(DocumentFilter.FilterBypass fb, int offset, int length) throws BadLocationException {
    for (int i = offset; i &lt; offset + length; i++) {
      if (isCaretOnReservedObject((HTMLDocument) fb.getDocument(), i)) {
        throw new BadLocationException("Reserved position", i);
      }
    }
    super.remove(fb, offset, length);
  }

  public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
    for (int i = offset; i &lt; offset + length; i++) {
      if (isCaretOnReservedObject((HTMLDocument) fb.getDocument(), i)) {
        throw new BadLocationException("Reserved position", offset);
      }
    }
    Object val = attrs.getAttribute(HTML.Attribute.TYPE);
    if ("reserved".equals(val)) {
      super.replace(fb, offset, length, text, null);
    } else {
      super.replace(fb, offset, length, text, attrs);
    }
  }
};

isCaretOnReservedObject() method checks carets position for prevented area or not:

protected boolean isCaretOnReservedObject(HTMLDocument hdoc, int pos) {
  boolean retval = false;
  Element elem = hdoc.getCharacterElement(pos);
  AttributeSet a = elem.getAttributes();
  AttributeSet spanAttributeSet = (AttributeSet) a.getAttribute(HTML.Tag.SPAN);
  // if spanAttributeSet is not null, then we properly found ' a span '.
  // now we need to discover if it is one of OUR spans
  if (spanAttributeSet != null) {
    Object type = spanAttributeSet.getAttribute(HTML.Attribute.TYPE);
    if (type != null && type.equals("reserved")) {
      // for our logging, we get the ref, which holds the source of our value later
      System.out.println(elem + ": the value is: " + spanAttributeSet.getAttribute("ref"));
      retval = true;
    }
  }
  return retval;
}

References:
1. SHEF – Swing HTML Editor Framework
2. Oracle Sun Forum

Advertisements

Şərh yaz »

Heç bir şərh yoxdur.

RSS feed for comments on this post. TrackBack URI

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

WordPress.com-da pulsuz sayt və ya bloq yarat.

%d bloqqer bunu bəyənir: