ItEr50S04ValidacionEProbasFuncionaisItEr49S04: Using TaskRow to wrap the tasks.

This avoids doing the troublesome relocates after adding.
This commit is contained in:
Óscar González Fernández 2010-03-09 19:52:47 +01:00
parent c131b6e41b
commit 67f0487dfb
7 changed files with 70 additions and 103 deletions

View file

@ -28,6 +28,7 @@ import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.zkoss.ganttz.adapters.IDisabilityConfiguration;
@ -168,7 +169,7 @@ public class TaskComponent extends Div implements AfterCompose {
.getDisabilityConfiguration());
}
result.isTopLevel = isTopLevel;
return result;
return TaskRow.wrapInRow(result);
}
public static TaskComponent asTaskComponent(Task task, TaskList taskList) {
@ -304,6 +305,15 @@ public class TaskComponent extends Div implements AfterCompose {
private IConstraintViolationListener<Date> taskViolationListener;
public TaskRow getRow() {
if (getParent() == null) {
throw new IllegalStateException(
"the TaskComponent should have been wraped by a "
+ TaskRow.class.getName());
}
return (TaskRow) getParent();
}
public Task getTask() {
return task;
}
@ -401,14 +411,12 @@ public class TaskComponent extends Div implements AfterCompose {
}
public TaskList getTaskList() {
return (TaskList) getParent();
return getRow().getTaskList();
}
@Override
public void setParent(Component parent) {
if (parent != null && !(parent instanceof TaskList)) {
throw new UiException("Unsupported parent for rows: " + parent);
}
Validate.isTrue(parent == null || parent instanceof TaskRow);
super.setParent(parent);
}
@ -503,7 +511,7 @@ public class TaskComponent extends Div implements AfterCompose {
}
protected void remove() {
this.detach();
this.getRow().detach();
task.removeReloadListener(reloadResourcesTextRequested);
}

View file

@ -31,7 +31,6 @@ import org.zkoss.ganttz.data.Position;
import org.zkoss.ganttz.data.Task;
import org.zkoss.ganttz.data.TaskContainer;
import org.zkoss.ganttz.data.TaskContainer.IExpandListener;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.ext.AfterCompose;
/**
@ -111,16 +110,16 @@ public class TaskContainerComponent extends TaskComponent implements
if (isExpanded()) {
TaskComponent previous = insertionPosition == 0 ? this
: subtaskComponents.get(insertionPosition - 1);
addAllAt(previous, taskComponents, true);
addAllAt(previous.getRow(), taskComponents, true);
}
}
private void addAllAt(Component previous, List<TaskComponent> toAdd,
private void addAllAt(TaskRow previous, List<TaskComponent> toAdd,
boolean recolate) {
for (TaskComponent subtaskComponent : toAdd) {
taskList.addTaskComponent(previous.getNextSibling(),
taskList.addTaskComponent((TaskRow) previous.getNextSibling(),
subtaskComponent, recolate);
previous = subtaskComponent;
previous = subtaskComponent.getRow();
}
}

View file

@ -42,7 +42,6 @@ import org.zkoss.ganttz.timetracker.zoom.ZoomLevel;
import org.zkoss.ganttz.util.MenuBuilder;
import org.zkoss.ganttz.util.MenuBuilder.ItemAction;
import org.zkoss.zk.au.out.AuInvoke;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.ext.AfterCompose;
@ -118,18 +117,13 @@ public class TaskList extends XulElement implements AfterCompose {
return asDependencyComponents(Arrays.asList(dependency)).get(0);
}
public synchronized void addTaskComponent(Component beforeThis,
public synchronized void addTaskComponent(TaskRow beforeThis,
final TaskComponent taskComponent, boolean relocate) {
final boolean isFirst = getFirstTopTaskComponent() == null
|| getFirstTopTaskComponent().equals(beforeThis);
insertBefore(taskComponent, beforeThis);
insertBefore(taskComponent.getRow(), beforeThis);
addContextMenu(taskComponent);
addListenerForTaskComponentEditForm(taskComponent);
taskComponent.afterCompose();
if (relocate) {
response(null, new AuInvoke(taskComponent,
isFirst ? "relocateFirstAfterAdding"
: "relocateAfterAdding"));
setHeight(getHeight());// forcing smart update
adjustZoomColumnsHeight();
getGanttPanel().getDependencyList().redrawDependencies();
@ -141,14 +135,6 @@ public class TaskList extends XulElement implements AfterCompose {
addTaskComponent(null, taskComponent, relocate);
}
private TaskComponent getFirstTopTaskComponent() {
List<TaskComponent> taskComponents = getTopLevelTaskComponents();
if (taskComponents.isEmpty()) {
return null;
}
return taskComponents.get(0);
}
public void addTasks(Position position, Collection<? extends Task> newTasks) {
if (position.isAppendToTop()) {
for (Task t : newTasks) {
@ -160,14 +146,14 @@ public class TaskList extends XulElement implements AfterCompose {
} else if (position.isAtTop()) {
final int insertionPosition = position.getInsertionPosition();
List<TaskComponent> topTaskComponents = getTopLevelTaskComponents();
Component beforeThis = insertionPosition < topTaskComponents.size() ? topTaskComponents
.get(insertionPosition)
TaskRow beforeThis = insertionPosition < topTaskComponents.size() ? topTaskComponents
.get(insertionPosition).getRow()
: null;
for (Task t : newTasks) {
TaskComponent toAdd = TaskComponent.asTaskComponent(t, this);
addTaskComponent(beforeThis, toAdd, true);
toAdd.publishTaskComponents(taskComponentByTask);
beforeThis = toAdd.getNextSibling();
beforeThis = (TaskRow) toAdd.getRow().getNextSibling();
}
} else {
Task mostRemoteAncestor = position.getMostRemoteAncestor();
@ -250,8 +236,9 @@ public class TaskList extends XulElement implements AfterCompose {
private List<TaskComponent> getTaskComponents() {
ArrayList<TaskComponent> result = new ArrayList<TaskComponent>();
for (Object child : getChildren()) {
if (child instanceof TaskComponent) {
result.add((TaskComponent) child);
if (child instanceof TaskRow) {
TaskRow row = (TaskRow) child;
result.add(row.getChild());
}
}
return result;
@ -333,8 +320,7 @@ public class TaskList extends XulElement implements AfterCompose {
}
public void hideTaskComponent(TaskComponent subtaskComponent) {
removeChild(subtaskComponent);
subtaskComponent.setParent(null);
removeChild(subtaskComponent.getRow());
}
public void redrawDependencies() {
@ -369,7 +355,8 @@ public class TaskList extends XulElement implements AfterCompose {
boolean relocate) {
for (Task task : tasks) {
if (visibleTasks.contains(task)) {
addPendingTasks(tasksPendingToAdd, find(task), relocate);
addPendingTasks(tasksPendingToAdd, rowFor(task),
relocate);
}
if (predicate.accepts(task)) {
@ -392,8 +379,13 @@ public class TaskList extends XulElement implements AfterCompose {
}
}
private TaskRow rowFor(Task task) {
TaskComponent taskComponent = find(task);
return taskComponent == null ? null : taskComponent.getRow();
}
private void addPendingTasks(List<Task> tasksPendingToAdd,
TaskComponent insertBefore, boolean relocate) {
TaskRow insertBefore, boolean relocate) {
if (tasksPendingToAdd.isEmpty()) {
return;
}

View file

@ -3,12 +3,10 @@
<c:set var="self" value="${requestScope.arg.self}"/>
<div id="row${self.uuid}" class="row" z.valor="boxid="${self.uuid}">
<div id="${self.uuid}" z.type="ganttz.task.Task" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="milestone"
movingTasksEnabled="${self.movingTasksEnabled}">
<div class="completion"></div>
<div class="completion2"></div>
<div class="milestone_end"></div>
</div>
<div id="${self.uuid}" z.type="ganttz.task.Task" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="milestone"
movingTasksEnabled="${self.movingTasksEnabled}">
<div class="completion"></div>
<div class="completion2"></div>
<div class="milestone_end"></div>
</div>

View file

@ -3,21 +3,17 @@
<c:set var="self" value="${requestScope.arg.self}"/>
<div class="row" z.valor="boxid="${self.uuid}">
<div id="${self.uuid}" z.type="ganttz.task.Task" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="box"
movingTasksEnabled="${self.movingTasksEnabled}"
resizingTasksEnabled="${self.resizingTasksEnabled}"
onMouseover="zkTasklist.showTooltip('tasktooltip${self.uuid}');"
onMouseOut="zkTasklist.hideTooltip('tasktooltip${self.uuid}');">
<div class="task-labels">${self.labelsText}</div>
<div class="task-resources">
<div class="task-resources-inner">${self.resourcesText}</div>
</div>
<div class="completion"></div>
<div class="completion2"></div>
<div id="tasktooltip${self.uuid}" class="task_tooltip">${self.tooltipText}</div>
</div>
<div id="deadline${self.uuid}" class="deadline"></div>
<div id="${self.uuid}" z.type="ganttz.task.Task" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="box"
movingTasksEnabled="${self.movingTasksEnabled}"
resizingTasksEnabled="${self.resizingTasksEnabled}"
onMouseover="zkTasklist.showTooltip('tasktooltip${self.uuid}');"
onMouseOut="zkTasklist.hideTooltip('tasktooltip${self.uuid}');">
<div class="task-labels">${self.labelsText}</div>
<div class="task-resources">
<div class="task-resources-inner">${self.resourcesText}</div>
</div>
<div class="completion"></div>
<div class="completion2"></div>
<div id="tasktooltip${self.uuid}" class="task_tooltip">${self.tooltipText}</div>
</div>

View file

@ -4,23 +4,21 @@
<c:set var="self" value="${requestScope.arg.self}"/>
<div id="row${self.uuid}" class="row" z.valor="boxid="${self.uuid}">
<div id="${self.uuid}" z.type="ganttz.taskcontainer.TaskContainer" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="taskgroup"
onMouseover="zkTasklist.showTooltip('tasktooltip${self.uuid}');"
onMouseOut="zkTasklist.hideTooltip('tasktooltip${self.uuid}');">
<div class="task-labels">${self.labelsText}</div>
<div class="task-resources">
<div class="task-resources-inner">${self.resourcesText}</div>
</div>
<div class="taskcontainer_completion">
<div class="completion"></div>
<div class="completion2"></div>
</div>
<div class="border-container">
<div class="taskgroup_start"></div>
<div class="taskgroup_end"></div>
</div>
<div id="tasktooltip${self.uuid}" class="task_tooltip">${self.tooltipText}</div>
<div id="${self.uuid}" z.type="ganttz.taskcontainer.TaskContainer" idTask="${self.id}"
z.autoz="true"${self.outerAttrs}" class="taskgroup"
onMouseover="zkTasklist.showTooltip('tasktooltip${self.uuid}');"
onMouseOut="zkTasklist.hideTooltip('tasktooltip${self.uuid}');">
<div class="task-labels">${self.labelsText}</div>
<div class="task-resources">
<div class="task-resources-inner">${self.resourcesText}</div>
</div>
<div class="taskcontainer_completion">
<div class="completion"></div>
<div class="completion2"></div>
</div>
<div class="border-container">
<div class="taskgroup_start"></div>
<div class="taskgroup_end"></div>
</div>
<div id="tasktooltip${self.uuid}" class="task_tooltip">${self.tooltipText}</div>
</div>

View file

@ -308,30 +308,6 @@ zkTask.getDD = function(cmp) {
return cmp.created_dd;
}
zkTask.relocateAfterAdding = function(cmp) {
var row = cmp.parentNode;
var taskList = row.parentNode.parentNode;
var nextTask = row.parentNode.nextSibling;
row.parentNode.removeChild(row);
taskList.insertBefore(row, nextTask);
}
/*
* relocateAfterAdding works for all but in the case that the task added would
* be the first one, so we create another method for that case
*/
zkTask.relocateFirstAfterAdding = function(cmp) {
var row = cmp.parentNode;
var taskList = row.parentNode.parentNode;
var nextTask = row.parentNode.previousSibling;
row.parentNode.removeChild(row);
taskList.insertBefore(row, nextTask);
}
zkTask.cleanup = function(cmp) {
var row = cmp.parentNode;
row.parentNode.removeChild(row);
}
zkTask.init = function(cmp) {
function addDragSupport() {
// Configure the drag&drop over the component