diff options
Diffstat (limited to 'js/dojo-1.7.2/dojox/gantt/GanttTaskItem.js')
| -rw-r--r-- | js/dojo-1.7.2/dojox/gantt/GanttTaskItem.js | 1363 |
1 files changed, 1363 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/gantt/GanttTaskItem.js b/js/dojo-1.7.2/dojox/gantt/GanttTaskItem.js new file mode 100644 index 0000000..d123d1c --- /dev/null +++ b/js/dojo-1.7.2/dojox/gantt/GanttTaskItem.js @@ -0,0 +1,1363 @@ +//>>built +// wrapped by build app +define("dojox/gantt/GanttTaskItem", ["dijit","dojo","dojox","dojo/require!dojo/date/locale,dijit/focus"], function(dijit,dojo,dojox){ +dojo.provide("dojox.gantt.GanttTaskItem"); + +dojo.require("dojo.date.locale"); +dojo.require("dijit.focus"); // dijit.focus() + +dojo.declare("dojox.gantt.GanttTaskControl", null, { + constructor: function(taskInfo, project, chart){ + this.ganttChart = chart; + this.project = project; + this.taskItem = taskInfo; + //control variables + this.checkMove = false; + this.checkResize = false; + this.moveChild = false; + this.maxPosXMove = -1; + this.minPosXMove = -1; + this.maxWidthResize = -1; + this.minWidthResize = -1; + this.posX = 0; + this.posY = 0; + this.mouseX = 0; + this.taskItemWidth = 0; + this.isHide = false; + this.hideTasksHeight = 0; + this.isExpanded = true; + this.descrTask = null; + this.cTaskItem = null; + this.cTaskNameItem = null; + this.parentTask = null; + this.predTask = null; + this.childTask = []; + this.childPredTask = []; + this.nextChildTask = null; + this.previousChildTask = null; + this.nextParentTask = null; + this.previousParentTask = null; + }, + createConnectingLinesPN: function(){ + var arrConnectingLinesNames = []; + var lineVerticalLeft = dojo.create("div", { + innerHTML: " ", + className: "ganttTaskLineVerticalLeft" + }, this.ganttChart.panelNames.firstChild); + var cTaskName = this.cTaskNameItem[0], pcTaskName = this.parentTask.cTaskNameItem[0]; + dojo.style(lineVerticalLeft, { + height: (cTaskName.offsetTop - pcTaskName.offsetTop) + "px", + top: (pcTaskName.offsetTop + 5) + "px", + left: (pcTaskName.offsetLeft - 9) + "px" + }); + var LineHorizontalLeft = dojo.create("div", { + noShade: true, + color: "#000000", + className: "ganttTaskLineHorizontalLeft" + }, this.ganttChart.panelNames.firstChild); + dojo.style(LineHorizontalLeft, { + left: (pcTaskName.offsetLeft - 9) + "px", + top: (cTaskName.offsetTop + 5) + "px", + height: "1px", + width: (cTaskName.offsetLeft - pcTaskName.offsetLeft + 4) + "px" + }); + arrConnectingLinesNames.push(lineVerticalLeft); + arrConnectingLinesNames.push(LineHorizontalLeft); + return arrConnectingLinesNames; + }, + createConnectingLinesDS: function(){ + var contentData = this.ganttChart.contentData.firstChild; + var arrLines = []; + var arrowImg = new Image(); + var arrowImg = dojo.create("div", { + className: "ganttImageArrow" + }); + //vertical line + var lineVerticalRight = document.createElement("div"); + //horizontal line + var lineHorizontal = document.createElement("div"); + var posXPreviousTask = dojo.style(this.predTask.cTaskItem[0], "left"); + var posYPreviousTask = dojo.style(this.predTask.cTaskItem[0], "top"); + var posXChildTask = dojo.style(this.cTaskItem[0], "left"); + var posYChildTask = this.posY + 2; + //width task item + var widthChildTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width); + var widthPreviousTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width); + if(posYPreviousTask < posYChildTask){ + dojo.addClass(lineVerticalRight, "ganttTaskLineVerticalRight"); + dojo.style(lineVerticalRight, { + height: (posYChildTask - this.ganttChart.heightTaskItem / 2 - posYPreviousTask - 3) + "px", + width: "1px", + left: (posXPreviousTask + widthPreviousTask - 20) + "px", + top: (posYPreviousTask + this.ganttChart.heightTaskItem) + "px" + }); + dojo.addClass(lineHorizontal, "ganttTaskLineHorizontal"); + dojo.style(lineHorizontal, { + width: (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px", + left: (posXPreviousTask + widthPreviousTask - 20) + "px", + top: (posYChildTask + 2) + "px" + }); + dojo.addClass(arrowImg, "ganttTaskArrowImg"); + dojo.style(arrowImg, { + left: (posXChildTask - 7) + "px", + top: (posYChildTask - 1) + "px" + }); + }else{ + dojo.addClass(lineVerticalRight, "ganttTaskLineVerticalRightPlus"); + dojo.style(lineVerticalRight, { + height: (posYPreviousTask + 2 - posYChildTask) + "px", + width: "1px", + left: (posXPreviousTask + widthPreviousTask - 20) + "px", + top: (posYChildTask + 2) + "px" + }); + dojo.addClass(lineHorizontal, "ganttTaskLineHorizontalPlus"); + dojo.style(lineHorizontal, { + width: (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px", + left: (posXPreviousTask + widthPreviousTask - 20) + "px", + top: (posYChildTask + 2) + "px" + }); + dojo.addClass(arrowImg, "ganttTaskArrowImgPlus"); + dojo.style(arrowImg, { + left: (posXChildTask - 7) + "px", + top: (posYChildTask - 1) + "px" + }); + } + contentData.appendChild(lineVerticalRight); + contentData.appendChild(lineHorizontal); + contentData.appendChild(arrowImg); + arrLines.push(lineVerticalRight); + arrLines.push(arrowImg); + arrLines.push(lineHorizontal); + return arrLines; + }, + showChildTasks: function(task, isOpen){ + if(isOpen){ + for(var i = 0; i < task.childTask.length; i++){ + var cTask = task.childTask[i], + cTaskItem0 = cTask.cTaskItem[0], cTaskName0 = cTask.cTaskNameItem[0], + cTaskItem1 = cTask.cTaskItem[1], cTaskName1 = cTask.cTaskNameItem[1], + cTaskItem2 = cTask.cTaskItem[2], cTaskName2 = cTask.cTaskNameItem[2]; + if(cTaskItem0.style.display == "none"){ + cTaskItem0.style.display = "inline"; + cTaskName0.style.display = "inline"; + cTask.showDescTask(); + task.isHide = false; + if(cTaskName2){ + cTaskName2.style.display = "inline"; + isOpen = cTask.isExpanded; + } + for(var k = 0; k < cTaskItem1.length; k++){ + cTaskItem1[k].style.display = "inline"; + } + for(var k = 0; k < cTaskName1.length; k++){ + cTaskName1[k].style.display = "inline"; + } + (cTask.taskIdentifier) && (cTask.taskIdentifier.style.display = "inline"); + this.hideTasksHeight += this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra; + if(cTask.childTask.length > 0){ + this.showChildTasks(cTask, isOpen); + } + } + } + } + }, + hideChildTasks: function(task){ + for(var i = 0; i < task.childTask.length; i++){ + var cTask = task.childTask[i], + cTaskItem0 = cTask.cTaskItem[0], cTaskName0 = cTask.cTaskNameItem[0], + cTaskItem1 = cTask.cTaskItem[1], cTaskName1 = cTask.cTaskNameItem[1], + cTaskItem2 = cTask.cTaskItem[2], cTaskName2 = cTask.cTaskNameItem[2]; + if(cTaskItem0.style.display != "none"){ + cTaskItem0.style.display = "none"; + cTaskName0.style.display = "none"; + cTask.hideDescTask(); + task.isHide = true; + if(cTaskName2){ + cTaskName2.style.display = "none"; + } + for(var k = 0; k < cTaskItem1.length; k++){ + cTaskItem1[k].style.display = "none"; + } + for(var k = 0; k < cTaskName1.length; k++){ + cTaskName1[k].style.display = "none"; + } + (cTask.taskIdentifier) && (cTask.taskIdentifier.style.display = "none"); + this.hideTasksHeight += (this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra); + if(cTask.childTask.length > 0){ + this.hideChildTasks(cTask); + } + } + } + }, + shiftCurrentTasks: function(task, height){ + this.shiftNextTask(this, height); + task.project.shiftNextProject(task.project, height); + }, + shiftTask: function(task, height){ + task.posY = task.posY + height; + var taskItem0 = task.cTaskItem[0], taskName0 = task.cTaskNameItem[0], + taskItem1 = task.cTaskItem[1], taskName1 = task.cTaskNameItem[1], + taskItem2 = task.cTaskItem[2], taskName2 = task.cTaskNameItem[2]; + taskName0.style.top = parseInt(taskName0.style.top) + height + "px"; + if(taskName2){ + taskName2.style.top = parseInt(taskName2.style.top) + height + "px"; + } + if(task.parentTask){ + if(parseInt(this.cTaskNameItem[0].style.top) > parseInt(task.parentTask.cTaskNameItem[0].style.top) && + (taskName1[0].style.display != "none")){ + taskName1[0].style.height = parseInt(taskName1[0].style.height) + height + "px"; + }else{ + taskName1[0].style.top = parseInt(taskName1[0].style.top) + height + "px"; + } + taskName1[1].style.top = parseInt(taskName1[1].style.top) + height + "px"; + } + taskItem0.style.top = parseInt(taskItem0.style.top) + height + "px"; + task.descrTask.style.top = parseInt(task.descrTask.style.top) + height + "px"; + if(task.predTask){ + if(((parseInt(this.cTaskItem[0].style.top) > parseInt(task.predTask.cTaskItem[0].style.top)) || + (this.cTaskItem[0].id == task.predTask.taskItem.id)) && + taskItem1[0].style.display != "none"){ + taskItem1[0].style.height = parseInt(taskItem1[0].style.height) + height + "px"; + }else{ + taskItem1[0].style.top = parseInt(taskItem1[0].style.top) + height + "px"; + } + taskItem1[1].style.top = parseInt(taskItem1[1].style.top) + height + "px"; + taskItem1[2].style.top = parseInt(taskItem1[2].style.top) + height + "px"; + } + }, + shiftNextTask: function(task, height){ + if(task.nextChildTask){ + this.shiftTask(task.nextChildTask, height); + this.shiftChildTask(task.nextChildTask, height); + this.shiftNextTask(task.nextChildTask, height); + }else if(task.parentTask){ + this.shiftNextTask(task.parentTask, height); + }else if(task.nextParentTask){ + this.shiftTask(task.nextParentTask, height); + this.shiftChildTask(task.nextParentTask, height); + this.shiftNextTask(task.nextParentTask, height); + } + }, + shiftChildTask: function(task, height){ + dojo.forEach(task.childTask, function(cTask){ + this.shiftTask(cTask, height); + if(cTask.childTask.length > 0){ + this.shiftChildTask(cTask, height); + } + }, this); + }, + endMove: function(){ + var cTask0 = this.cTaskItem[0]; + var width = dojo.style(cTask0, "left") - this.posX; + var startTime = this.getDateOnPosition(dojo.style(cTask0, "left")); + startTime = this.checkPos(startTime); + if(this.checkMove){ + width = this.ganttChart.getPosOnDate(startTime) - this.posX; + this.moveCurrentTaskItem(width, this.moveChild); + this.project.shiftProjectItem(); + } + this.checkMove = false; + this.posX = 0; + this.maxPosXMove = -1; + this.minPosXMove = -1; + cTask0.childNodes[1].firstChild.rows[0].cells[0].innerHTML = ""; + this.adjustPanelTime(); + if(this.ganttChart.resource){ + this.ganttChart.resource.refresh(); + } + }, + checkPos: function(startTime){ + var cTask0 = this.cTaskItem[0]; + var h = startTime.getHours(); + if(h >= 12){ + startTime.setDate(startTime.getDate() + 1); + startTime.setHours(0); + if((parseInt(cTask0.firstChild.firstChild.width) + this.ganttChart.getPosOnDate(startTime) > this.maxPosXMove) && (this.maxPosXMove != -1)){ + startTime.setDate(startTime.getDate() - 1); + startTime.setHours(0); + } + }else if((h < 12) && (h != 0)){ + startTime.setHours(0); + if((this.ganttChart.getPosOnDate(startTime) < this.minPosXMove)){ + startTime.setDate(startTime.getDate() + 1); + } + } + cTask0.style.left = this.ganttChart.getPosOnDate(startTime) + "px"; + return startTime; + }, + getMaxPosPredChildTaskItem: function(){ + var posPredChildTaskItem = 0; + var nextPosPredChildTaskItem = 0; + for(var i = 0; i < this.childPredTask.length; i++){ + nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(this.childPredTask[i]); + if(nextPosPredChildTaskItem > posPredChildTaskItem){ + posPredChildTaskItem = nextPosPredChildTaskItem; + } + } + return posPredChildTaskItem; + }, + getMaxPosPredChildTaskItemInTree: function(task){ + var cTask0 = task.cTaskItem[0]; + var currentPos = parseInt(cTask0.firstChild.firstChild.width) + dojo.style(cTask0, "left"); + var posPredChildTaskItem = 0; + var nextPosPredChildTaskItem = 0; + dojo.forEach(task.childPredTask, function(cpTask){ + nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(cpTask); + if(nextPosPredChildTaskItem > posPredChildTaskItem){ + posPredChildTaskItem = nextPosPredChildTaskItem; + } + }, this); + return posPredChildTaskItem > currentPos ? posPredChildTaskItem : currentPos; + }, + moveCurrentTaskItem: function(width, moveChild){ + var taskItem = this.cTaskItem[0]; + this.taskItem.startTime = new Date(this.ganttChart.startDate); + this.taskItem.startTime.setHours(this.taskItem.startTime.getHours() + (parseInt(taskItem.style.left) / this.ganttChart.pixelsPerHour)); + this.showDescTask(); + var cTask1 = this.cTaskItem[1]; + if(cTask1.length > 0){ + cTask1[2].style.width = parseInt(cTask1[2].style.width) + width + "px"; + cTask1[1].style.left = parseInt(cTask1[1].style.left) + width + "px"; + } + dojo.forEach(this.childTask, function(cTask){ + if(!cTask.predTask){ + this.moveChildTaskItems(cTask, width, moveChild); + } + }, this); + dojo.forEach(this.childPredTask, function(cpTask){ + this.moveChildTaskItems(cpTask, width, moveChild); + }, this); + }, + moveChildTaskItems: function(task, width, moveChild){ + var taskItem = task.cTaskItem[0]; + if(moveChild){ + taskItem.style.left = parseInt(taskItem.style.left) + width + "px"; + task.adjustPanelTime(); + task.taskItem.startTime = new Date(this.ganttChart.startDate); + task.taskItem.startTime.setHours(task.taskItem.startTime.getHours() + (parseInt(taskItem.style.left) / this.ganttChart.pixelsPerHour)); + var ctItem = task.cTaskItem[1]; + dojo.forEach(ctItem, function(item){ + item.style.left = parseInt(item.style.left) + width + "px"; + }, this); + dojo.forEach(task.childTask, function(cTask){ + if(!cTask.predTask){ + this.moveChildTaskItems(cTask, width, moveChild); + } + }, this); + dojo.forEach(task.childPredTask, function(cpTask){ + this.moveChildTaskItems(cpTask, width, moveChild); + }, this); + }else{ + var ctItem = task.cTaskItem[1]; + if(ctItem.length > 0){ + var item0 = ctItem[0], item2 = ctItem[2]; + item2.style.left = parseInt(item2.style.left) + width + "px"; + item2.style.width = parseInt(item2.style.width) - width + "px"; + item0.style.left = parseInt(item0.style.left) + width + "px"; + } + } + task.moveDescTask(); + }, + adjustPanelTime: function(){ + var taskItem = this.cTaskItem[0]; + var width = parseInt(taskItem.style.left) + parseInt(taskItem.firstChild.firstChild.width) + this.ganttChart.panelTimeExpandDelta; + width += this.descrTask.offsetWidth; + this.ganttChart.adjustPanelTime(width); + }, + getDateOnPosition: function(position){ + var date = new Date(this.ganttChart.startDate); + date.setHours(date.getHours() + (position / this.ganttChart.pixelsPerHour)); + return date; + }, + moveItem: function(event){ + var pageX = event.screenX; + var posTaskItem = (this.posX + (pageX - this.mouseX)); + var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width); + var posTaskItemR = posTaskItem + widthTaskItem; + if(this.checkMove){ + if(((this.minPosXMove <= posTaskItem)) && + ((posTaskItemR <= this.maxPosXMove) || (this.maxPosXMove == -1))){ + this.moveTaskItem(posTaskItem); + } + } + }, + moveTaskItem: function(posX){ + var cTask = this.cTaskItem[0]; + cTask.style.left = posX + "px"; + cTask.childNodes[1].firstChild.rows[0].cells[0].innerHTML = this.getDateOnPosition(posX).getDate() + '.' + (this.getDateOnPosition(posX).getMonth() + 1) + '.' + this.getDateOnPosition(posX).getUTCFullYear(); + }, + resizeItem: function(event){ + if(this.checkResize){ + var taskItem = this.cTaskItem[0]; + var mouseX = event.screenX; + var width = (mouseX - this.mouseX); + var widthTaskItem = this.taskItemWidth + (mouseX - this.mouseX); + if(widthTaskItem >= this.taskItemWidth){ + if((widthTaskItem <= this.maxWidthResize) || (this.maxWidthResize == -1)){ + this.resizeTaskItem(widthTaskItem); + }else if((this.maxWidthResize != -1) && (widthTaskItem > this.maxWidthResize)){ + this.resizeTaskItem(this.maxWidthResize); + } + }else if(widthTaskItem <= this.taskItemWidth){ + if(widthTaskItem >= this.minWidthResize){ + this.resizeTaskItem(widthTaskItem); + }else if(widthTaskItem < this.minWidthResize){ + this.resizeTaskItem(this.minWidthResize); + } + } + } + }, + resizeTaskItem: function(width){ + var taskItem = this.cTaskItem[0]; + var countHours = Math.round(width / this.ganttChart.pixelsPerWorkHour); + var trow = taskItem.childNodes[0].firstChild.rows[0], + rc0 = trow.cells[0], rc1 = trow.cells[1]; + rc0 && (rc0.firstChild.style.width = parseInt(rc0.width) * width / 100 + "px"); + rc1 && (rc1.firstChild.style.width = parseInt(rc1.width) * width / 100 + "px"); + taskItem.childNodes[0].firstChild.width = width + "px"; + taskItem.childNodes[1].firstChild.width = width + "px"; + //resize info + this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = countHours; + var tcNode2 = taskItem.childNodes[2]; + tcNode2.childNodes[0].style.width = width + "px"; + tcNode2.childNodes[1].style.left = width - 10 + "px"; + }, + endResizeItem: function(){ + var taskItem = this.cTaskItem[0]; + if((this.taskItemWidth != parseInt(taskItem.childNodes[0].firstChild.width))){ + var posXL = taskItem.offsetLeft; + var posXR = taskItem.offsetLeft + parseInt(taskItem.childNodes[0].firstChild.width); + var countHours = Math.round((posXR - posXL) / this.ganttChart.pixelsPerWorkHour); + this.taskItem.duration = countHours; + if(this.childPredTask.length > 0){ + for(var j = 0; j < this.childPredTask.length; j++){ + var cpctItem = this.childPredTask[j].cTaskItem[1], + item0 = cpctItem[0], item2 = cpctItem[2], tcNode0 = taskItem.childNodes[0]; + item2.style.width = parseInt(item2.style.width) - (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px"; + item2.style.left = parseInt(item2.style.left) + (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px"; + item0.style.left = parseInt(item0.style.left) + (parseInt(tcNode0.firstChild.width) - this.taskItemWidth) + "px"; + } + } + } + this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = ""; + this.checkResize = false; + this.taskItemWidth = 0; + this.mouseX = 0; + this.showDescTask(); + this.project.shiftProjectItem(); + this.adjustPanelTime(); + if(this.ganttChart.resource){ + this.ganttChart.resource.refresh(); + } + }, + startMove: function(event){ + this.moveChild = event.ctrlKey; + this.mouseX = event.screenX; + this.getMoveInfo(); + this.checkMove = true; + this.hideDescTask(); + }, + showDescTask: function(){ + var posX = (parseInt(this.cTaskItem[0].style.left) + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10); + this.descrTask.style.left = posX + "px"; + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + this.descrTask.style.visibility = 'visible'; + }, + hideDescTask: function(){ + dojo.style(this.descrTask, "visibility", "hidden"); + }, + buildResourceInfo: function(resourceInfo){ + if(this.childTask && this.childTask.length > 0){ + for(var i = 0; i < this.childTask.length; i++){ + var cTask = this.childTask[i]; + cTask.buildResourceInfo(resourceInfo); + } + } + if(dojo.trim(this.taskItem.taskOwner).length > 0){ + var owners = this.taskItem.taskOwner.split(";"); + for(var i = 0; i < owners.length; i++){ + var o = owners[i]; + if(dojo.trim(o).length <= 0){ + continue; + } + resourceInfo[o] ? (resourceInfo[o].push(this)) : (resourceInfo[o] = [this]); + } + } + }, + objKeyToStr: function(obj, delm){ + var returnStr = ""; + delm = delm || " "; + if(obj){ + for(var key in obj){ + returnStr += delm + key; + } + } + return returnStr; + }, + getTaskOwner: function(){ + var tOwner = {}; + if(dojo.trim(this.taskItem.taskOwner).length > 0){ + var owners = this.taskItem.taskOwner.split(";"); + for(var i = 0; i < owners.length; i++){ + var o = owners[i]; + tOwner[o] = 1; + } + } + dojo.forEach(this.childTask, function(ctask){ + dojo.mixin(tOwner, ctask.getTaskOwner()); + }, this); + return tOwner; + }, + moveDescTask: function(){ + var posX = (parseInt(this.cTaskItem[0].style.left) + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10); + this.descrTask.style.left = posX + "px"; + }, + getMoveInfo: function(){ + this.posX = parseInt(this.cTaskItem[0].style.left); + var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width); + var posParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left); + var posPredTaskItem = !this.predTask ? 0 : parseInt(this.predTask.cTaskItem[0].style.left) + parseInt(this.predTask.cTaskItem[0].childNodes[0].firstChild.width); + var widthParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width); + + var childPredPosX = 0; + var childParentPosX = 0; + var childParentPosXR = 0; + if(this.childPredTask.length > 0){ + var posChildTaskItem = null; + dojo.forEach(this.childPredTask, function(cpTask){ + if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem > parseInt(cpTask.cTaskItem[0].style.left)))){ + posChildTaskItem = parseInt(cpTask.cTaskItem[0].style.left); + } + }, this); + childPredPosX = posChildTaskItem; + } + if(this.childTask.length > 0){ + var posChildTaskItemR = null; + dojo.forEach(this.childTask, function(cTask){ + if((!posChildTaskItemR) || ((posChildTaskItemR) && (posChildTaskItemR > (parseInt(cTask.cTaskItem[0].style.left))))){ + posChildTaskItemR = parseInt(cTask.cTaskItem[0].style.left); + } + }, this); + childParentPosXR = posChildTaskItemR; + var posChildTaskItem = null; + dojo.forEach(this.childTask, function(cTask){ + if((!posChildTaskItem) || ((posChildTaskItem) + && (posChildTaskItem < (parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width))))){ + posChildTaskItem = parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width); + } + }, this); + childParentPosX = posChildTaskItem; + } + if(!this.moveChild){ + if(this.childPredTask.length > 0){ + if(this.maxPosXMove < childPredPosX) this.maxPosXMove = childPredPosX; + } + if(this.childTask.length > 0){ + if((this.childPredTask.length > 0) && (this.maxPosXMove - widthTaskItem) > childParentPosXR){ + this.maxPosXMove = this.maxPosXMove - ((this.maxPosXMove - widthTaskItem) - childParentPosXR); + } + if(!(this.childPredTask.length > 0)){ + this.maxPosXMove = childParentPosXR + widthTaskItem; + } + this.minPosXMove = (childParentPosX - widthTaskItem); + } + if(posParentTaskItem > 0){ + if((!(this.childPredTask.length > 0)) && (this.childTask.length > 0)){ + if(this.maxPosXMove > posParentTaskItem + widthParentTaskItem){ + this.maxPosXMove = posParentTaskItem + widthParentTaskItem; + } + } + if(this.minPosXMove <= posParentTaskItem){ + this.minPosXMove = posParentTaskItem; + } + if((!(this.childTask.length > 0)) && (!(this.childPredTask.length > 0))){ + this.maxPosXMove = posParentTaskItem + widthParentTaskItem; + }else if((!(this.childTask.length > 0)) && (this.childPredTask.length > 0)){ + if((posParentTaskItem + widthParentTaskItem) > posPredTaskItem){ + this.maxPosXMove = childPredPosX; + } + } + } + if(posPredTaskItem > 0){ + if(this.minPosXMove <= posPredTaskItem){ + this.minPosXMove = posPredTaskItem; + } + } + if((posPredTaskItem == 0) && (posParentTaskItem == 0)){ + if(this.minPosXMove <= this.ganttChart.initialPos){ + this.minPosXMove = this.ganttChart.initialPos; + } + } + }else{ + if((posParentTaskItem > 0) && (posPredTaskItem == 0)){ + this.minPosXMove = posParentTaskItem; + this.maxPosXMove = posParentTaskItem + widthParentTaskItem; + }else if((posParentTaskItem == 0) && (posPredTaskItem == 0)){ + this.minPosXMove = this.ganttChart.initialPos; + this.maxPosXMove = -1; + }else if((posParentTaskItem > 0) && (posPredTaskItem > 0)){ + this.minPosXMove = posPredTaskItem; + this.maxPosXMove = posParentTaskItem + widthParentTaskItem; + }else if((posParentTaskItem == 0) && (posPredTaskItem > 0)){ + this.minPosXMove = posPredTaskItem; + this.maxPosXMove = -1; + } + if((this.parentTask) && (this.childPredTask.length > 0)){ + var posChildTaskItem = this.getMaxPosPredChildTaskItem(this); + var posParentTaskItem = parseInt(this.parentTask.cTaskItem[0].style.left) + parseInt(this.parentTask.cTaskItem[0].firstChild.firstChild.width); + this.maxPosXMove = this.posX + widthTaskItem + posParentTaskItem - posChildTaskItem; + } + } + }, + startResize: function(event){ + this.mouseX = event.screenX; + this.getResizeInfo(); + this.hideDescTask(); + this.checkResize = true; + this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width); + }, + getResizeInfo: function(){ + var cTask = this.cTaskItem[0]; + var posParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left); + var widthParentTaskItem = !this.parentTask ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width); + var posTaskItem = parseInt(cTask.style.left); + var childPredPosX = 0; + var childParentPosX = 0; + if(this.childPredTask.length > 0){ + var posChildTaskItem = null; + dojo.forEach(this.childPredTask, function(cpTask){ + if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem > parseInt(cpTask.cTaskItem[0].style.left)))){ + posChildTaskItem = parseInt(cpTask.cTaskItem[0].style.left); + } + }, this); + childPredPosX = posChildTaskItem; + } + if(this.childTask.length > 0){ + var posChildTaskItem = null; + dojo.forEach(this.childTask, function(cTask){ + if((!posChildTaskItem) || ((posChildTaskItem) && (posChildTaskItem < (parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width))))){ + posChildTaskItem = parseInt(cTask.cTaskItem[0].style.left) + parseInt(cTask.cTaskItem[0].firstChild.firstChild.width); + } + }, this); + childParentPosX = posChildTaskItem; + } + this.minWidthResize = this.ganttChart.pixelsPerDay; + if(this.childTask.length > 0){ + this.minWidthResize = childParentPosX - posTaskItem; + } + if((this.childPredTask.length > 0) && (!this.parentTask)){ + this.maxWidthResize = childPredPosX - posTaskItem; + }else if((this.childPredTask.length > 0) && (this.parentTask)){ + var w1 = posParentTaskItem + widthParentTaskItem - posTaskItem; + var w2 = childPredPosX - posTaskItem; + this.maxWidthResize = Math.min(w1, w2); + }else if((this.childPredTask.length == 0) && (this.parentTask)){ + this.maxWidthResize = posParentTaskItem + widthParentTaskItem - posTaskItem; + } + }, + createTaskItem: function(){ + this.posX = this.ganttChart.getPosOnDate(this.taskItem.startTime); + var itemControl = dojo.create("div", { + id: this.taskItem.id, + className: "ganttTaskItemControl" + }); + dojo.style(itemControl, { + left: this.posX + "px", + top: this.posY + "px" + }); + var divTaskItem = dojo.create("div", {className: "ganttTaskDivTaskItem"}, itemControl); + var tblTaskItem = dojo.create("table", { + cellPadding: "0", + cellSpacing: "0", + width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px", + className: "ganttTaskTblTaskItem" + }, divTaskItem); + var rowTblTask = tblTaskItem.insertRow(tblTaskItem.rows.length); + if(this.taskItem.percentage != 0){ + var cellTblTask = dojo.create("td", { + height: this.ganttChart.heightTaskItem + "px", + width: this.taskItem.percentage + "%" + }, rowTblTask); + cellTblTask.style.lineHeight = "1px"; + var imageProgress = dojo.create("div", { + className: "ganttImageTaskProgressFilled" + }, cellTblTask); + dojo.style(imageProgress, { + width: (this.taskItem.percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + } + if(this.taskItem.percentage != 100){ + var cellTblTask = dojo.create("td", { + height: this.ganttChart.heightTaskItem + "px", + width: (100 - this.taskItem.percentage) + "%" + }, rowTblTask); + cellTblTask.style.lineHeight = "1px"; + var imageProgressFill = dojo.create("div", { + className: "ganttImageTaskProgressBg" + }, cellTblTask); + dojo.style(imageProgressFill, { + width: ((100 - this.taskItem.percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + } + if(this.ganttChart.isContentEditable){ + var divTaskInfo = dojo.create("div", {className: "ganttTaskDivTaskInfo"}, itemControl); + var tblTaskInfo = dojo.create("table", { + cellPadding: "0", + cellSpacing: "0", + height: this.ganttChart.heightTaskItem + "px", + width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px" + }, divTaskInfo); + var rowTaskInfo = tblTaskInfo.insertRow(0); + var cellTaskInfo = dojo.create("td", { + align: "center", + vAlign: "top", + height: this.ganttChart.heightTaskItem + "px", + className: "ganttMoveInfo" + }, rowTaskInfo); + var divTaskName = dojo.create("div", {className: "ganttTaskDivTaskName"}, itemControl); + var divMove = dojo.create("div", {}, divTaskName); + dojo.create("input", { + className: "ganttTaskDivMoveInput", + type: "text" + }, divMove); + dojo.isIE && dojo.style(divMove, { + background: "#000000", + filter: "alpha(opacity=0)" + }); + dojo.style(divMove, { + height: this.ganttChart.heightTaskItem + "px", + width: this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + "px" + }); + //Creation resize area + var divResize = dojo.create("div", {className: "ganttTaskDivResize"}, divTaskName); + dojo.create("input", { + className: "ganttTaskDivResizeInput", + type: "text" + }, divResize); + dojo.style(divResize, { + left: (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour - 10) + "px", + height: this.ganttChart.heightTaskItem + "px", + width: "10px" + }); + this.ganttChart._events.push( + dojo.connect(divMove, "onmousedown", this, function(event){ + //start move + this.moveMoveConn = dojo.connect(document, "onmousemove", this, function(e){ + this.checkMove && this.moveItem(e); + }); + this.moveUpConn = dojo.connect(document, "onmouseup", this, function(e){ + if(this.checkMove){ + this.endMove(); + this.ganttChart.isMoving = false; + document.body.releaseCapture && document.body.releaseCapture(); + dojo.disconnect(this.moveMoveConn); + dojo.disconnect(this.moveUpConn); + } + }); + this.startMove(event); + this.ganttChart.isMoving = true; + document.body.setCapture && document.body.setCapture(false); + }) + ); + this.ganttChart._events.push( + dojo.connect(divMove, "onmouseover", this, function(event){ + event.target && (event.target.style.cursor = "move"); + }) + ); + this.ganttChart._events.push( + dojo.connect(divMove, "onmouseout", this, function(event){ + event.target.style.cursor = ""; + }) + ); + this.ganttChart._events.push( + dojo.connect(divResize, "onmousedown", this, function(event){ + //start resize + this.resizeMoveConn = dojo.connect(document, "onmousemove", this, function(e){ + this.checkResize && this.resizeItem(e); + }); + this.resizeUpConn = dojo.connect(document, "onmouseup", this, function(e){ + if(this.checkResize){ + this.endResizeItem(); + this.ganttChart.isResizing = false; + document.body.releaseCapture && document.body.releaseCapture(); + dojo.disconnect(this.resizeMoveConn); + dojo.disconnect(this.resizeUpConn); + } + }); + this.startResize(event); + this.ganttChart.isResizing = true; + document.body.setCapture && document.body.setCapture(false); + }) + ); + this.ganttChart._events.push( + dojo.connect(divResize, "onmouseover", this, function(event){ + (!this.ganttChart.isMoving) && (!this.ganttChart.isResizing) && event.target && (event.target.style.cursor = "e-resize"); + }) + ); + this.ganttChart._events.push( + dojo.connect(divResize, "onmouseout", this, function(event){ + !this.checkResize && event.target && (event.target.style.cursor = ""); + }) + ); + } + return itemControl; + }, + createTaskNameItem: function(){ + var divName = dojo.create("div", { + id: this.taskItem.id, + className: "ganttTaskTaskNameItem", + title: this.taskItem.name + ", id: " + this.taskItem.id + " ", + innerHTML: this.taskItem.name + }); + dojo.style(divName, "top", this.posY + "px"); + dojo.attr(divName, "tabIndex", 0); + if(this.ganttChart.isShowConMenu){ + this.ganttChart._events.push( + dojo.connect(divName, "onmouseover", this, function(event){ + dojo.addClass(divName, "ganttTaskTaskNameItemHover"); + clearTimeout(this.ganttChart.menuTimer); + this.ganttChart.tabMenu.clear(); + this.ganttChart.tabMenu.show(event.target, this); + }) + ); + this.ganttChart._events.push( + dojo.connect(divName, "onkeydown", this, function(event){ + if(event.keyCode == dojo.keys.ENTER){ + this.ganttChart.tabMenu.clear(); + this.ganttChart.tabMenu.show(event.target, this); + } + if(this.ganttChart.tabMenu.isShow && (event.keyCode == dojo.keys.LEFT_ARROW || event.keyCode == dojo.keys.RIGHT_ARROW)){ + dijit.focus(this.ganttChart.tabMenu.menuPanel.firstChild.rows[0].cells[0]); + } + if(this.ganttChart.tabMenu.isShow && event.keyCode == dojo.keys.ESCAPE){ + this.ganttChart.tabMenu.hide(); + } + }) + ); + this.ganttChart._events.push( + dojo.connect(divName, "onmouseout", this, function(){ + dojo.removeClass(divName, "ganttTaskTaskNameItemHover"); + clearTimeout(this.ganttChart.menuTimer); + this.ganttChart.menuTimer = setTimeout(dojo.hitch(this, function(){ + this.ganttChart.tabMenu.hide(); + }), 200); + }) + ); + this.ganttChart._events.push( + dojo.connect(this.ganttChart.tabMenu.menuPanel, "onmouseover", this, function(){ + clearTimeout(this.ganttChart.menuTimer); + }) + ); + this.ganttChart._events.push( + dojo.connect(this.ganttChart.tabMenu.menuPanel, "onkeydown", this, function(event){ + if(this.ganttChart.tabMenu.isShow && event.keyCode == dojo.keys.ESCAPE){ + this.ganttChart.tabMenu.hide(); + } + }) + ); + this.ganttChart._events.push( + dojo.connect(this.ganttChart.tabMenu.menuPanel, "onmouseout", this, function(){ + clearTimeout(this.ganttChart.menuTimer); + this.ganttChart.menuTimer = setTimeout(dojo.hitch(this, function(){ + this.ganttChart.tabMenu.hide(); + }), 200); + }) + ); + } + return divName; + }, + createTaskDescItem: function(){ + var posX = (this.posX + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10); + var divDesc = dojo.create("div", { + innerHTML: this.objKeyToStr(this.getTaskOwner()), + className: "ganttTaskDescTask" + }); + dojo.style(divDesc, { + left: posX + "px", + top: this.posY + "px" + }); + return this.descrTask = divDesc; + }, + checkWidthTaskNameItem: function(){ + if(this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft > this.ganttChart.maxWidthTaskNames){ + var width = this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft - this.ganttChart.maxWidthTaskNames; + var countChar = Math.round(width / (this.cTaskNameItem[0].offsetWidth / this.cTaskNameItem[0].firstChild.length)); + var tName = this.taskItem.name.substring(0, this.cTaskNameItem[0].firstChild.length - countChar - 3); + tName += "..."; + this.cTaskNameItem[0].innerHTML = tName; + } + }, + refreshTaskItem: function(itemControl){ + this.posX = this.ganttChart.getPosOnDate(this.taskItem.startTime); + dojo.style(itemControl, { + "left": this.posX + "px" + }); + var divTaskItem = itemControl.childNodes[0]; + var tblTaskItem = divTaskItem.firstChild; + tblTaskItem.width = (!this.taskItem.duration ? 1 : this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) + "px"; + var rowTblTask = tblTaskItem.rows[0]; + if(this.taskItem.percentage != 0){ + var cellTblTask = rowTblTask.firstChild; + cellTblTask.height = this.ganttChart.heightTaskItem + "px"; + cellTblTask.width = this.taskItem.percentage + "%"; + cellTblTask.style.lineHeight = "1px"; + var imageProgress = cellTblTask.firstChild; + dojo.style(imageProgress, { + width: (!this.taskItem.duration ? 1 : (this.taskItem.percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour / 100)) + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + } + if(this.taskItem.percentage != 100){ + var cellTblTask = rowTblTask.lastChild; + cellTblTask.height = this.ganttChart.heightTaskItem + "px"; + cellTblTask.width = (100 - this.taskItem.percentage) + "%"; + cellTblTask.style.lineHeight = "1px"; + var imageProgressFill = cellTblTask.firstChild; + dojo.style(imageProgressFill, { + width: (!this.taskItem.duration ? 1 : ((100 - this.taskItem.percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour / 100)) + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + } + if(this.ganttChart.isContentEditable){ + var divTaskInfo = itemControl.childNodes[1]; + var tblTaskInfo = divTaskInfo.firstChild; + tblTaskInfo.height = this.ganttChart.heightTaskItem + "px"; + tblTaskInfo.width = (!this.taskItem.duration ? 1 : (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour)) + "px"; + var rowTaskInfo = tblTaskInfo.rows[0]; + var cellTaskInfo = rowTaskInfo.firstChild; + cellTaskInfo.height = this.ganttChart.heightTaskItem + "px"; + var divTaskName = itemControl.childNodes[2]; + var divMove = divTaskName.firstChild; + divMove.style.height = this.ganttChart.heightTaskItem + "px"; + divMove.style.width = (!this.taskItem.duration ? 1 : (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour)) + "px"; + //Creation resize area + var divResize = divTaskName.lastChild; + dojo.style(divResize, { + "left": (this.taskItem.duration * this.ganttChart.pixelsPerWorkHour - 10) + "px" + }); + divResize.style.height = this.ganttChart.heightTaskItem + "px"; + divResize.style.width = "10px"; + } + return itemControl; + }, + refreshTaskDesc: function(divDesc){ + var posX = (this.posX + this.taskItem.duration * this.ganttChart.pixelsPerWorkHour + 10); + dojo.style(divDesc, { + "left": posX + "px" + }); + return divDesc; + }, + refreshConnectingLinesDS: function(arrLines){ + var arrowImg = arrLines[1]; + var lineVerticalRight = arrLines[0]; + //horizontal line + var lineHorizontal = arrLines[2]; + var posXPreviousTask = dojo.style(this.predTask.cTaskItem[0], "left"); + var posYPreviousTask = dojo.style(this.predTask.cTaskItem[0], "top"); + var posXChildTask = dojo.style(this.cTaskItem[0], "left"); + var posYChildTask = this.posY + 2; + //width task item + var widthChildTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width); + var widthPreviousTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width); + if(posYPreviousTask < posYChildTask){ + dojo.style(lineVerticalRight, { + "height": (posYChildTask - this.ganttChart.heightTaskItem / 2 - posYPreviousTask - 3) + "px", + "left": (posXPreviousTask + widthPreviousTask - 20) + "px" + }); + dojo.style(lineHorizontal, { + "width": (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px", + "left": (posXPreviousTask + widthPreviousTask - 20) + "px" + }); + + dojo.style(arrowImg, { + "left": (posXChildTask - 7) + "px" + }); + }else{ + dojo.style(lineVerticalRight, { + "height": (posYPreviousTask + 2 - posYChildTask) + "px", + "left": (posXPreviousTask + widthPreviousTask - 20) + "px" + }); + dojo.style(lineHorizontal, { + "width": (15 + (posXChildTask - (widthPreviousTask + posXPreviousTask))) + "px", + "left": (posXPreviousTask + widthPreviousTask - 20) + "px" + }); + dojo.style(arrowImg, { + "left": (posXChildTask - 7) + "px" + }); + } + return arrLines; + }, + postLoadData: function(){ + //TODO e.g. task relative info... + }, + refresh: function(){ + if(this.childTask && this.childTask.length > 0){ + dojo.forEach(this.childTask, function(cTask){ + cTask.refresh(); + }, this); + } + //creation task item + this.refreshTaskItem(this.cTaskItem[0]); + this.refreshTaskDesc(this.cTaskItem[0].nextSibling); + //Create Connecting Lines + var arrConnectingLines = []; + if(this.taskItem.previousTask && this.predTask){ + this.refreshConnectingLinesDS(this.cTaskItem[1]); + } + return this; + }, + create: function(){ + var containerTasks = this.ganttChart.contentData.firstChild; + var containerNames = this.ganttChart.panelNames.firstChild; + var previousTask = this.taskItem.previousTask; + var parentTask = this.taskItem.parentTask; + var isCParentTask = (this.taskItem.cldTasks.length > 0) ? true : false; + this.cTaskItem = []; + this.cTaskNameItem = []; + //creation arrTasks + if(!parentTask){ + if(this.taskItem.previousParentTask){ + this.previousParentTask = this.project.getTaskById(this.taskItem.previousParentTask.id); + var lastChildTask = this.ganttChart.getLastChildTask(this.previousParentTask); + this.posY = parseInt(lastChildTask.cTaskItem[0].style.top) + + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra; + this.previousParentTask.nextParentTask = this; + }else{ + this.posY = parseInt(this.project.projectItem[0].style.top) + + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra; + } + } + if(parentTask){ + var task = this.project.getTaskById(this.taskItem.parentTask.id); + this.parentTask = task; + + if(this.taskItem.previousChildTask){ + this.previousChildTask = this.project.getTaskById(this.taskItem.previousChildTask.id); + var lastChildTask = this.ganttChart.getLastChildTask(this.previousChildTask); + this.posY = dojo.style(lastChildTask.cTaskItem[0], "top") + + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra; + this.previousChildTask.nextChildTask = this; + }else{ + this.posY = dojo.style(task.cTaskItem[0], "top") + + this.ganttChart.heightTaskItem + this.ganttChart.heightTaskItemExtra; + } + task.childTask.push(this); + } + if(previousTask){ + var task = this.project.getTaskById(previousTask.id); + this.predTask = task; + task.childPredTask.push(this); + } + //creation task item + this.cTaskItem.push(this.createTaskItem()); + containerTasks.appendChild(this.cTaskItem[0]); + if(this.ganttChart.panelNames){ + this.cTaskNameItem.push(this.createTaskNameItem()); + this.ganttChart.panelNames.firstChild.appendChild(this.cTaskNameItem[0]); + } + containerTasks.appendChild(this.createTaskDescItem()); + //Create Connecting Lines + var arrConnectingLines = []; + if(previousTask){ + arrConnectingLines = this.createConnectingLinesDS(); + } + this.cTaskItem.push(arrConnectingLines); + if(this.ganttChart.panelNames){ + //Create Connecting Lines + var arrConnectingLinesNames = []; + if(parentTask){ + this.cTaskNameItem[0].style.left = dojo.style(this.parentTask.cTaskNameItem[0], "left") + 15 + "px"; + arrConnectingLinesNames = this.createConnectingLinesPN(); + } + this.checkWidthTaskNameItem(); + //Identifier + this.checkPosition(); + var treeImg = null; + if(isCParentTask){ + treeImg = this.createTreeImg(); + } + this.cTaskNameItem.push(arrConnectingLinesNames); + this.cTaskNameItem.push(treeImg); + } + this.adjustPanelTime(); + return this; + }, + checkPosition: function(){ + //task name position: check Task Identifier + if(!this.ganttChart.withTaskId){ + return; + } + var pos = dojo.coords(this.cTaskNameItem[0], true); + if(this.taskIdentifier){ + if(this.childTask && this.childTask.length > 0){ + dojo.forEach(this.childTask, function(cTask){ + cTask.checkPosition(); + }, this); + } + dojo.style(this.taskIdentifier, { + "left": (pos.l + pos.w + 4) + "px", + "top": (pos.t - 1) + "px" + }); + }else{ + this.taskIdentifier = dojo.create("div", { + id: "TaskId_" + this.taskItem.id, + className: "ganttTaskIdentifier", + title: this.taskItem.id, + innerHTML: this.taskItem.id + }, this.cTaskNameItem[0].parentNode); + dojo.style(this.taskIdentifier, { + left: (pos.l + pos.w + 4) + "px", + top: (pos.t - 1) + "px" + }); + } + }, + createTreeImg: function(){ + var treeImg = dojo.create("div", { + id: this.taskItem.id, + className: "ganttImageTreeCollapse" + }); + dojo.attr(treeImg, "tabIndex", 0); + dojo.forEach(["onclick", "onkeydown"], function(e){ + this.ganttChart._events.push( + dojo.connect(treeImg, e, this, function(evt){ + if(e == "onkeydown" && evt.keyCode != dojo.keys.ENTER){ return; } + if(this.isExpanded){ + dojo.removeClass(treeImg, "ganttImageTreeCollapse"); + dojo.addClass(treeImg, "ganttImageTreeExpand"); + this.isExpanded = false; + this.hideChildTasks(this); + this.shiftCurrentTasks(this, -this.hideTasksHeight); + this.ganttChart.checkPosition(); + }else{ + dojo.removeClass(treeImg, "ganttImageTreeExpand"); + dojo.addClass(treeImg, "ganttImageTreeCollapse"); + this.isExpanded = true; + this.shiftCurrentTasks(this, this.hideTasksHeight); + this.showChildTasks(this, true); + this.hideTasksHeight = 0; + this.ganttChart.checkPosition(); + } + }) + ); + }, this); + this.ganttChart.panelNames.firstChild.appendChild(treeImg); + dojo.addClass(treeImg, "ganttTaskTreeImage"); + dojo.style(treeImg, { + left: (dojo.style(this.cTaskNameItem[0], "left") - 12) + "px", + top: (dojo.style(this.cTaskNameItem[0], "top") + 3) + "px" + }); + return treeImg; + }, + setPreviousTask: function(previousTaskId){ + if(previousTaskId == ""){ + this.clearPredTask(); + }else{ + var task = this.taskItem; + if(task.id == previousTaskId){ + return false; + } + var predTaskObj = this.project.getTaskById(previousTaskId); + if(!predTaskObj){ + return false; + } + var predTask = predTaskObj.taskItem; + var a1 = predTask.parentTask == null, a2 = task.parentTask == null; + if(a1 && !a2 || !a1 && a2 || !a1 && !a2 && (predTask.parentTask.id != task.parentTask.id)){ + return false; + } + //check time + var startTime = task.startTime.getTime(), + pest = predTask.startTime.getTime(), + pdur = predTask.duration * 24 * 60 * 60 * 1000 / predTaskObj.ganttChart.hsPerDay; + if((pest+pdur) > startTime){ + return false; + } + // remove current connection + this.clearPredTask(); + if(!this.ganttChart.checkPosPreviousTask(predTask, task)){ + this.ganttChart.correctPosPreviousTask(predTask, task, this); + } + task.previousTaskId = previousTaskId; + task.previousTask = predTask; + this.predTask = predTaskObj; + predTaskObj.childPredTask.push(this); + this.cTaskItem[1] = this.createConnectingLinesDS(); + } + return true; + }, + clearPredTask: function(){ + if(this.predTask){ + var ch = this.predTask.childPredTask; + for(var i = 0; i < ch.length; i++){ + if(ch[i] == this){ + ch.splice(i, 1); + break; + } + } + for(var i = 0; i < this.cTaskItem[1].length; i++){ + this.cTaskItem[1][i].parentNode.removeChild(this.cTaskItem[1][i]); + } + this.cTaskItem[1] = []; + this.taskItem.previousTaskId = null; + this.taskItem.previousTask = null; + this.predTask = null; + } + }, + setStartTime: function(startTime, shiftChild){ + this.moveChild = shiftChild; + this.getMoveInfo(); + var pos = this.ganttChart.getPosOnDate(startTime); + if((parseInt(this.cTaskItem[0].firstChild.firstChild.width) + pos > this.maxPosXMove) && (this.maxPosXMove != -1)){ + this.maxPosXMove = -1; + this.minPosXMove = -1; + return false; + } + if(pos < this.minPosXMove){ + this.maxPosXMove = -1; + this.minPosXMove = -1; + return false; + } + this.cTaskItem[0].style.left = pos; + var width = pos - this.posX; + this.moveCurrentTaskItem(width, shiftChild); + this.project.shiftProjectItem(); + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + this.adjustPanelTime(); + this.posX = 0; + this.maxPosXMove = -1; + this.minPosXMove = -1; + return true; + }, + setDuration: function(duration){ + this.getResizeInfo(); + var width = this.ganttChart.getWidthOnDuration(duration); + if((width > this.maxWidthResize) && (this.maxWidthResize != -1)){ + return false; + }else if(width < this.minWidthResize){ + return false; + }else{ + this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width); + this.resizeTaskItem(width); + this.endResizeItem(); + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + return true; + } + }, + setTaskOwner: function(owner){ + owner = (owner == null || owner == undefined) ? "" : owner; + this.taskItem.taskOwner = owner; + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + return true; + }, + setPercentCompleted: function(percentage){ + percentage = parseInt(percentage); + if(isNaN(percentage) || percentage > 100 || percentage < 0){ + return false; + } + var trow = this.cTaskItem[0].childNodes[0].firstChild.rows[0], + rc0 = trow.cells[0], rc1 = trow.cells[1]; + if((percentage != 0) && (percentage != 100)){ + if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){ + rc0.width = percentage + "%"; + rc1.width = 100 - percentage + "%"; + }else if((this.taskItem.percentage == 0) || (this.taskItem.percentage == 100)){ + rc0.parentNode.removeChild(rc0); + var cellTblTask = dojo.create("td", { + height: this.ganttChart.heightTaskItem + "px", + width: percentage + "%" + }, trow); + cellTblTask.style.lineHeight = "1px"; + var imageProgressFill = dojo.create("div", { + className: "ganttImageTaskProgressFilled" + }, cellTblTask); + dojo.style(imageProgressFill, { + width: (percentage * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + + cellTblTask = dojo.create("td", { + height: this.ganttChart.heightTaskItem + "px", + width: (100 - percentage) + "%" + }, trow); + cellTblTask.style.lineHeight = "1px"; + imageProgressFill = dojo.create("div", { + className: "ganttImageTaskProgressBg" + }, cellTblTask); + dojo.style(imageProgressFill, { + width: ((100 - percentage) * this.taskItem.duration * this.ganttChart.pixelsPerWorkHour) / 100 + "px", + height: this.ganttChart.heightTaskItem + "px" + }); + } + }else if(percentage == 0){ + if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){ + rc0.parentNode.removeChild(rc0); + rc1.width = 100 + "%"; + }else{ + dojo.removeClass(rc0.firstChild, "ganttImageTaskProgressFilled"); + dojo.addClass(rc0.firstChild, "ganttImageTaskProgressBg"); + } + }else if(percentage == 100){ + if((this.taskItem.percentage != 0) && (this.taskItem.percentage != 100)){ + rc1.parentNode.removeChild(rc1); + rc0.width = 100 + "%"; + }else{ + dojo.removeClass(rc0.firstChild, "ganttImageTaskProgressBg"); + dojo.addClass(rc0.firstChild, "ganttImageTaskProgressFilled"); + } + } + this.taskItem.percentage = percentage; + this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width); + this.resizeTaskItem(this.taskItemWidth); + this.endResizeItem(); + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + return true; + }, + setName: function(name){ + if(name){ + this.taskItem.name = name; + this.cTaskNameItem[0].innerHTML = name; + this.cTaskNameItem[0].title = name; + this.checkWidthTaskNameItem(); + this.checkPosition(); + this.descrTask.innerHTML = this.objKeyToStr(this.getTaskOwner()); + this.adjustPanelTime(); + } + } +}); + +dojo.declare("dojox.gantt.GanttTaskItem", null, { + constructor: function(configuration){ + //id is required + this.id = configuration.id; + this.name = configuration.name || this.id; + this.startTime = configuration.startTime || new Date(); + this.duration = configuration.duration || 8; + this.percentage = configuration.percentage || 0; + this.previousTaskId = configuration.previousTaskId || ""; + this.taskOwner = configuration.taskOwner || ""; + this.cldTasks = []; + this.cldPreTasks = []; + this.parentTask = null; + this.previousTask = null; + this.project = null; + this.nextChildTask = null; + this.previousChildTask = null; + this.nextParentTask = null; + this.previousParentTask = null; + }, + addChildTask: function(task){ + this.cldTasks.push(task); + task.parentTask = this; + }, + setProject: function(project){ + this.project = project; + for(var j = 0; j < this.cldTasks.length; j++){ + this.cldTasks[j].setProject(project); + } + } +}); + + +}); |
