/// <summary>
        /// Creates the default input mode for the GraphControl,
        /// a <see cref="GraphEditorInputMode"/>.
        /// </summary>
        /// <remarks>
        /// This implementation configures label text validation
        /// </remarks>
        /// <returns>A new GraphEditorInputMode instance</returns>
        protected virtual IInputMode CreateEditorMode()
        {
            var graphEditorInputMode = new GraphEditorInputMode();

            //Configure label text validation
            // Note that by default, no visual feedback is provided, the text is just not changed
            graphEditorInputMode.ValidateLabelText += delegate(object o, LabelTextValidatingEventArgs args) {
                if (args.Label == pageHeader)
                {
                    // Page header may not be empty, regardless of whether validation is enabled or not
                    args.Cancel = args.NewText == String.Empty;
                }
                else
                {
                    // label must match the pattern
                    args.Cancel = validationEnabled && !validationPattern.IsMatch(args.NewText);
                }
            };

            // The label size for the dummy label must be updated externally
            graphEditorInputMode.LabelTextChanged += delegate(object o, LabelEventArgs args) {
                if (args.Item == pageHeader)
                {
                    pageHeader.AdoptPreferredSizeFromStyle();
                }
            };

            // Instant typing requires a custom TextEditorInputMode - it's safe to use it globally, though
            graphEditorInputMode.TextEditorInputMode = textEditorInputMode = new DemoTextEditorInputMode();

            return(graphEditorInputMode);
        }
        /// <summary>Creates the label for the page header.</summary>
        /// <remarks>
        /// The page header is a dummy labeled that is anchored at a fixed location. FreeLabelModel allows arbitrary positioning.
        /// In this case, we anchor the label to a dynamic point that always corresponds to the upper left corner of the viewport.
        /// We use the ZoomInvariantLabelStyle from the tutorial to ensure we always look the same
        /// </remarks>
        public static SimpleLabel CreatePageHeader(GraphControl graphControl)
        {
            var innerLabelStyle = new DefaultLabelStyle
            {
                Typeface        = new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Bold, FontStretches.Normal),
                TextSize        = 20,
                BackgroundPen   = Pens.Green,
                TextBrush       = Brushes.White,
                BackgroundBrush = Brushes.Green
            };
            var headerLabel = new SimpleLabel(null, "Page Header", FreeLabelModel.Instance.CreateAnchored(
                                                  new DynamicViewPoint(graphControl, 5, 30)))
            {
                Style = new ZoomInvariantLabelStyle(innerLabelStyle)
            };

            // Adjust the size so that the text fits
            headerLabel.AdoptPreferredSizeFromStyle();

            // Since we don't have a model item for the label, we add the label's visual creator directly
            // to the scene graph
            var headerCanvasObject = graphControl.RootGroup.AddChild(new PageHeaderVisualCreator(headerLabel));

            var pageHeaderLabelEditHelper = new PageHeaderEditLabelHelper(headerLabel, headerCanvasObject);

            headerLabel.LookupImplementation = Lookups.Single <IEditLabelHelper>(pageHeaderLabelEditHelper);

            return(headerLabel);
        }