public ASelectableCondition loadCondition(final XMLElement element) {
   if (element.getName().equalsIgnoreCase(NodeLevelCompareCondition.NAME)) {
     return NodeLevelCompareCondition.load(element);
   }
   if (element.getName().equalsIgnoreCase(RootCondition.NAME)) {
     return RootCondition.load(element);
   }
   if (element.getName().equalsIgnoreCase(LeafCondition.NAME)) {
     return LeafCondition.load(element);
   }
   if (element.getName().equalsIgnoreCase(PeriodicLevelCondition.NAME)) {
     return PeriodicLevelCondition.load(element);
   }
   return null;
 }
/** @author Dimitry Polivaev 27.07.2010 */
class NodeLevelConditionController implements IElementaryConditionController {
  static final String FILTER_LEVEL = "filter_node_level";
  static final String FILTER_ROOT = "filter_root";
  static final String FILTER_LEAF = "filter_leaf";
  static final String FILTER_PERIODIC_LEVEL = "filter_periodic_level";
  private final ComboBoxEditor levelEditor = new NumberComboBoxEditor();
  private final ComboBoxModel values = new DefaultComboBoxModel();
  private final ComboBoxModel periodicValues =
      new DefaultComboBoxModel(PeriodicLevelCondition.createConditions(7));

  public boolean canEditValues(final Object selectedItem, final NamedObject simpleCond) {
    return !simpleCond.objectEquals(FILTER_PERIODIC_LEVEL);
  }

  public boolean canHandle(final Object selectedItem) {
    if (!(selectedItem instanceof NamedObject)) {
      return false;
    }
    final NamedObject namedObject = (NamedObject) selectedItem;
    if (namedObject.objectEquals(NodeLevelConditionController.FILTER_LEVEL)) return true;
    return false;
  }

  public boolean canSelectValues(final Object selectedItem, final NamedObject simpleCondition) {
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
      return true;
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
      return true;
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
      return true;
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
      return true;
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
      return true;
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
      return true;
    }
    if (simpleCondition.objectEquals(FILTER_PERIODIC_LEVEL)) {
      return true;
    }

    return false;
  }

  public ASelectableCondition createCondition(
      final Object selectedItem,
      final NamedObject simpleCond,
      final Object value,
      final boolean matchCase,
      final boolean matchApproximately) {
    if (value instanceof PeriodicLevelCondition) {
      return (ASelectableCondition) value;
    }
    return createASelectableCondition(simpleCond, (String) value, matchCase, matchApproximately);
  }

  protected ASelectableCondition createASelectableCondition(
      final NamedObject simpleCondition,
      final String value,
      final boolean matchCase,
      final boolean matchApproximately) {
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
      return new NodeLevelCompareCondition(value, matchCase, 0, true);
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
      return new NodeLevelCompareCondition(value, matchCase, 0, false);
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
      return new NodeLevelCompareCondition(value, matchCase, 1, true);
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
      return new NodeLevelCompareCondition(value, matchCase, -1, false);
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
      return new NodeLevelCompareCondition(value, matchCase, -1, true);
    }
    if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
      return new NodeLevelCompareCondition(value, matchCase, 1, false);
    }
    if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_ROOT))
      return new RootCondition();
    if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_LEAF))
      return new LeafCondition();
    return null;
  }

  public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
    return new DefaultComboBoxModel(
        new NamedObject[] {
          TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
          TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
          NamedObject.literal(ConditionFactory.FILTER_GT),
          NamedObject.literal(ConditionFactory.FILTER_GE),
          NamedObject.literal(ConditionFactory.FILTER_LE),
          NamedObject.literal(ConditionFactory.FILTER_LT),
          TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_ROOT),
          TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEAF),
          TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_PERIODIC_LEVEL),
        });
  }

  public ListModel getFilteredProperties() {
    final DefaultListModel list = new DefaultListModel();
    list.addElement(TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEVEL));
    return list;
  }

  public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
    if (selectedCondition.objectEquals(FILTER_PERIODIC_LEVEL)) {
      return new FixedBasicComboBoxEditor();
    }
    return levelEditor;
  }

  public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
    if (simpleCond.objectEquals(FILTER_PERIODIC_LEVEL)) {
      return periodicValues;
    }
    return values;
  }

  public boolean isCaseDependent(final Object selectedItem, final NamedObject simpleCond) {
    return false;
  }

  public boolean supportsApproximateMatching(
      final Object selectedItem, final NamedObject simpleCond) {
    return false;
  }

  public ASelectableCondition loadCondition(final XMLElement element) {
    if (element.getName().equalsIgnoreCase(NodeLevelCompareCondition.NAME)) {
      return NodeLevelCompareCondition.load(element);
    }
    if (element.getName().equalsIgnoreCase(RootCondition.NAME)) {
      return RootCondition.load(element);
    }
    if (element.getName().equalsIgnoreCase(LeafCondition.NAME)) {
      return LeafCondition.load(element);
    }
    if (element.getName().equalsIgnoreCase(PeriodicLevelCondition.NAME)) {
      return PeriodicLevelCondition.load(element);
    }
    return null;
  }

  public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
    return null;
  }
}