Exemplo n.º 1
0
        /// <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
                }
            }
        }