summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnatoly Spektor <aspektor@redhat.com>2012-12-04 14:04:32 -0500
committerAnatoly Spektor <aspektor@redhat.com>2012-12-04 14:04:32 -0500
commit04ee98e1549f864a87b828ad96795e50df6690cf (patch)
tree110f1f180c63224dace53472c2afc9377e903e94
parent6d99e84d2b1da618b81bbdb39af11e5759decec6 (diff)
downloadeclipse.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.java266
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