/* * 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); } } public boolean equals(Object o) { if (o == this) return true; if (o == null || !(o instanceof BackgroundDef)) return false; return properties.equals(((BackgroundDef) o).properties); } }