1 /******************************************************************************
2 * $Id: StatsWindowController.m 11419 2010-11-14 21:51:56Z livings124 $
4 * Copyright (c) 2007-2010 Transmission authors and contributors
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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 *****************************************************************************/
25 #import "StatsWindowController.h"
26 #import "NSStringAdditions.h"
28 #define UPDATE_SECONDS 1.0
30 @interface StatsWindowController (Private)
34 - (void) performResetStats;
35 - (void) resetSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info;
39 @implementation StatsWindowController
41 StatsWindowController * fStatsWindowInstance = nil;
43 + (StatsWindowController *) statsWindow: (tr_session *) lib
45 if (!fStatsWindowInstance)
47 if ((fStatsWindowInstance = [[self alloc] initWithWindowNibName: @"StatsWindow"]))
52 return fStatsWindowInstance;
59 fTimer = [NSTimer scheduledTimerWithTimeInterval: UPDATE_SECONDS target: self
60 selector: @selector(updateStats) userInfo: nil repeats: YES];
61 [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode];
62 [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode];
64 [[self window] setTitle: NSLocalizedString(@"Statistics", "Stats window -> title")];
67 [fUploadedLabelField setStringValue: [NSLocalizedString(@"Uploaded", "Stats window -> label") stringByAppendingString: @":"]];
68 [fDownloadedLabelField setStringValue: [NSLocalizedString(@"Downloaded", "Stats window -> label") stringByAppendingString: @":"]];
69 [fRatioLabelField setStringValue: [NSLocalizedString(@"Ratio", "Stats window -> label") stringByAppendingString: @":"]];
70 [fTimeLabelField setStringValue: [NSLocalizedString(@"Running Time", "Stats window -> label") stringByAppendingString: @":"]];
71 [fNumOpenedLabelField setStringValue: [NSLocalizedString(@"Program Started", "Stats window -> label")
72 stringByAppendingString: @":"]];
75 const CGFloat oldWidth = [fUploadedLabelField frame].size.width;
77 [fUploadedLabelField sizeToFit];
78 [fDownloadedLabelField sizeToFit];
79 [fRatioLabelField sizeToFit];
80 [fTimeLabelField sizeToFit];
81 [fNumOpenedLabelField sizeToFit];
83 CGFloat maxWidth = MAX([fUploadedLabelField frame].size.width, [fDownloadedLabelField frame].size.width);
84 maxWidth = MAX(maxWidth, [fRatioLabelField frame].size.width);
85 maxWidth = MAX(maxWidth, [fTimeLabelField frame].size.width);
86 maxWidth = MAX(maxWidth, [fNumOpenedLabelField frame].size.width);
88 NSRect frame = [fUploadedLabelField frame];
89 frame.size.width = maxWidth;
90 [fUploadedLabelField setFrame: frame];
92 frame = [fDownloadedLabelField frame];
93 frame.size.width = maxWidth;
94 [fDownloadedLabelField setFrame: frame];
96 frame = [fRatioLabelField frame];
97 frame.size.width = maxWidth;
98 [fRatioLabelField setFrame: frame];
100 frame = [fTimeLabelField frame];
101 frame.size.width = maxWidth;
102 [fTimeLabelField setFrame: frame];
104 frame = [fNumOpenedLabelField frame];
105 frame.size.width = maxWidth;
106 [fNumOpenedLabelField setFrame: frame];
108 //resize window for new label width - fields are set in nib to adjust correctly
109 NSRect windowRect = [[self window] frame];
110 windowRect.size.width += maxWidth - oldWidth;
111 [[self window] setFrame: windowRect display: YES];
113 //resize reset button
114 const CGFloat oldButtonWidth = [fResetButton frame].size.width;
116 [fResetButton setTitle: NSLocalizedString(@"Reset", "Stats window -> reset button")];
117 [fResetButton sizeToFit];
119 NSRect buttonFrame = [fResetButton frame];
120 buttonFrame.size.width += 10.0;
121 buttonFrame.origin.x -= buttonFrame.size.width - oldButtonWidth;
122 [fResetButton setFrame: buttonFrame];
125 - (void) windowWillClose: (id) sender
129 [fStatsWindowInstance release];
130 fStatsWindowInstance = nil;
133 - (void) resetStats: (id) sender
135 if (![[NSUserDefaults standardUserDefaults] boolForKey: @"WarningResetStats"])
137 [self performResetStats];
141 NSAlert * alert = [[NSAlert alloc] init];
142 [alert setMessageText: NSLocalizedString(@"Are you sure you want to reset usage statistics?", "Stats reset -> title")];
143 [alert setInformativeText: NSLocalizedString(@"This will clear the global statistics displayed by Transmission."
144 " Individual transfer statistics will not be affected.", "Stats reset -> message")];
145 [alert setAlertStyle: NSWarningAlertStyle];
146 [alert addButtonWithTitle: NSLocalizedString(@"Reset", "Stats reset -> button")];
147 [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Stats reset -> button")];
148 [alert setShowsSuppressionButton: YES];
150 [alert beginSheetModalForWindow: [self window] modalDelegate: self
151 didEndSelector: @selector(resetSheetClosed:returnCode:contextInfo:) contextInfo: nil];
154 - (NSString *) windowFrameAutosaveName
156 return @"StatsWindow";
161 @implementation StatsWindowController (Private)
165 tr_session_stats statsAll, statsSession;
166 tr_sessionGetCumulativeStats(fLib, &statsAll);
167 tr_sessionGetStats(fLib, &statsSession);
169 [fUploadedField setStringValue: [NSString stringForFileSize: statsSession.uploadedBytes]];
170 [fUploadedField setToolTip: [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"),
171 [NSString formattedUInteger: statsSession.uploadedBytes]]];
172 [fUploadedAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"),
173 [NSString stringForFileSize: statsAll.uploadedBytes]]];
174 [fUploadedAllField setToolTip: [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"),
175 [NSString formattedUInteger: statsAll.uploadedBytes]]];
177 [fDownloadedField setStringValue: [NSString stringForFileSize: statsSession.downloadedBytes]];
178 [fDownloadedField setToolTip: [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"),
179 [NSString formattedUInteger: statsSession.downloadedBytes]]];
180 [fDownloadedAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"),
181 [NSString stringForFileSize: statsAll.downloadedBytes]]];
182 [fDownloadedAllField setToolTip: [NSString stringWithFormat: NSLocalizedString(@"%@ bytes", "stats -> bytes"),
183 [NSString formattedUInteger: statsAll.downloadedBytes]]];
185 [fRatioField setStringValue: [NSString stringForRatio: statsSession.ratio]];
187 NSString * totalRatioString = statsAll.ratio != TR_RATIO_NA
188 ? [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"), [NSString stringForRatio: statsAll.ratio]]
189 : NSLocalizedString(@"Total N/A", "stats total");
190 [fRatioAllField setStringValue: totalRatioString];
192 [fTimeField setStringValue: [NSString timeString: statsSession.secondsActive showSeconds: NO]];
193 [fTimeAllField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%@ total", "stats total"),
194 [NSString timeString: statsAll.secondsActive showSeconds: NO]]];
196 if (statsAll.sessionCount == 1)
197 [fNumOpenedField setStringValue: NSLocalizedString(@"1 time", "stats window -> times opened")];
199 [fNumOpenedField setStringValue: [NSString stringWithFormat: NSLocalizedString(@"%llu times", "stats window -> times opened"),
200 statsAll.sessionCount]];
203 - (void) performResetStats
205 tr_sessionClearStats(fLib);
209 - (void) resetSheetClosed: (NSAlert *) alert returnCode: (NSInteger) code contextInfo: (void *) info
211 [[alert window] orderOut: nil];
213 if ([[alert suppressionButton] state] == NSOnState)
214 [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningResetStats"];
216 if (code == NSAlertFirstButtonReturn)
217 [self performResetStats];