<!--
 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.
-->
<templates>
	<template name="Blank">
		<class>
<![CDATA[
package ${package};

public class ${classname} extends ${superclass} {
	
	public ${classname}(){
	}

}
]]>
		</class>
		<html>
<![CDATA[
<html>
  <head>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=${charset}">
    <title>Blank</title>
    $imports
  </head>
  <body>
  </body>
</html>
]]>
		</html>
	</template>
	<template name="Simple Form">
		<class>
<![CDATA[
package ${package};

import org.apache.click.control.Form;

public class ${classname} extends ${superclass} {

	private static final long serialVersionUID = 1L;
	
	private Form form = new Form("form");
	
	public ${classname}(){
		addControl(form);
	}

}
]]>
		</class>
		<html>
<![CDATA[
<html>
  <head>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=${charset}">
    <title>Simple Form</title>
    $imports
  </head>
  <body>
    $form
  </body>
</html>
]]>
		</html>
	</template>
</templates>