/* AbstractTextual.java
Purpose:
Description:
History:
C2001/10/22 20:48:47, reate, Tom M. Yeh
Copyright (C) 2001 Potix Corporation. All Rights Reserved.
{{IS_RIGHT
This program is distributed under LGPL Version 2.1 in the hope that
it will be useful, but WITHOUT ANY WARRANTY.
}}IS_RIGHT
*/
package org.zkoss.idom.impl;
import java.util.List;
import org.w3c.dom.CharacterData;
import org.zkoss.lang.Objects;
import org.zkoss.lang.Classes;
import org.zkoss.lang.SystemException;
import org.zkoss.idom.*;
/**
* Represents a textual item.
*
* <p>Note: any deriving class's getText shall not return null.
*
* <p>Element.getText uses this class's isPartOfParentText to know
* whether a child's text shall be concatenated.
*
* @author tomyeh
* @see Element
*/
public abstract class AbstractTextual extends AbstractItem
implements Textual, CharacterData {
/** The text. */
protected String _text;
/** Constructor.
*/
protected AbstractTextual(String text) {
setText(text);
}
/** Constructor.
*/
protected AbstractTextual() {
_text = "";
}
//-- Textual --//
/**
* Returns true if this text object is part of the parent's text.
* Default: true.
*/
public boolean isPartOfParentText() {
return true;
}
/**
* Returns true if this textual object is allowed to be coalesced with
* its siblings with the same type (class).
* It is used by Group.coalesce.
* <p>Default: false. Right now only Text override it to true.
*/
public boolean isCoalesceable() {
return false;
}
public Textual split(int offset) {
String s = getText();
if (offset < s.length())
return null;
Textual vtx;
try {
vtx = (Textual)Classes.newInstance(getClass(),
new Class[] {String.class},
new Object[] {s.substring(offset)});
} catch (Exception ex) {
throw SystemException.Aide.wrap(ex,
getClass() + " must have a String constructor");
}
setText(s.substring(0, offset));
if (getParent() != null) {
List<Item> list = getParent().getChildren();
list.add(list.indexOf(this) + 1, (Item)vtx);
}
return vtx;
}
//-- utilities --//
/**
* Checks whether the text is valid.
* It is usually overridden by the deriving classes to check
* more specifically.
*/
protected void checkText(String text) {
Verifier.checkCharacterData(text, getLocator());
}
//-- Item --//
public String getText() {
return _text;
}
public void setText(String text) {
if (text == null)
text = "";
if (!Objects.equals(_text, text)) {
checkText(text);
_text = text;
}
}
//-- CharacterData --//
public final int getLength() {
return getText().length(); //not use _text since it might be overred
}
public final String getData() {
return getText();
}
public final void setData(String data) {
setText(data);
}
public final String substringData(int offset, int count) {
return getText().substring(offset, offset + count);
}
public final void appendData(String newData) {
if (newData != null && newData.length() != 0)
setText(getText() + newData);
}
public final void insertData(int offset, String arg) {
if (arg != null && arg.length() != 0)
setText(new StringBuffer(getText())
.insert(offset, arg).toString());
}
public final void deleteData(int offset, int count) {
if (offset < getLength())
setText(new StringBuffer(getText())
.delete(offset, offset + count).toString());
}
public final void replaceData(int offset, int count, String arg) {
setText(new StringBuffer(getText())
.replace(offset, offset + count, arg).toString());
}
//-- Text if implemented by derived class --//
public final org.w3c.dom.Text splitText(int offset) {
return (org.w3c.dom.Text)split(offset);
}
public boolean isElementContentWhitespace() {
throw new UnsupportedOperationException("DOM Level 3");
}
public String getWholeText() {
throw new UnsupportedOperationException("DOM Level 3");
}
public org.w3c.dom.Text replaceWholeText(String content)
throws DOMException {
throw new UnsupportedOperationException("DOM Level 3");
}
//Node//
public String getTextContent() {
return getText();
}
//-- Object --//
/**
* Gets the textual representation for debug.
*/
public String toString() {
String clsName = getClass().getName();
int j = clsName.lastIndexOf('.');
if (j >= 0)
clsName = clsName.substring(j + 1);
return '[' + clsName + ": \"" + getText() + "\"]";
}
}