Added NSInterfaceStyle stuff

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@4139 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 1999-04-26 08:52:41 +00:00
parent 38dc6c52f5
commit f508c6559f
4 changed files with 203 additions and 4 deletions

View file

@ -6,6 +6,9 @@ Mon Apr 26 7:05:00 1999 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* 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 <richard@brainstorm.co.uk>

View file

@ -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;

View file

@ -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 \

194
Source/NSInterfaceStyle.m Normal file
View file

@ -0,0 +1,194 @@
/*
NSInterfaceStyle.m
Copyright (C) 1999 Free Software Foundation, Inc.
Author: Richard Frith-Macdonald <richard@brainstorm.co.uk>
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 <gnustep/gui/config.h>
#include <Foundation/NSString.h>
#include <Foundation/NSDictionary.h>
#include <Foundation/NSException.h>
#include <Foundation/NSNotification.h>
#include <Foundation/NSUserDefaults.h>
#include <Foundation/NSMapTable.h>
#include <AppKit/NSResponder.h>
#include <AppKit/NSInterfaceStyle.h>
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