/*
 *                                                                            
 *  Copyright (c) 2011 - 2017 - 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 2.0        
 *  which accompanies this distribution, and is available at                  
 *  https://www.eclipse.org/legal/epl-2.0/
 *
 *  SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 *  Initial contribution:                                                      
 *     Loetz GmbH & Co. KG
 * 
 */
package org.eclipse.osbp.runtime.common.event;

/**
 * The Interface IDualData.
 */
public interface IDualData {
	
	/**
	 * Marks this filter as to be decoded as string.
	 *
	 * @param isString the is string
	 */
	void asString(boolean isString);
	/**
	 * Gets the selection value.
	 *
	 * @return the selection value
	 */
	String getSelectionValue();
	
	/**
	 * Gets the selection value prepared for a database.
	 *
	 * @param value the value
	 * @return the database selection value
	 */
	String getDatabaseSelectionValue();
	/**
	 * Sets the selection value.
	 *
	 * @param value the new selection value
	 */
	void setSelectionValue(String value);

	/**
	 * Gets the formatted value.
	 *
	 * @return the formatted value
	 */
	String getFormattedValue();

	/**
	 * Sets the formatted value.
	 *
	 * @param formattedValue the new formatted value
	 */
	void setFormattedValue(String formattedValue);

	/**
	 * Gets the hierarchy.
	 *
	 * @return the hierarchy
	 */
	String getHierarchy();
	
	/**
	 * Gets the hierarchy with brackets.
	 *
	 * @return the hierarchy with brackets
	 */
	String getHierarchyWithBrackets();
	
	/**
	 * Sets the hierarchy.
	 *
	 * @param hierarchy the new hierarchy
	 */
	void setHierarchy(String hierarchy);
}
