/*
 * Copyright © 2000-2005 Canoo Engineering AG, Switzerland.
 */
package com.canoo.ulc.playground.developerlist;

import com.ulcjava.base.application.AbstractApplication;
import com.ulcjava.base.application.ULCBoxPane;
import com.ulcjava.base.application.ULCButton;
import com.ulcjava.base.application.ULCFrame;
import com.ulcjava.base.application.ULCProxy;
import com.ulcjava.base.application.ULCTextField;
import com.ulcjava.base.application.datatype.ULCNumberDataType;
import com.ulcjava.base.application.event.ActionEvent;
import com.ulcjava.base.application.event.IActionListener;
import com.ulcjava.base.client.datatype.DataTypeConversionException;
import com.ulcjava.base.client.datatype.IDataType;
import com.ulcjava.base.client.datatype.UIDataType;
import com.ulcjava.base.development.DevelopmentRunner;
import com.ulcjava.base.server.IProxy;
import com.ulcjava.base.shared.internal.Anything;

import javax.swing.text.AttributeSet;

public class MyProxyDatatypeSnippet extends AbstractApplication {
    public void start() {
        ULCBoxPane content = new ULCBoxPane(true);

        ULCNumberDataType numberDataType = new ULCNumberDataType();
        final ULCMyProxyDataType proxyDataType = new ULCMyProxyDataType();
        proxyDataType.setDataType(numberDataType);

        ULCTextField textField = new ULCTextField();
        textField.setDataType(proxyDataType);
        content.add(ULCBoxPane.BOX_EXPAND_EXPAND, textField);

        ULCButton button = new ULCButton("Toggle datatype");
        button.addActionListener(new IActionListener() {
            public void actionPerformed(ActionEvent event) {
                proxyDataType.setActive(!proxyDataType.isActive());
            }
        });
        content.add(ULCBoxPane.BOX_EXPAND_EXPAND, button);

        ULCFrame frame = new ULCFrame("MyProxyDatatypeSnippet");
        frame.setDefaultCloseOperation(ULCFrame.TERMINATE_ON_CLOSE);
        frame.add(content);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        DevelopmentRunner.setApplicationClass(MyProxyDatatypeSnippet.class);
        DevelopmentRunner.main(args);
    }

    public static class ULCMyProxyDataType extends ULCProxy implements com.ulcjava.base.application.datatype.IDataType {
        private com.ulcjava.base.application.datatype.IDataType fDataType;
        private boolean fActive;

        public ULCMyProxyDataType() {
            fActive = false;
            fDataType = null;
        }

        public boolean isActive() {
            return fActive;
        }

        public void setActive(boolean active) {
            fActive = update("setActive", fActive, active);
        }

        public IProxy getDataType() {
            return fDataType;
        }

        public void setDataType(com.ulcjava.base.application.datatype.IDataType dataType) {
            fDataType = (com.ulcjava.base.application.datatype.IDataType) update("setDataType", fDataType, dataType);
        }

        protected void saveState(Anything a) {
            super.saveState(a);
            saveState(a, "active", fActive, false);
            saveState(a, "dataType", fDataType, null);
        }

        protected String typeString() {
            return UIMyProxyDataType.class.getName();
        }
    }

    public static class UIMyProxyDataType extends UIDataType {
        private boolean fActive;
        private IDataType fDataType;

        public UIMyProxyDataType() {
            fActive = false;
            fDataType = null;
        }

        public void handleRequest(String request, Anything args) {
            if ("setActive".equals(request)) {
                setActive(args.asBoolean(false));
            } else if ("setDataType".equals(request)) {
                setDataType(args);
            } else {
                super.handleRequest(request, args);
            }
        }


        public void restoreState(Anything args) {
            super.restoreState(args);

            if (args.isDefined("active")) {
                setActive(args.get("active").asBoolean(false));
            }
            if (args.isDefined("dataType")) {
                setDataType(args.get("dataType"));
            }
        }

        private void setActive(boolean active) {
            fActive = active;
        }

        private void setDataType(Anything args) {
            fDataType = (IDataType) getSession().getManaged(IDataType.class, args);
        }

        public Object convertToObject(String newString, Object previousValue) throws DataTypeConversionException {
            if (fActive) {
                return fDataType.convertToObject(newString, previousValue);
            } else {
                return super.convertToObject(newString, previousValue);
            }
        }

        public String convertToString(Object object, boolean forEditing) {
            if (fActive) {
                return fDataType.convertToString(object, forEditing);
            } else {
                return super.convertToString(object, forEditing);
            }
        }

        public String filterInput(int position, String newString, String currentText, AttributeSet attribute) {
            if (fActive) {
                return fDataType.filterInput(position, newString, currentText, attribute);
            } else {
                return super.filterInput(position, newString, currentText, attribute);
            }
        }

        public String filterInput(String newString) {
            if (fActive) {
                return fDataType.filterInput(newString);
            } else {
                return super.filterInput(newString);
            }
        }

        public String filterInput(String newString, String oldText) {
            if (fActive) {
                return fDataType.filterInput(newString, oldText);
            } else {
                return super.filterInput(newString, oldText);
            }
        }

        public Object getDefaultValue(String newString) {
            if (fActive) {
                return fDataType.getDefaultValue(newString);
            } else {
                return super.getDefaultValue(newString);
            }
        }
    }
}