3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
11 #import <Carbon/Carbon.h>
12 #import <Cocoa/Cocoa.h>
14 #import <AvailabilityMacros.h>
16 #include "support/AppleSpeller.h"
18 typedef struct AppleSpellerRec {
19 NSSpellChecker * checker;
20 #if defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1050)
30 static void freeSuggestionsAppleSpeller(AppleSpeller speller)
32 if (speller->suggestions) {
33 while (speller->numsug--) {
34 free(speller->suggestions[speller->numsug]);
36 free(speller->suggestions);
37 speller->suggestions = 0;
42 AppleSpeller newAppleSpeller(void)
44 AppleSpeller speller = calloc(1, sizeof(AppleSpellerRec));
45 speller->checker = [NSSpellChecker sharedSpellChecker];
46 speller->suggestions = 0;
47 speller->doctag = [NSSpellChecker uniqueSpellDocumentTag];
52 void freeAppleSpeller(AppleSpeller speller)
54 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
56 freeSuggestionsAppleSpeller(speller);
57 [speller->checker closeSpellDocumentWithTag:speller->doctag];
65 static NSString * toString(AppleSpeller speller, const char * word)
67 return [[NSString alloc] initWithBytes:word length:strlen(word) encoding:NSUTF8StringEncoding];
71 int checkAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
73 if (!speller->checker || !lang || !word)
76 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
77 NSString * word_ = toString(speller, word);
78 NSString * lang_ = toString(speller, lang);
80 NSRange result = [speller->checker
81 checkSpellingOfString:word_
85 inSpellDocumentWithTag:speller->doctag
92 return (result.length ? 0 : 1);
96 void ignoreAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
98 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
99 NSString * word_ = toString(speller, word);
101 [speller->checker ignoreWord:word_ inSpellDocumentWithTag:(speller->doctag)];
108 size_t makeSuggestionAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
110 if (!speller->checker || !word || !lang)
113 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
114 NSString * word_ = toString(speller, word);
115 NSString * lang_ = toString(speller, lang);
118 #if defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1060)
119 // Mac OS X 10.6 only
120 NSInteger slen = [word_ length];
121 NSRange range = { 0, slen };
123 if ([NSSpellChecker instancesRespondToSelector:@selector(guessesForWordRange:)]) {
124 result = [speller->checker guessesForWordRange:range
127 inSpellDocumentWithTag:speller->doctag];
129 [speller->checker setLanguage:lang_];
130 result = [speller->checker guessesForWord:word_];
133 [speller->checker setLanguage:lang_];
134 result = [speller->checker guessesForWord:word_];
140 freeSuggestionsAppleSpeller(speller);
142 speller->numsug = [result count];
143 if (speller->numsug) {
144 speller->suggestions = calloc(speller->numsug + 1, sizeof(char *));
145 if (speller->suggestions) {
147 for (i = 0; i < speller->numsug; i++) {
148 NSString * str = [result objectAtIndex:i];
149 speller->suggestions[i] = strdup([str UTF8String]);
151 speller->suggestions[speller->numsug] = 0;
155 return speller->numsug;
159 const char * getSuggestionAppleSpeller(AppleSpeller speller, size_t pos)
161 const char * result = 0;
162 if (pos < speller->numsug && speller->suggestions) {
163 result = speller->suggestions[pos] ;
169 void learnAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
171 #if defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1050)
172 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
173 NSString * word_ = toString(speller, word);
175 if ([NSSpellChecker instancesRespondToSelector:@selector(learnWord)])
176 [speller->checker learnWord:word_];
184 int hasLanguageAppleSpeller(AppleSpeller speller, const char * lang)
187 #if defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && (__MAC_OS_X_VERSION_MAX_ALLOWED >= 1050)
188 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
189 NSString * lang_ = toString(speller, lang);
190 if ([NSSpellChecker instancesRespondToSelector:@selector(availableLanguages)]) {
191 NSArray * languages = [speller->checker availableLanguages];
193 for (NSString *element in languages) {
194 result = [element isEqualToString:lang_] || [lang_ hasPrefix:element];
203 return result ? 1 : 0;