blob: 3428768f6586622f28f9e0deef396142ad62dd7a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.sse.core.internal.parser;
import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentEvent;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
/**
* Regions of this class are intended specifically for XML/HTML/JSPs. Other
* languages may need their own subclasses. (See the updateModel method).
*/
public class ContextRegion implements ITextRegion {
protected int fLength;
protected int fStart;
protected int fTextLength;
protected String fType;
protected ContextRegion() {
super();
}
public ContextRegion(String newContext, int newStart, int newTextLength, int newLength) {
fType = newContext;
fStart = newStart;
fTextLength = newTextLength;
fLength = newLength;
}
public void adjust(int i) {
fStart += i;
}
public void adjustLength(int i) {
fLength += i;
}
public void adjustStart(int i) {
fStart += i;
}
public void adjustTextLength(int i) {
fTextLength += i;
}
boolean allLetterOrDigit(String changes) {
boolean result = true;
for (int i = 0; i < changes.length(); i++) {
// TO_DO_FUTURE: check that a Java Letter or Digit is
// the same thing as an XML letter or digit
if (!(Character.isLetterOrDigit(changes.charAt(i)))) {
result = false;
break;
}
}
return result;
}
boolean allWhiteSpace(String changes) {
boolean result = true;
for (int i = 0; i < changes.length(); i++) {
if (!Character.isWhitespace(changes.charAt(i))) {
result = false;
break;
}
}
return result;
}
boolean canHandleAsLetterOrDigit(String changes, int requestStart, int lengthToReplace) {
boolean result = false;
// Make sure we are in a non-white space area
if ((requestStart <= (getTextEnd())) && (allLetterOrDigit(changes))) {
result = true;
}
return result;
}
boolean canHandleAsWhiteSpace(String changes, int requestStart, int lengthToReplace) {
boolean result = false;
// if we are in the "white space" area of a region, then
// we don't want to handle, a reparse is needed.
// the white space region is consider anywhere that would
// leave whitespace between this character and the text part.
// and of course, we can insert whitespace in whitespace region
//
// if there is no whitespace in this region, no need to look further
if (getEnd() > getTextEnd()) {
// no need to add one to end of text, as we used to, since we
// change definition of length to equate to offset plus one.
if (requestStart > getTextEnd()) {
// ok, we are in the whitespace region, so we can't handle,
// unless
// we are just inserting whitespace.
if (allWhiteSpace(changes)) {
result = true;
}
else {
result = false;
}
}
}
return result;
}
public boolean contains(int position) {
return fStart <= position && position < fStart + fLength;
}
public void equatePositions(ITextRegion region) {
fStart = region.getStart();
fLength = region.getLength();
fTextLength = region.getTextLength();
}
public int getEnd() {
return fStart + fLength;
}
public int getLength() {
return fLength;
}
public int getStart() {
return fStart;
}
public int getTextEnd() {
return fStart + fTextLength;
}
public int getTextLength() {
return fTextLength;
}
public String getType() {
return fType;
}
public void setLength(int i) {
fLength = i;
}
public void setStart(int i) {
fStart = i;
}
public void setTextLength(int i) {
fTextLength = i;
}
public void setType(String string) {
fType = string;
}
public String toString() {
String className = getClass().getName();
String shortClassName = className.substring(className.lastIndexOf(".") + 1); //$NON-NLS-1$
String result = shortClassName + "--> " + getType() + ": " + getStart() + "-" + getTextEnd() + (getTextEnd() != getEnd() ? ("/" + getEnd()) : ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
// NOTE: if the document held by any region has been updated and the
// region offsets have not
// yet been updated, the output from this method invalid.
return result;
}
public StructuredDocumentEvent updateRegion(Object requester, IStructuredDocumentRegion parent, String changes, int requestStart, int lengthToReplace) {
// the four types we used to handle here, have all been moved to
// specific region classes.
// XML_TAG_ATTRIBUTE_VALUE
// XML_TAG_ATTRIBUTE_NAME
// XML_CONTENT
// XML_CDATA_TEXT
return null;
}
}