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 "PlatformString.h"
27#include <wtf/Forward.h>
28
29namespace WebCore {
30
31// A range of a node within a document that is "marked", such as the range of a misspelled word.
32// It optionally includes a description that could be displayed in the user interface.
33// It also optionally includes a flag specifying whether the match is active, which is ignored
34// for all types other than type TextMatch.
35struct DocumentMarker {
36    enum MarkerType {
37        Spelling = 1 << 0,
38        Grammar = 1 << 1,
39        TextMatch = 1 << 2,
40        // Text has been modified by spell correction, reversion of spell correction or other type of substitution.
41        // On some platforms, this prevents the text from being autocorrected again. On post Snow Leopard Mac OS X,
42        // if a Replacement marker contains non-empty description, a reversion UI will be shown.
43        Replacement = 1 << 3,
44        // Renderer needs to add underline indicating that the text has been modified by spell
45        // correction. Text with Replacement marker doesn't necessarily has CorrectionIndicator
46        // marker. For instance, after some text has been corrected, it will have both Replacement
47        // and CorrectionIndicator. However, if user further modifies such text, we would remove
48        // CorrectionIndicator marker, but retain Replacement marker.
49        CorrectionIndicator = 1 << 4,
50        // Correction suggestion has been offered, but got rejected by user.
51        RejectedCorrection = 1 << 5,
52        // Text has been modified by autocorrection. The description of this marker is the original text before autocorrection.
53        Autocorrected = 1 << 6,
54        // On some platforms, this prevents the text from being spellchecked again.
55        SpellCheckingExemption = 1 << 7,
56    };
57
58    class MarkerTypes {
59    public:
60        // The constructor is intentionally implicit to allow conversion from the bit-wise sum of above types
61        MarkerTypes(unsigned mask) : m_mask(mask) { }
62
63        bool contains(MarkerType type) const { return m_mask & type; }
64        bool intersects(const MarkerTypes& types) const { return (m_mask & types.m_mask); }
65        bool operator==(const MarkerTypes& other) const { return m_mask == other.m_mask; }
66
67        void add(const MarkerTypes& types) { m_mask |= types.m_mask; }
68        void remove(const MarkerTypes& types) { m_mask &= ~types.m_mask; }
69
70    private:
71        unsigned m_mask;
72    };
73
74    class AllMarkers : public MarkerTypes {
75    public:
76        AllMarkers()
77            : MarkerTypes(Spelling | Grammar | TextMatch | Replacement | CorrectionIndicator | RejectedCorrection | Autocorrected | SpellCheckingExemption)
78        {
79        }
80    };
81
82    MarkerType type;
83    unsigned startOffset;
84    unsigned endOffset;
85    String description;
86    bool activeMatch;
87
88    bool operator==(const DocumentMarker& o) const
89    {
90        return type == o.type && startOffset == o.startOffset && endOffset == o.endOffset;
91    }
92
93    bool operator!=(const DocumentMarker& o) const
94    {
95        return !(*this == o);
96    }
97};
98
99} // namespace WebCore
100
101#endif // DocumentMarker_h
102