package org.celllife.idart.gui.patient;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
public class CustomIdField extends TextAdapter {
private final class KeyAdapterExtension extends KeyAdapter {
int limit = Integer.MAX_VALUE;
private final Text partNext;
private final Text partThis;
private final Text partPrevious;
public KeyAdapterExtension(Text partThis, Text partNext, Text partPrevious) {
this.partThis = partThis;
this.partNext = partNext;
this.partPrevious = partPrevious;
limit = partThis.getTextLimit();
}
@Override
public void keyPressed(KeyEvent e) {
if (e.keyCode != SWT.BS && e.keyCode != SWT.CR
&& e.keyCode != SWT.DEL && e.keyCode != SWT.ESC
&& e.keyCode != SWT.LF && e.keyCode != SWT.TAB
&& e.keyCode != SWT.ARROW && e.keyCode != SWT.ARROW_DOWN
&& e.keyCode != SWT.ARROW_LEFT && e.keyCode != SWT.ARROW_RIGHT
&& e.keyCode != SWT.ARROW_UP) {
int length = partThis.getText().length();
if (length == limit && partNext != null){
partNext.setFocus();
partNext.append(String.valueOf(e.character));
}
return;
}
if (e.keyCode == SWT.BS){
int length = partThis.getText().length();
if (length == 0 && partPrevious != null){
partPrevious.setFocus();
String text = partPrevious.getText();
partPrevious.setText(text.substring(0, text.length()-1));
partPrevious.setSelection(text.length(), text.length());
}
return;
}
if (e.keyCode == SWT.ARROW_LEFT){
int position = partThis.getCaretPosition();
if (position == 0 && partPrevious != null){
partPrevious.setFocus();
String text = partPrevious.getText();
partPrevious.setSelection(text.length(), text.length());
}
return;
}
if (e.keyCode == SWT.ARROW_RIGHT){
int position = partThis.getCaretPosition();
String text = partThis.getText();
if (position == text.length() && partNext != null){
partNext.setFocus();
}
return;
}
}
}
private static final int PART1_LEN = 3;
private static final int PART2_LEN = 9;
private static final int PART3_LEN = 6;
private static final int PART4_LEN = 5;
private static final double TOTOAL_LEN = PART1_LEN + PART2_LEN + PART3_LEN + PART4_LEN;
private Text part1;
private Text part2;
private Text part3;
private Text part4;
public CustomIdField(Composite parent, int style) {
part1 = new Text(parent, style);
part1.setTextLimit(PART1_LEN);
part2 = new Text(parent, style);
part2.setTextLimit(PART2_LEN);
part3 = new Text(parent, style);
part3.setTextLimit(PART3_LEN);
part4 = new Text(parent, style);
part4.setTextLimit(PART4_LEN);
part1.addKeyListener(new KeyAdapterExtension(part1, part2, null));
part2.addKeyListener(new KeyAdapterExtension(part2, part3, part1));
part3.addKeyListener(new KeyAdapterExtension(part3, part4, part2));
part4.addKeyListener(new KeyAdapterExtension(part4, null, part3));
}
@Override
public void setData(String key, Object value) {
part1.setData(key, value);
}
@Override
public void setFocus() {
part1.setFocus();
}
@Override
public void setBounds(Rectangle bounds) {
int factoredWidth = (int) Math.ceil(bounds.width / TOTOAL_LEN);
int w1 = factoredWidth * PART1_LEN;
part1.setBounds(bounds.x, bounds.y, w1, bounds.height);
int w2 = factoredWidth * PART2_LEN;
part2.setBounds(bounds.x + w1, bounds.y, w2, bounds.height);
int w3 = factoredWidth * PART3_LEN;
part3.setBounds(bounds.x + w1+w2, bounds.y, w3, bounds.height);
int w4 = factoredWidth * PART4_LEN;
part4.setBounds(bounds.x + w1+w2+w3, bounds.y, w4, bounds.height);
}
@Override
public void setFont(Font font) {
part1.setFont(font);
part2.setFont(font);
part3.setFont(font);
part4.setFont(font);
}
@Override
public void addKeyListener(KeyListener listener) {
part1.addKeyListener(listener);
part2.addKeyListener(listener);
part3.addKeyListener(listener);
part4.addKeyListener(listener);
}
@Override
public void setText(String text) {
splitText(text);
}
private void splitText(String text) {
part1.setText(getPart(text, PART1_LEN, 0));
part2.setText(getPart(text, PART2_LEN, PART1_LEN));
part3.setText(getPart(text, PART3_LEN, PART1_LEN + PART2_LEN));
part4.setText(getPart(text, PART4_LEN, PART1_LEN + PART2_LEN + PART3_LEN));
}
private String getPart(String text, int currentPartLength, int previousLength){
int currentTotalLength = previousLength + currentPartLength;
if (text.length() >= currentTotalLength){
return text.substring(previousLength, currentTotalLength);
} else if (text.length() >= previousLength) {
return text.substring(previousLength);
}
return "";
}
@Override
public String getText() {
return combineText();
}
private String combineText() {
return part1.getText() + part2.getText() + part3.getText()
+ part4.getText();
}
@Override
public void removeFocusListener(FocusListener listener) {
part1.removeFocusListener(listener);
part2.removeFocusListener(listener);
part3.removeFocusListener(listener);
part4.removeFocusListener(listener);
}
@Override
public void setEditable(boolean b) {
part1.setEditable(b);
part2.setEditable(b);
part3.setEditable(b);
part4.setEditable(b);
}
@Override
public void setEnabled(boolean b) {
part1.setEnabled(b);
part2.setEnabled(b);
part3.setEnabled(b);
part4.setEnabled(b);
}
@Override
public void addFocusListener(FocusListener listener) {
part1.addFocusListener(listener);
part2.addFocusListener(listener);
part3.addFocusListener(listener);
part4.addFocusListener(listener);
}
@Override
public void forceFocus() {
part1.forceFocus();
}
}