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 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
288 sub_config = subtitle->config;
290 if (subtitle->format == PICTURESUB)
292 trackTypeString = @"- (Bitmap)";
297 trackTypeString = @"- (Text)";
300 /* create a dictionary of source subtitle information to store in our array */
301 NSString *popupName = [NSString stringWithFormat:@"%d - %@ %@",i,[NSString stringWithUTF8String:subtitle->lang],trackTypeString];
302 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
303 /* Subtitle Source track popup index */
304 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:i] forKey:@"sourceTrackNum"];
305 /* Subtitle Source track type */
306 [newSubtitleSourceTrack setObject:popupName forKey:@"sourceTrackName"];
307 /* Subtitle Source track type (Source, Srt, etc.) */
308 [newSubtitleSourceTrack setObject:@"Source" forKey:@"sourceTrackType"];
309 /* Subtitle Source track popup isPictureSub */
310 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:isPictureSub] forKey:@"sourceTrackisPictureSub"];
312 [subtitleSourceArray addObject:newSubtitleSourceTrack];
313 [newSubtitleSourceTrack autorelease];
319 /* reset the subtitle output array */
322 [subtitleArray release];
324 subtitleArray = [[NSMutableArray alloc] init];
325 [self addSubtitleTrack];
329 #pragma mark Create new Subtitles
331 - (void)addSubtitleTrack
333 [subtitleArray addObject:[self createSubtitleTrack]];
336 /* Creates a new subtitle track and stores it in an NSMutableDictionary */
337 - (NSDictionary *)createSubtitleTrack
339 NSMutableDictionary *newSubtitleTrack = [[NSMutableDictionary alloc] init];
340 /* Subtitle Source track popup index */
341 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackNum"];
342 /* Subtitle Source track popup language */
343 [newSubtitleTrack setObject:@"None" forKey:@"subtitleSourceTrackName"];
344 /* Subtitle Source track popup isPictureSub */
345 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
346 /* Subtitle track forced state */
347 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
348 /* Subtitle track burned state */
349 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
350 /* Subtitle track default state */
351 [newSubtitleTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
353 [newSubtitleTrack autorelease];
354 return newSubtitleTrack;
357 - (void)createSubtitleSrtTrack:(NSString *)filePath
359 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
360 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
361 /* create a dictionary of source subtitle information to store in our array */
362 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
363 /* Subtitle Source track popup index */
364 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
365 /* Subtitle Source track type */
366 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
367 /* Subtitle Source track type (Source, Srt, etc.) */
368 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
369 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
370 /* Subtitle Source track type */
371 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
372 /* Subtitle Source track popup isPictureSub */
373 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
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 Source track popup isPictureSub */
400 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
401 /* Subtitle track forced state */
402 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
403 /* Subtitle track burned state */
404 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
405 /* Subtitle track default state */
406 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
408 /* now the srt only info, Language, Chart Code and offset */
409 [newSubtitleSrtTrack setObject:filePath forKey:@"subtitleSourceSrtFilePath"];
410 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
411 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
412 [newSubtitleSrtTrack setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
414 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
415 [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
417 [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"];
420 [subtitleArray addObject:newSubtitleSrtTrack];
421 [newSubtitleSrtTrack release];
423 /* now add back the none track to the end of the array */
424 [self addSubtitleTrack];
429 /* used to return the current subtitleArray to controller.m */
430 - (NSMutableArray*) getSubtitleArray
432 return subtitleArray;
435 - (void)containerChanged:(int) newContainer
437 container = newContainer;
440 - (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
442 /* Note: we need to look for external subtitles so it can be added to the source array track.
443 * Remember the source container subs are already loaded with resetTitle which is already called
444 * so any external sub sources need to be added to our source subs here
448 NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
450 while ( tempObject = [enumerator nextObject] )
452 /* We have an srt track */
453 if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
455 NSString *filePath = [tempObject objectForKey:@"subtitleSourceSrtFilePath"];
456 /* Start replicate the add new srt code above */
457 /* Create a new entry for the subtitle source array so it shows up in our subtitle source list */
458 NSString *displayname = [filePath lastPathComponent];// grok an appropriate display name from the srt subtitle */
459 /* create a dictionary of source subtitle information to store in our array */
460 NSMutableDictionary *newSubtitleSourceTrack = [[NSMutableDictionary alloc] init];
461 /* Subtitle Source track popup index */
462 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]+1] forKey:@"sourceTrackNum"];
463 /* Subtitle Source track type */
464 [newSubtitleSourceTrack setObject:displayname forKey:@"sourceTrackName"];
465 /* Subtitle Source track type (Source, Srt, etc.) */
466 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"sourceTrackType"];
467 [newSubtitleSourceTrack setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
468 /* Subtitle Source track type */
469 [newSubtitleSourceTrack setObject:filePath forKey:@"sourceSrtFilePath"];
470 /* Subtitle Source track popup isPictureSub */
471 [newSubtitleSourceTrack setObject:[NSNumber numberWithInt:0] forKey:@"sourceTrackisPictureSub"];
473 [subtitleSourceArray addObject:newSubtitleSourceTrack];
474 [newSubtitleSourceTrack autorelease];
475 /* END replicate the add new srt code above */
481 /*Set the subtitleArray to the newSubtitleArray */
482 [subtitleArray setArray:newSubtitleArray];
486 #pragma mark Subtitle Table Delegate Methods
487 /* Table View delegate methods */
488 /* Returns the number of tracks displayed
489 * NOTE: we return one more than the actual number of tracks
490 * specified as we always keep one track set to "None" which is ignored
491 * for setting up tracks, but is used to add tracks.
493 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
495 if( fTitle == NULL || ![subtitleArray count])
501 return [subtitleArray count];
505 /* Used to tell the Table view which information is to be displayed per item */
506 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
508 NSString *cellEntry = @"__DATA ERROR__";
510 /* we setup whats displayed given the column identifier */
511 if ([[aTableColumn identifier] isEqualToString:@"track"])
513 /* 'track' is a popup of all available source subtitle tracks for the given title */
514 NSPopUpButtonCell *cellTrackPopup = [[NSPopUpButtonCell alloc] init];
515 [cellTrackPopup autorelease];
516 /* Set the Popups properties */
517 [cellTrackPopup setControlSize:NSSmallControlSize];
518 [cellTrackPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
521 /* Add our initial "None" track which we use to add source tracks or remove tracks.
522 * "None" is always index 0.
524 [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""];
526 /* Foreign Audio Search (index 1 in the popup) is only available for the first track */
529 [[cellTrackPopup menu] addItemWithTitle: @"Foreign Audio Search - (Bitmap)" action: NULL keyEquivalent: @""];
533 for(i = 0; i < [subtitleSourceArray count]; i++ )
535 [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""];
539 [aTableColumn setDataCell:cellTrackPopup];
542 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
544 /* 'forced' is a checkbox to determine if a given source track is only to be forced */
545 NSButtonCell *cellForcedCheckBox = [[NSButtonCell alloc] init];
546 [cellForcedCheckBox autorelease];
547 [cellForcedCheckBox setButtonType:NSSwitchButton];
548 [cellForcedCheckBox setImagePosition:NSImageOnly];
549 [cellForcedCheckBox setAllowsMixedState:NO];
550 [aTableColumn setDataCell:cellForcedCheckBox];
553 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
555 /* 'burned' is a checkbox to determine if a given source track is only to be burned */
556 NSButtonCell *cellBurnedCheckBox = [[NSButtonCell alloc] init];
557 [cellBurnedCheckBox autorelease];
558 [cellBurnedCheckBox setButtonType:NSSwitchButton];
559 [cellBurnedCheckBox setImagePosition:NSImageOnly];
560 [cellBurnedCheckBox setAllowsMixedState:NO];
561 [aTableColumn setDataCell:cellBurnedCheckBox];
563 else if ([[aTableColumn identifier] isEqualToString:@"default"])
565 NSButtonCell *cellDefaultCheckBox = [[NSButtonCell alloc] init];
566 [cellDefaultCheckBox autorelease];
567 [cellDefaultCheckBox setButtonType:NSSwitchButton];
568 [cellDefaultCheckBox setImagePosition:NSImageOnly];
569 [cellDefaultCheckBox setAllowsMixedState:NO];
570 [aTableColumn setDataCell:cellDefaultCheckBox];
572 /* These next three columns only apply to srt's. they are disabled for source subs */
573 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
575 /* 'srt_lang' is a popup of commonly used languages to be matched to the source srt file */
576 NSPopUpButtonCell *cellSrtLangPopup = [[NSPopUpButtonCell alloc] init];
577 [cellSrtLangPopup autorelease];
578 /* Set the Popups properties */
579 [cellSrtLangPopup setControlSize:NSSmallControlSize];
580 [cellSrtLangPopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
581 /* list our languages as per the languagesArray */
583 for(i = 0; i < [languagesArray count]; i++ )
585 [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""];
587 [aTableColumn setDataCell:cellSrtLangPopup];
589 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
591 /* 'srt_charcode' is a popup of commonly used character codes to be matched to the source srt file */
592 NSPopUpButtonCell *cellSrtCharCodePopup = [[NSPopUpButtonCell alloc] init];
593 [cellSrtCharCodePopup autorelease];
594 /* Set the Popups properties */
595 [cellSrtCharCodePopup setControlSize:NSSmallControlSize];
596 [cellSrtCharCodePopup setFont:[NSFont systemFontOfSize:[NSFont systemFontSizeForControlSize:NSSmallControlSize]]];
597 /* list our character codes, as per charCodeArray */
600 for(i = 0; i < [charCodeArray count]; i++ )
602 [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""];
604 [aTableColumn setDataCell:cellSrtCharCodePopup];
607 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
609 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"])
611 cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]];
615 cellEntry = [NSString stringWithFormat:@"%d",0];
626 /* Called whenever a widget in the table is edited or changed, we use it to record the change in the controlling array
627 * including removing and adding new tracks via the "None" ("track" index of 0) */
628 - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
631 if ([[aTableColumn identifier] isEqualToString:@"track"])
633 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleSourceTrackNum"];
634 /* Set the array to track if we are vobsub (picture sub) */
635 if ([anObject intValue] != 0)
637 int sourceSubtitleIndex;
638 bool isPictureSub = FALSE;
642 sourceSubtitleIndex = [anObject intValue] - 2;
646 sourceSubtitleIndex = [anObject intValue] - 1;
649 if (rowIndex == 0 && [anObject intValue] == 1)// we are Foreign Launguage Search, which is inherently bitmap
655 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackisPictureSub"] intValue] ==1)
660 if (isPictureSub == TRUE)
662 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleSourceTrackisPictureSub"];
666 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleSourceTrackisPictureSub"];
667 /* if we are not picture sub, then we must be a text sub, handbrake does not support burning in text subs */
668 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
671 /* check to see if we are an srt, in which case set our file path and source track type kvp's*/
673 if (rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search
675 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
679 if ([[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceTrackType"] isEqualToString:@"SRT"])
681 [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
682 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
686 [[subtitleArray objectAtIndex:rowIndex] setObject:@"Source" forKey:@"subtitleSourceTrackType"];
692 else if ([[aTableColumn identifier] isEqualToString:@"forced"])
694 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"];
696 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
698 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
699 /* now we need to make sure no other tracks are set to burned if we have set burned*/
700 if ([anObject intValue] == 1)
703 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
705 while ( tempObject = [enumerator nextObject] )
709 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
715 else if ([[aTableColumn identifier] isEqualToString:@"default"])
717 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
718 /* now we need to make sure no other tracks are set to default */
719 if ([anObject intValue] == 1)
722 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
724 while ( tempObject = [enumerator nextObject] )
728 [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
735 /* These next three columns only apply to srt's. they are disabled for source subs */
736 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
739 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtLanguageIndex"];
740 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
741 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:[anObject intValue]] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
744 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
747 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"];
748 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"];
750 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
752 [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"];
756 /* now lets do a bit of logic to add / remove tracks as necessary via the "None" track (index 0) */
757 if ([[aTableColumn identifier] isEqualToString:@"track"])
760 /* since mp4 only supports burned in vobsubs (bitmap) we need to make sure burned in is specified */
761 if (container == HB_MUX_MP4 && [anObject intValue] != 0)
763 /* so, if isPictureSub = TRUE and we are mp4, we now have to A) set burned-in to 1 and b) remove any other
764 * tracks specified that are burned in */
765 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
767 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
772 /* We use the track popup index number (presumes index 0 is "None" which is ignored and only used to remove tracks if need be)
773 * to determine whether to 1 modify an existing track, 2. add a new empty "None" track or 3. remove an existing track.
776 if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None"
778 /* add a new empty None track */
779 [self addSubtitleTrack];
782 else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed
784 /* we know the user chose to remove this track by setting it to None, so remove it from the array */
785 /* 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
786 * the first track, which has to account for the extra "Foreign Language Search" index. */
787 if (rowIndex == 0 && [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue] != 0)
789 /* get the index of the selection in row one (which is track two) */
790 int trackOneSelectedIndex = [[[subtitleArray objectAtIndex: 1] objectForKey: @"subtitleSourceTrackNum"] intValue];
791 /* increment the index of the subtitle menu item by one, to account for Foreign Language Search which is unique to the first track */
792 [[subtitleArray objectAtIndex: 1] setObject:[NSNumber numberWithInt:trackOneSelectedIndex + 1] forKey:@"subtitleSourceTrackNum"];
794 /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */
795 [subtitleArray removeObjectAtIndex: rowIndex];
802 [aTableView reloadData];
806 /* Gives fine grained control over the final drawing of the widget, including widget status via the controlling array */
807 - (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
809 /* we setup whats displayed given the column identifier */
810 if ([[aTableColumn identifier] isEqualToString:@"track"])
812 /* Set the index of the recorded source track here */
813 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue]];
814 /* now that we have actually selected our track, we can grok the titleOfSelectedItem for that track */
815 [[subtitleArray objectAtIndex:rowIndex] setObject:[[aTableColumn dataCellForRow:rowIndex] titleOfSelectedItem] forKey:@"subtitleSourceTrackName"];
821 [aCell setAlignment:NSCenterTextAlignment];
822 /* If the Track is None, we disable the other cells as None is an empty track */
823 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0)
826 [aCell setEnabled:NO];
830 /* Since we have a valid track, we go ahead and enable the rest of the widgets and set them according to the controlling array */
831 [aCell setEnabled:YES];
834 if ([[aTableColumn identifier] isEqualToString:@"forced"])
836 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackForced"] intValue]];
838 else if ([[aTableColumn identifier] isEqualToString:@"burned"])
840 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackBurned"] intValue]];
841 /* Disable the "Burned-In" checkbox if a) the track is "None", b) the subtitle track is text (we do not support burning in
842 * text subs, or c) we are mp4 and the track is a vobsub (picture sub) */
843 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackNum"] intValue] == 0 ||
844 [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 0 ||
845 (container == HB_MUX_MP4 && [[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1))
847 [aCell setEnabled:NO];
851 [aCell setEnabled:YES];
854 else if ([[aTableColumn identifier] isEqualToString:@"default"])
856 [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]];
858 /* These next three columns only apply to srt's. they are disabled for source subs */
859 else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
861 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
862 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
864 [aCell setEnabled:YES];
865 if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"])
867 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]];
871 [aCell selectItemAtIndex:languagesArrayDefIndex]; // English
872 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:languagesArrayDefIndex] forKey:@"subtitleTrackSrtLanguageIndex"];
873 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:0] forKey:@"subtitleTrackSrtLanguageLong"];
874 [[subtitleArray objectAtIndex:rowIndex] setObject:[[languagesArray objectAtIndex:languagesArrayDefIndex] objectAtIndex:1] forKey:@"subtitleTrackSrtLanguageIso3"];
880 [aCell setEnabled:NO];
883 else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
885 /* We have an srt file so set the track type (Source or SRT, and the srt file path ) kvp's*/
886 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
888 [aCell setEnabled:YES];
889 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"])
891 [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]];
895 [aCell selectItemAtIndex:charCodeArrayDefIndex]; // ISO-8859-1
896 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
897 [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
902 [aCell setEnabled:NO];
905 else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
907 if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
909 [aCell setEnabled:YES];
913 [aCell setEnabled:NO];
920 if (container == HB_MUX_MP4)
922 /* now remove any other tracks that are set as burned and are picturesubs */
924 int removedTracks = 0;
925 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
927 NSMutableArray *tempArrayToDelete = [NSMutableArray array];
928 BOOL removeTrack = NO;
929 while ( tempObject = [enumerator nextObject] )
932 if ([[tempObject objectForKey:@"subtitleSourceTrackisPictureSub"] intValue] == 1)
934 /* if this is the first vobsub mark it. if not, remove it */
935 if (removeTrack == NO)
937 /* make sure that this is set to be burned in */
938 [tempObject setObject:[NSNumber numberWithInt:1] forKey:@"subtitleTrackBurned"];
943 [tempArrayToDelete addObject:tempObject];
950 /* check to see if there are tracks to remove from the array */
951 if ([tempArrayToDelete count] > 0)
953 /* Popup a warning that hb only support one pic sub being burned in with mp4 */
955 status = NSRunAlertPanel(@"More than one vobsub is not supported in an mp4...",@"Your first vobsub track will now be used.", @"OK", nil, nil);
956 [NSApp requestUserAttention:NSCriticalRequest];
958 [subtitleArray removeObjectsInArray:tempArrayToDelete];
959 [aTableView reloadData];