Generate bindings code for EventTarget.addEventListener() / removeEventListener()
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / PDF / PDFPluginTextAnnotation.mm
1 /*
2  * Copyright (C) 2012 Apple 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
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "PDFPluginTextAnnotation.h"
28
29 #if ENABLE(PDFKIT_PLUGIN)
30
31 #import "PDFAnnotationTextWidgetDetails.h"
32 #import "PDFKitImports.h"
33 #import "PDFLayerControllerSPI.h"
34 #import "PDFPlugin.h"
35 #import <PDFKit/PDFKit.h>
36 #import <WebCore/CSSPrimitiveValue.h>
37 #import <WebCore/CSSPropertyNames.h>
38 #import <WebCore/ColorMac.h>
39 #import <WebCore/Event.h>
40 #import <WebCore/HTMLElement.h>
41 #import <WebCore/HTMLInputElement.h>
42 #import <WebCore/HTMLNames.h>
43 #import <WebCore/HTMLTextAreaElement.h>
44 #import <WebCore/KeyboardEvent.h>
45 #import <WebCore/Page.h>
46
47 using namespace WebCore;
48
49 namespace WebKit {
50
51 using namespace HTMLNames;
52
53 static const String cssAlignmentValueForNSTextAlignment(NSTextAlignment alignment)
54 {
55 #pragma clang diagnostic push
56 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
57     switch (alignment) {
58     case NSLeftTextAlignment:
59         return "left";
60     case NSRightTextAlignment:
61         return "right";
62     case NSCenterTextAlignment:
63         return "center";
64     case NSJustifiedTextAlignment:
65         return "justify";
66     case NSNaturalTextAlignment:
67         return "-webkit-start";
68     }
69 #pragma clang diagnostic pop
70     ASSERT_NOT_REACHED();
71     return String();
72 }
73
74 Ref<PDFPluginTextAnnotation> PDFPluginTextAnnotation::create(PDFAnnotation *annotation, PDFLayerController *pdfLayerController, PDFPlugin* plugin)
75 {
76     return adoptRef(*new PDFPluginTextAnnotation(annotation, pdfLayerController, plugin));
77 }
78
79 PDFPluginTextAnnotation::~PDFPluginTextAnnotation()
80 {
81     element()->removeEventListener(eventNames().keydownEvent, *eventListener(), false);
82 }
83
84 PassRefPtr<Element> PDFPluginTextAnnotation::createAnnotationElement()
85 {
86     RefPtr<Element> element;
87
88     Document& document = parent()->document();
89 #pragma clang diagnostic push
90 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
91     PDFAnnotationTextWidget *textAnnotation = this->textAnnotation();
92 #pragma clang diagnostic pop
93     bool isMultiline = textAnnotation.isMultiline;
94
95     if (isMultiline)
96         element = document.createElement(textareaTag, false);
97     else
98         element = document.createElement(inputTag, false);
99
100     element->addEventListener(eventNames().keydownEvent, *eventListener(), false);
101
102     StyledElement* styledElement = static_cast<StyledElement*>(element.get());
103
104     if (!textAnnotation)
105         return element;
106
107     // FIXME: Match font weight and style as well?
108     styledElement->setInlineStyleProperty(CSSPropertyColor, colorFromNSColor(textAnnotation.fontColor).serialized());
109     styledElement->setInlineStyleProperty(CSSPropertyFontFamily, textAnnotation.font.familyName);
110     styledElement->setInlineStyleProperty(CSSPropertyTextAlign, cssAlignmentValueForNSTextAlignment(textAnnotation.alignment));
111
112     if (isMultiline)
113         downcast<HTMLTextAreaElement>(styledElement)->setValue(textAnnotation.stringValue);
114     else
115         downcast<HTMLInputElement>(styledElement)->setValue(textAnnotation.stringValue);
116
117     return element;
118 }
119
120 void PDFPluginTextAnnotation::updateGeometry()
121 {
122     PDFPluginAnnotation::updateGeometry();
123
124     StyledElement* styledElement = static_cast<StyledElement*>(element());
125     styledElement->setInlineStyleProperty(CSSPropertyFontSize, textAnnotation().font.pointSize * pdfLayerController().contentScaleFactor, CSSPrimitiveValue::CSS_PX);
126 }
127
128 void PDFPluginTextAnnotation::commit()
129 {
130     textAnnotation().stringValue = value();
131     PDFPluginAnnotation::commit();
132 }
133
134 String PDFPluginTextAnnotation::value() const
135 {
136     return downcast<HTMLTextFormControlElement>(element())->value();
137 }
138
139 bool PDFPluginTextAnnotation::handleEvent(Event* event)
140 {
141     if (PDFPluginAnnotation::handleEvent(event))
142         return true;
143
144     if (event->isKeyboardEvent() && event->type() == eventNames().keydownEvent) {
145         KeyboardEvent* keyboardEvent = static_cast<KeyboardEvent*>(event);
146
147         if (keyboardEvent->keyIdentifier() == "U+0009") {
148             if (keyboardEvent->ctrlKey() || keyboardEvent->metaKey() || keyboardEvent->altGraphKey())
149                 return false;
150
151             if (keyboardEvent->shiftKey())
152                 plugin()->focusPreviousAnnotation();
153             else
154                 plugin()->focusNextAnnotation();
155             
156             event->preventDefault();
157             return true;
158         }
159     }
160
161     return false;
162 }
163
164 } // namespace WebKit
165
166 #endif // ENABLE(PDFKIT_PLUGIN)