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

org.nakedobjects.plugins.dnd.viewer.builder.CollectionElementBuilder Maven / Gradle / Ivy

The newest version!
package org.nakedobjects.plugins.dnd.viewer.builder;

import java.util.Enumeration;

import org.apache.log4j.Logger;
import org.nakedobjects.metamodel.adapter.NakedObject;
import org.nakedobjects.metamodel.commons.ensure.Assert;
import org.nakedobjects.metamodel.spec.feature.OneToManyAssociation;
import org.nakedobjects.plugins.dnd.CollectionContent;
import org.nakedobjects.plugins.dnd.CompositeViewSpecification;
import org.nakedobjects.plugins.dnd.Content;
import org.nakedobjects.plugins.dnd.OneToManyField;
import org.nakedobjects.plugins.dnd.SubviewSpec;
import org.nakedobjects.plugins.dnd.View;
import org.nakedobjects.plugins.dnd.ViewAxis;
import org.nakedobjects.plugins.dnd.viewer.content.CollectionElement;
import org.nakedobjects.plugins.dnd.viewer.content.OneToManyFieldElementImpl;
import org.nakedobjects.plugins.dnd.viewer.view.simple.CompositeViewUsingBuilder;


public class CollectionElementBuilder extends AbstractViewBuilder {
    private static final Logger LOG = Logger.getLogger(CollectionElementBuilder.class);
    private boolean canDragView = true;
    private final SubviewSpec subviewDesign;

    public CollectionElementBuilder(final SubviewSpec subviewDesign) {
        this.subviewDesign = subviewDesign;
    }

    @Override
    public void build(final View view) {
        Assert.assertEquals(view.getView(), view);

        final Content content = view.getContent();
        final OneToManyAssociation field = content instanceof OneToManyField ? ((OneToManyField) content)
                .getOneToManyAssociation() : null;

        LOG.debug("rebuild view " + view + " for " + content);

        final CollectionContent collectionContent = ((CollectionContent) content);
        Enumeration elements;
        elements = collectionContent.allElements();

        /*
         * remove all subviews from the view and then work through the elements of the collection adding in a
         * view for each element. Where a subview for the that element already exists it should be reused.
         */
        final View[] subviews = view.getSubviews();
        final NakedObject[] existingElements = new NakedObject[subviews.length];
        for (int i = 0; i < subviews.length; i++) {
            view.removeView(subviews[i]);
            existingElements[i] = subviews[i].getContent().getNaked();
        }

        int fieldNumber = 0;
        while (elements.hasMoreElements()) {
            final NakedObject element = (NakedObject) elements.nextElement();
            View elementView = null;
            for (int i = 0; i < subviews.length; i++) {
                if (existingElements[i] == element) {
                    elementView = subviews[i];
                    existingElements[i] = null;
                    break;
                }
            }
            if (elementView == null) {
                Content elementContent;
                if (field == null) {
                    elementContent = new CollectionElement(element);
                } else {
                    final NakedObject obj = ((OneToManyField) view.getContent()).getParent();
                    // Naked obj = view.getParent().getContent().getNaked();
                    final NakedObject parent = obj;
                    elementContent = new OneToManyFieldElementImpl(parent, element, field);
                }
                elementView = subviewDesign.createSubview(elementContent, view.getViewAxis(), fieldNumber++);
            }
            if (elementView != null) {
                view.addView(decorateSubview(elementView));
            }
        }
    }

    public View decorateSubview(View subview) {
        return subviewDesign.decorateSubview(subview);
    }
    
    public View createCompositeView(final Content content, final CompositeViewSpecification specification, final ViewAxis axis) {
        final CompositeViewUsingBuilder view = new CompositeViewUsingBuilder(content, specification, axis);
        view.setCanDragView(canDragView);
        return view;
    }

    public void setCanDragView(final boolean canDragView) {
        this.canDragView = canDragView;
    }
}
// Copyright (c) Naked Objects Group Ltd.




© 2015 - 2025 Weber Informatics LLC | Privacy Policy