]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java
Edit connector wizard
[gpl/argeo-slc.git] / plugins / org.argeo.slc.akb.ui / src / main / java / org / argeo / slc / akb / ui / composites / ItemTemplateTitleComposite.java
index 86b5b23f4c49b849d47a76578e2dee3be76dc5f1..0c21c7e7cef557c86dc45286eecfdd404a2bc356 100644 (file)
@@ -1,20 +1,33 @@
 package org.argeo.slc.akb.ui.composites;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
+import javax.jcr.RepositoryException;
 
+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.ui.AkbUiUtils;
+import org.argeo.slc.akb.ui.commands.OpenAkbNodeEditor;
 import org.argeo.slc.akb.utils.AkbJcrUtils;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+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.Combo;
 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;
@@ -24,7 +37,9 @@ public class ItemTemplateTitleComposite extends Composite {
        // private final static Log log =
        // LogFactory.getLog(MixTitleComposite.class);
 
-       private final Node akbNode;
+       private final AkbService akbService;
+       private final Node envNode;
+       private final Node itemNode;
        private final FormToolkit toolkit;
        private final IManagedForm form;
        // Don't forget to unregister on dispose
@@ -32,13 +47,29 @@ public class ItemTemplateTitleComposite extends Composite {
 
        // To enable set focus
        private Text titleTxt;
-
+       private Combo aliasCmb;
+
+       private List<Node> definedAliases;
+
+       /**
+        * 
+        * @param parent
+        * @param style
+        * @param toolkit
+        * @param form
+        * @param envNode
+        * @param itemNode
+        * @param akbService
+        */
        public ItemTemplateTitleComposite(Composite parent, int style,
-                       FormToolkit toolkit, IManagedForm form, Node akbNode) {
+                       FormToolkit toolkit, IManagedForm form, Node envNode,
+                       Node itemNode, AkbService akbService) {
                super(parent, style);
-               this.akbNode = akbNode;
+               this.envNode = envNode;
+               this.itemNode = itemNode;
                this.toolkit = toolkit;
                this.form = form;
+               this.akbService = akbService;
                populate();
                toolkit.adapt(this);
        }
@@ -47,37 +78,49 @@ public class ItemTemplateTitleComposite extends Composite {
                // Initialization
                Composite parent = this;
 
-               parent.setLayout(new GridLayout(4, false));
+               parent.setLayout(new GridLayout(5, false));
 
                // first line: Item name
                toolkit.createLabel(parent, "Name");
                titleTxt = toolkit.createText(parent, "", SWT.BORDER);
-               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
+               GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false, 4, 1);
                titleTxt.setLayoutData(gd);
 
                // Second line: alias management
                toolkit.createLabel(parent, "Alias");
-               final Combo typeCmb = new Combo(parent, SWT.READ_ONLY);
-
-               // TODO enable live refresh
-               final List<Node> definedAliases = AkbJcrUtils
-                               .getDefinedAliasForNode(akbNode);
-
-               final String[] names = new String[definedAliases.size()];
-               int i = 0;
-               for (Node node : definedAliases)
-                       names[i++] = AkbJcrUtils.get(node, Property.JCR_TITLE);
-               typeCmb.setItems(names);
-
+               aliasCmb = new Combo(parent, SWT.READ_ONLY);
+               toolkit.adapt(aliasCmb, false, false);
                gd = new GridData(SWT.FILL, SWT.TOP, true, false, 3, 1);
-               typeCmb.setLayoutData(gd);
+               aliasCmb.setLayoutData(gd);
+
+               final Link openAliasLk = new Link(parent, SWT.NONE);
+               toolkit.adapt(openAliasLk, false, false);
+               openAliasLk.setText("<a>Edit Alias</a>");
+               openAliasLk.addSelectionListener(new SelectionAdapter() {
+                       @Override
+                       public void widgetSelected(final SelectionEvent event) {
+                               int index = aliasCmb.getSelectionIndex();
+                               if (index != -1) {
+                                       Node currAlias = definedAliases.get(index);
+                                       String id = AkbJcrUtils.getIdentifierQuietly(currAlias);
+                                       Map<String, String> params = new HashMap<String, String>();
+                                       params.put(OpenAkbNodeEditor.PARAM_NODE_JCR_ID, id);
+                                       params.put(OpenAkbNodeEditor.PARAM_CURR_ENV_JCR_ID,
+                                                       AkbJcrUtils.getIdentifierQuietly(envNode));
+
+                                       CommandUtils.callCommand(OpenAkbNodeEditor.ID, params);
+                               } else
+                                       MessageDialog.openError(getShell(), "Error",
+                                                       "No selected alias");
+                       }
+               });
 
                // 3rd line: description
                Label lbl = toolkit.createLabel(parent, "Description");
                lbl.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
                final Text descTxt = toolkit.createText(parent, "", SWT.BORDER
                                | SWT.MULTI | SWT.WRAP);
-               gd = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1);
+               gd = new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1);
                descTxt.setLayoutData(gd);
 
                // Part Management
@@ -85,46 +128,106 @@ public class ItemTemplateTitleComposite extends Composite {
                        public void refresh() {
                                super.refresh();
                                // update display value
-                               AkbUiUtils.refreshFormTextWidget(titleTxt, akbNode,
+                               AkbUiUtils.refreshFormTextWidget(titleTxt, itemNode,
                                                Property.JCR_TITLE);
-                               AkbUiUtils.refreshFormTextWidget(descTxt, akbNode,
+                               AkbUiUtils.refreshFormTextWidget(descTxt, itemNode,
                                                Property.JCR_DESCRIPTION);
 
-                               // TODO implement this
-                               // typeCmb.select(getCurrTypeIndex());
-                               typeCmb.setEnabled(AkbJcrUtils.isNodeCheckedOutByMe(akbNode));
+                               refreshTypeCmbValues();
+                               aliasCmb.select(getCurrAliasIndex());
+                               aliasCmb.setEnabled(AkbJcrUtils.isNodeCheckedOutByMe(itemNode));
                        }
                };
 
                // Listeners
-               AkbUiUtils.addTextModifyListener(titleTxt, akbNode, Property.JCR_TITLE,
-                               part);
-               AkbUiUtils.addTextModifyListener(descTxt, akbNode,
+               AkbUiUtils.addTextModifyListener(titleTxt, itemNode,
+                               Property.JCR_TITLE, part);
+               AkbUiUtils.addTextModifyListener(descTxt, itemNode,
                                Property.JCR_DESCRIPTION, part);
 
-               typeCmb.addModifyListener(new ModifyListener() {
+               aliasCmb.addModifyListener(new ModifyListener() {
                        @Override
                        public void modifyText(ModifyEvent event) {
-                               // try {
-                               int oldIndex = -1; // getCurrTypeIndex();
-                               int selIndex = typeCmb.getSelectionIndex();
-
-                               // insure something has really been modified
-                               if (selIndex < 0 || oldIndex == selIndex)
-                                       return;
-
-                               // TODO set new alias
-                               part.markDirty();
-                               // } catch (RepositoryException e) {
-                               // throw new AkbException(
-                               // "Error while updating connector alias", e);
-                               // }
+                               try {
+                                       int oldIndex = getCurrAliasIndex();
+                                       int selIndex = aliasCmb.getSelectionIndex();
+
+                                       // insure something has really been modified
+                                       if (selIndex < 0 || oldIndex == selIndex)
+                                               return;
+
+                                       // set new alias
+                                       Node newAlias = definedAliases.get(selIndex);
+
+                                       // Only relies on the alias
+                                       itemNode.setProperty(AkbNames.AKB_USED_CONNECTOR,
+                                                       newAlias.getPath());
+                                       part.markDirty();
+                               } catch (RepositoryException e) {
+                                       throw new AkbException(
+                                                       "Error while updating connector alias", e);
+                               }
                        }
                });
 
                form.addPart(part);
        }
 
+       private void refreshTypeCmbValues() {
+               List<Node> newAliases;
+               try {
+                       newAliases = JcrUtils.nodeIteratorToList(akbService
+                                       .getDefinedAliases(
+                                                       AkbJcrUtils.getCurrentTemplate(itemNode),
+                                                       AkbJcrUtils.getAliasTypeForNode(itemNode)));
+               } catch (RepositoryException e) {
+                       throw new AkbException("Unable to get defined aliases for node "
+                                       + itemNode, e);
+               }
+               boolean hasChanged = false;
+               // manually ckeck if something has changed
+               if (definedAliases == null
+                               || newAliases.size() != definedAliases.size())
+                       hasChanged = true;
+               else {
+
+                       for (int i = 0; i < newAliases.size(); i++) {
+                               if (!newAliases.get(i).equals(definedAliases.get(i))) {
+                                       hasChanged = true;
+                                       break;
+                               }
+                       }
+               }
+
+               if (hasChanged) {
+                       definedAliases = newAliases;
+                       final String[] names = new String[definedAliases.size()];
+                       int i = 0;
+                       for (Node node : definedAliases)
+                               names[i++] = AkbJcrUtils.get(node, Property.JCR_TITLE);
+                       aliasCmb.setItems(names);
+               }
+       }
+
+       /**
+        * Returns the index in definedAliases list of the CURRENT defined alias as
+        * set in the item node <CODE>AkbNames.AKB_USED_CONNECTOR</CODE> if defined,
+        * -1 otherwise
+        */
+       private int getCurrAliasIndex() {
+               try {
+                       if (itemNode.hasProperty(AkbNames.AKB_USED_CONNECTOR)) {
+                               String aliasPath = itemNode.getProperty(
+                                               AkbNames.AKB_USED_CONNECTOR).getString();
+                               Node alias = itemNode.getSession().getNode(aliasPath);
+                               return aliasCmb.indexOf(alias.getProperty(Property.JCR_TITLE).getString());
+                       } else
+                               return -1;
+               } catch (RepositoryException re) {
+                       throw new AkbException("Unable to retrieve current Alias", re);
+               }
+       }
+
        @Override
        public boolean setFocus() {
                return titleTxt.setFocus();