/// <summary> Executes the view sheet bookmark demo operation. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to manipulate it's bookmark. </param>
        ///
        /// <returns> true if it succeeds, false if it fails. </returns>
        private bool RunBookmarkViewSheetDemo(string sheetName)
        {
            var sheetIndex = ViewSheets.GetViewSheet(sheetName);

            if (sheetIndex == -1 && !this.ShowMessage($"{LocalizationStrings.CouldNotFindSheet} {sheetName}.", LocalizationStrings.Title, true))
            {
                return(false);
            }

            var hasBookmark = ViewSheets.SheetHasBookmark(sheetIndex);

            if (hasBookmark)
            {
                this.ShowMessage($"{sheetName} has an existing bookmark", LocalizationStrings.Title, true);
            }
            else
            {
                this.ShowMessage($"{LocalizationStrings.AddingBookmark} {sheetName}", LocalizationStrings.Title);
                if (!ViewSheets.SaveBookmark(sheetIndex))
                {
                    this.ShowMessage(LocalizationStrings.FailedToSaveBookmark, LocalizationStrings.Title);
                    return(false);
                }
            }

            this.ShowMessage($"Deleting a bookmark from {sheetName}", LocalizationStrings.Title);
            if (!ViewSheets.DeleteBookmark(sheetIndex))
            {
                this.ShowMessage(LocalizationStrings.FailedToDeleteBookmark, LocalizationStrings.Title);
                return(false);
            }

            return(true);
        }
        /// <summary> Executes the "active" view sheet demo operation. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to set as the active sheet. </param>
        ///
        /// <returns> true if it succeeds, false if it fails. </returns>
        private bool RunActiveViewSheetDemo(string sheetName)
        {
            // We use 'sheetIndex" later on to set the *active* sheet.
            var sheetIndex = ViewSheets.GetViewSheet(sheetName);

            if (sheetIndex == -1 && !this.ShowMessage($"Could not find sheet {sheetName}.", LocalizationStrings.Title, true))
            {
                return(false);
            }

            // If ViewSheets are enabled, this should not fail!
            // Get the current active sheet
            var currentSheetIndex = ViewSheets.GetActiveViewSheet();

            // Get the name of the *active* sheet
            var currentSheetName = ViewSheets.GetViewSheetName(currentSheetIndex);

            this.ShowMessage($"{currentSheetName} at sheet index {currentSheetIndex} is the current active sheet.", LocalizationStrings.Title);

            // Now set the requested sheet to be the *active* sheet.
            if (ViewSheets.SetActiveViewSheet(sheetIndex))
            {
                this.ShowMessage($"{sheetName} at sheet index {sheetIndex} is the new active sheet.", LocalizationStrings.Title);
            }

            return(true);
        }
        /// <summary> Executes the create view sheet demo operation. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to create. </param>
        ///
        /// <returns> true if it succeeds, false if it fails. </returns>
        private bool RunCreateViewSheetDemo(string sheetName)
        {
            this.ShowMessage(LocalizationStrings.CreateViewSheets, LocalizationStrings.Title);

            // Now we'll create some new ViewSheets...
            // First a ViewSheet with a system generated name.
            // If ViewSheets are enabled, this really shouldn't fail.
            if (ViewSheets.CreateViewSheet())
            {
                // Now a ViewSheet with a name of our choosing.
                // If we specify an invalid name (e.g. one that's already used) this could return false.
                var result = ViewSheets.CreateViewSheet(sheetName);
                if (!result && !this.ShowMessage(LocalizationStrings.FailedCreateViewSheet, LocalizationStrings.Title, true))
                {
                    return(false);
                }

                // Now we'll determine the sheetIndex of the "named" ViewSheet in the sheet list.
                var sheetIndex = ViewSheets.GetViewSheet(sheetName);
                if (sheetIndex == -1 && !this.ShowMessage("Retrieving a sheet named '" + sheetName + "' failed!", LocalizationStrings.Title, true))
                {
                    return(false);
                }

                // Now we'll create another sheet with a system generated name and then rename it.
                // This will demonstrate the RenameViewSheet method.
                if (ViewSheets.CreateViewSheet())
                {
                    // New sheets are added to the end of the (zero-based) list, so we can determine it's sheetIndex this way.
                    sheetIndex = ViewSheets.GetSheetCount() - 1;
                    var oldName = ViewSheets.GetViewSheetName(sheetIndex);
                    this.ShowMessage($"Now we'll rename the ViewSheet {oldName} we just created.", LocalizationStrings.Title);

                    result = ViewSheets.RenameViewSheet(sheetIndex, sheetName + " #2");
                    if (!result && !this.ShowMessage($"Renaming {oldName} to {sheetName} #2 failed", LocalizationStrings.Title, true))
                    {
                        return(false);
                    }

                    this.ShowMessage($"We've now added 3 new sheets to the list of {ViewSheets.GetSheetCount()} total sheets.", LocalizationStrings.Title);
                }
            }

            return(true);
        }
        /// <summary> Alter and update the ViewSheetData package on a view sheet. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to create. </param>
        ///
        /// <returns> true if it succeeds, false if it fails. </returns>
        private bool AlterViewSheetData(string sheetName)
        {
            var sheetIndex = ViewSheets.GetViewSheet(sheetName);

            if (string.IsNullOrEmpty(sheetName) && !this.ShowMessage($"Could not find a sheet named {sheetName}.",
                                                                     LocalizationStrings.Title,
                                                                     true))
            {
                return(false);
            }

            // Get the data package attached to the ViewSheet
            var data   = new ViewSheets.ViewSheetData();
            var result = ViewSheets.GetViewSheetData(sheetIndex, ref data);

            if (!result)
            {
                if (!this.ShowMessage($"An error occurred retrieving the data for sheet {sheetName} at sheet index {sheetIndex}.",
                                      LocalizationStrings.Title,
                                      true))
                {
                    return(false);
                }
            }

            // Now make some changes and push those back to Mastercam...
            data.WireframeColor     = 66;    // Change the wireframe color settings.
            data.ConstructionDepthZ = 0.25;  // Alter the construction depth.
            data.VisibleLevels.Add(101);     // Add a level to the level list for this sheet.

            // Update the sheet
            result = ViewSheets.SetViewSheetData(sheetIndex, data);
            if (!result)
            {
                if (!this.ShowMessage($"An error occurred updating the data for sheet {sheetName} at sheet index {sheetIndex}.",
                                      LocalizationStrings.Title,
                                      true))
                {
                    return(false);
                }
            }

            return(result);
        }
        /// <summary> Executes the copy view sheet demo operation. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to copy. </param>
        ///
        /// <returns> the sheetIndex of the copy, else -1 if the copy operation failed. </returns>
        private int RunCopyViewSheetDemo(string sheetName)
        {
            var sheetIndex = ViewSheets.GetViewSheet(sheetName);

            if (sheetIndex == -1 && !this.ShowMessage($"Could not find sheet {sheetName}.", LocalizationStrings.Title, true))
            {
                return(-1);
            }

            sheetIndex = ViewSheets.CreateCopySheet(sheetIndex);
            if (sheetIndex == -1 && !this.ShowMessage($"Copying the sheet named {sheetName} failed.", LocalizationStrings.Title, true))
            {
                return(-1);
            }

            this.ShowMessage($"Using CreateCopySheet we've made a copy of the {sheetName}.", LocalizationStrings.Title);

            return(sheetIndex);
        }
        /// <summary> Shows the "data package" for a view sheet. </summary>
        ///
        /// <param name="sheetName"> Name of the ViewSheet to create. </param>
        /// <param name="label">     (Optional) A label to place on the output. </param>
        ///
        /// <returns> true if it succeeds, false if it fails. </returns>
        private bool ShowViewSheetDataPackage(string sheetName, string label = "")
        {
            var sheetIndex = ViewSheets.GetViewSheet(sheetName);

            if (string.IsNullOrEmpty(sheetName) && !this.ShowMessage($"Could not find a sheet named {sheetName}.", LocalizationStrings.Title, true))
            {
                return(false);
            }

            // The data package attached to a ViewSheet
            var data   = new ViewSheets.ViewSheetData();
            var result = ViewSheets.GetViewSheetData(sheetIndex, ref data);

            if (!result)
            {
                if (!this.ShowMessage($"An error occurred retrieving the data for sheet {sheetName} at sheet index {sheetIndex}.",
                                      LocalizationStrings.Title,
                                      true))
                {
                    return(false);
                }
            }

            if (result)
            {
                // A worker class that display the data.
                var viewSheetDataPackages = new ViewSheetDataPackages();
                if (string.IsNullOrEmpty(label))
                {
                    viewSheetDataPackages.DumpViewSheetDataPackage(data, sheetName);
                }
                else
                {
                    viewSheetDataPackages.DumpViewSheetDataPackage(data, sheetName + "[" + label + "]");
                }
            }

            return(result);
        }