/**
 * 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;

import org.eclipse.osbp.xtext.datamartdsl.DatamartAxis;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Chart Axis</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getAxis <em>Axis</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getRenderType <em>Render Type</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#isShortLabel <em>Short Label</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelAngle <em>Label Angle</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelFontSize <em>Label Font Size</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelTextColor <em>Label Text Color</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickAngle <em>Tick Angle</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickFontSize <em>Tick Font Size</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickTextColor <em>Tick Text Color</em>}</li>
 * </ul>
 *
 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartAxis()
 * @model
 * @generated
 */
public interface ChartAxis extends ChartElement {
	/**
	 * Returns the value of the '<em><b>Axis</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Axis</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Axis</em>' reference.
	 * @see #setAxis(DatamartAxis)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartAxis_Axis()
	 * @model
	 * @generated
	 */
	DatamartAxis getAxis();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getAxis <em>Axis</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Axis</em>' reference.
	 * @see #getAxis()
	 * @generated
	 */
	void setAxis(DatamartAxis value);

	/**
	 * Returns the value of the '<em><b>Render Type</b></em>' attribute.
	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.chart.RenderTypeEnum}.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Render Type</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Render Type</em>' attribute.
	 * @see org.eclipse.osbp.xtext.chart.RenderTypeEnum
	 * @see #setRenderType(RenderTypeEnum)
	 * @see org.eclipse.osbp.xtext.chart.ChartDSLPackage#getChartAxis_RenderType()
	 * @model unique="false"
	 * @generated
	 */
	RenderTypeEnum getRenderType();

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getRenderType <em>Render Type</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Render Type</em>' attribute.
	 * @see org.eclipse.osbp.xtext.chart.RenderTypeEnum
	 * @see #getRenderType()
	 * @generated
	 */
	void setRenderType(RenderTypeEnum value);

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

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

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelAngle <em>Label Angle</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Label Angle</em>' attribute.
	 * @see #getLabelAngle()
	 * @generated
	 */
	void setLabelAngle(int value);

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelFontSize <em>Label Font Size</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Label Font Size</em>' attribute.
	 * @see #getLabelFontSize()
	 * @generated
	 */
	void setLabelFontSize(int value);

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getLabelTextColor <em>Label Text Color</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Label Text Color</em>' attribute.
	 * @see #getLabelTextColor()
	 * @generated
	 */
	void setLabelTextColor(String value);

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickAngle <em>Tick Angle</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Tick Angle</em>' attribute.
	 * @see #getTickAngle()
	 * @generated
	 */
	void setTickAngle(int value);

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickFontSize <em>Tick Font Size</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Tick Font Size</em>' attribute.
	 * @see #getTickFontSize()
	 * @generated
	 */
	void setTickFontSize(int value);

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

	/**
	 * Sets the value of the '{@link org.eclipse.osbp.xtext.chart.ChartAxis#getTickTextColor <em>Tick Text Color</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Tick Text Color</em>' attribute.
	 * @see #getTickTextColor()
	 * @generated
	 */
	void setTickTextColor(String value);

} // ChartAxis
