public static void AppendSlidesFromFile(this PowerPointProcessor target, string filePath)
        {
            if (!File.Exists(filePath))
            {
                return;
            }
            try
            {
                var thread = new Thread(delegate()
                {
                    var activeSlideIndex = target.GetActiveSlideIndex();
                    var presentation     = target.PowerPointObject.Presentations.Open(filePath, WithWindow: MsoTriState.msoFalse);
                    target.AppendSlide(presentation, -1, indexToPaste: activeSlideIndex);
                    presentation.Close();
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
            catch { }
        }
        public static void AppendCalendar(this PowerPointProcessor target, CalendarOutputData monthOutputData, Presentation destinationPresentation = null)
        {
            var presentationTemplatePath = BusinessObjects.Instance.OutputManager.GetCalendarFile(monthOutputData.ShowLogo, monthOutputData.DayOutput.Length);

            if (String.IsNullOrEmpty(presentationTemplatePath) || !File.Exists(presentationTemplatePath))
            {
                return;
            }
            try
            {
                var thread = new Thread(delegate()
                {
                    monthOutputData.PrepareDayLogoPaths();
                    var daysCount = monthOutputData.DayOutput.Length;
                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            if (shape.HasTextFrame == MsoTriState.msoTrue)
                            {
                                shape.TextFrame.TextRange.Font.Color.RGB = monthOutputData.SlideRGB;
                                shape.TextFrame.TextRange.Paragraphs().Font.Color.RGB = monthOutputData.SlideRGB;
                            }

                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                var shapeName = shape.Tags.Name(i).Trim();
                                switch (shapeName)
                                {
                                case "LOGO":
                                    if (!string.IsNullOrEmpty(monthOutputData.LogoFile))
                                    {
                                        var logoShape    = slide.Shapes.AddPicture(monthOutputData.LogoFile, MsoTriState.msoFalse, MsoTriState.msoCTrue, shape.Left, shape.Top, shape.Width, shape.Height);
                                        logoShape.Top    = shape.Top;
                                        logoShape.Left   = shape.Left;
                                        logoShape.Width  = shape.Width;
                                        logoShape.Height = shape.Height;
                                        if (SlideSettingsManager.Instance.SlideSettings.SlideSize.Orientation == SlideOrientationEnum.Portrait)
                                        {
                                            logoShape.Rotation = 90;
                                        }
                                    }
                                    shape.Visible = MsoTriState.msoFalse;
                                    break;

                                case "HEADERTAG":
                                    shape.TextFrame.TextRange.Text = monthOutputData.SlideTitle;
                                    break;

                                case "PREPAREDFOR":
                                    if (string.IsNullOrEmpty(monthOutputData.BusinessName) && string.IsNullOrEmpty(monthOutputData.DecisionMaker))
                                    {
                                        shape.Visible = MsoTriState.msoFalse;
                                    }
                                    else
                                    {
                                        shape.Visible = MsoTriState.msoCTrue;
                                    }
                                    break;

                                case "ADVORDEC1":
                                    if (string.IsNullOrEmpty(monthOutputData.BusinessName) && string.IsNullOrEmpty(monthOutputData.DecisionMaker))
                                    {
                                        shape.Visible = MsoTriState.msoFalse;
                                    }
                                    else
                                    {
                                        shape.Visible = MsoTriState.msoCTrue;
                                        if (string.IsNullOrEmpty(monthOutputData.BusinessName))
                                        {
                                            shape.TextFrame.TextRange.Text = monthOutputData.DecisionMaker;
                                        }
                                        else
                                        {
                                            shape.TextFrame.TextRange.Text = monthOutputData.BusinessName;
                                        }
                                    }
                                    break;

                                case "DECNAME2":
                                    if (string.IsNullOrEmpty(monthOutputData.DecisionMaker))
                                    {
                                        shape.Visible = MsoTriState.msoFalse;
                                    }
                                    else
                                    {
                                        shape.Visible = MsoTriState.msoCTrue;
                                        shape.TextFrame.TextRange.Text = monthOutputData.DecisionMaker;
                                    }
                                    break;

                                case "MONTHYEAR":
                                    shape.TextFrame.TextRange.Text = monthOutputData.MonthText;
                                    break;

                                case "COMMENTS":
                                    shape.TextFrame.TextRange.Text = monthOutputData.Comments;
                                    break;

                                case "TAGA":
                                    shape.TextFrame.TextRange.Text = monthOutputData.TagA;
                                    break;

                                case "TAGB":
                                    shape.TextFrame.TextRange.Text = monthOutputData.TagB;
                                    break;

                                case "TAGC":
                                    shape.TextFrame.TextRange.Text = monthOutputData.TagC;
                                    break;

                                case "TAGD":
                                    shape.TextFrame.TextRange.Text = monthOutputData.TagD;
                                    break;

                                case "DAY1":
                                case "1-1":
                                    if (daysCount > 0)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 1);
                                    }
                                    break;

                                case "DAY2":
                                case "2-1":
                                    if (daysCount > 1)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 2);
                                    }
                                    break;

                                case "DAY3":
                                case "3-1":
                                    if (daysCount > 2)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 3);
                                    }
                                    break;

                                case "DAY4":
                                case "4-1":
                                    if (daysCount > 3)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 4);
                                    }
                                    break;

                                case "DAY5":
                                case "5-1":
                                    if (daysCount > 4)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 5);
                                    }
                                    break;

                                case "DAY6":
                                case "6-1":
                                    if (daysCount > 5)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 6);
                                    }
                                    break;

                                case "DAY7":
                                case "7-1":
                                    if (daysCount > 6)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 7);
                                    }
                                    break;

                                case "DAY8":
                                case "8-1":
                                    if (daysCount > 7)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 8);
                                    }
                                    break;

                                case "DAY9":
                                case "9-1":
                                    if (daysCount > 8)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 9);
                                    }
                                    break;

                                case "DAY10":
                                case "10-1":
                                    if (daysCount > 9)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 10);
                                    }
                                    break;

                                case "DAY11":
                                case "11-1":
                                    if (daysCount > 10)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 11);
                                    }
                                    break;

                                case "DAY12":
                                case "12-1":
                                    if (daysCount > 11)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 12);
                                    }
                                    break;

                                case "DAY13":
                                case "13-1":
                                    if (daysCount > 12)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 13);
                                    }
                                    break;

                                case "DAY14":
                                case "14-1":
                                    if (daysCount > 13)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 14);
                                    }
                                    break;

                                case "DAY15":
                                case "15-1":
                                    if (daysCount > 14)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 15);
                                    }
                                    break;

                                case "DAY16":
                                case "16-1":
                                    if (daysCount > 15)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 16);
                                    }
                                    break;

                                case "DAY17":
                                case "17-1":
                                    if (daysCount > 16)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 17);
                                    }
                                    break;

                                case "DAY18":
                                case "18-1":
                                    if (daysCount > 17)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 18);
                                    }
                                    break;

                                case "DAY19":
                                case "19-1":
                                    if (daysCount > 18)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 19);
                                    }
                                    break;

                                case "DAY20":
                                case "20-1":
                                    if (daysCount > 19)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 20);
                                    }
                                    break;

                                case "DAY21":
                                case "21-1":
                                    if (daysCount > 20)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 21);
                                    }
                                    break;

                                case "DAY22":
                                case "22-1":
                                    if (daysCount > 21)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 22);
                                    }
                                    break;

                                case "DAY23":
                                case "23-1":
                                    if (daysCount > 22)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 23);
                                    }
                                    break;

                                case "DAY24":
                                case "24-1":
                                    if (daysCount > 23)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 24);
                                    }
                                    break;

                                case "DAY25":
                                case "25-1":
                                    if (daysCount > 24)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 25);
                                    }
                                    break;

                                case "DAY26":
                                case "26-1":
                                    if (daysCount > 25)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 26);
                                    }
                                    break;

                                case "DAY27":
                                case "27-1":
                                    if (daysCount > 26)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 27);
                                    }
                                    break;

                                case "DAY28":
                                case "28-1":
                                    if (daysCount > 27)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 28);
                                    }
                                    break;

                                case "DAY29":
                                case "29-1":
                                    if (daysCount > 28)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 29);
                                    }
                                    break;

                                case "DAY30":
                                case "30-1":
                                    if (daysCount > 29)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 30);
                                    }
                                    break;

                                case "DAY31":
                                case "31-1":
                                    if (daysCount > 30)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 31);
                                    }
                                    break;

                                case "DAY32":
                                    if (daysCount > 31)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 32);
                                    }
                                    break;

                                case "DAY33":
                                    if (daysCount > 32)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 33);
                                    }
                                    break;

                                case "DAY34":
                                    if (daysCount > 33)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 34);
                                    }
                                    break;

                                case "DAY35":
                                    if (daysCount > 34)
                                    {
                                        SetDayRecordTagValue(monthOutputData, slide, shape, 35);
                                    }
                                    break;
                                }
                            }
                        }
                        foreach (var note in monthOutputData.Notes)
                        {
                            Shape noteShape = null;
                            if (SlideSettingsManager.Instance.SlideSettings.SlideSize.Orientation == SlideOrientationEnum.Portrait)
                            {
                                noteShape = slide.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationVertical, note.Left, note.Top, note.StaticWidth, note.Bottom - note.Top);
                            }
                            else
                            {
                                noteShape = slide.Shapes.AddTextbox(MsoTextOrientation.msoTextOrientationHorizontal, note.Left, note.Top, note.Right - note.Left, note.StaticHeight);
                            }

                            noteShape.Fill.Visible = MsoTriState.msoTrue;
                            noteShape.Fill.Solid();
                            noteShape.Fill.ForeColor.RGB = Information.RGB(note.BackgroundColor.R, note.BackgroundColor.G, note.BackgroundColor.B);
                            noteShape.Fill.Transparency  = 0;

                            noteShape.Line.Visible = MsoTriState.msoTrue;
                            noteShape.Line.ForeColor.SchemeColor = PpColorSchemeIndex.ppForeground;
                            noteShape.Line.BackColor.RGB         = Information.RGB(0, 0, 0);

                            noteShape.Shadow.Visible = MsoTriState.msoTrue;
                            noteShape.Shadow.Type    = MsoShadowType.msoShadow14;

                            noteShape.TextFrame.TextRange.Font.Color.RGB = Information.RGB(note.ForeColor.R, note.ForeColor.G, note.ForeColor.B);
                            noteShape.TextFrame.TextRange.Font.Name      = "Calibri";
                            noteShape.TextFrame.TextRange.Font.Size      = 8;
                            note.Note.AddTextRange(noteShape.TextFrame.TextRange);
                        }
                    }

                    var backgroundFilePath = BusinessObjects.Instance.OutputManager.GetCalendarBackgroundFile(monthOutputData.SlideColor, monthOutputData.Parent.Date, monthOutputData.ShowBigDate);
                    if (!String.IsNullOrEmpty(backgroundFilePath) && File.Exists(backgroundFilePath))
                    {
                        var backgroundShape = presentation.SlideMaster.Shapes.AddPicture(backgroundFilePath, MsoTriState.msoFalse, MsoTriState.msoCTrue, 0, 0);
                        if (SlideSettingsManager.Instance.SlideSettings.SlideSize.Orientation == SlideOrientationEnum.Portrait)
                        {
                            backgroundShape.Height   = presentation.SlideMaster.Width;
                            backgroundShape.Width    = presentation.SlideMaster.Height;
                            backgroundShape.Top      = (presentation.SlideMaster.Height - backgroundShape.Height) / 2;
                            backgroundShape.Left     = (presentation.SlideMaster.Width - backgroundShape.Width) / 2;;
                            backgroundShape.Rotation = 90;
                        }
                        else
                        {
                            backgroundShape.Top  = (presentation.SlideMaster.Height - backgroundShape.Height) / 2;
                            backgroundShape.Left = (presentation.SlideMaster.Width - backgroundShape.Width) / 2;
                        }
                    }

                    presentation.SlideMaster.Design.Name = GetSlideMasterName(monthOutputData);
                    target.AppendSlide(presentation, -1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendDashboardTargetCustomers(this PowerPointProcessor target, ITargetCustomersOutputData outputData, Presentation destinationPresentation = null)
        {
            var presentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetTargetCustomersFile(String.Format(MasterWizardManager.TargetCustomersSlideTemplate, 1));

            if (!File.Exists(presentationTemplatePath))
            {
                return;
            }
            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                switch (shape.Tags.Name(i))
                                {
                                case "HEADER":
                                    shape.TextFrame.TextRange.Text = outputData.Title;
                                    break;

                                case "TEXTBOX0":
                                    shape.TextFrame.TextRange.Text = outputData.TargetDemo;
                                    break;

                                case "TEXTBOX1":
                                    shape.TextFrame.TextRange.Text = outputData.HHI;
                                    break;

                                case "TEXTBOX2":
                                    shape.TextFrame.TextRange.Text = outputData.Geography;
                                    break;
                                }
                            }
                        }
                    }
                    var selectedTheme = outputData.SelectedTheme;
                    if (selectedTheme != null)
                    {
                        presentation.ApplyTheme(selectedTheme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch { }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendOptions(this PowerPointProcessor target, IEnumerable <IOptionsSlideData> pages, Theme selectedTheme, bool pasteToSlideMaster, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    foreach (var page in pages)
                    {
                        var slideNumber = 0;
                        foreach (var pageDictionary in page.ReplacementsList)
                        {
                            var copyOfReplacementList    = new Dictionary <string, string>(pageDictionary);
                            var presentationTemplatePath = page.TemplateFilePath;
                            if (!File.Exists(presentationTemplatePath))
                            {
                                return;
                            }
                            var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                            var taggedSlide  = presentation.Slides.Count > 0 ? presentation.Slides[1] : null;

                            var logoShapes = new List <Shape>();
                            if (page.Logos != null && slideNumber < page.Logos.Length)
                            {
                                var slideLogos = page.Logos[slideNumber];
                                foreach (var shape in taggedSlide.Shapes.OfType <Shape>().Where(s => s.HasTable != MsoTriState.msoTrue))
                                {
                                    for (var i = 1; i <= shape.Tags.Count; i++)
                                    {
                                        var shapeTagName = shape.Tags.Name(i);
                                        for (var j = 0; j < slideLogos.Length; j++)
                                        {
                                            if (!shapeTagName.Equals(string.Format("STATIONLOGO{0}", j + 1)))
                                            {
                                                continue;
                                            }
                                            string fileName = slideLogos[j];
                                            if (!String.IsNullOrEmpty(fileName) && File.Exists(fileName))
                                            {
                                                var newShape = taggedSlide.Shapes.AddPicture(fileName, MsoTriState.msoFalse, MsoTriState.msoCTrue, shape.Left,
                                                                                             shape.Top, shape.Width, shape.Height);
                                                newShape.Top    = shape.Top;
                                                newShape.Left   = shape.Left;
                                                newShape.Width  = shape.Width;
                                                newShape.Height = shape.Height;
                                                logoShapes.Add(newShape);
                                            }
                                            shape.Visible = MsoTriState.msoFalse;
                                        }
                                    }
                                }
                            }

                            var tableContainer = taggedSlide.Shapes.OfType <Shape>().FirstOrDefault(s => s.HasTable == MsoTriState.msoTrue);
                            if (tableContainer == null)
                            {
                                return;
                            }
                            var tableWidth     = tableContainer.Width;
                            var table          = tableContainer.Table;
                            var tableRowsCount = table.Rows.Count;
                            for (var i = 1; i <= tableRowsCount; i++)
                            {
                                for (var j = 1; j <= table.Columns.Count; j++)
                                {
                                    var tableShape = table.Cell(i, j).Shape;
                                    if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                    {
                                        continue;
                                    }
                                    var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                    var key      = copyOfReplacementList.Keys.FirstOrDefault(k => k.Trim().ToLower().Equals(cellText.ToLower()));
                                    if (String.IsNullOrEmpty(key))
                                    {
                                        continue;
                                    }
                                    tableShape.TextFrame.TextRange.Text = copyOfReplacementList[key];
                                    copyOfReplacementList.Remove(key);
                                }
                            }

                            tableRowsCount = table.Rows.Count;
                            for (var i = tableRowsCount; i >= 1; i--)
                            {
                                for (var j = 1; j < 3; j++)
                                {
                                    var tableShape = table.Cell(i, j).Shape;
                                    if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                    {
                                        continue;
                                    }
                                    var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                    if (!cellText.Equals("Delete Row"))
                                    {
                                        continue;
                                    }
                                    table.Rows[i].Delete();
                                    break;
                                }
                            }

                            tableRowsCount = table.Rows.Count;
                            for (var i = 1; i <= tableRowsCount; i++)
                            {
                                for (var j = table.Columns.Count; j >= 1; j--)
                                {
                                    var tableShape = table.Cell(i, j).Shape;
                                    if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                    {
                                        continue;
                                    }
                                    var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                    while (cellText == "Merge")
                                    {
                                        var prevColumnIndex = j - 1;
                                        tableShape.TextFrame.TextRange.Text = String.Empty;
                                        if (prevColumnIndex >= table.Columns.Count)
                                        {
                                            break;
                                        }
                                        table.Cell(i, prevColumnIndex).Merge(table.Cell(i, j));

                                        tableShape = table.Cell(i, prevColumnIndex).Shape;
                                        if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                        {
                                            break;
                                        }
                                        tableShape.TextFrame.TextRange.ParagraphFormat.Alignment = PpParagraphAlignment.ppAlignLeft;
                                        cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                        if (cellText == "Merge")
                                        {
                                            j--;
                                        }
                                    }
                                }
                            }

                            var tableColumnsCount = table.Columns.Count;
                            if (page.ColumnWidths != null)
                            {
                                for (var i = 0; i < page.ColumnWidths.Length; i++)
                                {
                                    if ((i + 2) <= tableColumnsCount)
                                    {
                                        table.Columns[i + 2].Width = page.ColumnWidths[i] * 72.27f;
                                    }
                                }
                            }

                            tableColumnsCount = table.Columns.Count;
                            for (var i = tableColumnsCount - 1; i >= 0; i--)
                            {
                                var tableShape = table.Cell(4, i + 1).Shape;
                                if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                {
                                    continue;
                                }
                                var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                if (cellText.Equals("Delete Column"))
                                {
                                    table.Columns[i + 1].Delete();
                                }
                            }
                            tableContainer.Width = tableWidth;

                            if (pasteToSlideMaster)
                            {
                                var newSlide = presentation.Slides.Add(1, PpSlideLayout.ppLayoutBlank);
                                Design design;
                                if (selectedTheme != null)
                                {
                                    presentation.ApplyTheme(selectedTheme.GetThemePath());
                                    design      = presentation.Designs[presentation.Designs.Count];
                                    design.Name = DateTime.Now.ToString("MMddyy-hhmmsstt");
                                }
                                else
                                {
                                    design = presentation.Designs.Add(DateTime.Now.ToString("MMddyy-hhmmsstt"));
                                }
                                tableContainer.Copy();
                                design.SlideMaster.Shapes.Paste();
                                foreach (var logoShape in logoShapes)
                                {
                                    logoShape.Copy();
                                    design.SlideMaster.Shapes.Paste();
                                }

                                if (page.ContractSettings.IsConfigured)
                                {
                                    target.FillContractInfo(design, page.ContractSettings, BusinessObjects.Instance.OutputManager.ContractTemplateFolder);
                                }

                                newSlide.Design = design;
                            }
                            else
                            {
                                if (selectedTheme != null)
                                {
                                    presentation.ApplyTheme(selectedTheme.GetThemePath());
                                }

                                if (page.ContractSettings.IsConfigured)
                                {
                                    target.FillContractInfo(taggedSlide, page.ContractSettings, BusinessObjects.Instance.OutputManager.ContractTemplateFolder);
                                }
                            }
                            target.AppendSlide(presentation, 1, destinationPresentation);
                            presentation.Close();
                            slideNumber++;
                        }
                    }
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch
            {
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendDigitalSummary(this PowerPointProcessor target, IDigitalSummaryContainerControl digitalSummary, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var slidesCount = digitalSummary.OutputReplacementsLists.Count;
                    for (var k = 0; k < slidesCount; k++)
                    {
                        var presentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetOnlineSummaryFile();
                        if (!File.Exists(presentationTemplatePath))
                        {
                            continue;
                        }
                        var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                        foreach (Slide slide in presentation.Slides)
                        {
                            foreach (Shape shape in slide.Shapes)
                            {
                                if (shape.HasTable != MsoTriState.msoTrue)
                                {
                                    continue;
                                }
                                var table             = shape.Table;
                                var tableRowsCount    = table.Rows.Count;
                                var tableColumnsCount = table.Columns.Count;
                                for (var i = 1; i <= tableRowsCount; i++)
                                {
                                    for (var j = 1; j <= tableColumnsCount; j++)
                                    {
                                        var tableShape = table.Cell(i, j).Shape;
                                        if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                        {
                                            continue;
                                        }
                                        var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                        if (!digitalSummary.OutputReplacementsLists[k].ContainsKey(cellText))
                                        {
                                            continue;
                                        }
                                        tableShape.TextFrame.TextRange.Text = digitalSummary.OutputReplacementsLists[k][cellText];
                                        digitalSummary.OutputReplacementsLists[k].Remove(cellText);
                                    }
                                }

                                var deletedRows = 0;
                                for (var i = 1; i <= tableRowsCount; i++)
                                {
                                    var tableShape = table.Cell(i - deletedRows, 1).Shape;
                                    if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                    {
                                        continue;
                                    }
                                    var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                    if (!cellText.Equals("DeleteRow"))
                                    {
                                        continue;
                                    }
                                    table.Rows[i - deletedRows].Delete();
                                    deletedRows++;
                                }
                            }
                        }
                        var selectedTheme = digitalSummary.SelectedTheme;
                        if (selectedTheme != null)
                        {
                            presentation.ApplyTheme(selectedTheme.GetThemePath());
                        }
                        target.AppendSlide(presentation, -1, destinationPresentation);
                        presentation.Close();
                    }
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
            catch { }
            finally
            {
                MessageFilter.Revoke();
            }
        }
Ejemplo n.º 6
0
        public static void AppendDashboardCover(this PowerPointProcessor target, ICoverOutputData outputData, Presentation destinationPresentation = null)
        {
            var presentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetCoverFile();

            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                switch (shape.Tags.Name(i))
                                {
                                case "DATE_DATA0":
                                    shape.TextFrame.TextRange.Text = outputData.PresentationDate;
                                    break;

                                case "TITLE":
                                    shape.TextFrame.TextRange.Text = outputData.Title;
                                    break;

                                case "BUSINESS_NAME":
                                    shape.TextFrame.TextRange.Text = outputData.DecisionMaker;
                                    break;

                                case "DECISION_MAKER":
                                    shape.TextFrame.TextRange.Text = outputData.Advertiser;
                                    break;

                                case "QUOTE":
                                    shape.TextFrame.TextRange.Text = outputData.Quote;
                                    break;

                                case "SALESPERSON_NAME":
                                    shape.TextFrame.TextRange.Text = outputData.SalesRep;
                                    break;
                                }
                            }
                        }
                    }
                    var selectedTheme = outputData.SelectedTheme;
                    if (selectedTheme != null)
                    {
                        presentation.ApplyTheme(selectedTheme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation, outputData.AddAsPageOne);
                    presentation.Close();
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch { }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendSolutionCommonSlide(this PowerPointProcessor target, OutputDataPackage dataPackage, Presentation destinationPresentation = null)
        {
            var presentationTemplatePath = dataPackage.TemplateName;

            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        var backgroundClipartShapes = new List <Shape>();
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (var i = 1; i <= shape.Tags.Count; i++)
                            {
                                var tagName = shape.Tags.Name(i);
                                if (tagName.ToUpper().Contains("CLIPART"))
                                {
                                    if (dataPackage.ClipartItems.ContainsKey(tagName.ToUpper()))
                                    {
                                        var clipartObject = dataPackage.ClipartItems[tagName.ToUpper()];
                                        var newShape      = slide.Shapes.AddClipartObject(clipartObject, shape);
                                        if (newShape != null && clipartObject.OutputBackground)
                                        {
                                            backgroundClipartShapes.Add(newShape);
                                        }
                                    }
                                    shape.Visible = MsoTriState.msoFalse;
                                }
                                else if (tagName.ToUpper().Contains("CHART"))
                                {
                                    if (dataPackage.ChartItems.ContainsKey(tagName.ToUpper()))
                                    {
                                        shape.UpdateChartData(dataPackage.ChartItems[tagName.ToUpper()]);
                                    }
                                }
                                else if (shape.TextFrame.HasText != MsoTriState.msoFalse)
                                {
                                    if (dataPackage.TextItems.ContainsKey(tagName.ToUpper()))
                                    {
                                        shape.TextFrame.TextRange.Text = dataPackage.TextItems[tagName.ToUpper()] ?? String.Empty;
                                    }
                                    else
                                    {
                                        shape.Visible = MsoTriState.msoFalse;
                                    }
                                }
                            }
                        }

                        var tableContainer = slide.Shapes.OfType <Shape>().FirstOrDefault(s => s.HasTable == MsoTriState.msoTrue);
                        tableContainer?.UpdateTableData(dataPackage.TableItems, dataPackage.TableWithHeader);

                        if (!String.IsNullOrEmpty(dataPackage.LayoutName))
                        {
                            foreach (CustomLayout customLayout in slide.Design.SlideMaster.CustomLayouts)
                            {
                                if (!String.Equals(dataPackage.LayoutName, customLayout.Name, StringComparison.OrdinalIgnoreCase))
                                {
                                    continue;
                                }

                                slide.CustomLayout = customLayout;
                                break;
                            }
                        }

                        foreach (var clipartShape in backgroundClipartShapes)
                        {
                            clipartShape.ZOrder(MsoZOrderCmd.msoSendToBack);
                        }
                    }

                    var selectedTheme = dataPackage.Theme;
                    if (selectedTheme != null)
                    {
                        presentation.ApplyTheme(selectedTheme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation, dataPackage.AddAsFirtsPage);
                    presentation.Close();
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch { }
            finally
            {
                MessageFilter.Revoke();
            }
        }
Ejemplo n.º 8
0
        public static void AppendOneSheet(this PowerPointProcessor target, DigitalProduct source, Theme theme, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    var presentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetOnlineOneSheetFile(source.OutputData.GetSlideSource());
                    if (string.IsNullOrEmpty(presentationTemplatePath))
                    {
                        return;
                    }
                    if (!File.Exists(presentationTemplatePath))
                    {
                        return;
                    }

                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                switch (shape.Tags.Name(i))
                                {
                                    #region Top Part
                                case "HEADER":
                                    shape.TextFrame.TextRange.Text = String.Format(source.OutputData.Header, shape.TextFrame.TextRange.Text);
                                    break;

                                case "WEBSITEURL":
                                    shape.TextFrame.TextRange.Text = source.OutputData.Websites;
                                    break;

                                case "DATETAG":
                                    shape.TextFrame.TextRange.Text = source.OutputData.PresentationDate;
                                    break;

                                case "ADVERTISER":
                                    shape.TextFrame.TextRange.Text = source.OutputData.BusinessName;
                                    break;

                                case "DECMKR":
                                    shape.TextFrame.TextRange.Text = source.OutputData.DecisionMaker;
                                    break;

                                case "CAMPVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.FlightDates;
                                    break;

                                case "WEBPRODUCT":
                                    shape.TextFrame.TextRange.Text = source.OutputData.ProductName;
                                    break;

                                case "WEBDESCRIPT":
                                    shape.TextFrame.TextRange.Text = source.OutputData.Description;
                                    break;
                                    #endregion

                                case "MTHIMPLABEL":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Any() ? source.OutputData.MonthlyData.ElementAt(0).Name : String.Empty;
                                    break;

                                case "MONTHLYIMPVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Any() ? source.OutputData.MonthlyData.ElementAt(0).Code : String.Empty;
                                    break;

                                case "MONTHINVLBL":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Count() > 1 ? source.OutputData.MonthlyData.ElementAt(1).Name : String.Empty;
                                    break;

                                case "MONTHINVVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Count() > 1 ? source.OutputData.MonthlyData.ElementAt(1).Code : String.Empty;
                                    break;

                                case "MCPM":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Count() > 2 ? source.OutputData.MonthlyData.ElementAt(2).Name : String.Empty;
                                    break;

                                case "MCPMVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.MonthlyData.Count() > 2 ? source.OutputData.MonthlyData.ElementAt(2).Code : String.Empty;
                                    break;

                                case "TTLIMPLABEL":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Any() ? source.OutputData.TotalData.ElementAt(0).Name : String.Empty;
                                    break;

                                case "TOTALIMPVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Any() ? source.OutputData.TotalData.ElementAt(0).Code : String.Empty;
                                    break;

                                case "TOTINVLBL":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Count() > 1 ? source.OutputData.TotalData.ElementAt(1).Name : String.Empty;
                                    break;

                                case "TOTINVVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Count() > 1 ? source.OutputData.TotalData.ElementAt(1).Code : String.Empty;
                                    break;

                                case "TCPM":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Count() > 2 ? source.OutputData.TotalData.ElementAt(2).Name : String.Empty;
                                    break;

                                case "TCPMVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.TotalData.Count() > 2 ? source.OutputData.TotalData.ElementAt(2).Code : String.Empty;
                                    break;

                                case "INVDET":
                                    shape.TextFrame.TextRange.Text = source.OutputData.InvestmentDetails;;
                                    break;

                                case "CMNTVALUE":
                                    shape.TextFrame.TextRange.Text = source.OutputData.Comment;;
                                    break;
                                }
                            }
                        }
                    }
                    if (theme != null)
                    {
                        presentation.ApplyTheme(theme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch
            {
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        private static void AppendTableSummary(this PowerPointProcessor target, ISummaryControl summary, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var slidesCount = summary.OutputReplacementsLists.Count;
                    for (var k = 0; k < slidesCount; k++)
                    {
                        var presentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetSimpleSummaryTableFile(String.Format(MasterWizardManager.SimpleSummaryTableTemplate, summary.ItemsPerTable));
                        if (!File.Exists(presentationTemplatePath))
                        {
                            continue;
                        }
                        var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                        foreach (Slide slide in presentation.Slides)
                        {
                            foreach (Shape shape in slide.Shapes)
                            {
                                for (var i = 1; i <= shape.Tags.Count; i++)
                                {
                                    switch (shape.Tags.Name(i))
                                    {
                                    case "HEADER":
                                        shape.TextFrame.TextRange.Text = summary.Title;
                                        break;

                                    case "SUMMARYDATA":
                                        shape.TextFrame.TextRange.Text = summary.SummaryData;
                                        break;

                                    default:
                                        var startIndex = k * summary.ItemsPerTable;
                                        for (var j = 0; j < summary.ItemsPerTable; j++)
                                        {
                                            if (shape.Tags.Name(i).Equals(String.Format("ICON{0}", j + 1)))
                                            {
                                                if (summary.ShowIcons &&
                                                    (j + startIndex) < summary.ItemsCount &&
                                                    !String.IsNullOrEmpty(summary.TableIcons[j + startIndex]))
                                                {
                                                    var filePath    = MasterWizardManager.Instance.SelectedWizard.GetSimpleSummaryIconFile(summary.TableIcons[j + startIndex]);
                                                    var newShape    = slide.Shapes.AddPicture(filePath, MsoTriState.msoFalse, MsoTriState.msoCTrue, shape.Left, shape.Top, shape.Width, shape.Height);
                                                    newShape.Top    = shape.Top;
                                                    newShape.Left   = shape.Left;
                                                    newShape.Width  = shape.Width;
                                                    newShape.Height = shape.Height;
                                                }
                                                shape.Visible = MsoTriState.msoFalse;
                                            }
                                        }
                                        break;
                                    }
                                }
                                if (shape.HasTable != MsoTriState.msoTrue)
                                {
                                    continue;
                                }
                                var table             = shape.Table;
                                var tableRowsCount    = table.Rows.Count;
                                var tableColumnsCount = table.Columns.Count;
                                for (var i = 1; i <= tableRowsCount; i++)
                                {
                                    for (var j = 1; j <= tableColumnsCount; j++)
                                    {
                                        if (j > table.Columns.Count)
                                        {
                                            continue;
                                        }
                                        var tableShape = table.Cell(i, j).Shape;
                                        if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                        {
                                            continue;
                                        }
                                        var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                        if (!cellText.Contains("Product") || summary.ShowIcons)
                                        {
                                            continue;
                                        }
                                        var prevColumnIndex = j - 1;
                                        if (prevColumnIndex < 1)
                                        {
                                            continue;
                                        }
                                        table.Cell(i, j).Merge(table.Cell(i, prevColumnIndex));
                                    }
                                }

                                tableRowsCount    = table.Rows.Count;
                                tableColumnsCount = table.Columns.Count;
                                for (var i = 1; i <= tableRowsCount; i++)
                                {
                                    for (var j = 1; j <= tableColumnsCount; j++)
                                    {
                                        var tableShape = table.Cell(i, j).Shape;
                                        if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                        {
                                            continue;
                                        }
                                        var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                        if (!summary.OutputReplacementsLists[k].ContainsKey(cellText))
                                        {
                                            continue;
                                        }
                                        tableShape.TextFrame.TextRange.Text = summary.OutputReplacementsLists[k][cellText];
                                        summary.OutputReplacementsLists[k].Remove(cellText);
                                    }
                                }

                                for (var i = tableRowsCount; i >= 1; i--)
                                {
                                    var tableShape = table.Cell(i, 1).Shape;
                                    if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                                    {
                                        continue;
                                    }
                                    var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                                    if (!cellText.Equals("DeleteRow"))
                                    {
                                        continue;
                                    }
                                    try { table.Rows[i].Delete(); }
                                    catch { shape.Visible = MsoTriState.msoFalse; }
                                }
                            }
                        }
                        var selectedTheme = summary.SelectedTheme;
                        if (selectedTheme != null)
                        {
                            presentation.ApplyTheme(selectedTheme.GetThemePath());
                        }
                        target.AppendSlide(presentation, -1, destinationPresentation);
                        presentation.Close();
                    }
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
            catch { }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        private static void AppendSlideSummary(this PowerPointProcessor target, ISummaryControl summary, Presentation destinationPresentation = null)
        {
            var itemsCount            = summary.ItemsCount;
            var mainFileTemplateIndex = itemsCount >= SummaryConstants.MaxOneSheetItems ? SummaryConstants.MaxOneSheetItems : itemsCount;

            var additionalFileTemplateIndex = itemsCount > SummaryConstants.MaxOneSheetItems ? itemsCount % SummaryConstants.MaxOneSheetItems : 0;

            var mainFilesCount = itemsCount / SummaryConstants.MaxOneSheetItems;

            if (mainFilesCount == 0 && itemsCount > 0)
            {
                mainFilesCount++;
            }

            try
            {
                var thread = new Thread(delegate()
                {
                    var mainPresentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetSimpleSummaryTemlateFile(String.Format(MasterWizardManager.SimpleSummarySlideTemplate, mainFileTemplateIndex));
                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(mainPresentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    for (int j = 0; j < (itemsCount - additionalFileTemplateIndex); j += mainFileTemplateIndex)
                    {
                        foreach (Slide slide in presentation.Slides)
                        {
                            foreach (Shape shape in slide.Shapes)
                            {
                                for (int i = 1; i <= shape.Tags.Count; i++)
                                {
                                    switch (shape.Tags.Name(i))
                                    {
                                    case "HEADER":
                                        shape.TextFrame.TextRange.Text = summary.Title;
                                        break;

                                    case "SUMMARYDATA":
                                        shape.TextFrame.TextRange.Text = summary.SummaryData;
                                        break;

                                    case "MNTHLY1":
                                        shape.Visible = summary.ShowMonthlyHeader && summary.ShowTotalHeader ? MsoTriState.msoTrue : MsoTriState.msoFalse;
                                        shape.TextFrame.TextRange.Text = String.Format("Monthly{0}Investment", (char)13);
                                        break;

                                    case "TOTAL2":
                                        if ((summary.ShowMonthlyHeader && summary.ShowTotalHeader) || summary.ShowTotalHeader)
                                        {
                                            shape.TextFrame.TextRange.Text = "Total Investment";
                                        }
                                        else if (summary.ShowMonthlyHeader)
                                        {
                                            shape.TextFrame.TextRange.Text = "Monthly Investment";
                                        }
                                        else
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                        }
                                        break;

                                    default:
                                        for (int k = 0; k < mainFileTemplateIndex; k++)
                                        {
                                            if (shape.Tags.Name(i).Equals(string.Format("SHAPE{0}", k)))
                                            {
                                                shape.Visible = MsoTriState.msoFalse;
                                                if (summary.ItemTitles == null)
                                                {
                                                    continue;
                                                }
                                                if ((j + k) < itemsCount)
                                                {
                                                    if (!string.IsNullOrEmpty(summary.ItemTitles[j + k]))
                                                    {
                                                        shape.Visible = MsoTriState.msoTrue;
                                                    }
                                                }
                                            }
                                            else if (shape.Tags.Name(i).Equals(string.Format("SUBHEADER{0}", k)))
                                            {
                                                shape.Visible = MsoTriState.msoFalse;
                                                if (summary.ItemTitles == null)
                                                {
                                                    continue;
                                                }
                                                if ((j + k) >= itemsCount)
                                                {
                                                    continue;
                                                }
                                                shape.TextFrame.TextRange.Text = summary.ItemTitles[j + k];
                                                shape.Visible = MsoTriState.msoTrue;
                                            }
                                            else if (shape.Tags.Name(i).Equals(string.Format("SELECT{0}", k)))
                                            {
                                                shape.Visible = MsoTriState.msoFalse;
                                                if (summary.ItemDetails == null)
                                                {
                                                    continue;
                                                }
                                                if ((j + k) >= itemsCount)
                                                {
                                                    continue;
                                                }
                                                shape.TextFrame.TextRange.Text = summary.ItemDetails[j + k];
                                                shape.Visible = MsoTriState.msoTrue;
                                            }
                                            else if (shape.Tags.Name(i).Equals(string.Format("TINVEST{0}", k)))
                                            {
                                                shape.Visible = MsoTriState.msoFalse;
                                                if (summary.MonthlyValues == null)
                                                {
                                                    continue;
                                                }
                                                if ((j + k) >= itemsCount)
                                                {
                                                    continue;
                                                }
                                                shape.TextFrame.TextRange.Text = summary.MonthlyValues[j + k];
                                                shape.Visible = MsoTriState.msoTrue;
                                            }
                                            else if (shape.Tags.Name(i).Equals(string.Format("MWINVEST{0}", k)))
                                            {
                                                shape.Visible = MsoTriState.msoFalse;
                                                if (summary.TotalValues == null)
                                                {
                                                    continue;
                                                }
                                                if ((j + k) >= itemsCount)
                                                {
                                                    continue;
                                                }
                                                shape.TextFrame.TextRange.Text = summary.TotalValues[j + k];
                                                shape.Visible = MsoTriState.msoTrue;
                                            }
                                        }
                                        break;
                                    }
                                }
                            }

                            if (summary.ContractSettings.IsConfigured &&
                                summary.ContractTemplateFolder != null &&
                                summary.ContractTemplateFolder.ExistsLocal())
                            {
                                target.FillContractInfo(slide, summary.ContractSettings, summary.ContractTemplateFolder);
                            }
                        }
                        var selectedTheme = summary.SelectedTheme;
                        if (selectedTheme != null)
                        {
                            presentation.ApplyTheme(selectedTheme.GetThemePath());
                        }
                        target.AppendSlide(presentation, -1, destinationPresentation);
                    }
                    presentation.Close();
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
            finally
            {
                MessageFilter.Revoke();
            }

            if (additionalFileTemplateIndex == 0)
            {
                return;
            }
            try
            {
                var thread = new Thread(delegate()
                {
                    var additionalPresentationTemplatePath = MasterWizardManager.Instance.SelectedWizard.GetSimpleSummaryTemlateFile(String.Format(MasterWizardManager.SimpleSummarySlideTemplate, (additionalFileTemplateIndex + mainFileTemplateIndex)));

                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(additionalPresentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                switch (shape.Tags.Name(i))
                                {
                                case "HEADER":
                                    shape.TextFrame.TextRange.Text = summary.Title;
                                    break;

                                case "SUMMARYDATA":
                                    shape.TextFrame.TextRange.Text = summary.SummaryData;
                                    break;

                                case "MNTHLY1":
                                    shape.Visible = summary.ShowMonthlyHeader && summary.ShowTotalHeader ? MsoTriState.msoTrue : MsoTriState.msoFalse;
                                    shape.TextFrame.TextRange.Text = String.Format("Monthly{0}Investment", (char)13);
                                    break;

                                case "TOTAL2":
                                    if ((summary.ShowMonthlyHeader && summary.ShowTotalHeader) || summary.ShowTotalHeader)
                                    {
                                        shape.TextFrame.TextRange.Text = "Total Investment";
                                    }
                                    else if (summary.ShowMonthlyHeader)
                                    {
                                        shape.TextFrame.TextRange.Text = "Monthly Investment";
                                    }
                                    else
                                    {
                                        shape.Visible = MsoTriState.msoFalse;
                                    }
                                    break;

                                default:
                                    int j = mainFileTemplateIndex * mainFilesCount;
                                    for (int k = 0; k < additionalFileTemplateIndex; k++)
                                    {
                                        if (shape.Tags.Name(i).Equals(string.Format("SHAPE{0}", k)))
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                            if (summary.ItemTitles == null)
                                            {
                                                continue;
                                            }
                                            if ((j + k) < itemsCount)
                                            {
                                                if (!string.IsNullOrEmpty(summary.ItemTitles[j + k]))
                                                {
                                                    shape.Visible = MsoTriState.msoTrue;
                                                }
                                            }
                                        }
                                        else if (shape.Tags.Name(i).Equals(string.Format("SUBHEADER{0}", k)))
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                            if (summary.ItemTitles == null)
                                            {
                                                continue;
                                            }
                                            if ((j + k) >= itemsCount)
                                            {
                                                continue;
                                            }
                                            shape.TextFrame.TextRange.Text = summary.ItemTitles[j + k];
                                            shape.Visible = MsoTriState.msoTrue;
                                        }
                                        else if (shape.Tags.Name(i).Equals(string.Format("SELECT{0}", k)))
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                            if (summary.ItemDetails == null)
                                            {
                                                continue;
                                            }
                                            if ((j + k) >= itemsCount)
                                            {
                                                continue;
                                            }
                                            shape.TextFrame.TextRange.Text = summary.ItemDetails[j + k];
                                            shape.Visible = MsoTriState.msoTrue;
                                        }
                                        else if (shape.Tags.Name(i).Equals(string.Format("TINVEST{0}", k)))
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                            if (summary.MonthlyValues == null)
                                            {
                                                continue;
                                            }
                                            if ((j + k) >= itemsCount)
                                            {
                                                continue;
                                            }
                                            shape.TextFrame.TextRange.Text = summary.MonthlyValues[j + k];
                                            shape.Visible = MsoTriState.msoTrue;
                                        }
                                        else if (shape.Tags.Name(i).Equals(string.Format("MWINVEST{0}", k)))
                                        {
                                            shape.Visible = MsoTriState.msoFalse;
                                            if (summary.TotalValues == null)
                                            {
                                                continue;
                                            }
                                            if ((j + k) >= itemsCount)
                                            {
                                                continue;
                                            }
                                            shape.TextFrame.TextRange.Text = summary.TotalValues[j + k];
                                            shape.Visible = MsoTriState.msoTrue;
                                        }
                                    }
                                    break;
                                }
                            }
                        }

                        if (summary.ContractSettings.IsConfigured &&
                            summary.ContractTemplateFolder != null &&
                            summary.ContractTemplateFolder.ExistsLocal())
                        {
                            target.FillContractInfo(slide, summary.ContractSettings, summary.ContractTemplateFolder);
                        }
                    }
                    var selectedTheme = summary.SelectedTheme;
                    if (selectedTheme != null)
                    {
                        presentation.ApplyTheme(selectedTheme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    System.Windows.Forms.Application.DoEvents();
                }
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendStrategy(this PowerPointProcessor target, DigitalInfoStrategyOutputModel source, Theme theme, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    var presentationTemplatePath = source.TemplatePath;
                    if (string.IsNullOrEmpty(presentationTemplatePath))
                    {
                        return;
                    }
                    if (!File.Exists(presentationTemplatePath))
                    {
                        return;
                    }

                    MessageFilter.Register();
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    foreach (Slide slide in presentation.Slides)
                    {
                        foreach (Shape shape in slide.Shapes)
                        {
                            for (int i = 1; i <= shape.Tags.Count; i++)
                            {
                                var shapeTagName = shape.Tags.Name(i);
                                switch (shapeTagName)
                                {
                                case "MONTHDIGINV":
                                    shape.TextFrame.TextRange.Text = source.Total2;
                                    break;

                                case "TOTALDIGINV":
                                    shape.TextFrame.TextRange.Text = source.Total1;
                                    break;

                                default:
                                    for (var j = 0; j < BaseDigitalInfoOneSheetOutputModel.MaxRecords; j++)
                                    {
                                        if (shapeTagName.Equals(String.Format("DIGITAL_GRAPHIC{0}", j + 1)))
                                        {
                                            var fileName = source.Logos.Length > j ? source.Logos[j] : String.Empty;
                                            if (!String.IsNullOrEmpty(fileName) && File.Exists(fileName))
                                            {
                                                var newShape = slide.Shapes.AddPicture(fileName, MsoTriState.msoFalse, MsoTriState.msoCTrue, shape.Left, shape.Top,
                                                                                       shape.Width, shape.Height);
                                                newShape.Top    = shape.Top;
                                                newShape.Left   = shape.Left;
                                                newShape.Width  = shape.Width;
                                                newShape.Height = shape.Height;
                                            }
                                            shape.Visible = MsoTriState.msoFalse;
                                        }
                                        if (shapeTagName.Equals(String.Format("DIGITAL_TAG{0}", j + 1)))
                                        {
                                            shape.TextFrame.TextRange.Text = source.Records.Count > j ? source.Records[j].Text1 : String.Empty;
                                        }
                                        if (shapeTagName.Equals(String.Format("DIGITAL_DETAILS{0}", j + 1)))
                                        {
                                            shape.TextFrame.TextRange.Text = source.Records.Count > j ? source.Records[j].Text2 : String.Empty;
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    if (theme != null)
                    {
                        presentation.ApplyTheme(theme.GetThemePath());
                    }
                    target.AppendSlide(presentation, -1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();

                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch
            {
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }
        public static void AppendDigitalOneSheet(this PowerPointProcessor target, StandaloneDigitalInfoOneSheetOutputModel dataModel, Theme selectedTheme, bool pasteToSlideMaster, Presentation destinationPresentation = null)
        {
            try
            {
                var thread = new Thread(delegate()
                {
                    MessageFilter.Register();
                    var copyOfReplacementList    = new Dictionary <string, string>(dataModel.ReplacementsList);
                    var presentationTemplatePath = dataModel.TemplateFilePath;
                    if (!File.Exists(presentationTemplatePath))
                    {
                        return;
                    }
                    var presentation = target.PowerPointObject.Presentations.Open(presentationTemplatePath, WithWindow: MsoTriState.msoFalse);
                    var taggedSlide  = presentation.Slides.Count > 0 ? presentation.Slides[1] : null;

                    var logoShapes = new List <Shape>();
                    foreach (var shape in taggedSlide.Shapes.OfType <Shape>().Where(s => s.HasTable != MsoTriState.msoTrue))
                    {
                        for (var i = 1; i <= shape.Tags.Count; i++)
                        {
                            var shapeTagName = shape.Tags.Name(i);
                            for (var j = 0; j < BaseDigitalInfoOneSheetOutputModel.MaxRecords; j++)
                            {
                                if (shapeTagName.Equals(String.Format("DIGLOGO{0}", j + 1)))
                                {
                                    var fileName = dataModel.Logos.Length > j ? dataModel.Logos[j] : String.Empty;
                                    if (!String.IsNullOrEmpty(fileName) && File.Exists(fileName))
                                    {
                                        var newShape = taggedSlide.Shapes.AddPicture(fileName, MsoTriState.msoFalse, MsoTriState.msoCTrue, shape.Left,
                                                                                     shape.Top, shape.Width, shape.Height);
                                        newShape.Top    = shape.Top;
                                        newShape.Left   = shape.Left;
                                        newShape.Width  = shape.Width;
                                        newShape.Height = shape.Height;
                                        logoShapes.Add(newShape);
                                    }
                                    shape.Visible = MsoTriState.msoFalse;
                                }
                            }
                        }
                    }

                    var tableContainer = taggedSlide.Shapes.Cast <Shape>().FirstOrDefault(s => s.HasTable == MsoTriState.msoTrue);
                    if (tableContainer == null)
                    {
                        return;
                    }
                    var table             = tableContainer.Table;
                    var tableRowsCount    = table.Rows.Count;
                    var tableColumnsCount = table.Columns.Count;
                    for (var i = 1; i <= tableRowsCount; i++)
                    {
                        for (var j = 1; j <= tableColumnsCount; j++)
                        {
                            var tableShape = table.Cell(i, j).Shape;
                            if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                            {
                                continue;
                            }
                            var cellText = tableShape.TextFrame.TextRange.Text.Replace(" ", "");
                            var key      = copyOfReplacementList.Keys.FirstOrDefault(k => k.Replace(" ", "").ToLower().Equals(cellText.ToLower()));
                            if (String.IsNullOrEmpty(key))
                            {
                                continue;
                            }
                            tableShape.TextFrame.TextRange.Text = copyOfReplacementList[key];
                            copyOfReplacementList.Remove(cellText);
                        }
                    }
                    tableColumnsCount = table.Columns.Count;
                    for (var i = tableColumnsCount; i >= 1; i--)
                    {
                        var tableShape = table.Cell(3, i).Shape;
                        if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                        {
                            continue;
                        }
                        var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                        if (!cellText.Equals("Delete Column"))
                        {
                            continue;
                        }
                        table.Columns[i].Delete();
                    }
                    tableRowsCount = table.Rows.Count;
                    for (var i = tableRowsCount; i >= 1; i--)
                    {
                        for (var j = 1; j < 3; j++)
                        {
                            var tableShape = table.Cell(i, j).Shape;
                            if (tableShape.HasTextFrame != MsoTriState.msoTrue)
                            {
                                continue;
                            }
                            var cellText = tableShape.TextFrame.TextRange.Text.Trim();
                            if (!cellText.Equals("Delete Row"))
                            {
                                continue;
                            }
                            table.Rows[i].Delete();
                            break;
                        }
                    }
                    if (pasteToSlideMaster)
                    {
                        var newSlide = presentation.Slides.Add(1, PpSlideLayout.ppLayoutBlank);
                        Design design;
                        if (selectedTheme != null)
                        {
                            presentation.ApplyTheme(selectedTheme.GetThemePath());
                            design      = presentation.Designs[presentation.Designs.Count];
                            design.Name = DateTime.Now.ToString("MMddyy-hhmmsstt");
                        }
                        else
                        {
                            design = presentation.Designs.Add(DateTime.Now.ToString("MMddyy-hhmmsstt"));
                        }
                        tableContainer.Copy();
                        design.SlideMaster.Shapes.Paste();
                        foreach (var logoShape in logoShapes)
                        {
                            logoShape.Copy();
                            design.SlideMaster.Shapes.Paste();
                        }

                        if (dataModel.ContractSettings.IsConfigured)
                        {
                            target.FillContractInfo(design, dataModel.ContractSettings, BusinessObjects.Instance.OutputManager.ContractTemplateFolder);
                        }

                        newSlide.Design = design;
                    }
                    else
                    {
                        if (selectedTheme != null)
                        {
                            presentation.ApplyTheme(selectedTheme.GetThemePath());
                        }

                        if (dataModel.ContractSettings.IsConfigured)
                        {
                            target.FillContractInfo(taggedSlide, dataModel.ContractSettings, BusinessObjects.Instance.OutputManager.ContractTemplateFolder);
                        }
                    }
                    target.AppendSlide(presentation, 1, destinationPresentation);
                    presentation.Close();
                });
                thread.Start();
                while (thread.IsAlive)
                {
                    Application.DoEvents();
                }
            }
            catch
            {
            }
            finally
            {
                MessageFilter.Revoke();
            }
        }