1
package org.herac.tuxguitar.gui.editors.tab.edit;
3
import java.util.Iterator;
5
import org.eclipse.swt.events.MenuEvent;
6
import org.eclipse.swt.events.MenuListener;
7
import org.eclipse.swt.events.MouseEvent;
8
import org.eclipse.swt.events.MouseListener;
9
import org.eclipse.swt.events.MouseMoveListener;
10
import org.eclipse.swt.events.MouseTrackListener;
11
import org.eclipse.swt.graphics.Point;
12
import org.herac.tuxguitar.gui.TuxGuitar;
13
import org.herac.tuxguitar.gui.editors.tab.TGBeatImpl;
14
import org.herac.tuxguitar.gui.editors.tab.TGMeasureImpl;
15
import org.herac.tuxguitar.gui.editors.tab.TGTrackImpl;
16
import org.herac.tuxguitar.gui.editors.tab.Tablature;
17
import org.herac.tuxguitar.gui.editors.tab.layout.TrackSpacing;
18
import org.herac.tuxguitar.gui.editors.tab.layout.ViewLayout;
19
import org.herac.tuxguitar.gui.system.config.TGConfigKeys;
20
import org.herac.tuxguitar.song.models.TGBeat;
21
import org.herac.tuxguitar.song.models.TGString;
23
public class EditorKit implements MouseListener,MouseMoveListener,MouseTrackListener,MenuListener{
25
public static final int MOUSE_MODE_SELECTION = 1;
26
public static final int MOUSE_MODE_EDITION = 2;
28
private int mouseMode;
29
private boolean natural;
30
private Tablature tablature;
31
private MouseKit mouseKit;
32
private Point position;
33
private boolean menuOpen;
35
public EditorKit(Tablature tablature){
36
this.tablature = tablature;
37
this.mouseKit = new MouseKit(this);
38
this.position = new Point(0,0);
39
this.menuOpen = false;
40
this.tablature.addMouseListener(this);
41
this.tablature.addMouseMoveListener(this);
42
this.tablature.addMouseTrackListener(this);
46
private void setDefaults(){
47
this.setMouseMode(TuxGuitar.instance().getConfig().getIntConfigValue(TGConfigKeys.EDITOR_MOUSE_MODE,MOUSE_MODE_EDITION));
48
this.setNatural(TuxGuitar.instance().getConfig().getBooleanConfigValue(TGConfigKeys.EDITOR_NATURAL_KEY_MODE,true));
51
public int getMouseMode() {
52
return this.mouseMode;
55
public void setMouseMode(int mouseMode) {
56
this.mouseMode = mouseMode;
59
public boolean isNatural() {
63
public void setNatural(boolean natural) {
64
this.natural = natural;
67
public Tablature getTablature() {
68
return this.tablature;
71
public void tryBack(){
72
this.mouseKit.tryBack();
75
public boolean select() {
76
int x = this.position.x;
77
int y = this.position.y;
79
TGTrackImpl track = findSelectedTrack(y);
81
TGMeasureImpl measure = findSelectedMeasure(track, x, y);
82
if (measure != null) {
83
TGBeat beat = findSelectedBeat(measure, x);
84
TGString tgString = findSelectedString(measure, y);
86
int string = (tgString != null)?tgString.getNumber():getTablature().getCaret().getSelectedString().getNumber();
87
getTablature().getCaret().moveTo(track, measure, beat, string);
96
private boolean isScoreEnabled(){
97
return ( (getTablature().getViewLayout().getStyle() & ViewLayout.DISPLAY_SCORE) != 0 );
100
public TGTrackImpl findSelectedTrack(int y){
101
ViewLayout layout = getTablature().getViewLayout();
102
int number = layout.getTrackNumberAt(y);
104
return (TGTrackImpl)layout.getSongManager().getTrack(number);
109
public TGMeasureImpl findSelectedMeasure(TGTrackImpl track,int x,int y){
110
TGMeasureImpl measure = null;
111
int minorDistance = 0;
113
Iterator it = track.getMeasures();
115
TGMeasureImpl m = (TGMeasureImpl)it.next();
116
if(!m.isOutOfBounds() && m.getTs() != null){
117
boolean isAtX = (x >= m.getPosX() && x <= m.getPosX() + m.getWidth(getTablature().getViewLayout()) + m.getSpacing());
119
int measureHeight = m.getTs().getSize();
120
int distanceY = Math.min(Math.abs(y - (m.getPosY())),Math.abs(y - ( m.getPosY() + measureHeight - 10)));
121
if(measure == null || distanceY < minorDistance){
123
minorDistance = distanceY;
131
public TGBeatImpl findSelectedBeat(TGMeasureImpl measure, int x){
132
int posX = measure.getHeaderImpl().getLeftSpacing(getTablature().getViewLayout()) + measure.getPosX();
134
TGBeatImpl bestBeat = null;
135
Iterator it = measure.getBeats().iterator();
137
TGBeatImpl beat = (TGBeatImpl)it.next();
138
int diff = Math.abs(x - (posX + (beat.getPosX() + beat.getSpacing())));
139
if(bestDiff == -1 || diff < bestDiff){
147
public TGString findSelectedString(TGMeasureImpl measure,int y) {
148
TGString string = null;
149
int stringSpacing = getTablature().getViewLayout().getStringSpacing();
150
int minorDistance = 0;
151
int firstStringY = measure.getPosY() + measure.getTs().getPosition(TrackSpacing.POSITION_TABLATURE);
153
Iterator it = measure.getTrack().getStrings().iterator();
155
TGString currString = (TGString)it.next();
156
int distanceX = Math.abs(y - (firstStringY + ((currString.getNumber() * stringSpacing) - stringSpacing)));
157
if(string == null || distanceX < minorDistance){
159
minorDistance = distanceX;
166
public void mouseDown(MouseEvent e) {
167
this.position.x = e.x;
168
this.position.y = e.y;
171
public void mouseUp(MouseEvent e) {
172
this.position.x = e.x;
173
this.position.y = e.y;
174
this.tablature.setFocus();
176
TuxGuitar.instance().updateCache(true);
177
if(!this.menuOpen && e.button == 1 && !TuxGuitar.instance().getPlayer().isRunning() && isScoreEnabled() && getMouseMode() == MOUSE_MODE_EDITION){
178
this.mouseKit.mouseUp(e);
183
public void mouseMove(MouseEvent e) {
184
if(!this.menuOpen && !TuxGuitar.instance().getPlayer().isRunning()){
185
if(isScoreEnabled() && getMouseMode() == MOUSE_MODE_EDITION){
186
this.mouseKit.mouseMove(e);
191
public void mouseExit(MouseEvent e) {
192
if(!this.menuOpen && !TuxGuitar.instance().getPlayer().isRunning()){
193
if(isScoreEnabled() && getMouseMode() == MOUSE_MODE_EDITION){
194
this.mouseKit.mouseExit();
199
public void menuShown(MenuEvent e) {
200
this.menuOpen = true;
202
TuxGuitar.instance().updateCache(true);
205
public void menuHidden(MenuEvent e){
206
this.menuOpen = false;
207
TuxGuitar.instance().updateCache(true);
210
public void mouseDoubleClick(MouseEvent e) {
214
public void mouseEnter(MouseEvent e) {
218
public void mouseHover(MouseEvent e) {