⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bookmarks.m

📁 VLC Player Source Code
💻 M
字号:
/***************************************************************************** * bookmarks.m: MacOS X Bookmarks window ***************************************************************************** * Copyright (C) 2005 - 2007 the VideoLAN team * $Id$ * * Authors: Felix Kühne <fkuehne@users.sf.net> * * 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. * * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * 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) *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#import "bookmarks.h"#import "wizard.h"#import <vlc_interface.h>/***************************************************************************** * VLCExtended implementation * * implements the GUI functions for the window, the data source and the * delegate for o_tbl_dataTable *****************************************************************************/@implementation VLCBookmarksstatic VLCBookmarks *_o_sharedInstance = nil;+ (VLCBookmarks *)sharedInstance{    return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];}- (id)init{    if (_o_sharedInstance) {        [self dealloc];    } else {        _o_sharedInstance = [super init];    }    return _o_sharedInstance;}/***************************************************************************** * GUI methods *****************************************************************************/- (void)awakeFromNib{    [self initStrings];}- (void)dealloc{    [super dealloc];}- (void)initStrings{    /* localise the items */     /* main window */    [o_bookmarks_window setTitle: _NS("Bookmarks")];    [o_btn_add setTitle: _NS("Add")];    [o_btn_clear setTitle: _NS("Clear")];    [o_btn_edit setTitle: _NS("Edit")];    [o_btn_extract setTitle: _NS("Extract")];    [o_btn_rm setTitle: _NS("Remove")];    [[[o_tbl_dataTable tableColumnWithIdentifier:@"description"] headerCell]        setStringValue: _NS("Description")];    [[[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("Position")];}- (void)showBookmarks{    /* show the window, called from intf.m */    [o_bookmarks_window displayIfNeeded];    [o_bookmarks_window makeKeyAndOrderFront:nil];}- (IBAction)add:(id)sender{    /* add item to list */    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( VLCIntf, "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 );     vlc_object_release( p_input );     [o_tbl_dataTable reloadData];}- (IBAction)clear:(id)sender{    /* clear table */    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];}- (IBAction)edit:(id)sender{    /* 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 */    input_thread_t * p_input = pl_CurrentInput( VLCIntf );    seekpoint_t **pp_bookmarks;    int i_bookmarks;    int row;    row = [o_tbl_dataTable selectedRow];     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;    }    else if(row < 0)    {        vlc_object_release( p_input );        return;    } else {        [o_edit_fld_name setStringValue: [NSString stringWithUTF8String:            pp_bookmarks[row]->psz_name]];        [o_edit_fld_time setStringValue: [[NSNumber numberWithInt:            (pp_bookmarks[row]->i_time_offset / 1000000)] stringValue]];        [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 );    [NSApp beginSheet: o_edit_window        modalForWindow: o_bookmarks_window        modalDelegate: o_edit_window        didEndSelector: nil        contextInfo: nil];}- (IBAction)edit_cancel:(id)sender{    /* close sheet */    [NSApp endSheet:o_edit_window];    [o_edit_window close];}- (IBAction)edit_ok:(id)sender{    /* save field contents and close sheet */     seekpoint_t **pp_bookmarks;    int i_bookmarks, i;    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. 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. 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,        &i_bookmarks ) != VLC_SUCCESS )    {        vlc_object_release( p_input );        return;    }    i = [o_tbl_dataTable selectedRow];     free( pp_bookmarks[i]->psz_name );    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 )        != VLC_SUCCESS )    {        msg_Warn( VLCIntf, "Unable to change the bookmark");        vlc_object_release( p_input );        return;    }     [o_tbl_dataTable reloadData];    vlc_object_release( p_input );      [NSApp endSheet: o_edit_window];    [o_edit_window close];}- (IBAction)extract:(id)sender{    /* extract */    if( [o_tbl_dataTable numberOfSelectedRows] < 2 )    {        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 = 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."));        return;    }     seekpoint_t **pp_bookmarks;    int i_bookmarks ;    int i_first = -1;    int i_second = -1;    int x = 0;    int c = 0;    while (c != 2)    {        if([o_tbl_dataTable isRowSelected:x])        {            if (i_first == -1)            {                i_first = x;                c = 1;            }            else if (i_second == -1)            {                i_second = x;                c = 2;            }        }        x = (x + 1);    }     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( VLCIntf, "already defined bookmarks couldn't be retrieved");        return;    }    msg_Dbg( VLCIntf, "calling wizard");    char *psz_uri = input_item_GetURI( input_GetItem( p_input ) );    [[[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: psz_uri]];    free( psz_uri );    vlc_object_release( p_input );    msg_Dbg( VLCIntf, "released input");}- (IBAction)goToBookmark:(id)sender{    input_thread_t * p_input = pl_CurrentInput( VLCIntf );     if( !p_input ) return;    input_Control( p_input, INPUT_SET_BOOKMARK, [o_tbl_dataTable selectedRow] );    vlc_object_release( p_input );}- (IBAction)remove:(id)sender{    /* remove selected item */    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];}/***************************************************************************** * callback stuff *****************************************************************************/-(id)getDataTable{    return o_tbl_dataTable;}/***************************************************************************** * data source methods *****************************************************************************/- (int)numberOfRowsInTableView:(NSTableView *)theDataTable{    /* return the number of bookmarks */    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,                       &i_bookmarks ) != VLC_SUCCESS )    {        vlc_object_release( p_input );        return 0;    }    else {        vlc_object_release( p_input );        return i_bookmarks;    }}- (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn:    (NSTableColumn *)theTableColumn row: (int)row{    /* return the corresponding data as NSString */    input_thread_t * p_input = pl_CurrentInput( VLCIntf );    seekpoint_t **pp_bookmarks;    int i_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 )    {        ret = @"";    }    else    {        if ([[theTableColumn identifier] isEqualToString: @"description"])        {            toBeReturned = pp_bookmarks[row]->psz_name;            ret = [NSString stringWithUTF8String: toBeReturned];        }        else if ([[theTableColumn identifier] isEqualToString: @"size_offset"])        {            i_toBeReturned = pp_bookmarks[row]->i_byte_offset;            ret = [[NSNumber numberWithInt: i_toBeReturned] stringValue];        }        else if ([[theTableColumn identifier] isEqualToString: @"time_offset"])        {            i_toBeReturned = pp_bookmarks[row]->i_time_offset;            ret = [[NSNumber numberWithInt: (i_toBeReturned / 1000000)]                stringValue];        }        else        {            /* may not happen, just in case */            msg_Err( VLCIntf, "unknown table column identifier (%s) while "                "updating the bookmark table", [[theTableColumn identifier]                UTF8String] );            ret = @"unknown identifier";        }    }    vlc_object_release( p_input );    return ret;}/***************************************************************************** * delegate methods *****************************************************************************/- (void)tableViewSelectionDidChange:(NSNotification *)aNotification{    /* check whether a row is selected and en-/disable the edit/remove buttons */    if ([o_tbl_dataTable selectedRow] == -1)    {        /* no row is selected */        [o_btn_edit setEnabled: NO];        [o_btn_rm setEnabled: NO];        [o_btn_extract setEnabled: NO];    }    else    {        /* a row is selected */        [o_btn_edit setEnabled: YES];        [o_btn_rm setEnabled: YES];        if ([o_tbl_dataTable numberOfSelectedRows] == 2)        {            [o_btn_extract setEnabled: YES];        }    }}@end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -