1/******************************************************************************
2 * $Id: TrackerTableView.m 13162 2012-01-14 17:12:04Z livings124 $
3 * 
4 * Copyright (c) 2008-2012 Transmission authors and contributors
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
24
25#import "TrackerTableView.h"
26#import "Torrent.h"
27#import "TrackerNode.h"
28
29@implementation TrackerTableView
30
31- (void) mouseDown: (NSEvent *) event
32{
33    [[self window] makeKeyWindow];
34    [super mouseDown: event];
35}
36
37- (void) setTorrent: (Torrent *) torrent
38{
39    fTorrent = torrent;
40}
41
42- (void) setTrackers: (NSArray *) trackers
43{
44    fTrackers = trackers;
45}
46
47- (void) copy: (id) sender
48{
49    NSMutableArray * addresses = [NSMutableArray arrayWithCapacity: [fTrackers count]];
50    NSIndexSet * indexes = [self selectedRowIndexes];
51    for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i])
52    {
53        id item = [fTrackers objectAtIndex: i];
54        if (![item isKindOfClass: [TrackerNode class]])
55        {
56            for (++i; i < [fTrackers count] && [[fTrackers objectAtIndex: i] isKindOfClass: [TrackerNode class]]; ++i)
57                [addresses addObject: [(TrackerNode *)[fTrackers objectAtIndex: i] fullAnnounceAddress]];
58            --i;
59        }
60        else
61            [addresses addObject: [(TrackerNode *)item fullAnnounceAddress]];
62    }
63    
64    NSString * text = [addresses componentsJoinedByString: @"\n"];
65    
66    NSPasteboard * pb = [NSPasteboard generalPasteboard];
67    [pb clearContents];
68    [pb writeObjects: [NSArray arrayWithObject: text]];
69}
70
71- (void) paste: (id) sender
72{
73    NSAssert(fTorrent != nil, @"no torrent but trying to paste; should not be able to call this method");
74    
75    BOOL added = NO;
76    
77    NSArray * items = [[NSPasteboard generalPasteboard] readObjectsForClasses: [NSArray arrayWithObject: [NSString class]] options: nil];
78    NSAssert(items != nil, @"no string items to paste; should not be able to call this method");
79    
80    for (NSString * pbItem in items)
81    {
82        for (NSString * item in [pbItem componentsSeparatedByString: @"\n"])
83            if ([fTorrent addTrackerToNewTier: item])
84                added = YES;
85    }
86    
87    //none added
88    if (!added)
89        NSBeep();
90}
91
92- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
93{
94    const SEL action = [menuItem action];
95    
96    if (action == @selector(copy:))
97        return [self numberOfSelectedRows] > 0;
98    
99    if (action == @selector(paste:))
100        return fTorrent && [[NSPasteboard generalPasteboard] canReadObjectForClasses: [NSArray arrayWithObject: [NSString class]] options: nil];
101    
102    return YES;
103}
104
105@end
106