/**
 *                                                                            
 *  Copyright (c) 2011, 2018 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 *
 */
 
package org.eclipse.osbp.xtext.signal.jvmmodel

import java.nio.file.FileSystems
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.WatchEvent
import java.util.ArrayList
import java.util.Arrays
import java.util.HashMap
import java.util.Map
import java.util.concurrent.Executors
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.Resource
import org.eclipse.osbp.core.api.persistence.IPersistenceService
import org.eclipse.osbp.datainterchange.api.IDataInterchange
import org.eclipse.osbp.xtext.basic.generator.BasicDslGeneratorUtils
import org.eclipse.osbp.xtext.datainterchange.common.WorkerThreadRunnable
import org.eclipse.osbp.xtext.i18n.I18NModelGenerator
import org.eclipse.osbp.xtext.signal.SignalHandlerTypeEnum
import org.eclipse.osbp.xtext.signal.SignalTypeEnum
import org.eclipse.osbp.xtext.signal.common.OSBPSignalWatcher
import org.eclipse.xtext.generator.IFileSystemAccess
import org.eclipse.xtext.xbase.compiler.GeneratorConfig
import org.eclipse.xtext.xbase.compiler.ImportManager
import org.slf4j.Logger
import org.slf4j.LoggerFactory

class SignalModelGenerator extends I18NModelGenerator {
	@Inject extension BasicDslGeneratorUtils
	
	var public static String pckgName = null
	
	
	override createAppendable(EObject context, ImportManager importManager, GeneratorConfig config) {
		// required to initialize the needed builder to avoid deprecated methods
		builder = context.eResource
		// ---------
		addImportFor(importManager, _typeReferenceBuilder,
			SignalTypeEnum,
			SignalHandlerTypeEnum,
			OSBPSignalWatcher,
			Paths,
			WorkerThreadRunnable,
			IPersistenceService,
			IDataInterchange,
			FileSystems,
			Logger,
			LoggerFactory,
			HashMap,
			Arrays,
			WatchEvent,
			Path,
			Executors,
			Map,
			ArrayList
		)
		super.createAppendable(context, importManager, config)
	}

	override doGenerate(Resource resource, IFileSystemAccess fsa) {
//		addTranslatables("startProcessText,answerYesText,answerNoText,designer,designmode,undo,redo,new,change,export,download")
		super.doGenerate(resource, fsa)
	}
	
	
}
