/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.view.properties;
import java.util.Deque;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import de.rcenvironment.core.component.model.endpoint.api.EndpointDatum;
import de.rcenvironment.core.component.workflow.execution.api.WorkflowExecutionInformation;
import de.rcenvironment.core.datamodel.api.TypedDatum;
import de.rcenvironment.core.datamodel.types.api.DirectoryReferenceTD;
import de.rcenvironment.core.datamodel.types.api.FileReferenceTD;
import de.rcenvironment.core.gui.workflow.Activator;
/**
* Controller class for the {@link InputQueueDialog}.
*
* @author Doreen Seider
*/
public class InputQueueDialogController {
private static final String SETTINGS_KEY_SROLLLOCK = "de.rcenvironment.rce.gui.workflow.view.properties.settinngs.scrolllock";
private static InputQueueDialogController instance;
private String workflowId;
private String componentId;
private String inputName;
private InputModel inputModel;
private InputQueueDialog dialog;
private IDialogSettings dialogSettings;
private int tableItemCount = 0;
private boolean isScrollLocked;
public InputQueueDialogController(WorkflowExecutionInformation workflowInfo, String componentId, String inputName) {
instance = this;
this.workflowId = workflowInfo.getExecutionIdentifier();
this.componentId = componentId;
this.inputName = inputName;
dialogSettings = Activator.getInstance().getDialogSettings();
inputModel = InputModel.getInstance();
dialog = new InputQueueDialog(Display.getCurrent().getActiveShell());
dialog.create();
initialize();
}
public static InputQueueDialogController getInstance() {
return instance;
}
/**
* Shows the dialog.
* @return The return code (which button pressed).
*/
public int open() {
return dialog.open();
}
/**
* Redraws the table.
*/
public void redrawTable() {
Table table = dialog.getInputQueueTableViewer().getTable();
if (!table.isDisposed()) {
dialog.getInputQueueTableViewer().setInput(inputModel.getInputs(workflowId, componentId, inputName));
if (!isScrollLocked && table.getItemCount() > tableItemCount) {
table.setTopIndex(table.getItemCount());
tableItemCount = table.getItemCount();
}
}
}
private void initialize() {
dialog.getShell().setText(inputName);
dialog.getInputQueueTableViewer().setLabelProvider(new InputQueueLabelProvider());
dialog.getInputQueueTableViewer().setContentProvider(new InputQueueContentProvider());
redrawTable();
isScrollLocked = dialogSettings.getBoolean(SETTINGS_KEY_SROLLLOCK);
dialog.getScrollLockButton().setSelection(isScrollLocked);
dialog.getScrollLockButton().addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
isScrollLocked = dialog.getScrollLockButton().getSelection();
dialogSettings.put(SETTINGS_KEY_SROLLLOCK, isScrollLocked);
}
});
}
/**
* Provides the concrete label texts to display and images if required.
*
* @author Doreen Seider
*/
class InputQueueLabelProvider extends LabelProvider implements ITableLabelProvider {
@Override
public Image getColumnImage(Object object, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object object, int columnIndex) {
String text = "-";
if (object instanceof EndpointDatum) {
TypedDatum input = ((EndpointDatum) object).getValue();
switch (input.getDataType()) {
case FileReference:
text = ((FileReferenceTD) input).getFileName();
break;
case DirectoryReference:
text = ((DirectoryReferenceTD) input).getDirectoryName();
break;
default:
text = input.toString();
break;
}
}
return text;
}
}
/**
* Take the whole content to structured pieces.
*
* @author Doreen Seider
*/
class InputQueueContentProvider implements IStructuredContentProvider {
@Override
public void dispose() {
// do nothing
}
@Override
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
// do nothing
}
@SuppressWarnings("unchecked")
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Deque<?>) {
return ((Deque<EndpointDatum>) inputElement).toArray();
} else {
// empty default
return new Object[] {};
}
}
}
}