From 8c4c1d434acd20bde4f7e19322dc35a3bc8aa1f6 Mon Sep 17 00:00:00 2001 From: Richard Frith-MacDonald Date: Thu, 7 Sep 2000 16:42:45 +0000 Subject: [PATCH] Added macOS-X compatibility stuff. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@7440 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 18 +++++- Source/NSGeometry.m | 151 +++++++++++++++++++++++++++++++++++++++----- Testing/string.m | 4 ++ 3 files changed, 153 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4a138a4fb..442ea9bd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2000-09-07 Richard Frith-Macdonald + + * Source/NSGeometry.m: Add code to parse MacOS-X format strings. + Also produce MacOS-X format strings if the GSMacOSXCompatibleGeometry + or GSMacOSXCompatible default is YES (the former overrides the latter). + 2000-09-01 Fred Kiefer * Headers/gnustep/base/NSString.h: @@ -17,9 +23,9 @@ * Tools/gsdoc-0_6_6.dtd: added prjref element which enable explicit links between projects - * Tools/gsdoc.m: handle prjref - remove extensions from files in gsdocrefs - (one day we'll generate other formats :-) + * Tools/gsdoc.m: handle prjref + remove extensions from files in gsdocrefs + (one day we'll generate other formats :-) 2000-08-23 Fred Kiefer @@ -68,6 +74,12 @@ added index generation * Tools/gsdoc.gsdoc: added parameters documentation +2000-08-13 Richard Frith-Macdonald + + * Documentation/gsdoc/NSString.gsdoc: add documentation for replacing + strings within the reciever. + * Documentation/gsdoc/NSMutableString.gsdoc: ditto + 2000-08-08 Richard Frith-Macdonald * Headers/gnustep/base/all.h: Moved to Old as obsolete file. diff --git a/Source/NSGeometry.m b/Source/NSGeometry.m index ce8bb75c1..5ef2e176d 100644 --- a/Source/NSGeometry.m +++ b/Source/NSGeometry.m @@ -34,7 +34,10 @@ #include #include #include +#include +#include +static BOOL MacOSX = NO; // Compatibility mode static Class NSStringClass = 0; static Class NSScannerClass = 0; static SEL scanFloatSel = @selector(scanFloat:); @@ -44,6 +47,36 @@ static BOOL (*scanFloatImp)(NSScanner*, SEL, float*); static BOOL (*scanStringImp)(NSScanner*, SEL, NSString*, NSString**); static id (*scannerImp)(Class, SEL, NSString*); +/* + * A trivial class to monitor user defaults to see how we should be + * producing strings describing geometry structures. + */ +@interface GSGeometryDefaultObserver : NSObject ++ (void) defaultsChanged: (NSNotification*)aNotification; +@end + +@implementation GSGeometryDefaultObserver ++ (void) defaultsChanged: (NSNotification*)aNotification +{ + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + id def; + + def = [defaults objectForKey: @"GSMacOSXCompatibleGeometry"]; + if (def == nil) + { + def = [defaults objectForKey: @"GSMacOSXCompatible"]; + } + if (def != nil && [def isKindOfClass: NSStringClass] == YES) + { + MacOSX = [def boolValue]; + } + else + { + MacOSX = NO; + } +} +@end + static inline void setupCache() { @@ -57,6 +90,13 @@ setupCache() [NSScannerClass instanceMethodForSelector: scanStringSel]; scannerImp = (id (*)(Class, SEL, NSString*)) [NSScannerClass methodForSelector: scannerSel]; + + [[NSNotificationCenter defaultCenter] + addObserver: [GSGeometryDefaultObserver class] + selector: @selector(defaultsChanged:) + name: NSUserDefaultsDidChangeNotification + object: nil]; + [[GSGeometryDefaultObserver class] defaultsChanged: nil]; } } @@ -194,30 +234,46 @@ NSDivideRect(NSRect aRect, /** Get a String Representation... **/ -NSString * +NSString* NSStringFromPoint(NSPoint aPoint) { setupCache(); - return [NSStringClass stringWithFormat: @"{x=%f; y=%f}", aPoint.x, aPoint.y]; + if (MacOSX == YES) + return [NSStringClass stringWithFormat: + @"{%g, %g}", aPoint.x, aPoint.y]; + else + return [NSStringClass stringWithFormat: + @"{x=%g; y=%g}", aPoint.x, aPoint.y]; } -NSString * +NSString* NSStringFromRect(NSRect aRect) { setupCache(); - return [NSStringClass stringWithFormat: @"{x=%f; y=%f; width=%f; height=%f}", - aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; + if (MacOSX == YES) + return [NSStringClass stringWithFormat: + @"{{%g, %g}, {%g, %g}}", + aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; + else + return [NSStringClass stringWithFormat: + @"{x=%g; y=%g; width=%g; height=%g}", + aRect.origin.x, aRect.origin.y, aRect.size.width, aRect.size.height]; } -NSString * +NSString* NSStringFromSize(NSSize aSize) { setupCache(); - return [NSStringClass stringWithFormat: @"{width=%f; height=%f}", - aSize.width, aSize.height]; + if (MacOSX == YES) + return [NSStringClass stringWithFormat: + @"{%g, %g}", aSize.width, aSize.height]; + else + return [NSStringClass stringWithFormat: + @"{width=%g; height=%g}", aSize.width, aSize.height]; } -NSPoint NSPointFromString(NSString* string) +NSPoint +NSPointFromString(NSString* string) { NSScanner *scanner; NSPoint point; @@ -233,12 +289,29 @@ NSPoint NSPointFromString(NSString* string) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &point.y) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) - return point; + { + return point; + } else - return NSMakePoint(0, 0); + { + [scanner setScanLocation: 0]; + if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &point.x) + && (*scanStringImp)(scanner, scanStringSel, @",", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &point.y) + && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) + { + return point; + } + else + { + return NSMakePoint(0, 0); + } + } } -NSSize NSSizeFromString(NSString* string) +NSSize +NSSizeFromString(NSString* string) { NSScanner *scanner; NSSize size; @@ -254,12 +327,29 @@ NSSize NSSizeFromString(NSString* string) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) - return size; + { + return size; + } else - return NSMakeSize(0, 0); + { + [scanner setScanLocation: 0]; + if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &size.width) + && (*scanStringImp)(scanner, scanStringSel, @",", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &size.height) + && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) + { + return size; + } + else + { + return NSMakeSize(0, 0); + } + } } -NSRect NSRectFromString(NSString* string) +NSRect +NSRectFromString(NSString* string) { NSScanner *scanner; NSRect rect; @@ -286,8 +376,35 @@ NSRect NSRectFromString(NSString* string) && (*scanStringImp)(scanner, scanStringSel, @"=", NULL) && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.height) && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) - return rect; + { + return rect; + } else - return NSMakeRect(0, 0, 0, 0); + { + [scanner setScanLocation: 0]; + if ((*scanStringImp)(scanner, scanStringSel, @"{", NULL) + && (*scanStringImp)(scanner, scanStringSel, @"{", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.x) + && (*scanStringImp)(scanner, scanStringSel, @",", NULL) + + && (*scanFloatImp)(scanner, scanFloatSel, &rect.origin.y) + && (*scanStringImp)(scanner, scanStringSel, @"}", NULL) + && (*scanStringImp)(scanner, scanStringSel, @",", NULL) + + && (*scanStringImp)(scanner, scanStringSel, @"{", NULL) + && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.width) + && (*scanStringImp)(scanner, scanStringSel, @",", NULL) + + && (*scanFloatImp)(scanner, scanFloatSel, &rect.size.height) + && (*scanStringImp)(scanner, scanStringSel, @"}", NULL) + && (*scanStringImp)(scanner, scanStringSel, @"}", NULL)) + { + return rect; + } + else + { + return NSMakeRect(0, 0, 0, 0); + } + } } diff --git a/Testing/string.m b/Testing/string.m index 28b55cee6..f8bf58437 100644 --- a/Testing/string.m +++ b/Testing/string.m @@ -14,6 +14,7 @@ print_string(NSString* s) } #include +#include int main() @@ -25,6 +26,9 @@ int main() print_string(s); + s2 = NSStringFromPoint(NSMakePoint(1.374, 5.100)); + print_string(s2); + s2 = [s copy]; print_string(s2); s3 = [s2 mutableCopy];