/**
*
*/
package fr.unistra.pelican.gui.MultiViews;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import java.util.ArrayList;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import fr.unistra.pelican.util.Wrapper;
/**
* Lock the properties of several views together.
*
* @author Benjamin Perret
*
*/
public class ViewLocker implements ChangeListener{
public static final String LOCKER_PROPERTY_NAME = "VIEW_LOCKER";
public static final String LOCKER_PROPERTY_DO_NOT_PERFORM_EVENT = "VIEW_LOCKER_DNPE";
public static final Image LOCK_ICON ;//=Toolkit.getDefaultToolkit().createImage((MultiView.RESSOURCES_PATH + "icon_lock.png"));
static{
Wrapper w=new Wrapper();
ClassLoader cl = w.getClass().getClassLoader();
// Create icons
// Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif"));
URL url=cl.getResource(MultiView.RESSOURCES_PATH + "icon_lock.png");
//InputStream in=cl.getResourceAsStream("model/modelDemoVisu.aim");
//File f;
Image i=null;
if(url!=null)
{
i=Toolkit.getDefaultToolkit().createImage(url);
}else {
i=Toolkit.getDefaultToolkit().createImage(MultiView.RESSOURCES_PATH + "icon_lock.png");
}
LOCK_ICON=i;
}
//private static int globalLockNumber=1;
private static ArrayList<Integer> usedNumbers=new ArrayList<Integer>();
private int lockNumber=0;
private ArrayList<View> list= new ArrayList<View>();
public ViewLocker()
{
lockNumber=findLockNumber();
usedNumbers.add(lockNumber);
}
private int findLockNumber(){
boolean flag=true;
int n=0;
do
{
n++;
flag=usedNumbers.contains(n);
}while(flag);
return n;
}
public void add(View v)
{
v.addChangeListener(this);
v.properties.put(LOCKER_PROPERTY_NAME,this);
if(list.size()>0)
v.copyAttribute(list.get(0));
list.add(v);
}
public void remove(View v)
{
v.properties.remove(LOCKER_PROPERTY_NAME);
v.removeChangeListener(this);
list.remove(v);
if(list.size()==0)
{
usedNumbers.remove((Integer)lockNumber);
}
}
public void clear()
{
for(View v:list)
{
v.properties.remove(LOCKER_PROPERTY_NAME);
v.removeChangeListener(this);
}
usedNumbers.remove((Integer)lockNumber);
list.clear();
}
public void stateChanged(ChangeEvent e) {
View ori=(View)e.getSource();
Map<String,Object> prop=((View)(e.getSource())).properties;
if(prop.containsKey(LOCKER_PROPERTY_DO_NOT_PERFORM_EVENT )) // a good (not really in fact) old hack to avoid infinite loops...
{
prop.remove(LOCKER_PROPERTY_DO_NOT_PERFORM_EVENT );
}
else for (View v : list) {
if(v!=ori)
{
v.properties.put(LOCKER_PROPERTY_DO_NOT_PERFORM_EVENT , null);
v.copyAttribute(ori);
}
}
}
public int getLockNumber() {
return lockNumber;
}
public int size(){
return list.size();
}
}