Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfManager/XspfMLibraryViewController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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