Improve files UI
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui / src / org / argeo / eclipse / ui / fs / FsTableViewer.java
index 7e8e94fb608479048666e19b96d343cbbfb98db5..3b126e90bcdcc33dcc1b380e22f228f76a31ceb4 100644 (file)
@@ -4,6 +4,7 @@ import java.nio.file.Path;
 import java.util.List;
 
 import org.argeo.eclipse.ui.ColumnDefinition;
+import org.eclipse.jface.viewers.CellLabelProvider;
 import org.eclipse.jface.viewers.ILazyContentProvider;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
@@ -26,23 +27,29 @@ public class FsTableViewer extends TableViewer {
        private boolean reverseOrder = false;
        private String orderProperty = FsUiConstants.PROPERTY_NAME;
 
+       private Path initialPath = null;
+
        public FsTableViewer(Composite parent, int style) {
                super(parent, style | SWT.VIRTUAL);
        }
 
        public Table configureDefaultSingleColumnTable(int tableWidthHint) {
+
+               return configureDefaultSingleColumnTable(tableWidthHint, new FileIconNameLabelProvider());
+       }
+
+       public Table configureDefaultSingleColumnTable(int tableWidthHint, CellLabelProvider labelProvider) {
                Table table = this.getTable();
                table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-               table.setLinesVisible(true);
+               table.setLinesVisible(false);
                table.setHeaderVisible(false);
-//             CmsUtils.markup(table);
-//             CmsUtils.style(table, MaintenanceStyles.BROWSER_COLUMN);
+               // CmsUtils.markup(table);
+               // CmsUtils.style(table, MaintenanceStyles.BROWSER_COLUMN);
 
                TableViewerColumn column = new TableViewerColumn(this, SWT.NONE);
                TableColumn tcol = column.getColumn();
                tcol.setWidth(tableWidthHint);
-               column.setLabelProvider(new FileIconNameLabelProvider());
-
+               column.setLabelProvider(labelProvider);
                this.setContentProvider(new MyLazyCP());
                return table;
        }
@@ -66,9 +73,33 @@ public class FsTableViewer extends TableViewer {
        }
 
        public void setInput(Path dir, String filter) {
-               Object[] rows = FsUiUtils.getChildren(dir, filter, showHiddenItems, folderFirst, orderProperty, reverseOrder);
-               this.setInput(rows);
-               int length = rows == null ? 0 : rows.length;
+               Path[] rows = FsUiUtils.getChildren(dir, filter, showHiddenItems, folderFirst, orderProperty, reverseOrder);
+               if (rows == null) {
+                       this.setInput(null);
+                       this.setItemCount(0);
+                       return;
+               }
+               boolean isRoot;
+               try {
+                       isRoot = dir.getRoot().equals(dir);
+               } catch (Exception e) {
+                       // FIXME Workaround for JCR root node access
+                       isRoot = dir.toString().equals("/");
+               }
+               final Object[] res;
+               if (isRoot)
+                       res = rows;
+               else if (initialPath != null && initialPath.equals(dir))
+                       res = rows;
+               else {
+                       res = new Object[rows.length + 1];
+                       res[0] = new ParentDir(dir.getParent());
+                       for (int i = 1; i < res.length; i++) {
+                               res[i] = rows[i - 1];
+                       }
+               }
+               this.setInput(res);
+               int length = res.length;
                this.setItemCount(length);
                this.refresh();
        }
@@ -80,6 +111,14 @@ public class FsTableViewer extends TableViewer {
                this.refresh();
        }
 
+       /**
+        * A path which is to be considered as root (and thus provide no link to a
+        * parent directory)
+        */
+       public void setInitialPath(Path initialPath) {
+               this.initialPath = initialPath;
+       }
+
        private class MyLazyCP implements ILazyContentProvider {
                private static final long serialVersionUID = 9096550041395433128L;
                private Object[] elements;
@@ -95,7 +134,8 @@ public class FsTableViewer extends TableViewer {
                }
 
                public void updateElement(int index) {
-                       FsTableViewer.this.replace(elements[index], index);
+                       if (index < elements.length)
+                               FsTableViewer.this.replace(elements[index], index);
                }
        }
 }