]> 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
Add first draft for Connector Alias and Template environment editors.
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / views / AkbTemplatesTreeView.java
index 9ab230520c0bc4a4cbf6311e75f16168d9e82fa9..004e151c51485ab95bf241d952368a94b4ec6966 100644 (file)
@@ -25,19 +25,26 @@ import javax.jcr.NodeIterator;
 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
@@ -45,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
@@ -66,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
@@ -200,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
@@ -243,22 +298,111 @@ public class AkbTemplatesTreeView extends ViewPart {
                IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()\r
                                .getActiveWorkbenchWindow();\r
                try {\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
-\r
-                       // Effective Refresh\r
-                       CommandUtils.refreshParametrizedCommand(menuManager, window,\r
-                                       OpenAkbNodeEditor.ID, "Create new template...", null, true,\r
-                                       params);\r
+                       refreshParameterizedCommand(menuManager, window,\r
+                                       "cmd.createTemplate", OpenAkbNodeEditor.ID,\r
+                                       "Create new template...", null, true, params);\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