X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAppVarna.java;h=daa0beae83ad0ce9234a17f1531d9284e5b672c1;hb=8f3cf5f09e970ac6e5d9032c03ec29f69fb4b356;hp=3a67e10f469e04dc8e9a6af9a236f5bb18ba6ba3;hpb=1b277fdca45c13f59c3887780f14a37bb1beeb60;p=jalview.git diff --git a/src/jalview/gui/AppVarna.java b/src/jalview/gui/AppVarna.java index 3a67e10..daa0bea 100644 --- a/src/jalview/gui/AppVarna.java +++ b/src/jalview/gui/AppVarna.java @@ -1,6 +1,6 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) - * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * @@ -18,7 +18,10 @@ 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,29 +35,164 @@ import jalview.gui.ViewSelectionMenu.ViewSetProvider; import jalview.structure.*; import jalview.io.*; import jalview.schemes.*; +import jalview.util.ShiftList; +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.interfaces.InterfaceVARNASelectionListener; +import fr.orsay.lri.varna.models.BaseList; +import fr.orsay.lri.varna.models.VARNAConfig; +import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation; +import fr.orsay.lri.varna.models.rna.ModeleBase; +import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide; +import fr.orsay.lri.varna.models.rna.RNA; + -public class AppVarna extends JInternalFrame // implements Runnable,SequenceStructureBinding, ViewSetProvider +public class AppVarna extends JInternalFrame implements InterfaceVARNAListener,SelectionListener, SecondaryStructureListener// implements Runnable,SequenceStructureBinding, ViewSetProvider +, InterfaceVARNASelectionListener, VamsasSource { AppVarnaBinding vab; - JPanel scriptWindow; - - JSplitPane splitPane; + VARNAPanel varnaPanel; + + public String name; + + public StructureSelectionManager ssm; + + /*public AppVarna(){ + vab = new AppVarnaBinding(); + initVarna(); + }*/ + + + public AppVarna(SequenceI seq,String strucseq, String struc,String name,AlignmentPanel ap){ + ArrayList rnaList = new ArrayList(); + RNA rna1 = new RNA(name); + try { + rna1.setRNA(strucseq,replaceOddGaps(struc)); + } catch (ExceptionUnmatchedClosingParentheses e2) { + e2.printStackTrace(); + } catch (ExceptionFileFormatOrSyntax e3) { + e3.printStackTrace(); + } + RNA trim=trimRNA(rna1); + rnaList.add(trim); + rnaList.add(rna1); + rna1.setName("consensus_"+rna1.getName()); + + { + this.seqs.put(trim, seq); + this.seqs.put(rna1, seq); + } + vab = new AppVarnaBinding(rnaList); + //vab = new AppVarnaBinding(seq,struc); + //System.out.println("Hallo: "+name); + this.name=name; + initVarna(); + ssm = ap.getStructureSelectionManager(); + ssm.addStructureViewerListener(this); + ssm.addSelectionListener(this); + } + + public void initVarna(){ + //vab.setFinishedInit(false); + varnaPanel=vab.get_varnaPanel(); + 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); + varnaPanel.addSelectionListener(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){ + ShiftList offset=new ShiftList(); + 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(); + } - //RenderPanel renderPanel; + StringBuffer seq=new StringBuffer(rnaTrim.getSeq()); + StringBuffer struc=new StringBuffer(rnaTrim.getStructDBN()); + int ofstart=-1,sleng=rnaTrim.getSeq().length(); + for(int i=0;i-1) + { + offset.addShift(ofstart, ofstart-i); + ofstart=-1; + } + } + } + // final gap + if (ofstart>-1) + { + offset.addShift(ofstart, ofstart-sleng); + ofstart=-1; + } + String newSeq=rnaTrim.getSeq().replace("-", ""); + rnaTrim.getSeq().replace(".", ""); + String newStruc=struc.toString().replace("*", ""); - AlignmentPanel ap; + try { + rnaTrim.setRNA(newSeq,newStruc); + registerOffset(rnaTrim,offset); + } catch (ExceptionUnmatchedClosingParentheses e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ExceptionFileFormatOrSyntax e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return rnaTrim; + } + Map seqs=new Hashtable(); + Map offsets=new Hashtable(); + Map offsetsInv=new Hashtable(); + private void registerOffset(RNA rnaTrim, ShiftList offset) + { + offsets.put(rnaTrim, offset); + offsetsInv.put(rnaTrim,offset.getInverse()); + } - Vector atomsPicked = new Vector(); - - void initVarna(){ - //vab.setFinishedInit(false); - //renderPanel = new RenderPanel(); - // TODO: consider waiting until the structure/view is fully loaded before - // displaying - //this.getContentPane().add(renderPanel, java.awt.BorderLayout.CENTER); - jalview.gui.Desktop.addInternalFrame(this,"test",300,300); + public void showPanel(boolean show){ + this.setVisible(show); } private boolean _started = false; @@ -73,6 +211,114 @@ public class AppVarna extends JInternalFrame // implements Runnable,SequenceStru Cache.log.error("Couldn't open Varna viewer!", ex); } } + +@Override +public void onUINewStructure(VARNAConfig v, RNA r) { + +} + +@Override +public void onWarningEmitted(String s) { + // TODO Auto-generated method stub + +} +private class VarnaHighlighter { + private HighlightRegionAnnotation _lastHighlight; + private RNA _lastRNAhighlighted=null; + public void highlightRegion(RNA rna, int start,int end) + { + if (_lastRNAhighlighted!=null) + { + _lastRNAhighlighted.removeHighlightRegion(_lastHighlight); + } + HighlightRegionAnnotation highlight = new HighlightRegionAnnotation(rna.getBasesBetween(start,end)); + rna.addHighlightRegion(highlight); + _lastHighlight=highlight; + _lastRNAhighlighted=rna; + + } + public HighlightRegionAnnotation getLastHighlight() { + return _lastHighlight; + } + public RNA getLastRNA() + { + return _lastRNAhighlighted; + } +} +VarnaHighlighter mouseOverHighlighter=new VarnaHighlighter(), +selectionHighlighter=new VarnaHighlighter(); +/** + * 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 + */ +@Override +public void mouseOverSequence(SequenceI sequence, int index) { + RNA rna=vab.getSelectedRNA(); + ShiftList shift=offsets.get(rna); + if (shift!=null) + { + index=shift.shift(index); + } + mouseOverHighlighter.highlightRegion(rna, index, index); + vab.updateSelectedRNA(rna); +} + +@Override +public void mouseOverStructure(int atomIndex, String strInfo) { + // TODO Auto-generated method stub + +} + +@Override +public void onStructureRedrawn() +{ + // TODO Auto-generated method stub + +} + +@Override +public void selection(SequenceGroup seqsel, ColumnSelection colsel, + SelectionSource source) +{ + int start=seqsel.getStartRes(),end=seqsel.getEndRes(); + RNA rna=vab.getSelectedRNA(); + ShiftList shift=offsets.get(rna); + if (shift!=null) + { + start=shift.shift(start); + end=shift.shift(end); + } + selectionHighlighter.highlightRegion(rna, start, end); + selectionHighlighter.getLastHighlight().setOutlineColor(seqsel.getOutlineColour()); + vab.updateSelectedRNA(rna); +} + +@Override +public void onHoverChanged(ModeleBase arg0, ModeleBase arg1) +{ + RNA rna=vab.getSelectedRNA(); + ShiftList shift=offsetsInv.get(rna); + SequenceI seq=seqs.get(rna); + if (arg1!=null && seq!=null) + { + if (shift!=null) + { + ssm.mouseOverVamsasSequence(seq, seq.findIndex(arg1.getIndex()), this); + } else { + ssm.mouseOverVamsasSequence(seq, arg1.getIndex(), this); + } + } +} + +@Override +public void onSelectionChanged(BaseList arg0, BaseList arg1, BaseList arg2) +{ + // TODO Auto-generated method stub +} + }