Changeset 19


Ignore:
Timestamp:
Jan 12, 2006, 6:57:23 PM (15 years ago)
Author:
root
Message:

Update 2005-12-21

Location:
trunk
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Jamrules

    r14 r19  
    99VERSION_MINOR  = 4 ;
    1010# VERSION_STRING = $(VERSION_MAJOR).$(VERSION_MINOR) ;
    11 VERSION_STRING = CVS-20051213 ;
     11VERSION_STRING = CVS-20051221 ;
    1212
    1313DEFINES += VERSION_MAJOR=$(VERSION_MAJOR)
     
    5050    {
    5151        $(RM) $(1)
    52         sed "s/%%VERSION%%/$(VERSION_STRING)/" < $(2) > $(1)
     52        sed "s/%%VERSION%%/$(VERSION_STRING)/g" < $(2) > $(1)
    5353    }
    5454
  • trunk/macosx/Controller.h

    r16 r19  
    3232@interface Controller : NSObject
    3333{
    34     tr_handle_t                  * fHandle;
    35     int                            fCount;
    36     tr_stat_t                    * fStat;
    37     int                            fResumeOnWake[TR_MAX_TORRENT_COUNT];
     34    tr_handle_t                 * fHandle;
     35    int                         fCount;
     36    tr_stat_t                   * fStat;
     37    int                         fResumeOnWake[TR_MAX_TORRENT_COUNT];
    3838
    39     NSToolbar                    * fToolbar;
     39    NSToolbar                   * fToolbar;
    4040
    41     IBOutlet PrefsController     * fPrefsController;
     41    IBOutlet NSMenuItem         * fAdvancedBarItem;
     42    IBOutlet NSMenuItem         * fPauseResumeItem;
     43    IBOutlet NSMenuItem         * fRemoveItem;
     44    IBOutlet NSMenuItem         * fRemoveTorrentItem;
     45    IBOutlet NSMenuItem         * fRemoveDataItem;
     46    IBOutlet NSMenuItem         * fRemoveBothItem;
     47    IBOutlet NSMenuItem         * fRevealItem;
     48    IBOutlet NSMenuItem         * fShowHideToolbar;
    4249
    43     IBOutlet NSMenuItem          * fAdvancedBarItem;
    44     IBOutlet NSMenuItem          * fPauseResumeItem;
    45     IBOutlet NSMenuItem          * fRemoveItem;
    46     IBOutlet NSMenuItem          * fRemoveTorrentItem;
    47     IBOutlet NSMenuItem          * fRemoveDataItem;
    48     IBOutlet NSMenuItem          * fRemoveBothItem;
    49     IBOutlet NSMenuItem          * fRevealItem;
    50     IBOutlet NSMenuItem          * fShowHideToolbar;
     50    IBOutlet NSWindow           * fWindow;
     51    IBOutlet TorrentTableView   * fTableView;
     52    IBOutlet NSTextField        * fTotalDLField;
     53    IBOutlet NSTextField        * fTotalULField;
    5154
    52     IBOutlet NSWindow            * fWindow;
    53     IBOutlet TorrentTableView    * fTableView;
    54     IBOutlet NSTextField         * fTotalDLField;
    55     IBOutlet NSTextField         * fTotalULField;
    56     IBOutlet NSMenu              * fContextMenu;
     55    IBOutlet NSPanel            * fInfoPanel;
     56    IBOutlet NSTextField        * fInfoTitle;
     57    IBOutlet NSTextField        * fInfoTracker;
     58    IBOutlet NSTextField        * fInfoAnnounce;
     59    IBOutlet NSTextField        * fInfoSize;
     60    IBOutlet NSTextField        * fInfoPieces;
     61    IBOutlet NSTextField        * fInfoPieceSize;
     62    IBOutlet NSTextField        * fInfoSeeders;
     63    IBOutlet NSTextField        * fInfoLeechers;
     64    IBOutlet NSTextField        * fInfoFolder;
     65    IBOutlet NSTextField        * fInfoDownloaded;
     66    IBOutlet NSTextField        * fInfoUploaded;
    5767
    58     IBOutlet NSPanel             * fInfoPanel;
    59     IBOutlet NSTextField         * fInfoTitle;
    60     IBOutlet NSTextField         * fInfoTracker;
    61     IBOutlet NSTextField         * fInfoAnnounce;
    62     IBOutlet NSTextField         * fInfoSize;
    63     IBOutlet NSTextField         * fInfoPieces;
    64     IBOutlet NSTextField         * fInfoPieceSize;
    65     IBOutlet NSTextField         * fInfoSeeders;
    66     IBOutlet NSTextField         * fInfoLeechers;
    67     IBOutlet NSTextField         * fInfoFolder;
    68     IBOutlet NSTextField         * fInfoDownloaded;
    69     IBOutlet NSTextField         * fInfoUploaded;
    70 
    71     io_connect_t                   fRootPort;
    72     NSArray * fFilenames;
    73     NSTimer * fTimer;
     68    io_connect_t                fRootPort;
     69    NSArray                     * fFilenames;
     70    NSTimer                     * fTimer;
     71   
     72    IBOutlet NSPanel            * fPrefsWindow;
     73    IBOutlet PrefsController    * fPrefsController;
     74    NSUserDefaults              * fDefaults;
     75   
     76    BOOL                        fHasGrowl;
    7477}
    7578
     
    7780- (void) openShowSheet:   (id) sender;
    7881- (void) openSheetClosed: (NSOpenPanel *) s returnCode: (int) code
    79                             contextInfo: (void *) info;
    80 - (void) stopTorrent:     (id) sender;
    81 - (void) stopAllTorrents: (id) sender;
    82 - (void) stopTorrentWithIndex: (int) index;
    83 - (void) resumeTorrent:   (id) sender;
    84 - (void) resumeAllTorrents: (id) sender;
    85 - (void) resumeTorrentWithIndex: (int) index;
    86 - (void) removeTorrent:   (id) sender;
    87 - (void) removeTorrentDeleteFile: (id) sender;
    88 - (void) removeTorrentDeleteData: (id) sender;
    89 - (void) removeTorrentDeleteBoth: (id) sender;
    90 - (void) removeTorrentWithIndex: (int) idx
    91                   deleteTorrent: (BOOL) deleteTorrent
    92                      deleteData: (BOOL) deleteData;
     82                        contextInfo: (void *) info;
     83
     84- (void) quitSheetDidEnd:   (NSWindow *)sheet returnCode:(int)returnCode
     85                            contextInfo:(void  *)contextInfo;
     86- (void) quitProcedure;
     87                       
     88- (void) stopTorrent:               (id) sender;
     89- (void) stopAllTorrents:           (id) sender;
     90- (void) stopTorrentWithIndex:      (int) index;
     91- (void) resumeTorrent:             (id) sender;
     92- (void) resumeAllTorrents:         (id) sender;
     93- (void) resumeTorrentWithIndex:    (int) index;
     94
     95- (void) removeTorrent:             (id) sender;
     96- (void) removeTorrentDeleteFile:   (id) sender;
     97- (void) removeTorrentDeleteData:   (id) sender;
     98- (void) removeTorrentDeleteBoth:   (id) sender;
     99- (void) removeTorrentWithIndex:    (int) idx
     100                deleteTorrent:      (BOOL) deleteTorrent
     101                deleteData:         (BOOL) deleteData;
     102               
     103- (void) removeSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode
     104                        contextInfo:(NSDictionary  *)dict;
     105- (void) confirmRemoveTorrentWithIndex: (int) idx
     106            deleteTorrent: (BOOL) deleteTorrent
     107            deleteData: (BOOL) deleteData;
     108                     
    93109- (void) showInfo:        (id) sender;
    94110
    95111- (void) updateUI:        (NSTimer *) timer;
    96112- (void) sleepCallBack:   (natural_t) messageType argument:
    97                             (void *) messageArgument;
    98 
    99 - (NSMenu *) menuForIndex: (int) idx;
     113                        (void *) messageArgument;
    100114
    101115- (void) runCustomizationPalette: (id) sender;
    102116- (void) showHideToolbar: (id) sender;
    103117
    104 - (void) showMainWindow:  (id) sender;
    105 - (void) linkHomepage:    (id) sender;
    106 - (void) linkForums:      (id) sender;
    107 - (void) notifyGrowl:     (NSString *) file;
    108 - (void) finderReveal:    (NSString *) path;
    109 - (void) finderTrash:     (NSString *) path;
    110 - (void) growlRegister:   (id) sender;
     118- (void) showPreferenceWindow: (id) sender;
     119
     120- (void) showMainWindow:    (id) sender;
     121- (void) linkHomepage:      (id) sender;
     122- (void) linkForums:        (id) sender;
     123- (void) notifyGrowl:       (NSString *) file;
     124- (void) revealFromMenu:    (id) sender;
     125- (void) finderReveal:      (NSString *) path;
     126- (void) finderTrash:       (NSString *) path;
     127- (void) growlRegister:     (id) sender;
    111128
    112129@end
  • trunk/macosx/Controller.m

    r16 r19  
    2828#include "TorrentTableView.h"
    2929
     30#import "PrefsController.h"
     31
    3032#define TOOLBAR_OPEN        @"Toolbar Open"
    3133#define TOOLBAR_REMOVE      @"Toolbar Remove"
    32 #define TOOLBAR_PREFS       @"Toolbar Preferences"
    3334#define TOOLBAR_INFO        @"Toolbar Info"
    3435#define TOOLBAR_PAUSE_ALL   @"Toolbar Pause All"
    3536#define TOOLBAR_RESUME_ALL  @"Toolbar Resume All"
    3637
    37 #define CONTEXT_PAUSE           1
    38 #define CONTEXT_REMOVE          2
    39 #define CONTEXT_REMOVE_TORRENT  3
    40 #define CONTEXT_REMOVE_DATA     4
    41 #define CONTEXT_REMOVE_BOTH     5
    42 #define CONTEXT_INFO            6                                             
     38#define WEBSITE_URL     @"http://transmission.m0k.org/"
     39#define FORUM_URL       @"http://transmission.m0k.org/forum/"
     40
     41#define GROWL_PATH  @"/Library/PreferencePanes/Growl.prefPane/Contents/Resources/GrowlHelperApp.app"
    4342
    4443static void sleepCallBack( void * controller, io_service_t y,
     
    5352- (void) awakeFromNib
    5453{
     54    [fWindow setContentMinSize: NSMakeSize( 400, 120 )];
     55   
    5556    fHandle = tr_init();
    5657
    57     [fPrefsController setHandle: fHandle];
    58 
    59     [fWindow setContentMinSize: NSMakeSize( 400, 120 )];
    60 
    61     /* Check or uncheck menu item in respect to current preferences */
    62     [fAdvancedBarItem setState: [[NSUserDefaults standardUserDefaults]
     58    [fPrefsController setPrefsWindow: fHandle];
     59    fDefaults = [NSUserDefaults standardUserDefaults];
     60   
     61    [fInfoPanel setFrameAutosaveName:@"InfoPanel"];
     62
     63    //check advanced bar menu item
     64    [fAdvancedBarItem setState: [fDefaults
    6365        boolForKey:@"UseAdvancedBar"] ? NSOnState : NSOffState];
    6466   
     
    6769    [fToolbar setAllowsUserCustomization: YES];
    6870    [fToolbar setAutosavesConfiguration: YES];
    69     [fWindow  setToolbar: fToolbar];
    70     [fWindow  setDelegate: self];
     71    [fWindow setToolbar: fToolbar];
     72    [fWindow setDelegate: self];
    7173
    7274    NSTableColumn * tableColumn;
    73     NameCell      * nameCell;
    74     ProgressCell  * progressCell;
    75 
    76     nameCell     = [[NameCell     alloc] init];
    77     progressCell = [[ProgressCell alloc] init];
     75    NameCell * nameCell = [[NameCell alloc] init];
     76    ProgressCell * progressCell = [[ProgressCell alloc] init];
     77
    7878    tableColumn  = [fTableView tableColumnWithIdentifier: @"Name"];
    7979    [tableColumn setDataCell: nameCell];
    80     [tableColumn setMinWidth: 10.0];
    81     [tableColumn setMaxWidth: 3000.0];
    8280
    8381    tableColumn  = [fTableView tableColumnWithIdentifier: @"Progress"];
    8482    [tableColumn setDataCell: progressCell];
    85     [tableColumn setMinWidth: 134.0];
    86     [tableColumn setMaxWidth: 134.0];
    8783
    8884    [fTableView setAutosaveTableColumns: YES];
    89     [fTableView sizeToFit];
     85    //[fTableView sizeToFit];
    9086
    9187    [fTableView registerForDraggedTypes: [NSArray arrayWithObjects:
    9288        NSFilenamesPboardType, NULL]];
    9389
     90    //Register for sleep notifications
    9491    IONotificationPortRef  notify;
    9592    io_object_t            anIterator;
    9693
    97     /* Register for sleep notifications */
    98     fRootPort = IORegisterForSystemPower( self, &notify, sleepCallBack,
    99                                           &anIterator);
    100     if( !fRootPort )
    101     {
    102         printf( "Could not IORegisterForSystemPower\n" );
    103     }
    104     else
     94    fRootPort = IORegisterForSystemPower( self, & notify, sleepCallBack,
     95                                          & anIterator);
     96    if (fRootPort)
    10597    {
    10698        CFRunLoopAddSource( CFRunLoopGetCurrent(),
     
    108100                            kCFRunLoopCommonModes );
    109101    }
    110 
    111     NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    112 
    113     NSArray * history = [defaults arrayForKey: @"History"];
    114     if( history )
    115     {
    116         unsigned i;
    117         NSDictionary * dic;
    118         NSString * torrentPath, * downloadFolder, * paused;
    119 
    120         for( i = 0; i < [history count]; i++ )
    121         {
    122             dic = [history objectAtIndex: i];
    123 
    124             torrentPath    = [dic objectForKey: @"TorrentPath"];
    125             downloadFolder = [dic objectForKey: @"DownloadFolder"];
    126             paused         = [dic objectForKey: @"Paused"];
    127 
    128             if( !torrentPath || !downloadFolder || !paused )
    129             {
    130                 continue;
    131             }
    132 
    133             if( tr_torrentInit( fHandle, [torrentPath UTF8String] ) )
    134             {
    135                 continue;
    136             }
    137 
    138             tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1,
    139                                     [downloadFolder UTF8String] );
    140 
    141             if( [paused isEqualToString: @"NO"] )
    142             {
    143                 tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 );
    144             }
    145         }
    146     }
    147    
    148     /*  Register with the growl system */
     102    else
     103        printf( "Could not IORegisterForSystemPower\n" );
     104
     105    NSString * torrentPath, * downloadFolder, * paused;
     106    NSDictionary * dic;
     107
     108    NSEnumerator * enumerator = [[fDefaults arrayForKey: @"History"] objectEnumerator];
     109    while ((dic = [enumerator nextObject]))
     110    {
     111        torrentPath    = [dic objectForKey: @"TorrentPath"];
     112        downloadFolder = [dic objectForKey: @"DownloadFolder"];
     113        paused         = [dic objectForKey: @"Paused"];
     114           
     115        if (!torrentPath || !downloadFolder || !paused)
     116            continue;
     117
     118        if (tr_torrentInit(fHandle, [torrentPath UTF8String]))
     119            continue;
     120
     121        tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1,
     122                                [downloadFolder UTF8String] );
     123
     124        if ([paused isEqualToString: @"NO"])
     125            tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 );
     126    }
     127
     128    //check and register Growl if it is installed for this user or all users
     129    NSFileManager * manager = [NSFileManager defaultManager];
     130    fHasGrowl = [manager fileExistsAtPath: GROWL_PATH]
     131                || [manager fileExistsAtPath: [[NSString stringWithFormat: @"~%@",
     132                GROWL_PATH] stringByExpandingTildeInPath]];
    149133    [self growlRegister: self];
    150134   
    151     /* Update the interface every 500 ms */
     135    //update the interface every 500 ms
    152136    fCount = 0;
    153137    fStat  = NULL;
     
    176160}
    177161
    178 - (NSApplicationTerminateReply) applicationShouldTerminate:
    179     (NSApplication *) app
    180 {
     162- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
     163{
     164    if ([[fDefaults stringForKey: @"CheckQuit"] isEqualToString:@"YES"])
     165    {
     166        int i;
     167        for( i = 0; i < fCount; i++ )
     168        {
     169            if( fStat[i].status & ( TR_STATUS_CHECK |
     170                    TR_STATUS_DOWNLOAD ) )
     171            {
     172                NSBeginAlertSheet(@"Confirm Quit",
     173                                @"Quit", @"Cancel", nil,
     174                                fWindow, self,
     175                                @selector(quitSheetDidEnd:returnCode:contextInfo:),
     176                                NULL, NULL, @"There are active torrents. Do you really want to quit?");
     177                return NSTerminateLater;
     178            }
     179        }
     180    }
     181   
     182    [self quitProcedure];
     183    return NSTerminateNow;
     184}
     185
     186- (void) quitSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode
     187                        contextInfo:(void  *)contextInfo
     188{
     189    if (returnCode == NSAlertDefaultReturn)
     190        [self quitProcedure];
     191       
     192    [NSApp stopModal];
     193    [NSApp replyToApplicationShouldTerminate: (returnCode == NSAlertDefaultReturn)];
     194}
     195
     196- (void) quitProcedure
     197{
     198    int i;
    181199    NSMutableArray * history = [NSMutableArray
    182200        arrayWithCapacity: TR_MAX_TORRENT_COUNT];
    183     int i;
    184 
    185     /* Stop updating the interface */
     201   
     202    // Stop updating the interface
    186203    [fTimer invalidate];
    187204
    188     /* Save history and stop running torrents */
     205    // Save history and stop running torrents
    189206    for( i = 0; i < fCount; i++ )
    190207    {
     
    206223    }
    207224
    208     /* Wait for torrents to stop (5 seconds timeout) */
     225    // Wait for torrents to stop (5 seconds timeout)
    209226    NSDate * start = [NSDate date];
    210227    while( fCount > 0 )
     
    225242    tr_close( fHandle );
    226243
    227     [[NSUserDefaults standardUserDefaults]
    228         setObject: history forKey: @"History"];
    229 
    230     return NSTerminateNow;
     244    [fDefaults setObject: history forKey: @"History"];
     245}
     246
     247- (void) showPreferenceWindow: (id) sender
     248{
     249    NSRect  mainFrame;
     250    NSRect  prefsFrame;
     251    NSRect  screenRect;
     252    NSPoint point;
     253
     254    /* Place the window */
     255    mainFrame  = [fWindow frame];
     256    prefsFrame = [fPrefsWindow frame];
     257    screenRect = [[NSScreen mainScreen] visibleFrame];
     258    point.x    = mainFrame.origin.x + mainFrame.size.width / 2 -
     259                    prefsFrame.size.width / 2;
     260    point.y    = mainFrame.origin.y + mainFrame.size.height - 30;
     261
     262    /* Make sure it is in the screen */
     263    if( point.x < screenRect.origin.x )
     264    {
     265        point.x = screenRect.origin.x;
     266    }
     267    if( point.x + prefsFrame.size.width >
     268            screenRect.origin.x + screenRect.size.width )
     269    {
     270        point.x = screenRect.origin.x +
     271            screenRect.size.width - prefsFrame.size.width;
     272    }
     273    if( point.y - prefsFrame.size.height < screenRect.origin.y )
     274    {
     275        point.y = screenRect.origin.y + prefsFrame.size.height;
     276    }
     277
     278    [fPrefsWindow setFrameTopLeftPoint: point];
     279    [fPrefsWindow makeKeyAndOrderFront:NULL];
    231280}
    232281
     
    234283    contextInfo: (void *) info
    235284{
    236     if( code != NSOKButton )
     285    if (code == NSOKButton)
     286    {
     287        tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1,
     288                         [[[s filenames] objectAtIndex: 0] UTF8String] );
     289        tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 );
     290    }
     291    else
    237292    {
    238293        tr_torrentClose( fHandle, tr_torrentCount( fHandle ) - 1 );
    239         [NSApp stopModal];
    240         return;
    241     }
    242 
    243     tr_torrentSetFolder( fHandle, tr_torrentCount( fHandle ) - 1,
    244                          [[[s filenames] objectAtIndex: 0] UTF8String] );
    245     tr_torrentStart( fHandle, tr_torrentCount( fHandle ) - 1 );
     294    }
    246295    [NSApp stopModal];
    247296}
    248 
    249297
    250298- (void) application: (NSApplication *) sender
    251299         openFiles: (NSArray *) filenames
    252300{
    253     unsigned i;
    254     NSUserDefaults * defaults;
    255301    NSString * downloadChoice, * downloadFolder, * torrentPath;
    256302
    257     defaults       = [NSUserDefaults standardUserDefaults];
    258     downloadChoice = [defaults stringForKey: @"DownloadChoice"];
    259     downloadFolder = [defaults stringForKey: @"DownloadFolder"];
    260 
    261     for( i = 0; i < [filenames count]; i++ )
    262     {
    263         torrentPath = [filenames objectAtIndex: i];
    264 
     303    downloadChoice = [fDefaults stringForKey: @"DownloadChoice"];
     304    downloadFolder = [fDefaults stringForKey: @"DownloadFolder"];
     305
     306    NSEnumerator * enumerator = [filenames objectEnumerator];
     307    while ((torrentPath = [enumerator nextObject]))
     308    {
    265309        if( tr_torrentInit( fHandle, [torrentPath UTF8String] ) )
    266         {
    267310            continue;
    268         }
    269311
    270312        if( [downloadChoice isEqualToString: @"Constant"] )
     
    284326        }
    285327
    286         NSOpenPanel * panel;
    287         NSString    * message;
    288 
    289         panel   = [NSOpenPanel openPanel];
    290         message = [NSString stringWithFormat:
    291             @"Select the download folder for %@",
    292             [torrentPath lastPathComponent]];
    293        
    294         [panel setPrompt:                  @"Select"];
    295         [panel setMessage:                   message];
    296         [panel setAllowsMultipleSelection:        NO];
    297         [panel setCanChooseFiles:                 NO];
    298         [panel setCanChooseDirectories:          YES];
     328        NSOpenPanel * panel = [NSOpenPanel openPanel];
     329       
     330        [panel setPrompt: @"Select Download Folder"];
     331        [panel setMessage: [NSString stringWithFormat:
     332                            @"Select the download folder for %@",
     333                            [torrentPath lastPathComponent]]];
     334        [panel setAllowsMultipleSelection: NO];
     335        [panel setCanChooseFiles: NO];
     336        [panel setCanChooseDirectories: YES];
    299337
    300338        [panel beginSheetForDirectory: NULL file: NULL types: NULL
     
    310348- (void) advancedChanged: (id) sender
    311349{
    312     NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
    313     if( [fAdvancedBarItem state] == NSOnState )
    314     {
    315         [fAdvancedBarItem setState: NSOffState];
    316         [defaults setObject:@"NO" forKey:@"UseAdvancedBar"];
    317     }
    318     else
    319     {
    320         [fAdvancedBarItem setState: NSOnState];
    321         [defaults setObject:@"YES" forKey:@"UseAdvancedBar"];
    322     }
     350    [fAdvancedBarItem setState: ![fAdvancedBarItem state]];
     351    [fDefaults setObject: [fAdvancedBarItem state] == NSOffState ? @"NO" : @"YES"
     352                forKey:@"UseAdvancedBar"];
     353
    323354    [fTableView display];
    324355}
    325356
    326 /* called on by applescript */
     357//called on by applescript
    327358- (void) open: (NSArray *) files
    328359{
     
    418449}
    419450
    420 
    421451- (void) removeTorrentWithIndex: (int) idx
    422452                  deleteTorrent: (BOOL) deleteTorrent
    423453                     deleteData: (BOOL) deleteData
    424454{
     455    if ( fStat[idx].status & ( TR_STATUS_CHECK
     456        | TR_STATUS_DOWNLOAD)  )
     457    {
     458        if ([[fDefaults stringForKey: @"CheckRemove"] isEqualToString:@"YES"])
     459        {
     460            NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:
     461                        [NSString stringWithFormat: @"%d", idx], @"Index",
     462                        [NSString stringWithFormat: @"%d", deleteTorrent], @"DeleteTorrent",
     463                        [NSString stringWithFormat: @"%d", deleteData], @"DeleteData",
     464                        nil];
     465            [dict retain];
     466           
     467            NSBeginAlertSheet(@"Confirm Remove",
     468                                @"Remove", @"Cancel", nil,
     469                                fWindow, self,
     470                                @selector(removeSheetDidEnd:returnCode:contextInfo:),
     471                                NULL, dict, @"This torrent is active. Do you really want to remove it?");
     472            return;
     473        }
     474        //stop if not stopped
     475        else
     476            [self stopTorrentWithIndex:idx];
     477    }
     478   
     479    [self confirmRemoveTorrentWithIndex: idx
     480            deleteTorrent: deleteTorrent
     481            deleteData: deleteData];
     482}
     483
     484- (void) removeSheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode
     485                        contextInfo:(NSDictionary  *)dict
     486{
     487    [NSApp stopModal];
     488    if (returnCode != NSAlertDefaultReturn)
     489    {
     490        [dict release];
     491        return;
     492    }
     493   
     494    int idx = [[dict objectForKey:@"Index"] intValue];
     495   
     496    [self stopTorrentWithIndex:idx];
     497
     498    [self confirmRemoveTorrentWithIndex: idx
     499        deleteTorrent: [[dict objectForKey:@"DeleteTorrent"] intValue]
     500        deleteData: [[dict objectForKey:@"DeleteData"] intValue]];
     501    [dict release];
     502}
     503                     
     504- (void) confirmRemoveTorrentWithIndex: (int) idx
     505            deleteTorrent: (BOOL) deleteTorrent
     506            deleteData: (BOOL) deleteData
     507{
    425508    if( deleteData )
    426509    {
     
    476559    int row, i;
    477560
    478     /* Update the NSTableView */
    479     if( fStat )
    480     {
    481         free( fStat );
    482     }
     561    //Update the NSTableView
     562    if (fStat)
     563        free(fStat);
     564       
    483565    fCount = tr_torrentStat( fHandle, &fStat );
    484566    [fTableView updateUI: fStat];
    485567
    486     /* Update the global DL/UL rates */
     568    //Update the global DL/UL rates
    487569    tr_torrentRates( fHandle, &dl, &ul );
    488570    [fTotalDLField setStringValue: [NSString stringWithFormat:
     
    491573        @"Total UL: %.2f KB/s", ul]];
    492574
    493     /* Update DL/UL totals in the Info panel */
     575    //Update DL/UL totals in the Info panel
    494576    row = [fTableView selectedRow];
    495     if( row > -1 )
     577    if( row >= 0 )
    496578    {
    497579        [fInfoDownloaded setStringValue:
     
    501583    }
    502584   
    503     /* check if torrents have recently ended. */
     585    //check if torrents have recently ended.
    504586    for (i = 0; i < fCount; i++)
    505587    {
    506588        if( !tr_getFinished( fHandle, i ) )
    507         {
    508589            continue;
    509         }
     590           
    510591        [self notifyGrowl: [NSString stringWithUTF8String:
    511592            fStat[i].info.name]];
    512593        tr_setFinished( fHandle, i, 0 );
    513594    }
    514 }
    515 
    516 
    517 - (NSMenu *) menuForIndex: (int) idx
    518 {
    519     if ( idx < 0 || idx >= fCount )
    520     {
    521         return nil;
    522     }
    523    
    524     int status = fStat[idx].status;
    525    
    526     NSMenuItem *pauseItem =  [fContextMenu itemWithTag: CONTEXT_PAUSE];
    527     NSMenuItem *removeItem = [fContextMenu itemAtIndex: 1];
    528     NSMenuItem *infoItem =   [fContextMenu itemAtIndex: 2];
    529    
    530     [pauseItem setTarget: self];
    531    
    532     if ( status & TR_STATUS_CHECK ||
    533          status & TR_STATUS_DOWNLOAD ||
    534          status & TR_STATUS_SEED )
    535     {
    536         /* we can stop */
    537         [removeItem setEnabled: NO];
    538         [pauseItem setTitle: @"Pause"];
    539         [pauseItem setAction: @selector(stopTorrent:)];
    540         [pauseItem setEnabled: YES];
    541     } else {
    542         /* we are stopped */
    543         [removeItem setEnabled: YES];
    544         [pauseItem setTitle: @"Resume"];
    545         [pauseItem setAction: @selector(resumeTorrent:)];
    546         /* don't allow resuming if we aren't in PAUSE */
    547         if ( !(status & TR_STATUS_PAUSE) )
    548             [pauseItem setEnabled: NO];
    549     }
    550    
    551     if( [fInfoPanel isVisible] )
    552     {
    553         [infoItem setTitle: @"Hide Info"];
    554     } else {
    555         [infoItem setTitle: @"Show Info"];
    556     }
    557    
    558     return fContextMenu;
    559595}
    560596
     
    664700    (NSString *) ident willBeInsertedIntoToolbar: (BOOL) flag
    665701{
    666     NSToolbarItem * item;
    667     item = [[NSToolbarItem alloc] initWithItemIdentifier: ident];
     702    NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: ident];
    668703
    669704    if( [ident isEqualToString: TOOLBAR_OPEN] )
     
    685720        [item setAction: @selector( removeTorrent: )];
    686721    }
    687     else if( [ident isEqualToString: TOOLBAR_PREFS] )
    688     {
    689         [item setLabel: @"Preferences"];
    690         [item setPaletteLabel: [item label]];
    691         [item setToolTip: @"Show the Preferences panel"];
    692         [item setImage: [NSImage imageNamed: @"Preferences.png"]];
    693         [item setTarget: fPrefsController];
    694         [item setAction: @selector( show: )];
    695     }
    696722    else if( [ident isEqualToString: TOOLBAR_INFO] )
    697723    {
     
    734760    return [NSArray arrayWithObjects:
    735761            TOOLBAR_OPEN, TOOLBAR_REMOVE,
    736             /* TOOLBAR_RESUME_ALL, TOOLBAR_PAUSE_ALL, */
    737             TOOLBAR_PREFS, TOOLBAR_INFO,
     762            TOOLBAR_RESUME_ALL, TOOLBAR_PAUSE_ALL,
     763            TOOLBAR_INFO,
    738764            NSToolbarSeparatorItemIdentifier,
    739765            NSToolbarSpaceItemIdentifier,
     
    747773    return [NSArray arrayWithObjects:
    748774            TOOLBAR_OPEN, TOOLBAR_REMOVE,
    749             /* NSToolbarSeparatorItemIdentifier,
    750             TOOLBAR_RESUME_ALL, TOOLBAR_PAUSE_ALL, */
     775            NSToolbarSeparatorItemIdentifier,
     776            TOOLBAR_RESUME_ALL, TOOLBAR_PAUSE_ALL,
    751777            NSToolbarFlexibleSpaceItemIdentifier,
    752             TOOLBAR_PREFS, TOOLBAR_INFO,
     778            TOOLBAR_INFO,
    753779            NULL];
    754780}
    755781
     782- (void) runCustomizationPalette: (id) sender
     783{
     784    [fToolbar runCustomizationPalette:sender];
     785}
     786
     787- (void) showHideToolbar: (id) sender
     788{
     789    [fWindow toggleToolbarShown:sender];
     790}
     791
    756792- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
    757793{
    758     //check remove item
     794    //enable remove item
    759795    if ([toolbarItem action] == @selector(removeTorrent:))
    760     {
    761         int row = [fTableView selectedRow];
    762         return ( row >= 0 ) && ( fStat[row].status &
    763                 ( TR_STATUS_STOPPING | TR_STATUS_PAUSE ) );
    764     }
    765    
    766     return true;
    767 }
    768 
    769 - (void) runCustomizationPalette: (id) sender
    770 {
    771     [fToolbar runCustomizationPalette:sender];
    772 }
    773 
    774 - (void) showHideToolbar: (id) sender
    775 {
    776     [fWindow toggleToolbarShown:sender];
     796        return [fTableView selectedRow] >= 0;
     797       
     798    //enable pause all and resume all items
     799    if ([toolbarItem action] == @selector(stopAllTorrents:)
     800            || [toolbarItem action] == @selector(resumeAllTorrents:))
     801        return fCount > 0;
     802   
     803    return YES;
    777804}
    778805
    779806- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
    780807{
     808    //disable menus if customize sheet is active
     809    if ([fToolbar customizationPaletteIsRunning])
     810        return NO;
     811       
    781812    //enable customize toolbar item
    782813    if ([menuItem action] == @selector(showHideToolbar:))
     814    {
    783815        [menuItem setTitle: [fToolbar isVisible] ? @"Hide Toolbar" : @"Show Toolbar"];
    784        
    785     if ([fToolbar customizationPaletteIsRunning])
    786         return false;
     816        return YES;
     817    }
    787818       
    788819    //enable show info
     
    790821    {
    791822        [menuItem setTitle: [fInfoPanel isVisible] ? @"Hide Info" : @"Show Info"];
    792         return true;
    793     }
     823        return YES;
     824    }
     825   
     826    //enable pause all and resume all
     827    if ([menuItem action] == @selector(stopAllTorrents:) || [menuItem action] == @selector(resumeAllTorrents:))
     828        return fCount > 0;
    794829       
    795830    int row = [fTableView selectedRow];
    796831       
    797832    //enable remove items
    798     if ([menuItem action] == @selector(removeTorrent:) || [menuItem action] == @selector(removeTorrentDeleteFile:)
    799         || [menuItem action] == @selector(removeTorrentDeleteData:) || [menuItem action] == @selector(removeTorrentDeleteBoth:)) {
    800         /* Can we remove it ? */
    801         return ( row >= 0 ) && ( fStat[row].status &
    802                 ( TR_STATUS_STOPPING | TR_STATUS_PAUSE ) );
     833    if ([menuItem action] == @selector(removeTorrent:)
     834        || [menuItem action] == @selector(removeTorrentDeleteFile:)
     835        || [menuItem action] == @selector(removeTorrentDeleteData:)
     836        || [menuItem action] == @selector(removeTorrentDeleteBoth:))
     837    {
     838        //append or remove ellipsis when needed
     839        if (row >= 0 && fStat[row].status & ( TR_STATUS_CHECK | TR_STATUS_DOWNLOAD)
     840                    && [[fDefaults stringForKey: @"CheckRemove"] isEqualToString:@"YES"])
     841        {
     842            if (![[menuItem title] hasSuffix:NS_ELLIPSIS])
     843                [menuItem setTitle:[[menuItem title] stringByAppendingString:NS_ELLIPSIS]];
     844        }
     845        else
     846        {
     847            if ([[menuItem title] hasSuffix:NS_ELLIPSIS])
     848                [menuItem setTitle:[[menuItem title] substringToIndex:[[menuItem title] length]-[NS_ELLIPSIS length]]];
     849        }
     850        return row >= 0;
    803851    }
    804852   
     
    807855        return row >= 0;
    808856       
    809     //enable and change pause and remove item
     857    //enable and change pause / remove item
    810858    if ([menuItem action] == @selector(resumeTorrent:) || [menuItem action] == @selector(stopTorrent:))
    811859    {
     
    823871    }
    824872   
    825     return true;
     873    return YES;
    826874}
    827875
     
    894942- (void) showMainWindow: (id) sender
    895943{
    896     [fWindow makeKeyAndOrderFront: NULL];
     944    [fWindow makeKeyAndOrderFront: nil];
    897945}
    898946
     
    900948{
    901949    [[NSWorkspace sharedWorkspace] openURL: [NSURL
    902         URLWithString:@"http://transmission.m0k.org/"]];
     950        URLWithString: WEBSITE_URL]];
    903951}
    904952
     
    906954{
    907955    [[NSWorkspace sharedWorkspace] openURL: [NSURL
    908         URLWithString:@"http://transmission.m0k.org/forum/"]];
    909 }
    910 
    911 - (BOOL) hasGrowl
    912 {
    913     NSFileManager * manager = [NSFileManager defaultManager];
    914     NSString      * helper  = @"/Library/PreferencePanes/Growl.prefPane/"
    915                                "Contents/Resources/GrowlHelperApp.app";
    916 
    917     if( [manager fileExistsAtPath: helper] )
    918     {
    919         /* Growl was installed for all users */
    920         return YES;
    921     }
    922     if( [manager fileExistsAtPath: [[NSString stringWithFormat: @"~%@",
    923             helper] stringByExpandingTildeInPath]] )
    924     {
    925         /* Growl was installed for this user only */
    926         return YES;
    927     }
    928 
    929     return NO;
     956        URLWithString: FORUM_URL]];
    930957}
    931958
     
    936963    NSDictionary * error;
    937964
    938     if( ![self hasGrowl] )
    939     {
     965    if( !fHasGrowl )
    940966        return;
    941     }
    942967   
    943968    growlScript = [NSString stringWithFormat:
     
    966991    NSDictionary * error;
    967992
    968     if( ![self hasGrowl] )
    969     {
     993    if( !fHasGrowl )
    970994        return;
    971     }
    972995   
    973996    growlScript = [NSString stringWithFormat:
     
    9821005         "  end if\n"
    9831006         "end tell"];
     1007         
    9841008    appleScript = [[NSAppleScript alloc] initWithSource: growlScript];
    9851009    if( ![appleScript executeAndReturnError: &error] )
     
    9901014}
    9911015
    992 
    9931016- (void) revealFromMenu: (id) sender
    9941017{
    995     int row;
    996 
    997     row = [fTableView selectedRow];
    998     if( row < 0 )
    999     {
    1000         return;
    1001     }
    1002     [self finderReveal: [NSString stringWithFormat: @"%@/%@",
    1003         [NSString stringWithUTF8String: fStat[row].folder],
    1004         [NSString stringWithUTF8String: fStat[row].info.name]]];
     1018    int row = [fTableView selectedRow];
     1019    if (row >= 0)
     1020    {
     1021        [self finderReveal: [NSString stringWithFormat: @"%@/%@",
     1022            [NSString stringWithUTF8String: fStat[row].folder],
     1023            [NSString stringWithUTF8String: fStat[row].info.name]]];
     1024    }
    10051025}
    10061026
  • trunk/macosx/English.lproj/MainMenu.nib/classes.nib

    r16 r19  
    1919                showInfo = id;
    2020                showMainWindow = id;
     21                showPreferenceWindow = id;
    2122                stopAllTorrents = id;
    2223                stopTorrent = id;
     
    2627            OUTLETS = {
    2728                fAdvancedBarItem = NSMenuItem;
    28                 fContextMenu = NSMenu;
    2929                fInfoAnnounce = NSTextField;
    3030                fInfoDownloaded = NSTextField;
     
    4141                fPauseResumeItem = NSMenuItem;
    4242                fPrefsController = PrefsController;
     43                fPrefsWindow = NSPanel;
    4344                fRemoveBothItem = NSMenuItem;
    4445                fRemoveDataItem = NSMenuItem;
     
    5556        },
    5657        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
     58        {CLASS = NameCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
    5759        {
    58             ACTIONS = {cancel = id; check = id; ratio = id; save = id; show = id; };
     60            ACTIONS = {
     61                folderSheetShow = id;
     62                setDownloadLocation = id;
     63                setLimitUploadCheck = id;
     64                setPort = id;
     65                setQuitMessage = id;
     66                setRemoveMessage = id;
     67                setUploadLimit = id;
     68            };
    5969            CLASS = PrefsController;
    6070            LANGUAGE = ObjC;
    6171            OUTLETS = {
     72                fBlankView = NSView;
    6273                fFolderMatrix = NSMatrix;
    6374                fFolderPopUp = NSPopUpButton;
     75                fGeneralView = NSView;
     76                fNetworkView = NSView;
    6477                fPortField = NSTextField;
    65                 fPrefsWindow = NSWindow;
     78                fPrefsWindow = NSPanel;
     79                fQuitCheck = NSButton;
     80                fRemoveCheck = NSButton;
    6681                fUploadCheck = NSButton;
    6782                fUploadField = NSTextField;
     
    7085            SUPERCLASS = NSObject;
    7186        },
     87        {CLASS = ProgressCell; LANGUAGE = ObjC; SUPERCLASS = NSCell; },
    7288        {
    7389            CLASS = TorrentTableView;
    7490            LANGUAGE = ObjC;
    75             OUTLETS = {fController = Controller; };
     91            OUTLETS = {fContextNoRow = NSMenu; fContextRow = NSMenu; fController = Controller; };
    7692            SUPERCLASS = NSTableView;
    7793        }
  • trunk/macosx/English.lproj/MainMenu.nib/info.nib

    r16 r19  
    44<dict>
    55        <key>IBDocumentLocation</key>
    6         <string>416 137 361 432 0 0 1152 842 </string>
     6        <string>62 66 426 365 0 0 1280 832 </string>
    77        <key>IBEditorPositions</key>
    88        <dict>
    99                <key>29</key>
    10                 <string>79 779 371 44 0 0 1152 842 </string>
     10                <string>92 768 371 44 0 0 1280 832 </string>
    1111                <key>456</key>
    12                 <string>134 408 144 106 0 0 1152 842 </string>
     12                <string>212 488 144 118 0 0 1152 842 </string>
     13                <key>581</key>
     14                <string>324 628 112 68 0 0 1152 842 </string>
     15                <key>589</key>
     16                <string>54 521 112 118 0 0 1152 842 </string>
     17                <key>783</key>
     18                <string>428 442 385 225 0 0 1280 832 </string>
     19                <key>796</key>
     20                <string>479 490 282 129 0 0 1280 832 </string>
     21                <key>825</key>
     22                <string>498 523 155 107 0 0 1152 842 </string>
    1323        </dict>
    1424        <key>IBFramework Version</key>
     
    1929        <array>
    2030                <integer>29</integer>
     31                <integer>783</integer>
     32                <integer>796</integer>
     33                <integer>21</integer>
    2134        </array>
    2235        <key>IBSystem Version</key>
  • trunk/macosx/Info.plist.in

    r6 r19  
    3838        <key>CFBundleVersion</key>
    3939        <string>%%VERSION%%</string>
     40        <key>CFBundleShortVersionString</key>
     41        <string>%%VERSION%%</string>
    4042        <key>NSMainNibFile</key>
    4143        <string>MainMenu</string>
  • trunk/macosx/PrefsController.h

    r1 r19  
    2828{
    2929    tr_handle_t * fHandle;
     30   
     31    IBOutlet NSPanel        * fPrefsWindow;
     32    NSToolbar               * fToolbar;
     33    IBOutlet NSView         * fGeneralView;
     34    IBOutlet NSView         * fNetworkView;
     35    IBOutlet NSView         * fBlankView;
     36   
     37    IBOutlet NSMatrix       * fFolderMatrix;
     38    IBOutlet NSPopUpButton  * fFolderPopUp;
     39    IBOutlet NSTextField    * fPortField;
     40    IBOutlet NSButton       * fUploadCheck;
     41    IBOutlet NSTextField    * fUploadField;
     42    IBOutlet NSButton       * fQuitCheck;
     43    IBOutlet NSButton       * fRemoveCheck;
     44   
     45    IBOutlet NSWindow       * fWindow;
    3046
    31     IBOutlet NSWindow      * fWindow;
    32     IBOutlet NSWindow      * fPrefsWindow;
    33     IBOutlet NSMatrix      * fFolderMatrix;
    34     IBOutlet NSPopUpButton * fFolderPopUp;
    35     IBOutlet NSTextField   * fPortField;
    36     IBOutlet NSButton      * fUploadCheck;
    37     IBOutlet NSTextField   * fUploadField;
    38 
    39     NSString               * fDownloadFolder;
     47    NSString                * fDownloadFolder;
     48    NSUserDefaults          * fDefaults;
    4049}
    4150
    42 - (void) setHandle: (tr_handle_t *) handle;
    43 - (void) show:      (id) sender;
    44 - (void) ratio:     (id) sender;
    45 - (void) check:     (id) sender;
    46 - (void) cancel:    (id) sender;
    47 - (void) save:      (id) sender;
     51- (void) setPrefsWindow: (tr_handle_t *) handle;
     52
     53- (void) setLimitUploadCheck:   (id) sender;
     54- (void) setPort:               (id) sender;
     55- (void) setUploadLimit:        (id) sender;
     56- (void) setQuitMessage:        (id) sender;
     57- (void) setRemoveMessage:  (id) sender;
     58- (void) setDownloadLocation:   (id) sender;
     59- (void) folderSheetShow:       (id) sender;
    4860
    4961@end
  • trunk/macosx/PrefsController.m

    r7 r19  
    2323#include "PrefsController.h"
    2424
     25#define DEFAULT_UPLOAD      @"20"
     26#define MIN_PORT            1
     27#define MAX_PORT            65535
     28
     29#define DOWNLOAD_FOLDER     0
     30#define DOWNLOAD_TORRENT    1
     31#define DOWNLOAD_ASK        2
     32
     33#define TOOLBAR_GENERAL     @"General"
     34#define TOOLBAR_NETWORK     @"Network"
     35
    2536@interface PrefsController (Private)
    2637
    27 - (void) folderSheetShow:   (id) sender;
     38- (void) showGeneralPref: (id) sender;
     39- (void) showNetworkPref: (id) sender;
     40
     41- (void) setPrefView: (NSView *) view;
     42
    2843- (void) folderSheetClosed: (NSOpenPanel *) s returnCode: (int) code
    2944                                contextInfo: (void *) info;
    30 - (void) loadSettings;
    31 - (void) saveSettings;
    3245- (void) updatePopUp;
    3346
     
    3649@implementation PrefsController
    3750
    38 /***********************************************************************
    39  * setHandle
    40  ***********************************************************************
    41  *
    42  **********************************************************************/
    43 - (void) setHandle: (tr_handle_t *) handle
    44 {
    45     NSUserDefaults * defaults;
     51+ (void) initialize
     52{
    4653    NSDictionary   * appDefaults;
    4754    NSString       * desktop, * port;
    48 
    49     fHandle = handle;
    5055
    5156    /* Register defaults settings:
     
    5358        - Always download to Desktop
    5459        - Port TR_DEFAULT_PORT
    55         - 20 KB/s upload limit */
     60        - Upload limit DEFAULT_UPLOAD
     61        - Do not limit upload
     62        - Ask before quitting
     63        - Ask before removing */
    5664    desktop = [NSHomeDirectory() stringByAppendingString: @"/Desktop"];
    57     port    = [NSString stringWithFormat: @"%d", TR_DEFAULT_PORT];
    58 
    59     defaults    = [NSUserDefaults standardUserDefaults];
     65    port = [NSString stringWithFormat: @"%d", TR_DEFAULT_PORT];
     66
    6067    appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
    61                     @"NO",       @"UseAdvancedBar",
    62                     @"Constant", @"DownloadChoice",
    63                     desktop,     @"DownloadFolder",
    64                     port,        @"BindPort",
    65                     @"20",       @"UploadLimit",
     68                    @"NO",          @"UseAdvancedBar",
     69                    @"Constant",    @"DownloadChoice",
     70                    desktop,        @"DownloadFolder",
     71                    port,           @"BindPort",
     72                    DEFAULT_UPLOAD, @"UploadLimit",
     73                    @"YES",         @"CheckUpload",
     74                    @"YES",         @"CheckQuit",
     75                    @"YES",         @"CheckRemove",
    6676                    NULL];
    67     [defaults registerDefaults: appDefaults];
    68 
    69     /* Apply settings */
    70     tr_setBindPort( fHandle, [defaults integerForKey: @"BindPort"] );
    71     tr_setUploadLimit( fHandle, [defaults integerForKey: @"UploadLimit"] );
    72 }
    73 
    74 /***********************************************************************
    75  * show
    76  ***********************************************************************
    77  *
    78  **********************************************************************/
    79 - (void) show: (id) sender
    80 {
    81     NSRect  mainFrame;
    82     NSRect  prefsFrame;
    83     NSRect  screenRect;
    84     NSPoint point;
    85 
    86     [self loadSettings];
    87 
    88     /* Place the window */
    89     mainFrame  = [fWindow frame];
    90     prefsFrame = [fPrefsWindow frame];
    91     screenRect = [[NSScreen mainScreen] visibleFrame];
    92     point.x    = mainFrame.origin.x + mainFrame.size.width / 2 -
    93                     prefsFrame.size.width / 2;
    94     point.y    = mainFrame.origin.y + mainFrame.size.height - 30;
    95 
    96     /* Make sure it is in the screen */
    97     if( point.x < screenRect.origin.x )
    98     {
    99         point.x = screenRect.origin.x;
    100     }
    101     if( point.x + prefsFrame.size.width >
    102             screenRect.origin.x + screenRect.size.width )
    103     {
    104         point.x = screenRect.origin.x +
    105             screenRect.size.width - prefsFrame.size.width;
    106     }
    107     if( point.y - prefsFrame.size.height < screenRect.origin.y )
    108     {
    109         point.y = screenRect.origin.y + prefsFrame.size.height;
    110     }
    111 
    112     [fPrefsWindow setFrameTopLeftPoint: point];
    113     [fPrefsWindow makeKeyAndOrderFront: NULL];
    114 }
    115 
    116 /***********************************************************************
    117  * ratio
    118  ***********************************************************************
    119  *
    120  **********************************************************************/
    121 - (void) ratio: (id) sender
    122 {
    123     [fFolderPopUp setEnabled: ![fFolderMatrix selectedRow]];
    124 }
    125 
    126 /***********************************************************************
    127  * check
    128  ***********************************************************************
    129  *
    130  **********************************************************************/
    131 - (void) check: (id) sender
    132 {
    133     if( [fUploadCheck state] == NSOnState )
    134     {
    135         [fUploadField setEnabled: YES];
     77    [[NSUserDefaults standardUserDefaults] registerDefaults: appDefaults];
     78}
     79
     80- (void)dealloc
     81{
     82    [fDownloadFolder release];
     83    [super dealloc];
     84}
     85
     86- (void) setPrefsWindow: (tr_handle_t *) handle
     87{
     88    fToolbar = [[NSToolbar alloc] initWithIdentifier: @"Preferences Toolbar"];
     89    [fToolbar setDelegate: self];
     90    [fToolbar setAllowsUserCustomization: NO];
     91    [fPrefsWindow setToolbar: fToolbar];
     92    [fToolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
     93    [fToolbar setSizeMode: NSToolbarSizeModeRegular];
     94    [fPrefsWindow setShowsToolbarButton: NO];
     95   
     96    [fToolbar setSelectedItemIdentifier: TOOLBAR_GENERAL];
     97    [self setPrefView: fGeneralView];
     98
     99    fDefaults = [NSUserDefaults standardUserDefaults];
     100   
     101    //set download folder
     102    NSString * downloadChoice  = [fDefaults stringForKey: @"DownloadChoice"];
     103    fDownloadFolder = [fDefaults stringForKey: @"DownloadFolder"];
     104    [fDownloadFolder retain];
     105
     106    if( [downloadChoice isEqualToString: @"Constant"] )
     107    {
     108        [fFolderMatrix selectCellAtRow: DOWNLOAD_FOLDER column: 0];
     109    }
     110    else if( [downloadChoice isEqualToString: @"Torrent"] )
     111    {
     112        [fFolderMatrix selectCellAtRow: DOWNLOAD_TORRENT column: 0];
    136113    }
    137114    else
    138115    {
    139         [fUploadField setEnabled: NO];
    140         [fUploadField setStringValue: @""];
    141     }
    142 }
    143 
    144 /***********************************************************************
    145  * cancel
    146  ***********************************************************************
    147  * Discards changes and closes the Preferences window
    148  **********************************************************************/
    149 - (void) cancel: (id) sender
    150 {
    151     [fDownloadFolder release];
    152     [fPrefsWindow close];
    153 }
    154 
    155 /***********************************************************************
    156  * save
    157  ***********************************************************************
    158  * Checks the user-defined options. If they are correct, saves settings
    159  * and closes the Preferences window. Otherwise corrects them and leaves
    160  * the window open
    161  **********************************************************************/
    162 - (void) save: (id) sender
    163 {
    164     int              bindPort;
    165     int              uploadLimit;
    166 
    167     /* Bind port */
    168     bindPort = [fPortField intValue];
    169     bindPort = MAX( 1, bindPort );
    170     bindPort = MIN( bindPort, 65535 );
    171 
    172     if( ![[fPortField stringValue] isEqualToString:
    173             [NSString stringWithFormat: @"%d", bindPort]] )
    174     {
     116        [fFolderMatrix selectCellAtRow: DOWNLOAD_ASK column: 0];
     117    }
     118    [self updatePopUp];
     119    [fFolderPopUp setEnabled: [fFolderMatrix selectedRow] == 0];
     120
     121    //set bind port
     122    int bindPort = [fDefaults integerForKey: @"BindPort"];
     123    [fPortField setIntValue: bindPort];
     124    fHandle = handle;
     125    tr_setBindPort( fHandle, bindPort );
     126   
     127    //checks for old version upload speed of -1
     128    if ([fDefaults integerForKey: @"UploadLimit"] < 0)
     129    {
     130        [fDefaults setObject: DEFAULT_UPLOAD forKey: @"UploadLimit"];
     131        [fDefaults setObject: @"NO" forKey: @"CheckUpload"];
     132    }
     133   
     134    //set upload limit
     135    BOOL checkUpload = [[fDefaults stringForKey: @"CheckUpload"] isEqualToString:@"YES"];
     136    int uploadLimit = [fDefaults integerForKey: @"UploadLimit"];
     137   
     138    [fUploadCheck setState: checkUpload ? NSOnState : NSOffState];
     139    [fUploadField setIntValue: uploadLimit];
     140    [fUploadField setEnabled: checkUpload];
     141   
     142    if (!checkUpload || uploadLimit == 0)
     143        uploadLimit = -1;
     144    tr_setUploadLimit( fHandle, uploadLimit );
     145   
     146    //set remove and quit prompts
     147    [fQuitCheck setState:([[fDefaults stringForKey: @"CheckQuit"]
     148                isEqualToString:@"YES"] ? NSOnState : NSOffState)];
     149    [fRemoveCheck setState:([[fDefaults stringForKey: @"CheckRemove"]
     150                isEqualToString:@"YES"] ? NSOnState : NSOffState)];
     151}
     152
     153- (NSToolbarItem *) toolbar: (NSToolbar *) t itemForItemIdentifier:
     154    (NSString *) ident willBeInsertedIntoToolbar: (BOOL) flag
     155{
     156    NSToolbarItem * item;
     157    item = [[NSToolbarItem alloc] initWithItemIdentifier: ident];
     158
     159    if ([ident isEqualToString: TOOLBAR_GENERAL])
     160    {
     161        [item setLabel: TOOLBAR_GENERAL];
     162        [item setImage: [NSImage imageNamed: @"Preferences.png"]];
     163        [item setTarget: self];
     164        [item setAction: @selector( showGeneralPref: )];
     165    }
     166    else if ([ident isEqualToString: TOOLBAR_NETWORK])
     167    {
     168        [item setLabel: TOOLBAR_NETWORK];
     169        [item setImage: [NSImage imageNamed: @"Network.png"]];
     170        [item setTarget: self];
     171        [item setAction: @selector( showNetworkPref: )];
     172    }
     173    else
     174    {
     175        [item release];
     176        return nil;
     177    }
     178
     179    return item;
     180}
     181
     182- (NSArray *) toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar
     183{
     184    return [self toolbarDefaultItemIdentifiers: nil];
     185}
     186
     187- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *)toolbar
     188{
     189    return [self toolbarAllowedItemIdentifiers: nil];
     190}
     191
     192- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *)toolbar
     193{
     194    return [NSArray arrayWithObjects:
     195            TOOLBAR_GENERAL,
     196            TOOLBAR_NETWORK,
     197            nil];
     198}
     199
     200- (void) setPort: (id) sender
     201{
     202    int bindPort = [fPortField intValue];
     203   
     204    //if value entered is not an int or is not in range do not change
     205    if (![[fPortField stringValue] isEqualToString:
     206            [NSString stringWithFormat: @"%d", bindPort]]
     207            || bindPort < MIN_PORT
     208            || bindPort > MAX_PORT)
     209    {
     210        NSBeep();
     211        bindPort = [fDefaults integerForKey: @"BindPort"];
    175212        [fPortField setIntValue: bindPort];
    176         return;
    177     }
    178 
    179     /* Upload limit */
    180     if( [fUploadCheck state] == NSOnState )
    181     {
    182         uploadLimit = [fUploadField intValue];
    183         uploadLimit = MAX( 0, uploadLimit );
    184 
    185         if( ![[fUploadField stringValue] isEqualToString:
    186                 [NSString stringWithFormat: @"%d", uploadLimit]] )
    187         {
    188             [fUploadField setIntValue: uploadLimit];
    189             return;
    190         }
    191     }
    192 
    193     [self saveSettings];
    194     [self cancel: NULL];
    195 }
    196 
    197 @end /* @implementation PrefsController */
    198 
    199 @implementation PrefsController (Private)
     213    }
     214    else
     215    {
     216        tr_setBindPort( fHandle, bindPort );
     217        [fDefaults setObject: [NSString stringWithFormat: @"%d", bindPort]
     218                    forKey: @"BindPort"];
     219    }
     220}
     221
     222- (void) setLimitUploadCheck: (id) sender
     223{
     224    BOOL checkUpload = [fUploadCheck state] == NSOnState;
     225
     226    [fDefaults setObject: checkUpload ? @"YES" : @"NO"
     227                            forKey: @"CheckUpload"];
     228   
     229    [self setUploadLimit: sender];
     230    [fUploadField setEnabled: checkUpload];
     231}
     232
     233- (void) setUploadLimit: (id) sender
     234{
     235    int uploadLimit = [fUploadField intValue];
     236   
     237    //if value entered is not an int or is less than 0 do not change
     238    if (![[fUploadField stringValue] isEqualToString:
     239            [NSString stringWithFormat: @"%d", uploadLimit]]
     240            || uploadLimit < 0)
     241    {
     242        NSBeep();
     243        uploadLimit = [fDefaults integerForKey: @"UploadLimit"];
     244        [fUploadField setIntValue: uploadLimit];
     245    }
     246    else
     247    {
     248        [fDefaults setObject: [NSString stringWithFormat: @"%d", uploadLimit]
     249            forKey: @"UploadLimit"];
     250    }
     251   
     252    if ([fUploadCheck state] == NSOffState || uploadLimit == 0)
     253        uploadLimit = -1;
     254    tr_setUploadLimit( fHandle, uploadLimit );
     255}
     256
     257- (void) setQuitMessage: (id) sender
     258{
     259    [fDefaults setObject: ([fQuitCheck state] == NSOnState ? @"YES" : @"NO")
     260                forKey: @"CheckQuit"];
     261}
     262
     263- (void) setRemoveMessage: (id) sender
     264{
     265    [fDefaults setObject: ([fRemoveCheck state] == NSOnState ? @"YES" : @"NO")
     266                forKey: @"CheckRemove"];
     267}
     268
     269- (void) setDownloadLocation: (id) sender
     270{
     271    //Download folder
     272    switch( [fFolderMatrix selectedRow] )
     273    {
     274        case DOWNLOAD_FOLDER:
     275            [fDefaults setObject: @"Constant" forKey: @"DownloadChoice"];
     276            break;
     277        case DOWNLOAD_TORRENT:
     278            [fDefaults setObject: @"Torrent" forKey: @"DownloadChoice"];
     279            break;
     280        case DOWNLOAD_ASK:
     281            [fDefaults setObject: @"Ask" forKey: @"DownloadChoice"];
     282            break;
     283    }
     284    [fFolderPopUp setEnabled: [fFolderMatrix selectedRow] == 0];
     285}
    200286
    201287- (void) folderSheetShow: (id) sender
    202288{
    203     NSOpenPanel * panel;
    204 
    205     panel = [NSOpenPanel openPanel];
     289    NSOpenPanel * panel = [NSOpenPanel openPanel];
    206290
    207291    [panel setPrompt:                  @"Select"];
     
    216300}
    217301
    218 - (void) folderSheetClosed: (NSOpenPanel *) s returnCode: (int) code
     302@end // @implementation PrefsController
     303
     304@implementation PrefsController (Private)
     305
     306- (void) showGeneralPref: (id) sender
     307{
     308    [self setPrefView: fGeneralView];
     309}
     310
     311- (void) showNetworkPref: (id) sender
     312{
     313    [self setPrefView: fNetworkView];
     314}
     315
     316- (void) setPrefView: (NSView *) view
     317{
     318    NSRect windowRect = [fPrefsWindow frame];
     319    int difference = [view frame].size.height - [[fPrefsWindow contentView] frame].size.height;
     320
     321    windowRect.origin.y -= difference;
     322    windowRect.size.height += difference;
     323   
     324    [fPrefsWindow setTitle: [fToolbar selectedItemIdentifier]];
     325    [fPrefsWindow setContentView: fBlankView];
     326    [fPrefsWindow setFrame:windowRect display: YES animate: YES];
     327    [fPrefsWindow setContentView: view];
     328}
     329
     330- (void) folderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code
    219331    contextInfo: (void *) info
    220332{
    221333    [fFolderPopUp selectItemAtIndex: 0];
    222334
    223     if( code != NSOKButton )
    224     {
     335    if (code != NSOKButton)
    225336        return;
    226     }
    227337
    228338    [fDownloadFolder release];
    229     fDownloadFolder = [[s filenames] objectAtIndex: 0];
     339    fDownloadFolder = [[openPanel filenames] objectAtIndex: 0];
    230340    [fDownloadFolder retain];
     341   
     342    [fDefaults setObject: fDownloadFolder forKey: @"DownloadFolder"];
    231343
    232344    [self updatePopUp];
    233345}
    234346
    235 /***********************************************************************
    236  * loadSettings
    237  ***********************************************************************
    238  * Update the interface with the current settings
    239  **********************************************************************/
    240 - (void) loadSettings
    241 {
    242     NSUserDefaults * defaults;
    243     NSString       * downloadChoice;
    244     int              uploadLimit;
    245 
    246     /* Fill with current settings */
    247     defaults = [NSUserDefaults standardUserDefaults];
    248 
    249     /* Download folder selection */
    250     downloadChoice  = [defaults stringForKey: @"DownloadChoice"];
    251     fDownloadFolder = [defaults stringForKey: @"DownloadFolder"];
    252     [fDownloadFolder retain];
    253 
    254     if( [downloadChoice isEqualToString: @"Constant"] )
    255     {
    256         [fFolderMatrix selectCellAtRow: 0 column: 0];
    257     }
    258     else if( [downloadChoice isEqualToString: @"Torrent"] )
    259     {
    260         [fFolderMatrix selectCellAtRow: 1 column: 0];
    261     }
    262     else
    263     {
    264         [fFolderMatrix selectCellAtRow: 2 column: 0];
    265     }
    266     [self ratio: NULL];
    267     [self updatePopUp];
    268 
    269     [fPortField setIntValue: [defaults integerForKey: @"BindPort"]];
    270 
    271     uploadLimit = [defaults integerForKey: @"UploadLimit"];
    272     if( uploadLimit < 0 )
    273     {
    274         [fUploadCheck setState: NSOffState];
    275     }
    276     else
    277     {
    278         [fUploadCheck setState: NSOnState];
    279         [fUploadField setIntValue: uploadLimit];
    280     }
    281     [self check: NULL];
    282 }
    283 
    284 /***********************************************************************
    285  * saveSettings
    286  ***********************************************************************
    287  *
    288  **********************************************************************/
    289 - (void) saveSettings
    290 {
    291     NSUserDefaults * defaults;
    292     int              bindPort;
    293     int              uploadLimit;
    294 
    295     defaults = [NSUserDefaults standardUserDefaults];
    296 
    297     /* Download folder */
    298     switch( [fFolderMatrix selectedRow] )
    299     {
    300         case 0:
    301             [defaults setObject: @"Constant" forKey: @"DownloadChoice"];
    302             break;
    303         case 1:
    304             [defaults setObject: @"Torrent" forKey: @"DownloadChoice"];
    305             break;
    306         case 2:
    307             [defaults setObject: @"Ask" forKey: @"DownloadChoice"];
    308             break;
    309     }
    310     [defaults setObject: fDownloadFolder forKey: @"DownloadFolder"];
    311 
    312     /* Bind port */
    313     bindPort = [fPortField intValue];
    314     tr_setBindPort( fHandle, bindPort );
    315     [defaults setObject: [NSString stringWithFormat: @"%d", bindPort]
    316         forKey: @"BindPort"];
    317 
    318     /* Upload limit */
    319     if( [fUploadCheck state] == NSOnState )
    320     {
    321         uploadLimit = [fUploadField intValue];
    322     }
    323     else
    324     {
    325         uploadLimit = -1;
    326     }
    327     tr_setUploadLimit( fHandle, uploadLimit );
    328     [defaults setObject: [NSString stringWithFormat: @"%d", uploadLimit]
    329         forKey: @"UploadLimit"];
    330 }
    331 
    332 /***********************************************************************
    333  * updatePopUp
    334  ***********************************************************************
    335  * Uses fDownloadFolder to update the displayed folder name and icon
    336  **********************************************************************/
    337347- (void) updatePopUp
    338348{
     
    340350    NSImage        * image32, * image16;
    341351
    342     /* Set up the pop up */
    343     [fFolderPopUp        removeAllItems];
    344     [fFolderPopUp        addItemWithTitle: @""];
    345     [[fFolderPopUp menu] addItem: [NSMenuItem separatorItem]];
    346     [fFolderPopUp        addItemWithTitle: @"Other..."];
    347 
    348     menuItem = (NSMenuItem *) [fFolderPopUp lastItem];
    349     [menuItem setTarget: self];
    350     [menuItem setAction: @selector( folderSheetShow: )];
    351 
    352     /* Get the icon for the folder */
     352    // Get the icon for the folder
    353353    image32 = [[NSWorkspace sharedWorkspace] iconForFile:
    354354                fDownloadFolder];
    355355    image16 = [[NSImage alloc] initWithSize: NSMakeSize(16,16)];
    356356
    357     /* 32x32 -> 16x16 scaling */
     357    // 32x32 -> 16x16 scaling
    358358    [image16 lockFocus];
    359359    [[NSGraphicsContext currentContext]
     
    364364    [image16 unlockFocus];
    365365
    366     /* Update the menu item */
     366    // Update the menu item
    367367    menuItem = (NSMenuItem *) [fFolderPopUp itemAtIndex: 0];
    368368    [menuItem setTitle: [fDownloadFolder lastPathComponent]];
  • trunk/macosx/TorrentTableView.h

    r3 r19  
    1111    tr_stat_t            * fStat;
    1212    NSPoint                fClickPoint;
     13   
     14    IBOutlet NSMenu     * fContextRow;
     15    IBOutlet NSMenu     * fContextNoRow;
    1316}
    1417
  • trunk/macosx/TorrentTableView.m

    r7 r19  
    5757}
    5858
    59 
    6059- (BOOL) pointInPauseRect: (NSPoint) point
    6160{
     
    115114    point = [self convertPoint: [e locationInWindow] fromView: NULL];
    116115    row = [self rowAtPoint: point];
     116   
     117    [self selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
    117118
    118     if( row < 0 )
    119     {
    120         return NULL;
    121     }
    122 
    123     [self selectRowIndexes: [NSIndexSet indexSetWithIndex: row]
    124         byExtendingSelection: NO];
    125     return [fController menuForIndex: row];
     119    return row >= 0 ? fContextRow : fContextNoRow;
    126120}
    127121
  • trunk/macosx/Transmission.xcodeproj/project.pbxproj

    r16 r19  
    1919                4D752E930913C949008EAAD4 /* Preferences.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D752E920913C949008EAAD4 /* Preferences.png */; };
    2020                4D813EB508AA43AC00191DB4 /* Progress.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D813EB408AA43AC00191DB4 /* Progress.png */; };
     21                4D8CEF91095870E00063BAEA /* Network.png in Resources */ = {isa = PBXBuildFile; fileRef = 4D8CEF90095870E00063BAEA /* Network.png */; };
    2122                4DA6FDBA0911233800450CB1 /* PauseOn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB80911233800450CB1 /* PauseOn.png */; };
    2223                4DA6FDBB0911233800450CB1 /* PauseOff.png in Resources */ = {isa = PBXBuildFile; fileRef = 4DA6FDB90911233800450CB1 /* PauseOff.png */; };
     
    8586                4D752E920913C949008EAAD4 /* Preferences.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Preferences.png; path = Images/Preferences.png; sourceTree = "<group>"; };
    8687                4D813EB408AA43AC00191DB4 /* Progress.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Progress.png; path = Images/Progress.png; sourceTree = "<group>"; };
     88                4D8CEF90095870E00063BAEA /* Network.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Network.png; path = Images/Network.png; sourceTree = "<group>"; };
    8789                4DA6FDB80911233800450CB1 /* PauseOn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOn.png; path = Images/PauseOn.png; sourceTree = "<group>"; };
    8890                4DA6FDB90911233800450CB1 /* PauseOff.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = PauseOff.png; path = Images/PauseOff.png; sourceTree = "<group>"; };
     
    195197                                4DA6FDC4091141AD00450CB1 /* ResumeOn.png */,
    196198                                4D752E920913C949008EAAD4 /* Preferences.png */,
     199                                4D8CEF90095870E00063BAEA /* Network.png */,
    197200                                8D1107310486CEB800E47090 /* Info.plist */,
    198201                                089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
     
    284287                                4DA6FDC6091141AD00450CB1 /* ResumeOn.png in Resources */,
    285288                                4D752E930913C949008EAAD4 /* Preferences.png in Resources */,
     289                                4D8CEF91095870E00063BAEA /* Network.png in Resources */,
    286290                        );
    287291                        runOnlyForDeploymentPostprocessing = 0;
     
    332336                                        i386,
    333337                                );
    334                                 FRAMEWORK_SEARCH_PATHS = (
    335                                         "$(FRAMEWORK_SEARCH_PATHS)",
    336                                 );
     338                                FRAMEWORK_SEARCH_PATHS = "$(FRAMEWORK_SEARCH_PATHS)";
    337339                                GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
    338340                                GCC_OPTIMIZATION_LEVEL = 3;
Note: See TracChangeset for help on using the changeset viewer.