
package uk.co.wingpath.modbusgui;

import java.io.*;
import uk.co.wingpath.event.*;
import uk.co.wingpath.util.*;
import uk.co.wingpath.modbus.*;
import uk.co.wingpath.xml.*;

public class BigValueSettings
    implements Xml.Savable, Variable<BigValueFlags>
{
    private BigValueFlags flags;

    private final ValueEventSource listeners;

    public BigValueSettings ()
    {
        flags = new BigValueFlags ();
        listeners = new ValueEventSource ();
    }

    public BigValueFlags getValue ()
    {
        return flags;
    }

    public void setValue (BigValueFlags flags)
    {
        if (!flags.equals (this.flags))
        {
            this.flags = flags;
            listeners.fireValueChanged (this);
        }
    }

    public void save (Xml.Saver saver)
        throws IOException
    {
        saver.saveValue ("littleendian",
            Boolean.toString (flags.getLittleEndian ()));
        saver.saveValue ("wordregisters",
            Boolean.toString (flags.getWordRegisters ()));
        saver.saveValue ("wordcount",
            Boolean.toString (flags.getWordCount ()));
    }

    public Xml.Loader getXmlLoader ()
    {
        return new XmlLoader ();
    }

    private class XmlLoader
        extends Xml.AbstractLoader
    {
        private boolean littleEndian = false;
        private boolean wordRegisters = false;
        private boolean wordCount = false;

        @Override
        public Xml.Loader startChild (String tag)
        {
            if (tag.equalsIgnoreCase ("littleendian"))
            {
                return new Xml.BooleanLoader (new Xml.Receiver<Boolean> ()
                {
                    public void receive (Boolean value)
                    {
                        littleEndian = value;
                    }
                });
            }

            if (tag.equalsIgnoreCase ("wordregisters"))
            {
                return new Xml.BooleanLoader (new Xml.Receiver<Boolean> ()
                {
                    public void receive (Boolean value)
                    {
                        wordRegisters = value;
                    }
                });
            }

            if (tag.equalsIgnoreCase ("wordcount"))
            {
                return new Xml.BooleanLoader (new Xml.Receiver<Boolean> ()
                {
                    public void receive (Boolean value)
                    {
                        wordCount = value;
                    }
                });
            }

            return null;
        }

        @Override
        public void end (String value)
            throws ValueException
        {
            if (!value.equals (""))
                throw new ValueException ("Value not allowed");
            flags = new BigValueFlags (littleEndian, wordRegisters, wordCount);
            listeners.fireValueChanged (this);
        }
    }

    public void addValueListener (ValueListener l)
    {
        listeners.addListener (l);
    }

    public void removeValueListener (ValueListener l)
    {
        listeners.removeListener (l);
    }
}


