< prev index next >

src/com/sun/javatest/exec/NewReportDialog.java

Print this page




  95 import javax.swing.SwingConstants;
  96 import javax.swing.text.Keymap;
  97 import javax.swing.Timer;
  98 import javax.swing.text.JTextComponent;
  99 
 100 class NewReportDialog extends ToolDialog
 101 {
 102 
 103     //----------------------------------------------------------------------------
 104 
 105     private static final String ACTION_MAP_KEY = "listMnemonics";
 106 
 107     interface Observer {
 108         // if ever made public, should rethink method names and if any helpful
 109         // parameters are passed
 110 
 111        /**
 112          * The dialog is done. Notify the observer to keep a snapshot of
 113          * current state.
 114          */
 115         public void update(Map l);
 116 
 117         // starting
 118         public void writingReport();
 119 
 120         // done
 121         public void wroteReport();
 122 
 123         // error creating report
 124         // upgrade to use resource bundle+key as message
 125         // the given error occurred, and the user was informed
 126         public void errorWriting(String problem);
 127     }
 128 
 129     NewReportDialog(Component parent, UIFactory uif, FilterConfig f,
 130                     ReportBrowser reportBrowser, ExecModel model) {
 131         super(parent, uif, "nrd");
 132 
 133         this.model = model;
 134         filterHandler = f.createFilterSelectionHandler();
 135         this.reportBrowser = reportBrowser;


 140     }
 141 
 142     // ---------------------------------------------------------------------------
 143 
 144     void setLastState(Map h) {
 145         String rd = (String) (h.get(REPORT_DIR));
 146         String filter = (String) (h.get(FILTER));
 147 
 148         if (dirField == null)
 149             initGUI();
 150 
 151         dirField.setText(rd);
 152 
 153         if (filter != null && filter.length() > 0)
 154            filterHandler.setFilter(filter);
 155 
 156         updateHtmlCheckboxStates();
 157         updateCofCheckboxStates();
 158     }
 159 
 160     Map getLastState() {
 161         String rd = (String) (dirField.getText());
 162         String filter = filterHandler.getActiveFilter().getName();
 163         Map lastState = new HashMap();
 164 
 165         if (rd != null && rd.length() > 0)
 166            lastState.put(REPORT_DIR, rd);
 167 
 168         if (filter != null && filter.length() > 0)
 169            lastState.put(FILTER, filter);
 170 
 171         return lastState;
 172     }
 173 
 174     void addObserver(Observer o) {
 175         obs = (Observer[])DynamicArray.append(obs, o);
 176     }
 177 
 178     void removeObserver(Observer o) {
 179         obs = (Observer[])DynamicArray.remove(obs, o);
 180     }
 181 
 182     // Notify the observers that a change has been made.
 183     private void notifyUpdate(Map s) {
 184         for (Observer o : obs) {
 185             o.update(s);
 186         }
 187     }
 188 
 189     private void notifyStarting() {
 190         for (Observer o : obs) {
 191             o.writingReport();
 192         }
 193     }
 194 
 195     private void notifyDone() {
 196         for (Observer o : obs) {
 197             o.wroteReport();
 198         }
 199     }
 200 
 201     private void notifyError(String problem) {
 202         for (Observer o : obs) {
 203             o.wroteReport();


 282         lc.weighty = 1.0;
 283 
 284 //------------------------------------------------------------------------
 285 
 286         JPanel middle = uif.createPanel("nrd.middle", false);
 287         middle.setLayout(new BorderLayout());
 288         middle.setBorder(BorderFactory.createCompoundBorder(
 289                         uif.createTitledBorder("nrd.middle"),
 290                         BorderFactory.createEmptyBorder(12,12,12,12)));
 291 
 292         panes = new JComponent[] {
 293             createHtmlBlock(),
 294             createFilesBlock(),
 295             createKflBlock()
 296         };
 297 
 298         tabs = uif.createTabbedPane("nrd.tabs", panes);
 299         tabs.setTabPlacement(SwingConstants.TOP);
 300         tabs.setBorder(BorderFactory.createEmptyBorder());
 301 
 302         listModel = new DefaultListModel();
 303 
 304         // populate list and card panel
 305         final CardLayout cards = new CardLayout();
 306         final JPanel p = uif.createPanel("nrd.typecards", cards, false);
 307 
 308         cbHtml = uif.createCheckBox("nrd.type.html", true);
 309         //cbHtml.addActionListener(cbListener);
 310         listModel.addElement(cbHtml);
 311         p.add("nrd.type.html", tabs);
 312 
 313         cbPlain = uif.createCheckBox("nrd.type.pt", true);
 314         listModel.addElement(cbPlain);
 315         p.add("nrd.type.pt", uif.createPanel("nrd.blank", false));
 316 
 317         cbXml = uif.createCheckBox("nrd.type.xml", false);
 318         listModel.addElement(cbXml);
 319         p.add("nrd.type.xml", uif.createPanel("nrd.blank", false));
 320 
 321         cbCof = uif.createCheckBox("nrd.type.cof", false);
 322         listModel.addElement(cbCof);


 364                     ord = Integer.parseInt(e.getActionCommand()) - 1;
 365                 } catch (Exception ex) {
 366                     // ignore
 367                     return;
 368                 }
 369                                 if (ord == -1) ord = 9;
 370                                 if (ord <= list.getModel().getSize()) {
 371                                         list.requestFocusInWindow();
 372                                         list.setSelectedIndex(ord);
 373                                 }
 374                         }
 375 
 376         };
 377 
 378         list.getActionMap().put(ACTION_MAP_KEY, listMnemonics);
 379 
 380         int itemCount = listModel.size();
 381         if (itemCount > 9) itemCount = 9;
 382         for (int i = 1; i <= itemCount; ++i) {
 383                 list.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(i + '0', InputEvent.ALT_DOWN_MASK), ACTION_MAP_KEY);
 384                 JCheckBox box = ((JCheckBox)listModel.getElementAt(i - 1));
 385                 box.setMnemonic(i + '0');
 386                 box.setText(Character.toString((char)('0' + i)) + " " + box.getText());
 387         }
 388 
 389         if (listModel.size() == 10){
 390                 list.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('0', InputEvent.ALT_DOWN_MASK), ACTION_MAP_KEY);
 391                 JCheckBox box = ((JCheckBox)listModel.getElementAt(9));
 392                 box.setMnemonic('0');
 393                 box.setText("0 " + box.getText());
 394         }
 395 
 396 //-----------------------------------------------------------------
 397         JPanel bottom = createBackupOpsPane();
 398         bottom.setBorder(BorderFactory.createCompoundBorder(
 399                         uif.createTitledBorder("nrd.backup"),
 400                         BorderFactory.createEmptyBorder(12,12,12,12)));
 401 
 402         body.add(bottom, lc);
 403         setBody(body);
 404 //--------------------------------------------------------------------------------------
 405 
 406         okBtn = uif.createButton("nrd.ok", listener);
 407         sl.setOkBtn(okBtn);
 408         cancelBtn = uif.createCancelButton("nrd.cancel", listener);
 409         JButton helpBtn = uif.createHelpButton("nrd.help","report.newReport.csh" );
 410         setButtons(new JButton[] { okBtn, cancelBtn, helpBtn }, cancelBtn);
 411 


 764         return p;
 765     }
 766 
 767 
 768     /**
 769      * @return number of custom reports added
 770      */
 771     private int getCustomReports(JPanel p) {
 772         int result = 0;
 773 
 774         ContextManager cm = model.getContextManager();
 775         if (cm == null)
 776             return 0;
 777 
 778         customReports = cm.getCustomReports();
 779         if (customReports == null || customReports.length == 0) {
 780             customReports = null;
 781             return 0;
 782         }
 783 
 784         customBoxes = new HashMap();
 785 
 786         for (int i = 0; i < customReports.length; i++) {
 787             JCheckBox cb = new JCheckBox(customReports[i].getName());
 788             cb.setName(customReports[i].getReportId());
 789             listModel.addElement(cb);
 790             customBoxes.put(cb, customReports[i]);
 791 
 792             ReportConfigPanel[] ops = customReports[i].getOptionPanes();
 793             if (ops == null || ops.length == 0) {
 794                 // no config panels, use blank
 795                 p.add(customReports[i].getReportId(),
 796                         uif.createPanel("nrd.blank", false));
 797             }
 798             else {
 799                 // tabbed pane for all supplied panels
 800                 JTabbedPane tp = uif.createTabbedPane("nrd.custom.tabs");
 801                 for (int j = 0; j < ops.length; j++)
 802                     tp.addTab(ops[j].getPanelName(), ops[j]);
 803 
 804                 p.add(customReports[i].getReportId(), tp);


 829         rdc.setMode(ReportDirChooser.NEW);
 830         int option = rdc.showDialog(dirField);
 831         if (option != JFileChooser.APPROVE_OPTION)
 832             return;
 833 
 834         dirField.setText(rdc.getSelectedFile().getAbsolutePath());
 835     }
 836 
 837     private ReportDirChooser getReportDirChooser() {
 838         if (reportDirChooser == null)
 839             reportDirChooser = new ReportDirChooser();
 840         return reportDirChooser;
 841     }
 842 
 843     void showReportBrowser(File f) {
 844         if(f.equals(new File(reportDir, Report.INDEX_FILE_NAME))) {
 845             reportBrowser.show(f);
 846         }
 847         else {
 848             String[] names = Report.getHtmlReportFilenames();
 849             ArrayList possible = new ArrayList();
 850 
 851             for (int i = 0; i < names.length; i++) {
 852                 File rpt = new File(reportDir, names[i]);
 853                 if (rpt.exists() && rpt.canRead())
 854                     possible.add(rpt);
 855                 else
 856                     rpt = null;
 857             }
 858 
 859             if (possible.size() > 0) {
 860                 // show the most recently dated file
 861                 File rpt = null;
 862                 File newestF = null;
 863                 long newestTime = 0;
 864 
 865                 for (int i = 0; i < possible.size(); i++) {
 866                     File file = (File)(possible.get(i));
 867                     if (file.lastModified() > newestTime) {
 868                         newestF = file;
 869                         newestTime = file.lastModified();


 882     private void runReport(ReportSettings settings) throws IOException {
 883         if (interviewParams != null) {
 884             Report r = new Report();
 885 
 886             // if no work directory selected, throw exception.
 887             if (interviewParams.getWorkDirectory() == null) {
 888                 throw new IOException(uif.getI18NString("nrd.noWorkDir.err"));
 889             }
 890             r.addStartGenListener(new ReportGenListener());
 891             settings.setCustomReports(getActiveCustomReports());
 892             r.writeReports(settings, reportDir );
 893 
 894         }
 895         else {
 896             throw new IOException(uif.getI18NString("nrd.nullParams.err"));
 897         }
 898     }
 899 
 900     private ArrayList<CustomReport> getActiveCustomReports() {
 901 
 902         ArrayList customReps = new ArrayList();
 903         if (customBoxes != null && customBoxes.size() > 0) {
 904             Iterator it = customBoxes.keySet().iterator();
 905             while (it.hasNext()) {
 906                 JCheckBox box = (JCheckBox)(it.next());
 907                 if (box.isSelected()) {
 908                     customReps.add(customBoxes.get(box));
 909                 }
 910             }
 911         }
 912         return customReps;
 913     }
 914 
 915     private boolean isEmptyDirectory(File f) {
 916         return (f.isDirectory() && f.list().length == 0);
 917     }
 918 
 919     private void updateHtmlCheckboxStates() {
 920         // config buttons done before html buttons to ensure that
 921         // config gets disabled if HTML reporting is off
 922 


1085                 if (s == null || s.length() == 0) {
1086                     uif.showError("nrd.emptyInput");
1087                     return;
1088                 }
1089 
1090                 // check for empty input
1091                 if (cbBak.isSelected() && numBak.getText().equals("")) {
1092                     uif.showError("nrd.emptyBak");
1093                     // select the last tab (assumes this has the backup settings)
1094                     tabs.setSelectedIndex(tabs.getTabCount()-1);
1095                     return;
1096                 }
1097 
1098                 // validate custom reports
1099                 Iterator it = getActiveCustomReports().iterator();
1100                 while (it.hasNext()) {
1101                     CustomReport cr = (CustomReport) it.next();
1102                     String error = cr.validateOptions();
1103                     if (error != null) {
1104                         for (int i = 0; i < listModel.getSize(); i++ ) {
1105                             JCheckBox cb = (JCheckBox)listModel.elementAt(i);
1106                             if (cb.getName().equals(cr.getReportId())) {
1107                                 list.setSelectedIndex(i);
1108                             }
1109                         }
1110                         uif.showError("nrd.optionsErr", new Object[] {error} );
1111                         return;
1112                     }
1113                 }
1114 
1115                 reportDir = new File(s);
1116 
1117                 try {
1118                     // check if dir needs to be created.
1119                     if (!reportDir.isDirectory()) {
1120                         reportDir.mkdirs();
1121                     }
1122                     else {
1123                             // check if dir is a report dir
1124                         if (!Report.isReportDirectory(reportDir) &&
1125                             !isEmptyDirectory(reportDir)) {


1488     /*
1489      * PropertyChangeListener for enabling/disabling container's content
1490      */
1491     private class PanelEnableListener implements PropertyChangeListener {
1492         /**
1493          * @param container Container for controlling
1494          */
1495         PanelEnableListener(Container container) {
1496             theContainer = container;
1497         }
1498         /**
1499          * Catches changes of "enabled" property
1500          * and changes enabled status for all child components
1501          */
1502         public void propertyChange(PropertyChangeEvent evt) {
1503             if ("enabled".equals(evt.getPropertyName())) {
1504                 boolean oldV = ((Boolean) evt.getOldValue()).booleanValue();
1505                 boolean newV = ((Boolean) evt.getNewValue()).booleanValue();
1506                 if (oldV && !newV) {
1507                     // disable
1508                     Iterator chIt = collectChildren(theContainer, new ArrayList()).iterator();
1509                     enabledComp = new HashSet();
1510                     while (chIt.hasNext()) {
1511                         Component c = (Component) chIt.next();
1512                         if (c.isEnabled()) {
1513                             enabledComp.add(c);
1514                             c.setEnabled(false);
1515                         }
1516                     }
1517 
1518                 } else if (!oldV && newV && enabledComp != null) {
1519                     // enable
1520                     Iterator chIt = collectChildren(theContainer, new ArrayList()).iterator();
1521                     while (chIt.hasNext()) {
1522                         Component c = (Component) chIt.next();
1523                         if (enabledComp.contains(c)) {
1524                             c.setEnabled(true);
1525                         }
1526                     }
1527                 }
1528             }
1529         }
1530 
1531         /**
1532          * Recursively gathers all children components
1533          */
1534         private Collection collectChildren(Container comp, Collection c) {
1535             Component [] ch = comp.getComponents();
1536             for(int i = 0; i < ch.length; i++) {
1537                 c.add(ch[i]);
1538                 if (ch[i] instanceof Container) {
1539                     collectChildren((Container) ch[i],  c);
1540                 }
1541             }
1542             return c;
1543         }
1544 
1545         private Container theContainer;
1546         private HashSet enabledComp;
1547     }
1548 
1549     private class CheckBoxListCellRenderer implements ListCellRenderer {
1550         public Component getListCellRendererComponent(
1551                     JList list,
1552                     Object value,
1553                     int index,
1554                     boolean isSelected,
1555                     boolean cellHasFocus) {
1556             // assert: value is a JCheckBox
1557             JComponent comp = (JComponent)value;
1558             if (isSelected) {
1559                 comp.setOpaque(true);
1560                 comp.setBackground(list.getSelectionBackground());
1561                 comp.setForeground(list.getSelectionForeground());
1562             }
1563             else {
1564                 comp.setOpaque(false);
1565                 comp.setForeground(list.getForeground());
1566             }
1567 
1568             return comp;
1569          }
1570     }
1571 
1572     private Observer[] obs = new Observer[0];
1573     private ExecModel model;
1574 
1575     private ReportDirChooser reportDirChooser;
1576 
1577     private DefaultListModel listModel;
1578     private JList list;
1579     private JTextArea infoArea;
1580     private CustomReport[] customReports;
1581     private HashMap customBoxes;
1582 
1583     private JComponent[] panes;
1584     private JCheckBox cbHtml;
1585     private JCheckBox cbPlain;
1586     private JCheckBox cbXml;
1587     private JCheckBox cbCof;
1588 
1589     private JCheckBox cbCofTestCases;
1590 
1591     private JCheckBox cbConfig;
1592     private JCheckBox cbQl;
1593     private JCheckBox cbEnv;
1594     private JCheckBox cbStd;
1595     private JCheckBox cbKfl;
1596     private JCheckBox cbResults;
1597     private JCheckBox cbKws;
1598 
1599     private JCheckBox cbPass;
1600     private JCheckBox cbFail;
1601     private JCheckBox cbErr;
1602     private JCheckBox cbNr;
1603     private JCheckBox cbHtmlRpt;
1604     private JCheckBox cbHtmlInd;
1605 
1606     private JCheckBox cbKflTc;
1607     private JCheckBox cbKflF2f;
1608     private JCheckBox cbKflF2e;
1609     private JCheckBox cbKflMissing;
1610 
1611     private JCheckBox cbBak;
1612     private JTextField numBak;
1613 
1614     private ArrayList htmlGroup = new ArrayList();
1615     private ArrayList configGroup = new ArrayList();
1616     private ArrayList kflGroup = new ArrayList();
1617 
1618     private File reportDir;
1619     private JButton browseBtn;
1620     private JButton okBtn;
1621     private JButton cancelBtn;
1622     private JTextField dirField;
1623 
1624     private JTabbedPane tabs;
1625 
1626     private ReportSettings lastSettings;
1627 
1628     private ReportBrowser reportBrowser;
1629     private InterviewParameters interviewParams;
1630     private FilterSelectionHandler filterHandler;
1631 
1632     // keys for option values used for save & restore
1633     static final String REPORT_DIR = "reportDir";
1634     private static final String FILTER = "filter";
1635     private static final int WAIT_DIALOG_DELAY = 3000;      // 3 second delay
1636 


  95 import javax.swing.SwingConstants;
  96 import javax.swing.text.Keymap;
  97 import javax.swing.Timer;
  98 import javax.swing.text.JTextComponent;
  99 
 100 class NewReportDialog extends ToolDialog
 101 {
 102 
 103     //----------------------------------------------------------------------------
 104 
 105     private static final String ACTION_MAP_KEY = "listMnemonics";
 106 
 107     interface Observer {
 108         // if ever made public, should rethink method names and if any helpful
 109         // parameters are passed
 110 
 111        /**
 112          * The dialog is done. Notify the observer to keep a snapshot of
 113          * current state.
 114          */
 115         public void update(Map<String, String> l);
 116 
 117         // starting
 118         public void writingReport();
 119 
 120         // done
 121         public void wroteReport();
 122 
 123         // error creating report
 124         // upgrade to use resource bundle+key as message
 125         // the given error occurred, and the user was informed
 126         public void errorWriting(String problem);
 127     }
 128 
 129     NewReportDialog(Component parent, UIFactory uif, FilterConfig f,
 130                     ReportBrowser reportBrowser, ExecModel model) {
 131         super(parent, uif, "nrd");
 132 
 133         this.model = model;
 134         filterHandler = f.createFilterSelectionHandler();
 135         this.reportBrowser = reportBrowser;


 140     }
 141 
 142     // ---------------------------------------------------------------------------
 143 
 144     void setLastState(Map h) {
 145         String rd = (String) (h.get(REPORT_DIR));
 146         String filter = (String) (h.get(FILTER));
 147 
 148         if (dirField == null)
 149             initGUI();
 150 
 151         dirField.setText(rd);
 152 
 153         if (filter != null && filter.length() > 0)
 154            filterHandler.setFilter(filter);
 155 
 156         updateHtmlCheckboxStates();
 157         updateCofCheckboxStates();
 158     }
 159 
 160     Map<String, String> getLastState() {
 161         String rd = dirField.getText();
 162         String filter = filterHandler.getActiveFilter().getName();
 163         Map<String, String> lastState = new HashMap<>();
 164 
 165         if (rd != null && rd.length() > 0)
 166            lastState.put(REPORT_DIR, rd);
 167 
 168         if (filter != null && filter.length() > 0)
 169            lastState.put(FILTER, filter);
 170 
 171         return lastState;
 172     }
 173 
 174     void addObserver(Observer o) {
 175         obs = (Observer[])DynamicArray.append(obs, o);
 176     }
 177 
 178     void removeObserver(Observer o) {
 179         obs = (Observer[])DynamicArray.remove(obs, o);
 180     }
 181 
 182     // Notify the observers that a change has been made.
 183     private void notifyUpdate(Map<String, String> s) {
 184         for (Observer o : obs) {
 185             o.update(s);
 186         }
 187     }
 188 
 189     private void notifyStarting() {
 190         for (Observer o : obs) {
 191             o.writingReport();
 192         }
 193     }
 194 
 195     private void notifyDone() {
 196         for (Observer o : obs) {
 197             o.wroteReport();
 198         }
 199     }
 200 
 201     private void notifyError(String problem) {
 202         for (Observer o : obs) {
 203             o.wroteReport();


 282         lc.weighty = 1.0;
 283 
 284 //------------------------------------------------------------------------
 285 
 286         JPanel middle = uif.createPanel("nrd.middle", false);
 287         middle.setLayout(new BorderLayout());
 288         middle.setBorder(BorderFactory.createCompoundBorder(
 289                         uif.createTitledBorder("nrd.middle"),
 290                         BorderFactory.createEmptyBorder(12,12,12,12)));
 291 
 292         panes = new JComponent[] {
 293             createHtmlBlock(),
 294             createFilesBlock(),
 295             createKflBlock()
 296         };
 297 
 298         tabs = uif.createTabbedPane("nrd.tabs", panes);
 299         tabs.setTabPlacement(SwingConstants.TOP);
 300         tabs.setBorder(BorderFactory.createEmptyBorder());
 301 
 302         listModel = new DefaultListModel<>();
 303 
 304         // populate list and card panel
 305         final CardLayout cards = new CardLayout();
 306         final JPanel p = uif.createPanel("nrd.typecards", cards, false);
 307 
 308         cbHtml = uif.createCheckBox("nrd.type.html", true);
 309         //cbHtml.addActionListener(cbListener);
 310         listModel.addElement(cbHtml);
 311         p.add("nrd.type.html", tabs);
 312 
 313         cbPlain = uif.createCheckBox("nrd.type.pt", true);
 314         listModel.addElement(cbPlain);
 315         p.add("nrd.type.pt", uif.createPanel("nrd.blank", false));
 316 
 317         cbXml = uif.createCheckBox("nrd.type.xml", false);
 318         listModel.addElement(cbXml);
 319         p.add("nrd.type.xml", uif.createPanel("nrd.blank", false));
 320 
 321         cbCof = uif.createCheckBox("nrd.type.cof", false);
 322         listModel.addElement(cbCof);


 364                     ord = Integer.parseInt(e.getActionCommand()) - 1;
 365                 } catch (Exception ex) {
 366                     // ignore
 367                     return;
 368                 }
 369                                 if (ord == -1) ord = 9;
 370                                 if (ord <= list.getModel().getSize()) {
 371                                         list.requestFocusInWindow();
 372                                         list.setSelectedIndex(ord);
 373                                 }
 374                         }
 375 
 376         };
 377 
 378         list.getActionMap().put(ACTION_MAP_KEY, listMnemonics);
 379 
 380         int itemCount = listModel.size();
 381         if (itemCount > 9) itemCount = 9;
 382         for (int i = 1; i <= itemCount; ++i) {
 383                 list.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(i + '0', InputEvent.ALT_DOWN_MASK), ACTION_MAP_KEY);
 384                 JCheckBox box = listModel.getElementAt(i - 1);
 385                 box.setMnemonic(i + '0');
 386                 box.setText(Character.toString((char)('0' + i)) + " " + box.getText());
 387         }
 388 
 389         if (listModel.size() == 10){
 390                 list.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('0', InputEvent.ALT_DOWN_MASK), ACTION_MAP_KEY);
 391                 JCheckBox box = listModel.getElementAt(9);
 392                 box.setMnemonic('0');
 393                 box.setText("0 " + box.getText());
 394         }
 395 
 396 //-----------------------------------------------------------------
 397         JPanel bottom = createBackupOpsPane();
 398         bottom.setBorder(BorderFactory.createCompoundBorder(
 399                         uif.createTitledBorder("nrd.backup"),
 400                         BorderFactory.createEmptyBorder(12,12,12,12)));
 401 
 402         body.add(bottom, lc);
 403         setBody(body);
 404 //--------------------------------------------------------------------------------------
 405 
 406         okBtn = uif.createButton("nrd.ok", listener);
 407         sl.setOkBtn(okBtn);
 408         cancelBtn = uif.createCancelButton("nrd.cancel", listener);
 409         JButton helpBtn = uif.createHelpButton("nrd.help","report.newReport.csh" );
 410         setButtons(new JButton[] { okBtn, cancelBtn, helpBtn }, cancelBtn);
 411 


 764         return p;
 765     }
 766 
 767 
 768     /**
 769      * @return number of custom reports added
 770      */
 771     private int getCustomReports(JPanel p) {
 772         int result = 0;
 773 
 774         ContextManager cm = model.getContextManager();
 775         if (cm == null)
 776             return 0;
 777 
 778         customReports = cm.getCustomReports();
 779         if (customReports == null || customReports.length == 0) {
 780             customReports = null;
 781             return 0;
 782         }
 783 
 784         customBoxes = new HashMap<>();
 785 
 786         for (int i = 0; i < customReports.length; i++) {
 787             JCheckBox cb = new JCheckBox(customReports[i].getName());
 788             cb.setName(customReports[i].getReportId());
 789             listModel.addElement(cb);
 790             customBoxes.put(cb, customReports[i]);
 791 
 792             ReportConfigPanel[] ops = customReports[i].getOptionPanes();
 793             if (ops == null || ops.length == 0) {
 794                 // no config panels, use blank
 795                 p.add(customReports[i].getReportId(),
 796                         uif.createPanel("nrd.blank", false));
 797             }
 798             else {
 799                 // tabbed pane for all supplied panels
 800                 JTabbedPane tp = uif.createTabbedPane("nrd.custom.tabs");
 801                 for (int j = 0; j < ops.length; j++)
 802                     tp.addTab(ops[j].getPanelName(), ops[j]);
 803 
 804                 p.add(customReports[i].getReportId(), tp);


 829         rdc.setMode(ReportDirChooser.NEW);
 830         int option = rdc.showDialog(dirField);
 831         if (option != JFileChooser.APPROVE_OPTION)
 832             return;
 833 
 834         dirField.setText(rdc.getSelectedFile().getAbsolutePath());
 835     }
 836 
 837     private ReportDirChooser getReportDirChooser() {
 838         if (reportDirChooser == null)
 839             reportDirChooser = new ReportDirChooser();
 840         return reportDirChooser;
 841     }
 842 
 843     void showReportBrowser(File f) {
 844         if(f.equals(new File(reportDir, Report.INDEX_FILE_NAME))) {
 845             reportBrowser.show(f);
 846         }
 847         else {
 848             String[] names = Report.getHtmlReportFilenames();
 849             ArrayList<File> possible = new ArrayList<>();
 850 
 851             for (int i = 0; i < names.length; i++) {
 852                 File rpt = new File(reportDir, names[i]);
 853                 if (rpt.exists() && rpt.canRead())
 854                     possible.add(rpt);
 855                 else
 856                     rpt = null;
 857             }
 858 
 859             if (possible.size() > 0) {
 860                 // show the most recently dated file
 861                 File rpt = null;
 862                 File newestF = null;
 863                 long newestTime = 0;
 864 
 865                 for (int i = 0; i < possible.size(); i++) {
 866                     File file = (File)(possible.get(i));
 867                     if (file.lastModified() > newestTime) {
 868                         newestF = file;
 869                         newestTime = file.lastModified();


 882     private void runReport(ReportSettings settings) throws IOException {
 883         if (interviewParams != null) {
 884             Report r = new Report();
 885 
 886             // if no work directory selected, throw exception.
 887             if (interviewParams.getWorkDirectory() == null) {
 888                 throw new IOException(uif.getI18NString("nrd.noWorkDir.err"));
 889             }
 890             r.addStartGenListener(new ReportGenListener());
 891             settings.setCustomReports(getActiveCustomReports());
 892             r.writeReports(settings, reportDir );
 893 
 894         }
 895         else {
 896             throw new IOException(uif.getI18NString("nrd.nullParams.err"));
 897         }
 898     }
 899 
 900     private ArrayList<CustomReport> getActiveCustomReports() {
 901 
 902         ArrayList<CustomReport> customReps = new ArrayList<>();
 903         if (customBoxes != null && customBoxes.size() > 0) {
 904             Iterator it = customBoxes.keySet().iterator();
 905             while (it.hasNext()) {
 906                 JCheckBox box = (JCheckBox)(it.next());
 907                 if (box.isSelected()) {
 908                     customReps.add(customBoxes.get(box));
 909                 }
 910             }
 911         }
 912         return customReps;
 913     }
 914 
 915     private boolean isEmptyDirectory(File f) {
 916         return (f.isDirectory() && f.list().length == 0);
 917     }
 918 
 919     private void updateHtmlCheckboxStates() {
 920         // config buttons done before html buttons to ensure that
 921         // config gets disabled if HTML reporting is off
 922 


1085                 if (s == null || s.length() == 0) {
1086                     uif.showError("nrd.emptyInput");
1087                     return;
1088                 }
1089 
1090                 // check for empty input
1091                 if (cbBak.isSelected() && numBak.getText().equals("")) {
1092                     uif.showError("nrd.emptyBak");
1093                     // select the last tab (assumes this has the backup settings)
1094                     tabs.setSelectedIndex(tabs.getTabCount()-1);
1095                     return;
1096                 }
1097 
1098                 // validate custom reports
1099                 Iterator it = getActiveCustomReports().iterator();
1100                 while (it.hasNext()) {
1101                     CustomReport cr = (CustomReport) it.next();
1102                     String error = cr.validateOptions();
1103                     if (error != null) {
1104                         for (int i = 0; i < listModel.getSize(); i++ ) {
1105                             JCheckBox cb = listModel.elementAt(i);
1106                             if (cb.getName().equals(cr.getReportId())) {
1107                                 list.setSelectedIndex(i);
1108                             }
1109                         }
1110                         uif.showError("nrd.optionsErr", new Object[] {error} );
1111                         return;
1112                     }
1113                 }
1114 
1115                 reportDir = new File(s);
1116 
1117                 try {
1118                     // check if dir needs to be created.
1119                     if (!reportDir.isDirectory()) {
1120                         reportDir.mkdirs();
1121                     }
1122                     else {
1123                             // check if dir is a report dir
1124                         if (!Report.isReportDirectory(reportDir) &&
1125                             !isEmptyDirectory(reportDir)) {


1488     /*
1489      * PropertyChangeListener for enabling/disabling container's content
1490      */
1491     private class PanelEnableListener implements PropertyChangeListener {
1492         /**
1493          * @param container Container for controlling
1494          */
1495         PanelEnableListener(Container container) {
1496             theContainer = container;
1497         }
1498         /**
1499          * Catches changes of "enabled" property
1500          * and changes enabled status for all child components
1501          */
1502         public void propertyChange(PropertyChangeEvent evt) {
1503             if ("enabled".equals(evt.getPropertyName())) {
1504                 boolean oldV = ((Boolean) evt.getOldValue()).booleanValue();
1505                 boolean newV = ((Boolean) evt.getNewValue()).booleanValue();
1506                 if (oldV && !newV) {
1507                     // disable
1508                     Iterator chIt = collectChildren(theContainer, new ArrayList<Component>()).iterator();
1509                     enabledComp = new HashSet<>();
1510                     while (chIt.hasNext()) {
1511                         Component c = (Component) chIt.next();
1512                         if (c.isEnabled()) {
1513                             enabledComp.add(c);
1514                             c.setEnabled(false);
1515                         }
1516                     }
1517 
1518                 } else if (!oldV && newV && enabledComp != null) {
1519                     // enable
1520                     Iterator chIt = collectChildren(theContainer, new ArrayList<Component>()).iterator();
1521                     while (chIt.hasNext()) {
1522                         Component c = (Component) chIt.next();
1523                         if (enabledComp.contains(c)) {
1524                             c.setEnabled(true);
1525                         }
1526                     }
1527                 }
1528             }
1529         }
1530 
1531         /**
1532          * Recursively gathers all children components
1533          */
1534         private Collection collectChildren(Container comp, Collection<Component> c) {
1535             Component [] ch = comp.getComponents();
1536             for(int i = 0; i < ch.length; i++) {
1537                 c.add(ch[i]);
1538                 if (ch[i] instanceof Container) {
1539                     collectChildren((Container) ch[i],  c);
1540                 }
1541             }
1542             return c;
1543         }
1544 
1545         private Container theContainer;
1546         private HashSet<Component> enabledComp;
1547     }
1548 
1549     private class CheckBoxListCellRenderer implements ListCellRenderer<JComponent> {
1550         public Component getListCellRendererComponent(
1551                     JList<? extends JComponent> list,
1552                     JComponent value,
1553                     int index,
1554                     boolean isSelected,
1555                     boolean cellHasFocus) {
1556             // assert: value is a JCheckBox
1557             JComponent comp = value;
1558             if (isSelected) {
1559                 comp.setOpaque(true);
1560                 comp.setBackground(list.getSelectionBackground());
1561                 comp.setForeground(list.getSelectionForeground());
1562             }
1563             else {
1564                 comp.setOpaque(false);
1565                 comp.setForeground(list.getForeground());
1566             }
1567 
1568             return comp;
1569          }
1570     }
1571 
1572     private Observer[] obs = new Observer[0];
1573     private ExecModel model;
1574 
1575     private ReportDirChooser reportDirChooser;
1576 
1577     private DefaultListModel<JCheckBox> listModel;
1578     private JList<? extends JComponent> list;
1579     private JTextArea infoArea;
1580     private CustomReport[] customReports;
1581     private HashMap<JCheckBox, CustomReport> customBoxes;
1582 
1583     private JComponent[] panes;
1584     private JCheckBox cbHtml;
1585     private JCheckBox cbPlain;
1586     private JCheckBox cbXml;
1587     private JCheckBox cbCof;
1588 
1589     private JCheckBox cbCofTestCases;
1590 
1591     private JCheckBox cbConfig;
1592     private JCheckBox cbQl;
1593     private JCheckBox cbEnv;
1594     private JCheckBox cbStd;
1595     private JCheckBox cbKfl;
1596     private JCheckBox cbResults;
1597     private JCheckBox cbKws;
1598 
1599     private JCheckBox cbPass;
1600     private JCheckBox cbFail;
1601     private JCheckBox cbErr;
1602     private JCheckBox cbNr;
1603     private JCheckBox cbHtmlRpt;
1604     private JCheckBox cbHtmlInd;
1605 
1606     private JCheckBox cbKflTc;
1607     private JCheckBox cbKflF2f;
1608     private JCheckBox cbKflF2e;
1609     private JCheckBox cbKflMissing;
1610 
1611     private JCheckBox cbBak;
1612     private JTextField numBak;
1613 
1614     private ArrayList<JCheckBox> htmlGroup = new ArrayList<>();
1615     private ArrayList<JCheckBox> configGroup = new ArrayList<>();
1616     private ArrayList<JCheckBox> kflGroup = new ArrayList<>();
1617 
1618     private File reportDir;
1619     private JButton browseBtn;
1620     private JButton okBtn;
1621     private JButton cancelBtn;
1622     private JTextField dirField;
1623 
1624     private JTabbedPane tabs;
1625 
1626     private ReportSettings lastSettings;
1627 
1628     private ReportBrowser reportBrowser;
1629     private InterviewParameters interviewParams;
1630     private FilterSelectionHandler filterHandler;
1631 
1632     // keys for option values used for save & restore
1633     static final String REPORT_DIR = "reportDir";
1634     private static final String FILTER = "filter";
1635     private static final int WAIT_DIALOG_DELAY = 3000;      // 3 second delay
1636 
< prev index next >