/* @(#)Methods.java 1.0  16 November 2004 */

/* Useful imports */

import edu.neu.ccs.*;
import edu.neu.ccs.gui.*;
import edu.neu.ccs.codec.*;
import edu.neu.ccs.console.*;
import edu.neu.ccs.filter.*;
import edu.neu.ccs.jpf.*;
import edu.neu.ccs.parser.*;
import edu.neu.ccs.pedagogy.*;
import edu.neu.ccs.quick.*;
import edu.neu.ccs.util.*;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.font.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.border.*;
import java.io.*;
import java.util.*;
import java.math.*;
import java.beans.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.regex.*;

// import java.text.*;

public class Methods extends JPF 
{
    
    public static void main(String[] args) { 
        new Methods();
    }
    
    public void ShowRandomBitDisplay() {
        BitDisplay display = new BitDisplay();
        
        JPTFrame.createQuickJPTFrame("test", display);
        
        display.setBitsRandomly();
    }
    
    public void ShowBitDisplayFromInteger(int value) {
        BitDisplay display = new BitDisplay();
        
        JPTFrame.createQuickJPTFrame("test", display);
        
        display.setBitsFromInteger(value);
    }
    
    public void ShowBitDisplayTester() {
        BitDisplayTester.test();
    }
}


class BitDisplay extends TablePanel {
    
    public static final String TOGGLE = "toggle";
    
    private PaintSwatch[] swatchdata = new PaintSwatch[32];
    
    private Hashtable location = new Hashtable();
    
    private MouseAction toggle = new MouseAction() {
        public void mouseActionPerformed(MouseEvent evt) {
            PaintSwatch swatch = (PaintSwatch) evt.getComponent();
            toggleSwatch(swatch);
            fire();
        }
    };
    
    public BitDisplay() {
        super(2, 32, 5, 5, CENTER);
        initializeCells();
    }
    
    void initializeCells() {
        // cell numbers
        for (int i = 0; i <= 31; i++) {
            int j = 31 - i;
            addObject("" + i, 0, j);
        }
        
        // create and install swatches
        for (int i = 0; i <= 31; i++) {
            int j = 31 - i;
            swatchdata[i] = new PaintSwatch(Colors.white, 15, 15);
            addObject(swatchdata[i], 1, j);
            location.put(swatchdata[i], new Integer(i));
            MouseActionAdapter adapter = swatchdata[i].getMouseActionAdapter();
            adapter.addMouseReleasedAction(toggle);
        }
        
    }
    
    public void setBit(int position, int bit) {
        if ((position < 0) || (position > 31))
            return;
        
        if ((bit < 0) || (bit > 1))
            return;
        
        if (bit == 1)
            swatchdata[position].setPaint(Colors.black);
        else
            swatchdata[position].setPaint(Colors.white);
    }
    
    public int getBit(int position) {
        if ((position < 0) || (position > 31))
            return 0;
        
        Paint paint = swatchdata[position].getPaint();
        
        if (paint.equals(Colors.black))
            return 1;
        else
            return 0;
    }
    
    public void toggleBit(int position) {
        if ((position < 0) || (position > 31))
            return;
        
        setBit(position, 1 - getBit(position));
    }
    
    public void setBitsRandomly() {
        for (int i = 0; i <= 31; i++)
            setBit(i, MathUtilities.randomInt(0, 1));
    }
    
    public void setBitsFromInteger(int value) {
        // to do
    }
    
    public int getIntegerFromBits() {
        // to do
        return 0;
    }
    
    private int getLocation(PaintSwatch swatch) {
        Integer integer = (Integer) location.get(swatch);
        
        if (integer == null)
            return -1;
        
        return integer.intValue();
    }
    
    private void toggleSwatch(PaintSwatch swatch) {
        toggleBit(getLocation(swatch));
    }
    
    private void fire() {
        firePropertyChange(TOGGLE, (int)0, (int)1);
    }
    
}


class BitDisplayTester extends DisplayPanel {
    
    private BitDisplay display = new BitDisplay();
    
    private TextFieldView view = new TextFieldView("0", 200);
    
    private Annotation counter = new Annotation("Mouse Click Count = 0");
    
    private int clickcount = 0;
    
    private TablePanel mainPanel = new TablePanel
    	(new Object[] { view, counter, display }, VERTICAL, 10, 10, CENTER);
    
    
    private SimpleAction updateFromBits = new SimpleAction("update from bits") {
        public void perform() {
            updateIntegerFromBits();
            updateCounter();
        }
    };
    
    private SimpleAction updateFromView = new SimpleAction("update from view") {
        public void perform() {
            updateBitsFromInteger();
        }
    };
    
    
    private void updateIntegerFromBits() {
        view.setViewState("" + display.getIntegerFromBits());
    }
    
    private void updateCounter() {
        clickcount++;
        counter.setText("Mouse Click Count = " + clickcount);
    }
    
    private void updateBitsFromInteger() {
        display.setBitsFromInteger(view.demandInt());
    }
    
    
    private void setBackgrounds() {
        Color backcolor = Colors.burlywood;
        
        setBackground(backcolor);
        display.setBackground(backcolor);
        mainPanel.setBackground(backcolor);
    }
    
    
    public BitDisplayTester() {
        setBackgrounds();
        add(mainPanel);
        
        display.addPropertyChangeListener(BitDisplay.TOGGLE, updateFromBits);
        view.addActionListener(updateFromView);
    }
    
    
    public static void test() {
        JPTFrame.createQuickJPTFrame("test", new BitDisplayTester());
    }
}
