package org.freeplane.features.map;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.filter.condition.ASelectableCondition;
import org.freeplane.n3.nanoxml.XMLElement;
public class PeriodicLevelCondition extends ASelectableCondition {
public static final String NAME = "node_periodic_level_condition";
private final int period;
private final int remainder;
public PeriodicLevelCondition(int period, int remainder) {
super();
this.period = period;
this.remainder = remainder;
}
@Override
protected String getName() {
return NAME;
}
public boolean checkNode(NodeModel node) {
final int nodeLevel = node.getNodeLevel(true);
return nodeLevel > 0 && nodeLevel % period == remainder;
}
public static ASelectableCondition load(XMLElement element) {
int period = Integer.valueOf(element.getAttribute("PERIOD", null));
int remainder = Integer.valueOf(element.getAttribute("REMAINDER", null));
return new PeriodicLevelCondition(period, remainder);
}
@Override
protected void fillXML(XMLElement element) {
element.setAttribute("PERIOD", Integer.toString(period));
element.setAttribute("REMAINDER", Integer.toString(remainder));
}
@Override
protected String createDescription() {
return TextUtils.format("periodic_formula", period, remainder);
}
public static PeriodicLevelCondition[] createConditions(int n) {
PeriodicLevelCondition[] conditions = new PeriodicLevelCondition[n * (n + 1) / 2 - 1];
int k = 0;
for(int i = 2; i <= n; i++)
for(int j = 0; j < i; j++)
conditions[k++] = new PeriodicLevelCondition(i, j);
return conditions;
}
}