package com.javafun.core.ui.internal;
import javafun.utils.StringUtils;
import javax.accessibility.Accessible;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.HelpListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackListener;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
/**
* A customized text control. The most important additional feature that this
* control provides over the standard SWT text control is that you can set the
* column width of the control. This control also selects all its text when it
* gains the focus.
*/
public class StringControl extends Composite {
static final public int COLUMN_WIDTH_AVERAGE_CHAR = 0;
static final public int COLUMN_WIDTH_AVERAGE_DIGIT = 1;
static final public int COLUMN_WIDTH_AVERAGE_LETTER = 2;
static final public int COLUMN_WIDTH_WIDEST_CHAR = 3;
static final public int COLUMN_WIDTH_WIDEST_DIGIT = 4;
static final public int COLUMN_WIDTH_WIDEST_LETTER = 5;
static final public int DEFAULT_STYLE = SWT.BORDER | SWT.SINGLE;
static final public int UPPER_CASE = 1 << 23; // not used by text
static final public int NUMERICAL = 1 << 30; // not used by text
static final public int DOUBLE = 1 << 28; // not used by text
int _columns;
int _columnType = COLUMN_WIDTH_AVERAGE_CHAR;
protected int _style;
protected boolean _required;
protected boolean _dirty;
protected boolean _isReadOnly;
protected boolean _blockDirtyFlag;
private final ControlDecoration _controlDecoration;
protected Text _text;
private Point _preferredSize;
public StringControl(Composite parent) {
this(parent, DEFAULT_STYLE);
}
public StringControl(final Composite parent, int style) {
super(parent, SWT.NO_FOCUS);
setLayout(new FillLayout());
final int finalStyle = style;
_text = new Text(this, style);
if ((style & NUMERICAL) != 0) {
new SimpleNumericalDecorator(_text);
}
if ((style & DOUBLE) != 0) {
new SimpleDoubleDecorator(_text);
}
_text.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if ((finalStyle & SWT.NO_FOCUS) == 0 && !"".equals(_text.getText())) {
_text.selectAll();
}
}
});
_text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
_dirty |= !_blockDirtyFlag;
updateRequired();
}
});
_text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(org.eclipse.swt.events.KeyEvent e) {
if (_isReadOnly) {
e.doit = false;
}
}
@Override
public void keyReleased(KeyEvent e) {
if (_isReadOnly) {
e.doit = false;
}
}
});
if ((style & SWT.READ_ONLY) != 0) {
style |= SWT.NO_FOCUS;
setReadOnly(true);
}
if ((style & UPPER_CASE) != 0) {
_text.addListener(SWT.Verify, new Listener() {
public void handleEvent(Event e) {
for (int i = 0; i < e.text.length(); i++) {
if (Character.isLowerCase(e.text.charAt(i))) {
e.text = e.text.toUpperCase();
break;
}
}
}
});
}
_controlDecoration = new ControlDecoration(_text, SWT.TOP | SWT.LEFT, parent);
_controlDecoration.setImage(PluginResources.getImage("required-overlay.gif"));
_controlDecoration.setDescriptionText("This is required information");
_controlDecoration.hide();
}
public Text getTextControl() {
return _text;
}
@Override
public int getStyle() {
return _style;
}
/**
* @see com.rpc.core.ui.forms.FieldViewer#setFocus()
*/
@Override
public boolean setFocus() {
if (_text == null) {
return false;
}
return _text.setFocus();
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
if (_columns <= 0) {
return super.computeSize(wHint, hHint, changed);
}
_preferredSize = _text.computeSize(wHint, hHint, changed);
// /*
// * Adding twice the avg character advance is really just a fudge factor
// * to account for the left & right margins inside the text box. SWT does
// * not give us a way to query for these margins but we could figure them
// * out exactly with some work. However, I've no time for that now - so
// * I've fudged it.
// */
// _preferredSize.x = (UIUtils.getAverageTextCharacterAdvance() + _text.getBorderWidth()) * 2;
// switch (_columnType) {
// case COLUMN_WIDTH_AVERAGE_DIGIT: {
// _preferredSize.x += UIUtils.getAverageTextDigitAdvance() * _columns;
// }
// break;
// case COLUMN_WIDTH_AVERAGE_LETTER: {
// _preferredSize.x += UIUtils.getAverageTextLetterAdvance() * _columns;
// }
// break;
// case COLUMN_WIDTH_WIDEST_CHAR: {
// _preferredSize.x += UIUtils.getWidestTextCharacterAdvance() * _columns;
// }
// break;
// case COLUMN_WIDTH_WIDEST_DIGIT: {
// _preferredSize.x += UIUtils.getWidestTextDigitAdvance() * _columns;
// }
// break;
// case COLUMN_WIDTH_WIDEST_LETTER: {
// _preferredSize.x += UIUtils.getWidestTextLetterAdvance() * _columns;
// }
// break;
// default: { // COLUMN_WIDTH_AVERAGE_CHAR
// _preferredSize.x += UIUtils.getAverageTextCharacterAdvance() * _columns;
// }
// }
return _preferredSize;
}
public void setColumns(int columns, int columnType) {
_columns = columns;
_columnType = columnType;
}
public void setColumns(int columns) {
setColumns(columns, COLUMN_WIDTH_AVERAGE_CHAR);
}
public int getColumns() {
return _columns;
}
public int getColumnType() {
return _columnType;
}
// /////////////////////////////////////////////
//
// methods from the Text class
//
public void addModifyListener(ModifyListener listener) {
_text.addModifyListener(listener);
}
public void addSelectionListener(SelectionListener listener) {
_text.addSelectionListener(listener);
}
public void addVerifyListener(VerifyListener listener) {
_text.addVerifyListener(listener);
}
public void append(String string) {
_text.append(string);
}
public void clearSelection() {
_text.clearSelection();
}
// public void copy() {
// _text.copy();
// }
// public void cut() {
// _text.cut();
// }
// public int getCaretLineNumber() {
// return _text.getCaretLineNumber();
// }
// public Point getCaretLocation() {
// return _text.getCaretLocation();
// }
public int getCaretPosition() {
return _text.getCaretPosition();
}
public int getCharCount() {
return _text.getCharCount();
}
// public boolean getDoubleClickEnabled() {
// return _text.getDoubleClickEnabled();
// }
public char getEchoChar() {
return _text.getEchoChar();
}
public boolean getEditable() {
return _text.getEditable();
}
// public int getLineCount() {
// return _text.getLineCount();
// }
public String getLineDelimiter() {
return _text.getLineDelimiter();
}
public int getLineHeight() {
return _text.getLineHeight();
}
public Point getSelection() {
return _text.getSelection();
}
public int getSelectionCount() {
return _text.getSelectionCount();
}
public String getSelectionText() {
return _text.getSelectionText();
}
// public int getTabs() {
// return _text.getTabs();
// }
/**
* Returns the widget text.
* The text for a text widget is the characters in the widget, or an empty string if this has never been set.
* @return the widget text
*/
public String getText() {
return _text.getText();
}
public String getText(int start, int end) {
return _text.getText(start, end);
}
public int getTextLimit() {
return _text.getTextLimit();
}
// public int getTopIndex() {
// return _text.getTopIndex();
// }
// public int getTopPixel() {
// return _text.getTopPixel();
// }
public void insert(String string) {
_text.insert(string);
}
// public void paste() {
// _text.paste();
// }
public void removeModifyListener(ModifyListener listener) {
_text.removeModifyListener(listener);
}
public void removeSelectionListener(SelectionListener listener) {
_text.removeSelectionListener(listener);
}
public void removeVerifyListener(VerifyListener listener) {
_text.removeVerifyListener(listener);
}
public void selectAll() {
_text.selectAll();
}
// public void setDoubleClickEnabled(boolean doubleClick) {
// _text.setDoubleClickEnabled(doubleClick);
// }
public void setEchoChar(char echo) {
_text.setEchoChar(echo);
}
public void setEditable(boolean editable) {
_text.setEditable(editable);
}
@Override
public void setFont(Font font) {
_text.setFont(font);
}
public void setSelection(int start) {
_text.setSelection(start);
}
public void setSelection(int start, int end) {
_text.setSelection(start, end);
}
@Override
public void setRedraw(boolean redraw) {
_text.setRedraw(redraw);
}
public void setSelection(Point selection) {
_text.setSelection(selection);
}
// public void setTabs(int tabs) {
// _text.setTabs(tabs);
// }
// public void setText(Money money) {
// setText(money != null ? FormatUtils.DECIMAL_FORMAT.format(money) : null);
// }
public void setText(String string) {
if (_text.isDisposed()) {
return;
}
if (string == null) {
string = "";
}
// replace newlines with the local separator
int style = getStyle();
if (((style & SWT.MULTI) != 0) && ((style & SWT.READ_ONLY) != 0)) {
String lineSep = System.getProperty("line.separator");
string = StringUtils.replaceAll(string, lineSep, "\n");
string = StringUtils.replaceAll(string, "\n", lineSep);
}
String oldText = _text.getText();
if (string.equals(oldText) == false) {
_blockDirtyFlag = true;
_text.setText(string);
_blockDirtyFlag = false;
}
updateRequired();
}
public void setTextLimit(int limit) {
_text.setTextLimit(limit);
}
// public void setTopIndex(int index) {
// _text.setTopIndex(index);
// }
// public void showSelection() {
// _text.showSelection();
// }
// ///////////////////////////////////////////////////////
//
// methods from Control
//
@Override
public void addFocusListener(FocusListener listener) {
_text.addFocusListener(listener);
}
@Override
public void addHelpListener(HelpListener listener) {
_text.addHelpListener(listener);
}
@Override
public void addKeyListener(KeyListener listener) {
_text.addKeyListener(listener);
}
@Override
public void addMouseListener(MouseListener listener) {
_text.addMouseListener(listener);
}
// @Override
// public void addMouseTrackListener(MouseTrackListener listener) {
// _text.addMouseTrackListener(listener);
// }
//
// @Override
// public void addMouseMoveListener(MouseMoveListener listener) {
// _text.addMouseMoveListener(listener);
// }
//
// @Override
// public void addPaintListener(PaintListener listener) {
// _text.addPaintListener(listener);
// }
@Override
public void addTraverseListener(TraverseListener listener) {
_text.addTraverseListener(listener);
}
@Override
public void addListener(int eventType, Listener listener) {
_text.addListener(eventType, listener);
}
@Override
public void removeListener(int eventType, Listener listener) {
_text.removeListener(eventType, listener);
}
@Override
public boolean forceFocus() {
return _text.forceFocus();
}
// @Override
// public Accessible getAccessible() {
// return _text.getAccessible();
// }
@Override
public Color getBackground() {
if (_text != null && !_text.isDisposed()) {
return _text.getBackground();
}
return null;
}
@Override
public Font getFont() {
if (_text != null && !_text.isDisposed()) {
return _text.getFont();
}
return null;
}
@Override
public Color getForeground() {
if (_text != null && !_text.isDisposed()) {
return _text.getForeground();
}
return null;
}
@Override
public Menu getMenu() {
return _text.getMenu();
}
@Override
public boolean isFocusControl() {
return _text.isFocusControl();
}
@Override
public void removeFocusListener(FocusListener listener) {
_text.removeFocusListener(listener);
}
@Override
public void removeHelpListener(HelpListener listener) {
_text.removeHelpListener(listener);
}
@Override
public void removeKeyListener(KeyListener listener) {
_text.removeKeyListener(listener);
}
// @Override
// public void removeMouseTrackListener(MouseTrackListener listener) {
// _text.removeMouseTrackListener(listener);
// }
@Override
public void removeMouseListener(MouseListener listener) {
_text.removeMouseListener(listener);
}
// @Override
// public void removeMouseMoveListener(MouseMoveListener listener) {
// _text.removeMouseMoveListener(listener);
// }
// @Override
// public void removePaintListener(PaintListener listener) {
// _text.removePaintListener(listener);
// }
@Override
public void removeTraverseListener(TraverseListener listener) {
_text.removeTraverseListener(listener);
}
@Override
public void setBackground(Color color) {
if (_text != null && !_text.isDisposed() && !_isReadOnly) {
_text.setBackground(color);
}
}
// @Override
// public void setCapture(boolean capture) {
// _text.setCapture(capture);
// }
@Override
public void setCursor(Cursor cursor) {
_text.setCursor(cursor);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
_text.setEnabled(enabled);
}
@Override
public void setForeground(Color color) {
if (_text != null && !_text.isDisposed()) {
_text.setForeground(color);
}
}
@Override
public void setMenu(Menu menu) {
_text.setMenu(menu);
}
@Override
public void setToolTipText(String string) {
super.setToolTipText(string);
_text.setToolTipText(string);
}
// @Override
// public boolean traverse(int traversal) {
// return _text.traverse(traversal);
// }
public boolean isRequired() {
return _required;
}
public boolean getRequired() {
return _required;
}
private void updateRequired() {
if (_required) {
if (StringUtils.isNotBlank(_text.getText())) {
_controlDecoration.hide();
} else {
_controlDecoration.show();
}
} else {
_controlDecoration.hide();
}
}
public void setRequired(boolean isRequired) {
_required = isRequired;
if (_text != null) {
updateRequired();
}
}
public boolean isDirty() {
return _dirty;
}
public void setDirty(boolean dirty) {
_dirty = dirty;
}
public boolean getIsReadOnly() {
return _isReadOnly;
}
public void setReadOnly(boolean isReadOnly) {
_isReadOnly = isReadOnly;
Display display = getDisplay();
_text.setBackground(display.getSystemColor(_isReadOnly ? SWT.COLOR_WIDGET_BACKGROUND
: SWT.COLOR_LIST_BACKGROUND));
}
public Point getPreferredSize() {
return _preferredSize;
}
}