From eab4f4bf780e8d07d82a711f822f8bf70cc18899 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Tue, 9 Jun 2009 15:36:53 -0700 Subject: [PATCH] Made CPImageView accept image drag and drop. Reviewed by me. --- AppKit/CPImageView.j | 48 +++++++++++++++++++++++- AppKit/CPPasteboard.j | 6 ++- AppKit/CPView.j | 2 +- Tools/Rake/lib/objective-j/bundletask.rb | 2 + Tools/nib2cib/NSImageView.j | 1 + 5 files changed, 55 insertions(+), 4 deletions(-) diff --git a/AppKit/CPImageView.j b/AppKit/CPImageView.j index ceec7c59d..11b180534 100644 --- a/AppKit/CPImageView.j +++ b/AppKit/CPImageView.j @@ -70,7 +70,9 @@ var LEFT_SHADOW_INSET = 3.0, BOOL _hasShadow; CPView _shadowView; - + + BOOL _isEditable; + CGRect _imageRect; } @@ -339,11 +341,47 @@ var LEFT_SHADOW_INSET = 3.0, [[self nextResponder] mouseDown:anEvent]; } +- (void)setEditable:(BOOL)shouldBeEditable +{ + if (_isEditable === shouldBeEditable) + return _isEditable; + + _isEditable = shouldBeEditable; + + if (_isEditable) + [self registerForDraggedTypes:[CPImagesPboardType]]; + + else + { + var draggedTypes = [self registeredDraggedTypes]; + + [self unregisterDraggedTypes]; + + [draggedTypes removeObjectIdenticalTo:CPImagesPboardType]; + + [self registerForDraggedTypes:draggedTypes]; + } +} + +- (BOOL)isEditable +{ + return _isEditable; +} + +- (void)performDragOperation:(CPDraggingInfo)aSender +{ + var images = [CPKeyedUnarchiver unarchiveObjectWithData:[[aSender draggingPasteboard] dataForType:CPImagesPboardType]]; + + if ([images count]) + [self setImage:images[0]]; +} + @end var CPImageViewImageKey = @"CPImageViewImageKey", CPImageViewImageScalingKey = @"CPImageViewImageScalingKey", - CPImageViewHasShadowKey = @"CPImageViewHasShadowKey"; + CPImageViewHasShadowKey = @"CPImageViewHasShadowKey", + CPImageViewIsEditableKey = @"CPImageViewIsEditableKey"; @implementation CPImageView (CPCoding) @@ -372,6 +410,9 @@ var CPImageViewImageKey = @"CPImageViewImageKey", [self setHasShadow:[aCoder decodeBoolForKey:CPImageViewHasShadowKey]]; + if ([aCoder decodeBoolForKey:CPImageViewIsEditableKey] || NO) + [self setEditable:YES]; + [self setNeedsLayout]; [self setNeedsDisplay:YES]; } @@ -402,6 +443,9 @@ var CPImageViewImageKey = @"CPImageViewImageKey", _subviews = actualSubviews; [aCoder encodeBool:_hasShadow forKey:CPImageViewHasShadowKey]; + + if (_isEditable) + [aCoder encodeBool:_isEditable forKey:CPImageViewIsEditableKey]; } @end diff --git a/AppKit/CPPasteboard.j b/AppKit/CPPasteboard.j index dd7c5816f..31ba69299 100644 --- a/AppKit/CPPasteboard.j +++ b/AppKit/CPPasteboard.j @@ -38,8 +38,12 @@ CPFontPboardType = @"CPFontPboardType"; CPHTMLPboardType = @"CPHTMLPboardType"; CPStringPboardType = @"CPStringPboardType"; CPURLPboardType = @"CPURLPboardType"; +CPImagesPboardType = @"CPImagesPboardType"; +CPVideosPboardType = @"CPVideosPboardType"; + +// Deprecated CPImagePboardType = @"CPImagePboardType"; -CPVideoPboardType = @"CPVideoPboardType"; + var CPPasteboards = nil; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 3bc588813..e9c489a50 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -1465,7 +1465,7 @@ setBoundsOrigin: */ - (void)registerForDraggedTypes:(CPArray)pasteboardTypes { - if (!pasteboardTypes) + if (!pasteboardTypes || ![pasteboardTypes count]) return; var theWindow = [self window]; diff --git a/Tools/Rake/lib/objective-j/bundletask.rb b/Tools/Rake/lib/objective-j/bundletask.rb index 8ed8be5f9..eeee33003 100644 --- a/Tools/Rake/lib/objective-j/bundletask.rb +++ b/Tools/Rake/lib/objective-j/bundletask.rb @@ -545,6 +545,8 @@ module ObjectiveJ list.each do |fileName| + fileName = File.expand_path(fileName) + File.open(fileName) do |file| if fileName.index(platform_absolute_path) == 0 diff --git a/Tools/nib2cib/NSImageView.j b/Tools/nib2cib/NSImageView.j index 871085599..62eb55fe0 100644 --- a/Tools/nib2cib/NSImageView.j +++ b/Tools/nib2cib/NSImageView.j @@ -34,6 +34,7 @@ var cell = [aCoder decodeObjectForKey:@"NSCell"]; _imageScaling = [cell imageScaling]; + _isEditable = [cell isEditable]; } return self;