/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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
*******************************************************************************/
package gov.redhawk.ide.graphiti.ui.diagram.wizards;
import java.util.Arrays;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
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.List;
import org.eclipse.swt.widgets.Text;
import gov.redhawk.ide.graphiti.ui.diagram.wizards.FindByCORBANameWizardPage.CORBANameModel;
public abstract class AbstractFindByWizardPage extends WizardPage {
private DataBindingContext dbc;
private Button usesPortAddBtn, usesPortDeleteBtn, providesPortAddBtn, providesPortDeleteBtn;
private Text usesPortNameText, providesPortNameText;
private List usesPortList, providesPortList;
private Composite dialogComposite;
protected AbstractFindByWizardPage(String pageName, String title) {
super(pageName, title, null);
dbc = new DataBindingContext();
}
protected abstract void createNameSection();
protected abstract Object getModel();
protected String validateAll() {
String err;
if (usesPortNameText != null) {
err = validText("Port", usesPortNameText);
if (err != null) {
return err;
}
}
if (providesPortNameText != null) {
err = validText("Port", providesPortNameText);
if (err != null) {
return err;
}
}
return null;
}
@Override
public void createControl(Composite parent) {
// Create main page composite
WizardPageSupport.create(this, getDbc());
this.dialogComposite = new Composite(parent, SWT.NONE);
dialogComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
dialogComposite.setLayout(new GridLayout(1, false));
createNameSection();
createPortsSection();
setControl(dialogComposite);
getDbc().updateModels();
}
private void createPortsSection() {
// port group
final Group portOptions = new Group(dialogComposite, SWT.NONE);
portOptions.setLayout(new GridLayout(2, true));
portOptions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
portOptions.setText("Port(s) to use for connections");
// provides port composite
final Composite providesPortComposite = createPortComposite(portOptions);
// add provides port name text
providesPortNameText = addPortNameText(providesPortComposite);
providesPortNameText.setToolTipText("The specified provides port on the component will be located to make connections");
// add provides port "Add" button
providesPortAddBtn = new Button(providesPortComposite, SWT.PUSH);
providesPortAddBtn.setText("Add Provides Port");
// add provides port list
providesPortList = addPortList(providesPortComposite, CORBANameModel.PROVIDES_PORT_NAMES);
// add provides port "Delete" button
providesPortDeleteBtn = new Button(providesPortComposite, SWT.PUSH);
providesPortDeleteBtn.setText("Delete");
providesPortDeleteBtn.setEnabled(false);
// add provides port listeners
providesPortList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (providesPortList.getSelectionCount() > 0) {
providesPortDeleteBtn.setEnabled(true);
} else {
providesPortDeleteBtn.setEnabled(false);
}
}
});
providesPortAddBtn.addSelectionListener(getPortAddListener(providesPortList, providesPortNameText, providesPortDeleteBtn));
providesPortDeleteBtn.addSelectionListener(getPortDeleteListener(providesPortList, providesPortDeleteBtn));
// uses port composite
final Composite usesPortComposite = createPortComposite(portOptions);
// add uses port name text
usesPortNameText = addPortNameText(usesPortComposite);
usesPortNameText.setToolTipText("The specified uses port on the component will be located to make connections");
// add uses port "Add" button
usesPortAddBtn = new Button(usesPortComposite, SWT.PUSH);
usesPortAddBtn.setText("Add Uses Port");
// add uses port list
usesPortList = addPortList(usesPortComposite, CORBANameModel.USES_PORT_NAMES);
// add uses port "Delete" button
usesPortDeleteBtn = new Button(usesPortComposite, SWT.PUSH);
usesPortDeleteBtn.setText("Delete");
usesPortDeleteBtn.setEnabled(false);
// add uses port listeners
usesPortList.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (usesPortList.getSelectionCount() > 0) {
usesPortDeleteBtn.setEnabled(true);
} else {
usesPortDeleteBtn.setEnabled(false);
}
}
});
usesPortAddBtn.addSelectionListener(getPortAddListener(usesPortList, usesPortNameText, usesPortDeleteBtn));
usesPortDeleteBtn.addSelectionListener(getPortDeleteListener(usesPortList, usesPortDeleteBtn));
}
private Composite createPortComposite(Composite portOptions) {
final Composite portComposite = new Composite(portOptions, SWT.None);
portComposite.setLayout(new GridLayout(2, false));
portComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
return portComposite;
}
private Text addPortNameText(Composite portComposite) {
final Text portNameText = new Text(portComposite, SWT.BORDER);
GridData layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, true, 1, 1);
layoutData.minimumWidth = 200;
portNameText.setLayoutData(layoutData);
portNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String err = validText("Port", portNameText);
if (err != null) {
setErrorMessage(err);
} else {
setErrorMessage(validateAll());
}
}
});
return portNameText;
}
private org.eclipse.swt.widgets.List addPortList(Composite portComposite, String propertyName) {
org.eclipse.swt.widgets.List portList = new org.eclipse.swt.widgets.List(portComposite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
GridData listLayout = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
listLayout.heightHint = 80;
portList.setLayoutData(listLayout);
Object model = getModel();
@SuppressWarnings("unchecked")
IObservableList< ? > modelObservableList = BeanProperties.list(model.getClass(), propertyName).observe(model);
getDbc().bindList(WidgetProperties.items().observe(portList), modelObservableList);
return portList;
}
private SelectionListener getPortAddListener(final List portList, final Text portNameText, final Button deleteBtn) {
SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String portName = portNameText.getText();
if (portName.contains(" ")) {
return;
}
if (portName != null && !portName.isEmpty() && !("").equals(portName)) {
java.util.List<String> portNames = Arrays.asList(portList.getItems());
if (portNames.contains(portName)) {
return;
}
portList.add(portName);
portNameText.setText("");
getDbc().updateModels();
}
}
};
return listener;
}
private SelectionListener getPortDeleteListener(final List portList, final Button deleteBtn) {
SelectionListener listener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String[] selections = portList.getSelection();
if (selections != null) {
for (String selection : selections) {
portList.remove(selection);
}
getDbc().updateModels();
}
deleteBtn.setEnabled(false);
}
};
return listener;
}
/**
* If returns null, that means the value is valid/has no spaces.
* @param valueType
* @param value
* @return
*/
public String validText(String valueType, Text valueText) {
if (valueText != null && valueText.getText().contains(" ")) {
return valueType + " must not include spaces";
}
return null;
}
public String validText(String valueType, String value) {
if (value.contains(" ")) {
return valueType + " must not include spaces";
}
return null;
}
// Getters
public Composite getDialogComposite() {
return dialogComposite;
}
public DataBindingContext getDbc() {
return dbc;
}
}