package com.vaadin.tests.components.splitpanel;
import com.vaadin.server.Sizeable;
import com.vaadin.tests.components.AbstractComponentContainerTest;
import com.vaadin.ui.AbstractSplitPanel;
import com.vaadin.ui.AbstractSplitPanel.SplitterClickEvent;
import com.vaadin.ui.AbstractSplitPanel.SplitterClickListener;
public abstract class AbstractSplitPanelTest<T extends AbstractSplitPanel>
extends AbstractComponentContainerTest<T>
implements SplitterClickListener {
private Command<T, Boolean> splitterClickListenerCommand = new Command<T, Boolean>() {
@Override
public void execute(T c, Boolean value, Object data) {
if (value) {
c.addSplitterClickListener(AbstractSplitPanelTest.this);
} else {
c.removeSplitterClickListener(AbstractSplitPanelTest.this);
}
}
};
private Command<T, SplitPosition> setSplitPositionCommand = new Command<T, AbstractSplitPanelTest.SplitPosition>() {
@Override
public void execute(T c, SplitPosition value, Object data) {
value.apply(c);
}
};
private Command<T, Boolean> splitterLockCommand = new Command<T, Boolean>() {
@Override
public void execute(T c, Boolean value, Object data) {
c.setLocked(value);
}
};
@Override
protected void createActions() {
super.createActions();
createSetSplitPositionAction(CATEGORY_FEATURES);
createSplitterClickListenerAction(CATEGORY_LISTENERS);
createSplitterLockAction(CATEGORY_FEATURES);
// Default to 100% x 100% as SplitPanel does not work as undefined
for (T c : getTestComponents()) {
c.setSizeFull();
}
}
private void createSplitterLockAction(String categoryFeatures) {
createBooleanAction("Splitter locked", categoryFeatures, false,
splitterLockCommand);
}
public static class SplitPosition {
private boolean reverse = false;
private int position;
private Unit unit;
private String posString;
public SplitPosition(String pos) {
this.posString = pos;
if (pos.startsWith("-")) {
reverse = true;
pos = pos.substring(1);
}
if (pos.endsWith("px")) {
position = Integer.parseInt(pos.substring(0, pos.length() - 2));
unit = Sizeable.Unit.PIXELS;
} else if (pos.endsWith("%")) {
position = Integer.parseInt(pos.substring(0, pos.length() - 1));
unit = Sizeable.Unit.PERCENTAGE;
} else {
throw new RuntimeException("Could not parse " + pos);
}
}
public void apply(AbstractSplitPanel sp) {
sp.setSplitPosition(position, unit, reverse);
}
@Override
public String toString() {
return posString;
}
}
private void createSetSplitPositionAction(String categoryFeatures) {
String subCategory = "Set splitter position";
createCategory(subCategory, categoryFeatures);
createClickAction("0px from left/top", subCategory,
setSplitPositionCommand, new SplitPosition("0px"));
createClickAction("200px from left/top", subCategory,
setSplitPositionCommand, new SplitPosition("200px"));
createClickAction("0px from right/bottom", subCategory,
setSplitPositionCommand, new SplitPosition("-0px"));
createClickAction("200px from right/bottom", subCategory,
setSplitPositionCommand, new SplitPosition("-200px"));
createClickAction("0% from left/top", subCategory,
setSplitPositionCommand, new SplitPosition("0%"));
createClickAction("0% from right/bottom", subCategory,
setSplitPositionCommand, new SplitPosition("-0%"));
createClickAction("50% from left/top", subCategory,
setSplitPositionCommand, new SplitPosition("50%"));
createClickAction("50% from right/bottom", subCategory,
setSplitPositionCommand, new SplitPosition("-50%"));
createClickAction("100% from left/top", subCategory,
setSplitPositionCommand, new SplitPosition("100%"));
createClickAction("100% from right/bottom", subCategory,
setSplitPositionCommand, new SplitPosition("-100%"));
}
private void createSplitterClickListenerAction(String category) {
createBooleanAction("SplitterClickListener", category, false,
splitterClickListenerCommand);
}
@Override
public void splitterClick(SplitterClickEvent event) {
log(event.getClass().getSimpleName() + ": " + event.getButtonName()
+ " at " + event.getRelativeX() + "," + event.getRelativeY());
}
}