]> ruin.nu Git - moosique.git/blobdiff - MooTrackView.java
no message
[moosique.git] / MooTrackView.java
index 96bfd006fc521ff7a5718a7e0bbdb6a8cfe95567..c284e7df5acc9e4ce2a2407f67f373e5fdf548aa 100644 (file)
@@ -18,19 +18,20 @@ public class MooTrackView extends JPanel {
        private MooKeyboard keyboard;
 
        private JPopupMenu popup, selPopup;
-       private JMenu selPopupTranspUp, selPopupTranspDown;
-       private JMenuItem popupAdd, popupPaste;
-       private JMenuItem selPopupCopy, selPopupCut, selPopupRemove;
+       private JMenu popupAdd, selPopupTranspUp, selPopupTranspDown;
+       private JMenuItem popupAddItemsCustom, popupAddItemsLast, popupPaste;
+       private JMenuItem popupAddItemsWhole, popupAddItemsHalf, popupAddItemsQuarter, popupAddItemsEighth, popupAddItemsSixteenth;
+       private JMenuItem selPopupProps, selPopupCopy, selPopupCut, selPopupRemove;
        private JMenuItem[] selPopupTranspUpItems, selPopupTranspDownItems;
 
        private ArrayList coords; 
-       private TreeSet selection;
        private Insets insets;
        private Rectangle box;
-       private int ticksPerSixteenth, popupY = 0;
-       private boolean leftMouseButtonPressed = false, quantizeRecording = false;
-       protected static int viewLength = 0;
-       protected static int extraHeight = 0;
+       private int ticksPerSixteenth, popupY = 0, lastNoteLength = 2;
+       private boolean leftMouseButtonPressed = false;
+       private static boolean snapToSixteenths = true;
+       private static int viewLength = 0;
+       private static int extraHeight = 0;
        public static final int NOTE_HEIGHT = 10, NOTE_WIDTH = 40, VIEW_WIDTH = 200;
 
        /**
@@ -44,7 +45,9 @@ public class MooTrackView extends JPanel {
                // Defines instance variables
                this.track = track;
                this.title = title;
+               ticksPerSixteenth = Moosique.getSequence().getResolution() / 4;
                insets = getInsets();
+               coords = new ArrayList(track.size() / 2);
 
                // Configures panel
                setBackground(Color.white);
@@ -52,15 +55,41 @@ public class MooTrackView extends JPanel {
                setLayout(null);
                setPreferredSize(new Dimension(VIEW_WIDTH, 140 * NOTE_HEIGHT));
 
-               placeNoteElements(false);
+               // Creates temporary variables
+               MidiEvent note;
+               MooNoteElement elem;
+               extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150;
+
+               // Places note elements
+               for (int i = 0; i < track.size(); i++) {
+                       note = track.get(i);
+                       if (note instanceof MooNote) {
+                               // Adds the note element to the note area and moves it to the appropriate place.
+                               MooNote mn = (MooNote)note;
+                               elem = new MooNoteElement(this, mn);
+                               add(elem);
+                               layoutElement(elem, false);
+                       }
+               }
+               setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight));
 
                // Creates panel pop-up menu.
                popup = new JPopupMenu();
-               popupAdd = addMenuItem(popup, "Add note...");
+               popupAdd = new JMenu("Add note");
+               popup.add(popupAdd);
+               popupAddItemsCustom = addMenuItem(popupAdd, "Custom...");
+               popupAddItemsLast = addMenuItem(popupAdd, "As last added");
+               popupAdd.addSeparator();
+               popupAddItemsWhole = addMenuItem(popupAdd, "Whole");
+               popupAddItemsHalf = addMenuItem(popupAdd, "Half");
+               popupAddItemsQuarter = addMenuItem(popupAdd, "Quarter");
+               popupAddItemsEighth = addMenuItem(popupAdd, "Eighth");
+               popupAddItemsSixteenth = addMenuItem(popupAdd, "Sixteenth");
                popupPaste = addMenuItem(popup, "Paste");
 
                // Creates selection pop-up menu.
                selPopup = new JPopupMenu();
+               selPopupProps = addMenuItem(selPopup, "Properties...");
                selPopupCopy = addMenuItem(selPopup, "Copy selection");
                selPopupCut = addMenuItem(selPopup, "Cut selection");
                selPopupRemove = addMenuItem(selPopup, "Remove selection");
@@ -76,25 +105,17 @@ public class MooTrackView extends JPanel {
        }
 
        /**
-        * Creates note elements for all MooNotes in the track, and places them in the appropriate place.
+        * Creates note elements for all MooNotes in the given list, and places them in the appropriate place.
         */
-       public void placeNoteElements(boolean quantize) {
-               // Converts the track.
-               Moosique.convertTrack(track);
-
-               // Empties the container
-               removeAll();
-               coords = new ArrayList(track.size() / 2);
-               selection = new TreeSet();
-
+       public void placeNewNotes(java.util.List notes) {
                // Creates temporary variables
                MidiEvent note;
                MooNoteElement elem;
                extraHeight = Toolkit.getDefaultToolkit().getScreenSize().height - 150;
 
                // Places note elements
-               for (int i = 0; i < track.size(); i++) {
-                       note = track.get(i);
+               for (int i = 0; i < notes.size(); i++) {
+                       note = (MidiEvent)notes.get(i);
                        if (note instanceof MooNote) {
                                // Adds the note element to the note area and moves it to the appropriate place.
                                MooNote mn = (MooNote)note;
@@ -102,8 +123,8 @@ public class MooTrackView extends JPanel {
                                add(elem);
                                layoutElement(elem, false);
                        }
-                       setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight));
                }
+               setPreferredSize(new Dimension(VIEW_WIDTH, viewLength + extraHeight));
        }       
 
        /**
@@ -126,19 +147,15 @@ public class MooTrackView extends JPanel {
                }
 
                // Creates temporary variables.
-               ticksPerSixteenth = Moosique.getSequence().getResolution() / 4;
                MooNote mn = elem.getNote();
                int x, y, height;
 
                // Calculates coordinates.
                x = insets.left;
-               if (quantizeRecording) {
-               
-               } else {
-                       y = insets.top + (int)((mn.getTick() * NOTE_HEIGHT) / ticksPerSixteenth);
-                       height = (mn.getDuration() * NOTE_HEIGHT) / ticksPerSixteenth;
-               }
+               y = insets.top + (int)((mn.getTick() * NOTE_HEIGHT) / ticksPerSixteenth);
+               height = (mn.getDuration() * NOTE_HEIGHT) / ticksPerSixteenth;
                if (height == 0) height = NOTE_HEIGHT;
+               if (snapToSixteenths && height < NOTE_HEIGHT) height = NOTE_HEIGHT;
                r = new Rectangle(x, y, NOTE_WIDTH, height);
 
                // Places the element in the appropriate place.
@@ -201,10 +218,11 @@ public class MooTrackView extends JPanel {
        /**
         * Adds a standard note to this track.
         */
-       private void addStandardNote() {
+       private void addNoteAtClickY(int length) {
+               lastNoteLength = length;
                int row = (popupY - insets.top) / NOTE_HEIGHT;
                long timestamp = (long)(ticksPerSixteenth * row);
-               addNote(new MooNote(title.getChannel(), 60, 100, timestamp, Moosique.getSequence().getResolution() / 4));
+               addNote(new MooNote(title.getChannel(), 60, 100, timestamp, ticksPerSixteenth * length));
        }
 
        /** 
@@ -222,49 +240,11 @@ public class MooTrackView extends JPanel {
                repaint();
        }
 
-       /**
-        * Selects the given note
-        * @param the note to select
-        */
-       public void selectNote(MooNoteElement elem) {
-               selection.add(elem);
-       }
-
-       /**
-        * Deselects the given note
-        * @param the note to deselect
-        */
-       public void deselectNote(MooNoteElement elem) {
-               selection.remove(elem);
-       }
-
-       /**
-        * Deselects all notes.
-        */
-       public void deselectAllNotes() {
-               Iterator it = selection.iterator();
-               while(it.hasNext()) {
-                       ((MooNoteElement)it.next()).deselect();
-               }
-               selection.clear();
-       }
-
-       /**
-        * Determines if the given MooNoteElement is the only one in the track view that is selected.
-        * @return if the given element is the only selected one
-        */
-       public boolean isTheOnlySelected(MooNoteElement elem) {
-               Iterator it = selection.iterator();
-               while(it.hasNext()) {
-                       if (!it.next().equals(elem)) return false;
-               }
-               return true;
-       }
-
        /**
         * Copies the current selection.
         */
        public void copySelectedNotes() {
+               TreeSet selection = Moosique.getSelection();
                ArrayList copyBuffer = new ArrayList(selection.size());
                Iterator it = selection.iterator();
                while(it.hasNext()) {
@@ -298,6 +278,7 @@ public class MooTrackView extends JPanel {
                                mn.setChannel(title.getChannel());
                                addNote(mn);
                        }
+                       Moosique.setEdited();
                }
        }
 
@@ -305,22 +286,26 @@ public class MooTrackView extends JPanel {
         * Removes the current selection.
         */
        public void removeSelectedNotes() {
+               TreeSet selection = Moosique.getSelection();
                Iterator it = selection.iterator();
                while(it.hasNext()) {
                        removeNote((MooNoteElement)it.next());
                }
                selection.clear();
+               Moosique.setEdited();
        }
 
        /**
         * Transposes all selected notes the given number of halftones.
         */
        private void transposeSelectedNotes(int halftones) {
+               TreeSet selection = Moosique.getSelection();
                Iterator it = selection.iterator();
                while(it.hasNext()) {
                        MooNoteElement elem = (MooNoteElement)it.next();
                        elem.transpose(halftones);
                }
+               Moosique.setEdited();
        }
 
        /**
@@ -328,6 +313,7 @@ public class MooTrackView extends JPanel {
         * @param ticks         the number of ticks to move the selection.
         */
        public void moveSelectedNotes(int ticks) {
+               TreeSet selection = Moosique.getSelection();
                if (ticks < 0) {
                        // If the selection should be moved upwards, traverses the list in the natural order.
                        Iterator it = selection.iterator();
@@ -346,14 +332,7 @@ public class MooTrackView extends JPanel {
                                layoutElement(elem, true);
                        }
                }
-       }
-
-       /**
-        * Moves the current selection, depending on the given delta y.
-        * @param y     the number of pixels the selection is moved.
-        */
-       public void maybeMoveSelectedNotes(int y) {
-               moveSelectedNotes(ticksPerSixteenth * (y / NOTE_HEIGHT));
+               Moosique.setEdited();
        }
 
        /**
@@ -411,6 +390,8 @@ public class MooTrackView extends JPanel {
         * @param y     the y-coordinate in which to display the menu
         */
        public void showSelectionPopup(Component c, int x, int y) {
+               // Determines whether the "Properties" item should be available.
+               selPopupProps.setEnabled(Moosique.getSelection().size() == 1);
                selPopup.show(c, x, y);
        }
 
@@ -448,10 +429,10 @@ public class MooTrackView extends JPanel {
                 */
                public void mouseClicked(MouseEvent e) {
                        if (SwingUtilities.isLeftMouseButton(e)) {
-                               deselectAllNotes();
+                               Moosique.deselectAllNotes();
                                if (e.getClickCount() == 2) {
                                        popupY = e.getY();
-                                       addStandardNote();
+                                       addNoteAtClickY(lastNoteLength);
                                }
                        }
                }
@@ -492,11 +473,28 @@ public class MooTrackView extends JPanel {
                public void actionPerformed(ActionEvent e) {
                        Object source = e.getSource();
                        // Handling panel popup actions.
-                       if (source == popupAdd) {
-                               addStandardNote();
+                       if (source == popupAddItemsLast) {
+                               addNoteAtClickY(lastNoteLength);
+                       } else if (source == popupAddItemsCustom) {
+                               /* Show the user a dialog (identical to note preferences...
+                               then call       addNote(new MooNote(
+                               title.getChannel(), pitch, velocity, timestamp, duration));
+                               */
+                       } else if (source == popupAddItemsWhole) {
+                               addNoteAtClickY(16);
+                       } else if (source == popupAddItemsHalf) {
+                               addNoteAtClickY(8);
+                       } else if (source == popupAddItemsQuarter) {
+                               addNoteAtClickY(4);
+                       } else if (source == popupAddItemsEighth) {
+                               addNoteAtClickY(2);
+                       } else if (source == popupAddItemsSixteenth) {
+                               addNoteAtClickY(1);
                        } else if (source == popupPaste) {
                                pasteCopiedNotes();
                        // Handling selection popup actions.
+                       } else if (source == selPopupProps) {
+                               new MooDialog(((MooNoteElement)Moosique.getSelection().first()).getNote());
                        } else if (source == selPopupCopy) {
                                copySelectedNotes();
                        } else if (source == selPopupCut) {