Replace 0 and NULL with nullptr in WebCore/editing.
[WebKit-https.git] / Source / WebCore / editing / mac / AlternativeTextUIController.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 "AlternativeTextUIController.h"
28
29 #if USE(DICTATION_ALTERNATIVES)
30 #import <AppKit/NSSpellChecker.h>
31 #import <AppKit/NSTextAlternatives.h>
32 #import <AppKit/NSView.h>
33
34 namespace WebCore {
35
36 uint64_t AlternativeTextUIController::AlernativeTextContextController::addAlternatives(const RetainPtr<NSTextAlternatives>& alternatives)
37 {
38     uint64_t context = reinterpret_cast<uint64_t>(alternatives.get());
39     if (!context)
40         return invalidContext;
41     if (alternativesForContext(context))
42         return context;
43
44     HashMapType::AddResult result = m_alternativesObjectMap.add(context, alternatives);
45     return result.isNewEntry ? context : invalidContext;
46 }
47
48 NSTextAlternatives* AlternativeTextUIController::AlernativeTextContextController::alternativesForContext(uint64_t context)
49 {
50     return m_alternativesObjectMap.get(context).get();
51 }
52
53 void AlternativeTextUIController::AlernativeTextContextController::removeAlternativesForContext(uint64_t context)
54 {
55     m_alternativesObjectMap.remove(context);
56 }
57
58 void AlternativeTextUIController::AlernativeTextContextController::clear()
59 {
60     m_alternativesObjectMap.clear();
61 }
62
63 uint64_t AlternativeTextUIController::addAlternatives(const RetainPtr<NSTextAlternatives>& alternatives)
64 {
65     return m_contextController.addAlternatives(alternatives);
66 }
67
68 Vector<String> AlternativeTextUIController::alternativesForContext(uint64_t context)
69 {
70     NSTextAlternatives* textAlternatives = m_contextController.alternativesForContext(context);
71     Vector<String> alternativeStrings;
72     for (NSString* string in textAlternatives.alternativeStrings)
73         alternativeStrings.append(string);
74     return alternativeStrings;
75 }
76
77 void AlternativeTextUIController::clear()
78 {
79     return m_contextController.clear();
80 }
81
82 void AlternativeTextUIController::showAlternatives(NSView* view, const FloatRect& boundingBoxOfPrimaryString, uint64_t context, void(^acceptanceHandler)(NSString*))
83 {
84     dismissAlternatives();
85     if (!view)
86         return;
87
88     m_view = view;
89     NSTextAlternatives* alternatives = m_contextController.alternativesForContext(context);
90     if (!alternatives)
91         return;
92
93     [[NSSpellChecker sharedSpellChecker] showCorrectionIndicatorOfType:NSCorrectionIndicatorTypeGuesses primaryString:alternatives.primaryString alternativeStrings:alternatives.alternativeStrings forStringInRect:boundingBoxOfPrimaryString view:m_view.get() completionHandler:^(NSString* acceptedString) {
94         if (acceptedString) {
95             handleAcceptedAlternative(acceptedString, context, alternatives);
96             acceptanceHandler(acceptedString);
97         }
98     }];
99 }
100
101 void AlternativeTextUIController::handleAcceptedAlternative(NSString* acceptedAlternative, uint64_t context, NSTextAlternatives* alternatives)
102 {
103     [alternatives noteSelectedAlternativeString:acceptedAlternative];
104     m_contextController.removeAlternativesForContext(context);
105     m_view.clear();
106 }
107
108 void AlternativeTextUIController::dismissAlternatives()
109 {
110     if (!m_view)
111         return;
112     [[NSSpellChecker sharedSpellChecker] dismissCorrectionIndicatorForView:m_view.get()];
113 }
114
115 void AlternativeTextUIController::removeAlternatives(uint64_t context)
116 {
117     m_contextController.removeAlternativesForContext(context);
118 }
119 }
120 #endif // USE(DICTATION_ALTERNATIVES)