/**
 *                                                                            
 * 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:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
 package org.eclipse.osbp.infogrid.api;

import org.eclipse.osbp.ecview.extension.grid.CxGrid;

public interface IECViewGridSourceDescriptor extends IGridSourceDescriptor {

	String PROP_MANUAL_BEANS = "useManualBeans";
	
	CxGrid getGrid();
	
	void refreshData();

	/**
	 * If a strategy is set, then it will become notified about saved editor
	 * values.
	 * 
	 * @param strategy
	 */
	void setEditorSavedStrategy(EditorSavedStrategy strategy);

	/**
	 * Implementations are called, if the grid editor was saved.
	 */
	public interface EditorSavedStrategy {
		/**
		 * This method is called after the grid editor was saved.
		 * 
		 * @param value
		 */
		void editorSaved(Object value);
	}
	
}
