Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMLibraryViewController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 123 - (hide annotations) (download)
Mon Nov 30 13:43:48 2009 UTC (14 years, 4 months ago) by masaki
File size: 6683 byte(s)
[???] RuleEditorテスト中 :-)
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 @synthesize selectedPredicate;
27    
28 masaki 41 - (id)init
29     {
30     [super initWithNibName:@"LibraryView" bundle:nil];
31    
32 masaki 43 [self setupXspfList];
33    
34 masaki 41 return self;
35     }
36    
37 masaki 43 - (void)awakeFromNib
38     {
39     [[self representedObject] setSortDescriptors:[self sortDescriptors]];
40     }
41 masaki 41 - (NSArray *)sortDescriptors
42     {
43 masaki 61 id desc = [[NSSortDescriptor alloc] initWithKey:@"order" ascending:YES];
44     return [NSArray arrayWithObject:[desc autorelease]];
45 masaki 41 }
46 masaki 43
47 masaki 113 - (void)addSmartLibrary:(NSString *)name predicate:(NSPredicate *)predicate order:(NSInteger)order
48     {
49     id obj = [NSEntityDescription insertNewObjectForEntityForName:@"XspfList"
50     inManagedObjectContext:[self managedObjectContext]];
51     [obj setValue:predicate forKey:@"predicate"];
52     [obj setValue:name forKey:@"name"];
53     [obj setValue:[NSNumber numberWithInt:order] forKey:@"order"];
54     }
55 masaki 43 - (void)setupXspfList
56     {
57 masaki 48 NSManagedObjectContext *moc = [self managedObjectContext];
58 masaki 43 NSError *error = nil;
59     NSFetchRequest *fetch;
60     NSInteger num;
61    
62     fetch = [[[NSFetchRequest alloc] init] autorelease];
63     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
64     inManagedObjectContext:moc]];
65     num = [moc countForFetchRequest:fetch
66     error:&error];
67     if(num != 0) return;
68    
69     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString <> %@", @""];
70 masaki 113 [self addSmartLibrary:NSLocalizedString(@"Library", @"Library")
71     predicate:predicate
72     order:kLibraryOrder];
73 masaki 43
74     predicate = [NSPredicate predicateWithFormat:@"favorites = %@", [NSNumber numberWithBool:YES]];
75 masaki 113 [self addSmartLibrary:NSLocalizedString(@"Favorites", @"Favorites")
76     predicate:predicate
77     order:kFavoritesOrder];
78 masaki 43 }
79    
80 masaki 113 - (XspfMXspfListObject *)targetObject
81     {
82     id array = [[self representedObject] arrangedObjects];
83    
84     NSInteger row = [tableView clickedRow];
85     if(row >= 0 && [array count] > row) {
86     return [array objectAtIndex:row];
87     }
88     return nil;
89     }
90 masaki 116 - (BOOL)canUseNewSmartLibraryName:(NSString *)newName
91     {
92     NSManagedObjectContext *moc = [self managedObjectContext];
93     NSError *error = nil;
94     NSFetchRequest *fetch;
95     NSPredicate *predicate;
96     NSInteger num;
97    
98     fetch = [[[NSFetchRequest alloc] init] autorelease];
99     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
100     inManagedObjectContext:moc]];
101     predicate = [NSPredicate predicateWithFormat:@"name = %@", newName];
102     [fetch setPredicate:predicate];
103     num = [moc countForFetchRequest:fetch
104     error:&error];
105    
106     return num == 0;
107     }
108     - (NSString *)newSmartLibraryName
109     {
110     NSString *template = NSLocalizedString(@"Untitled Library", @"Untitled Library");
111    
112     if([self canUseNewSmartLibraryName:template]) return template;
113    
114     NSInteger i = 1;
115     do {
116     NSString *name = [NSString stringWithFormat:@"%@ %d", template, i];
117     if([self canUseNewSmartLibraryName:name]) return name;
118     } while (i++ < INT_MAX);
119    
120     return @"hoge";
121     }
122 masaki 112 - (IBAction)newPredicate:(id)sender
123 masaki 43 {
124 masaki 112 if([editor numberOfRows] == 0) {
125     [editor addRow:self];
126     }
127    
128 masaki 120 if([editor02 numberOfRows] == 0) {
129     [editor02 addRow:self];
130     }
131    
132 masaki 116 [nameField setStringValue:[self newSmartLibraryName]];
133 masaki 113 [nameField selectText:self];
134    
135 masaki 112 [NSApp beginSheet:predicatePanel
136     modalForWindow:[tableView window]
137     modalDelegate:self
138     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
139     contextInfo:@"Createion"];
140 masaki 43 }
141 masaki 113 - (IBAction)editPredicate:(id)sender
142     {
143     XspfMXspfListObject *obj = [self targetObject];
144     [nameField setStringValue:obj.name];
145     [nameField selectText:self];
146    
147     self.selectedPredicate = obj.predicate;
148 masaki 123 [ruleEditorDelegate setPredicate:obj.predicate];
149 masaki 113
150     [NSApp beginSheet:predicatePanel
151     modalForWindow:[tableView window]
152     modalDelegate:self
153     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
154     contextInfo:obj];
155     }
156     - (IBAction)deletePredicate:(id)sender
157     {
158     XspfMXspfListObject *obj = [self targetObject];
159     NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [[self view] window],
160     self, @selector(didEndAskDelete:::), Nil, obj,
161 masaki 118 NSLocalizedString(@"Do you really delete smart library \"%@\"?", @"Do you really delete smart library \"%@\"?"),
162     obj.name);
163 masaki 113 }
164 masaki 112 - (IBAction)didEndEditPredicate:(id)sender
165     {
166     [predicatePanel orderOut:self];
167     [NSApp endSheet:predicatePanel returnCode:[sender tag]];
168     }
169 masaki 118
170     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
171     {
172     SEL action = [menuItem action];
173     if(action == @selector(editPredicate:)
174     || action == @selector(deletePredicate:)) {
175     XspfMXspfListObject *obj = [self targetObject];
176     if(!obj) return NO;
177     if(obj.order == kLibraryOrder || obj.order == kFavoritesOrder) return NO;
178     }
179    
180     return YES;
181     }
182    
183 masaki 112 - (void)didEndEditPredicate:(id)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
184     {
185     if(returnCode == NSCancelButton) return;
186    
187 masaki 122 [editor02 reloadPredicate];
188     NSPredicate *predicate = [editor02 predicate];
189 masaki 123 [ruleEditorDelegate setPredicate:predicate];
190 masaki 122
191 masaki 113 NSString *name = [nameField stringValue];
192     if([name length] == 0) {
193     NSBeep();
194     NSBeginAlertSheet(nil, nil, nil, nil, [[self view] window],
195     self, @selector(retryEditPredicate:::), Nil, contextInfo,
196 masaki 118 NSLocalizedString(@"Name must not be empty.", @"Name must not be empty."));
197 masaki 116 return;
198 masaki 113 }
199 masaki 112
200 masaki 113 if([(id)contextInfo isKindOfClass:[NSString class]]) {
201     [self addSmartLibrary:name predicate:predicate order:kSmartLibraryOrder];
202     } else {
203     XspfMXspfListObject *obj = contextInfo;
204     obj.name = name;
205     obj.predicate = predicate;
206     }
207 masaki 112 }
208 masaki 113 - (void)retryEditPredicate:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
209     {
210     if([(id)contextInfo isKindOfClass:[NSString class]]) {
211     [self performSelector:@selector(newPredicate:) withObject:nil afterDelay:0.0];
212     } else {
213     [self performSelector:@selector(editPredicate:) withObject:nil afterDelay:0.0];
214     }
215     }
216     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
217     {
218     if(returnCode == NSCancelButton) return;
219    
220     [[self managedObjectContext] deleteObject:contextInfo];
221     }
222 masaki 120
223 masaki 112 - (IBAction)test01:(id)sender
224     {
225     NSArray *array = [editor rowTemplates];
226    
227     // for(id templ in array) {
228     // NSLog(@"Views -> %@", [templ templateViews]);
229     // for(id v in [templ templateViews]) {
230     // if([v respondsToSelector:@selector(tag)]) {
231     // NSLog(@"tag -> %d", [v tag]);
232     // }
233     // }
234     // }
235     for(id templ in array) {
236     NSLog(@"template -> %@", templ);
237     }
238     }
239 masaki 43
240 masaki 41 @end

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