diff options
author | Felipe Heidrich <fheidric> | 2008-01-14 23:26:53 +0000 |
---|---|---|
committer | Felipe Heidrich <fheidric> | 2008-01-14 23:26:53 +0000 |
commit | 3114c0771e236970e2e710942b819990aa75f96f (patch) | |
tree | 90698831a3ad4f37762f6087d9fee86e095a8480 | |
parent | 25fe9dd1d5b36d931690d4a38e3117d3d67fb4cc (diff) | |
download | eclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.tar.gz eclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.tar.xz eclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.zip |
Bug 91317 - Spinner should support negative values
3 files changed, 56 insertions, 36 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Spinner.java index 84743a150a..98cbca5ac6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Spinner.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Spinner.java @@ -85,8 +85,9 @@ int actionProc (int theControl, int partCode) { int result = super.actionProc (theControl, partCode); if (result == OS.noErr) return result; if (theControl == buttonHandle) { - int value = getSelectionText (); - if (value == -1) { + boolean [] parseFail = new boolean [1]; + int value = getSelectionText (parseFail); + if (parseFail [0]) { value = OS.GetControl32BitValue (buttonHandle); } int newValue = value; @@ -456,7 +457,7 @@ public int getSelection () { return OS.GetControl32BitValue (buttonHandle); } -int getSelectionText () { +int getSelectionText (boolean [] parseFail) { int [] actualSize = new int [1]; int [] ptr = new int [1]; if (OS.GetControlData (textHandle, (short)OS.kControlEntireControl, OS.kControlEditTextCFStringTag, 4, ptr, actualSize) == OS.noErr) { @@ -473,7 +474,8 @@ int getSelectionText () { String decimalSeparator = getDecimalSeparator (); int index = string.indexOf (decimalSeparator); if (index != -1) { - String wholePart = string.substring (0, index); + int startIndex = string.startsWith ("+") || string.startsWith ("-") ? 1 : 0; + String wholePart = startIndex != index ? string.substring (startIndex, index) : "0"; String decimalPart = string.substring (index + 1); if (decimalPart.length () > digits) { decimalPart = decimalPart.substring (0, digits); @@ -487,6 +489,7 @@ int getSelectionText () { int decimalValue = Integer.parseInt (decimalPart); for (int i = 0; i < digits; i++) wholeValue *= 10; value = wholeValue + decimalValue; + if (string.startsWith ("-")) value = -value; } else { value = Integer.parseInt (string); for (int i = 0; i < digits; i++) value *= 10; @@ -500,6 +503,7 @@ int getSelectionText () { } catch (NumberFormatException e) { } } + parseFail [0] = true; return -1; } @@ -590,8 +594,9 @@ int kEventControlSetFocusPart (int nextHandler, int theEvent, int userData) { short [] part = new short [1]; OS.GetEventParameter (theEvent, OS.kEventParamControlPart, OS.typeControlPartCode, null, 2, null, part); if (part [0] == OS.kControlFocusNoPart) { - int value = getSelectionText (); - if (value == -1) { + boolean [] parseFail = new boolean [1]; + int value = getSelectionText (parseFail); + if (parseFail [0]) { value = OS.GetControl32BitValue (buttonHandle); setSelection (value, false, true, false); } @@ -633,8 +638,9 @@ int kEventUnicodeKeyPressed (int nextHandler, int theEvent, int userData) { case 126: /* Up */ delta = increment; break; } if (delta != 0) { - int value = getSelectionText (); - if (value == -1) { + boolean [] parseFail = new boolean [1]; + int value = getSelectionText (parseFail); + if (parseFail [0]) { value = OS.GetControl32BitValue (buttonHandle); } int newValue = value + delta; @@ -649,8 +655,9 @@ int kEventUnicodeKeyPressed (int nextHandler, int theEvent, int userData) { return OS.noErr; } else { result = OS.CallNextEventHandler (nextHandler, theEvent); - int value = getSelectionText (); - if (value != -1) { + boolean [] parseFail = new boolean [1]; + int value = getSelectionText (parseFail); + if (!parseFail [0]) { int pos = OS.GetControl32BitValue (buttonHandle); if (pos != value) setSelection (value, true, false, true); } @@ -927,7 +934,6 @@ public void setIncrement (int value) { */ public void setMaximum (int value) { checkWidget (); - if (value < 0) return; int min = OS.GetControl32BitMinimum (buttonHandle); if (value <= min) return; int pos = OS.GetControl32BitValue (buttonHandle); @@ -950,7 +956,6 @@ public void setMaximum (int value) { */ public void setMinimum (int value) { checkWidget (); - if (value < 0) return; int max = OS.GetControl32BitMaximum (buttonHandle); if (value >= max) return; int pos = OS.GetControl32BitValue (buttonHandle); @@ -1002,11 +1007,12 @@ void setSelection (int value, boolean setPos, boolean setText, boolean notify) { OS.SetControl32BitValue (buttonHandle, value); } if (setText) { - String string = String.valueOf (value); + String string = String.valueOf (Math.abs (value)); if (digits > 0) { String decimalSeparator = getDecimalSeparator (); int index = string.length () - digits; StringBuffer buffer = new StringBuffer (); + if (value < 0) buffer.append ("-"); if (index > 0) { buffer.append (string.substring (0, index)); buffer.append (decimalSeparator); @@ -1109,7 +1115,6 @@ char [] setText (String string, int start, int end, boolean notify) { */ public void setValues (int selection, int minimum, int maximum, int digits, int increment, int pageIncrement) { checkWidget (); - if (minimum < 0) return; if (maximum <= minimum) return; if (digits < 0) return; if (increment < 1) return; @@ -1148,8 +1153,11 @@ String verifyText (String string, int start, int end, Event keyEvent) { } index = 0; } + boolean maxPositive = OS.GetControl32BitMaximum (buttonHandle) > 0; + boolean minNegative = OS.GetControl32BitMinimum (buttonHandle) < 0; while (index < string.length ()) { - if (!Character.isDigit (string.charAt (index))) break; + char ch = string.charAt (index); + if (!(Character.isDigit (ch) || (minNegative && ch == '-') || (maxPositive && ch == '+'))) break; index++; } event.doit = index == string.length (); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java index cde9fd3108..0180ccb49f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java @@ -375,8 +375,9 @@ public int getIncrement () { GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); int digits = OS.gtk_spin_button_get_digits (handle); - for (int i = 0; i < digits; i++) adjustment.step_increment *= 10; - return (int) (adjustment.step_increment + 0.5); + double value = adjustment.step_increment; + for (int i = 0; i < digits; i++) value *= 10; + return (int) (value > 0 ? value + 0.5 : value - 0.5); } /** @@ -395,8 +396,9 @@ public int getMaximum () { GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); int digits = OS.gtk_spin_button_get_digits (handle); - for (int i = 0; i < digits; i++) adjustment.upper *= 10; - return (int) (adjustment.upper + 0.5); + double value = adjustment.upper; + for (int i = 0; i < digits; i++) value *= 10; + return (int) (value > 0 ? value + 0.5 : value - 0.5); } /** @@ -415,8 +417,9 @@ public int getMinimum () { GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); int digits = OS.gtk_spin_button_get_digits (handle); - for (int i = 0; i < digits; i++) adjustment.lower *= 10; - return (int) (adjustment.lower + 0.5); + double value = adjustment.lower; + for (int i = 0; i < digits; i++) value *= 10; + return (int) (value > 0 ? value + 0.5 : value - 0.5); } /** @@ -436,8 +439,9 @@ public int getPageIncrement () { GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); int digits = OS.gtk_spin_button_get_digits (handle); - for (int i = 0; i < digits; i++) adjustment.page_increment *= 10; - return (int) (adjustment.page_increment + 0.5); + double value = adjustment.page_increment; + for (int i = 0; i < digits; i++) value *= 10; + return (int) (value > 0 ? value + 0.5 : value - 0.5); } /** @@ -456,8 +460,9 @@ public int getSelection () { GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); int digits = OS.gtk_spin_button_get_digits (handle); - for (int i = 0; i < digits; i++) adjustment.value *= 10; - return (int) (adjustment.value + 0.5); + double value = adjustment.value; + for (int i = 0; i < digits; i++) value *= 10; + return (int) (value > 0 ? value + 0.5 : value - 0.5); } /** @@ -840,7 +845,6 @@ public void setIncrement (int value) { */ public void setMaximum (int value) { checkWidget (); - if (value < 0) return; int /*long*/ hAdjustment = OS.gtk_spin_button_get_adjustment (handle); GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); @@ -868,7 +872,6 @@ public void setMaximum (int value) { */ public void setMinimum (int value) { checkWidget (); - if (value < 0) return; int /*long*/ hAdjustment = OS.gtk_spin_button_get_adjustment (handle); GtkAdjustment adjustment = new GtkAdjustment (); OS.memmove (adjustment, hAdjustment); @@ -1003,7 +1006,6 @@ public void setDigits (int value) { */ public void setValues (int selection, int minimum, int maximum, int digits, int increment, int pageIncrement) { checkWidget (); - if (minimum < 0) return; if (maximum <= minimum) return; if (digits < 0) return; if (increment < 1) return; @@ -1065,8 +1067,14 @@ String verifyText (String string, int start, int end) { } index = 0; } + int /*long*/ hAdjustment = OS.gtk_spin_button_get_adjustment (handle); + GtkAdjustment adjustment = new GtkAdjustment (); + OS.memmove (adjustment, hAdjustment); + boolean minNegative = adjustment.lower < 0; + boolean maxPositive = adjustment.upper > 0; while (index < string.length ()) { - if (!Character.isDigit (string.charAt (index))) break; + char ch = string.charAt (index); + if (!(Character.isDigit (ch) || (minNegative && ch == '-') || (maxPositive && ch == '+'))) break; index++; } event.doit = index == string.length (); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Spinner.java index 5d7fafc4d2..3c72202830 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Spinner.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Spinner.java @@ -639,7 +639,6 @@ public void setIncrement (int value) { */ public void setMaximum (int value) { checkWidget (); - if (value < 0) return; int [] argList1 = {OS.XmNminimumValue, 0, OS.XmNposition, 0}; OS.XtGetValues (handle, argList1, argList1.length / 2); if (value <= argList1 [1]) return; @@ -663,7 +662,6 @@ public void setMaximum (int value) { */ public void setMinimum (int value) { checkWidget (); - if (value < 0) return; int [] argList1 = {OS.XmNmaximumValue, 0, OS.XmNposition, 0}; OS.XtGetValues (handle, argList1, argList1.length / 2); if (value >= argList1 [1]) return; @@ -735,7 +733,6 @@ public void setSelection (int value) { */ public void setValues (int selection, int minimum, int maximum, int digits, int increment, int pageIncrement) { checkWidget (); - if (minimum < 0) return; if (maximum <= minimum) return; if (digits < 0) return; if (increment < 1) return; @@ -773,7 +770,8 @@ void updateText () { String decimalSeparator = getDecimalSeparator (); int index = string.indexOf (decimalSeparator); if (index != -1) { - String wholePart = string.substring (0, index); + int startIndex = string.startsWith ("+") || string.startsWith ("-") ? 1 : 0; + String wholePart = startIndex != index ? string.substring (startIndex, index) : "0"; String decimalPart = string.substring (index + 1); if (decimalPart.length () > digits) { decimalPart = decimalPart.substring (0, digits); @@ -787,8 +785,10 @@ void updateText () { int decimalValue = Integer.parseInt (decimalPart); for (int i = 0; i < digits; i++) wholeValue *= 10; value = wholeValue + decimalValue; + if (string.startsWith ("-")) value = -value; } else { value = Integer.parseInt (string); + for (int i = 0; i < digits; i++) value *= 10; } } else { value = Integer.parseInt (string); @@ -800,11 +800,12 @@ void updateText () { } } if (position == argList [7]) { - String string = String.valueOf (position); + String string = String.valueOf (Math.abs (position)); if (digits > 0) { String decimalSeparator = getDecimalSeparator (); int index = string.length () - digits; StringBuffer buffer = new StringBuffer (); + if (position < 0) buffer.append ("-"); if (index > 0) { buffer.append (string.substring (0, index)); buffer.append (decimalSeparator); @@ -884,7 +885,7 @@ int XmNmodifyVerifyCallback (int w, int client_data, int call_data) { event.text = text; String string = text; int index = 0; - int [] argList = {OS.XmNdecimalPoints, 0}; + int [] argList = {OS.XmNdecimalPoints, 0, OS.XmNmaximumValue, 0, OS.XmNminimumValue, 0}; OS.XtGetValues (handle, argList, argList.length / 2); if (argList [1] > 0) { String decimalSeparator = getDecimalSeparator (); @@ -894,8 +895,11 @@ int XmNmodifyVerifyCallback (int w, int client_data, int call_data) { } index = 0; } + boolean maxPositive = argList [3] > 0; + boolean minNegative = argList [5] < 0; while (index < string.length ()) { - if (!Character.isDigit (string.charAt (index))) break; + char ch = string.charAt (index); + if (!(Character.isDigit (ch) || (minNegative && ch == '-') || (maxPositive && ch == '+'))) break; index++; } event.doit = index == string.length (); |