playlistinfo.m 10.7 KB
Newer Older
Benjamin Pracht's avatar
Benjamin Pracht committed
1
/*****************************************************************************
2
 r playlistinfo.m: MacOS X interface module
Benjamin Pracht's avatar
Benjamin Pracht committed
3 4
 *****************************************************************************
 * Copyright (C) 2002-2004 VideoLAN
5
 * $Id$
Benjamin Pracht's avatar
Benjamin Pracht committed
6
 *
7
 * Authors: Benjamin Pracht <bigben at videolan dot org>
Benjamin Pracht's avatar
Benjamin Pracht committed
8 9 10 11 12
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
13
 *
Benjamin Pracht's avatar
Benjamin Pracht committed
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/

#include "intf.h"
#include "playlistinfo.h"
#include "playlist.h"

/*****************************************************************************
 * VLCPlaylistInfo Implementation
 *****************************************************************************/

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
@implementation VLCInfo

- (id)init
{
    self = [super init];

    if( self != nil )
    {
        i_item = -1;
        o_selected = NULL;
    }
    return( self );
}

- (void)dealloc
{
    [o_selected release];
    [super dealloc];
}
Benjamin Pracht's avatar
Benjamin Pracht committed
55 56 57 58 59

- (void)awakeFromNib
{
    [o_info_window setExcludedFromWindowsMenu: TRUE];

60
    [o_info_window setTitle: _NS("Properties")];
Benjamin Pracht's avatar
Benjamin Pracht committed
61 62 63
    [o_uri_lbl setStringValue: _NS("URI")];
    [o_title_lbl setStringValue: _NS("Title")];
    [o_author_lbl setStringValue: _NS("Author")];
64 65
    [o_btn_ok setTitle: _NS("OK")];
    [o_btn_cancel setTitle: _NS("Cancel")];
Benjamin Pracht's avatar
Benjamin Pracht committed
66 67 68 69
}

- (IBAction)togglePlaylistInfoPanel:(id)sender
{
70 71 72 73 74 75
    if( [o_info_window isVisible] )
    {
        [o_info_window orderOut: sender];
    }
    else
    {
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
76 77
        i_item = [[[VLCMain sharedInstance] getPlaylist] selectedPlaylistItem];
        o_selected = [[[VLCMain sharedInstance] getPlaylist] selectedPlaylistItemsList];
78 79 80 81
        [o_selected retain];
        [self initPanel:sender];
    }
}
Benjamin Pracht's avatar
Benjamin Pracht committed
82

83 84
- (IBAction)toggleInfoPanel:(id)sender
{
Benjamin Pracht's avatar
Benjamin Pracht committed
85 86 87 88 89 90
    if( [o_info_window isVisible] )
    {
        [o_info_window orderOut: sender];
    }
    else
    {
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
91
        intf_thread_t * p_intf = VLCIntf;
92
        playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
Benjamin Pracht's avatar
Benjamin Pracht committed
93 94 95 96
                                          FIND_ANYWHERE );

        if (p_playlist)
        {
97 98 99 100 101 102 103 104 105
            i_item = p_playlist->i_index;
            o_selected = [NSMutableArray arrayWithObject:
                            [NSNumber numberWithInt:i_item]];
            [o_selected retain];
            vlc_object_release(p_playlist);
        }
        [self initPanel:sender];
    }
}
106

107 108
- (void)initPanel:(id)sender
{
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
109
    intf_thread_t * p_intf = VLCIntf;
110
    playlist_t * p_playlist;
111

112 113 114 115
    p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                          FIND_ANYWHERE );


116
    if( p_playlist )
117
    {
118 119
        char *psz_temp;

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
        /*fill uri / title / author info */
        [o_uri_txt setStringValue:
            ([NSString stringWithUTF8String:p_playlist->
               pp_items[i_item]->input.psz_uri] == nil ) ?
            [NSString stringWithCString:p_playlist->
                pp_items[i_item]->input.psz_uri] :
            [NSString stringWithUTF8String:p_playlist->
                pp_items[i_item]->input.psz_uri]];

        [o_title_txt setStringValue:
            ([NSString stringWithUTF8String:p_playlist->
                pp_items[i_item]->input.psz_name] == nil ) ?
            [NSString stringWithCString:p_playlist->
                pp_items[i_item]->input.psz_name] :
            [NSString stringWithUTF8String:p_playlist->
                pp_items[i_item]->input.psz_name]];

137 138 139
        psz_temp = playlist_GetInfo( p_playlist, i_item ,_("General"),_("Author") );
        [o_author_txt setStringValue: [NSString stringWithUTF8String: psz_temp]];
        free( psz_temp );
140 141 142 143 144

        [[VLCInfoTreeItem rootItem] refresh];
        [o_outline_view reloadData];

        vlc_object_release( p_playlist );
Benjamin Pracht's avatar
Benjamin Pracht committed
145
    }
146
    [o_info_window makeKeyAndOrderFront: sender];
Benjamin Pracht's avatar
Benjamin Pracht committed
147 148 149 150
}

- (IBAction)infoCancel:(id)sender
{
151
    [o_info_window orderOut: self];
Benjamin Pracht's avatar
Benjamin Pracht committed
152 153 154 155 156
}


- (IBAction)infoOk:(id)sender
{
157
    int c;
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
158
    intf_thread_t * p_intf = VLCIntf;
Benjamin Pracht's avatar
Benjamin Pracht committed
159 160 161
    playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                          FIND_ANYWHERE );
    vlc_value_t val;
Benjamin Pracht's avatar
Benjamin Pracht committed
162 163

    if (p_playlist)
Benjamin Pracht's avatar
Benjamin Pracht committed
164
    {
165
        vlc_mutex_lock(&p_playlist->pp_items[i_item]->input.lock);
Benjamin Pracht's avatar
Benjamin Pracht committed
166

167 168 169 170
        p_playlist->pp_items[i_item]->input.psz_uri =
            strdup([[o_uri_txt stringValue] cString]);
        p_playlist->pp_items[i_item]->input.psz_name =
            strdup([[o_title_txt stringValue] cString]);
Benjamin Pracht's avatar
Benjamin Pracht committed
171
        playlist_ItemAddInfo(p_playlist->pp_items[i_item],_("General"),_("Author"), [[o_author_txt stringValue] cString]);
172

Benjamin Pracht's avatar
Benjamin Pracht committed
173
        c = (int)[o_selected count];
174
        vlc_mutex_unlock(&p_playlist->pp_items[i_item]->input.lock);
Benjamin Pracht's avatar
Benjamin Pracht committed
175
        val.b_bool = VLC_TRUE;
176
        var_Set( p_playlist,"intf-change",val );
Benjamin Pracht's avatar
Benjamin Pracht committed
177
        vlc_object_release ( p_playlist );
Benjamin Pracht's avatar
Benjamin Pracht committed
178
    }
179
    [o_info_window orderOut: self];
180 181
}

182 183 184 185
- (int)getItem
{
    return i_item;
}
Benjamin Pracht's avatar
Benjamin Pracht committed
186

187 188
@end

189 190 191 192 193 194
@implementation VLCInfo (NSMenuValidation)

- (BOOL)validateMenuItem:(NSMenuItem *)o_mi
{
    BOOL bEnabled = TRUE;

Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
195
    intf_thread_t * p_intf = VLCIntf;
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    input_thread_t * p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT,
                                                       FIND_ANYWHERE );

    if( [[o_mi title] isEqualToString: _NS("Info")] )
    {
        if( p_input == NULL )
        {
            bEnabled = FALSE;
        }
    }
    if( p_input ) vlc_object_release( p_input );

    return( bEnabled );
}

@end
Benjamin Pracht's avatar
Benjamin Pracht committed
212

213
@implementation VLCInfo (NSTableDataSource)
214

215
- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item
216 217 218 219 220 221 222 223
{
    return (item == nil) ? [[VLCInfoTreeItem rootItem] numberOfChildren] : [item numberOfChildren];
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
    return ([item numberOfChildren] > 0);
}

224
- (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
{
    return (item == nil) ? [[VLCInfoTreeItem rootItem] childAtIndex:index] : [item childAtIndex:index];
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    if ([[tableColumn identifier] isEqualToString:@"0"])
    {
        return (item == nil) ? @"" : (id)[item getName];
    }
    else
    {
        return (item == nil) ? @"" : (id)[item getValue];
    }
}

241

242 243 244 245 246 247 248 249 250 251 252
@end

@implementation VLCInfoTreeItem

static VLCInfoTreeItem *o_root_item = nil;

#define IsALeafNode ((id)-1)

- (id)initWithName: (NSString *)o_item_name value: (NSString *)o_item_value ID: (int)i_id parent:(VLCInfoTreeItem *)o_parent_item
{
    self = [super init];
253

254 255 256 257 258 259
    if( self != nil )
    {
        o_name = [o_item_name copy];
        o_value = [o_item_value copy];
        i_object_id = i_id;
        o_parent = o_parent_item;
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
260
        i_item = [[[VLCMain sharedInstance] getInfo] getItem];
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
    }
    return( self );
}

+ (VLCInfoTreeItem *)rootItem {
    if (o_root_item == nil) o_root_item = [[VLCInfoTreeItem alloc] initWithName:@"main" value: @"" ID: 0 parent:nil];
    return o_root_item;
}

- (void)dealloc
{
    if (o_children != IsALeafNode) [o_children release];
    [o_name release];
    [super dealloc];
}

/* Creates and returns the array of children
 * Loads children incrementally */
- (NSArray *)children
{
    if (o_children == NULL)
    {
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
283
        intf_thread_t * p_intf = VLCIntf;
284 285 286 287 288 289 290 291 292 293
        playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                          FIND_ANYWHERE );
        int i;

        if (p_playlist)
        {
            if (i_item > -1)
            {
                if (self == o_root_item)
                {
294 295
                    o_children = [[NSMutableArray alloc] initWithCapacity:p_playlist->pp_items[i_item]->input.i_categories];
                    for (i = 0 ; i<p_playlist->pp_items[i_item]->input.i_categories ; i++)
296
                    {
297
                        [o_children addObject:[[VLCInfoTreeItem alloc]
298
                            initWithName: [NSString stringWithUTF8String:
299 300
                                p_playlist->pp_items[i_item]->input.
                                pp_categories[i]->psz_name]
301
                            value: @""
302
                            ID: i
303 304 305 306 307 308
                            parent: self]];
                    }
                }
                else if (o_parent == o_root_item)
                {
                    o_children = [[NSMutableArray alloc] initWithCapacity:
309
                        p_playlist->pp_items[i_item]->input.
310
                        pp_categories[i_object_id]->i_infos];
311
                    for (i = 0 ; i<p_playlist->pp_items[i_item]->input.
312 313 314 315
                           pp_categories[i_object_id]->i_infos ; i++)
                    {
                        [o_children addObject:[[VLCInfoTreeItem alloc]
                        initWithName: [NSString stringWithUTF8String:
316
                                p_playlist->pp_items[i_item]->input.
317 318 319
                                pp_categories[i_object_id]->
                                pp_infos[i]->psz_name]
                            value: [NSString stringWithUTF8String:
320
                                p_playlist->pp_items[i_item]->input.
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
                                pp_categories[i_object_id]->
                                pp_infos[i]->psz_value]
                            ID: i
                            parent: self]];
                    }
                }
                else
                {
                    o_children = IsALeafNode;
                }
            }
            vlc_object_release(p_playlist);
        }
    }
    return o_children;
}

- (NSString *)getName
{
    return o_name;
}

- (NSString *)getValue
{
    return o_value;
}

- (VLCInfoTreeItem *)childAtIndex:(int)i_index {
    return [[self children] objectAtIndex:i_index];
}

- (int)numberOfChildren {
    id i_tmp = [self children];
    return (i_tmp == IsALeafNode) ? (-1) : (int)[i_tmp count];
}

357
/*- (int)selectedPlaylistItem
358
{
359
    return i_item;
360
}
361
*/
362 363
- (void)refresh
{
Derk-Jan Hartman's avatar
Derk-Jan Hartman committed
364
    i_item = [[[VLCMain sharedInstance] getInfo] getItem];
365 366 367 368 369 370
    if (o_children != NULL)
    {
        [o_children release];
        o_children = NULL;
    }
}
Benjamin Pracht's avatar
Benjamin Pracht committed
371 372 373

@end