+/*
+ 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.Point;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.geom.Point2D;
+
+import fr.orsay.lri.varna.VARNAPanel;
+import fr.orsay.lri.varna.views.VueUI;
+
+
+/**
+ * VARNAPanel Shortcuts Controller
+ *
+ * @author darty
+ *
+ */
+public class ControleurVARNAPanelKeys implements KeyListener, FocusListener {
+
+ private VARNAPanel _vp;
+
+
+ public ControleurVARNAPanelKeys(VARNAPanel vp) {
+ _vp = vp;
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ // prise du focus
+ //_vp.requestFocus();
+
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ public void keyPressed(KeyEvent e) {
+ boolean controlDown = (e.getModifiersEx() & (KeyEvent.CTRL_DOWN_MASK)) == KeyEvent.CTRL_DOWN_MASK;
+ boolean shiftDown = (e.getModifiersEx() & (KeyEvent.SHIFT_DOWN_MASK)) == KeyEvent.SHIFT_DOWN_MASK;
+ boolean altDown = (e.getModifiersEx() & (KeyEvent.ALT_DOWN_MASK)) == KeyEvent.ALT_DOWN_MASK;
+ VueUI ui = _vp.getVARNAUI();
+ try {
+ switch (e.getKeyCode()) {
+ case (KeyEvent.VK_A):
+ if (controlDown) {
+ ui.UIAbout();
+ }
+ break;
+ case (KeyEvent.VK_B):
+ if (controlDown) {
+ ui.UISetBorder();
+ }
+ else
+ if (altDown) {
+ ui.UIToggleDrawBackbone();
+ }
+ break;
+ case (KeyEvent.VK_C):
+ if (shiftDown && controlDown) {
+ ui.UISetColorMapCaption();
+ }
+ break;
+ case (KeyEvent.VK_D):
+ if (controlDown) {
+ if (shiftDown) {
+ ui.UIPickGapsBasesColor();
+ } else {
+ ui.UIToggleColorGapsBases();
+ }
+ }
+ break;
+ case (KeyEvent.VK_E):
+ if (controlDown) {
+ ui.UIToggleShowNonPlanar();
+ }
+ break;
+ case (KeyEvent.VK_F):
+ if (controlDown) {
+ ui.UIToggleFlatExteriorLoop();
+ }
+ break;
+ case (KeyEvent.VK_G):
+ if (controlDown) {
+ ui.UISetBackground();
+ }
+ else if (!shiftDown && altDown) {
+ ui.UIToggleGaspinMode();
+ }
+ break;
+ case (KeyEvent.VK_H):
+ if (controlDown && !shiftDown) {
+ ui.UISetBPHeightIncrement();
+ }
+ else if (controlDown && shiftDown)
+ {
+ Point2D.Double p = _vp.getLastSelectedPosition();
+ ui.UIAnnotationsAddPosition((int)p.x,(int)p.y);
+ }
+ break;
+ case (KeyEvent.VK_J):
+ if (controlDown) {
+ if (shiftDown) {
+ ui.UIPickSpecialBasesColor();
+ } else {
+ ui.UIToggleColorSpecialBases();
+ }
+ }
+ break;
+ case (KeyEvent.VK_K):
+ if (controlDown && shiftDown) {
+ ui.UILoadColorMapValues();
+ }
+ else if (controlDown) {
+ ui.UISetBackboneColor();
+ }
+ break;
+ case (KeyEvent.VK_L):
+ if (shiftDown && controlDown) {
+ ui.UIToggleColorMap();
+ } else if (controlDown)
+ {
+ ui.UISetColorMapStyle();
+ } else if (shiftDown)
+ {
+ ui.UISetColorMapValues();
+ }
+ break;
+ case (KeyEvent.VK_M):
+ if (controlDown) {
+ ui.UISetNumPeriod();
+ } else if (shiftDown && altDown) {
+ ui.UIToggleModifiable();
+ }
+ break;
+ case (KeyEvent.VK_N):
+ if (controlDown) {
+ ui.UIManualInput();
+ }
+ break;
+ case (KeyEvent.VK_O):
+ if (controlDown) {
+ ui.UIFile();
+ }
+ break;
+ case (KeyEvent.VK_P):
+ if (controlDown && shiftDown) {
+ ui.UISetBPStyle();
+ }
+ else if (controlDown && !shiftDown) {
+ ui.UIPrint();
+ }
+ break;
+ case (KeyEvent.VK_Q):
+ if (controlDown && !shiftDown && !altDown) {
+ _vp.getVARNAUI().UIAutoAnnotateHelices();
+ }
+ else if (controlDown && shiftDown && !altDown) {
+ _vp.getVARNAUI().UIAutoAnnotateTerminalLoops();
+ }
+ else if (!controlDown && shiftDown && altDown) {
+ _vp.getVARNAUI().UIAutoAnnotateInteriorLoops();
+ }
+ else if (controlDown && !shiftDown && altDown) {
+ _vp.getVARNAUI().UIAutoAnnotateStrandEnds();
+ }
+ break;
+ case (KeyEvent.VK_R):
+ if (controlDown) {
+ if (shiftDown) {
+ ui.UIReset();
+ } else {
+ ui.UIGlobalRotation();
+ }
+ }
+ break;
+ case (KeyEvent.VK_S):
+ if (controlDown) {
+ if (shiftDown) {
+ ui.UISetSpaceBetweenBases();
+ } else {
+ ui.UISaveAs();
+ }
+ }
+ break;
+ case (KeyEvent.VK_T):
+ if (controlDown) {
+ if (shiftDown) {
+ ui.UISetTitleFont();
+ } else if (altDown) {
+ ui.UISetTitleColor();
+ } else {
+ ui.UISetTitle();
+ }
+ }
+ break;
+ case (KeyEvent.VK_U):
+ if (controlDown && !shiftDown && !altDown) {
+ _vp.getVARNAUI().UIBaseTypeColor();
+ } else if (!controlDown && shiftDown && !altDown) {
+ _vp.getVARNAUI().UIBasePairTypeColor();
+ } else if (!controlDown && !shiftDown && altDown) {
+ _vp.getVARNAUI().UIBaseAllColor();
+ }
+ break;
+ case (KeyEvent.VK_W):
+ if (controlDown) {
+ ui.UIToggleShowNCBP();
+ }
+ break;
+ case (KeyEvent.VK_X):
+ if (controlDown) {
+ ui.UIExport();
+ }
+ break;
+ case (KeyEvent.VK_Y):
+ if (controlDown) {
+ ui.UIRedo();
+ }
+ break;
+
+ case (KeyEvent.VK_Z):
+ if (controlDown && !shiftDown) {
+ ui.UIUndo();
+ }
+ else if (controlDown && shiftDown) {
+ ui.UIRedo();
+ }
+ else if (!controlDown && !shiftDown) {
+ ui.UICustomZoom();
+ }
+ break;
+ case (KeyEvent.VK_1):
+ if (controlDown) {
+ ui.UILine();
+ }
+ break;
+ case (KeyEvent.VK_2):
+ if (controlDown) {
+ ui.UICircular();
+ }
+ break;
+ case (KeyEvent.VK_3):
+ if (controlDown) {
+ ui.UIRadiate();
+ }
+ break;
+ case (KeyEvent.VK_4):
+ if (controlDown) {
+ ui.UINAView();
+ }
+ break;
+ case (KeyEvent.VK_5):
+ if (controlDown) {
+ ui.UIVARNAView();
+ }
+ break;
+ case (KeyEvent.VK_6):
+ if (controlDown) {
+ ui.UIMOTIFView();
+ }
+ break;
+
+ // Navigation control keys (Zoom in/out, arrow keys ...)
+ case (KeyEvent.VK_DOWN):
+ if (_vp.getZoom() > 1) {
+ _vp.setTranslation(new Point(_vp.getTranslation().x,_vp.getTranslation().y-5));
+ _vp.checkTranslation();
+ }
+ break;
+ case (KeyEvent.VK_UP):
+ if (_vp.getZoom() > 1) {
+ _vp.setTranslation(new Point(_vp.getTranslation().x,_vp.getTranslation().y+5));
+ _vp.checkTranslation();
+ }
+ break;
+ case (KeyEvent.VK_LEFT):
+ if (_vp.getZoom() > 1) {
+ _vp.setTranslation(new Point(_vp.getTranslation().x+5,_vp.getTranslation().y));
+ _vp.checkTranslation();
+ }
+ break;
+ case (KeyEvent.VK_RIGHT):
+ if (_vp.getZoom() > 1) {
+ _vp.setTranslation(new Point(_vp.getTranslation().x-5,_vp.getTranslation().y));
+ _vp.checkTranslation();
+ }
+ break;
+ case (KeyEvent.VK_EQUALS):
+ case (KeyEvent.VK_PLUS):
+ ui.UIZoomIn();
+ break;
+ case (KeyEvent.VK_MINUS):
+ ui.UIZoomOut();
+ break;
+ }
+ } catch (Exception e1) {
+ _vp.errorDialog(e1);
+ }
+ _vp.repaint();
+ }
+
+ /**
+ * if ((e.getKeyCode() == KeyEvent.VK_PLUS)||(e.getKeyChar() == '+')) {
+ * _vp.getVARNAUI().UIZoomIn(); } else if (e.getKeyCode() ==
+ * KeyEvent.VK_MINUS) { _vp.getVARNAUI().UIZoomOut(); } // 1 pour Redraw
+ * Radiate else if (e.getKeyChar() == KeyEvent.VK_1) {
+ * _vp.getVARNAUI().UIRadiate(); } // 2 pour Redraw Circular else if
+ * (e.getKeyChar() == KeyEvent.VK_2) { _vp.getVARNAUI().UICircular(); } // 3
+ * pour Redraw NAView else if (e.getKeyChar() == KeyEvent.VK_3) {
+ * _vp.getVARNAUI().UINAView(); }
+ *
+ * // 4 for RNA on a line else if (e.getKeyChar() == KeyEvent.VK_4) {
+ * _vp.getVARNAUI().UILine(); } // 5 fun arn random coord else if
+ * (e.isControlDown() && e.getKeyChar() == KeyEvent.VK_9) { for (int i = 0;
+ * i < _vp.getRNA().get_listeBases().size(); i++) {
+ * _vp.getRNA().get_listeBases().get(i).set_coords( new
+ * Point2D.Double(_vp.getWidth() * Math.random(), _vp.getHeight() *
+ * Math.random())); _vp.getRNA().get_listeBases().get(i).set_center( new
+ * Point2D.Double(_vp.getWidth() / 2 Math.random(), _vp.getHeight() / 2
+ * Math.random())); } } // 6 fun random arn structure else if
+ * (e.isControlDown() & e.getKeyChar() == KeyEvent.VK_8) { try {
+ * _vp.drawRNA(_vp.getRNA().getListeBasesToString(), getRandomRNA(), _vp
+ * .getRNA().get_drawMode()); } catch (ExceptionNonEqualLength e1) {
+ * _vp.errorDialog(e1); } } _vp.repaint(); }
+ **/
+
+ public String getRandomRNA() {
+ int pile = 0, j, i = 0;
+ double l;
+ String fun = "";
+ while (i < 2000) {
+ if (Math.random() > 0.5) {
+ j = 0;
+ l = Math.random() * 10;
+ while (j < l) {
+ fun += '.';
+ i++;
+ j++;
+ }
+ } else {
+ if (Math.random() > 0.5 && pile > 0) {
+ j = 0;
+ l = Math.random() * 5;
+ while (j < l && pile > 0) {
+ fun += ')';
+ pile--;
+ j++;
+ i++;
+ }
+ } else {
+ j = 0;
+ l = Math.random() * 5;
+ while (j < l) {
+ fun += '(';
+ pile++;
+ j++;
+ i++;
+ }
+
+ }
+ }
+ }
+ while (pile > 0) {
+ fun += ')';
+ pile--;
+ }
+ return fun;
+ }
+
+ public void keyReleased(KeyEvent e) {
+ }
+
+ public void keyTyped(KeyEvent e) {
+ }
+
+ public void focusGained(FocusEvent arg0) {
+ _vp.repaint();
+ }
+
+ public void focusLost(FocusEvent arg0) {
+ _vp.repaint();
+ }
+}
\ No newline at end of file