Improve extensibility.
[gpl/argeo-suite.git] / library / org.argeo.documents.ui / src / org / argeo / documents / ui / DocumentsTreeUiProvider.java
index 224576e39441fdfdda147939e3e19fa7a8a990c0..13c26e5123b0a51107d0c1359e1bb1778bb1526d 100644 (file)
@@ -1,16 +1,23 @@
 package org.argeo.documents.ui;
 
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.spi.FileSystemProvider;
 
 import javax.jcr.Node;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 
+import org.argeo.api.NodeConstants;
 import org.argeo.api.NodeUtils;
 import org.argeo.cms.fs.CmsFsUtils;
 import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.util.CmsUiUtils;
 import org.argeo.eclipse.ui.fs.FsTreeViewer;
+import org.argeo.jcr.Jcr;
+import org.argeo.suite.ui.SuiteEvent;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
@@ -19,14 +26,43 @@ import org.eclipse.swt.widgets.Control;
 /** Tree view of a user root folders. */
 public class DocumentsTreeUiProvider implements CmsUiProvider {
        private FileSystemProvider nodeFileSystemProvider;
+       private Repository repository;
 
        @Override
        public Control createUi(Composite parent, Node context) throws RepositoryException {
                parent.setLayout(new GridLayout());
                FsTreeViewer fsTreeViewer = new FsTreeViewer(parent, SWT.NONE);
                fsTreeViewer.configureDefaultSingleColumnTable(500);
-               Node homeNode = NodeUtils.getUserHome(context.getSession());
+               CmsView cmsView = CmsView.getCmsView(parent);
+               Node homeNode = NodeUtils.getUserHome(cmsView.doAs(() -> Jcr.login(repository, NodeConstants.HOME_WORKSPACE)));
+               parent.addDisposeListener((e1) -> Jcr.logout(homeNode));
                Path homePath = CmsFsUtils.getPath(nodeFileSystemProvider, homeNode);
+               fsTreeViewer.addSelectionChangedListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       cmsView.sendEvent(SuiteEvent.refreshPart.topic(), SuiteEvent.eventProperties(folderNode));
+                               }
+                       }
+               });
+               fsTreeViewer.addDoubleClickListener((e) -> {
+                       IStructuredSelection selection = (IStructuredSelection) fsTreeViewer.getSelection();
+                       if (selection.isEmpty())
+                               return;
+                       else {
+                               Path newSelected = (Path) selection.getFirstElement();
+                               if (Files.isDirectory(newSelected)) {
+                                       Node folderNode = cmsView.doAs(() -> CmsFsUtils.getNode(repository, newSelected));
+                                       parent.addDisposeListener((e1) -> Jcr.logout(folderNode));
+                                       cmsView.sendEvent(SuiteEvent.openNewPart.topic(), SuiteEvent.eventProperties(folderNode));
+                               }
+                       }
+               });
                fsTreeViewer.setPathsInput(homePath);
                fsTreeViewer.getControl().setLayoutData(CmsUiUtils.fillAll());
                fsTreeViewer.getControl().getParent().layout(true, true);
@@ -37,4 +73,8 @@ public class DocumentsTreeUiProvider implements CmsUiProvider {
                this.nodeFileSystemProvider = nodeFileSystemProvider;
        }
 
+       public void setRepository(Repository repository) {
+               this.repository = repository;
+       }
+
 }