/**
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.waveprotocol.wave.model.document.raw.impl;
import org.waveprotocol.wave.model.document.Doc;
import org.waveprotocol.wave.model.document.indexed.NodeType;
/**
* Mimics a DOM Text node.
*
*/
public final class Text extends Node implements Doc.T {
private String data;
/**
* Constructs a Text node containing the given data.
*
* @param data The data the new Text node should contain.
*/
public Text(String data) {
this.data = data;
}
/**
* {@inheritDoc}
*/
@Override
public short getNodeType() {
return NodeType.TEXT_NODE;
}
/**
* @return The text content of this node.
*/
public String getData() {
return data;
}
/**
* @return The length of the text content of this node.
*/
public int getLength() {
return data.length();
}
/**
* Appends the given string to the contents of this text node.
*
* @param arg The text to append.
*/
public void appendData(String arg) {
data += arg;
}
/**
* Inserts the given string into the contents of this text node at the given
* offset.
*
* @param offset The offset at which to insert the text.
* @param arg The text to insert.
*/
public void insertData(int offset, String arg) {
data = data.substring(0, offset) + arg + data.substring(offset);
}
/**
* Deletes the characters in the specified range.
*
* @param offset The offset of the start point of the range.
* @param count The size of the range.
*/
public void deleteData(int offset, int count) {
data = data.substring(0, offset) + data.substring(offset + count);
}
/**
* Splits this text node at the given offset.
* If the offset is zero, no split occurs, and the current node is returned.
* If the offset is equal to or greater than the length of the text node, no split
* occurs, and null is returned.
*
* @param offset The offset at which to split this text node.
* @return The text node containing all text that came after the given offset
* in the old text node.
*/
public Text splitText(int offset) {
if (offset == 0) {
return this;
} else if (offset >= getLength()) {
return null;
}
String splitOffText = data.substring(offset);
data = data.substring(0, offset);
Text newNode = new Text(splitOffText);
parent.insertBefore(newNode, nextSibling);
return newNode;
}
/** {@inheritDoc} */
@Override
public int calculateSize() {
return getLength();
}
@Override
public Element asElement() {
return null;
}
@Override
public Text asText() {
return this;
}
@Override
public String toString() {
return getData();
}
}