2 * This file is part of the Vamsas Client version 0.2.
\r
3 * Copyright 2010 by Jim Procter, Iain Milne, Pierre Marguerite,
\r
4 * Andrew Waterhouse and Dominik Lindner.
\r
6 * Earlier versions have also been incorporated into Jalview version 2.4
\r
7 * since 2008, and TOPALi version 2 since 2007.
\r
9 * The Vamsas Client is free software: you can redistribute it and/or modify
\r
10 * it under the terms of the GNU Lesser General Public License as published by
\r
11 * the Free Software Foundation, either version 3 of the License, or
\r
12 * (at your option) any later version.
\r
14 * The Vamsas Client is distributed in the hope that it will be useful,
\r
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
17 * GNU Lesser General Public License for more details.
\r
19 * You should have received a copy of the GNU Lesser General Public License
\r
20 * along with the Vamsas Client. If not, see <http://www.gnu.org/licenses/>.
\r
22 package uk.ac.vamsas.client.picking;
\r
24 import uk.ac.vamsas.objects.core.Input;
\r
25 import uk.ac.vamsas.objects.core.Pos;
\r
26 import uk.ac.vamsas.objects.core.RangeType;
\r
27 import uk.ac.vamsas.objects.core.Seg;
\r
30 * Send and receive details about vamsas object selections and selection ranges
\r
31 * defined on one or more objects.
\r
33 * @author J.B. Procter
\r
36 public class SelectionMessage extends Message {
\r
37 private String selectionID;
\r
39 private String[] vorbaIDs;
\r
43 private boolean none = false;
\r
46 * parse a message payload as a selection message
\r
50 public SelectionMessage(String str) {
\r
52 // Parse message into ...
\r
53 String[] elements = str.split("\t");
\r
54 String positions[] = null, segs[] = null;
\r
55 for (int i = 0; i < elements.length; i++) {
\r
56 if (elements[i].startsWith("selectionID="))
\r
57 selectionID = elements[i].substring(12);
\r
58 if (elements[i].startsWith("vorbaIDs="))
\r
59 vorbaIDs = elements[i].substring(9).split("\\|");
\r
60 if (elements[i].startsWith("positions=")) {
\r
61 positions = elements[i].substring(10).split(",");
\r
63 if (elements[i].startsWith("ranges=")) {
\r
64 segs = elements[i].substring(7).split(",");
\r
66 if (elements[i].equals("none")) {
\r
74 if (positions != null) {
\r
75 ranges = new Input();
\r
76 for (int i = 0; i < positions.length; i++) {
\r
79 p.setI(Integer.parseInt(positions[i]));
\r
81 } catch (Exception e) {
\r
82 // invalid message - ignore element
\r
85 } else if (segs != null) {
\r
86 ranges = new Input();
\r
87 for (int i = 0; i < segs.length; i += 2) {
\r
89 s.setInclusive(segs[i].startsWith("["));
\r
91 s.setStart(Integer.parseInt(segs[i].substring(1)));
\r
92 s.setEnd(Integer.parseInt(segs[i + 1]));
\r
94 } catch (Exception e) {
\r
95 // invalid message - again ignore element
\r
103 * create a new selection message
\r
105 * @param selectionID
\r
106 * - (may be null) optional handle (or ID) to refer to selection by
\r
108 * - one or more objects to be selected, or null for the empty
\r
111 * optional rangetype specifying positions or intervals over
\r
112 * object(s) coordinate system.
\r
114 public SelectionMessage(String selectionID, String[] vorbaIDs,
\r
115 RangeType ranges) {
\r
116 this(selectionID, vorbaIDs, ranges, false);
\r
119 public SelectionMessage(String selectionID, String[] vorbaIDs,
\r
120 RangeType ranges, boolean none) {
\r
122 this.selectionID = selectionID;
\r
123 if (selectionID != null && selectionID.indexOf("\t") > -1) {
\r
125 "VAMSAS Selection Messages are not allowed to have Tab Characters in their selection ID");
\r
127 this.vorbaIDs = vorbaIDs;
\r
128 this.ranges = ranges;
\r
130 StringBuffer message = new StringBuffer();
\r
131 message.append("SELECTION\t");
\r
132 if (selectionID != null) {
\r
133 message.append("selectionID=" + selectionID);
\r
134 message.append("\t");
\r
136 message.append("vorbaIDs=");
\r
137 for (int ids = 0; ids < vorbaIDs.length; ids++) {
\r
139 message.append("|");
\r
141 if (vorbaIDs[ids] == null) {
\r
142 throw new Error("null vorbaID in SelectionMessage ID vector.(" + ids
\r
145 if (vorbaIDs[ids].indexOf("\t") > -1) {
\r
147 "Invalid vorbaID string in SelectionMessage ID vector. ("
\r
148 + vorbaIDs[ids] + ")");
\r
150 message.append(vorbaIDs[ids]);
\r
153 // must have only IDs for the selection or the selection scope - no range
\r
154 if (ranges != null) {
\r
155 throw new Error("Empty selection cannot specify a range.");
\r
157 if ((selectionID == null || selectionID.length() == 0)
\r
158 && (vorbaIDs == null || vorbaIDs.length == 0)) {
\r
160 "Empty selection must have at least a selection ID or at least one vorbaID indicating selection scope.");
\r
162 message.append("none\n");
\r
163 this.message = message.toString();
\r
166 // Verify that the range has at least one valid vorbaID for it to be defined
\r
168 if (vorbaIDs == null || vorbaIDs.length == 0) {
\r
170 "You must specify at least one vorbaID for the selection.");
\r
172 if (ranges != null) {
\r
173 if (ranges.getPosCount() > 0) {
\r
174 message.append("\tpositions=");
\r
175 Pos[] pos = ranges.getPos();
\r
176 for (int p = 0; p < pos.length; p++) {
\r
178 message.append(",");
\r
180 message.append(pos[p].getI());
\r
182 } else if (ranges.getSegCount() > 0) {
\r
183 message.append("\tranges=");
\r
184 Seg[] rng = ranges.getSeg();
\r
185 for (int p = 0; p < rng.length; p++) {
\r
186 boolean inc = rng[p].getInclusive();
\r
188 message.append(",");
\r
191 message.append("[");
\r
193 message.append("(");
\r
195 message.append(rng[p].getStart());
\r
196 message.append(",");
\r
197 message.append(rng[p].getEnd());
\r
201 message.append("\n");
\r
202 this.message = message.toString();
\r
206 * @return the selectionID
\r
208 public String getSelectionID() {
\r
209 return selectionID;
\r
213 * @return the vorbaIDs
\r
215 public String[] getVorbaIDs() {
\r
220 * @return the ranges
\r
222 public RangeType getRanges() {
\r
229 public boolean isNone() {
\r