Index: openide/src/org/openide/nodes/AbstractNode.java =================================================================== RCS file: /cvs/openide/src/org/openide/nodes/AbstractNode.java,v retrieving revision 1.61 diff -u -r1.61 AbstractNode.java --- openide/src/org/openide/nodes/AbstractNode.java 26 Mar 2003 23:54:36 -0000 1.61 +++ openide/src/org/openide/nodes/AbstractNode.java 10 Apr 2003 08:24:02 -0000 @@ -446,7 +446,26 @@ return NO_NEW_TYPES; } - /** Gets preferred action. + private static final WeakHashMap overridesGetDefaultAction = new WeakHashMap (27); + /** Checks whether subclass overrides a method + */ + private boolean overridesAMethod (String name, Class[] arguments) { + // we are subclass of FilterNode + try { + java.lang.reflect.Method m = getClass ().getMethod (name, arguments); + + if (m.getDeclaringClass () != AbstractNode.class) { + // ok somebody overriden getCookie method + return true; + } + } catch (NoSuchMethodException ex) { + org.openide.ErrorManager.getDefault().notify(ex); + } + + return false; + } + + /** Gets preferred action. * By default, null. * @return preferred action * @see Node#getPreferredAction @@ -454,7 +473,20 @@ * @since 3.29 */ public Action getPreferredAction() { - return preferredAction; + boolean delegate = false; + + if (getClass () != AbstractNode.class) { + synchronized (overridesGetDefaultAction) { + Boolean b = (Boolean)overridesGetDefaultAction.get (getClass ()); + if (b == null) { + b = overridesAMethod ("getDefaultAction", new Class[0] ) ? Boolean.TRUE : Boolean.FALSE; // NOI18N + overridesGetDefaultAction.put (getClass (), b); + } + delegate = b.booleanValue(); + } + } + + return delegate ? getDefaultAction () : preferredAction; } /** Sets preferred action.