X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.akb.ui%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fakb%2Fui%2Fviews%2FAkbTemplatesTreeView.java;h=0930701e7b9f656516e3a9dd8ca53be5311cbe47;hb=b331d1e6936fc825ee2565f423e7e249dbecb687;hp=004e151c51485ab95bf241d952368a94b4ec6966;hpb=cce1ca8a555b41f6ca0a77ab549a5e1461f2bb15;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 004e151c5..0930701e7 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 @@ -34,17 +34,20 @@ 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.AkbService; import org.argeo.slc.akb.AkbTypes; import org.argeo.slc.akb.ui.AkbUiPlugin; +import org.argeo.slc.akb.ui.AkbUiUtils; 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.argeo.slc.akb.ui.utils.Refreshable; +import org.argeo.slc.akb.utils.AkbJcrUtils; 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; @@ -55,53 +58,33 @@ 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 { +public class AkbTemplatesTreeView extends ViewPart implements Refreshable { // private final static Log log = - // LogFactory.getLog(JcrResultTreeView.class); + // LogFactory.getLog(AkbTemplatesTreeView.class); public final static String ID = AkbUiPlugin.PLUGIN_ID + ".akbTemplatesTreeView"; /* DEPENDENCY INJECTION */ private Session session; + private AkbService akbService; // This page widgets - private TreeViewer resultTreeViewer; + private TreeViewer envTreeViewer; // Usefull business objects private Node templatesParentNode; // Observer - private EventListener allResultsObserver = null; - private final static String[] observedNodeTypesUnderAllResults = { + private EventListener akbNodesObserver = null; + private final static String[] observedNodeTypes = { AkbTypes.AKB_ENV_TEMPLATE, AkbTypes.AKB_CONNECTOR_ALIAS, - AkbTypes.AKB_ITEM, AkbTypes.AKB_ITEM_FOLDER }; - - // private EventListener myResultsObserver = null; - // private EventListener allResultsObserver = null; - // - // // under My Results - // private final static String[] observedNodeTypesUnderMyResult = { - // SlcTypes.SLC_TEST_RESULT, SlcTypes.SLC_RESULT_FOLDER, - // SlcTypes.SLC_MY_RESULT_ROOT_FOLDER }; - // - // private final static String[] observedNodeTypesUnderAllResults = { - // SlcTypes.SLC_TEST_RESULT, NodeType.NT_UNSTRUCTURED }; - // - // private boolean isResultFolder = false; - - // /** - // * To be overridden to adapt size of form and result frames. - // */ - // protected int[] getWeights() { - // return new int[] { 70, 30 }; - // } + AkbTypes.AKB_ITEM, AkbTypes.AKB_ITEM_FOLDER, + AkbTypes.AKB_CONNECTOR_FOLDER }; private void initialize() { try { @@ -116,8 +99,8 @@ public class AkbTemplatesTreeView extends ViewPart { public void createPartControl(Composite parent) { initialize(); - resultTreeViewer = createResultsTreeViewer(parent); - resultTreeViewer.setInput(initializeResultTree()); + envTreeViewer = createResultsTreeViewer(parent); + envTreeViewer.setInput(initializeResultTree()); // parent.setLayout(new FillLayout()); // // Main layout @@ -139,29 +122,6 @@ public class AkbTemplatesTreeView extends ViewPart { // sashForm.setWeights(getWeights()); // setOrderedInput(resultTreeViewer); - - // Initialize observer - // try { - // ObservationManager observationManager = session.getWorkspace() - // .getObservationManager(); - // myResultsObserver = new MyResultsObserver(resultTreeViewer - // .getTree().getDisplay()); - // allResultsObserver = new AllResultsObserver(resultTreeViewer - // .getTree().getDisplay()); - // - // // observe tree changes under MyResults - // observationManager.addEventListener(myResultsObserver, - // Event.NODE_ADDED | Event.NODE_REMOVED, - // SlcJcrResultUtils.getMyResultsBasePath(session), true, - // null, observedNodeTypesUnderMyResult, false); - // // observe tree changes under All results - // observationManager.addEventListener(allResultsObserver, - // Event.NODE_ADDED | Event.NODE_REMOVED, - // SlcJcrResultUtils.getSlcResultsBasePath(session), true, - // null, observedNodeTypesUnderAllResults, false); - // } catch (RepositoryException e) { - // throw new SlcException("Cannot register listeners", e); - // } } /** @@ -178,6 +138,7 @@ public class AkbTemplatesTreeView extends ViewPart { // The main tree viewer protected TreeViewer createResultsTreeViewer(Composite parent) { + parent.setLayout(AkbUiUtils.gridLayoutNoBorder()); int style = SWT.BORDER | SWT.MULTI; TreeViewer viewer = new TreeViewer(parent, style); @@ -222,67 +183,32 @@ public class AkbTemplatesTreeView extends ViewPart { ObservationManager observationManager = session.getWorkspace() .getObservationManager(); - allResultsObserver = new AllResultsObserver(viewer.getTree() + akbNodesObserver = new AkbNodesObserver(viewer.getTree() .getDisplay()); - - // observe tree changes under All results - observationManager.addEventListener(allResultsObserver, + observationManager.addEventListener(akbNodesObserver, Event.NODE_ADDED | Event.NODE_REMOVED, templatesParentNode.getPath(), true, null, - observedNodeTypesUnderAllResults, false); + observedNodeTypes, 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) { - // } - @Override public void setFocus() { } 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.", @@ -290,7 +216,14 @@ public class AkbTemplatesTreeView extends ViewPart { } } - // Manage context menu + @Override + public void forceRefresh(Object object) { + envTreeViewer.setInput(initializeResultTree()); + } + + // /////////////////////////// + // CONTEXT MENU MANAGEMENT + /** * Defines the commands that will pop up in the context menu. **/ @@ -300,58 +233,75 @@ public class AkbTemplatesTreeView extends ViewPart { try { // Build conditions - Node selected = (Node) ((IStructuredSelection) resultTreeViewer - .getSelection()).getFirstElement(); + IStructuredSelection selection = (IStructuredSelection) envTreeViewer + .getSelection(); + + Node selected = (Node) selection.getFirstElement(); + Node currEnv = null; boolean hasSelection = selected != null; + + if (hasSelection) + currEnv = AkbJcrUtils.getCurrentTemplate(selected); + + boolean isTemplate = hasSelection ? selected + .isNodeType(AkbTypes.AKB_ENV_TEMPLATE) : false; 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; + // boolean isParentConnectorsFolder = hasSelection ? selected + // .isNodeType(AkbTypes.AKB_CONNECTOR_FOLDER) : false; + boolean isDeletable = hasSelection ? true : false; // Add Connector Alias Map params = new HashMap(); - if (hasSelection) + if (hasSelection && isTemplate) { params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, selected.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + currEnv.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 + // Connector Alias submenu + refreshAliasesSubmenu(menuManager, window, "menu.aliasesSubmenu", + "Add Connector Alias", isTemplate, params); + + // Item Submenu params = new HashMap(); - if (hasSelection) + 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); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + currEnv.getIdentifier()); + } + refreshItemsSubmenu(menuManager, window, "menu.itemsSubmenu", + "Add Item", isParentItemsFolder || isTemplate, params); // Add Item Folder params = new HashMap(); - if (hasSelection) + if (hasSelection) { params.put(OpenAkbNodeEditor.PARAM_PARENT_NODE_JCR_ID, selected.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + currEnv.getIdentifier()); + } params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ITEM_FOLDER); - refreshParameterizedCommand(menuManager, window, + + AkbUiUtils.refreshParameterizedCommand(menuManager, window, "cmd.addItemFolder", OpenAkbNodeEditor.ID, - "Add item folder", null, isParentItemsFolder, params); + "Add item folder", null, isParentItemsFolder || isTemplate, + 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); + AkbUiUtils.refreshParameterizedCommand(menuManager, window, + "cmd.deleteItem", DeleteAkbNodes.ID, + "Delete selected item(s)", null, isDeletable, params); // create template params = new HashMap(); @@ -359,9 +309,10 @@ public class AkbTemplatesTreeView extends ViewPart { templatesParentNode.getIdentifier()); params.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_ENV_TEMPLATE); - refreshParameterizedCommand(menuManager, window, + AkbUiUtils.refreshParameterizedCommand(menuManager, window, "cmd.createTemplate", OpenAkbNodeEditor.ID, - "Create new template...", null, true, params); + "Create new template...", null, + !hasSelection || isTemplate, params); } catch (RepositoryException re) { throw new AkbException("Error while refreshing context menu", re); @@ -369,41 +320,186 @@ public class AkbTemplatesTreeView extends ViewPart { } /** - * Commodities the refresh of a single command with a map of parameters in a - * Menu.aboutToShow method to simplify further development + * + * refreshes submenu with various connector types * * @param menuManager * @param locator - * @param cmdId + * @param itemId * @param label - * @param iconPath - * @param showCommand + * @param isVisible + * @param params */ - private void refreshParameterizedCommand(IMenuManager menuManager, - IServiceLocator locator, String itemId, String cmdId, String label, - ImageDescriptor icon, boolean showCommand, - Map params) { + private void refreshItemsSubmenu(IMenuManager menuManager, + IServiceLocator locator, String itemId, String label, + boolean isVisible, Map params) { + + // clean 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; + MenuManager subMenu = new MenuManager(label, itemId); + + // JDBC Query + Map tmpParams = new HashMap(); + tmpParams.putAll(params); + tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, + AkbTypes.AKB_JDBC_QUERY); + String currItemId = "cmd.createJDBCQuery"; + IContributionItem currItem = subMenu.find(currItemId); + if (currItem != null) + subMenu.remove(currItem); + subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, + currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams)); + + // SSH COMMAND + tmpParams = new HashMap(); + tmpParams.putAll(params); + tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, + AkbTypes.AKB_SSH_COMMAND); + currItemId = "cmd.createSSHCommand"; + currItem = subMenu.find(currItemId); + if (currItem != null) + subMenu.remove(currItem); + subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, + currItemId, OpenAkbNodeEditor.ID, "SSH Command", null, + tmpParams)); + + // SSH FILE + tmpParams = new HashMap(); + tmpParams.putAll(params); + tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_TYPE, AkbTypes.AKB_SSH_FILE); + currItemId = "cmd.createSSHFile"; + currItem = subMenu.find(currItemId); + if (currItem != null) + subMenu.remove(currItem); + subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, + currItemId, OpenAkbNodeEditor.ID, "SSH File", null, tmpParams)); + + // refresh + menuManager.add(subMenu); + subMenu.setVisible(isVisible); + } - if (params != null) - contributionItemParameter.parameters = params; + /** + * + * refreshes submenu with various connector types + * + * @param menuManager + * @param locator + * @param itemId + * @param label + * @param isVisible + * @param params + */ + private void refreshAliasesSubmenu(IMenuManager menuManager, + IServiceLocator locator, String itemId, String label, + boolean isVisible, Map params) { - CommandContributionItem cci = new CommandContributionItem( - contributionItemParameter); - menuManager.add(cci); - } + // clean + IContributionItem ici = menuManager.find(itemId); + if (ici != null) + menuManager.remove(ici); + + // TODO use dynamic contribution to dynamically retrieve specific + // connector types + // CompoundContributionItem comConI = new MyCompoundCI(menuManager, + // locator, itemId); + MenuManager subMenu = new MenuManager(label, itemId); + + // JDBC + Map tmpParams = new HashMap(); + tmpParams.putAll(params); + tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE, + AkbTypes.AKB_JDBC_CONNECTOR); + String currItemId = "cmd.createJDBCAlias"; + IContributionItem currItem = subMenu.find(currItemId); + if (currItem != null) + subMenu.remove(currItem); + subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, + currItemId, OpenAkbNodeEditor.ID, "JDBC", null, tmpParams)); + + // SSH + tmpParams = new HashMap(); + tmpParams.putAll(params); + tmpParams.put(OpenAkbNodeEditor.PARAM_NODE_SUBTYPE, + AkbTypes.AKB_SSH_CONNECTOR); + currItemId = "cmd.createSSHAlias"; + currItem = subMenu.find(currItemId); + if (currItem != null) + subMenu.remove(currItem); + subMenu.add(AkbUiUtils.createContributionItem(menuManager, locator, + currItemId, OpenAkbNodeEditor.ID, "SSH", null, tmpParams)); + + // refresh + menuManager.add(subMenu); + subMenu.setVisible(isVisible); } + // private class MyCompoundCI extends CompoundContributionItem { + // private IMenuManager menuManager; + // private IServiceLocator locator; + // + // public MyCompoundCI(IMenuManager menuManager, IServiceLocator locator, + // String itemId) { + // super(itemId); + // this.menuManager = menuManager; + // this.locator = locator; + // } + // + // @Override + // protected IContributionItem[] getContributionItems() { + // + // CommandContributionItem[] submenu = new CommandContributionItem[2]; + // submenu[0] = createContributionItem(menuManager, locator, "uid.1", + // OpenAkbNodeEditor.ID, "test1" + System.currentTimeMillis(), + // null, null); + // submenu[1] = createContributionItem(menuManager, locator, "uid.2", + // OpenAkbNodeEditor.ID, "test2", null, null); + // return submenu; + // } + // } + /* INNER CLASSES */ + private class AkbNodesObserver extends AsyncUiEventListener { + + public AkbNodesObserver(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 { + boolean fullRefresh = false; + + eventLoop: for (Event event : events) { + String currPath = event.getPath(); + if (session.nodeExists(currPath)) { + Node node = session.getNode(currPath); + if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE)) { + fullRefresh = true; + break eventLoop; + } + } + } + + Object[] visibles = envTreeViewer.getExpandedElements(); + if (fullRefresh) + envTreeViewer.setInput(initializeResultTree()); + else + envTreeViewer.refresh(); + + envTreeViewer.setExpandedElements(visibles); + } + } + class ViewDoubleClickListener implements IDoubleClickListener { public void doubleClick(DoubleClickEvent evt) { Object obj = ((IStructuredSelection) evt.getSelection()) @@ -411,9 +507,16 @@ public class AkbTemplatesTreeView extends ViewPart { try { if (obj instanceof Node) { Node node = (Node) obj; - CommandUtils.callCommand(OpenAkbNodeEditor.ID, - OpenAkbNodeEditor.PARAM_NODE_JCR_ID, + Node currEnv = AkbJcrUtils.getCurrentTemplate(node); + + // Add Connector Alias + Map params = new HashMap(); + params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID, node.getIdentifier()); + params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID, + currEnv.getIdentifier()); + + CommandUtils.callCommand(OpenAkbNodeEditor.ID, params); } } catch (RepositoryException e) { throw new AkbException("Cannot open " + obj, e); @@ -435,4 +538,9 @@ public class AkbTemplatesTreeView extends ViewPart { throw new AkbException("unable to log in for " + ID + " view"); } } + + public void setAkbService(AkbService akbService) { + this.akbService = akbService; + + } } \ No newline at end of file