diff options
author | Paul D'Pong | 2021-07-16 16:37:07 +0000 |
---|---|---|
committer | Alexander Kurtakov | 2021-08-12 11:09:08 +0000 |
commit | 036805b6ae990269e9a2b3036c1691f289c6becc (patch) | |
tree | 7c0086f3abf82b8bfba8f009ada5a9ab03bca59d | |
parent | 0e50491a5400d917a59a69129d65bccd9bb6b9bc (diff) | |
download | eclipse.platform.swt-036805b6ae990269e9a2b3036c1691f289c6becc.tar.gz eclipse.platform.swt-036805b6ae990269e9a2b3036c1691f289c6becc.tar.xz eclipse.platform.swt-036805b6ae990269e9a2b3036c1691f289c6becc.zip |
Bug 574830 - [GTK4] Port DateTime widget
- Added gtk4_key_press to allow for date & time traversal and increments
with keyboard
- Removed the commitData call (in the GTK4 key press callback) as it
seems to be a redundant check on top of increment call
- Introduced GTK4 only field, editableHandle to hold the handle of the
GtkWidget which interfaces with GtkEditable (required in the DateTime
widgets which allow for editing)
- Some clean up & comments
Change-Id: I086512f86d305b4d6d602908b165454d0404b68b
Signed-off-by: Paul D'Pong <sdamrong@redhat.com>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.swt/+/183745
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Alexander Kurtakov <akurtako@redhat.com>
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java | 155 |
1 files changed, 103 insertions, 52 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java index 0e5aae9576..c8d7b2b125 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java @@ -74,6 +74,12 @@ public class DateTime extends Composite { containerHandle, calendarHandle; + /** + * GTK4 field used to hold the main GtkEditable widget. + * Primarily used for styles SWT.DROP_DOWN & SWT.TIME + */ + long editableHandle; + /* Emulated DATE and TIME fields */ Calendar calendar; Button down; @@ -363,15 +369,15 @@ Rectangle computeTrimInPixels (int x, int y, int width, int height) { Rectangle trim = super.computeTrimInPixels (x, y, width, height); int xborder = 0, yborder = 0; GtkBorder tmp = new GtkBorder (); - long context = GTK.gtk_widget_get_style_context (textEntryHandle); - int state_flag = GTK.gtk_widget_get_state_flags(textEntryHandle); + long context = GTK.gtk_widget_get_style_context (GTK.GTK4 ? editableHandle : textEntryHandle); + int state_flag = GTK.gtk_widget_get_state_flags(GTK.GTK4 ? editableHandle : textEntryHandle); gtk_style_context_get_padding(context, state_flag, tmp); trim.x -= tmp.left; trim.y -= tmp.top; trim.width += tmp.left + tmp.right; trim.height += tmp.top + tmp.bottom; if ((style & SWT.BORDER) != 0) { - int state = GTK.gtk_widget_get_state_flags(textEntryHandle); + int state = GTK.gtk_widget_get_state_flags(GTK.GTK4 ? editableHandle : textEntryHandle); gtk_style_context_get_border(context, state, tmp); trim.x -= tmp.left; trim.y -= tmp.top; @@ -444,29 +450,36 @@ private void createHandleForDateWithDropDown () { if (handle == 0) error(SWT.ERROR_NO_HANDLES); containerHandle = handle; - textEntryHandle = GTK.gtk_entry_new(); - if (textEntryHandle == 0) error(SWT.ERROR_NO_HANDLES); - if (GTK.GTK4) { + editableHandle = GTK.gtk_entry_new(); + if (editableHandle == 0) error(SWT.ERROR_NO_HANDLES); + + textEntryHandle = GTK4.gtk_editable_get_delegate(editableHandle); + OS.swt_fixed_add(fixedHandle, handle); - GTK4.gtk_box_append(handle, textEntryHandle); + GTK4.gtk_box_append(handle, editableHandle); } else { + textEntryHandle = GTK.gtk_entry_new(); + if (textEntryHandle == 0) error(SWT.ERROR_NO_HANDLES); + GTK3.gtk_container_add(fixedHandle, handle); GTK3.gtk_container_add(handle, textEntryHandle); GTK.gtk_widget_show(containerHandle); GTK.gtk_widget_show(textEntryHandle); - } - // In GTK 3 font description is inherited from parent widget which is not how SWT has always worked, - // reset to default font to get the usual behavior - setFontDescription(defaultFont().handle); + + // In GTK 3 font description is inherited from parent widget which is not how SWT has always worked, + // reset to default font to get the usual behavior + setFontDescription(defaultFont().handle); + } } private void createHandleForDateTime() { long adjustment = GTK.gtk_adjustment_new(0, -9999, 9999, 1, 0, 0); if (GTK.GTK4) { handle = GTK.gtk_spin_button_new(adjustment, 1, 0); - textEntryHandle = GTK4.gtk_editable_get_delegate(handle); + editableHandle = handle; + textEntryHandle = GTK4.gtk_editable_get_delegate(editableHandle); containerHandle = textEntryHandle; } else { handle = GTK.gtk_spin_button_new(adjustment, 1, 0); @@ -932,11 +945,7 @@ private long dateTimeHandle () { if (isCalendar () && calendarHandle != 0) { return calendarHandle; } else if ((isDate () || isTime ())) { - if (GTK.GTK4) { - return handle; - } else { - if (textEntryHandle != 0) return textEntryHandle; - } + if (textEntryHandle != 0) return textEntryHandle; return super.focusHandle (); } else { return super.focusHandle (); @@ -1733,7 +1742,7 @@ void setBoundsInPixels (int x, int y, int width, int height) { //Date with Drop down is in container. Needs extra handling. if (isDateWithDropDownButton ()) { - long sizingHandle = textEntryHandle; + long sizingHandle = GTK.GTK4 ? editableHandle : textEntryHandle; GtkRequisition requisition = new GtkRequisition (); GTK.gtk_widget_get_preferred_size (sizingHandle, null, requisition); int oldHeight = requisition.height; //Entry should not expand vertically. It is single liner. @@ -1748,21 +1757,19 @@ void setBoundsInPixels (int x, int y, int width, int height) { /** * Usually called when control is resized or first initialized. */ -private void setDropDownButtonSize () { - Rectangle rect = getClientAreaInPixels (); +private void setDropDownButtonSize() { + Rectangle rect = getClientAreaInPixels(); int parentWidth = rect.width; int parentHeight = rect.height; - Point buttonSize = down.computeSizeInPixels (SWT.DEFAULT, parentHeight); + Point buttonSize = down.computeSizeInPixels(SWT.DEFAULT, parentHeight); - //TAG_GTK3__NO_VERTICAL_FILL_ADJUSTMENT - int dateEntryHeight = computeNativeSize (textEntryHandle, SWT.DEFAULT, SWT.DEFAULT, false).y; - int newHeight = dateEntryHeight; + int dateEntryHeight = computeNativeSize(GTK.GTK4 ? editableHandle : textEntryHandle, SWT.DEFAULT, SWT.DEFAULT, false).y; //Move button a little closer to entry field, by amount of padding. int newXpos = parentWidth - buttonSize.x - getGtkBorderPadding().left - getGtkBorderPadding().right; int newYPos = parentHeight/2 - dateEntryHeight/2; - down.setBoundsInPixels (newXpos, newYPos, buttonSize.x, newHeight); + down.setBoundsInPixels (newXpos, newYPos, buttonSize.x, dateEntryHeight); } /** @@ -1774,7 +1781,7 @@ private void setDropDownButtonSize () { GtkBorder getGtkBorderPadding () { //In Gtk3, acquire border. GtkBorder gtkBorderPadding = new GtkBorder (); - long contextHandle = textEntryHandle; + long contextHandle = GTK.GTK4 ? editableHandle : textEntryHandle; long context = GTK.gtk_widget_get_style_context (contextHandle); int state_flag = GTK.gtk_widget_get_state_flags(contextHandle); gtk_style_context_get_padding(context, state_flag, gtkBorderPadding); @@ -1879,8 +1886,8 @@ void updateControl() { } @Override -void register () { - super.register (); +void register() { + super.register(); if (handle != 0 && display.getWidget(handle) == null) display.addWidget(handle, this); if (containerHandle != 0 && containerHandle != handle) display.addWidget (containerHandle, this); if (textEntryHandle != 0 && textEntryHandle != containerHandle) display.addWidget (textEntryHandle, this); @@ -1946,13 +1953,12 @@ int getArrow(long widget) { * Calculates appropriate width of GtkEntry and * adds Date/Time string to the Date/Time Spinner */ -void setText (String dateTimeText) { - if (dateTimeText != null){ - byte [] dateTimeConverted = Converter.wcsToMbcs (dateTimeText, true); +void setText(String dateTimeText) { + if (dateTimeText != null) { + byte[] dateTimeConverted = Converter.javaStringToCString(dateTimeText); if (GTK.GTK4) { - long bufferHandle = isDateWithDropDownButton() ? GTK4.gtk_entry_get_buffer(textEntryHandle) : GTK4.gtk_text_get_buffer(textEntryHandle); - GTK.gtk_entry_buffer_set_text(bufferHandle, dateTimeConverted, dateTimeText.length()); + GTK.gtk_entry_buffer_set_text(GTK4.gtk_text_get_buffer(textEntryHandle), dateTimeConverted, dateTimeText.length()); } else { //note, this is ignored if the control is in a fill-layout. GTK3.gtk_entry_set_width_chars(textEntryHandle, dateTimeText.length()); @@ -1983,14 +1989,55 @@ void setText (String dateTimeText) { } @Override +boolean gtk4_key_press_event(long controller, int keyval, int keycode, int state, long event) { + if (!isReadOnly() && (isTime() || isDate())) { + switch (keyval) { + case GDK.GDK_Up: + case GDK.GDK_KP_Up: + incrementField(+1); + break; + case GDK.GDK_Down: + case GDK.GDK_KP_Down: + incrementField(-1); + break; + case GDK.GDK_Tab: + case GDK.GDK_Right: + case GDK.GDK_KP_Right: + selectField(getNextField(currentField)); + sendEvent(SWT.Traverse); + break; + case GDK.GDK_Left: + case GDK.GDK_KP_Left: + selectField(getPreviousField(currentField)); + sendEvent(SWT.Traverse); + break; + case GDK.GDK_Home: + case GDK.GDK_KP_Home: + /* Set the value of the current field to its minimum */ + if (currentField != null) { + setTextField(currentField, calendar.getActualMinimum(getCalendarField(currentField))); + } + break; + case GDK.GDK_End: + case GDK.GDK_KP_End: + /* Set the value of the current field to its maximum */ + if (currentField != null) { + setTextField(currentField, calendar.getActualMaximum(getCalendarField(currentField))); + } + break; + default: + onNumberKeyInput(keyval); + } + } + + return true; +} + +@Override long gtk_key_press_event (long widget, long event) { if (!isReadOnly () && (isTime () || isDate ())) { int [] key = new int[1]; - if (GTK.GTK4) { - key[0] = GDK.gdk_key_event_get_keyval(event); - } else { - GDK.gdk_event_get_keyval(event, key); - } + GDK.gdk_event_get_keyval(event, key); switch (key[0]) { case GDK.GDK_Up: @@ -2063,16 +2110,16 @@ String getText() { long stringPtr; if (GTK.GTK4) { - long bufferHandle = isDateWithDropDownButton() ? GTK4.gtk_entry_get_buffer(textEntryHandle) : GTK4.gtk_text_get_buffer(textEntryHandle); - stringPtr = GTK.gtk_entry_buffer_get_text(bufferHandle); + stringPtr = GTK.gtk_entry_buffer_get_text(GTK4.gtk_text_get_buffer(textEntryHandle)); } else { stringPtr = GTK3.gtk_entry_get_text(textEntryHandle); } - if (stringPtr == 0) return ""; + int length = C.strlen(stringPtr); byte[] buffer = new byte[length]; C.memmove(buffer, stringPtr, length); + return new String(Converter.mbcsToWcs(buffer)); } else { return ""; @@ -2080,22 +2127,28 @@ String getText() { } /** - * returns GtkEntry starting from index and ending with index - * provided by the user + * Gets the substring between start and end indices of the + * caller provided string. Checks are done to ensure that start + * and end indices are well formed. + * + * @return substring of str between start & end. If start & end + * indices are malformed, an empty string is returned. */ -String getText (String str,int start, int end) { +String getText(String str, int start, int end) { checkWidget (); if (!(start <= end && 0 <= end)) return ""; - int length = str.length (); - end = Math.min (end, length - 1); + + int length = str.length(); + end = Math.min(end, length - 1); if (start > end) return ""; - start = Math.max (0, start); + start = Math.max(0, start); + /* * NOTE: The current implementation uses substring () * which can reference a potentially large character * array. */ - return str.substring (start, end + 1); + return str.substring(start, end + 1); } /** @@ -2112,8 +2165,7 @@ Point getTextSelection() { long stringPtr; if (GTK.GTK4) { - long bufferHandle = isDateWithDropDownButton() ? GTK4.gtk_entry_get_buffer(textEntryHandle) : GTK4.gtk_text_get_buffer(textEntryHandle); - stringPtr = GTK.gtk_entry_buffer_get_text(bufferHandle); + stringPtr = GTK.gtk_entry_buffer_get_text(GTK4.gtk_text_get_buffer(textEntryHandle)); } else { stringPtr = GTK3.gtk_entry_get_text (textEntryHandle); } @@ -2130,8 +2182,7 @@ void setTextSelection(int start, int end) { long stringPtr; if (GTK.GTK4) { - long bufferHandle = isDateWithDropDownButton() ? GTK4.gtk_entry_get_buffer(textEntryHandle) : GTK4.gtk_text_get_buffer(textEntryHandle); - stringPtr = GTK.gtk_entry_buffer_get_text(bufferHandle); + stringPtr = GTK.gtk_entry_buffer_get_text(GTK4.gtk_text_get_buffer(textEntryHandle)); } else { stringPtr = GTK3.gtk_entry_get_text(textEntryHandle); } |