1 /* $Id: HBSubtitles.m,v 1.35 2005/08/01 14:29:50 titer Exp $
3 This file is part of the HandBrake source code.
4 Homepage: <http://handbrake.fr/>.
5 It may be used under the terms of the GNU General Public License. */
8 #import "HBSubtitles.h"
18 @implementation HBSubtitles
27 /* setup our array of languages */
28 languagesArray = [[NSMutableArray alloc] init];
29 [languagesArray addObject:[NSArray arrayWithObjects:@"Any",@"und",nil]];
30 [languagesArray addObject:[NSArray arrayWithObjects:@"Afar",@"aar",nil]];
31 [languagesArray addObject:[NSArray arrayWithObjects:@"Abkhazian",@"abk",nil]];
32 [languagesArray addObject:[NSArray arrayWithObjects:@"Afrikaans",@"afr",nil]];
33 [languagesArray addObject:[NSArray arrayWithObjects:@"Akan",@"ak",nil]];
34 [languagesArray addObject:[NSArray arrayWithObjects:@"Albanian",@"sqi",nil]];
35 [languagesArray addObject:[NSArray arrayWithObjects:@"Amharic",@"amh",nil]];
36 [languagesArray addObject:[NSArray arrayWithObjects:@"Arabic",@"ara",nil]];
37 [languagesArray addObject:[NSArray arrayWithObjects:@"Aragonese",@"arg",nil]];
38 [languagesArray addObject:[NSArray arrayWithObjects:@"Armenian",@"hye",nil]];
39 [languagesArray addObject:[NSArray arrayWithObjects:@"Assamese",@"asm",nil]];
40 [languagesArray addObject:[NSArray arrayWithObjects:@"Avaric",@"ava",nil]];
41 [languagesArray addObject:[NSArray arrayWithObjects:@"Avestan",@"ave",nil]];
42 [languagesArray addObject:[NSArray arrayWithObjects:@"Aymara",@"aym",nil]];
43 [languagesArray addObject:[NSArray arrayWithObjects:@"Azerbaijani",@"aze",nil]];
44 [languagesArray addObject:[NSArray arrayWithObjects:@"Bashkir",@"bak",nil]];
45 [languagesArray addObject:[NSArray arrayWithObjects:@"Bambara",@"bam",nil]];
46 [languagesArray addObject:[NSArray arrayWithObjects:@"Basque",@"eus",nil]];
47 [languagesArray addObject:[NSArray arrayWithObjects:@"Belarusian",@"bel",nil]];
48 [languagesArray addObject:[NSArray arrayWithObjects:@"Bengali",@"ben",nil]];
49 [languagesArray addObject:[NSArray arrayWithObjects:@"Bihari",@"bih",nil]];
50 [languagesArray addObject:[NSArray arrayWithObjects:@"Bislama",@"bis",nil]];
51 [languagesArray addObject:[NSArray arrayWithObjects:@"Bosnian",@"bos",nil]];
52 [languagesArray addObject:[NSArray arrayWithObjects:@"Breton",@"bre",nil]];
53 [languagesArray addObject:[NSArray arrayWithObjects:@"Bulgarian",@"bul",nil]];
54 [languagesArray addObject:[NSArray arrayWithObjects:@"Burmese",@"mya",nil]];
55 [languagesArray addObject:[NSArray arrayWithObjects:@"Catalan",@"cat",nil]];
56 [languagesArray addObject:[NSArray arrayWithObjects:@"Chamorro",@"cha",nil]];
57 [languagesArray addObject:[NSArray arrayWithObjects:@"Chechen",@"che",nil]];
58 [languagesArray addObject:[NSArray arrayWithObjects:@"Chinese",@"zho",nil]];
59 [languagesArray addObject:[NSArray arrayWithObjects:@"Church Slavic",@"chu",nil]];
60 [languagesArray addObject:[NSArray arrayWithObjects:@"Chuvash",@"chv",nil]];
61 [languagesArray addObject:[NSArray arrayWithObjects:@"Cornish",@"cor",nil]];
62 [languagesArray addObject:[NSArray arrayWithObjects:@"Corsican",@"cos",nil]];
63 [languagesArray addObject:[NSArray arrayWithObjects:@"Cree",@"cre",nil]];
64 [languagesArray addObject:[NSArray arrayWithObjects:@"Czech",@"ces",nil]];
65 [languagesArray addObject:[NSArray arrayWithObjects:@"Danish",@"dan",nil]];
66 [languagesArray addObject:[NSArray arrayWithObjects:@"Divehi",@"div",nil]];
67 [languagesArray addObject:[NSArray arrayWithObjects:@"Dutch",@"nld",nil]];
68 [languagesArray addObject:[NSArray arrayWithObjects:@"Dzongkha",@"dzo",nil]];
69 [languagesArray addObject:[NSArray arrayWithObjects:@"English",@"eng",nil]];
70 [languagesArray addObject:[NSArray arrayWithObjects:@"Esperanto",@"epo",nil]];
71 [languagesArray addObject:[NSArray arrayWithObjects:@"Estonian",@"est",nil]];
72 [languagesArray addObject:[NSArray arrayWithObjects:@"Ewe",@"ewe",nil]];
73 [languagesArray addObject:[NSArray arrayWithObjects:@"Faroese",@"fao",nil]];
74 [languagesArray addObject:[NSArray arrayWithObjects:@"Fijian",@"fij",nil]];
75 [languagesArray addObject:[NSArray arrayWithObjects:@"Finnish",@"fin",nil]];
76 [languagesArray addObject:[NSArray arrayWithObjects:@"French",@"fra",nil]];
77 [languagesArray addObject:[NSArray arrayWithObjects:@"Western Frisian",@"fry",nil]];
78 [languagesArray addObject:[NSArray arrayWithObjects:@"Fulah",@"ful",nil]];
79 [languagesArray addObject:[NSArray arrayWithObjects:@"Georgian",@"kat",nil]];
80 [languagesArray addObject:[NSArray arrayWithObjects:@"German",@"deu",nil]];
81 [languagesArray addObject:[NSArray arrayWithObjects:@"Gaelic (Scots)",@"gla",nil]];
82 [languagesArray addObject:[NSArray arrayWithObjects:@"Irish",@"gle",nil]];
83 [languagesArray addObject:[NSArray arrayWithObjects:@"Galician",@"glg",nil]];
84 [languagesArray addObject:[NSArray arrayWithObjects:@"Manx",@"glv",nil]];
85 [languagesArray addObject:[NSArray arrayWithObjects:@"Greek, Modern",@"ell",nil]];
86 [languagesArray addObject:[NSArray arrayWithObjects:@"Guarani",@"grn",nil]];
87 [languagesArray addObject:[NSArray arrayWithObjects:@"Gujarati",@"guj",nil]];
88 [languagesArray addObject:[NSArray arrayWithObjects:@"Haitian",@"hat",nil]];
89 [languagesArray addObject:[NSArray arrayWithObjects:@"Hausa",@"hau",nil]];
90 [languagesArray addObject:[NSArray arrayWithObjects:@"Hebrew",@"heb",nil]];
91 [languagesArray addObject:[NSArray arrayWithObjects:@"Herero",@"her",nil]];
92 [languagesArray addObject:[NSArray arrayWithObjects:@"Hindi",@"hin",nil]];
93 [languagesArray addObject:[NSArray arrayWithObjects:@"Hiri Motu",@"hmo",nil]];
94 [languagesArray addObject:[NSArray arrayWithObjects:@"Hungarian",@"hun",nil]];
95 [languagesArray addObject:[NSArray arrayWithObjects:@"Igbo",@"ibo",nil]];
96 [languagesArray addObject:[NSArray arrayWithObjects:@"Icelandic",@"isl",nil]];
97 [languagesArray addObject:[NSArray arrayWithObjects:@"Ido",@"ido",nil]];
98 [languagesArray addObject:[NSArray arrayWithObjects:@"Sichuan Yi",@"iii",nil]];
99 [languagesArray addObject:[NSArray arrayWithObjects:@"Inuktitut",@"iku",nil]];
100 [languagesArray addObject:[NSArray arrayWithObjects:@"Interlingue",@"ile",nil]];
101 [languagesArray addObject:[NSArray arrayWithObjects:@"Interlingua",@"ina",nil]];
102 [languagesArray addObject:[NSArray arrayWithObjects:@"Indonesian",@"ind",nil]];
103 [languagesArray addObject:[NSArray arrayWithObjects:@"Inupiaq",@"ipk",nil]];
104 [languagesArray addObject:[NSArray arrayWithObjects:@"Italian",@"ita",nil]];
105 [languagesArray addObject:[NSArray arrayWithObjects:@"Javanese",@"jav",nil]];
106 [languagesArray addObject:[NSArray arrayWithObjects:@"Japanese",@"jpn",nil]];
107 [languagesArray addObject:[NSArray arrayWithObjects:@"Kalaallisut (Greenlandic)",@"kal",nil]];
108 [languagesArray addObject:[NSArray arrayWithObjects:@"Kannada",@"kan",nil]];
109 [languagesArray addObject:[NSArray arrayWithObjects:@"Kashmiri",@"kas",nil]];
110 [languagesArray addObject:[NSArray arrayWithObjects:@"Kanuri",@"kau",nil]];
111 [languagesArray addObject:[NSArray arrayWithObjects:@"Kazakh",@"kaz",nil]];
112 [languagesArray addObject:[NSArray arrayWithObjects:@"Central Khmer",@"khm",nil]];
113 [languagesArray addObject:[NSArray arrayWithObjects:@"Kikuyu",@"kik",nil]];
114 [languagesArray addObject:[NSArray arrayWithObjects:@"Kinyarwanda",@"kin",nil]];
115 [languagesArray addObject:[NSArray arrayWithObjects:@"Kirghiz",@"kir",nil]];
116 [languagesArray addObject:[NSArray arrayWithObjects:@"Komi",@"kom",nil]];
117 [languagesArray addObject:[NSArray arrayWithObjects:@"Kongo",@"kon",nil]];
118 [languagesArray addObject:[NSArray arrayWithObjects:@"Korean",@"kor",nil]];
119 [languagesArray addObject:[NSArray arrayWithObjects:@"Kuanyama",@"kua",nil]];
120 [languagesArray addObject:[NSArray arrayWithObjects:@"Kurdish",@"kur",nil]];
121 [languagesArray addObject:[NSArray arrayWithObjects:@"Lao",@"lao",nil]];
122 [languagesArray addObject:[NSArray arrayWithObjects:@"Latin",@"lat",nil]];
123 [languagesArray addObject:[NSArray arrayWithObjects:@"Latvian",@"lav",nil]];
124 [languagesArray addObject:[NSArray arrayWithObjects:@"Limburgan",@"lim",nil]];
125 [languagesArray addObject:[NSArray arrayWithObjects:@"Lingala",@"lin",nil]];
126 [languagesArray addObject:[NSArray arrayWithObjects:@"Lithuanian",@"lit",nil]];
127 [languagesArray addObject:[NSArray arrayWithObjects:@"Luxembourgish",@"ltz",nil]];
128 [languagesArray addObject:[NSArray arrayWithObjects:@"Luba-Katanga",@"lub",nil]];
129 [languagesArray addObject:[NSArray arrayWithObjects:@"Ganda",@"lug",nil]];
130 [languagesArray addObject:[NSArray arrayWithObjects:@"Macedonian",@"mkd",nil]];
131 [languagesArray addObject:[NSArray arrayWithObjects:@"Marshallese",@"mah",nil]];
132 [languagesArray addObject:[NSArray arrayWithObjects:@"Malayalam",@"mal",nil]];
133 [languagesArray addObject:[NSArray arrayWithObjects:@"Maori",@"mri",nil]];
134 [languagesArray addObject:[NSArray arrayWithObjects:@"Marathi",@"mar",nil]];
135 [languagesArray addObject:[NSArray arrayWithObjects:@"Malay",@"msa",nil]];
136 [languagesArray addObject:[NSArray arrayWithObjects:@"Malagasy",@"mlg",nil]];
137 [languagesArray addObject:[NSArray arrayWithObjects:@"Maltese",@"mlt",nil]];
138 [languagesArray addObject:[NSArray arrayWithObjects:@"Moldavian",@"mol",nil]];
139 [languagesArray addObject:[NSArray arrayWithObjects:@"Mongolian",@"mon",nil]];
140 [languagesArray addObject:[NSArray arrayWithObjects:@"Nauru",@"nau",nil]];
141 [languagesArray addObject:[NSArray arrayWithObjects:@"Navajo",@"nav",nil]];
142 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndebele, South",@"nbl",nil]];
143 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndebele, North",@"nde",nil]];
144 [languagesArray addObject:[NSArray arrayWithObjects:@"Ndonga",@"ndo",nil]];
145 [languagesArray addObject:[NSArray arrayWithObjects:@"Nepali",@"nep",nil]];
146 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian Nynorsk",@"nno",nil]];
147 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian Bokmål",@"nob",nil]];
148 [languagesArray addObject:[NSArray arrayWithObjects:@"Norwegian",@"nor",nil]];
149 [languagesArray addObject:[NSArray arrayWithObjects:@"Chichewa; Nyanja",@"nya",nil]];
150 [languagesArray addObject:[NSArray arrayWithObjects:@"Occitan (post 1500); Provençal",@"oci",nil]];
151 [languagesArray addObject:[NSArray arrayWithObjects:@"Ojibwa",@"oji",nil]];
152 [languagesArray addObject:[NSArray arrayWithObjects:@"Oriya",@"ori",nil]];
153 [languagesArray addObject:[NSArray arrayWithObjects:@"Oromo",@"orm",nil]];
154 [languagesArray addObject:[NSArray arrayWithObjects:@"Ossetian; Ossetic",@"und",nil]];
155 [languagesArray addObject:[NSArray arrayWithObjects:@"Panjabi",@"pan",nil]];
156 [languagesArray addObject:[NSArray arrayWithObjects:@"Persian",@"fas",nil]];
157 [languagesArray addObject:[NSArray arrayWithObjects:@"Pali",@"pli",nil]];
158 [languagesArray addObject:[NSArray arrayWithObjects:@"Portuguese",@"por",nil]];
159 [languagesArray addObject:[NSArray arrayWithObjects:@"Pushto",@"pus",nil]];
160 [languagesArray addObject:[NSArray arrayWithObjects:@"Quechua",@"que",nil]];
161 [languagesArray addObject:[NSArray arrayWithObjects:@"Romansh",@"roh",nil]];
162 [languagesArray addObject:[NSArray arrayWithObjects:@"Romanian",@"ron",nil]];
163 [languagesArray addObject:[NSArray arrayWithObjects:@"Rundi",@"run",nil]];
164 [languagesArray addObject:[NSArray arrayWithObjects:@"Russian",@"rus",nil]];
165 [languagesArray addObject:[NSArray arrayWithObjects:@"Sango",@"sag",nil]];
166 [languagesArray addObject:[NSArray arrayWithObjects:@"Sanskrit",@"san",nil]];
167 [languagesArray addObject:[NSArray arrayWithObjects:@"Serbian",@"srp",nil]];
168 [languagesArray addObject:[NSArray arrayWithObjects:@"Croatian",@"hrv",nil]];
169 [languagesArray addObject:[NSArray arrayWithObjects:@"Sinhala",@"sin",nil]];
170 [languagesArray addObject:[NSArray arrayWithObjects:@"Slovak",@"slk",nil]];
171 [languagesArray addObject:[NSArray arrayWithObjects:@"Slovenian",@"slv",nil]];
172 [languagesArray addObject:[NSArray arrayWithObjects:@"Northern Sami",@"sme",nil]];
173 [languagesArray addObject:[NSArray arrayWithObjects:@"Samoan",@"smo",nil]];
174 [languagesArray addObject:[NSArray arrayWithObjects:@"Shona",@"sna",nil]];
175 [languagesArray addObject:[NSArray arrayWithObjects:@"Sindhi",@"snd",nil]];
176 [languagesArray addObject:[NSArray arrayWithObjects:@"Somali",@"som",nil]];
177 [languagesArray addObject:[NSArray arrayWithObjects:@"Sotho, Southern",@"sot",nil]];
178 [languagesArray addObject:[NSArray arrayWithObjects:@"Spanish",@"spa",nil]];
179 [languagesArray addObject:[NSArray arrayWithObjects:@"Sardinian",@"srd",nil]];
180 [languagesArray addObject:[NSArray arrayWithObjects:@"Swati",@"ssw",nil]];
181 [languagesArray addObject:[NSArray arrayWithObjects:@"Sundanese",@"sun",nil]];
182 [languagesArray addObject:[NSArray arrayWithObjects:@"Swahili",@"swa",nil]];
183 [languagesArray addObject:[NSArray arrayWithObjects:@"Swedish",@"swe",nil]];
184 [languagesArray addObject:[NSArray arrayWithObjects:@"Tahitian",@"tah",nil]];
185 [languagesArray addObject:[NSArray arrayWithObjects:@"Tamil",@"tam",nil]];
186 [languagesArray addObject:[NSArray arrayWithObjects:@"Tatar",@"tat",nil]];
187 [languagesArray addObject:[NSArray arrayWithObjects:@"Telugu",@"tel",nil]];
188 [languagesArray addObject:[NSArray arrayWithObjects:@"Tajik",@"tgk",nil]];
189 [languagesArray addObject:[NSArray arrayWithObjects:@"Tagalog",@"tgl",nil]];
190 [languagesArray addObject:[NSArray arrayWithObjects:@"Thai",@"tha",nil]];
191 [languagesArray addObject:[NSArray arrayWithObjects:@"Tibetan",@"bod",nil]];
192 [languagesArray addObject:[NSArray arrayWithObjects:@"Tigrinya",@"tir",nil]];
193 [languagesArray addObject:[NSArray arrayWithObjects:@"Tonga (Tonga Islands)",@"ton",nil]];
194 [languagesArray addObject:[NSArray arrayWithObjects:@"Tswana",@"tsn",nil]];
195 [languagesArray addObject:[NSArray arrayWithObjects:@"Tsonga",@"tso",nil]];
196 [languagesArray addObject:[NSArray arrayWithObjects:@"Turkmen",@"tuk",nil]];
197 [languagesArray addObject:[NSArray arrayWithObjects:@"Turkish",@"tur",nil]];
198 [languagesArray addObject:[NSArray arrayWithObjects:@"Twi",@"twi",nil]];
199 [languagesArray addObject:[NSArray arrayWithObjects:@"Uighur",@"uig",nil]];
200 [languagesArray addObject:[NSArray arrayWithObjects:@"Ukrainian",@"ukr",nil]];
201 [languagesArray addObject:[NSArray arrayWithObjects:@"Urdu",@"urd",nil]];
202 [languagesArray addObject:[NSArray arrayWithObjects:@"Uzbek",@"uzb",nil]];
203 [languagesArray addObject:[NSArray arrayWithObjects:@"Venda",@"ven",nil]];
204 [languagesArray addObject:[NSArray arrayWithObjects:@"Vietnamese",@"vie",nil]];
205 [languagesArray addObject:[NSArray arrayWithObjects:@"Volapük",@"vol",nil]];
206 [languagesArray addObject:[NSArray arrayWithObjects:@"Welsh",@"cym",nil]];
207 [languagesArray addObject:[NSArray arrayWithObjects:@"Walloon",@"wln",nil]];
208 [languagesArray addObject:[NSArray arrayWithObjects:@"Wolof",@"wol",nil]];
209 [languagesArray addObject:[NSArray arrayWithObjects:@"Xhosa",@"xho",nil]];
210 [languagesArray addObject:[NSArray arrayWithObjects:@"Yiddish",@"yid",nil]];
211 [languagesArray addObject:[NSArray arrayWithObjects:@"Yoruba",@"yor",nil]];
212 [languagesArray addObject:[NSArray arrayWithObjects:@"ZhuangZhuang",@"zha",nil]];
213 [languagesArray addObject:[NSArray arrayWithObjects:@"Zulu",@"zul",nil]];
215 languagesArrayDefIndex = 40;
217 /* populate the charCodeArray */
218 charCodeArray = [[NSMutableArray alloc] init];
219 [charCodeArray addObject:@"ANSI_X3.4-1968"];
220 [charCodeArray addObject:@"ANSI_X3.4-1986"];
221 [charCodeArray addObject:@"ANSI_X3.4"];
222 [charCodeArray addObject:@"ANSI_X3.110-1983"];
223 [charCodeArray addObject:@"ANSI_X3.110"];
224 [charCodeArray addObject:@"ASCII"];
225 [charCodeArray addObject:@"ECMA-114"];
226 [charCodeArray addObject:@"ECMA-118"];
227 [charCodeArray addObject:@"ECMA-128"];
228 [charCodeArray addObject:@"ECMA-CYRILLIC"];
229 [charCodeArray addObject:@"IEC_P27-1"];
230 [charCodeArray addObject:@"ISO-8859-1"];
231 [charCodeArray addObject:@"ISO-8859-2"];
232 [charCodeArray addObject:@"ISO-8859-3"];
233 [charCodeArray addObject:@"ISO-8859-4"];
234 [charCodeArray addObject:@"ISO-8859-5"];
235 [charCodeArray addObject:@"ISO-8859-6"];
236 [charCodeArray addObject:@"ISO-8859-7"];
237 [charCodeArray addObject:@"ISO-8859-8"];
238 [charCodeArray addObject:@"ISO-8859-9"];
239 [charCodeArray addObject:@"ISO-8859-9E"];
240 [charCodeArray addObject:@"ISO-8859-10"];
241 [charCodeArray addObject:@"ISO-8859-11"];
242 [charCodeArray addObject:@"ISO-8859-13"];
243 [charCodeArray addObject:@"ISO-8859-14"];
244 [charCodeArray addObject:@"ISO-8859-15"];
245 [charCodeArray addObject:@"ISO-8859-16"];
246 [charCodeArray addObject:@"UTF-7"];
247 [charCodeArray addObject:@"UTF-8"];
248 [charCodeArray addObject:@"UTF-16"];
249 [charCodeArray addObject:@"UTF-16LE"];
250 [charCodeArray addObject:@"UTF-16BE"];
251 [charCodeArray addObject:@"UTF-32"];
252 [charCodeArray addObject:@"UTF-32LE"];
253 [charCodeArray addObject:@"UTF-32BE"];
255 charCodeArrayDefIndex = 11;
261 - (void)resetWithTitle:(hb_title_t *)title
270 /* reset the subtitle source array */
271 if (subtitleSourceArray)
273 [subtitleSourceArray release];
275 subtitleSourceArray = [[NSMutableArray alloc] init];
277 /* now populate the array with the source subtitle track info */
280 hb_subtitle_t *subtitle;
281 hb_subtitle_config_t sub_config;
283 for(i = 0; i < hb_list_count( fTitle->list_subtitle ); i++ )
285 NSString * trackTypeString = @"";
286 int isPictureSub = 0;
287 int canBeBurnedIn = 0;
288 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
289 sub_config = subtitle->config;
291 if (subtitle->format == PICTURESUB)
293 trackTypeString = @"- (Bitmap)";
299 trackTypeString = @"- (Text)";
300 if(subtitle->source == SSASUB)
305 /* create a dictionary of source subtitle information to store in our array */
306 NSString *popupName = [NSString stringWithFormat:@"%d - %@ %@",i,[NSString stringWithUTF8String:subtitle->lang],trackTypeString];
307 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
308 /* Subtitle Source track popup index */
309 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
310 /* Subtitle Source track type */
311 [newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
312 /* Subtitle Source track type (Source, Srt, etc.) */
313 [newSubtitleSourceTrack setObject:@"Source" forKey:@"sourceTrackType"];
314 /* Subtitle Source track popup isPictureSub */
315 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:isPictureSub] forKey:@"sourceTrackisPictureSub"];
316 /* Subtitle Source track popup canBeBurnedIn */
317 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:canBeBurnedIn] forKey:@"sourceTrackcanBeBurnedIn"];
319 [subtitleSourceArray addObject:newSubtitleSourceTrack];
320 [newSubtitleSourceTrack autorelease];
326 /* reset the subtitle output array */
329 [subtitleArray release];
331 subtitleArray = [[NSMutableArray alloc] init];
332 [self addSubtitleTrack];
336 #pragma mark Create new Subtitles
338 - (void)addSubtitleTrack
340 [subtitleArray addObject:[self createSubtitleTrack]];
343 /* Creates a new subtitle track and stores it in an NSMutableDictionary */
344 - (NSDictionary *)createSubtitleTrack
346 NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init];
347 /* Subtitle Source track popup index */
348 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
349 /* Subtitle Source track popup language */
350 [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
351 /* Subtitle Source track popup isPictureSub */
352 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
353 /* Subtitle Source track popup canBeBurnedIn */
354 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackcanBeBurnedIn"];
355 /* Subtitle track forced state */
356 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
357 /* Subtitle track burned state */
358 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
359 /* Subtitle track default state */
360 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
362 [newSubtitleTrack autorelease];
363 return newSubtitleTrack;
366 - (void)createSubtitleSrtTrack:(NSString *)filePath
368 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
369 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
370 /* create a dictionary of source subtitle information to store in our array */
371 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
372 /* Subtitle Source track popup index */
373 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
374 /* Subtitle Source track type */
375 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
376 /* Subtitle Source track type (Source, Srt, etc.) */
377 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
378 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
379 /* Subtitle Source track type */
380 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
381 /* Subtitle Source track popup isPictureSub */
382 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
383 /* Subtitle Source track popup canBeBurnedIn */
384 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackcanBeBurnedIn"];
386 [subtitleSourceArray addObject:newSubtitleSourceTrack];
387 [newSubtitleSourceTrack autorelease];
389 /* Now create a new srt subtitle dictionary assuming the user wants to add it to their list
390 * Note: the subtitle array always has last entry for "None", so we need to replace its
391 * position in the array and tack a "None" track back on the end of the list */
392 [subtitleArray removeObjectAtIndex:[subtitleArray count] - 1];
395 NSMutableDictionary *newSubtitleSrtTrack = [[NSMutableDictionary alloc] init];
396 /* Subtitle Source track popup index */
397 if ([subtitleArray count] == 0) // we now have an empty array so this will be our first track
399 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"];
403 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"];
406 [newSubtitleSrtTrack setObject:@"SRT" forKey:@"sourceTrackType"];
407 [newSubtitleSrtTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
408 /* Subtitle Source track popup language */
409 [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"];
410 /* Subtitle Source track popup isPictureSub */
411 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
412 /* Subtitle Source track popup canBeBurnedIn */
413 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackcanBeBurnedIn"];
414 /* Subtitle track forced state */
415 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
416 /* Subtitle track burned state */
417 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
418 /* Subtitle track default state */
419 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
421 /* now the srt only info, Language, Chart Code and offset */
422 [newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
423 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
424 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
425 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
427 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
428 [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
430 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"];
433 [subtitleArray addObject:newSubtitleSrtTrack];
434 [newSubtitleSrtTrack release];
436 /* now add back the none track to the end of the array */
437 [self addSubtitleTrack];
442 /* used to return the current subtitleArray to controller.m */
443 - (NSMutableArray*) getSubtitleArray
445 return subtitleArray;
448 - (void)containerChanged:(int) newContainer
450 container = newContainer;
453 - (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
455 /* Note: we need to look for external subtitles so it can be added to the source array track.
456 * Remember the source container subs are already loaded with resetTitle which is already called
457 * so any external sub sources need to be added to our source subs here
461 NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
463 while ( tempObject = [enumerator nextObject] )
465 /* We have an srt track */
466 if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
468 NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"];
469 /* Start replicate the add new srt code above */
470 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
471 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
472 /* create a dictionary of source subtitle information to store in our array */
473 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
474 /* Subtitle Source track popup index */
475 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
476 /* Subtitle Source track type */
477 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
478 /* Subtitle Source track type (Source, Srt, etc.) */
479 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
480 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
481 /* Subtitle Source track type */
482 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
483 /* Subtitle Source track popup isPictureSub */
484 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
485 /* Subtitle Source track popup canBeBurnedIn */
486 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackcanBeBurnedIn"];
488 [subtitleSourceArray addObject:newSubtitleSourceTrack];
489 [newSubtitleSourceTrack autorelease];
490 /* END replicate the add new srt code above */
496 /*Set the subtitleArray to the newSubtitleArray */
497 [subtitleArray setArray:newSubtitleArray];
501 #pragma mark Subtitle Table Delegate Methods
502 /* Table View delegate methods */
503 /* Returns the number of tracks displayed
504 * NOTE: we return one more than the actual number of tracks
505 * specified as we always keep one track set to "None" which is ignored
506 * for setting up tracks, but is used to add tracks.
508 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
510 if( fTitle == NULL || ![subtitleArray count])
516 return [subtitleArray count];
520 /* Used to tell the Table view which information is to be displayed per item */
521 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
523 NSString *cellEntry = @"__DATA ERROR__";
525 /* we setup whats displayed given the column identifier */
526 if ([[aTableColumn identifier] isEqualToString:@"track"])
528 /* 'track' is a popup of all available source subtitle tracks for the given title */
529 NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init];
530 [cellTrackPopup autorelease];
531 /* Set the Popups properties */
532 [cellTrackPopup setControlSize:NSSmallControlSize];
533 [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
536 /* Add our initial "None" track which we use to add source tracks or remove tracks.
537 * "None" is always index 0.
539 [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""];
541 /* Foreign Audio Search (index 1 in the popup) is only available for the first track */
544 [[cellTrackPopup menu] addItemWithTitle: @"Foreign Audio Search - (Bitmap)" action: NULL keyEquivalent: @""];
548 for(i = 0; i < [subtitleSourceArray count]; i++ )
550 [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""];
554 [aTableColumn setDataCell:cellTrackPopup];
557 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
559 /* 'forced' is a checkbox to determine if a given source track is only to be forced */
560 NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init];
561 [cellForcedCheckBox autorelease];
562 [cellForcedCheckBox setButtonType:NSSwitchButton];
563 [cellForcedCheckBox setImagePosition:NSImageOnly];
564 [cellForcedCheckBox setAllowsMixedState:NO];
565 [aTableColumn setDataCell:cellForcedCheckBox];
568 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
570 /* 'burned' is a checkbox to determine if a given source track is only to be burned */
571 NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init];
572 [cellBurnedCheckBox autorelease];
573 [cellBurnedCheckBox setButtonType:NSSwitchButton];
574 [cellBurnedCheckBox setImagePosition:NSImageOnly];
575 [cellBurnedCheckBox setAllowsMixedState:NO];
576 [aTableColumn setDataCell:cellBurnedCheckBox];
578 else if ([[aTableColumn identifier] isEqualToString:@"default"])
580 NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init];
581 [cellDefaultCheckBox autorelease];
582 [cellDefaultCheckBox setButtonType:NSSwitchButton];
583 [cellDefaultCheckBox setImagePosition:NSImageOnly];
584 [cellDefaultCheckBox setAllowsMixedState:NO];
585 [aTableColumn setDataCell:cellDefaultCheckBox];
587 /* These next three columns only apply to srt's. they are disabled for source subs */
588 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
590 /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */
591 NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init];
592 [cellSrtLangPopup autorelease];
593 /* Set the Popups properties */
594 [cellSrtLangPopup setControlSize:NSSmallControlSize];
595 [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
596 /* list our languages as per the languagesArray */
598 for(i = 0; i < [languagesArray count]; i++ )
600 [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""];
602 [aTableColumn setDataCell:cellSrtLangPopup];
604 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
606 /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */
607 NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init];
608 [cellSrtCharCodePopup autorelease];
609 /* Set the Popups properties */
610 [cellSrtCharCodePopup setControlSize:NSSmallControlSize];
611 [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
612 /* list our character codes, as per charCodeArray */
615 for(i = 0; i < [charCodeArray count]; i++ )
617 [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""];
619 [aTableColumn setDataCell:cellSrtCharCodePopup];
622 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
624 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"])
626 cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]];
630 cellEntry = [NSString stringWithFormat:@"%d",0];
641 /* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array
642 * including removing and adding new tracks via the "None" ("track" index of 0) */
643 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
646 if ([[aTableColumn identifier] isEqualToString:@"track"])
648 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"];
649 /* Set the array to track if we are vobsub (picture sub) */
650 if ([anObject intValue] != 0)
652 int sourceSubtitleIndex;
653 bool isPictureSub = FALSE;
654 bool canBeBurnedIn = FALSE;
658 sourceSubtitleIndex = [anObject intValue] - 2;
662 sourceSubtitleIndex = [anObject intValue] - 1;
665 if (rowIndex == 0 && [anObject intValue] == 1)// we are Foreign Launguage Search, which is inherently bitmap
668 canBeBurnedIn = TRUE;
672 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackisPictureSub"] intValue] ==1)
676 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackcanBeBurnedIn"] intValue] ==1)
678 canBeBurnedIn = TRUE;
681 if (isPictureSub == TRUE)
683 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackisPictureSub"];
687 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
689 if (canBeBurnedIn == TRUE)
691 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackcanBeBurnedIn"];
695 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackcanBeBurnedIn"];
696 /* the source track cannot be burned in, so uncheck the widget */
697 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
700 /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
702 if (rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search
704 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
708 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
710 [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
711 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
715 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
721 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
723 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"];
725 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
727 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
728 /* now we need to make sure no other tracks are set to burned if we have set burned*/
729 if ([anObject intValue] == 1)
732 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
734 while ( tempObject = [enumerator nextObject] )
738 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
744 else if ([[aTableColumn identifier] isEqualToString:@"default"])
746 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
747 /* now we need to make sure no other tracks are set to default */
748 if ([anObject intValue] == 1)
751 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
753 while ( tempObject = [enumerator nextObject] )
757 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
764 /* These next three columns only apply to srt's. they are disabled for source subs */
765 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
768 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"];
769 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
770 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
773 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
776 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"];
777 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"];
779 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
781 [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"];
785 /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */
786 if ([[aTableColumn identifier] isEqualToString:@"track"])
789 /* Since currently no quicktime based playback devices support soft vobsubs (bitmap) in mp4, we make sure
790 * "burned in" is specified by default to avoid massive confusion and anarchy. However we also want to guard against
791 * multiple burned in subtitle tracks as libhb would ignore all but the first one anyway. Plus it would probably be
794 if (container == HB_MUX_MP4 && [anObject intValue] != 0)
796 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
798 /* lets see if there are currently any burned in subs specified */
799 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
801 BOOL subtrackBurnedInFound = NO;
802 while ( tempObject = [enumerator nextObject] )
804 if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
806 subtrackBurnedInFound = YES;
809 /* if we have no current vobsub set to burn it in ... burn it in by default */
810 if(!subtrackBurnedInFound)
812 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
817 /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
818 * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
821 if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None"
823 /* add a new empty None track */
824 [self addSubtitleTrack];
827 else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed
829 /* we know the user chose to remove this track by setting it to None, so remove it from the array */
830 /* However,if this is the first track we have to reset the selected index of the next track by + 1, since it will now become
831 * the first track, which has to account for the extra "Foreign Language Search" index. */
832 if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0)
834 /* get the index of the selection in row one (which is track two) */
835 int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue];
836 /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */
837 [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"];
839 /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */
840 [subtitleArray removeObjectAtIndex: rowIndex];
847 [aTableView reloadData];
851 /* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */
852 - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
854 /* we setup whats displayed given the column identifier */
855 if ([[aTableColumn identifier] isEqualToString:@"track"])
857 /* Set the index of the recorded source track here */
858 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]];
859 /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */
860 [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"];
866 [aCell setAlignment:NSCenterTextAlignment];
867 /* If the Track is None, we disable the other cells as None is an empty track */
868 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0)
871 [aCell setEnabled:NO];
875 /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */
876 [aCell setEnabled:YES];
879 if ([[aTableColumn identifier] isEqualToString:@"forced"])
881 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
883 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
885 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
886 /* Disable the "Burned-In" checkbox if a) the track is "None" or b) the subtitle track is text but not ssa (we do not support burning in
887 * non-ssa text subs) */
888 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
889 [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackcanBeBurnedIn"] intValue] == 0)
891 [aCell setEnabled:NO];
895 [aCell setEnabled:YES];
898 else if ([[aTableColumn identifier] isEqualToString:@"default"])
900 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]];
902 /* These next three columns only apply to srt's. they are disabled for source subs */
903 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
905 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
906 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
908 [aCell setEnabled:YES];
909 if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"])
911 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]];
915 [aCell selectItemAtIndex:languagesArrayDefIndex]; // English
916 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
917 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
918 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
924 [aCell setEnabled:NO];
927 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
929 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
930 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
932 [aCell setEnabled:YES];
933 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"])
935 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]];
939 [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1
940 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
941 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
946 [aCell setEnabled:NO];
949 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
951 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
953 [aCell setEnabled:YES];
957 [aCell setEnabled:NO];