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%2Fcomposites%2FItemTemplateTitleComposite.java;h=0c21c7e7cef557c86dc45286eecfdd404a2bc356;hb=1a0e1b439c58df2f39495ed756df06ca00e384e1;hp=86b5b23f4c49b849d47a76578e2dee3be76dc5f1;hpb=da17a59fb316462126c56099d3670a7cd38a8906;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java index 86b5b23f4..0c21c7e7c 100644 --- a/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java +++ b/plugins/org.argeo.slc.akb.ui/src/main/java/org/argeo/slc/akb/ui/composites/ItemTemplateTitleComposite.java @@ -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 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 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("Edit Alias"); + 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 params = new HashMap(); + 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 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 AkbNames.AKB_USED_CONNECTOR 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();