blob: 4eafa9ca52eb073ae41800cb51870a285a4570a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.openide.explorer.propertysheet;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
import java.lang.reflect.InvocationTargetException;
import java.util.MissingResourceException;
import javax.swing.AbstractButton;
import javax.swing.Action;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.Node;
import org.openide.nodes.PropertySupport;
import org.openide.nodes.Sheet;
import org.openide.util.NbBundle;
// This test class tests the main functionality of the property sheet
public class RestoreDefaultValueTest extends ExtTestCase {
public static Test suite() {
return GraphicsEnvironment.isHeadless() ? new TestSuite() : new TestSuite(RestoreDefaultValueTest.class);
}
private PropertySheet ps = null;
public RestoreDefaultValueTest(String name) {
super(name);
}
protected boolean runInEQ() {
return false;
}
static {
ExtTestCase.installCorePropertyEditors();
}
private static boolean setup = false;
/*
* This test creates a Property, Editor and Node. First test checks if initialized
* editor contains the same value as property. The second checks if the property
* value is changed if the same change will be done in the editor.
*/
protected void setUp() throws Exception {
// Create new TNode
tn = new TNode();
//Replacing NodeOp w/ JFrame to eliminate depending on full IDE init
//and long delay while waiting for property sheet thus requested to
//initialize
final JFrame jf = new JFrame();
ps = new PropertySheet();
jf.getContentPane().setLayout(new BorderLayout());
jf.getContentPane().add(ps, BorderLayout.CENTER);
jf.setLocation(30,30);
jf.setSize(500,500);
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
ps.setNodes(new Node[] {tn});
//ps.setCurrentNode(tn);
jf.show();
jf.toFront();
}
});
new ExtTestCase.WaitWindow(jf);
try {
ensurePainted(ps);
} catch (Exception e) {
fail("FAILED - Exception thrown "+e.getClass().toString());
}
}
private void ensurePainted(final PropertySheet ps) throws Exception {
//issues 39205 & 39206 - ensure the property sheet really repaints
//before we get the value, or the value in the editor will not
//have changed
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
Graphics g = ps.getGraphics();
ps.paintImmediately(0,0,ps.getWidth(), ps.getHeight());
}
});
}
public void testRestoreDefaultValueWorks() throws Exception {
System.err.println("testRestoreDefaultValueWorks");
if (!super.canSafelyRunFocusTests()) {
return;
}
sleep();
sleep();
sleep();
assertNotNull("Property not created", tp);
final Action invoke = ps.table.getActionMap().get("invokeCustomEditor");
assertNotNull("Incompatible change - no action from table for the key" +
"\"invokeCustomEditor\".", invoke);
pressCell(ps.table, 1, 1);
Window w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
sleep();
sleep();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
invoke.actionPerformed(null);
}
});
int ct = 0;
while (!(w instanceof JDialog)) {
if (ct++ > 10000) {
fail("No dialog ever shown");
}
sleep();
w = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
}
sleep();
System.out.println(" Dlg now showing");
final AbstractButton jb = findResetToDefaultButton((JDialog)w);
if (jb == null) {
fail("Could not find Reset To Default Button in dialog");
}
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
jb.doClick();
}
});
Thread.currentThread().sleep(10000);
}
private AbstractButton findResetToDefaultButton(JDialog jd) {
String txt = null;
try {
txt = NbBundle.getMessage(PropertyDialogManager.class, "CTL_Default");
} catch (MissingResourceException mre) {
mre.printStackTrace();
fail("Bundle key CTL_DEFAULT missing from org.openide.explorer.propertysheet.Bundle.properties");
}
return findButton(jd.getContentPane(), txt);
}
private AbstractButton findButton(Container c, String s) {
if (c instanceof AbstractButton && s.equals(((AbstractButton) c).getText())) {
return ((AbstractButton) c);
} else {
Component[] cs = c.getComponents();
for (int i=0; i < cs.length; i++) {
if (cs[i] instanceof Container) {
AbstractButton result = findButton((Container) cs[i], s);
if (result != null) {
return result;
}
}
}
}
return null;
}
//Node definition
public class TNode extends AbstractNode {
//create Node
public TNode() {
super(Children.LEAF);
setName("TNode"); // or, super.setName if needed
setDisplayName("TNode");
}
//clone existing Node
public Node cloneNode() {
return new TNode();
}
public void destroy() {
fireNodeDestroyed();
}
// Create a property sheet:
protected Sheet createSheet() {
Sheet sheet = super.createSheet();
// Make sure there is a "Properties" set:
Sheet.Set props = sheet.get(Sheet.PROPERTIES);
if (props == null) {
props = Sheet.createPropertiesSet();
sheet.put(props);
}
tp = new TProperty("property", true);
props.put(tp);
return sheet;
}
// Method firing changes
public void fireMethod(String s, Object o1, Object o2) {
firePropertyChange(s,o1,o2);
}
}
// Property definition
public class TProperty extends PropertySupport {
private String myValue = "Value";
// Create new Property
public TProperty(String name, boolean isWriteable) {
super(name, String.class, name, "", true, isWriteable);
}
// get property value
public Object getValue() {
return myValue;
}
// set property value
public void setValue(Object value) throws IllegalArgumentException,IllegalAccessException, InvocationTargetException {
Object oldVal = myValue;
myValue = (String) value;
tn.fireMethod(getName(), oldVal, myValue);
}
public boolean supportsDefaultValue() {
return true;
}
private boolean defValue = false;
public boolean isDefaultValue() {
return defValue;
}
private boolean rdv = false;
public void restoreDefaultValue() {
defValue = true;
rdv = true;
System.err.println("RestoreDefaultValue");
try {
setValue("default");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
}
public void assertRestoreDefaultValueCalled() {
assertTrue("Restore default value not called", rdv);
rdv = false;
}
public void assertRestoreDefaultValueNotCalled() {
assertFalse("Restore default value not called", rdv);
}
}
private TNode tn;
private TProperty tp;
}