/*
 *
 *  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.
 *
 */

package flash.css;

/**
 * Represents a CSS class, id, or pseudo condition.
 */
public class StyleCondition
{
    public static final String CLASS_CONDITION = "class";
    public static final String ID_CONDITION = "id";
    public static final String PSEUDO_CONDITION = "pseudo";

    public StyleCondition(String kind, String value)
    {
        this.kind = kind;
        this.value = value;
    }

    public String getKind()
    {
        return kind;
    }

    public void setKind(String kind)
    {
        this.kind = kind;
    }

    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {
        this.value = value;
    }

    public String toString()
    {
        if (kind == CLASS_CONDITION)
            return "." + value;
        else if (kind == ID_CONDITION)
            return "#" + value;
        else if (kind == PSEUDO_CONDITION)
            return ":" + value;
        else
            return "";
    }

    private String kind;
    private String value;
}
