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.IFormPart; 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 = 150; titleTxt.setLayoutData(gd); // Description final Text descTxt = toolkit.createText(firstLine, "", SWT.NONE); gd = new GridData(SWT.LEFT, SWT.CENTER, false, false); gd.widthHint = 220; descTxt.setLayoutData(gd); final Link testBtn = new Link(firstLine, SWT.NONE); toolkit.adapt(testBtn, false, false); testBtn.setText("Test"); 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)); // Part Management formPart = new AbstractFormPart() { public void refresh() { super.refresh(); if (titleTxt.isDisposed()) return; // 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("Edit connector instance"); } else { titleTxt.setEditable(true); descTxt.setEditable(true); editActiveConnLk.setText("Edit default connector"); } } }; if (!isActive) { final Link removeBtn = new Link(firstLine, SWT.NONE); toolkit.adapt(removeBtn, false, false); removeBtn.setText("Delete"); removeBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { try { try { connectorAlias.getPath(); } catch (Exception ex) { // node has been removed. // silent return; } // Manually check if corresponding node was really // removed Session session = connectorAlias.getSession(); String absPath = connectorAlias.getPath(); form.removePart(formPart); CommandUtils.CallCommandWithOneParameter( DeleteAkbNodes.ID, DeleteAkbNodes.PARAM_NODE_JCR_ID, AkbJcrUtils .getIdentifierQuietly(connectorAlias)); if (session.nodeExists(absPath)) { form.addPart(formPart); } else { for (IFormPart cpart : form.getParts()) cpart.refresh(); } } catch (RepositoryException re) { throw new AkbException( "Error while removing connector Alias ", re); } } }); } // 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(); } }