/* * Copyright (C) 2006 Clam <clamisgood@gmail.com> * Copyright (C) 2009 Quadduc <quadduc@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package org.lateralgm.resources.sub; import java.util.EnumMap; import org.lateralgm.main.UpdateSource; import org.lateralgm.main.UpdateSource.UpdateEvent; import org.lateralgm.main.UpdateSource.UpdateListener; import org.lateralgm.main.UpdateSource.UpdateTrigger; import org.lateralgm.resources.Background; import org.lateralgm.resources.ResourceReference; import org.lateralgm.util.PropertyMap; import org.lateralgm.util.PropertyMap.PropertyUpdateEvent; import org.lateralgm.util.PropertyMap.PropertyUpdateListener; import org.lateralgm.util.PropertyMap.PropertyValidationException; import org.lateralgm.util.PropertyMap.PropertyValidator; public class BackgroundDef implements UpdateListener, PropertyValidator<BackgroundDef.PBackgroundDef> { private ResourceReference<?> background = null; //kept for listening purposes public final PropertyMap<PBackgroundDef> properties; private final BgDefPropertyListener bdpl = new BgDefPropertyListener(); private final UpdateTrigger updateTrigger = new UpdateTrigger(); public final UpdateSource updateSource = new UpdateSource(this,updateTrigger); public enum PBackgroundDef { VISIBLE,FOREGROUND,BACKGROUND,X,Y,TILE_HORIZ,TILE_VERT,H_SPEED,V_SPEED,STRETCH } private static final EnumMap<PBackgroundDef,Object> DEFS = PropertyMap.makeDefaultMap( PBackgroundDef.class,false,false,null,0,0,true,true,0,0,false); public BackgroundDef() { properties = new PropertyMap<PBackgroundDef>(PBackgroundDef.class,this,DEFS); properties.getUpdateSource(PBackgroundDef.BACKGROUND).addListener(bdpl); } protected void fireUpdate(UpdateEvent e) { if (e == null) updateTrigger.fire(); else updateTrigger.fire(e); } public void updated(UpdateEvent e) { fireUpdate(new UpdateEvent(updateSource,e)); } public Object validate(PBackgroundDef k, Object v) { if (k == PBackgroundDef.BACKGROUND) { ResourceReference<?> r = (ResourceReference<?>) v; if (r != null) { Object o = r.get(); if (o == null) r = null; else if (!(o instanceof Background)) throw new PropertyValidationException(); } if (background != null) background.updateSource.removeListener(this); background = r; if (background != null) background.updateSource.addListener(this); } return v; } private class BgDefPropertyListener extends PropertyUpdateListener<PBackgroundDef> { @Override public void updated(PropertyUpdateEvent<PBackgroundDef> e) { if (e.key == PBackgroundDef.BACKGROUND) fireUpdate(null); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((properties == null) ? 0 : properties.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof BackgroundDef)) return false; BackgroundDef other = (BackgroundDef) obj; if (properties == null) { if (other.properties != null) return false; } else if (!properties.equals(other.properties)) return false; return true; } }