X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fbookmarks.m;h=48037331ce8351851303352c2531a40d734a413c;hb=7911a9209f1a04fd824e2b41c9e9ee82fcf9b790;hp=e37e7fa4151b2478c65e713009f78cbb6e5623fc;hpb=baed4c1bfdef32994af18a664b03fea7d1cc6401;p=vlc diff --git a/modules/gui/macosx/bookmarks.m b/modules/gui/macosx/bookmarks.m index e37e7fa415..48037331ce 100644 --- a/modules/gui/macosx/bookmarks.m +++ b/modules/gui/macosx/bookmarks.m @@ -1,10 +1,10 @@ /***************************************************************************** * bookmarks.m: MacOS X Bookmarks window ***************************************************************************** - * Copyright (C) 2005 the VideoLAN team + * Copyright (C) 2005 - 2007 VLC authors and VideoLAN * $Id$ * - * Authors: Felix Kühne + * Authors: Felix Kühne * * 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 @@ -23,10 +23,10 @@ /***************************************************************************** - * Note: - * the code used to bind with VLC's modules is heavily based upon - * ../wxwidgets/bookmarks.cpp, written by Gildas Bazin. - * (he is a member of the VideoLAN team) + * Note: + * the code used to bind with VLC's modules is heavily based upon + * ../wxwidgets/bookmarks.cpp, written by Gildas Bazin. + * (he is a member of the VideoLAN team) *****************************************************************************/ @@ -35,16 +35,9 @@ *****************************************************************************/ #import "bookmarks.h" -#import "intf.h" #import "wizard.h" -#import - -/***************************************************************************** - * VLCExtended implementation - * - * implements the GUI functions for the window, the data source and the - * delegate for o_tbl_dataTable - *****************************************************************************/ +#import +#import "CompatibilityFixes.h" @implementation VLCBookmarks @@ -72,22 +65,21 @@ static VLCBookmarks *_o_sharedInstance = nil; - (void)awakeFromNib { + if (OSX_LION) + [o_bookmarks_window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary]; + [self initStrings]; } - (void)dealloc { - if(p_old_input) - { - free(p_old_input); - } [super dealloc]; } - (void)initStrings { /* localise the items */ - + /* main window */ [o_bookmarks_window setTitle: _NS("Bookmarks")]; [o_btn_add setTitle: _NS("Add")]; @@ -95,19 +87,19 @@ static VLCBookmarks *_o_sharedInstance = nil; [o_btn_edit setTitle: _NS("Edit")]; [o_btn_extract setTitle: _NS("Extract")]; [o_btn_rm setTitle: _NS("Remove")]; - [[[o_tbl_dataTable tableColumnWithIdentifier:@"description"] headerCell] \ + [[[o_tbl_dataTable tableColumnWithIdentifier:@"description"] headerCell] setStringValue: _NS("Description")]; - [[[o_tbl_dataTable tableColumnWithIdentifier:@"size_offset"] headerCell] \ - setStringValue: _NS("Size offset")]; - [[[o_tbl_dataTable tableColumnWithIdentifier:@"time_offset"] headerCell] \ - setStringValue: _NS("Time offset")]; - + [[[o_tbl_dataTable tableColumnWithIdentifier:@"size_offset"] headerCell] + setStringValue: _NS("Position")]; + [[[o_tbl_dataTable tableColumnWithIdentifier:@"time_offset"] headerCell] + setStringValue: _NS("Time")]; + /* edit window */ [o_edit_btn_ok setTitle: _NS("OK")]; [o_edit_btn_cancel setTitle: _NS("Cancel")]; [o_edit_lbl_name setStringValue: _NS("Name")]; [o_edit_lbl_time setStringValue: _NS("Time")]; - [o_edit_lbl_bytes setStringValue: _NS("Bytes")]; + [o_edit_lbl_bytes setStringValue: _NS("Position")]; } - (void)showBookmarks @@ -120,44 +112,35 @@ static VLCBookmarks *_o_sharedInstance = nil; - (IBAction)add:(id)sender { /* add item to list */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t * p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); - if( !p_input ) - return; - + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + + if( !p_input ) return; + seekpoint_t bookmark; - vlc_value_t pos; - bookmark.psz_name = NULL; - bookmark.i_byte_offset = 0; - bookmark.i_time_offset = 0; - - var_Get(p_intf, "position", &pos); - bookmark.psz_name = _("Untitled"); - input_Control( p_input, INPUT_GET_BYTE_POSITION, &bookmark.i_byte_offset ); - var_Get( p_input, "time", &pos ); - bookmark.i_time_offset = pos.i_time; - input_Control( p_input, INPUT_ADD_BOOKMARK, &bookmark ); - + + if( !input_Control( p_input, INPUT_GET_BOOKMARK, &bookmark ) ) + { + bookmark.psz_name = _("Untitled"); + input_Control( p_input, INPUT_ADD_BOOKMARK, &bookmark ); + } + vlc_object_release( p_input ); - + [o_tbl_dataTable reloadData]; } - (IBAction)clear:(id)sender { /* clear table */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); - + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + if( !p_input ) return; input_Control( p_input, INPUT_CLEAR_BOOKMARKS ); vlc_object_release( p_input ); - + [o_tbl_dataTable reloadData]; } @@ -166,41 +149,32 @@ static VLCBookmarks *_o_sharedInstance = nil; /* put values to the sheet's fields and show sheet */ /* we take the values from the core and not the table, because we cannot * really trust it */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t * p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); seekpoint_t **pp_bookmarks; int i_bookmarks; - char * toBeReturned; - toBeReturned = ""; - int i_toBeReturned; - i_toBeReturned = 0; int row; row = [o_tbl_dataTable selectedRow]; - - if( !p_input ) - { + + if( !p_input && row < 0 ) return; - } - else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, \ + + if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { vlc_object_release( p_input ); return; - } - else if(row < 0) - { - vlc_object_release( p_input ); - return; - } else { - [o_edit_fld_name setStringValue: [NSString stringWithUTF8String: \ + } + + [o_edit_fld_name setStringValue: [NSString stringWithUTF8String: pp_bookmarks[row]->psz_name]]; - [o_edit_fld_time setStringValue: [[NSNumber numberWithInt: \ + [o_edit_fld_time setStringValue: [[NSNumber numberWithInt: (pp_bookmarks[row]->i_time_offset / 1000000)] stringValue]]; - [o_edit_fld_bytes setStringValue: [[NSNumber numberWithInt: \ + [o_edit_fld_bytes setStringValue: [[NSNumber numberWithInt: pp_bookmarks[row]->i_byte_offset] stringValue]]; - } - + + /* Just keep the pointer value to check if it + * changes. Note, we don't need to keep a reference to the object. + * so release it now. */ p_old_input = p_input; vlc_object_release( p_input ); @@ -209,6 +183,12 @@ static VLCBookmarks *_o_sharedInstance = nil; modalDelegate: o_edit_window didEndSelector: nil contextInfo: nil]; + + // Clear the bookmark list + for( int i = 0; i < i_bookmarks; i++) + vlc_seekpoint_Delete( pp_bookmarks[i] ); + free( pp_bookmarks ); + } - (IBAction)edit_cancel:(id)sender @@ -221,89 +201,84 @@ static VLCBookmarks *_o_sharedInstance = nil; - (IBAction)edit_ok:(id)sender { /* save field contents and close sheet */ - - intf_thread_t * p_intf = VLCIntf; - seekpoint_t **pp_bookmarks; + seekpoint_t **pp_bookmarks; int i_bookmarks, i; - input_thread_t *p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); - + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + if( !p_input ) { - NSBeginCriticalAlertSheet(_NS("No input"), _NS("OK"), \ - @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("No " \ - "input found. The stream must be playing or paused for " \ + NSBeginCriticalAlertSheet(_NS("No input"), _NS("OK"), + @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("No " + "input found. A stream must be playing or paused for " "bookmarks to work.")); return; } if( p_old_input != p_input ) { - NSBeginCriticalAlertSheet(_NS("Input has changed"), _NS("OK"), \ - @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Input " \ - "has changed, unable to save bookmark. Use \"Pause\" while " \ - "editing bookmarks to keep the same input.")); + NSBeginCriticalAlertSheet(_NS("Input has changed"), _NS("OK"), + @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Input " + "has changed, unable to save bookmark. Suspending playback with " + "\"Pause\" while editing bookmarks to ensure to keep the same " + "input.")); vlc_object_release( p_input ); return; } - - if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, \ + + if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { vlc_object_release( p_input ); return; - } + } i = [o_tbl_dataTable selectedRow]; - - if( pp_bookmarks[i]->psz_name ) - { - free( pp_bookmarks[i]->psz_name ); - } + + free( pp_bookmarks[i]->psz_name ); - pp_bookmarks[i]->psz_name = strdup([[o_edit_fld_name stringValue] UTF8String]); + pp_bookmarks[i]->psz_name = strdup([[o_edit_fld_name stringValue] UTF8String]); pp_bookmarks[i]->i_byte_offset = [[o_edit_fld_bytes stringValue] intValue]; pp_bookmarks[i]->i_time_offset = ([[o_edit_fld_time stringValue] intValue] * 1000000); - - if( input_Control( p_input, INPUT_CHANGE_BOOKMARK, pp_bookmarks[i], i ) \ + + if( input_Control( p_input, INPUT_CHANGE_BOOKMARK, pp_bookmarks[i], i ) != VLC_SUCCESS ) { - msg_Warn( p_intf, "VLCBookmarks: changing bookmark failed"); - vlc_object_release( p_input ); - return; + msg_Warn( VLCIntf, "Unable to change the bookmark"); + goto clear; } - + [o_tbl_dataTable reloadData]; vlc_object_release( p_input ); - - + + [NSApp endSheet: o_edit_window]; [o_edit_window close]; + +clear: + // Clear the bookmark list + for( int i = 0; i < i_bookmarks; i++) + vlc_seekpoint_Delete( pp_bookmarks[i] ); + free( pp_bookmarks ); } - (IBAction)extract:(id)sender { /* extract */ - - intf_thread_t * p_intf = VLCIntf; - if( [o_tbl_dataTable numberOfSelectedRows] < 2 ) { - NSBeginAlertSheet(_NS("Invalid selection"), _NS("OK"), \ - @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("" \ - "You have to select two bookmarks.")); + NSBeginAlertSheet(_NS("Invalid selection"), _NS("OK"), + @"", @"", o_bookmarks_window, nil, nil, nil, nil, + _NS("Two bookmarks have to be selected.")); return; } - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, - FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); if( !p_input ) { - NSBeginCriticalAlertSheet(_NS("No input found"), _NS("OK"), \ - @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("" \ - "The stream must be playing or paused for bookmarks to work.")); + NSBeginCriticalAlertSheet(_NS("No input found"), _NS("OK"), + @"", @"", o_bookmarks_window, nil, nil, nil, nil, + _NS("The stream must be playing or paused for bookmarks to work.")); return; } - + seekpoint_t **pp_bookmarks; int i_bookmarks ; int i_first = -1; @@ -318,7 +293,7 @@ static VLCBookmarks *_o_sharedInstance = nil; { i_first = x; c = 1; - } + } else if (i_second == -1) { i_second = x; @@ -327,39 +302,40 @@ static VLCBookmarks *_o_sharedInstance = nil; } x = (x + 1); } - - msg_Dbg(p_intf, "got the bookmark-indexes"); - - if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, \ + + msg_Dbg( VLCIntf, "got the bookmark-indexes"); + + if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { vlc_object_release( p_input ); - msg_Err(p_intf, "bookmarks couldn't be retrieved from core"); + msg_Err( VLCIntf, "already defined bookmarks couldn't be retrieved"); return; } - msg_Dbg(p_intf, "calling wizard"); - - [[[VLCMain sharedInstance] getWizard] initWithExtractValuesFrom: \ - [[NSNumber numberWithInt: \ - (pp_bookmarks[i_first]->i_time_offset/1000000)] stringValue] \ - to: [[NSNumber numberWithInt: \ - (pp_bookmarks[i_second]->i_time_offset/1000000)] stringValue] \ - ofItem: [NSString stringWithUTF8String: \ - p_input->input.p_item->psz_uri]]; + msg_Dbg( VLCIntf, "calling wizard"); + + char *psz_uri = input_item_GetURI( input_GetItem( p_input ) ); + [[[VLCMain sharedInstance] wizard] initWithExtractValuesFrom: + [[NSNumber numberWithInt: + (pp_bookmarks[i_first]->i_time_offset/1000000)] stringValue] + to: [[NSNumber numberWithInt: + (pp_bookmarks[i_second]->i_time_offset/1000000)] stringValue] + ofItem: [NSString stringWithUTF8String: psz_uri]]; + free( psz_uri ); vlc_object_release( p_input ); - msg_Dbg(p_intf, "released input"); + msg_Dbg( VLCIntf, "released input"); + + // Clear the bookmark list + for( int i = 0; i < i_bookmarks; i++) + vlc_seekpoint_Delete( pp_bookmarks[i] ); + free( pp_bookmarks ); } - (IBAction)goToBookmark:(id)sender { - intf_thread_t * p_intf = VLCIntf; - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); - - if( !p_input ) - { - return; - } + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + + if( !p_input ) return; input_Control( p_input, INPUT_SET_BOOKMARK, [o_tbl_dataTable selectedRow] ); @@ -369,20 +345,17 @@ static VLCBookmarks *_o_sharedInstance = nil; - (IBAction)remove:(id)sender { /* remove selected item */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t *p_input = - (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, FIND_ANYWHERE ); - + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); + if( !p_input ) return; int i_focused = [o_tbl_dataTable selectedRow]; + if( i_focused >= 0 ) - { input_Control( p_input, INPUT_DEL_BOOKMARK, i_focused ); - } vlc_object_release( p_input ); - + [o_tbl_dataTable reloadData]; } @@ -390,7 +363,7 @@ static VLCBookmarks *_o_sharedInstance = nil; * callback stuff *****************************************************************************/ --(id)getDataTable +-(id)dataTable { return o_tbl_dataTable; } @@ -399,20 +372,15 @@ static VLCBookmarks *_o_sharedInstance = nil; * data source methods *****************************************************************************/ -- (int)numberOfRowsInTableView:(NSTableView *)theDataTable +- (NSInteger)numberOfRowsInTableView:(NSTableView *)theDataTable { /* return the number of bookmarks */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t * p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); seekpoint_t **pp_bookmarks; int i_bookmarks; - - if( !p_input ) - { - return 0; - } - else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, \ + + if( !p_input ) return 0; + else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { vlc_object_release( p_input ); @@ -420,66 +388,65 @@ static VLCBookmarks *_o_sharedInstance = nil; } else { vlc_object_release( p_input ); + // Clear the bookmark list + for( int i = 0; i < i_bookmarks; i++) + vlc_seekpoint_Delete( pp_bookmarks[i] ); + free( pp_bookmarks ); return i_bookmarks; } } -- (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn: \ - (NSTableColumn *)theTableColumn row: (int)row +- (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn: + (NSTableColumn *)theTableColumn row: (NSInteger)row { /* return the corresponding data as NSString */ - intf_thread_t * p_intf = VLCIntf; - input_thread_t * p_input = (input_thread_t *)vlc_object_find( p_intf, \ - VLC_OBJECT_INPUT, FIND_ANYWHERE ); + input_thread_t * p_input = pl_CurrentInput( VLCIntf ); seekpoint_t **pp_bookmarks; int i_bookmarks; - char * toBeReturned; - toBeReturned = ""; - int i_toBeReturned; - i_toBeReturned = 0; - - if( !p_input ) - { - return @""; - } - else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, \ + char *toBeReturned; + int i_toBeReturned = 0; + id ret; + + if( !p_input ) return @""; + else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { - vlc_object_release( p_input ); - return @""; + ret = @""; } else { if ([[theTableColumn identifier] isEqualToString: @"description"]) { toBeReturned = pp_bookmarks[row]->psz_name; - vlc_object_release( p_input ); - return [NSString stringWithUTF8String: toBeReturned]; - } + ret = [NSString stringWithUTF8String: toBeReturned]; + } else if ([[theTableColumn identifier] isEqualToString: @"size_offset"]) { i_toBeReturned = pp_bookmarks[row]->i_byte_offset; - vlc_object_release( p_input ); - return [[NSNumber numberWithInt: i_toBeReturned] stringValue]; + ret = [[NSNumber numberWithInt: i_toBeReturned] stringValue]; } else if ([[theTableColumn identifier] isEqualToString: @"time_offset"]) { i_toBeReturned = pp_bookmarks[row]->i_time_offset; - vlc_object_release( p_input ); - return [[NSNumber numberWithInt: (i_toBeReturned / 1000000)] \ + ret = [[NSNumber numberWithInt: (i_toBeReturned / 1000000)] stringValue]; } else { - /* may not happen, but just in case */ - vlc_object_release( p_input ); - msg_Err(p_intf, "VLCBookmarks: unknown table column identifier " \ - "(%s) while updating table", [[theTableColumn identifier] \ + /* may not happen, just in case */ + msg_Err( VLCIntf, "unknown table column identifier (%s) while " + "updating the bookmark table", [[theTableColumn identifier] UTF8String] ); - return @"unknown identifier"; + ret = @"unknown identifier"; } - } + // Clear the bookmark list + for( int i = 0; i < i_bookmarks; i++) + vlc_seekpoint_Delete( pp_bookmarks[i] ); + free( pp_bookmarks ); + } + vlc_object_release( p_input ); + return ret; } /*****************************************************************************