/* * Copyright 1995-2003 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 "canvas.h" #include "java_awt_TextArea.h" #include "java_awt_Cursor.h" #include "java_awt_Component.h" #include "java_awt_Color.h" #include "java_awt_AWTEvent.h" #include "java_awt_Font.h" #include "java_awt_event_MouseWheelEvent.h" #include "sun_awt_motif_MTextAreaPeer.h" #include "sun_awt_motif_MComponentPeer.h" #include "awt_Component.h" #include "awt_Cursor.h" #include "awt_TextArea.h" #include #include #include "multi_font.h" extern struct MComponentPeerIDs mComponentPeerIDs; extern struct CursorIDs cursorIDs; extern AwtGraphicsConfigDataPtr copyGraphicsConfigToPeer(JNIEnv *env, jobject this); struct TextAreaIDs textAreaIDs; struct MTextAreaPeerIDs mTextAreaPeerIDs; /* * Class: java_awt_TextArea * Method: initIDs * Signature: ()V */ /* This function gets called from the static initializer for TextArea.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL Java_java_awt_TextArea_initIDs (JNIEnv *env, jclass cls) { textAreaIDs.scrollbarVisibility = (*env)->GetFieldID(env, cls, "scrollbarVisibility", "I"); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: initIDs * Signature: ()V */ /* This function gets called from the static initializer for MTextAreaPeer.java to initialize the fieldIDs for fields that may be accessed from C */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_initIDs (JNIEnv *env, jclass cls) { mTextAreaPeerIDs.firstChangeSkipped = (*env)->GetFieldID(env, cls, "firstChangeSkipped", "Z"); } /* * client_data is MTextAreaPeer instance */ void TextArea_valueChanged(Widget w, XtPointer client_data, XtPointer call_data) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); jboolean skipped; skipped = (*env)->GetBooleanField(env, (jobject) client_data, mTextAreaPeerIDs.firstChangeSkipped); if (!(*env)->ExceptionOccurred(env)) { if (skipped == JNI_FALSE) { (*env)->SetBooleanField(env, (jobject) client_data, mTextAreaPeerIDs.firstChangeSkipped, JNI_TRUE); } else { JNU_CallMethodByName(env, NULL, (jobject) client_data, "valueChanged", "()V"); } } if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); } } extern void Text_handlePaste(Widget w, XtPointer client_data, XEvent * event, Boolean * cont); /* * Class: sun_awt_motif_MTextAreaPeer * Method: pCreate * Signature: (Lsun/awt/motif/MComponentPeer;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pCreate (JNIEnv *env, jobject this, jobject parent) { struct TextAreaData *tdata; #define MAX_ARGC 30 Arg args[MAX_ARGC]; int32_t argc; struct ComponentData *wdata; jobject target; Pixel bg; int32_t sbVisibility; Boolean wordWrap = False, hsb = False, vsb = False; jobject globalRef = awtJNI_CreateAndSetGlobalRef(env, this); AwtGraphicsConfigDataPtr adata; char *nonEmptyText = "* will never be shown *"; AWT_LOCK(); adata = copyGraphicsConfigToPeer(env, this); if (JNU_IsNull(env, parent)) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } wdata = (struct ComponentData *) JNU_GetLongFieldAsPtr(env,parent,mComponentPeerIDs.pData); if (wdata == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } target = (*env)->GetObjectField(env, this, mComponentPeerIDs.target); tdata = ZALLOC(TextAreaData); JNU_SetLongFieldFromPtr(env,this,mComponentPeerIDs.pData,tdata); if (tdata == NULL) { JNU_ThrowOutOfMemoryError(env, "OutOfMemoryError"); AWT_UNLOCK(); return; } XtVaGetValues(wdata->widget, XmNbackground, &bg, NULL); sbVisibility = (*env)->GetIntField(env, target, textAreaIDs.scrollbarVisibility); switch (sbVisibility) { case java_awt_TextArea_SCROLLBARS_NONE: wordWrap = True; hsb = False; vsb = False; break; case java_awt_TextArea_SCROLLBARS_VERTICAL_ONLY: wordWrap = True; hsb = False; vsb = True; break; case java_awt_TextArea_SCROLLBARS_HORIZONTAL_ONLY: wordWrap = False; hsb = True; vsb = False; break; default: case java_awt_TextArea_SCROLLBARS_BOTH: wordWrap = False; hsb = True; vsb = True; break; } argc = 0; XtSetArg(args[argc], XmNrecomputeSize, False); argc++; XtSetArg(args[argc], XmNx, 0); argc++; XtSetArg(args[argc], XmNy, 0); argc++; XtSetArg(args[argc], XmNbackground, bg); argc++; XtSetArg(args[argc], XmNeditMode, XmMULTI_LINE_EDIT); argc++; XtSetArg(args[argc], XmNwordWrap, wordWrap); argc++; XtSetArg(args[argc], XmNscrollHorizontal, hsb); argc++; XtSetArg(args[argc], XmNscrollVertical, vsb); argc++; XtSetArg(args[argc], XmNmarginHeight, 2); argc++; XtSetArg(args[argc], XmNmarginWidth, 2); argc++; XtSetArg(args[argc], XmNuserData, (XtPointer) globalRef); argc++; XtSetArg (args[argc], XmNscreen, ScreenOfDisplay(awt_display, adata->awt_visInfo.screen)); argc++; XtSetArg(args[argc], XmNfontList, getMotifFontList()); argc++; /* Initialize with a non-empty text, so the * TextArea_valueChanged callback will be called * even if the following conditions are true: * 1. TextArea constructed with an empty initial text. * 2. setText() with an empty argument is called * immediately after the TextArea component is created. * For more details please see #4028580. */ XtSetArg(args[argc], XmNvalue, nonEmptyText); argc++; DASSERT(!(argc > MAX_ARGC)); tdata->txt = XmCreateScrolledText(wdata->widget, "textA", args, argc); tdata->comp.widget = XtParent(tdata->txt); /* Bug 4208972. Give the ScrolledWindow a minimum size. */ XtVaSetValues(tdata->comp.widget, XmNwidth, 1, XmNheight, 1, NULL); XtSetMappedWhenManaged(tdata->comp.widget, False); XtManageChild(tdata->txt); XtManageChild(tdata->comp.widget); XtAddCallback(tdata->txt, XmNvalueChangedCallback, TextArea_valueChanged, (XtPointer) globalRef); XtAddEventHandler(tdata->txt, FocusChangeMask, True, awt_canvas_event_handler, globalRef); XtInsertEventHandler(tdata->txt, KeyPressMask, False, Text_handlePaste, (XtPointer) globalRef, XtListHead); awt_addWidget(tdata->txt, tdata->comp.widget, globalRef, java_awt_AWTEvent_KEY_EVENT_MASK | java_awt_AWTEvent_MOUSE_EVENT_MASK | java_awt_AWTEvent_MOUSE_MOTION_EVENT_MASK); /* * Fix for BugTraq ID 4349615. * Unregister Motif drop site to prevent it from crash * when dropping java objects. */ XmDropSiteUnregister(tdata->txt); AWT_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getExtraWidth * Signature: ()I */ JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getExtraWidth (JNIEnv *env, jobject this) { struct TextAreaData *tdata; Dimension spacing, shadowThickness, textMarginWidth, sbWidth; Widget verticalScrollBar; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return 0; } XtVaGetValues(tdata->txt, XmNmarginWidth, &textMarginWidth, NULL); XtVaGetValues(tdata->comp.widget, XmNspacing, &spacing, XmNverticalScrollBar, &verticalScrollBar, NULL); if (verticalScrollBar != NULL) { /* Assumption: shadowThickness same for scrollbars and text area */ XtVaGetValues(verticalScrollBar, XmNwidth, &sbWidth, XmNshadowThickness, &shadowThickness, NULL); } else { sbWidth = 0; shadowThickness = 0; } AWT_UNLOCK(); return (jint) (sbWidth + spacing + 2 * textMarginWidth + 4 * shadowThickness); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getExtraHeight * Signature: ()I */ JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getExtraHeight (JNIEnv *env, jobject this) { struct TextAreaData *tdata; Dimension spacing, shadowThickness, textMarginHeight, sbHeight; Dimension sbShadowThickness, highlightThickness, sbHighlightThickness; int32_t height; Widget horizontalScrollBar; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return 0; } XtVaGetValues(tdata->txt, XmNmarginHeight, &textMarginHeight, XmNshadowThickness, &shadowThickness, XmNhighlightThickness, &highlightThickness, NULL); height = 2 * (textMarginHeight + shadowThickness + highlightThickness); XtVaGetValues(tdata->comp.widget, XmNspacing, &spacing, XmNhorizontalScrollBar, &horizontalScrollBar, NULL); if (horizontalScrollBar != NULL) { XtVaGetValues(horizontalScrollBar, XmNshadowThickness, &sbShadowThickness, XmNhighlightThickness, &sbHighlightThickness, XmNheight, &sbHeight, NULL); height += sbHeight + spacing + 2 * (sbShadowThickness + sbHighlightThickness); } AWT_UNLOCK(); return (jint)height; } /* * Class: sun_awt_motif_MTextAreaPeer * Method: setTextBackground * Signature: (Ljava/awt/Color;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setTextBackground (JNIEnv *env, jobject this, jobject c) { struct TextAreaData *tdata; Pixel color; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL || JNU_IsNull(env, c)) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } color = awtJNI_GetColor(env, c); XtVaSetValues(tdata->txt, XmNbackground, color, NULL); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: pSetEditable * Signature: (Z)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pSetEditable (JNIEnv *env, jobject this, jboolean editable) { struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XtVaSetValues(tdata->txt, XmNeditable, (editable ? True : False), XmNcursorPositionVisible, (editable ? True : False), NULL); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: select * Signature: (II)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_select (JNIEnv *env, jobject this, jint start, jint end) { struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XmTextSetSelection(tdata->txt, (XmTextPosition) start, (XmTextPosition) end, 0); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getSelectionStart * Signature: ()I */ JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getSelectionStart (JNIEnv *env, jobject this) { struct TextAreaData *tdata; XmTextPosition start, end, pos; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return 0; } if (XmTextGetSelectionPosition(tdata->txt, &start, &end) && (start != end)) { pos = start; } else { pos = XmTextGetInsertionPosition(tdata->txt); } AWT_UNLOCK(); return (jint) pos; } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getSelectionEnd * Signature: ()I */ JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getSelectionEnd (JNIEnv *env, jobject this) { struct TextAreaData *tdata; XmTextPosition start, end, pos; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return 0; } if (XmTextGetSelectionPosition(tdata->txt, &start, &end) && (start != end)) { pos = end; } else { pos = XmTextGetInsertionPosition(tdata->txt); } AWT_UNLOCK(); return (jint) pos; } /* * Class: sun_awt_motif_MTextAreaPeer * Method: setText * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setText (JNIEnv *env, jobject this, jstring txt) { struct TextAreaData *tdata; char *cTxt; jobject font = awtJNI_GetFont(env, this); if (JNU_IsNull(env, txt)) { JNU_ThrowNullPointerException(env, "NullPointerException"); return; } AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); if (cTxt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XtVaSetValues(tdata->txt, XmNvalue, cTxt, NULL); if (cTxt != NULL) { JNU_ReleaseStringPlatformChars(env, txt, cTxt); } AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getText * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_sun_awt_motif_MTextAreaPeer_getText (JNIEnv *env, jobject this) { struct TextAreaData *tdata; char *cTxt; jstring rval; jobject font = awtJNI_GetFont(env, this); AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return NULL; } cTxt = XmTextGetString(tdata->txt); rval = JNU_NewStringPlatform(env, (const char *) cTxt); XtFree(cTxt); AWT_UNLOCK(); return rval; } /* * Class: sun_awt_motif_MTextAreaPeer * Method: insert * Signature: (Ljava/lang/String;I)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_insert (JNIEnv *env, jobject this, jstring txt, jint pos) { struct TextAreaData *tdata; char *cTxt; jobject font = awtJNI_GetFont(env, this); if (JNU_IsNull(env, txt)) { JNU_ThrowNullPointerException(env, "NullPointerException"); return; } AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); if (cTxt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XmTextInsert(tdata->txt, (XmTextPosition) pos, cTxt); if (cTxt != NULL) { JNU_ReleaseStringPlatformChars(env, txt, cTxt); } AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: replaceRange * Signature: (Ljava/lang/String;II)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_replaceRange (JNIEnv *env, jobject this, jstring txt, jint start, jint end) { struct TextAreaData *tdata; char *cTxt; jobject font = awtJNI_GetFont(env, this); if (JNU_IsNull(env, txt)) { JNU_ThrowNullPointerException(env, "NullPointerException"); return; } AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } cTxt = (char *) JNU_GetStringPlatformChars(env, txt, NULL); if (cTxt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XmTextReplace(tdata->txt, (XmTextPosition) start, (XmTextPosition) end, cTxt); if (cTxt != NULL) { JNU_ReleaseStringPlatformChars(env, txt, cTxt); } AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: setFont * Signature: (Ljava/awt/Font;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setFont (JNIEnv *env, jobject this, jobject f) { struct TextAreaData *tdata; struct FontData *fdata; XmFontList fontlist; char *err; XmFontListEntry fontentry; if (JNU_IsNull(env, f)) { JNU_ThrowNullPointerException(env, "NullPointerException"); return; } AWT_LOCK(); fdata = awtJNI_GetFontData(env, f, &err); if (fdata == NULL) { JNU_ThrowInternalError(env, err); AWT_UNLOCK(); return; } tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->comp.widget == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } if (awtJNI_IsMultiFont(env, f)) { if (fdata->xfs == NULL) { fdata->xfs = awtJNI_MakeFontSet(env, f); } if (fdata->xfs != NULL) { fontentry = XmFontListEntryCreate("labelFont", XmFONT_IS_FONTSET, (XtPointer) (fdata->xfs)); fontlist = XmFontListAppendEntry(NULL, fontentry); /* * Some versions of motif have a bug in * XmFontListEntryFree() which causes it to free more than it * should. Use XtFree() instead. See O'Reilly's * Motif Reference Manual for more information. */ XmFontListEntryFree(&fontentry); } else { fontlist = XmFontListCreate(fdata->xfont, "labelFont"); } } else { fontlist = XmFontListCreate(fdata->xfont, "labelFont"); } if (fontlist != NULL) { Dimension textw, texth; Dimension w, h; XtVaGetValues(tdata->txt, XmNwidth, &textw, XmNheight, &texth, NULL); XtVaGetValues(tdata->comp.widget, XmNwidth, &w, XmNheight, &h, NULL); /* Must set width/height when we set the font, else * Motif resets the text to a single row. */ XtVaSetValues(tdata->txt, XmNfontList, fontlist, XmNwidth, textw, XmNheight, texth, NULL); XtVaSetValues(tdata->comp.widget, XmNwidth, w, XmNheight, h, NULL); XmFontListFree(fontlist); } else { JNU_ThrowNullPointerException(env, "NullPointerException"); } AWT_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: setCaretPosition * Signature: (I)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_setCaretPosition (JNIEnv *env, jobject this, jint pos) { struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } XmTextSetInsertionPosition(tdata->txt, (XmTextPosition) pos); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: getCaretPosition * Signature: ()I */ JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getCaretPosition (JNIEnv *env, jobject this) { struct TextAreaData *tdata; XmTextPosition pos; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return 0; } pos = XmTextGetInsertionPosition(tdata->txt); AWT_UNLOCK(); return (jint) pos; } /* * Class: sun_awt_motif_MTextAreaPeer * Method: pShow * Signature: ()V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pShow2 (JNIEnv *env, jobject this) { struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->comp.widget == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } awt_util_show(tdata->comp.widget); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: pMakeCursorVisible * Signature: ()V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pMakeCursorVisible (JNIEnv *env, jobject this) { struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,this,mComponentPeerIDs.pData); if (tdata == NULL || tdata->comp.widget == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: pSetCursor * Signature: (L/java/awt/Cursor;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_pSetCursor (JNIEnv *env, jobject this, jobject cursor) { Cursor xcursor; struct TextAreaData *tdata; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->comp.widget == NULL || JNU_IsNull(env, cursor)) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } awt_util_setCursor(tdata->txt, getCursor(env, cursor)); AWT_FLUSH_UNLOCK(); } /* * Class: sun_awt_motif_MTextAreaPeer * Method: nativeHandleMouseWheel * Signature: (III)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MTextAreaPeer_nativeHandleMouseWheel (JNIEnv *env, jobject this, jint scrollType, jint scrollAmt, jint wheelAmt) { struct TextAreaData *tdata; Widget text = NULL; Widget scroll = NULL; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env, this, mComponentPeerIDs.pData); if (tdata == NULL || tdata->comp.widget == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return; } // get the Text widget text = tdata->txt; if (text == NULL) { AWT_UNLOCK(); return; } // get the ScrolledWindow scroll = XtParent(text); if (scroll == NULL) { AWT_UNLOCK(); return; } awt_util_do_wheel_scroll(scroll, scrollType, scrollAmt, wheelAmt); AWT_UNLOCK(); } /* To be fully implemented in a future release * * Class: sun_awt_windows_MTextAreaPeer * Method: getIndexAtPoint * Signature: (II)I * JNIEXPORT jint JNICALL Java_sun_awt_motif_MTextAreaPeer_getIndexAtPoint(JNIEnv *env, jobject self, jint x, jint y) { struct TextAreaData *tdata; XmTextPosition pos; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return -1; } pos = XmTextXYToPos(tdata->txt, x, y); AWT_UNLOCK(); return (jint) pos; } */ /* To be fully implemented in a future release * * Class: sun_awt_windows_MTextAreaPeer * Method: getCharacterBounds * Signature: (I)Ljava/awt/Rectangle; * JNIEXPORT jobject JNICALL Java_sun_awt_motif_MTextAreaPeer_getCharacterBounds(JNIEnv *env, jobject self, jint i) { #define Text_FontAscent(tfg) (((XmTextWidget)(tfg)) -> \ text.output->data->font_ascent) #define Text_FontDescent(tfg) (((XmTextWidget)(tfg)) -> \ text.output->data->font_descent) struct TextAreaData *tdata; jobject rect=NULL; Position x=0, y=0; Position next_x=0, next_y=0; int32_t w=0, h=0; AWT_LOCK(); tdata = (struct TextAreaData *) JNU_GetLongFieldAsPtr(env,self,mComponentPeerIDs.pData); if (tdata == NULL || tdata->txt == NULL) { JNU_ThrowNullPointerException(env, "NullPointerException"); AWT_UNLOCK(); return (jobject) NULL; } XmTextPosToXY(tdata->txt, i, &x, &y); y -= Text_FontAscent(tdata->txt); XmTextPosToXY(tdata->txt, i+1, &next_x, &next_y); w = next_x - x; h = Text_FontAscent(tdata->txt) + Text_FontDescent(tdata->txt); AWT_UNLOCK(); if (w>0) { jclass clazz; jmethodID mid; clazz = (*env)->FindClass(env, "java/awt/Rectangle"); mid = (*env)->GetMethodID(env, clazz, "", "(IIII)V"); if (mid != NULL) { rect = (*env)->NewObject(env, clazz, mid, x, y, w, h); if ((*env)->ExceptionOccurred(env)) { return (jobject) NULL; } } } return rect; } */