diff --git a/Source/NSFontPanel.m b/Source/NSFontPanel.m index bf0e85060..a28900921 100644 --- a/Source/NSFontPanel.m +++ b/Source/NSFontPanel.m @@ -7,10 +7,14 @@ Author: Scott Christley Date: 1996 + Modified: Fred Kiefer Date: Febuary 2000 Almost complete rewrite. - + + Nicola Pero + Date: January 2001 - sizings and resizings + This file is part of the GNUstep GUI Library. This library is free software; you can redistribute it and/or @@ -40,11 +44,34 @@ #include #include #include +#include #include #include #include #include +static inline void _setFloatValue (NSTextField *field, float size) +{ + /* If casting size to int and then back to float we get no change, + it means it's an integer */ + if ((float)((int)size) == size) + { + /* We prefer using this if it's an int, so that it's + displayed like in `8' rather than like in + `8.0000000000'. Yes - when NSCell's formatters are + finished we won't need this. */ + [field setIntValue: (int)size]; + } + else + { + [field setFloatValue: size]; + } +} + + +/* Implemented in NSBrowser */ +@interface GSBrowserTitleCell : NSTextFieldCell +@end float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 16.0, 18.0, 24.0, 36.0, 48.0, 64.0}; @@ -141,16 +168,20 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, /* * Setting the Font */ -- (void) setPanelFont: (NSFont*)fontObject +- (void) setPanelFont: (NSFont *)fontObject isMultiple: (BOOL)flag { - NSTextField *previewArea = [[self contentView] viewWithTag: NSFPPreviewField]; + NSTextField *previewArea; + + previewArea = [[self contentView] viewWithTag: NSFPPreviewField]; ASSIGN(_panelFont, fontObject); _multiple = flag; if (fontObject == nil) - return; + { + return; + } [previewArea setFont: fontObject]; @@ -203,11 +234,13 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, face = [[_faceList objectAtIndex: i] objectAtIndex: 1]; } // show point size and select the row if there is one - [sizeField setFloatValue: size]; + _setFloatValue (sizeField, size); for (i = 0; i < sizeof(sizes)/sizeof(float); i++) { if (size == sizes[i]) - [sizeBrowser selectRow: i inColumn: 0]; + { + [sizeBrowser selectRow: i inColumn: 0]; + } } [previewArea setStringValue: [NSString stringWithFormat: @"%@ %@ %d PT", @@ -218,7 +251,7 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, /* * Converting */ -- (NSFont*) panelConvertFont: (NSFont*)fontObject +- (NSFont *) panelConvertFont: (NSFont *)fontObject { NSFont *newFont; @@ -236,8 +269,10 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, } if (newFont == nil) - newFont = fontObject; - + { + newFont = fontObject; + } + return newFont; } @@ -262,7 +297,9 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, // FIXME: We have to resize // Perhaps we could copy the code from NSSavePanel over to here if (_accessoryView != nil) - [_accessoryView removeFromSuperview]; + { + [_accessoryView removeFromSuperview]; + } ASSIGN(_accessoryView, aView); [[self contentView] addSubview: aView]; @@ -297,22 +334,22 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, - (id) _initWithoutGModel { - NSRect pf = {{100,100}, {300,300}}; - NSRect ta = {{0,50}, {300,250}}; - NSRect sv = {{0,5}, {300,245}}; - NSRect ts = {{0,200}, {297,40}}; - NSRect pa = {{6,0}, {285,50}}; - NSRect bs = {{0,0}, {297,188}}; - NSRect s1 = {{6,5}, {110,183}}; - NSRect s2 = {{122,5}, {110,183}}; - NSRect s3 = {{237,5}, {56,135}}; - NSRect sl = {{237,142}, {56,21}}; - NSRect l3 = {{237,166}, {56,22}}; - NSRect ba = {{0,0}, {300,50}}; - NSRect sb = {{0,45}, {300,2}}; - NSRect rb = {{56,8}, {72,24}}; - NSRect pb = {{137,8}, {72,24}}; - NSRect db = {{217,8}, {72,24}}; + NSRect contentRect = {{100, 100}, {300, 300}}; + NSRect topAreaRect = {{0, 42}, {300, 258}}; + NSRect splitViewRect = {{8, 8}, {284, 243}}; + NSRect topSplitRect = {{0, 0}, {284, 45}}; + NSRect previewAreaRect = {{0, 1}, {284, 44}}; + NSRect bottomSplitRect = {{0, 0}, {284, 190}}; + NSRect familyBrowserRect = {{0, 0}, {111, 189}}; + NSRect typefaceBrowserRect = {{113, 0}, {111, 189}}; + NSRect sizeBrowserRect = {{226, 0}, {58, 143}}; + NSRect sizeLabelRect = {{226, 145}, {58, 21}}; + NSRect sizeTitleRect = {{226, 168}, {58, 21}}; + NSRect bottomAreaRect = {{0, 0}, {300, 42}}; + NSRect slashRect = {{0, 40}, {300, 2}}; + NSRect revertButtonRect = {{63, 8}, {71, 24}}; + NSRect previewButtonRect = {{142, 8}, {71, 24}}; + NSRect setButtonRect = {{221, 8}, {71, 24}}; NSView *v; NSView *topArea; NSView *bottomArea; @@ -333,7 +370,7 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, unsigned int style = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask; - self = [super initWithContentRect: pf + self = [super initWithContentRect: contentRect styleMask: style backing: NSBackingStoreRetained defer: NO @@ -343,18 +380,18 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, v = [self contentView]; // preview and selection - topArea = [[NSView alloc] initWithFrame: ta]; + topArea = [[NSView alloc] initWithFrame: topAreaRect]; [topArea setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; - splitView = [[NSSplitView alloc] initWithFrame: sv]; + splitView = [[NSSplitView alloc] initWithFrame: splitViewRect]; [splitView setVertical: NO]; [splitView setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; - topSplit = [[NSView alloc] initWithFrame: ts]; - [topSplit setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; + topSplit = [[NSView alloc] initWithFrame: topSplitRect]; + [topSplit setAutoresizingMask: (NSViewWidthSizable | NSViewHeightSizable)]; // Display for the font example - previewArea = [[NSTextField alloc] initWithFrame: pa]; + previewArea = [[NSTextField alloc] initWithFrame: previewAreaRect]; [previewArea setBackgroundColor: [NSColor textBackgroundColor]]; [previewArea setDrawsBackground: YES]; [previewArea setEditable: NO]; @@ -362,16 +399,18 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, //[previewArea setUsesFontPanel: NO]; [previewArea setAlignment: NSCenterTextAlignment]; [previewArea setStringValue: @"Font preview"]; - [previewArea setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)]; + [previewArea setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)]; + [previewArea setTag: NSFPPreviewField]; [topSplit addSubview: previewArea]; RELEASE(previewArea); - bottomSplit = [[NSView alloc] initWithFrame: bs]; + bottomSplit = [[NSView alloc] initWithFrame: bottomSplitRect]; + [bottomSplit setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable]; // Selection of the font family // We use a browser with one column to get a selection list - familyBrowser = [[NSBrowser alloc] initWithFrame: s1]; + familyBrowser = [[NSBrowser alloc] initWithFrame: familyBrowserRect]; [familyBrowser setDelegate: self]; [familyBrowser setMaxVisibleColumns: 1]; [familyBrowser setAllowsMultipleSelection: NO]; @@ -381,14 +420,16 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, [familyBrowser setTakesTitleFromPreviousColumn: NO]; [familyBrowser setTarget: self]; [familyBrowser setDoubleAction: @selector(familySelected:)]; - [familyBrowser setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)]; + [familyBrowser setAutoresizingMask: (NSViewWidthSizable + | NSViewMaxXMargin + | NSViewHeightSizable)]; [familyBrowser setTag: NSFPFamilyBrowser]; [bottomSplit addSubview: familyBrowser]; RELEASE(familyBrowser); // selection of type face // We use a browser with one column to get a selection list - faceBrowser = [[NSBrowser alloc] initWithFrame: s2]; + faceBrowser = [[NSBrowser alloc] initWithFrame: typefaceBrowserRect]; [faceBrowser setDelegate: self]; [faceBrowser setMaxVisibleColumns: 1]; [faceBrowser setAllowsMultipleSelection: NO]; @@ -398,40 +439,41 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, [faceBrowser setTakesTitleFromPreviousColumn: NO]; [faceBrowser setTarget: self]; [faceBrowser setDoubleAction: @selector(faceSelected:)]; - [faceBrowser setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)]; + [faceBrowser setAutoresizingMask: (NSViewWidthSizable + | NSViewMinXMargin + | NSViewHeightSizable)]; [faceBrowser setTag: NSFPFaceBrowser]; [bottomSplit addSubview: faceBrowser]; RELEASE(faceBrowser); // label for selection of size - label = [[NSTextField alloc] initWithFrame: l3]; - [label setFont: [NSFont titleBarFontOfSize: 0]]; + label = [[NSTextField alloc] initWithFrame: sizeTitleRect]; + [label setCell: [GSBrowserTitleCell new]]; + [label setFont: [NSFont boldSystemFontOfSize: 0]]; [label setAlignment: NSCenterTextAlignment]; [label setDrawsBackground: YES]; - [label setBezeled: YES]; [label setEditable: NO]; - [label setSelectable: NO]; [label setTextColor: [NSColor windowFrameTextColor]]; [label setBackgroundColor: [NSColor controlShadowColor]]; [label setStringValue: @"Size"]; - [label setAutoresizingMask: (NSViewWidthSizable | NSViewMinYMargin)]; + [label setAutoresizingMask: NSViewMinXMargin | NSViewMinYMargin]; [label setTag: NSFPSizeTitle]; [bottomSplit addSubview: label]; RELEASE(label); // this is the size input field - sizeField = [[NSTextField alloc] initWithFrame: sl]; + sizeField = [[NSTextField alloc] initWithFrame: sizeLabelRect]; [sizeField setDrawsBackground: YES]; [sizeField setEditable: YES]; //[sizeField setAllowsEditingTextAttributes: NO]; [sizeField setAlignment: NSCenterTextAlignment]; [sizeField setBackgroundColor: [NSColor windowFrameTextColor]]; - [sizeField setAutoresizingMask: (NSViewWidthSizable|NSViewMinYMargin)]; + [sizeField setAutoresizingMask: NSViewMinXMargin | NSViewMinYMargin]; [sizeField setTag: NSFPSizeField]; [bottomSplit addSubview: sizeField]; RELEASE(sizeField); - sizeBrowser = [[NSBrowser alloc] initWithFrame: s3]; + sizeBrowser = [[NSBrowser alloc] initWithFrame: sizeBrowserRect]; [sizeBrowser setDelegate: self]; [sizeBrowser setMaxVisibleColumns: 1]; [sizeBrowser setAllowsMultipleSelection: NO]; @@ -441,54 +483,65 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, [sizeBrowser setTakesTitleFromPreviousColumn: NO]; [sizeBrowser setTarget: self]; [sizeBrowser setDoubleAction: @selector(sizeSelected:)]; - [sizeBrowser setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)]; + [sizeBrowser setAutoresizingMask: NSViewMinXMargin | NSViewHeightSizable]; [sizeBrowser setTag: NSFPSizeBrowser]; [bottomSplit addSubview: sizeBrowser]; RELEASE(sizeBrowser); [splitView addSubview: topSplit]; - // reset the size - [topSplit setFrame: ts]; RELEASE(topSplit); [splitView addSubview: bottomSplit]; RELEASE(bottomSplit); + + /* NSSplitView is tricky so we use this little workaround to force + the sizes right. */ + [topSplit setFrame: topSplitRect]; + [bottomSplit setFrame: bottomSplitRect]; + [splitView adjustSubviews]; + + [splitView setDelegate: self]; + [topArea addSubview: splitView]; RELEASE(splitView); // action buttons - bottomArea = [[NSView alloc] initWithFrame: ba]; + bottomArea = [[NSView alloc] initWithFrame: bottomAreaRect]; - slash = [[NSBox alloc] initWithFrame: sb]; + slash = [[NSBox alloc] initWithFrame: slashRect]; [slash setBorderType: NSGrooveBorder]; [slash setTitlePosition: NSNoTitle]; + [slash setAutoresizingMask: NSViewWidthSizable]; [bottomArea addSubview: slash]; RELEASE(slash); - // cancle button - revertButton = [[NSButton alloc] initWithFrame: rb]; + // cancel button + revertButton = [[NSButton alloc] initWithFrame: revertButtonRect]; [revertButton setStringValue: @"Revert"]; [revertButton setAction: @selector(cancel:)]; [revertButton setTarget: self]; [revertButton setTag: NSFPRevertButton]; + [revertButton setAutoresizingMask: NSViewMinXMargin]; [bottomArea addSubview: revertButton]; RELEASE(revertButton); // toggle button for preview - previewButton = [[NSButton alloc] initWithFrame: pb]; + previewButton = [[NSButton alloc] initWithFrame: previewButtonRect]; [previewButton setStringValue: @"Preview"]; [previewButton setButtonType: NSOnOffButton]; [previewButton setAction: @selector(_togglePreview:)]; [previewButton setTarget: self]; [previewButton setTag: NSFPPreviewButton]; + [previewButton setAutoresizingMask: NSViewMinXMargin]; [bottomArea addSubview: previewButton]; RELEASE(previewButton); // button to set the font - setButton = [[NSButton alloc] initWithFrame: db]; + setButton = [[NSButton alloc] initWithFrame: setButtonRect]; [setButton setStringValue: @"Set"]; [setButton setAction: @selector(ok:)]; [setButton setTarget: self]; [setButton setTag: NSFPSetButton]; + [setButton setAutoresizingMask: NSViewMinXMargin]; [bottomArea addSubview: setButton]; // make it the default button //[self setDefaultButtonCell: [setButton cell]]; @@ -499,11 +552,16 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, // Add the accessory view, if there is one if (_accessoryView != nil) - [v addSubview: _accessoryView]; - + { + [v addSubview: _accessoryView]; + } + + [bottomArea setAutoresizingMask: NSViewWidthSizable]; [v addSubview: bottomArea]; RELEASE(bottomArea); + [self setMinSize: [self frame].size]; + return self; } @@ -560,6 +618,8 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, - (void) cancel: (id)sender { + // FIXME/TODO + /* * The cancel button has been pushed * we should reset the items in the panel @@ -568,7 +628,7 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, isMultiple: _multiple]; } -- (NSFont*) _fontForSelection: (NSFont*)fontObject +- (NSFont *) _fontForSelection: (NSFont *)fontObject { float size; NSString *fontName; @@ -615,30 +675,37 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, selectRow: (int)row inColumn: (int)column { - if ([sender tag] == NSFPFamilyBrowser) + switch ([sender tag]) { - NSFontManager *fm = [NSFontManager sharedFontManager]; - NSBrowser *faceBrowser = [[self contentView] viewWithTag: NSFPFaceBrowser]; + case NSFPFamilyBrowser: + { + NSFontManager *fm = [NSFontManager sharedFontManager]; + NSBrowser *faceBrowser = [[self contentView] viewWithTag: NSFPFaceBrowser]; + + ASSIGN(_faceList, [fm availableMembersOfFontFamily: + [_familyList objectAtIndex: row]]); + + _family = row; + [faceBrowser validateVisibleColumns]; + _face = -1; + break; + } + case NSFPFaceBrowser: + { + _face = row; + break; + } + case NSFPSizeBrowser: + default: + { + NSTextField *sizeField; - ASSIGN(_faceList, [fm availableMembersOfFontFamily: - [_familyList objectAtIndex: row]]); - - _family = row; - [faceBrowser validateVisibleColumns]; - _face = -1; + sizeField = [[self contentView] viewWithTag: NSFPSizeField]; + _setFloatValue (sizeField, sizes[row]); + break; + } } - else if ([sender tag] == NSFPFaceBrowser) - { - _face = row; - } - else if ([sender tag] == NSFPSizeBrowser) - { - float size = sizes[row]; - NSTextField *sizeField = [[self contentView] viewWithTag: NSFPSizeField]; - - [sizeField setFloatValue: size]; - } - + if (_preview) { [self _togglePreview: nil]; @@ -647,62 +714,100 @@ float sizes[] = {4.0, 6.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, return YES; } -- (int) browser: (NSBrowser*)sender numberOfRowsInColumn: (int)column +- (int) browser: (NSBrowser*)sender numberOfRowsInColumn: (int)column { - if ([sender tag] == NSFPFamilyBrowser) - return [_familyList count]; - else if ([sender tag] == NSFPFaceBrowser) - return [_faceList count]; - else if ([sender tag] == NSFPSizeBrowser) - return sizeof(sizes)/sizeof(float); - - return 0; + switch ([sender tag]) + { + case NSFPFamilyBrowser: + { + return [_familyList count]; + } + case NSFPFaceBrowser: + { + return [_faceList count]; + } + case NSFPSizeBrowser: + { + return sizeof (sizes) / sizeof (float); + } + default: + { + return 0; + } + } } -- (NSString*) browser: (NSBrowser*)sender titleOfColumn: (int)column +- (NSString*) browser: (NSBrowser*)sender titleOfColumn: (int)column { - if ([sender tag] == NSFPFamilyBrowser) - return @"Family"; - else if ([sender tag] == NSFPFaceBrowser) - return @"Typeface"; - - return @""; + switch ([sender tag]) + { + case NSFPFamilyBrowser: + { + return @"Family"; + } + case NSFPFaceBrowser: + { + return @"Typeface"; + } + default: + { + return @""; + } + } } -- (void) browser: (NSBrowser*)sender +- (void) browser: (NSBrowser *)sender willDisplayCell: (id)cell atRow: (int)row column: (int)column { NSString *value = nil; - if ([sender tag] == NSFPFamilyBrowser) + switch ([sender tag]) { - if ([_familyList count] > row) - { - value = [_familyList objectAtIndex: row]; - } - } - else if ([sender tag] == NSFPFaceBrowser) - { - if ([_faceList count] > row) - { - value = [[_faceList objectAtIndex: row] objectAtIndex: 1]; - } - } - else if ([sender tag] == NSFPSizeBrowser) - { - value = [NSString stringWithFormat: @"%d", (int) sizes[row]]; + case NSFPFamilyBrowser: + { + if ([_familyList count] > row) + { + value = [_familyList objectAtIndex: row]; + } + break; + } + case NSFPFaceBrowser: + { + if ([_faceList count] > row) + { + value = [[_faceList objectAtIndex: row] objectAtIndex: 1]; + } + break; + } + case NSFPSizeBrowser: + default: + { + value = [NSString stringWithFormat: @"%d", (int) sizes[row]]; + } } [cell setStringValue: value]; [cell setLeaf: YES]; } -- (BOOL) browser: (NSBrowser*)sender +- (BOOL) browser: (NSBrowser *)sender isColumnValid: (int)column; { return NO; } @end + +@implementation NSFontPanel (NSSplitViewDelegate) + +- (void) splitView: (NSSplitView *)splitView +constrainMinCoordinate: (float *)min + maxCoordinate: (float *)max + ofSubviewAt: (int)offset +{ + *max = *max - 100; +} + +@end