extra/MacOSX/VLC_app: Initial import of a wanna-be VLC.app application that use the...
[vlc.git] / extras / MacOSX / VLC_app / VLCCategoryListDataSource.m
1 /*****************************************************************************
2  * VLCCategoryListDataSource.h: VLC.app custom outline view
3  *****************************************************************************
4  * Copyright (C) 2007 Pierre d'Herbemont
5  * Copyright (C) 2007 the VideoLAN team
6  * $Id$
7  *
8  * Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #import <VLC/VLC.h>
26 #import "VLCCategoryListDataSource.h"
27
28 @implementation VLCCategoryListDataSource
29 - (id)init
30 {
31     if( self = [super init] )
32     {
33         /* No need to release, cause we keep it around forever */
34         mainCategories = [[NSArray arrayWithObjects: [VLCMediaLibrary sharedMediaLibrary],
35                                                      @"Services Discovery",
36                                                      @"Playlists", nil] retain];
37     }
38     return self;
39 }
40
41 - (id)outlineView:(NSOutlineView *)aOutlineView child:(int)index ofItem:(id)item
42 {
43     if( !item )
44     {
45         return [mainCategories objectAtIndex: index];
46     }
47     if ([item isKindOfClass: [NSString class]])
48     {
49         if([item isEqualToString: @"Services Discovery"])
50             return [[[VLCServicesDiscoverer sharedDiscoverer] services] objectAtIndex: index];
51         if([item isEqualToString: @"Playlists"])
52             return [[[[VLCMediaLibrary sharedMediaLibrary] playlists] objectAtIndex: index] retain]; /* XXX: this is a leak, but this code needs rework */
53     }
54     if ([item isKindOfClass: [VLCMediaLibrary class]])
55         return nil;
56 #if 0
57     if ([item isKindOfClass: [VLCMediaDiscoverer class]])
58     {
59         return nil;
60     }
61 #endif
62     if ([item isKindOfClass: [VLCPlaylist class]])
63     {
64         return [[[item sublists] objectAtIndex: index] retain];  /* XXX: this is a leak, but this code needs rework */
65     }
66     return nil;
67 }
68
69 - (BOOL)outlineView:(NSOutlineView *)aOutlineView isItemExpandable:(id)item
70 {
71     if (!item)
72         return YES;
73
74     if ([item isKindOfClass: [NSString class]])
75     {
76         if([item isEqualToString: @"Services Discovery"])
77             return YES;
78         if([item isEqualToString: @"Playlists"])
79             return YES;
80     }
81     if ([item isKindOfClass: [VLCMediaLibrary class]])
82         return NO;
83
84     if ([item isKindOfClass: [VLCPlaylist class]])
85     {
86         return [[item sublists] count] > 0;
87     }
88
89     return NO;
90 }
91
92 - (int)outlineView:(NSOutlineView *)aOutlineView numberOfChildrenOfItem:(id)item
93 {
94     if (!item)
95         return [mainCategories count];
96     if ([item isKindOfClass: [NSString class]])
97     {
98         if([item isEqualToString: @"Playlists"])
99             return [[[VLCMediaLibrary sharedMediaLibrary] playlists] count];
100         if([item isEqualToString: @"Services Discovery"])
101             return [[[VLCServicesDiscoverer sharedDiscoverer] services] count];
102     }
103     if ([item isKindOfClass: [VLCPlaylist class]])
104         return [[item playlists] count];
105
106     return 0;
107 }
108
109 - (id)outlineView:(NSOutlineView *)aOutlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
110 {
111     if (!item)
112         return nil;
113     if( [[tableColumn identifier] isEqualToString:@"name"] )
114     {
115         if ( [item isKindOfClass: [NSString class]] )
116             return item;
117         if ( [item isKindOfClass: [VLCPlaylist class]])
118             return [[[item providerMedia] metaInformation] objectForKey:VLCMetaInformationTitle];
119         if ( [item isKindOfClass: [VLCMediaDiscoverer class]])
120             return [item localizedName];
121         if ( [item isKindOfClass: [VLCMediaLibrary class]])
122             return @"Library";
123     }
124     else if ( [item isKindOfClass: [NSString class]] && [[tableColumn identifier] isEqualToString:@"icon"])
125         return nil;
126
127     return nil;
128 }
129 @end
130
131 @implementation VLCCategoryListDataSource (OutlineViewDelegating)
132 - (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
133 {
134     if ([item isKindOfClass: [NSString class]])
135     {
136         if([item isEqualToString: @"Library"])
137             return YES;
138         if([item isEqualToString: @"Services Discovery"])
139             return NO;
140         if([item isEqualToString: @"Playlists"])
141             return NO;
142     }
143     return YES;
144 }
145 - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
146 {
147     if ([item isKindOfClass: [VLCMediaDiscoverer class]])
148         [cell setImage: [NSImage imageNamed:@"vlc_stream_16px"]];
149     else
150         [cell setImage: nil];
151 }
152 @end