/** * Copyright 2009-14 Simon Andrews * * This file is part of BamQC. * * BamQC is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * BamQC 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. * * You should have received a copy of the GNU General Public License * along with BamQC; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Changelog: * - Simon Andrews: Class creation. */ package uk.ac.babraham.BamQC.Help; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; import java.util.Enumeration; import java.util.Vector; import javax.swing.tree.DefaultMutableTreeNode; /** * The Class HelpIndexRoot is the root node of the tree of help files. * @author Simon Andrews */ public class HelpIndexRoot extends DefaultMutableTreeNode { private static final long serialVersionUID = -4744317136889304693L; /** The fs. */ public FileSorter fs = new FileSorter(); /** * Instantiates a new help index root. * * @param startingLocation the starting location */ public HelpIndexRoot (File startingLocation) { super("Help Contents"); if (!startingLocation.exists() || !startingLocation.isDirectory()) { throw new IllegalArgumentException("Couldn't find help file directory at '"+startingLocation.getAbsolutePath()+"'"); } addSubfiles(startingLocation, this); } /** * Adds the subfiles. * * @param directory the directory * @param node the node */ private void addSubfiles (File directory, DefaultMutableTreeNode node) { File [] files = directory.listFiles(); Arrays.sort(files,fs); for (int f=0;f<files.length;f++) { if (files[f].isDirectory()) { HelpPage h = new HelpPage(files[f]); node.add(h); addSubfiles(files[f], h); } else if (files[f].getName().toLowerCase().endsWith(".html") || files[f].getName().toLowerCase().endsWith(".htm")){ HelpPage h = new HelpPage(files[f]); node.add(h); } // Skip files which aren't html (eg images etc) } } /** * Find pages for term. * * @param searchTerm the search term * @return the help page[] * @throws IOException Signals that an I/O exception has occurred. */ public HelpPage [] findPagesForTerm (String searchTerm) throws IOException { Vector<HelpPage>hits = new Vector<HelpPage>(); Enumeration<?> kids = children(); while (kids.hasMoreElements()) { Object node = kids.nextElement(); if (node instanceof HelpPage) { ((HelpPage)node).containsString(searchTerm, hits); } } return hits.toArray(new HelpPage[0]); } /** * The Class FileSorter. */ private class FileSorter implements Comparator<File> { /* (non-Javadoc) * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) */ @Override public int compare(File f1, File f2) { // The file names should be preceeded by a series of // integers separated by dots (eg 1.2.1). We therefore // split these out to compare the individual sections int [] numbers1; int [] numbers2; try { numbers1 = getNumberArray(f1); numbers2 = getNumberArray(f2); } catch (NumberFormatException nfe) { return f1.getName().compareTo(f2.getName()); } int shortest = numbers1.length; if (numbers2.length < shortest) shortest = numbers2.length; for (int i=0;i<shortest;i++) { if (numbers1[i] != numbers2[i]) { return numbers1[i]-numbers2[i]; } } // If we get here then the shortest number string wins return numbers1.length - numbers2.length; } /** * Gets the number array. * * @param f the f * @return the number array * @throws NumberFormatException the number format exception */ private int [] getNumberArray (File f) throws NumberFormatException { String [] numberStrings = f.getName().split(" ")[0].split("\\."); int [] ints = new int [numberStrings.length]; for (int i=0;i<numberStrings.length;i++) { ints[i] = Integer.parseInt(numberStrings[i]); } return ints; } } }