protected void OnLoadLayout(object sender, FileEventArgs e)
        {
            string layoutFilename = Path.Combine(Path.GetDirectoryName(e.Filename), Path.GetFileNameWithoutExtension(e.Filename) + "-layout.xml");

            if (File.Exists(layoutFilename))
            {
                // Use the layout file to determine the canvas files.
                ServiceManager.Get <IFlowSharpEditService>().ClearSavePoints();
                IFlowSharpCanvasService       canvasService = ServiceManager.Get <IFlowSharpCanvasService>();
                IFlowSharpPropertyGridService pgService     = ServiceManager.Get <IFlowSharpPropertyGridService>();
                canvasService.Controllers.ForEach(c => pgService.Terminate(c));
                canvasService.ClearControllers();
                loading = true;
                ServiceManager.Get <IDockingFormService>().LoadLayout(layoutFilename);
                loading = false;

                // Update all services with new controllers.
                canvasService.Controllers.ForEach(c => InformServicesOfNewCanvas(c));
                EnableCanvasPaint();
                SelectFirstDocument();
            }
            else
            {
                // Just open the diagram the currently selected canvas.
                BaseController canvasController = ServiceManager.Get <IFlowSharpCanvasService>().ActiveController;
                ServiceManager.Get <IFlowSharpEditService>().ClearSavePoints();
                LoadFileIntoCanvas(e.Filename, Constants.META_CANVAS, canvasController);
            }
        }
        protected void Compile()
        {
            tempToTextBoxMap.Clear();
            var outputWindow = ServiceManager.Get <IFlowSharpCodeOutputWindowService>();

            outputWindow.Clear();

            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            IFlowSharpMenuService   menuService      = ServiceManager.Get <IFlowSharpMenuService>();
            IFlowSharpCodeService   codeService      = ServiceManager.Get <IFlowSharpCodeService>();
            BaseController          canvasController = canvasService.ActiveController;

            List <string>         refs            = GetCanvasReferences(canvasController);
            List <GraphicElement> shapeSources    = GetCanvasSources(canvasController);
            List <string>         sourceFilenames = GetSourceFiles(shapeSources);

            bool            isStandAlone = runner is StandAloneRunner;
            string          filename     = GetExeOrDllFilename(menuService.Filename);
            CompilerResults results      = Compile(filename, sourceFilenames, refs, isStandAlone);

            DeleteTempFiles(sourceFilenames);

            if (!results.Errors.HasErrors)
            {
                outputWindow.WriteLine("No Errors");
            }
        }
Beispiel #3
0
        private void mnuOpen_Click(object sender, EventArgs e)
        {
            if (CheckForChanges())
            {
                return;
            }
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "FlowSharp (*.fsd)|*.fsd";
            DialogResult res = ofd.ShowDialog();

            if (res == DialogResult.OK)
            {
                filename = ofd.FileName;
            }
            else
            {
                return;
            }

            IFlowSharpCanvasService canvasService = serviceManager.Get <IFlowSharpCanvasService>();

            canvasService.LoadDiagrams(filename);
            UpdateCaption();
            UpdateMru(filename);
        }
        protected void OnRun(object sender, EventArgs e)
        {
            var outputWindow = ServiceManager.Get <IFlowSharpCodeOutputWindowService>();
            var fscSvc       = ServiceManager.Get <IFlowSharpCodeService>();

            outputWindow.Clear();
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;

            // One and only one Python class element must be selected.
            if (canvasController.SelectedElements.Count == 1)
            {
                var el = canvasController.SelectedElements[0];

                if (el is IPythonClass)
                {
                    // TODO: Unify with FlowSharpCodeCompilerService.Run
                    string filename = ((IPythonClass)el).Filename;
                    fscSvc.LaunchProcess("python", filename,
                                         stdout => outputWindow.WriteLine(stdout),
                                         stderr => outputWindow.WriteLine(stderr));
                }
                else
                {
                    outputWindow.WriteLine("Please select a Python class file to run.");
                }
            }
            else
            {
                outputWindow.WriteLine("Please select a single Python class file to run.");
            }
        }
Beispiel #5
0
        public ClosingState CheckForChanges()
        {
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();
            bool         changed = canvasService.Controllers.Any(c => GetSavePoint(c) != c.UndoStack.UndoStackSize);
            ClosingState ret     = ClosingState.NoChanges;

            if (changed)
            {
                DialogResult res = MessageBox.Show("Do you wish to save changes to this drawing?", "Save Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                switch (res)
                {
                case DialogResult.Cancel:
                    ret = ClosingState.CancelClose;
                    break;

                case DialogResult.Yes:
                    ret = ClosingState.SaveChanges;
                    break;

                case DialogResult.No:
                    ret = ClosingState.ExitWithoutSaving;
                    break;
                }
            }

            return(ret);
        }
        protected void RemoveRouting()
        {
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;
            var receptorConnections = canvasController.Elements.Where(el => el.Name == "_RCPTRCONN_").ToList();

            receptorConnections.ForEach(rc => canvasController.DeleteElement(rc));
        }
        protected List <IAgentReceptor> GetReceptors()
        {
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;
            List <IAgentReceptor>   receptors        = GetReceptors(canvasController);

            return(receptors);
        }
Beispiel #8
0
        protected void SaveDiagram(string filename)
        {
            IFlowSharpCanvasService canvasService = serviceManager.Get <IFlowSharpCanvasService>();

            canvasService.SaveDiagramsAndLayout(filename);
            //BaseController canvasController = serviceManager.Get<IFlowSharpCanvasService>().ActiveController;
            //string data = Persist.Serialize(canvasController.Elements);
            //File.WriteAllText(filename, data);
            serviceManager.Get <IFlowSharpEditService>().SetSavePoint();
        }
Beispiel #9
0
        protected void OnCodeEditorServiceTextChanged(object sender, TextChangedEventArgs e)
        {
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            if (canvasService.ActiveController.SelectedElements.Count == 1)
            {
                GraphicElement el = canvasService.ActiveController.SelectedElements[0];
                el.Json["Code"] = e.Text;
            }
        }
Beispiel #10
0
 public void RemoveCarriers()
 {
     lock (this)
     {
         IFlowSharpCanvasService canvasService    = serviceManager.Get <IFlowSharpCanvasService>();
         BaseController          canvasController = canvasService.ActiveController;
         carriers.ForEach(c => canvasController.DeleteElement(c));
         carriers.Clear();
     }
 }
Beispiel #11
0
        // TODO: We want to be able to associate many different code types with the same shape.
        // This requires setting the Json dictionary appropriately for whatever editor is generating the event.
        // Are we doing this the right why?

        protected void OnCSharpEditorServiceTextChanged(object sender, TextChangedEventArgs e)
        {
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            if (canvasService.ActiveController.SelectedElements.Count == 1)
            {
                GraphicElement el = canvasService.ActiveController.SelectedElements[0];
                el.Json["Code"]        = e.Text;    // Should we call this C# or CSharp?
                el.Json["TextChanged"] = true.ToString();
            }
        }
Beispiel #12
0
        protected void OnScintillaEditorServiceTextChanged(object sender, TextChangedEventArgs e)
        {
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            if (canvasService.ActiveController.SelectedElements.Count == 1)
            {
                GraphicElement el = canvasService.ActiveController.SelectedElements[0];
                el.Json[e.Language]    = e.Text;      // TODO: Should we call this Script or something else?
                el.Json["TextChanged"] = true.ToString();
            }
        }
        protected void OnCompile(object sender, EventArgs e)
        {
            var outputWindow = ServiceManager.Get <IFlowSharpCodeOutputWindowService>();

            outputWindow.Clear();
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;

            // List<GraphicElement> rootSourceShapes = GetSources(canvasController);
            CompileClassSources(canvasController);
            RunLint(canvasController);
        }
Beispiel #14
0
        private void OnRecentFileSelected(object sender, EventArgs e)
        {
            if (CheckForChanges())
            {
                return;
            }
            ToolStripItem tsi = sender as ToolStripItem;

            filename = tsi.Text;
            IFlowSharpCanvasService canvasService = serviceManager.Get <IFlowSharpCanvasService>();

            canvasService.LoadDiagrams(filename);
            UpdateCaption();
        }
        protected void Initialize()
        {
            IFlowSharpMenuService            menuService   = ServiceManager.Get <IFlowSharpMenuService>();
            IFlowSharpCanvasService          canvasService = ServiceManager.Get <IFlowSharpCanvasService>();
            IFlowSharpMouseControllerService mouseService  = ServiceManager.Get <IFlowSharpMouseControllerService>();

            menuService.Initialize(form);
            menuService.Initialize(canvasService.ActiveController);
            canvasService.AddCanvas  += (sndr, args) => CreateCanvas();
            canvasService.LoadLayout += OnLoadLayout;
            canvasService.SaveLayout += OnSaveLayout;
            // mouseService.Initialize(canvasService.ActiveController);
            InformServicesOfNewCanvas(canvasService.ActiveController);
        }
        protected void EnableCanvasPaint()
        {
            // Enable canvas paint after all initialization has completed,
            // because adding certain controls, like TextboxShape, causes a panel canvas OnPaint to be called
            // when the TextboxShape is being added to the toolbox canvas, and this results in all shapes
            // attempting to draw, and they are not fully initialized at this point!
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            canvasService.Controllers.ForEach(c => c.Canvas.EndInit());
            canvasService.Controllers.ForEach(c => c.Canvas.Invalidate());
            IFlowSharpToolboxService toolboxService = ServiceManager.Get <IFlowSharpToolboxService>();

            toolboxService.Controller.Canvas.EndInit();
            toolboxService.Controller.Canvas.Invalidate();
        }
        protected void CreateCanvas()
        {
            // Create canvas.
            Panel panel = new Panel()
            {
                Dock = DockStyle.Fill, Tag = Constants.META_CANVAS
            };
            Control dockPanel = ServiceManager.Get <IDockingFormService>().CreateDocument(DockState.Document, "Canvas", Constants.META_CANVAS);

            dockPanel.Controls.Add(panel);
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            canvasService.CreateCanvas(panel);
            canvasService.ActiveController.Canvas.EndInit();
            InformServicesOfNewCanvas(canvasService.ActiveController);
        }
Beispiel #18
0
        public void Compile()
        {
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            IFlowSharpMenuService   menuService      = ServiceManager.Get <IFlowSharpMenuService>();
            BaseController          canvasController = canvasService.ActiveController;

            tempToTextBoxMap.Clear();

            List <GraphicElement> compiledAssemblies = new List <GraphicElement>();
            bool ok = CompileAssemblies(canvasController, compiledAssemblies);

            if (!ok)
            {
                DeleteTempFiles();
                return;
            }

            List <string>         refs             = new List <string>();
            List <string>         sources          = new List <string>();
            List <GraphicElement> rootSourceShapes = GetSources(canvasController);

            rootSourceShapes.ForEach(root => GetReferencedAssemblies(root).Where(refassy => refassy is IAssemblyBox).ForEach(refassy => refs.Add(((IAssemblyBox)refassy).Filename)));

            // Get code for workflow boxes first, as this code will then be included in the rootSourceShape code listing.
            IEnumerable <GraphicElement> workflowShapes = canvasController.Elements.Where(el => el is IWorkflowBox);

            workflowShapes.ForEach(wf =>
            {
                string code     = GetWorkflowCode(canvasController, wf);
                wf.Json["Code"] = code;
                // CreateCodeFile(wf, sources, code);
            });

            // TODO: Better Linq!
            rootSourceShapes.Where(root => !String.IsNullOrEmpty(GetCode(root))).ForEach(root =>
            {
                CreateCodeFile(root, sources, GetCode(root));
            });

            exeFilename = String.IsNullOrEmpty(menuService.Filename) ? "temp.exe" : Path.GetFileNameWithoutExtension(menuService.Filename) + ".exe";
            Compile(exeFilename, sources, refs, true);
            DeleteTempFiles();
        }
Beispiel #19
0
        protected void EnableCanvasPaint()
        {
            // Enable canvas paint after all initialization has completed,
            // because adding certain controls, like TextboxShape, causes a panel canvas OnPaint to be called
            // when the TextboxShape is being added to the toolbox canvas, and this results in all shapes
            // attempting to draw, and they are not fully initialized at this point!
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            canvasService.Controllers.ForEach(c => c.Canvas.EndInit());
            canvasService.Controllers.ForEach(c => c.Canvas.Invalidate());
            IFlowSharpToolboxService toolboxService = ServiceManager.Get <IFlowSharpToolboxService>();

            // Will be null if canvas was not created when app starts.  Sanity check here
            // mainly for when we debug a form with no panels initialized by default.
            if (toolboxService.Controller != null)
            {
                toolboxService.Controller.Canvas.EndInit();
                toolboxService.Controller.Canvas.Invalidate();
            }
        }
Beispiel #20
0
        protected void Initialize()
        {
            IFlowSharpMenuService            menuService   = ServiceManager.Get <IFlowSharpMenuService>();
            IFlowSharpCanvasService          canvasService = ServiceManager.Get <IFlowSharpCanvasService>();
            IFlowSharpMouseControllerService mouseService  = ServiceManager.Get <IFlowSharpMouseControllerService>();

            menuService.Initialize(form);
            canvasService.AddCanvas  += (sndr, args) => CreateCanvas();
            canvasService.LoadLayout += OnLoadLayout;
            canvasService.SaveLayout += OnSaveLayout;
            // mouseService.Initialize(canvasService.ActiveController);

            // Will be null if canvas was not created when app starts.  Sanity check here
            // mainly for when we debug a form with no panels initialized by default.
            if (canvasService.ActiveController != null)
            {
                menuService.Initialize(canvasService.ActiveController);
                InformServicesOfNewCanvas(canvasService.ActiveController);
            }
        }
        protected void CreateConnectors(List <ReceptorDescription> descr)
        {
            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;
            Canvas canvas = canvasController.Canvas;

            descr.ForEach(d =>
            {
                // TODO: Deal with namespace handling better than this RightOof kludge.
                // TODO: Converting to lowercase is a bit of a kludge as well.
                GraphicElement elSrc = canvasController.Elements.SingleOrDefault(el => (el is IAgentReceptor) && el.Text.RemoveWhitespace().ToLower() == d.ReceptorTypeName.RightOf(".").ToLower());

                if (elSrc != null)
                {
                    d.Publishes.ForEach(p =>
                    {
                        // Get all receivers that receive the type being published.
                        var receivers = descr.Where(r => r.ReceivingSemanticType == p);

                        receivers.ForEach(r =>
                        {
                            // TODO: Deal with namespace handling better than this RightOof kludge.
                            // TODO: Converting to lowercase is a bit of a kludge as well.
                            GraphicElement elDest = canvasController.Elements.SingleOrDefault(el => (el is IAgentReceptor) && el.Text.RemoveWhitespace().ToLower() == r.ReceptorTypeName.RightOf(".").ToLower());

                            if (elDest != null)
                            {
                                DiagonalConnector dc = new DiagonalConnector(canvas, elSrc.DisplayRectangle.Center(), elDest.DisplayRectangle.Center());
                                dc.Name           = "_RCPTRCONN_";
                                dc.EndCap         = AvailableLineCap.Arrow;
                                dc.BorderPenColor = Color.Red;
                                dc.UpdateProperties();
                                canvasController.Insert(dc);
                            }
                        });
                    });
                }
            });
        }
        public void Compile()
        {
            TerminateRunningProcess();

            var outputWindow = ServiceManager.Get <IFlowSharpCodeOutputWindowService>();

            outputWindow.Clear();

            IFlowSharpCanvasService canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
            IFlowSharpMenuService   menuService      = ServiceManager.Get <IFlowSharpMenuService>();
            IFlowSharpCodeService   codeService      = ServiceManager.Get <IFlowSharpCodeService>();
            BaseController          canvasController = canvasService.ActiveController;

            tempToTextBoxMap.Clear();

            List <GraphicElement> compiledAssemblies = new List <GraphicElement>();
            bool ok = CompileAssemblies(canvasController, compiledAssemblies);

            if (!ok)
            {
                DeleteTempFiles();
                return;
            }

            List <string> refs    = new List <string>();
            List <string> sources = new List <string>();

            // Add specific assembly references on the drawing.
            List <IAssemblyReferenceBox> references = GetReferences(canvasController);

            refs.AddRange(references.Select(r => r.Filename));

            List <GraphicElement> rootSourceShapes = GetSources(canvasController);

            rootSourceShapes.ForEach(root => GetReferencedAssemblies(root).Where(refassy => refassy is IAssemblyBox).ForEach(refassy => refs.Add(((IAssemblyBox)refassy).Filename)));

            // Get code for workflow boxes first, as this code will then be included in the rootSourceShape code listing.
            IEnumerable <GraphicElement> workflowShapes = canvasController.Elements.Where(el => el is IWorkflowBox);

            workflowShapes.ForEach(wf =>
            {
                string code     = GetWorkflowCode(codeService, canvasController, wf);
                wf.Json["Code"] = code;
            });

            List <GraphicElement> excludeClassShapes = new List <GraphicElement>();
            List <GraphicElement> classes            = GetClasses(canvasController);

            // Get CSharpClass shapes that contain DRAKON shapes.
            classes.Where(cls => HasDrakonShapes(canvasController, cls)).ForEach(cls =>
            {
                excludeClassShapes.AddRange(canvasController.Elements.Where(el => cls.DisplayRectangle.Contains(el.DisplayRectangle)));
                DrakonCodeTree dcg = new DrakonCodeTree();
                var workflowStart  = codeService.FindStartOfWorkflow(canvasController, cls);
                codeService.ParseDrakonWorkflow(dcg, codeService, canvasController, workflowStart);
                var codeGenSvc = new CSharpCodeGeneratorService();
                dcg.GenerateCode(codeGenSvc);
                InsertCodeInRunWorkflowMethod(cls, codeGenSvc.CodeResult);
                string filename = CreateCodeFile(cls);
                sources.Add(filename);
            });

            rootSourceShapes.Where(root => !excludeClassShapes.Contains(root)).ForEach(root =>
            {
                // Get all other shapes that are not part of CSharpClass shapes:
                // TODO: Better Linq!
                if (!String.IsNullOrEmpty(GetCode(root)))
                {
                    string filename = CreateCodeFile(root);
                    sources.Add(filename);
                }
            });

            exeFilename = String.IsNullOrEmpty(menuService.Filename) ? "temp.exe" : Path.GetFileNameWithoutExtension(menuService.Filename) + ".exe";
            Compile(exeFilename, sources, refs, true);
            DeleteTempFiles();

            if (!results.Errors.HasErrors)
            {
                outputWindow.WriteLine("No Errors");
            }
        }
Beispiel #23
0
        public void SetSavePoint()
        {
            IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();

            canvasService.Controllers.ForEach(c => SetSavePoint(c));
        }
Beispiel #24
0
        public void Animate(object sender, HopeRunnerAppDomainInterface.ProcessEventArgs args)
        {
            IFlowSharpCanvasService canvasService    = serviceManager.Get <IFlowSharpCanvasService>();
            BaseController          canvasController = canvasService.ActiveController;

            var(sourceShapeName, shapeType) = GetSourceShapeName(args);
            GraphicElement elSrc  = null;
            GraphicElement elDest = null;

            lock (this)
            {
                elSrc  = GetElement(canvasController, sourceShapeName.RightOf('.'), shapeType);
                elDest = GetElement(canvasController, args.ToReceptorTypeName.RightOf('.'), FromShapeType.Receptor);
            }

            if (ShowAnimation)
            {
                CarrierShape carrier = new CarrierShape(canvasController.Canvas);
                carrier.DisplayRectangle = new Rectangle(elSrc.DisplayRectangle.Center().X, elSrc.DisplayRectangle.Center().Y, 10, 10);

                canvasController.Canvas.FindForm().BeginInvoke(() =>
                {
                    lock (this)
                    {
                        carriers.Add(carrier);
                        canvasController.Insert(carrier);
                    }
                });

                double dx    = elDest.DisplayRectangle.Center().X - elSrc.DisplayRectangle.Center().X;
                double dy    = elDest.DisplayRectangle.Center().Y - elSrc.DisplayRectangle.Center().Y;
                double steps = 20;
                double subx  = dx / steps;
                double suby  = dy / steps;
                double px    = elSrc.DisplayRectangle.Center().X;
                double py    = elSrc.DisplayRectangle.Center().Y;

                for (int i = 0; i < steps; i++)
                {
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(25);
                    px += subx;
                    py += suby;

                    canvasController.Canvas.FindForm().BeginInvoke(() =>
                    {
                        lock (this)
                        {
                            Assert.SilentTry(() => canvasController.MoveElementTo(carrier, new Point((int)px, (int)py)));
                        }
                    });
                }

                lock (this)
                {
                    carriers.Remove(carrier);
                    Assert.SilentTry(() => canvasController.DeleteElement(carrier));
                }
            }

            if (ShowActivation)
            {
                canvasController.Canvas.FindForm().BeginInvoke(() =>
                {
                    lock (this)
                    {
                        elDest.FillBrush.Color = Color.Blue;
                        canvasController.Redraw(elDest);
                        Application.DoEvents();
                        System.Threading.Thread.Sleep(25);
                        elDest.FillBrush.Color = ((IAgentReceptor)elDest).EnabledColor;
                        canvasController.Redraw(elDest);
                        Application.DoEvents();
                        System.Threading.Thread.Sleep(25);
                    }
                });
            }
        }
        protected void OnContentLoaded(object sender, ContentLoadedEventArgs e)
        {
            switch (e.Metadata.LeftOf(","))
            {
            case Constants.META_CANVAS:
                pnlFlowSharp = new Panel()
                {
                    Dock = DockStyle.Fill, Tag = Constants.META_CANVAS
                };
                e.DockContent.Controls.Add(pnlFlowSharp);
                e.DockContent.Text = "Canvas";
                IFlowSharpCanvasService canvasService = ServiceManager.Get <IFlowSharpCanvasService>();
                canvasService.CreateCanvas(pnlFlowSharp);
                BaseController baseController = ServiceManager.Get <IFlowSharpCanvasService>().ActiveController;

                if (e.Metadata.Contains(","))
                {
                    string filename   = e.Metadata.Between(",", ",");
                    string canvasName = e.Metadata.RightOfRightmostOf(",");
                    canvasName         = String.IsNullOrWhiteSpace(canvasName) ? "Canvas" : canvasName;
                    e.DockContent.Text = canvasName;
                    LoadFileIntoCanvas(filename, canvasName, baseController);
                }

                // ServiceManager.Get<IFlowSharpMouseControllerService>().Initialize(baseController);
                break;

            case Constants.META_TOOLBOX:
                pnlToolbox = new Panel()
                {
                    Dock = DockStyle.Fill, Tag = Constants.META_TOOLBOX
                };
                e.DockContent.Controls.Add(pnlToolbox);
                e.DockContent.Text = "Toolbox";
                break;

            case Constants.META_PROPERTYGRID:
                propGrid = new PropertyGrid()
                {
                    Dock = DockStyle.Fill, Tag = Constants.META_PROPERTYGRID
                };
                e.DockContent.Controls.Add(propGrid);
                e.DockContent.Text = "Property Grid";
                ServiceManager.Get <IFlowSharpPropertyGridService>().Initialize(propGrid);
                break;

            default:
                ContentResolver.Fire(this, e);
                break;
            }

            // Associate the toolbox with a canvas controller after both canvas and toolbox panels are created.
            // !!! This handles the defaultLayout configuration. !!!
            if ((e.Metadata == Constants.META_CANVAS || e.Metadata == Constants.META_TOOLBOX) && (pnlFlowSharp != null && pnlToolbox != null))
            {
                IFlowSharpCanvasService  canvasService    = ServiceManager.Get <IFlowSharpCanvasService>();
                BaseController           canvasController = canvasService.ActiveController;
                IFlowSharpToolboxService toolboxService   = ServiceManager.Get <IFlowSharpToolboxService>();
                toolboxService.CreateToolbox(pnlToolbox);
                toolboxService.InitializeToolbox();
                toolboxService.InitializePluginsInToolbox();
                toolboxService.UpdateToolboxPaths();
            }

            //if ((e.Metadata == Constants.META_CANVAS || e.Metadata == Constants.META_PROPERTYGRID) && (pnlFlowSharp != null && propGrid != null))
            //{
            //    ServiceManager.Get<IFlowSharpPropertyGridService>().Initialize(propGrid);
            //}
        }