ItEr55S04ValidacionEProbasFuncionaisItEr54S04: [Bug #413] Make Order Elements tree inside Order edition navigable using arrow keys.

This commit is contained in:
Jacobo Aragunde Pérez 2010-04-19 19:11:21 +02:00 committed by Javier Moran Rua
parent 54f8899868
commit f773efd75b
2 changed files with 123 additions and 0 deletions

View file

@ -23,6 +23,7 @@ package org.navalplanner.web.orders;
import static org.navalplanner.web.I18nHelper._;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -57,6 +58,7 @@ import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zul.Button;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Datebox;
@ -68,6 +70,9 @@ import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Treeitem;
import org.zkoss.zul.Vbox;
import org.zkoss.zul.api.Treecell;
import org.zkoss.zul.api.Treerow;
import org.zkoss.zul.impl.api.InputElement;
/**
* Controller for {@link OrderElement} tree view of {@link Order} entities <br />
@ -244,6 +249,13 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
.getFellow("templateFinderPopupAtTree");
}
private enum Navigation {
LEFT, UP, RIGHT, DOWN;
public static Navigation getIntentFrom(KeyEvent keyEvent) {
return values()[keyEvent.getKeyCode() - 37];
}
}
public class OrderElementTreeitemRenderer extends Renderer {
private Map<OrderElement, Intbox> hoursIntBoxByOrderElement = new HashMap<OrderElement, Intbox>();
@ -251,6 +263,108 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
public OrderElementTreeitemRenderer() {
}
private void registerKeyboardListener(final InputElement inputElement) {
inputElement.setCtrlKeys("#up#down#left#right");
inputElement.addEventListener("onCtrlKey", new EventListener() {
private Treerow treerow = getCurrentTreeRow();
@Override
public void onEvent(Event event) throws Exception {
Navigation navigation = Navigation.getIntentFrom((KeyEvent)event);
moveFocusTo(inputElement, navigation, treerow);
}
});
}
private void moveFocusTo(InputElement inputElement, Navigation navigation, Treerow treerow) {
List<InputElement> boxes = getBoxes(treerow);
int position = boxes.indexOf(inputElement);
switch (navigation) {
case UP:
focusGoUp(treerow, position);
break;
case DOWN:
focusGoDown(treerow, position);
break;
case LEFT:
if (position == 0) {
focusGoUp(treerow, boxes.size() - 1);
} else {
if(boxes.get(position - 1).isDisabled()) {
moveFocusTo(boxes.get(position - 1), Navigation.LEFT, treerow);
}
else {
boxes.get(position - 1).focus();
}
}
break;
case RIGHT:
if (position == boxes.size() - 1) {
focusGoDown(treerow, 0);
} else {
if(boxes.get(position + 1).isDisabled()) {
moveFocusTo(boxes.get(position + 1), Navigation.RIGHT, treerow);
}
else {
boxes.get(position + 1).focus();
}
}
break;
}
}
private void focusGoUp(Treerow treerow, int position) {
List treeItems = treerow.getParent().getParent().getChildren();
int myPosition = treeItems.indexOf(treerow.getParent());
if(myPosition > 0) {
Treerow upTreerow = (Treerow)
((Component)treeItems.get(myPosition - 1)).getChildren().get(0);
List<InputElement> boxes = getBoxes(upTreerow);
if(boxes.get(position).isDisabled()) {
moveFocusTo(boxes.get(position), Navigation.LEFT, upTreerow);
}
else {
boxes.get(position).focus();
}
}
}
private void focusGoDown(Treerow treerow, int position) {
List treeItems = treerow.getParent().getParent().getChildren();
int myPosition = treeItems.indexOf(treerow.getParent());
if(myPosition < treeItems.size() - 1) {
Treerow downTreerow = (Treerow)
((Component)treeItems.get(myPosition + 1)).getChildren().get(0);
List<InputElement> boxes = getBoxes(downTreerow);
if(boxes.get(position).isDisabled()) {
moveFocusTo(boxes.get(position), Navigation.RIGHT, downTreerow);
}
else {
boxes.get(position).focus();
}
}
}
private List<InputElement> getBoxes(Treerow row) {
InputElement codeBox = (InputElement)
((Treecell)row.getChildren().get(1)).getChildren().get(0);
InputElement nameBox = (InputElement)
((Treecell)row.getChildren().get(2)).getChildren().get(1);
InputElement hoursBox = (InputElement)
((Treecell)row.getChildren().get(3)).getChildren().get(0);
InputElement initDateBox = (InputElement)
((Hbox)((Treecell)row.getChildren().get(4)).getChildren().get(0)).getChildren().get(0);
InputElement endDateBox = (InputElement)
((Hbox)((Treecell)row.getChildren().get(5)).getChildren().get(0)).getChildren().get(0);
return Arrays.asList(codeBox, nameBox, hoursBox, initDateBox, endDateBox);
}
@Override
protected void addDescriptionCell(OrderElement element) {
addTaskNumberCell(element);
@ -295,6 +409,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
textBox.setDisabled(true);
}
addCell(cssClass, taskNumber, textBox);
registerKeyboardListener(textBox);
}
@Override
@ -343,6 +458,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
}
addCell(textBoxCode);
registerKeyboardListener(textBoxCode);
}
void addInitDateCell(final OrderElement currentOrderElement) {
@ -365,6 +481,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
dinamicDatebox.setDisabled(true);
}
addDateCell(dinamicDatebox, _("init"), currentOrderElement);
registerKeyboardListener(dinamicDatebox.getDateTextBox());
}
void addEndDateCell(final OrderElement currentOrderElement) {
@ -386,6 +503,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
dinamicDatebox.setDisabled(true);
}
addDateCell(dinamicDatebox, _("end"), currentOrderElement);
registerKeyboardListener(dinamicDatebox.getDateTextBox());
}
void addHoursCell(final OrderElement currentOrderElement) {
@ -395,6 +513,7 @@ public class OrderElementTreeController extends TreeController<OrderElement> {
intboxHours.setDisabled(true);
}
addCell(intboxHours);
registerKeyboardListener(intboxHours);
}
private void addDateCell(final DynamicDatebox dinamicDatebox,

View file

@ -311,6 +311,10 @@ public abstract class TreeController<T extends ITreeNode<T>> extends
private Treerow currentTreeRow;
public Treerow getCurrentTreeRow() {
return currentTreeRow;
}
public Renderer() {
}