OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 74 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package org.openconcerto.modules.extensionbuilder.component;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

import org.openconcerto.modules.extensionbuilder.table.ForbiddenFieldName;
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.Item;

public class GroupTreeModel extends DefaultTreeModel {

    private boolean showAll = true;
    private GroupDescritor componentDescriptor;

    public GroupTreeModel() {
        super(null, false);

    }

    public void setShowAll(boolean b) {
        if (b != this.showAll) {
            this.showAll = b;
            System.err.println("GroupTreeModel.setShowAll()" + b);
            reload();
        }
    }

    public void fillFromGroup(GroupDescritor n, Group tableGroup) {
        if (n == null) {
            throw new IllegalArgumentException("null GroupDescriptor");
        }
        this.componentDescriptor = n;
        final ActivableMutableTreeNode root = new ActivableMutableTreeNode(null);
        root.setActive(true);
        if (tableGroup == null) {
            this.setRoot(root);
            return;
        }
        System.err.println("Desc:");
        System.err.println(n.getGroup().printTree());
        System.err.println("Table:");
        System.err.println(tableGroup.printTree());

        addToTreeNode(root, n.getGroup(), n, 0);
        // Add from tableGroup
        // Group filteredTableGroup = new Group(tableGroup.getId());
        // filteredTableGroup = Group.copy(tableGroup, filteredTableGroup);
        for (int i = 0; i < tableGroup.getSize(); i++) {
            Item item = tableGroup.getItem(i);
            final String id = item.getId();
            if (!n.getGroup().contains(id) && ForbiddenFieldName.isAllowed(id) && !id.equals("ID")) {
                addToTreeNode((DefaultMutableTreeNode) root.getFirstChild(), item, n, 0);
            }
        }

        // /////////
        this.setRoot(root);
    }

    void addToTreeNode(DefaultMutableTreeNode node, Item item, GroupDescritor n, int depth) {
        System.err.println("GroupTreeModel.addToTreeNode():" + node + " item:" + item + " Desc:" + n + " Depth:" + depth);

        if (depth > 50) {
            return;
        }
        depth++;
        final ActivableMutableTreeNode newChild = new ActivableMutableTreeNode(item);

        newChild.setActive(n.containsGroupId(item.getId()));
        if (this.showAll || newChild.isActive()) {
            node.add(newChild);
        }
        if (item instanceof Group) {
            final Group gr = (Group) item;
            final int childCount = gr.getSize();
            for (int i = 0; i < childCount; i++) {
                final Item it = gr.getItem(i);
                addToTreeNode(newChild, it, n, depth);
            }
            newChild.setAllowsChildren(true);
        } else {
            newChild.setAllowsChildren(false);
        }
    }

    public void toggleActive(TreePath selectionPath) {
        if (selectionPath == null) {
            return;
        }
        final ActivableMutableTreeNode n = (ActivableMutableTreeNode) selectionPath.getLastPathComponent();

        final Item item = (Item) n.getUserObject();
        if (item instanceof Group) {
            // A Group is always active
            return;
        }
        n.setActive(!n.isActive());
        if (n.isActive()) {
            this.componentDescriptor.updateGroupFrom(this);
        } else {
            this.componentDescriptor.removeGroup(item);
        }
        reload(n);
        this.componentDescriptor.fireGroupChanged();
    }

    @Override
    protected void fireTreeNodesInserted(Object source, Object[] path, int[] childIndices, Object[] children) {
        // To update preview while reordering
        super.fireTreeNodesInserted(source, path, childIndices, children);
        this.componentDescriptor.fireGroupChanged();
    }

    @Override
    public boolean isLeaf(Object node) {
        final ActivableMutableTreeNode n = (ActivableMutableTreeNode) node;
        if (n.getUserObject() == null)
            return super.isLeaf(node);
        return !(n.getUserObject() instanceof Group);
    }
}