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