package org.nightlabs.jfire.trade.admin.ui.editor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.wizard.WizardHopPage;
import org.nightlabs.jdo.ObjectIDUtil;
import org.nightlabs.jfire.accounting.Currency;
/**
*
* @author vince
*
*/
public class CurrencyCreateWizardPage
extends WizardHopPage
{
private Label currencyIdLabel;
private Label currencySymbolLabel;
private Label digitalDigitCountLabel;
private Text currencyIdText;
private Text currencySymbolText;
private Spinner decimalDigitCountSpinner;
public CurrencyCreateWizardPage() {
super(CurrencyCreateWizardPage.class.getName(), "Create new currency");
setDescription("Please specify the properties of the new currency to be created.");
}
@Override
public Control createPageContents(final Composite parent) {
Composite page = new XComposite(parent, SWT.NONE, LayoutMode.TIGHT_WRAPPER);
ModifyListener modifyListenerCheckInput = new ModifyListener() {
@Override
public void modifyText(final ModifyEvent e) {
checkInput();
}
};
currencyIdLabel = new Label(page, SWT.NONE);
currencyIdLabel.setText("Currency ID (e.g. \"EUR\")");
currencyIdText = new Text(page, SWT.SINGLE | SWT.BORDER);
currencyIdText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
currencyIdText.addModifyListener(modifyListenerCheckInput);
currencySymbolLabel = new Label(page,SWT.NONE);
currencySymbolLabel.setText("Currency symbol (e.g. \"€\")");
currencySymbolText = new Text(page, SWT.SINGLE | SWT.BORDER);
currencySymbolText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
currencySymbolText.addModifyListener(modifyListenerCheckInput);
digitalDigitCountLabel = new Label(page, SWT.NONE);
digitalDigitCountLabel.setText("Number of decimal digits");
decimalDigitCountSpinner = new Spinner(page, SWT.BORDER);
decimalDigitCountSpinner.setMinimum(0);
decimalDigitCountSpinner.setMaximum(Integer.MAX_VALUE);
decimalDigitCountSpinner.setSelection(2); // most currencies in the world have 2 decimal digits, thus using this as default.
decimalDigitCountSpinner.addModifyListener(modifyListenerCheckInput);
new Label(page, SWT.NONE).setText("Note: Once the decimal digit count has been stored. You won't be able to change it again.");
setPageComplete(false);
return page;
}
@Override
public void setErrorMessage(final String newMessage) {
super.setErrorMessage(newMessage);
setPageComplete(newMessage == null);
}
private void checkInput() {
if (currencyIdText.getText().isEmpty()) {
setErrorMessage("A currency ID is required!");
} else if (!ObjectIDUtil.isValidIDString(currencyIdText.getText())) {
setErrorMessage(
String.format("The currency ID \"%s\" is not a valid identifier!", currencyIdText.getText())
);
} else if (currencySymbolText.getText().isEmpty()) {
setErrorMessage("A currency symbol is required!");
} else {
setErrorMessage(null);
if (currencyIdText.getText().length() != 3) {
setMessage(
String.format(
"Usually, an ISO-4217 currency ID has exactly 3 characters. The value you entered, contains %2$d characters. Are you sure that your currency ID \"%1$s\" is correct?",
currencyIdText.getText(),
currencyIdText.getText().length()
),
WARNING
);
} else if (!currencyIdText.getText().matches("[A-Z]+")) {
setMessage(
String.format(
"Usually, an ISO-4217 currency ID consists only of capital ASCII letters ('A' to 'Z'). Are you sure that your currency ID \"%s\" is correct?",
currencyIdText.getText()
),
WARNING
);
} else if (currencySymbolText.getText().contains(" ") || currencySymbolText.getText().contains("\t")) {
setMessage(
String.format(
"The currency symbol \"%s\" contains white spaces! Are you sure that this is correct?",
currencySymbolText.getText()
),
WARNING
);
} else {
setMessage(null, WARNING);
}
}
}
public Currency createCurrency() {
return new Currency(currencyIdText.getText(), currencySymbolText.getText(), decimalDigitCountSpinner.getSelection());
}
}