]> git.sesse.net Git - vlc/blob - modules/gui/macosx/wizard.m
Also update the wizard playlist on item addition and deletion. This prevent VLC to...
[vlc] / modules / gui / macosx / wizard.m
1 /*****************************************************************************
2  * wizard.m: MacOS X Streaming Wizard
3  *****************************************************************************
4  * Copyright (C) 2005 the VideoLAN team
5  * $Id$
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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24
25 /*****************************************************************************
26  * Note: this code is partially based upon ../wxwindows/wizard.cpp and
27  *         ../wxwindows/streamdata.h; both written by Clément Stenac.
28  *****************************************************************************/
29
30 /* TODO:
31     - fill the playlist-table on t2
32     - see FIXME's
33 */
34
35
36 /*****************************************************************************
37  * Preamble
38  *****************************************************************************/
39 #import "wizard.h"
40 #import "intf.h"
41 #import "network.h"
42 #import "playlist.h"
43
44 /*****************************************************************************
45  * VLCWizard implementation
46  *****************************************************************************/
47
48 @implementation VLCWizard
49
50 static VLCWizard *_o_sharedInstance = nil;
51
52 + (VLCWizard *)sharedInstance
53 {
54     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
55 }
56
57 - (id)init
58 {
59     if (_o_sharedInstance) {
60         [self dealloc];
61     } else {
62         _o_sharedInstance = [super init];
63     }
64
65     return _o_sharedInstance;
66 }
67
68 - (void)dealloc
69 {
70     [o_userSelections release];
71     [o_videoCodecs release];
72     [o_audioCodecs release];
73     [o_encapFormats release];
74     [super dealloc];
75 }
76
77 - (void)awakeFromNib
78 {
79     /* some minor cleanup */
80     [o_t2_tbl_plst setEnabled:NO];
81     [o_wizardhelp_window setExcludedFromWindowsMenu:YES];
82     o_userSelections = [[NSMutableDictionary alloc] init];
83     [o_btn_backward setEnabled:NO];
84
85     /* add audio-bitrates for transcoding */
86     NSArray * audioBitratesArray;
87     audioBitratesArray = [NSArray arrayWithObjects: @"512", @"256", @"192", \
88         @"128", @"64", @"32", @"16", nil ];
89     [o_t4_pop_audioBitrate removeAllItems];
90     [o_t4_pop_audioBitrate addItemsWithTitles: audioBitratesArray];
91     [o_t4_pop_audioBitrate selectItemWithTitle: @"192"];
92
93     /* add video-bitrates for transcoding */
94     NSArray * videoBitratesArray;
95     videoBitratesArray = [NSArray arrayWithObjects: @"3072", @"2048", @"1024", \
96         @"768", @"512", @"256", @"192", @"128", @"64", @"32", @"16", nil ];
97     [o_t4_pop_videoBitrate removeAllItems];
98     [o_t4_pop_videoBitrate addItemsWithTitles: videoBitratesArray];
99     [o_t4_pop_videoBitrate selectItemWithTitle: @"1024"];
100
101     /* fill 2 global arrays with arrays containing all codec-related information
102      * - one array per codec named by its short name to define the encap-compability,
103      *     cmd-names, real names, more info in the order: realName, shortName,
104      *     moreInfo, encaps */
105     NSArray * o_mp1v;
106     NSArray * o_mp2v;
107     NSArray * o_mp4v;
108     NSArray * o_div1;
109     NSArray * o_div2;
110     NSArray * o_div3;
111     NSArray * o_h263;
112     NSArray * o_h264;
113     NSArray * o_wmv1;
114     NSArray * o_wmv2;
115     NSArray * o_mjpg;
116     NSArray * o_theo;
117     NSArray * o_dummyVid;
118     o_mp1v = [NSArray arrayWithObjects: @"MPEG-1 Video", @"mp1v", \
119         _NS("MPEG-1 Video codec (usable with MPEG PS, MPEG TS, MPEG1, OGG " \
120         "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_OGG", @"MUX_RAW", \
121         @"NO", @"NO", @"NO", @"NO", nil];
122     o_mp2v = [NSArray arrayWithObjects: @"MPEG-2 Video", @"mp2v", \
123         _NS("MPEG-2 Video codec (usable with MPEG PS, MPEG TS, MPEG1, OGG " \
124         "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_OGG", @"MUX_RAW", \
125         @"NO", @"NO", @"NO", @"NO", nil];
126     o_mp4v = [NSArray arrayWithObjects: @"MPEG-4 Video", @"mp4v", \
127         _NS("MPEG-4 Video codec (useable with MPEG PS, MPEG TS, MPEG1, ASF, " \
128         "MP4, OGG and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", \
129         @"MUX_MP4", @"MUX_OGG", @"MUX_RAW", @"NO", @"NO", nil];
130     o_div1 = [NSArray arrayWithObjects: @"DIVX 1", @"DIV1", \
131         _NS("DivX first version (useable with MPEG TS, MPEG1, ASF and OGG)"), \
132         @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"NO", @"NO", @"NO", \
133         @"NO", @"NO", nil];
134     o_div2 = [NSArray arrayWithObjects: @"DIVX 2", @"DIV2", \
135         _NS("DivX second version (useable with MPEG TS, MPEG1, ASF and OGG)"), \
136         @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"NO", @"NO", @"NO", \
137         @"NO", @"NO", nil];
138     o_div3 = [NSArray arrayWithObjects: @"DIVX 3", @"DIV3", \
139         _NS("DivX third version (useable with MPEG TS, MPEG1, ASF and OGG)"), \
140         @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"NO", @"NO", @"NO", \
141         @"NO", @"NO", nil];
142     o_h263 = [NSArray arrayWithObjects: @"H 263", @"H263", \
143         _NS("H263 is a video codec optimized for videoconference " \
144         "(low rates, useable with MPEG TS)"), @"MUX_TS", @"NO", @"NO", @"NO", \
145         @"NO", @"NO", @"NO", @"NO", @"NO", nil];
146     o_h264 = [NSArray arrayWithObjects: @"H 264", @"H264", \
147         _NS("H264 is a new video codec (useable with MPEG TS and MP4)"), \
148         @"MUX_TS", @"MUX_MP4", @"NO", @"NO", @"NO", @"NO", @"NO", @"NO", \
149         @"NO", nil];
150     o_wmv1 = [NSArray arrayWithObjects: @"WMV 1", @"WMV1", \
151         _NS("WMV (Windows Media Video) 1 (useable with MPEG TS, MPEG1, ASF and " \
152         "OGG)"), @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"NO", @"NO", \
153         @"NO", @"NO", @"NO", nil];
154     o_wmv2 = [NSArray arrayWithObjects: @"WMV 2", @"WMV2", \
155         _NS("WMV (Windows Media Video) 2 (useable with MPEG TS, MPEG1, ASF and " \
156         "OGG)"), @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", @"NO", @"NO", \
157         @"NO", @"NO", @"NO", nil];
158     o_mjpg = [NSArray arrayWithObjects: @"MJPEG", @"MJPG", \
159         _NS("MJPEG consists of a series of JPEG pictures (useable with MPEG TS," \
160         " MPEG1, ASF and OGG)"), @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", \
161         @"NO", @"NO", @"NO", @"NO", @"NO", nil];
162     o_theo = [NSArray arrayWithObjects: @"Theora", @"theo", \
163         _NS("Theora is a free general-purpose codec (useable with MPEG TS)"), \
164         @"MUX_TS", @"NO", @"NO", @"NO", @"NO", @"NO", @"NO", @"NO", @"NO", nil];
165     o_dummyVid = [NSArray arrayWithObjects: @"Dummy", @"dummy", \
166         _NS("Dummy codec (do not transcode, useable with all encapsulation " \
167         "formats)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_MP4", \
168         @"MUX_OGG", @"MUX_WAV", @"MUX_RAW", @"MUX_MOV", nil];
169     o_videoCodecs = [[NSArray alloc] initWithObjects: o_mp1v, o_mp2v, o_mp4v, \
170         o_div1, o_div2, o_div3, o_h263, o_h264, o_wmv1, o_wmv2, o_mjpg, o_theo, \
171         o_dummyVid, nil];
172     [o_t4_pop_videoCodec removeAllItems];
173     unsigned int x;
174     x = 0;
175     while (x != [o_videoCodecs count])
176     {
177         [o_t4_pop_videoCodec addItemWithTitle:[[o_videoCodecs objectAtIndex:x] \
178             objectAtIndex:0]];
179         x = (x + 1);
180     }
181
182     NSArray * o_mpga;
183     NSArray * o_mp3;
184     NSArray * o_mp4a;
185     NSArray * o_a52;
186     NSArray * o_vorb;
187     NSArray * o_flac;
188     NSArray * o_spx;
189     NSArray * o_s16l;
190     NSArray * o_fl32;
191     NSArray * o_dummyAud;
192     o_mpga = [NSArray arrayWithObjects: @"MPEG Audio", @"mpga", \
193         _NS("The standard MPEG audio (1/2) format (useable with MPEG PS, MPEG TS, " \
194         "MPEG1, ASF, OGG and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", \
195         @"MUX_ASF", @"MUX_OGG", @"MUX_RAW", @"-1", @"-1", @"-1", nil];
196     o_mp3 = [NSArray arrayWithObjects: @"MP3", @"mp3", \
197         _NS("MPEG Audio Layer 3 (useable with MPEG PS, MPEG TS, MPEG1, ASF, OGG " \
198         "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", \
199         @"MUX_RAW", @"-1", @"-1", @"-1", nil];
200     o_mp4a = [NSArray arrayWithObjects: @"MPEG 4 Audio", @"mp4a", \
201         _NS("Audio format for MPEG4 (useable with MPEG TS and MPEG4)"), @"MUX_TS", \
202         @"MUX_MP4", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil];
203     o_a52 = [NSArray arrayWithObjects: @"A/52", @"a52", 
204         _NS("DVD audio format (useable with MPEG PS, MPEG TS, MPEG1, ASF, OGG " \
205         "and RAW)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_OGG", \
206         @"MUX_RAW", @"-1", @"-1", @"-1", nil];
207     o_vorb = [NSArray arrayWithObjects: @"Vorbis", @"vorb", \
208         _NS("Vorbis is a free audio codec (useable with OGG)"), @"MUX_OGG", \
209         @"-1",  @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil];
210     o_flac = [NSArray arrayWithObjects: @"FLAC", @"flac", \
211         _NS("FLAC is a lossless audio codec (useable with OGG and RAW)"), \
212         @"MUX_OGG", @"MUX_RAW", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", \
213         @"-1", nil];
214     o_spx = [NSArray arrayWithObjects: @"Speex", @"spx", \
215         _NS("A free audio codec dedicated to compression of voice (useable " \
216         "with OGG"), @"MUX_OGG", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", \
217         @"-1", @"-1", nil];
218     o_s16l = [NSArray arrayWithObjects: @"Uncompressed, integer", @"s16l", \
219         _NS("Uncompressed audio samples (useable with WAV)"), @"MUX_WAV", \
220         @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil];
221     o_fl32 = [NSArray arrayWithObjects: @"Uncompressed, floating", @"fl32", \
222         _NS("Uncompressed audio samples (useable with WAV)"), @"MUX_WAV", \
223         @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", @"-1", nil];
224     o_dummyAud = [NSArray arrayWithObjects: @"Dummy", @"dummy", \
225         _NS("Dummy codec (do not transcode, useable with all encapsulation " \
226         "formats)"), @"MUX_PS", @"MUX_TS", @"MUX_MPEG", @"MUX_ASF", @"MUX_MP4", \
227         @"MUX_OGG", @"MUX_RAW", @"MUX_MOV", @"MUX_WAV", nil];
228     o_audioCodecs = [[NSArray alloc] initWithObjects: o_mpga, o_mp3, o_mp4a, \
229         o_a52, o_vorb, o_flac, o_spx, o_s16l, o_fl32, o_dummyAud, nil];
230     [o_t4_pop_audioCodec removeAllItems];
231     x = 0;
232     while (x != [o_audioCodecs count])
233     {
234         [o_t4_pop_audioCodec addItemWithTitle:[[o_audioCodecs objectAtIndex:x] objectAtIndex:0]];
235         x = (x + 1);
236     }
237
238
239     /* fill another global array with all information about the encap-formats
240      * note that the order of the formats inside the g. array is the same as on
241      * the encap-tab */
242     NSArray * o_ps;
243     NSArray * o_ts;
244     NSArray * o_mpeg;
245     NSArray * o_ogg;
246     NSArray * o_raw;
247     NSArray * o_asf;
248     NSArray * o_avi;
249     NSArray * o_mp4;
250     NSArray * o_mov;
251     NSArray * o_wav;
252     o_ps = [NSArray arrayWithObjects: @"ps", @"MPEG PS", \
253         _NS("MPEG Program Stream"), nil];
254     o_ts = [NSArray arrayWithObjects: @"ts", @"MPEG TS", \
255         _NS("MPEG Transport Stream"), nil];
256     o_mpeg = [NSArray arrayWithObjects: @"ps", @"MPEG 1", \
257         _NS("MPEG 1 Format"), nil];
258     o_ogg = [NSArray arrayWithObjects: @"ogg", @"OGG", @"OGG", nil];
259     o_raw = [NSArray arrayWithObjects: @"raw", @"RAW", @"RAW", nil];
260     o_asf = [NSArray arrayWithObjects: @"asf", @"ASF", @"ASF", nil];
261     o_avi = [NSArray arrayWithObjects: @"avi", @"AVI", @"AVI", nil];
262     o_mp4 = [NSArray arrayWithObjects: @"mp4", @"MP4", @"MPEG4", nil];
263     o_mov = [NSArray arrayWithObjects: @"mov", @"MOV", @"MOV", nil];
264     o_wav = [NSArray arrayWithObjects: @"wav", @"WAV", @"WAV", nil];
265     o_encapFormats = [[NSArray alloc] initWithObjects: o_ps, o_ts, o_mpeg, \
266         o_ogg, o_raw, o_asf, o_avi, o_mp4, o_mov, o_wav, nil];
267
268     /* yet another array on streaming methods including help texts */
269     NSArray * o_http;
270     NSArray * o_udp_uni;
271     NSArray * o_udp_multi;
272     o_http = [NSArray arrayWithObjects: @"http", @"HTTP", _NS("Enter the local " \
273         "addresses you want to listen to. Do not enter anything if you want to " \
274         "listen to all adresses or if you don't understand. This is generally " \
275         "the best thing to do. Other computers can then access the stream at " \
276         "http://yourip:8080 by default.") , _NS("Use this to stream to several " \
277         "computers. This method is less efficient, as the server needs to send " \
278         "the stream several times."), nil];
279     o_udp_multi = [NSArray arrayWithObjects: @"udp", @"UDP-Multicast", _NS("Enter " \
280         "the multicast address to stream to in this field. This must be an IP " \
281         "address between 224.0.0.0 and 239.255.255.255. For a private use, " \
282         "enter an address beginning with 239.255."), _NS("Use this to stream " \
283         "to a dynamic group of computers on a multicast-enabled network. This " \
284         "is the most efficient method to stream to several computers, but it " \
285         "does not work over Internet."), nil];
286     o_udp_uni = [NSArray arrayWithObjects: @"udp", @"UDP-Unicast", _NS("Enter " \
287         "the address of the computer to stream to."), _NS("Use this to stream " \
288         "to a single computer."), nil];
289     o_strmgMthds = [[NSArray alloc] initWithObjects: o_http, o_udp_multi, o_udp_uni, nil];
290 }
291
292 - (void)showWizard
293 {
294     /* just present the window to the user */
295     [o_tab_pageHolder selectFirstTabViewItem:self];
296
297     [self resetWizard];
298
299     [o_wizard_window center];
300     [o_wizard_window displayIfNeeded];
301     [o_wizard_window makeKeyAndOrderFront:nil];
302 }
303
304 - (void)resetWizard
305 {
306     /* reset the wizard-window to its default values */
307
308     [o_userSelections removeAllObjects];
309     [o_t1_matrix_strmgOrTrnscd selectCellAtRow:0 column:0];
310     [[o_t1_matrix_strmgOrTrnscd cellAtRow:1 column:0] setState: NSOffState];
311     [o_btn_forward setTitle: _NS("Next")];
312
313     /* "Input" */
314     [o_t2_fld_pathToNewStrm setStringValue: @""];
315     [o_t2_ckb_enblPartExtrct setState: NSOffState];
316     [self t2_enableExtract:nil];
317     [o_t2_matrix_inputSourceType selectCellAtRow:0 column:0];
318     [[o_t2_matrix_inputSourceType cellAtRow:1 column:0] setState: NSOffState];
319     [o_t2_fld_pathToNewStrm setEnabled:YES];
320     [o_t2_btn_chooseFile setEnabled:YES];
321     [o_t2_tbl_plst setEnabled:NO];
322
323     /* "Streaming 1" */
324     [o_t3_fld_address setStringValue: @""];
325     [o_t3_matrix_stmgMhd selectCellAtRow:0 column:0];
326     [[o_t3_matrix_stmgMhd cellAtRow:1 column:1] setState: NSOffState];
327     [[o_t3_matrix_stmgMhd cellAtRow:1 column:2] setState: NSOffState];
328
329     /* "Transcode 1" */
330     [o_t4_ckb_audio setState: NSOffState];
331     [o_t4_ckb_video setState: NSOffState];
332     [self t4_enblVidTrnscd:nil];
333     [self t4_enblAudTrnscd:nil];
334
335     /* "Streaming 2" */
336     [o_t6_fld_ttl setStringValue: @"1"];
337     [o_t6_ckb_sap setState: NSOffState];
338     [self t6_enblSapAnnce:nil];
339
340     /* "Transcode 2" */
341     [o_t7_fld_filePath setStringValue: @""];
342 }
343
344 - (void)initStrings
345 {
346     /* localise all strings to the users lang */
347     /* method is called from intf.m (in method openWizard) */
348
349     /* general items */
350     [o_btn_backward setTitle: _NS("Back")];
351     [o_btn_cancel setTitle: _NS("Cancel")];
352     [o_btn_forward setTitle: _NS("Next")];
353     [o_wizard_window setTitle: _NS("Streaming/Transcoding Wizard")];
354
355     /* page one ("Hello") */
356     [o_t1_txt_title setStringValue: _NS("Streaming/Transcoding Wizard")];
357     [o_t1_txt_text setStringValue: _NS("This wizard helps you to stream, " \
358         "transcode or save a stream.")];
359     [o_t1_btn_mrInfo_strmg setTitle: _NS("More Info")];
360     [o_t1_btn_mrInfo_trnscd setTitle: _NS("More Info")];
361     [o_t1_txt_notice setStringValue: _NS("This wizard only gives access to " \
362         "a small subset of VLC's streaming and transcoding capabilities. " \
363         "Use the Open and Stream Output dialogs to get all of them.")];
364     [[o_t1_matrix_strmgOrTrnscd cellAtRow:0 column:0] setTitle: _NS("Stream " \
365         "to network")];
366     [[o_t1_matrix_strmgOrTrnscd cellAtRow:1 column:0] setTitle: _NS("" \
367         "Transcode/Save to file")];
368
369     /* page two ("Input") */
370     [o_t2_title setStringValue: _NS("Choose input")];
371     [o_t2_text setStringValue: _NS("Choose here your input stream.")];
372     [[o_t2_matrix_inputSourceType cellAtRow:0 column:0] setTitle:  \
373         _NS("Select a stream")];
374     [[o_t2_matrix_inputSourceType cellAtRow:1 column:0] setTitle: \
375         _NS("Existing playlist item")];
376     [o_t2_btn_chooseFile setTitle: _NS("Choose...")];
377     [[[o_t2_tbl_plst tableColumnWithIdentifier:@"1"] headerCell] \
378         setStringValue: _NS("Title")];
379     [[[o_t2_tbl_plst tableColumnWithIdentifier:@"2"] headerCell] \
380         setStringValue: _NS("Author")];
381     [o_t2_box_prtExtrct setTitle: _NS("Partial Extract")];
382     [o_t2_ckb_enblPartExtrct setTitle: _NS("Enable")];
383     [o_t2_ckb_enblPartExtrct setToolTip: _NS("Use this to read only a part of " \
384         "the stream. You must be able to control the incoming stream " \
385         "(for example, a file or a disc, but not an UDP network stream.)\n" \
386         "Enter the starting and ending times (in seconds).")];
387     [o_t2_txt_prtExtrctFrom setStringValue: _NS("From")];
388     [o_t2_txt_prtExtrctTo setStringValue: _NS("To")];
389
390     /* page three ("Streaming 1") */
391     [o_t3_txt_title setStringValue: _NS("Streaming")];
392     [o_t3_txt_text setStringValue: _NS("In this page, you will select how " \
393         "your input stream will be sent.")];
394     [o_t3_box_dest setTitle: _NS("Destination")];
395     [o_t3_box_strmgMthd setTitle: _NS("Streaming method")];
396     [o_t3_txt_destInfo setStringValue: _NS("Enter the address of the computer " \
397         "to stream to.")];
398     [[o_t3_matrix_stmgMhd cellAtRow:1 column:0] setTitle: _NS("UDP Unicast")];
399     [[o_t3_matrix_stmgMhd cellAtRow:1 column:1] setTitle: _NS("UDP Multicast")];
400     [o_t3_txt_strgMthdInfo setStringValue: _NS("Use this to stream to a single " \
401         "computer.")];
402
403     /* page four ("Transcode 1") */
404     [o_t4_title setStringValue: _NS("Transcode")];
405     [o_t4_text setStringValue: _NS("If you want to change the compression " \
406         "format of the audio or video tracks, fill in this page. (If you only " \
407         "want to change the container format, proceed to next page.)")];
408     [o_t4_box_audio setTitle: _NS("Audio")];
409     [o_t4_box_video setTitle: _NS("Video")];
410     [o_t4_ckb_audio setTitle: _NS("Transcode audio")];
411     [o_t4_ckb_video setTitle: _NS("Transcode video")];
412     [o_t4_txt_videoBitrate setStringValue: _NS("Bitrate (kb/s)")];
413     [o_t4_txt_videoCodec setStringValue: _NS("Codec")];
414     [o_t4_txt_hintAudio setStringValue: _NS("If your stream has audio and you " \
415         "want to transcode it, enable this.")];
416     [o_t4_txt_hintVideo setStringValue: _NS("If your stream has video and you " \
417         "want to transcode it, enable this.")];
418
419     /* page five ("Encap") */
420     [o_t5_title setStringValue: _NS("Encapsulation format")];
421     [o_t5_text setStringValue: _NS("In this page, you will select how the " \
422         "stream will be encapsulated. Depending on the choices you made, all " \
423                      "formats won't be available.")];
424
425     /* page six ("Streaming 2") */
426     [o_t6_title setStringValue: _NS("Additional streaming options")];
427     [o_t6_text setStringValue: _NS("In this page, you will define a few " \
428                               "additional parameters for your stream.")];
429     [o_t6_txt_ttl setStringValue: _NS("Time-To-Live (TTL)")];
430     [o_t6_btn_mrInfo_ttl setTitle: _NS("More Info")];
431     [o_t6_ckb_sap setTitle: _NS("SAP Announce")];
432     [o_t6_btn_mrInfo_sap setTitle: _NS("More Info")];
433
434     /* page seven ("Transcode 2") */
435     [o_t7_title setStringValue: _NS("Additional transcode options")];
436     [o_t7_text setStringValue: _NS("In this page, you will define a few " \
437                               "additionnal parameters for your transcoding.")];
438     [o_t7_txt_saveFileTo setStringValue: _NS("Select the file to save to")];
439     [o_t7_btn_chooseFile setTitle: _NS("Choose...")];
440
441     /* page eight ("Summary") */
442     [o_t8_txt_text setStringValue: _NS("This page lists all your selections. " \
443         "Click \"Finish\" to start your streaming or transcoding.")];
444     [o_t8_txt_title setStringValue: _NS("Summary")];
445     [o_t8_txt_destination setStringValue: [_NS("Destination") \
446         stringByAppendingString: @":"]];
447     [o_t8_txt_encapFormat setStringValue: [_NS("Encap. format") \
448         stringByAppendingString: @":"]];
449     [o_t8_txt_inputStream setStringValue: [_NS("Input stream") \
450         stringByAppendingString: @":"]];
451     [o_t8_txt_partExtract setStringValue: [_NS("Partial Extract") \
452         stringByAppendingString: @":"]];
453     [o_t8_txt_sap setStringValue: [_NS("SAP Announce") \
454         stringByAppendingString: @":"]];
455     [o_t8_txt_saveFileTo setStringValue: [_NS("Save file to") \
456         stringByAppendingString: @":"]];
457     [o_t8_txt_strmgMthd setStringValue: [_NS("Streaming method") \
458         stringByAppendingString: @":"]];
459     [o_t8_txt_trnscdAudio setStringValue: [_NS("Transcode audio") \
460         stringByAppendingString: @":"]];
461     [o_t8_txt_trnscdVideo setStringValue: [_NS("Transcode video") \
462         stringByAppendingString: @":"]];
463
464     /* wizard help window */
465     [o_wh_btn_okay setTitle: _NS("OK")];
466 }
467
468 - (IBAction)cancelRun:(id)sender
469 {
470     [o_wizard_window close];
471 }
472
473 - (id)getPlaylistWizard
474 {
475     return o_playlist_wizard;
476 }
477
478 - (IBAction)nextTab:(id)sender
479 {
480     if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: @"Hello"])
481     {
482         /* check whether the user wants to stream or just to transcode;
483          * store information for later usage */
484         NSString *o_mode;
485         o_mode = [[o_t1_matrix_strmgOrTrnscd selectedCell] title];
486         if( [o_mode isEqualToString: _NS("Stream to network")] )
487         {
488             [o_userSelections setObject:@"strmg" forKey:@"trnscdOrStrmg"];
489         }else{
490             [o_userSelections setObject:@"trnscd" forKey:@"trnscdOrStrmg"];
491         }
492         [o_btn_backward setEnabled:YES];
493         [o_tab_pageHolder selectTabViewItemAtIndex:1];
494
495         /* Fill the playlist with current playlist items */
496         [o_playlist_wizard reloadOutlineView];
497
498     }
499     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: @"Input"])
500     {
501         /* check whether partialExtract is enabled and store the values, if needed */
502         if ([o_t2_ckb_enblPartExtrct state] == NSOnState)
503         {
504             [o_userSelections setObject:@"YES" forKey:@"partExtract"];
505             [o_userSelections setObject:[o_t2_fld_prtExtrctFrom stringValue] \
506                 forKey:@"partExtractFrom"];
507             [o_userSelections setObject:[o_t2_fld_prtExtrctTo stringValue] \
508                 forKey:@"partExtractTo"];
509         }else{
510             [o_userSelections setObject:@"NO" forKey:@"partExtract"];
511         }
512
513         /* check whether we use an existing pl-item or add an new one;
514          * store the path or the index and set a flag.
515          * complain to the user if s/he didn't provide a path */
516         NSString *o_mode;
517         BOOL stop;
518         stop = NO;
519         o_mode = [[o_t2_matrix_inputSourceType selectedCell] title];
520         if( [o_mode isEqualToString: _NS("Select a stream")] )
521         {
522             [o_userSelections setObject:@"YES" forKey:@"newStrm"];
523             if ([[o_t2_fld_pathToNewStrm stringValue] isEqualToString: @""])
524             {
525                 /* set a flag that no file is selected */
526                 stop = YES;
527             }
528             else
529             {
530                 [o_userSelections setObject:[o_t2_fld_pathToNewStrm stringValue] \
531                     forKey:@"pathToStrm"];
532             }
533         }
534         else
535         {
536             if ([o_t2_tbl_plst selectedRow] != -1)
537             {
538                 playlist_item_t *p_item =
539                                     [o_playlist_wizard selectedPlaylistItem];
540                 if( p_item->i_children <= 0 )
541                 {
542                     [o_userSelections setObject: [NSString stringWithFormat:
543                         @"%s", p_item->input.psz_uri] forKey:@"pathToStrm"];
544                 }
545                 else
546                 stop = YES;
547             } else {
548                 /* set a flag that no item is selected */
549                 stop = YES;
550             }
551         }
552
553         /* show either "Streaming 1" or "Transcode 1" to the user */
554         if (stop == NO)
555         {
556             if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] \
557                 isEqualToString:@"strmg"])
558             {
559                 /* we are streaming */
560                 [o_tab_pageHolder selectTabViewItemAtIndex:2];
561             }else{
562                 /* we are just transcoding */
563                 [o_tab_pageHolder selectTabViewItemAtIndex:3];
564             }
565         } else {
566             /* show a sheet that the user didn't select a file */
567             NSBeginInformationalAlertSheet(_NS("No input selected"), \
568                 _NS("OK"), @"", @"", o_wizard_window, nil, nil, nil, nil, \
569                 _NS("You selected neither a new stream nor a valid playlist " \
570                 "item. VLC is unable to guess, which input you want use. "\
571                 "\n\n Choose one before going to the next page."));
572         }
573     }
574     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
575         @"Streaming 1"])
576     {
577         /* check which streaming method is selected and store it */
578         NSString *o_mode;
579         o_mode = [[o_t3_matrix_stmgMhd selectedCell] title];
580         if( [o_mode isEqualToString: @"HTTP"] )
581         {
582             [o_userSelections setObject:@"0" forKey:@"stmgMhd"];
583             /* enable MPEG PS, MPEG TS, MPEG 1, OGG, RAW and ASF; select MPEG PS */
584             [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:YES];
585             [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
586             [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:YES];
587             [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:YES];
588             [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:YES];
589             [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:YES];
590             [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:NO];
591             [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:NO];
592             [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:NO];
593             [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:NO];
594             [o_t5_matrix_encap selectCellAtRow:0 column:0];
595         } else {
596             if( [o_mode isEqualToString: _NS("UDP Unicast")] )
597             {
598                 [o_userSelections setObject:@"2" forKey:@"stmgMhd"];
599             } else {
600                 [o_userSelections setObject:@"1" forKey:@"stmgMhd"];
601             }
602             /* disable all encap-formats but MPEG-TS and select it */
603             [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:NO];
604             [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:NO];
605             [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:NO];
606             [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:NO];
607             [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:NO];
608             [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:NO];
609             [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:NO];
610             [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:NO];
611             [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:NO];
612             [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
613             [o_t5_matrix_encap selectCellAtRow:1 column:0];
614         }
615
616         /* store the destination and check whether is it empty */
617         if(! [o_mode isEqualToString: @"HTTP"] )
618         {
619             /* empty field is valid for HTTP */
620             if( [[o_t3_fld_address stringValue] isEqualToString: @""] )
621             {
622                 /* complain to the user that "" is no valid dest. */
623                 NSBeginInformationalAlertSheet(_NS("No valid destination"), \
624                     _NS("OK"), @"", @"", o_wizard_window, nil, nil, nil, nil, \
625                     _NS("You need to enter a valid destination you want to "\
626                     "stream to. Enter either a Unicast-IP or a Multicast-IP." \
627                     "\n\n If you don't know what this means, have a look at the " \
628                     "VLC Streaming HOWTO and the help texts in this window."));
629             } else {
630                 /* FIXME: check whether the entered IP is really valid */
631                 [o_userSelections setObject:[o_t3_fld_address stringValue] \
632                     forKey:@"stmgDest"];
633                 /* let's go to the encap-tab */
634                 [o_tab_pageHolder selectTabViewItemAtIndex:4];
635             }
636         } else {
637             [o_userSelections setObject:[o_t3_fld_address stringValue] \
638                 forKey:@"stmgDest"];
639             /* let's go to the encap-tab */
640             [o_tab_pageHolder selectTabViewItemAtIndex:4];
641         }
642     }
643     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
644         @"Transcode 1"])
645     {
646         /* check whether the user wants to transcode the video-track and store 
647          * the related options */
648         if ([o_t4_ckb_video state] == NSOnState)
649         {
650             NSNumber * theNum;
651             theNum = [NSNumber numberWithInt:[o_t4_pop_videoCodec indexOfSelectedItem]];
652             [o_userSelections setObject:@"YES" forKey:@"trnscdVideo"];
653             [o_userSelections setObject:[o_t4_pop_videoBitrate titleOfSelectedItem] \
654                 forKey:@"trnscdVideoBitrate"];
655             [o_userSelections setObject:theNum forKey:@"trnscdVideoCodec"];
656         } else {
657             [o_userSelections setObject:@"NO" forKey:@"trnscdVideo"];
658         }
659
660         /* check whether the user wants to transcode the audio-track and store 
661          * the related options */
662         if ([o_t4_ckb_audio state] == NSOnState)
663         {
664             NSNumber * theNum;
665             theNum = [NSNumber numberWithInt:[o_t4_pop_audioCodec indexOfSelectedItem]];
666             [o_userSelections setObject:@"YES" forKey:@"trnscdAudio"];
667             [o_userSelections setObject:[o_t4_pop_audioBitrate titleOfSelectedItem] \
668                 forKey:@"trnscdAudioBitrate"];
669             [o_userSelections setObject:theNum forKey:@"trnscdAudioCodec"];
670         } else {
671             [o_userSelections setObject:@"NO" forKey:@"trnscdAudio"];
672         }
673
674         /* disable all encap-formats */
675         [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:NO];
676         [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:NO];
677         [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:NO];
678         [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:NO];
679         [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:NO];
680         [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:NO];
681         [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:NO];
682         [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:NO];
683         [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:NO];
684         [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:NO];
685
686         /* re-enable the encap-formats supported by the chosen codecs */
687         /* FIXME: the following is a really bad coding-style. feel free to mail
688             me ideas how to make this nicer, if you want to -- FK, 7/11/05 */
689
690         if ([[o_userSelections objectForKey:@"trnscdAudio"] isEqualTo: @"YES"])
691         {
692             if ([[o_userSelections objectForKey:@"trnscdVideo"] isEqualTo: @"YES"])
693             {
694                 /* we are transcoding both audio and video, so we need to check both deps */
695                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
696                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_PS"])
697                 {
698                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections \
699                         objectForKey:@"trnscdAudioCodec"] intValue]] \
700                         containsObject: @"MUX_PS"])
701                     {
702                         [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:YES];
703                         [o_t5_matrix_encap selectCellAtRow:0 column:0];
704                     }
705                 }
706                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections \
707                     objectForKey:@"trnscdVideoCodec"] intValue]] containsObject: @"MUX_TS"])
708                 {
709                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
710                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_TS"])
711                     {
712                         [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
713                         [o_t5_matrix_encap selectCellAtRow:1 column:0];
714                     }
715                 }
716                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
717                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MPEG"])
718                 {
719                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
720                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MPEG"])
721                     {
722                         [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:YES];
723                         [o_t5_matrix_encap selectCellAtRow:2 column:0];
724                     }
725                 }
726                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
727                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_OGG"])
728                 {
729                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections \
730                         objectForKey:@"trnscdAudioCodec"] intValue]] containsObject: @"MUX_OGG"])
731                     {
732                         [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:YES];
733                         [o_t5_matrix_encap selectCellAtRow:3 column:0];
734                     }
735                 }
736                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
737                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_RAW"])
738                 {
739                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
740                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_RAW"])
741                     {
742                         [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:YES];
743                         [o_t5_matrix_encap selectCellAtRow:4 column:0];
744                     }
745                 }
746                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
747                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_ASF"])
748                 {
749                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
750                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_ASF"])
751                     {
752                         [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:YES];
753                         [o_t5_matrix_encap selectCellAtRow:5 column:0];
754                     }
755                 }
756                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
757                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_AVI"])
758                 {
759                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
760                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_AVI"])
761                     {
762                         [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:YES];
763                         [o_t5_matrix_encap selectCellAtRow:6 column:0];
764                     }
765                 }
766                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
767                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MP4"])
768                 {
769                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
770                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MP4"])
771                     {
772                         [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:YES];
773                         [o_t5_matrix_encap selectCellAtRow:7 column:0];
774                     }
775                 }
776                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
777                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MOV"])
778                 {
779                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
780                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MOV"])
781                     {
782                         [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:YES];
783                         [o_t5_matrix_encap selectCellAtRow:8 column:0];
784                     }
785                 }
786                 if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
787                     @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_WAV"])
788                 {
789                     if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
790                         @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_WAV"])
791                     {
792                         [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:YES];
793                         [o_t5_matrix_encap selectCellAtRow:9 column:0];
794                     }
795                 }
796
797             } else {
798
799                 /* we just transcoding the audio */
800
801                 /* select formats supported by the audio codec */
802                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
803                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_PS"])
804                 {
805                     [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:YES];
806                     [o_t5_matrix_encap selectCellAtRow:0 column:0];
807                 }
808                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
809                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_TS"])
810                 {
811                     [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
812                     [o_t5_matrix_encap selectCellAtRow:1 column:0];
813                 }
814                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
815                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MPEG"])
816                 {
817                     [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:YES];
818                     [o_t5_matrix_encap selectCellAtRow:2 column:0];
819                 }
820                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
821                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_OGG"])
822                 {
823                     [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:YES];
824                     [o_t5_matrix_encap selectCellAtRow:3 column:0];
825                 }
826                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
827                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_RAW"])
828                 {
829                     [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:YES];
830                     [o_t5_matrix_encap selectCellAtRow:4 column:0];
831                 }
832                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
833                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_ASF"])
834                 {
835                     [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:YES];
836                     [o_t5_matrix_encap selectCellAtRow:5 column:0];
837                 }
838                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
839                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_AVI"])
840                 {
841                     [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:YES];
842                     [o_t5_matrix_encap selectCellAtRow:6 column:0];
843                 }
844                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
845                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MP4"])
846                 {
847                     [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:YES];
848                     [o_t5_matrix_encap selectCellAtRow:7 column:0];
849                 }
850                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
851                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_MOV"])
852                 {
853                     [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:YES];
854                     [o_t5_matrix_encap selectCellAtRow:8 column:0];
855                 }
856                 if ([[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
857                     @"trnscdAudioCodec"] intValue]] containsObject: @"MUX_WAV"])
858                 {
859                     [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:YES];
860                     [o_t5_matrix_encap selectCellAtRow:9 column:0];
861                 }
862             }
863         }
864         else if ([[o_userSelections objectForKey:@"trnscdVideo"] isEqualTo: @"YES"])
865         {
866             /* we are just transcoding the video */
867
868             /* select formats supported by the video-codec */
869
870             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
871                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_PS"])
872             {
873                 [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:YES];
874                 [o_t5_matrix_encap selectCellAtRow:0 column:0];
875             }
876             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
877                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_TS"])
878             {
879                 [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
880                 [o_t5_matrix_encap selectCellAtRow:1 column:0];
881             }
882             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
883                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MPEG"])
884             {
885                 [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:YES];
886                 [o_t5_matrix_encap selectCellAtRow:2 column:0];
887             }
888             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
889                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_OGG"])
890             {
891                 [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:YES];
892                 [o_t5_matrix_encap selectCellAtRow:3 column:0];
893             }
894             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
895                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_RAW"])
896             {
897                 [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:YES];
898                 [o_t5_matrix_encap selectCellAtRow:4 column:0];
899             }
900             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
901                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_ASF"])
902             {
903                 [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:YES];
904                 [o_t5_matrix_encap selectCellAtRow:5 column:0];
905             }
906             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
907                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_AVI"])
908             {
909                 [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:YES];
910                 [o_t5_matrix_encap selectCellAtRow:6 column:0];
911             }
912             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
913                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MP4"])
914             {
915                 [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:YES];
916                 [o_t5_matrix_encap selectCellAtRow:7 column:0];
917             }
918             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
919                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_MOV"])
920             {
921                 [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:YES];
922                 [o_t5_matrix_encap selectCellAtRow:8 column:0];
923             }
924             if ([[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
925                 @"trnscdVideoCodec"] intValue]] containsObject: @"MUX_WAV"])
926             {
927                 [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:YES];
928                 [o_t5_matrix_encap selectCellAtRow:9 column:0];
929             }
930         } else {
931             /* we don't do any transcoding
932              * -> enabled the encap-formats allowed when streaming content via http
933              * since this should work fine in most cases */
934             /* FIXME: choose a selection of encap-formats based upon the 
935              * actually used codecs */
936
937             /* enable MPEG PS, MPEG TS, MPEG 1, OGG, RAW and ASF; select MPEG PS */
938             [[o_t5_matrix_encap cellAtRow:0 column:0] setEnabled:YES];
939             [[o_t5_matrix_encap cellAtRow:1 column:0] setEnabled:YES];
940             [[o_t5_matrix_encap cellAtRow:2 column:0] setEnabled:YES];
941             [[o_t5_matrix_encap cellAtRow:3 column:0] setEnabled:YES];
942             [[o_t5_matrix_encap cellAtRow:4 column:0] setEnabled:YES];
943             [[o_t5_matrix_encap cellAtRow:5 column:0] setEnabled:YES];
944             [[o_t5_matrix_encap cellAtRow:6 column:0] setEnabled:NO];
945             [[o_t5_matrix_encap cellAtRow:7 column:0] setEnabled:NO];
946             [[o_t5_matrix_encap cellAtRow:8 column:0] setEnabled:NO];
947             [[o_t5_matrix_encap cellAtRow:9 column:0] setEnabled:NO];
948             [o_t5_matrix_encap selectCellAtRow:0 column:0];
949         }
950         int x;
951         BOOL anythingEnabled;
952         x = 0;
953         anythingEnabled = NO;
954         while (x != [o_t5_matrix_encap numberOfRows])
955         {
956             if ([[o_t5_matrix_encap cellAtRow:x column:0] isEnabled])
957             {
958                 anythingEnabled = YES;
959             }
960             x = (x + 1);
961         }
962         if (anythingEnabled == YES)
963         {
964         [o_tab_pageHolder selectTabViewItemAtIndex:4];
965         } else {
966             /* show a sheet that the selected codecs are not compatible */
967             NSBeginInformationalAlertSheet(_NS("Invalid selection"), _NS("OK"), \
968                 @"", @"", o_wizard_window, nil, nil, nil, nil, _NS("Your " \
969                 "chosen codecs are not compatible with each other. For example: " \
970                 "you cannot mix uncompressed audio with any video codec.\n\n" \
971                 "Correct your selection and try again."));
972         }
973
974     }
975     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: @"Encap"])
976     {
977         /* get the chosen encap format and store it */
978         NSNumber * theNum;
979         theNum = [NSNumber numberWithInt:[[o_t5_matrix_encap selectedCell] tag]];
980         [o_userSelections setObject:[theNum stringValue] forKey:@"encapFormat"];
981
982         /* show either "Streaming 2" or "Transcode 2" to the user */
983         if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] isEqualToString:@"strmg"])
984         {
985             /* we are streaming */
986             [o_tab_pageHolder selectTabViewItemAtIndex:5];
987         }else{
988             /* we are just transcoding */
989             [o_tab_pageHolder selectTabViewItemAtIndex:6];
990         }
991     }
992     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
993         @"Streaming 2"])
994     {
995         /* store the chosen TTL */
996         [o_userSelections setObject:[o_t6_fld_ttl stringValue] forKey:@"ttl"];
997
998         /* check whether SAP is enabled and store the announce, if needed */
999         if ([o_t6_ckb_sap state] == NSOnState)
1000         {
1001             [o_userSelections setObject:@"YES" forKey:@"sap"];
1002             [o_userSelections setObject:[o_t6_fld_sap stringValue] forKey:@"sapText"];
1003         } else {
1004             [o_userSelections setObject:@"NO" forKey:@"sap"];
1005         }
1006
1007         /* go to "Summary" */
1008         [self showSummary];
1009     }
1010     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1011         @"Transcode 2"])
1012     {
1013         /* check whether the path != "" and store it */
1014         if( [[o_t7_fld_filePath stringValue] isEqualToString: @""] )
1015         {
1016             /* complain to the user that "" is no valid path */
1017             NSBeginInformationalAlertSheet(_NS("No file selected"), _NS("OK"), \
1018                 @"", @"", o_wizard_window, nil, nil, nil, nil, _NS("You you " \
1019                 "need to select a file, you want to save to. \n\n Enter either " \
1020                 "a valid path or choose a location through the button's " \
1021                 "dialog-box."));
1022         } else {
1023             [o_userSelections setObject:[o_t7_fld_filePath stringValue] forKey: \
1024                 @"trnscdFilePath"];
1025
1026             /* go to "Summary" */
1027             [self showSummary];
1028         }
1029     }
1030     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1031         @"Summary"])
1032     {
1033         intf_thread_t * p_intf = VLCIntf;
1034
1035         playlist_t * p_playlist = (playlist_t *)vlc_object_find( p_intf,
1036                             VLC_OBJECT_PLAYLIST, FIND_ANYWHERE);
1037         if( p_playlist )
1038         {
1039             playlist_item_t *p_item = playlist_ItemNew( p_playlist, [[o_userSelections \
1040                 objectForKey:@"pathToStrm"] UTF8String], _("Streaming/Transcoding Wizard") );
1041             playlist_ItemAddOption( p_item, [[o_userSelections objectForKey:@"opts"] UTF8String]);
1042
1043             if(! [[o_userSelections objectForKey:@"partExtractFrom"] isEqualToString:@""] )
1044             {
1045                 playlist_ItemAddOption( p_item, [[@"start-time=" \
1046                     stringByAppendingString: [o_userSelections \
1047                     objectForKey:@"partExtractFrom"]] UTF8String] );
1048             }
1049
1050             if(! [[o_userSelections objectForKey:@"partExtractTo"] isEqualToString:@""] )
1051             {
1052                 playlist_ItemAddOption( p_item, [[@"stop-time=" \
1053                     stringByAppendingString: [o_userSelections objectForKey: \
1054                     @"partExtractTo"]] UTF8String] );
1055             }
1056
1057             playlist_ItemAddOption( p_item, [[@"ttl=" stringByAppendingString: \
1058                 [o_userSelections objectForKey:@"ttl"]] UTF8String] );
1059
1060             playlist_AddItem( p_playlist, p_item, PLAYLIST_GO, PLAYLIST_END );
1061
1062             msg_Warn(p_intf, "updating the playlist-table is not implemented!");
1063
1064             playlist_ViewUpdate( p_playlist, VIEW_CATEGORY );
1065
1066             vlc_object_release(p_playlist);
1067         } else {
1068             msg_Err( p_intf, "Uh Oh! Unable to find playlist!" );
1069         }
1070
1071         /* close the window, since we are done */
1072         [o_wizard_window close];
1073     }
1074 }
1075
1076 - (void)showSummary
1077 {
1078     [o_btn_forward setTitle: _NS("Finish")];
1079     [o_t8_fld_inptStream setStringValue:[o_userSelections objectForKey:@"pathToStrm"]];
1080
1081     if ([[o_userSelections objectForKey:@"partExtract"] isEqualToString: @"YES"])
1082     {
1083         [o_t8_fld_partExtract setStringValue: [[[[[_NS("yes") \
1084             stringByAppendingString:@" - "] stringByAppendingString: \
1085             _NS("from ")] stringByAppendingString: [o_userSelections \
1086             objectForKey:@"partExtractFrom"]] stringByAppendingString: \
1087             _NS(" to ")] stringByAppendingString: [o_userSelections \
1088             objectForKey:@"partExtractTo"]]];
1089     } else {
1090         [o_t8_fld_partExtract setStringValue: _NS("no")];
1091     }
1092
1093     if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] isEqualToString:@"strmg"])
1094     {
1095         /* we are streaming; no transcoding allowed atm */
1096         [o_t8_fld_saveFileTo setStringValue: @"-"];
1097         [o_t8_fld_trnscdAudio setStringValue: @"-"];
1098         [o_t8_fld_trnscdVideo setStringValue: @"-"];
1099         [o_t8_fld_strmgMthd setStringValue: [[o_strmgMthds objectAtIndex: \
1100             [[o_userSelections objectForKey:@"stmgMhd"] intValue]] \
1101             objectAtIndex:1]];
1102         [o_t8_fld_destination setStringValue: [o_userSelections objectForKey: \
1103             @"stmgDest"]];
1104         [o_t8_fld_ttl setStringValue: [o_userSelections objectForKey:@"ttl"]];
1105         if ([[o_userSelections objectForKey:@"sap"] isEqualToString: @"YES"])
1106         {
1107             [o_t8_fld_sap setStringValue: [[_NS("yes") stringByAppendingString:@": "] stringByAppendingString:[o_userSelections objectForKey:@"sapText"]]];
1108         }else{
1109             [o_t8_fld_sap setStringValue: _NS("no")];
1110         }
1111     } else {
1112         /* we are transcoding */
1113         [o_t8_fld_strmgMthd setStringValue: @"-"];
1114         [o_t8_fld_destination setStringValue: @"-"];
1115         [o_t8_fld_ttl setStringValue: @"-"];
1116         [o_t8_fld_sap setStringValue: @"-"];
1117         if ([[o_userSelections objectForKey:@"trnscdVideo"] isEqualToString:@"YES"])
1118         {
1119             [o_t8_fld_trnscdVideo setStringValue: [[[[[_NS("yes") \
1120                 stringByAppendingString:@": "] stringByAppendingString: \
1121                 [[o_videoCodecs objectAtIndex:[[o_userSelections objectForKey: \
1122                 @"trnscdVideoCodec"] intValue]] objectAtIndex:0]] \
1123                 stringByAppendingString:@" @ "] stringByAppendingString: \
1124                 [o_userSelections objectForKey:@"trnscdVideoBitrate"]] \
1125                 stringByAppendingString:@" kb/s"]];
1126         }else{
1127             [o_t8_fld_trnscdVideo setStringValue: _NS("no")];
1128         }
1129         if ([[o_userSelections objectForKey:@"trnscdAudio"] isEqualToString:@"YES"])
1130         {
1131             [o_t8_fld_trnscdAudio setStringValue: [[[[[_NS("yes") \
1132             stringByAppendingString:@": "] stringByAppendingString: \
1133             [[o_audioCodecs objectAtIndex:[[o_userSelections objectForKey: \
1134             @"trnscdAudioCodec"] intValue]] objectAtIndex:0]] \
1135             stringByAppendingString:@" @ "] stringByAppendingString: \
1136             [o_userSelections objectForKey:@"trnscdAudioBitrate"]] \
1137             stringByAppendingString:@" kb/s"]];
1138         }else{
1139             [o_t8_fld_trnscdAudio setStringValue: _NS("no")];
1140         }
1141         [o_t8_fld_saveFileTo setStringValue: [o_userSelections objectForKey: \
1142             @"trnscdFilePath"]];
1143     }
1144     [o_t8_fld_encapFormat setStringValue: [[o_encapFormats objectAtIndex: \
1145         [[o_userSelections objectForKey:@"encapFormat"] intValue]] objectAtIndex:1]];
1146
1147     [self createOpts];
1148     [o_t8_fld_mrl setStringValue: [o_userSelections objectForKey:@"opts"]];
1149
1150     [o_tab_pageHolder selectTabViewItemAtIndex:7];
1151 }
1152
1153 - (void) createOpts
1154 {
1155     NSMutableString * o_opts_string = [NSMutableString stringWithString:@""];
1156
1157     if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] isEqualToString:@"trnscd"])
1158     {
1159         /* we are just transcoding and dumping the stuff to a file */
1160         NSMutableString *o_trnscdCmd = [NSMutableString stringWithString:@""];
1161         if ([[o_userSelections objectForKey:@"trnscdVideo"] isEqualToString:@"YES"])
1162         {
1163             [o_trnscdCmd appendString: @"transcode{"];
1164             [o_trnscdCmd appendFormat: @"vcodec=%s,vb=%i", [[[o_videoCodecs \
1165                 objectAtIndex:[[o_userSelections objectForKey:@"trnscdVideoCodec"] \
1166                 intValue]] objectAtIndex:1] UTF8String],  [[o_userSelections \
1167                 objectForKey:@"trnscdVideoBitrate"] intValue]];
1168             if ([[o_userSelections objectForKey:@"trnscdAudio"] isEqualToString:@"YES"])
1169             {
1170                 [o_trnscdCmd appendString: @","];
1171             } 
1172             else
1173             {
1174                 [o_trnscdCmd appendString: @"}:"];
1175             }
1176         }
1177         if ([[o_userSelections objectForKey:@"trnscdAudio"] isEqualToString:@"YES"])
1178         {
1179             if ([[o_userSelections objectForKey:@"trnscdVideo"] isEqualToString:@"NO"])
1180             {
1181                 /* in case we transcode the audio only, add this */
1182                 [o_trnscdCmd appendString: @"transcode{"];
1183             }
1184             [o_trnscdCmd appendFormat: @"acodec=%s,ab=%i}:", [[[o_audioCodecs \
1185                 objectAtIndex:[[o_userSelections objectForKey:@"trnscdAudioCodec"] \
1186                 intValue]] objectAtIndex:1] UTF8String],  [[o_userSelections \
1187                 objectForKey:@"trnscdAudioBitrate"] intValue]];
1188         }
1189         [o_opts_string appendFormat: @":sout=#%sstandard{mux=%s,url=%s,access=file}", \
1190             [o_trnscdCmd UTF8String], [[[o_encapFormats objectAtIndex: \
1191             [[o_userSelections objectForKey:@"encapFormat"] intValue]] \
1192             objectAtIndex:0] UTF8String], [[o_userSelections objectForKey: \
1193             @"trnscdFilePath"] UTF8String]];
1194
1195     } else {
1196
1197         /* we are streaming - no transcoding allowed atm, since we mirror the wx-wizard */
1198         if ([[o_userSelections objectForKey:@"sap"] isEqualToString:@"YES"])
1199         {
1200             /* SAP-Announcement is requested */
1201             NSMutableString *o_sap_option = [NSMutableString stringWithString:@""];
1202             if([[o_userSelections objectForKey:@"sapText"] isEqualToString:@""])
1203             {
1204                 [o_sap_option appendString: @"sap"];
1205             } else {
1206                 [o_sap_option appendFormat: @"sap,name=\"%s\"",[[o_userSelections \
1207                     objectForKey:@"sapText"] UTF8String]];
1208             }
1209             [o_opts_string appendFormat: @":sout=#standard{mux=%s,url=%s,access=%s,%s}", \
1210                 [[[o_encapFormats objectAtIndex:[[o_userSelections objectForKey: \
1211                 @"encapFormat"] intValue]] objectAtIndex:0] UTF8String], \
1212                 [[o_userSelections objectForKey:@"stmgDest"] UTF8String], \
1213                 [[[o_strmgMthds objectAtIndex:[[o_userSelections objectForKey: \
1214                 @"stmgMhd"] intValue]] objectAtIndex:0] UTF8String], \
1215                 [o_sap_option UTF8String]];
1216         } else {
1217             /* no SAP, just streaming */
1218             [o_opts_string appendFormat: @":sout=#standard{mux=%s,url=%s,access=%s}", \
1219                 [[[o_encapFormats objectAtIndex:[[o_userSelections objectForKey: \
1220                 @"encapFormat"] intValue]] objectAtIndex:0] UTF8String], \
1221                 [[o_userSelections objectForKey:@"stmgDest"] UTF8String], \
1222                 [[[o_strmgMthds objectAtIndex:[[o_userSelections objectForKey: \
1223                 @"stmgMhd"] intValue]] objectAtIndex:0] UTF8String]];
1224         }
1225     }
1226
1227     [o_userSelections setObject:o_opts_string forKey:@"opts"];
1228 }
1229
1230 - (IBAction)prevTab:(id)sender
1231 {
1232     if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: @"Summary"])
1233     {
1234         /* check whether we are streaming or transcoding and go back */
1235         if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] isEqualToString:@"strmg"])
1236         {
1237             /* show "Streaming 2" */
1238             [o_tab_pageHolder selectTabViewItemAtIndex:5];
1239         }else{
1240             /* show "Transcode 2" */
1241             [o_tab_pageHolder selectTabViewItemAtIndex:6];
1242         }
1243         /* rename the forward-button */
1244         [o_btn_forward setTitle: _NS("Next")];
1245     }
1246     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1247         @"Transcode 2"])
1248     {
1249         /* show "Encap" */
1250         [o_tab_pageHolder selectTabViewItemAtIndex:4];
1251     }
1252     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1253         @"Streaming 2"])
1254     {
1255         /* show "Encap" */
1256         [o_tab_pageHolder selectTabViewItemAtIndex:4];
1257     }
1258     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1259         @"Encap"])
1260     {
1261         /* check whether we are streaming or transcoding and go back */
1262         if ([[o_userSelections objectForKey:@"trnscdOrStrmg"] isEqualToString: \
1263             @"strmg"])
1264         {
1265             /* show "Streaming 1" */
1266             [o_tab_pageHolder selectTabViewItemAtIndex:2];
1267         }else{
1268             /* show "Transcode 2" */
1269             [o_tab_pageHolder selectTabViewItemAtIndex:3];
1270         }
1271     }
1272     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1273         @"Streaming 1"])
1274     {
1275         /* show "Input" */
1276         [o_tab_pageHolder selectTabViewItemAtIndex:1];
1277     }
1278     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1279         @"Transcode 1"])
1280     {
1281         /* show "Input" */
1282         [o_tab_pageHolder selectTabViewItemAtIndex:1];
1283     }
1284     else if ([[[o_tab_pageHolder selectedTabViewItem] label] isEqualToString: \
1285         @"Input"])
1286     {
1287         /* show "Hello" */
1288         [o_tab_pageHolder selectTabViewItemAtIndex:0];
1289         /* disable backwards-btn */
1290         [o_btn_backward setEnabled:NO];
1291     }
1292 }
1293
1294 - (IBAction)t1_mrInfo_streaming:(id)sender
1295 {
1296     /* show a sheet for the help */
1297     /* since NSAlert does not exist on OSX < 10.3, we use our own implementation */
1298     [o_wh_txt_title setStringValue: _NS("Stream to network")];
1299     [o_wh_txt_text setStringValue: _NS("Use this to stream on a network.")];
1300     [NSApp beginSheet: o_wizardhelp_window
1301             modalForWindow: o_wizard_window
1302             modalDelegate: o_wizardhelp_window
1303             didEndSelector: nil
1304             contextInfo: nil];
1305 }
1306
1307 - (IBAction)t1_mrInfo_transcode:(id)sender
1308 {
1309     /* show a sheet for the help */
1310     [o_wh_txt_title setStringValue: _NS("Transcode/Save to file")];
1311     [o_wh_txt_text setStringValue: _NS("Use this to save a stream to a file. You "\
1312         "have the possibility to reencode the stream. You can save whatever "\
1313         "VLC can read.\nPlease notice that VLC is not very suited " \
1314         "for file to file transcoding. You should use its transcoding " \
1315         "features to save network streams, for example.")];
1316     [NSApp beginSheet: o_wizardhelp_window
1317             modalForWindow: o_wizard_window
1318             modalDelegate: o_wizardhelp_window
1319             didEndSelector: nil
1320             contextInfo: nil];
1321 }
1322
1323 - (IBAction)t2_addNewStream:(id)sender
1324 {
1325     NSOpenPanel * openPanel = [NSOpenPanel openPanel];
1326     SEL sel = @selector(t2_getNewStreamFromDialog:returnCode:contextInfo:);
1327     [openPanel beginSheetForDirectory:nil file:nil types:nil modalForWindow: \
1328         o_wizard_window modalDelegate:self didEndSelector:sel contextInfo:nil];
1329 }
1330
1331 - (void)t2_getNewStreamFromDialog: (NSOpenPanel *)sheet returnCode: \
1332     (int)returnCode contextInfo: (void *)contextInfo
1333 {
1334     if (returnCode == NSOKButton)
1335     {
1336         [o_t2_fld_pathToNewStrm setStringValue: [@"file://" \
1337             stringByAppendingString: [sheet filename]]];
1338     }
1339 }
1340
1341 - (IBAction)t2_chooseStreamOrPlst:(id)sender
1342 {
1343     /* enable and disable the respective items depending on user's choice */
1344     NSString *o_mode;
1345     o_mode = [[o_t2_matrix_inputSourceType selectedCell] title];
1346
1347     if( [o_mode isEqualToString: _NS("Select a stream")] )
1348     {
1349         [o_t2_btn_chooseFile setEnabled:YES];
1350         [o_t2_fld_pathToNewStrm setEnabled:YES];
1351         [o_t2_tbl_plst setEnabled:NO];
1352     } else {
1353         [o_t2_btn_chooseFile setEnabled:NO];
1354         [o_t2_fld_pathToNewStrm setEnabled:NO];
1355         [o_t2_tbl_plst setEnabled:YES];
1356     }
1357 }
1358
1359 - (IBAction)t2_enableExtract:(id)sender
1360 {
1361     /* enable/disable the respective items */
1362     if([o_t2_ckb_enblPartExtrct state] == NSOnState)
1363     {
1364         [o_t2_fld_prtExtrctFrom setEnabled:YES];
1365         [o_t2_fld_prtExtrctTo setEnabled:YES];
1366     } else {
1367         [o_t2_fld_prtExtrctFrom setEnabled:NO];
1368         [o_t2_fld_prtExtrctTo setEnabled:NO];
1369         [o_t2_fld_prtExtrctFrom setStringValue:@""];
1370         [o_t2_fld_prtExtrctTo setStringValue:@""];
1371     }
1372 }
1373
1374 - (IBAction)t3_strmMthdChanged:(id)sender
1375 {
1376     /* change the captions of o_t3_txt_destInfo according to the chosen
1377      * streaming method */
1378     NSNumber * o_mode;
1379     o_mode = [[NSNumber alloc] initWithInt:[[o_t3_matrix_stmgMhd selectedCell] tag]];
1380     if( [o_mode intValue] == 2 )
1381     {
1382         /* HTTP */
1383         [o_t3_txt_destInfo setStringValue: [[o_strmgMthds objectAtIndex:0] \
1384             objectAtIndex:2]];
1385         [o_t3_txt_strgMthdInfo setStringValue: [[o_strmgMthds objectAtIndex:0] \
1386             objectAtIndex:3]];
1387     }
1388     else if( [o_mode intValue] == 1 )
1389     {
1390         /* UDP-Multicast */
1391         [o_t3_txt_destInfo setStringValue: [[o_strmgMthds objectAtIndex:1] \
1392             objectAtIndex:2]];
1393         [o_t3_txt_strgMthdInfo setStringValue: [[o_strmgMthds objectAtIndex:1] \
1394             objectAtIndex:3]];
1395     }
1396     else if( [o_mode intValue] == 0 )
1397     {
1398         /* UDP-Unicast */
1399         [o_t3_txt_destInfo setStringValue: [[o_strmgMthds objectAtIndex:2] \
1400             objectAtIndex:2]];
1401         [o_t3_txt_strgMthdInfo setStringValue: [[o_strmgMthds objectAtIndex:2] \
1402         objectAtIndex:3]];
1403     }
1404     [o_mode release];
1405 }
1406
1407 - (IBAction)t4_AudCdcChanged:(id)sender
1408 {
1409     /* update codec info */
1410     [o_t4_txt_hintAudio setStringValue:[[o_audioCodecs objectAtIndex: \
1411         [o_t4_pop_audioCodec indexOfSelectedItem]] objectAtIndex:2]];
1412 }
1413
1414 - (IBAction)t4_enblAudTrnscd:(id)sender
1415 {
1416     /* enable/disable the respective items */
1417     if([o_t4_ckb_audio state] == NSOnState)
1418     {
1419         [o_t4_pop_audioCodec setEnabled:YES];
1420         [o_t4_pop_audioBitrate setEnabled:YES];
1421         [o_t4_txt_hintAudio setStringValue: _NS("Select your audio codec. "\
1422         "Click one to get more information.")];
1423     } else {
1424         [o_t4_pop_audioCodec setEnabled:NO];
1425         [o_t4_pop_audioBitrate setEnabled:NO];
1426         [o_t4_txt_hintAudio setStringValue: _NS("If your stream has audio " \
1427         "and you want to transcode it, enable this.")];
1428     }
1429 }
1430
1431 - (IBAction)t4_enblVidTrnscd:(id)sender
1432 {
1433     /* enable/disable the respective items */
1434     if([o_t4_ckb_video state] == NSOnState)
1435     {
1436         [o_t4_pop_videoCodec setEnabled:YES];
1437         [o_t4_pop_videoBitrate setEnabled:YES];
1438         [o_t4_txt_hintVideo setStringValue: _NS("Select your video codec. "\
1439         "Click one to get more information.")];
1440     } else {
1441         [o_t4_pop_videoCodec setEnabled:NO];
1442         [o_t4_pop_videoBitrate setEnabled:NO];
1443         [o_t4_txt_hintVideo setStringValue: _NS("If your stream has video " \
1444         "and you want to transcode it, enable this.")];
1445     }
1446 }
1447
1448 - (IBAction)t4_VidCdcChanged:(id)sender
1449 {
1450     /* update codec info */
1451     [o_t4_txt_hintVideo setStringValue:[[o_videoCodecs objectAtIndex: \
1452         [o_t4_pop_videoCodec indexOfSelectedItem]] objectAtIndex:2]];
1453 }
1454
1455 - (IBAction)t6_enblSapAnnce:(id)sender
1456 {
1457     /* enable/disable input fld */
1458     if([o_t6_ckb_sap state] == NSOnState)
1459     {
1460         [o_t6_fld_sap setEnabled:YES];
1461     } else {
1462         [o_t6_fld_sap setEnabled:NO];
1463         [o_t6_fld_sap setStringValue:@""];
1464     }
1465 }
1466
1467 - (IBAction)t6_mrInfo_ttl:(id)sender
1468 {
1469     /* show a sheet for the help */
1470     [o_wh_txt_title setStringValue: _NS("Time-To-Live (TTL)")];
1471     [o_wh_txt_text setStringValue: _NS("Define the TTL (Time-To-Live) of the stream. "\
1472             "This parameter is the maximum number of routers your stream can go " \
1473             "through. If you don't know what it means, or if you want to stream on " \
1474             "your local network only, leave this setting to 1.")];
1475     [NSApp beginSheet: o_wizardhelp_window
1476             modalForWindow: o_wizard_window
1477             modalDelegate: o_wizardhelp_window
1478             didEndSelector: nil
1479             contextInfo: nil];
1480 }
1481
1482 - (IBAction)t6_mrInfo_sap:(id)sender
1483 {
1484     /* show a sheet for the help */
1485     [o_wh_txt_title setStringValue: _NS("SAP Announce")];
1486     [o_wh_txt_text setStringValue: _NS("When streaming using UDP, you can " \
1487         "announce your streams using the SAP/SDP announcing protocol. This " \
1488         "way, the clients won't have to type in the multicast address, it " \
1489         "will appear in their playlist if they enable the SAP extra interface.\n" \
1490         "If you want to give a name to your stream, enter it here, " \
1491         "else, a default name will be used.")];
1492     [NSApp beginSheet: o_wizardhelp_window
1493             modalForWindow: o_wizard_window
1494             modalDelegate: o_wizardhelp_window
1495             didEndSelector: nil
1496             contextInfo: nil];
1497 }
1498
1499 - (IBAction)t7_selectTrnscdDestFile:(id)sender
1500 {
1501     /* provide a save-to-dialogue, so the user can choose a location for his/her new file */
1502     NSSavePanel * savePanel = [NSSavePanel savePanel];
1503     SEL sel = @selector(t7_getTrnscdDestFile:returnCode:contextInfo:);
1504     [savePanel setRequiredFileType:[[o_encapFormats objectAtIndex: \
1505         [[o_userSelections objectForKey:@"encapFormat"] intValue]] objectAtIndex:0]];
1506     [savePanel setCanSelectHiddenExtension:YES];
1507     [savePanel beginSheetForDirectory:nil file:nil modalForWindow: \
1508         o_wizard_window modalDelegate:self didEndSelector:sel contextInfo:nil];
1509 }
1510
1511 - (void)t7_getTrnscdDestFile: (NSSavePanel *)sheet returnCode: \
1512     (int)returnCode contextInfo: (void *)contextInfo
1513 {
1514     if (returnCode == NSOKButton)
1515     {
1516         /* output returned path to text-field */
1517         [o_t7_fld_filePath setStringValue:[sheet filename]];
1518     }
1519 }
1520
1521 - (IBAction)wh_closeSheet:(id)sender
1522 {
1523     /* close the help sheet */
1524     [NSApp endSheet:o_wizardhelp_window];
1525     [o_wizardhelp_window close];
1526 }
1527
1528 @end