+ [[[[VLCMain sharedInstance] getWizard] getPlaylistWizard] reloadOutlineView];
+ [[[[VLCMain sharedInstance] getBookmarks] getDataTable] reloadData];
+
+ playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
+ FIND_ANYWHERE );
+ if(! p_playlist )
+ return;
+
+ if( p_playlist->i_size >= 2 )
+ {
+ [o_status_field setStringValue: [NSString stringWithFormat:
+ _NS("%i items in the playlist"), p_playlist->i_size]];
+ }
+ else
+ {
+ if( p_playlist->i_size == 0 )
+ {
+ [o_status_field setStringValue: _NS("No items in the playlist")];
+ }
+ else
+ {
+ [o_status_field setStringValue: _NS("1 item in the playlist")];
+ }
+ }
+ vlc_object_release( p_playlist );
+}
+
+- (void)playModeUpdated
+{
+ playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
+ FIND_ANYWHERE );
+ vlc_value_t val, val2;
+
+ if( p_playlist == NULL )
+ {
+ return;
+ }
+
+ var_Get( p_playlist, "loop", &val2 );
+ var_Get( p_playlist, "repeat", &val );
+ if( val.b_bool == VLC_TRUE )
+ {
+ [o_loop_popup selectItemAtIndex: 1];
+ }
+ else if( val2.b_bool == VLC_TRUE )
+ {
+ [o_loop_popup selectItemAtIndex: 2];
+ }
+ else
+ {
+ [o_loop_popup selectItemAtIndex: 0];
+ }
+
+ var_Get( p_playlist, "random", &val );
+ [o_random_ckb setState: val.b_bool];
+
+ vlc_object_release( p_playlist );
+}
+
+- (void)updateRowSelection
+{
+ int i_row;
+ unsigned int j;
+
+ playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
+ FIND_ANYWHERE );
+ playlist_item_t *p_item, *p_temp_item;
+ NSMutableArray *o_array = [NSMutableArray array];
+
+ if( p_playlist == NULL )
+ return;
+
+ p_item = p_playlist->status.p_item;
+ if( p_item == NULL )
+ {
+ vlc_object_release(p_playlist);
+ return;
+ }
+
+ p_temp_item = p_item;
+ while( p_temp_item->p_parent )
+ {
+ [o_array insertObject: [NSValue valueWithPointer: p_temp_item] atIndex: 0];
+ p_temp_item = p_temp_item->p_parent;
+ /*for (i = 0 ; i < p_temp_item->i_parents ; i++)
+ {
+ if( p_temp_item->pp_parents[i]->i_view == i_current_view )
+ {
+ p_temp_item = p_temp_item->pp_parents[i]->p_parent;
+ break;
+ }
+ }*/
+ }
+
+ for( j = 0; j < [o_array count] - 1; j++ )
+ {
+ id o_item;
+ if( ( o_item = [o_outline_dict objectForKey:
+ [NSString stringWithFormat: @"%p",
+ [[o_array objectAtIndex:j] pointerValue]]] ) != nil )
+ {
+ msg_Err( p_playlist, "o_item: %p", o_item );
+ [o_outline_view expandItem: o_item];
+ }
+
+ }
+
+ i_row = [o_outline_view rowForItem:[o_outline_dict
+ objectForKey:[NSString stringWithFormat: @"%p", p_item]]];
+
+ [o_outline_view selectRow: i_row byExtendingSelection: NO];
+ [o_outline_view scrollRowToVisible: i_row];
+
+ vlc_object_release(p_playlist);
+
+ /* update our info-panel to reflect the new item */
+ [[[VLCMain sharedInstance] getInfo] updatePanel];
+}
+
+/* Check if p_item is a child of p_node recursively. We need to check the item
+ existence first since OSX sometimes tries to redraw items that have been
+ deleted. We don't do it when not required since this verification takes
+ quite a long time on big playlists (yes, pretty hacky). */
+- (BOOL)isItem: (playlist_item_t *)p_item
+ inNode: (playlist_item_t *)p_node
+ checkItemExistence:(BOOL)b_check
+
+{
+ playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST,
+ FIND_ANYWHERE );
+ playlist_item_t *p_temp_item = p_item;
+
+ if( p_playlist == NULL )
+ {
+ return NO;
+ }
+
+ if( p_node == p_item )
+ {
+ vlc_object_release(p_playlist);
+ return YES;
+ }
+
+ if( p_node->i_children < 1)
+ {
+ vlc_object_release(p_playlist);
+ return NO;
+ }
+
+ if ( p_temp_item )
+ {
+ int i;
+ vlc_mutex_lock( &p_playlist->object_lock );
+
+ if( b_check )
+ {
+ /* Since outlineView: willDisplayCell:... may call this function with
+ p_items that don't exist anymore, first check if the item is still
+ in the playlist. Any cleaner solution welcomed. */
+ for( i = 0; i < p_playlist->i_all_size; i++ )
+ {
+ if( p_playlist->pp_all_items[i] == p_item ) break;
+ else if ( i == p_playlist->i_all_size - 1 )
+ {
+ vlc_object_release( p_playlist );
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ return NO;
+ }
+ }
+ }
+
+ while( p_temp_item )
+ {
+ p_temp_item = p_temp_item->p_parent;
+ if( p_temp_item == p_node )
+ {
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ vlc_object_release( p_playlist );
+ return YES;
+ }
+ }
+ vlc_mutex_unlock( &p_playlist->object_lock );
+ }
+
+ vlc_object_release( p_playlist );
+ return NO;