mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-23 02:10:48 +00:00
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:
parent
b1a006afbc
commit
d327fda457
4 changed files with 762 additions and 252 deletions
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue