JAL-842; Text element containing the structure is not visible anymore
[jalview.git] / src / jalview / gui / AppVarna.java
index d1772c7..35e9d35 100644 (file)
 package jalview.gui;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.awt.*;
+
 import javax.swing.*;
 import javax.swing.event.*;
 
@@ -32,53 +35,130 @@ import jalview.gui.ViewSelectionMenu.ViewSetProvider;
 import jalview.structure.*;
 import jalview.io.*;
 import jalview.schemes.*;
+import fr.orsay.lri.varna.VARNAPanel;
+import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
+import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
+import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
+import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener;
+import fr.orsay.lri.varna.models.VARNAConfig;
+import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation;
+import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide;
+import fr.orsay.lri.varna.models.rna.ModeleStyleBP;
+import fr.orsay.lri.varna.models.rna.RNA;
+
 
-public class AppVarna extends JInternalFrame // implements Runnable,SequenceStructureBinding, ViewSetProvider
+public class AppVarna extends JInternalFrame implements InterfaceVARNAListener,SecondaryStructureListener// implements Runnable,SequenceStructureBinding, ViewSetProvider
 
 {
   AppVarnaBinding vab;
 
-  JPanel varnaPanel;
+  VARNAPanel varnaPanel;
   
-  String name;
-
-  //JSplitPane splitPane;
-
-  //RenderPanel renderPanel;
-
-  //AlignmentPanel ap;
-
-  //Vector atomsPicked = new Vector();
+  public String name;
   
-  public AppVarna(){
+  public StructureSelectionManager ssm;
+  
+  /*public AppVarna(){
          vab = new AppVarnaBinding(); 
          initVarna();
-  }
+  }*/
   
-  public AppVarna(String seq,String struc,String name){
-         vab = new AppVarnaBinding(seq,struc);
-         name=this.name;
-         initVarna();    
+  
+  public AppVarna(String seq,String struc,String name,AlignmentPanel ap){
+         ArrayList<RNA> rnaList = new ArrayList<RNA>();
+         RNA rna1 = new RNA(name);
+         try {
+                 rna1.setRNA(seq,replaceOddGaps(struc));
+         } catch (ExceptionUnmatchedClosingParentheses e2) {
+               e2.printStackTrace();
+         } catch (ExceptionFileFormatOrSyntax e3) {
+               e3.printStackTrace();
+         }
+         rnaList.add(trimRNA(rna1));     
+         rnaList.add(rna1);
+         rna1.setName("consenus_"+rna1.getName());
+         
+         
+         vab = new AppVarnaBinding(rnaList);
+         //vab = new AppVarnaBinding(seq,struc);
+         //System.out.println("Hallo: "+name);
+         this.name=name;
+         initVarna();
+      ssm = ap.getStructureSelectionManager();
+         ssm.addStructureViewerListener(this);
   }
   
   public void initVarna(){
-         //TODO: Why is it not possible to include varnaPanel in the AppVarna-Jframe?
          //vab.setFinishedInit(false);
          varnaPanel=vab.get_varnaPanel();
-         //varnaPanel.setVisible(true);
-         //getContentPane().setLayout(new BorderLayout());
-         //getContentPane().add(varnaPanel, BorderLayout.CENTER);
-         //setVisible(true);
-         //jalview.gui.Desktop.addInternalFrame(this,name,getBounds().width, getBounds().height);  
+         setBackground(Color.white);
+         JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,vab.getListPanel(),varnaPanel);
+         getContentPane().setLayout(new BorderLayout());
+         getContentPane().add(split, BorderLayout.CENTER);
+         //getContentPane().add(vab.getTools(), BorderLayout.NORTH);   
+         varnaPanel.addVARNAListener(this);
+         jalview.gui.Desktop.addInternalFrame(this,"VARNA -"+name,getBounds().width, getBounds().height);
+         this.pack();
          showPanel(true);
   }
   
+  public String replaceOddGaps(String oldStr){
+         String patternStr = "[^([{<>}])]";
+      String replacementStr = ".";
+      Pattern pattern = Pattern.compile(patternStr);
+      Matcher matcher = pattern.matcher(oldStr);
+      String newStr=matcher.replaceAll(replacementStr);
+         return newStr;
+  }
+  
+  public RNA trimRNA(RNA rna){
+         RNA rnaTrim = new RNA("trim_"+rna.getName());
+         try {
+                 rnaTrim.setRNA(rna.getSeq(),replaceOddGaps(rna.getStructDBN()));
+         } catch (ExceptionUnmatchedClosingParentheses e2) {
+               e2.printStackTrace();
+         } catch (ExceptionFileFormatOrSyntax e3) {
+               e3.printStackTrace();
+         }
+
+         StringBuffer seq=new StringBuffer(rnaTrim.getSeq());
+         StringBuffer struc=new StringBuffer(rnaTrim.getStructDBN());
+         for(int i=0;i<rnaTrim.getSeq().length();i++){
+                 //TODO: Jalview utility for gap detection java.utils.isGap()
+                 //TODO: Switch to jalview rna datamodel
+                 if(seq.substring(i, i+1).compareTo("-")==0 || seq.substring(i, i+1).compareTo(".")==0){
+                         if(!rnaTrim.findPair(i).isEmpty()){
+                                 int m=rnaTrim.findPair(i).get(1);
+                                 int l=rnaTrim.findPair(i).get(0);
+                                 
+                                 struc.replace(m, m+1, "*");
+                                 struc.replace(l, l+1, "*");
+                         }else{
+                                 struc.replace(i, i+1, "*");
+                         }
+                 }
+         }
+        
+         String newSeq=rnaTrim.getSeq().replace("-", "");
+         rnaTrim.getSeq().replace(".", "");
+         String newStruc=struc.toString().replace("*", "");
+
+         try {
+               rnaTrim.setRNA(newSeq,newStruc);
+         } catch (ExceptionUnmatchedClosingParentheses e) {
+               // TODO Auto-generated catch block
+               e.printStackTrace();
+         } catch (ExceptionFileFormatOrSyntax e) {
+               // TODO Auto-generated catch block
+               e.printStackTrace();
+         }
+         
+         return rnaTrim;
+  }
+
   public void showPanel(boolean show){
-         vab.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-         vab.pack();
-         vab.setVisible(show);
-           
-         //varnaPanel.setVisible(show);
+         this.setVisible(show);
   }
   
   private boolean _started = false;
@@ -97,6 +177,48 @@ public class AppVarna extends JInternalFrame // implements Runnable,SequenceStru
         Cache.log.error("Couldn't open Varna viewer!", ex);
       }
   }
-  
+
+@Override
+public void onLayoutChanged() {
+       // TODO Auto-generated method stub
+       
+}
+
+@Override
+public void onUINewStructure(VARNAConfig v, RNA r) {
+       // TODO Auto-generated method stub
+       
+}
+
+@Override
+public void onWarningEmitted(String s) {
+       // TODO Auto-generated method stub
+       
+}
+/**
+ * If a mouseOver event from the AlignmentPanel 
+ * is noticed the currently selected RNA in the 
+ * VARNA window is highlighted at the specific position. 
+ * To be able to remove it before the next highlight
+ * it is saved in _lastHighlight
+ */
+private  HighlightRegionAnnotation _lastHighlight;
+@Override
+public void mouseOverSequence(SequenceI sequence, int index) {
+       // TODO Auto-generated method stub
+       RNA rna=vab.getSelectedRNA();
+       rna.removeHighlightRegion(_lastHighlight);
+       
+       HighlightRegionAnnotation highlight = new HighlightRegionAnnotation(rna.getBasesBetween(index,index));
+       rna.addHighlightRegion(highlight);
+       _lastHighlight=highlight;
+       vab.updateSelectedRNA(rna);
+}
+
+@Override
+public void mouseOverStructure(int atomIndex, String strInfo) {
+       // TODO Auto-generated method stub
+       
+}
 
 }