00001 #ifndef IDRangeImpl_HEADER_GUARD_
00002 #define IDRangeImpl_HEADER_GUARD_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #include <xercesc/util/XercesDefs.hpp>
00064
00065 #include "IDOM_Range.hpp"
00066
00067 class IDOM_Node;
00068 class IDOM_DocumentFragment;
00069 class IDOM_Text;
00070
00071 class CDOM_EXPORT IDRangeImpl: public IDOM_Range {
00072 private:
00073 enum TraversalType {
00074 EXTRACT_CONTENTS = 1,
00075 CLONE_CONTENTS = 2,
00076 DELETE_CONTENTS = 3
00077 };
00078
00079 enum TraversePoint {
00080 BEFORE = -1,
00081 START = 0,
00082 AFTER = 1
00083 };
00084
00085
00086
00087 IDOM_Node *fStartContainer;
00088 unsigned int fStartOffset;
00089 IDOM_Node *fEndContainer;
00090 unsigned int fEndOffset;
00091 bool fCollapsed;
00092 IDOM_Document *fDocument;
00093 bool fDetached;
00094
00095 IDOM_Node *fRemoveChild;
00096
00097 public:
00098
00099 IDRangeImpl(IDOM_Document* doc);
00100 IDRangeImpl(const IDRangeImpl& other);
00101
00102
00103 ~IDRangeImpl();
00104
00105
00106 virtual IDOM_Node* getStartContainer() const;
00107 virtual unsigned int getStartOffset() const;
00108 virtual IDOM_Node* getEndContainer() const;
00109 virtual unsigned int getEndOffset() const;
00110 virtual bool getCollapsed() const;
00111 virtual const IDOM_Node* getCommonAncestorContainer() const;
00112
00113
00114 virtual void setStart(const IDOM_Node *parent, unsigned int offset);
00115 virtual void setEnd(const IDOM_Node *parent, unsigned int offset);
00116
00117 virtual void setStartBefore(const IDOM_Node *refNode);
00118 virtual void setStartAfter(const IDOM_Node *refNode);
00119 virtual void setEndBefore(const IDOM_Node *refNode);
00120 virtual void setEndAfter(const IDOM_Node *refNode);
00121
00122
00123 virtual void collapse(bool toStart);
00124 virtual void selectNode(const IDOM_Node *node);
00125 virtual void selectNodeContents(const IDOM_Node *node);
00126
00127
00128 virtual short compareBoundaryPoints(CompareHow how, const IDOM_Range* range) const;
00129 virtual void deleteContents();
00130 virtual IDOM_DocumentFragment* extractContents();
00131 virtual IDOM_DocumentFragment* cloneContents() const;
00132 virtual void insertNode(IDOM_Node* node);
00133
00134
00135 virtual void surroundContents(IDOM_Node *node);
00136 virtual IDOM_Range* cloneRange() const;
00137 virtual const XMLCh* toString() const;
00138 virtual void detach();
00139
00140
00141 IDOM_Document* getDocument();
00142
00143
00144 void updateSplitInfo(IDOM_Text* oldNode, IDOM_Text* startNode, unsigned int offset);
00145 void updateRangeForInsertedNode(IDOM_Node* node);
00146 void receiveReplacedText(IDOM_Node* node);
00147 void updateRangeForDeletedText(IDOM_Node* node, unsigned int offset, int count);
00148 void updateRangeForDeletedNode(IDOM_Node* node);
00149
00150 private:
00151
00152 void setStartContainer(const IDOM_Node* node);
00153 void setStartOffset(unsigned int offset) ;
00154 void setEndContainer(const IDOM_Node* node);
00155 void setEndOffset(unsigned int offset) ;
00156
00157
00158 void validateNode(const IDOM_Node* node) const;
00159 bool isValidAncestorType(const IDOM_Node* node) const;
00160 bool hasLegalRootContainer(const IDOM_Node* node) const;
00161 bool isLegalContainedNode(const IDOM_Node* node ) const;
00162 void checkIndex(const IDOM_Node* node, unsigned int offset) const;
00163 static bool isAncestorOf(const IDOM_Node* a, const IDOM_Node* b);
00164
00165 unsigned short indexOf(const IDOM_Node* child, const IDOM_Node* parent) const;
00166
00167 const IDOM_Node* commonAncestorOf(const IDOM_Node* pointA, const IDOM_Node* pointB) const;
00168 IDOM_Node* nextNode(const IDOM_Node* node, bool visitChildren) const;
00169 IDOM_DocumentFragment* traverseContents(TraversalType type);
00170 void checkReadOnly(IDOM_Node* start, IDOM_Node* end,
00171 unsigned int starOffset, unsigned int endOffset);
00172 void recurseTreeAndCheck(IDOM_Node* start, IDOM_Node* end);
00173 IDOM_Node* removeChild(IDOM_Node* parent, IDOM_Node* child);
00174
00175 IDOM_DocumentFragment* traverseSameContainer( int how );
00176 IDOM_DocumentFragment* traverseCommonStartContainer( IDOM_Node *endAncestor, int how );
00177 IDOM_DocumentFragment* traverseCommonEndContainer( IDOM_Node *startAncestor, int how );
00178 IDOM_DocumentFragment* traverseCommonAncestors( IDOM_Node *startAncestor, IDOM_Node *endAncestor, int how );
00179 IDOM_Node* traverseRightBoundary( IDOM_Node *root, int how );
00180 IDOM_Node* traverseLeftBoundary( IDOM_Node *root, int how );
00181 IDOM_Node* traverseNode( IDOM_Node *n, bool isFullySelected, bool isLeft, int how );
00182 IDOM_Node* traverseFullySelected( IDOM_Node *n, int how );
00183 IDOM_Node* traversePartiallySelected( IDOM_Node *n, int how );
00184 IDOM_Node* traverseTextNode( IDOM_Node *n, bool isLeft, int how );
00185 IDOM_Node* getSelectedNode( IDOM_Node *container, int offset );
00186
00187 };
00188
00189 #endif