/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* LineBandMember.java
*
* Created on 8.03.2012
*/
package de.cismet.tools.gui.jbands;
import org.apache.log4j.Logger;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.*;
import org.jdesktop.swingx.painter.Painter;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
import de.cismet.tools.gui.jbands.interfaces.BandMember;
import de.cismet.tools.gui.jbands.interfaces.BandMemberListener;
import de.cismet.tools.gui.jbands.interfaces.BandMemberSelectable;
import de.cismet.tools.gui.jbands.interfaces.ModifiableBandMember;
import de.cismet.tools.gui.jbands.interfaces.Section;
import de.cismet.tools.gui.jbands.interfaces.StationaryBandMemberMouseListeningComponent;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class SimpleModifiableBandMember extends JXPanel implements ModifiableBandMember,
Section,
StationaryBandMemberMouseListeningComponent,
BandMemberSelectable,
ActionListener,
PopupMenuListener {
//~ Static fields/initializers ---------------------------------------------
protected static final Logger LOG = Logger.getLogger(SimpleModifiableBandMember.class);
//~ Instance fields --------------------------------------------------------
protected Painter unselectedBackgroundPainter = null;
protected Painter selectedBackgroundPainter = null;
protected boolean isSelected = false;
protected JPopupMenu popup = new JPopupMenu();
protected int mouseClickedXPosition = 0;
protected String lineFieldName = "linie";
double von = 0;
double bis = 0;
private boolean dragStart = false;
private int dragSide = 0;
private JMenuItem deleteItem = new JMenuItem("löschen");
private SimpleModifiableBand parent;
private List<BandMemberListener> listenerList = new ArrayList<BandMemberListener>();
private boolean readOnly;
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel labText;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form MassnahmenBandMember.
*
* @param parent DOCUMENT ME!
*/
public SimpleModifiableBandMember(final SimpleModifiableBand parent) {
this(parent, false, 0, 0);
}
/**
* Creates new form MassnahmenBandMember.
*
* @param parent DOCUMENT ME!
* @param readOnly DOCUMENT ME!
* @param from DOCUMENT ME!
* @param to DOCUMENT ME!
*/
public SimpleModifiableBandMember(final SimpleModifiableBand parent,
final boolean readOnly,
final double from,
final double to) {
this.readOnly = readOnly;
initComponents();
setAlpha(0.8f);
this.parent = parent;
this.von = from;
this.bis = to;
popup.addPopupMenuListener(this);
initMember();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void initMember() {
determineBackgroundColour();
configurePopupMenu();
}
@Override
public JComponent getBandMemberComponent() {
return this;
}
@Override
public double getMax() {
return (von < bis) ? bis : von;
}
@Override
public double getMin() {
return (von < bis) ? von : bis;
}
@Override
public double getFrom() {
return von;
}
@Override
public double getTo() {
return bis;
}
/**
* DOCUMENT ME!
*
* @param from DOCUMENT ME!
*/
public void setFrom(final Double from) {
this.von = from;
}
/**
* DOCUMENT ME!
*
* @param to DOCUMENT ME!
*/
public void setTo(final Double to) {
this.bis = to;
}
/**
* DOCUMENT ME!
*
* @param text DOCUMENT ME!
*/
public void setText(final String text) {
labText.setText(text);
}
/**
* DOCUMENT ME!
*/
protected void setDefaultBackground() {
unselectedBackgroundPainter = new MattePainter(new Color(229, 0, 0));
selectedBackgroundPainter = new CompoundPainter(
unselectedBackgroundPainter,
new RectanglePainter(
3,
3,
3,
3,
3,
3,
true,
new Color(100, 100, 100, 100),
2f,
new Color(50, 50, 50, 100)));
if (isSelected) {
setBackgroundPainter(selectedBackgroundPainter);
} else {
setBackgroundPainter(unselectedBackgroundPainter);
}
}
/**
* DOCUMENT ME!
*/
protected void configurePopupMenu() {
deleteItem.addActionListener(this);
popup.add(deleteItem);
}
/**
* DOCUMENT ME!
*/
protected void determineBackgroundColour() {
setDefaultBackground();
}
/**
* This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. The
* content of this method is always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
final java.awt.GridBagConstraints gridBagConstraints;
labText = new javax.swing.JLabel();
setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
setLayout(new java.awt.GridBagLayout());
labText.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(labText, gridBagConstraints);
} // </editor-fold>//GEN-END:initComponents
@Override
public void mouseClicked(final MouseEvent e) {
}
@Override
public void mouseEntered(final MouseEvent e) {
if (JBandCursorManager.getInstance().isLocked()) {
JBandCursorManager.getInstance().setCursor(this);
}
setAlpha(1f);
}
@Override
public void mouseExited(final MouseEvent e) {
setAlpha(0.8f);
}
@Override
public void mousePressed(final MouseEvent e) {
if (e.isPopupTrigger() && isSelected) {
showPopupMenu(e.getX(), e.getY());
}
}
@Override
public void mouseReleased(final MouseEvent e) {
if (dragStart) {
dragStart = false;
JBandCursorManager.getInstance().setLocked(false);
}
if (e.isPopupTrigger() && isSelected) {
showPopupMenu(e.getX(), e.getY());
}
}
@Override
public void mouseDragged(final MouseEvent e) {
if (JBandCursorManager.getInstance().isLocked()) {
JBandCursorManager.getInstance().setCursor(this);
}
}
@Override
public void mouseDragged(final MouseEvent e, final double station) {
if (JBandCursorManager.getInstance().isLocked()) {
JBandCursorManager.getInstance().setCursor(this);
}
if (!dragStart) {
if (JBandCursorManager.getInstance().getCursor().equals(
Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR))) {
dragSide = 1;
dragStart = true;
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
JBandCursorManager.getInstance().setLocked(true);
JBandCursorManager.getInstance().setCursor(this);
} else if (JBandCursorManager.getInstance().getCursor().equals(
Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR))) {
dragSide = 2;
dragStart = true;
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
JBandCursorManager.getInstance().setLocked(true);
JBandCursorManager.getInstance().setCursor(this);
}
} else {
if (dragSide == 1) {
von = Math.floor(station);
} else {
bis = Math.floor(station);
}
fireBandMemberChanged(false);
}
}
@Override
public void mouseMoved(final MouseEvent e) {
if (!JBandCursorManager.getInstance().isLocked()) {
if (isSelected && !isReadOnly()) {
if (e.getX() < 5) {
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
JBandCursorManager.getInstance().setCursor(this);
} else if (e.getX() > (getWidth() - 5)) {
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
JBandCursorManager.getInstance().setCursor(this);
} else {
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JBandCursorManager.getInstance().setCursor(this);
}
} else {
JBandCursorManager.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JBandCursorManager.getInstance().setCursor(this);
}
} else {
JBandCursorManager.getInstance().setCursor(this);
}
}
@Override
public boolean isSelectable() {
return true;
}
@Override
public boolean isSelected() {
return isSelected;
}
@Override
public void setSelected(final boolean selection) {
isSelected = selection;
if (!isSelected) {
setBackgroundPainter(unselectedBackgroundPainter);
} else {
setBackgroundPainter(selectedBackgroundPainter);
}
}
@Override
public BandMember getBandMember() {
return this;
}
@Override
public void actionPerformed(final ActionEvent e) {
if (e.getSource() == deleteItem) {
deleteMember();
}
}
/**
* DOCUMENT ME!
*/
private void deleteMember() {
parent.deleteMember(this);
}
@Override
public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
}
@Override
public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
}
@Override
public void popupMenuCanceled(final PopupMenuEvent e) {
}
@Override
public void addBandMemberListener(final BandMemberListener listener) {
listenerList.add(listener);
}
@Override
public void removeBandMemberListener(final BandMemberListener listener) {
listenerList.remove(listener);
}
/**
* DOCUMENT ME!
*
* @param modelChanged DOCUMENT ME!
*/
public void fireBandMemberChanged(final boolean modelChanged) {
for (final BandMemberListener l : listenerList) {
l.bandMemberChanged(new BandMemberEvent(modelChanged));
}
}
/**
* DOCUMENT ME!
*
* @param e DOCUMENT ME!
*/
public void fireBandMemberChanged(final BandMemberEvent e) {
for (final BandMemberListener l : listenerList) {
l.bandMemberChanged(e);
}
}
/**
* DOCUMENT ME!
*
* @param x DOCUMENT ME!
* @param y DOCUMENT ME!
*/
private void showPopupMenu(final int x, final int y) {
mouseClickedXPosition = x;
popup.show(this, x, y);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public SimpleModifiableBand getParentBand() {
return parent;
}
/**
* DOCUMENT ME!
*
* @return the readOnly
*/
public boolean isReadOnly() {
return readOnly;
}
/**
* DOCUMENT ME!
*
* @param readOnly the readOnly to set
*/
public void setReadOnly(final boolean readOnly) {
this.readOnly = readOnly;
}
}