Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMLibraryViewController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 268 - (hide annotations) (download)
Sat Jan 16 22:49:14 2010 UTC (14 years, 3 months ago) by masaki
File size: 7676 byte(s)
[Mod] ライブラリの固定項目のローカライズ方法を変更。
1 masaki 41 //
2     // XspfMLibraryViewController.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/08.
6     // Copyright 2009 masakih. All rights reserved.
7     //
8    
9     #import "XspfMLibraryViewController.h"
10    
11 masaki 113 #import "XspfMXspfListObject.h"
12    
13    
14 masaki 43 @interface XspfMLibraryViewController (HMPrivate)
15     - (NSArray *)sortDescriptors;
16     - (void)setupXspfList;
17     @end
18 masaki 41
19 masaki 113 enum {
20     kLibraryOrder = 0,
21     kFavoritesOrder,
22     kSmartLibraryOrder,
23     };
24    
25 masaki 41 @implementation XspfMLibraryViewController
26 masaki 113
27 masaki 41 - (id)init
28     {
29     [super initWithNibName:@"LibraryView" bundle:nil];
30    
31 masaki 43 [self setupXspfList];
32    
33 masaki 41 return self;
34     }
35    
36 masaki 43 - (void)awakeFromNib
37     {
38     [[self representedObject] setSortDescriptors:[self sortDescriptors]];
39     }
40 masaki 41 - (NSArray *)sortDescriptors
41     {
42 masaki 61 id desc = [[NSSortDescriptor alloc] initWithKey:@"order" ascending:YES];
43     return [NSArray arrayWithObject:[desc autorelease]];
44 masaki 41 }
45 masaki 233 - (XspfMDragControl *)dragControl
46     {
47     return dragControl;
48     }
49 masaki 43
50 masaki 113 - (void)addSmartLibrary:(NSString *)name predicate:(NSPredicate *)predicate order:(NSInteger)order
51     {
52     id obj = [NSEntityDescription insertNewObjectForEntityForName:@"XspfList"
53     inManagedObjectContext:[self managedObjectContext]];
54     [obj setValue:predicate forKey:@"predicate"];
55     [obj setValue:name forKey:@"name"];
56     [obj setValue:[NSNumber numberWithInt:order] forKey:@"order"];
57     }
58 masaki 43 - (void)setupXspfList
59     {
60 masaki 48 NSManagedObjectContext *moc = [self managedObjectContext];
61 masaki 43 NSError *error = nil;
62     NSFetchRequest *fetch;
63     NSInteger num;
64    
65     fetch = [[[NSFetchRequest alloc] init] autorelease];
66     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
67     inManagedObjectContext:moc]];
68     num = [moc countForFetchRequest:fetch
69     error:&error];
70     if(num != 0) return;
71    
72     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString <> %@", @""];
73 masaki 268 [self addSmartLibrary:@"Library"
74 masaki 113 predicate:predicate
75     order:kLibraryOrder];
76 masaki 43
77     predicate = [NSPredicate predicateWithFormat:@"favorites = %@", [NSNumber numberWithBool:YES]];
78 masaki 268 [self addSmartLibrary:@"Favorites"
79 masaki 113 predicate:predicate
80     order:kFavoritesOrder];
81 masaki 43 }
82    
83 masaki 235 - (BOOL)mouseInTableView
84     {
85     NSEvent *event = [[[self view] window] currentEvent];
86     NSPoint mouse = [[tableView superview] convertPoint:[event locationInWindow] fromView:nil];
87    
88     return NSPointInRect(mouse, [tableView visibleRect]);
89     }
90 masaki 113 - (XspfMXspfListObject *)targetObject
91     {
92     id array = [[self representedObject] arrangedObjects];
93    
94     NSInteger row = [tableView clickedRow];
95     if(row >= 0 && [array count] > row) {
96     return [array objectAtIndex:row];
97     }
98 masaki 235
99     if(![self mouseInTableView]) {
100     NSArray *selection = [[self representedObject] selectedObjects];
101     if([selection count] != 0) {
102     return [selection objectAtIndex:0];
103     }
104     }
105 masaki 113 return nil;
106     }
107 masaki 235
108    
109 masaki 116 - (BOOL)canUseNewSmartLibraryName:(NSString *)newName
110     {
111     NSManagedObjectContext *moc = [self managedObjectContext];
112     NSError *error = nil;
113     NSFetchRequest *fetch;
114     NSPredicate *predicate;
115     NSInteger num;
116    
117     fetch = [[[NSFetchRequest alloc] init] autorelease];
118     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
119     inManagedObjectContext:moc]];
120     predicate = [NSPredicate predicateWithFormat:@"name = %@", newName];
121     [fetch setPredicate:predicate];
122     num = [moc countForFetchRequest:fetch
123     error:&error];
124    
125     return num == 0;
126     }
127     - (NSString *)newSmartLibraryName
128     {
129     NSString *template = NSLocalizedString(@"Untitled Library", @"Untitled Library");
130    
131     if([self canUseNewSmartLibraryName:template]) return template;
132    
133     NSInteger i = 1;
134     do {
135     NSString *name = [NSString stringWithFormat:@"%@ %d", template, i];
136     if([self canUseNewSmartLibraryName:name]) return name;
137     } while (i++ < INT_MAX);
138    
139     return @"hoge";
140     }
141 masaki 112 - (IBAction)newPredicate:(id)sender
142 masaki 43 {
143 masaki 112 if([editor numberOfRows] == 0) {
144     [editor addRow:self];
145     }
146 masaki 147
147 masaki 116 [nameField setStringValue:[self newSmartLibraryName]];
148 masaki 113 [nameField selectText:self];
149    
150 masaki 112 [NSApp beginSheet:predicatePanel
151     modalForWindow:[tableView window]
152     modalDelegate:self
153     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
154     contextInfo:@"Createion"];
155 masaki 43 }
156 masaki 113 - (IBAction)editPredicate:(id)sender
157     {
158 masaki 235 XspfMXspfListObject *obj = [sender representedObject];
159     if(!obj) {
160     HMLog(HMLogLevelError, @"-[%@ %@] paramater's representedObject is nil.",
161     NSStringFromClass([self class]), NSStringFromSelector(_cmd));
162     return;
163     }
164 masaki 113 [nameField setStringValue:obj.name];
165     [nameField selectText:self];
166    
167 masaki 123 [ruleEditorDelegate setPredicate:obj.predicate];
168 masaki 113
169     [NSApp beginSheet:predicatePanel
170     modalForWindow:[tableView window]
171     modalDelegate:self
172     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
173     contextInfo:obj];
174     }
175     - (IBAction)deletePredicate:(id)sender
176     {
177 masaki 235 XspfMXspfListObject *obj = [sender representedObject];
178     if(!obj) {
179     HMLog(HMLogLevelError, @"-[%@ %@] paramater's representedObject is nil.",
180     NSStringFromClass([self class]), NSStringFromSelector(_cmd));
181     return;
182     }
183 masaki 113 NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [[self view] window],
184     self, @selector(didEndAskDelete:::), Nil, obj,
185 masaki 118 NSLocalizedString(@"Do you really delete smart library \"%@\"?", @"Do you really delete smart library \"%@\"?"),
186     obj.name);
187 masaki 113 }
188 masaki 112 - (IBAction)didEndEditPredicate:(id)sender
189     {
190     [predicatePanel orderOut:self];
191     [NSApp endSheet:predicatePanel returnCode:[sender tag]];
192     }
193 masaki 118
194     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
195     {
196     SEL action = [menuItem action];
197     if(action == @selector(editPredicate:)
198     || action == @selector(deletePredicate:)) {
199     XspfMXspfListObject *obj = [self targetObject];
200     if(!obj) return NO;
201     if(obj.order == kLibraryOrder || obj.order == kFavoritesOrder) return NO;
202 masaki 235 [menuItem setRepresentedObject:obj];
203 masaki 118 }
204    
205     return YES;
206     }
207    
208 masaki 112 - (void)didEndEditPredicate:(id)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
209     {
210     if(returnCode == NSCancelButton) return;
211    
212 masaki 147 [editor reloadPredicate];
213     NSPredicate *predicate = [editor predicate];
214 masaki 122
215 masaki 125 if(!predicate || ![predicate isKindOfClass:[NSPredicate class]]) {
216 masaki 188 HMLog(HMLogLevelError, @"Could not create NSPredicate.");
217 masaki 125 NSBeep();
218     return;
219     }
220 masaki 126 if(![predicate isKindOfClass:[NSCompoundPredicate class]]) {
221     predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObject:predicate]];
222     }
223 masaki 150
224 masaki 113 NSString *name = [nameField stringValue];
225     if([name length] == 0) {
226     NSBeep();
227     NSBeginAlertSheet(nil, nil, nil, nil, [[self view] window],
228     self, @selector(retryEditPredicate:::), Nil, contextInfo,
229 masaki 118 NSLocalizedString(@"Name must not be empty.", @"Name must not be empty."));
230 masaki 116 return;
231 masaki 113 }
232 masaki 112
233 masaki 113 if([(id)contextInfo isKindOfClass:[NSString class]]) {
234     [self addSmartLibrary:name predicate:predicate order:kSmartLibraryOrder];
235     } else {
236     XspfMXspfListObject *obj = contextInfo;
237     obj.name = name;
238     obj.predicate = predicate;
239     }
240 masaki 112 }
241 masaki 113 - (void)retryEditPredicate:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
242     {
243     if([(id)contextInfo isKindOfClass:[NSString class]]) {
244     [self performSelector:@selector(newPredicate:) withObject:nil afterDelay:0.0];
245     } else {
246     [self performSelector:@selector(editPredicate:) withObject:nil afterDelay:0.0];
247     }
248     }
249     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
250     {
251     if(returnCode == NSCancelButton) return;
252    
253     [[self managedObjectContext] deleteObject:contextInfo];
254     }
255 masaki 120
256 masaki 112 - (IBAction)test01:(id)sender
257     {
258 masaki 147 // NSArray *array = [editor rowTemplates];
259 masaki 112
260     // for(id templ in array) {
261 masaki 188 // HMLog(HMLogLevelDebug @"Views -> %@", [templ templateViews]);
262 masaki 112 // for(id v in [templ templateViews]) {
263     // if([v respondsToSelector:@selector(tag)]) {
264 masaki 188 // HMLog(HMLogLevelDebug, @"tag -> %d", [v tag]);
265 masaki 112 // }
266     // }
267     // }
268 masaki 147 // for(id templ in array) {
269 masaki 188 // HMLog(HMLogLevelDebug, @"template -> %@", templ);
270 masaki 147 // }
271 masaki 112 }
272 masaki 43
273 masaki 41 @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26