mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 05:32:11 +00:00
* Source/NSBundleAdditions.m,
* Source/NSNibConnector.m: Move NSNibConnector and subclasses in separate file. Add isEqual: method from Gorm. Switch to new libobjc runtime ivar access for NSNibOutletConnector. * Source/GNUmakefile: Add new file NSNibConnector.m * Source/GSXibLoader.m: Similar change to IBOutletConnection. Replace GSMime base64 decode method with standard one. * Source/GSImageMagickImageRep.m, * Source/GSTheme.m: Remove unused #import. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@38919 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
096c0ad2de
commit
cc73eeacdc
7 changed files with 267 additions and 205 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
|||
2015-08-23 Fred Kiefer <FredKiefer@gmx.de>
|
||||
|
||||
* Source/NSBundleAdditions.m,
|
||||
* Source/NSNibConnector.m: Move NSNibConnector and subclasses in
|
||||
separate file. Add isEqual: method from Gorm. Switch to new
|
||||
libobjc runtime ivar access for NSNibOutletConnector.
|
||||
* Source/GNUmakefile: Add new file NSNibConnector.m
|
||||
* Source/GSXibLoader.m: Similar change to IBOutletConnection.
|
||||
Replace GSMime base64 decode method with standard one.
|
||||
* Source/GSImageMagickImageRep.m,
|
||||
* Source/GSTheme.m: Remove unused #import.
|
||||
|
||||
2015-08-23 Fred Kiefer <FredKiefer@gmx.de>
|
||||
|
||||
* Source/NSInputManager.m: Add binding processing code for escape
|
||||
|
|
|
@ -121,6 +121,7 @@ NSMenuItemCell.m \
|
|||
NSMovie.m \
|
||||
NSMovieView.m \
|
||||
NSNib.m \
|
||||
NSNibConnector.m \
|
||||
NSNibBindingConnector.m \
|
||||
NSNibAXAttributeConnector.m \
|
||||
NSNibAXRelationshipConnector.m \
|
||||
|
|
|
@ -31,10 +31,10 @@
|
|||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSAffineTransform.h>
|
||||
#import <Foundation/NSCoder.h>
|
||||
#import <Foundation/NSDebug.h>
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSTask.h>
|
||||
#import <Foundation/NSProcessInfo.h>
|
||||
#import <GNUstepBase/NSDebug+GNUstepBase.h>
|
||||
#import "AppKit/NSBitmapImageRep.h"
|
||||
#import "AppKit/NSGraphics.h"
|
||||
#import "AppKit/NSPasteboard.h"
|
||||
|
|
|
@ -39,7 +39,6 @@
|
|||
#import <Foundation/NSPathUtilities.h>
|
||||
#import <Foundation/NSSet.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import "GNUstepBase/GSObjCRuntime.h"
|
||||
#import "GNUstepGUI/GSTheme.h"
|
||||
#import "AppKit/NSApplication.h"
|
||||
#import "AppKit/NSButtonCell.h"
|
||||
|
|
|
@ -38,7 +38,6 @@
|
|||
#import <Foundation/NSXMLParser.h>
|
||||
#import <Foundation/NSXMLDocument.h>
|
||||
#import <Foundation/NSXMLElement.h>
|
||||
#import <GNUstepBase/GSMime.h>
|
||||
|
||||
#import "AppKit/NSApplication.h"
|
||||
#import "AppKit/NSNib.h"
|
||||
|
@ -330,20 +329,18 @@
|
|||
}
|
||||
else
|
||||
{
|
||||
const char *nam = [label cString];
|
||||
const char *type;
|
||||
unsigned int size;
|
||||
int offset;
|
||||
|
||||
/*
|
||||
* Use the GNUstep additional function to set the instance
|
||||
* variable directly.
|
||||
* FIXME - need some way to do this for libFoundation and
|
||||
* Foundation based systems.
|
||||
/*
|
||||
* We cannot use the KVC mechanism here, as this would always retain _dst
|
||||
* and it could also affect _setXXX methods and _XXX ivars that aren't
|
||||
* affected by the Cocoa code.
|
||||
*/
|
||||
if (GSObjCFindVariable(source, nam, &type, &size, &offset))
|
||||
{
|
||||
GSObjCSetVariable(source, offset, size, (void*)&destination);
|
||||
const char *name = [label cString];
|
||||
Class class = object_getClass(source);
|
||||
Ivar ivar = class_getInstanceVariable(class, name);
|
||||
|
||||
if (ivar != 0)
|
||||
{
|
||||
object_setIvar(source, ivar, destination);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1583,10 +1580,11 @@ didStartElement: (NSString*)elementName
|
|||
|
||||
if ([type isEqualToString: @"base64-UTF8"])
|
||||
{
|
||||
NSData *d = [new dataUsingEncoding: NSASCIIStringEncoding];
|
||||
d = [GSMimeDocument decodeBase64: d];
|
||||
NSData *d = [[NSData alloc] initWithBase64EncodedString: new
|
||||
options: 0];
|
||||
new = AUTORELEASE([[NSString alloc] initWithData: d
|
||||
encoding: NSUTF8StringEncoding]);
|
||||
RELEASE(d);
|
||||
}
|
||||
|
||||
// empty strings are not nil!
|
||||
|
@ -1697,9 +1695,8 @@ didStartElement: (NSString*)elementName
|
|||
}
|
||||
else if ([@"bytes" isEqualToString: elementName])
|
||||
{
|
||||
id new = [[element value] dataUsingEncoding: NSASCIIStringEncoding
|
||||
allowLossyConversion: NO];
|
||||
new = [GSMimeDocument decodeBase64: new];
|
||||
id new = AUTORELEASE([[NSData alloc] initWithBase64EncodedString: [element value]
|
||||
options: 0]);
|
||||
|
||||
if (objID != nil)
|
||||
[decoded setObject: new forKey: objID];
|
||||
|
|
|
@ -33,200 +33,16 @@
|
|||
#import "config.h"
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSBundle.h>
|
||||
#import <Foundation/NSCoder.h>
|
||||
#import <Foundation/NSDebug.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSEnumerator.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
#import <Foundation/NSKeyValueCoding.h>
|
||||
#import "AppKit/NSControl.h"
|
||||
#import "AppKit/NSNib.h"
|
||||
#import "AppKit/NSNibConnector.h"
|
||||
#import "AppKit/NSNibLoading.h"
|
||||
#import "GNUstepGUI/GSModelLoaderFactory.h"
|
||||
|
||||
@implementation NSNibConnector
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
RELEASE(_src);
|
||||
RELEASE(_dst);
|
||||
RELEASE(_tag);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (id) destination
|
||||
{
|
||||
return _dst;
|
||||
}
|
||||
|
||||
- (void) encodeWithCoder: (NSCoder*)aCoder
|
||||
{
|
||||
if ([aCoder allowsKeyedCoding])
|
||||
{
|
||||
if (_src != nil)
|
||||
{
|
||||
[aCoder encodeObject: _src forKey: @"NSSource"];
|
||||
}
|
||||
if (_dst != nil)
|
||||
{
|
||||
[aCoder encodeObject: _dst forKey: @"NSDestination"];
|
||||
}
|
||||
if (_tag != nil)
|
||||
{
|
||||
[aCoder encodeObject: _tag forKey: @"NSLabel"];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[aCoder encodeObject: _src];
|
||||
[aCoder encodeObject: _dst];
|
||||
[aCoder encodeObject: _tag];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) establishConnection
|
||||
{
|
||||
}
|
||||
|
||||
- (id) initWithCoder: (NSCoder*)aDecoder
|
||||
{
|
||||
if ([aDecoder allowsKeyedCoding])
|
||||
{
|
||||
if ([aDecoder containsValueForKey: @"NSDestination"])
|
||||
{
|
||||
ASSIGN(_dst, [aDecoder decodeObjectForKey: @"NSDestination"]);
|
||||
}
|
||||
if ([aDecoder containsValueForKey: @"NSSource"])
|
||||
{
|
||||
ASSIGN(_src, [aDecoder decodeObjectForKey: @"NSSource"]);
|
||||
}
|
||||
if ([aDecoder containsValueForKey: @"NSLabel"])
|
||||
{
|
||||
ASSIGN(_tag, [aDecoder decodeObjectForKey: @"NSLabel"]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_src];
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_dst];
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_tag];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString*) label
|
||||
{
|
||||
return _tag;
|
||||
}
|
||||
|
||||
- (void) replaceObject: (id)anObject withObject: (id)anotherObject
|
||||
{
|
||||
if (_src == anObject)
|
||||
{
|
||||
ASSIGN(_src, anotherObject);
|
||||
}
|
||||
if (_dst == anObject)
|
||||
{
|
||||
ASSIGN(_dst, anotherObject);
|
||||
}
|
||||
if (_tag == anObject)
|
||||
{
|
||||
ASSIGN(_tag, anotherObject);
|
||||
}
|
||||
}
|
||||
|
||||
- (id) source
|
||||
{
|
||||
return _src;
|
||||
}
|
||||
|
||||
- (void) setDestination: (id)anObject
|
||||
{
|
||||
ASSIGN(_dst, anObject);
|
||||
}
|
||||
|
||||
- (void) setLabel: (NSString*)label
|
||||
{
|
||||
ASSIGN(_tag, label);
|
||||
}
|
||||
|
||||
- (void) setSource: (id)anObject
|
||||
{
|
||||
ASSIGN(_src, anObject);
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
NSString *desc = [NSString stringWithFormat: @"<%@ src=%@ dst=%@ label=%@>",
|
||||
[super description],
|
||||
[self source],
|
||||
[self destination],
|
||||
[self label]];
|
||||
return desc;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNibControlConnector
|
||||
- (void) establishConnection
|
||||
{
|
||||
SEL sel = NSSelectorFromString(_tag);
|
||||
|
||||
[_src setTarget: _dst];
|
||||
[_src setAction: sel];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNibOutletConnector
|
||||
- (void) establishConnection
|
||||
{
|
||||
NS_DURING
|
||||
{
|
||||
if (_src != nil)
|
||||
{
|
||||
NSString *selName;
|
||||
SEL sel;
|
||||
|
||||
selName = [NSString stringWithFormat: @"set%@%@:",
|
||||
[[_tag substringToIndex: 1] uppercaseString],
|
||||
[_tag substringFromIndex: 1]];
|
||||
sel = NSSelectorFromString(selName);
|
||||
|
||||
if (sel && [_src respondsToSelector: sel])
|
||||
{
|
||||
[_src performSelector: sel withObject: _dst];
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *nam = [_tag cString];
|
||||
const char *type;
|
||||
unsigned int size;
|
||||
int offset;
|
||||
|
||||
/*
|
||||
* Use the GNUstep additional function to set the instance
|
||||
* variable directly.
|
||||
* FIXME - need some way to do this for libFoundation and
|
||||
* Foundation based systems.
|
||||
*/
|
||||
if (GSObjCFindVariable(_src, nam, &type, &size, &offset))
|
||||
{
|
||||
GSObjCSetVariable(_src, offset, size, (void*)&_dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSLog(@"Error while establishing connection %@: %@",self,[localException reason]);
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSBundle (NSBundleAdditions)
|
||||
+ (BOOL) loadNibFile: (NSString*)fileName
|
||||
externalNameTable: (NSDictionary*)context
|
||||
|
|
237
Source/NSNibConnector.m
Normal file
237
Source/NSNibConnector.m
Normal file
|
@ -0,0 +1,237 @@
|
|||
/*
|
||||
<title>NSNibConnector</title>
|
||||
|
||||
<abstract>Implementation of NSNibConnector and subclasses</abstract>
|
||||
|
||||
Copyright (C) 1999, 2015 Free Software Foundation, Inc.
|
||||
|
||||
Author: Richard Frith-Macdonald <richard@branstorm.co.uk>
|
||||
Date: 1999
|
||||
Author: Fred Kiefer <fredkiefer@gmx.de>
|
||||
Date: August 2015
|
||||
|
||||
This file is part of the GNUstep GUI Library.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; see the file COPYING.LIB.
|
||||
If not, see <http://www.gnu.org/licenses/> or write to the
|
||||
Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#import "config.h"
|
||||
#import <Foundation/NSCoder.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import "AppKit/NSControl.h"
|
||||
#import "AppKit/NSNibConnector.h"
|
||||
|
||||
@implementation NSNibConnector
|
||||
|
||||
- (void) dealloc
|
||||
{
|
||||
RELEASE(_src);
|
||||
RELEASE(_dst);
|
||||
RELEASE(_tag);
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (id) destination
|
||||
{
|
||||
return _dst;
|
||||
}
|
||||
|
||||
- (void) encodeWithCoder: (NSCoder*)aCoder
|
||||
{
|
||||
if ([aCoder allowsKeyedCoding])
|
||||
{
|
||||
if (_src != nil)
|
||||
{
|
||||
[aCoder encodeObject: _src forKey: @"NSSource"];
|
||||
}
|
||||
if (_dst != nil)
|
||||
{
|
||||
[aCoder encodeObject: _dst forKey: @"NSDestination"];
|
||||
}
|
||||
if (_tag != nil)
|
||||
{
|
||||
[aCoder encodeObject: _tag forKey: @"NSLabel"];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[aCoder encodeObject: _src];
|
||||
[aCoder encodeObject: _dst];
|
||||
[aCoder encodeObject: _tag];
|
||||
}
|
||||
}
|
||||
|
||||
- (void) establishConnection
|
||||
{
|
||||
}
|
||||
|
||||
- (id) initWithCoder: (NSCoder*)aDecoder
|
||||
{
|
||||
if ([aDecoder allowsKeyedCoding])
|
||||
{
|
||||
if ([aDecoder containsValueForKey: @"NSDestination"])
|
||||
{
|
||||
ASSIGN(_dst, [aDecoder decodeObjectForKey: @"NSDestination"]);
|
||||
}
|
||||
if ([aDecoder containsValueForKey: @"NSSource"])
|
||||
{
|
||||
ASSIGN(_src, [aDecoder decodeObjectForKey: @"NSSource"]);
|
||||
}
|
||||
if ([aDecoder containsValueForKey: @"NSLabel"])
|
||||
{
|
||||
ASSIGN(_tag, [aDecoder decodeObjectForKey: @"NSLabel"]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_src];
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_dst];
|
||||
[aDecoder decodeValueOfObjCType: @encode(id) at: &_tag];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL) isEqual: (id)object
|
||||
{
|
||||
BOOL result = NO;
|
||||
|
||||
if([object isKindOfClass: [NSNibConnector class]] == NO)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
if(self == object)
|
||||
{
|
||||
result = YES;
|
||||
}
|
||||
else if([[self source] isEqual: [object source]] &&
|
||||
[[self destination] isEqual: [object destination]] &&
|
||||
[[self label] isEqual: [object label]] &&
|
||||
([self class] == [object class]))
|
||||
{
|
||||
result = YES;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
- (NSString*) label
|
||||
{
|
||||
return _tag;
|
||||
}
|
||||
|
||||
- (void) replaceObject: (id)anObject withObject: (id)anotherObject
|
||||
{
|
||||
if (_src == anObject)
|
||||
{
|
||||
ASSIGN(_src, anotherObject);
|
||||
}
|
||||
if (_dst == anObject)
|
||||
{
|
||||
ASSIGN(_dst, anotherObject);
|
||||
}
|
||||
if (_tag == anObject)
|
||||
{
|
||||
ASSIGN(_tag, anotherObject);
|
||||
}
|
||||
}
|
||||
|
||||
- (id) source
|
||||
{
|
||||
return _src;
|
||||
}
|
||||
|
||||
- (void) setDestination: (id)anObject
|
||||
{
|
||||
ASSIGN(_dst, anObject);
|
||||
}
|
||||
|
||||
- (void) setLabel: (NSString*)label
|
||||
{
|
||||
ASSIGN(_tag, label);
|
||||
}
|
||||
|
||||
- (void) setSource: (id)anObject
|
||||
{
|
||||
ASSIGN(_src, anObject);
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
{
|
||||
NSString *desc = [NSString stringWithFormat: @"<%@ src=%@ dst=%@ label=%@>",
|
||||
[super description],
|
||||
[self source],
|
||||
[self destination],
|
||||
[self label]];
|
||||
return desc;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNibControlConnector
|
||||
- (void) establishConnection
|
||||
{
|
||||
SEL sel = NSSelectorFromString(_tag);
|
||||
|
||||
[_src setTarget: _dst];
|
||||
[_src setAction: sel];
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation NSNibOutletConnector
|
||||
- (void) establishConnection
|
||||
{
|
||||
NS_DURING
|
||||
{
|
||||
if (_src != nil)
|
||||
{
|
||||
NSString *selName;
|
||||
SEL sel;
|
||||
|
||||
selName = [NSString stringWithFormat: @"set%@%@:",
|
||||
[[_tag substringToIndex: 1] uppercaseString],
|
||||
[_tag substringFromIndex: 1]];
|
||||
sel = NSSelectorFromString(selName);
|
||||
|
||||
if (sel && [_src respondsToSelector: sel])
|
||||
{
|
||||
[_src performSelector: sel withObject: _dst];
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* We cannot use the KVC mechanism here, as this would always retain _dst
|
||||
* and it could also affect _setXXX methods and _XXX ivars that aren't
|
||||
* affected by the Cocoa code.
|
||||
*/
|
||||
const char *name = [_tag cString];
|
||||
Class class = object_getClass(_src);
|
||||
Ivar ivar = class_getInstanceVariable(class, name);
|
||||
|
||||
if (ivar != 0)
|
||||
{
|
||||
object_setIvar(_src, ivar, _dst);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NS_HANDLER
|
||||
{
|
||||
NSLog(@"Error while establishing connection %@: %@", self, [localException reason]);
|
||||
}
|
||||
NS_ENDHANDLER;
|
||||
}
|
||||
@end
|
Loading…
Reference in a new issue