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.menu.mainmenu;

import java.util.Enumeration;
import java.util.List;

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

import org.openconcerto.erp.config.MenuManager;
import org.openconcerto.modules.extensionbuilder.Extension;
import org.openconcerto.modules.extensionbuilder.component.ActivableMutableTreeNode;
import org.openconcerto.ui.group.Group;
import org.openconcerto.ui.group.Item;

public class MenuItemTreeModel extends DefaultTreeModel {

    private boolean showAll = true;
    private Extension extension;

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

    }

    public void setShowAll(boolean b) {
        this.showAll = b;
        System.err.println("MenuItemTreeModel.setShowAll(): " + b);
    }

    public void fillFromDescriptor(Extension extension) {

        if (extension == null) {
            throw new IllegalArgumentException("null extension");
        }
        if (this.extension != null) {
            // this.extension.removeChangeListener(this);
        }
        this.extension = extension;
        // this.extension.addChangeListener(this);
        final Group currentMenuGroup = MenuManager.getInstance().getGroup();
        Group menuGroup = Group.copy(currentMenuGroup, new Group(currentMenuGroup.getId()));

        extension.initMenuGroup(menuGroup);

        final ActivableMutableTreeNode root = new ActivableMutableTreeNode(null);
        root.setActive(true);
        if (menuGroup == null) {
            return;
        }
        // FIXME manque des items...
        System.out.println(MenuManager.getInstance().getGroup().printTree());

        addToTreeNode(root, menuGroup, 0);
        setRoot(root);

    }

    void addToTreeNode(DefaultMutableTreeNode node, Item item, int depth) {
        if (depth > 50) {
            return;
        }
        depth++;
        final ActivableMutableTreeNode newChild = new ActivableMutableTreeNode(item);
        newChild.setActive(isActive(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, depth);
            }
            newChild.setAllowsChildren(true);
        } else {
            newChild.setAllowsChildren(false);
        }
    }

    private boolean isActive(String id) {
        List<MenuDescriptor> l = this.extension.getRemoveMenuList();
        for (MenuDescriptor menuDescriptor : l) {
            if (menuDescriptor.getId().equals(id)) {
                return false;
            }
        }
        return true;
    }

    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());
        final String id = item.getId();
        setActive(n.isActive(), id);
    }

    public void setActive(boolean active, String id) {
        if (active) {
            this.extension.removeRemoveMenuForId(id);
        } else {
            this.extension.addRemoveMenu(new MenuDescriptor(id));
        }
        this.extension.setChanged();

        DefaultMutableTreeNode n = getNode(id);
        if (n != null) {
            if (n instanceof ActivableMutableTreeNode) {
                ((ActivableMutableTreeNode) n).setActive(active);
            }

            reload(n);
        }

    }

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

    @Override
    public void insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index) {
        Item it = (Item) ((DefaultMutableTreeNode) newChild).getUserObject();
        Group g = (Group) ((DefaultMutableTreeNode) parent).getUserObject();
        this.extension.moveMenuItem(it.getId(), g.getId());
        super.insertNodeInto(newChild, parent, index);
        this.extension.setChanged();
    }

    @SuppressWarnings("rawtypes")
    public void renameMenuItem(String previousId, String newId) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) this.getRoot();

        for (Enumeration e = root.breadthFirstEnumeration(); e.hasMoreElements();) {
            final DefaultMutableTreeNode current = (DefaultMutableTreeNode) e.nextElement();

            final String idFromNode = getIdFromNode(current);
            if (idFromNode != null && idFromNode.equals(previousId)) {
                setId(current, newId);

                reload(current);

            }
        }

        this.extension.renameMenuItem(previousId, newId);
        this.extension.setChanged();

    }

    private void setId(DefaultMutableTreeNode node, String newId) {
        Object o = node.getUserObject();
        if (o == null)
            return;
        ((Item) o).setId(newId);

    }

    private static String getIdFromNode(DefaultMutableTreeNode node) {
        Object o = node.getUserObject();
        if (o == null)
            return null;
        return ((Item) o).getId();
    }

    @SuppressWarnings("rawtypes")
    public DefaultMutableTreeNode getNode(String id) {
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) this.getRoot();

        for (Enumeration e = root.breadthFirstEnumeration(); e.hasMoreElements();) {
            final DefaultMutableTreeNode current = (DefaultMutableTreeNode) e.nextElement();

            final String idFromNode = getIdFromNode(current);
            if (idFromNode != null && idFromNode.equals(id)) {
                return current;

            }
        }
        return null;
    }
}