-
Notifications
You must be signed in to change notification settings - Fork 2
/
Preferences.m
281 lines (232 loc) · 6.91 KB
/
Preferences.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*
* DictionaryReader - A Dict client for GNUstep
* Copyright (C) 2006 Guenther Noack
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the MIT license. See COPYING.
*/
#import "Preferences.h"
#import "DictConnection.h"
#import "LocalDictionary.h"
#import "GNUstep.h"
@implementation Preferences
// Singleton
+ (id) shared
{
static Preferences *sharedPreferences = nil;
if (sharedPreferences == nil)
{
sharedPreferences = [[Preferences alloc] init];
}
return sharedPreferences;
}
- (void) setDictionaries: (NSMutableArray *) dicts
{
NSParameterAssert(dicts != nil);
NSAssert(_dictionaries == nil || _dictionaries == dicts,
@"You can't set the dictionary handle array twice and to different"
@" values for the preferences panel.");
int i;
for (i = 0; i < [dicts count]; i++)
{
NSAssert2(
[[dicts objectAtIndex: i] isKindOfClass: [DictionaryHandle class]],
@"'%@' is not a Dictionary Handle object but a %@ object!",
[dicts objectAtIndex: i],
[dicts class]
);
}
ASSIGN(_dictionaries, dicts);
[_tableView reloadData];
}
- (void) rescanDictionaries: (id)sender
{
NSAssert(_dictionaries != nil,
@"The preference panel must be given a dictionary handle list!");
// NOTE: Before releasing all dictionaries, take care to close all open
// connections to avoid a crash.
/* Remove all dictionaries before rescan */
[_dictionaries removeAllObjects];
[self searchWithDictionaryStoreFile];
[self searchInUsualPlaces];
// default remote dictionary: dict.org
DictConnection* dict = [[DictConnection alloc] initWithDefaultHost];
if ([_dictionaries count] > 0)
[dict setActive: NO];
else
[dict setActive: YES];
[self foundDictionary: dict];
DESTROY(dict);
[_tableView reloadData];
}
- (void) show
{
[_prefPanel orderFront: self];
[NSApp runModalForWindow: _prefPanel];
}
- (void) windowWillClose: (NSNotification *) not
{
if ([NSApp modalWindow] == _prefPanel)
[NSApp stopModal];
}
- (void) awakeFromNib
{
NSButtonCell* cell = (NSButtonCell*)[[_tableView tableColumnWithIdentifier: @"active"] dataCell];
[cell setEditable: YES];
[cell setEnabled: YES];
[cell setSelectable: YES];
[cell setTitle: @""];
[cell setButtonType: NSSwitchButton];
[_prefPanel setReleasedWhenClosed: NO];
}
@end
@implementation Preferences (SearchForDictionaries)
- (NSString *) dictionaryStoreFile
{
NSFileManager *fm = [NSFileManager defaultManager];
NSString *path = [@"~/GNUstep/Library/DictionaryReader" stringByExpandingTildeInPath];
BOOL isDir = NO;
if ([fm fileExistsAtPath: path isDirectory: &isDir] == NO)
{
/* Directory does not exist, create it */
if ([fm createDirectoryAtPath: path attributes: nil] == NO)
{
/* Cannot create path */
NSLog(@"Error: cannot create ~/GNUstep/Library/DictionaryReader/");
return nil;
}
}
else if (isDir == NO)
{
/* path exist, but not a directory */
NSLog(@"Error: ~/GNUstep/Library/DictionaryReader is not a directory");
return nil;
}
/* path exists, and is a directory. do nothing */
return [path stringByAppendingPathComponent: @"dictionaries.plist"];
}
- (void) foundDictionary: (id) aDictionary
{
if (aDictionary != nil &&
[_dictionaries containsObject: aDictionary] == NO)
{
[_dictionaries addObject: aDictionary];
}
}
- (void) searchWithDictionaryStoreFile
{
NSString *dictStoreFile = [self dictionaryStoreFile];
if ([[NSFileManager defaultManager] fileExistsAtPath: dictStoreFile])
{
NSArray *plist = [NSArray arrayWithContentsOfFile: [self dictionaryStoreFile]];
int i;
for (i = 0; i < [plist count]; i++)
{
DictionaryHandle *dict = [DictionaryHandle dictionaryFromPropertyList: [plist objectAtIndex: i]];
if (dict)
[self foundDictionary: dict];
}
}
}
- (void) searchInUsualPlaces
{
NSArray* searchPaths = [NSArray arrayWithObjects:
@"~/GNUstep/Library/DictionaryReader/Dictionaries", // user home
/* Add more location if needed */
nil
];
int i;
for (i = 0; i < [searchPaths count]; i++)
{
[self searchInDirectory:
[[searchPaths objectAtIndex: i] stringByExpandingTildeInPath]];
}
}
- (void) searchInDirectory: (NSString *) dirName;
{
NSFileManager* manager = [NSFileManager defaultManager];
NSArray* files = [manager directoryContentsAtPath: dirName];
if ((files == nil) || ([files count] == 0))
return; // directory not present or empty
int i;
for (i = 0; i < [files count]; i++)
{
NSString* fileName = [files objectAtIndex: i];
NSString* pathExtension = [fileName pathExtension];
NSString* indexFileName;
if ([pathExtension isEqualToString: @"dict"]
#ifdef GNUSTEP
|| [pathExtension isEqualToString: @"dz"]
#endif // GNUSTEP
)
{
// Find out the index file name by cutting all path extensions, then adding .index!
indexFileName = fileName;
do {
indexFileName = [indexFileName stringByDeletingPathExtension];
} while ([[indexFileName pathExtension] isEqualToString: @""] == NO);
indexFileName = [indexFileName stringByAppendingPathExtension: @"index"];
if ([files containsObject: indexFileName])
{
indexFileName = [dirName stringByAppendingPathComponent: indexFileName];
fileName = [dirName stringByAppendingPathComponent: fileName];
LocalDictionary* dict =
[LocalDictionary dictionaryWithIndexAtPath: indexFileName
dictionaryAtPath: fileName];
[dict setActive: YES];
[self foundDictionary: dict];
}
}
}
}
@end
/**
* Responding to TableView delegate messages
*/
@implementation Preferences (DictionarySelectionDataSource)
/**
* Returns the number of rows in the dictionary selection table.
*/
- (int) numberOfRowsInTableView: (NSTableView *)aTableView
{
return [_dictionaries count];
}
/**
* This is called when the object value for a table cell changes.
* This is where the dictionary selection gets changed.
*/
-(void) tableView: (NSTableView*) aTableView
setObjectValue: (id) anObj
forTableColumn: (NSTableColumn*) aTableColumn
row: (int) rowIndex
{
if ([[aTableColumn identifier] isEqualToString: @"active"])
{
[[_dictionaries objectAtIndex: rowIndex] setActive: [anObj intValue]];
[[NSNotificationCenter defaultCenter]
postNotificationName: DRActiveDictsChangedNotification
object: _dictionaries];
}
}
/**
* Returns the value of a table cell.
*/
- (id) tableView: (NSTableView *)aTableView
objectValueForTableColumn: (NSTableColumn *)aTableColumn
row: (int)rowIndex
{
if ([[aTableColumn identifier] isEqualToString: @"active"])
{
return [NSNumber numberWithBool: [[_dictionaries objectAtIndex: rowIndex] isActive]];
}
else
{
NSAssert1(
[[aTableColumn identifier] isEqualToString: @"name"],
@"Unknown column identifier '%@'",
[aTableColumn identifier]
);
return [[_dictionaries objectAtIndex: rowIndex] description];
}
}
@end