2
* Created on 17-dic-2005
4
* TODO To change the template for this generated file go to
5
* Window - Preferences - Java - Code Style - Code Templates
7
package org.herac.tuxguitar.gui.actions.insert;
9
import java.util.Iterator;
11
import org.eclipse.swt.SWT;
12
import org.eclipse.swt.events.SelectionAdapter;
13
import org.eclipse.swt.events.SelectionEvent;
14
import org.eclipse.swt.events.TypedEvent;
15
import org.eclipse.swt.layout.GridData;
16
import org.eclipse.swt.layout.GridLayout;
17
import org.eclipse.swt.widgets.Button;
18
import org.eclipse.swt.widgets.Composite;
19
import org.eclipse.swt.widgets.Group;
20
import org.eclipse.swt.widgets.Shell;
21
import org.herac.tuxguitar.gui.TuxGuitar;
22
import org.herac.tuxguitar.gui.actions.Action;
23
import org.herac.tuxguitar.gui.undo.undoables.UndoableJoined;
24
import org.herac.tuxguitar.gui.undo.undoables.custom.UndoableChangeAlternativeRepeat;
25
import org.herac.tuxguitar.gui.undo.undoables.custom.UndoableChangeCloseRepeat;
26
import org.herac.tuxguitar.gui.util.DialogUtils;
27
import org.herac.tuxguitar.song.models.TGMeasure;
28
import org.herac.tuxguitar.song.models.TGMeasureHeader;
33
* TODO To change the template for this generated type comment go to
34
* Window - Preferences - Java - Code Style - Code Templates
36
public class RepeatAlternativeAction extends Action{
37
public static final String NAME = "action.insert.repeat-alternative";
39
public RepeatAlternativeAction() {
40
super(NAME, AUTO_LOCK | AUTO_UNLOCK | AUTO_UPDATE | DISABLE_ON_PLAYING | KEY_BINDING_AVAILABLE);
43
protected int execute(TypedEvent e){
44
TGMeasure measure = getEditor().getTablature().getCaret().getMeasure();
45
showCloseRepeatDialog(getEditor().getTablature().getShell(), measure);
49
public void showCloseRepeatDialog(Shell shell, final TGMeasure measure) {
50
if (measure != null) {
51
int existentEndings = getExistentEndings(measure);
52
int selectedEndings = (measure.getHeader().getRepeatAlternative() > 0)?measure.getHeader().getRepeatAlternative():getDefaultEndings(existentEndings);
54
final Shell dialog = DialogUtils.newDialog(shell, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
56
dialog.setLayout(new GridLayout());
57
dialog.setText(TuxGuitar.getProperty("repeat.alternative.editor"));
59
Group group = new Group(dialog,SWT.SHADOW_ETCHED_IN);
60
group.setLayout(new GridLayout(4,true));
61
group.setLayoutData(getMainData());
62
group.setText(TuxGuitar.getProperty("repeat.alternative"));
64
final Button[] selections = new Button[8];
65
for(int i = 0; i < selections.length; i ++){
66
boolean enabled = ((existentEndings & (1 << i)) == 0);
67
selections[i] = new Button(group,SWT.CHECK);
68
selections[i].setText(Integer.toString( i + 1 ));
69
selections[i].setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));
70
selections[i].setEnabled(enabled);
71
selections[i].setSelection(enabled && ((selectedEndings & (1 << i)) != 0) );
74
//----------------------BUTTONS--------------------------------
75
Composite buttons = new Composite(dialog, SWT.NONE);
76
buttons.setLayout(new GridLayout(3,false));
77
buttons.setLayoutData(new GridData(SWT.END,SWT.FILL,true,true));
79
final Button buttonOK = new Button(buttons, SWT.PUSH);
80
buttonOK.setText(TuxGuitar.getProperty("ok"));
81
buttonOK.setLayoutData(getButtonData());
82
buttonOK.addSelectionListener(new SelectionAdapter() {
83
public void widgetSelected(SelectionEvent arg0) {
85
for(int i = 0; i < selections.length; i ++){
86
values |= ( (selections[i].getSelection()) ? (1 << i) : 0 );
88
update(measure,values);
92
Button buttonClean = new Button(buttons, SWT.PUSH);
93
buttonClean.setText(TuxGuitar.getProperty("clean"));
94
buttonClean.setLayoutData(getButtonData());
95
buttonClean.addSelectionListener(new SelectionAdapter() {
96
public void widgetSelected(SelectionEvent arg0) {
101
Button buttonCancel = new Button(buttons, SWT.PUSH);
102
buttonCancel.setText(TuxGuitar.getProperty("cancel"));
103
buttonCancel.setLayoutData(getButtonData());
104
buttonCancel.addSelectionListener(new SelectionAdapter() {
105
public void widgetSelected(SelectionEvent arg0) {
110
dialog.setDefaultButton( buttonOK );
112
DialogUtils.openDialog(dialog,DialogUtils.OPEN_STYLE_CENTER | DialogUtils.OPEN_STYLE_PACK | DialogUtils.OPEN_STYLE_WAIT);
116
private GridData getMainData(){
117
GridData data = new GridData(SWT.FILL,SWT.FILL,true,true);
118
data.minimumWidth = 350;
122
private GridData getButtonData(){
123
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
124
data.minimumWidth = 80;
125
data.minimumHeight = 25;
129
protected int getExistentEndings(TGMeasure measure){
130
int existentEndings = 0;
131
Iterator it = getSongManager().getSong().getMeasureHeaders();
133
TGMeasureHeader header = (TGMeasureHeader)it.next();
134
if(header.getNumber() == measure.getNumber()){
137
if(header.isRepeatOpen()){
140
existentEndings |= header.getRepeatAlternative();
142
return existentEndings;
145
protected int getDefaultEndings(int existentEndings){
146
for(int i = 0; i < 8; i ++){
147
if((existentEndings & (1 << i)) == 0){
154
protected void update(TGMeasure measure, int value) {
155
//Solo si hubieron cambios
156
if(value != measure.getHeader().getRepeatAlternative()){
157
//Si no estoy editando, y la alternativa no contiene el primer final,
158
//por defecto se cierra la repeticion del compas anterior
159
boolean previousRepeatClose = (measure.getHeader().getRepeatAlternative() == 0 && ((value & (1 << 0)) == 0)) ;
161
//comienza el undoable
162
UndoableJoined undoable = new UndoableJoined();
163
TuxGuitar.instance().getFileHistory().setUnsavedFile();
165
//Guardo la repeticion alternativa
166
UndoableChangeAlternativeRepeat u1 = UndoableChangeAlternativeRepeat.startUndo();
167
getSongManager().changeAlternativeRepeat(measure.getStart(), value);
168
fireUpdate(measure.getNumber());
169
undoable.addUndoableEdit(u1.endUndo(value));
171
if(previousRepeatClose){
172
//Agrego un cierre de repeticion al compaz anterior
173
TGMeasureHeader previous = getSongManager().getMeasureHeader( measure.getNumber() - 1);
174
if(previous != null && previous.getRepeatClose() == 0){
175
UndoableChangeCloseRepeat u2 = UndoableChangeCloseRepeat.startUndo(previous.getStart(),previous.getRepeatClose());
176
getSongManager().changeCloseRepeat(previous.getStart(), 1);
177
fireUpdate(previous.getNumber());
178
undoable.addUndoableEdit(u2.endUndo(1));
182
addUndoableEdit(undoable.endUndo());