/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.commands; import jalview.datamodel.*; /** * *

Title: EditCommmand

* *

Description: Essential information for performing * undo and redo for cut/paste insert/delete gap * which can be stored in the HistoryList

* *

Copyright: Copyright (c) 2006

* *

Company: Dundee University

* * @author not attributable * @version 1.0 */ public class EditCommand implements CommandI { public static String INSERT_GAP = "InsertGap"; public static String DELETE_GAP = "DeleteGap"; public static String CUT = "Cut"; public static String PASTE = "Paste"; Edit[] edits; String description; public EditCommand() {} public EditCommand(String description) { this.description = description; } public EditCommand(String description, String command, SequenceI[] seqs, int position, int number, char gapChar) { this.description = description; if (command.equalsIgnoreCase(INSERT_GAP) || command.equalsIgnoreCase(DELETE_GAP)) { edits = new Edit[] { new Edit(command, seqs, position, number, gapChar)}; } performEdit(0); } public EditCommand( String description, String command, SequenceI[] seqs, int position, int number, AlignmentI al) { this.description = description; if ( command.equalsIgnoreCase(CUT) || command.equalsIgnoreCase(PASTE)) { edits = new Edit[]{new Edit(command, seqs, position, number, al)}; } performEdit(0); } public String getDescription() { return description; } public int getSize() { return edits==null?0:edits.length; } public void appendEdit(String command, SequenceI[] seqs, int position, int number, char gapChar, boolean performEdit) { Edit edit = new Edit(command, seqs, position, number, gapChar); if (edits != null) { Edit[] temp = new Edit[edits.length + 1]; System.arraycopy(edits, 0, temp, 0, edits.length); edits = temp; edits[edits.length - 1] = edit; } else edits = new Edit[] { edit }; if (performEdit) performEdit(edits.length - 1); } void performEdit(int commandIndex) { int eSize = edits.length; for (int e = commandIndex; e < eSize; e++) { if (edits[e].command.equals(INSERT_GAP)) { insertGap(edits[e]); } else if (edits[e].command.equals(DELETE_GAP)) { deleteGap(edits[e]); } else if(edits[e].command.equals(CUT)) { cut(edits[e]); } else if(edits[e].command.equals(PASTE)) { paste(edits[e]); } } } public void doCommand() { performEdit(0); } public void undoCommand() { int e = 0, eSize = edits.length; for (e = eSize-1; e > -1; e--) { if (edits[e].command.equals(INSERT_GAP)) { deleteGap(edits[e]); } else if (edits[e].command.equals(DELETE_GAP)) { insertGap(edits[e]); } else if (edits[e].command.equals(CUT)) { paste(edits[e]); } else if (edits[e].command.equals(PASTE)) { cut(edits[e]); } } } void insertGap(Edit command) { for(int s=0; s