/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.connections;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.gui.workflow.editor.WorkflowEditor;
import de.rcenvironment.core.gui.workflow.editor.connections.ConnectionDialogComposite.FilterMode;
/**
* Section that shows the connection editor.
*
* @author Oliver Seebach
*
*/
public class ConnectionsSection extends AbstractPropertySection {
private static final int MINIMUM_HEIGHT_OF_CONNECTION_COMPOSITE = 300;
private static final String IS_EXACTLY = "match exactly";
private static final String STARTS_WITH = "start with";
private static final String CONTAINS = "contain";
private WorkflowDescription workflowDescription;
private ConnectionDialogComposite connectionDialogComposite;
private WorkflowDescriptionPropertyListener workflowDescriptionPropertyListener;
private WorkflowEditor editor;
private TabbedPropertySheetPage sheetPage;
@Override
public void setInput(IWorkbenchPart part, ISelection selection) {
// initialize
if (part instanceof WorkflowEditor && connectionDialogComposite.getWorkflowDescription() == null) {
editor = ((WorkflowEditor) part);
synchronized (this) {
workflowDescription = editor.getWorkflowDescription();
editor.addPropertyListener(new IPropertyListener() {
@Override
public void propertyChanged(Object obj, int prop) {
if (prop == WorkflowEditor.PROP_FINAL_WORKFLOW_DESCRIPTION_SET) {
synchronized (ConnectionsSection.this) {
if (workflowDescription != editor.getWorkflowDescription()) { // if it is a new object
workflowDescription = editor.getWorkflowDescription();
connectionDialogComposite.updateConnectionViewer(workflowDescription);
}
}
}
}
});
connectionDialogComposite.initialize(workflowDescription, null, null);
connectionDialogComposite.getCanvas().setEditorsCommandStack(editor.getEditorsCommandStack());
connectionDialogComposite.setCommandStack(editor.getEditorsCommandStack());
}
}
// initalize and register workflow description property change listener if not already done
if (workflowDescriptionPropertyListener == null) {
workflowDescriptionPropertyListener = new WorkflowDescriptionPropertyListener();
if (workflowDescription != null) {
workflowDescription.addPropertyChangeListener(workflowDescriptionPropertyListener);
}
}
}
private void setSizeOfConnectionComposite(Composite parent) {
final int topMargin = 125;
if (!parent.isDisposed() && !connectionDialogComposite.isDisposed()) {
if (parent.getSize().y < MINIMUM_HEIGHT_OF_CONNECTION_COMPOSITE) {
((GridData) connectionDialogComposite.getLayoutData()).heightHint = MINIMUM_HEIGHT_OF_CONNECTION_COMPOSITE;
} else {
((GridData) connectionDialogComposite.getLayoutData()).heightHint = parent.getSize().y - topMargin;
connectionDialogComposite.update();
}
}
}
@Override
public void aboutToBeShown() {
connectionDialogComposite.markSectionAsInitialized();
}
@Override
public void refresh() {
setSizeOfConnectionComposite(connectionDialogComposite.getParent());
super.refresh();
}
@Override
public void dispose() {
if (workflowDescription != null) {
workflowDescription.removePropertyChangeListener(workflowDescriptionPropertyListener);
}
super.dispose();
}
@Override
public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
connectionDialogComposite = new ConnectionDialogComposite(parent, SWT.NONE);
sheetPage = aTabbedPropertySheetPage;
GridLayout gridLayout = new GridLayout();
parent.setLayout(gridLayout);
GridData gridDataParentComposite = new GridData();
gridDataParentComposite.horizontalAlignment = GridData.FILL;
gridDataParentComposite.verticalAlignment = GridData.FILL;
gridDataParentComposite.grabExcessHorizontalSpace = true;
gridDataParentComposite.grabExcessVerticalSpace = true;
parent.setLayoutData(gridDataParentComposite);
GridLayout gridLayoutComposite = new GridLayout(3, false);
gridLayoutComposite.horizontalSpacing = 0;
gridLayoutComposite.marginWidth = 0;
gridLayoutComposite.marginHeight = 0;
connectionDialogComposite.setLayout(gridLayoutComposite);
GridData gridDataConnectionComposite = new GridData();
gridDataConnectionComposite.horizontalAlignment = GridData.FILL;
gridDataConnectionComposite.verticalAlignment = GridData.FILL;
gridDataConnectionComposite.grabExcessHorizontalSpace = true;
gridDataConnectionComposite.grabExcessVerticalSpace = true;
connectionDialogComposite.setLayoutData(gridDataConnectionComposite);
// Target filter
GridData gridDataTargetFilterText = new GridData();
gridDataTargetFilterText.grabExcessHorizontalSpace = true;
gridDataTargetFilterText.horizontalAlignment = GridData.FILL;
gridDataTargetFilterText.horizontalSpan = 3;
GridData gridDataTargetFilterModeGroup = new GridData();
gridDataTargetFilterModeGroup.grabExcessHorizontalSpace = true;
gridDataTargetFilterModeGroup.horizontalAlignment = GridData.FILL;
// Create target mode group
Group targetFilterModeGroup = new Group(connectionDialogComposite.getTargetGroup(), SWT.NONE);
targetFilterModeGroup.setText("Keep components that ... ");
targetFilterModeGroup.setLayout(new GridLayout(3, true));
targetFilterModeGroup.setLayoutData(gridDataTargetFilterModeGroup);
Button targetFilterModeButtonIsExactly = new Button(targetFilterModeGroup, SWT.RADIO);
targetFilterModeButtonIsExactly.setText(IS_EXACTLY);
Button targetFilterModeButtonStartsWith = new Button(targetFilterModeGroup, SWT.RADIO);
targetFilterModeButtonStartsWith.setText(STARTS_WITH);
Button targetFilterModeButtonContains = new Button(targetFilterModeGroup, SWT.RADIO);
targetFilterModeButtonContains.setText(CONTAINS);
targetFilterModeButtonContains.setSelection(true);
final Text targetFilterText = new Text(targetFilterModeGroup, SWT.BORDER | SWT.FILL);
targetFilterText.setMessage(Messages.filter);
targetFilterText.setToolTipText(Messages.filterTooltip);
targetFilterText.setLayoutData(gridDataTargetFilterText);
// Register listener for mode
TargetFilterModeSelectionListener targetListener = new TargetFilterModeSelectionListener();
targetFilterModeButtonContains.addSelectionListener(targetListener);
targetFilterModeButtonStartsWith.addSelectionListener(targetListener);
targetFilterModeButtonIsExactly.addSelectionListener(targetListener);
targetFilterText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
connectionDialogComposite.setTargetFilterString(targetFilterText.getText());
connectionDialogComposite.applyTargetFilter();
}
});
// Source filter
GridData gridDataSourceFilterText = new GridData();
gridDataSourceFilterText.grabExcessHorizontalSpace = true;
gridDataSourceFilterText.horizontalAlignment = GridData.FILL;
gridDataSourceFilterText.horizontalSpan = 3;
GridData gridDataSourceFilterModeGroup = new GridData();
gridDataSourceFilterModeGroup.grabExcessHorizontalSpace = true;
gridDataSourceFilterModeGroup.horizontalAlignment = GridData.FILL;
// Create source mode group
Group sourceFilterModeGroup = new Group(connectionDialogComposite.getSourceGroup(), SWT.NONE);
sourceFilterModeGroup.setText("Keep components that ... ");
sourceFilterModeGroup.setLayout(new GridLayout(3, true));
sourceFilterModeGroup.setLayoutData(gridDataSourceFilterModeGroup);
Button sourceFilterModeButtonIsExactly = new Button(sourceFilterModeGroup, SWT.RADIO);
sourceFilterModeButtonIsExactly.setText(IS_EXACTLY);
Button sourceFilterModeButtonStartsWith = new Button(sourceFilterModeGroup, SWT.RADIO);
sourceFilterModeButtonStartsWith.setText(STARTS_WITH);
Button sourceFilterModeButtonContains = new Button(sourceFilterModeGroup, SWT.RADIO);
sourceFilterModeButtonContains.setText(CONTAINS);
sourceFilterModeButtonContains.setSelection(true);
final Text sourceFilterText = new Text(sourceFilterModeGroup, SWT.BORDER | SWT.FILL);
sourceFilterText.setMessage(Messages.filter);
sourceFilterText.setToolTipText(Messages.filterTooltip);
sourceFilterText.setLayoutData(gridDataSourceFilterText);
// Register listener for mode
SourceFilterModeSelectionListener sourceListener = new SourceFilterModeSelectionListener();
sourceFilterModeButtonContains.addSelectionListener(sourceListener);
sourceFilterModeButtonStartsWith.addSelectionListener(sourceListener);
sourceFilterModeButtonIsExactly.addSelectionListener(sourceListener);
sourceFilterText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
connectionDialogComposite.setSourceFilterString(sourceFilterText.getText());
connectionDialogComposite.applySourceFilter();
}
});
// Add resize listener to handle large endpoint trees
aTabbedPropertySheetPage.getControl().addControlListener(new ConnectionSectionResizeListener());
// When opening section, set default filter to "contains"
connectionDialogComposite.setSourceFilterMode(FilterMode.CONTAINS);
connectionDialogComposite.applySourceFilter();
connectionDialogComposite.setTargetFilterMode(FilterMode.CONTAINS);
connectionDialogComposite.applyTargetFilter();
super.createControls(parent, aTabbedPropertySheetPage);
}
/**
* Listener that reacts on resizing of the connection section.
*
* @author Oliver Seebach
*
*/
private final class ConnectionSectionResizeListener implements ControlListener {
@Override
public void controlResized(ControlEvent arg0) {
setSizeOfConnectionComposite((Composite) sheetPage.getControl());
}
@Override
public void controlMoved(ControlEvent arg0) {}
}
/**
* Listener that reacts on changes in the workflow description and triggers a connection composite update.
*
* @author Oliver Seebach
*
*/
private final class WorkflowDescriptionPropertyListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals(WorkflowDescription.PROPERTY_NODES_OR_CONNECTIONS)) {
if (!connectionDialogComposite.isDisposed()) {
connectionDialogComposite.updateConnectionViewer(workflowDescription);
}
}
}
}
/**
* Listener for the filter mode of the source endpoint tree.
*
* @author Oliver Seebach
*
*/
private class SourceFilterModeSelectionListener implements SelectionListener {
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
@Override
public void widgetSelected(SelectionEvent event) {
Button button = ((Button) event.widget);
if (button.getText().equals(CONTAINS)) {
connectionDialogComposite.setSourceFilterMode(FilterMode.CONTAINS);
connectionDialogComposite.applySourceFilter();
} else if (button.getText().equals(STARTS_WITH)) {
connectionDialogComposite.setSourceFilterMode(FilterMode.STARTSWITH);
connectionDialogComposite.applySourceFilter();
} else if (button.getText().equals(IS_EXACTLY)) {
connectionDialogComposite.setSourceFilterMode(FilterMode.ISEXACTLY);
connectionDialogComposite.applySourceFilter();
}
}
}
/**
* Listener for the filter mode of the target endpoint tree.
*
* @author Oliver Seebach
*
*/
private class TargetFilterModeSelectionListener implements SelectionListener {
@Override
public void widgetDefaultSelected(SelectionEvent event) {
widgetSelected(event);
}
@Override
public void widgetSelected(SelectionEvent event) {
Button button = ((Button) event.widget);
if (button.getText().equals(CONTAINS)) {
connectionDialogComposite.setTargetFilterMode(FilterMode.CONTAINS);
connectionDialogComposite.applyTargetFilter();
} else if (button.getText().equals(STARTS_WITH)) {
connectionDialogComposite.setTargetFilterMode(FilterMode.STARTSWITH);
connectionDialogComposite.applyTargetFilter();
} else if (button.getText().equals(IS_EXACTLY)) {
connectionDialogComposite.setTargetFilterMode(FilterMode.ISEXACTLY);
connectionDialogComposite.applyTargetFilter();
}
}
}
}