Rewrite of NSFontManager, NSFontPanel stuff

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@5861 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Nicola Pero 2000-01-25 14:36:17 +00:00
parent b1a006afbc
commit d327fda457
4 changed files with 762 additions and 252 deletions

View file

@ -7,7 +7,10 @@
Author: Scott Christley <scottc@net-community.com>
Date: 1996
Modified: Fred Kiefer <FredKiefer@gmx.de>
Date: January 2000
Almost complete rewrite.
This file is part of the GNUstep GUI Library.
This library is free software; you can redistribute it and/or
@ -42,26 +45,40 @@ typedef unsigned int NSFontTraitMask;
enum {
NSItalicFontMask = 1,
NSUnitalicFontMask = 0, //1024,
NSBoldFontMask = 2,
NSUnboldFontMask = 4,
NSNonStandardCharacterSetFontMask = 8,
NSNarrowFontMask = 16,
NSExpandedFontMask = 32,
NSCondensedFontMask = 64,
NSSmallCapsFontMask = 128,
NSPosterFontMask = 256,
NSCompressedFontMask = 512,
NSUnitalicFontMask = 1024
NSUnboldFontMask = 0, //2048,
NSNarrowFontMask = 4,
NSExpandedFontMask = 8,
NSCondensedFontMask = 16,
NSSmallCapsFontMask = 32,
NSPosterFontMask = 64,
NSCompressedFontMask = 128,
NSNonStandardCharacterSetFontMask = 256,
NSFixedPitchFontMask = 512
};
typedef enum {
NSNoFontChangeAction,
NSViaPanelFontAction,
NSAddTraitFontAction,
NSRemoveTraitFontAction,
NSSizeUpFontAction,
NSSizeDownFontAction,
NSHeavierFontAction,
NSLighterFontAction,
} NSFontTag;
@interface NSFontManager : NSObject
{
// Attributes
id delegate;
SEL action;
NSFont *selected_font;
NSArray *fontsList;
NSMenu *font_menu;
id _delegate;
SEL _action;
NSFont *_selectedFont;
BOOL _multible;
NSMenu *_fontMenu;
NSFontTag _storedTag;
NSFontTraitMask _trait;
}
//
@ -72,9 +89,39 @@ enum {
+ (NSFontManager *)sharedFontManager;
//
// Converting Fonts
// information on available fonts
//
- (NSArray *)availableFonts;
- (NSArray *)availableFontFamilies;
- (NSArray *)availableFontNamesWithTraits:(NSFontTraitMask)fontTraitMask;
- (NSArray *)availableMembersOfFontFamily:(NSString *)family;
- (NSString *) localizedNameForFamily:(NSString *)family face:(NSString *)face;
//
// Selecting fonts
//
- (void)setSelectedFont:(NSFont *)fontObject
isMultiple:(BOOL)flag;
- (NSFont *)selectedFont;
- (BOOL)isMultiple;
- (BOOL)sendAction;
//
// Action methods
//
- (void)addFontTrait:(id)sender;
- (void)removeFontTrait:(id)sender;
- (void)modifyFont:(id)sender;
- (void)modifyFontViaPanel:(id)sender;
//
//Automatic font conversion
//
- (NSFont *)convertFont:(NSFont *)fontObject;
//
// Converting Fonts
//
- (NSFont *)convertFont:(NSFont *)fontObject
toFamily:(NSString *)family;
- (NSFont *)convertFont:(NSFont *)fontObject
@ -87,34 +134,39 @@ enum {
toSize:(float)size;
- (NSFont *)convertWeight:(BOOL)upFlag
ofFont:(NSFont *)fontObject;
//
// Getting a font
//
- (NSFont *)fontWithFamily:(NSString *)family
traits:(NSFontTraitMask)traits
weight:(int)weight
size:(float)size;
//
// Examining a font
//
- (NSFontTraitMask)traitsOfFont:(NSFont *)aFont;
- (int)weightOfFont:(NSFont *)fontObject;
- (BOOL)fontNamed:(NSString *)typeface
hasTraits:(NSFontTraitMask)fontTraitMask;
//
// Setting and Getting Parameters
// Enabling
//
- (BOOL)isEnabled;
- (void)setEnabled:(BOOL)flag;
//
// Font menu
//
- (SEL)action;
- (NSArray *)availableFonts;
- (NSMenu *)fontMenu:(BOOL)create;
- (void)setFontMenu:(NSMenu *)newMenu;
//
// Font panel
//
- (NSFontPanel *)fontPanel:(BOOL)create;
- (void)orderFrontFontPanel:(id)sender;
- (BOOL)isEnabled;
- (BOOL)isMultiple;
- (NSFont *)selectedFont;
- (void)setAction:(SEL)aSelector;
- (void)setEnabled:(BOOL)flag;
- (void)setFontMenu:(NSMenu *)newMenu;
- (void)setSelectedFont:(NSFont *)fontObject
isMultiple:(BOOL)flag;
- (NSFontTraitMask)traitsOfFont:(NSFont *)fontObject;
- (int)weightOfFont:(NSFont *)fontObject;
//
// Target and Action Methods
//
- (BOOL)sendAction;
//
// Assigning a Delegate
@ -122,20 +174,21 @@ enum {
- (id)delegate;
- (void)setDelegate:(id)anObject;
//
// Action Methods
//
- (SEL)action;
- (void)setAction:(SEL)aSelector;
@end
@interface NSObject (NSFontManagerDelegate)
//
// Methods Implemented by the Delegate
//
- (BOOL)fontManager:(id)sender willIncludeFont:(NSString *)fontName;
@end
@interface NSFontManager (GNUstepBackend)
//
// Have the backend determine the fonts and families available
//
- (void)enumerateFontsAndFamilies;
@end
#endif // _GNUstep_H_NSFontManager

View file

@ -33,6 +33,7 @@
@class NSFont;
@class NSView;
@class NSButton;
enum {
NSFPPreviewButton,
@ -47,42 +48,47 @@ enum {
@interface NSFontPanel : NSPanel <NSCoding>
{
// Attributes
NSFont *panel_font;
NSFont *_panelFont;
NSButton *_setButton;
NSView *_accessoryView;
}
//
// Creating an NSFontPanel
//
+ (NSFontPanel *)sharedFontPanel;
- (NSFont *)panelConvertFont:(NSFont *)fontObject;
+ (BOOL)sharedFontPanelExists;
//
// Setting the Font
// Enabling
//
- (BOOL)isEnabled;
- (void)setEnabled:(BOOL)flag;
//
// Updating font
//
- (void)setPanelFont:(NSFont *)fontObject
isMultiple:(BOOL)flag;
//
// Configuring the NSFontPanel
// Converting
//
- (NSFont *)panelConvertFont:(NSFont *)fontObject;
//
// Works in modal loops
//
- (NSView *)accessoryView;
- (BOOL)isEnabled;
- (void)setAccessoryView:(NSView *)aView;
- (void)setEnabled:(BOOL)flag;
- (BOOL)worksWhenModal;
//
// Displaying the NSFontPanel
// Configuring the NSFontPanel
//
- (void)orderWindow:(NSWindowOrderingMode)place
relativeTo:(int)otherWindows;
//
// NSCoding protocol
//
- (void)encodeWithCoder:aCoder;
- initWithCoder:aDecoder;
- (NSView *)accessoryView;
- (void)setAccessoryView:(NSView *)aView;
@end
#endif // _GNUstep_H_NSFontPanel

View file

@ -7,6 +7,9 @@
Author: Scott Christley <scottc@net-community.com>
Date: 1996
Modified: Fred Kiefer <FredKiefer@gmx.de>
Date: January 2000
Almost complete rewrite.
This file is part of the GNUstep GUI Library.
@ -28,9 +31,51 @@
#include <gnustep/gui/config.h>
#include <Foundation/NSArray.h>
#include <Foundation/NSSet.h>
#include <AppKit/NSFontManager.h>
#include <AppKit/NSApplication.h>
#include <AppKit/NSFont.h>
#include <AppKit/NSFontPanel.h>
#include <AppKit/NSMenu.h>
#include <AppKit/NSMenuItem.h>
@interface NSFontManager (GNUstepBackend)
/*
* A backend for this class must always implement the methods
* traitsOfFont: and weightOfFont:
* It can either implement the method _allFonts to return an array
* of all the known fonts for the backend (as NSFont objects) or,
* supply a differnt implementation of the methods that use this:
* availableFonts, availableFontFamilies, availableFontNamesWithTraits,
* availableMembersOfFontFamily and fontNamed:hasTraits:
* The second is the more efficent way and should be prefered.
* A backend should also provide a better implementation for the method
* fontWithFamily:traits:weight:size:
* And it can also provide differnt implemantions for the basic font
* conversion methods.
* The idea is that the front end class defines an easy to subclass
* set of methods, so that a backend can start of with just a few methods but
* can become as fast and flexible as it wants.
*/
//
// Have the backend determine the fonts and families available
// FIXME: This method should rather be part of a subclass initialize method
- (void)enumerateFontsAndFamilies;
//
// The backend can use this method to check if a font
// is accepted by the delegate. Otherwise it should not be listed.
//
- (BOOL)_includeFont:(NSString *)fontName;
//
// List all the fonts as NSFont objects
//
- (NSArray *)_allFonts;
@end
//
// Class variables
@ -56,7 +101,7 @@ static Class fontPanelClass = Nil;
// Set the factories
[self setFontManagerFactory:[NSFontManager class]];
[self setFontPanelFactory:[NSFontManager class]];
[self setFontPanelFactory:[NSFontPanel class]];
}
}
@ -79,6 +124,7 @@ static Class fontPanelClass = Nil;
{
NSDebugLog(@"Initializing NSFontManager fonts\n");
sharedFontManager = [[fontManagerClass alloc] init];
// enumerate the available fonts
[sharedFontManager enumerateFontsAndFamilies];
}
return sharedFontManager;
@ -91,27 +137,276 @@ static Class fontPanelClass = Nil;
{
self = [super init];
// Allocate the font list
fontsList = [NSMutableArray array];
_action = @selector(fontChanged:);
_storedTag = NSNoFontChangeAction;
return self;
}
#if 0
/* This code needs to be reworked */
//
// information on available fonts
//
- (NSArray *)availableFonts
{
int i;
NSArray *fontsList = [self _allFonts];
NSMutableArray *fontNames = [NSMutableArray arrayWithCapacity:
[fontsList count]];
for (i=0; i < [fontsList count]; i++)
{
NSFont *font = (NSFont *)[fontsList objectAtIndex: i];
[fontNames addObject: [font fontName]];
}
return fontNames;
}
- (NSArray *)availableFontFamilies
{
int i;
NSArray *fontsList = [self _allFonts];
// Cannot use [NSMutableSet set] as this generates a compiler error
NSMutableSet *fontFamilies = [NSMutableSet setWithCapacity:
[fontsList count]];
for (i=0; i < [fontsList count]; i++)
{
NSFont *font = (NSFont *)[fontsList objectAtIndex: i];
[fontFamilies addObject: [font familyName]];
}
return [fontFamilies allObjects];
}
- (NSArray *)availableFontNamesWithTraits:(NSFontTraitMask)fontTraitMask
{
int i;
NSArray *fontsList = [self _allFonts];
NSMutableSet *fontNames = [NSMutableSet setWithCapacity:
[fontsList count]];
NSFontTraitMask traits;
for (i=0; i < [fontsList count]; i++)
{
NSFont *font = (NSFont *)[fontsList objectAtIndex: i];
traits = [self traitsOfFont: font];
// Check if the font has exactly the given mask
if (traits == fontTraitMask)
{
[fontNames addObject: [font fontName]];
}
}
return [fontNames allObjects];
}
// This are somewhat strange methods, as they are not in the list,
// but their implementation is defined.
- (NSArray *)availableMembersOfFontFamily:(NSString *)family
{
int i;
NSArray *fontsList = [self _allFonts];
NSMutableArray *fontDefs = [NSMutableArray array];
for (i=0; i < [fontsList count]; i++)
{
NSFont *font = (NSFont *)[fontsList objectAtIndex: i];
if ([[font familyName] isEqualToString: family])
{
NSMutableArray *fontDef = [NSMutableArray arrayWithCapacity: 4];
[fontDef addObject: [font fontName]];
// TODO How do I get the font extention name?
[fontDef addObject: @""];
[fontDef addObject: [NSNumber numberWithInt:
[self weightOfFont: font]]];
[fontDef addObject: [NSNumber numberWithUnsignedInt:
[self traitsOfFont: font]]];
[fontDefs addObject: fontDef];
}
}
return fontDefs;
}
- (NSString *) localizedNameForFamily:(NSString *)family
face:(NSString *)face
{
// TODO
return [NSString stringWithFormat: @"%@-%@", family, face];
}
//
// Selecting fonts
//
- (void)setSelectedFont:(NSFont *)fontObject
isMultiple:(BOOL)flag
{
_selectedFont = fontObject;
_multible = flag;
if (_fontMenu != nil)
{
NSMenuItem *menuItem;
NSFontTraitMask trait = [self traitsOfFont: fontObject];
// FIXME: We should check if that trait is available
// We keep the tag, to mark the item
if (trait & NSItalicFontMask)
{
menuItem = [_fontMenu itemWithTag: NSItalicFontMask];
if (menuItem != nil)
{
[menuItem setTitle: @"Unitalic"];
[menuItem setAction: @selector(removeFontTrait:)];
}
}
else
{
menuItem = [_fontMenu itemWithTag: NSItalicFontMask];
if (menuItem != nil)
{
[menuItem setTitle: @"Italic"];
[menuItem setAction: @selector(addFontTrait:)];
}
}
if (trait & NSBoldFontMask)
{
menuItem = [_fontMenu itemWithTag: NSBoldFontMask];
if (menuItem != nil)
{
[menuItem setTitle: @"Unbold"];
[menuItem setAction: @selector(removeFontTrait:)];
}
}
else
{
menuItem = [_fontMenu itemWithTag: NSBoldFontMask];
if (menuItem != nil)
{
[menuItem setTitle: @"Bold"];
[menuItem setAction: @selector(addFontTrait:)];
}
}
// TODO Update the rest of the font menu to reflect this font
}
[fontPanel setPanelFont: fontObject isMultiple: flag];
}
- (NSFont *)selectedFont
{
return _selectedFont;
}
- (BOOL)isMultiple
{
return _multible;
}
//
// Action methods
//
- (void)addFontTrait:(id)sender
{
_storedTag = NSAddTraitFontAction;
_trait = [sender tag];
[self sendAction];
// We update our own selected font
[self setSelectedFont: [self convertFont: _selectedFont]
isMultiple: _multible];
}
- (void)removeFontTrait:(id)sender
{
_storedTag = NSRemoveTraitFontAction;
_trait = [sender tag];
[self sendAction];
// We update our own selected font
[self setSelectedFont: [self convertFont: _selectedFont]
isMultiple: _multible];
}
- (void)modifyFont:(id)sender
{
_storedTag = [sender tag];
[self sendAction];
// We update our own selected font
[self setSelectedFont: [self convertFont: _selectedFont]
isMultiple: _multible];
}
- (void)modifyFontViaPanel:(id)sender
{
_storedTag = NSViaPanelFontAction;
[self sendAction];
// We update our own selected font
[self setSelectedFont: [self convertFont: _selectedFont]
isMultiple: _multible];
}
//
//Automatic font conversion
//
- (NSFont *)convertFont:(NSFont *)fontObject
{
NSFont *newFont = fontObject;
switch (_storedTag)
{
case NSNoFontChangeAction:
break;
case NSViaPanelFontAction:
// TODO get the panel to convert the font with panelConvertFont:
break;
case NSAddTraitFontAction:
newFont = [self convertFont: fontObject toHaveTrait: _trait];
break;
case NSRemoveTraitFontAction:
newFont = [self convertFont: fontObject toNotHaveTrait: _trait];
break;
case NSSizeUpFontAction:
// FIXME: How much should we size up?
newFont = [self convertFont: fontObject
toSize: [fontObject pointSize]+1.0];
break;
case NSSizeDownFontAction:
// FIXME: How much should we size down?
newFont = [self convertFont: fontObject
toSize: [fontObject pointSize]-1.0];
break;
case NSHeavierFontAction:
newFont = [self convertWeight: YES ofFont: fontObject];
break;
case NSLighterFontAction:
newFont = [self convertWeight: NO ofFont: fontObject];
break;
}
return newFont;
}
//
// Converting Fonts
//
- (NSFont *)convertFont:(NSFont *)fontObject
{
return fontObject;
}
- (NSFont *)convertFont:(NSFont *)fontObject
toFamily:(NSString *)family
{
if ([family compare:[fontObject familyName]] == NSOrderedSame)
if ([family isEqualToString: [fontObject familyName]])
{
// If already of that family then just return it
return fontObject;
@ -119,23 +414,44 @@ static Class fontPanelClass = Nil;
else
{
// Else convert it
NSFont *f = [fontObject mutableCopy];
[f setFamilyName:family];
return f;
NSFont *newFont;
NSFontTraitMask trait = [self traitsOfFont: fontObject];
int weight = [self weightOfFont: fontObject];
float size = [fontObject pointSize];
newFont = [self fontWithFamily: family
traits: trait
weight: weight
size: size];
if (newFont == nil)
return fontObject;
else
return newFont;
}
}
- (NSFont *)convertFont:(NSFont *)fontObject
toFace:(NSString *)typeface
{
// +++ How to do this conversion?
return fontObject;
NSFont *newFont;
// TODO: How to do this conversion?
if ([[fontObject fontName] isEqualToString: typeface])
{
return fontObject;
}
newFont = [NSFont fontWithName: typeface size: [fontObject pointSize]];
if (newFont == nil)
return fontObject;
else
return newFont;
}
- (NSFont *)convertFont:(NSFont *)fontObject
toHaveTrait:(NSFontTraitMask)trait
{
NSFontTraitMask t = [fontObject traits];
NSFontTraitMask t = [self traitsOfFont: fontObject];
if (t & trait)
{
@ -145,17 +461,28 @@ static Class fontPanelClass = Nil;
else
{
// Else convert it
NSFont *f = [fontObject mutableCopy];
NSFont *newFont;
int weight = [self weightOfFont: fontObject];
float size = [fontObject pointSize];
NSString *family = [fontObject familyName];
t = t | trait;
[f setTraits:t];
return f;
newFont = [self fontWithFamily: family
traits: t
weight: weight
size: size];
if (newFont == nil)
return fontObject;
else
return newFont;
}
}
- (NSFont *)convertFont:(NSFont *)fontObject
toNotHaveTrait:(NSFontTraitMask)trait
{
NSFontTraitMask t = [fontObject traits];
NSFontTraitMask t = [self traitsOfFont: fontObject];
if (!(t & trait))
{
@ -165,10 +492,21 @@ static Class fontPanelClass = Nil;
else
{
// Else convert it
NSFont *f = [fontObject mutableCopy];
NSFont *newFont;
int weight = [self weightOfFont: fontObject];
float size = [fontObject pointSize];
NSString *family = [fontObject familyName];
t = t ^ trait;
[f setTraits:t];
return f;
newFont = [self fontWithFamily: family
traits: t
weight: weight
size: size];
if (newFont == nil)
return fontObject;
else
return newFont;
}
}
@ -183,189 +521,228 @@ static Class fontPanelClass = Nil;
else
{
// Else convert it
NSFont *f = [fontObject mutableCopy];
[f setPointSize:size];
return f;
NSFont *newFont;
NSFontTraitMask trait = [self traitsOfFont: fontObject];
int weight = [self weightOfFont: fontObject];
NSString *family = [fontObject familyName];
newFont = [self fontWithFamily: family
traits: trait
weight: weight
size: size];
if (newFont == nil)
return fontObject;
else
return newFont;
}
}
- (NSFont *)convertWeight:(BOOL)upFlag
ofFont:(NSFont *)fontObject
{
int w = [fontObject weight];
NSFont *f = [fontObject mutableCopy];
NSFont *newFont;
NSFontTraitMask trait = [self traitsOfFont: fontObject];
float size = [fontObject pointSize];
NSString *family = [fontObject familyName];
int w = [self weightOfFont: fontObject];
// Weight are sort of arbitrary, so we will use
// 0 - light, 400 - normal, 700 - bold
if (upFlag)
{
if (w == 0)
w = 400;
else if (w == 400)
w = 700;
// The documentation is a bit unclear about the range of weights
// sometimes it says 0 to 9 and sometimes 0 to 15
w = MIN(15, w+1);
}
else
{
if (w == 700)
w = 400;
else if (w == 400)
w = 0;
w = MAX(0, w-1);
}
[f setWeight: w];
return f;
newFont = [self fontWithFamily: family
traits: trait
weight: w
size: size];
if (newFont == nil)
return fontObject;
else
return newFont;
}
//
// Getting a font
//
- (NSFont *)fontWithFamily:(NSString *)family
traits:(NSFontTraitMask)traits
weight:(int)weight
size:(float)size
{
int i, j;
BOOL found = NO;
NSString *name;
NSFont *f;
NSArray *fontDefs = [self availableMembersOfFontFamily: family];
int i;
// Make sure it is a legitimate family name
j = [fontsList count];
for (i = 0;i < j; ++i)
for (i = 0; i < [fontDefs count]; i++)
{
name = [fontsList objectAtIndex:i];
if ([family compare:name] == NSOrderedSame)
NSArray *fontDef = [fontDefs objectAtIndex: i];
if (([[fontDef objectAtIndex: 3] intValue] == weight) &&
([[fontDef objectAtIndex: 4] unsignedIntValue] == traits))
{
found = YES;
break;
return [NSFont fontWithName: [fontDef objectAtIndex: 1]
size: size];
}
}
// Create the font
if (found)
{
f = [[NSFont alloc] init];
[f setFamilyName: family];
[f setTraits: traits];
[f setWeight: weight];
[f setPointSize: size];
return f;
}
else
{
NSLog(@"Invalid font request\n");
return nil;
}
}
#else
- (NSFont *)convertFont:(NSFont *)fontObject
toFamily:(NSString *)family
{
return fontObject;
}
- (NSFont *)convertFont:(NSFont *)fontObject
toFace:(NSString *)typeface
{
return fontObject;
}
- (NSFont *)convertFont:(NSFont *)fontObject
toHaveTrait:(NSFontTraitMask)trait
{
return fontObject;
}
- (NSFont *)convertFont:(NSFont *)fontObject
toSize:(float)size
{
return fontObject;
}
#endif
//
// Setting and Getting Parameters
//
- (SEL)action
{
return action;
}
- (NSArray *)availableFonts
{
return fontsList;
}
- (NSMenu *)fontMenu:(BOOL)create
{
return font_menu;
}
// Get the font panel...
- (NSFontPanel *)fontPanel:(BOOL)create
{
if ((!fontPanel) && (create))
fontPanel = [[fontPanelClass alloc] init];
return fontPanel;
}
// Bring the font panel to the front... MacOSX only?
- (void)orderFrontFontPanel:(id)sender
{
if (!fontPanel)
fontPanel = [[fontPanelClass alloc] init];
[fontPanel orderFront:nil];
}
- (BOOL)isEnabled
{
return NO;
}
- (BOOL)isMultiple
{
return NO;
}
- (NSFont *)selectedFont
{
return nil;
}
- (void)setAction:(SEL)aSelector
{
action = aSelector;
}
- (void)setEnabled:(BOOL)flag
{}
- (void)setFontMenu:(NSMenu *)newMenu
{}
- (void)setSelectedFont:(NSFont *)fontObject
isMultiple:(BOOL)flag
{
selected_font = fontObject;
}
#if 0
//
// Examining a font
//
- (NSFontTraitMask)traitsOfFont:(NSFont *)fontObject
{
return [fontObject traits];
// TODO
return 0;
}
- (int)weightOfFont:(NSFont *)fontObject
{
return [fontObject weight];
// TODO
return 5;
}
- (BOOL)fontNamed:(NSString *)typeface
hasTraits:(NSFontTraitMask)fontTraitMask;
{
int i;
NSArray *fontsList = [self _allFonts];
for (i=0; i < [fontsList count]; i++)
{
NSFont *font = (NSFont *)[fontsList objectAtIndex: i];
if ([[font fontName] isEqualToString: typeface])
{
// FIXME: This is not exactly the right condition
if (([self traitsOfFont: font] & fontTraitMask) == fontTraitMask)
{
return YES;
}
else
return NO;
}
}
return NO;
}
#endif
//
// Target and Action Methods
// Enabling
//
- (BOOL)sendAction
- (BOOL)isEnabled
{
return NO;
if (fontPanel != nil)
{
return [fontPanel isEnabled];
}
else
return NO;
}
- (void)setEnabled:(BOOL)flag
{
int i;
if (_fontMenu != nil)
{
for (i = 0; i < [_fontMenu numberOfItems]; i++)
{
[[_fontMenu itemAtIndex: i] setEnabled: flag];
}
}
[fontPanel setEnabled: flag];
}
//
// Font menu
//
- (NSMenu *)fontMenu:(BOOL)create
{
if (create && _fontMenu == nil)
{
NSMenuItem *menuItem;
_fontMenu = [NSMenu new];
[_fontMenu setTitle: @"Font Menu"];
// First an entry to start the font panel
menuItem = [_fontMenu addItemWithTitle: @"Font Panel"
action: @selector(orderFrontFontPanel:)
keyEquivalent: @"f"];
[menuItem setTarget: self];
// Entry for italic
menuItem = [_fontMenu addItemWithTitle: @"Italic"
action: @selector(addFontTrait:)
keyEquivalent: @"i"];
[menuItem setTag: NSItalicFontMask];
[menuItem setTarget: self];
// Entry for bold
menuItem = [_fontMenu addItemWithTitle: @"Bold"
action: @selector(addFontTrait:)
keyEquivalent: @"b"];
[menuItem setTag: NSBoldFontMask];
[menuItem setTarget: self];
// Entry to increase weight
menuItem = [_fontMenu addItemWithTitle: @"Heavier"
action: @selector(modifyFont:)
keyEquivalent: @"h"];
[menuItem setTag: NSHeavierFontAction];
[menuItem setTarget: self];
// Entry to decrease weight
menuItem = [_fontMenu addItemWithTitle: @"Lighter"
action: @selector(modifyFont:)
keyEquivalent: @"g"];
[menuItem setTag: NSLighterFontAction];
[menuItem setTarget: self];
// Entry to increase size
menuItem = [_fontMenu addItemWithTitle: @"Larger"
action: @selector(modifyFont:)
keyEquivalent: @"l"];
[menuItem setTag: NSSizeUpFontAction];
[menuItem setTarget: self];
// Entry to decrease size
menuItem = [_fontMenu addItemWithTitle: @"Smaller"
action: @selector(modifyFont:)
keyEquivalent: @"s"];
[menuItem setTag: NSSizeDownFontAction];
[menuItem setTarget: self];
}
return _fontMenu;
}
- (void)setFontMenu:(NSMenu *)newMenu
{
ASSIGN(_fontMenu, newMenu);
}
// Font panel
- (NSFontPanel *)fontPanel:(BOOL)create
{
if ((fontPanel == nil) && (create))
fontPanel = [[fontPanelClass alloc] init];
return fontPanel;
}
- (void)orderFrontFontPanel:(id)sender
{
if (fontPanel == nil)
fontPanel = [[fontPanelClass alloc] init];
[fontPanel orderFront: nil];
}
//
@ -373,23 +750,35 @@ static Class fontPanelClass = Nil;
//
- (id)delegate
{
return delegate;
return _delegate;
}
- (void)setDelegate:(id)anObject
{
delegate = anObject;
ASSIGN(_delegate, anObject);
}
//
// Methods Implemented by the Delegate
// Setting and Getting Parameters
//
- (BOOL)fontManager:(id)sender willIncludeFont:(NSString *)fontName
- (SEL)action
{
if ([delegate respondsToSelector:@selector(fontManager:willIncludeFont:)])
return [delegate fontManager:self willIncludeFont:fontName];
return _action;
}
- (void)setAction:(SEL)aSelector
{
_action = aSelector;
}
- (BOOL)sendAction
{
NSApplication *theApp = [NSApplication sharedApplication];
if (_action)
return [theApp sendAction: _action to: nil from: self];
else
return YES;
return NO;
}
@end
@ -400,4 +789,26 @@ static Class fontPanelClass = Nil;
{
}
//
// Ask delegate if to include a font
//
- (BOOL)_includeFont:(NSString *)fontName
{
if ((_delegate != nil) &&
[_delegate respondsToSelector:@selector(fontManager:willIncludeFont:)])
return [_delegate fontManager:self willIncludeFont:fontName];
else
return YES;
}
- (NSArray *) _allFonts
{
NSArray *fontsList;
// Allocate the font list
fontsList = [NSMutableArray array];
return fontsList;
}
@end

View file

@ -65,6 +65,13 @@
return [fm fontPanel: YES];
}
+ (BOOL)sharedFontPanelExists
{
NSFontManager *fm = [NSFontManager sharedFontManager];
return ([fm fontPanel: NO] != nil);
}
//
// Instance methods
//
@ -220,6 +227,8 @@
setButton = [[NSButton alloc] initWithFrame: b];
[setButton setStringValue: @"Set"];
[bottomArea addSubview: setButton];
// Store this button
ASSIGN(_setButton, setButton);
[splitView addSubview: bottomSplit];
[splitView addSubview: topSplit];
@ -230,18 +239,58 @@
return self;
}
- (NSFont *)panelConvertFont: (NSFont *)fontObject
//
// Enabling
//
- (BOOL)isEnabled
{
return panel_font;
return [_setButton isEnabled];
}
- (void)setEnabled: (BOOL)flag
{
[_setButton setEnabled: flag];
}
//
// Setting the Font
//
- (void)setPanelFont: (NSFont *)fontObject
isMultiple: (BOOL)flag
{
ASSIGN(panel_font, fontObject);
ASSIGN(_panelFont, fontObject);
if (flag)
{
// TODO: Show the font in the items
}
else
{
// TODO: Unselect all items and show a message
}
}
//
// Converting
//
- (NSFont *)panelConvertFont: (NSFont *)fontObject
{
NSFontManager *fm = [NSFontManager sharedFontManager];
NSFont *newFont;
//TODO: We go over every item in the panel and check if a
// value is selected. If so we send it on to the manager
newFont = [fm convertFont: fontObject toHaveTrait: NSItalicFontMask];
return newFont;
}
//
// Works in modal loops
//
- (BOOL)worksWhenModal
{
return YES;
}
//
@ -249,23 +298,14 @@
//
- (NSView *)accessoryView
{
return nil;
}
- (BOOL)isEnabled
{
return NO;
return _accessoryView;
}
- (void)setAccessoryView: (NSView *)aView
{}
- (void)setEnabled: (BOOL)flag
{}
- (BOOL)worksWhenModal
{
return NO;
ASSIGN(_accessoryView, aView);
[[self contentView] addSubview: aView];
// We propably have to resize
}
//
@ -275,14 +315,14 @@
{
[super encodeWithCoder: aCoder];
[aCoder encodeObject: panel_font];
[aCoder encodeObject: _panelFont];
}
- (id) initWithCoder: (NSCoder*)aDecoder
{
[super initWithCoder: aDecoder];
panel_font = RETAIN([aDecoder decodeObject]);
_panelFont = RETAIN([aDecoder decodeObject]);
return self;
}