/*
* JBoss by Red Hat
* Copyright 2006-2009, Red Hat Middleware, LLC, and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.ide.eclipse.freemarker.model;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.source.ISourceViewer;
import org.jboss.ide.eclipse.freemarker.editor.PartitionScanner;
public class ItemFactory {
public static Item getItem (ITypedRegion region, ISourceViewer viewer, IResource resource) {
if (null == region) return null;
else {
Item directive = null;
if (region.getType().equals(PartitionScanner.FTL_IF_DIRECTIVE_START))
directive = new IfDirective();
else if (region.getType().equals(PartitionScanner.FTL_IF_DIRECTIVE_END))
directive = new IfEndDirective();
else if (region.getType().equals(PartitionScanner.FTL_IF_ELSE_DIRECTIVE))
directive = new IfElseDirective();
else if (region.getType().equals(PartitionScanner.FTL_ELSE_IF_DIRECTIVE))
directive = new ElseIfDirective();
else if (region.getType().equals(PartitionScanner.FTL_LIST_DIRECTIVE_START))
directive = new ListDirective();
else if (region.getType().equals(PartitionScanner.FTL_LIST_DIRECTIVE_END))
directive = new ListEndDirective();
else if (region.getType().equals(PartitionScanner.FTL_FUNCTION_DIRECTIVE_START))
directive = new FunctionDirective();
else if (region.getType().equals(PartitionScanner.FTL_FUNCTION_DIRECTIVE_END))
directive = new FunctionEndDirective();
else if (region.getType().equals(PartitionScanner.FTL_MACRO_DIRECTIVE_START))
directive = new MacroDirective();
else if (region.getType().equals(PartitionScanner.FTL_MACRO_DIRECTIVE_END))
directive = new MacroEndDirective();
else if (region.getType().equals(PartitionScanner.FTL_MACRO_INSTANCE_START))
directive = new MacroInstance();
else if (region.getType().equals(PartitionScanner.FTL_MACRO_INSTANCE_END))
directive = new MacroEndInstance();
else if (region.getType().equals(PartitionScanner.FTL_INCLUDE))
directive = new GenericDirective("include.png"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_IMPORT))
directive = new GenericDirective("import.png"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_ASSIGN)
|| region.getType().equals(PartitionScanner.FTL_LOCAL)
|| region.getType().equals(PartitionScanner.FTL_GLOBAL))
directive = new AssignmentDirective(region.getType());
else if (region.getType().equals(PartitionScanner.FTL_ASSIGN_END)
|| region.getType().equals(PartitionScanner.FTL_LOCAL_END)
|| region.getType().equals(PartitionScanner.FTL_GLOBAL_END))
directive = new AssignmentEndDirective(region.getType());
else if (region.getType().equals(PartitionScanner.FTL_BREAK))
directive = new GenericDirective("break.png"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_STOP))
directive = new GenericDirective("stop.png"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_RETURN))
directive = new GenericDirective("return.png"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_SWITCH_DIRECTIVE_START))
directive = new GenericNestableDirective("switch", "switch.png"); //$NON-NLS-1$ //$NON-NLS-2$
else if (region.getType().equals(PartitionScanner.FTL_SWITCH_DIRECTIVE_END))
directive = new GenericNestableEndDirective("switch"); //$NON-NLS-1$
else if (region.getType().equals(PartitionScanner.FTL_CASE_DIRECTIVE_START))
directive = new CaseDirective();
else if (region.getType().equals(PartitionScanner.FTL_CASE_DEFAULT_START))
directive = new CaseDefaultDirective();
else if (region.getType().equals(PartitionScanner.FTL_INTERPOLATION))
directive = new Interpolation();
else if (region.getType().equals(PartitionScanner.FTL_FTL_DIRECTIVE))
directive = new FtlDirective();
else if (region.getType().equals(PartitionScanner.FTL_DIRECTIVE)) {
String name = getDirectiveName(region, viewer);
directive = new GenericNestableDirective(name, "element.png"); //$NON-NLS-1$
}
else if (region.getType().equals(PartitionScanner.FTL_DIRECTIVE_END)) {
String name = getDirectiveName(region, viewer);
directive = new GenericNestableEndDirective(name);
}
if (null != directive) directive.load(region, viewer, resource);
return directive;
}
}
private static String getDirectiveName (ITypedRegion region, ISourceViewer viewer) {
StringBuffer sb = new StringBuffer();
try {
int offset = region.getOffset();
int stopIndex = offset + region.getLength();
char c = viewer.getDocument().getChar(offset);
while (c != ' ' && c != '>' && offset <= stopIndex) {
if (c != '<' && c != '#' && c != '/')
sb.append(c);
c = viewer.getDocument().getChar(++offset);
}
return sb.toString();
}
catch (BadLocationException e) {}
return sb.toString();
}
}