/** * Squidy Interaction Library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * Squidy Interaction Library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squidy Interaction Library. If not, see * <http://www.gnu.org/licenses/>. * * 2009 Human-Computer Interaction Group, University of Konstanz. * <http://hci.uni-konstanz.de> * * Please contact info@squidy-lib.de or visit our website * <http://www.squidy-lib.de> for further information. */ package org.squidy.designer.knowledgebase; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.squidy.common.license.LicenseUtil; import org.squidy.common.util.ReflectionUtil; import org.squidy.designer.Designer; import org.squidy.designer.shape.VisualShape; import org.squidy.designer.shape.ZoomShape; import org.squidy.manager.data.Processor; import org.squidy.manager.model.Processable; import org.squidy.manager.scanner.PackageScanner; /** * <code>NodeTile</code>. * * <pre> * Date: Apr 30, 2009 * Time: 8:24:57 PM * </pre> * * * @author * Roman R�dle * <a href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a> * Human-Computer Interaction Group * University of Konstanz * * @version $Id: NodeTile.java 772 2011-09-16 15:39:44Z raedle $ * @since 1.0.0 */ public class NodeTile<T extends ZoomShape<?>> extends VisualShape<VisualShape<?>> { /** * Generated serial version UID. */ private static final long serialVersionUID = 5839796889723869435L; private static final int TILES_IN_A_ROW = 6; private static final double TILE_GAP_HORIZONTAL = 20; private static final double TILE_GAP_VERTICAL = 20; private List<RepositoryItem<T>> knowledgeBaseItems = new ArrayList<RepositoryItem<T>>(); public NodeTile() { String[] nodeTypeNames = PackageScanner.findAllClassNamesWithAnnotation(Processor.class); // Arrays.sort(nodeTypeNames, new Comparator<String>() { // public int compare(String o1, String o2) { // return o1.toLowerCase().compareTo(o2.toLowerCase()); // }; // }); String[] licenseTypes = Designer.getInstance().getLicense().split(","); for (String processorType : nodeTypeNames) { Class<? extends Processable> processableClass = ReflectionUtil.loadClass(processorType); for (String licenseType : licenseTypes) { if (LicenseUtil.isObtainingLicense(processableClass, licenseType)) { RepositoryItem<T> knowledgeBaseItem = create(processableClass); addChild(knowledgeBaseItem); knowledgeBaseItems.add(knowledgeBaseItem); break; } } } // Sort knowledge base items by its processable class not regarding case sensitive. Collections.sort(knowledgeBaseItems, new Comparator<RepositoryItem<T>>() { public int compare(RepositoryItem<T> o1, RepositoryItem<T> o2) { return o1.getProcessableClass().getSimpleName().toLowerCase().compareTo(o2.getProcessableClass().getSimpleName().toLowerCase()); } }); arrageItems(); } private RepositoryItem<T> create(Class<? extends Processable> processableClass) { RepositoryItem<T> item = new RepositoryItem<T>(processableClass); item.scale(0.1); return item; } private void arrageItems() { // Collections.sort(knowledgeBaseItems, new Comparator<KnowledgeBaseItem<T>>() { // public int compare(KnowledgeBaseItem<T> o1, KnowledgeBaseItem<T> o2) { // return o1.getProcessableClass().getSimpleName().toLowerCase().compareTo(o2.getProcessableClass().getSimpleName().toLowerCase()); // } // }); int column = 0; int row = 0; for (RepositoryItem<T> knowledgeBaseItem : knowledgeBaseItems) { if (!knowledgeBaseItem.getVisible()) { continue; } if (column >= TILES_IN_A_ROW) { column = 0; row++; } double scale = knowledgeBaseItem.getScale(); double x = column * (knowledgeBaseItem.getWidth() * scale) + column * TILE_GAP_HORIZONTAL; double y = row * (knowledgeBaseItem.getHeight() * scale) + row * TILE_GAP_VERTICAL; knowledgeBaseItem.setOffset(x, y); column++; } } public void filterTiles(String query) { // Simple case with empty query. if ("".equals(query)) { for (RepositoryItem<?> knowledgeBaseItem : knowledgeBaseItems) { knowledgeBaseItem.setVisible(true); } arrageItems(); return; } // System.out.println("FILTER tags() OF @Processor -> IFilter interface should help."); for (RepositoryItem<?> knowledgeBaseItem : knowledgeBaseItems) { knowledgeBaseItem.setVisible(false); Processor processor = knowledgeBaseItem.getProcessableClass().getAnnotation(Processor.class); String[] tags = processor.tags(); for (String tag : tags) { if (tag.toLowerCase().contains(query.trim().toLowerCase())) { knowledgeBaseItem.setVisible(true); break; } } } arrageItems(); } }