package org.herac.tuxguitar.gui.undo.undoables.track; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.undo.CannotRedoException; import org.herac.tuxguitar.gui.undo.CannotUndoException; import org.herac.tuxguitar.gui.undo.UndoableEdit; import org.herac.tuxguitar.gui.undo.undoables.UndoableCaretHelper; import org.herac.tuxguitar.song.models.TGTrack; public class UndoableTrackGeneric implements UndoableEdit { private class RedoTrack { private TGTrack track; public RedoTrack(TGTrack track) { if (track != null) { this.track = track.clone(TuxGuitar.instance().getSongManager() .getSong()); } } public void redo() { if (this.track != null) { while (TuxGuitar.instance().getSongManager().getSong() .countMeasureHeaders() < this.track.countMeasures()) { TuxGuitar.instance().getSongManager().addNewMeasureBeforeEnd(); } while (TuxGuitar.instance().getSongManager().getSong() .countMeasureHeaders() > this.track.countMeasures()) { TuxGuitar.instance().getSongManager().removeLastMeasureHeader(); } TuxGuitar.instance().getSongManager().replaceTrack(this.track); TuxGuitar.instance().fireUpdate(); TuxGuitar.instance().getMixer().update(); } } } private class UndoTrack { private TGTrack track; public UndoTrack(TGTrack track) { if (track != null) { this.track = track.clone(TuxGuitar.instance().getSongManager() .getSong()); } } public void undo() { if (this.track != null) { while (TuxGuitar.instance().getSongManager().getSong() .countMeasureHeaders() < this.track.countMeasures()) { TuxGuitar.instance().getSongManager().addNewMeasureBeforeEnd(); } while (TuxGuitar.instance().getSongManager().getSong() .countMeasureHeaders() > this.track.countMeasures()) { TuxGuitar.instance().getSongManager().removeLastMeasureHeader(); } TuxGuitar.instance().getSongManager().replaceTrack(this.track); TuxGuitar.instance().fireUpdate(); TuxGuitar.instance().getMixer().update(); } } } public static UndoableTrackGeneric startUndo(TGTrack track) { UndoableTrackGeneric undoable = new UndoableTrackGeneric(); undoable.doAction = UNDO_ACTION; undoable.undoCaret = new UndoableCaretHelper(); undoable.undoTrack = undoable.new UndoTrack(track); return undoable; } private int doAction; private UndoableCaretHelper redoCaret; private RedoTrack redoTrack; private UndoableCaretHelper undoCaret; private UndoTrack undoTrack; private UndoableTrackGeneric() { super(); } public boolean canRedo() { return (this.doAction == REDO_ACTION); } public boolean canUndo() { return (this.doAction == UNDO_ACTION); } public UndoableTrackGeneric endUndo(TGTrack track) { this.redoCaret = new UndoableCaretHelper(); this.redoTrack = new RedoTrack(track); return this; } public void redo() throws CannotRedoException { if (!canRedo()) { throw new CannotRedoException(); } this.redoTrack.redo(); this.redoCaret.update(); this.doAction = UNDO_ACTION; } public void undo() throws CannotUndoException { if (!canUndo()) { throw new CannotUndoException(); } this.undoTrack.undo(); this.undoCaret.update(); this.doAction = REDO_ACTION; } }