Skip to content
This repository has been archived by the owner on Dec 5, 2019. It is now read-only.

Commit

Permalink
Fix NSPopUpButtonCell sending duplicate -objectDidEndEditing: message…
Browse files Browse the repository at this point in the history
…s, as -dismissPopUp gets invoked multiple times
  • Loading branch information
jspahrsummers committed Apr 12, 2012
1 parent 5afd1eb commit 493a296
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
9 changes: 9 additions & 0 deletions Velvet/NSPopUpButtonCell+EditorAdditions.h
Expand Up @@ -12,4 +12,13 @@
* Implements <[NSCell registersAsEditorWhileTracking]> for `NSPopUpButtonCell`.
*/
@interface NSPopUpButtonCell (EditorAdditions)

/**
* @name Editing Status
*/

/**
* Whether the receiver is currently registered as editing.
*/
@property (nonatomic, getter = isEditing, assign) BOOL editing;
@end
23 changes: 20 additions & 3 deletions Velvet/NSPopUpButtonCell+EditorAdditions.m
Expand Up @@ -9,13 +9,16 @@
#import "NSPopUpButtonCell+EditorAdditions.h"
#import "NSCell+EditorAdditions.h"
#import "NSObject+BindingsAdditions.h"
#import "EXTSafeCategory.h"
#import <objc/runtime.h>

static void (*originalAttachPopUpIMP)(id, SEL, NSRect, NSView *);
static void (*originalDismissPopUpIMP)(id, SEL);

static void attachPopUpRegisteringAsEditor (NSPopUpButtonCell *self, SEL _cmd, NSRect frame, NSView *controlView) {
if (self.registersAsEditorWhileTracking) {
if (self.registersAsEditorWhileTracking && !self.editing) {
self.editing = YES;

[controlView notifyBoundObjectsOfDidBeginEditing];
[self notifyBoundObjectsOfDidBeginEditing];
}
Expand All @@ -28,15 +31,29 @@ static void dismissPopUpUnregisteringAsEditor (NSPopUpButtonCell *self, SEL _cmd

originalDismissPopUpIMP(self, _cmd);

if (self.registersAsEditorWhileTracking) {
if (self.registersAsEditorWhileTracking && self.editing) {
self.editing = NO;

// end editing after one run loop iteration, so the message is only sent
// after any model change has occurred
[self performSelector:@selector(notifyBoundObjectsOfDidEndEditing) withObject:nil afterDelay:0];
[controlView performSelector:@selector(notifyBoundObjectsOfDidEndEditing) withObject:nil afterDelay:0];
}
}

@implementation NSPopUpButtonCell (EditorAdditions)
@safecategory(NSPopUpButtonCell, EditorAdditions)
- (BOOL)isEditing {
NSNumber *num = objc_getAssociatedObject(self, @selector(isEditing));
return [num boolValue];
}

- (void)setEditing:(BOOL)editing {
NSNumber *num = [NSNumber numberWithBool:editing];
objc_setAssociatedObject(self, @selector(isEditing), num, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end

@implementation NSPopUpButtonCell (UnsafeEditorAdditions)

+ (void)load {
Method attachPopUp = class_getInstanceMethod(self, @selector(attachPopUpWithFrame:inView:));
Expand Down

0 comments on commit 493a296

Please sign in to comment.