package org.eclipse.osbp.utils.vaadin.problems;

import java.util.Locale;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent;
import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;

import com.vaadin.server.ClientConnector.DetachListener;
import com.vaadin.ui.Window;

public class ProblemsPopup extends Window implements DetachListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = -1106131179854247707L;
	private transient IEventDispatcher eventDispatcher;
	private ProblemsViewContent problemsViewContent;
	private String sender;
	private String topic;
	private transient IDSLMetadataService dslMetadataService;

	public ProblemsPopup(IEclipseContext eclipseContext, Locale locale, String sender, String topic) {
		super();
		eventDispatcher = eclipseContext.get(IEventDispatcher.class);
		dslMetadataService = eclipseContext.get(IDSLMetadataService.class);
		this.sender = sender;
		this.topic = topic;
		super.setLocale(locale);
		this.addDetachListener(this);
		setClosable(true);
		setModal(false);
		setCaption(dslMetadataService.translate(locale.toLanguageTag(), "validationReport"));
		problemsViewContent = new ProblemsViewContent();
		setContent(problemsViewContent.createComponents(eclipseContext, locale, sender, topic));
		setWidth("550px");
	}

	@Override
	public void setLocale(Locale locale) {
		super.setLocale(locale);
		setCaption(dslMetadataService.translate(locale.toLanguageTag(), "validationReport"));
		if(problemsViewContent != null) {
			problemsViewContent.setLocale(locale);
		}
	}
	
	@Override
	public void detach(DetachEvent event) {
		EventDispatcherEvent evt = new EventDispatcherEvent(EventDispatcherCommand.CLOSE, topic, sender);
		eventDispatcher.sendEvent(evt);
	}

}
