/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.nmedit.jtheme.clavia.nordmodular; import java.awt.Graphics; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JScrollBar; import net.sf.nmedit.jtheme.JTContext; import net.sf.nmedit.jtheme.clavia.nordmodular.plaf.NoteSeqEditorUI; import net.sf.nmedit.jtheme.component.JTControl; import net.sf.nmedit.jtheme.component.JTControlAdapter; import net.sf.nmedit.jtheme.store2.BindParameter; public class NMNoteSeqEditor extends JTControl { private static final long serialVersionUID = -737910030163291008L; public static final String uiClassID = "NoteSeqEditorUI"; private static final int STEPS = 16; private int zoom = 5, maxZoom = 5, minZoom = 1; private JTControlAdapter[] controlAdapters = new JTControlAdapter[STEPS]; private JTControlAdapter[] controlExtensionAdapters = new JTControlAdapter[STEPS]; private int maxTranslation = 10; private int translation = 0; private boolean modified = true; public NMNoteSeqEditor(JTContext context) { super(context); computeMaxTranslation(); setTranslation(maxTranslation/2); clear(); } protected void setModified(boolean modified) { this.modified = true; } protected void paintComponent(Graphics g) { if (modified) { modified = false; setDoubleBufferNeedsUpdate(); } super.paintComponentWithDoubleBuffer(g); } private void computeMaxTranslation() { // original component // zoom | maxTranslation // 1 | 127 // 2 | 57 // 3 | 37 // 4 | 27 // 5 | 10 final int mint = 10; final int maxt = 127; setMaxTranslation( mint+(((maxt-mint)*(zoom-1))/4) ); } private void setMaxTranslation(int max) { if (max<=0) max = 1; if (this.maxTranslation != max) { // scale translation value translation = (max*translation)/maxTranslation; this.maxTranslation = max; setModified(true); fireStateChanged(); // invokes repaint() } } public int getMaxTranslation() { return maxTranslation; } public int getTranslation() { return translation; } public void setTranslation(int t) { t = Math.max(0, Math.min(t, maxTranslation)); if (this.translation != t) { this.translation = t; setModified(true); fireStateChanged(); // invokes repaint() } } // protected class NoteListener implements ChangeListener{ // int note; // boolean isPlus; // public NoteListener(int note, boolean isPlus) { // this.note = note; // this.isPlus = isPlus; // } // public void stateChanged(ChangeEvent e) { // if (isPlus) // setNote(note, getNote(note)+1); // else // setNote(note, getNote(note)-1); // } // // } @BindParameter(name="step",count=16) public void setControlAdapter(int i, JTControlAdapter adapter) { JTControlAdapter oldAdapter = controlAdapters[i]; if (oldAdapter != null) { uninstallAdapter(oldAdapter); } controlAdapters[i] = adapter; if (adapter != null) installAdapter(adapter); } public JTControlAdapter getControlAdapter(int i){ return controlAdapters[i]; } @BindParameter(name="stepExtension",count=16) public void setControlExtensionAdapter(int i, JTControlAdapter adapter) { JTControlAdapter oldAdapter = controlExtensionAdapters[i]; if (oldAdapter != null) { uninstallAdapter(oldAdapter); } controlExtensionAdapters[i] = adapter; if (adapter != null) installAdapter(adapter); } private void uninstallAdapter(JTControlAdapter adapter) { adapter.setComponent(null); adapter.setChangeListener(null); } private void installAdapter(JTControlAdapter adapter) { adapter.setComponent(this); adapter.setChangeListener(this); } public String getUIClassID() { return uiClassID; } public int getMinZoom() { return minZoom; } public int getMaxZoom() { return maxZoom; } public int getZoom() { return zoom; } public void setZoom(int z) { if (minZoom<=z && z<= maxZoom && this.zoom != z) { this.zoom = z; computeMaxTranslation(); setModified(true); repaint(); } } public void zoomIn(){ setZoom(zoom + 1); } public void zoomOut(){ setZoom(zoom - 1); } public int getRowHeight() { return getZoom(); } public void randomize() { int amp = (maxZoom - getZoom()+1)*12; for (int i=0;i<getNoteCount();i++) setNote(i, (int)(Math.random()*amp)+ 60 - amp/2); } public void clear() { for (int i=0;i<getNoteCount();i++) setNote(i, 64); } public int getNoteCount() { return controlAdapters.length; } public int getNote(int index) { JTControlAdapter ca = controlAdapters[index]; return ca == null ? 0 : ca.getValue(); } public void setNote(int index, int value) { JTControlAdapter ca = controlAdapters[index]; if (ca != null) { if (ca.getValue() != value) { ca.setValue(value); setModified(true); repaint(); } } } public int getExtension(int index) { JTControlAdapter ca = controlExtensionAdapters[index]; return ca == null ? 0 : ca.getValue(); } public void setExtension(int index, int value) { JTControlAdapter ca = controlExtensionAdapters[index]; if (ca != null) { if (ca.getValue() != value) { ca.setValue(value); setModified(true); repaint(); } } } public void showControlPopup(MouseEvent e, int parameterIndex) { JTContext c = getContext(); if (c == null) return; ControlPopupHandler popup = (ControlPopupHandler) c.getPopupHandler(this); if (popup != null) popup.showPopup(e, this, parameterIndex); } public static void main(String[] args) { JFrame f = new JFrame(NMNoteSeqEditor.class.getName()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setBounds(0, 0, 400, 360); f.getContentPane().setLayout(null); final NMNoteSeqEditor ed = new NMNoteSeqEditor(null); ed.setUI(NoteSeqEditorUI.createUI(ed)); f.getContentPane().add( ed ); final JScrollBar sb = new JScrollBar(JScrollBar.VERTICAL, ed.getZoom(),1, ed.getMinZoom(), ed.getMaxZoom()+1); sb.addAdjustmentListener(new AdjustmentListener(){ public void adjustmentValueChanged(AdjustmentEvent e) { ed.setZoom(sb.getValue()); }}); ed.setLocation(0, 0); ed.setSize(ed.getPreferredSize()); sb.setLocation(ed.getWidth()+2, 0); sb.setSize(13, ed.getHeight()); f.getContentPane().addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e) { ed.randomize(); } }); f.getContentPane().add(sb); f.setVisible(true); } public int getSteps() { return STEPS; } }