<!--

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.

-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>flex-pmd-flex</artifactId>
        <groupId>org.apache.flex.pmd</groupId>
        <version>1.3-SNAPSHOT</version>
    </parent>

	<artifactId>flexunit-theme</artifactId>
	<packaging>swc</packaging>

	<name>FlexUnit theme</name>
	<description>Adobe FlexUnit theme</description>

	<dependencies>

		<!-- flex sdk dependencies -->

		<dependency>
			<groupId>org.apache.flex</groupId>
			<artifactId>framework</artifactId>
			<version>${flex.version}</version>
			<type>pom</type>
		</dependency>

		<dependency>
			<groupId>com.adobe.flash.framework</groupId>
			<artifactId>playerglobal</artifactId>
			<version>${flash-player.version}</version>
			<type>swc</type>
		</dependency>

	</dependencies>

	<build>
		<sourceDirectory>src/main/resources</sourceDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>

		<plugins>
			<plugin>
				<groupId>net.flexmojos.oss</groupId>
				<artifactId>flexmojos-maven-plugin</artifactId>
				<version>${flex-mojos-plugin.version}</version>
				<extensions>true</extensions>
				<configuration>
					<targetPlayer>${flash-player.version}</targetPlayer>
				</configuration>
                <dependencies>
                    <!-- This handles a bug in maven which causes problems with flex resources -->
                    <dependency>
                        <groupId>net.flexmojos.oss</groupId>
                        <artifactId>flexmojos-threadlocaltoolkit-wrapper</artifactId>
                        <version>${flex-mojos-plugin.version}</version>
                    </dependency>
                    <!-- Without this FM will use the compiler configured in its
                    master pom, which will result in version conflicts -->
                    <dependency>
                        <groupId>org.apache.flex</groupId>
                        <artifactId>compiler</artifactId>
                        <version>${flex.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>
		</plugins>
	</build>

</project>
