~ubuntu-branches/ubuntu/oneiric/tuxguitar/oneiric

« back to all changes in this revision

Viewing changes to TuxGuitar/src/org/herac/tuxguitar/song/helpers/TGSongSegmentHelper.java

  • Committer: Bazaar Package Importer
  • Author(s): Philippe Coval
  • Date: 2008-06-19 00:30:30 UTC
  • mfrom: (1.1.1 upstream) (2.1.3 hardy)
  • Revision ID: james.westby@ubuntu.com-20080619003030-agens2gvd5m4dacu
New upstream release (Closes: #481728) also (LP: #176979, #212207)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.herac.tuxguitar.song.helpers;
 
2
 
 
3
import java.util.ArrayList;
 
4
import java.util.Iterator;
 
5
import java.util.List;
 
6
 
 
7
import org.herac.tuxguitar.song.managers.TGSongManager;
 
8
import org.herac.tuxguitar.song.managers.TGTrackManager;
 
9
import org.herac.tuxguitar.song.models.TGMeasure;
 
10
import org.herac.tuxguitar.song.models.TGMeasureHeader;
 
11
import org.herac.tuxguitar.song.models.TGTrack;
 
12
 
 
13
public class TGSongSegmentHelper {
 
14
        
 
15
        private TGSongManager sm;
 
16
        
 
17
        public TGSongSegmentHelper(TGSongManager sm){
 
18
                this.sm = sm;
 
19
        }
 
20
        
 
21
        public TGSongSegment copyMeasures(int m1, int m2){
 
22
                TGSongSegment segment = new TGSongSegment();
 
23
                int number1 = Math.max(1,m1);
 
24
                int number2 = Math.min(this.sm.getSong().countMeasureHeaders(),m2);
 
25
                for(int number = number1; number <= number2;number ++){
 
26
                        segment.getHeaders().add( this.sm.getMeasureHeader(number) );
 
27
                }
 
28
                Iterator it = this.sm.getSong().getTracks();
 
29
                while(it.hasNext()){
 
30
                        TGTrack track = (TGTrack)it.next();
 
31
                        List measures = new ArrayList();
 
32
                        for(int number = number1; number <= number2;number ++){
 
33
                                measures.add(this.sm.getTrackManager().getMeasure(track, number));
 
34
                        }
 
35
                        segment.addTrack(track.getNumber(),measures);
 
36
                }
 
37
                return segment.clone(this.sm.getFactory());
 
38
        }
 
39
        
 
40
        public TGSongSegment copyMeasures(int m1, int m2,TGTrack track){
 
41
                TGSongSegment segment = new TGSongSegment();
 
42
                List measures = new ArrayList();
 
43
                int number1 = Math.max(1,m1);
 
44
                int number2 = Math.min(this.sm.getSong().countMeasureHeaders(),m2);
 
45
                for(int number = number1; number <= number2;number ++){
 
46
                        segment.getHeaders().add( this.sm.getMeasureHeader(number) );
 
47
                        measures.add(this.sm.getTrackManager().getMeasure(track, number));
 
48
                }
 
49
                segment.addTrack(track.getNumber(),measures);
 
50
                return segment.clone(this.sm.getFactory());
 
51
        }
 
52
        
 
53
        public void insertMeasures(TGSongSegment segment,int fromNumber,long move, int track){
 
54
                List headers = new ArrayList();
 
55
                this.sm.moveMeasureHeaders(segment.getHeaders(),move,0,false);
 
56
                
 
57
                int headerNumber = fromNumber;
 
58
                Iterator it = segment.getHeaders().iterator();
 
59
                while(it.hasNext()){
 
60
                        TGMeasureHeader header = (TGMeasureHeader)it.next();
 
61
                        header.setNumber(headerNumber);
 
62
                        headers.add(header);
 
63
                        headerNumber ++;
 
64
                }
 
65
                long start = ((TGMeasureHeader)headers.get(0)).getStart();
 
66
                long end = ((TGMeasureHeader)headers.get(headers.size() - 1)).getStart() + ((TGMeasureHeader)headers.get(headers.size() - 1)).getLength();
 
67
                List headersBeforeEnd = this.sm.getMeasureHeadersBeforeEnd(start);
 
68
                this.sm.moveMeasureHeaders(headersBeforeEnd,end - start,headers.size(),true);
 
69
                
 
70
                it = segment.getHeaders().iterator();
 
71
                while(it.hasNext()){
 
72
                        TGMeasureHeader header = (TGMeasureHeader)it.next();
 
73
                        this.sm.addMeasureHeader(header.getNumber() - 1,header);
 
74
                }
 
75
                
 
76
                it = this.sm.getSong().getTracks();
 
77
                while (it.hasNext()) {
 
78
                        TGTrack currTrack = (TGTrack) it.next();
 
79
                        List measures = null;
 
80
                        
 
81
                        Iterator tracks = segment.getTracks().iterator();
 
82
                        while(tracks.hasNext()){
 
83
                                TGTrackSegment tSegment = (TGTrackSegment)tracks.next();
 
84
                                
 
85
                                if(  ((track > 0 && segment.getTracks().size() == 1)?track:tSegment.getTrack()) == currTrack.getNumber()){
 
86
                                        measures = tSegment.getMeasures();
 
87
                                        break;
 
88
                                }
 
89
                        }
 
90
                        if(measures == null){
 
91
                                TGTrackManager tm = this.sm.getTrackManager();
 
92
                                TGMeasure measure = (fromNumber > 1 ? tm.getMeasure(currTrack , (fromNumber - 1) ) : tm.getMeasure(currTrack, headerNumber ));
 
93
                                int clef = ( measure != null ? measure.getClef() : TGMeasure.DEFAULT_CLEF );
 
94
                                int keySignature = ( measure != null ? measure.getKeySignature() : TGMeasure.DEFAULT_KEY_SIGNATURE );
 
95
                                measures = getEmptyMeasures(segment.getHeaders().size(), clef, keySignature);
 
96
                        }
 
97
                        
 
98
                        for(int i = 0;i < measures.size();i++){
 
99
                                TGMeasure measure = (TGMeasure)measures.get(i);
 
100
                                measure.setHeader((TGMeasureHeader)headers.get(i));
 
101
                                this.sm.getMeasureManager().moveAllBeats(measure,move);
 
102
                        }
 
103
                        
 
104
                        insertMeasures(currTrack,measures);
 
105
                }
 
106
        }
 
107
        
 
108
        public void insertMeasures(TGTrack track,List measures){
 
109
                if(!measures.isEmpty()){
 
110
                        Iterator it = measures.iterator();
 
111
                        while(it.hasNext()){
 
112
                                TGMeasure measure = (TGMeasure)it.next();
 
113
                                this.sm.getMeasureManager().removeNotesAfterString(measure, track.stringCount());
 
114
                                this.sm.getTrackManager().addMeasure(track,(measure.getNumber() - 1),measure);
 
115
                        }
 
116
                }
 
117
        }
 
118
        
 
119
        public void replaceMeasures(TGSongSegment segment,long move, int track) {
 
120
                List measureHeaders = new ArrayList();
 
121
                this.sm.moveMeasureHeaders(segment.getHeaders(),move,0,false);
 
122
                Iterator sHeaders = segment.getHeaders().iterator();
 
123
                while(sHeaders.hasNext()){
 
124
                        TGMeasureHeader header = (TGMeasureHeader)sHeaders.next();
 
125
                        TGMeasureHeader replace = this.sm.replaceMeasureHeader(header);
 
126
                        
 
127
                        Iterator nextHeaders = this.sm.getMeasureHeadersAfter(replace.getNumber()).iterator();
 
128
                        long nextStart =  (replace.getStart() + replace.getLength());
 
129
                        while(nextHeaders.hasNext()){
 
130
                                TGMeasureHeader next = (TGMeasureHeader)nextHeaders.next();
 
131
                                this.sm.moveMeasureComponents(next, (nextStart - next.getStart() ));
 
132
                                this.sm.moveMeasureHeader(next, (nextStart - next.getStart() ) , 0);
 
133
                                nextStart = (next.getStart() + next.getLength());
 
134
                        }
 
135
                        measureHeaders.add(replace);
 
136
                }
 
137
                
 
138
                Iterator sTracks = segment.getTracks().iterator();
 
139
                while(sTracks.hasNext()){
 
140
                        TGTrackSegment tSegment = (TGTrackSegment)sTracks.next();
 
141
                        TGTrack currTrack = this.sm.getTrack( (track > 0 && segment.getTracks().size() == 1)?track:tSegment.getTrack());
 
142
                        if(currTrack != null){
 
143
                                for(int i = 0;i < tSegment.getMeasures().size();i++){
 
144
                                        TGMeasure measure = (TGMeasure)tSegment.getMeasures().get(i);
 
145
                                        measure.setHeader((TGMeasureHeader)measureHeaders.get(i));
 
146
                                        this.sm.getMeasureManager().removeNotesAfterString(measure, currTrack.stringCount());
 
147
                                        this.sm.getMeasureManager().moveAllBeats(measure,move);
 
148
                                        this.sm.getTrackManager().replaceMeasure(currTrack,measure);
 
149
                                }
 
150
                        }
 
151
                }
 
152
        }
 
153
        
 
154
        private List getEmptyMeasures(int count, int clef, int keySignature) {
 
155
                List measures = new ArrayList();
 
156
                for(int i = 0 ; i < count ; i ++ ){
 
157
                        TGMeasure measure = this.sm.getFactory().newMeasure(null);
 
158
                        measure.setClef(clef);
 
159
                        measure.setKeySignature(keySignature);
 
160
                        measures.add(measure);
 
161
                }
 
162
                return measures;
 
163
        }
 
164
}