All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.cuf.ui.builder.DataBindingBuilderDelegate Maven / Gradle / Ivy

The newest version!
package net.sf.cuf.ui.builder;

import net.sf.cuf.model.AspectAdapter;
import net.sf.cuf.model.BufferedValueHolder;
import net.sf.cuf.model.DelegateAccess;
import net.sf.cuf.model.ExternalUpdate;
import net.sf.cuf.model.IndexedAdapter;
import net.sf.cuf.model.LOVMapper;
import net.sf.cuf.model.MixedAccessAdapter;
import net.sf.cuf.model.MultiSelectionInList;
import net.sf.cuf.model.PropertiesAdapter;
import net.sf.cuf.model.SelectionInList;
import net.sf.cuf.model.ValueHolder;
import net.sf.cuf.model.ValueModel;
import net.sf.cuf.model.converter.FormatConverter;
import net.sf.cuf.model.converter.RegExpConverter;
import net.sf.cuf.model.converter.TypeConverter;
import net.sf.cuf.model.ui.ButtonModelAdapter;
import net.sf.cuf.model.ui.ComboBoxModelAdapter;
import net.sf.cuf.model.ui.DocumentAdapter;
import net.sf.cuf.model.ui.FilteringListModelAdapter;
import net.sf.cuf.model.ui.LOVAdapter;
import net.sf.cuf.model.ui.LabelAdapter;
import net.sf.cuf.model.ui.ListModelAdapter;
import net.sf.cuf.model.ui.ListTableMapper;
import net.sf.cuf.model.ui.MultiSelectionListModelAdapter;
import net.sf.cuf.model.ui.MultiSelectionTableModelAdapter;
import net.sf.cuf.model.ui.TableSelectionModel;
import net.sf.cuf.model.ui.ToolTipAdapter;
import net.sf.cuf.ui.table.TableFilterPlugin;
import org.jdom2.Element;

import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.text.JTextComponent;
import java.lang.reflect.Constructor;
import java.text.Format;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * The DataBindingBuilderDelegate class handles the "databinding" entry of
 * a xml2swing XML description.
 */
class DataBindingBuilderDelegate implements SwingXMLBuilder.BuilderDelegate
{
    /** the postfix for accessing the selection holder VM of a selection in list VM */
    private static final String SELECTION_HOLDER        = ".selectionHolder";
    /** the postfix for accessing the is index in list VM of a selection in list VM */
    private static final String IS_INDEX_IN_LIST_HOLDER = ".isIndexInList";
    /** the postfix for accessing the list VM of a selection in list VM */
    private static final String LIST_HOLDER             = ".listHolder";

    /**
     * Build the specific part of the delegate.
     * @param pBuilder the builder that controls the creation process
     * @param pDataBindingElement the JDOM element the delegate should handle, "databinding" in our case
     */
    public void build(final SwingXMLBuilder pBuilder, final Element pDataBindingElement)
    {
        List bindings= pDataBindingElement.getChildren();
        for (final Element element : bindings)
        {
            String objectType = element.getName();
            Object object = null;

            // get id
            String id = element.getAttributeValue(SwingXMLBuilder.ID_ATTRIBUTE);

            boolean found = true;
            try
            {
                if (objectType.equals(SwingXMLBuilder.VALUEHOLDER_ELEMENT))
                {
                    object = createValueHolder(element, id);
                }
                else if (objectType.equals(SwingXMLBuilder.BUFFEREDHOLDER_ELEMENT))
                {
                    object = createBufferdValueHolder(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.ASPECTADAPTER_ELEMENT))
                {
                    object = createAspectAdapter(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.INDEXEDADAPTER_ELEMENT))
                {
                    object = createIndexedAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.INDEXINLIST_ELEMENT))
                {
                    object = createIndexInList(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.PROPERTIESADAPTER_ELEMENT))
                {
                    object = createPropertiesAdapter(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.TYPECONVERTER_ELEMENT))
                {
                    object = createTypeConverter(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.FORMATCONVERTER_ELEMENT))
                {
                    object = createFormatConverter(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.REGEXPCONVERTER_ELEMENT))
                {
                    object = createRegexpConverter(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.CONVERTERINSYNC_ELEMENT))
                {
                    object = createConverterInSync(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.SELECTIONINLIST_ELEMENT))
                {
                    object = createSelectionInList(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.MULTISELECTIONINLIST_ELEMENT))
                {
                    object = createMultiSelectionInList(element, id, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.SETVALUE_ELEMENT))
                {
                    setValue(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.DOCUMENTADAPTER_ELEMENT))
                {
                    object = createDocumentAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.BUTTONADAPTER_ELEMENT))
                {
                    object = createButtonAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.COMBOBOXADAPTER_ELEMENT))
                {
                    object = createComboboxAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.LISTADAPTER_ELEMENT))
                {
                    object = createListAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.FILTERINGLISTADAPTER_ELEMENT))
                {
                    object = createFilteringListAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.TABLEADAPTER_ELEMENT))
                {
                    object = createTableAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.CHANGEACTION_ELEMENT))
                {
                    createListener(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.LOVMAPPER_ELEMENT))
                {
                    object = createLOVMapper(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.TOOLTIPADAPTER_ELEMENT))
                {
                    object = createToolTipAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.LABELADAPTER_ELEMENT))
                {
                    object = createLabelAdapter(element, pBuilder);
                }
                else if (objectType.equals(SwingXMLBuilder.LOVADAPTER_ELEMENT))
                {
                    object = createLOVAdapter(element, pBuilder);
                }
                else
                {
                    found = false;
                }
            }
            catch (IllegalArgumentException e)
            {
                throw SwingXMLBuilder.createException("problems during creating " + objectType,
                                                      e, element);
            }

            if (!found)
            {
                throw SwingXMLBuilder.createException("unknown data binding " + objectType,
                                                      element);
            }

            // put it in our builder's map
            if ((id != null) && (object != null))
            {
                if (pBuilder.getNameToNonVisual().containsKey(id))
                {
                    throw SwingXMLBuilder.createException("nonvisual with id " + id + " already defined", element);
                }
                else
                {
                    if (object instanceof ValueModel)
                    {
                        ((ValueModel) object).setName(id);
                    }
                    pBuilder.getNameToNonVisual().put(id, object);
                }
            }

            // check if we should connect the value model to another
            String externalUpdateRef = element.getAttributeValue(SwingXMLBuilder.EXT_UPD_REF_ATTRIBUTE);
            if (externalUpdateRef!=null && object instanceof ValueModel)
            {
                Object externalUpdateVM = pBuilder.getNameToNonVisual().get(externalUpdateRef);
                if (!(externalUpdateVM instanceof ExternalUpdate))
                {
                    throw SwingXMLBuilder.createException("external update ref with id " + externalUpdateRef + " supports no external update", element);
                }

                ((ValueModel) object).addChangeListener(new ExternalUpdateAdapter((ExternalUpdate)externalUpdateVM));
            }
        }
    }

    /**
     * Creates a new value holder.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new value holder
     */
    private Object createValueHolder(final Element pElement, final String pId) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);

        return new ValueHolder();
    }

    /**
     * Creates a new buffered value holder.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new buffered value holder
     */
    private Object createBufferdValueHolder(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);

        // get needed attributes
        String  subjectId= pElement.getAttributeValue(SwingXMLBuilder.SUBJECT_ATTRIBUTE);
        Object  subject  = pBuilder.getNonVisualObject(subjectId);
        String  triggerId= pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        Object  trigger  = pBuilder.getNonVisualObject(triggerId);
        boolean deepCopy = (pElement.getAttribute(SwingXMLBuilder.DEEPCOPY_ATTRIBUTE) != null);

        if (!(subject instanceof ValueModel))
            throw SwingXMLBuilder.createException("no subject found for "+subjectId, pElement);
        if (!(trigger instanceof ValueModel))
            throw SwingXMLBuilder.createException("no trigger found for "+triggerId, pElement);

        return new BufferedValueHolder((ValueModel)subject,(ValueModel)trigger,deepCopy);
    }

    /**
     * Creates a new aspect adapter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new aspect adapter
     */
    private Object createAspectAdapter(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        AspectAdapter aspectAdapter;

        // get needed attributes
        String  triggerId       = pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        Object  trigger         = pBuilder.getNonVisualObject(triggerId);
        String  getPrefix       = pElement.getAttributeValue(SwingXMLBuilder.GETPREFIX_ATTRIBUTE);
        String  setPrefix       = pElement.getAttributeValue(SwingXMLBuilder.SETPREFIX_ATTRIBUTE);
        String  access          = pElement.getAttributeValue(SwingXMLBuilder.ACCESS_ATTRIBUTE);

        if (!(trigger instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("no trigger found for "+triggerId, pElement);
        }

        Class sourceClass = SwingXMLBuilder.getClass(pElement);
        if (getPrefix==null) getPrefix= AspectAdapter.GET;
        if (setPrefix==null) setPrefix= AspectAdapter.SET;

        if (sourceClass==null)
            aspectAdapter= new AspectAdapter((ValueModel)trigger, access, getPrefix, setPrefix);
        else
            aspectAdapter= new AspectAdapter((ValueModel)trigger, sourceClass, access, getPrefix, setPrefix);

        return aspectAdapter;
    }

    /**
     * Creates a new indexed adapter value model.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new indexed adapter
     */
    private Object createIndexedAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String            triggerId     = pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        ValueModel     trigger       = getValueModel(pElement, triggerId, pBuilder);

        return (IndexedAdapter) new IndexedAdapter(trigger);
    }

    /**
     * Creates a new ValueModel for the index-in-sync value model of an indexed adapter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new index-in-list ValueModel
     */
    private Object createIndexInList(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        String         triggerId     = pElement.getAttributeValue(SwingXMLBuilder.REF_ATTRIBUTE);
        ValueModel  trigger       = getValueModel(pElement, triggerId, pBuilder);
        if (!(trigger instanceof IndexedAdapter))
        {
            throw SwingXMLBuilder.createException("no IndexedAdapter found for "+triggerId, pElement);
        }

        return ((IndexedAdapter)trigger).isIndexInList();
    }

    /**
     * Creates a new properties adapter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new prperties adapter
     */
    private Object createPropertiesAdapter(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        String key         = pElement.getAttributeValue(SwingXMLBuilder.KEY_ATTRIBUTE);
        String defaultValue= pElement.getAttributeValue(SwingXMLBuilder.DEFAULT_ATTRIBUTE);
        Object properties  = pBuilder.getNonVisualObject(
                                pElement.getAttributeValue(SwingXMLBuilder.REF_ATTRIBUTE));

        if (!(properties instanceof Properties))
        {
            throw SwingXMLBuilder.createException("not properties object found for "+key, pElement);
        }

        return new PropertiesAdapter((Properties)properties, key, defaultValue);
    }

    /**
     * Creates a new type converter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new type converter
     */
    private Object createTypeConverter(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId == null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        TypeConverter typeConverter;

        // get needed attributes
        String triggerId = pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        Object trigger = pBuilder.getNonVisualObject(triggerId);

        if (!(trigger instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("no trigger found for "+triggerId, pElement);
        }

        Class converterClass = SwingXMLBuilder.getClass(pElement);
        if (!TypeConverter.class.isAssignableFrom(converterClass))
        {
            throw SwingXMLBuilder.createException("class parameter (" +
                                                  converterClass.getName() +
                                                  ") is not a TypeConverter", pElement);
        }
        try
        {
            Constructor> constructor = ((Class>)converterClass).getConstructor(ValueModel.class);
            typeConverter = constructor.newInstance(trigger);
        }
        catch (Exception e)
        {
            throw SwingXMLBuilder.createException("Could not instantiate type converter " +
                                                  converterClass.getName(), e, pElement);
        }

        return typeConverter;
    }

    /**
     * Creates a new format converter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new format converter
     */
    private Object createFormatConverter(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId == null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        Format format;

        // get needed attributes
        String  triggerId= pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        Object  trigger  = pBuilder.getNonVisualObject(triggerId);
        boolean invert   = "true".equals(pElement.getAttributeValue(SwingXMLBuilder.INVERT_ATTRIBUTE));

        if (!(trigger instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("no trigger found for "+triggerId, pElement);
        }

        Class formatClass = SwingXMLBuilder.getClass(pElement);
        if (!Format.class.isAssignableFrom(formatClass))
        {
            throw SwingXMLBuilder.createException("class parameter (" +
                                                  formatClass.getClass().getName() +
                                                  ") is not a Format", pElement);
        }
        String formatString = pElement.getAttributeValue(SwingXMLBuilder.FORMAT_ATTRIBUTE);
        if (formatString == null)
        {
            try
            {
                format = (Format) formatClass.newInstance();
            }
            catch (Exception e)
            {
                throw SwingXMLBuilder.createException("Could not instantiate Format " +
                                                      formatClass.getClass().getName(), e, pElement);
            }
        }
        else
        {
            try
            {
                Constructor constructor = ((Class)formatClass).getConstructor(String.class);
                format = constructor.newInstance(formatString);
            }
            catch (Exception e)
            {
                throw SwingXMLBuilder.createException("Could not instantiate Format " +
                                                      formatClass.getClass().getName()+
                                                      " with format " + formatString, e, pElement);
            }
        }

        return new FormatConverter((ValueModel) trigger, format, invert);
    }

    /**
     * Creates a new regexp converter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new regexp converter
     */
    private Object createRegexpConverter(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId == null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);

        // get needed attributes
        String triggerId  = pElement.getAttributeValue(SwingXMLBuilder.TRIGGER_ATTRIBUTE);
        Object trigger    = pBuilder.getNonVisualObject(triggerId);
        String blockValue = pElement.getAttributeValue( SwingXMLBuilder.BLOCK_ATTRIBUTE);
        // (default for block is true)
        
        if (!(trigger instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("no trigger found for "+triggerId, pElement);
        }

        String formatString = pElement.getAttributeValue(SwingXMLBuilder.FORMAT_ATTRIBUTE);
        if (formatString == null)
        {
            throw SwingXMLBuilder.createException("no regexp found for "+triggerId, pElement);
        }
        else
        {
            try
            {
                if (blockValue==null)
                {
                    return new RegExpConverter((ValueModel) trigger, formatString);
                }
                else
                {
                    boolean block = "true".equals( blockValue);
                    return new RegExpConverter((ValueModel) trigger, formatString, block);
                }
            }
            catch (Exception e)
            {
                throw SwingXMLBuilder.createException("Could not instantiate RegExpConverter " +
                                                      " with regular expression " + formatString, e, pElement);
            }
        }

    }

    /**
     * Creates a new value model holding the sync information of a type converter value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new converter-in-sync ValueModel
     */
    private Object createConverterInSync(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        String         triggerId     = pElement.getAttributeValue(SwingXMLBuilder.REF_ATTRIBUTE);
        ValueModel  trigger       = getValueModel(pElement, triggerId, pBuilder);
        if (!(trigger instanceof TypeConverter))
        {
            throw SwingXMLBuilder.createException("no TypeConverter found for "+triggerId, pElement);
        }

        return ((TypeConverter)trigger).getSyncState();
    }

    /**
     * Creates a new selection in list value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new selection-in-list ValueModel
     */
    private Object createSelectionInList(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        String modelref  = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        Object listholder= pBuilder.getNonVisualObject(modelref);
        if (!(listholder instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("not a ValueModel found for "+modelref, pElement);
        }

        return new SelectionInList((ValueModel>)listholder);
    }

    /**
     * Creates a new multiple selection in list value model.
     * @param pElement element describing the object
     * @param pId value of the id attribute of pElement
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new multi-selection-in-list ValueModel
     */
    private Object createMultiSelectionInList(final Element pElement, final String pId, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("id of "+pElement.getName()+" must not be null", pElement);
        String modelref  = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        Object listholder= pBuilder.getNonVisualObject(modelref);
        if (!(listholder instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("not a ValueModel found for "+modelref, pElement);
        }

        return new MultiSelectionInList((ValueModel)listholder);
    }

    /**
     * Set a value in a ValueModel.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     */
    private void setValue(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        // determine the value
        Object     value;
        String     className    = pElement.getAttributeValue(SwingXMLBuilder.CLASS_ATTRIBUTE);
        String     booleanValue = pElement.getAttributeValue(SwingXMLBuilder.BOOLEAN_ATTRIBUTE);
        if (className!=null)
        {
            // use a new object as value
            try
            {
                value    = Class.forName(className).newInstance();
            }
            catch (Exception e)
            {
                throw SwingXMLBuilder.createException("Could not instantiate a object from " +
                                                      className, e, pElement);
            }
        }
        else if (booleanValue!=null)
        {
            value = Boolean.valueOf( booleanValue);
        }
        else
        {
            // use pcdata as value
            value= pElement.getText();
        }
        // determine the target of the setValue
        String     modelRef     = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        String     ref          = pElement.getAttributeValue(SwingXMLBuilder.REF_ATTRIBUTE);
        String     access       = pElement.getAttributeValue(SwingXMLBuilder.ACCESS_ATTRIBUTE);
        if ((modelRef==null && ref==null) || (modelRef!=null && ref!=null))
        {
            throw SwingXMLBuilder.createException( SwingXMLBuilder.SETVALUE_ELEMENT+
                    " must have either a "+SwingXMLBuilder.MODELREF_ATTRIBUTE+
                    " attribute or a "+SwingXMLBuilder.REF_ATTRIBUTE+" attribute",
                    pElement);
        }
        if (modelRef!=null)
        {
            ValueModel valueModel= getValueModel(pElement, modelRef, pBuilder);
            valueModel.setObjectValue(value);
        }
        else
        {
            Object target = pBuilder.getNonVisualObject( ref);
            if (target==null)
            {
                throw SwingXMLBuilder.createException( "Could not find a nonvisual object with id "+ref, pElement);
            }
            if (access==null)
            {
                throw SwingXMLBuilder.createException( "attribute "+SwingXMLBuilder.ACCESS_ATTRIBUTE+
                        " required with "+SwingXMLBuilder.REF_ATTRIBUTE);
            }
            MixedAccessAdapter accessAdapter = new MixedAccessAdapter( access);
            accessAdapter.setValue( target, value);
        }
    }

    /**
     * Creates an adapter between a ValueModel and a JTextComponent.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new document adapter
     */
    private Object createDocumentAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String              modelRef         = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel  valueModel       = (ValueModel)getValueModel(pElement, modelRef, pBuilder);
        String              textComponentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object              textComponent    = pBuilder.getComponentByAnyName(textComponentName);
        if (!(textComponent instanceof JTextComponent))
        {
            throw SwingXMLBuilder.createException("no JTextComponent found for "+textComponentName, pElement);
        }

        return new DocumentAdapter(valueModel, (JTextComponent)textComponent);
    }

    /**
     * Creates an adapter between a ValueModel and a AbstractButton.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new button adapter
     */
    private Object createButtonAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String              modelRef           = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel valueModel         = (ValueModel)getValueModel(pElement, modelRef, pBuilder);
        String              buttonComponentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object              buttonComponent    = pBuilder.getComponentByAnyName(buttonComponentName);
        String              invert             = pElement.getAttributeValue(SwingXMLBuilder.INVERT_ATTRIBUTE);
        if (!(buttonComponent instanceof AbstractButton))
        {
            throw SwingXMLBuilder.createException("no AbstractButton found for "+buttonComponentName, pElement);
        }


        return new ButtonModelAdapter(valueModel,
                                      ((AbstractButton)buttonComponent).getModel(),
                                      "true".equals(invert));
    }

    /**
     * Creates an adapter between a ValueModel and a JComboBox.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new combobox adapter
     */
    private Object createComboboxAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String              modelRef             = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel valueModel           = (ValueModel)getValueModel(pElement, modelRef, pBuilder);
        String              comboboxComponentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object              comboboxComponent    = pBuilder.getComponentByAnyName(comboboxComponentName);
        if (!(comboboxComponent instanceof JComboBox))
        {
            throw SwingXMLBuilder.createException("no JComboBox found for "+comboboxComponentName, pElement);
        }

        return new ComboBoxModelAdapter(valueModel, ((JComboBox)comboboxComponent).getModel());
    }

    /**
     * Creates an adapter between a SelectionInList ValueModel and a JList.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new list adapter
     */
    private Object createListAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String         modelRef             = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel  selectionValueModel  = getValueModel(pElement, modelRef, pBuilder);

        String         accessRef            = pElement.getAttributeValue(SwingXMLBuilder.ACCESSREF_ATTRIBUTE);
        DelegateAccess accessValueModel     = null;
        if (accessRef != null)
        {
            accessValueModel= getDelegateAccess(pElement, accessRef, pBuilder);
        }

        String listComponentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object listComponent    = pBuilder.getComponentByAnyName(listComponentName);

        if (listComponent instanceof JList)
        {
            if (selectionValueModel instanceof SelectionInList)
            {
                return new ListModelAdapter((JList) listComponent,
                        (SelectionInList) selectionValueModel,
                        accessValueModel);
            }
            else if (selectionValueModel instanceof MultiSelectionInList)
            {
                return new MultiSelectionListModelAdapter((JList) listComponent,
                        (MultiSelectionInList) selectionValueModel,
                        accessValueModel);
            }
            else 
            {
                throw SwingXMLBuilder.createException("no SelectionInList or MultiSelectionInList ValueModel found for "+modelRef, pElement);
            }

        }
        else if (listComponent instanceof JComboBox)
        {
            if (!(selectionValueModel instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException("no SelectionInList ValueModel found for "+modelRef, pElement);
            }
            
            return new ListModelAdapter((JComboBox) listComponent,
                                        (SelectionInList) selectionValueModel,
                                        accessValueModel);
        }
        else
        {
            throw SwingXMLBuilder.createException("no JList or JComboBox found for "+listComponentName, pElement);
        }
    }

    /**
     * Creates an filtering adapter between a SelectionInList ValueModel and a JComboBox.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new list adapter
     */
    private Object createFilteringListAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String         modelRef             = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel     selectionValueModel  = getValueModel(pElement, modelRef, pBuilder);

        String         accessRef            = pElement.getAttributeValue(SwingXMLBuilder.ACCESSREF_ATTRIBUTE);
        DelegateAccess accessValueModel     = null;
        if (accessRef != null)
        {
            accessValueModel= getDelegateAccess(pElement, accessRef, pBuilder);
        }

        String listComponentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object listComponent    = pBuilder.getComponentByAnyName(listComponentName);

        if (listComponent instanceof JComboBox)
        {
            if (!(selectionValueModel instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException("no SelectionInList ValueModel found for "+modelRef, pElement);
            }

            selectionValueModel.setValue(new ArrayList());
            return new FilteringListModelAdapter((JComboBox) listComponent,
                                                 (SelectionInList) selectionValueModel,
                                                 accessValueModel);
        }
        else
        {
            throw SwingXMLBuilder.createException("no JComboBox found for " + listComponentName, pElement);
        }
    }

    /**
     * Creates a TableSelectionModel or a ListTableMapper adapter between a ValueModel and a JTable.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the new table adapter
     */
    private Object createTableAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String              modelRef    = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel       valueModel  = getValueModel(pElement, modelRef, pBuilder);
        String              tableName   = pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object              table       = pBuilder.getComponentByAnyName(tableName);
        TableFilterPlugin   tableFilter = null;

        if (!(table instanceof JTable))
        {
            throw SwingXMLBuilder.createException("no JTable found for "+tableName, pElement);
        }

        //Searching for the optional implementation of the TableFilterPlugin, to enable the filtering
        Class filterEntryClass = SwingXMLBuilder.getClass(pElement, SwingXMLBuilder.FILTER_CLASS_ATTRIBUTE);
        if (filterEntryClass!=null)
        {
            if (!TableFilterPlugin.class.isAssignableFrom(filterEntryClass))
            {
                throw SwingXMLBuilder.createException("parameter " + SwingXMLBuilder.FILTER_CLASS_ATTRIBUTE + " (" +
                                                      filterEntryClass.getName() +
                                                      ") is not a TypeConverter", pElement);
            }

            try
            {
                tableFilter = (TableFilterPlugin) filterEntryClass.newInstance();
            }
            catch (Exception e)
            {
                throw SwingXMLBuilder.createException("Could not instantiate type converter " +
                                                      filterEntryClass.getName(), e, pElement);
            }
        }

        // we generate a TableSelectionModel if there is a class attribute,
        // and a ListTableMapper if not, only the TableSelectionModel supports editing a column
        Object back;
        Class  listEntryClass= SwingXMLBuilder.getClass(pElement);
        if (listEntryClass!=null)
        {
            /*
             * case TableSelectionModel
             */
            if (!(valueModel instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException("no ValueModel of type SelectionInList found for "+modelRef, pElement);
            }

            // check if table is sortable
            boolean sortable= "true".equals(pElement.getAttributeValue(SwingXMLBuilder.SORTABLE_ATTRIBUTE));

            // build mapping
            List                     mappingElements= pElement.getChildren(SwingXMLBuilder.COLUMN_ELEMENT);
            List mappings       = new ArrayList(mappingElements.size());
            for (final Element element : mappingElements)
            {
                StringBuilder errorInfo = new StringBuilder();
                try
                {
                    String  attributName= element.getAttributeValue(SwingXMLBuilder.ACCESS_ATTRIBUTE);
                    errorInfo.append("\nattributName :").append(attributName);
                    String  isEditable= element.getAttributeValue(SwingXMLBuilder.EDITABLE_ATTRIBUTE);
                    errorInfo.append("\nisEditable :").append(isEditable);
                    String  columnTitle = pBuilder.getTitle(element);
                    errorInfo.append("\ncolumnTitle :").append(columnTitle);
                    String  columnAlignment = element.getAttributeValue(SwingXMLBuilder.ALIGN_ATTRIBUTE);
                    errorInfo.append("\ncolumnAlignment :").append(columnAlignment);
                    Class columnClass = SwingXMLBuilder.getClass(element);
                    errorInfo.append("\ncolumnClass :").append(columnClass);

                    TableSelectionModel.Mapping mapping= new TableSelectionModel.Mapping(
                            attributName, Boolean.valueOf(isEditable),
                            columnTitle, columnAlignment, columnClass);
                    mappings.add(mapping);
                }
                catch (Exception e)
                {
                    throw SwingXMLBuilder.createException("could not read mapping for the tableadapter"+
                                                          errorInfo.toString(),
                                                          e, element);
                }
            }

            // create adapter

            back= new TableSelectionModel(
                    (JTable)table, (SelectionInList)valueModel,
                    listEntryClass, mappings, sortable, tableFilter);
        }
        else
        {
            /*
             * case ListTableMapper
             */
            if (!(valueModel instanceof SelectionInList || valueModel instanceof MultiSelectionInList))
            {
                throw SwingXMLBuilder.createException("no ValueModel of type SelectionInList or MultiSelectionInList found for "+modelRef, pElement);
            }

            // check if table is sortable
            boolean sortable= "true".equals(pElement.getAttributeValue(SwingXMLBuilder.SORTABLE_ATTRIBUTE));

            // build mapping
            List                 mappingElements= pElement.getChildren(SwingXMLBuilder.COLUMN_ELEMENT);
            List mappings       = new ArrayList(mappingElements.size());
            for (final Element element : mappingElements)
            {
                try
                {
                    String         columnTitle          = pBuilder.getTitle(element);
                    String         columnAlignment      = element.getAttributeValue(SwingXMLBuilder.ALIGN_ATTRIBUTE);
                    Class       columnClass          = SwingXMLBuilder.getClass(element);
                    String         columnPrefWidth      = element.getAttributeValue(SwingXMLBuilder.PREF_WIDTH_ATTRIBUTE);
                    String         columnModelRef       = element.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
                    DelegateAccess columnValueModel     = getDelegateAccess(element, columnModelRef, pBuilder);
                    String         columnModelSortRef   = element.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
                    DelegateAccess columnValueModelSort = (DelegateAccess)pBuilder.getNonVisualObject(columnModelSortRef);
                    boolean        columnSortable       = "true".equals(element.getAttributeValue(SwingXMLBuilder.SORTABLE_ATTRIBUTE));
                    String         columnComparatorClass= element.getAttributeValue(SwingXMLBuilder.COMPARATORCLASS_ATTRIBUTE);
                    boolean        columnEditable       = "true".equals(element.getAttributeValue(SwingXMLBuilder.EDITABLE_ATTRIBUTE));

                    ListTableMapper.Mapping mapping=
                            new ListTableMapper.Mapping(columnTitle,
                                                        columnAlignment,
                                                        columnPrefWidth,
                                                        columnClass,
                                                        columnValueModel,
                                                        columnValueModelSort,
                                                        columnSortable,
                                                        columnComparatorClass,
                                                        columnEditable);
                    mappings.add(mapping);
                }
                catch (Exception e)
                {
                    throw SwingXMLBuilder.createException("could not read mapping for the tableadapter",
                                                          e, element);
                }
            }

            // get column for initial sorting
            String      columnInitialSorting   = pElement.getAttributeValue(SwingXMLBuilder.INITIAL_SORTING_COLUMN_ATTRIBUTE);
            int         columnForInitialSorting= -1;
            try
            {
                columnForInitialSorting = Integer.parseInt(columnInitialSorting);
            }
            catch (Exception e)
            {
                // ignore exception -> no initial sorting for this table
            }

            // create adapter
            if (valueModel instanceof SelectionInList)
            {
                back= new ListTableMapper((JTable)table,
                                   (SelectionInList)valueModel,
                                   mappings,
                                   sortable,
                                   columnForInitialSorting,
                                   tableFilter);
            }
            else
            {
                back= new MultiSelectionTableModelAdapter((JTable)table,
                                                  (MultiSelectionInList)valueModel,
                                                  mappings,
                                                  sortable,
                                                  columnForInitialSorting,
                                                  tableFilter);
            }
        }

        if(tableFilter != null)
        {
            tableFilter.setupFilter((JTable) table);
        }

        return back;
    }

    /**
     * Connects a dependent to a ValueModel.
     * @param pElement element describing the object
     * @param pBuilder our builder
     */
    private void createListener(final Element pElement, final SwingXMLBuilder pBuilder)
    {
        String         source    = pElement.getAttributeValue(SwingXMLBuilder.SOURCE_ATTRIBUTE);
        ValueModel  valueModel= getValueModel(pElement, source, pBuilder);
        String         targetName= pElement.getAttributeValue(SwingXMLBuilder.TARGET_ATTRIBUTE);
        Object         target    = pBuilder.getNonVisualObject(targetName);
        String         methodName= pElement.getAttributeValue(SwingXMLBuilder.METHOD_ATTRIBUTE);

        if (target == null)
        {
            throw SwingXMLBuilder.createException("no target object found for "+targetName, pElement);
        }

        valueModel.onChangeSend(target, methodName);
    }

    /**
     * Creates and returns a LOVMapper object.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the list-of-values mapper
     */
    private Object createLOVMapper(final Element pElement, final SwingXMLBuilder pBuilder)
    {
        String                lovsRef   = pElement.getAttributeValue(SwingXMLBuilder.LOVSREF_ATTRIBUTE);
        ValueModel[]> lofsHolder= (ValueModel[]>)getValueModel(pElement, lovsRef, pBuilder);
        String                modelRef  = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel         domainVM  = getValueModel(pElement, modelRef, pBuilder);

        return new LOVMapper(lofsHolder, domainVM);
    }

    /**
     * Creates an adapter between a ValueModel and a the tooltip of a JComponent.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the tool tip adapter
     */
    private Object createToolTipAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String         modelRef     = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel  valueModel   = getValueModel(pElement, modelRef, pBuilder);
        String         componentName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object         component    = pBuilder.getComponentByAnyName(componentName);
        if (!(component instanceof JComponent))
        {
            throw SwingXMLBuilder.createException("no JComponent found for "+componentName, pElement);
        }

        return new ToolTipAdapter(valueModel, (JComponent)component);
    }

    /**
     * Creates an adapter between a ValueModel and a JLabel.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the label adapter
     */
    private Object createLabelAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String         modelRef  = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel  valueModel= getValueModel(pElement, modelRef, pBuilder);
        String         labelName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        Object         label    = pBuilder.getComponentByAnyName(labelName);
        if (!(label instanceof JLabel))
        {
            throw SwingXMLBuilder.createException("no JLabel found for "+labelName, pElement);
        }

        return new LabelAdapter(valueModel, (JLabel)label);
    }

    /**
     * Creates an adapter between a ValueModel and some Lists/ValueModels and a
     * JComboBox or a JList.
     * @param pElement element describing the object
     * @param pBuilder our builder
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     * @return the list-of-values adapter
     */
    private Object createLOVAdapter(final Element pElement, final SwingXMLBuilder pBuilder) throws IllegalArgumentException
    {
        String         modelRef  = pElement.getAttributeValue(SwingXMLBuilder.MODELREF_ATTRIBUTE);
        ValueModel  valueModel= getValueModel(pElement, modelRef, pBuilder);
        String         widgetName= pElement.getAttributeValue(SwingXMLBuilder.WIDGETREF_ATTRIBUTE);
        JComponent     widget    = pBuilder.getComponentByAnyName(widgetName);
        if (!((widget instanceof JComboBox) || (widget instanceof JList)))
        {
            if (widget==null)
            {
                throw SwingXMLBuilder.createException("no JComboBox/JList/ButtonGroup found for "+widgetName, pElement);
            }
            Object buttonGroup= widget.getClientProperty(SwingXMLBuilder.BUTTONGROUP_PROPERTY);
            if (!(buttonGroup instanceof ButtonGroup))
            {
                throw SwingXMLBuilder.createException("no JComboBox/JList/ButtonGroup found for "+widgetName, pElement);
            }
        }

        String itemsRef  = pElement.getAttributeValue(SwingXMLBuilder.ITEMSREF_ATTRIBUTE);
        String keysRef   = pElement.getAttributeValue(SwingXMLBuilder.KEYSREF_ATTRIBUTE);
        String items     = pElement.getAttributeValue(SwingXMLBuilder.ITEMS_ATTRIBUTE);
        String keys      = pElement.getAttributeValue(SwingXMLBuilder.KEYS_ATTRIBUTE);

        boolean             useVMs;
        List             itemList= null;
        List             keyList = null;
        ValueModel> itemsVM = null;
        ValueModel> keysVM  = null;
        if (itemsRef==null && keysRef==null && items!=null && keys!=null)
        {
            // use two lists as item/key provider
            Object itemL= pBuilder.getNonVisualObject(items);
            if (!(itemL instanceof List))
            {
                throw SwingXMLBuilder.createException("no item List found for "+items, pElement);
            }
            Object keyL= pBuilder.getNonVisualObject(keys);
            if (!(keyL instanceof List))
            {
                throw SwingXMLBuilder.createException("no key List found for "+keys, pElement);
            }
            useVMs  = false;
            itemList= (List)itemL;
            keyList = (List)keyL;
        }
        else if (itemsRef!=null && keysRef!=null && items==null && keys==null)
        {
            // use two value models as item/key provider
            useVMs = true;
            itemsVM= (ValueModel>)getValueModel(pElement, itemsRef, pBuilder);
            keysVM = (ValueModel>)getValueModel(pElement, keysRef, pBuilder);
        }
        else
        {
            throw SwingXMLBuilder.createException("either the itemsref/keysref or the " +
                                                  "items/keys attributes must be used", pElement);
        }

        Object unselected= pBuilder.getNonVisualObject(
                pElement.getAttributeValue(SwingXMLBuilder.UNSELECTED_ATTRIBUTE));

        if (widget instanceof JComboBox)
        {
            if (useVMs)
                return new LOVAdapter((JComboBox)widget, itemsVM, keysVM, valueModel, unselected);
            else
                return new LOVAdapter((JComboBox)widget, itemList, keyList, valueModel, unselected);
        }
        else if (widget instanceof JList)
        {
            if (useVMs)
                return new LOVAdapter((JList)widget, itemsVM, keysVM, valueModel, unselected);
            else
                return new LOVAdapter((JList)widget, itemList, keyList, valueModel, unselected);
        }
        else
        {
            ButtonGroup buttongroup = (ButtonGroup) widget.getClientProperty(SwingXMLBuilder.BUTTONGROUP_PROPERTY);
            if (useVMs)
                return new LOVAdapter(buttongroup, itemsVM, keysVM, valueModel, unselected);
            else
                return new LOVAdapter(buttongroup, itemList, keyList, valueModel, unselected);
        }
    }

    /**
     * Get a DelegateAccess object from pBuilder by name.
     * @param pElement element describing the object
     * @param pId id of the DelegateAccess
     * @param pBuilder our builder
     * @return a DelegateAccess, never null
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     */
    private DelegateAccess getDelegateAccess(final Element pElement, final String pId, final SwingXMLBuilder pBuilder)
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("value model id of "+pElement.getName()+" must not be null", pElement);

        Object delegateAccess= pBuilder.getNonVisualObject(pId);
        if (!(delegateAccess instanceof DelegateAccess))
        {
            throw SwingXMLBuilder.createException("The accessref '"+pId+
                                                  "' is no 'DelegateAccess' type", pElement);
        }

        return (DelegateAccess)delegateAccess;
    }

    /**
     * Get a ValueModel object from pBuilder by name, for a SelectionInList ValueModel
     * the ValueModel of the selectionHolder, isIndexInList and listHolder attributes
     * are suppored.
     * @param pElement element describing the object
     * @param pId id of the value model
     * @param pBuilder our builder
     * @return a value model, never null
     * @throws IllegalArgumentException if we have a problem (parameters, ...)
     */
    private ValueModel getValueModel(final Element pElement, final String pId, final SwingXMLBuilder pBuilder)
    {
        if (pId==null)
            throw SwingXMLBuilder.createException("value model id of "+pElement.getName()+" must not be null", pElement);

        if (pId.endsWith(SELECTION_HOLDER))
        {
            String baseVM= pId.substring(0, pId.lastIndexOf(SELECTION_HOLDER));
            ValueModel vm= getValueModel(pElement, baseVM, pBuilder);
            if (!(vm instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException(baseVM+ "is no SelectionInList", pElement);
            }
            return ((SelectionInList)vm).selectionHolder();
        }

        if (pId.endsWith(IS_INDEX_IN_LIST_HOLDER))
        {
            String baseVM= pId.substring(0, pId.lastIndexOf(IS_INDEX_IN_LIST_HOLDER));
            ValueModel vm= getValueModel(pElement, baseVM, pBuilder);
            if (!(vm instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException(baseVM+ "is no SelectionInList", pElement);
            }
            return ((SelectionInList)vm).isIndexInList();
        }

        if (pId.endsWith(LIST_HOLDER))
        {
            String baseVM= pId.substring(0, pId.lastIndexOf(LIST_HOLDER));
            ValueModel vm= getValueModel(pElement, baseVM, pBuilder);
            if (!(vm instanceof SelectionInList))
            {
                throw SwingXMLBuilder.createException(baseVM+ "is no SelectionInList", pElement);
            }
            return ((SelectionInList)vm).listHolder();
        }

        Object valueModel= pBuilder.getNonVisualObject(pId);
        if (!(valueModel instanceof ValueModel))
        {
            throw SwingXMLBuilder.createException("no ValueModel found for "+pId, pElement);
        }

        return (ValueModel)valueModel;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy