import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.event.*;
import javax.swing.JOptionPane;
import de.grogra.imp.IMPWorkbench;

const int UI_TOP = 30;
const int UI_LEFT = 1;
const int UI_POSITION_TOP = 300;
const int UI_POSITION_LEFT = 400;
const int UI_WIDTH = 530;
const int UI_HEIGHT = 400;

module SnookerUI extends JDialog((JDialog)null, "Eingabe", true) implements ChangeListener { 

    private JPanel panel; 
    private JSlider slEast; 
    private JSlider slSouth; 
    public int orientation = 55; 
    public int amount = 59; 
    public int cut;
    public Vector3d target = new Vector3d();
    static private JSlider slCut, slPlaceX, slPlaceY;
    private JButton okButton, cancelButton, resetButton;
    boolean result = false;
    
    /** Konstruktor **/ 
    { 
        Snooker.Cue q = first((* Snooker.Cue *));
        if(q != null)
        {    
            orientation = 180 - q.orientation;
            amount = (int)Math.round(q.distance * Snooker.QUEUE_DISTANCE_FACTOR);
            cut = q.cut;
        }
        Container cp = getContentPane(); 
        cp.setLayout( new FlowLayout() );

		// for image
        panel = new JPanel(); 
        panel.setPreferredSize(new Dimension(100, 100));
        cp.add(panel); 

//cp.add(new JLabel("Power:"));
        //Vertikaler Schieberegler 
        slEast = new JSlider(JSlider.VERTICAL, 0, 100, 0); 
        slEast.setMajorTickSpacing(50); 
        slEast.setMinorTickSpacing(10); 
        slEast.setPaintTicks(true); 
        slEast.addChangeListener(this); 
        slEast.setPreferredSize(new Dimension(400, 100));
        slEast.setModel(new DefaultBoundedRangeModel(amount, 0, 0, 100) );
        cp.add(slEast);

//cp.add(new JLabel("Hit-Position:"));        
        //Horizontaler Schieberegler 
        slCut = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); 
        slCut.setMajorTickSpacing(100); 
        slCut.setMinorTickSpacing(10); 
        slCut.setPaintTicks(true); 
        slCut.setPaintTrack(true); 
        //slSouth.setSnapToTicks(true); 
        slCut.addChangeListener(this); 
        slCut.setPreferredSize(new Dimension(100, 40));
        
        slCut.setModel(new DefaultBoundedRangeModel(cut, 0, -100, 100) ); 
        cp.add(slCut); 

//cp.add(new JLabel("Angle:"));        
        //Horizontaler Schieberegler 
        slSouth = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); 
        slSouth.setMajorTickSpacing(100); 
        slSouth.setMinorTickSpacing(10); 
        slSouth.setPaintTicks(true); 
        slSouth.setPaintTrack(true); 
        //slSouth.setSnapToTicks(true); 
        slSouth.addChangeListener(this); 
        slSouth.setPreferredSize(new Dimension(400, 40));
        
        slSouth.setModel(new DefaultBoundedRangeModel(orientation, 0, -180, 180) ); 
        cp.add(slSouth); 

        setSize(UI_WIDTH,UI_HEIGHT); 
        setLocation(UI_POSITION_LEFT,UI_POSITION_TOP);
        
        panel = new JPanel(); 
        panel.setPreferredSize(new Dimension(UI_WIDTH, 160));
        cp.add(panel); 

panel.add(new JLabel("X/Y-Position for white ball:"));		
        slPlaceY = new JSlider(JSlider.VERTICAL, 0, 100, 0); 
        slPlaceY.setMajorTickSpacing(100); 
        slPlaceY.setMinorTickSpacing(10); 
        slPlaceY.setPaintTicks(true); 
        slPlaceY.setPaintTrack(true); 
        slPlaceY.addChangeListener(this); 
        slPlaceY.setPreferredSize(new Dimension(UI_WIDTH, 100));
        slPlaceY.setModel(new DefaultBoundedRangeModel(100, 0, 0, 100) ); 
        panel.add(slPlaceY);        

//panel.add(new JLabel("X-Position"));
        slPlaceX = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); 
        slPlaceX.setMajorTickSpacing(100); 
        slPlaceX.setMinorTickSpacing(10); 
        slPlaceX.setPaintTicks(true); 
        slPlaceX.setPaintTrack(true); 
        slPlaceX.addChangeListener(this); 
        slPlaceX.setPreferredSize(new Dimension(100, 40));
        slPlaceX.setModel(new DefaultBoundedRangeModel(0, 0, -100, 100) ); 
        panel.add(slPlaceX);    
    
        resetButton = new JButton("OK");
        resetButton.setText("reset table");
        resetButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                Snooker.resetTable = true;
            }
        });
        cp.add(resetButton);
        
        okButton = new JButton("OK");
        okButton.setText("OK");
        okButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                result = true;
                dispose();
            }
        });
        
        cp.add(okButton);
        
    } 
 	public void mouseClicked(MouseEvent e)
	{
		dispose();	
		
	}    
    
    public void show()
    {
        resetButton.setEnabled(Player.tableResetable);
        slPlaceX.setEnabled(Player.playingState == Rules.BALL_IN_HAND);
        slPlaceY.setEnabled(Player.playingState == Rules.BALL_IN_HAND);
        super.show();
    }
    public boolean doModal()
    {
        result = false;
        setModal(true);
        setVisible(true);
        return result;
    }
            
    public void stateChanged(ChangeEvent event) { 
        JSlider sl = (JSlider)event.getSource(); 
        if (sl == slEast) { 
           amount = sl.getValue(); 
        } else if(sl == slSouth) { 
           orientation = sl.getValue(); 
        } else if(sl == slCut) {
            cut = sl.getValue();
        } else if((sl == slPlaceY) || (sl == slPlaceX)) {
           Player.changeWhitePosition(slPlaceX.getValue(), slPlaceY.getValue());
        }        
        repaint();
    } 

    public static void setPlaceX(int x)
    {
        slPlaceX.setValue(x);
    }
    
    public void paint(Graphics g)
    { 
         super.paint(g);
         g.fillRect(UI_LEFT, UI_TOP, 100, 100); 
         g.setColor(Color.white);
         g.fillOval(UI_LEFT, UI_TOP, 100, 100);
         g.setColor(Color.red);
         g.fillOval(Math.round(UI_LEFT + 50 + cut / 2 - 3), UI_TOP + 47, 6, 6);
    } 

}
