X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fcontrolers%2FControleurDemoTextField.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fcontrolers%2FControleurDemoTextField.java;h=fd87fc649068f95a7716c3a9737e9006b9b5c085;hb=ec8f3cedf60fb1feed6d34de6b49f6bfa78b9dd8;hp=0000000000000000000000000000000000000000;hpb=056dad85a910551cc95e44d451a61f6b8c4dd35d;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java b/srcjar/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java new file mode 100644 index 0000000..fd87fc6 --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java @@ -0,0 +1,143 @@ +/* + 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 Université 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 infos = new ArrayList(); + _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 p = new Stack(); + 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); + } + } +} \ No newline at end of file