blob: 2ef691d46f3eda727bc0e43119680fbe6ca66aa1 [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.netbeans.core.multiview;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.JComponent;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.netbeans.core.api.multiview.MultiViewHandler;
import org.netbeans.core.api.multiview.MultiViews;
import org.netbeans.core.spi.multiview.MultiViewDescription;
import org.netbeans.core.spi.multiview.MultiViewElement;
import org.netbeans.core.spi.multiview.MultiViewFactory;
import org.netbeans.junit.NbTestCase;
import org.openide.util.Lookup;
import org.openide.util.LookupEvent;
import org.openide.util.LookupListener;
import org.openide.util.Utilities;
import org.openide.util.lookup.Lookups;
import org.openide.windows.TopComponent;
/**
*
* @author Milos Kleint
*/
public class MultiViewActionMapTest extends NbTestCase {
public static Test suite() {
return GraphicsEnvironment.isHeadless() ? new TestSuite() : new TestSuite(MultiViewActionMapTest.class);
}
public MultiViewActionMapTest(String name) {
super (name);
}
protected boolean runInEQ () {
return true;
}
public void testElementIsTopComponent() throws Exception {
MVElemTopComponent elem1 = new MVElemTopComponent();
MVElemTopComponent elem2 = new MVElemTopComponent();
MVElemTopComponent elem3 = new MVElemTopComponent();
doTestActionMap(elem1, elem2, elem3);
}
public void testElementIsNotTC() throws Exception {
MVElem elem1 = new MVElem();
MVElem elem2 = new MVElem();
MVElem elem3 = new MVElem();
doTestActionMap(elem1, elem2, elem3);
}
private void doTestActionMap(MultiViewElement elem1, MultiViewElement elem2, MultiViewElement elem3) {
MultiViewDescription desc1 = new MVDesc("desc1", null, 0, elem1);
MultiViewDescription desc2 = new MVDesc("desc2", null, 0, elem2);
MultiViewDescription desc3 = new MVDesc("desc3", null, 0, elem3);
MultiViewDescription[] descs = new MultiViewDescription[] { desc1, desc2, desc3 };
TopComponent tc = MultiViewFactory.createMultiView(descs, desc1);
// WARNING: as anything else the first element's action map is set only after the tc is opened..
tc.open();
Action act = new TestAction("MultiViewAction");
// add action to the MVTC map
tc.getActionMap().put("testkey", act);
ActionMap obj = (ActionMap)tc.getLookup().lookup(ActionMap.class);
assertNotNull(obj);
assertEquals(obj.getClass(), MultiViewTopComponentLookup.LookupProxyActionMap.class);
Action res = (Action)obj.get("testkey");
assertNotNull(res);
assertEquals("MultiViewAction", res.getValue(Action.NAME));
// remove action from the MVTC map
tc.getActionMap().remove("testkey");
obj = (ActionMap)tc.getLookup().lookup(ActionMap.class);
res = (Action)obj.get("testkey");
assertNull(res);
// make sure the action in MVTC has higher priority..
JComponent elemtc = elem1.getVisualRepresentation();
Action innerAct = new TestAction("InnerAction");
elemtc.getActionMap().put("testkey", innerAct);
assertNotNull(elemtc.getActionMap().get("testkey"));
obj = (ActionMap)tc.getLookup().lookup(ActionMap.class);
// check if anything there in elemen'ts actionmap
assertNotNull(obj);
res = (Action)obj.get("testkey");
assertNotNull(res);
// put actin to the mvtc actionmap as well..
tc.getActionMap().put("testkey", act);
assertNotNull(obj);
res = (Action)obj.get("testkey");
assertNotNull(res);
assertEquals("MultiViewAction", res.getValue(Action.NAME));
//remove from mvtc's map..
tc.getActionMap().remove("testkey");
res = (Action)obj.get("testkey");
assertNotNull(res);
assertEquals("InnerAction", res.getValue(Action.NAME));
// now switch to the other element...
MultiViewHandler handler = MultiViews.findMultiViewHandler(tc);
// test related hack, easy establishing a connection from Desc->perspective
Accessor.DEFAULT.createPerspective(desc2);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc2));
obj = (ActionMap)tc.getLookup().lookup(ActionMap.class);
res = (Action)obj.get("testkey");
assertNull(res); // is not defined in element2
}
public void testActionMapChanges() throws Exception {
MVElemTopComponent elem1 = new MVElemTopComponent();
MVElemTopComponent elem2 = new MVElemTopComponent();
MVElem elem3 = new MVElem();
MultiViewDescription desc1 = new MVDesc("desc1", null, 0, elem1);
MultiViewDescription desc2 = new MVDesc("desc2", null, 0, elem2);
MultiViewDescription desc3 = new MVDesc("desc3", null, 0, elem3);
MultiViewDescription[] descs = new MultiViewDescription[] { desc1, desc2, desc3 };
TopComponent tc = MultiViewFactory.createMultiView(descs, desc1);
// WARNING: as anything else the first element's action map is set only after the tc is opened..
Lookup.Result result = tc.getLookup().lookup(new Lookup.Template(ActionMap.class));
LookListener list = new LookListener();
list.resetCount();
result.addLookupListener(list);
result.allItems();
tc.open();
assertEquals(1, list.getCount());
MultiViewHandler handler = MultiViews.findMultiViewHandler(tc);
// test related hack, easy establishing a connection from Desc->perspective
Accessor.DEFAULT.createPerspective(desc2);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc2));
assertEquals(2, list.getCount());
Accessor.DEFAULT.createPerspective(desc3);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc3));
assertEquals(3, list.getCount());
}
public void testSimplifiedActionMapChanges81117() {
MultiViewTopComponentLookup.InitialProxyLookup lookup = new MultiViewTopComponentLookup.InitialProxyLookup(new ActionMap());
Lookup.Result res = lookup.lookup(new Lookup.Template(ActionMap.class));
LookListener list = new LookListener();
list.resetCount();
res.addLookupListener(list);
assertEquals(1, res.allInstances().size());
assertEquals(0, list.getCount());
lookup.refreshLookup();
assertEquals(1, list.getCount());
assertEquals(1, res.allInstances().size());
MultiViewTopComponentLookup lookup2 = new MultiViewTopComponentLookup(new ActionMap());
res = lookup2.lookup(new Lookup.Template(ActionMap.class));
list = new LookListener();
list.resetCount();
res.addLookupListener(list);
assertEquals(1, res.allInstances().size());
assertEquals(0, list.getCount());
lookup2.setElementLookup(Lookups.fixed(new Object[] {new Object()} ));
assertEquals(1, list.getCount());
assertEquals(1, res.allInstances().size());
}
public void testActionMapChangesForElementsWithComponentShowingInit() throws Exception {
Action act1 = new TestAction("MultiViewAction1");
Action act2 = new TestAction("MultiViewAction2");
MVElemTopComponent elem1 = new ComponentShowingElement("testAction", act1);
MVElemTopComponent elem2 = new ComponentShowingElement("testAction", act2);
MVElem elem3 = new MVElem();
MultiViewDescription desc1 = new MVDesc("desc1", null, 0, elem1);
MultiViewDescription desc2 = new MVDesc("desc2", null, 0, elem2);
MultiViewDescription desc3 = new MVDesc("desc3", null, 0, elem3);
MultiViewDescription[] descs = new MultiViewDescription[] { desc1, desc2, desc3 };
TopComponent tc = MultiViewFactory.createMultiView(descs, desc1);
Lookup.Result result = tc.getLookup().lookup(new Lookup.Template(ActionMap.class));
LookListener2 list = new LookListener2();
result.addLookupListener(list);
result.allInstances().size();
list.setCorrectValues("testAction", act1);
// WARNING: as anything else the first element's action map is set only after the tc is opened..
tc.open();
assertEquals(1, list.getCount());
MultiViewHandler handler = MultiViews.findMultiViewHandler(tc);
// test related hack, easy establishing a connection from Desc->perspective
Accessor.DEFAULT.createPerspective(desc2);
list.setCorrectValues("testAction", act2);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc2));
assertEquals(2, list.getCount());
Accessor.DEFAULT.createPerspective(desc3);
list.setCorrectValues("testAction", null);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc3));
assertEquals(3, list.getCount());
}
public class ComponentShowingElement extends MVElemTopComponent {
private String key;
private Action action;
public ComponentShowingElement(String actionkey, Action value) {
action = value;
key = actionkey;
}
public void componentShowing() {
super.componentShowing();
getActionMap().put(key, action);
}
}
private class LookListener2 implements LookupListener {
private String key;
private Action action;
int count = 0;
private ActionMap lastMap;
public void setCorrectValues(String keyValue, Action actionValue) {
action = actionValue;
key = keyValue;
}
public int getCount() {
return count;
}
public void resultChanged (LookupEvent ev) {
Lookup.Result res = (Lookup.Result)ev.getSource();
assertEquals(1, res.allInstances().size());
ActionMap map = (ActionMap)res.allInstances().iterator().next();
if (lastMap != null) {
// because of CallbackSystemAction.GlobalManager
assertNotSame(map, lastMap);
}
lastMap = map;
Action act = map.get(key);
assertEquals(action, act);
count++;
}
}
// //
// // Set of tests for ActionMap and context.. copied from CallbackSystemActionTest
// //
//
// public void testLookupOfStateInActionMap () throws Exception {
//
// class MyAction extends javax.swing.AbstractAction
// implements org.openide.util.actions.ActionPerformer {
// int actionPerformed;
// int performAction;
//
// public void actionPerformed (java.awt.event.ActionEvent ev) {
// actionPerformed++;
// }
//
// public void performAction (SystemAction a) {
// performAction++;
// }
// }
// MyAction action = new MyAction ();
//
// ActionMap map = new ActionMap ();
// CallbackSystemAction system = (CallbackSystemAction)SystemAction.get(SurviveFocusChgCallbackAction.class);
// system.setActionPerformer (null);
// map.put (system.getActionMapKey(), action);
//
// javax.swing.Action clone;
// clone = system.createContextAwareInstance(org.openide.util.Lookup.EMPTY);
//
// assertTrue ("Action should not be enabled if no callback provided", !clone.isEnabled());
//
// system.setActionPerformer (action);
// assertTrue ("Is enabled, because it has a performer", clone.isEnabled());
// system.setActionPerformer (null);
// assertTrue ("Is disabled, because the performer has been unregistered", !clone.isEnabled ());
//
// //
// // test with actionmap
// //
// action.setEnabled (false);
//
// org.openide.util.Lookup context = org.openide.util.lookup.Lookups.singleton(map);
// clone = system.createContextAwareInstance(context);
//
// CntListener listener = new CntListener ();
// clone.addPropertyChangeListener (listener);
//
// assertTrue ("Not enabled now", !clone.isEnabled ());
// action.setEnabled (true);
// assertTrue ("Clone is enabled because the action in ActionMap is", clone.isEnabled ());
// listener.assertCnt ("One change expected", 1);
//
// system.setActionPerformer (action);
// clone.actionPerformed(new java.awt.event.ActionEvent (this, 0, ""));
// assertEquals ("MyAction.actionPerformed invoked", 1, action.actionPerformed);
// assertEquals ("MyAction.performAction is not invoked", 0, action.performAction);
//
//
// action.setEnabled (false);
// assertTrue ("Clone is disabled because the action in ActionMap is", !clone.isEnabled ());
// listener.assertCnt ("Another change expected", 1);
//
// clone.actionPerformed(new java.awt.event.ActionEvent (this, 0, ""));
// assertEquals ("MyAction.actionPerformed invoked again", 2, action.actionPerformed);
// assertEquals ("MyAction.performAction is not invoked, remains 0", 0, action.performAction);
//
// }
//
// private static final class CntListener extends Object
// implements java.beans.PropertyChangeListener {
// private int cnt;
//
// public void propertyChange(java.beans.PropertyChangeEvent evt) {
// cnt++;
// }
//
// public void assertCnt (String msg, int count) {
// assertEquals (msg, count, this.cnt);
// this.cnt = 0;
// }
// } // end of CntListener
public void testActionsGlobalContext() throws Exception {
Lookup look = Utilities.actionsGlobalContext();
MVElemTopComponent elem1 = new MVElemTopComponent();
MVElemTopComponent elem2 = new MVElemTopComponent();
MVElemTopComponent elem3 = new MVElemTopComponent();
MultiViewDescription desc1 = new MVDesc("desc1", null, 0, elem1);
MultiViewDescription desc2 = new MVDesc("desc2", null, 0, elem2);
MultiViewDescription desc3 = new MVDesc("desc3", null, 0, elem3);
MultiViewDescription[] descs = new MultiViewDescription[] { desc1, desc2, desc3 };
TopComponent tc = MultiViewFactory.createMultiView(descs, desc1);
// WARNING: as anything else the first element's action map is set only after the tc is opened..
tc.open();
tc.requestActive();
ActionMap map = (ActionMap)look.lookup(ActionMap.class);
assertNotNull("is null", map);
assertEquals("is wrong class=" + map.getClass(), map.getClass(), MultiViewTopComponentLookup.LookupProxyActionMap.class);
Action res = map.get("testkey");
assertNull(res);
Action act = new TestAction("MultiViewAction");
// add action to the MVTC map
elem1.getVisualRepresentation().getActionMap().put("testkey", act);
res = map.get("testkey");
assertNotNull(res);
// test switching to a different component..
TopComponent tc2 = new TopComponent();
tc2.open();
tc2.requestActive();
map = (ActionMap)look.lookup(ActionMap.class);
res = map.get("testkey");
assertNull(res);
// switch back and test a different element..
tc.requestActive();
map = (ActionMap)look.lookup(ActionMap.class);
MultiViewHandler handler = MultiViews.findMultiViewHandler(tc);
// test related hack, easy establishing a connection from Desc->perspective
Accessor.DEFAULT.createPerspective(desc2);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc2));
res = map.get("testkey");
assertNull(res);
// now switch back to the original element and see if the action is stil there..
Accessor.DEFAULT.createPerspective(desc1);
handler.requestVisible(Accessor.DEFAULT.createPerspective(desc1));
res = map.get("testkey");
assertNotNull(res);
}
static class TestAction extends AbstractAction {
public TestAction(String name) {
super(name);
}
public void actionPerformed(ActionEvent event) {
}
}
private class LookListener implements LookupListener {
int count = 0;
public void resetCount() {
count = 0;
}
public int getCount() {
return count;
}
public void resultChanged (LookupEvent ev) {
count++;
}
}
}