Fix environment editor
authorBruno Sinou <bsinou@argeo.org>
Sat, 16 Nov 2013 16:11:16 +0000 (16:11 +0000)
committerBruno Sinou <bsinou@argeo.org>
Sat, 16 Nov 2013 16:11:16 +0000 (16:11 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6623 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/commands/OpenAkbNodeEditor.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/AliasListItemComposite.java [new file with mode: 0644]
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/AbstractAkbNodeEditor.java
plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/editors/EnvTemplateEditor.java

index a04bde084265a38f7d51acb2dd80de88b7cf4a45..cdd7dd5bdc1fa99f5c240f4a939aab778f329599 100644 (file)
@@ -154,7 +154,7 @@ public class OpenAkbNodeEditor extends AbstractHandler {
                String editorId = null;
                if (node.isNodeType(AkbTypes.AKB_CONNECTOR_ALIAS))
                        editorId = ConnectorAliasEditor.ID;
-               else if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE))
+               else if (node.isNodeType(AkbTypes.AKB_ENV_TEMPLATE) || node.isNodeType(AkbTypes.AKB_ENV))
                        editorId = EnvTemplateEditor.ID;
                else if (node.isNodeType(AkbTypes.AKB_SSH_FILE))
                        editorId = SshFileTemplateEditor.ID;
diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/AliasListItemComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/AliasListItemComposite.java
new file mode 100644 (file)
index 0000000..966c6e5
--- /dev/null
@@ -0,0 +1,231 @@
+package org.argeo.slc.akb.ui.composites;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.eclipse.ui.ErrorFeedback;
+import org.argeo.eclipse.ui.utils.CommandUtils;
+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.AkbImages;
+import org.argeo.slc.akb.ui.AkbUiUtils;
+import org.argeo.slc.akb.ui.commands.DeleteAkbNodes;
+import org.argeo.slc.akb.ui.wizards.ActiveConnectorWizard;
+import org.argeo.slc.akb.utils.AkbJcrUtils;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.AbstractFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+/** Default composite to display a connector alias. */
+public class AliasListItemComposite extends Composite {
+
+       private final AkbService akbService;
+       private final Node connectorAlias;
+       private final Node activeEnv;
+       private final boolean isActive;
+       private final Node activeConnector;
+       private final FormToolkit toolkit;
+       private final IManagedForm form;
+
+       // Don't forget to unregister on dispose
+       private AbstractFormPart formPart;
+
+       // To enable set focus
+       private Text titleTxt;
+
+       public AliasListItemComposite(Composite parent, int style,
+                       FormToolkit toolkit, IManagedForm form, Node envNode,
+                       String aliasPath, AkbService akbService) {
+               super(parent, style);
+               this.activeEnv = envNode;
+               try {
+                       isActive = activeEnv.isNodeType(AkbTypes.AKB_ENV);
+                       this.activeConnector = akbService.getActiveConnectorByAlias(
+                                       envNode, aliasPath);
+                       this.connectorAlias = activeEnv.getSession().getNode(aliasPath);
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to get activeConnector for node", e);
+               }
+               this.toolkit = toolkit;
+               this.form = form;
+               this.akbService = akbService;
+               populate();
+               toolkit.adapt(this);
+       }
+
+       private void populate() {
+               // Initialization
+               Composite parent = this;
+               createConnectorAliasInfoCmp(parent);
+       }
+
+       private void createConnectorAliasInfoCmp(Composite parent) {
+               GridLayout gl = AkbUiUtils.gridLayoutNoBorder();
+               gl.marginBottom = 5;
+
+               parent.setLayout(gl);
+               Composite firstLine = toolkit.createComposite(parent, SWT.NO_FOCUS);
+               firstLine.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+               firstLine.setLayout(new GridLayout(6, false));
+
+               // Image
+               final Label image = toolkit.createLabel(firstLine, "", SWT.NONE);
+               GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+               try {
+                       image.setImage(AkbImages.getImageForAkbNodeType(activeConnector
+                                       .getPrimaryNodeType().getName()));
+               } catch (RepositoryException e2) {
+                       // silent
+               }
+               image.setLayoutData(gd);
+
+               // Name
+               final Text titleTxt = toolkit.createText(firstLine, "", SWT.NONE);
+               gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
+               gd.widthHint = 100;
+               titleTxt.setLayoutData(gd);
+
+               // Description
+               final Text descTxt = toolkit.createText(firstLine, "", SWT.NONE);
+               descTxt.setLayoutData(gd);
+
+               final Link testBtn = new Link(firstLine, SWT.NONE);
+               toolkit.adapt(testBtn, false, false);
+               testBtn.setText("<a>Test</a>");
+               testBtn.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER,
+                               true, false));
+               
+               final Link editActiveConnLk = new Link(firstLine, SWT.NONE);
+               toolkit.adapt(editActiveConnLk, false, false);
+               // editActiveConnLk.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER,
+               // true, false));
+               
+               if (!isActive) {
+                       final Link removeBtn = new Link(firstLine, SWT.NONE);
+                       toolkit.adapt(removeBtn, false, false);
+                       removeBtn.setText("<a>Delete</a>");
+                       removeBtn.addSelectionListener(new SelectionAdapter() {
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       try {
+                                               // Manually check if corresponding node was really
+                                               // removed
+                                               Session session = connectorAlias.getSession();
+                                               String absPath = connectorAlias.getPath();
+                                               CommandUtils.CallCommandWithOneParameter(
+                                                               DeleteAkbNodes.ID,
+                                                               DeleteAkbNodes.PARAM_NODE_JCR_ID, AkbJcrUtils
+                                                                               .getIdentifierQuietly(connectorAlias));
+
+                                               if (!session.nodeExists(absPath))
+                                                       form.removePart(formPart);
+                                       } catch (RepositoryException re) {
+                                               throw new AkbException(
+                                                               "Error while removing connector Alias ", re);
+                                       }
+                               }
+                       });
+               }
+
+               // Part Management
+               formPart = new AbstractFormPart() {
+                       public void refresh() {
+                               super.refresh();
+                               // update display value
+                               AkbUiUtils.refreshFormTextWidget(titleTxt, connectorAlias,
+                                               Property.JCR_TITLE, "Name");
+                               AkbUiUtils.refreshFormTextWidget(descTxt, connectorAlias,
+                                               Property.JCR_DESCRIPTION, "Short description");
+
+                               if (isActive) {
+                                       titleTxt.setEditable(false);
+                                       descTxt.setEditable(false);
+                                       editActiveConnLk.setText("<a>Edit connector instance</a>");
+                               } else {
+                                       titleTxt.setEditable(true);
+                                       descTxt.setEditable(true);
+                                       editActiveConnLk.setText("<a>Edit default connector</a>");
+                               }
+                       }
+               };
+               // Listeners
+               AkbUiUtils.addTextModifyListener(titleTxt, connectorAlias,
+                               Property.JCR_TITLE, formPart);
+               AkbUiUtils.addTextModifyListener(descTxt, connectorAlias,
+                               Property.JCR_DESCRIPTION, formPart);
+
+               testBtn.addSelectionListener(new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(SelectionEvent e) {
+                               boolean testSuccesfull;
+                               try {
+                                       testSuccesfull = akbService.testConnector(activeConnector);
+                               } catch (Exception e1) {
+                                       testSuccesfull = false;
+                                       ErrorFeedback.show("Cannot test connection", e1);
+                               }
+                               String name = AkbJcrUtils.get(activeConnector,
+                                               Property.JCR_TITLE);
+                               String url = AkbJcrUtils.get(activeConnector,
+                                               AkbNames.AKB_CONNECTOR_URL);
+                               String msg = " to " + name + " (" + url + ")";
+                               if (testSuccesfull)
+                                       MessageDialog.openInformation(
+                                                       getDisplay().getActiveShell(), "Test successful",
+                                                       "Successfully connected " + msg);
+                               else
+                                       MessageDialog.openError(getDisplay().getActiveShell(),
+                                                       "Test failure", "Unable to connect" + msg);
+                       }
+               });
+
+               editActiveConnLk.addSelectionListener(new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(final SelectionEvent event) {
+                               ActiveConnectorWizard wizard = new ActiveConnectorWizard(
+                                               akbService, activeConnector);
+                               WizardDialog dialog = new WizardDialog(getShell(), wizard);
+                               dialog.open();
+                       }
+               });
+
+               // force refresh to initialize various fields on creation
+               formPart.refresh();
+               form.addPart(formPart);
+       }
+
+       @Override
+       public boolean setFocus() {
+               if (titleTxt != null)
+                       return titleTxt.setFocus();
+               return false;
+       }
+
+       protected void disposePart(AbstractFormPart part) {
+               if (part != null) {
+                       form.removePart(part);
+                       part.dispose();
+               }
+       }
+
+       @Override
+       public void dispose() {
+               disposePart(formPart);
+               super.dispose();
+       }
+}
\ No newline at end of file
index 0c21c7e7cef557c86dc45286eecfdd404a2bc356..56c015c7ff984e66ab2b785423b9d73342aad550 100644 (file)
@@ -219,8 +219,13 @@ public class ItemTemplateTitleComposite extends Composite {
                        if (itemNode.hasProperty(AkbNames.AKB_USED_CONNECTOR)) {
                                String aliasPath = itemNode.getProperty(
                                                AkbNames.AKB_USED_CONNECTOR).getString();
+                               
+                               if (!itemNode.getSession().nodeExists(aliasPath))
+                                       return -1;
+
                                Node alias = itemNode.getSession().getNode(aliasPath);
-                               return aliasCmb.indexOf(alias.getProperty(Property.JCR_TITLE).getString());
+                               return aliasCmb.indexOf(alias.getProperty(Property.JCR_TITLE)
+                                               .getString());
                        } else
                                return -1;
                } catch (RepositoryException re) {
index b8840c5cf7ff4b5a75e5a3fe144b2ba43af876d0..d77ed1249945623c555035d5cddbf23f706e988f 100644 (file)
@@ -85,8 +85,12 @@ public abstract class AbstractAkbNodeEditor extends FormEditor {
 
                // Tooltip
                if (AkbJcrUtils.isEmptyString(name))
-                       name = "current item";
-               setTitleToolTip("Display and edit " + name);
+                       name = "current akb object";
+               if (isTemplate) {
+                       setTitleToolTip("Display and edit " + name);
+               } else
+                       setTitleToolTip("Display " + name);
+
        }
 
        /** Overwrite to provide supplementary pages between main and history page */
@@ -98,7 +102,7 @@ public abstract class AbstractAkbNodeEditor extends FormEditor {
        @Override
        protected void addPages() {
                try {
-                       if (isTemplate)
+                       if (isTemplate || envNode.isNodeType(AkbTypes.AKB_ENV))
                                addPage(new ConnectorAliasPage(this, "mainPage", "Main"));
                        // Add AKB Type specific pages
                        addOtherPages();
@@ -109,6 +113,9 @@ public abstract class AbstractAkbNodeEditor extends FormEditor {
                } catch (PartInitException e) {
                        throw new AkbException("Unable to initialise pages for editor "
                                        + getEditorId(), e);
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to initialise pages for editor "
+                                       + getEditorId(), e);
                }
        }
 
index bb670e25f049d37d5639bf90e2e65a95e438e269..b97d1ec21ab10f5ff7bdc6f75d86569a8860bf02 100644 (file)
@@ -13,13 +13,17 @@ import javax.jcr.observation.Event;
 import javax.jcr.observation.ObservationManager;
 
 import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
+import org.argeo.eclipse.ui.utils.CommandUtils;
 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.AkbUiUtils;
+import org.argeo.slc.akb.ui.commands.ForceRefresh;
 import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor;
-import org.argeo.slc.akb.ui.composites.ConnectorAliasSmallComposite;
+import org.argeo.slc.akb.ui.composites.AliasListItemComposite;
 import org.argeo.slc.akb.ui.composites.MixTitleComposite;
+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;
@@ -82,10 +86,15 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor {
        protected void aboutToShow(IMenuManager menu) {
                try {
                        // initialization
-                       String submenuID = "subMenu.addAlias";
                        IWorkbenchWindow window = AkbUiPlugin.getDefault().getWorkbench()
                                        .getActiveWorkbenchWindow();
                        Node connectorParent = getAkbNode();
+
+                       // Refresh
+                       CommandUtils.refreshCommand(menu, window, ForceRefresh.ID,
+                                       "Refresh", null, true);
+
+                       String submenuID = "subMenu.addAlias";
                        IContributionItem ici = menu.find(submenuID);
                        if (ici != null)
                                menu.remove(ici);
@@ -121,7 +130,8 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor {
                        subMenu.add(AkbUiUtils.createContributionItem(subMenu, window,
                                        currItemId, OpenAkbNodeEditor.ID, "SSH", null, tmpParams));
 
-                       menu.add(subMenu);
+                       if (isTemplate())
+                               menu.add(subMenu);
 
                } catch (RepositoryException e) {
                        throw new AkbException("Unable to refresh context menu", e);
@@ -141,19 +151,39 @@ public class EnvTemplateEditor extends AbstractAkbNodeEditor {
                                try {
                                        super.refresh();
                                        // first: initialise composite for new connectors
+
                                        Node connectorPar = getAkbNode().getNode(
                                                        AkbTypes.AKB_CONNECTOR_FOLDER);
                                        NodeIterator ni = connectorPar.getNodes();
-                                       while (ni.hasNext()) {
+
+                                       boolean isTemplate = getEnvNode().isNodeType(
+                                                       AkbTypes.AKB_ENV_TEMPLATE);
+
+                                       aliases: while (ni.hasNext()) {
                                                Node currNode = ni.nextNode();
                                                String currJcrId = currNode.getIdentifier();
                                                if (!connectorsCmps.containsKey(currJcrId)) {
-                                                       Composite currCmp = new ConnectorAliasSmallComposite(
-                                                                       panel, SWT.NO_FOCUS, getToolkit(),
-                                                                       managedForm, currNode, getAkbService());
-                                                       currCmp.setLayoutData(new GridData(SWT.FILL,
-                                                                       SWT.TOP, true, false));
-                                                       connectorsCmps.put(currJcrId, currCmp);
+                                                       Composite currCmp;
+                                                       if (isTemplate)
+                                                               currCmp = new AliasListItemComposite(panel,
+                                                                               SWT.NO_FOCUS, getToolkit(),
+                                                                               managedForm, getAkbNode(),
+                                                                               currNode.getPath(), getAkbService());
+                                                       else {
+                                                               String aliasPath = AkbJcrUtils.get(currNode,
+                                                                               AkbNames.AKB_CONNECTOR_ALIAS_PATH);
+                                                               if (AkbJcrUtils.isEmptyString(aliasPath)
+                                                                               || !getSession().nodeExists(aliasPath))
+                                                                       continue aliases;
+
+                                                               currCmp = new AliasListItemComposite(panel,
+                                                                               SWT.NO_FOCUS, getToolkit(),
+                                                                               managedForm, getAkbNode(), aliasPath,
+                                                                               getAkbService());
+                                                               currCmp.setLayoutData(new GridData(SWT.FILL,
+                                                                               SWT.TOP, true, false));
+                                                               connectorsCmps.put(currJcrId, currCmp);
+                                                       }
                                                }
                                        }