diff options
author | Felipe Heidrich | 2006-08-09 16:44:36 +0000 |
---|---|---|
committer | Felipe Heidrich | 2006-08-09 16:44:36 +0000 |
commit | 5ec22a2707996c01e2c6d6e26ce64ed068159bb2 (patch) | |
tree | 47398558e1ffeb9493381c4ad12a8e1845762815 | |
parent | 8211e54b5531e6f130bb66c8fa416a5c37413842 (diff) | |
download | eclipse.platform.swt-5ec22a2707996c01e2c6d6e26ce64ed068159bb2.tar.gz eclipse.platform.swt-5ec22a2707996c01e2c6d6e26ce64ed068159bb2.tar.xz eclipse.platform.swt-5ec22a2707996c01e2c6d6e26ce64ed068159bb2.zip |
backport of Bug 144765
6 files changed, 84 insertions, 2 deletions
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/org.eclipse.swt.internal.gtk.OS.properties b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/org.eclipse.swt.internal.gtk.OS.properties index 583db33d15..e3417ae4ed 100644 --- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/org.eclipse.swt.internal.gtk.OS.properties +++ b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/org.eclipse.swt.internal.gtk.OS.properties @@ -2645,6 +2645,9 @@ OS__gtk_init_check= OS__gtk_init_check_0=cast=(int *) OS__gtk_init_check_1=cast=(char ***) +OS__gtk_label_get_layout= +OS__gtk_label_get_layout_0=cast=(GtkLabel *) + OS__gtk_label_get_mnemonic_keyval= OS__gtk_label_get_mnemonic_keyval_0=cast=GtkLabel * @@ -4530,6 +4533,9 @@ OS__pango_layout_get_alignment_0=cast=PangoLayout* OS__pango_layout_get_attributes= OS__pango_layout_get_attributes_0=cast=PangoLayout * +OS__pango_layout_get_context= +OS__pango_layout_get_context_0=cast=(PangoLayout *) + OS__pango_layout_get_indent= OS__pango_layout_get_indent_0=cast=(PangoLayout*) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c index 16914e5587..5bded3796e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c @@ -7806,6 +7806,18 @@ fail: } #endif +#ifndef NO__1gtk_1label_1get_1layout +JNIEXPORT jint JNICALL OS_NATIVE(_1gtk_1label_1get_1layout) + (JNIEnv *env, jclass that, jint arg0) +{ + jint rc = 0; + OS_NATIVE_ENTER(env, that, _1gtk_1label_1get_1layout_FUNC); + rc = (jint)gtk_label_get_layout((GtkLabel *)arg0); + OS_NATIVE_EXIT(env, that, _1gtk_1label_1get_1layout_FUNC); + return rc; +} +#endif + #ifndef NO__1gtk_1label_1get_1mnemonic_1keyval JNIEXPORT jint JNICALL OS_NATIVE(_1gtk_1label_1get_1mnemonic_1keyval) (JNIEnv *env, jclass that, jint arg0) @@ -13089,6 +13101,18 @@ JNIEXPORT jint JNICALL OS_NATIVE(_1pango_1layout_1get_1attributes) } #endif +#ifndef NO__1pango_1layout_1get_1context +JNIEXPORT jint JNICALL OS_NATIVE(_1pango_1layout_1get_1context) + (JNIEnv *env, jclass that, jint arg0) +{ + jint rc = 0; + OS_NATIVE_ENTER(env, that, _1pango_1layout_1get_1context_FUNC); + rc = (jint)pango_layout_get_context((PangoLayout *)arg0); + OS_NATIVE_EXIT(env, that, _1pango_1layout_1get_1context_FUNC); + return rc; +} +#endif + #ifndef NO__1pango_1layout_1get_1indent JNIEXPORT jint JNICALL OS_NATIVE(_1pango_1layout_1get_1indent) (JNIEnv *env, jclass that, jint arg0) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c index e45a05b355..86d770dc7a 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c @@ -18,8 +18,8 @@ #ifdef NATIVE_STATS -int OS_nativeFunctionCount = 1105; -int OS_nativeFunctionCallCount[1105]; +int OS_nativeFunctionCount = 1107; +int OS_nativeFunctionCallCount[1107]; char * OS_nativeFunctionNames[] = { "Call", "GDK_1EVENT_1TYPE", @@ -590,6 +590,7 @@ char * OS_nativeFunctionNames[] = { "_1gtk_1image_1set_1from_1pixbuf", "_1gtk_1image_1set_1from_1pixmap", "_1gtk_1init_1check", + "_1gtk_1label_1get_1layout", "_1gtk_1label_1get_1mnemonic_1keyval", "_1gtk_1label_1new", "_1gtk_1label_1new_1with_1mnemonic", @@ -1018,6 +1019,7 @@ char * OS_nativeFunctionNames[] = { "_1pango_1layout_1context_1changed", "_1pango_1layout_1get_1alignment", "_1pango_1layout_1get_1attributes", + "_1pango_1layout_1get_1context", "_1pango_1layout_1get_1indent", "_1pango_1layout_1get_1iter", "_1pango_1layout_1get_1justify", diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h index fc58a57799..f80358f924 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h @@ -594,6 +594,7 @@ typedef enum { _1gtk_1image_1set_1from_1pixbuf_FUNC, _1gtk_1image_1set_1from_1pixmap_FUNC, _1gtk_1init_1check_FUNC, + _1gtk_1label_1get_1layout_FUNC, _1gtk_1label_1get_1mnemonic_1keyval_FUNC, _1gtk_1label_1new_FUNC, _1gtk_1label_1new_1with_1mnemonic_FUNC, @@ -1022,6 +1023,7 @@ typedef enum { _1pango_1layout_1context_1changed_FUNC, _1pango_1layout_1get_1alignment_FUNC, _1pango_1layout_1get_1attributes_FUNC, + _1pango_1layout_1get_1context_FUNC, _1pango_1layout_1get_1indent_FUNC, _1pango_1layout_1get_1iter_FUNC, _1pango_1layout_1get_1justify_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index f0ed70dff1..c401dc1eae 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -452,6 +452,7 @@ public class OS extends Platform { public static final byte[] pixbuf = ascii("pixbuf"); public static final byte[] text = ascii("text"); public static final byte[] xalign = ascii("xalign"); + public static final byte[] ypad = ascii("ypad"); public static final int GTK_VERSION = VERSION(gtk_major_version(), gtk_minor_version(), gtk_micro_version()); @@ -4950,6 +4951,15 @@ public static final boolean gtk_init_check(int /*long*/[] argc, int /*long*/[] a lock.unlock(); } } +public static final native int /*long*/ _gtk_label_get_layout(int /*long*/ label); +public static final int /*long*/ gtk_label_get_layout(int /*long*/ label) { + lock.lock(); + try { + return _gtk_label_get_layout(label); + } finally { + lock.unlock(); + } +} public static final native int _gtk_label_get_mnemonic_keyval(int /*long*/ label); public static final int gtk_label_get_mnemonic_keyval(int /*long*/ label) { lock.lock(); @@ -8850,6 +8860,15 @@ public static final int pango_layout_get_alignment(int /*long*/ layout) { lock.unlock(); } } +public static final native int /*long*/ _pango_layout_get_context(int /*long*/ layout); +public static final int /*long*/ pango_layout_get_context(int /*long*/ layout) { + lock.lock(); + try { + return _pango_layout_get_context(layout); + } finally { + lock.unlock(); + } +} public static final native int /*long*/ _pango_layout_get_attributes(int /*long*/ layout); public static final int /*long*/ pango_layout_get_attributes(int /*long*/ layout) { lock.lock(); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java index 625efef1eb..8d277bdd25 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Label.java @@ -135,6 +135,35 @@ public Point computeSize (int wHint, int hHint, boolean changed) { if (fixWrap) { OS.gtk_widget_set_size_request (labelHandle, labelWidth [0], labelHeight [0]); } + /* + * Feature in GTK. Instead of using the font height to determine + * the preferred height of the widget, GTK uses the text metrics. + * The fix is to ensure that the preferred height is at least as + * tall as the font height. + * + * NOTE: This work around does not fix the case when there are + * muliple lines of text. + */ + if (hHint == SWT.DEFAULT && labelHandle != 0) { + int /*long*/ layout = OS.gtk_label_get_layout (labelHandle); + int /*long*/ context = OS.pango_layout_get_context (layout); + int /*long*/ lang = OS.pango_context_get_language (context); + int /*long*/ font = getFontDescription (); + int /*long*/ metrics = OS.pango_context_get_metrics (context, font, lang); + int ascent = OS.PANGO_PIXELS (OS.pango_font_metrics_get_ascent (metrics)); + int descent = OS.PANGO_PIXELS (OS.pango_font_metrics_get_descent (metrics)); + OS.pango_font_metrics_unref (metrics); + int fontHeight = ascent + descent; + int [] buffer = new int [1]; + OS.g_object_get (labelHandle, OS.ypad, buffer, 0); + fontHeight += 2 * buffer [0]; + if (frameHandle != 0) { + int /*long*/ style = OS.gtk_widget_get_style (frameHandle); + fontHeight += 2 * OS.gtk_style_get_ythickness (style); + fontHeight += 2 * OS.gtk_container_get_border_width (frameHandle); + } + size.y = Math.max (size.y, fontHeight); + } return size; } |