/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.cids.utils.multibean; import org.apache.log4j.Logger; import org.jdesktop.swingx.JXDatePicker; import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Composite; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Graphics2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListCellRenderer; import javax.swing.text.JTextComponent; /** * DOCUMENT ME! * * @version $Revision$, $Date$ */ public class EmbeddedMultiBeanDisplay extends JLabel { //~ Static fields/initializers --------------------------------------------- private static final String DIFFERENT_VALUE = "<html><i>unterschiedliche Werte</i>"; private static final String LOADING = "<html><i>wird geladen</i>"; private static final int ALPHA_MAX = 255; private static final int ALPHA_MIN = 0; public static ImageIcon ICON_WARNING = new ImageIcon(MultiBeanHelper.class.getResource( "/de/cismet/cids/utils/multibean/warning.png")); //~ Instance fields -------------------------------------------------------- private int alpha = ALPHA_MIN; private boolean enabled = true; private boolean editable = true; private final PropertyChangeListener enableListener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { if (evt.getPropertyName().equals("enabled")) { enabled = (Boolean)evt.getNewValue(); } if (evt.getPropertyName().equals("editable")) { editable = (Boolean)evt.getNewValue(); } } }; //~ Constructors ----------------------------------------------------------- /** * Creates a new EmbeddedValidatorDisplay object. * * @param component DOCUMENT ME! * @param propertyName DOCUMENT ME! * @param multiBeanHelper DOCUMENT ME! */ private EmbeddedMultiBeanDisplay(final JComponent component, final String propertyName, final MultiBeanHelper multiBeanHelper) { setHorizontalAlignment(RIGHT); setVerticalAlignment(TOP); setCursor(Cursor.getPredefinedCursor(0)); setVisible(false); // setToolTipText("unterschiedliche Werte"); setIcon(EmbeddedMultiBeanDisplay.ICON_WARNING); setText(DIFFERENT_VALUE); if ((component instanceof JTextField) || (component instanceof JTextArea)) { if (!(component.getLayout() instanceof BorderLayout)) { component.setLayout(new BorderLayout()); } component.add(this, BorderLayout.WEST); } else if (component instanceof JComboBox) { setVisible(true); final ListCellRenderer rend = ((JComboBox)component).getRenderer(); ((JComboBox)component).setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(final JList<?> list, final Object value, final int index, final boolean isSelected, final boolean cellHasFocus) { final JLabel comp = (JLabel)rend.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus); if ((value == null) && (multiBeanHelper.isLoading() || (!multiBeanHelper.getBeans().isEmpty() && !multiBeanHelper.isLoading() && !multiBeanHelper.isValuesAllEquals(propertyName)))) { comp.setIcon(EmbeddedMultiBeanDisplay.this.getIcon()); comp.setText(EmbeddedMultiBeanDisplay.this.getText()); } return comp; } }); } else if (component instanceof JXDatePicker) { final JFormattedTextField jft = ((JXDatePicker)component).getEditor(); jft.setLayout(new BorderLayout()); jft.add(this, BorderLayout.WEST); } multiBeanHelper.addListener(new MultiBeanHelperListener() { @Override public void refillAllEqualsMapStarted() { setText(LOADING); component.removePropertyChangeListener(enableListener); if (component instanceof JTextComponent) { ((JTextComponent)component).setEditable(false); } component.setEnabled(false); component.addPropertyChangeListener(enableListener); doOverlay(true); } @Override public void refillAllEqualsMapDone() { setText(DIFFERENT_VALUE); component.removePropertyChangeListener(enableListener); component.setEnabled(enabled); if (component instanceof JTextComponent) { ((JTextComponent)component).setEditable(editable); } component.addPropertyChangeListener(enableListener); doOverlay(!multiBeanHelper.isValuesAllEquals(propertyName)); } @Override public void allEqualsChanged(final String propertyNameAllEqualsChanged, final boolean allEquals) { if ((!multiBeanHelper.isLoading() && propertyNameAllEqualsChanged.equals(propertyName)) || multiBeanHelper.isLoading()) { doOverlay(!allEquals); } } }); component.addPropertyChangeListener(enableListener); enabled = component.isEnabled(); if (component instanceof JTextComponent) { editable = ((JTextComponent)component).isEditable(); } } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param component DOCUMENT ME! * @param propertyName DOCUMENT ME! * @param multiBeanHelper DOCUMENT ME! */ public static void registerComponentForProperty(final JComponent component, final String propertyName, final MultiBeanHelper multiBeanHelper) { final EmbeddedMultiBeanDisplay overlay = new EmbeddedMultiBeanDisplay(component, propertyName, multiBeanHelper); } /** * DOCUMENT ME! * * @param component DOCUMENT ME! * @param multiBeanHelper DOCUMENT ME! * * @return DOCUMENT ME! */ @Deprecated public static EmbeddedMultiBeanDisplay getEmbeddedDisplayFor(final JComponent component, final MultiBeanHelper multiBeanHelper) { return null; } @Override protected void paintComponent(final Graphics g) { super.paintComponent(g); final Graphics2D g2 = (Graphics2D)g; final Composite oldComposite = g2.getComposite(); g2.setComposite(AlphaComposite.SrcOver); final Color c = getParent().getBackground(); final Color color = new Color(c.getRed(), c.getGreen(), c.getBlue(), this.alpha); g2.setColor(color); g2.fillRect(0, 0, getWidth(), getHeight()); g2.setComposite(oldComposite); } /** * DOCUMENT ME! * * @param overlay DOCUMENT ME! */ public void doOverlay(final boolean overlay) { if (overlay) { setAlpha(ALPHA_MIN); setVisible(true); } else { setAlpha(ALPHA_MAX); setVisible(false); } repaint(); } /** * DOCUMENT ME! * * @param alpha DOCUMENT ME! */ public void setAlpha(int alpha) { if (alpha < ALPHA_MIN) { alpha = ALPHA_MIN; } if (alpha > ALPHA_MAX) { alpha = ALPHA_MAX; } this.alpha = alpha; } }