001    /*
002     * Copyright 2009 - 2010 JEuclid, http://jeuclid.sf.net
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    /* $Id $ */
018    
019    package net.sourceforge.jeuclid.biparser;
020    
021    import org.w3c.dom.Document;
022    import org.w3c.dom.Node;
023    
024    /**
025     * this interface is used to store typcial information about a xml-node.
026     * 
027     * @version $Revision: 0b66106c7ff7 $
028     * 
029     */
030    public interface IBiNode {
031    
032        /**
033         * get previous node, null if node is root.
034         * 
035         * @return previous
036         */
037        IBiNode getPrevious();
038    
039        /**
040         * set previous for this node.
041         * 
042         * @param prev
043         *            previous node for this node
044         */
045        void setPrevious(final IBiNode prev);
046    
047        /**
048         * get parent node for this node.
049         * 
050         * @return parent
051         */
052        BiNode getParent();
053    
054        /**
055         * get sibling node, can be null.
056         * 
057         * @return sibling
058         */
059        IBiNode getSibling();
060    
061        /**
062         * set sibling for this node and set previous of sibling to this.
063         * 
064         * @param sibl
065         *            new sibling for this node
066         */
067        void setSibling(final IBiNode sibl);
068    
069        /**
070         * add sibling to a node, not possible at a textnode. if node already has a
071         * sibling, forward to sibling.
072         * 
073         * @param sibl
074         *            new sibling for this node
075         */
076        void addSibling(final IBiNode sibl);
077    
078        /**
079         * get reference to node in DOM-tree.
080         * 
081         * @return node in DOM-tree
082         */
083        Node getNode();
084    
085        /**
086         * set reference to node in DOM-tree.
087         * 
088         * @param n
089         *            reference in DOM-tree
090         */
091        void setNode(final Node n);
092    
093        /**
094         * get length of node (number of characters).
095         * 
096         * @return length of node
097         */
098        int getLength();
099    
100        /**
101         * set length of node.
102         * 
103         * @param len
104         *            to set
105         */
106        void setLength(final int len);
107    
108        /**
109         * change length of node and recursive of all parents.
110         * 
111         * @param change
112         *            changevalue (can be positive or negative)
113         */
114        void changeLengthRec(final int change);
115    
116        /**
117         * get the type of node, can be BiNode, EmptyNode or TextNode.
118         * 
119         * @return type of node
120         */
121        BiType getType();
122    
123        /**
124         * insert characters to node.
125         * 
126         * @param biTree
127         *            reference to BiTree to which this node contains
128         * @param offset
129         *            position to insert characters
130         * @param len
131         *            number of characters to insert
132         * @param totalOffset
133         *            offset of node to begin of text
134         * @throws ReparseException
135         *             if a reparse at upper level is needed
136         * @throws NonIncrementalElementException
137         *             if the subtree contains an element which cannot be
138         *             incrementally updated.
139         */
140        void insert(BiTree biTree, int offset, int len, int totalOffset)
141                throws ReparseException, NonIncrementalElementException;
142    
143        /**
144         * remove characters from node.
145         * 
146         * @param biTree
147         *            reference to BiTree to which this node contains
148         * @param offset
149         *            position to remove characters
150         * @param len
151         *            number of characters to remove
152         * @param totalOffset
153         *            offset of node to begin of text
154         * @throws ReparseException
155         *             if a reparse at upper level is needed
156         * @throws NonIncrementalElementException
157         *             if the subtree contains an element which cannot be
158         *             incrementally updated.
159         */
160        void remove(BiTree biTree, int offset, int len, int totalOffset)
161                throws ReparseException, NonIncrementalElementException;
162    
163        /**
164         * helper method to insert or remove characters.
165         * 
166         * @param insert
167         *            if true call insert-method else remove-method
168         * @param biTree
169         *            reference to BiTree to which this node contains
170         * @param offset
171         *            position to insert/remove characters
172         * @param len
173         *            number of characters to insert/remove
174         * @param totalOffset
175         *            offset of node to begin of text
176         * @throws ReparseException
177         *             if a reparse at upper level is needed
178         * @throws NonIncrementalElementException
179         *             if the subtree contains an element which cannot be
180         *             incrementally updated.
181         */
182        void forwardToSibling(final boolean insert, final BiTree biTree,
183                final int offset, final int len, final int totalOffset)
184                throws ReparseException, NonIncrementalElementException;
185    
186        /**
187         * create a DOM-tree from node.
188         * 
189         * @param doc
190         *            Document to create DOM-tree
191         * @return root of DOM-tree
192         */
193        Node createDOMSubtree(Document doc);
194    
195        /**
196         * search a DOM node in this node. if nodes are equal return offset to begin
197         * of inputtext, else null
198         * 
199         * @param n
200         *            DOM node to search for
201         * @param totalOffset
202         *            offset of node to begin of inputtext
203         * @return position of node in inputtext
204         */
205        TextPosition searchNode(final Node n, final int totalOffset);
206    
207        /**
208         * print biNode.
209         * 
210         * @param level
211         *            level of recursion tree
212         * @return biNode
213         */
214        String toString(int level);
215    
216        /**
217         * helper method for outputting the length of node.
218         * 
219         * @return formatted output of length
220         */
221        String formatLength();
222    }