1 package org
.argeo
.eclipse
.ui
.fs
;
3 import java
.io
.IOException
;
4 import java
.nio
.file
.DirectoryIteratorException
;
5 import java
.nio
.file
.DirectoryStream
;
6 import java
.nio
.file
.Files
;
7 import java
.nio
.file
.Path
;
8 import java
.util
.ArrayList
;
11 import org
.argeo
.eclipse
.ui
.ColumnDefinition
;
12 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
13 import org
.eclipse
.jface
.viewers
.TreeViewer
;
14 import org
.eclipse
.jface
.viewers
.TreeViewerColumn
;
15 import org
.eclipse
.jface
.viewers
.Viewer
;
16 import org
.eclipse
.swt
.SWT
;
17 import org
.eclipse
.swt
.layout
.GridData
;
18 import org
.eclipse
.swt
.widgets
.Composite
;
19 import org
.eclipse
.swt
.widgets
.Tree
;
20 import org
.eclipse
.swt
.widgets
.TreeColumn
;
23 * Canonical implementation of a JFace TreeViewer to display the content of a
26 public class FsTreeViewer
extends TreeViewer
{
27 private static final long serialVersionUID
= -5632407542678477234L;
29 private boolean showHiddenItems
= false;
30 private boolean showDirectoryFirst
= true;
31 private String orderingProperty
= FsUiConstants
.PROPERTY_NAME
;
33 public FsTreeViewer(Composite parent
, int style
) {
34 super(parent
, style
| SWT
.VIRTUAL
);
37 public Tree
configureDefaultSingleColumnTable(int tableWidthHint
) {
38 Tree tree
= this.getTree();
39 tree
.setLayoutData(new GridData(SWT
.FILL
, SWT
.FILL
, false, false));
40 tree
.setLinesVisible(true);
41 tree
.setHeaderVisible(false);
42 // CmsUtils.markup(tree);
44 TreeViewerColumn column
= new TreeViewerColumn(this, SWT
.NONE
);
45 TreeColumn tcol
= column
.getColumn();
46 tcol
.setWidth(tableWidthHint
);
47 column
.setLabelProvider(new FileIconNameLabelProvider());
49 this.setContentProvider(new MyCP());
53 public Tree
configureDefaultTable(List
<ColumnDefinition
> columns
) {
54 this.setContentProvider(new MyCP());
55 Tree tree
= this.getTree();
56 tree
.setLinesVisible(true);
57 tree
.setHeaderVisible(true);
58 // CmsUtils.markup(tree);
59 // CmsUtils.style(tree, MaintenanceStyles.BROWSER_COLUMN);
60 for (ColumnDefinition colDef
: columns
) {
61 TreeViewerColumn column
= new TreeViewerColumn(this, SWT
.NONE
);
62 column
.setLabelProvider(colDef
.getLabelProvider());
63 TreeColumn tcol
= column
.getColumn();
64 tcol
.setResizable(true);
65 tcol
.setText(colDef
.getLabel());
66 tcol
.setWidth(colDef
.getMinWidth());
71 public void setInput(Path dir
, String filter
) {
72 try (DirectoryStream
<Path
> stream
= Files
.newDirectoryStream(dir
, filter
)) {
73 // TODO make this lazy
74 List
<Path
> paths
= new ArrayList
<>();
75 for (Path entry
: stream
) {
78 Object
[] rows
= paths
.toArray(new Object
[0]);
80 // this.setItemCount(rows.length);
82 } catch (IOException
| DirectoryIteratorException e
) {
83 throw new FsUiException("Unable to filter " + dir
+ " children with filter " + filter
, e
);
87 /** Directly displays bookmarks **/
88 public void setPathsInput(Path
... paths
) {
89 this.setInput((Object
[]) paths
);
90 // this.setItemCount(paths.length);
94 private class MyCP
implements ITreeContentProvider
{
95 private static final long serialVersionUID
= 9096550041395433128L;
96 private Object
[] elements
;
98 public void dispose() {
101 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
102 // IMPORTANT: don't forget this: an exception will be thrown if
103 // a selected object is not part of the results anymore.
104 viewer
.setSelection(null);
105 this.elements
= (Object
[]) newInput
;
109 public Object
[] getElements(Object inputElement
) {
114 public Object
[] getChildren(Object parentElement
) {
115 Path path
= (Path
) parentElement
;
116 if (!Files
.isDirectory(path
))
119 return FsUiUtils
.getChildren(path
, "*", showHiddenItems
, showDirectoryFirst
, orderingProperty
, false);
123 public Object
getParent(Object element
) {
124 Path path
= (Path
) element
;
125 return path
.getParent();
129 public boolean hasChildren(Object element
) {
130 Path path
= (Path
) element
;
132 if (!Files
.isDirectory(path
))
135 try (DirectoryStream
<Path
> children
= Files
.newDirectoryStream(path
, "*")) {
136 return children
.iterator().hasNext();
138 } catch (IOException e
) {
139 throw new FsUiException("Unable to check child existence on " + path
, e
);