📄 vfsbrowser.java
字号:
} /** * Returns the file name filter glob. * @since jEdit 3.2pre2 */ public String getFilenameFilter() { if(filterCheckbox.isSelected()) { String filter = filterField.getText(); if(filter.length() == 0) return "*"; else return filter; } else return "*"; } public void setFilenameFilter(String filter) { if(filter == null || filter.length() == 0 || filter.equals("*")) filterCheckbox.setSelected(false); else { filterCheckbox.setSelected(true); filterField.setText(filter); } } public BrowserView getBrowserView() { return browserView; } public VFS.DirectoryEntry[] getSelectedFiles() { return browserView.getSelectedFiles(); } public void addBrowserListener(BrowserListener l) { listenerList.add(BrowserListener.class,l); } public void removeBrowserListener(BrowserListener l) { listenerList.remove(BrowserListener.class,l); } // package-private members void directoryLoaded(final VFS.DirectoryEntry[] list) { SwingUtilities.invokeLater(new Runnable() { public void run() { boolean filterEnabled = filterCheckbox.isSelected(); Vector directoryVector = new Vector(); if(list == null) { browserView.directoryLoaded(directoryVector); return; } for(int i = 0; i < list.length; i++) { VFS.DirectoryEntry file = list[i]; if(file.hidden && !showHiddenFiles) continue; if(file.type == VFS.DirectoryEntry.FILE && filterEnabled && filenameFilter != null && !filenameFilter.isMatch(file.name)) continue; directoryVector.addElement(file); } if(sortFiles) { MiscUtilities.quicksort(directoryVector, new FileCompare()); } browserView.directoryLoaded(directoryVector); } }); } class FileCompare implements MiscUtilities.Compare { public int compare(Object obj1, Object obj2) { VFS.DirectoryEntry file1 = (VFS.DirectoryEntry)obj1; VFS.DirectoryEntry file2 = (VFS.DirectoryEntry)obj2; if(!sortMixFilesAndDirs) { if(file1.type != file2.type) return file2.type - file1.type; } if(sortIgnoreCase) { return file1.name.toLowerCase().compareTo( file2.name.toLowerCase()); } else { return file1.name.compareTo(file2.name); } } } void filesSelected() { VFS.DirectoryEntry[] selectedFiles = browserView.getSelectedFiles(); if(mode == BROWSER) { for(int i = 0; i < selectedFiles.length; i++) { VFS.DirectoryEntry file = selectedFiles[i]; Buffer buffer = jEdit.getBuffer(file.path); if(buffer != null && view != null) view.setBuffer(buffer); } } Object[] listeners = listenerList.getListenerList(); for(int i = 0; i < listeners.length; i++) { if(listeners[i] == BrowserListener.class) { BrowserListener l = (BrowserListener)listeners[i+1]; l.filesSelected(this,selectedFiles); } } } void filesActivated() { VFS.DirectoryEntry[] selectedFiles = browserView.getSelectedFiles(); for(int i = 0; i < selectedFiles.length; i++) { VFS.DirectoryEntry file = selectedFiles[i]; if(file.type == VFS.DirectoryEntry.DIRECTORY || file.type == VFS.DirectoryEntry.FILESYSTEM) setDirectory(file.path); else if(mode == BROWSER) { Buffer buffer = jEdit.getBuffer(file.path); if(buffer == null) buffer = jEdit.openFile(null,file.path); else if(doubleClickClose) { jEdit.closeBuffer(view,buffer); break; } if(buffer != null) { if(view == null) view = jEdit.newView(null,buffer); else view.setBuffer(buffer); } } else { // if a file is selected in OPEN_DIALOG or // SAVE_DIALOG mode, just let the listener(s) // handle it } } Object[] listeners = listenerList.getListenerList(); for(int i = 0; i < listeners.length; i++) { if(listeners[i] == BrowserListener.class) { BrowserListener l = (BrowserListener)listeners[i+1]; l.filesActivated(this,selectedFiles); } } } // has to be package-private so that BrowserIORequest can call it void endRequest() { requestRunning = false; } // private members private EventListenerList listenerList; private View view; private String path; private HistoryTextField pathField; private JCheckBox filterCheckbox; private HistoryTextField filterField; private JButton up, reload, roots, home, synchronize; private BrowserView browserView; private RE filenameFilter; private int mode; private boolean multipleSelection; private boolean showHiddenFiles; private boolean sortFiles; private boolean sortMixFilesAndDirs; private boolean sortIgnoreCase; private boolean doubleClickClose; private boolean requestRunning; private JToolBar createToolBar() { JToolBar toolBar = new JToolBar(); toolBar.setFloatable(false); toolBar.putClientProperty("JToolBar.isRollover",Boolean.TRUE); toolBar.add(up = createToolButton("up")); // see comment in UpMenuButton class to find out why we // pass it the up button toolBar.add(new UpMenuButton(up)); toolBar.add(reload = createToolButton("reload")); toolBar.addSeparator(); toolBar.add(roots = createToolButton("roots")); toolBar.add(home = createToolButton("home")); toolBar.add(synchronize = createToolButton("synchronize")); toolBar.addSeparator(); toolBar.add(new MoreMenuButton()); toolBar.add(Box.createGlue()); return toolBar; } private JButton createToolButton(String name) { JButton button = new JButton(); String prefix = "vfs.browser."; button.setIcon(GUIUtilities.loadIcon(jEdit.getProperty( prefix + name + ".icon"))); button.setToolTipText(jEdit.getProperty(prefix + name + ".label")); button.setRequestFocusEnabled(false); button.setMargin(new Insets(0,0,0,0)); button.addActionListener(new ActionHandler()); return button; } private void handleViewUpdate(ViewUpdate vmsg) { if(vmsg.getWhat() == ViewUpdate.CLOSED && vmsg.getView() == view) view = null; } private void handleBufferUpdate(BufferUpdate bmsg) { if(bmsg.getWhat() == BufferUpdate.CREATED || bmsg.getWhat() == BufferUpdate.CLOSED) browserView.updateFileView(); else if(bmsg.getWhat() == BufferUpdate.DIRTY_CHANGED) { // if a buffer becomes clean, it means it was // saved. So we repaint the browser view, in // case it was a 'save as' if(!bmsg.getBuffer().isDirty()) browserView.updateFileView(); } } private void propertiesChanged() { showHiddenFiles = jEdit.getBooleanProperty("vfs.browser.showHiddenFiles"); sortFiles = jEdit.getBooleanProperty("vfs.browser.sortFiles"); sortMixFilesAndDirs = jEdit.getBooleanProperty("vfs.browser.sortMixFilesAndDirs"); sortIgnoreCase = jEdit.getBooleanProperty("vfs.browser.sortIgnoreCase"); doubleClickClose = jEdit.getBooleanProperty("vfs.browser.doubleClickClose"); browserView.propertiesChanged(); if(path != null) reloadDirectory(); } /* We do this stuff because the browser is not able to handle * more than one request yet */ private boolean startRequest() { if(requestRunning) { // dump stack trace for debugging purposes Log.log(Log.DEBUG,this,new Throwable("For debugging purposes")); GUIUtilities.error(this,"browser-multiple-io",null); return false; } else { requestRunning = true; return true; } } private void updateFilterEnabled() { filterField.setEnabled(filterCheckbox.isSelected()); } class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if(source == pathField || source == filterField || source == filterCheckbox) { updateFilterEnabled(); String path = pathField.getText(); if(path != null) setDirectory(path); } else if(source == up) { VFS vfs = VFSManager.getVFSForPath(path); setDirectory(vfs.getParentOfPath(path)); } else if(source == reload) reloadDirectory(); else if(source == roots) setDirectory(FileRootsVFS.PROTOCOL + ":"); else if(source == home) setDirectory(System.getProperty("user.home")); else if(source == synchronize) { if(view != null) { Buffer buffer = view.getBuffer(); setDirectory(buffer.getVFS().getParentOfPath( buffer.getPath())); } else getToolkit().beep(); } } } class UpMenuButton extends JButton { UpMenuButton(JButton upButton) { // for a better-looking GUI, we display the popup // as if it is from the 'up' button, not the arrow // to the right of it this.upButton = upButton; setIcon(GUIUtilities.loadIcon( jEdit.getProperty("vfs.browser.up-menu.icon"))); UpMenuButton.this.setToolTipText(jEdit.getProperty( "vfs.browser.up-menu.label")); UpMenuButton.this.setRequestFocusEnabled(false); setMargin(new Insets(0,0,0,0)); UpMenuButton.this.addMouseListener(new MouseHandler()); } // private members private JButton upButton; private JPopupMenu popup; private void createPopup() { popup = new JPopupMenu(); ActionHandler actionHandler = new ActionHandler(); VFS vfs = VFSManager.getVFSForPath(path); String dir = vfs.getParentOfPath(path); for(;;) { JMenuItem menuItem = new JMenuItem(dir); menuItem.addActionListener(actionHandler); popup.add(menuItem); String parentDir = vfs.getParentOfPath(dir); if(parentDir.equals(dir)) break; else dir = parentDir; } } class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { setDirectory(evt.getActionCommand()); } } class MouseHandler extends MouseAdapter { public void mousePressed(MouseEvent evt) { if(popup == null || !popup.isVisible()) { createPopup(); popup.show(upButton,0,upButton.getHeight()); } else { popup.setVisible(false); popup = null; } } } } class MoreMenuButton extends JButton { MoreMenuButton() { setText(jEdit.getProperty("vfs.browser.more.label")); setIcon(GUIUtilities.loadIcon(jEdit.getProperty( "vfs.browser.more.icon"))); setHorizontalTextPosition(SwingConstants.LEFT); MoreMenuButton.this.setRequestFocusEnabled(false); setMargin(new Insets(0,0,0,0)); MoreMenuButton.this.addMouseListener(new MouseHandler()); } // private members JPopupMenu popup; class MouseHandler extends MouseAdapter { public void mousePressed(MouseEvent evt) { if(popup == null || !popup.isVisible()) { popup = new BrowserPopupMenu(VFSBrowser.this,null); popup.show(MoreMenuButton.this,0,MoreMenuButton.this.getHeight()); } else { popup.setVisible(false); popup = null; } } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -