f8037593745d00e62de8d59a92221e3d4e0dbec1
[jalview.git] / src / jalview / javascript / JsSelectionSender.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
3  * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
10  *  
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.javascript;
19
20 import jalview.appletgui.AlignFrame;
21 import jalview.bin.JalviewLite;
22 import jalview.datamodel.ColumnSelection;
23 import jalview.datamodel.SequenceGroup;
24 import jalview.structure.SelectionSource;
25
26 public class JsSelectionSender extends JSFunctionExec implements
27         jalview.structure.SelectionListener, JsCallBack
28 {
29
30   AlignFrame _af;
31
32   String _listener;
33
34   public JsSelectionSender(JalviewLite jvlite, AlignFrame af,
35           String listener)
36   {
37     super(jvlite);
38     _af = af;
39     _listener = listener;
40   }
41
42   @Override
43   public void selection(SequenceGroup seqsel, ColumnSelection colsel,
44           SelectionSource source)
45   {
46     // System.err.println("Testing selection event relay to jsfunction:"+_listener);
47     try
48     {
49       String setid = "";
50       String viewid = "";
51       AlignFrame src = _af;
52       if (source != null)
53       {
54         if (source instanceof jalview.appletgui.AlignViewport
55                 && ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame.viewport == source)
56         {
57           // should be valid if it just generated an event!
58           src = ((jalview.appletgui.AlignViewport) source).applet.currentAlignFrame;
59
60         }
61       }
62       String[] seqs = new String[]
63       {};
64       String[] cols = new String[]
65       {};
66       int strt = 0, end = (src == null) ? -1 : src.alignPanel.av
67               .getAlignment().getWidth();
68       if (seqsel != null && seqsel.getSize() > 0)
69       {
70         seqs = new String[seqsel.getSize()];
71         for (int i = 0; i < seqs.length; i++)
72         {
73           seqs[i] = seqsel.getSequenceAt(i).getName();
74         }
75         if (strt < seqsel.getStartRes())
76         {
77           strt = seqsel.getStartRes();
78         }
79         if (end == -1 || end > seqsel.getEndRes())
80         {
81           end = seqsel.getEndRes();
82         }
83       }
84       if (colsel != null && colsel.size() > 0)
85       {
86         if (end == -1)
87         {
88           end = colsel.getMax() + 1;
89         }
90         cols = new String[colsel.getSelected().size()];
91         int d = 0, r = -1;
92         for (int i = 0; i < cols.length; i++)
93         {
94           cols[i] = ""
95                   + (1 + ((Integer) colsel.getSelected().elementAt(i))
96                           .intValue());
97         }
98       }
99       else
100       {
101         if (seqsel != null && seqsel.getSize() > 0)
102         {
103           // send a valid range, otherwise we send the empty selection
104           cols = new String[2];
105           cols[0] = "" + (1 + strt) + "-" + (1 + end);
106         }
107         ;
108
109       }
110       System.err.println("Relaying selection to jsfunction:" + _listener);
111       executeJavascriptFunction(
112               _listener,
113               new Object[]
114               { src, setid, jvlite.arrayToSeparatorList(seqs),
115                   jvlite.arrayToSeparatorList(cols) });
116     } catch (Exception ex)
117     {
118       System.err
119               .println("Jalview Javascript exec error: Couldn't send selection message using function '"
120                       + _listener + "'");
121       ex.printStackTrace();
122       if (ex instanceof netscape.javascript.JSException)
123       {
124         System.err.println("Javascript Exception: "
125                 + ((netscape.javascript.JSException) ex).getCause()
126                         .toString());
127       }
128
129     }
130   }
131
132   @Override
133   public AlignFrame getAlignFrame()
134   {
135     return _af;
136   }
137
138   @Override
139   public String getListenerFunction()
140   {
141     return _listener;
142   }
143
144 }