/**
  * Verifies if the element is an instance of a class with a given class name. If direct match
  * fails, implementing interfaces will be tested, then recursively all superclasses and their
  * interfaces.
  */
 private boolean verifyClass(Object element, String className) {
   Class eclass = element.getClass();
   Class clazz = eclass;
   boolean match = false;
   while (clazz != null) {
     // test the class itself
     if (clazz.getName().equals(className)) {
       match = true;
       break;
     }
     // test all the interfaces it implements
     Class[] interfaces = clazz.getInterfaces();
     for (int i = 0; i < interfaces.length; i++) {
       if (interfaces[i].getName().equals(className)) {
         match = true;
         break;
       }
     }
     if (match == true) {
       break;
     }
     // get the superclass
     clazz = clazz.getSuperclass();
   }
   return match;
 }
  /**
   * Check if the receiver is enabled for the given selection.
   *
   * @param selection
   * @return <code>true</code> if the given selection matches the conditions specified in <code>
   *     IConfirgurationElement</code>.
   */
  public boolean isEnabledForSelection(ISelection selection) {
    // Optimize it.
    if (mode == UNKNOWN) {
      return false;
    }

    // Handle undefined selections.
    if (selection == null) {
      selection = StructuredSelection.EMPTY;
    }

    // According to the dictionary, a selection is "one that
    // is selected", or "a collection of selected things".
    // In reflection of this, we deal with one or a collection.

    // special case: structured selections
    if (selection instanceof IStructuredSelection) {
      return isEnabledFor((IStructuredSelection) selection);
    }

    // special case: text selections
    // Code should read
    // if (selection instanceof ITextSelection) {
    // int count = ((ITextSelection) selection).getLength();
    // return isEnabledFor(selection, count);
    // }
    // use Java reflection to avoid dependence of org.eclipse.jface.text
    // which is in an optional part of the generic workbench
    Class tselClass = getTextSelectionClass();
    if (tselClass != null && tselClass.isInstance(selection)) {
      try {
        Method m = tselClass.getDeclaredMethod("getLength", new Class[0]); // $NON-NLS-1$
        Object r = m.invoke(selection, new Object[0]);
        if (r instanceof Integer) {
          return isEnabledFor(selection, ((Integer) r).intValue());
        }
        // should not happen - but enable if it does
        return true;
      } catch (NoSuchMethodException e) {
        // should not happen - fall through if it does
      } catch (IllegalAccessException e) {
        // should not happen - fall through if it does
      } catch (InvocationTargetException e) {
        // should not happen - fall through if it does
      }
    }

    // all other cases
    return isEnabledFor(selection);
  }