/*
 * Copyright © 2000-2005 Canoo Engineering AG, Switzerland.
 */
package format;

import com.ulcjava.base.application.AbstractAction;
import com.ulcjava.base.application.AbstractApplication;
import com.ulcjava.base.application.IAction;
import com.ulcjava.base.application.ULCBoxPane;
import com.ulcjava.base.application.ULCButton;
import com.ulcjava.base.application.ULCFrame;
import com.ulcjava.base.application.ULCLabel;
import com.ulcjava.base.application.ULCTabbedPane;
import com.ulcjava.base.application.ULCTextField;
import com.ulcjava.base.application.datatype.ULCNumberDataType;
import com.ulcjava.base.application.event.ActionEvent;
import com.ulcjava.base.client.datatype.DataTypeConversionException;
import com.ulcjava.base.client.datatype.UINumberDataType;
import com.ulcjava.base.development.DevelopmentRunner;

import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

public class DollarInCurrencyDataTypeSnippet extends AbstractApplication {
	  public void start() {
	        ULCTextField textField = new ULCTextField(20);
	        ULCFCCCurrencyDataType dt = new ULCFCCCurrencyDataType(); 
	        
	        textField.setDataType(dt);
	        textField.setValue(new Double(50));
	        ULCBoxPane content = new ULCBoxPane(true);
	        content.add(textField);
	        content.add(new ULCButton(new ShowValueAction(textField)));
            ULCTabbedPane tab = new ULCTabbedPane();
            tab.add(content);
            tab.add(new ULCLabel("Label"));
            ULCFrame frame = new ULCFrame("DollarInCurrencyDataTypeSnippet");
            frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
            frame.add(tab);
            frame.setVisible(true);
	    }

	    private static class ShowValueAction extends AbstractAction {
	        private ULCTextField fTextField;

	        public ShowValueAction(ULCTextField textField) {
	            fTextField = textField;
	            putValue(IAction.NAME, "Show Value");
	        }

	        public void actionPerformed(ActionEvent event) {
	            Object value = fTextField.getValue();
	            System.out.println("value = " + value);
	            System.out.println("value.getClass() = " + (value == null ? null : value.getClass().getName()));
                fTextField.setEditable(!fTextField.isEditable());
            }
	    }

	    public static class ULCFCCCurrencyDataType extends ULCNumberDataType {
	        protected String typeString() {
	            return UIFCCCurrencyDataType.class.getName();
	        }
	    }

	    public static class UIFCCCurrencyDataType extends UINumberDataType {
	    	private static String DOLLARSIGN = "$";
	    	private static String currencySymbol = (new DecimalFormatSymbols(Locale.getDefault())).getCurrencySymbol();
	    	private static NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.getDefault()); 
	    	
	    	public Object convertToObject(String newString, Object previousValue) throws DataTypeConversionException {
	    		if (!currencySymbol.equals(DOLLARSIGN)) {
	    			return super.convertToObject(newString, previousValue);
	    		}
	    		StringBuffer sb = new StringBuffer();
	    		for (int i=0; i < newString.length(); i++) {
	    			if (newString.charAt(i) == '(') {
	    				sb.append('-');
	    			}
	    			if (currencySymbol.indexOf(newString.charAt(i)) == -1 && newString.charAt(i) != ')' && newString.charAt(i) != '(') {
	    				sb.append(newString.charAt(i));
	    			}
	    		}
	    		if (sb.length() == 1 && sb.charAt(0) == '-')
	    			newString = null;
	    		else
	    			newString = sb.toString();
	    		
	    		Object o = super.convertToObject(newString.trim(), previousValue);
	    	//	System.out.println("in toObject convert: " + newString + " " + previousValue + " " + o);
	    		return o;
	    	}

	    	public String convertToString(Object object, boolean forEditing) {
	    		if (!currencySymbol.equals(DOLLARSIGN)) {
	    			return super.convertToString(object, forEditing);
	    		}
	    		String s = super.convertToString(object, forEditing);
	    		String cs = s;
	    		if (s.length() != 0) {
	    			try {
	    				cs = currencyFormat.format(fConverter.convertToObject(s));
	    			} catch (DataTypeConversionException e) {
	    				e.printStackTrace();
	    			}
	    		}
	    		return cs;
	    	}
            
            protected void postInitializeState() {
                // TODO Auto-generated method stub
                super.postInitializeState();
                StringBuffer buf = new StringBuffer();
                for (int i = 0; i < fValidChars.length(); i++) {
                    if (fValidChars.charAt(i) != 'E' ||
                            fValidChars.charAt(i) != ',') {
                        buf.append(fValidChars.charAt(i));
                    }
                }
                buf.append(currencySymbol);
                buf.append(')');
                buf.append('(');
                fValidChars = buf.toString();
            }
	    }
	    
	    
	    
    
    public static void main(String[] args) {
    	Locale l = new Locale("fr", "CA");
    	l.setDefault(l);
        DevelopmentRunner.setApplicationClass(DollarInCurrencyDataTypeSnippet.class);
        DevelopmentRunner.main(args);
    }
}