/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.gui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSlider;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingConstants;
import de.cismet.cismap.commons.interaction.CismapBroker;
/**
* DOCUMENT ME!
*
* @author jruiz
* @version $Revision$, $Date$
*/
public class FeatureLayerTransparencyButton extends JButton {
//~ Static fields/initializers ---------------------------------------------
public static final int POPUP_WIDTH = 35;
//~ Instance fields --------------------------------------------------------
private int prevValue = -1;
private final JLabel labPercentage;
private final JPanel panPopup;
private final JPopupMenu popup;
private final JSlider slider;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new LTButton object.
*/
public FeatureLayerTransparencyButton() {
GridBagConstraints gridBagConstraints;
popup = new JPopupMenu();
panPopup = new JPanel();
slider = new SliderMenuItem();
labPercentage = new JLabel();
panPopup.setLayout(new GridBagLayout());
slider.setOrientation(JSlider.VERTICAL);
slider.setValue(100);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = GridBagConstraints.VERTICAL;
gridBagConstraints.weighty = 1.0;
panPopup.add(slider, gridBagConstraints);
labPercentage.setHorizontalAlignment(SwingConstants.CENTER);
labPercentage.setText("100 %");
labPercentage.setMaximumSize(new Dimension(POPUP_WIDTH, 17));
labPercentage.setMinimumSize(new Dimension(POPUP_WIDTH, 17));
labPercentage.setPreferredSize(new Dimension(POPUP_WIDTH, 17));
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new Insets(0, 0, 2, 0);
panPopup.add(labPercentage, gridBagConstraints);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new Insets(2, 2, 2, 2);
setLayout(new GridBagLayout());
addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent evt) {
if (CismapBroker.getInstance().getMappingComponent() != null) {
final float transp = CismapBroker.getInstance()
.getMappingComponent()
.getFeatureLayer()
.getTransparency();
final int intValue = (int)(transp * 100);
slider.setValue(intValue);
}
updateLabel();
popup.show(
FeatureLayerTransparencyButton.this,
(getWidth() / 2)
- (POPUP_WIDTH / 2),
getHeight()
+ 2);
}
});
popup.add(panPopup);
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*/
private void updateLabel() {
final int intValue = (int)slider.getValue();
if (prevValue != intValue) {
labPercentage.setText(String.format("%d%%", slider.getValue()));
}
prevValue = intValue;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class SliderMenuItem extends JSlider implements MenuElement {
//~ Instance fields ----------------------------------------------------
private final SliderPopupListener popupHandler = new SliderPopupListener();
//~ Constructors -------------------------------------------------------
/**
* Creates a new SliderMenuItem object.
*/
public SliderMenuItem() {
addMouseMotionListener(popupHandler);
addMouseListener(popupHandler);
addMouseWheelListener(popupHandler);
}
//~ Methods ------------------------------------------------------------
@Override
public void processMouseEvent(final MouseEvent e,
final MenuElement[] path,
final MenuSelectionManager manager) {
}
@Override
public void processKeyEvent(final KeyEvent e, final MenuElement[] path,
final MenuSelectionManager manager) {
}
@Override
public void menuSelectionChanged(final boolean isIncluded) {
}
@Override
public MenuElement[] getSubElements() {
return new MenuElement[0];
}
@Override
public Component getComponent() {
return this;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
class SliderPopupListener extends MouseAdapter {
//~ Constructors -------------------------------------------------------
/**
* Creates a new SliderPopupListener object.
*/
public SliderPopupListener() {
super();
}
//~ Methods ------------------------------------------------------------
@Override
public void mouseDragged(final MouseEvent me) {
final int intValue = (int)slider.getValue();
if (CismapBroker.getInstance().getMappingComponent() != null) {
CismapBroker.getInstance()
.getMappingComponent()
.getFeatureLayer()
.setTransparency((float)intValue / 100f);
}
updateLabel();
}
@Override
public void mouseReleased(final MouseEvent me) {
}
}
}