/**
* Copyright 2010 Bing Ran<bing_ran@hotmail.com>
*
* Licensed 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.
*/
package cn.bran.japid.classmeta;
import japa.parser.ast.body.Parameter;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import cn.bran.japid.compiler.JavaSyntaxTool;
public class LayoutClassMetaData extends AbstractTemplateClassMetaData {
{
setAbstract(true);
}
Set<String> getterMethods = new HashSet<String>();
/**
* map the #{get} tag
*
* @param string
*/
public void get(String string) {
this.getterMethods.add(string);
}
/**
*
*/
protected void childLayout() {
p("\n\tprotected abstract void doLayout();\n");
}
/**
* #{get "block name" /} was creating abstract. Now changed to a no
* operation method stub so subclass can selectively override the getters in
* the layout
*/
protected void getterSetter() {
pln();
for (String key : getterMethods) {
// p("\t protected abstract void " + key + "();\n");
p("\t protected void " + key + "() {};\n");
}
}
/**
*
*/
protected void layoutMethod() {
if (renderArgs != null) {
// create fields for the render args and create a render method to
List<Parameter> params = JavaSyntaxTool.parseParams(this.renderArgs);
String renderArgsWithoutAnnos = "";
for (Parameter p: params) {
renderArgsWithoutAnnos += p.getType() + " " + p.getId() + ",";
}
if (renderArgsWithoutAnnos.endsWith(",")){
renderArgsWithoutAnnos = renderArgsWithoutAnnos.substring(0, renderArgsWithoutAnnos.length() - 1);
}
for (Parameter p : params) {
// pln(TAB + "private " + p.getType() + " " + p.getId() + ";");
addField(p);
}
pln("\t public void layout(" + renderArgsWithoutAnnos + ") {");
// assign the params to fields
for (Parameter p : params) {
pln("\t\tthis." + p.getId() + " = " + p.getId() + ";");
}
}
else {
pln("\t@Override public void layout() {");
}
restOfBody();
}
@Override
void renderMethod() {
// no such method in layout
}
@Override
public void merge(AbstractTemplateClassMetaData a) {
super.merge(a);
if (a instanceof LayoutClassMetaData) {
LayoutClassMetaData b = (LayoutClassMetaData) a;
this.getterMethods.addAll(b.getterMethods);
}
else {
throw new RuntimeException("cannot merge metadata from another type to LayoutClassMetaData: " + a.className);
}
}
}