/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.cismap.commons.featureservice; import org.apache.log4j.Logger; import java.io.File; import java.io.FileFilter; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import de.cismet.cismap.commons.gui.capabilitywidget.StringFilter; /** * DOCUMENT ME! * * @author therter * @version $Revision$, $Date$ */ public class ShapeFolderTreeModel implements TreeModel, StringFilter { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = Logger.getLogger(ShapeFolderTreeModel.class); //~ Instance fields -------------------------------------------------------- File folder; ShapeFileFilter filter = new ShapeFileFilter(); //~ Constructors ----------------------------------------------------------- /** * Creates a new ShapeFolderTreeModel object. * * @param link DOCUMENT ME! */ public ShapeFolderTreeModel(final String link) { try { String uri = link; if (uri.endsWith("\r")) { uri = uri.substring(0, uri.length() - 1); } this.folder = new File(uri.substring(7).trim()); } catch (Exception e) { LOG.error("Illegale shape folder path found.", e); } } //~ Methods ---------------------------------------------------------------- @Override public Object getRoot() { return folder; } @Override public Object getChild(final Object parent, final int index) { if (parent instanceof File) { final File parentFile = (File)parent; if (parentFile.isDirectory()) { return parentFile.listFiles(filter)[index]; } } return null; } @Override public int getChildCount(final Object parent) { if (parent instanceof File) { final File parentFile = (File)parent; if (parentFile.isDirectory()) { return parentFile.listFiles(filter).length; } } return 0; } @Override public boolean isLeaf(final Object node) { if (node instanceof File) { final File parentFile = (File)node; if (parentFile.isDirectory()) { return parentFile.listFiles(filter).length == 0; } } return true; } @Override public void valueForPathChanged(final TreePath path, final Object newValue) { } @Override public int getIndexOfChild(final Object parent, final Object child) { if ((parent != null) && (child != null)) { if (parent instanceof File) { final File parentFile = (File)parent; final File[] list = parentFile.listFiles(filter); for (int i = 0; i < list.length; ++i) { if (list[i].equals(child)) { return i; } } } } return -1; } @Override public void addTreeModelListener(final TreeModelListener l) { } @Override public void removeTreeModelListener(final TreeModelListener l) { } @Override public void setFilterString(final String filterString) { filter.setFilterString(filterString); } //~ Inner Classes ---------------------------------------------------------- /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ private class ShapeFileFilter implements FileFilter { //~ Instance fields ---------------------------------------------------- private String filterString; //~ Methods ------------------------------------------------------------ @Override public boolean accept(final File pathname) { return fulfilFilterRequirements(pathname); } /** * DOCUMENT ME! * * @param filterString DOCUMENT ME! */ public void setFilterString(final String filterString) { this.filterString = filterString; } /** * Checks, if the given file fulfils the filter requirement. * * @param pathname entry the entry to check * * @return true, iff the filter requirement is fulfilled */ public boolean fulfilFilterRequirements(final File pathname) { if (pathname.isDirectory()) { if ((filterString == null) || pathname.getName().toLowerCase().contains(filterString.toLowerCase())) { return true; } else { for (final File f : pathname.listFiles()) { if (fulfilFilterRequirements(f)) { return true; } } } } else { return (pathname.getName().endsWith(".shp") || pathname.getName().endsWith(".gml")) && ((filterString == null) || pathname.getName().toLowerCase().contains(filterString.toLowerCase())); } return false; } } }