package org.zend.php.zendserver.deployment.ui.editors;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.IMessageManager;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.zend.php.zendserver.deployment.core.descriptor.ChangeEvent;
import org.zend.php.zendserver.deployment.core.descriptor.IDescriptorChangeListener;
import org.zend.php.zendserver.deployment.core.descriptor.IModelObject;
import org.zend.php.zendserver.deployment.core.internal.descriptor.Feature;
import org.zend.php.zendserver.deployment.core.internal.validation.ValidationStatus;
import org.zend.php.zendserver.deployment.ui.editors.DescriptorEditorPage.FormDecoration;
public class TextField implements EditorField {
protected Control label;
protected Text text;
protected String textValue;
protected String labelTxt;
protected IModelObject target;
protected Feature key;
protected boolean isRefresh;
protected boolean linkLabel;
protected int style;
protected IMessageManager mmng;
protected IDescriptorChangeListener modelChangeListener;
public TextField(IModelObject target,Feature key, String label, IMessageManager mmng) {
this(target, key, label, SWT.SINGLE, false, mmng);
}
public TextField(IModelObject target,Feature key, String label, int style, boolean linkLabel, IMessageManager mmng) {
this.key = key;
this.labelTxt = label;
this.style = style;
this.linkLabel = linkLabel;
this.mmng = mmng;
setInput(target);
}
public Feature getKey() {
return key;
}
public void refresh() {
isRefresh = true;
try {
String value = target != null ? target.get(key) : null;
text.setText(value == null ? "" : value); //$NON-NLS-1$
} finally {
isRefresh = false;
}
}
public void create(Composite parent, FormToolkit toolkit) {
createControls(parent, toolkit);
createActions();
}
protected void createControls(Composite parent, FormToolkit toolkit) {
createLabel(parent, toolkit);
createTextControl(parent, toolkit);
}
protected void createLabel(Composite parent, FormToolkit toolkit) {
if (labelTxt == null) {
return;
}
if (linkLabel) {
label = toolkit.createHyperlink(parent, labelTxt, SWT.NULL);
} else {
label = toolkit.createLabel(parent, labelTxt);
label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
}
label.setLayoutData(new GridData());
}
protected void createTextControl(Composite parent, FormToolkit toolkit) {
text = toolkit.createText(parent, "", style); //$NON-NLS-1$
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.horizontalSpan = 2;
text.setLayoutData(gd);
text.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_WHITE));
}
public void setErrorMessage(String message) {
if (message == null) {
mmng.removeMessage(this, text);
} else {
mmng.addMessage(this, message, null, IMessageProvider.ERROR, text);
}
}
public void setWarningMessage(String message) {
if (message == null) {
mmng.removeMessage(this, text);
} else {
mmng.addMessage(this, message, null, IMessageProvider.WARNING, text);
}
}
protected void createActions() {
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (isRefresh) {
return;
}
String text = ((Text)e.widget).getText();
if (target != null) {
if (("".equals(text) && (key.flags & Feature.SET_EMPTY_TO_NULL) > 0)) { //$NON-NLS-1$
target.set(key, null);
} else {
target.set(key, text);
}
}
}
});
}
public void dispose() {
if ((target != null) && (modelChangeListener != null)) {
target.removeListener(modelChangeListener);
}
}
public void setFocus() {
text.setFocus();
}
public void setInput(IModelObject input) {
if (target != null) {
target.removeListener(modelChangeListener);
}
target = input;
textValue = null;
if (target != null) {
if (modelChangeListener == null) {
modelChangeListener = createModelChangeListener();
}
target.addListener(modelChangeListener);
}
}
private IDescriptorChangeListener createModelChangeListener() {
return new IDescriptorChangeListener() {
public void descriptorChanged(final ChangeEvent event) {
if (event.feature != TextField.this.key) {
return;
}
if (event.target != TextField.this.target) {
return;
}
if ((text == null) || (text.isDisposed())) {
return;
}
text.getDisplay().syncExec(new Runnable() {
public void run() {
if (text.isFocusControl()) {
return;
}
String currText = text.getText();
String newText = (String) event.newValue;
if (currText.equals(newText)) {
return;
}
if (newText == null) {
newText = ""; //$NON-NLS-1$
}
Point sel = text.getSelection();
isRefresh = true;
try {
text.setText(newText);
text.setSelection(Math.min(sel.x, newText.length() - 1), Math.min(sel.y, newText.length() - 1));
} finally {
isRefresh = false;
}
}
});
}
};
}
public Text getText() {
return text;
}
/**
* Makes field invisible and removes the value from
* underlying model object. When user enables the field,
* it's data is set back to model.
*/
public void setVisible(boolean visible) {
if (text.getVisible() == visible) {
return;
}
text.setVisible(visible);
((GridData)text.getLayoutData()).exclude = !visible;
if (label != null) {
label.setVisible(visible);
((GridData)label.getLayoutData()).exclude = !visible;
}
if (visible) {
if (textValue != null) {
text.setText(textValue);
textValue = null;
}
} else {
textValue = text.getText();
text.setText(""); //$NON-NLS-1$
}
}
public void setEnabled(boolean enabled) {
if (text.getEnabled() == enabled) {
return;
}
text.setEnabled(enabled);
if (enabled) {
if (textValue != null) {
text.setText(textValue);
textValue = null;
}
} else {
textValue = text.getText();
text.setText(""); //$NON-NLS-1$
}
}
public void setText(String string) {
text.setText(string);
}
public void pack() {
if (label != null)
label.pack();
if (text != null)
text.pack();
}
public void setDecoration(FormDecoration value) {
if (value == null) {
setErrorMessage(null);
} else {
switch (value.severity) {
case (ValidationStatus.ERROR):
setErrorMessage(value.message);
break;
case (ValidationStatus.WARNING):
setWarningMessage(value.message);
break;
}
}
}
public void setLabel(String text) {
if (label == null) {
return;
}
if (label instanceof Label) {
((Label) label).setText(text);
} else if (label instanceof Hyperlink) {
((Hyperlink) label).setText(text);
}
}
}