diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java
index d527e3643..c48b9e2f7 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/OrderElementTreeController.java
@@ -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
@@ -244,6 +249,13 @@ public class OrderElementTreeController extends TreeController {
.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 hoursIntBoxByOrderElement = new HashMap();
@@ -251,6 +263,108 @@ public class OrderElementTreeController extends TreeController {
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 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 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 boxes = getBoxes(downTreerow);
+
+ if(boxes.get(position).isDisabled()) {
+ moveFocusTo(boxes.get(position), Navigation.RIGHT, downTreerow);
+ }
+ else {
+ boxes.get(position).focus();
+ }
+ }
+ }
+
+ private List 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 {
textBox.setDisabled(true);
}
addCell(cssClass, taskNumber, textBox);
+ registerKeyboardListener(textBox);
}
@Override
@@ -343,6 +458,7 @@ public class OrderElementTreeController extends TreeController {
}
addCell(textBoxCode);
+ registerKeyboardListener(textBoxCode);
}
void addInitDateCell(final OrderElement currentOrderElement) {
@@ -365,6 +481,7 @@ public class OrderElementTreeController extends TreeController {
dinamicDatebox.setDisabled(true);
}
addDateCell(dinamicDatebox, _("init"), currentOrderElement);
+ registerKeyboardListener(dinamicDatebox.getDateTextBox());
}
void addEndDateCell(final OrderElement currentOrderElement) {
@@ -386,6 +503,7 @@ public class OrderElementTreeController extends TreeController {
dinamicDatebox.setDisabled(true);
}
addDateCell(dinamicDatebox, _("end"), currentOrderElement);
+ registerKeyboardListener(dinamicDatebox.getDateTextBox());
}
void addHoursCell(final OrderElement currentOrderElement) {
@@ -395,6 +513,7 @@ public class OrderElementTreeController extends TreeController {
intboxHours.setDisabled(true);
}
addCell(intboxHours);
+ registerKeyboardListener(intboxHours);
}
private void addDateCell(final DynamicDatebox dinamicDatebox,
diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java
index 0d9b9bec1..0d16c7ef8 100644
--- a/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java
+++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/tree/TreeController.java
@@ -311,6 +311,10 @@ public abstract class TreeController> extends
private Treerow currentTreeRow;
+ public Treerow getCurrentTreeRow() {
+ return currentTreeRow;
+ }
+
public Renderer() {
}