/*
 *                                                                            
 *  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 v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  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);
	/**
	 * Equals.
	 *
	 * @param item the item
	 * @return true, if successful
	 */
	boolean equals(IDualData item);
	/**
	 * 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);
}
