diff options
author | Anatoly Spektor <aspektor@redhat.com> | 2012-12-04 14:04:32 -0500 |
---|---|---|
committer | Anatoly Spektor <aspektor@redhat.com> | 2012-12-04 14:04:32 -0500 |
commit | 04ee98e1549f864a87b828ad96795e50df6690cf (patch) | |
tree | 110f1f180c63224dace53472c2afc9377e903e94 | |
parent | 6d99e84d2b1da618b81bbdb39af11e5759decec6 (diff) | |
download | eclipse.platform.swt-04ee98e1549f864a87b828ad96795e50df6690cf.tar.gz eclipse.platform.swt-04ee98e1549f864a87b828ad96795e50df6690cf.tar.xz eclipse.platform.swt-04ee98e1549f864a87b828ad96795e50df6690cf.zip |
Arrows and Keys both work with SWT.TIME and SWT.DATE
In this iteration GDK_UP and GDK_DOWN was removed from gtk_key_press
because they are both triggered when gtk_output is called, and there is
no need to call it twice.
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/DateTime.java | 266 |
1 files changed, 79 insertions, 187 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 b9536cdc83..0dc2828067 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 @@ -63,7 +63,7 @@ public class DateTime extends Composite { int fieldCount, currentField = 0, characterCount = 0; boolean ignoreVerify = false; String dateTimeString; - double adj_value; + boolean output = false; long /*int*/ bufferHandle; int[] segments; static final char LTR_MARK = '\u200e'; @@ -1684,45 +1684,23 @@ void register () { // SPINNER // // -/** - * Output signal is called when Spinner's arrow buttons are triggered. - * On every click output is called twice presenting current and previous value. - * This method compares two values and determines if Up or down arrow was called. - */ -long /*int*/ gtk_output (long /*int*/ widget) { - - int arrowType = getArrow(widget); - switch (arrowType) { - case SWT.ARROW_UP: - commitCurrentSpinField(); - incrementSpinField(+1); - break; - case SWT.ARROW_DOWN: - commitCurrentSpinField(); - incrementSpinField(-1); - break; - } - return 1; -} int getArrow (long /*int*/ widget) { - - int adj_value = (int) OS.gtk_adjustment_get_value(OS.gtk_spin_button_get_adjustment(handle)); + int adj_value = (int) OS.gtk_adjustment_get_value(OS.gtk_spin_button_get_adjustment(widget)); int new_value = 0; if ((style & SWT.DATE) != 0) { - new_value = day; + // getMonth() return 0 as first month and 11 as last one, whereas adjusment does not, so adding one makes them comaprable + new_value = getMonth()+1; } else if ((style & SWT.TIME) != 0) { // as getHours() has 24h format but spinner 12h format, new_value needs to be converted to 12h format if (getHours() > 12 ){ new_value = getHours() - 12; } else { new_value = getHours(); + } + if (new_value == 0) + new_value = 12; } - } - // as getHours() has 24h format but spinner 12h format, new_value needs to be converted to 12h format - if (new_value == 0){ - new_value = 12; - } if ( adj_value == new_value) return 0; @@ -1734,9 +1712,7 @@ int getArrow (long /*int*/ widget) { */ void createSpinHandle () { long /*int*/ adjustment = 0; - if ((style & SWT.TIME) != 0){ - adjustment = OS.gtk_adjustment_new (10, 0, 60, 1, 10, 0); - } + adjustment = OS.gtk_adjustment_new (10, 0, 60, 1, 10, 0); handle = OS.gtk_spin_button_new(adjustment, 1, 0); OS.gtk_spin_button_set_numeric (handle, false); OS.gtk_container_add(fixedHandle, handle); @@ -1777,31 +1753,6 @@ void setSpinText (String text) { } } -/** - * Returns a string containing a copy of the contents of the - * receiver's text field, or an empty string if there are no - * contents. - * - * @return Spinner's text - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ -String getSpinText () { - checkWidget(); - if (handle != 0) { - long /*int*/ str = OS.gtk_entry_get_text (handle); - if (str == 0) return ""; - int length = OS.strlen (str); - byte [] buffer = new byte [length]; - OS.memmove (buffer, str, length); - return new String (Converter.mbcsToWcs (null, buffer)); - } - return ""; -} - long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_key_press_event (widget, event); int fieldName; @@ -1810,14 +1761,6 @@ long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ event) { OS.memmove (keyEvent, event, GdkEventKey.sizeof); int key = keyEvent.keyval; switch (key) { - case OS.GDK_Down: - commitCurrentSpinField(); - incrementSpinField(-1); - break; - case OS.GDK_Up: - commitCurrentSpinField(); - incrementSpinField(+1); - break; case SWT.KEYPAD_DIVIDE: case OS.GDK_Right: selectSpinField((currentField + 1) % fieldCount); @@ -1870,6 +1813,32 @@ Point getSelection () { return selection; } + +/** + * Returns a string containing a copy of the contents of the + * receiver's text field, or an empty string if there are no + * contents. + * + * @return Spinner's text + * + * @exception SWTException <ul> + * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> + * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> + * </ul> + */ +String getSpinText () { + checkWidget(); + if (handle != 0) { + long /*int*/ str = OS.gtk_entry_get_text (handle); + if (str == 0) return ""; + int length = OS.strlen (str); + byte [] buffer = new byte [length]; + OS.memmove (buffer, str, length); + return new String (Converter.mbcsToWcs (null, buffer)); + } + return ""; +} + /** * returns GtkEntry starting from index and ending with index * provided by the user @@ -1921,22 +1890,6 @@ void selectSpinField(int index) { }); } -void incrementSpinField(int amount) { - int fieldName = fieldNames[currentField]; - int value = calendar.get(fieldName); - if (fieldName == Calendar.HOUR) { - int max = calendar.getMaximum(Calendar.HOUR); - int min = calendar.getMinimum(Calendar.HOUR); - if ((value == max && amount == 1) || (value == min && amount == -1)) { - int temp = currentField; - currentField = getFieldIndex(Calendar.AM_PM); - setSpinTextField(Calendar.AM_PM, (calendar.get(Calendar.AM_PM) + 1) % 2, true, true); - currentField = temp; - } - } - setSpinTextField(fieldName, value + amount, true, true); -} - void setSpinTextField(int fieldName, int value, boolean commit, boolean adjust) { if (commit) { int max = calendar.getActualMaximum(fieldName); @@ -1979,7 +1932,21 @@ void setSpinTextField(int fieldName, int value, boolean commit, boolean adjust) if (commit) setField(fieldName, value); } - +void incrementSpinField(int amount) { + int fieldName = fieldNames[currentField]; + int value = calendar.get(fieldName); + if (fieldName == Calendar.HOUR) { + int max = calendar.getMaximum(Calendar.HOUR); + int min = calendar.getMinimum(Calendar.HOUR); + if ((value == max && amount == 1) || (value == min && amount == -1)) { + int temp = currentField; + currentField = getFieldIndex(Calendar.AM_PM); + setSpinTextField(Calendar.AM_PM, (calendar.get(Calendar.AM_PM) + 1) % 2, true, true); + currentField = temp; + } + } + setSpinTextField(fieldName, value + amount, true, true); +} long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { GdkEventButton gdkEvent = new GdkEventButton (); @@ -1991,23 +1958,27 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { return super.gtk_button_press_event (widget, event); } -void onSpinTextMouseClick(GdkEventButton event) { - if (event.button != 1) return; - Point sel = getSelection(); - for (int i = 0; i < fieldCount; i++) { - if (sel.x >= fieldIndices[i].x && sel.x <= fieldIndices[i].y) { - currentField = i; - break; - } - } - selectSpinField(currentField); +/** + * Output signal is called when Spinner's arrow buttons are triggered. + * On every click output is called twice presenting current and previous value. + * This method compares two values and determines if Up or down arrow was called. + */ +long /*int*/ gtk_output (long /*int*/ widget) { + output = true; + int arrowType = getArrow(widget); + switch (arrowType) { + case SWT.ARROW_UP: + commitCurrentSpinField(); + incrementSpinField(+1); + break; + case SWT.ARROW_DOWN: + commitCurrentSpinField(); + incrementSpinField(-1); + break; + } + return 1; } - - -///// - - void insert (String string) { checkWidget (); if (string == null) error (SWT.ERROR_NULL_ARGUMENT); @@ -2019,94 +1990,15 @@ void insert (String string) { OS.gtk_editable_set_position (handle, start [0]); } -//void addSegmentListener (SegmentListener listener) { -// checkWidget (); -// if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); -// addListener (SWT.Segments, new TypedListener (listener)); -// clearSegments (true); -// applySegments (); -//} -// -//void clearSegments (boolean applyText) { -// if (segments == null) return; -// int nSegments = segments.length; -// if (nSegments == 0) return; -// -// if ((style & SWT.SINGLE) != 0) { -// OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); -// if (applyText) { -// OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); -// long /*int*/ ptr = OS.gtk_entry_get_text (handle); -// int start, end; -// for (int i = 0; i < nSegments; i++) { -// start = (int)/*64*/OS.g_utf16_offset_to_utf8_offset (ptr, segments[i]); -// end = (int)/*64*/OS.g_utf16_offset_to_utf8_offset (ptr, segments[i] + 1); -// OS.gtk_editable_delete_text (handle, start, end); -// } -// OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, DELETE_TEXT); -// } -// int limit = OS.gtk_entry_get_max_length (handle); -// if (limit != 0) OS.gtk_entry_set_max_length (handle, untranslateOffset (limit)); -// OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); -// } else if (applyText) { -// segments = null; -// } -//} -// -//void applySegments () { -// if (!hooks (SWT.Segments) && !filters (SWT.Segments)) return; -// Event event = new Event (); -// String string = getSpinText (); -// event.text = string; -// event.segments = segments; -// sendEvent (SWT.Segments, event); -// segments = event.segments; -// if (segments == null) return; -// int nSegments = segments.length; -// if (nSegments == 0) return; -// -// for (int i = 1, length = string == null ? 0 : string.length (); i < nSegments; i++) { -// if (event.segments [i] < event.segments [i - 1] || event.segments [i] > length) { -// error (SWT.ERROR_INVALID_ARGUMENT); -// } -// } -// char[] segmentsChars = event.segmentsChars; -// char [] separator = { getOrientation () == SWT.RIGHT_TO_LEFT ? RTL_MARK : LTR_MARK }; -// if ((style & SWT.SINGLE) != 0) { -// OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); -// OS.g_signal_handlers_block_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); -// int limit = OS.gtk_entry_get_max_length (handle); -// if (limit != 0) OS.gtk_entry_set_max_length (handle, translateOffset (limit)); -// int [] pos = new int [1]; -// for (int i = 0; i < nSegments; i++) { -// pos [0] = segments [i] + i; -// if (segmentsChars != null && segmentsChars.length > i) { -// separator [0] = segmentsChars [i]; -// } -// byte [] buffer = Converter.wcsToMbcs (null, separator, false); -// long /*int*/ ptr = OS.gtk_entry_get_text (handle); -// pos [0] = (int)/*64*/OS.g_utf16_offset_to_utf8_offset (ptr, pos [0]); -// OS.gtk_editable_insert_text (handle, buffer, buffer.length, pos); -// } -// OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); -// OS.g_signal_handlers_unblock_matched (handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, INSERT_TEXT); -// } -//} - -//int untranslateOffset (int offset) { -// if (segments == null) return offset; -// for (int i = 0, nSegments = segments.length; i < nSegments && offset > segments[i]; i++) { -// offset--; -// } -// return offset; -//} -// -//int translateOffset (int offset) { -// if (segments == null) return offset; -// for (int i = 0, nSegments = segments.length; i < nSegments && offset - i >= segments[i]; i++) { -// offset++; -// } -// return offset; -//} - +void onSpinTextMouseClick(GdkEventButton event) { + if (event.button != 1) return; + Point sel = getSelection(); + for (int i = 0; i < fieldCount; i++) { + if (sel.x >= fieldIndices[i].x && sel.x <= fieldIndices[i].y) { + currentField = i; + break; + } + } + selectSpinField(currentField); +} }
\ No newline at end of file |