Committing Alex's font changes as well as my font panel changes and some

work I did on NSDataLink a while back (a few months ago).


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@16898 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Gregory John Casamento 2003-06-10 01:26:56 +00:00
parent 1e087664dd
commit d10d57c53e
14 changed files with 714 additions and 88 deletions

View file

@ -295,7 +295,9 @@ Class gmodel_class(void)
id obj;
// font fallback and automatic translation...
#if 0
[unarchiver decodeClassName: @"NSFont" asClassName: @"GSFontProxy"];
#endif
// [unarchiver decodeClassName: @"NSString" asClassName: @"GSStringProxy"];
NSDebugLog(@"Invoking unarchiver");
@ -1486,6 +1488,22 @@ Class gmodel_class(void)
}
@end
// this class holds the data from subclasses so that more specific templates
// need not be made.
@implementation GSObjectData
- (void) setValuesFromObject: (id)object
{
}
- (void) restoreValuesToObject: (id)object
{
}
- (NSMutableDictionary *)dictionary
{
return dictionary;
}
@end
// This class uses the templates above to persist the correct type of
// custom object into the nib file.
@ -1547,6 +1565,7 @@ Class gmodel_class(void)
}
@end
#if 0
// Font proxy...
@implementation GSFontProxy
- (id) initWithCoder: (NSCoder *)aDecoder
@ -1562,6 +1581,7 @@ Class gmodel_class(void)
return result;
}
@end
#endif
// String proxy for dynamic translation...
/*

View file

@ -48,13 +48,31 @@
//
- (id)initWithDelegate:(id)anObject
{
return nil;
self = [super init];
ASSIGN(delegate,anObject);
filename = nil;
delegateVerifiesLinks = NO;
interactsWithUser = NO;
isEdited = NO;
areLinkOutlinesVisible = NO;
return self;
}
- (id)initWithDelegate:(id)anObject
fromFile:(NSString *)path
{
return nil;
self = [super init];
ASSIGN(delegate,anObject);
ASSIGN(filename,path);
delegateVerifiesLinks = NO;
interactsWithUser = NO;
isEdited = NO;
areLinkOutlinesVisible = NO;
return self;
}
//
@ -74,7 +92,7 @@
- (NSDataLink *)addLinkPreviouslyAt:(NSSelection *)oldSelection
fromPasteboard:(NSPasteboard *)pasteboard
at:(NSSelection *)selection
at:(NSSelection *)selection
{
return nil;
}
@ -111,41 +129,45 @@ at:(NSSelection *)selection
//
- (id)delegate
{
return nil;
return delegate;
}
- (BOOL)delegateVerifiesLinks
{
return NO;
return delegateVerifiesLinks;
}
- (NSString *)filename
{
return nil;
return filename;
}
- (BOOL)interactsWithUser
{
return NO;
return interactsWithUser;
}
- (BOOL)isEdited
{
return NO;
return isEdited;
}
- (void)setDelegateVerifiesLinks:(BOOL)flag
{}
{
delegateVerifiesLinks = flag;
}
- (void)setInteractsWithUser:(BOOL)flag
{}
{
interactsWithUser = flag;
}
//
// Getting and Setting Information about the Manager's Links
//
- (BOOL)areLinkOutlinesVisible
{
return NO;
return areLinkOutlinesVisible;
}
- (NSEnumerator *)destinationLinkEnumerator
@ -159,7 +181,9 @@ at:(NSSelection *)selection
}
- (void)setLinkOutlinesVisible:(BOOL)flag
{}
{
areLinkOutlinesVisible = flag;
}
- (NSEnumerator *)sourceLinkEnumerator
{

View file

@ -25,7 +25,46 @@
#include <gnustep/gui/config.h>
#include <AppKit/NSDataLinkPanel.h>
#include <AppKit/NSNibLoading.h>
static NSDataLinkPanel *__sharedDataLinkPanel;
@interface GSDataLinkPanelController : NSObject
{
id panel;
}
- (id) panel;
@end
@implementation GSDataLinkPanelController
- (id) init
{
NSString *panelPath;
NSDictionary *table;
self = [super init];
panelPath = [NSBundle pathForGNUstepResource: @"GSDataLinkPanel"
ofType: @"gorm"
inDirectory: nil];
NSLog(@"Panel path=%@",panelPath);
table = [NSDictionary dictionaryWithObject: self forKey: @"NSOwner"];
if ([NSBundle loadNibFile: panelPath
externalNameTable: table
withZone: [self zone]] == NO)
{
NSRunAlertPanel(@"Error", @"Could not load data link panel resource",
@"OK", NULL, NULL);
return nil;
}
return self;
}
- (id) panel
{
return panel;
}
@end
@implementation NSApplication (NSDataLinkPanel)
@ -60,9 +99,13 @@
//
+ (NSDataLinkPanel *)sharedDataLinkPanel
{
NSRunAlertPanel (NULL, @"Data Link Panel not implemented yet",
@"OK", NULL, NULL);
return nil;
if(__sharedDataLinkPanel == nil)
{
id controller = [[GSDataLinkPanelController alloc] init];
__sharedDataLinkPanel = [controller panel];
}
NSLog(@"%@",__sharedDataLinkPanel);
return __sharedDataLinkPanel;
}
//
@ -110,19 +153,29 @@ isMultiple:(BOOL)flag
// Responding to User Input
//
- (void)pickedBreakAllLinks:(id)sender
{}
{
NSLog(@"Break all links...");
}
- (void)pickedBreakLink:(id)sender
{}
{
NSLog(@"Break link...");
}
- (void)pickedOpenSource:(id)sender
{}
{
NSLog(@"Open Source...");
}
- (void)pickedUpdateDestination:(id)sender
{}
{
NSLog(@"Update destination...");
}
- (void)pickedUpdateMode:(id)sender
{}
{
NSLog(@"Update mode..");
}
//
// NSCoding protocol

View file

@ -40,6 +40,34 @@
#include <AppKit/NSView.h>
#include <gnustep/gui/GSFusedSilicaContext.h>
/*
The valid font roles. Note that these values are used when encoding and
decoding, so entries may never be removed. Entries may be added after the
last entry, and entries don't have to actually be handled.
Note that these values are multiplied by two before they are used since the
lowest bit is used to indicate an explicit size. If the lowest bit is set,
the size is explicitly specified and encoded.
*/
enum FontRoles
{
RoleExplicit=0,
RoleBoldSystemFont,
RoleSystemFont,
RoleUserFixedPitchFont,
RoleUserFont,
RoleTitleBarFont,
RoleMenuFont,
RoleMessageFont,
RolePaletteFont,
RoleToolTipsFont,
RoleControlContentFont,
RoleLabelFont
};
/* We cache all the 4 default fonts after we first get them.
But when a default font is changed, the variable is set to YES
so all default fonts are forced to be recomputed. */
@ -53,25 +81,30 @@ static NSFont *placeHolder = nil;
- (id) initWithName: (NSString*)name
matrix: (const float*)fontMatrix
fix: (BOOL)explicitlySet
screenFont: (BOOL)screenFont;
screenFont: (BOOL)screenFont
role: (int)role;
+ (NSFont*) _fontWithName: (NSString*)aFontName
size: (float)fontSize
role: (int)role;
@end
static int currentVersion = 2;
static int currentVersion = 3;
/*
* Just to ensure that we use a standard name in the cache.
*/
static NSString*
newNameWithMatrix(NSString *name, const float *matrix, BOOL fix,
BOOL screenFont)
BOOL screenFont, int role)
{
NSString *nameWithMatrix;
nameWithMatrix = [[NSString alloc] initWithFormat:
@"%@ %.3f %.3f %.3f %.3f %.3f %.3f %c %c", name,
@"%@ %.3f %.3f %.3f %.3f %.3f %.3f %c %c %i", name,
matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5],
(fix == NO) ? 'N' : 'Y',
screenFont ? 'S' : 'P'];
screenFont ? 'S' : 'P',
role];
return nameWithMatrix;
}
@ -133,7 +166,7 @@ newNameWithMatrix(NSString *name, const float *matrix, BOOL fix,
/* Class variables*/
/* Fonts that are preferred by the application */
NSArray *_preferredFonts;
static NSArray *_preferredFonts;
/* Class for fonts */
static Class NSFontClass = 0;
@ -143,11 +176,13 @@ static NSMapTable* globalFontMap = 0;
static NSUserDefaults *defaults = nil;
NSFont*
getNSFont(NSString* key, NSString* defaultFontName, float fontSize)
static NSFont *
getNSFont(NSString* key, NSString* defaultFontName, float fontSize, int role)
{
NSString *fontName;
NSFont *font;
role *= 2;
fontName = [defaults objectForKey: key];
if (fontName == nil)
@ -160,14 +195,20 @@ getNSFont(NSString* key, NSString* defaultFontName, float fontSize)
fontSize = [defaults floatForKey:
[NSString stringWithFormat: @"%@Size", key]];
}
else
{
role |= 1;
}
font = [NSFontClass fontWithName: fontName size: fontSize];
font = [NSFontClass _fontWithName: fontName size: fontSize role: role];
/* That font couldn't be found (?). */
if (font == nil)
{
/* Try the same size, but the defaultFontName. */
font = [NSFontClass fontWithName: defaultFontName size: fontSize];
font = [NSFontClass _fontWithName: defaultFontName
size: fontSize
role: role];
if (font == nil)
{
@ -175,21 +216,29 @@ getNSFont(NSString* key, NSString* defaultFontName, float fontSize)
fontSize = [defaults floatForKey:
[NSString stringWithFormat: @"%@Size", key]];
font = [NSFontClass fontWithName: defaultFontName size: fontSize];
font = [NSFontClass _fontWithName: defaultFontName
size: fontSize
role: role];
/* It seems we can't get any font here! Try some well known
* fonts as a last resort. */
if (font == nil)
{
font = [NSFontClass fontWithName: @"Helvetica" size: 12.];
font = [NSFontClass _fontWithName: @"Helvetica"
size: 12.
role: role];
}
if (font == nil)
{
font = [NSFontClass fontWithName: @"Courier" size: 12.];
font = [NSFontClass _fontWithName: @"Courier"
size: 12.
role: role];
}
if (font == nil)
{
font = [NSFontClass fontWithName: @"Fixed" size: 12.];
font = [NSFontClass _fontWithName: @"Fixed"
size: 12.
role: role];
}
}
}
@ -255,13 +304,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSBoldFont", @"Helvetica-Bold", fontSize);
return getNSFont (@"NSBoldFont", @"Helvetica-Bold", fontSize, RoleBoldSystemFont);
}
else
{
if ((font == nil) || (boldSystemCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSBoldFont", @"Helvetica-Bold", 0));
ASSIGN (font, getNSFont (@"NSBoldFont", @"Helvetica-Bold", 0, RoleBoldSystemFont));
boldSystemCacheNeedsRecomputing = NO;
}
return font;
@ -279,13 +328,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSFont", @"Helvetica", fontSize);
return getNSFont (@"NSFont", @"Helvetica", fontSize, RoleSystemFont);
}
else
{
if ((font == nil) || (systemCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSFont", @"Helvetica", 0, RoleSystemFont));
systemCacheNeedsRecomputing = NO;
}
return font;
@ -302,13 +351,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSUserFixedPitchFont", @"Courier", fontSize);
return getNSFont (@"NSUserFixedPitchFont", @"Courier", fontSize, RoleUserFixedPitchFont);
}
else
{
if ((font == nil) || (userFixedCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSUserFixedPitchFont", @"Courier", 0));
ASSIGN (font, getNSFont (@"NSUserFixedPitchFont", @"Courier", 0, RoleUserFixedPitchFont));
userFixedCacheNeedsRecomputing = NO;
}
return font;
@ -325,13 +374,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSUserFont", @"Helvetica", fontSize);
return getNSFont (@"NSUserFont", @"Helvetica", fontSize, RoleUserFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSUserFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSUserFont", @"Helvetica", 0, RoleUserFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -371,13 +420,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSControlContentFont", @"Helvetica", fontSize);
return getNSFont (@"NSControlContentFont", @"Helvetica", fontSize, RoleControlContentFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSControlContentFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSControlContentFont", @"Helvetica", 0, RoleControlContentFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -390,13 +439,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSLabelFont", @"Helvetica", fontSize);
return getNSFont (@"NSLabelFont", @"Helvetica", fontSize, RoleLabelFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSLabelFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSLabelFont", @"Helvetica", 0, RoleLabelFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -409,13 +458,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSMenuFont", @"Helvetica", fontSize);
return getNSFont (@"NSMenuFont", @"Helvetica", fontSize, RoleMenuFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSMenuFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSMenuFont", @"Helvetica", 0, RoleMenuFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -428,13 +477,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSTitleBarFont", @"Helvetica-Bold", fontSize);
return getNSFont (@"NSTitleBarFont", @"Helvetica-Bold", fontSize, RoleTitleBarFont);
}
else
{
if ((font == nil) || (boldSystemCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSTitleBarFont", @"Helvetica-Bold", 0));
ASSIGN (font, getNSFont (@"NSTitleBarFont", @"Helvetica-Bold", 0, RoleTitleBarFont));
boldSystemCacheNeedsRecomputing = NO;
}
return font;
@ -447,13 +496,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSMessageFont", @"Helvetica", fontSize);
return getNSFont (@"NSMessageFont", @"Helvetica", fontSize, RoleMessageFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSMessageFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSMessageFont", @"Helvetica", 0, RoleMessageFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -467,13 +516,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSPaletteFont", @"Helvetica-Bold", fontSize);
return getNSFont (@"NSPaletteFont", @"Helvetica-Bold", fontSize, RolePaletteFont);
}
else
{
if ((font == nil) || (boldSystemCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSPaletteFont", @"Helvetica-Bold", 0));
ASSIGN (font, getNSFont (@"NSPaletteFont", @"Helvetica-Bold", 0, RolePaletteFont));
boldSystemCacheNeedsRecomputing = NO;
}
return font;
@ -487,13 +536,13 @@ setNSFont(NSString* key, NSFont* font)
if (fontSize != 0)
{
return getNSFont (@"NSToolTipsFont", @"Helvetica", fontSize);
return getNSFont (@"NSToolTipsFont", @"Helvetica", fontSize, RoleToolTipsFont);
}
else
{
if ((font == nil) || (userCacheNeedsRecomputing == YES))
{
ASSIGN (font, getNSFont (@"NSToolTipsFont", @"Helvetica", 0));
ASSIGN (font, getNSFont (@"NSToolTipsFont", @"Helvetica", 0, RoleToolTipsFont));
userCacheNeedsRecomputing = NO;
}
return font;
@ -561,7 +610,8 @@ setNSFont(NSString* key, NSFont* font)
font = [placeHolder initWithName: aFontName
matrix: fontMatrix
fix: fix
screenFont: NO];
screenFont: NO
role: RoleExplicit];
return AUTORELEASE(font);
}
@ -573,6 +623,15 @@ setNSFont(NSString* key, NSFont* font)
*/
+ (NSFont*) fontWithName: (NSString*)aFontName
size: (float)fontSize
{
return [self _fontWithName: aFontName
size: fontSize
role: RoleExplicit];
}
+ (NSFont*) _fontWithName: (NSString*)aFontName
size: (float)fontSize
role: (int)aRole
{
NSFont *font;
float fontMatrix[6] = { 0, 0, 0, 0, 0, 0 };
@ -591,7 +650,8 @@ setNSFont(NSString* key, NSFont* font)
font = [placeHolder initWithName: aFontName
matrix: fontMatrix
fix: NO
screenFont: NO];
screenFont: NO
role: aRole];
return AUTORELEASE(font);
}
@ -621,7 +681,8 @@ setNSFont(NSString* key, NSFont* font)
- (id) initWithName: (NSString*)name
matrix: (const float*)fontMatrix
fix: (BOOL)explicitlySet
screenFont: (BOOL)screen;
screenFont: (BOOL)screen
role: (int)aRole
{
NSString *nameWithMatrix;
NSFont *font;
@ -631,7 +692,7 @@ setNSFont(NSString* key, NSFont* font)
/* Check whether the font is cached */
nameWithMatrix = newNameWithMatrix(name, fontMatrix, explicitlySet,
screen);
screen, aRole);
font = (id)NSMapGet(globalFontMap, (void*)nameWithMatrix);
if (font == nil)
{
@ -648,6 +709,7 @@ setNSFont(NSString* key, NSFont* font)
memcpy(matrix, fontMatrix, sizeof(matrix));
matrixExplicitlySet = explicitlySet;
screenFont = screen;
role = aRole;
fontInfo = RETAIN([GSFontInfo fontInfoForFontName: fontName
matrix: fontMatrix
screenFont: screen]);
@ -682,7 +744,8 @@ setNSFont(NSString* key, NSFont* font)
NSString *nameWithMatrix;
nameWithMatrix = newNameWithMatrix(fontName, matrix,
matrixExplicitlySet, screenFont);
matrixExplicitlySet, screenFont,
role);
NSMapRemove(globalFontMap, (void*)nameWithMatrix);
RELEASE(nameWithMatrix);
RELEASE(fontName);
@ -697,7 +760,7 @@ setNSFont(NSString* key, NSFont* font)
NSString *description;
nameWithMatrix = newNameWithMatrix(fontName, matrix, matrixExplicitlySet,
screenFont);
screenFont, role);
description = [[super description] stringByAppendingFormat: @" %@",
nameWithMatrix];
RELEASE(nameWithMatrix);
@ -748,7 +811,8 @@ setNSFont(NSString* key, NSFont* font)
return AUTORELEASE([placeHolder initWithName: fontName
matrix: fontMatrix
fix: YES
screenFont: screenFont]);
screenFont: screenFont
role: role]);
}
static BOOL flip_hack;
@ -802,7 +866,8 @@ static BOOL flip_hack;
return [placeHolder initWithName: fontName
matrix: matrix
fix: matrixExplicitlySet
screenFont: NO];
screenFont: NO
role: role];
}
- (NSFont*) screenFont
{
@ -811,7 +876,8 @@ static BOOL flip_hack;
return [placeHolder initWithName: fontName
matrix: matrix
fix: matrixExplicitlySet
screenFont: YES];
screenFont: YES
role: role];
}
- (float) ascender { return [fontInfo ascender]; }
@ -948,9 +1014,19 @@ static BOOL flip_hack;
- (void) encodeWithCoder: (NSCoder*)aCoder
{
[aCoder encodeObject: fontName];
[aCoder encodeArrayOfObjCType: @encode(float) count: 6 at: matrix];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &matrixExplicitlySet];
printf("encoding role %i\n",role);
[aCoder encodeValueOfObjCType: @encode(int) at: &role];
if (role == 0)
{
[aCoder encodeObject: fontName];
[aCoder encodeArrayOfObjCType: @encode(float) count: 6 at: matrix];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &matrixExplicitlySet];
}
else if (role & 1)
{
[aCoder encodeValueOfObjCType: @encode(float) at: &matrix[0]];
}
}
- (id) initWithCoder: (NSCoder*)aDecoder
@ -959,30 +1035,121 @@ static BOOL flip_hack;
id name;
float fontMatrix[6];
BOOL fix;
int the_role;
name = [aDecoder decodeObject];
[aDecoder decodeArrayOfObjCType: @encode(float)
count: 6
at: fontMatrix];
if (version == currentVersion)
printf("[NSFont -initWithCoder:] version %i\n",version);
if (version == 3)
{
[aDecoder decodeValueOfObjCType: @encode(BOOL)
at: &fix];
[aDecoder decodeValueOfObjCType: @encode(int)
at: &the_role];
printf("got explicit role %i\n",the_role);
}
else
{
if (fontMatrix[0] == fontMatrix[3]
&& fontMatrix[1] == 0.0 && fontMatrix[2] == 0.0)
fix = NO;
else
fix = YES;
the_role = RoleExplicit;
}
self = [self initWithName: name
matrix: fontMatrix
fix: fix
screenFont: NO];
return self;
if (the_role == RoleExplicit)
{
/* The easy case: an explicit font, or a font encoded with
version <= 2. */
name = [aDecoder decodeObject];
[aDecoder decodeArrayOfObjCType: @encode(float)
count: 6
at: fontMatrix];
if (version >= 2)
{
[aDecoder decodeValueOfObjCType: @encode(BOOL)
at: &fix];
}
else
{
if (fontMatrix[0] == fontMatrix[3]
&& fontMatrix[1] == 0.0 && fontMatrix[2] == 0.0)
fix = NO;
else
fix = YES;
}
self = [self initWithName: name
matrix: fontMatrix
fix: fix
screenFont: NO
role: RoleExplicit];
if (self)
return self;
self = [isa userFontOfSize: fontMatrix[0]];
NSAssert(self != nil, @"Couldn't find a valid font when decoding.");
return self;
}
else
{
/* A non-explicit font. */
float size;
NSFont *new;
if (the_role & 1)
{
[aDecoder decodeValueOfObjCType: @encode(float)
at: &size];
}
else
{
size = 0.0;
}
switch (the_role >> 1)
{
case RoleBoldSystemFont:
new = [isa boldSystemFontOfSize: size];
break;
case RoleSystemFont:
new = [isa systemFontOfSize: size];
break;
case RoleUserFixedPitchFont:
new = [isa userFixedPitchFontOfSize: size];
break;
case RoleTitleBarFont:
new = [isa titleBarFontOfSize: size];
break;
case RoleMenuFont:
new = [isa menuFontOfSize: size];
break;
case RoleMessageFont:
new = [isa messageFontOfSize: size];
break;
case RolePaletteFont:
new = [isa paletteFontOfSize: size];
break;
case RoleToolTipsFont:
new = [isa toolTipsFontOfSize: size];
break;
case RoleControlContentFont:
new = [isa controlContentFontOfSize: size];
break;
case RoleLabelFont:
new = [isa labelFontOfSize: size];
break;
default:
// NSDebugLLog(@"NSFont", @"unknown role %i", the_role);
printf("unknown role %i", the_role);
/* fall through */
case RoleUserFont:
new = [isa userFontOfSize: size];
break;
}
[self release];
if (new)
return new;
new = [isa userFontOfSize: size];
NSAssert(new != nil, @"Couldn't find a valid font when decoding.");
return new;
}
}
@end /* NSFont */

View file

@ -47,6 +47,9 @@
#include <AppKit/NSButton.h>
#include <AppKit/NSBox.h>
#define _SAVE_PANEL_X_PAD 5
#define _SAVE_PANEL_Y_PAD 4
static inline void _setFloatValue (NSTextField *field, float size)
{
/* If casting size to int and then back to float we get no change,
@ -88,6 +91,7 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
- (void) _doPreview;
- (void) ok: (id) sender;
- (void) _getOriginalSize;
- (id)_initWithoutGModel;
@end
@ -133,6 +137,7 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
_face = -1;
_family = -1;
[self reloadDefaultFontFamilies];
[self _getOriginalSize];
return self;
}
@ -304,8 +309,10 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
return _accessoryView;
}
/*
- (void) setAccessoryView: (NSView*)aView
{
// FIXME: We have to resize
// Perhaps we could copy the code from NSSavePanel over to here
if (_accessoryView != nil)
@ -316,6 +323,121 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
ASSIGN(_accessoryView, aView);
[[self contentView] addSubview: aView];
}
*/
- (void) _getOriginalSize
{
/* Used in setMinSize: */
_originalMinSize = [self minSize];
/* Used in setContentSize: */
_originalSize = [[self contentView] frame].size;
}
- (void) setAccessoryView: (NSView*)aView
{
NSRect accessoryViewFrame, bottomFrame;
NSRect tmpRect;
NSSize contentSize, contentMinSize;
float addedHeight, accessoryWidth;
if (aView == _accessoryView)
return;
/* The following code is very tricky. Please think and test a lot
before changing it. */
/* Remove old accessory view if any */
if (_accessoryView != nil)
{
/* Remove accessory view */
accessoryViewFrame = [_accessoryView frame];
[_accessoryView removeFromSuperview];
/* Change the min size before doing the resizing otherwise it
could be a problem. */
[self setMinSize: _originalMinSize];
/* Resize the panel to the height without the accessory view.
This must be done with the special care of not resizing
the heights of the other views. */
addedHeight = accessoryViewFrame.size.height + (_SAVE_PANEL_Y_PAD * 2);
contentSize = [[self contentView] frame].size;
contentSize.height -= addedHeight;
// Resize without modifying topView and bottomView height.
[_topView setAutoresizingMask: NSViewWidthSizable | NSViewMinYMargin];
[self setContentSize: contentSize];
[_topView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
}
/* Resize the panel to its original size. This resizes freely the
heights of the views. NB: minSize *must* come first */
[self setMinSize: _originalMinSize];
[self setContentSize: _originalSize];
/* Set the new accessory view */
_accessoryView = aView;
/* If there is a new accessory view, plug it in */
if (_accessoryView != nil)
{
/* Make sure the new accessory view behaves - its height must be fixed
* and its position relative to the bottom of the superview must not
* change - so its position rlative to the top must be changable. */
[_accessoryView setAutoresizingMask: NSViewMaxYMargin
| ([_accessoryView autoresizingMask]
& ~(NSViewHeightSizable | NSViewMinYMargin))];
/* Compute size taken by the new accessory view */
accessoryViewFrame = [_accessoryView frame];
addedHeight = accessoryViewFrame.size.height + (_SAVE_PANEL_Y_PAD * 2);
accessoryWidth = accessoryViewFrame.size.width + (_SAVE_PANEL_X_PAD * 2);
/* Resize content size accordingly */
contentSize = _originalSize;
contentSize.height += addedHeight;
if (accessoryWidth > contentSize.width)
{
contentSize.width = accessoryWidth;
}
/* Set new content size without resizing heights of topView, bottomView */
// Our views should resize horizontally if needed, but not vertically
[_topView setAutoresizingMask: NSViewWidthSizable | NSViewMinYMargin];
[self setContentSize: contentSize];
// Restore the original autoresizing masks
[_topView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
/* Compute new min size */
contentMinSize = _originalMinSize;
contentMinSize.height += addedHeight;
// width is more delicate
tmpRect = NSMakeRect (0, 0, contentMinSize.width, contentMinSize.height);
tmpRect = [NSWindow contentRectForFrameRect: tmpRect
styleMask: [self styleMask]];
if (accessoryWidth > tmpRect.size.width)
{
contentMinSize.width += accessoryWidth - tmpRect.size.width;
}
// Set new min size
[self setMinSize: contentMinSize];
/*
* Pack the Views
*/
/* BottomView is ready */
bottomFrame = [_bottomView frame];
/* AccessoryView */
accessoryViewFrame.origin.x
= (contentSize.width - accessoryViewFrame.size.width) / 2;
accessoryViewFrame.origin.y = NSMaxY (bottomFrame) + _SAVE_PANEL_Y_PAD;
[_accessoryView setFrameOrigin: accessoryViewFrame.origin];
/* Add the accessory view */
[[self contentView] addSubview: _accessoryView];
}
}
/*
* NSCoding protocol
@ -417,6 +539,7 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
// preview and selection
topArea = [[NSView alloc] initWithFrame: topAreaRect];
[topArea setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)];
_topView = topArea;
splitView = [[NSSplitView alloc] initWithFrame: splitViewRect];
[splitView setVertical: NO];
@ -541,6 +664,7 @@ static float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0,
// action buttons
bottomArea = [[NSView alloc] initWithFrame: bottomAreaRect];
_bottomView = bottomArea;
slash = [[NSBox alloc] initWithFrame: slashRect];
[slash setBorderType: NSGrooveBorder];