package imseProc.jotter;

import imseProc.core.ImagePipeController;
import imseProc.core.ImgPipe;
import imseProc.core.ImgSink;
import imseProc.core.ImgSource;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;

/** Controller for both source and sink */ 
public class JotterSWTController implements ImagePipeController {
	private JotterPipe pipe;
	private Group swtGroup;
	private Spinner pulseSpinner;
	private Text notesTextBox;
	private Button saveLoadImageButton;
	private Button saveTextButton;
	private Button resetTextButton;
	
	public JotterSWTController(JotterPipe pipe, Composite parent, int style) {
		this.pipe = pipe;
				
		swtGroup = new Group(parent, style);
		swtGroup.setText("Jotter " + ((pipe instanceof ImgSource) ? "(Source)" : "(Sink)"));
		swtGroup.setLayout(new GridLayout(3, false));
		Label lS = new Label(swtGroup, SWT.NONE); lS.setText("Pulse:"); 
		
		pulseSpinner = new Spinner(swtGroup, SWT.NONE);
		int pulse = (pipe instanceof JotterSource) ? ((JotterSource)pipe).getCurrentPulse() : -1;
		pulseSpinner.setValues(pulse, -1, Integer.MAX_VALUE, 0, 1, 100);
		pulseSpinner.addListener(SWT.Modify, new Listener() { @Override public void handleEvent(Event event) { pulseChangedEvent(event); } });
		
		notesTextBox = new Text(swtGroup, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER );
		notesTextBox.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, true, 3, 1));
		notesTextBox.addListener(SWT.Modify, new Listener() { @Override public void handleEvent(Event event) { textChangedEvent(event); } });
		
		saveLoadImageButton = new Button(swtGroup, SWT.PUSH);
		if(pipe instanceof JotterSink){
			saveLoadImageButton.setText("Save Image+Text");
			saveLoadImageButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) {  saveImageButtonEvent(event); } });
		}else{
			saveLoadImageButton.setText("Load Image");
			saveLoadImageButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) {  loadImageButtonEvent(event); } });
		}
		
		saveTextButton = new Button(swtGroup, SWT.PUSH);
		saveTextButton.setText("Save Text");
		saveTextButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) {  saveTextButtonEvent(event); } });
		
		resetTextButton = new Button(swtGroup, SWT.PUSH);
		resetTextButton.setText("Reset Text");
		resetTextButton.addListener(SWT.Selection, new Listener() { @Override public void handleEvent(Event event) {  resetTextButtonEvent(event); } });
		
		pulseChangedEvent(null);
	}
	
	private void pulseChangedEvent(Event event) {
		int pulse = pulseSpinner.getSelection();
		if(pulse < 0){
			saveLoadImageButton.setEnabled(false);
			saveTextButton.setEnabled(false);
			resetTextButton.setEnabled(false);
			notesTextBox.setEnabled(false);
			notesTextBox.setText("\n\n\n\n");//make it display 4 lines if it can
		}else{
			saveLoadImageButton.setEnabled(true);
			saveTextButton.setEnabled(true);
			resetTextButton.setEnabled(true);
			notesTextBox.setEnabled(true);				
			loadText();
			textChangedEvent(null);
		}
	}
	
	private void resetTextButtonEvent(Event event){
		loadText();
		textChangedEvent(null);
	}
	
	private void loadText() {
		int pulse = pulseSpinner.getSelection();
		String txt = pipe.getText(pulse);
		notesTextBox.setText((txt != null) ? txt : "[ Empty ]");
	}
	
	private void saveImageButtonEvent(Event event){
		int pulse = pulseSpinner.getSelection();
		((JotterSink)pipe).saveImage(pulse);
		pipe.setText(pulse, notesTextBox.getText());
		textChangedEvent(null); //save text aswell
	}
	
	private void saveTextButtonEvent(Event event){
		int pulse = pulseSpinner.getSelection();
		pipe.setText(pulse, notesTextBox.getText());
		textChangedEvent(null); //save text aswell
	}
	
	private void loadImageButtonEvent(Event event){
		int pulse = pulseSpinner.getSelection();
		((JotterSource)pipe).loadImage(pulse);
	}
	
	private void textChangedEvent(Event event){
		int pulse = pulseSpinner.getSelection();
		if(notesTextBox.getText().equalsIgnoreCase(pipe.getText(pulse))){
			notesTextBox.setForeground(swtGroup.getDisplay().getSystemColor(SWT.COLOR_BLACK));
		}else{			
			notesTextBox.setForeground(swtGroup.getDisplay().getSystemColor(SWT.COLOR_RED));
		}
	} 

	@Override
	public Composite getInterfacingObject() { return swtGroup; }

	@Override
	public void generalControllerUpdate() { 
		
	}
	
	@Override
	public void destroy() {
		swtGroup.dispose();
		pipe.controllerDestroyed(this);
	}

	@Override
	public ImgPipe getPipe() { return pipe;	}
}

