/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2011 Neil C Smith. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3 only, as * published by the Free Software Foundation. * * This code 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 * version 3 for more details. * * You should have received a copy of the GNU General Public License version 3 * along with this work; if not, see http://www.gnu.org/licenses/ * * * Please visit http://neilcsmith.net if you need additional information or * have any questions. */ package net.neilcsmith.praxis.live.components; import java.util.ArrayList; import java.util.List; import java.util.TreeMap; import net.neilcsmith.praxis.core.Component; import net.neilcsmith.praxis.core.ComponentFactory.MetaData; import net.neilcsmith.praxis.core.ComponentType; import net.neilcsmith.praxis.core.Root; import org.openide.nodes.Children; import org.openide.nodes.Node; /** * * @author Neil C Smith (http://neilcsmith.net) */ public class CategoryChildren extends Children.Keys<String> { private String[] filters; private List<String> forceTestFilters; private TreeMap<String, TreeMap<ComponentType, MetaData<? extends Component>>> core; private TreeMap<String, TreeMap<ComponentType, MetaData<? extends Component>>> others; private boolean includeTest = ComponentSettings.getShowTest(); public CategoryChildren() { this(null); } public CategoryChildren(String[] filters) { this.filters = filters; buildForceTest(filters); buildMap(); List<String> keys = new ArrayList<String>(); keys.addAll(core.keySet()); keys.addAll(others.keySet()); setKeys(keys); } private void buildForceTest(String[] filters) { forceTestFilters = new ArrayList<String>(1); for (String filter : filters) { try { ComponentType type = ComponentType.create("root:" + filter); MetaData<? extends Root> data = ComponentRegistry.getDefault().getRootMetaData(type); if (data != null && data.isTest()) { forceTestFilters.add(filter); } } catch (Exception ex) { continue; } } } private void buildMap() { core = new TreeMap<String, TreeMap<ComponentType, MetaData<? extends Component>>>(); others = new TreeMap<String, TreeMap<ComponentType, MetaData<? extends Component>>>(); ComponentRegistry reg = ComponentRegistry.getDefault(); ComponentType[] types = reg.getComponentTypes(); for (ComponentType type : types) { String str = type.toString(); MetaData<? extends Component> data = reg.getMetaData(type); if (!include(str, data)) { continue; } str = str.substring(0, str.lastIndexOf(':')); boolean cr = str.startsWith("core"); TreeMap<ComponentType, MetaData<? extends Component>> children = cr ? core.get(str) : others.get(str); if (children == null) { children = new TreeMap<ComponentType, MetaData<? extends Component>> (TypeComparator.INSTANCE); if (cr) { core.put(str, children); } else { others.put(str, children); } } children.put(type, data); } } private boolean include(String type, MetaData<? extends Component> data) { if (data != null && data.isTest()) { if (data.isDeprecated()) { return false; } if (!includeTest) { boolean forced = false; for (String forceFilter : forceTestFilters) { if (type.startsWith(forceFilter)) { forced = true; break; } } if (!forced) { return false; } } } if (filters == null) { return true; } else { for (String start : filters) { if (type.startsWith(start)) { return true; } } } return false; } @Override protected Node[] createNodes(String key) { if (key.startsWith("core")) { return new Node[]{new CategoryNode(key, core.get(key))}; } else { return new Node[]{new CategoryNode(key, others.get(key))}; } } }