]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java
+ Fix a bug on file download for the generic JCR view
[lgpl/argeo-commons.git] / eclipse / runtime / org.argeo.eclipse.ui.jcr / src / main / java / org / argeo / eclipse / ui / jcr / views / GenericJcrBrowser.java
index eb23629673f4c367f7fef24847eabc2cdd555c13..e369c6c8a3e5dc0c76f98aff2a73840c56be176d 100644 (file)
@@ -5,14 +5,24 @@ import java.util.Arrays;
 import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.PropertyType;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider;
 import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider;
 import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider;
 import org.argeo.eclipse.ui.jcr.browser.RepositoryNode;
 import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode;
+import org.argeo.eclipse.ui.jcr.utils.JcrFileProvider;
+import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
+import org.argeo.eclipse.ui.specific.FileHandler;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.jcr.RepositoryRegister;
 import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
@@ -21,6 +31,7 @@ import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.jface.viewers.TreeViewer;
@@ -34,13 +45,28 @@ import org.eclipse.swt.widgets.Menu;
 import org.eclipse.ui.part.ViewPart;
 
 public class GenericJcrBrowser extends ViewPart {
+       private final static Log log = LogFactory.getLog(GenericJcrBrowser.class);
+
+       private Session session;
+
        private TreeViewer nodesViewer;
+       private NodeContentProvider nodeContentProvider;
        private TableViewer propertiesViewer;
 
        private RepositoryRegister repositoryRegister;
 
        @Override
        public void createPartControl(Composite parent) {
+
+               // Instantiate the generic object that fits for
+               // both RCP & RAP, must be final to be accessed in the double click
+               // listener.
+               // Not that in RAP, it registers a service handler that provide the
+               // access to the files.
+
+               final JcrFileProvider jfp = new JcrFileProvider();
+               final FileHandler fh = new FileHandler(jfp);
+
                parent.setLayout(new FillLayout());
 
                SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
@@ -56,7 +82,22 @@ public class GenericJcrBrowser extends ViewPart {
                                | SWT.V_SCROLL);
                nodesViewer.getTree().setLayoutData(
                                new GridData(SWT.FILL, SWT.FILL, true, true));
-               nodesViewer.setContentProvider(new NodeContentProvider());
+
+               // look for session
+               Session nodeSession = session;
+               if (nodeSession == null) {
+                       Repository nodeRepository = JcrUtils.getRepositoryByAlias(
+                                       repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
+                       if (nodeRepository != null)
+                               try {
+                                       nodeSession = nodeRepository.login();
+                               } catch (RepositoryException e1) {
+                                       throw new ArgeoException("Cannot login to node repository");
+                               }
+               }
+               nodeContentProvider = new NodeContentProvider(nodeSession,
+                               repositoryRegister);
+               nodesViewer.setContentProvider(nodeContentProvider);
                nodesViewer.setLabelProvider(new NodeLabelProvider());
                nodesViewer
                                .addSelectionChangedListener(new ISelectionChangedListener() {
@@ -70,6 +111,7 @@ public class GenericJcrBrowser extends ViewPart {
                                                }
                                        }
                                });
+
                nodesViewer.addDoubleClickListener(new IDoubleClickListener() {
                        public void doubleClick(DoubleClickEvent event) {
                                if (event.getSelection() == null
@@ -78,13 +120,35 @@ public class GenericJcrBrowser extends ViewPart {
                                Object obj = ((IStructuredSelection) event.getSelection())
                                                .getFirstElement();
                                if (obj instanceof RepositoryNode) {
-                                       ((RepositoryNode) obj).login();
+                                       RepositoryNode rpNode = (RepositoryNode) obj;
+                                       rpNode.login();
                                        nodesViewer.refresh(obj);
                                } else if (obj instanceof WorkspaceNode) {
                                        ((WorkspaceNode) obj).login();
                                        nodesViewer.refresh(obj);
-                               }
+                               } else if (obj instanceof Node) {
+                                       Node node = (Node) obj;
 
+                                       // double clic on a file node triggers its opening
+                                       try {
+                                               if (node.isNodeType(NodeType.NT_FILE)) {
+                                                       String name = node.getName();
+                                                       String id = node.getIdentifier();
+                                                       // For the file provider to be able to browse the
+                                                       // various
+                                                       // repository.
+                                                       // TODO : enhanced that.
+                                                       jfp.setRootNodes((Object[]) nodeContentProvider
+                                                                       .getElements(null));
+
+                                                       fh.openFile(name, id);
+                                               }
+                                       } catch (RepositoryException re) {
+                                               throw new ArgeoException(
+                                                               "Repository error while getting Node file info",
+                                                               re);
+                                       }
+                               }
                        }
                });
 
@@ -95,7 +159,7 @@ public class GenericJcrBrowser extends ViewPart {
                getSite().registerContextMenu(menuManager, nodesViewer);
                getSite().setSelectionProvider(nodesViewer);
 
-               nodesViewer.setInput(repositoryRegister);
+               nodesViewer.setInput(getViewSite());
 
                Composite bottom = new Composite(sashForm, SWT.NONE);
                bottom.setLayout(new GridLayout(1, false));
@@ -157,6 +221,8 @@ public class GenericJcrBrowser extends ViewPart {
 
                sashForm.setWeights(getWeights());
 
+               nodesViewer.setComparer(new NodeViewerComparer());
+
        }
 
        @Override
@@ -186,10 +252,22 @@ public class GenericJcrBrowser extends ViewPart {
        }
 
        public void nodeRemoved(Node parentNode) {
-               nodesViewer.refresh(parentNode);
+
+               IStructuredSelection newSel = new StructuredSelection(parentNode);
+               nodesViewer.setSelection(newSel, true);
+               // Force refresh
+               IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer
+                               .getSelection();
+               nodesViewer.refresh(tmpSel.getFirstElement());
        }
 
+       // IoC
        public void setRepositoryRegister(RepositoryRegister repositoryRegister) {
                this.repositoryRegister = repositoryRegister;
        }
+
+       public void setSession(Session session) {
+               this.session = session;
+       }
+
 }