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

import java.util.Locale;

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
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;
	private MPerspective perspective;

	public ProblemsPopup(IEclipseContext eclipseContext, Locale locale, String sender, String topic) {
		super();
		eventDispatcher = eclipseContext.get(IEventDispatcher.class);
		dslMetadataService = eclipseContext.get(IDSLMetadataService.class);
		perspective = eclipseContext.get(MPerspective.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(perspective, EventDispatcherCommand.CLOSE, topic, sender);
		eventDispatcher.sendEvent(evt);
	}

}
