1 /* 2 * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #import "jni_util.h" 27 28 #import <AppKit/AppKit.h> 29 #import <JavaNativeFoundation/JavaNativeFoundation.h> 30 31 #import "CTrayIcon.h" 32 #import "ThreadUtilities.h" 33 #include "GeomUtilities.h" 34 #import "LWCToolkit.h" 35 36 #define kImageInset 4.0 37 38 /** 39 * If the image of the specified size won't fit into the status bar, 40 * then scale it down proprtionally. Otherwise, leave it as is. 41 */ 42 static NSSize ScaledImageSizeForStatusBar(NSSize imageSize) { 43 NSRect imageRect = NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height); 44 45 // There is a black line at the bottom of the status bar 46 // that we don't want to cover with image pixels. 47 CGFloat desiredHeight = [[NSStatusBar systemStatusBar] thickness] - 1.0; 48 CGFloat scaleFactor = MIN(1.0, desiredHeight/imageSize.height); 49 50 imageRect.size.width *= scaleFactor; 51 imageRect.size.height *= scaleFactor; 52 imageRect = NSIntegralRect(imageRect); 53 54 return imageRect.size; 55 } 56 57 @implementation AWTTrayIcon 58 59 - (id) initWithPeer:(jobject)thePeer { 60 if (!(self = [super init])) return nil; 61 62 peer = thePeer; 63 64 theItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 65 [theItem retain]; 66 67 view = [[AWTTrayIconView alloc] initWithTrayIcon:self]; 68 [theItem setView:view]; 69 70 return self; 71 } 72 73 -(void) dealloc { 84 [view setTrayIcon: nil]; 85 [view release]; 86 87 [theItem release]; 88 89 [super dealloc]; 90 } 91 92 - (void) setTooltip:(NSString *) tooltip{ 93 [view setToolTip:tooltip]; 94 } 95 96 -(NSStatusItem *) theItem{ 97 return theItem; 98 } 99 100 - (jobject) peer{ 101 return peer; 102 } 103 104 - (void) setImage:(NSImage *) imagePtr sizing:(BOOL)autosize{ 105 NSSize imageSize = [imagePtr size]; 106 NSSize scaledSize = ScaledImageSizeForStatusBar(imageSize); 107 if (imageSize.width != scaledSize.width || 108 imageSize.height != scaledSize.height) { 109 [imagePtr setSize: scaledSize]; 110 } 111 112 CGFloat itemLength = scaledSize.width + 2.0*kImageInset; 113 [theItem setLength:itemLength]; 114 115 [view setImage:imagePtr]; 116 } 117 118 - (NSPoint) getLocationOnScreen { 119 return [[view window] convertBaseToScreen: NSZeroPoint]; 120 } 121 122 -(void) deliverJavaMouseEvent: (NSEvent *) event { 123 [AWTToolkit eventCountPlusPlus]; 124 125 JNIEnv *env = [ThreadUtilities getJNIEnv]; 126 | 1 /* 2 * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #import "jni_util.h" 27 28 #import <AppKit/AppKit.h> 29 #import <JavaNativeFoundation/JavaNativeFoundation.h> 30 31 #import "CTrayIcon.h" 32 #import "ThreadUtilities.h" 33 #include "GeomUtilities.h" 34 #import "LWCToolkit.h" 35 36 #define kImageInset 4.0 37 38 /** 39 * If the image of the specified size won't fit into the status bar, 40 * then scale it down proprtionally. Otherwise, leave it as is. 41 */ 42 static NSSize ScaledImageSizeForStatusBar(NSSize imageSize, BOOL autosize) { 43 NSRect imageRect = NSMakeRect(0.0, 0.0, imageSize.width, imageSize.height); 44 45 // There is a black line at the bottom of the status bar 46 // that we don't want to cover with image pixels. 47 CGFloat desiredSize = [[NSStatusBar systemStatusBar] thickness] - 1.0; 48 if (autosize) { 49 imageRect.size.width = desiredSize; 50 imageRect.size.height = desiredSize; 51 } else { 52 CGFloat scaleFactor = MIN(1.0, desiredSize/imageSize.height); 53 imageRect.size.width *= scaleFactor; 54 imageRect.size.height *= scaleFactor; 55 } 56 imageRect = NSIntegralRect(imageRect); 57 return imageRect.size; 58 } 59 60 @implementation AWTTrayIcon 61 62 - (id) initWithPeer:(jobject)thePeer { 63 if (!(self = [super init])) return nil; 64 65 peer = thePeer; 66 67 theItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 68 [theItem retain]; 69 70 view = [[AWTTrayIconView alloc] initWithTrayIcon:self]; 71 [theItem setView:view]; 72 73 return self; 74 } 75 76 -(void) dealloc { 87 [view setTrayIcon: nil]; 88 [view release]; 89 90 [theItem release]; 91 92 [super dealloc]; 93 } 94 95 - (void) setTooltip:(NSString *) tooltip{ 96 [view setToolTip:tooltip]; 97 } 98 99 -(NSStatusItem *) theItem{ 100 return theItem; 101 } 102 103 - (jobject) peer{ 104 return peer; 105 } 106 107 - (void) setImage:(NSImage *) imagePtr sizing:(BOOL)autosize { 108 NSSize imageSize = [imagePtr size]; 109 NSSize scaledSize = ScaledImageSizeForStatusBar(imageSize, autosize); 110 if (imageSize.width != scaledSize.width || 111 imageSize.height != scaledSize.height) { 112 [imagePtr setSize: scaledSize]; 113 } 114 115 CGFloat itemLength = scaledSize.width + 2.0*kImageInset; 116 [theItem setLength:itemLength]; 117 118 [view setImage:imagePtr]; 119 } 120 121 - (NSPoint) getLocationOnScreen { 122 return [[view window] convertBaseToScreen: NSZeroPoint]; 123 } 124 125 -(void) deliverJavaMouseEvent: (NSEvent *) event { 126 [AWTToolkit eventCountPlusPlus]; 127 128 JNIEnv *env = [ThreadUtilities getJNIEnv]; 129 |