/*
* $Id$
*
* Copyright 2009 Sun Microsystems, Inc., 4150 Network Circle,
* Santa Clara, California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.jdesktop.swingx.plaf.nimbus;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.swing.JCheckBox;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import org.jdesktop.swingx.InteractiveTestCase;
import org.jdesktop.test.PropertyChangeReport;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
*
* @author Jeanette Winzenburg
*/
@RunWith(JUnit4.class)
public class RawNimbusIssues extends InteractiveTestCase {
/**
*
*/
@SuppressWarnings("unused")
private static final Logger LOG = Logger.getLogger(RawNimbusIssues.class
.getName());
private static final String ALTERNATE_ROW_COLOR = "Table.alternateRowColor";
private static final String TABLE_BACKGROUND = "Table.background";
@Test
public void testBackground() {
LOG.info("back color? " + UIManager.get(TABLE_BACKGROUND));
JCheckBox box = new JCheckBox();
LOG.info(" checkbox? " + box.getBackground());
}
/**
* Core Issue ??: Nimbus install must be complete on propertyChangeNotification
* from UIManager.
*
* The error is to "derive" the color only after firing, that is when receiving
* the notification of the change to itself (how weird is that?) and
* changing the color value without notifying listeners to the defaults.
*
* Here we test the alternative: if the color is not yet completely installed
* at the time of firing a lookAndFeel property change, then at least the
* color must fire a property change on derive (as is documented in the
* api doc, but not done)
*
* @throws Exception
*/
@Test
public void testColorInCompleteFireChange() throws Exception {
setLookAndFeel("Metal");
final List<Color> colors = new ArrayList<Color>();
final List<Integer> rgb = new ArrayList<Integer>();
final PropertyChangeReport report = new PropertyChangeReport();
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
UIManager.getLookAndFeelDefaults().addPropertyChangeListener(report);
colors.add(UIManager.getColor(ALTERNATE_ROW_COLOR));
rgb.add(colors.get(0).getRGB());
}
};
try {
UIManager.addPropertyChangeListener(l);
setLookAndFeel("Nimbus");
int rgbOrg = rgb.get(0);
if (colors.get(0).getRGB() != rgbOrg) {
assertTrue("lookandFeelDefaults must have fired color change notification",
report.hasEvents());
}
} finally {
removeListeners(l, report);
}
}
/**
* Core Issue ??: Nimbus install must be complete on propertyChangeNotification
* from UIManager.
*
* The error is to "derive" the color only after firing, that is when receiving
* the notification of the change to itself (how weird is that?) and
* changing the color value without notifying listeners to the defaults.
*
* Here we test that the color is the same instance as when the lookAndFeel
* property change and that it is unchanged if no event fired from the
* lookandfeelDefaults
*
* @throws Exception
*/
@Test
public void testColorCompleteInstalled() throws Exception {
setLookAndFeel("Metal");
final List<Color> colors = new ArrayList<Color>();
final List<Integer> rgb = new ArrayList<Integer>();
final PropertyChangeReport report = new PropertyChangeReport();
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
UIManager.getLookAndFeelDefaults().addPropertyChangeListener(report);
colors.add(UIManager.getColor(ALTERNATE_ROW_COLOR));
rgb.add(colors.get(0).getRGB());
}
};
try {
UIManager.addPropertyChangeListener(l);
setLookAndFeel("Nimbus");
assertSame("Color installed when firing property change",
colors.get(0), UIManager.getColor(ALTERNATE_ROW_COLOR));
if (!report.hasEvents()) {
int rgbOrg = rgb.get(0);
assertEquals("Color must be unchanged compared to original",
rgbOrg, colors.get(0).getRGB());
}
} finally {
removeListeners(l, report);
}
}
/**
* Core issue: UIDefaults not firing on remove.
*
* Reported with review id: 1610127
*/
@Test
public void testUIDefaultsNotificationRemove() {
UIDefaults properties = new UIDefaults();
PropertyChangeReport report = new PropertyChangeReport();
properties.addPropertyChangeListener(report);
Object value = new Object();
properties.put("somevalue", value);
assertEquals(1, report.getEventCount("somevalue"));
report.clear();
properties.remove("somevalue");
assertNull("sanity: value removed", properties.get("somevalue"));
assertEquals("uidefaults must fire (here: remove)", 1, report.getEventCount("somevalue"));
}
/**
* Core issue: UIDefaults not firing on remove.
*
* Reported with review id: 1610127
*
* This tests the workaround: don't use remove but put(key, null) instead.
*/
@Test
public void testUIDefaultsNotificationPutNull() {
UIDefaults properties = new UIDefaults();
Object value = new Object();
properties.put("somevalue", value);
PropertyChangeReport report = new PropertyChangeReport();
properties.addPropertyChangeListener(report);
properties.put("somevalue", null);
assertEquals("uidefaults must fire (here: put(.. null))", 1, report.getEventCount("somevalue"));
}
/**
* Removes listeners installed on UIManager and lookAndFeelDefaults.
*
* @param managerListener the listener the remove from the UIManager
* @param lookAndFeelDefaultsListener the listener to remove from the
* lookAndFeelDefaults
*/
private void removeListeners(PropertyChangeListener managerListener,
PropertyChangeListener lookAndFeelDefaultsListener) {
UIManager.removePropertyChangeListener(managerListener);
UIManager.getLookAndFeelDefaults().removePropertyChangeListener(lookAndFeelDefaultsListener);
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
// force a new instance for each round
setLookAndFeel("Nimbus");
assertEquals("sanity: nothing loaded", null, UIManager.get("DatePickerUI"));
}
}