Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMLibraryViewController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 362 - (hide annotations) (download)
Fri May 21 12:06:48 2010 UTC (13 years, 11 months ago) by masakih
File size: 11020 byte(s)
「文字列」「含まない」ルールを生成可能にした。
1 masaki 41 //
2     // XspfMLibraryViewController.m
3     // XspfManager
4     //
5     // Created by Hori,Masaki on 09/11/08.
6     //
7    
8 masakih 350 /*
9     Copyright (c) 2009-2010, masakih
10     All rights reserved.
11     ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。
12    
13     1, ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
14     2, バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
15     3, 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、コントリビューターの名前を使用してはならない。
16     本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか(過失その他の)不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した(代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない)直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。
17     -------------------------------------------------------------------
18     Copyright (c) 2009-2010, masakih
19     All rights reserved.
20    
21     Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
22    
23     1, Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
24     2, Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
25     3, The names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
26     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29 masaki 41 #import "XspfMLibraryViewController.h"
30    
31 masaki 113 #import "XspfMXspfListObject.h"
32    
33    
34 masaki 43 @interface XspfMLibraryViewController (HMPrivate)
35     - (NSArray *)sortDescriptors;
36     - (void)setupXspfList;
37     @end
38 masaki 41
39 masaki 113 enum {
40     kLibraryOrder = 0,
41     kFavoritesOrder,
42     kSmartLibraryOrder,
43     };
44    
45 masaki 41 @implementation XspfMLibraryViewController
46 masaki 113
47 masaki 41 - (id)init
48     {
49     [super initWithNibName:@"LibraryView" bundle:nil];
50    
51 masaki 43 [self setupXspfList];
52    
53 masaki 41 return self;
54     }
55    
56 masaki 43 - (void)awakeFromNib
57     {
58     [[self representedObject] setSortDescriptors:[self sortDescriptors]];
59     }
60 masaki 41 - (NSArray *)sortDescriptors
61     {
62 masaki 61 id desc = [[NSSortDescriptor alloc] initWithKey:@"order" ascending:YES];
63     return [NSArray arrayWithObject:[desc autorelease]];
64 masaki 41 }
65 masaki 233 - (XspfMDragControl *)dragControl
66     {
67     return dragControl;
68     }
69 masaki 43
70 masaki 113 - (void)addSmartLibrary:(NSString *)name predicate:(NSPredicate *)predicate order:(NSInteger)order
71     {
72     id obj = [NSEntityDescription insertNewObjectForEntityForName:@"XspfList"
73     inManagedObjectContext:[self managedObjectContext]];
74     [obj setValue:predicate forKey:@"predicate"];
75     [obj setValue:name forKey:@"name"];
76     [obj setValue:[NSNumber numberWithInt:order] forKey:@"order"];
77     }
78 masaki 43 - (void)setupXspfList
79     {
80 masaki 48 NSManagedObjectContext *moc = [self managedObjectContext];
81 masaki 43 NSError *error = nil;
82     NSFetchRequest *fetch;
83     NSInteger num;
84    
85     fetch = [[[NSFetchRequest alloc] init] autorelease];
86     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
87     inManagedObjectContext:moc]];
88     num = [moc countForFetchRequest:fetch
89     error:&error];
90     if(num != 0) return;
91    
92     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"urlString <> %@", @""];
93 masaki 268 [self addSmartLibrary:@"Library"
94 masaki 113 predicate:predicate
95     order:kLibraryOrder];
96 masaki 43
97     predicate = [NSPredicate predicateWithFormat:@"favorites = %@", [NSNumber numberWithBool:YES]];
98 masaki 268 [self addSmartLibrary:@"Favorites"
99 masaki 113 predicate:predicate
100     order:kFavoritesOrder];
101 masaki 43 }
102    
103 masaki 235 - (BOOL)mouseInTableView
104     {
105     NSEvent *event = [[[self view] window] currentEvent];
106     NSPoint mouse = [[tableView superview] convertPoint:[event locationInWindow] fromView:nil];
107    
108     return NSPointInRect(mouse, [tableView visibleRect]);
109     }
110 masaki 113 - (XspfMXspfListObject *)targetObject
111     {
112     id array = [[self representedObject] arrangedObjects];
113    
114     NSInteger row = [tableView clickedRow];
115     if(row >= 0 && [array count] > row) {
116     return [array objectAtIndex:row];
117     }
118 masaki 235
119     if(![self mouseInTableView]) {
120     NSArray *selection = [[self representedObject] selectedObjects];
121     if([selection count] != 0) {
122     return [selection objectAtIndex:0];
123     }
124     }
125 masaki 113 return nil;
126     }
127 masaki 235
128    
129 masaki 116 - (BOOL)canUseNewSmartLibraryName:(NSString *)newName
130     {
131     NSManagedObjectContext *moc = [self managedObjectContext];
132     NSError *error = nil;
133     NSFetchRequest *fetch;
134     NSPredicate *predicate;
135     NSInteger num;
136    
137     fetch = [[[NSFetchRequest alloc] init] autorelease];
138     [fetch setEntity:[NSEntityDescription entityForName:@"XspfList"
139     inManagedObjectContext:moc]];
140     predicate = [NSPredicate predicateWithFormat:@"name = %@", newName];
141     [fetch setPredicate:predicate];
142     num = [moc countForFetchRequest:fetch
143     error:&error];
144    
145     return num == 0;
146     }
147     - (NSString *)newSmartLibraryName
148     {
149     NSString *template = NSLocalizedString(@"Untitled Library", @"Untitled Library");
150    
151     if([self canUseNewSmartLibraryName:template]) return template;
152    
153     NSInteger i = 1;
154     do {
155     NSString *name = [NSString stringWithFormat:@"%@ %d", template, i];
156     if([self canUseNewSmartLibraryName:name]) return name;
157     } while (i++ < INT_MAX);
158    
159     return @"hoge";
160     }
161 masaki 112 - (IBAction)newPredicate:(id)sender
162 masaki 43 {
163 masaki 112 if([editor numberOfRows] == 0) {
164     [editor addRow:self];
165     }
166 masaki 147
167 masaki 116 [nameField setStringValue:[self newSmartLibraryName]];
168 masaki 113 [nameField selectText:self];
169    
170 masaki 112 [NSApp beginSheet:predicatePanel
171     modalForWindow:[tableView window]
172     modalDelegate:self
173     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
174     contextInfo:@"Createion"];
175 masaki 43 }
176 masaki 113 - (IBAction)editPredicate:(id)sender
177     {
178 masaki 235 XspfMXspfListObject *obj = [sender representedObject];
179     if(!obj) {
180     HMLog(HMLogLevelError, @"-[%@ %@] paramater's representedObject is nil.",
181     NSStringFromClass([self class]), NSStringFromSelector(_cmd));
182     return;
183     }
184 masaki 113 [nameField setStringValue:obj.name];
185     [nameField selectText:self];
186    
187 masaki 123 [ruleEditorDelegate setPredicate:obj.predicate];
188 masaki 113
189     [NSApp beginSheet:predicatePanel
190     modalForWindow:[tableView window]
191     modalDelegate:self
192     didEndSelector:@selector(didEndEditPredicate:returnCode:contextInfo:)
193     contextInfo:obj];
194     }
195     - (IBAction)deletePredicate:(id)sender
196     {
197 masaki 235 XspfMXspfListObject *obj = [sender representedObject];
198     if(!obj) {
199     HMLog(HMLogLevelError, @"-[%@ %@] paramater's representedObject is nil.",
200     NSStringFromClass([self class]), NSStringFromSelector(_cmd));
201     return;
202     }
203 masaki 113 NSBeginInformationalAlertSheet(nil, nil, @"Cancel", nil, [[self view] window],
204     self, @selector(didEndAskDelete:::), Nil, obj,
205 masaki 118 NSLocalizedString(@"Do you really delete smart library \"%@\"?", @"Do you really delete smart library \"%@\"?"),
206     obj.name);
207 masaki 113 }
208 masaki 112 - (IBAction)didEndEditPredicate:(id)sender
209     {
210     [predicatePanel orderOut:self];
211     [NSApp endSheet:predicatePanel returnCode:[sender tag]];
212     }
213 masaki 118
214     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
215     {
216     SEL action = [menuItem action];
217     if(action == @selector(editPredicate:)
218     || action == @selector(deletePredicate:)) {
219     XspfMXspfListObject *obj = [self targetObject];
220     if(!obj) return NO;
221     if(obj.order == kLibraryOrder || obj.order == kFavoritesOrder) return NO;
222 masaki 235 [menuItem setRepresentedObject:obj];
223 masaki 118 }
224    
225     return YES;
226     }
227 masakih 362
228 masaki 112 - (void)didEndEditPredicate:(id)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
229     {
230     if(returnCode == NSCancelButton) return;
231    
232 masaki 147 [editor reloadPredicate];
233     NSPredicate *predicate = [editor predicate];
234 masaki 122
235 masaki 125 if(!predicate || ![predicate isKindOfClass:[NSPredicate class]]) {
236 masaki 188 HMLog(HMLogLevelError, @"Could not create NSPredicate.");
237 masaki 125 NSBeep();
238     return;
239     }
240 masaki 126 if(![predicate isKindOfClass:[NSCompoundPredicate class]]) {
241     predicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObject:predicate]];
242     }
243 masaki 150
244 masaki 113 NSString *name = [nameField stringValue];
245     if([name length] == 0) {
246     NSBeep();
247     NSBeginAlertSheet(nil, nil, nil, nil, [[self view] window],
248     self, @selector(retryEditPredicate:::), Nil, contextInfo,
249 masaki 118 NSLocalizedString(@"Name must not be empty.", @"Name must not be empty."));
250 masaki 116 return;
251 masaki 113 }
252 masaki 112
253 masaki 113 if([(id)contextInfo isKindOfClass:[NSString class]]) {
254     [self addSmartLibrary:name predicate:predicate order:kSmartLibraryOrder];
255     } else {
256     XspfMXspfListObject *obj = contextInfo;
257     obj.name = name;
258     obj.predicate = predicate;
259     }
260 masaki 112 }
261 masaki 113 - (void)retryEditPredicate:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
262     {
263     if([(id)contextInfo isKindOfClass:[NSString class]]) {
264     [self performSelector:@selector(newPredicate:) withObject:nil afterDelay:0.0];
265     } else {
266     [self performSelector:@selector(editPredicate:) withObject:nil afterDelay:0.0];
267     }
268     }
269     - (void)didEndAskDelete:(NSWindow *)sheet :(NSInteger)returnCode :(void *)contextInfo
270     {
271     if(returnCode == NSCancelButton) return;
272    
273     [[self managedObjectContext] deleteObject:contextInfo];
274     }
275 masaki 120
276 masaki 112 - (IBAction)test01:(id)sender
277     {
278 masaki 147 // NSArray *array = [editor rowTemplates];
279 masaki 112
280     // for(id templ in array) {
281 masaki 188 // HMLog(HMLogLevelDebug @"Views -> %@", [templ templateViews]);
282 masaki 112 // for(id v in [templ templateViews]) {
283     // if([v respondsToSelector:@selector(tag)]) {
284 masaki 188 // HMLog(HMLogLevelDebug, @"tag -> %d", [v tag]);
285 masaki 112 // }
286     // }
287     // }
288 masaki 147 // for(id templ in array) {
289 masaki 188 // HMLog(HMLogLevelDebug, @"template -> %@", templ);
290 masaki 147 // }
291 masaki 112 }
292 masaki 43
293 masaki 41 @end

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