PageRenderTime 97ms CodeModel.GetById 21ms RepoModel.GetById 3ms app.codeStats 0ms

/jEdit/tags/jedit-4-5-pre1/org/gjt/sp/jedit/browser/BrowserView.java

#
Java | 756 lines | 564 code | 79 blank | 113 comment | 108 complexity | 88e73080cd0149f544dd4e40224aff26 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
  1. /*
  2. * BrowserView.java
  3. * :tabSize=8:indentSize=8:noTabs=false:
  4. * :folding=explicit:collapseFolds=1:
  5. *
  6. * Copyright (C) 2000, 2003 Slava Pestov
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License
  10. * as published by the Free Software Foundation; either version 2
  11. * of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  21. */
  22. package org.gjt.sp.jedit.browser;
  23. //{{{ Imports
  24. import javax.swing.border.EmptyBorder;
  25. import javax.swing.event.*;
  26. import javax.swing.*;
  27. import java.awt.event.*;
  28. import java.awt.*;
  29. import java.io.File;
  30. import java.io.IOException;
  31. import java.util.*;
  32. import org.gjt.sp.jedit.gui.DockableWindowManager;
  33. import org.gjt.sp.jedit.io.*;
  34. import org.gjt.sp.jedit.*;
  35. import org.gjt.sp.util.Log;
  36. import org.gjt.sp.util.ThreadUtilities;
  37. //}}}
  38. /**
  39. * VFS browser tree view.
  40. * @author Slava Pestov
  41. * @version $Id: BrowserView.java 19692 2011-07-22 15:27:56Z kpouer $
  42. */
  43. class BrowserView extends JPanel
  44. {
  45. //{{{ BrowserView constructor
  46. BrowserView(final VFSBrowser browser)
  47. {
  48. this.browser = browser;
  49. tmpExpanded = new HashSet<String>();
  50. DockableWindowManager dwm = jEdit.getActiveView().getDockableWindowManager();
  51. KeyListener keyListener = dwm.closeListener(VFSBrowser.NAME);
  52. parentDirectories = new ParentDirectoryList();
  53. parentDirectories.addKeyListener(keyListener);
  54. parentDirectories.setName("parent");
  55. parentDirectories.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  56. parentDirectories.setCellRenderer(new ParentDirectoryRenderer());
  57. parentDirectories.setVisibleRowCount(5);
  58. parentDirectories.addMouseListener(new ParentMouseHandler());
  59. final JScrollPane parentScroller = new JScrollPane(parentDirectories);
  60. parentScroller.setMinimumSize(new Dimension(0,0));
  61. table = new VFSDirectoryEntryTable(this);
  62. table.addMouseListener(new TableMouseHandler());
  63. table.setName("file");
  64. JScrollPane tableScroller = new JScrollPane(table);
  65. tableScroller.setMinimumSize(new Dimension(0,0));
  66. tableScroller.getViewport().setBackground(table.getBackground());
  67. tableScroller.getViewport().addMouseListener(new TableMouseHandler());
  68. splitPane = new JSplitPane(
  69. browser.isHorizontalLayout()
  70. ? JSplitPane.HORIZONTAL_SPLIT : JSplitPane.VERTICAL_SPLIT,
  71. jEdit.getBooleanProperty("appearance.continuousLayout"),
  72. parentScroller, tableScroller);
  73. splitPane.setOneTouchExpandable(true);
  74. EventQueue.invokeLater(new Runnable()
  75. {
  76. public void run()
  77. {
  78. String prop = browser.isHorizontalLayout() ? "vfs.browser.horizontalSplitter" : "vfs.browser.splitter";
  79. int loc = jEdit.getIntegerProperty(prop,-1);
  80. if(loc == -1)
  81. loc = parentScroller.getPreferredSize().height;
  82. splitPane.setDividerLocation(loc);
  83. parentDirectories.ensureIndexIsVisible(
  84. parentDirectories.getModel()
  85. .getSize());
  86. }
  87. });
  88. if(browser.isMultipleSelectionEnabled())
  89. table.getSelectionModel().setSelectionMode(
  90. ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
  91. else
  92. table.getSelectionModel().setSelectionMode(
  93. ListSelectionModel.SINGLE_SELECTION);
  94. setLayout(new BorderLayout());
  95. add(BorderLayout.CENTER,splitPane);
  96. propertiesChanged();
  97. } //}}}
  98. //{{{ focusOnFileView() method
  99. public void focusOnFileView()
  100. {
  101. table.requestFocus();
  102. } //}}}
  103. //{{{ removeNotify() method
  104. @Override
  105. public void removeNotify()
  106. {
  107. String prop = browser.isHorizontalLayout() ? "vfs.browser.horizontalSplitter" : "vfs.browser.splitter";
  108. jEdit.setIntegerProperty(prop,splitPane.getDividerLocation());
  109. super.removeNotify();
  110. } //}}}
  111. //{{{ getSelectedFiles() method
  112. public VFSFile[] getSelectedFiles()
  113. {
  114. return table.getSelectedFiles();
  115. } //}}}
  116. //{{{ selectNone() method
  117. public void selectNone()
  118. {
  119. table.clearSelection();
  120. } //}}}
  121. //{{{ saveExpansionState() method
  122. public void saveExpansionState()
  123. {
  124. tmpExpanded.clear();
  125. table.getExpandedDirectories(tmpExpanded);
  126. } //}}}
  127. //{{{ clearExpansionState() method
  128. public void clearExpansionState()
  129. {
  130. tmpExpanded.clear();
  131. } //}}}
  132. //{{{ loadDirectory() method
  133. public void loadDirectory(Object node, String path,
  134. boolean addToHistory)
  135. {
  136. loadDirectory(node, path, addToHistory, null);
  137. } //}}}
  138. //{{{ loadDirectory() method
  139. public void loadDirectory(final Object node, String path,
  140. final boolean addToHistory, final Runnable delayedAWTTask)
  141. {
  142. path = MiscUtilities.constructPath(browser.getDirectory(),path);
  143. VFS vfs = VFSManager.getVFSForPath(path);
  144. Object session = vfs.createVFSSession(path,this);
  145. if(session == null)
  146. return;
  147. if(node == null)
  148. {
  149. parentDirectories.setListData(new Object[] {
  150. new LoadingPlaceholder() });
  151. }
  152. final Object[] loadInfo = new Object[2];
  153. Runnable awtRunnable = new Runnable()
  154. {
  155. public void run()
  156. {
  157. browser.directoryLoaded(node,loadInfo,addToHistory);
  158. if (delayedAWTTask != null)
  159. delayedAWTTask.run();
  160. }
  161. };
  162. ThreadUtilities.runInBackground(new ListDirectoryBrowserTask(browser,
  163. session, vfs, path, loadInfo, awtRunnable));
  164. } //}}}
  165. //{{{ directoryLoaded() method
  166. /**
  167. * Rebuild the parent view after a directory has been loaded.
  168. *
  169. * @param node
  170. * @param path
  171. * @param directory
  172. */
  173. public void directoryLoaded(Object node, String path, java.util.List<VFSFile> directory)
  174. {
  175. //{{{ If reloading root, update parent directory list
  176. if(node == null)
  177. {
  178. DefaultListModel parentList = new DefaultListModel();
  179. String parent = path;
  180. for(;;)
  181. {
  182. VFS _vfs = VFSManager.getVFSForPath(parent);
  183. VFSFile file = null;
  184. if (_vfs instanceof FileVFS)
  185. {
  186. Object session = _vfs.createVFSSession(path, browser);
  187. try
  188. {
  189. file = _vfs._getFile(session, parent, browser);
  190. if (file != null)
  191. {
  192. file.setName(_vfs.getFileName(parent));
  193. }
  194. }
  195. catch (IOException e)
  196. {
  197. Log.log(Log.ERROR, this, e, e);
  198. }
  199. }
  200. if (file == null)
  201. {
  202. // create a DirectoryEntry manually
  203. // instead of using _vfs._getFile()
  204. // since so many VFS's have broken
  205. // implementations of this method
  206. file = new VFSFile(
  207. _vfs.getFileName(parent),
  208. parent,parent,
  209. VFSFile.DIRECTORY,
  210. 0L,false);
  211. }
  212. /*parentList.insertElementAt(new VFSFile(
  213. _vfs.getFileName(parent),
  214. parent,parent,
  215. VFSFile.DIRECTORY,
  216. 0L,false),0);*/
  217. parentList.insertElementAt(file,0);
  218. String newParent = _vfs.getParentOfPath(parent);
  219. if(newParent == null ||
  220. MiscUtilities.pathsEqual(parent,newParent))
  221. break;
  222. else
  223. parent = newParent;
  224. }
  225. parentDirectories.setModel(parentList);
  226. int index = parentList.getSize() - 1;
  227. parentDirectories.setSelectedIndex(index);
  228. parentDirectories.ensureIndexIsVisible(index);
  229. } //}}}
  230. table.setDirectory(VFSManager.getVFSForPath(path),
  231. node,directory,tmpExpanded);
  232. } //}}}
  233. //{{{ updateFileView() method
  234. public void updateFileView()
  235. {
  236. table.repaint();
  237. } //}}}
  238. //{{{ maybeReloadDirectory() method
  239. public void maybeReloadDirectory(String path)
  240. {
  241. String browserDir = browser.getDirectory();
  242. String symlinkBrowserDir;
  243. if(MiscUtilities.isURL(browserDir))
  244. {
  245. symlinkBrowserDir = browserDir;
  246. }
  247. else
  248. {
  249. symlinkBrowserDir = MiscUtilities.resolveSymlinks(
  250. browserDir);
  251. }
  252. if(MiscUtilities.pathsEqual(path,symlinkBrowserDir))
  253. {
  254. saveExpansionState();
  255. loadDirectory(null,browserDir,false);
  256. }
  257. // because this method is called for *every* VFS update,
  258. // we don't want to scan the tree all the time. So we
  259. // use the following algorithm to determine if the path
  260. // might be part of the tree:
  261. // - if the path starts with the browser's current directory,
  262. // we do the tree scan
  263. // - if the browser's directory is 'favorites:' -- we have to
  264. // do the tree scan, as every path can appear under the
  265. // favorites list
  266. // - if the browser's directory is 'roots:' and path is on
  267. // the local filesystem, do a tree scan
  268. if(!browserDir.startsWith(FavoritesVFS.PROTOCOL)
  269. && !browserDir.startsWith(FileRootsVFS.PROTOCOL)
  270. && !path.startsWith(symlinkBrowserDir))
  271. return;
  272. if(browserDir.startsWith(FileRootsVFS.PROTOCOL)
  273. && MiscUtilities.isURL(path)
  274. && !"file".equals(MiscUtilities.getProtocolOfURL(path)))
  275. return;
  276. table.maybeReloadDirectory(path);
  277. } //}}}
  278. //{{{ propertiesChanged() method
  279. public void propertiesChanged()
  280. {
  281. showIcons = jEdit.getBooleanProperty("vfs.browser.showIcons");
  282. table.propertiesChanged();
  283. GUIUtilities.initContinuousLayout(splitPane);
  284. splitPane.setBorder(null);
  285. } //}}}
  286. //{{{ getBrowser() method
  287. /**
  288. * Returns the associated <code>VFSBrowser</code> instance.
  289. * @since jEdit 4.2pre1
  290. */
  291. public VFSBrowser getBrowser()
  292. {
  293. return browser;
  294. } //}}}
  295. //{{{ getTable() method
  296. public VFSDirectoryEntryTable getTable()
  297. {
  298. return table;
  299. } //}}}
  300. //{{{ getParentDirectoryList() method
  301. public JList getParentDirectoryList()
  302. {
  303. return parentDirectories;
  304. } //}}}
  305. //{{{ Private members
  306. //{{{ Instance variables
  307. private final VFSBrowser browser;
  308. private final JSplitPane splitPane;
  309. private final JList parentDirectories;
  310. private final VFSDirectoryEntryTable table;
  311. private final Set<String> tmpExpanded;
  312. private BrowserCommandsMenu popup;
  313. private boolean showIcons;
  314. //}}}
  315. //{{{ showFilePopup() method
  316. private void showFilePopup(VFSFile[] files, Component comp,
  317. Point point)
  318. {
  319. popup = new BrowserCommandsMenu(browser,files);
  320. // for the parent directory right-click; on the click we select
  321. // the clicked item, but when the popup goes away we select the
  322. // currently showing directory.
  323. popup.addPopupMenuListener(new PopupMenuListener()
  324. {
  325. public void popupMenuCanceled(PopupMenuEvent e) {}
  326. public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
  327. public void popupMenuWillBecomeInvisible(PopupMenuEvent e)
  328. {
  329. // we use SwingUtilities.invokeLater()
  330. // so that the action is executed before
  331. // the popup is hidden.
  332. EventQueue.invokeLater(new Runnable()
  333. {
  334. public void run()
  335. {
  336. int index = parentDirectories
  337. .getModel()
  338. .getSize() - 1;
  339. parentDirectories.setSelectedIndex(index);
  340. }
  341. });
  342. }
  343. });
  344. GUIUtilities.showPopupMenu(popup,comp,point.x,point.y);
  345. } //}}}
  346. //}}}
  347. //{{{ Inner classes
  348. //{{{ ParentDirectoryRenderer class
  349. class ParentDirectoryRenderer extends DefaultListCellRenderer
  350. {
  351. private Font plainFont;
  352. private final Font boldFont;
  353. ParentDirectoryRenderer()
  354. {
  355. plainFont = UIManager.getFont("Tree.font");
  356. if(plainFont == null)
  357. plainFont = jEdit.getFontProperty("metal.secondary.font");
  358. boldFont = new Font(plainFont.getName(),Font.BOLD,plainFont.getSize());
  359. }
  360. @Override
  361. public Component getListCellRendererComponent(
  362. JList list,
  363. Object value,
  364. int index,
  365. boolean isSelected,
  366. boolean cellHasFocus)
  367. {
  368. super.getListCellRendererComponent(list,value,index,
  369. isSelected,cellHasFocus);
  370. ParentDirectoryRenderer.this.setBorder(new EmptyBorder(
  371. 1,index * 5 + 1,1,1));
  372. if(value instanceof LoadingPlaceholder)
  373. {
  374. ParentDirectoryRenderer.this.setFont(plainFont);
  375. setIcon(showIcons ? FileCellRenderer.loadingIcon : null);
  376. setText(jEdit.getProperty("vfs.browser.tree.loading"));
  377. }
  378. else if(value instanceof VFSFile)
  379. {
  380. VFSFile dirEntry = (VFSFile)value;
  381. ParentDirectoryRenderer.this.setFont(boldFont);
  382. setIcon(showIcons ? FileCellRenderer.getIconForFile(dirEntry,true)
  383. : null);
  384. setText(dirEntry.getName());
  385. }
  386. else if(value == null)
  387. setText("VFS does not follow VFS API");
  388. return this;
  389. }
  390. } //}}}
  391. //{{{ ParentMouseHandler class
  392. private class ParentMouseHandler extends MouseAdapter
  393. {
  394. @Override
  395. public void mousePressed(MouseEvent evt)
  396. {
  397. int row = parentDirectories.locationToIndex(evt.getPoint());
  398. if(row != -1)
  399. {
  400. Object obj = parentDirectories.getModel()
  401. .getElementAt(row);
  402. if(obj instanceof VFSFile)
  403. {
  404. VFSFile dirEntry = (VFSFile)obj;
  405. if(GUIUtilities.isPopupTrigger(evt))
  406. {
  407. if(popup != null && popup.isVisible())
  408. {
  409. popup.setVisible(false);
  410. popup = null;
  411. }
  412. else
  413. {
  414. parentDirectories.setSelectedIndex(row);
  415. showFilePopup(new VFSFile[] {
  416. dirEntry },parentDirectories,
  417. evt.getPoint());
  418. }
  419. }
  420. }
  421. }
  422. }
  423. @Override
  424. public void mouseReleased(MouseEvent evt)
  425. {
  426. if(evt.getClickCount() % 2 != 0 &&
  427. !GUIUtilities.isMiddleButton(evt.getModifiers()))
  428. return;
  429. int row = parentDirectories.locationToIndex(evt.getPoint());
  430. if(row != -1)
  431. {
  432. Object obj = parentDirectories.getModel()
  433. .getElementAt(row);
  434. if(obj instanceof VFSFile)
  435. {
  436. VFSFile dirEntry = (VFSFile)obj;
  437. if(!GUIUtilities.isPopupTrigger(evt))
  438. {
  439. browser.setDirectory(dirEntry.getPath());
  440. if(browser.getMode() == VFSBrowser.BROWSER)
  441. focusOnFileView();
  442. }
  443. }
  444. }
  445. }
  446. } //}}}
  447. //{{{ TableMouseHandler class
  448. private class TableMouseHandler extends MouseAdapter
  449. {
  450. //{{{ mouseClicked() method
  451. @Override
  452. public void mouseClicked(MouseEvent evt)
  453. {
  454. Point p = evt.getPoint();
  455. int row = table.rowAtPoint(p);
  456. int column = table.columnAtPoint(p);
  457. if(row == -1)
  458. return;
  459. if(column == 0)
  460. {
  461. VFSDirectoryEntryTableModel.Entry entry
  462. = (VFSDirectoryEntryTableModel.Entry)
  463. table.getModel().getValueAt(row,0);
  464. if(FileCellRenderer.ExpansionToggleBorder
  465. .isExpansionToggle(entry.level,p.x))
  466. {
  467. return;
  468. }
  469. }
  470. if((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0
  471. && evt.getClickCount() % 2 == 0)
  472. {
  473. browser.filesActivated(evt.isShiftDown()
  474. ? VFSBrowser.M_OPEN_NEW_VIEW
  475. : VFSBrowser.M_OPEN,true);
  476. }
  477. else if(GUIUtilities.isMiddleButton(evt.getModifiers()))
  478. {
  479. if(evt.isShiftDown())
  480. table.getSelectionModel().addSelectionInterval(row,row);
  481. else
  482. table.getSelectionModel().setSelectionInterval(row,row);
  483. browser.filesActivated(evt.isShiftDown()
  484. ? VFSBrowser.M_OPEN_NEW_VIEW
  485. : VFSBrowser.M_OPEN,true);
  486. }
  487. } //}}}
  488. //{{{ mousePressed() method
  489. @Override
  490. public void mousePressed(MouseEvent evt)
  491. {
  492. Point p = evt.getPoint();
  493. if(evt.getSource() != table)
  494. {
  495. p.x -= table.getX();
  496. p.y -= table.getY();
  497. }
  498. int row = table.rowAtPoint(p);
  499. int column = table.columnAtPoint(p);
  500. if(column == 0 && row != -1)
  501. {
  502. VFSDirectoryEntryTableModel.Entry entry
  503. = (VFSDirectoryEntryTableModel.Entry)
  504. table.getModel().getValueAt(row,0);
  505. if(FileCellRenderer.ExpansionToggleBorder
  506. .isExpansionToggle(entry.level,p.x))
  507. {
  508. table.toggleExpanded(row);
  509. return;
  510. }
  511. }
  512. if(GUIUtilities.isMiddleButton(evt.getModifiers()))
  513. {
  514. if(row == -1)
  515. /* nothing */;
  516. else if(evt.isShiftDown())
  517. table.getSelectionModel().addSelectionInterval(row,row);
  518. else
  519. table.getSelectionModel().setSelectionInterval(row,row);
  520. }
  521. else if(GUIUtilities.isPopupTrigger(evt))
  522. {
  523. if(popup != null && popup.isVisible())
  524. {
  525. popup.setVisible(false);
  526. popup = null;
  527. return;
  528. }
  529. if(row == -1)
  530. showFilePopup(null,table,evt.getPoint());
  531. else
  532. {
  533. if(!table.getSelectionModel().isSelectedIndex(row))
  534. table.getSelectionModel().setSelectionInterval(row,row);
  535. showFilePopup(getSelectedFiles(),table,evt.getPoint());
  536. }
  537. }
  538. } //}}}
  539. //{{{ mouseReleased() method
  540. @Override
  541. public void mouseReleased(MouseEvent evt)
  542. {
  543. if(!GUIUtilities.isPopupTrigger(evt)
  544. && table.getSelectedRow() != -1)
  545. {
  546. browser.filesSelected();
  547. }
  548. } //}}}
  549. } //}}}
  550. private static class LoadingPlaceholder {}
  551. //}}}
  552. class ParentDirectoryList extends JList
  553. {
  554. public String getPath(int row)
  555. {
  556. Collection<String> components = new LinkedList<String>();
  557. for (int i=1; i<=row; ++i)
  558. components.add(getModel().getElementAt(i).toString());
  559. return getModel().getElementAt(0) + TextUtilities.join(components, File.separator);
  560. }
  561. @Override
  562. protected void processKeyEvent(KeyEvent evt)
  563. {
  564. if (evt.getID() == KeyEvent.KEY_PRESSED)
  565. {
  566. ActionContext ac = VFSBrowser.getActionContext();
  567. int row = parentDirectories.getSelectedIndex();
  568. switch(evt.getKeyCode())
  569. {
  570. case KeyEvent.VK_DOWN:
  571. evt.consume();
  572. if (row < parentDirectories.getSize().height-1)
  573. parentDirectories.setSelectedIndex(++row);
  574. break;
  575. case KeyEvent.VK_LEFT:
  576. if ((evt.getModifiers() & InputEvent.ALT_MASK)>0)
  577. {
  578. evt.consume();
  579. browser.previousDirectory();
  580. }
  581. else super.processEvent(evt);
  582. break;
  583. case KeyEvent.VK_RIGHT:
  584. if ((evt.getModifiers() & InputEvent.ALT_MASK)>0)
  585. {
  586. evt.consume();
  587. browser.nextDirectory();
  588. }
  589. else super.processEvent(evt);
  590. break;
  591. case KeyEvent.VK_TAB:
  592. evt.consume();
  593. if ((evt.getModifiers() & InputEvent.SHIFT_MASK) > 0)
  594. browser.focusOnDefaultComponent();
  595. else
  596. table.requestFocus();
  597. break;
  598. case KeyEvent.VK_UP :
  599. evt.consume();
  600. if (row > 0)
  601. {
  602. parentDirectories.setSelectedIndex(--row);
  603. }
  604. break;
  605. case KeyEvent.VK_BACK_SPACE:
  606. evt.consume();
  607. EditAction up = ac.getAction("vfs.browser.up");
  608. ac.invokeAction(evt, up);
  609. break;
  610. case KeyEvent.VK_F5:
  611. evt.consume();
  612. EditAction reload = ac.getAction("vfs.browser.reload");
  613. ac.invokeAction(evt, reload);
  614. break;
  615. case KeyEvent.VK_ENTER:
  616. evt.consume();
  617. String path = getPath(row);
  618. getBrowser().setDirectory(path);
  619. table.requestFocus();
  620. break;
  621. /* These actions don't work because they look at the EntryTable for the current selected
  622. * item. We need actions that look at the parentDirectoryList item instead.
  623. *
  624. case KeyEvent.VK_DELETE:
  625. evt.consume();
  626. ea = ac.getAction("vfs.browser.delete");
  627. ac.invokeAction(evt, ea);
  628. break;
  629. case KeyEvent.CTRL_MASK | KeyEvent.VK_N:
  630. evt.consume();
  631. ea = ac.getAction("vfs.browser.new-file");
  632. ac.invokeAction(evt, ea);
  633. break;
  634. case KeyEvent.VK_INSERT:
  635. evt.consume();
  636. ea = ac.getAction("vfs.browser.new-directory");
  637. ac.invokeAction(evt, ea);
  638. break; */
  639. }
  640. }
  641. else if(evt.getID() == KeyEvent.KEY_TYPED)
  642. {
  643. if(evt.isControlDown() || evt.isAltDown()
  644. || evt.isMetaDown())
  645. {
  646. evt.consume();
  647. return;
  648. }
  649. switch(evt.getKeyChar())
  650. {
  651. case '~':
  652. evt.consume();
  653. if(browser.getMode() == VFSBrowser.BROWSER)
  654. browser.setDirectory(System.getProperty(
  655. "user.home"));
  656. break;
  657. case '/':
  658. evt.consume();
  659. if(browser.getMode() == VFSBrowser.BROWSER)
  660. browser.rootDirectory();
  661. break;
  662. case '-':
  663. evt.consume();
  664. if(browser.getMode() == VFSBrowser.BROWSER)
  665. {
  666. browser.setDirectory(
  667. browser.getView().getBuffer()
  668. .getDirectory());
  669. }
  670. break;
  671. }
  672. }
  673. if (!evt.isConsumed())
  674. super.processKeyEvent(evt);
  675. }
  676. }
  677. }