OSDN Git Service

Revert "fix to compile without subwcrev.exe"
[handbrake-jp/handbrake-jp-git.git] / macosx / HBSubtitles.m
1 /* $Id: HBSubtitles.m,v 1.35 2005/08/01 14:29:50 titer Exp $
2
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. */
6 //
7
8 #import "HBSubtitles.h"
9 #include "hb.h"
10
11
12
13
14
15
16
17
18 @implementation HBSubtitles
19 - (id)init 
20 {
21     self = [super init];
22     if( self != nil )
23     {
24         fTitle = NULL;
25     }
26     
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]];
214    
215     languagesArrayDefIndex = 40;
216    
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"];
254     
255     charCodeArrayDefIndex = 11;
256     
257     return self;
258 }
259
260
261 - (void)resetWithTitle:(hb_title_t *)title
262 {
263     fTitle = title;
264     
265     if (!title)
266     {
267         return;
268     }
269     
270     /* reset the subtitle source array */
271     if (subtitleSourceArray)
272     {
273         [subtitleSourceArray release];
274     }
275     subtitleSourceArray = [[NSMutableArray alloc] init];
276     
277     /* now populate the array with the source subtitle track info */
278     if (fTitle)
279         {
280             hb_subtitle_t *subtitle;
281             hb_subtitle_config_t sub_config;
282             int i;
283             for(i = 0; i < hb_list_count( fTitle->list_subtitle ); i++ )
284             {
285                 subtitle = (hb_subtitle_t *) hb_list_item( fTitle->list_subtitle, i );
286                 sub_config = subtitle->config;
287                 
288                 int canBeBurnedIn = subtitle->source == VOBSUB || subtitle->source == SSASUB;
289                 int supportsForcedFlags = subtitle->source == VOBSUB;
290                 
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"];
307                 
308                 [subtitleSourceArray addObject:newSubtitleSourceTrack];
309                 [newSubtitleSourceTrack autorelease];
310             }
311         }
312     
313     
314     
315     /* reset the subtitle output array */
316     if (subtitleArray)
317     {
318         [subtitleArray release];
319     }
320     subtitleArray = [[NSMutableArray alloc] init];
321     [self addSubtitleTrack];
322 }
323
324 #pragma mark -
325 #pragma mark Create new Subtitles
326
327 - (void)addSubtitleTrack
328 {
329     [subtitleArray addObject:[self createSubtitleTrack]];
330 }
331
332 /* Creates a new subtitle track and stores it in an NSMutableDictionary */
333 - (NSDictionary *)createSubtitleTrack
334 {
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"];
350
351     [newSubtitleTrack autorelease];
352     return newSubtitleTrack;
353 }
354
355 - (void)createSubtitleSrtTrack:(NSString *)filePath
356 {
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"];
374     
375     [subtitleSourceArray addObject:newSubtitleSourceTrack];
376     [newSubtitleSourceTrack autorelease];
377     
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];
382     
383     
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
387     {
388         [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count] + 1] forKey:@"subtitleSourceTrackNum"];
389     }
390     else
391     {
392         [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:[subtitleSourceArray count]] forKey:@"subtitleSourceTrackNum"];
393     }
394     
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"];
409     
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"];
415     
416     [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCodeIndex"];
417     [newSubtitleSrtTrack setObject:[charCodeArray objectAtIndex:charCodeArrayDefIndex] forKey:@"subtitleTrackSrtCharCode"];
418                     
419     [newSubtitleSrtTrack setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackSrtOffset"];
420     
421     
422     [subtitleArray addObject:newSubtitleSrtTrack];
423     [newSubtitleSrtTrack release];
424     
425     /* now add back the none track to the end of the array */
426     [self addSubtitleTrack];
427     
428     
429 }
430
431 /* used to return the current subtitleArray to controller.m */
432 - (NSMutableArray*) getSubtitleArray
433 {
434     return subtitleArray;
435 }
436
437 - (void)containerChanged:(int) newContainer
438 {
439     container = newContainer;
440 }
441
442 - (void)setNewSubtitles:(NSMutableArray*) newSubtitleArray
443 {
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
447      */
448     
449     int i = 0;
450     NSEnumerator *enumerator = [newSubtitleArray objectEnumerator];
451     id tempObject;
452     while ( tempObject = [enumerator nextObject] )  
453     {
454         /* We have an srt track */
455         if ([[tempObject objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
456         {
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"];
476             
477             [subtitleSourceArray addObject:newSubtitleSourceTrack];
478             [newSubtitleSourceTrack autorelease];
479             /* END replicate the add new srt code above */
480         }
481         i++;
482     }
483     
484     
485     /*Set the subtitleArray to the newSubtitleArray */
486     [subtitleArray setArray:newSubtitleArray];
487 }
488    
489 #pragma mark -
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.
496  */
497 - (int)numberOfRowsInTableView:(NSTableView *)aTableView
498 {
499     if( fTitle == NULL || ![subtitleArray count])
500     {
501         return 0;
502     }
503     else
504     {
505         return [subtitleArray count];
506     }
507 }
508
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
511 {
512     NSString *cellEntry = @"__DATA ERROR__";
513     
514     /* we setup whats displayed given the column identifier */
515     if ([[aTableColumn identifier] isEqualToString:@"track"])
516     {
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]]];
523         
524         
525         /* Add our initial "None" track which we use to add source tracks or remove tracks.
526          * "None" is always index 0.
527          */
528         [[cellTrackPopup menu] addItemWithTitle: @"None" action: NULL keyEquivalent: @""];
529         
530         /* Foreign Audio Search (index 1 in the popup) is only available for the first track */
531         if (rowIndex == 0)
532         {
533             [[cellTrackPopup menu] addItemWithTitle: @"Foreign Audio Search - (Bitmap)" action: NULL keyEquivalent: @""];
534         }
535         
536         int i;
537         for(i = 0; i < [subtitleSourceArray count]; i++ )
538         {
539             [[cellTrackPopup menu] addItemWithTitle: [[subtitleSourceArray objectAtIndex:i] objectForKey: @"sourceTrackName"] action: NULL keyEquivalent: @""]; 
540         }
541         
542         
543         [aTableColumn setDataCell:cellTrackPopup];
544         
545     }
546     else if ([[aTableColumn identifier] isEqualToString:@"forced"])
547     {
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];
555         
556     }
557     else if ([[aTableColumn identifier] isEqualToString:@"burned"])
558     {
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];
566     }
567     else if ([[aTableColumn identifier] isEqualToString:@"default"])
568     {
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];
575     }
576     /* These next three columns only apply to srt's. they are disabled for source subs */
577     else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
578     {
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 */
586         int i;
587         for(i = 0; i < [languagesArray count]; i++ )
588         {
589             [[cellSrtLangPopup menu] addItemWithTitle: [[languagesArray objectAtIndex:i] objectAtIndex:0] action: NULL keyEquivalent: @""]; 
590         }
591         [aTableColumn setDataCell:cellSrtLangPopup]; 
592     }
593     else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
594     {
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 */
602         
603         int i;
604         for(i = 0; i < [charCodeArray count]; i++ )
605         {
606             [[cellSrtCharCodePopup menu] addItemWithTitle: [charCodeArray objectAtIndex:i] action: NULL keyEquivalent: @""]; 
607         }
608         [aTableColumn setDataCell:cellSrtCharCodePopup];
609         
610     }
611     else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
612     {
613         if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"])
614         {
615             cellEntry = [NSString stringWithFormat:@"%d",[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtOffset"] intValue]];
616         }
617         else
618         {
619             cellEntry = [NSString stringWithFormat:@"%d",0];
620         }
621     }
622     else
623     {
624         cellEntry = nil;    
625     }
626     
627     return cellEntry;
628 }
629
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
633 {
634     
635     if ([[aTableColumn identifier] isEqualToString:@"track"])
636     {
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)
640         {
641             int sourceSubtitleIndex;
642             
643             if (rowIndex == 0)
644             {
645                 sourceSubtitleIndex = [anObject intValue] - 2;
646             }
647             else
648             {
649                 sourceSubtitleIndex = [anObject intValue] - 1;
650             }
651             
652             if(rowIndex == 0 && [anObject intValue] == 1) // we are foreign lang search, which is inherently vobsub
653             {
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"];
659             }
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"])
662             {
663                 [[subtitleArray objectAtIndex:rowIndex] setObject:@"SRT" forKey:@"subtitleSourceTrackType"];
664                 [[subtitleArray objectAtIndex:rowIndex] setObject:[[subtitleSourceArray objectAtIndex:sourceSubtitleIndex] objectForKey:@"sourceSrtFilePath"] forKey:@"subtitleSourceSrtFilePath"];
665             }
666             else
667             {
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"];
673             } 
674             
675             if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackCanBeBurnedIn"] intValue] == 0)
676             {
677                 /* the source track cannot be burned in, so uncheck the widget */
678                 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
679             }
680              
681             if([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackSupportsForcedFlags"] intValue] == 0)
682             {
683                 /* the source track does not support forced flags, so uncheck the widget */
684                 [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackForced"];
685             }
686         }
687     }
688     else if ([[aTableColumn identifier] isEqualToString:@"forced"])
689     {
690         [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackForced"];   
691     }
692     else if ([[aTableColumn identifier] isEqualToString:@"burned"])
693     {
694         [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackBurned"];
695         if([anObject intValue] == 1)
696         {
697             /* Burned In and Default are mutually exclusive */
698             [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
699         }
700         /* now we need to make sure no other tracks are set to burned if we have set burned */
701         if ([anObject intValue] == 1)
702         {
703             int i = 0;
704             NSEnumerator *enumerator = [subtitleArray objectEnumerator];
705             id tempObject;
706             while ( tempObject = [enumerator nextObject] )  
707             {
708                 if (i != rowIndex )
709                 {
710                     [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
711                 }
712                 i++;
713             }
714         }
715     }
716     else if ([[aTableColumn identifier] isEqualToString:@"default"])
717     {
718         [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackDefault"];
719         if([anObject intValue] == 1)
720         {
721             /* Burned In and Default are mutually exclusive */
722             [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackBurned"];
723         }   
724         /* now we need to make sure no other tracks are set to default */
725         if ([anObject intValue] == 1)
726         {
727             int i = 0;
728             NSEnumerator *enumerator = [subtitleArray objectEnumerator];
729             id tempObject;
730             while ( tempObject = [enumerator nextObject] )  
731             {
732                 if (i != rowIndex)
733                 {
734                     [tempObject setObject:[NSNumber numberWithInt:0] forKey:@"subtitleTrackDefault"];
735                 }
736                 i++;
737             }
738         }
739         
740     }
741     /* These next three columns only apply to srt's. they are disabled for source subs */
742     else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
743     {
744         
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"];
748         
749     }
750     else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
751     {
752         /* charCodeArray */
753         [[subtitleArray objectAtIndex:rowIndex] setObject:[NSNumber numberWithInt:[anObject intValue]] forKey:@"subtitleTrackSrtCharCodeIndex"];
754         [[subtitleArray objectAtIndex:rowIndex] setObject:[charCodeArray objectAtIndex:[anObject intValue]] forKey:@"subtitleTrackSrtCharCode"];
755     }
756     else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
757     {
758         [[subtitleArray objectAtIndex:rowIndex] setObject:anObject forKey:@"subtitleTrackSrtOffset"];  
759     } 
760     
761     
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"])
764     {
765         
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. 
769          */
770         if (container == HB_MUX_MP4 && [anObject intValue] != 0)
771         {
772             if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:[NSString stringWithUTF8String:hb_subsource_name( VOBSUB )]])
773             {
774                 /* lets see if there are currently any burned in subs specified */
775                 NSEnumerator *enumerator = [subtitleArray objectEnumerator];
776                 id tempObject;
777                 BOOL subtrackBurnedInFound = NO;
778                 while ( tempObject = [enumerator nextObject] )  
779                 {
780                     if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
781                     {
782                         subtrackBurnedInFound = YES;
783                     }
784                 }
785                 /* if we have no current vobsub set to burn it in ... burn it in by default */
786                 if(!subtrackBurnedInFound)
787                 {
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"];
791                 }
792             }
793         }
794         
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.
797          */
798         
799         if ([anObject intValue] != 0 && rowIndex == [subtitleArray count] - 1) // if we have a last track which != "None"
800         {
801             /* add a new empty None track */
802             [self addSubtitleTrack];
803             
804         }
805         else if ([anObject intValue] == 0 && rowIndex != ([subtitleArray count] -1))// if this track is set to "None" and not the last track displayed
806         {
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)
811             {
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"];
816             }
817             /* now that we have made the adjustment for track one (index 0) go ahead and delete the track */
818             [subtitleArray removeObjectAtIndex: rowIndex]; 
819         }
820         
821         
822         
823     }
824     
825     [aTableView reloadData];
826 }
827
828
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
831 {
832     /* we setup whats displayed given the column identifier */
833     if ([[aTableColumn identifier] isEqualToString:@"track"])
834     {
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"];
839         
840     }
841     else
842     {
843         
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)
847         {
848             [aCell setState:0];
849             [aCell setEnabled:NO];
850         }
851         else
852         {
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];
855         }
856         
857         if ([[aTableColumn identifier] isEqualToString:@"forced"])
858         {
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)
863             {
864                 [aCell setEnabled:NO];
865             }
866             else
867             {
868                 [aCell setEnabled:YES];
869             }
870         }
871         else if ([[aTableColumn identifier] isEqualToString:@"burned"])
872         {
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)
877             {
878                 [aCell setEnabled:NO];
879             }
880             else
881             {
882                 [aCell setEnabled:YES];
883             }
884         }
885         else if ([[aTableColumn identifier] isEqualToString:@"default"])
886         {
887             [aCell setState:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackDefault"] intValue]];   
888         }
889         /* These next three columns only apply to srt's. they are disabled for source subs */
890         else if ([[aTableColumn identifier] isEqualToString:@"srt_lang"])
891         {
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"])
894             {
895                 [aCell setEnabled:YES];
896                 if([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"])
897                 {
898                     [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtLanguageIndex"] intValue]];
899                 }
900                 else
901                 {
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"];
906                     
907                 }
908             }
909             else
910             {
911                 [aCell setEnabled:NO];
912             }  
913         }
914         else if ([[aTableColumn identifier] isEqualToString:@"srt_charcode"])
915         {
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"])
918             {
919                 [aCell setEnabled:YES];
920                 if ([[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"])
921                 {
922                     [aCell selectItemAtIndex:[[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleTrackSrtCharCodeIndex"] intValue]];
923                 }
924                 else
925                 {
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"];
929                 }
930             }
931             else
932             {
933                 [aCell setEnabled:NO];
934             }   
935         }
936         else if ([[aTableColumn identifier] isEqualToString:@"srt_offset"])
937         {
938             if ([[[subtitleArray objectAtIndex:rowIndex] objectForKey:@"subtitleSourceTrackType"] isEqualToString:@"SRT"])
939             {
940                 [aCell setEnabled:YES];
941             }
942             else
943             {
944                 [aCell setEnabled:NO];
945             }
946         }
947         
948     }
949      
950 }
951
952
953 @end