* @version 1
*/
-public class MooNoteElement extends JPanel {
+public class MooNoteElement extends JPanel implements Comparable{
private MooTrackView mtv;
private MooNote note;
private JPopupMenu popup;
- private JMenuItem popupRemove, popupProp, popupTranspOctUp, popupTranspOctDown;
+ private JMenu popupTranspUp, popupTranspDown;
+ private JMenuItem popupRemove, popupProp;
+ private JMenuItem[] popupTranspUpItems, popupTranspDownItems;
private Rectangle pitchRect, veloRect;
private String notePitch, noteVelocity;
- private boolean selected = false;
+ private boolean selected = false, leftMouseButtonPressed = false, mouseIn = false;
public Color textColor;
public static final Color bgColor = new Color(160, 218, 255);
public static final Color invBgColor = new Color(96, 38, 0);
// Creates pop-up menu.
popup = new JPopupMenu();
- PopupListener pList = new PopupListener();
- popupProp = new JMenuItem("Preferences...");
- popupProp.addActionListener(pList);
- popup.add(popupProp);
- popupRemove = new JMenuItem("Remove");
- popupRemove.addActionListener(pList);
- popup.add(popupRemove);
- popupTranspOctUp = new JMenuItem("Transpose one octave up");
- popupTranspOctUp.addActionListener(pList);
- popup.add(popupTranspOctUp);
- popupTranspOctDown = new JMenuItem("Transpose one octave down");
- popupTranspOctDown.addActionListener(pList);
- popup.add(popupTranspOctDown);
+ popupProp = addMenuItem(popup, "Preferences...");
+ popupRemove = addMenuItem(popup, "Remove");
+ popupTranspUpItems = new JMenuItem[12];
+ popupTranspDownItems = new JMenuItem[12];
+ popupTranspUp = createTransposeMenu(popup, popupTranspUpItems, "note up");
+ popupTranspDown = createTransposeMenu(popup, popupTranspDownItems, "note down");
}
/**
return note;
}
+ /**
+ * Compares the note of this element to that of another note.
+ * @return a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object
+ */
+ public int compareTo(Object o) {
+ return note.compareTo(((MooNoteElement)o).getNote());
+ }
+
/**
* Selects the current NoteElement.
*/
repaint();
}
+ /**
+ * Transposes the current note element the given number of halftones.
+ * @param halftones the number of halftones to transpose - positive for up, negative for down
+ */
+ public void transpose(int halftones) {
+ note.transpose(halftones);
+ update();
+ }
+
/**
* Draws the string that shows the note's properties.
* @param g The Graphics object used to draw the strings.
}
/**
- * layout this changed elemnt
+ * Layout this changed elemnt.
*/
protected void newLayout(){
mtv.layoutElement(this,true);
}
+
+ /**
+ * 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;
+ }
+
/**
* Listener that checks the mouse actions on this element.
*/
class MAdapter extends MouseAdapter {
/**
- * If left mouse button is clicked, selects the note and plays it.
+ * Plays the note on double-click.
*/
public void mouseClicked(MouseEvent e) {
- if (SwingUtilities.isLeftMouseButton(e) && !e.isControlDown()) {
+ if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2)
+ Moosique.getReceiver().send(note.getMessage(), -1);
+ }
+
+ /**
+ * Selects the note if mouse entered with the left mouse button pressed.
+ */
+ public void mouseEntered(MouseEvent e) {
+ mouseIn = true;
+ if (mtv.isLeftMouseButtonPressed()) {
select();
- // Play the note
}
}
+ /**
+ * Registers mouse exited.
+ */
+ public void mouseExited(MouseEvent e) {
+ mouseIn = false;
+ Moosique.getReceiver().send(note.getNoteOffEvent().getMessage(), -1);
+ }
+
/**
* Checks if the mouse is pressed.
* Increases the pitch or velocity if the right mouse button is pressed while holding CTRL.
calculateString();
repaint();
}
- } else maybeShowPopup(e);
+ } else {
+ select();
+ maybeShowPopup(e);
+ }
}
public void mouseReleased(MouseEvent e) {
- maybeShowPopup(e);
+ if (!maybeShowPopup(e) && !mouseIn) {
+ int y = e.getY();
+ if (y < 0) mtv.maybeMoveSelectedNotes((int)Math.floor((double)y / MooTrackView.NOTE_HEIGHT) * MooTrackView.NOTE_HEIGHT);
+ if (y > getHeight()) mtv.maybeMoveSelectedNotes((int)Math.ceil(((double)y - getHeight()) / MooTrackView.NOTE_HEIGHT) * MooTrackView.NOTE_HEIGHT);
+
+ }
}
/**
* Shows the menu if an OS-specific popup-trigger was activated.
*/
- private void maybeShowPopup(MouseEvent e) {
- if (e.isPopupTrigger() && !e.isControlDown()) {
+ private boolean maybeShowPopup(MouseEvent e) {
+ if (!e.isPopupTrigger()) return false;
+ if (!e.isControlDown()) {
if (!selected || mtv.isTheOnlySelected((MooNoteElement)e.getComponent())) popup.show(e.getComponent(), e.getX(), e.getY());
else mtv.showSelectionPopup(e.getComponent(), e.getX(), e.getY());
}
+ return true;
}
}
/**
- * Listens on the actions made to the popupmenu.
+ * Takes the appropriate action when a user selects an item on the popup menu.
*/
class PopupListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == popupProp) {
+ System.out.println("Duration: " + note.getDuration());
new MooDialog(note);
+ System.out.println("Duration: " + note.getDuration());
newLayout();
+ update();
} else if (source == popupRemove) {
remove();
- } else if (source == popupTranspOctUp) {
- note.transpose(12);
- update();
- } else if (source == popupTranspOctDown) {
- note.transpose(-12);
- update();
+ } else if (source == popupTranspUpItems[0]) {
+ transpose(12);
+ } else if (source == popupTranspDownItems[0]) {
+ transpose(-12);
+ } else {
+ for (int i = 1; i < 12; i++) {
+ if (source == popupTranspUpItems[i]) transpose(i);
+ else if (source == popupTranspDownItems[i]) transpose(-i);
+ }
}
}
}