/* 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.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.sf.nmedit.jtheme.JTContext;
import net.sf.nmedit.jtheme.clavia.nordmodular.graphics.MultiEnvelope;
import net.sf.nmedit.jtheme.component.JTControlAdapter;
import net.sf.nmedit.jtheme.component.JTDisplay;
import net.sf.nmedit.jtheme.store2.BindParameter;
public class JTMultiEnvDisplay extends JTDisplay implements ChangeListener {
/**
*
*/
private static final long serialVersionUID = 9061406842045130579L;
private MultiEnvelope multiEnv;
private JTControlAdapter levelAdapter[];
private JTControlAdapter timeAdapter[];
private JTControlAdapter sustainAdapter;
private JTControlAdapter curveAdapter;
public JTMultiEnvDisplay(JTContext context) {
super(context);
multiEnv = new MultiEnvelope();
// adapters themselves are created externally and set with the
// setAdapter method
levelAdapter = new JTControlAdapter[4];
timeAdapter = new JTControlAdapter[5];
}
protected void paintComponent(Graphics g)
{
if (multiEnv.isModified())
{
multiEnv.setModified(false);
setDoubleBufferNeedsUpdate();
}
super.paintComponentWithDoubleBuffer(g);
}
protected void paintDynamicLayer(Graphics2D g) {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (multiEnv.getCurve() == 0){
//lin curve type, draw the ref line
int h = getHeight();
int w = getWidth();
Insets insets = getInsets();
g.setColor(JTNM1Context.GRAPH_DISPLAY_LINE);
int y = (int)(insets.top+h*.45);
g.drawLine(insets.left, y, w-1, y);
}
g.setColor(getForeground());
multiEnv.setBounds(0, 0, getWidth(), getHeight());
g.draw(multiEnv);
}
public int getCurve(){
return multiEnv.getCurve();
}
public int getLevel(int seg) {
return multiEnv.getLevel(seg+1);
}
public int getTime(int seg) {
return multiEnv.getTime(seg+1);
}
public int getSustain() {
return multiEnv.getSustainSeg();
}
public void setLevel(int seg, int value) {
if (getLevel(seg) != value) {
multiEnv.setLevel(seg+1, value);
repaint();
}
}
public void setTime(int seg, int value) {
if (getTime(seg) != value) {
multiEnv.setTime(seg+1, value);
repaint();
}
}
public void setSustain(int value) {
if (getSustain() != value) {
multiEnv.setSustainSeg(value);
repaint();
}
}
public void setCurve(int value) {
if (getCurve() != value) {
multiEnv.setCurve(value);
repaint();
}
}
public JTControlAdapter getLevelAdapter(int seg) {
return levelAdapter[seg];
}
public JTControlAdapter getSustainAdapter() {
return sustainAdapter;
}
public JTControlAdapter getCurveAdapter() {
return curveAdapter;
}
public JTControlAdapter getTimeAdapter(int seg) {
return timeAdapter[seg];
}
@BindParameter(name="l", count=4)
public void setLevelAdapter(int seg, JTControlAdapter adapter) {
JTControlAdapter oldAdapter = this.levelAdapter[seg];
if (oldAdapter != adapter) {
if (oldAdapter != null)
oldAdapter.setChangeListener(null);
this.levelAdapter[seg] = adapter;
if (adapter != null)
adapter.setChangeListener(this);
updateLevel(seg);
}
}
@BindParameter(name="t", count=5)
public void setTimeAdapter(int seg, JTControlAdapter adapter) {
JTControlAdapter oldAdapter = this.timeAdapter[seg];
if (oldAdapter != adapter) {
if (oldAdapter != null)
oldAdapter.setChangeListener(null);
this.timeAdapter[seg] = adapter;
if (adapter != null)
adapter.setChangeListener(this);
updateTime(seg);
}
}
@BindParameter(name="sustain")
public void setSustainAdapter(JTControlAdapter adapter) {
JTControlAdapter oldAdapter = this.sustainAdapter;
if (oldAdapter != adapter) {
if (oldAdapter != null)
oldAdapter.setChangeListener(null);
this.sustainAdapter = adapter;
if (adapter != null)
adapter.setChangeListener(this);
updateSustain();
}
}
@BindParameter(name="curve")
public void setCurveAdapter(JTControlAdapter adapter) {
JTControlAdapter oldAdapter = this.curveAdapter;
if (oldAdapter != adapter) {
if (oldAdapter != null)
oldAdapter.setChangeListener(null);
this.curveAdapter = adapter;
if (adapter != null)
adapter.setChangeListener(this);
updateCurve();
}
}
protected void updateLevel(int seg) {
if (levelAdapter[seg] != null)
setLevel(seg,levelAdapter[seg].getValue());
}
protected void updateTime(int seg) {
if (timeAdapter[seg] != null)
setTime(seg,timeAdapter[seg].getValue());
}
protected void updateSustain() {
if (sustainAdapter != null)
setSustain(sustainAdapter.getValue());
}
protected void updateCurve(){
if (sustainAdapter != null)
setCurve(curveAdapter.getValue());
}
public void stateChanged(ChangeEvent e) {
for (int i = 0 ; i < levelAdapter.length ; i++)
{
if (e.getSource() == levelAdapter[i]) {
updateLevel(i);
return;
}
}
for (int i = 0 ; i < timeAdapter.length ; i++)
{
if (e.getSource() == timeAdapter[i]) {
updateTime(i);
return;
}
}
if (e.getSource() == sustainAdapter) {
updateSustain();
return;
}
if (e.getSource() == curveAdapter) {
updateCurve();
return;
}
}
}