This is a migrated thread and some comments may be shown as answers.

Printing with different start date overlaps table

3 Answers 83 Views
GanttView
This is a migrated thread and some comments may be shown as answers.
gipsy
Top achievements
Rank 1
gipsy asked on 08 Sep 2017, 12:10 PM

Hi,

if you change the 

GraphicalViewElement.TimelineStart

of the GanttView to a date inside the range of nodes, to just print a part of the Gannt, the graphical representation overlaps the table. 

The expected result should be that the printed timeline gets cut at the TimelineStart, like it correctly does at TimelineEnd.

3 Answers, 1 is accepted

Sort by
0
Accepted
Hristo
Telerik team
answered on 08 Sep 2017, 01:54 PM
Hello Gipsy,

Thank you for writing.

Indeed the reported behavior is an issue and I have logged it in our feedback portal, here: FIX. RadGanttView - the timeline items are not correctly printed if the GraphicalViewElement.TimelineStart property is set to a value inside the range of the timeline items. I have also updated your Telerik points. Additionally, you can subscribe to the item and be updated with all of its status changes.

Until we permanently fix the issue you will need to create a custom RadGanttView control and override the logic responsible for painting the timeline items: 
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
    public RadForm1()
    {
        InitializeComponent();
 
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 9);
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10);
 
        //setup data items
        GanttViewDataItem item1 = new GanttViewDataItem();
        item1.Start = new DateTime(2010, 10, 10);
        item1.End = new DateTime(2010, 10, 15);
        item1.Progress = 30m;
        item1.Title = "Summary task.1. title";
 
        GanttViewDataItem subitem11 = new GanttViewDataItem();
        subitem11.Start = new DateTime(2010, 10, 10);
        subitem11.End = new DateTime(2010, 10, 12);
        subitem11.Progress = 10m;
        subitem11.Title = "Sub-task.1.1 title";
 
        GanttViewDataItem subitem12 = new GanttViewDataItem();
        subitem12.Start = new DateTime(2010, 10, 12);
        subitem12.End = new DateTime(2010, 10, 15);
        subitem12.Progress = 20m;
        subitem12.Title = "Sub-task.1.2 title";
 
        //add subitems
        item1.Items.Add(subitem11);
        item1.Items.Add(subitem12);
 
        this.radGanttView1.Items.Add(item1);
 
        GanttViewDataItem item2 = new GanttViewDataItem();
        item2.Start = new DateTime(2010, 10, 12);
        item2.End = new DateTime(2010, 10, 18);
        item2.Progress = 40m;
        item2.Title = "Summary task.2. title";
 
        GanttViewDataItem subitem21 = new GanttViewDataItem();
        subitem21.Start = new DateTime(2010, 10, 12);
        subitem21.End = new DateTime(2010, 10, 13);
        subitem21.Progress = 10m;
        subitem21.Title = "Sub-task.2.1 title";
 
        GanttViewDataItem subitem22 = new GanttViewDataItem();
        subitem22.Start = new DateTime(2010, 10, 13);
        subitem22.End = new DateTime(2010, 10, 18);
        subitem22.Progress = 30m;
        subitem22.Title = "Sub-task.2.2 title";
 
        GanttViewDataItem subitem23 = new GanttViewDataItem();
        subitem23.Start = new DateTime(2010, 10, 18);
        subitem23.End = new DateTime(2010, 10, 18);
        subitem23.Title = "Sub-task.2.3 title";
 
        //add subitems
        item2.Items.Add(subitem21);
        item2.Items.Add(subitem22);
        item2.Items.Add(subitem23);
 
        this.radGanttView1.Items.Add(item2);
 
        //add links between items
        GanttViewLinkDataItem link1 = new GanttViewLinkDataItem();
        link1.StartItem = subitem11;
        link1.EndItem = subitem12;
        link1.LinkType = TasksLinkType.FinishToStart;
        this.radGanttView1.Links.Add(link1);
 
        GanttViewLinkDataItem link2 = new GanttViewLinkDataItem();
        link2.StartItem = subitem21;
        link2.EndItem = subitem22;
        link2.LinkType = TasksLinkType.StartToStart;
        this.radGanttView1.Links.Add(link2);
 
        GanttViewLinkDataItem link3 = new GanttViewLinkDataItem();
        link3.StartItem = subitem22;
        link3.EndItem = subitem23;
        link3.LinkType = TasksLinkType.FinishToStart;
        this.radGanttView1.Links.Add(link3);
 
        GanttViewTextViewColumn titleColumn = new GanttViewTextViewColumn("Title");
        GanttViewTextViewColumn startColumn = new GanttViewTextViewColumn("Start");
        GanttViewTextViewColumn endColumn = new GanttViewTextViewColumn("End");
 
        this.radGanttView1.GanttViewElement.Columns.Add(titleColumn);
        this.radGanttView1.GanttViewElement.Columns.Add(startColumn);
        this.radGanttView1.GanttViewElement.Columns.Add(endColumn);
 
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 13);
    }
 
    private void radButton1_Click(object sender, EventArgs e)
    {
        RadPrintDocument doc = new RadPrintDocument();
        doc.Landscape = true;
        RadPrintPreviewDialog dialog = new RadPrintPreviewDialog();
        doc.AssociatedObject = this.radGanttView1;
        dialog.Document = doc;
        dialog.ShowDialog();
    }
}
 
public class MyRadGanttView : RadGanttView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadGanttView).FullName;
        }
    }
 
    protected override PointF[] GetElementShape(GanttViewPrintElementContext context, RectangleF rect)
    {
        if (shouldPaintStartCap)
        {
            return base.GetElementShape(context, rect);
        }
 
        switch (context)
        {
            case GanttViewPrintElementContext.SummaryTaskElement:
                PointF[] summaryPoints = new PointF[5];
                summaryPoints[0] = rect.Location;
                summaryPoints[1] = new PointF(rect.X, rect.Y + rect.Height / 4f);
                summaryPoints[2] = new PointF(rect.Right - 3, rect.Y + rect.Height / 4f);
                summaryPoints[3] = new PointF(rect.Right, rect.Y + rect.Height / 2f);
                summaryPoints[4] = new PointF(rect.Right, rect.Y);
 
                return summaryPoints;
            case GanttViewPrintElementContext.MilestoneElement:
                PointF[] milestonePoints = new PointF[4];
                milestonePoints[0] = new PointF(rect.X, rect.Y);
                milestonePoints[1] = new PointF(rect.X + rect.Height / 2f, rect.Y + rect.Height / 2f);
                milestonePoints[2] = new PointF(rect.X, rect.Y + rect.Height);
                milestonePoints[3] = new PointF(rect.X - rect.Height / 2f, rect.Y + rect.Height / 2f);
 
                return milestonePoints;
            default:
                return null;
        }
    }
 
    private bool shouldPaintStartCap;
    protected override RectangleF GetPrintRectangle(GanttViewDataItem item, int index)
    {
        if (index < 0)
        {
            return RectangleF.Empty;
        }
 
        float x = (float)((item.Start - this.GanttViewElement.GraphicalViewElement.TimelineBehavior.AdjustedTimelineStart).TotalSeconds / this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);
        this.shouldPaintStartCap = x > 0 ? true : false;
        x = Math.Max(x, 0);
 
        float y = index * (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing) + this.GanttViewElement.HeaderHeight;
        float width = (float)((item.End - item.Start).TotalSeconds / (float)this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);
 
        return new RectangleF(x, y, width, (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing));
    }
}

I am also attaching a short video showing the result on my end after applying the workaround.

I hope this helps. Should you have further questions please do not hesitate to write back.

Regards,
Hristo
Progress Telerik
Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
0
Hristo
Telerik team
answered on 08 Sep 2017, 01:55 PM
Hello Gipsy,

Thank you for writing.

Indeed the reported behavior is an issue and I have logged it in our feedback portal, here: FIX. RadGanttView - the timeline items are not correctly printed if the GraphicalViewElement.TimelineStart property is set to a value inside the range of the timeline items. I have also updated your Telerik points. Additionally, you can subscribe to the item and be updated with all of its status changes.

Until we permanently fix the issue you will need to create a custom RadGanttView control and override the logic responsible for painting the timeline items: 
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
    public RadForm1()
    {
        InitializeComponent();
 
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 9);
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineEnd = new DateTime(2010, 12, 10);
 
        //setup data items
        GanttViewDataItem item1 = new GanttViewDataItem();
        item1.Start = new DateTime(2010, 10, 10);
        item1.End = new DateTime(2010, 10, 15);
        item1.Progress = 30m;
        item1.Title = "Summary task.1. title";
 
        GanttViewDataItem subitem11 = new GanttViewDataItem();
        subitem11.Start = new DateTime(2010, 10, 10);
        subitem11.End = new DateTime(2010, 10, 12);
        subitem11.Progress = 10m;
        subitem11.Title = "Sub-task.1.1 title";
 
        GanttViewDataItem subitem12 = new GanttViewDataItem();
        subitem12.Start = new DateTime(2010, 10, 12);
        subitem12.End = new DateTime(2010, 10, 15);
        subitem12.Progress = 20m;
        subitem12.Title = "Sub-task.1.2 title";
 
        //add subitems
        item1.Items.Add(subitem11);
        item1.Items.Add(subitem12);
 
        this.radGanttView1.Items.Add(item1);
 
        GanttViewDataItem item2 = new GanttViewDataItem();
        item2.Start = new DateTime(2010, 10, 12);
        item2.End = new DateTime(2010, 10, 18);
        item2.Progress = 40m;
        item2.Title = "Summary task.2. title";
 
        GanttViewDataItem subitem21 = new GanttViewDataItem();
        subitem21.Start = new DateTime(2010, 10, 12);
        subitem21.End = new DateTime(2010, 10, 13);
        subitem21.Progress = 10m;
        subitem21.Title = "Sub-task.2.1 title";
 
        GanttViewDataItem subitem22 = new GanttViewDataItem();
        subitem22.Start = new DateTime(2010, 10, 13);
        subitem22.End = new DateTime(2010, 10, 18);
        subitem22.Progress = 30m;
        subitem22.Title = "Sub-task.2.2 title";
 
        GanttViewDataItem subitem23 = new GanttViewDataItem();
        subitem23.Start = new DateTime(2010, 10, 18);
        subitem23.End = new DateTime(2010, 10, 18);
        subitem23.Title = "Sub-task.2.3 title";
 
        //add subitems
        item2.Items.Add(subitem21);
        item2.Items.Add(subitem22);
        item2.Items.Add(subitem23);
 
        this.radGanttView1.Items.Add(item2);
 
        //add links between items
        GanttViewLinkDataItem link1 = new GanttViewLinkDataItem();
        link1.StartItem = subitem11;
        link1.EndItem = subitem12;
        link1.LinkType = TasksLinkType.FinishToStart;
        this.radGanttView1.Links.Add(link1);
 
        GanttViewLinkDataItem link2 = new GanttViewLinkDataItem();
        link2.StartItem = subitem21;
        link2.EndItem = subitem22;
        link2.LinkType = TasksLinkType.StartToStart;
        this.radGanttView1.Links.Add(link2);
 
        GanttViewLinkDataItem link3 = new GanttViewLinkDataItem();
        link3.StartItem = subitem22;
        link3.EndItem = subitem23;
        link3.LinkType = TasksLinkType.FinishToStart;
        this.radGanttView1.Links.Add(link3);
 
        GanttViewTextViewColumn titleColumn = new GanttViewTextViewColumn("Title");
        GanttViewTextViewColumn startColumn = new GanttViewTextViewColumn("Start");
        GanttViewTextViewColumn endColumn = new GanttViewTextViewColumn("End");
 
        this.radGanttView1.GanttViewElement.Columns.Add(titleColumn);
        this.radGanttView1.GanttViewElement.Columns.Add(startColumn);
        this.radGanttView1.GanttViewElement.Columns.Add(endColumn);
 
        this.radGanttView1.GanttViewElement.GraphicalViewElement.TimelineStart = new DateTime(2010, 10, 13);
    }
 
    private void radButton1_Click(object sender, EventArgs e)
    {
        RadPrintDocument doc = new RadPrintDocument();
        doc.Landscape = true;
        RadPrintPreviewDialog dialog = new RadPrintPreviewDialog();
        doc.AssociatedObject = this.radGanttView1;
        dialog.Document = doc;
        dialog.ShowDialog();
    }
}
 
public class MyRadGanttView : RadGanttView
{
    public override string ThemeClassName
    {
        get
        {
            return typeof(RadGanttView).FullName;
        }
    }
 
    protected override PointF[] GetElementShape(GanttViewPrintElementContext context, RectangleF rect)
    {
        if (shouldPaintStartCap)
        {
            return base.GetElementShape(context, rect);
        }
 
        switch (context)
        {
            case GanttViewPrintElementContext.SummaryTaskElement:
                PointF[] summaryPoints = new PointF[5];
                summaryPoints[0] = rect.Location;
                summaryPoints[1] = new PointF(rect.X, rect.Y + rect.Height / 4f);
                summaryPoints[2] = new PointF(rect.Right - 3, rect.Y + rect.Height / 4f);
                summaryPoints[3] = new PointF(rect.Right, rect.Y + rect.Height / 2f);
                summaryPoints[4] = new PointF(rect.Right, rect.Y);
 
                return summaryPoints;
            case GanttViewPrintElementContext.MilestoneElement:
                PointF[] milestonePoints = new PointF[4];
                milestonePoints[0] = new PointF(rect.X, rect.Y);
                milestonePoints[1] = new PointF(rect.X + rect.Height / 2f, rect.Y + rect.Height / 2f);
                milestonePoints[2] = new PointF(rect.X, rect.Y + rect.Height);
                milestonePoints[3] = new PointF(rect.X - rect.Height / 2f, rect.Y + rect.Height / 2f);
 
                return milestonePoints;
            default:
                return null;
        }
    }
 
    private bool shouldPaintStartCap;
    protected override RectangleF GetPrintRectangle(GanttViewDataItem item, int index)
    {
        if (index < 0)
        {
            return RectangleF.Empty;
        }
 
        float x = (float)((item.Start - this.GanttViewElement.GraphicalViewElement.TimelineBehavior.AdjustedTimelineStart).TotalSeconds / this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);
        this.shouldPaintStartCap = x > 0 ? true : false;
        x = Math.Max(x, 0);
 
        float y = index * (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing) + this.GanttViewElement.HeaderHeight;
        float width = (float)((item.End - item.Start).TotalSeconds / (float)this.GanttViewElement.GraphicalViewElement.OnePixelTime.TotalSeconds);
 
        return new RectangleF(x, y, width, (this.GanttViewElement.ItemHeight + this.GanttViewElement.ItemSpacing));
    }
}

I am also attaching a short video showing the result on my end after applying the workaround.

I hope this helps. Should you have further questions please do not hesitate to write back.

Regards,
Hristo
Progress Telerik
Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
0
gipsy
Top achievements
Rank 1
answered on 11 Sep 2017, 07:20 AM
Thanks alot, that's working!
Tags
GanttView
Asked by
gipsy
Top achievements
Rank 1
Answers by
Hristo
Telerik team
gipsy
Top achievements
Rank 1
Share this question
or