summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Heidrich <fheidric>2008-01-14 23:26:53 +0000
committerFelipe Heidrich <fheidric>2008-01-14 23:26:53 +0000
commit3114c0771e236970e2e710942b819990aa75f96f (patch)
tree90698831a3ad4f37762f6087d9fee86e095a8480
parent25fe9dd1d5b36d931690d4a38e3117d3d67fb4cc (diff)
downloadeclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.tar.gz
eclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.tar.xz
eclipse.platform.swt-3114c0771e236970e2e710942b819990aa75f96f.zip
Bug 91317 - Spinner should support negative values
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Spinner.java38
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java36
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/motif/org/eclipse/swt/widgets/Spinner.java18
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 ();