/*
* Copyright 2011 Uwe Krueger.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mandelsoft.mand.tool.mapper;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.mandelsoft.mand.mapping.Mapper;
import com.mandelsoft.swing.ChangeListenerSupport;
/**
*
* @author Uwe Krüger
*/
public class MapperModel extends AbstractListModel implements ComboBoxModel {
public static boolean debug=false;
private List<MapperCreator> mappers;
private MapperCreator selected;
private ChangeListenerSupport listeners=new ChangeListenerSupport();
private MapperListener listener=new MapperListener();
public MapperModel()
{
super();
mappers=new ArrayList<MapperCreator>();
setup();
}
private void setup()
{
addCreator(new CyclicMapperCreator());
addCreator(new StatisticMapperCreator());
addCreator(new OptimalMapperCreator());
}
public MapperCreator getCreator(int index)
{
return mappers.get(index);
}
public int getSize()
{
return mappers.size();
}
public Object getElementAt(int index)
{
return mappers.get(index).getName();
}
public MapperCreator getElement(Object item)
{
for (MapperCreator c:mappers) {
if (item.equals(c.getName())) {
return c;
}
}
return null;
}
public void setSelectedItem(Object anItem)
{
if (selected!=null) {
selected.removeChangeListener(listener);
}
if (anItem==null) {
selected=null;
}
else
if (debug) System.out.println("current select: "+selected);
for (MapperCreator c:mappers) {
if (anItem.equals(c.getName())) {
if (debug) System.out.println("found select: "+c);
MapperCreator old=selected;
selected=c;
selected.addChangeListener(listener);
if (selected!=old) {
if (debug) System.out.println("fire change event: "+selected.getName());
//this.fireContentsChanged(this, 0, mappers.size()-1);
fireChangeEvent();
}
}
}
}
public Object getSelectedItem()
{
if (selected==null) return null;
return selected.getName();
}
public Mapper getMapper()
{
return selected.createMapper();
}
/////////////////////////////////////////////////////////////////////
public void addCreator(MapperCreator c)
{
if (!mappers.contains(c)) {
mappers.add(c);
c.setVisible(false);
if (selected==null) selected=c;
this.fireContentsChanged(this, mappers.size()-1, mappers.size()-1);
}
}
public void removeCreator(MapperCreator c)
{
for (int i=0; i<mappers.size();
i++) {
if (mappers.get(i)==c) {
mappers.remove(c);
if (selected==c) selected=null;
this.fireContentsChanged(this, i, mappers.size());
}
}
}
public void removeChangeListener(ChangeListener h)
{
listeners.removeChangeListener(h);
}
public void addChangeListener(ChangeListener h)
{
listeners.addChangeListener(h);
}
private void fireChangeEvent()
{
listeners.fireChangeEvent();
}
//////////////////////////////////////////////////////////////////////
// change handling
//////////////////////////////////////////////////////////////////////
private class MapperListener implements ChangeListener {
public void stateChanged(ChangeEvent e)
{
if (debug) System.out.println("mapper data changed");
fireChangeEvent();
}
}
}