Commands which can be done, or undone
[jalview.git] / src / jalview / commands / TrimRegionCommand.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.commands;\r
20 \r
21 import jalview.util.ShiftList;\r
22 \r
23 import jalview.datamodel.*;\r
24 \r
25 public class TrimRegionCommand\r
26     extends EditCommand\r
27 {\r
28   public static String TRIM_LEFT = "TrimLeft";\r
29   public static String TRIM_RIGHT = "TrimRight";\r
30 \r
31   public ColumnSelection colSel = null;\r
32 \r
33   int [] start;\r
34 \r
35   public TrimRegionCommand(String description,\r
36                      String command,\r
37                      SequenceI[] seqs,\r
38                      int column,\r
39                      AlignmentI al,\r
40                      ColumnSelection colSel)\r
41   {\r
42     this.description = description;\r
43     if (command.equalsIgnoreCase(TRIM_LEFT))\r
44     {\r
45       edits = new Edit[] { new Edit(CUT, seqs, 0, column, al)};\r
46       this.colSel = colSel;\r
47     }\r
48     else if (command.equalsIgnoreCase(TRIM_RIGHT))\r
49     {\r
50       edits = new Edit[]\r
51           { new Edit(CUT, seqs, column+1, al.getWidth() - column, al)};\r
52     }\r
53 \r
54     //We need to keep a record of the sequence start\r
55     //in order to restore the state after a redo\r
56     int i, isize = edits[0].seqs.length;\r
57     start = new int[isize];\r
58     for(i=0; i<isize; i++)\r
59       start[i] = edits[0].seqs[i].getStart();\r
60 \r
61     performEdit(0);\r
62   }\r
63 \r
64   void cut(Edit command)\r
65   {\r
66     int column, j, jSize = command.seqs.length;\r
67     for (j = 0; j < jSize; j++)\r
68     {\r
69       if(command.position==0)\r
70       {\r
71         column = command.seqs[j].findPosition(command.number);\r
72         command.seqs[j].setStart(column);\r
73       }\r
74       else\r
75       {\r
76         column = command.seqs[j].findPosition(command.position)-1;\r
77         command.seqs[j].setEnd(column);\r
78       }\r
79     }\r
80     super.cut(command);\r
81   }\r
82 \r
83   void paste(Edit command)\r
84   {\r
85     super.paste(command);\r
86     int column, j, jSize = command.seqs.length;\r
87     for (j = 0; j < jSize; j++)\r
88     {\r
89       if(command.position==0)\r
90       {\r
91         command.seqs[j].setStart(start[j]);\r
92       }\r
93       else\r
94       {\r
95         column = command.seqs[j]\r
96             .findPosition(command.number+command.position)-1;\r
97         command.seqs[j].setEnd(column);\r
98       }\r
99     }\r
100 \r
101     if(command.position==0)\r
102     {\r
103       ShiftList slist = new ShiftList();\r
104       slist.addShift(0, -command.number);\r
105       colSel.compensateForEdits(slist);\r
106     }\r
107   }\r
108 \r
109 }\r