X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=server%2Fplugins%2Forg.argeo.jcr.ui.explorer%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2Fui%2Fexplorer%2Fviews%2FGenericJcrBrowser.java;h=1c1ce6a234cc826a3ac8a9cbec34011c37700950;hb=1d5afdce3e91054f07ddd3c98309c363b4cf1d46;hp=4a2562fd0377d9db00e9b289bc4999181a0643bd;hpb=64d85a994e8a9bbf14ec4c0410dd24ded3efc32d;p=lgpl%2Fargeo-commons.git diff --git a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java index 4a2562fd0..1c1ce6a23 100644 --- a/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java +++ b/server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/views/GenericJcrBrowser.java @@ -1,38 +1,52 @@ +/* + * Copyright (C) 2007-2012 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.jcr.ui.explorer.views; -import java.util.Arrays; import java.util.List; import javax.jcr.Property; import javax.jcr.PropertyType; -import javax.jcr.Repository; import javax.jcr.RepositoryException; -import javax.jcr.Session; +import javax.jcr.RepositoryFactory; +import javax.jcr.Value; import javax.jcr.observation.Event; import javax.jcr.observation.EventListener; import javax.jcr.observation.ObservationManager; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.TreeParent; import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer; import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser; -import org.argeo.eclipse.ui.specific.FileHandler; -import org.argeo.jcr.ArgeoJcrConstants; -import org.argeo.jcr.JcrUtils; import org.argeo.jcr.RepositoryRegister; +import org.argeo.jcr.security.JcrKeyring; +import org.argeo.jcr.ui.explorer.JcrExplorerPlugin; import org.argeo.jcr.ui.explorer.browser.NodeContentProvider; import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider; import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider; +import org.argeo.jcr.ui.explorer.model.SingleJcrNode; import org.argeo.jcr.ui.explorer.utils.GenericNodeDoubleClickListener; -import org.argeo.jcr.ui.explorer.utils.JcrFileProvider; +import org.argeo.jcr.ui.explorer.utils.JcrUiUtils; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; 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; @@ -51,11 +65,15 @@ import org.eclipse.swt.widgets.Menu; */ public class GenericJcrBrowser extends AbstractJcrBrowser { - private final static Log log = LogFactory.getLog(GenericJcrBrowser.class); + // private final static Log log = + // LogFactory.getLog(GenericJcrBrowser.class); + public final static String ID = JcrExplorerPlugin.ID + ".browserView"; + private boolean sortChildNodes = false; /* DEPENDENCY INJECTION */ - private Session session; + private JcrKeyring jcrKeyring; private RepositoryRegister repositoryRegister; + private RepositoryFactory repositoryFactory; // This page widgets private TreeViewer nodesViewer; @@ -64,33 +82,33 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { private EventListener resultsObserver; // Manage documents - private JcrFileProvider jcrFileProvider; - private FileHandler fileHandler; + // private JcrFileProvider jcrFileProvider; + // private FileHandler fileHandler; @Override public void createPartControl(Composite parent) { // look for session - Session nodeSession = session; - if (nodeSession == null) { - Repository nodeRepository = JcrUtils.getRepositoryByAlias( - repositoryRegister, ArgeoJcrConstants.ALIAS_NODE); - if (nodeRepository != null) - try { - nodeSession = nodeRepository.login(); - // TODO : enhance that to enable multirepository listener. - session = nodeSession; - } catch (RepositoryException e1) { - throw new ArgeoException("Cannot login to node repository"); - } - } + // Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession() + // : null; + // if (nodeSession == null) { + // Repository nodeRepository = JcrUtils.getRepositoryByAlias( + // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE); + // if (nodeRepository != null) + // try { + // nodeSession = nodeRepository.login(); + // // TODO : enhance that to enable multirepository listener. + // } catch (RepositoryException e1) { + // throw new ArgeoException("Cannot login to node repository"); + // } + // } // Instantiate the generic object that fits for // both RCP & RAP // Note that in RAP, it registers a service handler that provide the // access to the files. - jcrFileProvider = new JcrFileProvider(); - fileHandler = new FileHandler(jcrFileProvider); + // jcrFileProvider = new JcrFileProvider(); + // fileHandler = new FileHandler(jcrFileProvider); parent.setLayout(new FillLayout()); SashForm sashForm = new SashForm(parent, SWT.VERTICAL); @@ -102,15 +120,16 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { GridLayout gl = new GridLayout(1, false); top.setLayout(gl); - nodeContentProvider = new NodeContentProvider(nodeSession, - repositoryRegister); + nodeContentProvider = new NodeContentProvider(jcrKeyring, + repositoryRegister, repositoryFactory, sortChildNodes); // nodes viewer nodesViewer = createNodeViewer(top, nodeContentProvider); - // context menu + // context menu : it is completely defined in the plugin.xml file. MenuManager menuManager = new MenuManager(); Menu menu = menuManager.createContextMenu(nodesViewer.getTree()); + nodesViewer.getTree().setMenu(menu); getSite().registerContextMenu(menuManager, nodesViewer); getSite().setSelectionProvider(nodesViewer); @@ -120,7 +139,66 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { // Create the property viewer on the bottom Composite bottom = new Composite(sashForm, SWT.NONE); bottom.setLayout(new GridLayout(1, false)); - propertiesViewer = new TableViewer(bottom); + propertiesViewer = createPropertiesViewer(bottom); + + sashForm.setWeights(getWeights()); + nodesViewer.setComparer(new NodeViewerComparer()); + } + + /** + * To be overridden to adapt size of form and result frames. + */ + protected int[] getWeights() { + return new int[] { 70, 30 }; + } + + protected TreeViewer createNodeViewer(Composite parent, + final ITreeContentProvider nodeContentProvider) { + + final TreeViewer tmpNodeViewer = new TreeViewer(parent, SWT.MULTI); + + tmpNodeViewer.getTree().setLayoutData( + new GridData(SWT.FILL, SWT.FILL, true, true)); + + tmpNodeViewer.setContentProvider(nodeContentProvider); + tmpNodeViewer.setLabelProvider(new NodeLabelProvider()); + tmpNodeViewer + .addSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + if (!event.getSelection().isEmpty()) { + IStructuredSelection sel = (IStructuredSelection) event + .getSelection(); + Object firstItem = sel.getFirstElement(); + if (firstItem instanceof SingleJcrNode) + propertiesViewer + .setInput(((SingleJcrNode) firstItem) + .getNode()); + } else { + propertiesViewer.setInput(getViewSite()); + } + } + }); + + resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay()); + if (jcrKeyring != null) + try { + ObservationManager observationManager = jcrKeyring.getSession() + .getWorkspace().getObservationManager(); + observationManager.addEventListener(resultsObserver, + Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", + true, null, null, false); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot register listeners", e); + } + + tmpNodeViewer + .addDoubleClickListener(new GenericNodeDoubleClickListener( + tmpNodeViewer)); + return tmpNodeViewer; + } + + protected TableViewer createPropertiesViewer(Composite parent) { + propertiesViewer = new TableViewer(parent); propertiesViewer.getTable().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); propertiesViewer.getTable().setHeaderVisible(true); @@ -148,9 +226,17 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { Property property = (Property) element; if (property.getType() == PropertyType.BINARY) return ""; - else if (property.isMultiple()) - return Arrays.asList(property.getValues()).toString(); - else + else if (property.isMultiple()) { + StringBuffer buf = new StringBuffer("["); + Value[] values = property.getValues(); + for (int i = 0; i < values.length; i++) { + if (i != 0) + buf.append(", "); + buf.append(values[i].getString()); + } + buf.append(']'); + return buf.toString(); + } else return property.getValue().getString(); } catch (RepositoryException e) { throw new ArgeoException( @@ -173,96 +259,35 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { } }); propertiesViewer.setInput(getViewSite()); - - sashForm.setWeights(getWeights()); - nodesViewer.setComparer(new NodeViewerComparer()); + return propertiesViewer; } - /** - * To be overridden to adapt size of form and result frames. - */ - protected int[] getWeights() { - return new int[] { 70, 30 }; - } - - // @Override - // public void setFocus() { - // nodesViewer.getTree().setFocus(); - // } - // - // /* - // * NOTIFICATION - // */ - // public void refresh(Object obj) { - // nodesViewer.refresh(obj); - // } - // - // public void nodeAdded(Node parentNode, Node newNode) { - // nodesViewer.refresh(parentNode); - // nodesViewer.expandToLevel(newNode, 0); - // } - // - // public void nodeRemoved(Node parentNode) { - // - // IStructuredSelection newSel = new StructuredSelection(parentNode); - // nodesViewer.setSelection(newSel, true); - // // Force refresh - // IStructuredSelection tmpSel = (IStructuredSelection) nodesViewer - // .getSelection(); - // nodesViewer.refresh(tmpSel.getFirstElement()); - // } - - private JcrFileProvider getJcrFileProvider() { - return jcrFileProvider; + @Override + public void dispose() { + super.dispose(); } - private FileHandler getFileHandler() { - return fileHandler; + @Override + protected TreeViewer getNodeViewer() { + return nodesViewer; } - protected TreeViewer createNodeViewer(Composite parent, - final ITreeContentProvider nodeContentProvider) { - - final TreeViewer tmpNodeViewer = new TreeViewer(parent, SWT.MULTI); - - tmpNodeViewer.getTree().setLayoutData( - new GridData(SWT.FILL, SWT.FILL, true, true)); - - tmpNodeViewer.setContentProvider(nodeContentProvider); - tmpNodeViewer.setLabelProvider(new NodeLabelProvider()); - tmpNodeViewer - .addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - if (!event.getSelection().isEmpty()) { - IStructuredSelection sel = (IStructuredSelection) event - .getSelection(); - propertiesViewer.setInput(sel.getFirstElement()); - } else { - propertiesViewer.setInput(getViewSite()); - } - } - }); - - resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay()); - try { - ObservationManager observationManager = session.getWorkspace() - .getObservationManager(); - observationManager.addEventListener(resultsObserver, - Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", true, - null, null, false); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot register listeners", e); - } - - tmpNodeViewer - .addDoubleClickListener(new GenericNodeDoubleClickListener( - tmpNodeViewer)); - return tmpNodeViewer; + /** Notifies the current view that a node has been added */ + public void nodeAdded(TreeParent parentNode) { + // insure that Ui objects have been correctly created: + JcrUiUtils.forceRefreshIfNeeded(parentNode); + getNodeViewer().refresh(parentNode); + getNodeViewer().expandToLevel(parentNode, 1); } - @Override - protected TreeViewer getNodeViewer() { - return nodesViewer; + /** Notifies the current view that a node has been added */ + public void nodeRemoved(TreeParent parentNode) { + IStructuredSelection newSel = new StructuredSelection(parentNode); + getNodeViewer().setSelection(newSel, true); + // Force refresh + IStructuredSelection tmpSel = (IStructuredSelection) getNodeViewer() + .getSelection(); + getNodeViewer().refresh(tmpSel.getFirstElement()); } class TreeObserver extends AsyncUiEventListener { @@ -295,13 +320,25 @@ public class GenericJcrBrowser extends AbstractJcrBrowser { } + public void setSortChildNodes(boolean sortChildNodes) { + this.sortChildNodes = sortChildNodes; + } + + public boolean getSortChildNodes() { + return sortChildNodes; + } + /* DEPENDENCY INJECTION */ public void setRepositoryRegister(RepositoryRegister repositoryRegister) { this.repositoryRegister = repositoryRegister; } - public void setSession(Session session) { - this.session = session; + public void setJcrKeyring(JcrKeyring jcrKeyring) { + this.jcrKeyring = jcrKeyring; + } + + public void setRepositoryFactory(RepositoryFactory repositoryFactory) { + this.repositoryFactory = repositoryFactory; } }