rust_macios/foundation/
ns_spell_server_delegate.rs

1use std::sync::Once;
2
3use objc::{
4    class,
5    declare::ClassDecl,
6    runtime::{Class, Object, Sel},
7    sel, sel_impl,
8};
9
10use crate::objective_c_runtime::{id, traits::PNSObject};
11
12use super::{
13    Int, NSArray, NSDictionary, NSOrthography, NSRange, NSSpellServer, NSString,
14    NSTextCheckingResult, NSTextCheckingTypes, UInt, NSSPELLSERVER_PTR,
15};
16
17/// The optional methods implemented by the delegate of a spell server.
18pub trait PNSSpellServerDelegate
19where
20    Self: PNSObject,
21{
22    /* Check Grammar and Spelling in Strings
23     */
24
25    /// Gives the delegate the opportunity to analyze both the spelling and grammar simultaneously, which is more efficient.
26    #[allow(clippy::too_many_arguments)]
27    fn spell_server_check_string_offset_types_options_orthography_word_count(
28        &self,
29        _sender: NSSpellServer,
30        _string_to_check: NSString,
31        _offset: UInt,
32        _checking_types: NSTextCheckingTypes,
33        _options: NSDictionary<NSString, id>,
34        _orthography: NSOrthography,
35        _word_count: Int,
36    ) -> NSArray<NSTextCheckingResult> {
37        NSArray::default()
38    }
39
40    /// Gives the delegate the opportunity to suggest guesses to the sender for the correct spelling of the given misspelled word in the specified language.
41    fn spell_server_suggest_guesses_for_word_in_language(
42        &self,
43        _sender: NSSpellServer,
44        _word: NSString,
45        _language: NSString,
46    ) -> NSArray<NSString> {
47        NSArray::default()
48    }
49
50    /// Gives the delegate the opportunity to customize the grammatical analysis of a given string.
51    fn spell_server_check_grammar_in_string_language_details(
52        &self,
53        _sender: NSSpellServer,
54        _string_to_check: NSString,
55        _language: NSString,
56        _details: NSArray<NSDictionary<NSString, id>>,
57    ) -> NSRange {
58        NSRange::default()
59    }
60
61    /// Asks the delegate to search for a misspelled word in a given string, using the specified language, and marking the first misspelled word found by returning its range within the string.
62    fn spell_server_find_misspelled_word_in_string_language_word_count_count_only(
63        &self,
64        _sender: NSSpellServer,
65        _string_to_check: NSString,
66        _language: NSString,
67        _word_count: Int,
68        _count_only: bool,
69    ) -> NSRange {
70        NSRange::default()
71    }
72
73    /* Managing the Spelling Dictionary
74     */
75
76    /// Notifies the delegate that the sender has removed the specified word from the user’s list of acceptable words in the specified language.
77    fn spell_server_did_forget_word_in_language(
78        &self,
79        _sender: NSSpellServer,
80        _word: NSString,
81        _language: NSString,
82    ) {
83    }
84
85    /// Notifies the delegate that the sender has added the specified word to the user’s list of acceptable words in the specified language.
86    fn spell_server_did_learn_word_in_language(
87        &self,
88        _sender: NSSpellServer,
89        _word: NSString,
90        _language: NSString,
91    ) {
92    }
93
94    fn spell_server_suggest_completions_for_partial_word_range_in_string_language(
95        &self,
96        _sender: NSSpellServer,
97        _range: NSRange,
98        _string: NSString,
99        _language: NSString,
100    ) -> NSArray<NSString> {
101        NSArray::default()
102    }
103
104    fn spell_server_record_response_to_correction_for_word_language(
105        &self,
106        _sender: NSSpellServer,
107        _response: UInt,
108        _correction: NSString,
109        _word: NSString,
110        _language: NSString,
111    ) {
112    }
113}
114
115fn ns_spell_server<T>(this: &mut Object) -> &mut T {
116    unsafe {
117        let ns_spell_server_ptr: usize = *this.get_ivar(NSSPELLSERVER_PTR);
118        let ns_spell_server = ns_spell_server_ptr as *mut T;
119        &mut *ns_spell_server
120    }
121}
122
123extern "C" fn spell_server_check_string_offset_types_options_orthography_word_count<
124    T: PNSSpellServerDelegate,
125>(
126    this: &mut Object,
127    _: Sel,
128    sender: NSSpellServer,
129    string_to_check: NSString,
130    offset: UInt,
131    checking_types: NSTextCheckingTypes,
132    options: NSDictionary<NSString, *mut Object>,
133    orthography: NSOrthography,
134    word_count: Int,
135) -> NSArray<NSTextCheckingResult> {
136    ns_spell_server::<T>(this)
137        .spell_server_check_string_offset_types_options_orthography_word_count(
138            sender,
139            string_to_check,
140            offset,
141            checking_types,
142            options,
143            orthography,
144            word_count,
145        )
146}
147
148extern "C" fn spell_server_suggest_guesses_for_word_in_language<T: PNSSpellServerDelegate>(
149    this: &mut Object,
150    _: Sel,
151    sender: NSSpellServer,
152    word: NSString,
153    language: NSString,
154) -> NSArray<NSString> {
155    ns_spell_server::<T>(this)
156        .spell_server_suggest_guesses_for_word_in_language(sender, word, language)
157}
158
159extern "C" fn spell_server_check_grammar_in_string_language_details<T: PNSSpellServerDelegate>(
160    this: &mut Object,
161    _: Sel,
162    sender: NSSpellServer,
163    string_to_check: NSString,
164    language: NSString,
165    details: NSArray<NSDictionary<NSString, id>>,
166) -> NSRange {
167    ns_spell_server::<T>(this).spell_server_check_grammar_in_string_language_details(
168        sender,
169        string_to_check,
170        language,
171        details,
172    )
173}
174
175extern "C" fn spell_server_find_misspelled_word_in_string_language_word_count_count_only<
176    T: PNSSpellServerDelegate,
177>(
178    this: &mut Object,
179    _: Sel,
180    sender: NSSpellServer,
181    string_to_check: NSString,
182    language: NSString,
183    word_count: Int,
184    count_only: bool,
185) -> NSRange {
186    ns_spell_server::<T>(this)
187        .spell_server_find_misspelled_word_in_string_language_word_count_count_only(
188            sender,
189            string_to_check,
190            language,
191            word_count,
192            count_only,
193        )
194}
195
196extern "C" fn spell_server_did_forget_word_in_language<T: PNSSpellServerDelegate>(
197    this: &mut Object,
198    _: Sel,
199    sender: NSSpellServer,
200    word: NSString,
201    language: NSString,
202) {
203    ns_spell_server::<T>(this).spell_server_did_forget_word_in_language(sender, word, language)
204}
205
206extern "C" fn spell_server_did_learn_word_in_language<T: PNSSpellServerDelegate>(
207    this: &mut Object,
208    _: Sel,
209    sender: NSSpellServer,
210    word: NSString,
211    language: NSString,
212) {
213    ns_spell_server::<T>(this).spell_server_did_learn_word_in_language(sender, word, language)
214}
215
216extern "C" fn spell_server_suggest_completions_for_partial_word_range_in_string_language<
217    T: PNSSpellServerDelegate,
218>(
219    this: &mut Object,
220    _: Sel,
221    sender: NSSpellServer,
222    range: NSRange,
223    string: NSString,
224    language: NSString,
225) -> NSArray<NSString> {
226    ns_spell_server::<T>(this)
227        .spell_server_suggest_completions_for_partial_word_range_in_string_language(
228            sender, range, string, language,
229        )
230}
231
232extern "C" fn spell_server_record_response_to_correction_for_word_language<
233    T: PNSSpellServerDelegate,
234>(
235    this: &mut Object,
236    _: Sel,
237    sender: NSSpellServer,
238    response: UInt,
239    correction: NSString,
240    word: NSString,
241    language: NSString,
242) {
243    ns_spell_server::<T>(this).spell_server_record_response_to_correction_for_word_language(
244        sender, response, correction, word, language,
245    )
246}
247
248pub fn register_ns_spell_server_delegate_class<T>() -> *const Class
249where
250    T: PNSSpellServerDelegate,
251{
252    static mut DELEGATE_CLASS: *const Class = 0 as *const Class;
253    static INIT: Once = Once::new();
254
255    INIT.call_once(|| unsafe {
256        let superclass = class!(NSObject);
257        let mut decl = ClassDecl::new("RSTNSSpellServerDelegate", superclass).unwrap();
258
259        decl.add_ivar::<usize>(NSSPELLSERVER_PTR);
260
261        decl.add_method(
262            sel!(spellServer:checkString:offset:types:options:orthography:wordCount:),
263            spell_server_check_string_offset_types_options_orthography_word_count::<T>
264                as extern "C" fn(
265                    &mut Object,
266                    _,
267                    _,
268                    _,
269                    _,
270                    _,
271                    _,
272                    _,
273                    _,
274                ) -> NSArray<NSTextCheckingResult>,
275        );
276
277        decl.add_method(
278            sel!(spellServer:suggestGuessesForWord:inLanguage:),
279            spell_server_suggest_guesses_for_word_in_language::<T>
280                as extern "C" fn(&mut Object, _, _, _, _) -> NSArray<NSString>,
281        );
282
283        decl.add_method(
284            sel!(spellServer:checkGrammarInString:language:details:),
285            spell_server_check_grammar_in_string_language_details::<T>
286                as extern "C" fn(&mut Object, _, _, _, _, _) -> NSRange,
287        );
288
289        decl.add_method(
290            sel!(spellServer:findMisspelledWordInString:language:wordCount:countOnly:),
291            spell_server_find_misspelled_word_in_string_language_word_count_count_only::<T>
292                as extern "C" fn(&mut Object, _, _, _, _, _, _) -> NSRange,
293        );
294
295        decl.add_method(
296            sel!(spellServer:didForgetWord:inLanguage:),
297            spell_server_did_forget_word_in_language::<T> as extern "C" fn(&mut Object, _, _, _, _),
298        );
299
300        decl.add_method(
301            sel!(spellServer:didLearnWord:inLanguage:),
302            spell_server_did_learn_word_in_language::<T> as extern "C" fn(&mut Object, _, _, _, _),
303        );
304
305        decl.add_method(
306            sel!(spellServer:suggestCompletionsForPartialWordRange:inString:language:
307            ),
308            spell_server_suggest_completions_for_partial_word_range_in_string_language::<T>
309                as extern "C" fn(&mut Object, _, _, _, _, _) -> NSArray<NSString>,
310        );
311
312        decl.add_method(
313            sel!(spellServer:recordResponse:toCorrection:forWord:language:),
314            spell_server_record_response_to_correction_for_word_language::<T>
315                as extern "C" fn(&mut Object, _, _, _, _, _, _),
316        );
317
318        DELEGATE_CLASS = decl.register();
319    });
320
321    unsafe { DELEGATE_CLASS }
322}