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
|