package org.freehep.util.commanddispatcher;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* An adapter used in the case where one source maps to multiple targets
* @author tonyj
* @version $Id: MultiTarget.java 8584 2006-08-10 23:06:37Z duns $
*/
class MultiTarget implements SimpleCommandTarget
{
private List l = new ArrayList();
private MultiGroup group = new MultiGroup();
private MultiCommandState myState = new MultiCommandState();
MultiTarget(String command)
{
}
void add(CommandTarget t)
{
l.add(t);
group.notifyObservers();
t.getGroup().addObserver(group);
}
void removeGroup(CommandGroup g)
{
boolean wasChanged = false;
for (Iterator i = l.iterator(); i.hasNext(); )
{
CommandTarget t = (CommandTarget) i.next();
if (t.getGroup() == g)
{
i.remove();
g.deleteObserver(group);
wasChanged = true;
}
}
if (wasChanged) group.notifyObservers();
}
public void enable(CommandState state)
{
myState.setEnabled(false);
// We are enabled as long as one target is enabled
for (int i=0; i<l.size(); i++)
{
((CommandTarget) l.get(i)).enable(myState);
if (myState.isEnabled())
{
state.setEnabled(true);
return;
}
}
state.setEnabled(false);
}
public CommandGroup getGroup()
{
return group;
}
public void invoke()
{
for (int i=0; i<l.size(); i++)
{
SimpleCommandTarget target = (SimpleCommandTarget) l.get(i);
myState.setEnabled(false);
target.enable(myState);
if (myState.isEnabled())
{
target.invoke();
}
}
}
private class MultiCommandState implements CommandState
{
boolean enabled = false;
boolean isEnabled()
{
return enabled;
}
public void setEnabled(boolean state)
{
enabled = state;
}
public void setText(String text)
{
// ignored
}
public void setToolTipText(String text)
{
// ignored
}
}
private class MultiGroup extends Observable implements CommandGroup, Observer
{
public CommandTarget acceptCommand(String command)
{
return MultiTarget.this;
}
public void setManager(CommandTargetManager manager)
{
// who cares?
}
public void update(Observable o, Object arg)
{
notifyObservers(arg);
}
public void notifyObservers(Object arg)
{
setChanged();
super.notifyObservers(arg);
}
}
}