/*******************************************************************************
* Copyright (C) 2008, 2016, Shawn O. Pearce <spearce@spearce.org> and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.egit.ui.internal.preferences;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
class StorageSizeFieldEditor extends StringFieldEditor {
private static final int KB = 1024;
private static final int MB = 1024 * KB;
private static final int GB = 1024 * MB;
private final int minValidValue;
private final int maxValidValue;
StorageSizeFieldEditor(String name, String labelText, Composite parent,
int min, int max) {
Assert.isTrue(min > 0 && min < max);
init(name, labelText);
setTextLimit(10);
setEmptyStringAllowed(false);
setErrorMessage(
JFaceResources.format("IntegerFieldEditor.errorMessageRange", //$NON-NLS-1$
Integer.valueOf(min), Integer.valueOf(max)));
createControl(parent);
minValidValue = min;
maxValidValue = max;
}
@Override
protected boolean checkState() {
final Text text = getTextControl();
if (text == null)
return false;
final String numberString = text.getText();
final int number = parse(numberString);
if (checkValue(number)) {
clearErrorMessage();
return true;
}
showErrorMessage();
return false;
}
/**
* Verify this value is acceptable.
*
* @param number
* the value parsed from the input.
* @return true if the value is OK; false otherwise.
*/
protected boolean checkValue(final int number) {
return number >= minValidValue && number <= maxValidValue;
}
@Override
protected void doLoad() {
final Text text = getTextControl();
if (text != null) {
int value = getPreferenceStore().getInt(getPreferenceName());
text.setText(format(value));
}
}
@Override
protected void doLoadDefault() {
final Text text = getTextControl();
if (text != null) {
int value = getPreferenceStore().getDefaultInt(getPreferenceName());
text.setText(format(value));
}
valueChanged();
}
@Override
protected void doStore() {
final Text text = getTextControl();
if (text != null) {
final int v = parse(text.getText());
getPreferenceStore().setValue(getPreferenceName(), v);
}
}
private String format(int value) {
if (value > GB && (value / GB) * GB == value)
return String.valueOf(value / GB) + " g"; //$NON-NLS-1$
if (value > MB && (value / MB) * MB == value)
return String.valueOf(value / MB) + " m"; //$NON-NLS-1$
if (value > KB && (value / KB) * KB == value)
return String.valueOf(value / KB) + " k"; //$NON-NLS-1$
return String.valueOf(value);
}
private int parse(final String str) {
String n = str.trim();
if (n.length() == 0)
return 0;
int mul = 1;
char lastChar = n.charAt(n.length() - 1);
switch (Character.toLowerCase(lastChar)) {
case 'g':
mul = GB;
break;
case 'm':
mul = MB;
break;
case 'k':
mul = KB;
break;
default:
if (Character.isDigit(lastChar)) {
break;
}
return 0; // Invalid input
}
if (mul > 1)
n = n.substring(0, n.length() - 1).trim();
if (n.length() == 0)
return 0;
try {
return mul * Integer.parseInt(n);
} catch (NumberFormatException nfe) {
return 0;
}
}
}