diff options
Diffstat (limited to 'jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java')
-rw-r--r-- | jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java | 378 |
1 files changed, 0 insertions, 378 deletions
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java deleted file mode 100644 index 1d8565406..000000000 --- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java +++ /dev/null @@ -1,378 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006 Sybase, Inc. 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: - * Sybase, Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jst.pagedesigner.range; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import org.eclipse.gef.EditPart; -import org.eclipse.jst.pagedesigner.parts.DocumentEditPart; -import org.eclipse.jst.pagedesigner.viewer.DesignPosition; -import org.eclipse.jst.pagedesigner.viewer.DesignRange; - -/** - * @author mengbo - */ -public class RangeUtil { - /** - * append the child after the reference node as next sibling. - * - * @param child - * can't be null - * @param reference - * can't be null - * @return ?? - */ - //TODO: dead -// private static Node appendAfter(Node child, Node reference) { -// Node next = reference.getNextSibling(); -// if (next == null) -// { -// return reference.getParentNode().appendChild(child); -// } -// return reference.getParentNode().insertBefore(child, next); -// } - - /** - * @param child - * @param reference - * @return ?? - */ - // TODO: dead -// private static Node insertBefore(Node child, Node reference) { -// return reference.getParentNode().insertBefore(child, reference); -// } - - /** - * Insert a node into the specified position. The node can be an element or - * DocumentFragment. - * - * @param node - * @param position - */ - // TODO: dead -// private static Node insertElement(DesignPosition position, Element node) { -// EditPart containerEditPart = position.getContainerPart(); -// int offset = position.getOffset(); -// -// if (containerEditPart instanceof TextEditPart) { -// TextEditPart textPart = (TextEditPart) containerEditPart; -// String textData = textPart.getTextData(); -// Node textNode = (Node) textPart.getModel(); -// if (offset == 0) -// return insertBefore(node, textNode); -// else if (offset == textData.length()) -// return appendAfter(node, textNode); -// else { -// // inserting the element in the middle of text. -// String before = textData.substring(0, offset); -// String after = textData.substring(offset); -// -// // XXX: don't know whether setNodeValue() will do all those -// // escape or not. -// textNode.setNodeValue(after); -// Node newnode = insertBefore(node, textNode); -// -// // XXX: don't know whether createTextNode() will do all those -// // escape or not -// Text t = textNode.getOwnerDocument().createTextNode(before); -// -// insertBefore(t, newnode); -// return newnode; -// } -// } -// return insertIntoEditPart(containerEditPart, node, offset); -// } - - /** - * @param containerEditPart - * @param node - * @param offset - * @return - */ - // TODO: dead -// private static Node insertIntoEditPart(EditPart containerEditPart, -// Node node, int offset) { -// Node parent = (Node) containerEditPart.getModel(); -// List childParts = containerEditPart.getChildren(); -// if (offset >= childParts.size()) { -// // to the end of parent -// return parent.appendChild(node); -// } -// Node child = (Node) ((EditPart) childParts.get(offset)).getModel(); -// return insertBefore(node, child); -// } - - // TODO: dead -// private static TextPosition insertText(DesignPosition position, String data) { -// // TODO: never read EditPart containerEditPart = position.getContainerPart(); -// -// position = moveIntoText(position); -// int offset = position.getOffset(); -// -// if (position.getContainerPart() instanceof TextEditPart) { -// // it is guaranteeed that now the containing edit part is text node. -// TextEditPart textPart = (TextEditPart) position.getContainerPart(); -// String textData = textPart.getTextData(); -// String before = textData.substring(0, offset); -// String after = textData.substring(offset); -// if (data.startsWith(" ") && before.endsWith(" ")) { -// before = before.substring(0, before.length() - 1) + " "; -// } -// if (after.startsWith(" ") && data.endsWith(" ")) { -// data = data.substring(0, data.length() - 1) + (char) 160; -// } -// String nextData = before + data + after; -// IDOMText text = (IDOMText) textPart.getModel(); -// text.setData(nextData); -// return new TextPosition(text, offset + data.length()); -// } -// // can't merge into a neighboring text node. So create a text node -// // of it's own -// EditPart part = position.getContainerPart(); -// Node parent = (Node) part.getModel(); -// Text text = parent.getOwnerDocument().createTextNode(data); -// insertIntoEditPart(part, text, offset); -// return new TextPosition((IDOMText) text, offset); -// } - - /** - * Try to make the position move into a text node. - * - * @param position - * @return - */ - // TODO: dead -// private static DesignPosition moveIntoText(DesignPosition position) { -// EditPart container = position.getContainerPart(); -// if (container instanceof TextEditPart) -// return position; -// if (position.getOffset() > 0) { -// EditPart pre = (EditPart) container.getChildren().get( -// position.getOffset() - 1); -// if (pre instanceof TextEditPart) { -// return new DesignPosition(pre, ((TextEditPart) pre) -// .getTextData().length()); -// } -// } -// if (position.getOffset() < container.getChildren().size()) { -// EditPart next = (EditPart) container.getChildren().get( -// position.getOffset()); -// if (next instanceof TextEditPart) { -// return new DesignPosition(next, 0); -// } -// } -// return position; -// } - - /** - * try to move the position up to not inside a text. if the position is at 0 - * index or last index of a text node, then try to move it up. - * - * @param position - * @return - */ - // TODO: dead -// private static DesignPosition moveOutFromText(DesignPosition position) { -// EditPart container = position.getContainerPart(); -// if (container instanceof TextEditPart) { -// int offset = position.getOffset(); -// String text = ((TextEditPart) container).getTextData(); -// if (offset == 0) { -// return new DesignPosition(container.getParent(), container -// .getParent().getChildren().indexOf(container)); -// } else if (offset == text.length()) { -// return new DesignPosition(container.getParent(), container -// .getParent().getChildren().indexOf(container) + 1); -// } -// } -// return position; -// } - -// private static void insertDocumentFragment(DesignPosition position, -// DocumentFragment fragment) { -// // FIXME: NOT DONE. -// } - - /** - * Test whether the range intersect with the part. - * - * @param range - * @param part - * @return true if thereis an intersection - */ - public static boolean intersect(DesignRange range, EditPart part) { - if (range == null || !range.isValid()) - return false; - range = normalize(range); - if (part instanceof DocumentEditPart) - return true; - EditPart parent = part.getParent(); - int index = parent.getChildren().indexOf(part); - DesignPosition left = new DesignPosition(parent, index); - DesignPosition right = new DesignPosition(parent, index + 1); - int compare = compareDesignPosition(left, range.getEndPosition()); - if (compare == 1 || compare == 0 || compare == Integer.MIN_VALUE) - return false; - - compare = compareDesignPosition(right, range.getStartPosition()); - if (compare == -1 || compare == 0 || compare == Integer.MIN_VALUE) - return false; - - return true; - } - - /** - * make sure the start position is before end position. If the original - * range is already normalized, then the original range will be returned - * without constructing a new one. - * - * @param range - * @return the normalized range - */ - public static DesignRange normalize(DesignRange range) { - if (range == null || !range.isValid()) { - return range; - } - int result = compareDesignPosition(range.getStartPosition(), range - .getEndPosition()); - if (result == 1) - { - return new DesignRange(range.getEndPosition(), range - .getStartPosition()); - } - return range; - } - - /** - * - * @param p1 - * @param p2 - * @return 0 means equal. 1 Means p1 is after p2. -1 means p1 is before p2. - * Integer.MIN_VALUE means some error and can't compare. - */ - private static int compareDesignPosition(DesignPosition p1, DesignPosition p2) { - if (!p1.isValid() || !p2.isValid()) - return Integer.MIN_VALUE; - if (p1.equals(p2)) - return 0; - int offset1 = p1.getOffset(); - int offset2 = p2.getOffset(); - List a1 = getAncesters(p1.getContainerPart()); - List a2 = getAncesters(p2.getContainerPart()); - if (a1 == null || a2 == null) - return Integer.MIN_VALUE; - if (a1.get(0) != a2.get(0)) - return Integer.MIN_VALUE; // not same DocumentEditPart - for (int i = 1;; i++) { - EditPart p1a = (EditPart) a1.get(i); - EditPart p2a = (EditPart) a2.get(i); - if (p1a == p2a) { - if (p1a != null) - { - continue; // same ancester - } - // both are null. just compare the offset. - return offset1 < offset2 ? -1 - : (offset1 == offset2 ? 0 : 1); - } - // p1a != p2a. now we can just compare p1a and p2a to decide the - // order. - if (p1a != null) - offset1 = p1a.getParent().getChildren().indexOf(p1a); - if (p2a != null) - offset2 = p2a.getParent().getChildren().indexOf(p2a); - if ((p1a == null && p2a == null) || (p1a != null && p2a != null)) { - return offset1 < offset2 ? -1 : (offset1 == offset2 ? 0 : 1); - } else if (p1a == null) { - return offset1 <= offset2 ? -1 : 1; - } else { - return offset1 >= offset2 ? 1 : -1; - } - } - } - - /** - * Get a list of ancester nodes starting from the DocumentEditPart till the - * node. - * - * @param part - * @return - */ - private static List getAncesters(EditPart part) { - List list = new ArrayList(); - while (part != null) { - list.add(part); - if (part instanceof DocumentEditPart) - { - break; - } - part = part.getParent(); - } - if (part == null) { - // if part ==null, means we didn't find a DocumentEditPart, - // something must be wrong. - return null; - } - // reverse to make it starting from the docuemnteditpart node. - Collections.reverse(list); - list.add(null); // add an null terminator. - return list; - } - - /** - * find the smallest common ancester of two edit part. - * - * @param part1 - * @param part2 - * @return - */ - private static EditPart findCommonAncester(EditPart part1, EditPart part2) { - if (part1 == part2) { - return part1; - } - List list1 = getAncesters(part1); - if (list1 == null) - return null; - List list2 = getAncesters(part2); - if (list2 == null) - return null; - if (list1.get(0) != list2.get(0)) - return null; - EditPart common = (EditPart) list1.get(0); - for (int i = 1;; i++) { - EditPart p1 = (EditPart) list1.get(i); - EditPart p2 = (EditPart) list2.get(i); - if (p1 == null || p2 == null) - return common; - if (p1 != p2) - return common; - common = p1; - } - - } - - /** - * @param range - * @return the common ancestor - */ - public static EditPart findCommonAncestor(DesignRange range) { - if (!range.isValid()) { - return null; - } - DesignPosition startPosition = range.getStartPosition(); - DesignPosition endPosition = range.getEndPosition(); - return findCommonAncester(startPosition.getContainerPart(), endPosition - .getContainerPart()); - } -} |