/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License v1.0       
 * which accompanies this distribution, and is available at                  
 * http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 * Contributors:   
 * Florian Pirchner <florian.pirchner@gmail.com> - Initial implementation
 */

package org.eclipse.osbp.vaadin.addons.absolutelayout;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.data.Property;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.AbsoluteLayout.ComponentPosition;
import com.vaadin.ui.Button;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;

import fi.jasoft.dragdroplayouts.client.ui.LayoutDragMode;
import fi.jasoft.dragdroplayouts.drophandlers.DefaultAbsoluteLayoutDropHandler;

/**
 * The Class AbsoluteLayoutUI.
 */
@SuppressWarnings("serial")
@Theme("valo")
public class AbsoluteLayoutUI extends UI {

	/**
	 * The Class Servlet.
	 */
	@WebServlet(value = "/*", asyncSupported = true)
	@VaadinServletConfiguration(productionMode = false, ui = AbsoluteLayoutUI.class, widgetset = "org.eclipse.osbp.vaadin.addons.absolutelayout.AbsoluteLayoutWidgetset")
	public static class Servlet extends VaadinServlet {
	}

	/** The layout1. */
	private AbsoluteLayout layout1;

	/** The layout2. */
	private AbsoluteLayout layout2;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.vaadin.ui.UI#init(com.vaadin.server.VaadinRequest)
	 */
	@Override
	protected void init(VaadinRequest request) {

		HorizontalLayout main = new HorizontalLayout();
		main.setSpacing(true);
		main.setMargin(true);
		main.setSizeFull();

		VerticalLayout buttons = new VerticalLayout();
		main.addComponent(buttons);
		
		Button b = new Button("new", new Button.ClickListener() {
			@Override
			public void buttonClick(Button.ClickEvent event) {
				TextField f = new TextField("Foo");
				f.addStyleName("bar");
				layout1.addComponent(f);
			}
		});
		buttons.addComponent(b);
		
		Button allNew = new Button("all new", new Button.ClickListener() {
			@Override
			public void buttonClick(Button.ClickEvent event) {
				layout1.removeAllComponents();
				layout2.removeAllComponents();
				
				createLayout(layout1);
				createLayout(layout2);
			}
		});
		buttons.addComponent(allNew);
		buttons.setWidth("120px");
		
		Panel p1 = new Panel();
		p1.setSizeFull();
		main.addComponent(p1);
		main.setExpandRatio(p1, 1.0f);

		HorizontalLayout h1 = new HorizontalLayout();
		h1.setSpacing(true);
		h1.setMargin(true);
		h1.setSizeFull();
		p1.setContent(h1);

		layout1 = new AbsoluteLayout();
		layout1.setSizeFull();
		h1.addComponent(layout1);
		h1.setExpandRatio(layout1, 1.0f);
		layout1.setDragMode(LayoutDragMode.CLONE);
		layout1.setDropHandler(new DefaultAbsoluteLayoutDropHandler());
		layout1.setResizable(true);
		layout1.setUseAlignments(true);
		createLayout(layout1);
		
		Panel p2 = new Panel();
		p2.setSizeFull();
		main.addComponent(p2);
		main.setExpandRatio(p2, 1.0f);
		
		HorizontalLayout h2 = new HorizontalLayout();
		h2.setSpacing(true);
		h2.setMargin(true);
		h2.setSizeFull();
		p2.setContent(h2);
		
		layout2 = new AbsoluteLayout();
		layout2.setSizeFull();
		h2.addComponent(layout2);
		h2.setExpandRatio(layout2, 1.0f);
		layout2.setDragMode(LayoutDragMode.CLONE);
		layout2.setDropHandler(new DefaultAbsoluteLayoutDropHandler());
		layout2.setResizable(true);
		layout2.setUseAlignments(true);
		createLayout(layout2);

		setContent(main);
	}

	/**
	 * Creates the layout.
	 *
	 * @param layout
	 *            the main
	 * @return the absolute layout
	 */
	private AbsoluteLayout createLayout(AbsoluteLayout layout) {

		ComponentPosition pos = layout.new ComponentPosition();

		final CheckBox resize = new CheckBox("resize");
		resize.setImmediate(true);
		resize.setValue(true);
		setSizeFull(resize);
		resize.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				layout.setResizable(resize.getValue());
			}
		});
		pos.setLeft(30f, Unit.PIXELS);
		pos.setTop(30f, Unit.PIXELS);
		layout.addComponent(resize, pos.getCSSString());

		final CheckBox drag = new CheckBox("drag");
		drag.setImmediate(true);
		drag.setValue(true);
		setSizeFull(drag);
		drag.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				if (drag.getValue()) {
					layout.setDragMode(LayoutDragMode.CLONE);
				} else {
					layout.setDragMode(LayoutDragMode.NONE);
				}
			}
		});
		pos.setLeft(130f, Unit.PIXELS);
		pos.setTop(30f, Unit.PIXELS);
		layout.addComponent(drag, pos.getCSSString());

		final CheckBox alignments = new CheckBox("alignments");
		alignments.setImmediate(true);
		alignments.setValue(true);
		setSizeFull(alignments);
		alignments.addValueChangeListener(new Property.ValueChangeListener() {
			@Override
			public void valueChange(Property.ValueChangeEvent event) {
				layout.setUseAlignments(alignments.getValue());
			}
		});
		pos.setLeft(230f, Unit.PIXELS);
		pos.setTop(30f, Unit.PIXELS);
		layout.addComponent(alignments, pos.getCSSString());

		TextField text = new TextField("Type me");
		pos.setLeft(120f, Unit.PIXELS);
		pos.setTop(200f, Unit.PIXELS);
		setSizeFull(text);
		layout.addComponent(text, pos.getCSSString());

		Button button2 = new Button("Click Me2");
		pos.setLeft(300f, Unit.PIXELS);
		pos.setTop(300f, Unit.PIXELS);
		setSizeFull(button2);
		layout.addComponent(button2, pos.getCSSString());

		CheckBox checkbox = new CheckBox("Check me");
		pos.setLeft(470f, Unit.PIXELS);
		pos.setTop(390f, Unit.PIXELS);
		setSizeFull(checkbox);
		layout.addComponent(checkbox, pos.getCSSString());

		return layout;
	}

	/**
	 * Sets the size full.
	 *
	 * @param resize
	 *            the new size full
	 */
	private void setSizeFull(final Component resize) {
		// resize.setSizeFull();
	}

}