/** * When called it will traverse all visible leaves in the browseTree and collapse them if they * have been open for too long and are not selected. */ private void collapseOldNodes() { Stack<ListableEntry> toConsider = new Stack< ListableEntry>(); // this is a stack of expanded nodes that need their children (and // themselves) to be considered. toConsider.push(fs.getBrowseRoot()); // we know these are always expanded, and uncollapsable. toConsider.push(fs.getSearchRoot()); // " " " // a) mark all uncollapsable nodes TreePath[] selecteds = browseTree.getSelectionPaths(); if (selecteds != null) { for (TreePath selected : selecteds) { for (Object toMark : selected.getPath()) { // a selected nodes and their ancestors are not collapsable. expandedTimes.put(toMark, System.currentTimeMillis()); } } } // b) collapse old expanded nodes. while (!toConsider.empty()) { for (FileSystemEntry child : toConsider.pop().getAllChildren()) { if (browseTree.isExpanded(child.getPath())) { toConsider.push(child); if (System.currentTimeMillis() - expandedTimes.get(child) > FS2Constants.CLIENT_BROWSETREE_COLLAPSE_INTERVAL) { browseTree.collapsePath(child.getPath()); expandedTimes.remove(child); } } } } }
@Override public void mouseClicked(MouseEvent e) { if (e.getSource() == filesTable) { if (e.getClickCount() == 2 && e.getModifiersEx() == 0) { // the modifiers test is to prevent absurd clicks like "b1, b3" registering as // double-clicks. if (filesTable.getSelectedRow() >= 0) { FileSystemEntry clicked = fs.getEntryForRow(filesTable.convertRowIndexToModel(filesTable.getSelectedRow())); if (clicked.isDirectory()) { // Go into the directory: TreePath pathToClicked = clicked.getPath(); browseTree.setSelectionPath(pathToClicked); browseTree.scrollPathToVisible(pathToClicked); browseTree.setSelectionPath( pathToClicked); // the first one may have expanded the node and changed the // selection, so ensure the node we want is actually selected. } else { downloadToDirectory(Arrays.asList(new FileSystemEntry[] {clicked}), null, null); frame.setStatusHint( new StatusHint( frame.gui.util.getImage("tick"), clicked.getName() + " queued for download!")); } } } } if (e.getSource() == browseTree) { // remove a search if they clicked on the searches icon. if (lastOnIcon && lastInspectedFSE instanceof FileSystemEntry && ((FileSystemEntry) lastInspectedFSE).isSearch()) { fs.removeSearch((FileSystemEntry) lastInspectedFSE); lastInspectedFSE = null; // doesn't exist anymore. lastOnIcon = false; mouseMoved( new MouseEvent( browseTree, 0, System.currentTimeMillis(), 0, e.getX(), e.getY(), 0, false)); // simulate the mouse moving to update status bar and icons. } // remove all searches if the clicked the searchroot: if (lastInspectedFSE == fs.getSearchRoot()) { fs.removeAllSearches(); } } }