Навигация по дочерним папкам

Для навигации по дочерним папкам в проводнике можно использовать дерево папок, но при этом, если в созданной нами панели проводника оно будет в свернутом состоянии, то получить доступ к дочерним папкам будет невозможно. В аналогичных программных продуктах — например, в Windows Explorer — данную операцию можно выполнить либо по нажатию некоторой кнопки (для платформы Windows это обычно Enter), либо двойным щелчком (кликом) мыши.

Навигация двойным щелчком


Для обработки двойного щелчка создаем слушатель с типовым адаптером двойного щелчка мыши.

public class ExplorerView extends ViewPart {
. . .
private void initialize() {
. . .
vfsExplorerComposite.getTableViewer().getTable().addMouseListener(
new org.eclipse.swt.events.MouseAdapter() {
public void mouseDoubleClick(
org.eclipse.swt.events.MouseEvent e) {
StructuredSelection itemSelection = (StructuredSelection) vfsExplorerComposite.getTableViewer().getSelection();
if ((!itemSelection.isEmpty()) && (itemSelection.getFirstElement() instanceof FileObject)) {
try {
setInput(itemSelection.getFirstElement());
vfsExplorerComposite.getTreeViewer().setSelection(new StructuredSelection(itemSelection.getFirstElement()), true);
. . .

Данный блок кода "слушает" нажатия мыши, и по двойному щелчку проверяется выделенный в данный момент элемент таблицы. Если это элемент типа папки, то производится назначение нового опорного элемента панели методом setInput(..), в качестве которого выступает первый дочерний элемент для выбранной в данный момент папки. Для единообразия поведения элементов интерфейса пользователя данную функциональность можно добавить и для дерева папок. Но при этом переход на дочернюю папку осуществляем только при наличии дочерних элементов типа "папка". Для этого в списке дочерних элементов ищем первый элемент указанного типа (теоретически это должен быть самый первый элемент, но нет гарантии, что в будущем логика не поменяется, так что лучше дополнительно проверить).

. . .
vfsExplorerComposite.getTreeViewer().getTree().addMouseListener(
new org.eclipse.swt.events.MouseAdapter() {
public void mouseDoubleClick(
org.eclipse.swt.events.MouseEvent e) {
StructuredSelection itemSelection = (StructuredSelection) vfsExplorerComposite.getTreeViewer().getSelection();
if ((!itemSelection.isEmpty()) && (itemSelection.getFirstElement() instanceof FileObject)) {
FileObject selectedFileObject = (FileObject) itemSelection.getFirstElement();
try {
FileObject[] childs = selectedFileObject .getChildren();
for (int i = 0; i < childs.length; i++) {
if (childs[i].getType().equals(FileType.FOLDER)) {
vfsExplorerComposite.getTreeViewer().setSelection(new StructuredSelection(childs[i]),true);
break;
}
}

Навигация по папкам при помощи клавиатуры

Для дерева папок оставим принятую по умолчанию навигацию по дереву при помощи "стрелок", а для нажатия клавиши в таблице создаем слушатель с типовым адаптером. Для того, чтобы не дублировать код обработчика смены фокуса на дочернюю папку, вынесем данный блок кода в отдельный метод selectChildTableFolder(). Останется только проверить код нажатой клавиши на соответствие коду клавиши Enter и вызвать созданный метод для перехода в дочернюю папку.

vfsExplorerComposite.getTableViewer().getTable().addKeyListener(
new org.eclipse.swt.events.KeyAdapter() {
public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
if (e.keyCode == 13) {
selectChildTableFolder();
}
. . .

Использование жестко прошитого кода кнопки в данном случае не совсем корректно, в последующем заменим его на константу кода принятой для текущей операционной системы кнопки выбора.

Рекомендуемые ресурсы

Русскоязычный каталог ресурсов по технологиям Eclipse: сайт
Сайт проекта "Аранжировщик файлов": сайт

Сергей Бердачук, сайт



Компьютерная газета. Статья была опубликована в номере 10 за 2007 год в рубрике программирование

©1997-2024 Компьютерная газета