package edu.harvard.wcfia.yoshikoder; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.tree.TreePath; import edu.harvard.wcfia.yoshikoder.dictionary.CategoryNode; import edu.harvard.wcfia.yoshikoder.dictionary.Node; import edu.harvard.wcfia.yoshikoder.dictionary.YKDictionary; /** * Checks for the same pattern in different places in the same dictionary. * If duplicate patterns exist, pops up a non-modal dialog listing their locations. * * @author will * */ public class DuplicateReportAction extends YoshikoderAction { public DuplicateReportAction(Yoshikoder yk) { super(yk, DuplicateReportAction.class.getName()); } protected void recurse(Map nameToNodes, Node node){ if (node instanceof CategoryNode){ for (Enumeration en = node.children(); en.hasMoreElements();){ Node n = (Node)en.nextElement(); recurse(nameToNodes, n); } } else { String nodeName = node.getName(); List l = (List)nameToNodes.get(nodeName); if (l == null){ l = new ArrayList(); nameToNodes.put(nodeName, l); } l.add(node); } } public void actionPerformed(ActionEvent e) { YKDictionary dict = yoshikoder.getDictionary(); Map nameToNodes = new HashMap(); Node root = dict.getDictionaryRoot(); recurse(nameToNodes, root); // full nameToNodes StringBuffer sb = new StringBuffer(); int duplicatePatterns = 0; for (Iterator iter = nameToNodes.entrySet().iterator(); iter.hasNext();) { Map.Entry entry = (Map.Entry)iter.next(); List l = (List)entry.getValue(); if (l.size() > 1){ duplicatePatterns++; sb.append("\"" + (String)entry.getKey() + "\" appears in categories:\n"); for (Iterator iterator = l.iterator(); iterator.hasNext();) { Node node = (Node) iterator.next(); TreePath path = dict.getPath((Node)node.getParent()); sb.append("\t" + path.getPathComponent(0).toString()); for (int ii = 1; ii < path.getPathCount(); ii++) { sb.append(">" + path.getPathComponent(ii).toString()); // path } sb.append("\n"); } sb.append("\n"); // line gap } } if (duplicatePatterns == 0){ JOptionPane.showMessageDialog(yoshikoder, "There are no duplicate patterns.", "Duplicate Pattern Report", JOptionPane.PLAIN_MESSAGE); } else { JTextArea area = new JTextArea(30, 40); area.setFont(yoshikoder.getDisplayFont()); area.setEditable(false); area.setLineWrap(true); area.setWrapStyleWord(true); area.setText(sb.toString()); area.setCaretPosition(0); JLabel label = new JLabel("There are " + duplicatePatterns + " duplicate patterns", SwingConstants.CENTER); label.setBorder(BorderFactory.createEmptyBorder(0,0,10,0)); JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); panel.add(label, BorderLayout.NORTH); panel.add(new JScrollPane(area), BorderLayout.CENTER); JDialog dia = new JDialog(yoshikoder, "Duplicate Pattern Report", false); dia.getContentPane().add(panel); dia.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dia.pack(); dia.setLocationRelativeTo(yoshikoder); dia.show(); } } }