/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - 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:                                                      
 * 	   Florian Pirchner - Initial implementation
 * 
 */
package org.eclipse.osbp.ecview.extension.editparts.emf.enhancer;

import org.eclipse.osbp.ecview.extension.api.IFocusingEnhancer;
import org.eclipse.osbp.ecview.extension.model.YDelegatingFocusingStrategy;
import org.eclipse.osbp.ecview.extension.model.YECviewFactory;
import org.eclipse.osbp.ecview.extension.model.YStrategyLayout;
import org.osgi.service.component.annotations.Component;

/**
 * The Class AltEnterFocusingEnhancer.
 */
@Component(property={"ecview.focusing.enhancer.id=AltEnterFocusingEnhancer"})
public class AltEnterFocusingEnhancer implements IFocusingEnhancer {

	/* (non-Javadoc)
	 * @see org.eclipse.osbp.ecview.extension.api.IFocusingEnhancer#enhanceFocusing(org.eclipse.osbp.ecview.extension.model.YStrategyLayout)
	 */
	@Override
	public void enhanceFocusing(YStrategyLayout yLayout) {
		yLayout.getFocusingStrategies().clear();
		
		YDelegatingFocusingStrategy yStgy1 = YECviewFactory.eINSTANCE.createYDelegatingFocusingStrategy();
		yStgy1.setDelegateStrategyId("cx.altenter.forward");
		yLayout.getFocusingStrategies().add(yStgy1);
		
		YDelegatingFocusingStrategy yStgy2 = YECviewFactory.eINSTANCE.createYDelegatingFocusingStrategy();
		yStgy2.setDelegateStrategyId("cx.enter.backward");
		yLayout.getFocusingStrategies().add(yStgy2);
		
		
	}

}
