Package de.lessvoid.nifty.loaderv2.types

Source Code of de.lessvoid.nifty.loaderv2.types.EffectType

package de.lessvoid.nifty.loaderv2.types;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.logging.Logger;

import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.controls.dynamic.attributes.ControlEffectAttributes;
import de.lessvoid.nifty.effects.Effect;
import de.lessvoid.nifty.effects.EffectEventId;
import de.lessvoid.nifty.effects.EffectImpl;
import de.lessvoid.nifty.effects.EffectProperties;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.tools.LinearInterpolator;
import de.lessvoid.xml.xpp3.Attributes;

public class EffectType extends XmlBaseType {
  private static Logger logger = Logger.getLogger(EffectType.class.getName());

  private static final boolean DEFAULT_INHERIT = false;
  private static final boolean DEFAULT_POST = false;
  private static final boolean DEFAULT_OVERLAY = false;

  protected ArrayList < EffectValueType > effectValues = new ArrayList < EffectValueType > ();
  private String styleId;

  public EffectType() {
  }

  public EffectType(final EffectType e) {
    super(e);
    this.effectValues = new ArrayList < EffectValueType > (e.effectValues);
  }

  public EffectType clone() {
    return new EffectType(this);
  }

  /**
   * This supports creating CustomControlCreator.
   * @return
   */
  public ControlEffectAttributes convert() {
    return new ControlEffectAttributes(getAttributes(), effectValues);
  }

  public void materialize(
      final Nifty nifty,
      final Element element,
      final EffectEventId effectEventId,
      final Attributes effectsTypeAttibutes,
      final LinkedList < Object > controllers) {
    Attributes effectAttributes = new Attributes(getAttributes());
    effectAttributes.merge(effectsTypeAttibutes);

    Attributes attributes = effectAttributes;

    RegisterEffectType registerEffectType = getRegisteredEffectType(nifty, attributes);
    if (registerEffectType == null) {
      return;
    }

    Class < ? > effectClass = registerEffectType.getEffectClass();
    if (effectClass == null) {
      return;
    }

    EffectProperties effectProperties = new EffectProperties(attributes.createProperties());
    applyEffectValues(effectProperties);

    Effect effect = createEffect(nifty, effectEventId, attributes);
    effect.init(
        element,
        createEffectImpl(effectClass),
        effectProperties,
        nifty.getTimeProvider(),
        controllers);
    element.registerEffect(effectEventId, effect);
  }

  private RegisterEffectType getRegisteredEffectType(final Nifty nifty, final Attributes attributes) {
    String name = getEffectName(attributes);
    RegisterEffectType registerEffectType = nifty.resolveRegisteredEffect(name);
    if (registerEffectType == null) {
      logger.warning("unable to convert effect [" + name + "] because no effect with this name has been registered.");
      return null;
    }
    return registerEffectType;
  }

  private Effect createEffect(final Nifty nifty, final EffectEventId effectEventId, final Attributes attributes) {
    Effect effect = new Effect(
        nifty,
        getInherit(attributes),
        getPost(attributes),
        getOverlay(attributes),
        getAlternateEnable(attributes),
        getAlternateDisable(attributes),
        getCustomKey(attributes),
        getNeverStopRendering(attributes),
        effectEventId);
    initializeEffect(effect, effectEventId);
    return effect;
  }

  private boolean getInherit(final Attributes attributes) {
    return attributes.getAsBoolean("inherit", DEFAULT_INHERIT);
  }

  private boolean getPost(final Attributes attributes) {
    return attributes.getAsBoolean("post", DEFAULT_POST);
  }

  private boolean getOverlay(final Attributes attributes) {
    return attributes.getAsBoolean("overlay", DEFAULT_OVERLAY);
  }

  private String getAlternateEnable(final Attributes attributes) {
    return attributes.get("alternateEnable");
  }

  private String getAlternateDisable(final Attributes attributes) {
    return attributes.get("alternateDisable");
  }

  private String getCustomKey(final Attributes attributes) {
    return attributes.get("customKey");
  }

  private boolean getNeverStopRendering(final Attributes attributes) {
    return attributes.getAsBoolean("neverStopRendering", false);
  }

  protected void initializeEffect(final Effect effect, final EffectEventId effectEventId) {
    if (EffectEventId.onFocus.equals(effectEventId) ||
        EffectEventId.onActive.equals(effectEventId) ||
        EffectEventId.onEnabled.equals(effectEventId) ||
        EffectEventId.onDisabled.equals(effectEventId)) {
      effect.enableInfinite();
    }
  }

  private EffectImpl createEffectImpl(final Class < ? > effectClass) {
    try {
      if (EffectImpl.class.isAssignableFrom(effectClass)) {
        return (EffectImpl) effectClass.newInstance();
      } else {
        logger.warning("given effect class ["
            + effectClass.getName()
            + "] does not implement ["
            + EffectImpl.class.getName() + "]");
      }
    } catch (Exception e) {
      logger.warning("class [" + effectClass.getName() + "] could not be instanziated");
    }
    return null;
  }

  private String getEffectName(final Attributes attributes) {
    return attributes.get("name");
  }

  public void resolveParameters(final Attributes src) {
    getAttributes().resolveParameters(src);
  }

  public void addValue(final EffectValueType elmentValueType) {
    effectValues.add(elmentValueType);
  }

  void applyEffectValues(final EffectProperties effectProperties) {
    if (!effectValues.isEmpty()) {
      for (EffectValueType effectValueType : effectValues) {
        effectProperties.addEffectValue(effectValueType.getAttributes());
      }
      if (effectProperties.isTimeInterpolator()) {
        LinearInterpolator interpolator = effectProperties.getInterpolator();
        effectProperties.setProperty("length", String.valueOf((long)interpolator.getMaxX()));
      }
    }
  }

  public void setStyleId(final String styleId) {
    this.styleId = styleId;
  }

  public String getStyleId() {
    return styleId;
  }
}
TOP

Related Classes of de.lessvoid.nifty.loaderv2.types.EffectType

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.