Навигация по дочерним папкам
Для навигации по дочерним папкам в проводнике можно использовать дерево папок, но при этом, если в созданной нами панели проводника оно будет в свернутом состоянии, то получить доступ к дочерним папкам будет невозможно. В аналогичных программных продуктах — например, в 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: сайт
Сайт проекта "Аранжировщик файлов": сайт
Сергей Бердачук, сайт
Навигация двойным щелчком
Для обработки двойного щелчка создаем слушатель с типовым адаптером двойного щелчка мыши.
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 год в рубрике программирование