1/*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef AbstractInlineTextBox_h
32#define AbstractInlineTextBox_h
33
34#include "core/dom/Range.h"
35#include "core/rendering/InlineTextBox.h"
36#include "core/rendering/RenderText.h"
37#include "wtf/HashMap.h"
38#include "wtf/RefPtr.h"
39
40namespace blink {
41
42class InlineTextBox;
43
44// High-level abstraction of InlineTextBox to allow the accessibility module to
45// get information about InlineTextBoxes without tight coupling.
46class AbstractInlineTextBox : public RefCounted<AbstractInlineTextBox> {
47private:
48    AbstractInlineTextBox(RenderText* renderText, InlineTextBox* inlineTextBox)
49        : m_renderText(renderText)
50        , m_inlineTextBox(inlineTextBox)
51    {
52    }
53
54    static PassRefPtr<AbstractInlineTextBox> getOrCreate(RenderText*, InlineTextBox*);
55    static void willDestroy(InlineTextBox*);
56
57    friend class RenderText;
58    friend class InlineTextBox;
59
60public:
61    struct WordBoundaries {
62        WordBoundaries(int startIndex, int endIndex) : startIndex(startIndex), endIndex(endIndex) { }
63        int startIndex;
64        int endIndex;
65    };
66
67    enum Direction {
68        LeftToRight,
69        RightToLeft,
70        TopToBottom,
71        BottomToTop
72    };
73
74    RenderText* renderText() const { return m_renderText; }
75
76    PassRefPtr<AbstractInlineTextBox> nextInlineTextBox() const;
77    LayoutRect bounds() const;
78    unsigned start() const;
79    unsigned len() const;
80    Direction direction() const;
81    void characterWidths(Vector<float>&) const;
82    void wordBoundaries(Vector<WordBoundaries>&) const;
83    String text() const;
84
85private:
86    void detach();
87
88    // Weak ptrs; these are nulled when InlineTextBox::destroy() calls AbstractInlineTextBox::willDestroy.
89    RenderText* m_renderText;
90    InlineTextBox* m_inlineTextBox;
91
92    typedef HashMap<InlineTextBox*, RefPtr<AbstractInlineTextBox> > InlineToAbstractInlineTextBoxHashMap;
93    static InlineToAbstractInlineTextBoxHashMap* gAbstractInlineTextBoxMap;
94};
95
96} // namespace blink
97
98#endif // AbstractInlineTextBox_h
99