28 package org.nexusformat.nxvalidate;
30 import java.awt.Dialog.ModalityType;
31 import java.awt.event.MouseListener;
33 import java.io.FileNotFoundException;
34 import java.io.IOException;
35 import java.util.ArrayList;
36 import java.util.ResourceBundle;
37 import java.util.logging.Level;
38 import java.util.logging.Logger;
39 import javax.help.CSH;
40 import javax.help.HelpBroker;
41 import javax.help.HelpSet;
42 import javax.swing.JOptionPane;
43 import javax.swing.JTextArea;
44 import javax.swing.tree.MutableTreeNode;
45 import javax.swing.tree.TreePath;
46 import javax.xml.parsers.DocumentBuilder;
47 import javax.xml.parsers.DocumentBuilderFactory;
48 import javax.xml.parsers.ParserConfigurationException;
49 import org.w3c.dom.Document;
57 private DocumentBuilderFactory factory = null;
58 private DocumentBuilder builder = null;
61 private ResourceBundle bundle = null;
62 private File nxsFile = null;
63 private File nxdlFile = null;
64 private File reducedFile = null;
65 private File resultsFile = null;
68 private String nxconvertCommand = null;
69 private File saveDirectory = null;
70 private boolean foundNXconvert =
false;
71 private MouseListener popupListener = null;
74 private HelpBroker hb = null;
82 private void setup() {
84 factory = DocumentBuilderFactory.newInstance();
85 factory.setNamespaceAware(
true);
90 jTree1.setModel(domTree);
93 builder = factory.newDocumentBuilder();
94 }
catch (ParserConfigurationException ex) {
99 bundle = ResourceBundle.getBundle(
100 "org/nexusformat/nxvalidate/resources/nxvalidate");
102 treeUtils =
new TreeUtils();
104 XMLTreeRenderer rend =
new XMLTreeRenderer(
105 "resources/nexus32x32.png",
"resources/bad.png",
106 "resources/good.png",
"resources/warn.png",
107 "resources/peg-e.png",
"resources/info.png",
108 "resources/info-good.png",
"resources/info-bad.png",
109 "resources/info-warn.png");
111 jTree1.setCellRenderer(rend);
113 settings =
new UserSettings();
119 if (!settings.foundNXconvert()) {
121 bundle.getString(
"nxconvertMissingError"));
122 foundNXconvert =
false;
124 foundNXconvert =
true;
126 }
catch (FileNotFoundException ex) {
129 "The settings file cannot be found.", ex);
130 }
catch (IOException ex) {
133 "The settings file IO error.", ex);
136 popupListener =
new PopupListener(treePopupMenu);
137 jTree1.addMouseListener(popupListener);
139 txtStyle =
new TextPaneStyle(jTextPane1);
141 fileLoadingActions =
new FileActions(
this, jTree1, builder, domTree, root);
143 String helpHS =
"help/jhelpset.hs";
147 hs =
new HelpSet(null, this.getClass().getResource(helpHS));
148 }
catch (Exception ex) {
151 "The setting help file IO error.", ex);
155 hb = hs.createHelpBroker();
157 helpMenuItem.addActionListener(
new CSH.DisplayHelpFromSource( hb ));
166 @SuppressWarnings(
"unchecked")
168 private
void initComponents() {
170 dialogReportProblem =
new javax.swing.JOptionPane();
171 treePopupMenu =
new javax.swing.JPopupMenu();
172 closeFileMenuItem =
new javax.swing.JMenuItem();
173 jFileChooser1 =
new javax.swing.JFileChooser();
174 jPanel2 =
new javax.swing.JPanel();
175 jSplitPane1 =
new javax.swing.JSplitPane();
176 jScrollPane1 =
new javax.swing.JScrollPane();
177 jTree1 =
new javax.swing.JTree();
178 jScrollPane2 =
new javax.swing.JScrollPane();
179 jTextPane1 =
new javax.swing.JTextPane();
180 jMenuBar1 =
new javax.swing.JMenuBar();
181 fileMenu =
new javax.swing.JMenu();
182 openFilesMenuItem =
new javax.swing.JMenuItem();
183 jSeparator4 =
new javax.swing.JPopupMenu.Separator();
184 saveMenuItem =
new javax.swing.JMenuItem();
185 jSeparator7 =
new javax.swing.JPopupMenu.Separator();
186 closeAllMenuItem =
new javax.swing.JMenuItem();
187 jSeparator5 =
new javax.swing.JPopupMenu.Separator();
188 exitAppMenuItem =
new javax.swing.JMenuItem();
189 toolsMenu =
new javax.swing.JMenu();
190 validateSelectedMenuItem =
new javax.swing.JMenuItem();
191 jSeparator2 =
new javax.swing.JPopupMenu.Separator();
192 filterMenuItem =
new javax.swing.JMenuItem();
193 jSeparator1 =
new javax.swing.JPopupMenu.Separator();
194 bulkMenuItem =
new javax.swing.JMenuItem();
195 jSeparator3 =
new javax.swing.JPopupMenu.Separator();
196 settingsMenuItem =
new javax.swing.JMenuItem();
197 helpMenu =
new javax.swing.JMenu();
198 helpMenuItem =
new javax.swing.JMenuItem();
199 jSeparator6 =
new javax.swing.JPopupMenu.Separator();
200 aboutMenuItem =
new javax.swing.JMenuItem();
202 closeFileMenuItem.setText(
"Close File");
203 closeFileMenuItem.addActionListener(
new java.awt.event.ActionListener() {
204 public void actionPerformed(java.awt.event.ActionEvent evt) {
205 closeFileMenuItemActionPerformed(evt);
208 treePopupMenu.add(closeFileMenuItem);
210 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
211 java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle(
"org/nexusformat/nxvalidate/resources/nxvalidate");
212 setTitle(bundle.getString(
"applicationTitle"));
213 setMinimumSize(
new java.awt.Dimension(400, 400));
215 jPanel2.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5), javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED)));
216 jPanel2.setPreferredSize(
new java.awt.Dimension(130, 130));
218 jSplitPane1.setDividerLocation(200);
219 jSplitPane1.setContinuousLayout(
true);
221 javax.swing.tree.DefaultMutableTreeNode treeNode1 =
new javax.swing.tree.DefaultMutableTreeNode(
"NXS Files");
222 jTree1.setModel(
new javax.swing.tree.DefaultTreeModel(treeNode1));
223 jTree1.addTreeSelectionListener(
new javax.swing.event.TreeSelectionListener() {
224 public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
225 jTree1ValueChanged(evt);
228 jScrollPane1.setViewportView(jTree1);
230 jSplitPane1.setLeftComponent(jScrollPane1);
232 jScrollPane2.setViewportView(jTextPane1);
234 jSplitPane1.setRightComponent(jScrollPane2);
236 javax.swing.GroupLayout jPanel2Layout =
new javax.swing.GroupLayout(jPanel2);
237 jPanel2.setLayout(jPanel2Layout);
238 jPanel2Layout.setHorizontalGroup(
239 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
240 .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 386, Short.MAX_VALUE)
242 jPanel2Layout.setVerticalGroup(
243 jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
244 .addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 259, Short.MAX_VALUE)
247 getContentPane().add(jPanel2, java.awt.BorderLayout.CENTER);
249 fileMenu.setText(bundle.getString(
"fileMenuItem"));
251 openFilesMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
252 openFilesMenuItem.setText(
"Open Files");
253 openFilesMenuItem.addActionListener(
new java.awt.event.ActionListener() {
254 public void actionPerformed(java.awt.event.ActionEvent evt) {
255 openFilesMenuItemActionPerformed(evt);
258 fileMenu.add(openFilesMenuItem);
259 fileMenu.add(jSeparator4);
261 saveMenuItem.setText(
"Save Results");
262 saveMenuItem.setToolTipText(
"Save results to files.");
263 saveMenuItem.addActionListener(
new java.awt.event.ActionListener() {
264 public void actionPerformed(java.awt.event.ActionEvent evt) {
265 saveMenuItemActionPerformed(evt);
268 fileMenu.add(saveMenuItem);
269 fileMenu.add(jSeparator7);
271 closeAllMenuItem.setText(
"Close All Files");
272 closeAllMenuItem.addActionListener(
new java.awt.event.ActionListener() {
273 public void actionPerformed(java.awt.event.ActionEvent evt) {
274 closeAllMenuItemActionPerformed(evt);
277 fileMenu.add(closeAllMenuItem);
278 fileMenu.add(jSeparator5);
280 exitAppMenuItem.setText(
"Exit");
281 exitAppMenuItem.addActionListener(
new java.awt.event.ActionListener() {
282 public void actionPerformed(java.awt.event.ActionEvent evt) {
283 exitAppMenuItemActionPerformed(evt);
286 fileMenu.add(exitAppMenuItem);
288 jMenuBar1.add(fileMenu);
290 toolsMenu.setText(
"Tools");
292 validateSelectedMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
293 validateSelectedMenuItem.setText(
"Validate Selected");
294 validateSelectedMenuItem.addActionListener(
new java.awt.event.ActionListener() {
295 public void actionPerformed(java.awt.event.ActionEvent evt) {
296 validateSelectedMenuItemActionPerformed(evt);
299 toolsMenu.add(validateSelectedMenuItem);
300 toolsMenu.add(jSeparator2);
302 filterMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_G, java.awt.event.InputEvent.CTRL_MASK));
303 filterMenuItem.setText(
"Show Failed Nodes");
304 filterMenuItem.addActionListener(
new java.awt.event.ActionListener() {
305 public void actionPerformed(java.awt.event.ActionEvent evt) {
306 filterMenuItemActionPerformed(evt);
309 toolsMenu.add(filterMenuItem);
310 toolsMenu.add(jSeparator1);
312 bulkMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.CTRL_MASK));
313 bulkMenuItem.setText(
"Bulk Validation");
314 bulkMenuItem.addActionListener(
new java.awt.event.ActionListener() {
315 public void actionPerformed(java.awt.event.ActionEvent evt) {
316 bulkMenuItemActionPerformed(evt);
319 toolsMenu.add(bulkMenuItem);
320 toolsMenu.add(jSeparator3);
322 settingsMenuItem.setText(
"Settings");
323 settingsMenuItem.addActionListener(
new java.awt.event.ActionListener() {
324 public void actionPerformed(java.awt.event.ActionEvent evt) {
325 settingsMenuItemActionPerformed(evt);
328 toolsMenu.add(settingsMenuItem);
330 jMenuBar1.add(toolsMenu);
332 helpMenu.setText(
"Help");
334 helpMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_MASK));
335 helpMenuItem.setText(
"Help Content");
336 helpMenu.add(helpMenuItem);
337 helpMenu.add(jSeparator6);
339 aboutMenuItem.setText(
"About");
340 aboutMenuItem.addActionListener(
new java.awt.event.ActionListener() {
341 public void actionPerformed(java.awt.event.ActionEvent evt) {
342 aboutMenuItemActionPerformed(evt);
345 helpMenu.add(aboutMenuItem);
347 jMenuBar1.add(helpMenu);
349 setJMenuBar(jMenuBar1);
356 JTextArea ta =
new JTextArea(message);
357 ta.setEditable(
false);
358 ta.setWrapStyleWord(
true);
359 ta.setLineWrap(
true);
360 ta.setSize(200, 100);
361 dialogReportProblem.showMessageDialog(
this, ta);
365 private boolean loadOpenFilesDialog() {
368 loadFile.setModalityType(ModalityType.APPLICATION_MODAL);
369 loadFile.setVisible(
true);
372 return loadFile.OKButtonUsed();
376 private boolean saveResultsFilesDialog() {
378 NXLoadFilesDialog loadFile =
new NXLoadFilesDialog(
this,
true);
379 loadFile.setModalityType(ModalityType.APPLICATION_MODAL);
380 loadFile.setVisible(
true);
381 nxsFile = loadFile.getNXSFile();
382 nxdlFile = loadFile.getNXDLFile();
383 return loadFile.OKButtonUsed();
387 private boolean loadValidatFileDialog() {
389 NXValidateDialog loadValidate =
new NXValidateDialog(
this,
true);
390 loadValidate.setModalityType(ModalityType.APPLICATION_MODAL);
391 if (nxdlFile != null) {
392 loadValidate.setNXDLFile(nxdlFile);
394 loadValidate.setVisible(
true);
395 nxdlFile = loadValidate.getNXDLFile();
396 return loadValidate.OKButtonUsed();
400 private boolean loadSettingsFileDialog() {
402 NXSettingsDialog loadSettings =
new NXSettingsDialog(
this,
true);
403 loadSettings.setModalityType(ModalityType.APPLICATION_MODAL);
404 if (nxconvertCommand != null) {
405 loadSettings.setNXConvertCommand(nxconvertCommand);
407 loadSettings.setVisible(
true);
408 nxconvertCommand = loadSettings.getNXConvertFile();
409 return loadSettings.OKButtonUsed();
413 private void openFilesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
415 if (evt.getSource() == openFilesMenuItem) {
416 if (!foundNXconvert) {
418 bundle.getString(
"nxconvertMissingError"));
422 boolean result = loadOpenFilesDialog();
425 if (nxsFile != null) {
430 (
new Thread(fileLoadingActions)).start();
432 dialogReportProblem.showMessageDialog(
this,
433 bundle.getString(
"openNexusFileMessage"));
440 private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt) {
442 if (evt.getSource() == jTree1) {
443 if (jTree1.getSelectionPath() != null) {
445 (NXNodeMapper) jTree1.getSelectionPath().getLastPathComponent();
452 private void validateSelectedMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
454 if (evt.getSource() == validateSelectedMenuItem) {
457 if (jTree1.isSelectionEmpty()) {
462 TreePath selected = jTree1.getSelectionPath();
463 int size = selected.getPath().length;
464 NXNodeMapper endNode = (NXNodeMapper) selected.getPath()[size - 1];
465 if (endNode.isRoot()) {
470 if (!foundNXconvert) {
472 bundle.getString(
"nxconvertMissingError"));
476 Document reducedDoc = null;
477 Document resultsDoc = null;
497 boolean result = loadValidatFileDialog();
500 if (nxdlFile != null) {
510 Thread thread =
new Thread(fileLoadingActions);
515 dialogReportProblem.showMessageDialog(
this,
516 bundle.getString(
"openSchemaFileMessage"));
523 private void settingsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
525 if (evt.getSource() == settingsMenuItem) {
527 boolean result = loadSettingsFileDialog();
530 if (nxconvertCommand != null) {
534 foundNXconvert = settings.foundNXconvert();
538 if (!foundNXconvert) {
540 bundle.getString(
"nxconvertMissingError"));
548 private void closeFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
550 if (evt.getSource() == closeFileMenuItem) {
554 if (!node.isRoot()) {
556 domTree.removeNodeFromParent((MutableTreeNode) node);
564 private void exitAppMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
565 if (evt.getSource() == exitAppMenuItem) {
570 private void closeAllMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
571 if (evt.getSource() == closeAllMenuItem) {
573 int result = dialogReportProblem.showConfirmDialog(
this,
574 bundle.getString(
"closeAllWarningMessage"), null,
575 JOptionPane.OK_CANCEL_OPTION);
579 for (
int i = 0; i < nodes.size(); ++i) {
580 domTree.removeNodeFromParent((MutableTreeNode) nodes.get(i));
588 private void bulkMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
590 if (evt.getSource() == bulkMenuItem) {
593 BulkLoadFilesFrame bulk =
new BulkLoadFilesFrame(fileLoadingActions);
594 bulk.setVisible(
true);
600 private void filterMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
602 if (evt.getSource() == filterMenuItem) {
608 private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
609 if (evt.getSource() == saveMenuItem) {
611 jFileChooser1.setMultiSelectionEnabled(
false);
612 jFileChooser1.setFileSelectionMode(jFileChooser1.DIRECTORIES_ONLY);
613 jFileChooser1.setApproveButtonText(
"Save");
614 int returnVal = jFileChooser1.showOpenDialog(
this);
616 if (returnVal == jFileChooser1.APPROVE_OPTION) {
618 saveDirectory = jFileChooser1.getSelectedFile();
620 if(!saveDirectory.exists()){
621 saveDirectory.mkdir();
626 Thread thread =
new Thread(fileLoadingActions);
629 dialogReportProblem.showMessageDialog(
631 bundle.getString(
"savedResultsMessage"));
634 saveDirectory = null;
640 private void aboutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
641 if (evt.getSource() == aboutMenuItem) {
642 AboutDialog about =
new AboutDialog(
this,
true);
643 about.setVisible(
true);
650 public static void main(String args[]) {
651 java.awt.EventQueue.invokeLater(
new Runnable() {
661 private javax.swing.JMenuItem aboutMenuItem;
662 private javax.swing.JMenuItem bulkMenuItem;
663 private javax.swing.JMenuItem closeAllMenuItem;
664 private javax.swing.JMenuItem closeFileMenuItem;
665 private javax.swing.JOptionPane dialogReportProblem;
666 private javax.swing.JMenuItem exitAppMenuItem;
667 private javax.swing.JMenu fileMenu;
668 private javax.swing.JMenuItem filterMenuItem;
669 private javax.swing.JMenu helpMenu;
670 private javax.swing.JMenuItem helpMenuItem;
671 private javax.swing.JFileChooser jFileChooser1;
672 private javax.swing.JMenuBar jMenuBar1;
673 private javax.swing.JPanel jPanel2;
674 private javax.swing.JScrollPane jScrollPane1;
675 private javax.swing.JScrollPane jScrollPane2;
676 private javax.swing.JPopupMenu.Separator jSeparator1;
677 private javax.swing.JPopupMenu.Separator jSeparator2;
678 private javax.swing.JPopupMenu.Separator jSeparator3;
679 private javax.swing.JPopupMenu.Separator jSeparator4;
680 private javax.swing.JPopupMenu.Separator jSeparator5;
681 private javax.swing.JPopupMenu.Separator jSeparator6;
682 private javax.swing.JPopupMenu.Separator jSeparator7;
683 private javax.swing.JSplitPane jSplitPane1;
684 private javax.swing.JTextPane jTextPane1;
685 private javax.swing.JTree jTree1;
686 private javax.swing.JMenuItem openFilesMenuItem;
687 private javax.swing.JMenuItem saveMenuItem;
688 private javax.swing.JMenuItem settingsMenuItem;
689 private javax.swing.JMenu toolsMenu;
690 private javax.swing.JPopupMenu treePopupMenu;
691 private javax.swing.JMenuItem validateSelectedMenuItem;