/**
 * @(#)CountersSelectorsPanel.java
 * @author JLMJ
 * @date 2001-10-14
 */
package minoids1.controls;

import minoids1.Box;
import minoids1.Bits;
import minoids1.Minoid;
import minoids1.counter.MinoidsCounterEvent;
import minoids1.viewer.MinoidsViewerPanel;

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class CounterSelectorsPanel extends Panel
    implements ItemListener, AdjustmentListener
{
    private Label boxesLabel;
    private Choice boxesChoice;
    private Label connectionsTypeLabel;
    private Choice connectionsTypeChoice;
    private Label polyominoidsScrollbarLabel;
    private Scrollbar polyominoidsScrollbar;
    private Label polyominoidsLabel;
    
    private CounterControlDialog dialog;
    private MinoidsViewerPanel viewer;
    private Minoid[] minoids;
    
    private Vector boxes;

    public CounterSelectorsPanel(
        CounterControlDialog dialog, MinoidsViewerPanel viewer)
    {
        this.dialog = dialog;
        this.viewer = viewer;

        this.boxes = new Vector();

        boxesLabel = new Label("Bounding Box");
        boxesChoice = new Choice();
        boxesChoice.addItemListener(this);

        connectionsTypeLabel = new Label("Connections");
        connectionsTypeChoice = new Choice();
        connectionsTypeChoice.addItemListener(this);

        polyominoidsScrollbarLabel = new Label("Polyominoid");
        polyominoidsScrollbar = new Scrollbar(Scrollbar.HORIZONTAL);
        polyominoidsScrollbar.addAdjustmentListener(this);
        polyominoidsLabel = new Label("             ");
        updateScrollbar(null);
        
        Panel p1 = new Panel(new BorderLayout());
        p1.add(boxesLabel, BorderLayout.NORTH);
        p1.add(boxesChoice, BorderLayout.SOUTH);
        Panel p2 = new Panel(new BorderLayout());
        p2.add(connectionsTypeLabel, BorderLayout.NORTH);
        p2.add(connectionsTypeChoice, BorderLayout.SOUTH);
        Panel p3 = new Panel(new BorderLayout());
        p3.add(polyominoidsScrollbarLabel, BorderLayout.NORTH);
        p3.add(polyominoidsScrollbar, BorderLayout.SOUTH);
        add(p1);
        add(p2);
        add(p3);
        add(polyominoidsLabel);
    }

    public void setEnabled(boolean enabled) {
        boxesLabel.setEnabled(enabled);
        boxesChoice.setEnabled(enabled);
        connectionsTypeLabel.setEnabled(enabled);
        connectionsTypeChoice.setEnabled(enabled);
        polyominoidsScrollbarLabel.setEnabled(enabled);
        polyominoidsScrollbar.setEnabled(enabled);
        polyominoidsLabel.setEnabled(enabled);
    }
    
    
    private String selectedBox;
    private String selectedType = null;
    private MinoidsCounterEvent minoidsCounterEvent = null;
    
    public void itemStateChanged(ItemEvent e) {
        if (e.getSource() instanceof Choice) {
            Choice c = (Choice)e.getSource();
            if (c == boxesChoice) {
                selectedBox = boxesChoice.getSelectedItem();
                connectionsTypeChoice.select(0);
                selectedType = connectionsTypeChoice.getSelectedItem();
                polyominoidsScrollbar.setValue(0);
                updateScrollbar(dialog.getMinoidsEvent(selectedBox, selectedType));
            } else if (c == connectionsTypeChoice) {
                selectedType = connectionsTypeChoice.getSelectedItem();
                polyominoidsScrollbar.setValue(0);
                updateScrollbar(dialog.getMinoidsEvent(selectedBox, selectedType));
            }
        }
    }
    
    //private int max = 0;
    
    public void updateScrollbar(MinoidsCounterEvent mce) {
        int max = 0;
        minoidsCounterEvent = mce;
        if (mce == null) {
            polyominoidsLabel.setText("none");
        } else {
            Box box = mce.getBox();
            if (box == null) {
                polyominoidsLabel.setText("none");
            } else {
                minoids = Minoid.getBoxMinoids(box.getX(), box.getY(), box.getZ());
                viewer.removeAllMinoids();
                viewer.add(minoids);
                for (int i=0; i < minoids.length; i++) // test
                    minoids[i].setVisible(false);
                polyominoidsScrollbar.setValue(0);
    
                Bits bits = minoidsCounterEvent.getMinoidInBox(0);
                if (bits != null) {
                    for (int i=0; i < bits.getNumberOfBits(); i++) {
                        minoids[i].setVisible(bits.getBit(i));
                    }
                }
                max = minoidsCounterEvent.getNumberOfMinoids();
                polyominoidsLabel.setText("1");
            }
        }
        polyominoidsScrollbar.setMinimum(0);
        polyominoidsScrollbar.setMaximum(max);
        viewer.repaint();
    }
    
    public void adjustmentValueChanged(AdjustmentEvent e) {
        if (minoidsCounterEvent != null) {
            Bits bits = minoidsCounterEvent.getMinoidInBox(e.getValue());
            int max = minoidsCounterEvent.getBox().getMaxOrder();
            for (int i=0; i < max; i++)
                minoids[i].setVisible(bits.getBit(i));
            polyominoidsLabel.setText((e.getValue()+1) + "");
        }
        viewer.repaint();
    }

    public void removeAllBoxes() {
        boxesChoice.removeAll();
        boxes.removeAllElements();
        viewer.removeAllMinoids();
        polyominoidsScrollbar.setValues(0, 0, 0, 0);
        polyominoidsLabel.setText("none");
    }

    public void addBox(Box box) {
        boxesChoice.addItem(box.toShortString());
        boxes.addElement(box);
        boxesChoice.select(box.toShortString());
        selectedBox = boxesChoice.getSelectedItem();
        selectedType = connectionsTypeChoice.getSelectedItem();
        polyominoidsScrollbar.setValue(0);
        updateScrollbar(dialog.getMinoidsEvent(selectedBox, selectedType));
    }

    public Choice getTypeChoice() {
        return connectionsTypeChoice;
    }
}




