/*******************************************************************************
 * Copyright (c) 2007 Borland Software Corporation
 * 
 * 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:
 *     Borland Software Corporation - initial API and implementation
 *******************************************************************************/
package testqvt;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Boolean Element</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link testqvt.BooleanElement#isIsSmallBoolean <em>Is Small Boolean</em>}</li>
 *   <li>{@link testqvt.BooleanElement#isSmallBoolean <em>Small Boolean</em>}</li>
 *   <li>{@link testqvt.BooleanElement#getIsLargeBoolean <em>Is Large Boolean</em>}</li>
 *   <li>{@link testqvt.BooleanElement#getLargeBoolean <em>Large Boolean</em>}</li>
 * </ul>
 * </p>
 *
 * @see testqvt.TestqvtPackage#getBooleanElement()
 * @model
 * @generated
 */
public interface BooleanElement extends Element {
	/**
	 * Returns the value of the '<em><b>Is Small Boolean</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Is Small Boolean</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Is Small Boolean</em>' attribute.
	 * @see #setIsSmallBoolean(boolean)
	 * @see testqvt.TestqvtPackage#getBooleanElement_IsSmallBoolean()
	 * @model
	 * @generated
	 */
	boolean isIsSmallBoolean();

	/**
	 * Sets the value of the '{@link testqvt.BooleanElement#isIsSmallBoolean <em>Is Small Boolean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Is Small Boolean</em>' attribute.
	 * @see #isIsSmallBoolean()
	 * @generated
	 */
	void setIsSmallBoolean(boolean value);

	/**
	 * Returns the value of the '<em><b>Small Boolean</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Small Boolean</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Small Boolean</em>' attribute.
	 * @see #setSmallBoolean(boolean)
	 * @see testqvt.TestqvtPackage#getBooleanElement_SmallBoolean()
	 * @model
	 * @generated
	 */
	boolean isSmallBoolean();

	/**
	 * Sets the value of the '{@link testqvt.BooleanElement#isSmallBoolean <em>Small Boolean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Small Boolean</em>' attribute.
	 * @see #isSmallBoolean()
	 * @generated
	 */
	void setSmallBoolean(boolean value);

	/**
	 * Returns the value of the '<em><b>Is Large Boolean</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Is Large Boolean</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Is Large Boolean</em>' attribute.
	 * @see #setIsLargeBoolean(Boolean)
	 * @see testqvt.TestqvtPackage#getBooleanElement_IsLargeBoolean()
	 * @model
	 * @generated
	 */
	Boolean getIsLargeBoolean();

	/**
	 * Sets the value of the '{@link testqvt.BooleanElement#getIsLargeBoolean <em>Is Large Boolean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Is Large Boolean</em>' attribute.
	 * @see #getIsLargeBoolean()
	 * @generated
	 */
	void setIsLargeBoolean(Boolean value);

	/**
	 * Returns the value of the '<em><b>Large Boolean</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Large Boolean</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Large Boolean</em>' attribute.
	 * @see #setLargeBoolean(Boolean)
	 * @see testqvt.TestqvtPackage#getBooleanElement_LargeBoolean()
	 * @model
	 * @generated
	 */
	Boolean getLargeBoolean();

	/**
	 * Sets the value of the '{@link testqvt.BooleanElement#getLargeBoolean <em>Large Boolean</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Large Boolean</em>' attribute.
	 * @see #getLargeBoolean()
	 * @generated
	 */
	void setLargeBoolean(Boolean value);

} // BooleanElement
