X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fmodels%2FVARNAEdits.java;fp=srcjar%2Ffr%2Forsay%2Flri%2Fvarna%2Fmodels%2FVARNAEdits.java;h=bf6823af3436ffaca984c929b68b7fb172934a34;hb=4f30214e8098748469c6a4269ac2ed6c5750e4b0;hp=0000000000000000000000000000000000000000;hpb=9dabc02511e3a334a5749a504f57f69d6c9017bd;p=jalview.git diff --git a/srcjar/fr/orsay/lri/varna/models/VARNAEdits.java b/srcjar/fr/orsay/lri/varna/models/VARNAEdits.java new file mode 100644 index 0000000..bf6823a --- /dev/null +++ b/srcjar/fr/orsay/lri/varna/models/VARNAEdits.java @@ -0,0 +1,403 @@ +package fr.orsay.lri.varna.models; + +import java.awt.Point; +import java.awt.geom.Point2D; +import java.util.ArrayList; + +import javax.swing.undo.AbstractUndoableEdit; +import javax.swing.undo.CannotRedoException; +import javax.swing.undo.CannotUndoException; +import javax.swing.undo.UndoableEdit; + +import fr.orsay.lri.varna.VARNAPanel; +import fr.orsay.lri.varna.applications.templateEditor.GraphicalTemplateElement; +import fr.orsay.lri.varna.applications.templateEditor.TemplatePanel; +import fr.orsay.lri.varna.applications.templateEditor.TemplateEdits.ElementEdgeMoveTemplateEdit; +import fr.orsay.lri.varna.exceptions.ExceptionNAViewAlgorithm; +import fr.orsay.lri.varna.models.rna.ModeleBase; +import fr.orsay.lri.varna.models.rna.ModeleBP; +import fr.orsay.lri.varna.models.rna.RNA; + +public class VARNAEdits { + public static final double MAX_DISTANCE= 55.0; + public static class BasesShiftEdit extends AbstractUndoableEdit + { + private ArrayList _indices; + private double _dx; + private double _dy; + private VARNAPanel _vp; + public BasesShiftEdit(ArrayList indices, double dx, double dy, VARNAPanel p) + { + _indices = indices; + _dx = dx; + _dy = dy; + _vp = p; + } + public void undo() throws CannotUndoException { + for (int index: _indices) + { + ModeleBase mb = _vp.getRNA().getBaseAt(index); + _vp.getRNA().setCoord(index,new Point2D.Double(mb.getCoords().x-_dx,mb.getCoords().y-_dy)); + _vp.getRNA().setCenter(index,new Point2D.Double(mb.getCenter().x-_dx,mb.getCenter().y-_dy)); + } + _vp.repaint(); + } + public void redo() throws CannotRedoException { + for (int index: _indices) + { + ModeleBase mb = _vp.getRNA().getBaseAt(index); + _vp.getRNA().setCoord(index,new Point2D.Double(mb.getCoords().x+_dx,mb.getCoords().y+_dy)); + _vp.getRNA().setCenter(index,new Point2D.Double(mb.getCenter().x-_dx,mb.getCenter().y-_dy)); + } + _vp.repaint(); + } + public boolean canUndo() { return true; } + public boolean canRedo() { return true; } + public String getPresentationName() { return "Base #"+_indices+" shifted"; } + public boolean addEdit(UndoableEdit anEdit) + { + if (anEdit instanceof BasesShiftEdit) + { + BasesShiftEdit e = (BasesShiftEdit) anEdit; + if (e._indices.equals(_indices)) + { + Point2D.Double tot = new Point2D.Double(_dx+e._dx,_dy+e._dy); + if (tot.distance(0.0, 0.0)Math.PI) + { totAngle -= 2.0*Math.PI; } + if (Math.abs(totAngle).7 || cumFact<1.3) + { + _factor *= e._factor; + return true; + } + } + return false; + } + }; + + public static class RotateRNAEdit extends AbstractUndoableEdit + { + private double _angle; + private VARNAPanel _vp; + public RotateRNAEdit( double angle, VARNAPanel vp) + { + _angle = angle; + _vp = vp; + } + public void undo() throws CannotUndoException { + _vp.getRNA().globalRotation(-_angle); + _vp.repaint(); + } + public void redo() throws CannotRedoException { + _vp.getRNA().globalRotation(_angle); + _vp.repaint(); + } + public boolean canUndo() { return true; } + public boolean canRedo() { return true; } + public String getPresentationName() { return "Rotate RNA angle:"+_angle+"";} + public boolean addEdit(UndoableEdit anEdit) + { + if (anEdit instanceof RotateRNAEdit) + { + RotateRNAEdit e = (RotateRNAEdit) anEdit; + if (Math.abs(_angle+e._angle)<30) + { + _angle += e._angle; + return true; + } + } + return false; + } + }; + + public static class RedrawEdit extends AbstractUndoableEdit + { + private int _prevMode; + private int _newMode; + private boolean _prevFlat; + private boolean _newFlat; + private ArrayList _backupCoords = new ArrayList(); + private ArrayList _backupCenters = new ArrayList(); + private VARNAPanel _vp; + + + public RedrawEdit(VARNAPanel vp,boolean newFlat) + { + this(vp.getRNA().getDrawMode(),vp,newFlat); + } + + public RedrawEdit(int newMode, VARNAPanel vp) + { + this(newMode,vp,vp.getFlatExteriorLoop()); + } + + public RedrawEdit(int newMode, VARNAPanel vp, boolean newFlat) + { + _vp = vp; + _newMode = newMode; + _newFlat = newFlat; + _prevFlat = _vp.getFlatExteriorLoop(); + for (ModeleBase mb: _vp.getRNA().get_listeBases()) + { + _backupCoords.add(new Point2D.Double(mb.getCoords().x,mb.getCoords().y)); + _backupCenters.add(new Point2D.Double(mb.getCenter().x,mb.getCenter().y)); + } + _prevMode = _vp.getDrawMode(); + } + public void undo() throws CannotUndoException { + RNA r = _vp.getRNA(); + _vp.setFlatExteriorLoop(_prevFlat); + r.setDrawMode(_prevMode); + for (int index =0;index<_vp.getRNA().get_listeBases().size();index++) + { + Point2D.Double oldCoord = _backupCoords.get(index); + Point2D.Double oldCenter = _backupCenters.get(index); + r.setCoord(index, oldCoord); + r.setCenter(index, oldCenter); + } + _vp.repaint(); + } + public void redo() throws CannotRedoException { + try { + _vp.setFlatExteriorLoop(_newFlat); + _vp.getRNA().drawRNA(_newMode,_vp.getConfig()); + } catch (ExceptionNAViewAlgorithm e) { + e.printStackTrace(); + } + _vp.repaint(); + } + public boolean canUndo() { return true; } + public boolean canRedo() { return true; } + public String getPresentationName() { return "Redraw whole RNA";} + public boolean addEdit(UndoableEdit anEdit) + { + return false; + } + }; + +}