X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Forg.argeo.slc.akb.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fakb%2Fui%2Fviews%2FAkbTemplatesTreeView.java;h=004e151c51485ab95bf241d952368a94b4ec6966;hb=da17a59fb316462126c56099d3670a7cd38a8906;hp=9e82b4bebcfbeed546fbcdc79eadaa870dad1c57;hpb=c5a5cb9a47fdafcc95f1b8902f31b62a0e6a9674;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbTemplatesTreeView.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbTemplatesTreeView.java index 9e82b4beb..004e151c5 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbTemplatesTreeView.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/views/AkbTemplatesTreeView.java @@ -15,25 +15,36 @@ */ package org.argeo.slc.akb.ui.views; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.jcr.Node; +import javax.jcr.NodeIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.observation.Event; +import javax.jcr.observation.EventListener; +import javax.jcr.observation.ObservationManager; +import org.argeo.eclipse.ui.jcr.AsyncUiEventListener; import org.argeo.eclipse.ui.utils.CommandUtils; +import org.argeo.jcr.JcrUtils; import org.argeo.slc.akb.AkbException; import org.argeo.slc.akb.AkbNames; import org.argeo.slc.akb.AkbTypes; import org.argeo.slc.akb.ui.AkbUiPlugin; +import org.argeo.slc.akb.ui.commands.DeleteAkbNodes; import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor; import org.argeo.slc.akb.ui.providers.AkbTreeLabelProvider; import org.argeo.slc.akb.ui.providers.TemplatesTreeContentProvider; +import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; @@ -41,9 +52,13 @@ import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.menus.CommandContributionItem; +import org.eclipse.ui.menus.CommandContributionItemParameter; import org.eclipse.ui.part.ViewPart; +import org.eclipse.ui.services.IServiceLocator; /** SLC generic JCR Result tree view. */ public class AkbTemplatesTreeView extends ViewPart { @@ -62,6 +77,12 @@ public class AkbTemplatesTreeView extends ViewPart { // Usefull business objects private Node templatesParentNode; + // Observer + private EventListener allResultsObserver = null; + private final static String[] observedNodeTypesUnderAllResults = { + AkbTypes.AKB_ENV_TEMPLATE, AkbTypes.AKB_CONNECTOR_ALIAS, + AkbTypes.AKB_ITEM, AkbTypes.AKB_ITEM_FOLDER }; + // private EventListener myResultsObserver = null; // private EventListener allResultsObserver = null; // @@ -95,7 +116,8 @@ public class AkbTemplatesTreeView extends ViewPart { public void createPartControl(Composite parent) { initialize(); - createResultsTreeViewer(parent); + resultTreeViewer = createResultsTreeViewer(parent); + resultTreeViewer.setInput(initializeResultTree()); // parent.setLayout(new FillLayout()); // // Main layout @@ -173,12 +195,6 @@ public class AkbTemplatesTreeView extends ViewPart { // .getDecoratorManager().getLabelDecorator(); // viewer.setLabelProvider(new DecoratingLabelProvider(rtLblProvider, // decorator)); - // viewer.addDoubleClickListener(new ViewDoubleClickListener()); - - // Override default behaviour to insure that 2 distincts results that - // have the same name will be correctly and distincly returned by - // corresponding TreeViewer.getSelection() method. - // viewer.setComparer(new ResultItemsComparer()); getSite().setSelectionProvider(viewer); @@ -201,12 +217,50 @@ public class AkbTemplatesTreeView extends ViewPart { getSite().registerContextMenu(menuManager, viewer); + // Initialize observer + try { + ObservationManager observationManager = session.getWorkspace() + .getObservationManager(); + + allResultsObserver = new AllResultsObserver(viewer.getTree() + .getDisplay()); + + // observe tree changes under All results + observationManager.addEventListener(allResultsObserver, + Event.NODE_ADDED | Event.NODE_REMOVED, + templatesParentNode.getPath(), true, null, + observedNodeTypesUnderAllResults, false); + } catch (RepositoryException e) { + throw new AkbException("Cannot register listeners", e); + } + // add change listener to display TestResult information in the property // viewer // viewer.addSelectionChangedListener(new MySelectionChangedListener()); return viewer; } + class AllResultsObserver extends AsyncUiEventListener { + + public AllResultsObserver(Display display) { + super(display); + } + + @Override + protected Boolean willProcessInUiThread(List events) + throws RepositoryException { + // unfiltered for the time being + return true; + } + + protected void onEventInUiThread(List events) + throws RepositoryException { + resultTreeViewer.setInput(initializeResultTree()); + // if (lastSelectedSourceElementParent != null) + // refresh(lastSelectedSourceElementParent); + } + } + // Detailed property viewer // protected TableViewer createPropertiesViewer(Composite parent) { // } @@ -215,65 +269,26 @@ public class AkbTemplatesTreeView extends ViewPart { public void setFocus() { } - // private ResultParent[] initializeResultTree() { - // try { - // // Force initialization of the tree structure if needed - // SlcJcrResultUtils.getSlcResultsParentNode(session); - // SlcJcrResultUtils.getMyResultParentNode(session); - // // Remove yesterday and last 7 days virtual folders - // // ResultParent[] roots = new ResultParent[5]; - // ResultParent[] roots = new ResultParent[3]; - // - // // My results - // roots[0] = new ParentNodeFolder(null, - // SlcJcrResultUtils.getMyResultParentNode(session), - // SlcUiConstants.DEFAULT_MY_RESULTS_FOLDER_LABEL); - // - // // today - // Calendar cal = Calendar.getInstance(); - // String relPath = JcrUtils.dateAsPath(cal); - // List datePathes = new ArrayList(); - // datePathes.add(relPath); - // roots[1] = new VirtualFolder(null, - // ResultParentUtils.getResultsForDates(session, datePathes), - // "Today"); - // - // // // Yesterday - // // cal = Calendar.getInstance(); - // // cal.add(Calendar.DAY_OF_YEAR, -1); - // // relPath = JcrUtils.dateAsPath(cal); - // // datePathes = new ArrayList(); - // // datePathes.add(relPath); - // // roots[2] = new VirtualFolder(null, - // // ResultParentUtils.getResultsForDates(session, datePathes), - // // "Yesterday"); - // // // Last 7 days - // // - // // cal = Calendar.getInstance(); - // // datePathes = new ArrayList(); - // // - // // for (int i = 0; i < 7; i++) { - // // cal.add(Calendar.DAY_OF_YEAR, -i); - // // relPath = JcrUtils.dateAsPath(cal); - // // datePathes.add(relPath); - // // } - // // roots[3] = new VirtualFolder(null, - // // ResultParentUtils.getResultsForDates(session, datePathes), - // // "Last 7 days"); - // - // // All results - // Node otherResultsPar = session.getNode(SlcJcrResultUtils - // .getSlcResultsBasePath(session)); - // // roots[4] = new ParentNodeFolder(null, otherResultsPar, - // // "All results"); - // roots[2] = new ParentNodeFolder(null, otherResultsPar, - // "All results"); - // return roots; - // } catch (RepositoryException re) { - // throw new ArgeoException( - // "Unexpected error while initializing ResultTree.", re); - // } - // } + private Node[] initializeResultTree() { + try { + + NodeIterator ni = templatesParentNode.getNodes(); + List templates = new ArrayList(); + + while (ni.hasNext()) { + Node currNode = ni.nextNode(); + if (currNode.isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) + templates.add(currNode); + } + + Node[] templateArr = templates.toArray(new Node[templates.size()]); + + return templateArr; + } catch (RepositoryException re) { + throw new AkbException("Error while initializing templates Tree.", + re); + } + } // Manage context menu /** @@ -283,103 +298,111 @@ public class AkbTemplatesTreeView extends ViewPart { IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow(); try { - // IStructuredSelection selection = (IStructuredSelection) - // resultTreeViewer - // .getSelection(); - // boolean canAddSubfolder = false; - // boolean canRenamefolder = false; - // boolean isSingleResultNode = false; - // boolean isUnderMyResult = false; - // boolean validMultipleDelete = false; - // - // // Building conditions - // if (selection.size() == 1) { - // Object obj = selection.getFirstElement(); - // if (obj instanceof SingleResultNode) - // isSingleResultNode = true; - // else if (obj instanceof ParentNodeFolder) { - // Node cNode = ((ParentNodeFolder) obj).getNode(); - // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) { - // canAddSubfolder = true; - // canRenamefolder = true; - // isUnderMyResult = true; - // } else if (cNode - // .isNodeType(SlcTypes.SLC_MY_RESULT_ROOT_FOLDER)) { - // canAddSubfolder = true; - // } - // } - // } else { - // @SuppressWarnings("rawtypes") - // Iterator it = selection.iterator(); - // multicheck: while (it.hasNext()) { - // validMultipleDelete = true; - // Object obj = it.next(); - // if (obj instanceof SingleResultNode) - // continue multicheck; - // else if (obj instanceof ParentNodeFolder) { - // Node cNode = ((ParentNodeFolder) obj).getNode(); - // if (cNode.isNodeType(SlcTypes.SLC_RESULT_FOLDER)) - // continue multicheck; - // else { - // validMultipleDelete = false; - // break multicheck; - // } - // } else { - // validMultipleDelete = false; - // break multicheck; - // } - // } - // } + // Build conditions + Node selected = (Node) ((IStructuredSelection) resultTreeViewer + .getSelection()).getFirstElement(); + + boolean hasSelection = selected != null; + boolean isParentItemsFolder = hasSelection ? selected + .isNodeType(AkbTypes.AKB_ITEM_FOLDER) : false; + boolean isParentConnectorsFolder = hasSelection ? selected + .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false; + boolean isDeletable = hasSelection ? !(selected.getParent() + .isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) : false; + + // Add Connector Alias Map params = new HashMap(); + if (hasSelection) + params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, + selected.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, + AkbTypes.AKB_CONNECTOR_ALIAS); + refreshParameterizedCommand(menuManager, window, + "cmd.addConnector", OpenAkbNodeEditor.ID, + "Add connector Alias", null, isParentConnectorsFolder, + params); + + // Add Item + params = new HashMap(); + if (hasSelection) + params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, + selected.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ITEM); + refreshParameterizedCommand(menuManager, window, "cmd.addItem", + OpenAkbNodeEditor.ID, "Add item", null, + isParentItemsFolder, params); + + // Add Item Folder + params = new HashMap(); + if (hasSelection) + params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, + selected.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, + AkbTypes.AKB_ITEM_FOLDER); + refreshParameterizedCommand(menuManager, window, + "cmd.addItemFolder", OpenAkbNodeEditor.ID, + "Add item folder", null, isParentItemsFolder, params); + + // Delete Item + params = new HashMap(); + if (hasSelection) + params.put(DeleteAkbNodes.PARAM_NODE_JCR_ID, + selected.getIdentifier()); + refreshParameterizedCommand(menuManager, window, "cmd.deleteItem", + DeleteAkbNodes.ID, "Delete selected item(s)", null, + isDeletable, params); + + // create template + params = new HashMap(); params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, templatesParentNode.getIdentifier()); params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ENV_TEMPLATE); + refreshParameterizedCommand(menuManager, window, + "cmd.createTemplate", OpenAkbNodeEditor.ID, + "Create new template...", null, true, params); - // Effective Refresh - CommandUtils.refreshParametrizedCommand(menuManager, window, - OpenAkbNodeEditor.ID, "Create new template...", null, true, - params); - - // - // CommandUtils.refreshCommand(menuManager, window, DeleteItems.ID, - // DeleteItems.DEFAULT_LABEL, DeleteItems.DEFAULT_IMG_DESCRIPTOR, - // isUnderMyResult || isSingleResultNode || validMultipleDelete); - // - // CommandUtils.refreshCommand(menuManager, window, - // AddResultFolder.ID, - // AddResultFolder.DEFAULT_LABEL, - // ClientUiPlugin.getDefault().getWorkbench().getSharedImages() - // .getImageDescriptor(ISharedImages.IMG_OBJ_ADD), - // canAddSubfolder); - // - // CommandUtils.refreshCommand(menuManager, window, - // RenameResultFolder.ID, - // RenameResultFolder.DEFAULT_LABEL, - // RenameResultFolder.DEFAULT_IMG_DESCRIPTOR, canRenamefolder); - // - // // Command removed for the time being. - // CommandUtils.refreshCommand(menuManager, window, - // RenameResultNode.ID, - // RenameResultNode.DEFAULT_LABEL, - // RenameResultNode.DEFAULT_IMG_DESCRIPTOR, false); - // - // // Test to be removed - // // If you use this pattern, do not forget to call - // // menuManager.setRemoveAllWhenShown(true); - // // when creating the menuManager - // - // // menuManager.add(new Action("Test") { - // // public void run() { - // // log.debug("do something"); - // // } - // // }); } catch (RepositoryException re) { throw new AkbException("Error while refreshing context menu", re); } } + /** + * Commodities the refresh of a single command with a map of parameters in a + * Menu.aboutToShow method to simplify further development + * + * @param menuManager + * @param locator + * @param cmdId + * @param label + * @param iconPath + * @param showCommand + */ + private void refreshParameterizedCommand(IMenuManager menuManager, + IServiceLocator locator, String itemId, String cmdId, String label, + ImageDescriptor icon, boolean showCommand, + Map params) { + IContributionItem ici = menuManager.find(itemId); + if (ici != null) + menuManager.remove(ici); + CommandContributionItemParameter contributionItemParameter = new CommandContributionItemParameter( + locator, itemId, cmdId, SWT.PUSH); + + if (showCommand) { + // Set Params + contributionItemParameter.label = label; + contributionItemParameter.icon = icon; + + if (params != null) + contributionItemParameter.parameters = params; + + CommandContributionItem cci = new CommandContributionItem( + contributionItemParameter); + menuManager.add(cci); + } + } + /* INNER CLASSES */ class ViewDoubleClickListener implements IDoubleClickListener { public void doubleClick(DoubleClickEvent evt) { @@ -398,60 +421,11 @@ public class AkbTemplatesTreeView extends ViewPart { } } - // class MyResultsObserver extends AsyncUiEventListener { - // - // public MyResultsObserver(Display display) { - // super(display); - // } - // - // @Override - // protected Boolean willProcessInUiThread(List events) - // throws RepositoryException { - // // unfiltered for the time being - // return true; - // } - // - // protected void onEventInUiThread(List events) - // throws RepositoryException { - // List nodesToRefresh = new ArrayList(); - // - // for (Event event : events) { - // String parPath = JcrUtils.parentPath(event.getPath()); - // if (session.nodeExists(parPath)) { - // Node node = session.getNode(parPath); - // if (!nodesToRefresh.contains(node)) { - // nodesToRefresh.add(node); - // } - // } - // } - // - // // Update check nodes - // for (Node node : nodesToRefresh) - // jcrRefresh(node); - // refresh(null); - // } - // } - - // class AllResultsObserver extends AsyncUiEventListener { - // - // public AllResultsObserver(Display display) { - // super(display); - // } - // - // @Override - // protected Boolean willProcessInUiThread(List events) - // throws RepositoryException { - // // unfiltered for the time being - // return true; - // } - // - // protected void onEventInUiThread(List events) - // throws RepositoryException { - // refresh(null); - // // if (lastSelectedSourceElementParent != null) - // // refresh(lastSelectedSourceElementParent); - // } - // } + @Override + public void dispose() { + JcrUtils.logoutQuietly(session); + super.dispose(); + } /* DEPENDENCY INJECTION */ public void setRepository(Repository repository) {