/// <summary> /// Renders task view, which displays a gantt like /// task view starting with a currently selected day for a month. /// </summary> /// <param name="writer">The HtmlTextWriter object that receives the content.</param> private void RenderTaskView(HtmlTextWriter writer) { //Initialize constants DateTime renderStartDate = TimescaleStartDate; //SelectedDate.Date; DateTime renderEndDate = TimescaleEndDate; //Helper.GetTaskEndDate(SelectedDate); // can be customized for zooming later int spanMax = (Helper.GetDaySpan(renderStartDate, renderEndDate) + 1); // Create weekday row writer.RenderBeginTag(HtmlTextWriterTag.Tr); // Render empty top left space writer.AddAttribute(HtmlTextWriterAttribute.Rowspan, "2"); RenderCellBorderAttributes(writer); writer.RenderBeginTag(HtmlTextWriterTag.Td); if(TaskItemHeaderTemplate != null) { TemplateItem header = new TemplateItem(); TaskItemHeaderTemplate.InstantiateIn(header); header.RenderControl(writer); } writer.RenderEndTag(); for(DateTime cycleDate = TimescaleStartDate; cycleDate <= TimescaleEndDate; cycleDate = Helper.IncrementDate(TimescaleTopFormat, cycleDate, this.FirstDayOfWeek)) { int colSpan = 0; bool exitLoop = false; // Detect if it spans out of boundaries if(Helper.IncrementDate(TimescaleTopFormat, cycleDate, this.FirstDayOfWeek) > this.TimescaleEndDate) { colSpan = (int)((TimeSpan)(this.TimescaleEndDate - cycleDate)).TotalDays + 1; exitLoop = true; } else colSpan = (int)((TimeSpan)(Helper.IncrementDate(TimescaleTopFormat, cycleDate, this.FirstDayOfWeek) - cycleDate)).TotalDays; CalendarHeaderStyle.AddAttributesToRender(writer); RenderPaletteColor(writer, HtmlTextWriterStyle.BackgroundColor, CalendarHeaderStyle.BackColor, CalendarColorConstants.HeaderBackColor); RenderPaletteColor(writer, HtmlTextWriterStyle.Color, CalendarHeaderStyle.ForeColor, CalendarColorConstants.HeaderForeColor); writer.AddAttribute(HtmlTextWriterAttribute.Height, "17"); // 13/1/2005 - Begin if (colSpan>0) // 13/1/2005 - End writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString()); RenderCellBorderAttributes(writer); writer.RenderBeginTag(HtmlTextWriterTag.Td); if(colSpan >= 7) // only render those items that can be fully displayed { string href = ""; CalendarHeaderStyle.AddAttributesToRender(writer); RenderPaletteColor(writer, HtmlTextWriterStyle.BackgroundColor, CalendarHeaderStyle.BackColor, CalendarColorConstants.HeaderBackColor); RenderPaletteColor(writer, HtmlTextWriterStyle.Color, CalendarHeaderStyle.ForeColor, CalendarColorConstants.HeaderForeColor); // [9/15/2004] --- Begin if(this.DrillDownEnabled) { if(this.TimescaleTopFormat == TimescaleTopSpan.Month) href = "javascript:" + this.Page.ClientScript.GetPostBackEventReference(this, "OnSelectedViewChange," + cycleDate.ToShortDateString() + "," + CalendarViewType.MonthView.GetHashCode()); else href = "javascript:" + this.Page.ClientScript.GetPostBackEventReference(this, "OnSelectedViewChange," + cycleDate.ToShortDateString() + "," + CalendarViewType.WeekView.GetHashCode()); writer.AddAttribute(HtmlTextWriterAttribute.Href, href); writer.RenderBeginTag(HtmlTextWriterTag.A); RenderText(writer, cycleDate.ToString(TimescaleTopLabelFormat)); writer.RenderEndTag(); // </A> } else { href = cycleDate.ToShortDateString(); writer.AddAttribute(HtmlTextWriterAttribute.Value, href); writer.RenderBeginTag(HtmlTextWriterTag.Div); RenderText(writer, cycleDate.ToString(TimescaleTopLabelFormat)); writer.RenderEndTag(); // </Div> } // [9/15/2004] --- End } writer.RenderEndTag(); if(exitLoop) break; } writer.RenderEndTag(); //tr // Render month day numbers writer.RenderBeginTag(HtmlTextWriterTag.Tr); for(DateTime cycleDate = renderStartDate;cycleDate <= renderEndDate;cycleDate = Helper.IncrementDate(MatrixSpan.DaySpan, cycleDate)) { CalendarHeaderStyle.AddAttributesToRender(writer); RenderPaletteColor(writer, HtmlTextWriterStyle.BackgroundColor, CalendarHeaderStyle.BackColor, CalendarColorConstants.HeaderBackColor); RenderPaletteColor(writer, HtmlTextWriterStyle.Color, CalendarHeaderStyle.ForeColor, CalendarColorConstants.HeaderForeColor); writer.AddAttribute(HtmlTextWriterAttribute.Height, "17"); writer.AddAttribute(HtmlTextWriterAttribute.Width, TaskItemWidth.ToString()); // [9/15/2004] writer.AddAttribute(HtmlTextWriterAttribute.Align, "center"); RenderCellBorderAttributes(writer); writer.RenderBeginTag(HtmlTextWriterTag.Td); CalendarHeaderStyle.AddAttributesToRender(writer); RenderPaletteColor(writer, HtmlTextWriterStyle.BackgroundColor, CalendarHeaderStyle.BackColor, CalendarColorConstants.HeaderBackColor); RenderPaletteColor(writer, HtmlTextWriterStyle.Color, CalendarHeaderStyle.ForeColor, CalendarColorConstants.HeaderForeColor); // [9/15/2004] --- Begin if(this.DrillDownEnabled) { String href = "javascript:" + this.Page.ClientScript.GetPostBackEventReference(this, "OnSelectedViewChange," + cycleDate.ToShortDateString() + "," + CalendarViewType.DayView.GetHashCode()); writer.AddAttribute(HtmlTextWriterAttribute.Href, href); writer.RenderBeginTag(HtmlTextWriterTag.A); RenderText(writer, cycleDate.ToString(TimescaleBottomLabelFormat)); writer.RenderEndTag(); // </A> } else { String href = cycleDate.ToShortDateString(); writer.AddAttribute(HtmlTextWriterAttribute.Value, href); writer.RenderBeginTag(HtmlTextWriterTag.Div); RenderText(writer, cycleDate.ToString(TimescaleBottomLabelFormat)); writer.RenderEndTag(); // </Div> } // [9/15/2004] --- End writer.RenderEndTag(); //td } writer.RenderEndTag(); //tr // Render tasks and spans here for(int index = 0;index<Items.Count;index++) { CalendarItem item = Items[index]; if(!this.RemoveItems || (item.StartDate.Date >= renderStartDate && item.StartDate.Date <= renderEndDate) || (item.EndDate.Date >= renderStartDate && item.EndDate.Date <= renderEndDate) || (item.StartDate.Date <= renderStartDate && item.EndDate.Date >= renderEndDate)) { int rowSpannedTotal = 0; writer.RenderBeginTag(HtmlTextWriterTag.Tr); // Render task name RenderCellBorderAttributes(writer); if(this.EventBarShow) writer.AddAttribute(HtmlTextWriterAttribute.Height, (ItemHeight.Value+10).ToString()); else writer.AddAttribute(HtmlTextWriterAttribute.Height, (ItemHeight.Value+6).ToString()); writer.RenderBeginTag(HtmlTextWriterTag.Td); item.Render(writer, RenderPath); writer.RenderEndTag(); //td //Hashtable hash; //if(this.MergeEvents) // hash = MergeItems(); // Render box span for(DateTime cycleDate = renderStartDate;cycleDate <= renderEndDate;) { bool isRendered = false; DateTime endCycleDate = renderEndDate.AddDays(1); if(item.IsWithinSpanEvent(MatrixSpan.DaySpan, cycleDate)) { int colSpan = AddTaskItemAttributes(writer, cycleDate, item); RenderCellBorderAttributes(writer); writer.RenderBeginTag(HtmlTextWriterTag.Td); item.SetRenderedDate(cycleDate); //writer.AddStyleAttribute(HtmlTextWriterStyle.Width, (14 * colSpan).ToString() + "px"); item.RenderBoxTagAttributes(writer); if(TaskItemBoxTemplate!=null) // render using template { writer.AddStyleAttribute("overflow", "hidden"); //writer.AddStyleAttribute("border", "solid 1px"); string strWidth = this.TaskItemWidth.ToString(); int iWidth = int.Parse(strWidth.Substring(0,strWidth.IndexOf("px"))); if(colSpan>2) writer.AddStyleAttribute(HtmlTextWriterStyle.Width, (iWidth * colSpan + colSpan).ToString() + "px"); else writer.AddStyleAttribute(HtmlTextWriterStyle.Width, (colSpan*(iWidth-2)).ToString() + "px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); item.Controls.Clear();// = (CalendarItem)item.Clone(); CalendarItem item2 = (CalendarItem)item.Clone(); TaskItemBoxTemplate.InstantiateIn(item2); item2.DataBind(); item2.RenderControl(writer); writer.RenderEndTag(); //div } item.RenderBoxEndTagAttributes(writer); writer.RenderEndTag(); //td rowSpannedTotal += colSpan; cycleDate = cycleDate.AddDays(colSpan); if(this.MergeEvents) if(index != Items.Count - 1) { CalendarItem nextItem = Items[index+1]; // June 28 2004: Added .Date to the Start and EndDate if(nextItem.StartDate.Date>item.EndDate.Date && nextItem.Label.CompareTo(item.Label)==0) { index++; item = nextItem; endCycleDate = item.StartDate.Date; } } //isRendered = true; } else // render space before event { //endCycleDate = item.StartDate.Date; if((item.StartDate.Date >= renderStartDate && item.StartDate.Date <= renderEndDate) || (item.AdjustedEndDate.Date >= renderStartDate && item.AdjustedEndDate.Date <= renderEndDate) || (item.StartDate.Date <= renderStartDate && item.AdjustedEndDate.Date >= renderEndDate)) endCycleDate = item.StartDate.Date; else endCycleDate = renderEndDate.AddDays(1); } while(cycleDate < endCycleDate) { int colSpan = 0; bool finished = false; if(Helper.IsWeekend(cycleDate, this.WorkWeek))//weekend, apply weekdaystyle { CalendarItemInactiveStyle.AddAttributesToRender(writer); RenderPaletteColor(writer, HtmlTextWriterStyle.BackgroundColor, CalendarItemInactiveStyle.BackColor, CalendarColorConstants.ItemInactiveBackColor); RenderPaletteColor(writer, HtmlTextWriterStyle.Color, CalendarItemInactiveStyle.ForeColor, CalendarColorConstants.ItemInactiveForeColor); colSpan = 1; } else // colspan until weekend { colSpan = 1; while((Helper.GetCalDayOfWeek(cycleDate.AddDays(colSpan).DayOfWeek)&WorkWeek)!=0 && (Helper.GetCalDayOfWeek(cycleDate.AddDays(colSpan).DayOfWeek)&FirstDayOfWeek)==0) { colSpan++; } //colSpan = 1;//6 - (int)cycleDate.DayOfWeek; } // Detect if colspan goes out of endCycleDate boundaries if(cycleDate.AddDays(colSpan) >= endCycleDate) { int diff = (int)((TimeSpan)(cycleDate.AddDays(colSpan).Date - endCycleDate.Date)).TotalDays; colSpan -= diff; finished = true; } // Detect if colspan goes out of boundaries rowSpannedTotal += colSpan; if(rowSpannedTotal > spanMax) colSpan -= rowSpannedTotal - spanMax; cycleDate = cycleDate.AddDays(colSpan); // [13/1/2005] - Begin if(colSpan>0) // [13/1/2005] - End writer.AddAttribute(HtmlTextWriterAttribute.Colspan, colSpan.ToString()); RenderCellBorderAttributes(writer); writer.RenderBeginTag(HtmlTextWriterTag.Td); writer.RenderEndTag(); //td if(finished) break; } if(isRendered) break; // For some reason the expression in for statement doesn't cause termination //if(cycleDate.Date < renderEndDate.Date) // break; } writer.RenderEndTag(); //tr } } }