/* * Created on 28-May-2006 * * Copyright (c) 2006 P.J.Leonard * * http://www.frinika.com * * This file is part of Frinika. * * Frinika 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. * Frinika 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 Frinika; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.frinika.sequencer.model; import java.io.FileNotFoundException; import java.util.Vector; import com.frinika.project.ProjectContainer; import com.frinika.sequencer.gui.ItemPanel; /** * Action to split selected parts at a given tick. * * @author Paul * */ public class SplitPartAction implements EditHistoryAction { ProjectContainer project; ItemPanel panel; Vector<Part> victims; Vector<Part> newParts = null; long splitTick; public SplitPartAction(ProjectContainer project, long tick) { // victims are the existing parts to be split victims = new Vector<Part>(); splitTick = tick; for (Part part : project.getPartSelection().getSelected()) { Lane lane = part.getLane(); if (lane instanceof MidiLane || lane instanceof AudioLane) { if (part.getStartTick() < tick && part.getEndTick() > tick) victims.add(part); } } this.project = project; } public void undo() { for (Part part : newParts) { part.commitEventsRemove(); part.lane.parts.remove(part); } for (Part part : victims) { part.lane.parts.add(part); part.commitEventsAdd(); } project.getPartSelection().removeSelected(newParts); } public void redo() { // Save some resources if this is really a redo // if newParts is not null then we have already done the split and we really are redoing it if (newParts != null) { for (Part part : victims) { part.commitEventsRemove(); part.lane.parts.remove(part); } for (Part part : newParts) { ((MidiPart) part).commitEventsAdd(); // part.lane.parts.add(part); } return; } // Here if we are splitting for the first time newParts = new Vector<Part>(); // Part focus = project.getPartSelection().getFocus(); // Part fff=null; for (Part part : victims) { if (part instanceof MidiPart) midiPartRedo((MidiPart) part); else if (part instanceof AudioPart) audioPartRedo((AudioPart) part); } project.getPartSelection().removeSelected(victims); project.getPartSelection().addSelected(newParts); } void midiPartRedo(MidiPart part) { part.commitEventsRemove(); part.lane.parts.remove(part); MidiPart left = new MidiPart((MidiLane) part.getLane()); left.setStartTick(part.getStartTick()); left.setEndTick(splitTick); MidiPart right = new MidiPart((MidiLane) part.getLane()); right.setStartTick(splitTick); right.setEndTick(part.getEndTick()); // if (part == focus) fff=focus; newParts.add(left); newParts.add(right); MidiPart dst; for (MultiEvent ev : ((MidiPart) part).getMultiEvents()) { if (ev.getStartTick() < splitTick) dst = left; else dst = right; MultiEvent eNew = (MultiEvent) ev.deepCopy(dst); dst.getMultiEvents().add(eNew); } left.commitEventsAdd(); right.commitEventsAdd(); } void audioPartRedo(AudioPart part) { // part.commitEventsRemove(); part.lane.parts.remove(part); AudioPart left; left = (AudioPart) part.deepCopy(part.getLane()); left.getEvelope().setTFall(0); left.setStartTick(part.getStartTick()); left.setEndTick(splitTick); try { left.onLoad(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } AudioPart right = (AudioPart) part.deepCopy(part.getLane()); right.getEvelope().setTRise(0); right.setStartTick(splitTick); right.setEndTick(part.getEndTick()); try { right.onLoad(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // if (part == focus) fff=focus; newParts.add(left); newParts.add(right); // left.commitEventsAdd(); // right.commitEventsAdd(); } }