about.m 6.27 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/*****************************************************************************
 * about.m: MacOS X About Panel
 *****************************************************************************
 * Copyright (C) 2001-2003 VideoLAN
 * $Id: about.m,v 1.1 2003/04/09 20:53:28 hartman Exp $
 *
 * Authors: Derk-Jan Hartman <thedj@users.sourceforge.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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include "intf.h"
#include "about.h"

/*****************************************************************************
 * VLAboutBox implementation 
 *****************************************************************************/
@implementation VLAboutBox

static VLAboutBox *_o_sharedInstance = nil;

+ (VLAboutBox *)sharedInstance
{
    return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
}

- (id)init 
{
    if (_o_sharedInstance) {
        [self dealloc];
    } else {
        _o_sharedInstance = [super init];
    }
    
    return _o_sharedInstance;
}

- (IBAction)showPanel:(id)sender
{    
    if (!o_credits_path)
    {
        NSString *o_name;
        NSString *o_version;
    
        // Get the info dictionary (Info.plist)
        o_info_dict = [[NSBundle mainBundle] infoDictionary];
        
        // Get the localized info dictionary (InfoPlist.strings)
        localInfoBundle = CFBundleGetMainBundle();
        o_local_dict = (NSDictionary *)
                        CFBundleGetLocalInfoDictionary( localInfoBundle );
        
        // Setup the app name field
        o_name = [o_local_dict objectForKey:@"CFBundleName"];
        
        // Set the about box window title
        [o_about_window setTitle:_NS("About VLC media player")];
        
        // Setup the version field
        o_version = [o_info_dict objectForKey:@"CFBundleVersion"];
    
        // Setup the appnameversion field
        o_name_version = [NSString stringWithFormat:@"%@ - Version %@", o_name, o_version];
        [o_name_version_field setStringValue: o_name_version];
        
        // Setup our credits
        o_credits_path = [[NSBundle mainBundle] pathForResource:@"AUTHORS" ofType:nil];
        o_credits = [NSString stringWithContentsOfFile: o_credits_path ];
        
        // Parse the string
        NSMutableString *o_outString = [NSMutableString string];
        NSScanner *o_scan_credits = [NSScanner scannerWithString: o_credits];
        NSCharacterSet *o_stopSet = [NSCharacterSet characterSetWithCharactersInString:@"\n\r"];
        
        while( ![o_scan_credits isAtEnd] )
        {
            NSString *o_person;
            NSScanner *o_scan_person;
            
            [o_scan_credits scanUpToString:@"N:" intoString: nil];
            [o_scan_credits scanString:@"N:" intoString: nil];
            [o_scan_credits scanUpToString:@"N:" intoString: &o_person];
            o_scan_person = [NSScanner scannerWithString: o_person];
            
            NSString *o_name;
            NSString *o_email;
            NSMutableString *o_jobs = [NSMutableString string];
            NSString *o_next;

            [o_scan_person scanUpToCharactersFromSet: o_stopSet intoString: &o_name];
            [o_scan_person scanString:@"E:" intoString: nil];
            [o_scan_person scanUpToCharactersFromSet: o_stopSet intoString: &o_email];
            [o_scan_person scanUpToString:@"D:" intoString: &o_next];
            [o_scan_person scanUpToString:@":" intoString: &o_next];
            [o_scan_person scanString:@":" intoString: nil];
    
            while ( [o_next characterAtIndex:[o_next length] - 1] == 'D' )
            {
                NSString *o_job;
                [o_scan_person scanUpToCharactersFromSet: o_stopSet intoString: &o_job ];
                [o_jobs appendFormat: @"%@, ", o_job];
                [o_scan_person scanUpToString:@":" intoString: &o_next];
                [o_scan_person scanString:@":" intoString: nil];
            }
            
            [o_outString appendFormat: @"%@ <%@>\n%@\n\n", o_name, o_email, o_jobs];
            [o_credits_textview setString:o_outString];
        }
        
        // Setup the copyright field
        o_copyright = [o_local_dict objectForKey:@"NSHumanReadableCopyright"];
        [o_copyright_field setStringValue:o_copyright];

        // Setup the window
        [o_credits_textview setDrawsBackground: NO];
        [o_credits_scrollview setDrawsBackground: NO];
        [o_about_window setExcludedFromWindowsMenu:YES];
        [o_about_window setMenu:nil];
        [o_about_window center];
    }
    
    // Show the window
    b_restart = YES;
    [o_about_window makeKeyAndOrderFront:nil];
}

- (void)windowDidBecomeKey:(NSNotification *)notification
{
    o_scroll_timer = [NSTimer scheduledTimerWithTimeInterval:1/6
                           target:self 
                           selector:@selector(scrollCredits:) 
                           userInfo:nil 
                           repeats:YES];
}

- (void)windowDidResignKey:(NSNotification *)notification
{
    [o_scroll_timer invalidate];
}

- (void)scrollCredits:(NSTimer *)timer
{
    if (b_restart)
    {
        // Reset the startTime
        i_start = [NSDate timeIntervalSinceReferenceDate] + 3.0;
        f_current = 0;
        b_restart = NO;
    }

    if ([NSDate timeIntervalSinceReferenceDate] >= i_start)
    {
        // Scroll to the position
        [o_credits_textview scrollPoint:NSMakePoint( 0, f_current )];
        
        // Increment the scroll position
        f_current += 0.005;
    }
}

@end