📄 browserview.java
字号:
{ public int getSize() { return model.length; } public Object getElementAt(int i) { return model[i]; } }); } //}}} //}}} //{{{ Inner classes //{{{ ClearTypeSelect class ClearTypeSelect implements ActionListener { public void actionPerformed(ActionEvent evt) { typeSelectBuffer.setLength(0); browser.filesSelected(); } } //}}} //{{{ ParentDirectoryRenderer class class ParentDirectoryRenderer extends DefaultListCellRenderer { Font plainFont, boldFont; ParentDirectoryRenderer() { plainFont = UIManager.getFont("Tree.font"); boldFont = new Font(plainFont.getName(),Font.BOLD,plainFont.getSize()); } public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list,value,index, isSelected,cellHasFocus); ParentDirectoryRenderer.this.setBorder(new EmptyBorder( 1,index * 5 + 1,1,1)); if(value instanceof LoadingPlaceholder) { ParentDirectoryRenderer.this.setFont(plainFont); setIcon(showIcons ? FileCellRenderer.loadingIcon : null); setText(jEdit.getProperty("vfs.browser.tree.loading")); } else if(value instanceof VFS.DirectoryEntry) { VFS.DirectoryEntry dirEntry = (VFS.DirectoryEntry)value; ParentDirectoryRenderer.this.setFont(boldFont); setIcon(showIcons ? FileCellRenderer.getIconForFile(dirEntry,true) : null); setText(dirEntry.name); } else if(value == null) setText("VFS does not follow VFS API"); return this; } } //}}} //{{{ MouseHandler class class MouseHandler extends MouseAdapter { public void mousePressed(MouseEvent evt) { int row = parentDirectories.locationToIndex(evt.getPoint()); if(row != -1) { Object obj = parentDirectories.getModel() .getElementAt(row); if(obj instanceof VFS.DirectoryEntry) { VFS.DirectoryEntry dirEntry = ((VFS.DirectoryEntry)obj); if(GUIUtilities.isPopupTrigger(evt)) { if(popup != null && popup.isVisible()) { popup.setVisible(false); popup = null; } else { parentDirectories.setSelectedIndex(row); showFilePopup(new VFS.DirectoryEntry[] { dirEntry },parentDirectories, evt.getPoint()); } } } } } public void mouseReleased(MouseEvent evt) { if(evt.getClickCount() % 2 != 0 && !GUIUtilities.isMiddleButton(evt.getModifiers())) return; int row = parentDirectories.locationToIndex(evt.getPoint()); if(row != -1) { Object obj = parentDirectories.getModel() .getElementAt(row); if(obj instanceof VFS.DirectoryEntry) { VFS.DirectoryEntry dirEntry = ((VFS.DirectoryEntry)obj); if(!GUIUtilities.isPopupTrigger(evt)) { browser.setDirectory(dirEntry.path); focusOnFileView(); } } } } } //}}} //{{{ BrowserJTree class class BrowserJTree extends JTree { //{{{ BrowserJTree constructor BrowserJTree(TreeModel model) { super(model); ToolTipManager.sharedInstance().registerComponent(this); } //}}} //{{{ getToolTipText() method public final String getToolTipText(MouseEvent evt) { TreePath path = getPathForLocation(evt.getX(), evt.getY()); if(path != null) { Rectangle cellRect = getPathBounds(path); if(cellRect != null && !cellRectIsVisible(cellRect)) return path.getLastPathComponent().toString(); } return null; } //}}} /* //{{{ getToolTipLocation() method public final Point getToolTipLocation(MouseEvent evt) { TreePath path = getPathForLocation(evt.getX(), evt.getY()); if(path != null) { Rectangle cellRect = getPathBounds(path); if(cellRect != null && !cellRectIsVisible(cellRect)) { return new Point(cellRect.x + (showIcons ? 14 : - 4), cellRect.y); } } return null; } //}}} */ //{{{ processKeyEvent() method public void processKeyEvent(KeyEvent evt) { // could make things somewhat easier... // ... but KeyEventWorkaround 'output contract' will // change in 4.1, so not a good idea //evt = KeyEventWorkaround.processKeyEvent(evt); //if(evt == null) // return; if(evt.getID() == KeyEvent.KEY_PRESSED) { switch(evt.getKeyCode()) { case KeyEvent.VK_UP: case KeyEvent.VK_DOWN: super.processKeyEvent(evt); if(browser.getMode() != VFSBrowser.BROWSER) browser.filesSelected(); break; case KeyEvent.VK_ENTER: browser.filesActivated((evt.isShiftDown() ? VFSBrowser.M_OPEN_NEW_VIEW : VFSBrowser.M_OPEN),false); evt.consume(); break; case KeyEvent.VK_LEFT: String directory = browser.getDirectory(); browser.setDirectory(MiscUtilities .getParentOfPath(directory)); evt.consume(); break; } } else if(evt.getID() == KeyEvent.KEY_TYPED) { if(evt.isControlDown() || evt.isAltDown() || evt.isMetaDown()) { return; } // hack... if(evt.isShiftDown() && evt.getKeyChar() == '\n') return; switch(evt.getKeyChar()) { case '~': browser.setDirectory(System.getProperty("user.home")); break; case '/': browser.rootDirectory(); break; case '-': View view = browser.getView(); Buffer buffer = view.getBuffer(); browser.setDirectory(buffer.getDirectory()); break; default: typeSelectBuffer.append(evt.getKeyChar()); doTypeSelect(typeSelectBuffer.toString(),true); timer.stop(); timer.setInitialDelay(750); timer.setRepeats(false); timer.start(); break; } return; } if(!evt.isConsumed()) super.processKeyEvent(evt); } //}}} //{{{ processMouseEvent() method protected void processMouseEvent(MouseEvent evt) { //ToolTipManager ttm = ToolTipManager.sharedInstance(); TreePath path = getPathForLocation(evt.getX(),evt.getY()); switch(evt.getID()) { /* //{{{ MOUSE_ENTERED... case MouseEvent.MOUSE_ENTERED: toolTipInitialDelay = ttm.getInitialDelay(); toolTipReshowDelay = ttm.getReshowDelay(); ttm.setInitialDelay(200); ttm.setReshowDelay(0); super.processMouseEvent(evt); break; //}}} //{{{ MOUSE_EXITED... case MouseEvent.MOUSE_EXITED: ttm.setInitialDelay(toolTipInitialDelay); ttm.setReshowDelay(toolTipReshowDelay); super.processMouseEvent(evt); break; //}}} */ //{{{ MOUSE_CLICKED... case MouseEvent.MOUSE_CLICKED: if(path != null) { // A double click is not only when clickCount == 2 // because every other click can open a new directory if((evt.getModifiers() & MouseEvent.BUTTON1_MASK) != 0 && evt.getClickCount() % 2 == 0) { setSelectionPath(path); // don't pass double-clicks to tree, otherwise // directory nodes will be expanded and we don't // want that browser.filesActivated((evt.isShiftDown() ? VFSBrowser.M_OPEN_NEW_VIEW : VFSBrowser.M_OPEN),true); break; } else if(GUIUtilities.isMiddleButton(evt.getModifiers())) { browser.filesActivated((evt.isShiftDown() ? VFSBrowser.M_OPEN_NEW_VIEW : VFSBrowser.M_OPEN),true); } else if((evt.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) { if(!isPathSelected(path)) setSelectionPath(path); } super.processMouseEvent(evt); break; } else if(GUIUtilities.isPopupTrigger(evt)) break; //}}} //{{{ MOUSE_PRESSED... case MouseEvent.MOUSE_PRESSED: if((evt.getModifiers() & MouseEvent.BUTTON1_MASK) != 0) { if(evt.getClickCount() % 2 == 0) break; } if(GUIUtilities.isMiddleButton(evt.getModifiers())) { if(!isPathSelected(path)) setSelectionPath(path); } else if(GUIUtilities.isPopupTrigger(evt)) { if(popup != null && popup.isVisible()) { popup.setVisible(false); popup = null; break; } if(path == null) showFilePopup(null,this,evt.getPoint()); else { if(!isPathSelected(path)) setSelectionPath(path); showFilePopup(getSelectedFiles(),this,evt.getPoint()); } break; } super.processMouseEvent(evt); break; //}}} //{{{ MOUSE_RELEASED... case MouseEvent.MOUSE_RELEASED: if(!GUIUtilities.isPopupTrigger(evt) && path != null) { browser.filesSelected(); } if(evt.getClickCount() % 2 != 0) super.processMouseEvent(evt); break; //}}} default: super.processMouseEvent(evt); break; } } //}}} //{{{ Private members private int toolTipInitialDelay = -1; private int toolTipReshowDelay = -1; //{{{ cellRectIsVisible() method private boolean cellRectIsVisible(Rectangle cellRect) { Rectangle vr = BrowserJTree.this.getVisibleRect(); return vr.contains(cellRect.x,cellRect.y) && vr.contains(cellRect.x + cellRect.width, cellRect.y + cellRect.height); } //}}} //{{{ doTypeSelect() method void doTypeSelect(String str, boolean ignoreCase) { if(getSelectionCount() == 0) doTypeSelect(str,0,getRowCount(),ignoreCase); else { int start = getMaxSelectionRow(); boolean retVal = doTypeSelect(str,start,getRowCount(), ignoreCase); if(!retVal) { // scan from selection to end failed, so // scan from start to selection doTypeSelect(str,0,start,ignoreCase); } } } //}}} //{{{ doTypeSelect() method private boolean doTypeSelect(String str, int start, int end, boolean ignoreCase) { for(int i = start; i < end; i++) { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) getPathForRow(i).getLastPathComponent(); Object obj = treeNode.getUserObject(); if(obj instanceof VFS.DirectoryEntry) { VFS.DirectoryEntry file = (VFS.DirectoryEntry)obj; String matchAgainst = (MiscUtilities.isAbsolutePath(str) ? file.path : file.name); if(matchAgainst.regionMatches(ignoreCase, 0,str,0,str.length())) { setSelectionRow(i); scrollRowToVisible(i); return true; } } } return false; } //}}} //}}} } //}}} //{{{ TreeHandler class class TreeHandler implements TreeExpansionListener { //{{{ treeExpanded() method public void treeExpanded(TreeExpansionEvent evt) { TreePath path = evt.getPath(); DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) path.getLastPathComponent(); Object userObject = treeNode.getUserObject(); if(userObject instanceof VFS.DirectoryEntry) { loadDirectory(treeNode,((VFS.DirectoryEntry) userObject).path,true); } } //}}} //{{{ treeCollapsed() method public void treeCollapsed(TreeExpansionEvent evt) { TreePath path = evt.getPath(); DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) path.getLastPathComponent(); if(treeNode.getUserObject() instanceof VFS.DirectoryEntry) { // we add the placeholder so that the node has // 1 child (otherwise the user won't be able to // expand it again) treeNode.removeAllChildren(); treeNode.add(new DefaultMutableTreeNode(new LoadingPlaceholder(),false)); model.reload(treeNode); } } //}}} } //}}} static class LoadingPlaceholder {} //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -