/* * This file is part of the Illarion project. * * Copyright © 2015 - Illarion e.V. * * Illarion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Illarion is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package illarion.mapedit.tools.panel.components; import illarion.mapedit.events.ItemSelectedEvent; import illarion.mapedit.resource.ItemImg; import illarion.mapedit.resource.loaders.ItemGroupLoader; import illarion.mapedit.resource.loaders.ItemLoader; import illarion.mapedit.tools.panel.cellrenderer.ItemTreeCellRenderer; import javolution.util.FastTable; import org.bushe.swing.event.EventBus; import javax.annotation.Nonnull; import javax.swing.*; import javax.swing.event.TreeModelListener; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import java.util.Collections; import java.util.List; /** * @author Tim */ public class ItemTree extends JScrollPane { private static class ItemGroupModel implements TreeModel { private static final String ROOT = "Items"; @Nonnull private final List<ItemGroup> groups; private ItemGroupModel(@Nonnull ItemImg... items) { ItemGroupLoader gl = ItemGroupLoader.getInstance(); groups = new FastTable<>(); for (ItemImg i : items) { boolean existedGroup = false; for (ItemGroup ig : groups) { if (ig.getId() == i.getEditorGroup()) { ig.add(i); existedGroup = true; break; } } if (existedGroup) { continue; } ItemGroup gr = new ItemGroup(i.getEditorGroup(), gl.getGroupName(i.getEditorGroup())); gr.add(i); groups.add(gr); } Collections.sort(groups, (group1, group2) -> { String g1 = group1.getName(); if (g1 == null) { g1 = ""; } String g2 = group2.getName(); if (g2 == null) { g2 = ""; } return g1.compareToIgnoreCase(g2); }); } @Nonnull @Override public Object getRoot() { return ROOT; } @Override public Object getChild(@Nonnull Object parent, int index) { if (parent == getRoot()) { return groups.get(index); } if (parent instanceof ItemGroup) { return ((ItemGroup) parent).getItems().get(index); } throw new IllegalArgumentException("Parent must be ROOT or instanceof ItemGroup and not: " + parent); } @Override public int getChildCount(@Nonnull Object parent) { if (parent == getRoot()) { return groups.size(); } if (parent instanceof ItemGroup) { return ((ItemGroup) parent).getItems().size(); } if (parent instanceof ItemImg) { return 0; } throw new IllegalArgumentException("Parent must be ROOT or instanceof ItemGroup and not: " + parent); } @Override public boolean isLeaf(Object node) { return node instanceof ItemImg; } @Override public void valueForPathChanged(TreePath path, Object newValue) { } @Override public int getIndexOfChild(@Nonnull Object parent, Object child) { if (parent == getRoot()) { return groups.indexOf(child); } if (parent instanceof ItemGroup) { return ((ItemGroup) parent).getItems().indexOf(child); } return 0; } @Override public void addTreeModelListener(TreeModelListener l) { } @Override public void removeTreeModelListener(TreeModelListener l) { } } private static class ItemGroup { @Nonnull private final List<ItemImg> items; private final String name; private final int id; private ItemGroup(int id, String name) { this.id = id; items = new FastTable<>(); this.name = name; } @Nonnull public List<ItemImg> getItems() { return items; } public void add(ItemImg item) { items.add(item); } public String getName() { return name; } public int getId() { return id; } @Nonnull @Override public String toString() { return name; } } public ItemTree() { JTree tree = new JTree(new ItemGroupModel(ItemLoader.getInstance().getItems())); tree.setToggleClickCount(1); setViewportView(tree); tree.setEditable(false); tree.setCellEditor(null); tree.setScrollsOnExpand(false); tree.setCellRenderer(new ItemTreeCellRenderer(getBackground())); tree.setSelectionModel(new DefaultTreeSelectionModel()); tree.addTreeSelectionListener(e -> { Object[] o = e.getPath().getPath(); if (o[o.length - 1] instanceof ItemImg) { EventBus.publish(new ItemSelectedEvent((ItemImg) o[o.length - 1])); } }); } }