Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTDocument.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 113 - (hide annotations) (download)
Sun Sep 28 09:23:29 2008 UTC (15 years, 6 months ago) by masaki
File size: 5240 byte(s)
ファイルを開くときtrackエレメントがなくても開くように修正。
XSPFのバージョンが0だったのを1に修正。
1 masaki 2 //
2 masaki 72 // XspfQTDocument.m
3 masaki 2 // XspfQT
4     //
5     // Created by Hori,Masaki on 08/08/29.
6     // Copyright masakih 2008 . All rights reserved.
7     //
8    
9 masaki 72 #import "XspfQTDocument.h"
10     #import "XspfQTComponent.h"
11     #import "XspfQTMovieWindowController.h"
12     #import "XspfQTPlayListWindowController.h"
13 masaki 2
14 masaki 72 @interface XspfQTDocument (Private)
15     - (void)setTrackList:(XspfQTComponent *)newList;
16     - (XspfQTComponent *)trackList;
17 masaki 31 - (NSXMLDocument *)XMLDocument;
18     - (NSData *)outputData;
19 masaki 2 @end
20    
21 masaki 72 @implementation XspfQTDocument
22 masaki 2
23 masaki 72 NSString *XspfQTDocumentWillCloseNotification = @"XspfQTDocumentWillCloseNotification";
24 masaki 61
25 masaki 95 - (id)initWithType:(NSString *)typeName error:(NSError **)outError
26     {
27     [self init];
28    
29     NSString *xmlElem;
30     xmlElem = [NSString stringWithString:@"<trackList></trackList>"];
31    
32     NSError *error = nil;
33     NSXMLElement *element = [[[NSXMLElement alloc] initWithXMLString:xmlElem error:&error] autorelease];
34     if(error) {
35     if(outError) {
36     *outError = error;
37     }
38     [self autorelease];
39     return nil;
40     }
41    
42     id new = [XspfQTComponent xspfComponemtWithXMLElement:element];
43     if(!new) {
44     [self autorelease];
45     return nil;
46     }
47    
48     [new setTitle:@"Untitled"];
49     [self setTrackList:new];
50    
51     return self;
52     }
53 masaki 2
54     - (void)makeWindowControllers
55     {
56 masaki 72 playListWindowController = [[XspfQTPlayListWindowController alloc] init];
57 masaki 2 [self addWindowController:playListWindowController];
58    
59 masaki 72 movieWindowController = [[XspfQTMovieWindowController alloc] init];
60 masaki 42 [movieWindowController setShouldCloseDocument:YES];
61 masaki 2 [self addWindowController:movieWindowController];
62     }
63    
64     - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
65     {
66 masaki 31 return [self outputData];
67 masaki 2 }
68    
69     - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
70     {
71     NSError *error = nil;
72 masaki 10 NSXMLDocument *d = [[[NSXMLDocument alloc] initWithData:data
73     options:0
74     error:&error] autorelease];
75 masaki 2 NSXMLElement *root = [d rootElement];
76    
77     NSArray *trackListElems;
78 masaki 14 trackListElems = [root elementsForName:@"trackList"];
79 masaki 113 if(!trackListElems) {
80 masaki 2 if ( outError != NULL ) {
81     *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];
82     }
83     return NO;
84     }
85    
86 masaki 72 id t = [XspfQTComponent xspfComponemtWithXMLElement:[trackListElems objectAtIndex:0]];
87 masaki 39 if(![t title]) {
88     [t setTitle:[[[self fileURL] path] lastPathComponent]];
89     }
90 masaki 71 [self setTrackList:t];
91 masaki 2
92     return YES;
93     }
94    
95     - (void)dealloc
96     {
97     [trackList release];
98     [playListWindowController release];
99 masaki 42 [movieWindowController release];
100 masaki 2
101     [super dealloc];
102     }
103 masaki 71
104 masaki 42 - (void)close
105     {
106 masaki 61 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
107 masaki 72 [nc postNotificationName:XspfQTDocumentWillCloseNotification object:self];
108 masaki 61
109 masaki 42 [self removeWindowController:playListWindowController];
110     [playListWindowController release];
111     playListWindowController = nil;
112    
113     [self removeWindowController:movieWindowController];
114     [movieWindowController release];
115     movieWindowController = nil;
116    
117     [super close];
118     }
119    
120 masaki 33 - (IBAction)togglePlayAndPause:(id)sender
121     {
122     [movieWindowController togglePlayAndPause:sender];
123     }
124 masaki 2 - (IBAction)showPlayList:(id)sender
125     {
126     [playListWindowController showWindow:self];
127     }
128    
129 masaki 72 - (void)setTrackList:(XspfQTComponent *)newList
130 masaki 2 {
131     if(trackList == newList) return;
132    
133     [trackList autorelease];
134     trackList = [newList retain];
135     }
136 masaki 72 - (XspfQTComponent *)trackList
137 masaki 2 {
138     return trackList;
139     }
140    
141     - (void)setPlayTrackindex:(unsigned)index
142     {
143 masaki 29 [[self trackList] setSelectionIndex:index];
144 masaki 2 }
145 masaki 31
146     - (NSData *)outputData
147     {
148     return [[self XMLDocument] XMLDataWithOptions:NSXMLNodePrettyPrint];
149     }
150 masaki 71 - (NSXMLDocument *)XMLDocument
151 masaki 31 {
152     id element = [[self trackList] XMLElement];
153    
154     id root = [NSXMLElement elementWithName:@"playlist"];
155     [root addChild:element];
156     [root addAttribute:[NSXMLNode attributeWithName:@"version"
157 masaki 113 stringValue:@"1"]];
158 masaki 31 [root addAttribute:[NSXMLNode attributeWithName:@"xmlns"
159     stringValue:@"http://xspf.org/ns/0/"]];
160    
161    
162     id d = [[[NSXMLDocument alloc] initWithRootElement:root] autorelease];
163     [d setVersion:@"1.0"];
164     [d setCharacterEncoding:@"UTF-8"];
165    
166     return d;
167     }
168 masaki 42
169 masaki 89 - (void)insertComponentFromURL:(NSURL *)url atIndex:(NSUInteger)index
170     {
171     NSString *xmlElem;
172     xmlElem = [NSString stringWithFormat:@"<track><location>%@</location></track>",
173     [url absoluteString]];
174    
175     NSError *error = nil;
176     NSXMLElement *element = [[[NSXMLElement alloc] initWithXMLString:xmlElem error:&error] autorelease];
177     if(error) {
178     NSLog(@"%@", error);
179     @throw self;
180     }
181    
182     id new = [XspfQTComponent xspfComponemtWithXMLElement:element];
183     if(!new) {
184     @throw self;
185     }
186    
187     [self insertComponent:new atIndex:index];
188     }
189 masaki 86 - (void)insertComponent:(XspfQTComponent *)item atIndex:(NSUInteger)index
190 masaki 55 {
191 masaki 83 id undo = [self undoManager];
192 masaki 86 [undo registerUndoWithTarget:self selector:@selector(removeComponent:) object:item];
193 masaki 78 [[self trackList] insertChild:item atIndex:index];
194 masaki 55 }
195 masaki 86 - (void)removeComponent:(XspfQTComponent *)item
196 masaki 55 {
197 masaki 83 NSUInteger index = [[self trackList] indexOfChild:item];
198     if(index == NSNotFound) return;
199    
200     id undo = [self undoManager];
201 masaki 86 [[undo prepareWithInvocationTarget:self] insertComponent:item atIndex:index];
202 masaki 55 [[self trackList] removeChild:item];
203     }
204    
205 masaki 31 - (IBAction)dump:(id)sender
206     {
207     NSString *s = [[[NSString alloc] initWithData:[self outputData]
208     encoding:NSUTF8StringEncoding] autorelease];
209    
210     NSLog(@"%@", s);
211     }
212 masaki 2 @end
213    

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