/* * Copyright 1995-2001 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 #include #include "multi_font.h" #include "awt_Component.h" extern struct MComponentPeerIDs mComponentPeerIDs; extern AwtGraphicsConfigDataPtr copyGraphicsConfigToPeer(JNIEnv *env, jobject this); /* * When the -jni switch is thrown, these headers can be deleted. */ #include "java_awt_Button.h" #include "sun_awt_motif_MButtonPeer.h" #include "sun_awt_motif_MComponentPeer.h" /* fieldIDs for Button fields that may be accessed from C */ static struct ButtonIDs { jfieldID label; } buttonIDs; static char emptyString[] = ""; /* * Class: java_awt_Button * Method: initIDs * Signature: ()V */ /* This function gets called from the static initializer for Button.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL Java_java_awt_Button_initIDs (JNIEnv *env, jclass cls) { buttonIDs.label = (*env)->GetFieldID(env, cls, "label", "Ljava/lang/String;"); } /* * client_data is MButtonPeer instance */ static void Button_callback (Widget w, XtPointer client_data, XmPushButtonCallbackStruct * call_data) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); ConvertEventTimeAndModifiers converted; awt_util_convertEventTimeAndModifiers(call_data->event, &converted); JNU_CallMethodByName(env, NULL, (jobject)client_data, "action", "(JI)V", converted.when, converted.modifiers); if ((*env)->ExceptionOccurred (env)) { (*env)->ExceptionDescribe (env); (*env)->ExceptionClear (env); } } /* * Class: sun_awt_motif_MButtonPeer * Method: create * Signature: (Lsun/awt/motif/MComponentPeer;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MButtonPeer_create (JNIEnv * env, jobject this, jobject parent) { jobject target; jobject label; struct ComponentData *cdata; struct ComponentData *wdata; char *clabel; Pixel bg; XmString mfstr = NULL; jobject globalRef = awtJNI_CreateAndSetGlobalRef (env, this); jobject font = awtJNI_GetFont (env, this); jboolean IsMultiFont = awtJNI_IsMultiFont (env, font); AwtGraphicsConfigDataPtr adata; AWT_LOCK (); if (JNU_IsNull (env, parent)) { JNU_ThrowNullPointerException (env, "NullPointerException"); AWT_UNLOCK (); return; } target = (*env)->GetObjectField (env, this, mComponentPeerIDs.target); wdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env, parent, mComponentPeerIDs.pData); if (JNU_IsNull (env, target) || wdata == NULL) { JNU_ThrowNullPointerException (env, "NullPointerException"); AWT_UNLOCK (); return; } cdata = ZALLOC (ComponentData); if (cdata == NULL) { JNU_ThrowOutOfMemoryError (env, "OutOfMemoryError"); AWT_UNLOCK (); return; } JNU_SetLongFieldFromPtr(env, this, mComponentPeerIDs.pData, cdata); adata = copyGraphicsConfigToPeer(env, this); XtVaGetValues (wdata->widget, XmNbackground, &bg, NULL); label = (*env)->GetObjectField (env, target, buttonIDs.label); if (IsMultiFont) { /* * We don't use makeCString() function here. * We create Motif multi-font compound string to display * unicode on the platform which is not spporting unicode. */ if (JNU_IsNull (env, label) || ((*env)->GetStringLength (env, label) == 0)) { mfstr = XmStringCreateLocalized (""); } else { mfstr = awtJNI_MakeMultiFontString (env, label, font); } cdata->widget = XtVaCreateManagedWidget ("", xmPushButtonWidgetClass, wdata->widget, XmNlabelString, mfstr, XmNrecomputeSize, False, XmNbackground, bg, XmNhighlightOnEnter, False, XmNshowAsDefault, 0, XmNdefaultButtonShadowThickness, 0, XmNmarginTop, 0, XmNmarginBottom, 0, XmNmarginLeft, 0, XmNmarginRight, 0, XmNuserData, (XtPointer) globalRef, XmNscreen, ScreenOfDisplay(awt_display, adata->awt_visInfo.screen), NULL); if (mfstr != NULL) { XmStringFree(mfstr); mfstr = NULL; } } else { if (JNU_IsNull (env, label)) { clabel = emptyString; } else { clabel = (char *) JNU_GetStringPlatformChars (env, label, NULL); if (clabel == NULL) { /* Exception? */ AWT_UNLOCK (); return; } } cdata->widget = XtVaCreateManagedWidget (clabel, xmPushButtonWidgetClass, wdata->widget, XmNrecomputeSize, False, XmNbackground, bg, XmNhighlightOnEnter, False, XmNshowAsDefault, 0, XmNdefaultButtonShadowThickness, 0, XmNmarginTop, 0, XmNmarginBottom, 0, XmNmarginLeft, 0, XmNmarginRight, 0, XmNuserData, (XtPointer) globalRef, XmNscreen, ScreenOfDisplay(awt_display, adata->awt_visInfo.screen), NULL); if (clabel != emptyString) { JNU_ReleaseStringPlatformChars (env, label, (const char *) clabel);; } } XtSetMappedWhenManaged (cdata->widget, False); XtAddCallback (cdata->widget, XmNactivateCallback, (XtCallbackProc) Button_callback, (XtPointer) globalRef); AWT_UNLOCK (); } /* * Class: sun_awt_motif_MButtonPeer * Method: setLabel * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MButtonPeer_setLabel (JNIEnv * env, jobject this, jstring label) { struct ComponentData *wdata; char *clabel; XmString xim; AWT_LOCK (); wdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (wdata == NULL) { JNU_ThrowNullPointerException (env, "NullPointerException"); AWT_UNLOCK (); return; } if (JNU_IsNull (env, label) || ((*env)->GetStringLength (env, label) == 0)) { xim = XmStringCreateLocalized (""); } else { jobject font = awtJNI_GetFont (env, this); if (awtJNI_IsMultiFont (env, font)) { xim = awtJNI_MakeMultiFontString (env, label, font); } else { if (JNU_IsNull (env, label)) { clabel = emptyString; } else { clabel = (char *) JNU_GetStringPlatformChars (env, label, NULL); if (clabel == NULL) { /* Exception? */ AWT_UNLOCK (); return; } } xim = XmStringCreate (clabel, "labelFont"); if (clabel != emptyString) { JNU_ReleaseStringPlatformChars (env, label, (const char *) clabel);; } } } XtVaSetValues (wdata->widget, XmNlabelString, xim, NULL); XmStringFree (xim); AWT_FLUSH_UNLOCK (); }