summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--macosx/MVMenuButton.h22
-rw-r--r--macosx/MVMenuButton.m164
-rw-r--r--macosx/icons/actionWidget.pngbin0 -> 730 bytes
-rw-r--r--macosx/icons/actionWidgetPressed.pngbin0 -> 704 bytes
4 files changed, 186 insertions, 0 deletions
diff --git a/macosx/MVMenuButton.h b/macosx/MVMenuButton.h
new file mode 100644
index 000000000..777642d67
--- /dev/null
+++ b/macosx/MVMenuButton.h
@@ -0,0 +1,22 @@
+#import <Cocoa/Cocoa.h>
+
+@interface MVMenuButton : NSButton <NSCoding> {
+@protected
+ BOOL _drawsArrow;
+ NSImage *_orgImage;
+ NSImage *_smallImage;
+ NSControlSize _size;
+ NSToolbarItem *_toolbarItem;
+}
+- (NSControlSize) controlSize;
+- (void) setControlSize:(NSControlSize) controlSize;
+
+- (NSImage *) smallImage;
+- (void) setSmallImage:(NSImage *) image;
+
+- (NSToolbarItem *) toolbarItem;
+- (void) setToolbarItem:(NSToolbarItem *) item;
+
+- (BOOL) drawsArrow;
+- (void) setDrawsArrow:(BOOL) arrow;
+@end
diff --git a/macosx/MVMenuButton.m b/macosx/MVMenuButton.m
new file mode 100644
index 000000000..ea6b2efc6
--- /dev/null
+++ b/macosx/MVMenuButton.m
@@ -0,0 +1,164 @@
+#import "MVMenuButton.h"
+
+@implementation MVMenuButton
+- (void) encodeWithCoder:(NSCoder *) coder {
+ [super encodeWithCoder:coder];
+}
+
+- (id) initWithFrame:(NSRect) frame {
+ if( ( self = [super initWithFrame:frame] ) ) {
+ [self setBordered:NO];
+ [self setButtonType:NSMomentaryChangeButton];
+ }
+ return self;
+}
+
+- (id) initWithCoder:(NSCoder *) coder {
+ if( ( self = [super initWithCoder:coder] ) ) {
+ _size = NSRegularControlSize;
+ _drawsArrow = NO;
+ _orgImage = [[self image] copy];
+ _smallImage = nil;
+ _toolbarItem = nil;
+ }
+ return self;
+}
+
+- (void) dealloc {
+ [_orgImage release];
+ [_smallImage release];
+
+ _orgImage = nil;
+ _smallImage = nil;
+ _toolbarItem = nil;
+
+ [super dealloc];
+}
+
+- (void) drawRect:(NSRect) rect {
+ [super drawRect:rect];
+
+ if( [self drawsArrow] ) {
+ NSBezierPath *path = [NSBezierPath bezierPath];
+
+ if( _size == NSRegularControlSize ) {
+ [path moveToPoint:NSMakePoint( NSWidth( [self frame] ) - 6, NSHeight( [self frame] ) - 3 )];
+ [path relativeLineToPoint:NSMakePoint( 6, 0 )];
+ [path relativeLineToPoint:NSMakePoint( -3, 3 )];
+ } else if( _size == NSSmallControlSize ) {
+ [path moveToPoint:NSMakePoint( NSWidth( [self frame] ) - 4, NSHeight( [self frame] ) - 3 )];
+ [path relativeLineToPoint:NSMakePoint( 4, 0 )];
+ [path relativeLineToPoint:NSMakePoint( -2, 3 )];
+ }
+
+ [path closePath];
+ [[[NSColor blackColor] colorWithAlphaComponent:0.75] set];
+ [path fill];
+ }
+}
+
+- (void) mouseDown:(NSEvent *) theEvent {
+ if( ! [self isEnabled] ) return;
+ if( ! [self menu] ) {
+ [super mouseDown:theEvent];
+ return;
+ }
+
+ [self highlight:YES];
+
+ NSPoint point = [self convertPoint:[self bounds].origin toView:nil];
+ point.y -= NSHeight( [self frame] ) + 2.;
+ point.x -= 1.;
+
+ NSEvent *event = [NSEvent mouseEventWithType:[theEvent type] location:point modifierFlags:[theEvent modifierFlags] timestamp:[theEvent timestamp] windowNumber:[[theEvent window] windowNumber] context:[theEvent context] eventNumber:[theEvent eventNumber] clickCount:[theEvent clickCount] pressure:[theEvent pressure]];
+ [NSMenu popUpContextMenu:[self menu] withEvent:event forView:self];
+
+ [self mouseUp:[[NSApplication sharedApplication] currentEvent]];
+}
+
+- (void) mouseUp:(NSEvent *) theEvent {
+ [self highlight:NO];
+ [super mouseUp:theEvent];
+}
+
+- (void) mouseDragged:(NSEvent *) theEvent {
+ return;
+}
+
+- (NSControlSize) controlSize {
+ return ( _size ? _size : NSRegularControlSize );
+}
+
+- (void) setControlSize:(NSControlSize) controlSize {
+ if( ! _orgImage ) _orgImage = [[self image] copy];
+ if( controlSize == NSRegularControlSize ) {
+ [super setImage:_orgImage];
+ [_toolbarItem setMinSize:NSMakeSize( 32., 32. )];
+ [_toolbarItem setMaxSize:NSMakeSize( 32., 32. )];
+ } else if( controlSize == NSSmallControlSize ) {
+ if( ! _smallImage ) {
+ NSImageRep *sourceImageRep = [_orgImage bestRepresentationForDevice:nil];
+ _smallImage = [[NSImage alloc] initWithSize:NSMakeSize( 24., 24. )];
+ [_smallImage lockFocus];
+ [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
+ [sourceImageRep drawInRect:NSMakeRect( 0., 0., 24., 24. )];
+ [_smallImage unlockFocus];
+ }
+ [super setImage:_smallImage];
+ [_toolbarItem setMinSize:NSMakeSize( 24., 24. )];
+ [_toolbarItem setMaxSize:NSMakeSize( 24., 24. )];
+ }
+ _size = controlSize;
+}
+
+- (void) setImage:(NSImage *) image {
+ [_orgImage autorelease];
+ _orgImage = [[self image] copy];
+
+ NSImageRep *sourceImageRep = [image bestRepresentationForDevice:nil];
+ [_smallImage autorelease];
+ _smallImage = [[NSImage alloc] initWithSize:NSMakeSize( 24., 24. )];
+ [_smallImage lockFocus];
+ [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
+ [sourceImageRep drawInRect:NSMakeRect( 0., 0., 24., 24. )];
+ [_smallImage unlockFocus];
+
+ if( _size == NSRegularControlSize ) [super setImage:image];
+ else if( _size == NSSmallControlSize ) [super setImage:_smallImage];
+}
+
+- (NSImage *) smallImage {
+ return _smallImage;
+}
+
+- (void) setSmallImage:(NSImage *) image {
+ [_smallImage autorelease];
+ _smallImage = [image copy];
+}
+
+- (NSToolbarItem *) toolbarItem {
+ return _toolbarItem;
+}
+
+- (void) setToolbarItem:(NSToolbarItem *) item {
+ _toolbarItem = item;
+}
+
+- (BOOL) drawsArrow {
+ return _drawsArrow;
+}
+
+- (void) setDrawsArrow:(BOOL) arrow {
+ _drawsArrow = arrow;
+}
+
+- (id) accessibilityAttributeValue:(NSString *) attribute {
+ if( [attribute isEqualToString:NSAccessibilityTitleAttribute] )
+ return [_toolbarItem label];
+ if( [attribute isEqualToString:NSAccessibilityHelpAttribute] )
+ return [_toolbarItem toolTip];
+ if( [attribute isEqualToString:NSAccessibilityToolbarButtonAttribute] )
+ return _toolbarItem;
+ return [super accessibilityAttributeValue:attribute];
+}
+@end
diff --git a/macosx/icons/actionWidget.png b/macosx/icons/actionWidget.png
new file mode 100644
index 000000000..d4e18cb36
--- /dev/null
+++ b/macosx/icons/actionWidget.png
Binary files differ
diff --git a/macosx/icons/actionWidgetPressed.png b/macosx/icons/actionWidgetPressed.png
new file mode 100644
index 000000000..ba98f62ab
--- /dev/null
+++ b/macosx/icons/actionWidgetPressed.png
Binary files differ