1 /* 2 * This file is part of the DOM implementation for WebCore. 3 * 4 * Copyright (C) 2006 Apple Computer, Inc. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public License 17 * along with this library; see the file COPYING.LIB. If not, write to 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #ifndef DocumentMarker_h 24 #define DocumentMarker_h 25 26 #include "wtf/Forward.h" 27 #include "wtf/RefCounted.h" 28 #include "wtf/RefPtr.h" 29 #include "wtf/text/WTFString.h" 30 31 namespace WebCore { 32 33 class DocumentMarkerDetails; 34 35 // A range of a node within a document that is "marked", such as the range of a misspelled word. 36 // It optionally includes a description that could be displayed in the user interface. 37 // It also optionally includes a flag specifying whether the match is active, which is ignored 38 // for all types other than type TextMatch. 39 class DocumentMarker { 40 public: 41 enum MarkerTypeIndex { 42 SpellingMarkerIndex = 0, 43 GramarMarkerIndex, 44 TextMatchMarkerIndex, 45 InvisibleSpellcheckMarkerIndex, 46 MarkerTypeIndexesCount 47 }; 48 49 enum MarkerType { 50 Spelling = 1 << SpellingMarkerIndex, 51 Grammar = 1 << GramarMarkerIndex, 52 TextMatch = 1 << TextMatchMarkerIndex, 53 InvisibleSpellcheck = 1 << InvisibleSpellcheckMarkerIndex 54 }; 55 56 class MarkerTypes { 57 public: 58 // The constructor is intentionally implicit to allow conversion from the bit-wise sum of above types 59 MarkerTypes(unsigned mask) : m_mask(mask) { } 60 61 bool contains(MarkerType type) const { return m_mask & type; } 62 bool intersects(const MarkerTypes& types) const { return (m_mask & types.m_mask); } 63 bool operator==(const MarkerTypes& other) const { return m_mask == other.m_mask; } 64 65 void add(const MarkerTypes& types) { m_mask |= types.m_mask; } 66 void remove(const MarkerTypes& types) { m_mask &= ~types.m_mask; } 67 68 private: 69 unsigned m_mask; 70 }; 71 72 class AllMarkers : public MarkerTypes { 73 public: 74 AllMarkers() 75 : MarkerTypes(Spelling | Grammar | TextMatch | InvisibleSpellcheck) 76 { 77 } 78 }; 79 80 class MisspellingMarkers : public MarkerTypes { 81 public: 82 MisspellingMarkers() 83 : MarkerTypes(Spelling | Grammar) 84 { 85 } 86 }; 87 88 class SpellCheckClientMarkers : public MarkerTypes { 89 public: 90 SpellCheckClientMarkers() 91 : MarkerTypes(Spelling | Grammar | InvisibleSpellcheck) 92 { 93 } 94 }; 95 96 DocumentMarker(); 97 DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset); 98 DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, const String& description); 99 DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, const String& description, uint32_t hash); 100 DocumentMarker(unsigned startOffset, unsigned endOffset, bool activeMatch); 101 DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, PassRefPtr<DocumentMarkerDetails>); 102 103 MarkerType type() const { return m_type; } 104 unsigned startOffset() const { return m_startOffset; } 105 unsigned endOffset() const { return m_endOffset; } 106 uint32_t hash() const { return m_hash; } 107 108 const String& description() const; 109 bool activeMatch() const; 110 DocumentMarkerDetails* details() const; 111 112 void setActiveMatch(bool); 113 void clearDetails() { m_details.clear(); } 114 115 // Offset modifications are done by DocumentMarkerController. 116 // Other classes should not call following setters. 117 void setStartOffset(unsigned offset) { m_startOffset = offset; } 118 void setEndOffset(unsigned offset) { m_endOffset = offset; } 119 void shiftOffsets(int delta); 120 121 bool operator==(const DocumentMarker& o) const 122 { 123 return type() == o.type() && startOffset() == o.startOffset() && endOffset() == o.endOffset(); 124 } 125 126 bool operator!=(const DocumentMarker& o) const 127 { 128 return !(*this == o); 129 } 130 131 private: 132 MarkerType m_type; 133 unsigned m_startOffset; 134 unsigned m_endOffset; 135 RefPtr<DocumentMarkerDetails> m_details; 136 uint32_t m_hash; 137 }; 138 139 inline DocumentMarkerDetails* DocumentMarker::details() const 140 { 141 return m_details.get(); 142 } 143 144 class DocumentMarkerDetails : public RefCounted<DocumentMarkerDetails> 145 { 146 public: 147 DocumentMarkerDetails() { } 148 virtual ~DocumentMarkerDetails(); 149 virtual bool isDescription() const { return false; } 150 virtual bool isTextMatch() const { return false; } 151 }; 152 153 } // namespace WebCore 154 155 #endif // DocumentMarker_h 156