package org.custom.example.editors;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;

public class EditorPage3 extends FormPage {
	
	/*
	 * Create new EditorPage from <code>editor</code>
	 */
	public EditorPage3(FormEditor editor) throws PartInitException {
		super(editor, "EditorPage3", "EditorPage3");
		
		if (! (editor instanceof MyEditor)) {
			throw new PartInitException("Unable to init EditorPage");
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
	 */
	protected void createFormContent(final IManagedForm managedForm) {		
		final ScrolledForm form = managedForm.getForm();
		form.setText("Header");

		form.getBody().setBackground(form.getBody().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
		
		TableWrapLayout layout = new TableWrapLayout();
		TableWrapData td;
		layout.numColumns = 2;
		
		Composite parent = form.getBody();
		parent.setLayout(layout);
		
		FormToolkit toolkit = getManagedForm().getToolkit();
		
		for (int i = 0; i < 20; i++) {
			TreeNode node = new TreeNode(
					"Node " + getSlump(1,100), 
					String.valueOf(getSlump(1,100)), 
					ParameterType.values()[getSlump(0, ParameterType.values().length - 1)]);
			
			ParameterType type = node.getType();
			
			// Label
			td = new TableWrapData();
			td.valign = TableWrapData.BOTTOM;
			//td.widthHint = 140;
			//td.heightHint = 20;
			//td.verticalAlignment = SWT.CENTER;
			Label label = toolkit.createLabel(parent, node.getType().toString() + " for " + node.getName());
			label.setData(node);
			label.setLayoutData(td);
			
			// Control
			Control control;
			td = new TableWrapData();
			td.align = TableWrapData.FILL;
			if (type == ParameterType.STRING) {
				// String
				Text text = toolkit.createText(parent, node.getValue(), SWT.BORDER);
				control = text;
				
			} else if (type == ParameterType.FLOAT) {
				// Float
				Text text = toolkit.createText(parent, node.getValue(), SWT.BORDER);
				control = text;
				
			} else if (type == ParameterType.INTEGER) {
				// Integer
				Text text = toolkit.createText(parent, node.getValue(), SWT.BORDER);
				control = text;
				
			} else if (type == ParameterType.FUNCTION_NAME) {
				// Function-Name
				Text text = toolkit.createText(parent, node.getValue(), SWT.BORDER);
				control = text;
				
			} else if (type == ParameterType.BOOLEAN) {
				// Boolean
				Button button = toolkit.createButton(parent, "", SWT.CHECK);
				
				try {
					Integer integer = new Integer(node.getValue());
					if (integer > 40)
						button.setSelection(true);
				} catch (NumberFormatException ex) {
					
				}
				if (node.getValue().equals("1"))
					button.setSelection(true);
				
				control = button;
			} else if (type == ParameterType.ENUMERATION) {
				// Enumeration
				Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
				combo.add(node.getValue());
				combo.add("0");
				combo.select(0);
				
				toolkit.adapt(combo, true, true);
				control = combo;
			} else {
				System.err.println("Can't handle " + type.toString());
				continue;
			}

			// Save ref to tree node and add to list of objects to be disposed.
			control.setData(node);
			control.setLayoutData(td);
		}

		
		// Do the layout again so new widgets till be displayed.
		parent.layout();
	}

	private int getSlump(int max, int min) {
		return (int)(Math.random()*(max-min)+min);
	}
	
	public static enum ParameterType {
		BOOLEAN, INTEGER, STRING, ENUMERATION, FLOAT, FUNCTION_NAME,
		NOVALUE;
		
		public static ParameterType getType(String str) {
			try {
				return valueOf(str.toUpperCase());
			} catch (Exception ex) {
				return NOVALUE;
			}
		}
	}
	
	private class TreeNode {
		private String name;
		private String value;
		private ParameterType type;
		public TreeNode(String name, String value, ParameterType type) {
			this.name = name;
			this.value = value;
			this.type = type;
		}
		
		public String getName() {
			return name;
		}
		
		public ParameterType getType() {
			return type;
		}
		
		public String getValue() {
			return value;
		}
	}
}


