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 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
286 sub_config = subtitle->config;
288 int canBeBurnedIn = subtitle->source == VOBSUB || subtitle->source == SSASUB;
289 int supportsForcedFlags = subtitle->source == VOBSUB;
291 /* create a dictionary of source subtitle information to store in our array */
292 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
293 /* Subtitle Source track popup index */
294 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
295 /* Human-readable representation of subtitle->source */
296 NSString *subSourceName = [NSString stringWithUTF8String:hb_subsource_name( subtitle->source )];
297 NSString *bitmapOrText = subtitle->source == PICTURESUB ? @"Bitmap" : @"Text";
298 /* Subtitle Source track name */
299 NSString *popupName = [NSString stringWithFormat:@"%d - %@ - (%@) (%@)",i,[NSString stringWithUTF8String:subtitle->lang],bitmapOrText,subSourceName];
300 [newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
301 /* Subtitle Source track type (VobSub, Srt, etc.) */
302 [newSubtitleSourceTrack setObject:subSourceName forKey:@"sourceTrackType"];
303 /* Subtitle Source track canBeBurnedIn */
304 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:canBeBurnedIn] forKey:@"sourceTrackCanBeBurnedIn"];
305 /* Subtitle Source track supportsForcedFlags */
306 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:supportsForcedFlags] forKey:@"sourceTrackSupportsForcedFlags"];
308 [subtitleSourceArray addObject:newSubtitleSourceTrack];
309 [newSubtitleSourceTrack autorelease];
315 /* reset the subtitle output array */
318 [subtitleArray release];
320 subtitleArray = [[NSMutableArray alloc] init];
321 [self addSubtitleTrack];
325 #pragma mark Create new Subtitles
327 - (void)addSubtitleTrack
329 [subtitleArray addObject:[self createSubtitleTrack]];
332 /* Creates a new subtitle track and stores it in an NSMutableDictionary */
333 - (NSDictionary *)createSubtitleTrack
335 NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init];
336 /* Subtitle Source track popup index */
337 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
338 /* Subtitle Source track popup language */
339 [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
340 /* Subtitle track forced state */
341 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
342 /* Subtitle track burned state */
343 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
344 /* Subtitle track default state */
345 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
346 /* Subtitle Source track canBeBurnedIn */
347 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
348 /* Subtitle Source track supportsForcedFlags */
349 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
351 [newSubtitleTrack autorelease];
352 return newSubtitleTrack;
355 - (void)createSubtitleSrtTrack:(NSString *)filePath
357 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
358 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
359 /* create a dictionary of source subtitle information to store in our array */
360 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
361 /* Subtitle Source track popup index */
362 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
363 /* Subtitle Source track name */
364 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
365 /* Subtitle Source track type (VobSub, Srt, etc.) */
366 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
367 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
368 /* Subtitle Source file path */
369 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
370 /* Subtitle Source track canBeBurnedIn */
371 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
372 /* Subtitle Source track supportsForcedFlags */
373 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
375 [subtitleSourceArray addObject:newSubtitleSourceTrack];
376 [newSubtitleSourceTrack autorelease];
378 /* Now create a new srt subtitle dictionary assuming the user wants to add it to their list
379 * Note: the subtitle array always has last entry for "None", so we need to replace its
380 * position in the array and tack a "None" track back on the end of the list */
381 [subtitleArray removeObjectAtIndex:[subtitleArray count] - 1];
384 NSMutableDictionary *newSubtitleSrtTrack = [[NSMutableDictionary alloc] init];
385 /* Subtitle Source track popup index */
386 if ([subtitleArray count] == 0) // we now have an empty array so this will be our first track
388 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"];
392 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"];
395 [newSubtitleSrtTrack setObject:@"SRT" forKey:@"sourceTrackType"];
396 [newSubtitleSrtTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
397 /* Subtitle Source track popup language */
398 [newSubtitleSrtTrack setObject:displayname forKey:@"subtitleSourceTrackName"];
399 /* Subtitle track forced state */
400 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
401 /* Subtitle track burned state */
402 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
403 /* Subtitle track default state */
404 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
405 /* Subtitle Source track canBeBurnedIn */
406 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
407 /* Subtitle Source track supportsForcedFlags */
408 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
410 /* now the srt only info, Language, Chart Code and offset */
411 [newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
412 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
413 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
414 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
416 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
417 [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
419 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"];
422 [subtitleArray addObject:newSubtitleSrtTrack];
423 [newSubtitleSrtTrack release];
425 /* now add back the none track to the end of the array */
426 [self addSubtitleTrack];
431 /* used to return the current subtitleArray to controller.m */
432 - (NSMutableArray*) getSubtitleArray
434 return subtitleArray;
437 - (void)containerChanged:(int) newContainer
439 container = newContainer;
442 - (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
444 /* Note: we need to look for external subtitles so it can be added to the source array track.
445 * Remember the source container subs are already loaded with resetTitle which is already called
446 * so any external sub sources need to be added to our source subs here
450 NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
452 while ( tempObject = [enumerator nextObject] )
454 /* We have an srt track */
455 if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
457 NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"];
458 /* Start replicate the add new srt code above */
459 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
460 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
461 /* create a dictionary of source subtitle information to store in our array */
462 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
463 /* Subtitle Source track popup index */
464 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
465 /* Subtitle Source track name */
466 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
467 /* Subtitle Source track type (VobSub, Srt, etc.) */
468 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
469 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
470 /* Subtitle Source file path */
471 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
472 /* Subtitle Source track canBeBurnedIn */
473 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackCanBeBurnedIn"];
474 /* Subtitle Source track supportsForcedFlags */
475 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackSupportsForcedFlags"];
477 [subtitleSourceArray addObject:newSubtitleSourceTrack];
478 [newSubtitleSourceTrack autorelease];
479 /* END replicate the add new srt code above */
485 /*Set the subtitleArray to the newSubtitleArray */
486 [subtitleArray setArray:newSubtitleArray];
490 #pragma mark Subtitle Table Delegate Methods
491 /* Table View delegate methods */
492 /* Returns the number of tracks displayed
493 * NOTE: we return one more than the actual number of tracks
494 * specified as we always keep one track set to "None" which is ignored
495 * for setting up tracks, but is used to add tracks.
497 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
499 if( fTitle == NULL || ![subtitleArray count])
505 return [subtitleArray count];
509 /* Used to tell the Table view which information is to be displayed per item */
510 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
512 NSString *cellEntry = @"__DATA ERROR__";
514 /* we setup whats displayed given the column identifier */
515 if ([[aTableColumn identifier] isEqualToString:@"track"])
517 /* 'track' is a popup of all available source subtitle tracks for the given title */
518 NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init];
519 [cellTrackPopup autorelease];
520 /* Set the Popups properties */
521 [cellTrackPopup setControlSize:NSSmallControlSize];
522 [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
525 /* Add our initial "None" track which we use to add source tracks or remove tracks.
526 * "None" is always index 0.
528 [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""];
530 /* Foreign Audio Search (index 1 in the popup) is only available for the first track */
533 [[cellTrackPopup menu] addItemWithTitle: @"Foreign Audio Search - (Bitmap)" action: NULL keyEquivalent: @""];
537 for(i = 0; i < [subtitleSourceArray count]; i++ )
539 [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""];
543 [aTableColumn setDataCell:cellTrackPopup];
546 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
548 /* 'forced' is a checkbox to determine if a given source track is only to be forced */
549 NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init];
550 [cellForcedCheckBox autorelease];
551 [cellForcedCheckBox setButtonType:NSSwitchButton];
552 [cellForcedCheckBox setImagePosition:NSImageOnly];
553 [cellForcedCheckBox setAllowsMixedState:NO];
554 [aTableColumn setDataCell:cellForcedCheckBox];
557 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
559 /* 'burned' is a checkbox to determine if a given source track is only to be burned */
560 NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init];
561 [cellBurnedCheckBox autorelease];
562 [cellBurnedCheckBox setButtonType:NSSwitchButton];
563 [cellBurnedCheckBox setImagePosition:NSImageOnly];
564 [cellBurnedCheckBox setAllowsMixedState:NO];
565 [aTableColumn setDataCell:cellBurnedCheckBox];
567 else if ([[aTableColumn identifier] isEqualToString:@"default"])
569 NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init];
570 [cellDefaultCheckBox autorelease];
571 [cellDefaultCheckBox setButtonType:NSSwitchButton];
572 [cellDefaultCheckBox setImagePosition:NSImageOnly];
573 [cellDefaultCheckBox setAllowsMixedState:NO];
574 [aTableColumn setDataCell:cellDefaultCheckBox];
576 /* These next three columns only apply to srt's. they are disabled for source subs */
577 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
579 /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */
580 NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init];
581 [cellSrtLangPopup autorelease];
582 /* Set the Popups properties */
583 [cellSrtLangPopup setControlSize:NSSmallControlSize];
584 [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
585 /* list our languages as per the languagesArray */
587 for(i = 0; i < [languagesArray count]; i++ )
589 [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""];
591 [aTableColumn setDataCell:cellSrtLangPopup];
593 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
595 /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */
596 NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init];
597 [cellSrtCharCodePopup autorelease];
598 /* Set the Popups properties */
599 [cellSrtCharCodePopup setControlSize:NSSmallControlSize];
600 [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
601 /* list our character codes, as per charCodeArray */
604 for(i = 0; i < [charCodeArray count]; i++ )
606 [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""];
608 [aTableColumn setDataCell:cellSrtCharCodePopup];
611 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
613 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"])
615 cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]];
619 cellEntry = [NSString stringWithFormat:@"%d",0];
630 /* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array
631 * including removing and adding new tracks via the "None" ("track" index of 0) */
632 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
635 if ([[aTableColumn identifier] isEqualToString:@"track"])
637 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"];
638 /* Set the array to track if we are vobsub (picture sub) */
639 if ([anObject intValue] != 0)
641 int sourceSubtitleIndex;
645 sourceSubtitleIndex = [anObject intValue] - 2;
649 sourceSubtitleIndex = [anObject intValue] - 1;
652 if(rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search, which is inherently vobsub
654 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )] forKey:@"subtitleSourceTrackType"];
655 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackCanBeBurnedIn"];
656 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackSupportsForcedFlags"];
657 // foreign lang search is most useful when combined w/Forced Only - make it default
658 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackForced"];
660 /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
661 else if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
663 [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
664 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
668 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] forKey:@"subtitleSourceTrackType"];
669 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackCanBeBurnedIn"] intValue]]
670 forKey:@"subtitleSourceTrackCanBeBurnedIn"];
671 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackSupportsForcedFlags"] intValue]]
672 forKey:@"subtitleSourceTrackSupportsForcedFlags"];
675 if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
677 /* the source track cannot be burned in, so uncheck the widget */
678 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
681 if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
683 /* the source track does not support forced flags, so uncheck the widget */
684 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
688 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
690 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"];
692 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
694 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
695 if([anObject intValue] == 1)
697 /* Burned In and Default are mutually exclusive */
698 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
700 /* now we need to make sure no other tracks are set to burned if we have set burned */
701 if ([anObject intValue] == 1)
704 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
706 while ( tempObject = [enumerator nextObject] )
710 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
716 else if ([[aTableColumn identifier] isEqualToString:@"default"])
718 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
719 if([anObject intValue] == 1)
721 /* Burned In and Default are mutually exclusive */
722 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
724 /* now we need to make sure no other tracks are set to default */
725 if ([anObject intValue] == 1)
728 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
730 while ( tempObject = [enumerator nextObject] )
734 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
741 /* These next three columns only apply to srt's. they are disabled for source subs */
742 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
745 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"];
746 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
747 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
750 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
753 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"];
754 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"];
756 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
758 [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"];
762 /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */
763 if ([[aTableColumn identifier] isEqualToString:@"track"])
766 /* Since currently no quicktime based playback devices support soft vobsubs in mp4, we make sure "burned in" is specified
767 * by default to avoid massive confusion and anarchy. However we also want to guard against multiple burned in subtitle tracks
768 * as libhb would ignore all but the first one anyway. Plus it would probably be stupid.
770 if (container == HB_MUX_MP4 && [anObject intValue] != 0)
772 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )]])
774 /* lets see if there are currently any burned in subs specified */
775 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
777 BOOL subtrackBurnedInFound = NO;
778 while ( tempObject = [enumerator nextObject] )
780 if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
782 subtrackBurnedInFound = YES;
785 /* if we have no current vobsub set to burn it in ... burn it in by default */
786 if(!subtrackBurnedInFound)
788 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
789 /* Burned In and Default are mutually exclusive */
790 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
795 /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
796 * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
799 if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None"
801 /* add a new empty None track */
802 [self addSubtitleTrack];
805 else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed
807 /* we know the user chose to remove this track by setting it to None, so remove it from the array */
808 /* 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
809 * the first track, which has to account for the extra "Foreign Language Search" index. */
810 if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0)
812 /* get the index of the selection in row one (which is track two) */
813 int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue];
814 /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */
815 [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"];
817 /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */
818 [subtitleArray removeObjectAtIndex: rowIndex];
825 [aTableView reloadData];
829 /* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */
830 - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
832 /* we setup whats displayed given the column identifier */
833 if ([[aTableColumn identifier] isEqualToString:@"track"])
835 /* Set the index of the recorded source track here */
836 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]];
837 /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */
838 [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"];
844 [aCell setAlignment:NSCenterTextAlignment];
845 /* If the Track is None, we disable the other cells as None is an empty track */
846 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0)
849 [aCell setEnabled:NO];
853 /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */
854 [aCell setEnabled:YES];
857 if ([[aTableColumn identifier] isEqualToString:@"forced"])
859 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
860 /* Disable the "Forced Only" checkbox if a) the track is "None" or b) the subtitle track doesn't support forced flags */
861 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
862 [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
864 [aCell setEnabled:NO];
868 [aCell setEnabled:YES];
871 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
873 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
874 /* Disable the "Burned In" checkbox if a) the track is "None" or b) the subtitle track can't be burned in */
875 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
876 [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
878 [aCell setEnabled:NO];
882 [aCell setEnabled:YES];
885 else if ([[aTableColumn identifier] isEqualToString:@"default"])
887 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]];
889 /* These next three columns only apply to srt's. they are disabled for source subs */
890 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
892 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
893 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
895 [aCell setEnabled:YES];
896 if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"])
898 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]];
902 [aCell selectItemAtIndex:languagesArrayDefIndex]; // English
903 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
904 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
905 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
911 [aCell setEnabled:NO];
914 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
916 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
917 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
919 [aCell setEnabled:YES];
920 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"])
922 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]];
926 [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1
927 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
928 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
933 [aCell setEnabled:NO];
936 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
938 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
940 [aCell setEnabled:YES];
944 [aCell setEnabled:NO];