/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.tools.gui.jbands;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
import de.cismet.tools.gui.StaticSwingTools;
import de.cismet.tools.gui.WaitingDialogThread;
import de.cismet.tools.gui.jbands.interfaces.BandListener;
import de.cismet.tools.gui.jbands.interfaces.BandMember;
import de.cismet.tools.gui.jbands.interfaces.BandMemberListener;
import de.cismet.tools.gui.jbands.interfaces.BandModificationProvider;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class SimpleModifiableBand extends DefaultBand implements BandModificationProvider, BandMemberListener {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(SimpleModifiableBand.class);
//~ Instance fields --------------------------------------------------------
protected boolean readOnly = false;
protected Double fixMin = null;
protected Double fixMax = null;
private List<BandListener> listenerList = new ArrayList<BandListener>();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new MassnahmenBand object.
*
* @param title DOCUMENT ME!
*/
public SimpleModifiableBand(final String title) {
this(1f, title);
}
/**
* Creates a new MassnahmenBand object.
*
* @param heightWeight DOCUMENT ME!
*/
public SimpleModifiableBand(final float heightWeight) {
super(heightWeight);
}
/**
* Creates a new MassnahmenBand object.
*
* @param heightWeight DOCUMENT ME!
* @param title DOCUMENT ME!
*/
public SimpleModifiableBand(final float heightWeight, final String title) {
super(heightWeight, title);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param readOnly DOCUMENT ME!
*/
public void setReadOnly(final boolean readOnly) {
this.readOnly = readOnly;
}
@Override
public void addMember(final Double startStation,
final Double endStation,
final Double minStart,
final Double maxEnd,
final List<BandMember> memberList) {
final WaitingDialogThread<Void> wdt = new WaitingDialogThread<Void>(StaticSwingTools.getParentFrame(
getPrefixComponent()),
true,
"Erstelle Abschnitt",
null,
100) {
@Override
protected Void doInBackground() throws Exception {
if (endStation == null) {
addUnspecifiedMember(startStation, minStart, maxEnd, memberList);
} else {
addSpecifiedMember(startStation, endStation);
}
return null;
}
};
wdt.start();
}
@Override
public void addMember(final BandMember m) {
super.addMember(m);
if (m instanceof SimpleModifiableBandMember) {
((SimpleModifiableBandMember)m).addBandMemberListener(this);
}
}
/**
* DOCUMENT ME!
*
* @param startStation DOCUMENT ME!
* @param minStart DOCUMENT ME!
* @param maxEnd DOCUMENT ME!
* @param memberList DOCUMENT ME!
*/
private void addUnspecifiedMember(final Double startStation,
final Double minStart,
final Double maxEnd,
final List<BandMember> memberList) {
double distanceBefore = Double.MAX_VALUE;
double distanceBehind = Double.MAX_VALUE;
double newTo = maxEnd;
double newFrom = minStart;
if (memberList != null) {
// member list will be considered.
for (final BandMember tmp : memberList) {
final Double from = (Double)tmp.getMin();
final Double till = (Double)tmp.getMax();
if ((from != null) && (till != null)) {
double distance = startStation - till;
if ((distance < distanceBefore) && (distance >= 0)) {
distanceBefore = distance;
newFrom = till;
}
distance = from - startStation;
if ((distance < distanceBehind) && (distance >= 0)) {
distanceBehind = distance;
newTo = from;
}
}
}
try {
addNewMember(newFrom, newTo);
} catch (Exception e) {
LOG.error("error while creating new station.", e);
}
}
}
/**
* DOCUMENT ME!
*
* @param startStation DOCUMENT ME!
* @param endStation minStart DOCUMENT ME!
*/
private void addSpecifiedMember(final Double startStation,
final Double endStation) {
try {
addNewMember(startStation, endStation);
} catch (Exception e) {
LOG.error("error while creating new station.", e);
}
}
/**
* DOCUMENT ME!
*
* @param start beanBefore DOCUMENT ME!
* @param end beanBehind DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
private void addNewMember(final Double start, final Double end) throws Exception {
final SimpleModifiableBandMember m = createNewBandMember(start, end);
members.add(m);
fireBandChanged(new BandEvent());
}
/**
* DOCUMENT ME!
*
* @param start DOCUMENT ME!
* @param end DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected SimpleModifiableBandMember createNewBandMember(final Double start, final Double end) {
final SimpleModifiableBandMember member = new SimpleModifiableBandMember(this, readOnly, start, end);
member.addBandMemberListener(this);
return member;
}
@Override
public void addBandListener(final BandListener listener) {
listenerList.add(listener);
}
@Override
public void removeBandListener(final BandListener listener) {
listenerList.remove(listener);
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void fireBandChanged(final BandEvent e) {
for (final BandListener l : listenerList) {
l.bandChanged(e);
}
}
@Override
public void bandMemberChanged(final BandMemberEvent e) {
final BandEvent ev = new BandEvent();
if ((e != null)) {
if (e.isSelectionLost()) {
ev.setSelectionLost(true);
}
ev.setModelChanged(e.isModelChanged());
}
fireBandChanged(ev);
}
/**
* DOCUMENT ME!
*
* @param member DOCUMENT ME!
*/
public void deleteMember(final SimpleModifiableBandMember member) {
members.remove(member);
final BandEvent e = new BandEvent();
e.setSelectionLost(true);
fireBandChanged(e);
}
/**
* DOCUMENT ME!
*
* @param min DOCUMENT ME!
*/
@Override
public void setMin(final Double min) {
this.fixMin = min;
}
/**
* DOCUMENT ME!
*
* @param max DOCUMENT ME!
*/
@Override
public void setMax(final Double max) {
this.fixMax = max;
}
@Override
public double getMin() {
if (fixMin != null) {
return fixMin;
} else {
return super.getMin();
}
}
@Override
public double getMax() {
if (fixMax != null) {
return fixMax;
} else {
return super.getMax();
}
}
}