package tela.componentes;
import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
public class MecasoftText extends Composite {
public static Integer AMBOS = -1;
public static Integer NUMEROS = 0;
public static Integer LETRAS = 1;
private boolean passou;
private Integer tamanhoAnterior;
private Integer posicaoCursor;
private Integer max;
private Integer aceita;
private String caracteres;
private Integer[] posicoes;
private String texto;
private String textoRetorno;
private Character charContinuo;
private Integer mediaCharContinuo;
public Text text;
public MecasoftText(Composite parent, int style) {
super(parent, style);
posicoes = new Integer[0];
caracteres = "";
aceita = AMBOS;
max = -1;
charContinuo = null;
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
setLayout(gridLayout);
text = new Text(this, SWT.BORDER);
text.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, true, 1, 1));
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
passou = validar(e.keyCode);
if (!passou)
e.doit = false;
}
@Override
public void keyReleased(KeyEvent e) {
formatar();
}
});
}
private void formatar() {
if(passou){
//pega posicao do cursor para ele nao sair do lugar
posicaoCursor = text.getCaretPosition();
//pega o tamanho atual do texto para comparar com o novo tamanho e ver se o cursor ira mudar de posicao ou nao
tamanhoAnterior = text.getText().length();
limparTexto();
textoRetorno = "";
for(int c1 = 0; c1 < texto.length(); c1++){
for(int c2 = 0; c2 < caracteres.length(); c2++){
if(posicoes[c2].compareTo(c1) == 0)
textoRetorno += caracteres.charAt(c2);
else if(c1 == (texto.length() + posicoes[c2]) && c1 != 0){
textoRetorno += caracteres.charAt(c2);
}
}
if(charContinuo != null){
if((texto.length() - c1 + posicoes[0]) % mediaCharContinuo == 0 && c1 > (posicoes[0] * -1 + 2))
textoRetorno += charContinuo;
}
textoRetorno += texto.charAt(c1);
}
text.setText(textoRetorno);
//verifica se o texto aumento
tamanhoAnterior = textoRetorno.length() - tamanhoAnterior;
if(tamanhoAnterior > 0)
posicaoCursor += tamanhoAnterior;
//seta a posi�ao do cursor onde ela deveria ficar
text.setSelection(posicaoCursor, posicaoCursor);
}
}
public boolean validar(int keyCode) {
switch (keyCode) {
case SWT.BS:
case SWT.ARROW_UP:
case SWT.ARROW_DOWN:
case SWT.ARROW_LEFT:
case SWT.ARROW_RIGHT:
case SWT.DEL:
case SWT.HOME:
case SWT.END:
return true;
}
if ((text.getText().length() < max) || (max == -1)) {
if (aceita.equals(AMBOS))
return true;
if (aceita.equals(LETRAS) && (keyCode >= 97 && keyCode <= 122))
return true;
if (aceita.equals(NUMEROS)
&& ((keyCode >= 48 && keyCode <= 57) || (keyCode >= 16777264 && keyCode <= 16777273)))
return true;
}
return false;
}
private void limparTexto(){
texto = text.getText();
for(int c = 0; c < caracteres.length(); c++)
texto = StringUtils.remove(texto, caracteres.charAt(c));
texto = StringUtils.deleteWhitespace(texto);
if(charContinuo != null)
texto = StringUtils.remove(texto, charContinuo);
}
public void setOptions(Integer aceita, Integer max) {
this.aceita = aceita;
this.max = max;
}
public void addChars(String caracteres, Integer posicoes[], Character charContinuo, Integer mediaCharContinuo) {
this.caracteres = caracteres;
this.posicoes = posicoes;
this.charContinuo = charContinuo;
this.mediaCharContinuo = mediaCharContinuo;
}
@Override
public void setEnabled(boolean enabled) {
text.setEnabled(enabled);
}
@Override
public boolean getEnabled() {
return text.getEnabled();
}
public void setEditable(boolean editable){
text.setEditable(editable);
}
public boolean getEditable(boolean editable){
return text.getEditable();
}
public String getText(){
if(text.getText() == null)
return "";
return text.getText();
}
public void setText(String text){
this.text.setText(text);
}
public String getCaracteres() {
return caracteres;
}
public String getTextoSemFormatacao(){
if(texto == null)
limparTexto();
return texto;
}
}