/*
VARNA is a tool for the automated drawing, visualization and annotation of the secondary structure of RNA, designed as a companion software for web servers and databases.
Copyright (C) 2008 Kevin Darty, Alain Denise and Yann Ponty.
electronic mail : Yann.Ponty@lri.fr
paper mail : LRI, bat 490 University Paris-Sud 91405 Orsay Cedex France
This file is part of VARNA version 3.1.
VARNA version 3.1 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
VARNA version 3.1 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with VARNA version 3.1.
If not, see http://www.gnu.org/licenses.
*/
package fr.orsay.lri.varna.controlers;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Stack;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import fr.orsay.lri.varna.applications.VARNAOnlineDemo;
import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
/**
* It controls the sequence and structure text fields and changes their color if
* they have different lengths or unbalanced parentheses.
*
* @author darty
*
*/
public class ControleurDemoTextField implements CaretListener {
private VARNAOnlineDemo _vod;
private String _oldSeq, _oldStruct;
private Highlighter _hilit;
private Highlighter.HighlightPainter _painter;
private final Color COLORERROR = Color.RED;
private final Color COLORWARNING = Color.ORANGE;
public ControleurDemoTextField(VARNAOnlineDemo VOD) {
_vod = VOD;
_oldSeq = _vod.get_seq().getText();
_oldStruct = _vod.get_struct().getText();
_hilit = new DefaultHighlighter();
_painter = new DefaultHighlighter.DefaultHighlightPainter(Color.BLACK);
_vod.get_struct().setHighlighter(_hilit);
}
// if there is any change
public void caretUpdate(CaretEvent e) {
if (_oldStruct != _vod.get_struct().getText()
|| _oldSeq != _vod.get_seq().getText()) {
ArrayList<String> infos = new ArrayList<String>();
_vod.get_info().removeAll();
_hilit.removeAllHighlights();
_oldStruct = _vod.get_struct().getText();
_oldSeq = _vod.get_seq().getText();
int nbPO = 0, nbPF = 0;
// compte les parentheses ouvrantes et fermantes
Stack<Integer> p = new Stack<Integer>();
boolean pb = false;
for (int i = 0; i < _vod.get_struct().getText().length(); i++) {
if (_vod.get_struct().getText().charAt(i) == '(') {
nbPO++;
p.push(i);
} else if (_vod.get_struct().getText().charAt(i) == ')') {
nbPF++;
if (p.size() == 0) {
try {
_hilit.addHighlight(i, i + 1, _painter);
} catch (BadLocationException e1) {
_vod.get_varnaPanel().errorDialog(e1);
}
pb = true;
} else
p.pop();
}
}
// si le nombre de parentheses ouvrantes/fermantes est different
if (pb || p.size() > 0) {
// colorie en rouge
if (pb) {
infos.add("too many closing parentheses");
}
if (p.size() > 0) {
int indice;
while (!p.isEmpty()) {
indice = p.pop();
try {
_hilit.addHighlight(indice, indice + 1, _painter);
} catch (BadLocationException e1) {
_vod.get_varnaPanel().errorDialog(e1);
}
}
infos.add("too many opening parentheses");
}
_vod.get_info().setForeground(COLORERROR);
_vod.get_seq().setForeground(COLORERROR);
_vod.get_struct().setForeground(COLORERROR);
} else {
try {
// redraw the new RNA
_vod.get_varnaPanel().drawRNA(_vod.get_seq().getText(),
_vod.get_struct().getText(),
_vod.get_varnaPanel().getRNA().get_drawMode());
} catch (ExceptionNonEqualLength e1) {
_vod.get_varnaPanel().errorDialog(e1);
}
// verifie la longueur de la structure et de la sequence
if (_vod.get_seq().getText().length() != _vod.get_struct()
.getText().length()) {
// colorie en orange
infos.add("different lenghts");
_vod.get_seq().setForeground(COLORWARNING);
_vod.get_struct().setForeground(COLORWARNING);
} else {
// sinon colorie en noir
_vod.get_seq().setForeground(Color.black);
_vod.get_struct().setForeground(Color.black);
}
}
_vod.get_varnaPanel().getVARNAUI().UIReset();
String info = new String();
if (infos.size() != 0) {
info += infos.get(0);
for (int i = 1; i < infos.size(); i++) {
info += ", " + infos.get(i);
}
info += ".";
}
_vod.get_info().setText(info);
}
}
}