90 /**
91 * This panel is a split panel which has the testsuite tree on the left and a context
92 * sensitive panel on the right.
93 */
94 class TestTreePanel extends JPanel implements ET_TestTreeControl, HarnessAware, Session.Observer {
95
96 /**
97 * Constructs TestTreePanel object, doesn't initialize GUI!
98 */
99 public TestTreePanel(JComponent parent, ExecModel em, UIFactory uif) {
100 this.uif = uif;
101 this.execModel = em;
102 this.parent = parent;
103 uif.setAccessibleInfo(this, "treep");
104 }
105 /**
106 * @param map Saved state map, may be null.
107 */
108 public TestTreePanel(UIFactory uif, Harness h, ExecModel em,
109 FilterSelectionHandler fh, JComponent parent,
110 Map map) {
111 this(parent, em, uif);
112 setHarness(h);
113 this.filterHandler = fh;
114 this.stateMap = map;
115 initialize();
116 }
117
118 public void initialize() {
119 initGUI();
120 }
121
122 /**
123 * Returns the current TRT, or null if no table is available.
124 */
125 public synchronized TestResultTable getTestResultTable() {
126 /*
127 WorkDirectory wd = params.getWorkDirectory();
128 if (wd == null)
129 return null;
130 else
271 brPanel.setParameters(params);
272 }
273
274 // restore onscreen open paths
275 if (tree != null && paths != null && paths.length > 0) {
276 tree.restorePaths(paths, true);
277 }
278
279 if (tree != null ) {
280 tree.restoreSelection(selectedPaths);
281 }
282
283 if (tree != null) {
284 ensureTreeSelection();
285 }
286
287 }
288
289 private TreePath[] getTreePaths(String[] paths) {
290 if (paths != null) {
291 ArrayList<TreePath> translatedPaths = new ArrayList(paths.length);
292
293 for (int i = 0; i < paths.length; i++) {
294 // the paths need to be reconditioned because the JTree will not
295 // accept them if they refer to a different model/TRT.
296 //Object targetNode = trt.resolveUrl(paths[i]);
297
298 TreePath tp = treeModel.resolveUrl(paths[i]);
299 if (tp != null) {
300 translatedPaths.add(tp);
301 }
302 } // for (i)
303
304 TreePath[] result = new TreePath[translatedPaths.size()];
305 translatedPaths.toArray(result);
306 return result;
307 } else {
308 return null;
309 }
310 }
311
312
313 @Override
314 public void saveTreeState(Map m) {
315 String[] paths = getOpenPaths();
316 m.put(OPEN_PATHS_PREF, StringArray.join(paths));
317 }
318
319 @Override
320 public void restoreTreeState(Map m) {
321 if (m != null) {
322 String tmp = (String) (m.get(OPEN_PATHS_PREF));
323 if (tree != null && tmp != null && tmp.length() > 0) {
324 tree.restorePaths(StringArray.split(tmp), true);
325 }
326 }
327 }
328
329 @Override
330 public void save(Map m) {
331 // save the open paths
332 Preferences.access();
333 saveTreeState(m);
334 }
335
336 @Override
337 public void restore(Map m) {
338 stateMap = m;
339 restoreTreeState(stateMap);
340 }
341
342 /**
343 * Translates open tree paths into string URLs.
344 * @return null if no paths are open or the tree is not available.
345 */
346 private String[] getOpenPaths() {
347 if (tree == null || tree.getModel() instanceof EmptyTestTreeModel) {
348 return null;
349 }
350
351 TreePath[] paths = tree.snapshotOpenPaths();
352 Vector urls = new Vector();
353
354 if (paths != null) {
355 for (int i = 0; i < paths.length; i++) {
356 Object last = paths[i].getLastPathComponent();
357 String url;
358
359 if (last instanceof TT_TestNode) {
360 // get url
361 url = ((TT_TestNode) last).getTestResult().getTestName();
362 }
363 else if (last instanceof TT_BasicNode ) { // tree node
364 // get url
365 url = ((TT_BasicNode) last).getLongPath();
366 }
367 else
368 return null;
369
370 urls.addElement(url);
371 } // for
372 }
424 JOptionPane.WARNING_MESSAGE);
425 return;
426 }
427
428 if (harness.isRunning()) {
429 JOptionPane.showMessageDialog(parent,
430 uif.getI18NString("treep.cantPurgeRunning.msg"),
431 uif.getI18NString("treep.cantPurgeRunning.title"),
432 JOptionPane.WARNING_MESSAGE);
433 return;
434 }
435
436 boolean ack = false;
437 Object[] toPurge = new Object[what.length];
438
439 if (what.length > 1) {
440 //int confirm = uif.showYesNoDialog("treep.purgeItemsSure",
441 //createNodeListString(createNodeList(what)));
442
443 String[] paths = createNodeList(what);
444 DefaultListModel model = new DefaultListModel();
445 for (int i = paths.length; i > 0; i--) {
446 model.add(model.getSize(), paths[model.getSize()]);
447 }
448 int confirm = showConfirmListDialog("treep.purgeItemsSure", null, model);
449
450 // user backs out
451 if (confirm != JOptionPane.YES_OPTION) {
452 return;
453 } else {
454 ack = true;
455 for (int i = 0; i < what.length; i++) {
456 Object item = what[i].getLastPathComponent();
457 if (item instanceof TT_TestNode) {
458 toPurge[i] = ((TT_TestNode) item).getTestResult().getWorkRelativePath();
459 } else if (item instanceof TT_BasicNode) {
460 TT_BasicNode tn = (TT_BasicNode) item;
461 if (tn.isRoot()) {
462 toPurge = new Object[1];
463 toPurge[0] = "";
464 break; // no need to process the rest of the list
680 // dialog to confirm wipe of results with refresh?
681
682 if (harness.isRunning()) {
683 JOptionPane.showMessageDialog(parent,
684 uif.getI18NString("treep.cantRefreshRunning.msg"),
685 uif.getI18NString("treep.cantRefreshRunning.title"),
686 JOptionPane.WARNING_MESSAGE);
687 return;
688 }
689
690 final TestResultTable trt = treeModel.getTestResultTable();
691 boolean ack = false;
692 String[] ackTargets = new String[what.length];
693 TT_TreeNode[] ackNodes = null;
694
695 if (what.length > 1) {
696 //int confirm = uif.showYesNoDialog("treep.refreshNodeSure",
697 // createNodeListString(createNodeList(what)));
698
699 String[] paths = createNodeList(what);
700 DefaultListModel model = new DefaultListModel();
701 for (int i = paths.length; i > 0; i--) {
702 model.add(model.getSize(), paths[model.getSize()]);
703 }
704 int confirm = showConfirmListDialog("treep.refreshNodeSure", paths, model);
705
706 if (confirm != JOptionPane.YES_OPTION) {
707 return;
708 }
709 else {
710 ack = true;
711 }
712
713 for (int i = 0; i < what.length; i++) {
714 Object item = what[i].getLastPathComponent();
715 if (item instanceof TT_TestNode) {
716 ackTargets[i] = ((TT_TestNode) item).getLongPath();
717 ackNodes = (TT_TreeNode[])DynamicArray.append(ackNodes, (TT_TestNode)item, TT_TreeNode.class);
718 } else if (item instanceof TT_BasicNode) {
719 ackNodes = (TT_TreeNode[])DynamicArray.append(ackNodes, (TT_BasicNode)item, TT_TreeNode.class);
720 TT_BasicNode tn = (TT_BasicNode) item;
1107 ensureTreeSelection();
1108
1109 popup = uif.createPopupMenu("treep.popup.mnu");
1110 popup.add(runMI = uif.createMenuItem("treep.popup", "run", listener));
1111 popup.addSeparator();
1112 popup.add(refreshMI = uif.createMenuItem("treep.popup", "refresh", listener));
1113 popup.add(purgeMI = uif.createMenuItem("treep.popup", "clear", listener));
1114
1115 // get items from the test suite
1116 if (cm != null) {
1117 JavaTestContextMenu[] cms = cm.getContextMenus();
1118 if (cms != null) {
1119 popup.addSeparator();
1120
1121 for (int i = 0; i < cms.length; i++) {
1122 // filter out types of menus we don't want (not needed yet)
1123 // keep track of them for later
1124 switch (cms[i].getMenuApplication()) {
1125 case JavaTestContextMenu.TESTS_AND_FOLDERS:
1126 if (mixedMenus == null) {
1127 mixedMenus = new ArrayList();
1128 }
1129 mixedMenus.add(cms[i]);
1130 break;
1131 case JavaTestContextMenu.TESTS_ONLY:
1132 if (testMenus == null) {
1133 testMenus = new ArrayList();
1134 }
1135 testMenus.add(cms[i]);
1136 break;
1137 case JavaTestContextMenu.FOLDERS_ONLY:
1138 if (folderMenus == null) {
1139 folderMenus = new ArrayList();
1140 }
1141 folderMenus.add(cms[i]);
1142 break;
1143 case JavaTestContextMenu.CUSTOM:
1144 if (customMenus == null) {
1145 customMenus = new ArrayList();
1146 }
1147 customMenus.add(cms[i]);
1148 break;
1149 default:
1150 }
1151 popup.add(cms[i].getMenu());
1152 } // for
1153 }
1154 }
1155
1156 // disabled by default
1157 // will immediately be reevaluated when setParameters() is called
1158 runMI.setEnabled(false);
1159 refreshMI.setEnabled(false);
1160 purgeMI.setEnabled(false);
1161
1162 // setup top toolbar
1163 /*
1164 JPanel topPanel = uif.createPanel("treeTb", new GridBagLayout(), false);
1165 // NOTE intentional space added below to defeat
1320 if (customMenus != null) {
1321 for (int i = 0; i < customMenus.size(); i++) {
1322 ((JavaTestContextMenu) (customMenus.get(i))).getMenu().setEnabled(false);
1323 } // for
1324 }
1325 if (mixedMenus != null) {
1326 for (int i = 0; i < mixedMenus.size(); i++) {
1327 ((JavaTestContextMenu) (mixedMenus.get(i))).getMenu().setEnabled(false);
1328 } // for
1329 }
1330 if (folderMenus != null) {
1331 for (int i = 0; i < folderMenus.size(); i++) {
1332 ((JavaTestContextMenu) (folderMenus.get(i))).getMenu().setEnabled(false);
1333 } // for
1334 }
1335
1336 if (!(tree.getModel() instanceof EmptyTestTreeModel))
1337 throw new JavaTestError("Unknown node type from JTree!");
1338 }
1339 } else { // multiple nodes selected
1340 ArrayList tests = new ArrayList();
1341 ArrayList folders = new ArrayList();
1342
1343 for (int i = 0; i < paths.length; i++) {
1344 Object item = paths[i];
1345
1346 if (item instanceof TreePath) {
1347 item = ((TreePath) item).getLastPathComponent();
1348 }
1349
1350 if (item instanceof TT_TestNode) {
1351 tests.add(((TT_TestNode) item).getTestResult());
1352 } else {
1353 TT_BasicNode bn = (TT_BasicNode)item;
1354 if (bn.isRoot())
1355 folders.add("");
1356 else
1357 folders.add(bn.getLongPath());
1358 }
1359 } // for
1360
1361 TestResult[] t = null;
1598
1599 return uif.showCustomYesNoDialog(prefix, p);
1600 }
1601
1602 /**
1603 * Does this panel currently have data to work from.
1604 */
1605 private boolean isPopulated() {
1606 if (params == null || params.getTestSuite() == null) {
1607 return false;
1608 } else {
1609 return true;
1610 }
1611 }
1612 private UIFactory uif;
1613 private Harness harness;
1614 private FilterSelectionHandler filterHandler;
1615 private ExecModel execModel;
1616 private JComponent parent;
1617 private Thread bgThread; // in case disposal is required
1618 private Map stateMap; // startup state, read-only
1619 private volatile boolean disposed;
1620 private PanelModel pm;
1621 private TestTree tree;
1622 private TT_Renderer treeRend;
1623 private TestPanel testPanel;
1624 private BranchPanel brPanel;
1625 private MultiSelectPanel msPanel;
1626 private JPopupMenu popup;
1627 private TreePath lastPopupPath;
1628 private JMenuItem refreshMI;
1629 private JMenuItem purgeMI;
1630 private JMenuItem runMI;
1631 private String activeTest;
1632 private ArrayList testMenus, folderMenus, mixedMenus, customMenus;
1633 private TestTreeModel treeModel;
1634 private Deck deck;
1635 private JPanel deckPanel;
1636 private JTextField titleField;
1637 private Listener listener;
1638 private TestSuite lastTs; // last recorded testsuite
1639 private Parameters params;
1640 private Parameters newParams;
1641 private boolean newConfigAlreadyApplied = false;
1642 private boolean initialized = false;
1643 private static final int WAIT_DIALOG_DELAY = 3000; // 3 second delay
1644 private static final String OPEN_PATHS_PREF = "openpaths";
1645 static protected boolean debug = Boolean.getBoolean("debug." + TestTreePanel.class.getName());
1646
1647 /**
1648 * ET_Config method
1649 * @return null - no menu required
1650 */
1651 public JMenu getMenu() {
1652 return null;
1931
1932 public Object getValue(String key) {
1933 if (key == null) {
1934 throw new NullPointerException();
1935 }
1936 if (key.equals(NAME)) {
1937 return name;
1938 } else if (key.equals(SHORT_DESCRIPTION)) {
1939 return desc;
1940 } else {
1941 return null;
1942 }
1943 }
1944 private String name;
1945 private String desc;
1946 }
1947
1948 private class PanelModel implements TreePanelModel, Harness.Observer, TestResultTable.Observer {
1949
1950 PanelModel() {
1951 runningTests = new Hashtable();
1952 activeNodes = new Hashtable();
1953 }
1954
1955 public void pauseWork() {
1956 if (treeModel != null) {
1957 treeModel.pauseWork();
1958 }
1959 }
1960
1961 public void unpauseWork() {
1962 if (treeModel != null) {
1963 treeModel.unpauseWork();
1964 }
1965 }
1966
1967 public void refreshTree() {
1968 String[] openPaths = null;
1969 String[] selectedPaths = null;
1970 if (tree != null) {
1971 TreePath[] p = tree.snapshotOpenPaths();
1972 openPaths = treeModel.pathsToStrings(p);
2191 // asynchronous (non-user GUI) events occur
2192 // example - if a "clear" operation is done, which includes the shown test
2193 // SWITCH ONTO EVENT THREAD
2194 if (newValue.getTestName().equals(activeTest)) {
2195 TestResult lookupTr = treeModel.getTestResultTable().lookup(
2196 newValue.getWorkRelativePath());
2197 TreeNode[] nodes = TestResultTable.getObjectPath(lookupTr);
2198
2199 Object[] p = new Object[nodes.length + 1];
2200 System.arraycopy(nodes, 0, p, 0, nodes.length);
2201 p[p.length-1] = newValue;
2202 EventQueue.invokeLater(new Selector(newValue, new TreePath(p)));
2203 }
2204 */
2205 }
2206
2207 public void updated(TestResult whichTR) {
2208 // ignore
2209 }
2210 private Hashtable<String,TestResult> runningTests;
2211 private Hashtable activeNodes;
2212 private Integer ONE = Integer.valueOf(1);
2213 }
2214 }
|
90 /**
91 * This panel is a split panel which has the testsuite tree on the left and a context
92 * sensitive panel on the right.
93 */
94 class TestTreePanel extends JPanel implements ET_TestTreeControl, HarnessAware, Session.Observer {
95
96 /**
97 * Constructs TestTreePanel object, doesn't initialize GUI!
98 */
99 public TestTreePanel(JComponent parent, ExecModel em, UIFactory uif) {
100 this.uif = uif;
101 this.execModel = em;
102 this.parent = parent;
103 uif.setAccessibleInfo(this, "treep");
104 }
105 /**
106 * @param map Saved state map, may be null.
107 */
108 public TestTreePanel(UIFactory uif, Harness h, ExecModel em,
109 FilterSelectionHandler fh, JComponent parent,
110 Map<String, String> map) {
111 this(parent, em, uif);
112 setHarness(h);
113 this.filterHandler = fh;
114 this.stateMap = map;
115 initialize();
116 }
117
118 public void initialize() {
119 initGUI();
120 }
121
122 /**
123 * Returns the current TRT, or null if no table is available.
124 */
125 public synchronized TestResultTable getTestResultTable() {
126 /*
127 WorkDirectory wd = params.getWorkDirectory();
128 if (wd == null)
129 return null;
130 else
271 brPanel.setParameters(params);
272 }
273
274 // restore onscreen open paths
275 if (tree != null && paths != null && paths.length > 0) {
276 tree.restorePaths(paths, true);
277 }
278
279 if (tree != null ) {
280 tree.restoreSelection(selectedPaths);
281 }
282
283 if (tree != null) {
284 ensureTreeSelection();
285 }
286
287 }
288
289 private TreePath[] getTreePaths(String[] paths) {
290 if (paths != null) {
291 ArrayList<TreePath> translatedPaths = new ArrayList<>(paths.length);
292
293 for (int i = 0; i < paths.length; i++) {
294 // the paths need to be reconditioned because the JTree will not
295 // accept them if they refer to a different model/TRT.
296 //Object targetNode = trt.resolveUrl(paths[i]);
297
298 TreePath tp = treeModel.resolveUrl(paths[i]);
299 if (tp != null) {
300 translatedPaths.add(tp);
301 }
302 } // for (i)
303
304 TreePath[] result = new TreePath[translatedPaths.size()];
305 translatedPaths.toArray(result);
306 return result;
307 } else {
308 return null;
309 }
310 }
311
312
313 @Override
314 public void saveTreeState(Map<String, String> m) {
315 String[] paths = getOpenPaths();
316 m.put(OPEN_PATHS_PREF, StringArray.join(paths));
317 }
318
319 @Override
320 public void restoreTreeState(Map<String, String> m) {
321 if (m != null) {
322 String tmp = m.get(OPEN_PATHS_PREF);
323 if (tree != null && tmp != null && tmp.length() > 0) {
324 tree.restorePaths(StringArray.split(tmp), true);
325 }
326 }
327 }
328
329 @Override
330 public void save(Map<String, String> m) {
331 // save the open paths
332 Preferences.access();
333 saveTreeState(m);
334 }
335
336 @Override
337 public void restore(Map<String, String> m) {
338 stateMap = m;
339 restoreTreeState(stateMap);
340 }
341
342 /**
343 * Translates open tree paths into string URLs.
344 * @return null if no paths are open or the tree is not available.
345 */
346 private String[] getOpenPaths() {
347 if (tree == null || tree.getModel() instanceof EmptyTestTreeModel) {
348 return null;
349 }
350
351 TreePath[] paths = tree.snapshotOpenPaths();
352 Vector<String> urls = new Vector<>();
353
354 if (paths != null) {
355 for (int i = 0; i < paths.length; i++) {
356 Object last = paths[i].getLastPathComponent();
357 String url;
358
359 if (last instanceof TT_TestNode) {
360 // get url
361 url = ((TT_TestNode) last).getTestResult().getTestName();
362 }
363 else if (last instanceof TT_BasicNode ) { // tree node
364 // get url
365 url = ((TT_BasicNode) last).getLongPath();
366 }
367 else
368 return null;
369
370 urls.addElement(url);
371 } // for
372 }
424 JOptionPane.WARNING_MESSAGE);
425 return;
426 }
427
428 if (harness.isRunning()) {
429 JOptionPane.showMessageDialog(parent,
430 uif.getI18NString("treep.cantPurgeRunning.msg"),
431 uif.getI18NString("treep.cantPurgeRunning.title"),
432 JOptionPane.WARNING_MESSAGE);
433 return;
434 }
435
436 boolean ack = false;
437 Object[] toPurge = new Object[what.length];
438
439 if (what.length > 1) {
440 //int confirm = uif.showYesNoDialog("treep.purgeItemsSure",
441 //createNodeListString(createNodeList(what)));
442
443 String[] paths = createNodeList(what);
444 DefaultListModel<String> model = new DefaultListModel<>();
445 for (int i = paths.length; i > 0; i--) {
446 model.add(model.getSize(), paths[model.getSize()]);
447 }
448 int confirm = showConfirmListDialog("treep.purgeItemsSure", null, model);
449
450 // user backs out
451 if (confirm != JOptionPane.YES_OPTION) {
452 return;
453 } else {
454 ack = true;
455 for (int i = 0; i < what.length; i++) {
456 Object item = what[i].getLastPathComponent();
457 if (item instanceof TT_TestNode) {
458 toPurge[i] = ((TT_TestNode) item).getTestResult().getWorkRelativePath();
459 } else if (item instanceof TT_BasicNode) {
460 TT_BasicNode tn = (TT_BasicNode) item;
461 if (tn.isRoot()) {
462 toPurge = new Object[1];
463 toPurge[0] = "";
464 break; // no need to process the rest of the list
680 // dialog to confirm wipe of results with refresh?
681
682 if (harness.isRunning()) {
683 JOptionPane.showMessageDialog(parent,
684 uif.getI18NString("treep.cantRefreshRunning.msg"),
685 uif.getI18NString("treep.cantRefreshRunning.title"),
686 JOptionPane.WARNING_MESSAGE);
687 return;
688 }
689
690 final TestResultTable trt = treeModel.getTestResultTable();
691 boolean ack = false;
692 String[] ackTargets = new String[what.length];
693 TT_TreeNode[] ackNodes = null;
694
695 if (what.length > 1) {
696 //int confirm = uif.showYesNoDialog("treep.refreshNodeSure",
697 // createNodeListString(createNodeList(what)));
698
699 String[] paths = createNodeList(what);
700 DefaultListModel<String> model = new DefaultListModel<>();
701 for (int i = paths.length; i > 0; i--) {
702 model.add(model.getSize(), paths[model.getSize()]);
703 }
704 int confirm = showConfirmListDialog("treep.refreshNodeSure", paths, model);
705
706 if (confirm != JOptionPane.YES_OPTION) {
707 return;
708 }
709 else {
710 ack = true;
711 }
712
713 for (int i = 0; i < what.length; i++) {
714 Object item = what[i].getLastPathComponent();
715 if (item instanceof TT_TestNode) {
716 ackTargets[i] = ((TT_TestNode) item).getLongPath();
717 ackNodes = (TT_TreeNode[])DynamicArray.append(ackNodes, (TT_TestNode)item, TT_TreeNode.class);
718 } else if (item instanceof TT_BasicNode) {
719 ackNodes = (TT_TreeNode[])DynamicArray.append(ackNodes, (TT_BasicNode)item, TT_TreeNode.class);
720 TT_BasicNode tn = (TT_BasicNode) item;
1107 ensureTreeSelection();
1108
1109 popup = uif.createPopupMenu("treep.popup.mnu");
1110 popup.add(runMI = uif.createMenuItem("treep.popup", "run", listener));
1111 popup.addSeparator();
1112 popup.add(refreshMI = uif.createMenuItem("treep.popup", "refresh", listener));
1113 popup.add(purgeMI = uif.createMenuItem("treep.popup", "clear", listener));
1114
1115 // get items from the test suite
1116 if (cm != null) {
1117 JavaTestContextMenu[] cms = cm.getContextMenus();
1118 if (cms != null) {
1119 popup.addSeparator();
1120
1121 for (int i = 0; i < cms.length; i++) {
1122 // filter out types of menus we don't want (not needed yet)
1123 // keep track of them for later
1124 switch (cms[i].getMenuApplication()) {
1125 case JavaTestContextMenu.TESTS_AND_FOLDERS:
1126 if (mixedMenus == null) {
1127 mixedMenus = new ArrayList<>();
1128 }
1129 mixedMenus.add(cms[i]);
1130 break;
1131 case JavaTestContextMenu.TESTS_ONLY:
1132 if (testMenus == null) {
1133 testMenus = new ArrayList<>();
1134 }
1135 testMenus.add(cms[i]);
1136 break;
1137 case JavaTestContextMenu.FOLDERS_ONLY:
1138 if (folderMenus == null) {
1139 folderMenus = new ArrayList<>();
1140 }
1141 folderMenus.add(cms[i]);
1142 break;
1143 case JavaTestContextMenu.CUSTOM:
1144 if (customMenus == null) {
1145 customMenus = new ArrayList<>();
1146 }
1147 customMenus.add(cms[i]);
1148 break;
1149 default:
1150 }
1151 popup.add(cms[i].getMenu());
1152 } // for
1153 }
1154 }
1155
1156 // disabled by default
1157 // will immediately be reevaluated when setParameters() is called
1158 runMI.setEnabled(false);
1159 refreshMI.setEnabled(false);
1160 purgeMI.setEnabled(false);
1161
1162 // setup top toolbar
1163 /*
1164 JPanel topPanel = uif.createPanel("treeTb", new GridBagLayout(), false);
1165 // NOTE intentional space added below to defeat
1320 if (customMenus != null) {
1321 for (int i = 0; i < customMenus.size(); i++) {
1322 ((JavaTestContextMenu) (customMenus.get(i))).getMenu().setEnabled(false);
1323 } // for
1324 }
1325 if (mixedMenus != null) {
1326 for (int i = 0; i < mixedMenus.size(); i++) {
1327 ((JavaTestContextMenu) (mixedMenus.get(i))).getMenu().setEnabled(false);
1328 } // for
1329 }
1330 if (folderMenus != null) {
1331 for (int i = 0; i < folderMenus.size(); i++) {
1332 ((JavaTestContextMenu) (folderMenus.get(i))).getMenu().setEnabled(false);
1333 } // for
1334 }
1335
1336 if (!(tree.getModel() instanceof EmptyTestTreeModel))
1337 throw new JavaTestError("Unknown node type from JTree!");
1338 }
1339 } else { // multiple nodes selected
1340 ArrayList<TestResult> tests = new ArrayList<>();
1341 ArrayList<String> folders = new ArrayList<>();
1342
1343 for (int i = 0; i < paths.length; i++) {
1344 Object item = paths[i];
1345
1346 if (item instanceof TreePath) {
1347 item = ((TreePath) item).getLastPathComponent();
1348 }
1349
1350 if (item instanceof TT_TestNode) {
1351 tests.add(((TT_TestNode) item).getTestResult());
1352 } else {
1353 TT_BasicNode bn = (TT_BasicNode)item;
1354 if (bn.isRoot())
1355 folders.add("");
1356 else
1357 folders.add(bn.getLongPath());
1358 }
1359 } // for
1360
1361 TestResult[] t = null;
1598
1599 return uif.showCustomYesNoDialog(prefix, p);
1600 }
1601
1602 /**
1603 * Does this panel currently have data to work from.
1604 */
1605 private boolean isPopulated() {
1606 if (params == null || params.getTestSuite() == null) {
1607 return false;
1608 } else {
1609 return true;
1610 }
1611 }
1612 private UIFactory uif;
1613 private Harness harness;
1614 private FilterSelectionHandler filterHandler;
1615 private ExecModel execModel;
1616 private JComponent parent;
1617 private Thread bgThread; // in case disposal is required
1618 private Map<String, String> stateMap; // startup state, read-only
1619 private volatile boolean disposed;
1620 private PanelModel pm;
1621 private TestTree tree;
1622 private TT_Renderer treeRend;
1623 private TestPanel testPanel;
1624 private BranchPanel brPanel;
1625 private MultiSelectPanel msPanel;
1626 private JPopupMenu popup;
1627 private TreePath lastPopupPath;
1628 private JMenuItem refreshMI;
1629 private JMenuItem purgeMI;
1630 private JMenuItem runMI;
1631 private String activeTest;
1632 private ArrayList<JavaTestContextMenu> testMenus, folderMenus, mixedMenus, customMenus;
1633 private TestTreeModel treeModel;
1634 private Deck deck;
1635 private JPanel deckPanel;
1636 private JTextField titleField;
1637 private Listener listener;
1638 private TestSuite lastTs; // last recorded testsuite
1639 private Parameters params;
1640 private Parameters newParams;
1641 private boolean newConfigAlreadyApplied = false;
1642 private boolean initialized = false;
1643 private static final int WAIT_DIALOG_DELAY = 3000; // 3 second delay
1644 private static final String OPEN_PATHS_PREF = "openpaths";
1645 static protected boolean debug = Boolean.getBoolean("debug." + TestTreePanel.class.getName());
1646
1647 /**
1648 * ET_Config method
1649 * @return null - no menu required
1650 */
1651 public JMenu getMenu() {
1652 return null;
1931
1932 public Object getValue(String key) {
1933 if (key == null) {
1934 throw new NullPointerException();
1935 }
1936 if (key.equals(NAME)) {
1937 return name;
1938 } else if (key.equals(SHORT_DESCRIPTION)) {
1939 return desc;
1940 } else {
1941 return null;
1942 }
1943 }
1944 private String name;
1945 private String desc;
1946 }
1947
1948 private class PanelModel implements TreePanelModel, Harness.Observer, TestResultTable.Observer {
1949
1950 PanelModel() {
1951 runningTests = new Hashtable<>();
1952 activeNodes = new Hashtable<>();
1953 }
1954
1955 public void pauseWork() {
1956 if (treeModel != null) {
1957 treeModel.pauseWork();
1958 }
1959 }
1960
1961 public void unpauseWork() {
1962 if (treeModel != null) {
1963 treeModel.unpauseWork();
1964 }
1965 }
1966
1967 public void refreshTree() {
1968 String[] openPaths = null;
1969 String[] selectedPaths = null;
1970 if (tree != null) {
1971 TreePath[] p = tree.snapshotOpenPaths();
1972 openPaths = treeModel.pathsToStrings(p);
2191 // asynchronous (non-user GUI) events occur
2192 // example - if a "clear" operation is done, which includes the shown test
2193 // SWITCH ONTO EVENT THREAD
2194 if (newValue.getTestName().equals(activeTest)) {
2195 TestResult lookupTr = treeModel.getTestResultTable().lookup(
2196 newValue.getWorkRelativePath());
2197 TreeNode[] nodes = TestResultTable.getObjectPath(lookupTr);
2198
2199 Object[] p = new Object[nodes.length + 1];
2200 System.arraycopy(nodes, 0, p, 0, nodes.length);
2201 p[p.length-1] = newValue;
2202 EventQueue.invokeLater(new Selector(newValue, new TreePath(p)));
2203 }
2204 */
2205 }
2206
2207 public void updated(TestResult whichTR) {
2208 // ignore
2209 }
2210 private Hashtable<String,TestResult> runningTests;
2211 private Hashtable<Object, Integer> activeNodes;
2212 private Integer ONE = Integer.valueOf(1);
2213 }
2214 }
|