package org.vaadin.gridutil.client.renderer.buttonvalue;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.vaadin.client.renderers.ClickableRenderer;
import com.vaadin.client.widget.grid.RendererCellReference;

/**
 * UpperClass for all ButtonValueVariations: draws a FlowPanel, adds a HTML widget that could handle clicks and add a label for value
 *
 * @author Marten Prieß (http://www.rocketbase.io)
 * @version 1.0
 */
public class VButtonValueRenderer extends ClickableRenderer<String, FlowPanel> {

	private static String STYLE_NAME = "v-button-value-cell";

	public static final int VIEW_BITM = 4;
	public static final int EDIT_BITM = 16;
	public static final int DELETE_BITM = 32;

	private int clickedBITM = 0;
	private final int buttonBITM;

	public VButtonValueRenderer(final int buttonBITM) {
		super();
		this.buttonBITM = buttonBITM;
	}

	private Button genButton(final int bitm) {
		Button btn = GWT.create(Button.class);
		btn.setStylePrimaryName("v-nativebutton");
		switch (bitm) {
			case VIEW_BITM:
				btn.addStyleName("v-view");
				break;
			case EDIT_BITM:
				btn.addStyleName("v-edit");
				break;
			case DELETE_BITM:
				btn.addStyleName("v-delete");
				break;

		}
		btn.setHTML("<span></span>");
		btn.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(final ClickEvent event) {
				VButtonValueRenderer.this.clickedBITM = bitm;
				VButtonValueRenderer.super.onClick(event);
			}
		});
		return btn;
	}

	/**
	 * dirty hack - before we fire onClick we keep last clicked button because of the lost of RelativeElement during converting and the
	 * issue of different layouts
	 */
	@Override
	public FlowPanel createWidget() {
		FlowPanel buttonBar = GWT.create(FlowPanel.class);
		buttonBar.setStylePrimaryName("v-button-bar");

		int buttonsAdded = 0;
		if ((this.buttonBITM & VIEW_BITM) != 0) {
			buttonBar.add(genButton(VIEW_BITM));
			buttonsAdded++;
		}
		if ((this.buttonBITM & EDIT_BITM) != 0) {
			buttonBar.add(genButton(EDIT_BITM));
			buttonsAdded++;
		}
		if ((this.buttonBITM & DELETE_BITM) != 0) {
			buttonBar.add(genButton(DELETE_BITM));
			buttonsAdded++;
		}

		FlowPanel panel = GWT.create(FlowPanel.class);
		panel.setStylePrimaryName(STYLE_NAME);
		if (buttonsAdded == 3) {
			panel.addStyleName("three-buttons");
		} else if (buttonsAdded == 2) {
			panel.addStyleName("two-buttons");
		} else {
			panel.addStyleName("one-button");
		}
		panel.add(buttonBar);

		HTML valueLabel = GWT.create(HTML.class);
		valueLabel.setStylePrimaryName("v-cell-value");
		panel.add(valueLabel);
		return panel;
	}

	public int getClickedBITM() {
		return this.clickedBITM;
	}

	@Override
	public void render(final RendererCellReference cell, final String text, final FlowPanel panel) {
		((HTML) panel.getWidget(1)).setHTML(text);
	}

}