package org.zend.php.zendserver.deployment.ui.editors;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
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.ui.forms.IManagedForm;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.zend.php.zendserver.deployment.core.descriptor.DeploymentDescriptorPackage;
import org.zend.php.zendserver.deployment.core.descriptor.IModelObject;
import org.zend.php.zendserver.deployment.ui.Messages;
/**
* Represents the version control composite in the dependency blocks
*/
public class VersionControl {
public int[] choiceTypes = { EQUALS, CONFLICTS, RANGE };
public static final int EQUALS = 1;
public static final int CONFLICTS = 2;
public static final int RANGE = 4;
public static final int EXCLUDE = 8;
private int modes;
private Button btnEquals;
private Button btnConflict;
private Button btnMatches;
private IModelObject input;
private TextField equalsField;
private TextField conflictsField;
private TextField minField;
private TextField maxField;
private ListField excludeField;
private Composite versions;
private Composite equals;
private Composite conflicts;
private Composite range;
public VersionControl(int modes, IModelObject input) {
this.modes = modes;
// setInput(input);
}
public void dispose() {
}
public void setFocus() {
}
public void refresh() {
int s = getInputSelection(input);
if (equalsField != null) {
equalsField.refresh();
}
if (conflictsField != null) {
conflictsField.refresh();
}
if (minField != null) {
minField.refresh();
}
if (maxField != null) {
maxField.refresh();
}
if (excludeField != null) {
excludeField.refresh();
}
// update ui according to selection
updateSelection(s);
// update other UI components
updateFieldsVisibility();
}
private void updateSelection(int s) {
if (btnEquals != null)
btnEquals.setSelection(s == EQUALS);
if (btnConflict != null)
btnConflict.setSelection(s == CONFLICTS);
if (btnMatches != null)
btnMatches.setSelection(s == RANGE);
}
private int getInputSelection(IModelObject input2) {
if (input.get(DeploymentDescriptorPackage.DEPENDENCY_EQUALS) != null) {
return EQUALS;
} else if (((modes & CONFLICTS) == CONFLICTS) && (input.get(DeploymentDescriptorPackage.DEPENDENCY_CONFLICTS) != null)) {
return CONFLICTS;
}
return RANGE;
}
private void updateFieldsVisibility() {
int selection = getSelected();
if ((modes & RANGE) == RANGE) {
compositeState(range, selection == RANGE);
}
if ((modes & EQUALS) == EQUALS) {
compositeState(equals, selection == EQUALS);
}
if ((modes & CONFLICTS) == CONFLICTS) {
compositeState(conflicts, selection == CONFLICTS);
}
// re-layout and make sure all widgets are visible
versions.layout(false);
}
protected void compositeState(Composite composite, boolean state) {
composite.setVisible(state);
final GridData ld = (GridData) composite.getLayoutData();
ld.exclude = !state;
}
public void setInput(IModelObject input) {
this.input = input;
if ((modes & EQUALS) == EQUALS) {
equalsField.setInput(input);
}
if ((modes & CONFLICTS) == CONFLICTS) {
conflictsField.setInput(input);
}
if ((modes & RANGE) == RANGE) {
minField.setInput(input);
maxField.setInput(input);
}
if ((modes & EXCLUDE) == EXCLUDE) {
excludeField.setInput(input);
}
}
/**
* @wbp.parser.entryPoint
*/
public void createContents(Composite client, IManagedForm mform) {
FormToolkit toolkit = mform.getToolkit();
client.setLayout(new GridLayout(1, false));
client.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Composite options = new Composite(client, SWT.NULL);
final GridLayout layout = new GridLayout(numOfModes(modes), false);
options.setLayout(layout);
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
options.setLayoutData(gd);
// radio buttons
addRadioButtons(toolkit, options);
versions = toolkit.createComposite(client);
versions.setLayout(new GridLayout(1, false));
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
versions.setLayoutData(gd);
addVersionFields(toolkit, versions, mform.getMessageManager());
// refresh();
}
protected void addVersionFields(FormToolkit toolkit, Composite versions, IMessageManager mmng) {
range = null;
if ((modes & RANGE) == RANGE) {
range = toolkit.createComposite(versions);
range.setLayout(new GridLayout(3, false));
GridData data = new GridData(SWT.FILL, SWT.TOP, true, true);
range.setLayoutData(data);
minField = new TextField(null,
DeploymentDescriptorPackage.DEPENDENCY_MIN,
Messages.VersionControl_Minimum, mmng);
maxField = new TextField(null,
DeploymentDescriptorPackage.DEPENDENCY_MAX,
Messages.VersionControl_Maximum, mmng);
minField.create(range, toolkit);
maxField.create(range, toolkit);
toolkit.paintBordersFor(range);
}
if ((modes & EXCLUDE) == EXCLUDE) {
excludeField = new ListField(null,
DeploymentDescriptorPackage.DEPENDENCY_EXCLUDE,
Messages.VersionControl_Exclude, mmng);
excludeField.create(range, toolkit);
}
if ((modes & CONFLICTS) == CONFLICTS) {
conflicts = toolkit.createComposite(versions);
conflicts.setLayout(new GridLayout(3, false));
GridData data = new GridData(SWT.FILL, SWT.TOP, true, true);
conflicts.setLayoutData(data);
conflictsField = new TextField(null,
DeploymentDescriptorPackage.DEPENDENCY_CONFLICTS,
Messages.VersionControl_0, mmng);
conflictsField.create(conflicts, toolkit);
toolkit.paintBordersFor(conflicts);
}
if ((modes & EQUALS) == EQUALS) {
equals = toolkit.createComposite(versions);
equals.setLayout(new GridLayout(3, false));
GridData data = new GridData(SWT.FILL, SWT.TOP, true, true);
equals.setLayoutData(data);
equalsField = new TextField(null,
DeploymentDescriptorPackage.DEPENDENCY_EQUALS,
Messages.VersionControl_0, mmng);
equalsField.create(equals, toolkit);
toolkit.paintBordersFor(equals);
}
}
protected void addRadioButtons(FormToolkit toolkit, Composite options) {
if ((modes & EQUALS) == EQUALS) {
btnEquals = toolkit.createButton(options,
Messages.VersionControl_2, SWT.RADIO);
btnEquals.setSelection(true);
btnEquals.addSelectionListener(new SelectionChanged());
btnEquals.setSelection(true);
}
if ((modes & CONFLICTS) == CONFLICTS) {
btnConflict = toolkit.createButton(options,
Messages.VersionControl_3, SWT.RADIO);
btnConflict.addSelectionListener(new SelectionChanged());
}
if ((modes & RANGE) == RANGE) {
btnMatches = toolkit.createButton(options,
Messages.VersionControl_4, SWT.RADIO);
btnMatches.addSelectionListener(new SelectionChanged());
}
}
private int getSelected() {
if (btnEquals != null && btnEquals.getSelection()) {
return EQUALS;
}
if (btnConflict != null && btnConflict.getSelection()) {
return CONFLICTS;
} else {
return RANGE;
}
}
class SelectionChanged implements SelectionListener {
public void widgetSelected(SelectionEvent e) {
updateFieldsVisibility();
}
public void widgetDefaultSelected(SelectionEvent e) {
updateFieldsVisibility();
}
}
private int numOfModes(int modes2) {
int r = 0;
if ((modes & EQUALS) == EQUALS) {
r++;
}
if ((modes & CONFLICTS) == CONFLICTS) {
r++;
}
if ((modes & RANGE) == RANGE) {
r++;
}
return r;
}
public EditorField[] getFields() {
List<EditorField> fields = new ArrayList<EditorField>();
if (equalsField != null) {
fields.add(equalsField);
}
if (conflictsField != null) {
fields.add(conflictsField);
}
if (minField != null) {
fields.add(minField);
}
if (maxField != null) {
fields.add(maxField);
}
if (excludeField != null) {
fields.add(excludeField);
}
return fields.toArray(new EditorField[fields.size()]);
}
public void setEqualsLabel(String label) {
equalsField.setLabel(label);
}
}