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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * coredialogs.m: Mac OS X Core Dialogs
  3.  *****************************************************************************
  4.  * Copyright (C) 2005-2009 the VideoLAN team
  5.  * $Id: 078d4ba21d09365f72754492cdd7a2c79cf5541c $
  6.  *
  7.  * Authors: Derk-Jan Hartman <hartman at videolan dot org>
  8.  *          Felix Paul Kühne <fkuehne at videolan dot org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #import "intf.h"
  25. #import "coredialogs.h"
  26. #import "misc.h"
  27. /* for the icon in our custom error panel */
  28. #import <ApplicationServices/ApplicationServices.h>
  29. /*****************************************************************************
  30.  * VLCCoreDialogProvider implementation
  31.  *****************************************************************************/
  32. @implementation VLCCoreDialogProvider
  33. static VLCCoreDialogProvider *_o_sharedInstance = nil;
  34. + (VLCCoreDialogProvider *)sharedInstance
  35. {
  36.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  37. }
  38. -(id)init
  39. {
  40.     if( _o_sharedInstance )
  41.         [self dealloc];
  42.     else
  43.     {
  44.         _o_sharedInstance = [super init];
  45.         [[NSNotificationCenter defaultCenter] addObserver:self
  46.                                                  selector:@selector(performDialogEvent:)
  47.                                                      name: @"VLCNewCoreDialogEventNotification"
  48.                                                    object:self];
  49.         o_error_panel = [[VLCErrorPanel alloc] init];
  50.         b_progress_cancelled = NO;
  51.     }
  52.     
  53.     return _o_sharedInstance;
  54. }
  55. -(void)awakeFromNib
  56. {
  57.     [o_auth_login_txt setStringValue: _NS("User name")];
  58.     [o_auth_pw_txt setStringValue: _NS("Password")];
  59.     [o_auth_cancel_btn setTitle: _NS("Cancel")];
  60.     [o_auth_ok_btn setTitle: _NS("OK")];
  61.     [o_prog_cancel_btn setTitle: _NS("Cancel")];
  62.     [o_prog_bar setUsesThreadedAnimation: YES];
  63. }    
  64. -(void)performDialogEvent: (NSNotification *)o_notification
  65. {
  66.     NSValue *o_value = [[o_notification userInfo] objectForKey:@"VLCDialogPointer"];
  67.     NSString *o_type = [[o_notification userInfo] objectForKey:@"VLCDialogType"];
  68.     if( [o_type isEqualToString: @"dialog-error"] )
  69.         [self showFatalDialog: o_value];
  70.     else if( [o_type isEqualToString: @"dialog-critical"] )
  71.         [self showFatalWaitDialog: o_value];
  72.     else if( [o_type isEqualToString: @"dialog-question"] )
  73.         [self showQuestionDialog: o_value];
  74.     else if( [o_type isEqualToString: @"dialog-login"] )
  75.         [self showLoginDialog: o_value];
  76.     else if( [o_type isEqualToString: @"dialog-progress-bar"] )
  77.         [self showProgressDialog: o_value];
  78.     else
  79.         msg_Err( VLCIntf, "unhandled dialog type: '%s'", [o_type UTF8String] );
  80. }
  81. -(void)showFatalDialog: (NSValue *)o_value
  82. {
  83.     dialog_fatal_t *p_dialog = [o_value pointerValue];
  84.     [o_error_panel addError: [NSString stringWithUTF8String: p_dialog->title] withMsg: [NSString stringWithUTF8String: p_dialog->message]];
  85.     [o_error_panel showPanel];
  86. }
  87. -(void)showFatalWaitDialog: (NSValue *)o_value
  88. {
  89.     dialog_fatal_t *p_dialog = [o_value pointerValue];
  90.     NSAlert *o_alert;
  91.     o_alert = [NSAlert alertWithMessageText: [NSString stringWithUTF8String: p_dialog->title] defaultButton: _NS("OK") alternateButton: nil otherButton: nil informativeTextWithFormat: [NSString stringWithUTF8String: p_dialog->message]];
  92.     [o_alert setAlertStyle: NSCriticalAlertStyle];
  93.     [o_alert runModal];
  94. }
  95. -(void)showQuestionDialog: (NSValue *)o_value
  96. {
  97.     dialog_question_t *p_dialog = [o_value pointerValue];
  98.     NSAlert *o_alert;
  99.     NSString *o_yes, *o_no, *o_cancel;
  100.     NSInteger i_returnValue = 0;
  101.     
  102.     if( p_dialog->yes != NULL )
  103.         o_yes = [NSString stringWithUTF8String: p_dialog->yes];
  104.     if( p_dialog->no != NULL )
  105.         o_no = [NSString stringWithUTF8String: p_dialog->no];
  106.     if( p_dialog->cancel != NULL )
  107.         o_cancel = [NSString stringWithUTF8String: p_dialog->cancel];
  108.     o_alert = [NSAlert alertWithMessageText: [NSString stringWithUTF8String: p_dialog->title] defaultButton: o_yes alternateButton:o_no otherButton: o_cancel informativeTextWithFormat: [NSString stringWithUTF8String: p_dialog->message]];
  109.     [o_alert setAlertStyle: NSInformationalAlertStyle];
  110.     i_returnValue = [o_alert runModal];
  111.     if( i_returnValue == NSAlertDefaultReturn )
  112.         p_dialog->answer = 1;
  113.     if( i_returnValue == NSAlertAlternateReturn )
  114.         p_dialog->answer = 2;
  115.     if( i_returnValue == NSAlertOtherReturn )
  116.         p_dialog->answer = 3;
  117. }
  118. -(void)showLoginDialog: (NSValue *)o_value
  119. {
  120.     dialog_login_t *p_dialog = [o_value pointerValue];
  121.     NSInteger i_returnValue = 0;
  122.     [o_auth_title_txt setStringValue: [NSString stringWithUTF8String: p_dialog->title]];
  123.     [o_auth_win setTitle: [NSString stringWithUTF8String: p_dialog->title]];
  124.     [o_auth_description_txt setStringValue: [NSString stringWithUTF8String: p_dialog->message]];
  125.     [o_auth_login_fld setStringValue: @""];
  126.     [o_auth_pw_fld setStringValue: @""];
  127.     [o_auth_win center];
  128.     i_returnValue = [NSApp runModalForWindow: o_auth_win];
  129.     [o_auth_win close];
  130.     if( i_returnValue )
  131.     {
  132.         *p_dialog->username = strdup( [[o_auth_login_fld stringValue] UTF8String] );
  133.         *p_dialog->password = strdup( [[o_auth_pw_fld stringValue] UTF8String] );
  134.     }
  135.     else
  136.     {
  137.          *p_dialog->username = *p_dialog->password = NULL;
  138.     }
  139. }
  140. -(IBAction)loginDialogAction:(id)sender
  141. {
  142.     if( [[sender title] isEqualToString: _NS("OK")] )
  143.         [NSApp stopModalWithCode: 1];
  144.     else
  145.         [NSApp stopModalWithCode: 0];
  146. }
  147. -(void)showProgressDialog: (NSValue *)o_value
  148. {
  149.     dialog_progress_bar_t *p_dialog = [o_value pointerValue];
  150.     if( p_dialog->title != NULL )
  151.     {
  152.         [o_prog_win setTitle: [NSString stringWithUTF8String: p_dialog->title]];
  153.         [o_prog_title_txt setStringValue: [NSString stringWithUTF8String: p_dialog->title]];
  154.     }
  155.     else
  156.     {
  157.         [o_prog_win setTitle: @""];
  158.         [o_prog_title_txt setStringValue: @""];
  159.     }
  160.     if( p_dialog->cancel != NULL )
  161.         [o_prog_cancel_btn setTitle: [NSString stringWithUTF8String: p_dialog->cancel]];
  162.     else
  163.         [o_prog_cancel_btn setTitle: _NS("Cancel")];
  164.     if( p_dialog->message != NULL )
  165.         [o_prog_description_txt setStringValue: [NSString stringWithUTF8String: p_dialog->message]];
  166.     else
  167.         [o_prog_description_txt setStringValue: @""];
  168.     [o_prog_bar setDoubleValue: 0];
  169.     [o_prog_bar startAnimation: self];
  170.     [o_prog_win makeKeyAndOrderFront: self];
  171. }
  172. -(void)updateProgressPanelWithText: (NSString *)string andNumber: (double)d_number
  173. {
  174.     [o_prog_description_txt setStringValue: string];
  175.     [o_prog_bar setDoubleValue: d_number];
  176. }
  177. -(void)destroyProgressPanel
  178. {
  179.     [o_prog_bar stopAnimation: self];
  180.     [o_prog_win close];
  181. }
  182. -(IBAction)progDialogAction:(id)sender
  183. {
  184.     b_progress_cancelled = YES;
  185. }
  186. -(BOOL)progressCancelled
  187. {
  188.     return b_progress_cancelled;
  189. }
  190. -(id)errorPanel
  191. {
  192.     return o_error_panel;
  193. }
  194. -(void)dealloc
  195. {
  196.     [[NSNotificationCenter defaultCenter] removeObserver:self];
  197.     [super dealloc];
  198. }
  199. @end
  200. /*****************************************************************************
  201.  * VLCErrorPanel implementation
  202.  *****************************************************************************/
  203. @implementation VLCErrorPanel
  204. -(id)init
  205. {
  206.     [super init];
  207.     if( !b_nib_loaded )
  208.     {
  209.         b_nib_loaded = [NSBundle loadNibNamed:@"ErrorPanel" owner:self];
  210.     
  211.         /* init strings */
  212.         [o_window setTitle: _NS("Errors and Warnings")];
  213.         [o_cleanup_button setTitle: _NS("Clean up")];
  214.         [o_messages_btn setTitle: _NS("Show Details")];
  215.     }
  216.     /* init data sources */
  217.     o_errors = [[NSMutableArray alloc] init];
  218.     o_icons = [[NSMutableArray alloc] init];
  219.     return self;
  220. }
  221. -(void)dealloc
  222. {
  223.     [o_errors release];
  224.     [o_icons release];
  225.     [super dealloc];
  226. }
  227. -(void)showPanel
  228. {
  229.     [o_window makeKeyAndOrderFront: self];
  230. }
  231. -(void)addError: (NSString *)o_error withMsg:(NSString *)o_msg
  232. {
  233.     /* format our string as desired */
  234.     NSMutableAttributedString * ourError;
  235.     ourError = [[NSMutableAttributedString alloc] initWithString:
  236.         [NSString stringWithFormat:@"%@n%@", o_error, o_msg]
  237.         attributes:
  238.         [NSDictionary dictionaryWithObject: [NSFont systemFontOfSize:11] forKey: NSFontAttributeName]];
  239.     [ourError
  240.         addAttribute: NSFontAttributeName
  241.         value: [NSFont boldSystemFontOfSize:11]
  242.         range: NSMakeRange( 0, [o_error length])];
  243.     [o_errors addObject: ourError];
  244.     [ourError release];
  245.     [o_icons addObject: [NSImage imageWithErrorIcon]];
  246.     [o_error_table reloadData];
  247. }
  248. -(IBAction)cleanupTable:(id)sender
  249. {
  250.     [o_errors removeAllObjects];
  251.     [o_icons removeAllObjects];
  252.     [o_error_table reloadData];
  253. }
  254. -(IBAction)showMessages:(id)sender
  255. {
  256.     [[VLCMain sharedInstance] showMessagesPanel: sender];
  257. }
  258. /*----------------------------------------------------------------------------
  259.  * data source methods
  260.  *---------------------------------------------------------------------------*/
  261. - (NSInteger)numberOfRowsInTableView:(NSTableView *)theDataTable
  262. {
  263.     return [o_errors count];
  264. }
  265. - (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn:
  266.     (NSTableColumn *)theTableColumn row: (NSInteger)row
  267. {
  268.     if( [[theTableColumn identifier] isEqualToString: @"error_msg"] )
  269.         return [o_errors objectAtIndex: row];
  270.     if( [[theTableColumn identifier] isEqualToString: @"icon"] )
  271.         return [o_icons objectAtIndex: row];
  272.     return @"unknown identifier";
  273. }
  274. @end