/*
 * @(#)PointFormatter.java 4/26/2007
 *
 * Copyright 2002 - 2007 JIDE Software Inc. All rights reserved.
 */

package com.jidesoft.spinner;

import javax.swing.*;
import javax.swing.text.DefaultFormatter;
import java.awt.*;
import java.text.ParseException;

/**
 * @author Nako Ruru
 */
public class PointFormatter extends DefaultFormatter {

    private static JFormattedTextField.AbstractFormatter formatter;

    public synchronized static JFormattedTextField.AbstractFormatter getInstance() {
        if (formatter == null) {
            formatter = new PointFormatter();
        }
        return formatter;
    }

    private PointFormatter() {
        super();
    }

    @Override
    public Object stringToValue(String text) throws ParseException {
        text = text.trim();
        if (text.startsWith("(") && text.endsWith(")")) {
            text = text.substring(1, text.length() - 1);
        }
        try {
            String[] splition = text.split(",");
            return new Point(Integer.parseInt(splition[0].trim()), Integer.parseInt(splition[1].trim()));
        }
        catch (Exception e) {
            throw new ParseException(text, 0);
        }
    }

    @Override
    public String valueToString(Object value) throws ParseException {
        if (value instanceof Point) {
            Point point = (Point) value;
            return "(" + point.x + ", " + point.y + ")";
        }
        else {
            return super.valueToString(value);
        }
    }

    public static void main(String[] args) {
        Point point = new Point(5, -5);
        JFormattedTextField.AbstractFormatter formatter = PointFormatter.getInstance();
        String value;
        try {
            value = formatter.valueToString(point);
        }
        catch (ParseException e) {
            value = null;
        }
        System.out.println(value);
        value = "(3, -3)";
        try {
            point = (Point) formatter.stringToValue(value);
        }
        catch (ParseException e) {
            point = null;
        }
        System.out.println(point);
    }

}
