package regexgolf2.controllers;
import java.util.EventObject;
import regexgolf2.model.ObjectChangedListener;
import regexgolf2.model.SolvableChallenge;
import regexgolf2.services.persistence.changetracking.PersistenceState;
import regexgolf2.ui.subcomponents.challengelisting.challengecell.ChallengeItem;
import com.google.java.contract.Ensures;
import com.google.java.contract.Requires;
public class ChallengeItemController
{
private final SolvableChallenge _challenge;
private final PersistenceState _persistenceState;
private ChallengeItem _item;
private ObjectChangedListener _listener;
@Requires({
"challenge != null",
"pState != null",
"pState.getObservedItem() == challenge"
})
public ChallengeItemController(SolvableChallenge challenge, PersistenceState pState)
{
_challenge = challenge;
_persistenceState = pState;
initItem();
initListener();
}
private void initItem()
{
_item = new ChallengeItem(_challenge.getChallenge().getName(),
_challenge.getAmountRequirements(),
_challenge.getAmountCompliedRequirements(),
_persistenceState.isChanged(),
_challenge.isSolved());
}
private void initListener()
{
_listener = new ObjectChangedListener()
{
@Override
public void objectChanged(EventObject event)
{
_item.update(_challenge.getChallenge().getName(),
_challenge.getAmountRequirements(),
_challenge.getAmountCompliedRequirements(),
_persistenceState.isChanged(),
_challenge.isSolved());
}
};
_challenge.addObjectChangedListener(_listener);
_persistenceState.addObjectChangedListener(_listener);
}
/**
* Returns the Challenge that is represented by the ChallengeItem
* associated with this Controller.
*/
@Ensures("result != null")
public SolvableChallenge getChallenge()
{
return _challenge;
}
/**
* Returns the ChallengeItem that is controlled by this Controller.
*/
@Ensures("result != null")
public ChallengeItem getItem()
{
return _item;
}
/**
* This method makes the Controller unsubscibe from the PersistenceState
* and Challenge it previously listened.
* That way, references to the Controller are removed and it can be
* garbage collected.
*/
public void discard()
{
//XXX actually, this method will only be called, if the challenge
//and persistenceState will also be un-referenced in the near future.
//If this is allways the case, this method would be obsolete.
_challenge.removeObjectChangedListener(_listener);
_persistenceState.removeObjectChangedListener(_listener);
}
}