package org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.nightlabs.base.ui.composite.XComposite; import org.nightlabs.base.ui.composite.XComposite.LayoutMode; import org.nightlabs.eclipse.ui.dialog.ResizableTitleAreaDialog; import org.nightlabs.jfire.base.dashboard.clientscripts.ui.resource.Messages; import org.nightlabs.jfire.dashboard.DashboardGadgetClientScriptsConfig.ClientScript; /** * * @author Frederik Loeser <!-- frederik [AT] nightlabs [DOT] de --> */ public class DashboardGadgetClientScriptsNewEditDialog extends ResizableTitleAreaDialog { DashboardGadgetClientScriptsConfigPage.ClientScriptPropertiesWrapper data; List<String> clientScriptNames = new ArrayList<String>(); boolean editScript; public DashboardGadgetClientScriptsNewEditDialog(final Shell shell, List<ClientScript> clientScripts, final DashboardGadgetClientScriptsConfigPage.ClientScriptPropertiesWrapper data) { super(shell, Messages.RESOURCE_BUNDLE); for (ClientScript script : clientScripts) clientScriptNames.add(script.getName()); if (data.getClientScriptName() != null) { // if client script is to be edited, old name can still be set clientScriptNames.remove(data.getClientScriptName()); editScript = true; } this.data = data; } @Override protected Control createDialogArea(final Composite parent) { final Composite parent_ = (Composite) super.createDialogArea(parent); setTitle(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.dialog.title")); //$NON-NLS-1$ setMessage(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.dialog.message")); //$NON-NLS-1$ final Composite content = new XComposite(parent_, SWT.NONE, LayoutMode.TIGHT_WRAPPER, 2); // final Timer[] timer = new Timer[2]; GridData gd; final Label labelDescription1 = new Label(content, SWT.NONE); gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd.verticalIndent = 10; labelDescription1.setLayoutData(gd); labelDescription1.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.label1.name")); //$NON-NLS-1$ final Text textClientScriptName = new Text(content, SWT.BORDER); gd = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1); gd.verticalIndent = 10; textClientScriptName.setLayoutData(gd); textClientScriptName.setText(data.getClientScriptName() != null ? data.getClientScriptName() : ""); //$NON-NLS-1$ textClientScriptName.addListener(SWT.Verify, new Listener() { @Override public void handleEvent(final Event event) { // if(timer[0] != null) // timer[0].cancel(); // timer[0] = new Timer(); // timer[0].schedule(new TimerTask() { // TODO using timer leads to exception (NPE), but I cannot see any stack trace // @Override // public void run() { Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { String newScriptName = event.text; if (clientScriptNames.contains(newScriptName)) { setErrorMessage(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.errorMessage.scriptExists")); //$NON-NLS-1$ getButton(IDialogConstants.OK_ID).setEnabled(false); } else if (newScriptName.equals("")) { //$NON-NLS-1$ setErrorMessage(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.errorMessage.emptyName")); //$NON-NLS-1$ getButton(IDialogConstants.OK_ID).setEnabled(false); } else { setErrorMessage(null); getButton(IDialogConstants.OK_ID).setEnabled(true); data.setClientScriptName(newScriptName); } // timer[0].cancel(); } }); // } // }, 1000); } }); final Label labelDescription2 = new Label(content, SWT.NONE); gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1); gd.verticalIndent = 10; labelDescription2.setLayoutData(gd); labelDescription2.setText(Messages.getString("org.nightlabs.jfire.base.dashboard.clientscripts.ui.internal.DashboardGadgetClientScriptsNewEditDialog.createDialogArea.label2.name")); //$NON-NLS-1$ final Text textClientScriptContent = new Text(content, SWT.BORDER | SWT.WRAP); gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); textClientScriptContent.setLayoutData(gd); textClientScriptContent.setText(data.getClientScriptContent() != null ? data.getClientScriptContent() : ""); //$NON-NLS-1$ textClientScriptContent.addModifyListener(new ModifyListener() { @Override public void modifyText(final ModifyEvent event) { // if(timer[1] != null) // timer[1].cancel(); // timer[1] = new Timer(); // timer[1].schedule(new TimerTask() { // TODO using timer leads to exception (NPE), but I cannot see any stack trace // @Override // public void run() { Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { if (event.getSource() instanceof Text) data.setClientScriptContent(((Text) event.getSource()).getText()); // timer[1].cancel(); } }); // } // }, 1000); } }); if (editScript) textClientScriptContent.setFocus(); else textClientScriptName.setFocus(); return parent_; } @Override protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { Button button = super.createButton(parent, id, label, defaultButton); if (!editScript && id == IDialogConstants.OK_ID) { button.setEnabled(false); } return button; } }