From ce957cc6e287e4974e6a771a9ce7f048a2e09e12 Mon Sep 17 00:00:00 2001 From: fredkiefer Date: Sun, 13 Jan 2008 18:08:35 +0000 Subject: [PATCH] Add reverse value change methods for bindings. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@25935 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++ Source/GSBindingHelpers.h | 12 ++- Source/NSControl.m | 14 ++- Source/NSKeyValueBinding.m | 210 +++++++++++-------------------------- 4 files changed, 88 insertions(+), 154 deletions(-) diff --git a/ChangeLog b/ChangeLog index 25b509223..fedbcba9b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-01-13 Fred Kiefer + + * Source/GSBindingHelpers.h, + * Source/NSKeyValueBinding.m: Add reverse value change methods. + * Source/NSControl.m (-sendAction:to:): Send value change for binding. + 2008-01-08 22:35-EST Gregory John Casamento * Headers/AppKit/NSSegmentedCell.h: Added rect ivar to cache frame. diff --git a/Source/GSBindingHelpers.h b/Source/GSBindingHelpers.h index eb1405857..30286333d 100644 --- a/Source/GSBindingHelpers.h +++ b/Source/GSBindingHelpers.h @@ -2,8 +2,10 @@ Copyright (C) 2007 Free Software Foundation, Inc. - Written by: Chris Farber + Written by: Chris Farber Date: 2007 + Author: Fred Kiefer + Date: Decembre 2007 This file is part of the GNUstep GUI Library. @@ -43,7 +45,10 @@ + (void) exposeBinding: (NSString *)binding forClass: (Class)clazz; + (NSArray *) exposedBindingsForClass: (Class)clazz; -+ (NSDictionary *) infoForBinding: (NSString *)binding forObject: (id)anObject; ++ (GSKeyValueBinding *) getBinding: (NSString *)binding + forObject: (id)anObject; ++ (NSDictionary *) infoForBinding: (NSString *)binding + forObject: (id)anObject; + (void) unbind: (NSString *)binding forObject: (id)anObject; + (void) unbindAllForObject: (id)anObject; @@ -54,10 +59,13 @@ options: (NSDictionary *)options fromObject: (id)source; - (void) setValueFor: (NSString *)binding; +- (void) reverseSetValueFor: (NSString *)binding; + /* Transforms the value with a value transformer, if specified and available, * and takes care of any placeholders */ - (id) transformValue: (id)value withOptions: (NSDictionary *)options; +- (id) reverseTransformValue: (id)value withOptions: (NSDictionary *)options; @end diff --git a/Source/NSControl.m b/Source/NSControl.m index 5cad1ce4d..8d4cb4155 100644 --- a/Source/NSControl.m +++ b/Source/NSControl.m @@ -635,7 +635,8 @@ static NSNotificationCenter *nc; { if (_cell == aCell) { - [_cell drawWithFrame: _bounds inView: self]; + [_cell drawWithFrame: _bounds + inView: self]; } } @@ -646,8 +647,8 @@ static NSNotificationCenter *nc; { if (_cell == aCell) { - [_cell drawInteriorWithFrame: _bounds - inView: self]; + [_cell drawInteriorWithFrame: _bounds + inView: self]; } } @@ -701,6 +702,13 @@ static NSNotificationCenter *nc; */ - (BOOL) sendAction: (SEL)theAction to: (id)theTarget { + GSKeyValueBinding *theBinding; + + theBinding = [GSKeyValueBinding getBinding: NSValueBinding + forObject: self]; + if (theBinding != nil) + [theBinding reverseSetValueFor: @"objectValue"]; + if (theAction) return [NSApp sendAction: theAction to: theTarget from: self]; else diff --git a/Source/NSKeyValueBinding.m b/Source/NSKeyValueBinding.m index 19f660ce5..e17fc0e6b 100644 --- a/Source/NSKeyValueBinding.m +++ b/Source/NSKeyValueBinding.m @@ -6,6 +6,8 @@ Written by: Chris Farber Date: 2007 + Author: Fred Kiefer + Date: Decembre 2007 This file is part of the GNUstep GUI Library. @@ -131,16 +133,6 @@ BOOL GSBindingResolveMultipleValueBool(NSString *key, NSDictionary *bindings, void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, NSDictionary *bindings); -NSArray *GSBindingExposeMultipleValueBindings( - NSArray *bindingNames, - NSMutableDictionary *bindingList); - -NSArray *GSBindingExposePatternBindings( - NSArray *bindingNames, - NSMutableDictionary *bindingList); - -id GSBindingReverseTransformedValue(id value, NSDictionary *options); - @implementation GSKeyValueBinding + (void) initialize @@ -185,7 +177,8 @@ id GSBindingReverseTransformedValue(id value, NSDictionary *options); return tmp; } -+ (NSDictionary *) infoForBinding: (NSString *)binding forObject: (id)anObject ++ (GSKeyValueBinding *) getBinding: (NSString *)binding + forObject: (id)anObject { NSMutableDictionary *bindings; GSKeyValueBinding *theBinding; @@ -201,10 +194,23 @@ id GSBindingReverseTransformedValue(id value, NSDictionary *options); } [bindingLock unlock]; + return theBinding; +} + ++ (NSDictionary *) infoForBinding: (NSString *)binding + forObject: (id)anObject +{ + GSKeyValueBinding *theBinding; + + theBinding = [self getBinding: binding forObject: anObject]; + if (theBinding == nil) + return nil; + return theBinding->info; } -+ (void) unbind: (NSString *)binding forObject: (id)anObject ++ (void) unbind: (NSString *)binding + forObject: (id)anObject { NSMutableDictionary *bindings; id observedObject; @@ -323,6 +329,22 @@ id GSBindingReverseTransformedValue(id value, NSDictionary *options); [src setValue: newValue forKey: binding]; } +- (void) reverseSetValueFor: (NSString *)binding +{ + id newValue; + id dest; + NSString *keyPath; + NSDictionary *options; + + dest = [info objectForKey: NSObservedObjectKey]; + keyPath = [info objectForKey: NSObservedKeyPathKey]; + options = [info objectForKey: NSOptionsKey]; + + newValue = [src valueForKeyPath: binding]; + newValue = [self reverseTransformValue: newValue withOptions: options]; + [dest setValue: newValue forKey: keyPath]; +} + - (void) observeValueForKeyPath: (NSString *)keyPath ofObject: (id)object change: (NSDictionary *)change @@ -411,6 +433,33 @@ id GSBindingReverseTransformedValue(id value, NSDictionary *options); return value; } +- (id) reverseTransformValue: (id)value withOptions: (NSDictionary *)options +{ + NSString *valueTransformerName; + NSValueTransformer *valueTransformer; + + valueTransformerName = [options objectForKey: + NSValueTransformerNameBindingOption]; + if (valueTransformerName != nil) + { + valueTransformer = [NSValueTransformer valueTransformerForName: + valueTransformerName]; + } + else + { + valueTransformer = [options objectForKey: + NSValueTransformerBindingOption]; + } + + if ((valueTransformer != nil) && [[valueTransformer class] + allowsReverseTransformation]) + { + value = [valueTransformer reverseTransformedValue: value]; + } + + return value; +} + @end @implementation GSKeyValueOrBinding : GSKeyValueBinding @@ -551,140 +600,3 @@ void GSBindingInvokeAction(NSString *targetKey, NSString *argumentKey, } [invocation invoke]; } - -void GSBindingLock() -{ - [bindingLock lock]; -} - -void GSBindingReleaseLock() -{ - [bindingLock unlock]; -} - -NSMutableDictionary *GSBindingListForObject(id object) -{ - NSMutableDictionary *list; - - if (!objectTable) - return nil; - - list = (NSMutableDictionary *)NSMapGet(objectTable, (void *)object); - if (list == nil) - { - list = [NSMutableDictionary new]; - NSMapInsert(objectTable, (void *)object, (void *)list); - } - return list; -} - -NSArray *GSBindingExposeMultipleValueBindings( - NSArray *bindingNames, - NSMutableDictionary *bindingList) -{ - NSEnumerator *nameEnum; - NSString *name; - NSString *numberedName; - NSMutableArray *additionalBindings; - int count; - - additionalBindings = [NSMutableArray array]; - nameEnum = [bindingNames objectEnumerator]; - while ((name = [nameEnum nextObject])) - { - count = 1; - numberedName = name; - while ([bindingList objectForKey: numberedName] != nil) - { - numberedName = [NSString stringWithFormat: @"%@%i", name, ++count]; - [additionalBindings addObject: numberedName]; - } - } - return additionalBindings; -} - - -NSArray *GSBindingExposePatternBindings( - NSArray *bindingNames, - NSMutableDictionary *bindingList) -{ - NSEnumerator *nameEnum; - NSString *name; - NSString *numberedName; - NSMutableArray *additionalBindings; - int count; - - additionalBindings = [NSMutableArray array]; - nameEnum = [bindingNames objectEnumerator]; - while ((name = [nameEnum nextObject])) - { - count = 1; - numberedName = [NSString stringWithFormat:@"%@1", name]; - while ([bindingList objectForKey: numberedName] != nil) - { - numberedName = [NSString stringWithFormat:@"%@%i", name, ++count]; - [additionalBindings addObject: numberedName]; - } - } - return additionalBindings; -} - -id GSBindingReverseTransformedValue(id value, NSDictionary *options) -{ - NSValueTransformer *valueTransformer; - NSString *valueTransformerName; - - valueTransformerName = [options objectForKey: - NSValueTransformerNameBindingOption]; - valueTransformer = [NSValueTransformer valueTransformerForName: - valueTransformerName]; - if (valueTransformer && [[valueTransformer class] - allowsReverseTransformation]) - { - value = [valueTransformer reverseTransformedValue: value]; - } - return value; -} - -/* -@interface _GSStateMarker : NSObject -{ - NSString * description; -} -@end - -@implementation _GSStateMarker - -- (id) initWithType: (int)type -{ - if (type == 0) - { - description = @""; - } - else if (type == 1) - { - description = @""; - } - else - { - description = @""; - } - - return self; -} - -- (id) valueForKey: (NSString *)key -{ - return self; -} - -- (id) retain { return self; } -- (oneway void) release {} - -- (NSString *) description -{ - return description; -} - -@end -*/