1/*
2 * Copyright (C) 2008 Nuanti Ltd.
3 * Copyright (C) 2009 Jan Alonzo
4 * Copyright (C) 2011, 2012 Igalia S.L.
5 *
6 * Portions from Mozilla a11y, copyright as follows:
7 *
8 * The Original Code is mozilla.org code.
9 *
10 * The Initial Developer of the Original Code is
11 * Sun Microsystems, Inc.
12 * Portions created by the Initial Developer are Copyright (C) 2002
13 * the Initial Developer. All Rights Reserved.
14 *
15 * This library is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU Library General Public
17 * License as published by the Free Software Foundation; either
18 * version 2 of the License, or (at your option) any later version.
19 *
20 * This library is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23 * Library General Public License for more details.
24 *
25 * You should have received a copy of the GNU Library General Public License
26 * along with this library; see the file COPYING.LIB.  If not, write to
27 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
28 * Boston, MA 02110-1301, USA.
29 */
30
31#include "config.h"
32#include "WebKitAccessibleInterfaceEditableText.h"
33
34#if HAVE(ACCESSIBILITY)
35
36#include "AccessibilityObject.h"
37#include "Document.h"
38#include "Editor.h"
39#include "Frame.h"
40#include "NotImplemented.h"
41#include "WebKitAccessibleWrapperAtk.h"
42
43using namespace WebCore;
44
45static AccessibilityObject* core(AtkEditableText* text)
46{
47    if (!WEBKIT_IS_ACCESSIBLE(text))
48        return 0;
49
50    return webkitAccessibleGetAccessibilityObject(WEBKIT_ACCESSIBLE(text));
51}
52
53static gboolean webkitAccessibleEditableTextSetRunAttributes(AtkEditableText*, AtkAttributeSet*, gint, gint)
54{
55    notImplemented();
56    return FALSE;
57}
58
59static void webkitAccessibleEditableTextSetTextContents(AtkEditableText* text, const gchar* string)
60{
61    // FIXME: string nullcheck?
62    core(text)->setValue(String::fromUTF8(string));
63}
64
65static void webkitAccessibleEditableTextInsertText(AtkEditableText* text, const gchar* string, gint length, gint* position)
66{
67    if (!string)
68        return;
69
70    AccessibilityObject* coreObject = core(text);
71    // FIXME: Not implemented in WebCore
72    // coreObject->setSelectedTextRange(PlainTextRange(*position, 0));
73    // coreObject->setSelectedText(String::fromUTF8(string));
74
75    Document* document = coreObject->document();
76    if (!document || !document->frame())
77        return;
78
79    coreObject->setSelectedVisiblePositionRange(coreObject->visiblePositionRangeForRange(PlainTextRange(*position, 0)));
80    coreObject->setFocused(true);
81    // FIXME: We should set position to the actual inserted text length, which may be less than that requested.
82    if (document->frame()->editor().insertTextWithoutSendingTextEvent(String::fromUTF8(string).substring(0, length), false, 0))
83        *position += length;
84}
85
86static void webkitAccessibleEditableTextCopyText(AtkEditableText*, gint, gint)
87{
88    notImplemented();
89}
90
91static void webkitAccessibleEditableTextCutText(AtkEditableText*, gint, gint)
92{
93    notImplemented();
94}
95
96static void webkitAccessibleEditableTextDeleteText(AtkEditableText* text, gint startPos, gint endPos)
97{
98    AccessibilityObject* coreObject = core(text);
99    // FIXME: Not implemented in WebCore
100    // coreObject->setSelectedTextRange(PlainTextRange(startPos, endPos - startPos));
101    // coreObject->setSelectedText(String());
102
103    Document* document = coreObject->document();
104    if (!document || !document->frame())
105        return;
106
107    coreObject->setSelectedVisiblePositionRange(coreObject->visiblePositionRangeForRange(PlainTextRange(startPos, endPos - startPos)));
108    coreObject->setFocused(true);
109    document->frame()->editor().performDelete();
110}
111
112static void webkitAccessibleEditableTextPasteText(AtkEditableText*, gint)
113{
114    notImplemented();
115}
116
117void webkitAccessibleEditableTextInterfaceInit(AtkEditableTextIface* iface)
118{
119    iface->set_run_attributes = webkitAccessibleEditableTextSetRunAttributes;
120    iface->set_text_contents = webkitAccessibleEditableTextSetTextContents;
121    iface->insert_text = webkitAccessibleEditableTextInsertText;
122    iface->copy_text = webkitAccessibleEditableTextCopyText;
123    iface->cut_text = webkitAccessibleEditableTextCutText;
124    iface->delete_text = webkitAccessibleEditableTextDeleteText;
125    iface->paste_text = webkitAccessibleEditableTextPasteText;
126}
127
128#endif
129