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

org.efaps.ui.wicket.components.tree.SubElement Maven / Gradle / Ivy

/*
 * Copyright 2003 - 2011 The eFaps Team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * Revision:        $Rev: 7970 $
 * Last Changed:    $Date: 2012-09-14 17:08:01 -0500 (Fri, 14 Sep 2012) $
 * Last Changed By: $Author: [email protected] $
 */

package org.efaps.ui.wicket.components.tree;

import java.util.Iterator;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.PageReference;
import org.apache.wicket.extensions.markup.html.repeater.tree.AbstractTree.State;
import org.apache.wicket.extensions.markup.html.repeater.tree.NestedTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.nested.BranchItem;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.IItemFactory;
import org.apache.wicket.markup.repeater.IItemReuseStrategy;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.RefreshingView;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.efaps.ui.wicket.components.table.cell.CellPanel;
import org.efaps.ui.wicket.models.UIModel;
import org.efaps.ui.wicket.models.cell.UIStructurBrowserTableCell;
import org.efaps.ui.wicket.models.cell.UITableCell;
import org.efaps.ui.wicket.models.objects.UIStructurBrowser;
import org.efaps.ui.wicket.models.objects.UITable;
import org.efaps.ui.wicket.pages.content.AbstractContentPage;
import org.efaps.ui.wicket.pages.contentcontainer.ContentContainerPage;
import org.efaps.util.EFapsException;

/**
 * TODO comment!
 *
 * @author The eFaps Team
 * @version $Id: SubElement.java 7970 2012-09-14 22:08:01Z [email protected] $
 */
public class SubElement
    extends Panel
{

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private NestedTree tree;

    /**
     * @param _id
     * @param _tree
     * @param _model
     */
    public SubElement(final String _id,
                      final NestedTree _tree,
                      final IModel _model)
    {
        super(_id, _model);

        if (_tree == null)
        {
            throw new IllegalArgumentException("argument [tree] cannot be null");
        }
        this.tree = _tree;

        final RefreshingView branches = new RefreshingView("branches")
        {

            private static final long serialVersionUID = 1L;

            @Override
            protected Iterator> getItemModels()
            {
                return new ModelIterator();
            }

            @Override
            protected Item newItem(final String id,
                                                      final int index,
                                                      final IModel model)
            {
                return newBranchItem(id, index, model);
            }

            @Override
            protected void populateItem(final Item item)
            {
                try {
                    populateBranch(item);
                } catch (final EFapsException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        };
        branches.setItemReuseStrategy(new IItemReuseStrategy()
        {

            private static final long serialVersionUID = 1L;

            public  Iterator> getItems(final IItemFactory factory,
                                                  final Iterator> newModels,
                                                  final Iterator> existingItems)
            {
                return SubElement.this.tree.getItemReuseStrategy().getItems(factory, newModels, existingItems);
            }
        });
        add(branches);
    }

    @SuppressWarnings("unchecked")
    public IModel getModel()
    {
        return (IModel) getDefaultModel();
    }

    public UIStructurBrowser getModelObject()
    {
        return getModel().getObject();
    }

    protected BranchItem newBranchItem(final String id,
                                                          final int index,
                                                          final IModel model)
    {
        return new BranchItem(id, index, model);
    }

    protected void populateBranch(final Item _item)
        throws EFapsException
    {
        final IModel model = _item.getModel();
        final UIStructurBrowser strucBrws = model.getObject();
        final RepeatingView cellsBeforeRepeater = new RepeatingView("cellsBeforeRepeater");
        _item.add(cellsBeforeRepeater);
        final RepeatingView cellsAfterRepeater = new RepeatingView("cellsAfterRepeater");
        _item.add(cellsAfterRepeater);

        int i = strucBrws.getTableId();

        if (strucBrws.isShowCheckBoxes()) {
            final CellPanel cell = new CellPanel(cellsBeforeRepeater.newChildId(), strucBrws.getInstanceKey());
            cell.add(AttributeModifier.append("class", "eFapsTableCellClear"));
            cell.add(AttributeModifier.append("class", "eFapsTableCheckBoxCell eFapsCellFixedWidth" + i));
            cell.setOutputMarkupId(true);
            cellsBeforeRepeater.add(cell);
            i++;
        }
        final PageReference pageRef = ((AbstractContentPage) getPage()).getCalledByPageReference();
        boolean updateMenu = false;
        if (pageRef != null && pageRef.getPage() instanceof ContentContainerPage) {
            updateMenu = true;
        }
        boolean firstCell = true;
        boolean before = true;
        for (final UIStructurBrowserTableCell uiCell : strucBrws.getColumns()) {
            final Component cell;
            if (uiCell.isBrowserField()) {
                before = false;
                cell = SubElement.this.tree.newNodeComponent("node", model);
                _item.add(cell);
            } else {
                RepeatingView repeater;
                if (before) {
                    repeater = cellsBeforeRepeater;
                } else {
                    repeater = cellsAfterRepeater;
                }
                cell = new CellPanel(repeater.newChildId(), new UIModel(uiCell),
                                updateMenu, new UITable(strucBrws.getCommandUUID(), strucBrws.getInstanceKey()), 0);
                cell.setOutputMarkupId(true);
                repeater.add(cell);
            }
            if (i == strucBrws.getTableId()) {
                cell.add(AttributeModifier.append("class", "eFapsTableCellClear"));
            }
            if (uiCell.isFixedWidth()) {
                if (firstCell) {
                    firstCell = false;
                    cell.add(AttributeModifier.append("class", "eFapsTableFirstCell eFapsTableCell"
                                    + " eFapsCellFixedWidth" + i));
                } else {
                    cell.add(AttributeModifier.append("class", "eFapsTableCell eFapsCellFixedWidth" + i));
                }
            } else {
                if (firstCell) {
                    firstCell = false;
                    cell.add(AttributeModifier.append("class", "eFapsTableFirstCell eFapsTableCell"
                                    + " eFapsCellWidth" + i));
                } else {
                    cell.add(AttributeModifier.append("class", "eFapsTableCell eFapsCellWidth" + i));
                }
            }
            i++;
        }
        _item.add(SubElement.this.tree.newSubtree("subtree", model));
    }

    @Override
    public boolean isVisible()
    {
        boolean ret = true;
        final UIStructurBrowser t = getModel().getObject();
        if (t != null) {
            // roots always visible
            ret = this.tree.getState(t) == State.EXPANDED;
        }
        return ret;
    }

    private final class ModelIterator
        implements Iterator>
    {

        private Iterator children;

        public ModelIterator()
        {
            final UIStructurBrowser t = getModel().getObject();
            if (t == null) {
                this.children = SubElement.this.tree.getProvider().getRoots();
            } else {
                this.children = SubElement.this.tree.getProvider().getChildren(t);
            }
        }

        public void remove()
        {
            throw new UnsupportedOperationException();
        }

        public boolean hasNext()
        {
            return this.children.hasNext();
        }

        public IModel next()
        {
            return SubElement.this.tree.getProvider().model(this.children.next());
        }
    }
}