/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.excel.gui.properties; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.forms.widgets.FormToolkit; import de.rcenvironment.components.excel.common.ExcelAddress; import de.rcenvironment.components.excel.common.ExcelComponentConstants; import de.rcenvironment.components.excel.common.ExcelService; import de.rcenvironment.components.excel.common.ExcelUtils; import de.rcenvironment.components.excel.common.SimpleExcelService; import de.rcenvironment.core.component.model.endpoint.api.EndpointDescription; import de.rcenvironment.core.datamodel.api.EndpointActionType; import de.rcenvironment.core.datamodel.api.EndpointType; import de.rcenvironment.core.gui.workflow.editor.commands.endpoint.AddDynamicEndpointCommand; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointEditDialog; import de.rcenvironment.core.gui.workflow.editor.properties.EndpointSelectionPane; import de.rcenvironment.core.gui.workflow.editor.properties.WorkflowNodeCommand; /** * A UI part to display and edit a set of endpoints managed by a {@link DynamicEndpointManager). * * @author Patrick Schaefer * @author Markus Kunde */ public class VariablesSelectionPane extends EndpointSelectionPane { private EndpointSelectionPane[] allPanes; private Button buttonAutoDiscover; /** * @param genericEndpointTitle the display text describing individual endpoints (like "Input" or "Output"); used in dialog texts */ public VariablesSelectionPane(String title, EndpointType direction, String dynEndpointIdToManage, WorkflowNodeCommand.Executor executor) { super(title, direction, dynEndpointIdToManage, new String[] {}, new String[] {}, executor); } public EndpointSelectionPane[] getAllPanes() { return allPanes; } public void setAllPanes(EndpointSelectionPane[] allPanes) { this.allPanes = allPanes; } @Override public Control createControl(final Composite parent, String title, FormToolkit toolkit) { Control superControl = super.createControl(parent, title, toolkit); // empty label to get desired layout - feel free to improve new Label(client, SWT.READ_ONLY); buttonAutoDiscover = toolkit.createButton(client, Messages.autoDiscover, SWT.FLAT); buttonAutoDiscover.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); SelectionAdapter excelButtonListener = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (e.widget == buttonAutoDiscover) { // TODO execute in separate thread final List<WorkflowNodeCommand> commands = new ArrayList<>(); Job job = new Job(endpointType + " Autodiscover") { @Override protected IStatus run(IProgressMonitor monitor) { try { monitor.beginTask("Starting", IProgressMonitor.UNKNOWN); ExcelService excelService = new SimpleExcelService(); String excelFile = getConfiguration().getConfigurationDescription() .getConfigurationValue(ExcelComponentConstants.XL_FILENAME); final File xlFile = ExcelUtils.getAbsoluteFile(excelFile); String regex = null; if (endpointType == EndpointType.INPUT) { regex = ExcelComponentConstants.DISCOVER_INPUT_REGEX; } else { regex = ExcelComponentConstants.DISCOVER_OUTPUT_REGEX; } boolean successful = false; if (excelService.isValidExcelFile(xlFile)) { List<String> visitedAdresses = new ArrayList<>(); for (ExcelAddress addr : excelService.getUserDefinedCellNames(xlFile)) { if (addr.isUserDefindNameOfScheme(regex)) { Map<String, String> metaData = new HashMap<String, String>(); metaData.put(ExcelComponentConstants.METADATA_ADDRESS, addr.getFullAddress()); boolean exists = false; for (EndpointDescription endpoint : endpointManager.getEndpointDescriptions()) { if (endpoint.getName().equals(addr.getUserDefinedName())) { exists = true; break; } } if (!exists && !visitedAdresses.contains(addr.getFullAddress())) { visitedAdresses.add(addr.getFullAddress()); final WorkflowNodeCommand command = new AddDynamicEndpointCommand(endpointType, dynEndpointIdToManage, addr.getUserDefinedName(), endpointManager .getDynamicEndpointDefinition(ExcelPropertiesConstants.ID_INPUT_PANE) .getDefaultDataType(), metaData, allPanes); commands.add(command); successful = true; } } } visitedAdresses.clear(); if (successful) { return Status.OK_STATUS; } else { return Status.CANCEL_STATUS; } } monitor.worked(1); return null; } finally { monitor.done(); } }; }; job.addJobChangeListener(new IJobChangeListener() { @Override public void done(IJobChangeEvent event) { if (event.getResult() == Status.OK_STATUS) { for (final WorkflowNodeCommand command : commands) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { execute(command); } }); } } else if (event.getResult() == Status.CANCEL_STATUS) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { MessageBox dialog = new MessageBox(parent.getShell(), SWT.ICON_WARNING); dialog.setText("Warning!"); dialog.setMessage("No " + endpointType + " could be added!"); dialog.open(); } }); } commands.clear(); } @Override public void awake(IJobChangeEvent arg0) {} @Override public void aboutToRun(IJobChangeEvent arg0) {} @Override public void sleeping(IJobChangeEvent arg0) {} @Override public void scheduled(IJobChangeEvent arg0) {} @Override public void running(IJobChangeEvent arg0) {} }); job.setUser(true); job.schedule(); } } }; buttonAutoDiscover.addSelectionListener(excelButtonListener); buttonAdd.addPaintListener(new EnablingPaintListener(buttonAdd)); buttonAutoDiscover.addPaintListener(new EnablingPaintListener(buttonAutoDiscover)); return superControl; } @Override protected void onAddClicked() { String excelFile = getConfiguration().getConfigurationDescription() .getConfigurationValue(ExcelComponentConstants.XL_FILENAME); final File xlFile = ExcelUtils.getAbsoluteFile(excelFile); ExcelService excelService = new SimpleExcelService(); if (excelFile != null && !excelFile.isEmpty() && excelService.isValidExcelFile(xlFile)) { EndpointEditDialog dialog = new VariablesEditDialog(Display.getDefault().getActiveShell(), EndpointActionType.ADD, configuration, endpointType, dynEndpointIdToManage, false, icon, endpointManager.getDynamicEndpointDefinition(dynEndpointIdToManage) .getMetaDataDefinition(), new HashMap<String, String>(), xlFile); super.onAddClicked(dialog); } else { MessageBox box = new MessageBox(Display.getDefault().getActiveShell(), SWT.ICON_WARNING); box.setMessage("Please select an Excel file in the \"File\" section!"); box.setText("Warning"); box.open(); } } @Override protected void onEditClicked() { String excelFile = getConfiguration().getConfigurationDescription() .getConfigurationValue(ExcelComponentConstants.XL_FILENAME); final File xlFile = ExcelUtils.getAbsoluteFile(excelFile); final String name = (String) table.getSelection()[0].getData(); boolean isStaticEndpoint = endpointManager.getEndpointDescription(name).getEndpointDefinition().isStatic(); EndpointDescription endpoint = endpointManager.getEndpointDescription(name); Map<String, String> newMetaData = cloneMetaData(endpoint.getMetaData()); EndpointEditDialog dialog = new VariablesEditDialog(Display.getDefault().getActiveShell(), EndpointActionType.EDIT, configuration, endpointType, dynEndpointIdToManage, isStaticEndpoint, icon, endpoint.getEndpointDefinition() .getMetaDataDefinition(), newMetaData, xlFile); super.onEditClicked(name, dialog, newMetaData); } /** * Paint listener that checks whether the buttons should be enabled whenever they are rendered. * * @author Oliver Seebach */ class EnablingPaintListener implements PaintListener { private Button buttonToEnable = null; EnablingPaintListener(Button button) { buttonToEnable = button; } @Override public void paintControl(PaintEvent event) { String excelFile = getConfiguration().getConfigurationDescription() .getConfigurationValue(ExcelComponentConstants.XL_FILENAME); ExcelService excelService = new SimpleExcelService(); File xlFile = ExcelUtils.getAbsoluteFile(excelFile); if (excelFile == null || excelFile.isEmpty() || !excelService.isValidExcelFile(xlFile)) { buttonToEnable.setEnabled(false); } else { buttonToEnable.setEnabled(true); } } } }