View Javadoc
1   package org.argeo.eclipse.ui.fs;
2   
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;
9   import java.util.List;
10  
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;
21  
22  /**
23   * Canonical implementation of a JFace TreeViewer to display the content of a
24   * repository
25   */
26  public class FsTreeViewer extends TreeViewer {
27  	private static final long serialVersionUID = -5632407542678477234L;
28  
29  	private boolean showHiddenItems = false;
30  	private boolean showDirectoryFirst = true;
31  	private String orderingProperty = FsUiConstants.PROPERTY_NAME;
32  
33  	public FsTreeViewer(Composite parent, int style) {
34  		super(parent, style | SWT.VIRTUAL);
35  	}
36  
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);
43  
44  		TreeViewerColumn column = new TreeViewerColumn(this, SWT.NONE);
45  		TreeColumn tcol = column.getColumn();
46  		tcol.setWidth(tableWidthHint);
47  		column.setLabelProvider(new FileIconNameLabelProvider());
48  
49  		this.setContentProvider(new MyCP());
50  		return tree;
51  	}
52  
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());
67  		}
68  		return tree;
69  	}
70  
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) {
76  				paths.add(entry);
77  			}
78  			Object[] rows = paths.toArray(new Object[0]);
79  			this.setInput(rows);
80  			// this.setItemCount(rows.length);
81  			this.refresh();
82  		} catch (IOException | DirectoryIteratorException e) {
83  			throw new FsUiException("Unable to filter " + dir + " children with filter " + filter, e);
84  		}
85  	}
86  
87  	/** Directly displays bookmarks **/
88  	public void setPathsInput(Path... paths) {
89  		this.setInput((Object[]) paths);
90  		// this.setItemCount(paths.length);
91  		this.refresh();
92  	}
93  
94  	private class MyCP implements ITreeContentProvider {
95  		private static final long serialVersionUID = 9096550041395433128L;
96  		private Object[] elements;
97  
98  		public void dispose() {
99  		}
100 
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;
106 		}
107 
108 		@Override
109 		public Object[] getElements(Object inputElement) {
110 			return elements;
111 		}
112 
113 		@Override
114 		public Object[] getChildren(Object parentElement) {
115 			Path path = (Path) parentElement;
116 			if (!Files.isDirectory(path))
117 				return null;
118 			else
119 				return FsUiUtils.getChildren(path, "*", showHiddenItems, showDirectoryFirst, orderingProperty, false);
120 		}
121 
122 		@Override
123 		public Object getParent(Object element) {
124 			Path path = (Path) element;
125 			return path.getParent();
126 		}
127 
128 		@Override
129 		public boolean hasChildren(Object element) {
130 			Path path = (Path) element;
131 			try {
132 				if (!Files.isDirectory(path))
133 					return false;
134 				else
135 					try (DirectoryStream<Path> children = Files.newDirectoryStream(path, "*")) {
136 						return children.iterator().hasNext();
137 					}
138 			} catch (IOException e) {
139 				throw new FsUiException("Unable to check child existence on " + path, e);
140 			}
141 		}
142 
143 	}
144 }