<?xml version="1.0"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->

<!-- Note:
    If you modify this file you may have to make the same change in build_framework.xml.
    build_framework.xml is renamed to build.xml when it is packaged.
    It is used to build the frameworks directory from the zip file. 
-->
<project name="examples" default="main" basedir=".">

    <property name="ROYALE_HOME" location=".."/>

    <!-- Required for OSX 10.6 / Snow Leopard Performance. -->
    <!-- Java 7 on Mac requires OSX 10.7.3 or higher and is 64-bit only -->
    <!-- local.d32 is set/used in build.properties so this needs to be done first. -->
    <condition property="local.d32" value="-d32">
        <and>
            <os family="mac"/>
            <matches pattern="1.6.*" string="${java.version}"/>
            <equals arg1="${sun.arch.data.model}" arg2="64"/>
            <equals arg1="${os.arch}" arg2="x86_64"/>
        </and>
    </condition>

    <!-- Property for the platform.  -->
    <condition property="isMac">
        <os family="mac"/>
    </condition>
    <condition property="isWindows">
        <os family="windows" />
    </condition>   
    <condition property="isLinux">
        <and>
          <os family="unix"/>    
          <not>
            <os family="mac"/>    
          </not>
        </and>
    </condition>  

    <property file="${ROYALE_HOME}/env.properties"/>
    <property environment="env"/>
    <property file="${ROYALE_HOME}/build.properties"/>
 
    <target name="main" depends="check-compile-env,clean,prepare,compile" 
        description="Clean build of all examples"/>

    <target name="check-compile-env" description="Check for the required environment variables">
        <ant antfile="${ROYALE_HOME}/build.xml" target="check-compile-env" dir="${ROYALE_HOME}"/>
    </target>

    
    <target name="prepare" depends="thirdparty-downloads"/>
            
    <target name="thirdparty-downloads" unless="no.thirdparty-downloads" description="Downloads all the required thirdparty code.">
        <!--<ant antfile="${basedir}/downloads.xml" dir="${basedir}"/>-->
    </target>
    
    <target name="compile" description="Compile Examples" >
		<ant dir="${basedir}/BubbleTest"/>
        <!-- @todo needs fixing or removal: <ant dir="${basedir}/ContainerTest"/>-->
		<ant dir="${basedir}/CursorTest"/>
		<ant dir="${basedir}/DateChooserExample"/>
        <ant dir="${basedir}/EffectsExample"/>
        <ant dir="${basedir}/RoyaleTest_basic"/>
        <ant dir="${basedir}/RoyaleTest_createjs"/>
        <ant dir="${basedir}/RoyaleTest_HTML5"/>
        <ant dir="${basedir}/RoyaleTest_jquery"/>
        <ant dir="${basedir}/RoyaleTest_Panel"/>
        <ant dir="${basedir}/RoyaleTest_SVG"/>
        <ant dir="${basedir}/FormExample"/>
        <ant dir="${basedir}/ImageTest"/>
        <ant dir="${basedir}/LanguageTests"/>
       <!-- @todo needs fixing or removal: <ant dir="${basedir}/ListsTest"/>-->
		<ant dir="${basedir}/ProxyTest"/>
		<ant dir="${basedir}/ReflectionTest"/>
        <ant dir="${basedir}/RollEventsTest"/>
        <ant dir="${basedir}/TLFEditTestRoyale"/>
		<ant dir="${basedir}/UnitTests" />
        <ant dir="${basedir}/XMLTest"/>
    </target>
	   
    <!--
		Cleanup
	-->

    <target name="super-clean" depends="thirdparty-clean,clean" description="Cleans everything including thirdparty downloads."/>
	
    <target name="thirdparty-clean" unless="no.thirdparty-clean" description="Removes all thirdparty downloads.">
        <!--<ant antfile="${basedir}/downloads.xml" target="clean" dir="${basedir}"/>-->
    </target>
    
    <target name="clean" description="Cleans all SWCs and their resource bundles">
        <ant dir="${basedir}/BubbleTest" target="clean"/>
        <ant dir="${basedir}/ContainerTest" target="clean"/>
		<ant dir="${basedir}/CursorTest" target="clean"/>
		<ant dir="${basedir}/DateChooserExample" target="clean"/>
        <ant dir="${basedir}/EffectsExample" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_basic" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_createjs" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_HTML5" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_jquery" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_Panel" target="clean"/>
        <ant dir="${basedir}/RoyaleTest_SVG" target="clean"/>
        <ant dir="${basedir}/FormExample" target="clean"/>
        <ant dir="${basedir}/ImageTest" target="clean"/>
        <ant dir="${basedir}/LanguageTests" target="clean"/>
        <ant dir="${basedir}/ListsTest" target="clean"/>
		<ant dir="${basedir}/ProxyTest" target="clean"/>
		<ant dir="${basedir}/ReflectionTest" target="clean"/>
        <ant dir="${basedir}/RollEventsTest" target="clean"/>
        <ant dir="${basedir}/TLFEditTestRoyale" target="clean"/>
		<ant dir="${basedir}/UnitTests" target="clean"/>
        <ant dir="${basedir}/XMLTest" target="clean"/>
    </target>
    
</project>
