import java.awt.*; import java.beans.*; import utilities.gfx.*; public class NumericDialPanel extends Panel { protected NumericDial[] dials; // the embedded dials protected String panelTitle; protected int numDials; protected int panelWidth, panelHeight; protected FontMetrics fm; //------------------------------------------------------------------- // NumericDialPanel Constructor //------------------------------------------------------------------- public NumericDialPanel(String panelTitle, NDPDialDescriptor[] descs) { this.panelTitle = panelTitle; panelWidth = panelHeight = 0; numDials = descs.length; dials = new NumericDial[numDials]; for (int i=0; i < numDials; i++) { int dialSize = descs[i].dialSize; double minValue = descs[i].minValue; double maxValue = descs[i].maxValue; String dialName = descs[i].dialName; NumericDial dial; // instantiate the right type of NumericDial if ( descs[i].forAngles ) { dial = new AngleDial(dialName, dialSize); } else { dial = new NumericDial(dialName, dialSize, minValue, maxValue); } // track the size of the resulting Panel for preferredSize() panelWidth += dialSize; panelHeight = Math.max(panelHeight, dialSize); add(dial); // add to FlowLayout-managed Panel dials[i] = dial; } panelWidth += (int)(panelWidth*0.10); panelHeight += (int)(panelHeight*0.10); int fontHeight = 16; panelHeight += 2*(fontHeight+3); } //------------------------------------------------------------------- // set()/get() for 'dialValues' property //------------------------------------------------------------------- public void setDialValues(double[] values) { if ( values.length != numDials ) { throw new IllegalArgumentException("Not this # of dials: " + values.length); } for (int i=0; i < numDials; i++) { dials[i].setValue(values[i]); } } //------------------------------------------------------------------- public double[] getDialValues() { double[] values = new double[numDials]; for (int i=0; i < numDials; i++) { values[i] = dials[i].getValue(); } return values; } //------------------------------------------------------------------- // indexed set()/get() for 'dialNValue' property //------------------------------------------------------------------- public void setDialNValue(int index, double value) { dials[index].setValue(value); } public double getDialNValue(int index) { return dials[index].getValue(); } //------------------------------------------------------------------- // preferred size for our component //------------------------------------------------------------------- public Dimension preferredSize() { // 1.0-style return new Dimension(panelWidth, panelHeight); } public Dimension getPreferredSize() { // 1.1-style return preferredSize(); } //------------------------------------------------------------------- // Overridden insets to make some room at the top for the panel title //------------------------------------------------------------------- public Insets insets() { // 1.0-style return new Insets(16, 0,0,0); } public Insets getInsets() { // 1.1-style return insets(); } //------------------------------------------------------------------- // Overridden Component.paint() //------------------------------------------------------------------- public void paint(Graphics g) { int width = getSize().width; g.drawRect(0,0, width-1, getSize().height-1); if ( fm == null ) { fm = g.getFontMetrics(getFont()); } GfxKit.drawCenteredString(g, panelTitle, new Dimension(width, 16), fm); } //------------------------------------------------------------------- // PropertyChangeListener management methods //------------------------------------------------------------------- public void addPropertyChangeListener(PropertyChangeListener listener) { // bypass us completely by hooking up the listener directly to all // our embedded NumericDials. for (int i=0; i < numDials; i++) { dials[i].addPropertyChangeListener(listener); } } public void removePropertyChangeListener(PropertyChangeListener listener) { for (int i=0; i < numDials; i++) { dials[i].removePropertyChangeListener(listener); } } //------------------------------------------------------------------- // Self-test code //------------------------------------------------------------------- public static void main (String[] args) { Frame window = new Frame("NumericDialPanel Test"); NDPDialDescriptor[] descs = new NDPDialDescriptor[3]; descs[0] = new NDPDialDescriptor("Huge" , 80, 0.0,1000.0); descs[1] = new NDPDialDescriptor("Moderate" , 60, 20.0,40.0); descs[2] = new NDPDialDescriptor("Angle" , 80); NumericDialPanel ndp = new NumericDialPanel("Test NDP", descs); window.setLayout(new FlowLayout()); window.add(ndp); window.add(new Dial()); window.pack(); window.setVisible(true); } } // End of Class NumericDialPanel