+ /**
+ * 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 {
+
+ /**
+ * Plays the note on double-click.
+ */
+ public void mouseClicked(MouseEvent e) {
+ 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();
+ }
+ }
+
+ /**
+ * 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.
+ * Decreases the pitch or velocity if the left mouse button is pressed while holding CTRL.
+ * @param e the event recieved.
+ */
+ public void mousePressed(MouseEvent e) {
+ if (e.isControlDown()) {
+ if (pitchRect.contains(e.getPoint())) {
+ if (SwingUtilities.isRightMouseButton(e)) {
+ note.transpose(1);
+ } else if (SwingUtilities.isLeftMouseButton(e)) {
+ note.transpose(-1);
+ }
+ Moosique.setEdited();
+ calculateString();
+ repaint();
+ } else if (veloRect.contains(e.getPoint())) {
+ if (SwingUtilities.isRightMouseButton(e)) {
+ note.setVelocity(note.getVelocity() + 1);
+ } else if (SwingUtilities.isLeftMouseButton(e)) {
+ note.setVelocity(note.getVelocity() - 1);
+ }
+ Moosique.setEdited();
+ calculateString();
+ repaint();
+ }
+ } else {
+ select();
+ maybeShowPopup(e);
+ }
+ }
+
+ public void mouseReleased(MouseEvent 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 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;
+ }
+ }
+
+ /**
+ * 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 == 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);
+ }
+ }
+ }