From: <mst...@us...> - 2010-01-28 09:44:05
|
Revision: 1503 http://vienna-rss.svn.sourceforge.net/vienna-rss/?rev=1503&view=rev Author: mstroeck Date: 2010-01-28 09:43:41 +0000 (Thu, 28 Jan 2010) Log Message: ----------- Patch by Peter Hosey: Make the filename in StdEnclosureView clickable and copy-able. Modified Paths: -------------- trunk/2.5.0/MainMenu.nib/designable.nib trunk/2.5.0/MainMenu.nib/keyedobjects.nib trunk/2.5.0/StdEnclosureView.h trunk/2.5.0/StdEnclosureView.m trunk/2.5.0/Vienna.xcodeproj/project.pbxproj Added Paths: ----------- trunk/2.5.0/DSClickableURLTextField.h trunk/2.5.0/DSClickableURLTextField.m Added: trunk/2.5.0/DSClickableURLTextField.h =================================================================== --- trunk/2.5.0/DSClickableURLTextField.h (rev 0) +++ trunk/2.5.0/DSClickableURLTextField.h 2010-01-28 09:43:41 UTC (rev 1503) @@ -0,0 +1,68 @@ +/* + DSClickableURLTextField + + Copyright (c) 2006 - 2007 Night Productions, by Darkshadow. All Rights Reserved. + http://www.nightproductions.net/developer.htm + dar...@ni... + + May be used freely, but keep my name/copyright in the header. + + There is NO warranty of any kind, express or implied; use at your own risk. + Responsibility for damages (if any) to anyone resulting from the use of this + code rests entirely with the user. + + ------------------------------------ + + * August 25, 2006 - initial release + * August 30, 2006 + • Fixed a bug where cursor rects would be enabled even if the + textfield wasn't visible. i.e. it's in a scrollview, but the + textfield isn't scrolled to where it's visible. + • Fixed an issue where mouseUp wouldn't be called and so clicking + on the URL would have no effect when the textfield is a subview + of a splitview (and maybe some other certain views). I did this + by NOT calling super in -mouseDown:. Since the textfield is + non-editable and non-selectable, I don't believe this will cause + any problems. + • Fixed the fact that it was using the textfield's bounds rather than + the cell's bounds to calculate rects. + * May 25, 2007 + Contributed by Jens Miltner: + • Fixed a problem with the text storage and the text field's + attributed string value having different lengths, causing + range exceptions. + • Added a delegate method allowing custom handling of URLs. + • Tracks initially clicked URL at -mouseDown: to avoid situations + where dragging would end up in a different URL at -mouseUp:, opening + that URL. This includes situations where the user clicks on an empty + area of the text field, drags the mouse, and ends up on top of a + link, which would then erroneously open that link. + • Fixed to allow string links to work as well as URL links. + Changes by Darkshadow: + • Overrode -initWithCoder:, -initWithFrame:, and -awakeFromNib to + explicitly set the text field to be non-editable and + non-selectable. Now you don't need to remember to set this up, + and the class will work correctly regardless. + • Added in the ability for the user to copy URLs to the clipboard. + Note that this is off by default. + • Some code clean up. +*/ + +#import <Cocoa/Cocoa.h> + +@interface DSClickableURLTextField : NSTextField { + NSTextStorage *URLStorage; + NSLayoutManager *URLManager; + NSTextContainer *URLContainer; + NSURL *clickedURL; + BOOL canCopyURLs; +} + +- (void)setCanCopyURLs:(BOOL)aFlag; +- (BOOL)canCopyURLs; + +@end + +@interface NSObject (DSClickableURLTextFieldDelegate) +- (BOOL)textField:(id)textField openURL:(NSURL*)url; +@end \ No newline at end of file Added: trunk/2.5.0/DSClickableURLTextField.m =================================================================== --- trunk/2.5.0/DSClickableURLTextField.m (rev 0) +++ trunk/2.5.0/DSClickableURLTextField.m 2010-01-28 09:43:41 UTC (rev 1503) @@ -0,0 +1,276 @@ +/* + DSClickableURLTextField + + Copyright (c) 2006 - 2007 Night Productions, by Darkshadow. All Rights Reserved. + http://www.nightproductions.net/developer.htm + dar...@ni... + + May be used freely, but keep my name/copyright in the header. + + There is NO warranty of any kind, express or implied; use at your own risk. + Responsibility for damages (if any) to anyone resulting from the use of this + code rests entirely with the user. + + ------------------------------------ + + * August 25, 2006 - initial release + * August 30, 2006 + • Fixed a bug where cursor rects would be enabled even if the + textfield wasn't visible. i.e. it's in a scrollview, but the + textfield isn't scrolled to where it's visible. + • Fixed an issue where mouseUp wouldn't be called and so clicking + on the URL would have no effect when the textfield is a subview + of a splitview (and maybe some other certain views). I did this + by NOT calling super in -mouseDown:. Since the textfield is + non-editable and non-selectable, I don't believe this will cause + any problems. + • Fixed the fact that it was using the textfield's bounds rather than + the cell's bounds to calculate rects. + * May 25, 2007 + Contributed by Jens Miltner: + • Fixed a problem with the text storage and the text field's + attributed string value having different lengths, causing + range exceptions. + • Added a delegate method allowing custom handling of URLs. + • Tracks initially clicked URL at -mouseDown: to avoid situations + where dragging would end up in a different URL at -mouseUp:, opening + that URL. This includes situations where the user clicks on an empty + area of the text field, drags the mouse, and ends up on top of a + link, which would then erroneously open that link. + • Fixed to allow string links to work as well as URL links. + Changes by Darkshadow: + • Overrode -initWithCoder:, -initWithFrame:, and -awakeFromNib to + explicitly set the text field to be non-editable and + non-selectable. Now you don't need to remember to set this up, + and the class will work correctly regardless. + • Added in the ability for the user to copy URLs to the clipboard. + Note that this is off by default. + • Some code clean up. +*/ + +#import "DSClickableURLTextField.h" + + +@implementation DSClickableURLTextField + +/* Set the text field to be non-editable and + non-selectable. */ +- (id)initWithCoder:(NSCoder *)coder +{ + if ( (self = [super initWithCoder:coder]) ) { + [self setEditable:NO]; + [self setSelectable:NO]; + canCopyURLs = NO; + } + + return self; +} + +/* Set the text field to be non-editable and + non-selectable. */ +- (id)initWithFrame:(NSRect)frameRect +{ + if ( (self = [super initWithFrame:frameRect]) ) { + [self setEditable:NO]; + [self setSelectable:NO]; + canCopyURLs = NO; + } + + return self; +} + +- (void)dealloc +{ + [clickedURL release]; + [URLStorage release]; + + [super dealloc]; +} + +/* Enforces that the text field be non-editable and + non-selectable. Probably not needed, but I always + like to be cautious. +*/ +- (void)awakeFromNib +{ + [self setEditable:NO]; + [self setSelectable:NO]; +} + +- (void)setAttributedStringValue:(NSAttributedString *)aStr +{ + [URLStorage setAttributedString:aStr]; + [[self window] invalidateCursorRectsForView:self]; + [super setAttributedStringValue:aStr]; +} + +- (void)setStringValue:(NSString *)aStr +{ + NSAttributedString *attrString = [[[NSAttributedString alloc] initWithString:aStr attributes:nil] autorelease]; + [self setAttributedStringValue:attrString]; +} + +- (void)setCanCopyURLs:(BOOL)aFlag +{ + canCopyURLs = aFlag; +} + +- (BOOL)canCopyURLs +{ + return canCopyURLs; +} + +- (void)resetCursorRects +{ + if ( [[self attributedStringValue] length] == 0 ) { + [super resetCursorRects]; + return; + } + + NSRect cellBounds = [[self cell] drawingRectForBounds:[self bounds]]; + + if ( URLStorage == nil ) { + BOOL cellWraps = ![[self cell] isScrollable]; + NSSize containerSize = NSMakeSize( cellWraps ? cellBounds.size.width : MAXFLOAT, cellWraps ? MAXFLOAT : cellBounds.size.height ); + URLContainer = [[[NSTextContainer alloc] initWithContainerSize:containerSize] autorelease]; + URLManager = [[[NSLayoutManager alloc] init] autorelease]; + URLStorage = [[NSTextStorage alloc] init]; + + [URLStorage addLayoutManager:URLManager]; + [URLManager addTextContainer:URLContainer]; + [URLContainer setLineFragmentPadding:2.f]; + + [URLStorage setAttributedString:[self attributedStringValue]]; + } + + unsigned myLength = [URLStorage length]; + NSRange returnRange = { NSNotFound, 0 }, stringRange = { 0, myLength }, glyphRange = { NSNotFound, 0 }; + NSCursor *pointingCursor = nil; + + /* Here mainly for 10.2 compatibility (in case anyone even tries for that anymore) */ + if ( [NSCursor respondsToSelector:@selector(pointingHandCursor)] ) { + pointingCursor = [NSCursor performSelector:@selector(pointingHandCursor)]; + } else { + [super resetCursorRects]; + return; + } + + /* Moved out of the while and for loops as there's no need to recalculate + it every time through */ + NSRect superVisRect = [self convertRect:[[self superview] visibleRect] fromView:[self superview]]; + + while ( stringRange.location < myLength ) { + id aVal = [URLStorage attribute:NSLinkAttributeName atIndex:stringRange.location longestEffectiveRange:&returnRange inRange:stringRange]; + + if ( aVal != nil ) { + NSRectArray aRectArray = NULL; + unsigned numRects = 0, j = 0; + glyphRange = [URLManager glyphRangeForCharacterRange:returnRange actualCharacterRange:nil]; + aRectArray = [URLManager rectArrayForGlyphRange:glyphRange withinSelectedGlyphRange:glyphRange inTextContainer:URLContainer rectCount:&numRects]; + for ( j = 0; j < numRects; j++ ) { + /* Check to make sure the rect is visible before setting the cursor */ + NSRect glyphRect = aRectArray[j]; + glyphRect.origin.x += cellBounds.origin.x; + glyphRect.origin.y += cellBounds.origin.y; + NSRect textRect = NSIntersectionRect(glyphRect, cellBounds); + NSRect cursorRect = NSIntersectionRect(textRect, superVisRect); + if ( NSIntersectsRect( textRect, superVisRect ) ) + [self addCursorRect:cursorRect cursor:pointingCursor]; + } + } + stringRange.location = NSMaxRange(returnRange); + stringRange.length = myLength - stringRange.location; + } +} + +- (NSURL*)urlAtMouse:(NSEvent *)mouseEvent +{ + NSURL* urlAtMouse = nil; + NSPoint mousePoint = [self convertPoint:[mouseEvent locationInWindow] fromView:nil]; + NSRect cellBounds = [[self cell] drawingRectForBounds:[self bounds]]; + + if ( ([URLStorage length] > 0 ) && [self mouse:mousePoint inRect:cellBounds] ) { + id aVal = nil; + NSRange returnRange = { NSNotFound, 0 }, glyphRange = { NSNotFound, 0 }; + NSRectArray linkRect = NULL; + unsigned glyphIndex = [URLManager glyphIndexForPoint:mousePoint inTextContainer:URLContainer]; + unsigned charIndex = [URLManager characterIndexForGlyphAtIndex:glyphIndex]; + unsigned numRects = 0, j = 0; + + aVal = [URLStorage attribute:NSLinkAttributeName atIndex:charIndex longestEffectiveRange:&returnRange inRange:NSMakeRange(charIndex, [URLStorage length] - charIndex)]; + if ( (aVal != nil) ) { + glyphRange = [URLManager glyphRangeForCharacterRange:returnRange actualCharacterRange:nil]; + linkRect = [URLManager rectArrayForGlyphRange:glyphRange withinSelectedGlyphRange:glyphRange inTextContainer:URLContainer rectCount:&numRects]; + for ( j = 0; j < numRects; j++ ) { + NSRect testHit = linkRect[j]; + testHit.origin.x += cellBounds.origin.x; + testHit.origin.x += cellBounds.origin.y; + if ( [self mouse:mousePoint inRect:NSIntersectionRect(testHit, cellBounds)] ) { + // be smart about links stored as strings + if ( [aVal isKindOfClass:[NSString class]] ) + aVal = [NSURL URLWithString:aVal]; + urlAtMouse = aVal; + break; + } + } + } + } + return urlAtMouse; +} + +- (NSMenu *)menuForEvent:(NSEvent *)aEvent +{ + if ( !canCopyURLs ) + return nil; + + NSURL *anURL = [self urlAtMouse:aEvent]; + + if ( anURL != nil ) { + NSMenu *aMenu = [[[NSMenu alloc] initWithTitle:@"Copy URL"] autorelease]; + NSMenuItem *anItem = [[[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Copy URL", @"Copy URL") action:@selector(copyURL:) keyEquivalent:@""] autorelease]; + [anItem setTarget:self]; + [anItem setRepresentedObject:anURL]; + [aMenu addItem:anItem]; + + return aMenu; + } + + return nil; +} + +- (void)copyURL:(id)sender +{ + NSPasteboard *copyBoard = [NSPasteboard pasteboardWithName:NSGeneralPboard]; + NSURL *copyURL = [sender representedObject]; + + [copyBoard declareTypes:[NSArray arrayWithObjects:NSURLPboardType, NSStringPboardType, nil] owner:nil]; + [copyURL writeToPasteboard:copyBoard]; + [copyBoard setString:[copyURL absoluteString] forType:NSStringPboardType]; +} + +- (void)mouseDown:(NSEvent *)mouseEvent +{ + /* Not calling [super mouseDown:] because there are some situations where + the mouse tracking is ignored otherwise. */ + + /* Remember which URL was clicked originally, so we don't end up opening + the wrong URL accidentally. + */ + [clickedURL release]; + clickedURL = [[self urlAtMouse:mouseEvent] retain]; +} + +- (void)mouseUp:(NSEvent *)mouseEvent +{ + NSURL* urlAtMouse = [self urlAtMouse:mouseEvent]; + if ( (urlAtMouse != nil) && [urlAtMouse isEqualTo:clickedURL] ) { + // check if delegate wants to open the URL itself, if not, let the workspace open the URL + if ( ([self delegate] == nil) || ![[self delegate] respondsToSelector:@selector(textField:openURL:)] || ![[self delegate] textField:self openURL:urlAtMouse] ) + [[NSWorkspace sharedWorkspace] openURL:urlAtMouse]; + } + [clickedURL release]; + clickedURL = nil; + [super mouseUp:mouseEvent]; +} + +@end Modified: trunk/2.5.0/MainMenu.nib/designable.nib =================================================================== --- trunk/2.5.0/MainMenu.nib/designable.nib 2010-01-27 06:47:53 UTC (rev 1502) +++ trunk/2.5.0/MainMenu.nib/designable.nib 2010-01-28 09:43:41 UTC (rev 1503) @@ -2,20 +2,20 @@ <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> <data> <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">10B504</string> - <string key="IBDocument.InterfaceBuilderVersion">740</string> - <string key="IBDocument.AppKitVersion">1038.22</string> - <string key="IBDocument.HIToolboxVersion">457.00</string> + <string key="IBDocument.SystemVersion">10A432</string> + <string key="IBDocument.InterfaceBuilderVersion">732</string> + <string key="IBDocument.AppKitVersion">1038</string> + <string key="IBDocument.HIToolboxVersion">437.00</string> <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> - <string key="NS.object.0">740</string> + <string key="NS.object.0">732</string> </object> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="1300"/> + <integer value="1288"/> <integer value="159"/> - <integer value="1288"/> <integer value="2"/> + <integer value="1300"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -51,7 +51,7 @@ <object class="NSMutableString" key="NSViewClass"> <characters key="NS.bytes">View</characters> </object> - <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string> + <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string> <string key="NSWindowContentMinSize">{213, 107}</string> <object class="NSView" key="NSWindowView" id="711948959"> <reference key="NSNextResponder"/> @@ -80,7 +80,7 @@ <string key="NSColorName">controlColor</string> <object class="NSColor" key="NSColor" id="129727851"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes> + <bytes key="NSWhite">MC42NjY2NjY2ODY1AA</bytes> </object> </object> <object class="NSColor" key="NSTextColor" id="539731423"> @@ -149,7 +149,7 @@ </object> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <reference key="NSContentView" ref="72820347"/> @@ -193,7 +193,7 @@ <reference key="NSSupport" ref="26"/> <object class="NSColor" key="NSBackgroundColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes> + <bytes key="NSWhite">MC4zMzMzMzI5ODU2AA</bytes> </object> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">6</int> @@ -263,7 +263,7 @@ <reference key="NSSuperview" ref="738924574"/> <reference key="NSTarget" ref="738924574"/> <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.99831080000000005</double> + <double key="NSPercent">0.99831080436706543</double> </object> <object class="NSScroller" id="212359314"> <reference key="NSNextResponder" ref="738924574"/> @@ -273,7 +273,7 @@ <int key="NSsFlags">1</int> <reference key="NSTarget" ref="738924574"/> <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.92227979999999998</double> + <double key="NSPercent">0.92227977514266968</double> </object> </object> <string key="NSFrame">{{-0.5, 1.5}, {287, 601}}</string> @@ -291,7 +291,7 @@ <string key="NSFrame">{{0, 600}, {286, 5}}</string> <reference key="NSSuperview" ref="280791632"/> <bool key="NSViewIsLayerTreeHost">YES</bool> - <double key="NSViewAlphaValue">0.54225352112676062</double> + <double key="NSViewAlphaValue">0.54225349426269531</double> <int key="NSViewLayerContentsRedrawPolicy">2</int> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> @@ -330,7 +330,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <reference key="NSContentView" ref="280791632"/> @@ -421,7 +421,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <int key="NSBorderType">3</int> @@ -432,7 +432,7 @@ <object class="NSButton" id="203729118"> <reference key="NSNextResponder" ref="711948959"/> <int key="NSvFlags">289</int> - <string key="NSFrame">{{906, 1}, {22, 20}}</string> + <string key="NSFrame">{{906, 0}, {22, 20}}</string> <reference key="NSSuperview" ref="711948959"/> <bool key="NSEnabled">YES</bool> <object class="NSButtonCell" key="NSCell" id="651808599"> @@ -456,7 +456,7 @@ <object class="NSTextField" id="388925009"> <reference key="NSNextResponder" ref="711948959"/> <int key="NSvFlags">289</int> - <string key="NSFrame">{{793, 1}, {114, 17}}</string> + <string key="NSFrame">{{793, 0}, {114, 17}}</string> <reference key="NSSuperview" ref="711948959"/> <bool key="NSEnabled">YES</bool> <object class="NSTextFieldCell" key="NSCell" id="66679686"> @@ -475,7 +475,7 @@ </object> <string key="NSScreenRect">{{0, 0}, {1280, 778}}</string> <string key="NSMinSize">{213, 129}</string> - <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string> + <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string> <string key="NSFrameAutosaveName">mainWindow</string> </object> <object class="NSMenu" id="603900990"> @@ -2142,7 +2142,7 @@ <reference key="NSSuperview" ref="87877221"/> <reference key="NSTarget" ref="87877221"/> <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.94333330000000004</double> + <double key="NSPercent">0.94333332777023315</double> </object> <object class="NSScroller" id="1026115909"> <reference key="NSNextResponder" ref="87877221"/> @@ -2152,7 +2152,7 @@ <int key="NSsFlags">1</int> <reference key="NSTarget" ref="87877221"/> <string key="NSAction">_doScroller:</string> - <double key="NSPercent">0.98944030000000005</double> + <double key="NSPercent">0.98944032192230225</double> </object> <object class="NSClipView" id="333120991"> <reference key="NSNextResponder" ref="87877221"/> @@ -2197,7 +2197,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <reference key="NSContentView" ref="612717267"/> @@ -2240,7 +2240,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <reference key="NSContentView" ref="594100282"/> @@ -2297,7 +2297,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <reference key="NSContentView" ref="90274653"/> @@ -2449,7 +2449,7 @@ <int key="NSvFlags">10</int> <string key="NSFrame">{{0, 46}, {491, 5}}</string> <reference key="NSSuperview" ref="349729022"/> - <double key="NSViewAlphaValue">0.7957746</double> + <double key="NSViewAlphaValue">0.79577457904815674</double> <string key="NSOffsets">{0, 0}</string> <object class="NSTextFieldCell" key="NSTitleCell"> <int key="NSCellFlags">67239424</int> @@ -2459,7 +2459,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <int key="NSBorderType">3</int> @@ -2579,7 +2579,7 @@ <reference key="NSBackgroundColor" ref="290907008"/> <object class="NSColor" key="NSTextColor"> <int key="NSColorSpace">3</int> - <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes> + <bytes key="NSWhite">MCAwLjgwMDAwMDAxMTkAA</bytes> </object> </object> <int key="NSBorderType">3</int> @@ -5880,6 +5880,7 @@ <string>1290.ImportedFromIB2</string> <string>1291.IBPluginDependency</string> <string>1291.ImportedFromIB2</string> + <string>1292.CustomClassName</string> <string>1292.IBPluginDependency</string> <string>1292.ImportedFromIB2</string> <string>130.IBPluginDependency</string> @@ -6342,7 +6343,7 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{54, 153}, {491, 49}}</string> + <string>{{648, 425}, {491, 49}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -6353,11 +6354,12 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> + <string>DSClickableURLTextField</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{44, 553}, {599, 29}}</string> + <string>{{44, 328}, {599, 29}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -6448,7 +6450,7 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{449, 186}, {238, 103}}</string> + <string>{{449, 74}, {238, 103}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -6465,7 +6467,7 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{298, 246}, {151, 203}}</string> + <string>{{298, 134}, {151, 203}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -6494,9 +6496,9 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{205, 131}, {942, 625}}</string> + <string>{{623, 407}, {942, 625}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{205, 131}, {942, 625}}</string> + <string>{{623, 407}, {942, 625}}</string> <boolean value="YES"/> <boolean value="NO"/> <boolean value="YES"/> @@ -6513,7 +6515,7 @@ <boolean value="YES"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> - <string>{{176, 449}, {471, 20}}</string> + <string>{{176, 337}, {471, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <boolean value="YES"/> <string>{{606, 513}, {352, 223}}</string> @@ -7062,6 +7064,14 @@ </object> </object> <object class="IBPartialClassDescription"> + <string key="className">DSClickableURLTextField</string> + <string key="superclassName">NSTextField</string> + <object class="IBClassDescriptionSource" key="sourceIdentifier" id="726604081"> + <string key="majorKey">IBProjectSource</string> + <string key="minorKey">DSClickableURLTextField.h</string> + </object> + </object> + <object class="IBPartialClassDescription"> <string key="className">ExtendedTableView</string> <string key="superclassName">NSTableView</string> <object class="IBClassDescriptionSource" key="sourceIdentifier" id="55834799"> @@ -7200,6 +7210,10 @@ </object> <object class="IBPartialClassDescription"> <string key="className">NSObject</string> + <reference key="sourceIdentifier" ref="726604081"/> + </object> + <object class="IBPartialClassDescription"> + <string key="className">NSObject</string> <reference key="sourceIdentifier" ref="924270668"/> </object> <object class="IBPartialClassDescription"> @@ -7325,8 +7339,8 @@ <bool key="EncodedWithXMLCoder">YES</bool> <string>NSButton</string> <string>NSImageView</string> + <string>DSClickableURLTextField</string> <string>NSTextField</string> - <string>NSTextField</string> </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> Modified: trunk/2.5.0/MainMenu.nib/keyedobjects.nib =================================================================== (Binary files differ) Modified: trunk/2.5.0/StdEnclosureView.h =================================================================== --- trunk/2.5.0/StdEnclosureView.h 2010-01-27 06:47:53 UTC (rev 1502) +++ trunk/2.5.0/StdEnclosureView.h 2010-01-28 09:43:41 UTC (rev 1503) @@ -20,11 +20,13 @@ #import <Cocoa/Cocoa.h> +@class DSClickableURLTextField; + @interface StdEnclosureView : NSView { IBOutlet NSImageView * fileImage; IBOutlet NSTextField * filenameLabel; - IBOutlet NSTextField * filenameField; + IBOutlet DSClickableURLTextField * filenameField; IBOutlet NSButton * downloadButton; NSString * enclosureFilename; BOOL isITunes; Modified: trunk/2.5.0/StdEnclosureView.m =================================================================== --- trunk/2.5.0/StdEnclosureView.m 2010-01-27 06:47:53 UTC (rev 1502) +++ trunk/2.5.0/StdEnclosureView.m 2010-01-28 09:43:41 UTC (rev 1503) @@ -21,6 +21,7 @@ #import "StdEnclosureView.h" #import "Preferences.h" #import "DownloadManager.h" +#import "DSClickableURLTextField.h" // Private functions @interface StdEnclosureView (Private) @@ -46,6 +47,14 @@ return self; } +/* awakeFromNib + * Configure our subviews upon awakening from nib storage. + */ +-(void)awakeFromNib +{ + [filenameField setCanCopyURLs:YES]; +} + /* handleDownloadCompleted * Called when a download completes. It might be the one showing in the view in which case we may * want to update the buttons. @@ -113,7 +122,13 @@ NSImage * iconImage = [[NSWorkspace sharedWorkspace] iconForFileType:ext]; [fileImage setImage:iconImage]; - [filenameField setStringValue:basename]; + NSDictionary *linkAttributes = [NSDictionary dictionaryWithObjectsAndKeys: + enclosureFilename, NSLinkAttributeName, + [NSColor colorWithCalibratedHue:240.0f/360.0f saturation:1.0f brightness:0.75f alpha:1.0f], NSForegroundColorAttributeName, + [NSNumber numberWithBool:YES], NSUnderlineStyleAttributeName, + nil]; + NSAttributedString * link = [[[NSAttributedString alloc] initWithString:basename attributes:linkAttributes] autorelease]; + [filenameField setAttributedStringValue:link]; } /* downloadFile Modified: trunk/2.5.0/Vienna.xcodeproj/project.pbxproj =================================================================== --- trunk/2.5.0/Vienna.xcodeproj/project.pbxproj 2010-01-27 06:47:53 UTC (rev 1502) +++ trunk/2.5.0/Vienna.xcodeproj/project.pbxproj 2010-01-28 09:43:41 UTC (rev 1503) @@ -263,6 +263,7 @@ B2B72E1610FF6252009201A9 /* sign_update.rb in Resources */ = {isa = PBXBuildFile; fileRef = B2B72E1410FF6252009201A9 /* sign_update.rb */; }; B2B72E1810FF626B009201A9 /* vienna_public_key.pem in Resources */ = {isa = PBXBuildFile; fileRef = B2B72E1710FF626B009201A9 /* vienna_public_key.pem */; }; B2C9673C106CD02B0056669A /* errorpage.html in Resources */ = {isa = PBXBuildFile; fileRef = B2C9673A106CD02B0056669A /* errorpage.html */; }; + B2E09F2D111192B7003B530A /* DSClickableURLTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = B2E09F2C111192B7003B530A /* DSClickableURLTextField.m */; }; /* End PBXBuildFile section */ /* Begin PBXBuildRule section */ @@ -893,6 +894,8 @@ B2C9673B106CD02B0056669A /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = de; path = de.lproj/errorpage.html; sourceTree = "<group>"; }; B2C96740106CD08A0056669A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/errorpage.html; sourceTree = "<group>"; }; B2C96742106CD09E0056669A /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = fr; path = fr.lproj/errorpage.html; sourceTree = "<group>"; }; + B2E09F2B111192B7003B530A /* DSClickableURLTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DSClickableURLTextField.h; sourceTree = "<group>"; }; + B2E09F2C111192B7003B530A /* DSClickableURLTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DSClickableURLTextField.m; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -963,6 +966,8 @@ 2A37F4ABFDCFA73011CA2CEA /* Classes */ = { isa = PBXGroup; children = ( + B2E09F2B111192B7003B530A /* DSClickableURLTextField.h */, + B2E09F2C111192B7003B530A /* DSClickableURLTextField.m */, AA0FB5E00869110300D9CB90 /* ActivityLog.h */, AA0FB5E10869110300D9CB90 /* ActivityLog.m */, AABFDC9F0609EA8100100A9B /* ActivityViewer.h */, @@ -2147,6 +2152,7 @@ B2108658109F8127001D4E7C /* XMLSourceWindow.m in Sources */, AAE8214210F9C74500444C16 /* PluginManager.m in Sources */, B27CD04F1100F408001F3C83 /* BitlyAPIHelper.m in Sources */, + B2E09F2D111192B7003B530A /* DSClickableURLTextField.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |