package com.baselet.gwt.client.view.widgets;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Event.NativePreviewEvent;
import com.google.gwt.user.client.Window;
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.google.gwt.user.client.ui.TextBox;

public class SaveDialogBox extends MyPopupPanel {

	public static interface Callback {
		void callback(String chosenName);
	}

	private final TextBox textBox = new TextBox();
	private final Button saveButton = new Button("Save");
	private final Button cancelButton = new Button("Cancel");

	public SaveDialogBox(final Callback callback, String headerText) {
		super(true, Type.POPUP);
		initSaveDialogBox(callback, headerText);
	}

	public SaveDialogBox(final Callback callback) {
		super(true, Type.POPUP);
		initSaveDialogBox(callback, "Save Diagram");
	}

	private void initSaveDialogBox(final Callback callback, String headerText) {
		setHeader(headerText);
		textBox.addKeyPressHandler(new KeyPressHandler() {
			@Override
			public void onKeyPress(KeyPressEvent event) {
				if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
					submitDialog(callback);
				}
			}
		});
		saveButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				submitDialog(callback);
			}
		});
		cancelButton.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				hide();
			}
		});
		FlowPanel panel = new FlowPanel();
		panel.add(new HTML("Please choose a name"));
		panel.add(textBox);
		FlowPanel fp = new FlowPanel();
		fp.add(saveButton);
		fp.add(cancelButton);
		panel.add(fp);
		setWidget(panel);
	}

	private void submitDialog(final Callback callback) {
		if (textBox.getText().isEmpty()) {
			Window.alert("You must enter a name to save the diagram");
		}
		else {
			hide();
			callback.callback(textBox.getText());
		}
	}

	public void clearAndCenter() {
		center();
		textBox.setFocus(true);
		textBox.selectAll();
	}

	/**
	 * pressing ESC closes the dialogbox
	 */
	@Override
	protected void onPreviewNativeEvent(NativePreviewEvent event) {
		super.onPreviewNativeEvent(event);
		if (event.getTypeInt() == Event.ONKEYDOWN &&
			event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) {
			hide();
		}
	}
}