From 348086254aeefc81bd71ed9b98e4d101250bae3a Mon Sep 17 00:00:00 2001 From: richard Date: Mon, 26 Apr 1999 08:52:41 +0000 Subject: [PATCH] Added NSInterfaceStyle stuff git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@4139 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 3 + Headers/gnustep/gui/NSInterfaceStyle.h | 8 +- Source/GNUmakefile | 2 + Source/NSInterfaceStyle.m | 194 +++++++++++++++++++++++++ 4 files changed, 203 insertions(+), 4 deletions(-) create mode 100644 Source/NSInterfaceStyle.m diff --git a/ChangeLog b/ChangeLog index a479d0059..a93ec7845 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,9 @@ Mon Apr 26 7:05:00 1999 Richard Frith-Macdonald * Headers/AppKit/NSGraphicsContext.h: place in #ifndef STRICT_OPENSTEP * Headers/AppKit/NSInterfaceStyle.h: new file. * Headers/AppKit/NSResponder.h: new interface_style ivar. + * Headers/AppKit/AppKit.h: Added NSInterfaceStyle. + * Source/NSInterfaceStyle.m: new file - implemented class. + * Source/GNUmakefile: Added NSInterfaceStyle stuff. Fri Apr 23 16:30:00 1999 Richard Frith-Macdonald diff --git a/Headers/gnustep/gui/NSInterfaceStyle.h b/Headers/gnustep/gui/NSInterfaceStyle.h index c11471cdb..5fd40a4f9 100644 --- a/Headers/gnustep/gui/NSInterfaceStyle.h +++ b/Headers/gnustep/gui/NSInterfaceStyle.h @@ -33,10 +33,10 @@ @class NSString; typedef enum { - NSNextStepInterfaceStyle = 0, - NSMacintoshInterfaceStyle = 1, - NSWindows95InterfaceStyle = 2, - NSNoInterfaceStyle = -1 + NSNoInterfaceStyle = 0, + NSNextStepInterfaceStyle = 1, + NSMacintoshInterfaceStyle = 2, + NSWindows95InterfaceStyle = 3 } NSInterfaceStyle; extern NSString *NSInterfaceStyleDefault; diff --git a/Source/GNUmakefile b/Source/GNUmakefile index f1af63648..b44ce0604 100644 --- a/Source/GNUmakefile +++ b/Source/GNUmakefile @@ -75,6 +75,7 @@ NSHelpPanel.m \ NSImage.m \ NSImageRep.m \ NSImageView.m \ +NSInterfaceStyle.m \ NSMatrix.m \ NSMenu.m \ NSMenuItem.m \ @@ -160,6 +161,7 @@ AppKit/NSHelpPanel.h \ AppKit/NSImage.h \ AppKit/NSImageRep.h \ AppKit/NSImageView.h \ +AppKit/NSInterfaceStyle.h \ AppKit/NSLayoutManager.h \ AppKit/NSMatrix.h \ AppKit/NSMenu.h \ diff --git a/Source/NSInterfaceStyle.m b/Source/NSInterfaceStyle.m new file mode 100644 index 000000000..83c38e2e0 --- /dev/null +++ b/Source/NSInterfaceStyle.m @@ -0,0 +1,194 @@ +/* + NSInterfaceStyle.m + + Copyright (C) 1999 Free Software Foundation, Inc. + + Author: Richard Frith-Macdonald + Date: 1999 + + 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 Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +NSString *NSInterfaceStyleDefault = @"NSInterfaceStyleDefault"; + +static NSMapTable *styleMap = 0; +static NSInterfaceStyle defStyle; + +static NSInterfaceStyle +styleFromString(NSString* str) +{ + if ([str isEqualToString: @"NSNextStepInterfaceStyle"]) + return NSNextStepInterfaceStyle; + if ([str isEqualToString: @"NSMacintoshInterfaceStyle"]) + return NSMacintoshInterfaceStyle; + if ([str isEqualToString: @"NSWindows95InterfaceStyle"]) + return NSWindows95InterfaceStyle; + return NSNoInterfaceStyle; +} + +@interface GSInterfaceStyle : NSObject ++ (void) defaultsDidChange: (NSNotification*)notification; +@end + + + +typedef struct { + @defs(NSResponder) +} *accessToResponder; + +extern NSInterfaceStyle +NSInterfaceStyleForKey(NSString *key, NSResponder *responder) +{ + NSInterfaceStyle style; + + /* + * If the specified responder has a style set, return it. + */ + if (responder) + { + style = (NSInterfaceStyle)((accessToResponder)responder)->interface_style; + if (style != NSNoInterfaceStyle) + { + return style; + } + } + + /* + * If there is no style map, the defaults/cache management class must be + * initialised. + */ + if (styleMap == 0) + [GSInterfaceStyle class]; + + /* + * If there is a style for the given defaults key, return it - after + * caching it in a map table if necessary. + */ + if (key) + { + /* + * First try the cache - then, if no style is found, use the + * defaults system and add the results into the cache. + */ + style = (NSInterfaceStyle)NSMapGet(styleMap, key); + if (style == NSNoInterfaceStyle) + { + NSUserDefaults *defs; + NSString *def; + + defs = [NSUserDefaults standardUserDefaults]; + def = [defs stringForKey: key]; + if (def == nil + || (style = styleFromString(def)) == NSNoInterfaceStyle) + { + style = NSNextStepInterfaceStyle; + } + NSMapInsert(styleMap, (void*)key, (void*)style); + } + return style; + } + + /* + * No responder and no key - return the default style. + */ + return defStyle; +} + + + +/* + * The GSInterfaceStyle class is used solely to maintain our map of + * know interface styles by updating when user defaults change. + */ +@implementation GSInterfaceStyle + ++ (void) initialize +{ + if (self == [GSInterfaceStyle class]) + { + styleMap = NSCreateMapTable(NSObjectMapKeyCallBacks, + NSIntMapValueCallBacks, 8); + + [NSUserDefaults standardUserDefaults]; + [self defaultsDidChange: nil]; + [NSNotificationCenter addObserver: self + selector: @selector(defaultsDidChange:) + name: NSUserDefaultsDidChangeNotification + object: nil]; + } +} + ++ (void) defaultsDidChange: (NSNotification*)notification +{ + NSUserDefaults *defs; + NSMapEnumerator enumerator; + NSString *key; + NSInterfaceStyle val; + + defs = [NSUserDefaults standardUserDefaults]; + + /* + * Determine the default interface style for the application. + */ + key = [defs stringForKey: NSInterfaceStyleDefault]; + if (key == nil || (defStyle = styleFromString(key)) == NSNoInterfaceStyle) + defStyle = NSNextStepInterfaceStyle; + + /* + * Now check the interface styles for all the keys in use and adjust our + * map table for any changes. + */ + enumerator = NSEnumerateMapTable(styleMap); + while (NSNextMapEnumeratorPair(&enumerator, (void**)&key, (void**)&val)) + { + NSInterfaceStyle newStyle; + NSString *def = [defs stringForKey: key]; + + if (def == nil) + { + newStyle = defStyle; + } + else + { + newStyle = styleFromString(def); + if (newStyle == NSNoInterfaceStyle) + { + newStyle = defStyle; + } + } + + if (newStyle != val) + { + NSMapInsert(styleMap, (void*)key, (void*)newStyle); + } + } +} + +@end +