OSDN Git Service

MacGui: Remove x264 opt field from the preferences.
[handbrake-jp/handbrake-jp-git.git] / macosx / ScanController.mm
1 /*  $Id: ScanController.mm,v 1.10 2005/04/27 21:05:24 titer Exp $
2
3    This file is part of the HandBrake source code.
4    Homepage: <http://handbrake.m0k.org/>.
5    It may be used under the terms of the GNU General Public License. */
6 /* These are now called in DriveDetector.h
7 #include <paths.h>
8 #include <IOKit/IOKitLib.h>
9 #include <IOKit/IOBSD.h>
10 #include <IOKit/storage/IOMedia.h>
11 #include <IOKit/storage/IODVDMedia.h>
12 */
13
14 #include "ScanController.h"
15 #include "DriveDetector.h"
16
17 #define _(a) NSLocalizedString(a,nil)
18 #define INSERT_STRING @"Insert a DVD"
19
20 @implementation ScanController
21
22 - (void) TranslateStrings
23 {
24     [fSelectString setStringValue: _( @"Select a DVD:" )];
25     [fDetectedCell setTitle:       _( @"Detected volume" )];
26     [fFolderCell   setTitle:       _( @"DVD Folder / Image" )];
27     [fBrowseButton setTitle:       _( @"Browse" )];
28     [fCancelButton setTitle:       _( @"Cancel" )];
29     [fOpenButton   setTitle:       _( @"Open" )];
30 }
31
32 - (void) SetHandle: (hb_handle_t *) handle
33 {
34     fHandle    = handle;
35
36     [self TranslateStrings];
37
38     [fStatusField setStringValue: @""];
39 }
40
41 - (void) Show
42 {
43         if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DisableDvdAutoDetect"] == 0)
44         {
45         /* We manually show these, in case they were hidden during a previous scan
46         with the Auto Detect turned off */
47         [fMatrix setHidden: NO];
48         [fDetectedPopUp setHidden: NO];
49         [fFolderField setHidden: NO];
50         [fOpenButton setHidden: NO];
51         [fCancelButton setHidden: NO];
52         [fBrowseButton setHidden: NO];
53         
54         [fSelectString setStringValue:@"Select a DVD Source:"];
55                 fDriveDetector = [[DriveDetector alloc] initWithCallback:self selector:@selector(openUpdateDrives:)];
56                 [fDriveDetector run];
57         /* We show the scan choice sheet */
58         [NSApp beginSheet:fPanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
59         }
60         else // If dvd auto detect is turned off
61         {
62         [fSelectString setStringValue:@""];
63
64         [fDetectedCell  setEnabled: 0];
65         [fDetectedPopUp setEnabled: 0];
66     [fFolderField   setEnabled: 1];
67     [fBrowseButton  setEnabled: 1];
68         [fOpenButton    setEnabled: 0];
69         [fBrowseButton  setEnabled: 1];
70         [fMatrix selectCell: fFolderCell];
71         [fMatrix setHidden: YES];
72         [fDetectedPopUp setHidden: YES];
73         [fFolderField setHidden: YES];
74         [fOpenButton setHidden: YES];
75         [fCancelButton setHidden: NO];
76         [fBrowseButton setHidden: YES];
77         /* We go straight to the Browse Sheet */
78         [self Browse2: NULL];
79         }
80
81 }
82
83 - (void) openUpdateDrives: (NSDictionary *) drives
84 {
85     if( fDrives )
86     {
87         [fDrives release];
88     }
89     fDrives = [[NSDictionary alloc] initWithDictionary: drives];
90
91     NSString * device;
92     NSEnumerator * enumerator = [fDrives keyEnumerator];
93     [fDetectedPopUp removeAllItems];
94     while( ( device = [enumerator nextObject] ) )
95     {
96         [fDetectedPopUp addItemWithTitle: device];
97     }
98     
99         
100
101     if( ![fDetectedPopUp numberOfItems] )
102     {
103         [fDetectedPopUp addItemWithTitle: INSERT_STRING];
104         [fDetectedPopUp setEnabled: 0];
105     [fFolderField   setEnabled: 1];
106     [fBrowseButton  setEnabled: 1];
107         [fOpenButton    setEnabled: 0];
108         [fBrowseButton  setEnabled: 1];
109         [fMatrix selectCell: fFolderCell];
110
111
112     }
113         else
114         {
115         [fDetectedPopUp setEnabled: 1];
116     [fFolderField   setEnabled: 0];
117     [fBrowseButton  setEnabled: 0];
118         [fOpenButton    setEnabled: 1];
119         [fBrowseButton  setEnabled: 0];
120         }
121
122         [fDetectedPopUp selectItemAtIndex: 0];
123
124 }
125
126 - (void) EnableUI: (bool) b
127 {
128     [fMatrix        setEnabled: b];
129     [fDetectedCell  setEnabled: b];
130     [fDetectedPopUp setEnabled: b];
131     [fFolderCell    setEnabled: b];
132     [fFolderField   setEnabled: b];
133     [fBrowseButton  setEnabled: b];
134     [fOpenButton    setEnabled: b];
135
136     if( b )
137     {
138         [self MatrixChanged: nil];
139     }
140 }
141
142 - (void) UpdateUI: (hb_state_t *) s
143 {
144     switch( s->state )
145     {
146 #define p s->param.scanning
147         case HB_STATE_SCANNING:
148                         [fSelectString setStringValue:@"HandBrake is Scanning Your Source..."];
149             [fStatusField setStringValue: [NSString stringWithFormat:
150                 _( @"Scanning title %d of %d..." ),
151                 p.title_cur, p.title_count]];
152             [fIndicator setDoubleValue: 100.0 * ( p.title_cur - 1 ) /
153                 p.title_count];
154             break;
155 #undef p
156                         
157         case HB_STATE_SCANDONE:
158             [self       EnableUI: YES];
159             [fIndicator setDoubleValue: 0.0];
160             /*
161                          if (hb_list_count(hb_get_titles(fHandle)))
162              {
163                                  [fStatusField setStringValue:@""];
164                                  [NSApp endSheet:fPanel];
165                                  [fPanel orderOut:self];
166                                  
167                          }
168                          else
169                          {
170                                  [fStatusField setStringValue:_( @"No valid title found.")];
171                                  // If DVD Auto Detect is disabled 
172                                  if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DisableDvdAutoDetect"] == 1)
173                                  {
174                                          [NSApp endSheet:fPanel];
175                                          [fPanel orderOut:self];
176                                  }
177                          }
178                          */
179                         [fStatusField setStringValue:@""];
180                         [NSApp endSheet:fPanel];
181                         [fPanel orderOut:self];
182             break;
183         /* garbage collection here just in case we get caught in a HB_STATE_WORKING
184                    phase if scanning while encoding */
185         case HB_STATE_WORKING:
186
187                 /* Update slider */
188                 /* Use "barber pole" as we currently have no way to measure
189                    progress of scan while encoding */
190                    [fStatusField setStringValue:@"Performing background scan ..."];
191             [fIndicator setIndeterminate: YES];
192             [fIndicator startAnimation: nil];
193                         break;
194
195
196     }
197 }
198
199 - (IBAction) MatrixChanged: (id) sender
200 {
201     /* Do we have detected drives  and is "Disable DVD Drive Auto Scan" off in prefs*/
202
203     if( [fDetectedPopUp numberOfItems] > 0  && [[NSUserDefaults standardUserDefaults] boolForKey:@"DisableDvdAutoDetect"] == 0)
204     {
205         [fDetectedCell setEnabled: YES];
206                 //[fMatrix selectCellAtRow:0 column:0];
207                 
208     }
209     else
210     {
211        //[fMatrix selectCell: fFolderCell];
212         [fDetectedCell setEnabled: NO];
213                 
214     }
215
216     /* Enable controls related to the current choice */
217         /* If Detected Volume is selected */
218     if ( [fMatrix selectedRow] == 0 )
219         {
220         [fDetectedPopUp setEnabled: YES];
221     [fFolderField   setEnabled: NO];
222     [fBrowseButton  setEnabled: NO];
223         }
224         else
225         {
226         [fDetectedPopUp setEnabled: NO];
227     [fFolderField   setEnabled: YES];
228     [fBrowseButton  setEnabled: YES];
229         }
230
231
232 }
233
234
235
236 /* Browse:
237    Remove the current sheet (the scan panel) and show an OpenPanel.
238    Because we can't open the new sheet before the other one is
239    completely gone, we use performSelectorOnMainThread so it will be
240    done right afterwards */
241 - (IBAction) Browse: (id) sender
242 {
243     [NSApp endSheet:fPanel];
244         [fPanel orderOut:self];
245         [self performSelectorOnMainThread:@selector(Browse2:) withObject:nil waitUntilDone:NO];
246 }
247 - (void) Browse2: (id) sender
248 {
249     NSOpenPanel * panel;
250         
251     panel = [NSOpenPanel openPanel];
252     [panel setAllowsMultipleSelection: NO];
253     [panel setCanChooseFiles: YES];
254     [panel setCanChooseDirectories: YES ];
255     NSString * sourceDirectory;
256         if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"])
257         {
258                 sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"];
259         }
260         else
261         {
262                 sourceDirectory = @"~/Desktop";
263                 sourceDirectory = [sourceDirectory stringByExpandingTildeInPath];
264         }
265     /*
266          Old open browse window, lets keep it her for a couple of revs for reference
267          if problems might crop up */
268         /*
269          [panel beginSheetForDirectory: sourceDirectory file: nil types: nil
270                                         modalForWindow: [NSApp mainWindow] modalDelegate: self
271                                         didEndSelector: @selector( BrowseDone:returnCode:contextInfo: )
272                                            contextInfo: nil];
273          */
274         [panel beginSheetForDirectory: sourceDirectory file: nil types: nil
275                                    modalForWindow: fWindow modalDelegate: self
276                                    didEndSelector: @selector( BrowseDone:returnCode:contextInfo: )
277                                           contextInfo: nil];
278 }
279
280 /* Get the folder and switch sheets again. Use the same trick as
281    above */
282 - (void) BrowseDone: (NSOpenPanel *) sheet
283                  returnCode: (int) returnCode contextInfo: (void *) contextInfo
284 {
285     /* User selected a file to open */
286         if( returnCode == NSOKButton )
287     {
288         [fFolderField setStringValue:
289             [[sheet filenames] objectAtIndex: 0]];
290         [self Open: nil];
291                 [self performSelectorOnMainThread: @selector( BrowseDone2: )
292                                                            withObject: nil waitUntilDone: NO];
293     }
294         else // User clicked Cancel in browse window
295         {
296                 /* If DVD Auto Detect is disabled */
297                 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DisableDvdAutoDetect"] == 1)
298                 {
299                         /* We close the scan panel altogether */
300                             [self Cancel: nil];
301                 }
302                 else /* Dvd auto detect is on */
303                 {
304                         /* We return back to the scan choice sheet */
305                         [self performSelectorOnMainThread: @selector( BrowseDone2: )
306                                                                    withObject: nil waitUntilDone: NO];
307                                                                    
308         
309                 }
310         }
311     
312     
313         
314 }
315 - (void) BrowseDone2: (id) sender
316 {
317     [NSApp beginSheet:fPanel modalForWindow:fWindow modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
318
319 }
320
321 - (IBAction) Open: (id) sender
322 {
323
324                 [fStatusField setStringValue: _( @"Opening..." )];
325                 [fIndicator setIndeterminate: YES];
326         [fIndicator startAnimation: nil];
327                 [fDriveDetector stop];
328                 
329                 if( [fMatrix selectedRow] )
330                 {
331                         /* we set the last source directory in the prefs here */
332                         NSString *sourceDirectory = [[fFolderField stringValue] stringByDeletingLastPathComponent];
333                         [[NSUserDefaults standardUserDefaults] setObject:sourceDirectory forKey:@"LastSourceDirectory"];
334                         hb_scan( fHandle, [[fFolderField stringValue] UTF8String], 0 );
335                 }
336                 else
337                 {
338                         hb_scan( fHandle, [[fDrives objectForKey: [fDetectedPopUp
339                                 titleOfSelectedItem]] UTF8String], 0 );
340                 }
341 }
342
343 - (IBAction) Cancel: (id) sender
344 {
345     [NSApp endSheet:fPanel];
346         [fPanel orderOut:self];
347 }
348
349 @end