package it.unimi.mat.mvc;

import java.util.Observable;
import java.util.Observer;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Slider;

public class LifeGameView extends Shell implements Observer {
	
	int size = 10;
	Canvas canvas;
	
	@Override
	protected void checkSubclass() {
		return;
	}
	
	public LifeGameView(final LifeGameController controller) {
		
		super(controller.display);
		GridLayout gl = new GridLayout(3, false);
		this.setLayout(gl);
		
		Button newView = new Button(this, SWT.PUSH);
		newView.setText("new view");
		GridData newViewGD = new GridData(GridData.FILL_HORIZONTAL);
		newView.setLayoutData(newViewGD);
		newView.addSelectionListener(controller.newViewListener);
		
		Slider speed = new Slider(this, SWT.VERTICAL);
		speed.setMinimum(3);
		speed.setMaximum(1000);
		GridData speedGD = new GridData(GridData.FILL_VERTICAL);
		speedGD.verticalSpan = 5;
		speed.setLayoutData(speedGD);
		speed.addSelectionListener(controller.speedListener);
		
		final Slider zoom = new Slider(this, SWT.VERTICAL);
		zoom.setMinimum(1);
		zoom.setMaximum(10);
		GridData zoomGD = new GridData(GridData.FILL_VERTICAL);
		zoomGD.verticalSpan = 5;
		zoom.setLayoutData(zoomGD);
		
		Button reset = new Button(this, SWT.PUSH);
		reset.setText("reset");
		GridData resetGD = new GridData(GridData.FILL_HORIZONTAL);
		reset.setLayoutData(resetGD);
		reset.addSelectionListener(controller.resetListener);
		
		Button stopButton = new Button(this, SWT.PUSH);
		stopButton.setText("pause");
		GridData stopButtonGD = new GridData(GridData.FILL_HORIZONTAL);
		stopButton.setLayoutData(stopButtonGD);
		stopButton.addSelectionListener(controller.stopListener);
		
		Button restart = new Button(this, SWT.PUSH);
		restart.setText("play");
		GridData restartGD = new GridData(GridData.FILL_HORIZONTAL);
		restart.setLayoutData(restartGD);
		restart.addSelectionListener(controller.restartListener);
		
		zoom.addSelectionListener(
			new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					size = zoom.getSelection();
					canvas.setSize(controller.model.columns * size, controller.model.rows * size);
					canvas.redraw();
				}
			}
		);
		
		ScrolledComposite sc = new ScrolledComposite(this.canvas, SWT.H_SCROLL | SWT.V_SCROLL);
		GridData scGD = new GridData(GridData.FILL_BOTH);
		scGD.heightHint = size * controller.model.columns;
		scGD.widthHint = size * controller.model.rows;
		sc.setLayoutData(scGD);
		
		canvas = new Canvas(sc, SWT.NONE);
		sc.setContent(canvas);
		canvas.setSize(size * controller.model.columns, size * controller.model.rows);
		canvas.addPaintListener(controller.paintListener);
		addDisposeListener(controller.disposeListener);
		
		pack();
		open();
	}
	
	public void update(Observable obs, Object obj) {
		canvas.redraw();
	}

}
