author | sveerabhadra |
Fri, 22 Dec 2017 11:00:06 +0530 | |
changeset 48640 | 42ad9a781f51 |
parent 47216 | 71c04702a3d5 |
permissions | -rw-r--r-- |
12047 | 1 |
/* |
43204 | 2 |
* Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. |
12047 | 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 <JavaNativeFoundation/JavaNativeFoundation.h> |
|
27 |
#import <JavaRuntimeSupport/JavaRuntimeSupport.h> |
|
28 |
||
29 |
||
30 |
#import "CMenu.h" |
|
31 |
#import "CMenuBar.h" |
|
32 |
#import "ThreadUtilities.h" |
|
33 |
||
34 |
#import "sun_lwawt_macosx_CMenu.h" |
|
35 |
||
36 |
@implementation CMenu |
|
37 |
||
38 |
- (id)initWithPeer:(jobject)peer { |
|
39 |
AWT_ASSERT_APPKIT_THREAD; |
|
40 |
// Create the new NSMenu |
|
43204 | 41 |
self = [super initWithPeer:peer asSeparator:NO]; |
12047 | 42 |
if (self) { |
43 |
fMenu = [NSMenu javaMenuWithTitle:@""]; |
|
44 |
[fMenu retain]; |
|
45 |
[fMenu setAutoenablesItems:NO]; |
|
46 |
} |
|
47 |
return self; |
|
48 |
} |
|
49 |
||
50 |
- (void)dealloc { |
|
51 |
[fMenu release]; |
|
52 |
fMenu = nil; |
|
53 |
[super dealloc]; |
|
54 |
} |
|
55 |
||
56 |
- (void)addJavaSubmenu:(CMenu *)submenu { |
|
15985
b9e25a486549
8006634: Unify LWCToolkit.invokeAndWait() and sun.awt.datatransfer.ToolkitThreadBlockedHandler
pchelko
parents:
15322
diff
changeset
|
57 |
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) on:self withObject:submenu waitUntilDone:YES]; |
12047 | 58 |
} |
59 |
||
60 |
- (void)addJavaMenuItem:(CMenuItem *)theMenuItem { |
|
15985
b9e25a486549
8006634: Unify LWCToolkit.invokeAndWait() and sun.awt.datatransfer.ToolkitThreadBlockedHandler
pchelko
parents:
15322
diff
changeset
|
61 |
[ThreadUtilities performOnMainThread:@selector(addNativeItem_OnAppKitThread:) on:self withObject:theMenuItem waitUntilDone:YES]; |
12047 | 62 |
} |
63 |
||
64 |
- (void)addNativeItem_OnAppKitThread:(CMenuItem *)itemModified { |
|
65 |
AWT_ASSERT_APPKIT_THREAD; |
|
66 |
[itemModified addNSMenuItemToMenu:[self menu]]; |
|
67 |
} |
|
68 |
||
69 |
- (void)setJavaMenuTitle:(NSString *)title { |
|
70 |
||
71 |
if (title) { |
|
15985
b9e25a486549
8006634: Unify LWCToolkit.invokeAndWait() and sun.awt.datatransfer.ToolkitThreadBlockedHandler
pchelko
parents:
15322
diff
changeset
|
72 |
[ThreadUtilities performOnMainThread:@selector(setNativeMenuTitle_OnAppKitThread:) on:self withObject:title waitUntilDone:YES]; |
12047 | 73 |
} |
74 |
} |
|
75 |
||
76 |
- (void)setNativeMenuTitle_OnAppKitThread:(NSString *)title { |
|
77 |
AWT_ASSERT_APPKIT_THREAD; |
|
78 |
||
79 |
[fMenu setTitle:title]; |
|
80 |
// If we are a submenu we need to set our name in the parent menu's menu item. |
|
81 |
NSMenu *parent = [fMenu supermenu]; |
|
82 |
if (parent) { |
|
83 |
NSInteger index = [parent indexOfItemWithSubmenu:fMenu]; |
|
84 |
NSMenuItem *menuItem = [parent itemAtIndex:index]; |
|
85 |
[menuItem setTitle:title]; |
|
86 |
} |
|
87 |
} |
|
88 |
||
89 |
- (void)addSeparator { |
|
90 |
// Nothing calls this, which is good because we need a CMenuItem here. |
|
91 |
} |
|
92 |
||
93 |
- (void)deleteJavaItem:(jint)index { |
|
94 |
||
15985
b9e25a486549
8006634: Unify LWCToolkit.invokeAndWait() and sun.awt.datatransfer.ToolkitThreadBlockedHandler
pchelko
parents:
15322
diff
changeset
|
95 |
[ThreadUtilities performOnMainThread:@selector(deleteNativeJavaItem_OnAppKitThread:) on:self withObject:[NSNumber numberWithInt:index] waitUntilDone:YES]; |
12047 | 96 |
} |
97 |
||
98 |
- (void)deleteNativeJavaItem_OnAppKitThread:(NSNumber *)number { |
|
99 |
AWT_ASSERT_APPKIT_THREAD; |
|
100 |
||
101 |
int n = [number intValue]; |
|
102 |
if (n < [[self menu] numberOfItems]) { |
|
103 |
[[self menu] removeItemAtIndex:n]; |
|
104 |
} |
|
105 |
} |
|
106 |
||
107 |
- (void)addNSMenuItemToMenu:(NSMenu *)inMenu { |
|
108 |
if (fMenuItem == nil) return; |
|
109 |
[fMenuItem setSubmenu:fMenu]; |
|
110 |
[inMenu addItem:fMenuItem]; |
|
111 |
} |
|
112 |
||
113 |
- (NSMenu *)menu { |
|
114 |
return [[fMenu retain] autorelease]; |
|
115 |
} |
|
116 |
||
117 |
- (void)setNativeEnabled_OnAppKitThread:(NSNumber *)boolNumber { |
|
118 |
AWT_ASSERT_APPKIT_THREAD; |
|
119 |
||
120 |
@synchronized(self) { |
|
121 |
fIsEnabled = [boolNumber boolValue]; |
|
122 |
||
123 |
NSMenu* supermenu = [fMenu supermenu]; |
|
124 |
[[supermenu itemAtIndex:[supermenu indexOfItemWithSubmenu:fMenu]] setEnabled:fIsEnabled]; |
|
125 |
} |
|
126 |
} |
|
127 |
||
128 |
- (NSString *)description { |
|
129 |
return [NSString stringWithFormat:@"CMenu[ %@ ]", fMenu]; |
|
130 |
} |
|
131 |
||
132 |
@end |
|
133 |
||
134 |
CMenu * createCMenu (jobject cPeerObjGlobal) { |
|
135 |
||
43204 | 136 |
__block CMenu *aCMenu = nil; |
137 |
||
138 |
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){ |
|
12047 | 139 |
|
43204 | 140 |
aCMenu = [[CMenu alloc] initWithPeer:cPeerObjGlobal]; |
141 |
// the aCMenu is released in CMenuComponent.dispose() |
|
142 |
}]; |
|
12047 | 143 |
|
144 |
if (aCMenu == nil) { |
|
145 |
return 0L; |
|
146 |
} |
|
147 |
||
148 |
return aCMenu; |
|
149 |
||
150 |
} |
|
151 |
||
152 |
/* |
|
153 |
* Class: sun_lwawt_macosx_CMenu |
|
154 |
* Method: nativeCreateSubMenu |
|
155 |
* Signature: (J)J |
|
156 |
*/ |
|
157 |
JNIEXPORT jlong JNICALL |
|
158 |
Java_sun_lwawt_macosx_CMenu_nativeCreateSubMenu |
|
159 |
(JNIEnv *env, jobject peer, jlong parentMenu) |
|
160 |
{ |
|
161 |
CMenu *aCMenu = nil; |
|
162 |
JNF_COCOA_ENTER(env); |
|
163 |
||
164 |
jobject cPeerObjGlobal = (*env)->NewGlobalRef(env, peer); |
|
165 |
||
166 |
aCMenu = createCMenu (cPeerObjGlobal); |
|
167 |
||
168 |
// Add it to the parent menu |
|
169 |
[((CMenu *)jlong_to_ptr(parentMenu)) addJavaSubmenu: aCMenu]; |
|
170 |
||
171 |
JNF_COCOA_EXIT(env); |
|
172 |
||
173 |
return ptr_to_jlong(aCMenu); |
|
174 |
} |
|
175 |
||
176 |
||
177 |
||
178 |
/* |
|
179 |
* Class: sun_lwawt_macosx_CMenu |
|
180 |
* Method: nativeCreateMenu |
|
181 |
* Signature: (JZ)J |
|
182 |
*/ |
|
183 |
JNIEXPORT jlong JNICALL |
|
184 |
Java_sun_lwawt_macosx_CMenu_nativeCreateMenu |
|
185 |
(JNIEnv *env, jobject peer, |
|
186 |
jlong parentMenuBar, jboolean isHelpMenu, jint insertLocation) |
|
187 |
{ |
|
188 |
CMenu *aCMenu = nil; |
|
189 |
CMenuBar *parent = (CMenuBar *)jlong_to_ptr(parentMenuBar); |
|
190 |
JNF_COCOA_ENTER(env); |
|
191 |
||
192 |
jobject cPeerObjGlobal = (*env)->NewGlobalRef(env, peer); |
|
193 |
||
194 |
aCMenu = createCMenu (cPeerObjGlobal); |
|
195 |
||
196 |
// Add it to the menu bar. |
|
197 |
[parent javaAddMenu:aCMenu atIndex:insertLocation]; |
|
198 |
||
199 |
// If the menu is already the help menu (because we are creating an entire |
|
200 |
// menu bar) we need to note that now, because we can't rely on |
|
201 |
// setHelpMenu() being called again. |
|
202 |
if (isHelpMenu == JNI_TRUE) { |
|
203 |
[parent javaSetHelpMenu: aCMenu]; |
|
204 |
} |
|
205 |
||
206 |
JNF_COCOA_EXIT(env); |
|
207 |
return ptr_to_jlong(aCMenu); |
|
208 |
} |
|
209 |
||
210 |
||
211 |
/* |
|
212 |
* Class: sun_lwawt_macosx_CMenu |
|
213 |
* Method: nativeSetMenuTitle |
|
214 |
* Signature: (JLjava/lang/String;)V |
|
215 |
*/ |
|
216 |
JNIEXPORT void JNICALL |
|
217 |
Java_sun_lwawt_macosx_CMenu_nativeSetMenuTitle |
|
218 |
(JNIEnv *env, jobject peer, jlong menuObject, jstring label) |
|
219 |
{ |
|
220 |
JNF_COCOA_ENTER(env); |
|
221 |
// Set the menu's title. |
|
222 |
[((CMenu *)jlong_to_ptr(menuObject)) setJavaMenuTitle:JNFJavaToNSString(env, label)]; |
|
223 |
JNF_COCOA_EXIT(env); |
|
224 |
} |
|
225 |
||
226 |
/* |
|
227 |
* Class: sun_lwawt_macosx_CMenu |
|
228 |
* Method: nativeAddSeparator |
|
229 |
* Signature: (J)V |
|
230 |
*/ |
|
231 |
JNIEXPORT void JNICALL |
|
232 |
Java_sun_lwawt_macosx_CMenu_nativeAddSeparator |
|
233 |
(JNIEnv *env, jobject peer, jlong menuObject) |
|
234 |
{ |
|
235 |
JNF_COCOA_ENTER(env); |
|
236 |
// Add a separator item. |
|
237 |
[((CMenu *)jlong_to_ptr(menuObject))addSeparator]; |
|
238 |
JNF_COCOA_EXIT(env); |
|
239 |
} |
|
240 |
||
241 |
/* |
|
242 |
* Class: sun_lwawt_macosx_CMenu |
|
243 |
* Method: nativeDeleteItem |
|
244 |
* Signature: (JI)V |
|
245 |
*/ |
|
246 |
JNIEXPORT void JNICALL |
|
247 |
Java_sun_lwawt_macosx_CMenu_nativeDeleteItem |
|
248 |
(JNIEnv *env, jobject peer, jlong menuObject, jint index) |
|
249 |
{ |
|
250 |
JNF_COCOA_ENTER(env); |
|
251 |
// Remove the specified item. |
|
252 |
[((CMenu *)jlong_to_ptr(menuObject)) deleteJavaItem: index]; |
|
253 |
JNF_COCOA_EXIT(env); |
|
254 |
} |
|
255 |
||
256 |
/* |
|
257 |
* Class: sun_lwawt_macosx_CMenu |
|
258 |
* Method: nativeGetNSMenu |
|
259 |
* Signature: (J)J |
|
260 |
*/ |
|
261 |
JNIEXPORT jlong JNICALL |
|
262 |
Java_sun_lwawt_macosx_CMenu_nativeGetNSMenu |
|
263 |
(JNIEnv *env, jobject peer, jlong menuObject) |
|
264 |
{ |
|
265 |
NSMenu* nsMenu = NULL; |
|
266 |
||
267 |
JNF_COCOA_ENTER(env); |
|
23651
e41298d0da2f
8037099: [macosx] Remove all references to GC from native OBJ-C code
pchelko
parents:
23010
diff
changeset
|
268 |
// Strong retain this menu; it'll get released in Java_apple_laf_ScreenMenu_addMenuListeners |
e41298d0da2f
8037099: [macosx] Remove all references to GC from native OBJ-C code
pchelko
parents:
23010
diff
changeset
|
269 |
nsMenu = [[((CMenu *)jlong_to_ptr(menuObject)) menu] retain]; |
12047 | 270 |
JNF_COCOA_EXIT(env); |
271 |
||
272 |
return ptr_to_jlong(nsMenu); |
|
273 |
} |