Навигация по "родительским" папкам
При свернутом дереве проводника переход в родительскую папку становится невозможен. Для решения этой задачи обычно либо применяют дополнительную кнопку, либо вводится виртуальная папка, которая предназначена для перехода на вышестоящий уровень в иерархии файловой системы. Второй способ более удобен, так как позволяет легко перемещаться по ресурсам файловой системы как с помощью клавиатуры, так и с помощью двойного щелчка (клика) мыши.
Рис. 1. Виртуальная папка для перехода в родительский каталог
Создадим объект-контейнер, который будет содержать информацию о родительской папке. Это стандартный java-бин с доступом к родительскому файловому объекту посредством get-метода. Особенность реализации заключается в сокрытии стандартного конструктора и его переопределении для единственно возможного способа инициализации.
public class ToParentFolder {
FileObject parentFileObject;
private ToParentFolder() {
super();
}
public ToParentFolder(FileObject parentFileObject) {
super();
this.parentFileObject = parentFileObject;
}
public FileObject getParentFileObject() {
return parentFileObject;
}
}
Изменим реализацию провайдера контента для панели списка файловых объектов. Метод получения списка дочерних элементов будет теперь добавлять первым элементом массива дополнительный экземпляр класса ToParentFolder, который будет содержать информацию о родительском файловом объекте. Дополнительно делается проверка на root-элемент иерархии объектов, так как доступа к родительскому объекту в этом случае нет.
public class VfsTableContentProvider implements IStructuredContentProvider {
private Object[] getChildren(Object parentElement) {
if (parentElement instanceof FileObject) {
try {
FileObject fileObject = (FileObject) parentElement;
Object[] kids = null;
if (fileObject.getType().hasChildren()) {
kids = fileObject.getChildren();
}
if (kids == null) {
kids = new Object[0];
}
if (kids.length > 0) {
if (((FileObject) parentElement).getParent() != null) {
int newSize = kids.length + 1;
Object[] newArray = new Object[newSize];
newArray[0] = new ToParentFolder(
(FileObject) parentElement);
for (int i = 1; i < newSize; i++) {
newArray[i] = kids[i — 1];
}
return newArray;
} else {
return kids;
}
} else {
return new Object[] { new ToParentFolder(
(FileObject) parentElement) };
}
} catch (FileSystemException e) {
. . .
}
}
return new Object[0];
}
. . .
}
Теперь очередь за формированием отображения созданной ранее виртуальной папки. Для этого в провайдере меток меняем реализацию получения иконки и текстовой метки. Иконку на данном этапе будем выводить такую же, как и у остальных папок, а в наименование добавим префикс "..", который обычно используется в командах перехода на вышестоящий уровень иерархии объектов файловой системы. Код провайдера примет следующий вид:
public class VfsTableLabelProvider implements ITableLabelProvider {
. . .
public Image getColumnImage(Object element, int columnIndex) {
. . .
if ((columnIndex == 0) && (element != null)
&& (element instanceof ToParentFolder)
&& (((ToParentFolder) element).getParentFileObject() != null)) {
try {
if ((((ToParentFolder) element).getParentFileObject())
.getType().equals(FileType.FOLDER)) {
return PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FOLDER);
}
} catch (FileSystemException e) {
}
}
return null;
}
. . .
public String getColumnText(Object element, int columnIndex) {
if ((element != null) && (element instanceof ToParentFolder)) {
if (columnIndex == 0) {
if (((ToParentFolder) element).getParentFileObject() != null) {
return new StringBuilder("../").append(
getFileObjectName(((ToParentFolder) element)
.getParentFileObject())).toString();
}
. . .
}
. . .
}
Осталось добавить в обработчик нажатий клавиш и кликов мыши панели файлового менеджера поддержку созданного типа данных (класса).
public class ExplorerView extends ViewPart {
. . .
private void selectTableFolder() {
. . .
if (itemSelection.getFirstElement() instanceof ToParentFolder) {
try {
setInput(((ToParentFolder) (itemSelection.getFirstElement()))
.getParentFileObject().getParent());
vfsExplorerComposite.getTreeViewer()
.setSelection(
new StructuredSelection(
((ToParentFolder) (itemSelection.getFirstElement()))
.getParentFileObject()
.getParent()), true);
. . .
}
Рекомендуемые ресурсы
Русскоязычный каталог ресурсов по технологиям Eclipse: сайт
Сайт проекта "Аранжировщик файлов": сайт
Сергей Бердачук, сайт
Рис. 1. Виртуальная папка для перехода в родительский каталог
Создадим объект-контейнер, который будет содержать информацию о родительской папке. Это стандартный java-бин с доступом к родительскому файловому объекту посредством get-метода. Особенность реализации заключается в сокрытии стандартного конструктора и его переопределении для единственно возможного способа инициализации.
public class ToParentFolder {
FileObject parentFileObject;
private ToParentFolder() {
super();
}
public ToParentFolder(FileObject parentFileObject) {
super();
this.parentFileObject = parentFileObject;
}
public FileObject getParentFileObject() {
return parentFileObject;
}
}
Изменим реализацию провайдера контента для панели списка файловых объектов. Метод получения списка дочерних элементов будет теперь добавлять первым элементом массива дополнительный экземпляр класса ToParentFolder, который будет содержать информацию о родительском файловом объекте. Дополнительно делается проверка на root-элемент иерархии объектов, так как доступа к родительскому объекту в этом случае нет.
public class VfsTableContentProvider implements IStructuredContentProvider {
private Object[] getChildren(Object parentElement) {
if (parentElement instanceof FileObject) {
try {
FileObject fileObject = (FileObject) parentElement;
Object[] kids = null;
if (fileObject.getType().hasChildren()) {
kids = fileObject.getChildren();
}
if (kids == null) {
kids = new Object[0];
}
if (kids.length > 0) {
if (((FileObject) parentElement).getParent() != null) {
int newSize = kids.length + 1;
Object[] newArray = new Object[newSize];
newArray[0] = new ToParentFolder(
(FileObject) parentElement);
for (int i = 1; i < newSize; i++) {
newArray[i] = kids[i — 1];
}
return newArray;
} else {
return kids;
}
} else {
return new Object[] { new ToParentFolder(
(FileObject) parentElement) };
}
} catch (FileSystemException e) {
. . .
}
}
return new Object[0];
}
. . .
}
Теперь очередь за формированием отображения созданной ранее виртуальной папки. Для этого в провайдере меток меняем реализацию получения иконки и текстовой метки. Иконку на данном этапе будем выводить такую же, как и у остальных папок, а в наименование добавим префикс "..", который обычно используется в командах перехода на вышестоящий уровень иерархии объектов файловой системы. Код провайдера примет следующий вид:
public class VfsTableLabelProvider implements ITableLabelProvider {
. . .
public Image getColumnImage(Object element, int columnIndex) {
. . .
if ((columnIndex == 0) && (element != null)
&& (element instanceof ToParentFolder)
&& (((ToParentFolder) element).getParentFileObject() != null)) {
try {
if ((((ToParentFolder) element).getParentFileObject())
.getType().equals(FileType.FOLDER)) {
return PlatformUI.getWorkbench().getSharedImages()
.getImage(ISharedImages.IMG_OBJ_FOLDER);
}
} catch (FileSystemException e) {
}
}
return null;
}
. . .
public String getColumnText(Object element, int columnIndex) {
if ((element != null) && (element instanceof ToParentFolder)) {
if (columnIndex == 0) {
if (((ToParentFolder) element).getParentFileObject() != null) {
return new StringBuilder("../").append(
getFileObjectName(((ToParentFolder) element)
.getParentFileObject())).toString();
}
. . .
}
. . .
}
Осталось добавить в обработчик нажатий клавиш и кликов мыши панели файлового менеджера поддержку созданного типа данных (класса).
public class ExplorerView extends ViewPart {
. . .
private void selectTableFolder() {
. . .
if (itemSelection.getFirstElement() instanceof ToParentFolder) {
try {
setInput(((ToParentFolder) (itemSelection.getFirstElement()))
.getParentFileObject().getParent());
vfsExplorerComposite.getTreeViewer()
.setSelection(
new StructuredSelection(
((ToParentFolder) (itemSelection.getFirstElement()))
.getParentFileObject()
.getParent()), true);
. . .
}
Рекомендуемые ресурсы
Русскоязычный каталог ресурсов по технологиям Eclipse: сайт
Сайт проекта "Аранжировщик файлов": сайт
Сергей Бердачук, сайт
Компьютерная газета. Статья была опубликована в номере 15 за 2007 год в рубрике программирование