/**
 * 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 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.chart;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Chart Bubble</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartBubble#isMultiplier <em>Multiplier</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartBubble#getMultiplierValue <em>Multiplier Value</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartBubble#isGradient <em>Gradient</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartBubble#isTransparent <em>Transparent</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartBubble()
 * @model
 * @generated
 */
public interface ChartBubble extends ChartOption {
	/**
	 * Returns the value of the '<em><b>Multiplier</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Multiplier</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Multiplier</em>' attribute.
	 * @see #setMultiplier(boolean)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartBubble_Multiplier()
	 * @model unique="false"
	 * @generated
	 */
	boolean isMultiplier();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartBubble#isMultiplier <em>Multiplier</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Multiplier</em>' attribute.
	 * @see #isMultiplier()
	 * @generated
	 */
	void setMultiplier(boolean value);

	/**
	 * Returns the value of the '<em><b>Multiplier Value</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Multiplier Value</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Multiplier Value</em>' attribute.
	 * @see #setMultiplierValue(String)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartBubble_MultiplierValue()
	 * @model unique="false"
	 * @generated
	 */
	String getMultiplierValue();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartBubble#getMultiplierValue <em>Multiplier Value</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Multiplier Value</em>' attribute.
	 * @see #getMultiplierValue()
	 * @generated
	 */
	void setMultiplierValue(String value);

	/**
	 * Returns the value of the '<em><b>Gradient</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Gradient</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Gradient</em>' attribute.
	 * @see #setGradient(boolean)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartBubble_Gradient()
	 * @model unique="false"
	 * @generated
	 */
	boolean isGradient();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartBubble#isGradient <em>Gradient</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Gradient</em>' attribute.
	 * @see #isGradient()
	 * @generated
	 */
	void setGradient(boolean value);

	/**
	 * Returns the value of the '<em><b>Transparent</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Transparent</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Transparent</em>' attribute.
	 * @see #setTransparent(boolean)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartBubble_Transparent()
	 * @model unique="false"
	 * @generated
	 */
	boolean isTransparent();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartBubble#isTransparent <em>Transparent</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Transparent</em>' attribute.
	 * @see #isTransparent()
	 * @generated
	 */
	void setTransparent(boolean value);

} // ChartBubble
