package org.eclipse.e4.ui.examples.css.rcp;

import java.io.InputStream;
import java.net.URL;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.core.engine.CSSErrorHandler;
import org.eclipse.e4.ui.css.swt.engine.CSSSWTEngineImpl;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.application.IWorkbenchConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchAdvisor;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;

/**
 * This workbench advisor creates the window advisor, and specifies
 * the perspective id for the initial window.
 */
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
	
	private final static String STYLE_SHEET_PATH = "styles/stylesheet.css";
	public static ApplicationWorkbenchAdvisor INSTANCE;

	public CSSEngine engine;
	
	public ApplicationWorkbenchAdvisor() {
		super();
		INSTANCE = this;
	}
	
    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
    	return new ApplicationWorkbenchWindowAdvisor(configurer);
    }

	public String getInitialWindowPerspectiveId() {
		return Perspective.ID;
	} 
	
	public void initialize(IWorkbenchConfigurer configurer) {
		super.initialize(configurer);
		engine = initializeStyling();
	}
	
	private CSSEngine initializeStyling() {
		// Instantiate SWT CSS Engine
		CSSEngine engine = new CSSSWTEngineImpl(Display.getDefault(), true);
		engine.setErrorHandler(new CSSErrorHandler() {
			public void error(Exception e) {
				e.printStackTrace();
			}
		});
		
		try {
			URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path(STYLE_SHEET_PATH), null);
			InputStream stream = url.openStream();
			engine.parseStyleSheet(stream);	
			stream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return engine;
	}
}
