/*******************************************************************************
* Copyright (c) 2013 AGETO Service GmbH and others.
* All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Gunnar Wagenknecht - initial API and implementation
*******************************************************************************/
package org.eclipse.gyrex.admin.ui.jobs.internal.generic;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.DialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.IListAdapter;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.LayoutUtil;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ListDialogField;
import org.eclipse.gyrex.admin.ui.internal.wizards.dialogfields.ListDialogField.ColumnsDescription;
import org.eclipse.gyrex.admin.ui.jobs.configuration.wizard.JobConfigurationWizardSession;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.rap.rwt.widgets.DialogCallback;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.apache.commons.lang.StringUtils;
public class GenericJobParameterPage extends WizardPage {
private static final long serialVersionUID = 1L;
final ListDialogField parameterTable = new ListDialogField(new IListAdapter() {
@Override
public void customButtonPressed(final ListDialogField field, final int index) {
switch (index) {
case 0:
openAddParameterDialog();
break;
case 1:
openEditParameterDialog();
break;
default:
// nothing
break;
}
}
@Override
public void doubleClicked(final ListDialogField field) {
openEditParameterDialog();
}
@Override
public void selectionChanged(final ListDialogField field) {
field.enableButton(2, field.getSelectedElements().size() == 1);
}
}, new String[] { "New...", "Edit...", "Remove" }, new ColumnLabelProvider() {
private static final long serialVersionUID = 1L;
@Override
public String getText(final Object element) {
if (element instanceof Parameter)
return ((Parameter) element).getName();
return element == null ? "" : element.toString();//$NON-NLS-1$
}
@Override
public void update(final ViewerCell cell) {
final Parameter element = (Parameter) cell.getElement();
switch (cell.getColumnIndex()) {
case 0:
cell.setText(element.getName());
break;
case 1:
cell.setText(element.getValue());
break;
default:
break;
}
}
});
{
parameterTable.setRemoveButtonIndex(2);
parameterTable.setTableColumns(new ColumnsDescription(new String[] { "Parameter", "Value" }, true));
}
private final JobConfigurationWizardSession session;
public GenericJobParameterPage(final JobConfigurationWizardSession session) {
super(GenericJobParameterPage.class.getSimpleName());
this.session = session;
setTitle("Task Parameter");
setDescription("Configure the task by modifying its launch parameter.");
// this page does not have any required fields
setPageComplete(true);
}
@Override
public void createControl(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(GridLayoutFactory.fillDefaults().create());
composite.setLayoutData(GridDataFactory.fillDefaults().minSize(convertVerticalDLUsToPixels(200), convertHorizontalDLUsToPixels(400)).create());
setControl(composite);
parameterTable.setLabelText(String.format("Parameter for %s:", session.getJobTypeName()));
parameterTable.setViewerComparator(new ViewerComparator());
final IDialogFieldListener validateListener = new IDialogFieldListener() {
@Override
public void dialogFieldChanged(final DialogField field) {
validate();
}
};
parameterTable.setDialogFieldListener(validateListener);
LayoutUtil.doDefaultLayout(composite, new DialogField[] { parameterTable }, true);
LayoutUtil.setHorizontalGrabbing(parameterTable.getListControl(null));
// initialize from existing parameter
readParameterFromSession();
}
void openAddParameterDialog() {
final AddEditParameterDialog dialog = new AddEditParameterDialog(getShell(), null, parameterTable.getElements());
dialog.openNonBlocking(new DialogCallback() {
private static final long serialVersionUID = 1L;
@Override
public void dialogClosed(final int returnCode) {
if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getName())) {
parameterTable.addElement(new Parameter(dialog.getName(), dialog.getValue()));
}
}
});
}
void openEditParameterDialog() {
final Parameter v = (Parameter) parameterTable.getSelectedElements().iterator().next();
final AddEditParameterDialog dialog = new AddEditParameterDialog(getShell(), v, parameterTable.getElements());
dialog.openNonBlocking(new DialogCallback() {
private static final long serialVersionUID = 1L;
@Override
public void dialogClosed(final int returnCode) {
if ((returnCode == Window.OK) && StringUtils.isNotBlank(dialog.getName())) {
v.setName(dialog.getName());
v.setValue(dialog.getValue());
parameterTable.refresh();
}
}
});
}
private void readParameterFromSession() {
parameterTable.removeAllElements();
for (final Entry<String, String> e : session.getParameter().entrySet()) {
parameterTable.addElement(new Parameter(e.getKey(), e.getValue()));
}
parameterTable.selectElements(null);
}
private void saveParameterToSession() {
final Map<String, String> result = new LinkedHashMap<>();
for (final Object variable : parameterTable.getElements()) {
final Parameter v = (Parameter) variable;
result.put(v.getName(), v.getValue());
}
session.setParameter(result);
}
void validate() {
saveParameterToSession();
setMessage(null);
setPageComplete(true);
}
}