ItEr50S04ValidacionEProbasFuncionaisItEr49S04: Using TaskRow to wrap the tasks.
This avoids doing the troublesome relocates after adding.
This commit is contained in:
parent
c131b6e41b
commit
67f0487dfb
7 changed files with 70 additions and 103 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue