| /* |
| * Copyright 1995-2004 Sun Microsystems, Inc. All Rights Reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Sun designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Sun in the LICENSE file that accompanied this code. |
| * |
| * This code 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 |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
| * CA 95054 USA or visit www.sun.com if you need additional information or |
| * have any questions. |
| */ |
| #ifdef HEADLESS |
| #error This file should not be included in headless library |
| #endif |
| |
| #include "awt_p.h" |
| #include "java_awt_MenuBar.h" |
| #include "sun_awt_motif_MMenuBarPeer.h" |
| #include "java_awt_Menu.h" |
| #include "java_awt_Frame.h" |
| #include "sun_awt_motif_MFramePeer.h" |
| |
| #include "awt_GraphicsEnv.h" |
| #include "awt_MenuBar.h" |
| #include "awt_Component.h" |
| |
| #include <jni.h> |
| #include <jni_util.h> |
| |
| extern struct MComponentPeerIDs mComponentPeerIDs; |
| extern struct X11GraphicsConfigIDs x11GraphicsConfigIDs; |
| struct MMenuBarPeerIDs mMenuBarPeerIDs; |
| |
| /* |
| * Class: sun_awt_motif_MMenuBarPeer |
| * Method: initIDs |
| * Signature: ()V |
| */ |
| |
| /* This function gets called from the static initializer for MMenuBarPeer.java |
| to initialize the fieldIDs fields that may be accessed from C */ |
| JNIEXPORT void JNICALL |
| Java_sun_awt_motif_MMenuBarPeer_initIDs |
| (JNIEnv *env, jclass cls) |
| { |
| mMenuBarPeerIDs.pData = (*env)->GetFieldID(env, cls, "pData", "J"); |
| mMenuBarPeerIDs.graphicsConfig = |
| (*env)->GetFieldID(env, cls, "graphicsConfig", |
| "Lsun/awt/X11GraphicsConfig;"); |
| } |
| |
| static AwtGraphicsConfigDataPtr |
| copyGraphicsConfigToMenuBarPeer( |
| JNIEnv *env, jobject frame, jobject thisMenuBar) { |
| |
| jobject gc_object; |
| AwtGraphicsConfigDataPtr adata; |
| |
| /* GraphicsConfiguration object of Component */ |
| gc_object = (*env)->GetObjectField(env, frame, |
| mComponentPeerIDs.graphicsConfig); |
| |
| if (gc_object != NULL) { |
| /* Set graphicsConfig field of MComponentPeer */ |
| (*env)->SetObjectField (env, thisMenuBar, |
| mMenuBarPeerIDs.graphicsConfig, |
| gc_object); |
| adata = (AwtGraphicsConfigDataPtr) |
| JNU_GetLongFieldAsPtr(env, gc_object, |
| x11GraphicsConfigIDs.aData); |
| } else { |
| /* Component was not constructed with a GraphicsConfiguration |
| object */ |
| adata = getDefaultConfig(DefaultScreen(awt_display)); |
| } |
| |
| return adata; |
| } |
| |
| AwtGraphicsConfigDataPtr |
| getGraphicsConfigFromMenuBarPeer(JNIEnv *env, jobject menubarPeer) { |
| |
| jobject gc_object; |
| AwtGraphicsConfigDataPtr adata; |
| |
| /* GraphicsConfiguration object of Component */ |
| gc_object = (*env)->GetObjectField(env, menubarPeer, |
| mMenuBarPeerIDs.graphicsConfig); |
| |
| if (gc_object != NULL) { |
| adata = (AwtGraphicsConfigDataPtr) |
| JNU_GetLongFieldAsPtr(env, gc_object, |
| x11GraphicsConfigIDs.aData); |
| } else { |
| adata = getDefaultConfig(DefaultScreen(awt_display)); |
| } |
| |
| return adata; |
| } |
| |
| /* |
| * Class: sun_awt_motif_MMenuBarPeer |
| * Method: create |
| * Signature: (Lsun/awt/motif/MFramePeer;)V |
| */ |
| JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuBarPeer_create |
| (JNIEnv * env, jobject this, jobject frame) |
| { |
| #define MAX_ARGC 20 |
| Arg args[MAX_ARGC]; |
| int32_t argc; |
| struct ComponentData *mdata; |
| struct FrameData *wdata; |
| Pixel bg; |
| Pixel fg; |
| AwtGraphicsConfigDataPtr adata; |
| |
| if (JNU_IsNull(env, frame)) { |
| JNU_ThrowNullPointerException(env, "NullPointerException"); |
| return; |
| } |
| AWT_LOCK(); |
| wdata = (struct FrameData *) |
| JNU_GetLongFieldAsPtr(env, frame, mComponentPeerIDs.pData); |
| mdata = ZALLOC(ComponentData); |
| |
| if (wdata == NULL || mdata == NULL) { |
| JNU_ThrowNullPointerException(env, "NullPointerException"); |
| AWT_UNLOCK(); |
| return; |
| } |
| JNU_SetLongFieldFromPtr(env, this, mMenuBarPeerIDs.pData, mdata); |
| |
| adata = copyGraphicsConfigToMenuBarPeer(env, frame, this); |
| |
| XtVaGetValues(wdata->winData.comp.widget, |
| XmNbackground, &bg, |
| XmNforeground, &fg, |
| NULL); |
| |
| argc = 0; |
| XtSetArg(args[argc], XmNbackground, bg); |
| argc++; |
| XtSetArg(args[argc], XmNforeground, fg); |
| argc++; |
| XtSetArg (args[argc], XmNscreen, |
| ScreenOfDisplay(awt_display, |
| adata->awt_visInfo.screen)); |
| argc++; |
| |
| DASSERT(!(argc > MAX_ARGC)); |
| mdata->widget = XmCreateMenuBar(wdata->mainWindow, "menu_bar", args, argc); |
| awt_addMenuWidget(mdata->widget); |
| XtSetMappedWhenManaged(mdata->widget, False); |
| XtManageChild(mdata->widget); |
| AWT_UNLOCK(); |
| } |
| |
| /* |
| * Class: sun_awt_motif_MMenuBarPeer |
| * Method: dispose |
| * Signature: ()V |
| */ |
| JNIEXPORT void JNICALL Java_sun_awt_motif_MMenuBarPeer_pDispose |
| (JNIEnv * env, jobject this) |
| { |
| struct ComponentData *mdata; |
| |
| AWT_LOCK(); |
| |
| /*hania LOOK HERE does this make sense? look at original code */ |
| mdata = (struct ComponentData *) |
| JNU_GetLongFieldAsPtr(env, this, mMenuBarPeerIDs.pData); |
| if (mdata == NULL) { |
| AWT_UNLOCK(); |
| return; |
| } |
| awt_delMenuWidget(mdata->widget); |
| XtUnmanageChild(mdata->widget); |
| awt_util_consumeAllXEvents(mdata->widget); |
| XtDestroyWidget(mdata->widget); |
| free((void *) mdata); |
| (*env)->SetLongField(env, this, mMenuBarPeerIDs.pData, (jlong)0); |
| AWT_UNLOCK(); |
| } |