/*
 * Copyright 2003-2007 the original author or authors.
 *
 * 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 groovy.ui.text;

import java.awt.Font;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import org.xml.sax.helpers.DefaultHandler;

/**
 *
 * @author Evan "Hippy" Slatis
 */
public class StructuredSyntaxHandler extends DefaultHandler {
    
    //StyleConstants.
    public static final String REGEXP = "regexp";
    public static final String STYLE = "style";
    
    public static final String ALIGN_CENTER = "ALIGN_CENTER";
    public static final String ALIGN_JUSTIFIED = "ALIGN_JUSTIFIED";
    public static final String ALIGN_LEFT = "ALIGN_LEFT";
    public static final String ALIGN_RIGHT = "ALIGN_RIGHT";

    public static final String ALIGNMENT = "alignment";
    public static final String BACKGROUND = "background";
    public static final String BIDI_LEVEL = "bidiLevel";
    public static final String BOLD = "bold";
    public static final String COMPONENT_ATTRIBUTE = "componentAttribute";
    public static final String COMPONENT_ELEMENT_NAME = "componentElementName";
    public static final String COMPOSED_TEXT_ATTRIBUTE = "composedTextAttribute";
    public static final String FIRST_LINE_INDENT = "firstLineIndent";
    public static final String FONT_FAMILY = "fontFamily";
    public static final String FONT_SIZE = "fontSize";
    public static final String FOREGROUND = "foreground";
    public static final String ICON_ATTRIBUTE = "iconAttribute";
    public static final String ICON_ELEMENT_NAME = "iconElementName";
    public static final String ITALIC = "italic";
    public static final String LEFT_INDENT = "leftIndent";
    public static final String LINE_SPACING = "lineSpacing";
    public static final String MODEL_ATTRIBUTE = "modelAttribute";
    public static final String NAME_ATTRIBUTE = "nameAttribute";
    public static final String ORIENTATION = "orientation";
    public static final String RESOLVE_ATTRIBUTE = "resolveAttribute";
    public static final String RIGHT_INDENT = "rightIndent";
    public static final String SPACE_ABOVE = "spaceAbove";
    public static final String SPACE_BELOW = "spaceBelow";
    public static final String STRIKE_THROUGH = "strikeThrough";
    public static final String SUBSCRIPT = "subscript";
    public static final String SUPERSCRIPT = "superscript";
    public static final String TAB_SET = "tabSet";
    public static final String UNDERLINE = "underline";
    
    private StructuredSyntaxDocumentFilter.LexerNode currentNode;
    private StructuredSyntaxDocumentFilter.LexerNode parentNode;
    
    private final StructuredSyntaxDocumentFilter filter;
    
    private Font font;

    /**
     * Creates a new instance of MasterFrameHandler
     * @param filter
     */
    public StructuredSyntaxHandler(StructuredSyntaxDocumentFilter filter) {
        this.filter = filter;
    }
    
    /**
     * @param ch
     * @param start
     * @param length
     */    
    public void characters(char[] ch, int start, int length) {
    }
    
    /**
     * @throws SAXException
     */    
    public void endDocument() throws SAXException {
        super.endDocument();
    }
    
    /**
     * @param uri
     * @param localName
     * @param qName
     * @throws SAXException
     */    
    public void endElement(String uri,
                           String localName,
                           String qName) throws SAXException {
    }
    
    /**
     * @param e
     * @throws SAXException
     */    
    public void	error(SAXParseException e) throws SAXException {
        throw new SAXException("Line: " + e.getLineNumber() + " message: " + e.getMessage());
    }
    
    /**
     * @throws SAXException
     */    
    public void startDocument() throws SAXException {
        super.startDocument();
        currentNode = filter.getRootNode();
    }
    
    /**
     * @param uri
     * @param localName
     * @param qName
     * @param attributes
     * @throws SAXException
     */    
    public void startElement(String uri,
                             String localName,
                             String qName,
                             Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
    }
}
