private Track track;
private MooTrackTitle title;
- private Rectangle box;
+ private MooKeyboard keyboard;
private JPopupMenu popup, selPopup;
private JMenu selPopupTranspUp, selPopupTranspDown;
private JMenuItem popupAdd, popupPaste;
- private JMenuItem selPopupCopy, selPopupCut, selPopupRemove, selPopupTranspUpOct, selPopupTranspDownOct;
+ private JMenuItem selPopupCopy, selPopupCut, selPopupRemove;
+ private JMenuItem[] selPopupTranspUpItems, selPopupTranspDownItems;
- private ArrayList coords, copyBuffer;
+ private ArrayList coords;
private TreeSet selection;
private Insets insets;
+ private Rectangle box;
private int ticksPerSixteenth, popupY = 0;
private boolean leftMouseButtonPressed = false;
protected static int viewLength = 0;
*/
public MooTrackView (Track track, MooTrackTitle title) {
super(true);
+
+ // Defines instance variables
this.track = track;
this.title = title;
-
- // Creates instance variables
insets = getInsets();
+
+ // Configures panel
+ setBackground(Color.white);
+ setBorder(BorderFactory.createLineBorder(Color.black));
+ setLayout(null);
+ setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT));
+
+ placeNoteElements();
+
+ // Creates panel pop-up menu.
+ popup = new JPopupMenu();
+ popupAdd = addMenuItem(popup, "Add note...");
+ popupPaste = addMenuItem(popup, "Paste");
+
+ // Creates selection pop-up menu.
+ selPopup = new JPopupMenu();
+ selPopupCopy = addMenuItem(selPopup, "Copy selection");
+ selPopupCut = addMenuItem(selPopup, "Cut selection");
+ selPopupRemove = addMenuItem(selPopup, "Remove selection");
+ selPopupTranspUpItems = new JMenuItem[12];
+ selPopupTranspDownItems = new JMenuItem[12];
+ selPopupTranspUp = createTransposeMenu(selPopup, selPopupTranspUpItems, "selection up");
+ selPopupTranspDown = createTransposeMenu(selPopup, selPopupTranspDownItems, "selection down");
+
+ // Adds listeners for popup menu and keyboard synthesizer.
+ addMouseListener(new MAdapter());
+ keyboard = new MooKeyboard(title);
+ addKeyListener(keyboard);
+ }
+
+ /**
+ * Creates note elements for all MooNotes in the track, and places them in the appropriate place.
+ */
+ public void placeNoteElements() {
+ // Converts the track.
+ Moosique.convertTrack(track);
+
+ // Empties the container
+ removeAll();
coords = new ArrayList(track.size() / 2);
selection = new TreeSet();
- copyBuffer = new ArrayList();
// Creates temporary variables
MidiEvent note;
MooNoteElement elem;
extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150;
- // Configures panel
- setBackground(Color.white);
- setBorder(BorderFactory.createLineBorder(Color.black));
- setLayout(null);
- setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT));
-
// Places note elements
for (int i = 0; i < track.size(); i++) {
note = track.get(i);
layoutElement(elem, false);
}
setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight));
-
}
-
- // Creates panel pop-up menu.
- popup = new JPopupMenu();
- PopupListener pList = new PopupListener();
- popupAdd = new JMenuItem("Add note...");
- popupAdd.addActionListener(pList);
- popup.add(popupAdd);
- popupPaste = new JMenuItem("Paste");
- popupPaste.addActionListener(pList);
- popup.add(popupPaste);
-
- // Creates selection pop-up menu.
- selPopup = new JPopupMenu();
- selPopupCopy = new JMenuItem("Copy selection");
- selPopupCopy.addActionListener(pList);
- selPopup.add(selPopupCopy);
- selPopupCut = new JMenuItem("Cut selection");
- selPopupCut.addActionListener(pList);
- selPopup.add(selPopupCut);
- selPopupRemove = new JMenuItem("Remove selection");
- selPopupRemove.addActionListener(pList);
- selPopup.add(selPopupRemove);
- selPopupTranspUp = new JMenu("Transpose selection up");
- selPopup.add(selPopupTranspUp);
- selPopupTranspUpOct = new JMenuItem("One octave");
- selPopupTranspUpOct.addActionListener(pList);
- selPopupTranspUp.add(selPopupTranspUpOct);
- selPopupTranspDown = new JMenu("Transpose selection down");
- selPopup.add(selPopupTranspDown);
- selPopupTranspDownOct = new JMenuItem("One octave");
- selPopupTranspDownOct.addActionListener(pList);
- selPopupTranspDown.add(selPopupTranspDownOct);
-
- // Adds listeners for popup menu and keyboard synthesizer.
- addMouseListener(new MAdapter());
- addKeyListener(new MooKeyboard());
- }
+ }
/**
* Layouts the element to the right place.
* Copies the current selection.
*/
public void copySelectedNotes() {
- copyBuffer = new ArrayList(selection.size());
+ ArrayList copyBuffer = new ArrayList(selection.size());
Iterator it = selection.iterator();
while(it.hasNext()) {
copyBuffer.add(((MooNoteElement)it.next()).getNote().clone());
}
Collections.sort(copyBuffer);
+ Moosique.setCopyBuffer(copyBuffer);
}
/**
public void pasteCopiedNotes() {
int row = (popupY - insets.top) / NOTE_HEIGHT;
long timestamp = (long)(ticksPerSixteenth * row);
+ ArrayList copyBuffer = Moosique.getCopyBuffer();
if (copyBuffer.size() > 0) {
long startTime = ((MooNote)copyBuffer.get(0)).getTick();
Iterator it = copyBuffer.iterator();
while(it.hasNext()) {
MooNote mn = (MooNote)((MooNote)it.next()).clone();
mn.setTick(mn.getTick() - startTime + timestamp);
+ mn.setChannel(title.getChannel());
addNote(mn);
}
}
* @param ticks the number of ticks to move the selection.
*/
public void moveSelectedNotes(int ticks) {
- if (ticks > 0) {
- // If the selection should be moved downwards, traverses the list in the natural order.
+ if (ticks < 0) {
+ // If the selection should be moved upwards, traverses the list in the natural order.
Iterator it = selection.iterator();
while(it.hasNext()) {
MooNoteElement elem = (MooNoteElement)it.next();
layoutElement(elem, true);
}
} else {
- // If the selection should be moved upwards, traverses the list in the opposite order.
+ // If the selection should be moved downwards, traverses the list in the opposite order.
ArrayList selectedList = new ArrayList(selection);
ListIterator it = selectedList.listIterator(selectedList.size());
while(it.hasPrevious()) {
moveSelectedNotes(ticksPerSixteenth * (y / NOTE_HEIGHT));
}
+ /**
+ * Enables keyboard recording.
+ */
+ public void enableKeyboardRecording() {
+ keyboard.recordEnable();
+ }
+
+ /**
+ * Disables keyboard recording.
+ */
+ public void disableKeyboardRecording() {
+ keyboard.recordDisable();
+ }
+
+ /**
+ * Adds a menu item with the given command to the given popup menu.
+ */
+ private JMenuItem addMenuItem(JPopupMenu menu, String command) {
+ JMenuItem item = new JMenuItem(command);
+ item.addActionListener(new PopupListener());
+ menu.add(item);
+ return item;
+ }
+
+ /**
+ * Adds a menu item with the given command to the given menu.
+ */
+ private JMenuItem addMenuItem(JMenu menu, String command) {
+ JMenuItem item = new JMenuItem(command);
+ item.addActionListener(new PopupListener());
+ menu.add(item);
+ return item;
+ }
+
+ /**
+ * Creates a transpose sub menu with the given title in the given popup menu,
+ * inserting the items into the given array.
+ */
+ private JMenu createTransposeMenu(JPopupMenu menu, JMenuItem[] items, String title) {
+ JMenu trans = new JMenu("Transpose " + title);
+ menu.add(trans);
+ items[0] = addMenuItem(trans, "One octave");
+ for (int i = 1; i < 12; i++) {
+ items[i] = addMenuItem(trans, (i) + " halftones");
+ }
+ return trans;
+ }
+
/**
* Shows a popup-menu with options for the current selection of note elements.
* @param c the component over which to display the menu
}
/**
- * Listens on actions on the popup menu and executes the appropriate action.
+ * Takes the appropriate action when a user selects an item on the popup menu.
*/
class PopupListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
cutSelectedNotes();
} else if (source == selPopupRemove) {
removeSelectedNotes();
- } else if (source == selPopupTranspUpOct) {
+ } else if (source == selPopupTranspUpItems[0]) {
transposeSelectedNotes(12);
- } else if (source == selPopupTranspDownOct) {
+ } else if (source == selPopupTranspDownItems[0]) {
transposeSelectedNotes(-12);
+ } else {
+ for (int i = 1; i < 12; i++) {
+ if (source == selPopupTranspUpItems[i]) transposeSelectedNotes(i);
+ else if (source == selPopupTranspDownItems[i]) transposeSelectedNotes(-i);
+ }
}
}
}