PDP-8-E-Simulator/Utilities/TableCornerView.m

168 lines
4.9 KiB
Objective-C

/*
* PDP-8/E Simulator
*
* Copyright © 1994-2015 Bernhard Baehr
*
* TableCornerView.m - Status indicator and button corner view for a NSTableControl
*
* This file is part of PDP-8/E Simulator.
*
* PDP-8/E Simulator is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#import <Cocoa/Cocoa.h>
#import "Utilities.h"
#import "TableCornerView.h"
@interface TableCornerCell : NSTableHeaderCell
{
}
@end
@implementation TableCornerCell
- (void) setState:(int)state
{
// ignore state setting caused by mouse klick, otherwise the cell switchs from white to gray
// send the action here because NSTableHeaderControl does not send any action
[NSApp sendAction:[self action] to:[self target] from:self];
}
/* With Yosemie 10.10 14A389 and 10.10.1 14B25, there are some optical glitches with the TableCornerCell when it is
used with an image (initImageCell: and setImageNamed: methods) (Yosemite NSTableHeaderCell bugs?):
- the background is drawn in very light gray, not completely white (white only when the window is deactivated)
- the cell is not highlighted when clicked
- the left separator is not down, but the right one in the border of the scroll view (the borders appear
when you set scroll bars to always be visible in the General system preferences
Reported to Apple with bug ID 18848420, closed with the statement "this is the new look".
So we implement the correct Yosemite behaviour in the highlight:withFrame:inView and drawWithFram:inView: methods
These glitches are still present with 10.10.4, with a little different behaviour. (Even with Mavericks, there are
minor glitches: the right separator is drawn in the border of the scroll view.) The following implementation is
not absolute perfect, but the remaining glitches are not striking.
*/
- (NSRect) framerect:(NSRect)frame
{
NSRect rect;
rect.size = [[self image] size];
unsigned width = frame.size.width;
if (width % 2 == 0)
width--;
rect.origin.x = (width - rect.size.width) / 2;
if (rect.origin.x >= 2)
rect.origin.x++;
rect.origin.y = (frame.size.height - rect.size.height) / 2;
return rect;
}
- (void) highlight:(BOOL)flag withFrame:(NSRect)frame inView:(NSView *)view
{
// [super hightlight:NO ...] does not cause an unhighlight of the cell - Cocoa bug?
if (flag) {
if (runningOnYosemiteOrNewer()) { // else, there is no highlight of the wrongly gray background
// draw frame at the left (this is clipped when the column separator is visible)
[[NSColor secondarySelectedControlColor] set];
NSRect rect = [self framerect:frame];
rect.origin.x--;
rect.size.width++;
[NSBezierPath fillRect:rect];
// draw content of the table corner view
[[NSColor controlHighlightColor] set];
[NSBezierPath fillRect:[self framerect:frame]];
[self drawWithFrame:frame inView:view];
} else
[super highlight:YES withFrame:frame inView:view];
} else {
[self drawWithFrame:frame inView:view];
if (runningOnYosemiteOrNewer()) // when moving the cursor out of the frame with mouse key down
[view setNeedsDisplay:YES];
}
}
- (void) drawWithFrame:(NSRect)frame inView:(NSView *)view
{
if (runningOnYosemiteOrNewer()) {
// else the background is drawn in light gray and a separator is drawn at the right, not in the frame
[[NSColor secondarySelectedControlColor] set];
[NSBezierPath fillRect:NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width, 1)]; // bottom line
NSImage *image = [self image];
if (image)
[image drawInRect:[self framerect:frame] fromRect:NSZeroRect
operation:NSCompositeSourceOver fraction:1];
} else
[super drawWithFrame:frame inView:view];
}
@end
@implementation TableCornerView
- (TableCornerView *) initWithFrame:(NSRect)frame
{
if ((self = [super initWithFrame:frame])) {
[self setCell:[[TableCornerCell alloc] initImageCell:nil]];
[self setClickable:NO];
}
return self;
}
- (void) setImageNamed:(NSString *)name toolTip:(NSString *)toolTip
{
[[self cell] setImage:[NSImage imageNamed:name]];
[self setToolTip:toolTip];
}
- (void) mouseDown:(NSEvent *)event
{
if (clickable)
[super mouseDown:event];
}
- (BOOL) isFlipped
// don't know why this is required - see http://zzot.net/2004/11/20/nstableheadercell/
{
return ! runningOnYosemiteOrNewer(); // see above for Yosemite drawing glitches
}
- (BOOL) isClickable
{
return clickable;
}
- (void) setClickable:(BOOL)flag
{
clickable = flag;
}
@end