private static string EditAnnotationText(AnnotationData annotation)
        {
            var inputBox = new AnnotationInputBox { InputText = annotation.Text };
            inputBox.ShowDialog();

            if (string.IsNullOrWhiteSpace(inputBox.InputText))
            {
                return null;
            }

            return inputBox.InputText;
        }
        /// <summary>
        /// Loads the diagram data from file after the subject has already been set by <see cref="AssignDiagramData"/>.
        /// At this stage the diagram has already been loaded and is displayed on screen.  
        /// This method ensures all diagram elements have been positioned where the file specifies their co-ordinates.
        /// Also will provide feedback on any mismatches, ie the type has changed and there are more or less associations.
        /// </summary>
        /// <param name="deserializedDataFile">The deserialised data file.</param>
        public void LoadDiagramDataFromFile(object deserializedDataFile)
        {
            var data = deserializedDataFile as TypeVisualiserLayoutFile;
            if (data == null)
            {
                throw new InvalidOperationException("Code Error: Attempt to load data from a type which is not an instance of Type Visualiser Layout File.");
            }

            var typesNoLongerInDiagram = new List<VisualisableTypeData>();
            foreach (TypeLayoutData layoutData in data.CanvasLayout.Types)
            {
                // Deal with annotations first - these have not been loaded by setting the subject.
                if (layoutData.ContentType == typeof(AnnotationData).FullName)
                {
                    var annotation = new AnnotationData { Id = layoutData.Id, Text = layoutData.Data, };
                    var annotationElement = new DiagramElement(DiagramId, annotation) { Show = layoutData.Visible, TopLeft = layoutData.TopLeft };
                    DiagramElements.Add(annotationElement);
                    continue;
                }

                DiagramElement element = DiagramElements.FirstOrDefault(x => x.DiagramContent.Id == layoutData.Id);
                if (element == null)
                {
                    VisualisableTypeData type = FindTypeInFile(data, layoutData.Id);
                    if (type == null)
                    {
                        throw new InvalidOperationException("Code error: there is a layout data element without a matching association. " + layoutData.Id);
                    }

                    typesNoLongerInDiagram.Add(type);
                    continue;
                }

                element.TopLeft = layoutData.TopLeft;
                element.Show = layoutData.Visible;
            }

            RaiseExpandCanvasRequested();

            if (typesNoLongerInDiagram.Any())
            {
                UserPrompt.Show(Resources.ViewportController_Error_in_diagram_file,
                                Resources.ViewportController_Some_types_are_not_in_assembly_anymore + string.Join(", ", typesNoLongerInDiagram.Select(x => x.Name)));
            }
        }
        public DiagramElement DeleteAnnotation(AnnotationData annotation)
        {
            DiagramElement found = DiagramElements.FirstOrDefault(x => x.DiagramContent is AnnotationData && ((AnnotationData)x.DiagramContent).Id == annotation.Id);

            if (found != null)
            {
                DiagramElements.Remove(found);
                return found;
            }

            return null;
        }
        public void EditAnnotation(AnnotationData annotation)
        {
            if (annotation == null)
            {
                throw new ArgumentNullResourceException("annotation", Resources.General_Given_Parameter_Cannot_Be_Null);
            }

            annotation.Text = EditAnnotationText(annotation);
            if (string.IsNullOrWhiteSpace(annotation.Text))
            {
                DeleteAnnotation(annotation);
            }
        }
        public void AddAnnotation(Point where, AnnotationData annotation = null)
        {
            if (where == default(Point))
            {
                return;
            }

            if (annotation == null)
            {
                annotation = new AnnotationData();
            }

            annotation.Text = EditAnnotationText(annotation);
            if (string.IsNullOrWhiteSpace(annotation.Text))
            {
                return;
            }

            var diagramElement = new DiagramElement(DiagramId, annotation) { TopLeft = where };
            DiagramElements.Add(diagramElement);
        }