bookmarks.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:14k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * bookmarks.m: MacOS X Bookmarks window
  3.  *****************************************************************************
  4.  * Copyright (C) 2005 - 2007 the VideoLAN team
  5.  * $Id: 554fe8f92bfa693a334b57d9e0f6755d258f8590 $
  6.  *
  7.  * Authors: Felix Kühne <fkuehne@users.sf.net>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Note:
  25.  * the code used to bind with VLC's modules is heavily based upon
  26.  * ../wxwidgets/bookmarks.cpp, written by Gildas Bazin.
  27.  * (he is a member of the VideoLAN team)
  28.  *****************************************************************************/
  29. /*****************************************************************************
  30.  * Preamble
  31.  *****************************************************************************/
  32. #import "bookmarks.h"
  33. #import "wizard.h"
  34. #import <vlc_interface.h>
  35. /*****************************************************************************
  36.  * VLCExtended implementation
  37.  *
  38.  * implements the GUI functions for the window, the data source and the
  39.  * delegate for o_tbl_dataTable
  40.  *****************************************************************************/
  41. @implementation VLCBookmarks
  42. static VLCBookmarks *_o_sharedInstance = nil;
  43. + (VLCBookmarks *)sharedInstance
  44. {
  45.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  46. }
  47. - (id)init
  48. {
  49.     if (_o_sharedInstance) {
  50.         [self dealloc];
  51.     } else {
  52.         _o_sharedInstance = [super init];
  53.     }
  54.     return _o_sharedInstance;
  55. }
  56. /*****************************************************************************
  57.  * GUI methods
  58.  *****************************************************************************/
  59. - (void)awakeFromNib
  60. {
  61.     [self initStrings];
  62. }
  63. - (void)dealloc
  64. {
  65.     [super dealloc];
  66. }
  67. - (void)initStrings
  68. {
  69.     /* localise the items */
  70.  
  71.     /* main window */
  72.     [o_bookmarks_window setTitle: _NS("Bookmarks")];
  73.     [o_btn_add setTitle: _NS("Add")];
  74.     [o_btn_clear setTitle: _NS("Clear")];
  75.     [o_btn_edit setTitle: _NS("Edit")];
  76.     [o_btn_extract setTitle: _NS("Extract")];
  77.     [o_btn_rm setTitle: _NS("Remove")];
  78.     [[[o_tbl_dataTable tableColumnWithIdentifier:@"description"] headerCell]
  79.         setStringValue: _NS("Description")];
  80.     [[[o_tbl_dataTable tableColumnWithIdentifier:@"size_offset"] headerCell]
  81.         setStringValue: _NS("Position")];
  82.     [[[o_tbl_dataTable tableColumnWithIdentifier:@"time_offset"] headerCell]
  83.         setStringValue: _NS("Time")];
  84.  
  85.     /* edit window */
  86.     [o_edit_btn_ok setTitle: _NS("OK")];
  87.     [o_edit_btn_cancel setTitle: _NS("Cancel")];
  88.     [o_edit_lbl_name setStringValue: _NS("Name")];
  89.     [o_edit_lbl_time setStringValue: _NS("Time")];
  90.     [o_edit_lbl_bytes setStringValue: _NS("Position")];
  91. }
  92. - (void)showBookmarks
  93. {
  94.     /* show the window, called from intf.m */
  95.     [o_bookmarks_window displayIfNeeded];
  96.     [o_bookmarks_window makeKeyAndOrderFront:nil];
  97. }
  98. - (IBAction)add:(id)sender
  99. {
  100.     /* add item to list */
  101.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  102.     if( !p_input ) return;
  103.  
  104.     seekpoint_t bookmark;
  105.     if( !input_Control( p_input, INPUT_GET_BOOKMARK, &bookmark ) )
  106. {
  107. bookmark.psz_name = _("Untitled");
  108. input_Control( p_input, INPUT_ADD_BOOKMARK, &bookmark );
  109. }
  110.  
  111.     vlc_object_release( p_input );
  112.  
  113.     [o_tbl_dataTable reloadData];
  114. }
  115. - (IBAction)clear:(id)sender
  116. {
  117.     /* clear table */
  118.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  119.  
  120.     if( !p_input )
  121.         return;
  122.     input_Control( p_input, INPUT_CLEAR_BOOKMARKS );
  123.     vlc_object_release( p_input );
  124.  
  125.     [o_tbl_dataTable reloadData];
  126. }
  127. - (IBAction)edit:(id)sender
  128. {
  129.     /* put values to the sheet's fields and show sheet */
  130.     /* we take the values from the core and not the table, because we cannot
  131.      * really trust it */
  132.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  133.     seekpoint_t **pp_bookmarks;
  134.     int i_bookmarks;
  135.     int row;
  136.     row = [o_tbl_dataTable selectedRow];
  137.  
  138.     if( !p_input && row < 0 )
  139.         return;
  140.     if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  141.         &i_bookmarks ) != VLC_SUCCESS )
  142.     {
  143.         vlc_object_release( p_input );
  144.         return;
  145.     }
  146.     [o_edit_fld_name setStringValue: [NSString stringWithUTF8String:
  147.             pp_bookmarks[row]->psz_name]];
  148.     [o_edit_fld_time setStringValue: [[NSNumber numberWithInt:
  149.             (pp_bookmarks[row]->i_time_offset / 1000000)] stringValue]];
  150.     [o_edit_fld_bytes setStringValue: [[NSNumber numberWithInt:
  151.             pp_bookmarks[row]->i_byte_offset] stringValue]];
  152.  
  153.     /* Just keep the pointer value to check if it
  154.      * changes. Note, we don't need to keep a reference to the object.
  155.      * so release it now. */
  156.     p_old_input = p_input;
  157.     vlc_object_release( p_input );
  158.     [NSApp beginSheet: o_edit_window
  159.         modalForWindow: o_bookmarks_window
  160.         modalDelegate: o_edit_window
  161.         didEndSelector: nil
  162.         contextInfo: nil];
  163.     // Clear the bookmark list
  164.     for( int i = 0; i < i_bookmarks; i++)
  165.         vlc_seekpoint_Delete( pp_bookmarks[i] );
  166.     free( pp_bookmarks );
  167. }
  168. - (IBAction)edit_cancel:(id)sender
  169. {
  170.     /* close sheet */
  171.     [NSApp endSheet:o_edit_window];
  172.     [o_edit_window close];
  173. }
  174. - (IBAction)edit_ok:(id)sender
  175. {
  176.     /* save field contents and close sheet */
  177.      seekpoint_t **pp_bookmarks;
  178.     int i_bookmarks, i;
  179.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  180.  
  181.     if( !p_input )
  182.     {
  183.         NSBeginCriticalAlertSheet(_NS("No input"), _NS("OK"),
  184.                 @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("No "
  185.                 "input found. A stream must be playing or paused for "
  186.                 "bookmarks to work."));
  187.         return;
  188.     }
  189.     if( p_old_input != p_input )
  190.     {
  191.         NSBeginCriticalAlertSheet(_NS("Input has changed"), _NS("OK"),
  192.             @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Input "
  193.             "has changed, unable to save bookmark. Suspending playback with "
  194.             ""Pause" while editing bookmarks to ensure to keep the same "
  195.             "input."));
  196.         vlc_object_release( p_input );
  197.         return;
  198.     }
  199.  
  200.     if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  201.         &i_bookmarks ) != VLC_SUCCESS )
  202.     {
  203.         vlc_object_release( p_input );
  204.         return;
  205.     }
  206.     i = [o_tbl_dataTable selectedRow];
  207.  
  208.     free( pp_bookmarks[i]->psz_name );
  209.     pp_bookmarks[i]->psz_name = strdup([[o_edit_fld_name stringValue] UTF8String]);
  210.     pp_bookmarks[i]->i_byte_offset = [[o_edit_fld_bytes stringValue] intValue];
  211.     pp_bookmarks[i]->i_time_offset = ([[o_edit_fld_time stringValue] intValue]  * 1000000);
  212.  
  213.     if( input_Control( p_input, INPUT_CHANGE_BOOKMARK, pp_bookmarks[i], i )
  214.         != VLC_SUCCESS )
  215.     {
  216.         msg_Warn( VLCIntf, "Unable to change the bookmark");
  217.         goto clear;
  218.     }
  219.  
  220.     [o_tbl_dataTable reloadData];
  221.     vlc_object_release( p_input );
  222.  
  223.  
  224.     [NSApp endSheet: o_edit_window];
  225.     [o_edit_window close];
  226. clear:
  227.     // Clear the bookmark list
  228.     for( int i = 0; i < i_bookmarks; i++)
  229.         vlc_seekpoint_Delete( pp_bookmarks[i] );
  230.     free( pp_bookmarks );
  231. }
  232. - (IBAction)extract:(id)sender
  233. {
  234.     /* extract */
  235.     if( [o_tbl_dataTable numberOfSelectedRows] < 2 )
  236.     {
  237.         NSBeginAlertSheet(_NS("Invalid selection"), _NS("OK"),
  238.             @"", @"", o_bookmarks_window, nil, nil, nil, nil,
  239.             _NS("Two bookmarks have to be selected."));
  240.         return;
  241.     }
  242.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  243.     if( !p_input )
  244.     {
  245.         NSBeginCriticalAlertSheet(_NS("No input found"), _NS("OK"),
  246.             @"", @"", o_bookmarks_window, nil, nil, nil, nil,
  247.             _NS("The stream must be playing or paused for bookmarks to work."));
  248.         return;
  249.     }
  250.  
  251.     seekpoint_t **pp_bookmarks;
  252.     int i_bookmarks ;
  253.     int i_first = -1;
  254.     int i_second = -1;
  255.     int x = 0;
  256.     int c = 0;
  257.     while (c != 2)
  258.     {
  259.         if([o_tbl_dataTable isRowSelected:x])
  260.         {
  261.             if (i_first == -1)
  262.             {
  263.                 i_first = x;
  264.                 c = 1;
  265.             }
  266.             else if (i_second == -1)
  267.             {
  268.                 i_second = x;
  269.                 c = 2;
  270.             }
  271.         }
  272.         x = (x + 1);
  273.     }
  274.  
  275.     msg_Dbg( VLCIntf, "got the bookmark-indexes");
  276.  
  277.     if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  278.         &i_bookmarks ) != VLC_SUCCESS )
  279.     {
  280.         vlc_object_release( p_input );
  281.         msg_Err( VLCIntf, "already defined bookmarks couldn't be retrieved");
  282.         return;
  283.     }
  284.     msg_Dbg( VLCIntf, "calling wizard");
  285.     char *psz_uri = input_item_GetURI( input_GetItem( p_input ) );
  286.     [[[VLCMain sharedInstance] wizard] initWithExtractValuesFrom:
  287.             [[NSNumber numberWithInt:
  288.             (pp_bookmarks[i_first]->i_time_offset/1000000)] stringValue]
  289.             to: [[NSNumber numberWithInt:
  290.             (pp_bookmarks[i_second]->i_time_offset/1000000)] stringValue]
  291.             ofItem: [NSString stringWithUTF8String: psz_uri]];
  292.     free( psz_uri );
  293.     vlc_object_release( p_input );
  294.     msg_Dbg( VLCIntf, "released input");
  295.     // Clear the bookmark list
  296.     for( int i = 0; i < i_bookmarks; i++)
  297.         vlc_seekpoint_Delete( pp_bookmarks[i] );
  298.     free( pp_bookmarks );
  299. }
  300. - (IBAction)goToBookmark:(id)sender
  301. {
  302.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  303.  
  304.     if( !p_input ) return;
  305.     input_Control( p_input, INPUT_SET_BOOKMARK, [o_tbl_dataTable selectedRow] );
  306.     vlc_object_release( p_input );
  307. }
  308. - (IBAction)remove:(id)sender
  309. {
  310.     /* remove selected item */
  311.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  312.  
  313.     if( !p_input ) return;
  314.     int i_focused = [o_tbl_dataTable selectedRow];
  315.     if( i_focused >= 0 )
  316.         input_Control( p_input, INPUT_DEL_BOOKMARK, i_focused );
  317.     vlc_object_release( p_input );
  318.  
  319.     [o_tbl_dataTable reloadData];
  320. }
  321. /*****************************************************************************
  322.  * callback stuff
  323.  *****************************************************************************/
  324. -(id)dataTable
  325. {
  326.     return o_tbl_dataTable;
  327. }
  328. /*****************************************************************************
  329.  * data source methods
  330.  *****************************************************************************/
  331. - (NSInteger)numberOfRowsInTableView:(NSTableView *)theDataTable
  332. {
  333.     /* return the number of bookmarks */
  334.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  335.     seekpoint_t **pp_bookmarks;
  336.     int i_bookmarks;
  337.  
  338.     if( !p_input ) return 0;
  339.     else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  340.                        &i_bookmarks ) != VLC_SUCCESS )
  341.     {
  342.         vlc_object_release( p_input );
  343.         return 0;
  344.     }
  345.     else {
  346.         vlc_object_release( p_input );
  347.         // Clear the bookmark list
  348.         for( int i = 0; i < i_bookmarks; i++)
  349.             vlc_seekpoint_Delete( pp_bookmarks[i] );
  350.         free( pp_bookmarks );
  351.         return i_bookmarks;
  352.     }
  353. }
  354. - (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn:
  355.     (NSTableColumn *)theTableColumn row: (NSInteger)row
  356. {
  357.     /* return the corresponding data as NSString */
  358.     input_thread_t * p_input = pl_CurrentInput( VLCIntf );
  359.     seekpoint_t **pp_bookmarks;
  360.     int i_bookmarks;
  361.     char *toBeReturned;
  362.     int i_toBeReturned = 0;
  363.     id ret;
  364.     if( !p_input ) return @"";
  365.     else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks,
  366.                        &i_bookmarks ) != VLC_SUCCESS )
  367.     {
  368.         ret = @"";
  369.     }
  370.     else
  371.     {
  372.         if ([[theTableColumn identifier] isEqualToString: @"description"])
  373.         {
  374.             toBeReturned = pp_bookmarks[row]->psz_name;
  375.             ret = [NSString stringWithUTF8String: toBeReturned];
  376.         }
  377.         else if ([[theTableColumn identifier] isEqualToString: @"size_offset"])
  378.         {
  379.             i_toBeReturned = pp_bookmarks[row]->i_byte_offset;
  380.             ret = [[NSNumber numberWithInt: i_toBeReturned] stringValue];
  381.         }
  382.         else if ([[theTableColumn identifier] isEqualToString: @"time_offset"])
  383.         {
  384.             i_toBeReturned = pp_bookmarks[row]->i_time_offset;
  385.             ret = [[NSNumber numberWithInt: (i_toBeReturned / 1000000)]
  386.                 stringValue];
  387.         }
  388.         else
  389.         {
  390.             /* may not happen, just in case */
  391.             msg_Err( VLCIntf, "unknown table column identifier (%s) while "
  392.                 "updating the bookmark table", [[theTableColumn identifier]
  393.                 UTF8String] );
  394.             ret = @"unknown identifier";
  395.         }
  396.         // Clear the bookmark list
  397.         for( int i = 0; i < i_bookmarks; i++)
  398.             vlc_seekpoint_Delete( pp_bookmarks[i] );
  399.         free( pp_bookmarks );
  400.     }
  401.     vlc_object_release( p_input );
  402.     return ret;
  403. }
  404. /*****************************************************************************
  405.  * delegate methods
  406.  *****************************************************************************/
  407. - (void)tableViewSelectionDidChange:(NSNotification *)aNotification
  408. {
  409.     /* check whether a row is selected and en-/disable the edit/remove buttons */
  410.     if ([o_tbl_dataTable selectedRow] == -1)
  411.     {
  412.         /* no row is selected */
  413.         [o_btn_edit setEnabled: NO];
  414.         [o_btn_rm setEnabled: NO];
  415.         [o_btn_extract setEnabled: NO];
  416.     }
  417.     else
  418.     {
  419.         /* a row is selected */
  420.         [o_btn_edit setEnabled: YES];
  421.         [o_btn_rm setEnabled: YES];
  422.         if ([o_tbl_dataTable numberOfSelectedRows] == 2)
  423.         {
  424.             [o_btn_extract setEnabled: YES];
  425.         }
  426.     }
  427. }
  428. @end