]> ruin.nu Git - moosique.git/blobdiff - MooNoteElement.java
play hangs when changing duration on a note.
[moosique.git] / MooNoteElement.java
index 3a068cd67908b13456b1ae0bf014401ff7f0cd7c..f6bda05e3b447642af0acffa007f5083e6eaf915 100644 (file)
@@ -13,13 +13,14 @@ public class MooNoteElement extends JPanel {
 
        private MooTrackView mtv;
        private MooNote note;
-       private boolean selected;
-       private Rectangle pitchRect, veloRect;
-       public static final Color bgColor = new Color(160, 218, 255);
-       private String notePitch;
-       private String noteVelocity;
        private JPopupMenu popup;
        private JMenuItem popupRemove, popupProp, popupTransposeOctUp, popupTransposeOctDown;
+       private Rectangle pitchRect, veloRect;
+       private String notePitch, noteVelocity;
+       private boolean selected = 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 a new note element.
@@ -30,9 +31,10 @@ public class MooNoteElement extends JPanel {
                mtv = parent;
                note = mn;
                calculateString();
+               addMouseListener(new MAdapter());
                setBorder(BorderFactory.createLineBorder(Color.black));
                setBackground(bgColor);
-               addMouseListener(new MAdapter());
+               textColor = Color.black;
 
                // Defines coordinates.
                pitchRect = new Rectangle(0, 0, 15, 10);
@@ -53,15 +55,6 @@ public class MooNoteElement extends JPanel {
                popupTransposeOctDown = new JMenuItem("Transpose one octave down");
                popupTransposeOctDown.addActionListener(pList);
                popup.add(popupTransposeOctDown);
-
-       }
-
-       /** 
-        * Returns true if the current NoteElement is selected, otherwise false.
-        * @return if the element is selected
-        */
-       public boolean isSelected() {
-               return selected;
        }
 
        /** 
@@ -74,10 +67,24 @@ public class MooNoteElement extends JPanel {
 
        /** 
         * Selects the current NoteElement.
-        * @param state if the element should be selected
         */
-       public void setSelected(boolean state) {
-               selected = state;
+       public void select() {
+               selected = true;
+               mtv.addSelected(this);
+               setBackground(invBgColor);
+               textColor = Color.white;
+               repaint();
+       }
+
+       /** 
+        * Deselects the current NoteElement.
+        */
+       public void deselect() {
+               selected = false;
+               // mtv.removeSelected(this);
+               setBackground(bgColor);
+               textColor = Color.black;
+               repaint();
        }
 
        /**
@@ -89,6 +96,7 @@ public class MooNoteElement extends JPanel {
                super.paintComponent(g);
                if (!(g instanceof Graphics2D)) return;
                Graphics2D g2 = (Graphics2D)g;
+               g2.setColor(textColor);
                g2.setFont(new Font("Helvetica", Font.PLAIN, 8));
        /*
                switch(columns) {
@@ -130,19 +138,39 @@ public class MooNoteElement extends JPanel {
                noteVelocity = ""+note.getVelocity();
        }
 
+
+       /**
+        * Asks the MooTrackView that the note element is painted on to remove this element and the note.
+        */
+       protected void remove(){
+               mtv.removeNote(this);
+       }
+
+       /**
+        * layout this changed elemnt
+        */
+       protected void newLayout(){
+               mtv.layoutElement(this,true);
+       }
        /**
         * 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.
+                */
                public void mouseClicked(MouseEvent e) {
-                       // Play the note
+                       if (SwingUtilities.isLeftMouseButton(e) && !e.isControlDown()) {
+                               select();
+                               // Play the note
+                       }
                }
 
                /**
                 * Checks if the mouse is pressed.
-                * Increases the pitch or velocity if the right mousebutton is pressed while holding ctrl down.
-                * Decreases the pitch or velocity if the left mousebutton is pressed while holding ctrl down.
+                * 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) {
@@ -153,6 +181,7 @@ public class MooNoteElement extends JPanel {
                                        } else if (SwingUtilities.isLeftMouseButton(e)) {
                                                note.setPitch(note.getPitch() - 1);
                                        }
+                                       Moosique.setEdited();
                                        calculateString();
                                        repaint();
                                } else if (veloRect.contains(e.getPoint())) {
@@ -161,6 +190,7 @@ public class MooNoteElement extends JPanel {
                                        } else if (SwingUtilities.isLeftMouseButton(e)) {
                                                note.setVelocity(note.getVelocity() - 1);
                                        }
+                                       Moosique.setEdited();
                                        calculateString();
                                        repaint();
                                }
@@ -175,7 +205,10 @@ public class MooNoteElement extends JPanel {
                 * Shows the menu if an OS-specific popup-trigger was activated.
                 */
                private void maybeShowPopup(MouseEvent e) {
-                       if (e.isPopupTrigger() && !e.isControlDown()) popup.show(e.getComponent(), e.getX(), e.getY());
+                       if (e.isPopupTrigger() && !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());
+                       }
                }
        }
 
@@ -187,6 +220,7 @@ public class MooNoteElement extends JPanel {
                        Object source = e.getSource();
                        if (source == popupProp) {
                                new MooDialog(note);
+                               newLayout();
                        } else if (source == popupRemove) {
                                remove();
                        } else if (source == popupTransposeOctUp) {
@@ -202,12 +236,6 @@ public class MooNoteElement extends JPanel {
                        calculateString();
                        repaint();
                }
-       }
 
-       /**
-        * Asks the MooTrackView that the note element is painted on to remove this element and the note.
-        */
-       protected void remove(){
-               mtv.removeNote(this);
        }
 }