Сейчас я разрабатываю пример плагина для Eclipse, чтобы показать все каталоги и файлы с моего компьютера, используя JFace (Tree и TreeView).
Я хочу что-то вроде этого:
----------------------------------
| Element | Number of Childrens |
----------------------------------
| + usr | 5 |
| + bin | 4 |
| file | |
| + games | 2 |
----------------------------------
Я создаю плагин View witch ViewPart , ContentProvider и TreeLabelProvider .
public class ListFiles extends ViewPart {
/** The ID of the view as specified by the extension. */
public static final String ID = "sortnumbers.views.SortNumbers";
/**
* The constructor.
*/
public ListFiles() { }
/**
* This is a callback that will allow us to create the viewer and initialize it
*/
public void createPartControl(Composite parent) {
Tree tree = new Tree(parent, SWT.MULTI);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
TreeColumn column0 = new TreeColumn(tree, SWT.NONE);
column0.setText("Element");
column0.setWidth(300);
TreeColumn column1 = new TreeColumn(tree, SWT.NONE);
column1.setText("Number");
column1.setWidth(300);
TreeViewer treeviewer = new TreeViewer(tree);
treeviewer.setContentProvider(new TreeContentProvider());
treeviewer.setLabelProvider(new TreeLabelProvider());
treeviewer.setInput(new FolderNode(new File("/")));
}
@Override
public void setFocus() {
// TODO
}
}
public class TreeContentProvider implements ITreeContentProvider
{
public Object[] getChildren(Object parentElement) {
return ((ITreeNode)parentElement).getChildren().toArray();
}
public Object getParent(Object element) {
return ((ITreeNode)element).getParent();
}
public boolean hasChildren(Object element) {
return ((ITreeNode)element).hasChildren();
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
public class TreeLabelProvider extends LabelProvider
{
public String getText(Object element) {
return ((ITreeNode)element).getName();
}
}
Для поиска всех файлов в моемЯ создаю интерфейс ITreeNode , TreeNode , FolderNode и FileNode ...
public interface ITreeNode
{
public String getName();
public List getChildren();
public boolean hasChildren();
public ITreeNode getParent();
}
public abstract class TreeNode implements ITreeNode
{
protected ITreeNode fParent;
protected List fChildren;
public TreeNode(ITreeNode parent) {
fParent = parent;
}
public boolean hasChildren() {
return true;
}
public ITreeNode getParent() {
return fParent;
}
public List getChildren()
{
if( fChildren != null )
return fChildren;
fChildren = new ArrayList();
createChildren(fChildren);
return fChildren;
}
/* subclasses should override this method and add the child nodes */
protected abstract void createChildren(List children);
}
public class FolderNode extends TreeNode
{
private File fFolder; /* actual data object */
public FolderNode(File folder) {
this(null, folder);
}
public FolderNode(ITreeNode parent, File folder) {
super(parent);
fFolder = folder;
}
public String getName() {
return "FOLDER: " + fFolder.getName();
}
@Override
protected void createChildren(List children)
{
File[] childFiles = fFolder.listFiles();
for(int i=0; i<childFiles.length; i++)
{
File childFile = childFiles[i];
if( childFile.isDirectory() )
children.add(new FolderNode(this, childFile));
else
children.add(new FileNode(this, childFile));
}
}
}
public class FileNode extends TreeNode
{
private File fFile; /* actual data object */
public FileNode(ITreeNode parent, File file)
{
super(parent);
fFile = file;
}
public String getName() {
return "FILE: " + fFile.getName();
}
protected void createChildren(List children) {
}
public boolean hasChildren() {
return false;
}
}
Норезультат был:
----------------------------------
| Element | Number of Childrens |
----------------------------------
| + usr | + usr |
| + bin | + bin |
| file | file |
| + games | + games |
----------------------------------
Я не могу понять, почему TreeView заполняют все поля одной и той же строкой ... Что мне нужно изменить?
- Заранее спасибо
Алексей Романов, спасибо ...: -)
Теперь мне нужно отсортировать все элементы в TreeView по столбцу (по имени для первого столбца и по размеру для второго столбца).Должен ли я создать класс, расширенный из ViewerComparator или ViewerSorter?И как можно реализовать метод сравнения для этого?
- Заранее спасибо