JAL-3032 adds Java 8 functionality (2/2)
[jalview.git] / src2 / fr / orsay / lri / varna / controlers / ControleurDemoTextField.java
diff --git a/src2/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java b/src2/fr/orsay/lri/varna/controlers/ControleurDemoTextField.java
new file mode 100644 (file)
index 0000000..fd87fc6
--- /dev/null
@@ -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<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);
+               }
+       }
+}
\ No newline at end of file