/// <summary>
        /// Set Enclosure flag
        /// </summary>
        /// <param name="obj">ActiveMapViewChangedEventArgs</param>
        private void OnActiveMapViewChanged(ActiveMapViewChangedEventArgs obj)
        {
            if (obj == null || obj.IncomingView == null || obj.IncomingView.Map == null)
            {
                FrameworkApplication.State.Deactivate(EnableEnclosure);
                return;
            }

            QueuedTask.Run(() =>
            {
                using UtilityNetwork un = GetUtilityNetworkFromActiveMap();
                using DiagramManager dm = un?.GetDiagramManager();
                try
                {
                    DiagramTemplate dt = dm?.GetDiagramTemplate(csTemplateName);
                    if (dt == null)
                    {
                        FrameworkApplication.State.Deactivate(EnableEnclosure);
                    }
                    else
                    {
                        FrameworkApplication.State.Activate(EnableEnclosure);
                    }
                }
                catch
                {
                    FrameworkApplication.State.Deactivate(EnableEnclosure);
                }
            });
        }
Пример #2
0
        public DataTable BuildDiagramLinks(int assessmentId)
        {
            var dm         = new DiagramManager(db);
            var diagramXml = dm.GetDiagramXml(assessmentId);
            var edges      = dm.ProcessDigramEdges(diagramXml, assessmentId);
            var links      = dm.GetDiagramLinks(edges);

            var datatable = new DataTable();

            datatable.Columns.Add("Label", typeof(System.String));
            datatable.Columns.Add("Subnet Names", typeof(System.String));
            datatable.Columns.Add("Layer", typeof(System.String));
            datatable.Columns.Add("Visible", typeof(System.String));


            foreach (var l in links)
            {
                var row = datatable.NewRow();

                row["Label"]        = l.value;
                row["Subnet Names"] = string.Empty;
                row["Layer"]        = l.layerName;
                row["Visible"]      = l.visible;

                datatable.Rows.Add(row);
            }
            datatable.TableName = "Links";
            return(datatable);
        }
Пример #3
0
        public DataTable BuildDiagramZones(int assessmentId)
        {
            var dm         = new DiagramManager(db);
            var diagramXml = dm.GetDiagramXml(assessmentId);
            var vertices   = dm.ProcessDiagramVertices(diagramXml, assessmentId);
            var zones      = dm.GetDiagramZones(vertices);

            var datatable = new DataTable();

            datatable.Columns.Add("Type", typeof(System.String));
            datatable.Columns.Add("Label", typeof(System.String));
            datatable.Columns.Add("Sal", typeof(System.String));
            datatable.Columns.Add("Layer", typeof(System.String));
            datatable.Columns.Add("Visible", typeof(System.String));


            foreach (var z in zones)
            {
                var row = datatable.NewRow();

                row["Type"]    = z.zoneType;
                row["Label"]   = z.label;
                row["Sal"]     = z.SAL;
                row["Layer"]   = z.layerName;
                row["Visible"] = z.visible;

                datatable.Rows.Add(row);
            }
            datatable.TableName = "Zones";
            return(datatable);
        }
Пример #4
0
 public DiagramControl()
 {
     DiagramManager = new DiagramManager(this);
     DesignerItems  = new ObservableCollection <DesignerItem>();
     DesignerItems.CollectionChanged += (s, e) =>
     {
         if (Suppress)
         {
             return;
         }
         //GetDataInfo();
         if (e.Action == NotifyCollectionChangedAction.Add)
         {
             var items = e.NewItems.Cast <DesignerItem>().ToList();
             if (!items.Any())
             {
                 return;
             }
             foreach (var designerItem in items)
             {
                 designerItem.ContextMenu = DesignerItem.GetItemContextMenu(this);
             }
         }
     };
 }
        private void DiagramManager_KeyDown(KeyboardEventArgs e)
        {
            if (e.AltKey || e.CtrlKey || e.ShiftKey || e.Code != DiagramManager.Options.DeleteKey)
            {
                return;
            }

            var somethingWasRemoved = false;

            foreach (var sm in DiagramManager.SelectedModels.ToList())
            {
                if (sm.Locked)
                {
                    continue;
                }

                if (sm is NodeModel node)
                {
                    DiagramManager.RemoveNode(node, false);
                    somethingWasRemoved = true;
                }
                else if (sm is LinkModel link)
                {
                    DiagramManager.RemoveLink(link, false);
                    somethingWasRemoved = true;
                }
            }

            if (somethingWasRemoved)
            {
                DiagramManager.Refresh();
            }
        }
Пример #6
0
        private void DiagramManager_SelectionChanged(SelectableModel model, bool selected)
        {
            if (!DiagramManager.Options.GroupingEnabled)
            {
                return;
            }

            if (!(model is NodeModel node))
            {
                return;
            }

            if (node.Group == null)
            {
                return;
            }

            foreach (var n in node.Group.Nodes)
            {
                if (n == node || n.Selected == selected)
                {
                    continue;
                }

                if (selected)
                {
                    DiagramManager.SelectModel(n, false);
                }
                else
                {
                    DiagramManager.UnselectModel(n);
                }
            }
        }
Пример #7
0
        private void DiagramManager_Wheel(WheelEventArgs e)
        {
            if (!DiagramManager.Options.AllowZooming)
            {
                return;
            }

            var oldZoom = DiagramManager.Zoom;
            var deltaY  = DiagramManager.Options.InverseZoom ? e.DeltaY * -1 : e.DeltaY;
            var newZoom = deltaY > 0 ? oldZoom * _scaleBy : oldZoom / _scaleBy;

            if (newZoom < 0)
            {
                return;
            }

            // Other algorithms (based only on the changes in the zoom) don't work for our case
            // This solution is taken as is from react-diagrams (ZoomCanvasAction)
            var clientWidth  = DiagramManager.Container.Width;
            var clientHeight = DiagramManager.Container.Height;
            var widthDiff    = clientWidth * newZoom - clientWidth * oldZoom;
            var heightDiff   = clientHeight * newZoom - clientHeight * oldZoom;
            var clientX      = e.ClientX - DiagramManager.Container.Left;
            var clientY      = e.ClientY - DiagramManager.Container.Top;
            var xFactor      = (clientX - DiagramManager.Pan.X) / oldZoom / clientWidth;
            var yFactor      = (clientY - DiagramManager.Pan.Y) / oldZoom / clientHeight;
            var newPanX      = DiagramManager.Pan.X - widthDiff * xFactor;
            var newPanY      = DiagramManager.Pan.Y - heightDiff * yFactor;

            DiagramManager.Pan = new Point(newPanX, newPanY);
            DiagramManager.ChangeZoom(newZoom);
        }
Пример #8
0
        public List <NetworkDiagram> GetInconsistentDiagrams(UtilityNetwork utilityNetwork)
        {
            // Get the DiagramManager from the utility network

            using (DiagramManager diagramManager = utilityNetwork.GetDiagramManager())
            {
                List <NetworkDiagram> myList = new List <NetworkDiagram>();

                // Loop through the network diagrams in the diagram manager

                foreach (NetworkDiagram diagram in diagramManager.GetNetworkDiagrams())
                {
                    NetworkDiagramInfo diagramInfo = diagram.GetDiagramInfo();

                    // If the diagram is not a system diagram and is in an inconsistent state, add it to our list

                    if (!diagramInfo.IsSystem && diagram.GetConsistencyState() != NetworkDiagramConsistencyState.DiagramIsConsistent)
                    {
                        myList.Add(diagram);
                    }
                    else
                    {
                        diagram.Dispose(); // If we are not returning it we need to Dispose it
                    }
                }

                return(myList);
            }
        }
Пример #9
0
        public DataTable BuildDiagramText(int assessmentId)
        {
            var dm         = new DiagramManager(db);
            var diagramXml = dm.GetDiagramXml(assessmentId);
            var textCells  = dm.ProcessDiagramShapes(diagramXml, assessmentId);
            var texts      = dm.GetDiagramText(textCells);

            var datatable = new DataTable();

            datatable.Columns.Add("Label", typeof(System.String));
            datatable.Columns.Add("Layer", typeof(System.String));
            datatable.Columns.Add("Visible", typeof(System.String));


            foreach (var t in texts)
            {
                var row = datatable.NewRow();

                row["Label"]   = t.value;
                row["Layer"]   = t.layerName;
                row["Visible"] = t.visible;

                datatable.Rows.Add(row);
            }
            datatable.TableName = "Text";
            return(datatable);
        }
Пример #10
0
        public void ApplySpaceReactionLayout()
        {
            var copier = new LayoutCopyService();

            // if only one organ is visible, in following Copy steps some wrong locations are calculated
            ShowChildren(DiagramModel);

            try
            {
                _view.BeginUpdate();
                var reactionDiagramModel = getReactionBlockDiagramModel();
                if (reactionDiagramModel != null && reactionDiagramModel.IsLayouted)
                {
                    copier.Copy(reactionDiagramModel, DiagramModel);
                }

                var spaceDiagramModel = getSpaceBlockDiagramModel();
                if (spaceDiagramModel != null && spaceDiagramModel.IsLayouted)
                {
                    copier.Copy(spaceDiagramModel, DiagramModel);
                }

                DiagramManager.RefreshFromDiagramOptions();
                DiagramModel.IsLayouted = true;
            }
            finally
            {
                _view.EndUpdate();
            }

            Refresh();
            //to avoid scrollbar error
            ResetViewSize();
        }
Пример #11
0
 public virtual void Refresh()
 {
     DiagramManager.RefreshDiagramFromModel();
     DiagramManager.RefreshFromDiagramOptions();
     refreshGrid();
     _view.Refresh();
 }
        /// <summary>
        /// Get the UtilityNetwork from active Map
        /// </summary>
        /// <returns>UtilityNetwork</returns>
        internal static UtilityNetwork GetUtilityNetworkFromActiveMap()
        {
            var unLayers = MapView.Active?.Map?.GetLayersAsFlattenedList().OfType <UtilityNetworkLayer>();

            if (unLayers == null || !unLayers.Any())
            {
                var dlLayers = MapView.Active?.Map?.GetLayersAsFlattenedList().OfType <DiagramLayer>();
                if (dlLayers == null)
                {
                    return(null);
                }

                foreach (var dlLayer in dlLayers)
                {
                    NetworkDiagram diagram = dlLayer.GetNetworkDiagram();
                    DiagramManager dm      = diagram.DiagramManager;
                    UtilityNetwork un      = dm.GetNetwork <UtilityNetwork>();
                    if (un != null)
                    {
                        return(un);
                    }
                }
            }

            foreach (var unLayer in unLayers)
            {
                UtilityNetwork un = unLayer.GetUtilityNetwork();
                if (un != null)
                {
                    return(un);
                }
            }

            return(null);
        }
Пример #13
0
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            if (!_isVisible)
            {
                return;
            }

            var componentType = DiagramManager.GetComponentForModel(Node) ??
                                DiagramManager.Options.DefaultNodeComponent ??
                                (Node.Layer == RenderLayer.HTML ? typeof(NodeWidget) : typeof(SvgNodeWidget));

            builder.OpenElement(0, Node.Layer == RenderLayer.HTML ? "div" : "g");
            builder.AddAttribute(1, "class", "node");

            if (Node.Layer == RenderLayer.HTML)
            {
                builder.AddAttribute(2, "style", $"top: {Node.Position.Y.ToInvariantString()}px; left: {Node.Position.X.ToInvariantString()}px");
            }
            else
            {
                builder.AddAttribute(2, "transform", $"translate({Node.Position.X.ToInvariantString()} {Node.Position.Y.ToInvariantString()})");
            }

            builder.AddAttribute(3, "onmousedown", EventCallback.Factory.Create <MouseEventArgs>(this, OnMouseDown));
            builder.AddEventStopPropagationAttribute(4, "onmousedown", true);
            builder.AddAttribute(5, "onmouseup", EventCallback.Factory.Create <MouseEventArgs>(this, OnMouseUp));
            builder.AddEventStopPropagationAttribute(6, "onmouseup", true);
            builder.AddElementReferenceCapture(7, value => _element = value);
            builder.OpenComponent(8, componentType);
            builder.AddAttribute(9, "Node", Node);
            builder.CloseComponent();
            builder.CloseElement();
        }
Пример #14
0
        public string ImportCsetd([FromBody] DiagramRequest importRequest)
        {
            if (importRequest == null)
            {
                return("request payload not sent");
            }

            // get the assessment ID from the JWT
            TokenManager tm           = new TokenManager();
            int          userId       = (int)tm.PayloadInt(Constants.Token_UserId);
            int?         assessmentId = tm.PayloadInt(Constants.Token_AssessmentId);

            try
            {
                using (CSET_Context db = new CSET_Context())
                {
                    DiagramManager dm = new DiagramManager(db);
                    return(dm.ImportOldCSETDFile(importRequest.DiagramXml, (int)assessmentId));
                }
            }
            catch (Exception exc)
            {
                return(exc.ToString());
            }
        }
Пример #15
0
 public void getLayerVisibilityTest()
 {
     using (CSET_Context db = new CSET_Context())
     {
         DiagramManager manager = new DiagramManager(db);
         manager.getLayerVisibility("kGJ--9y5AF0ObGW-ZAqX-1", 9);
     }
 }
Пример #16
0
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            var componentType = DiagramManager.GetComponentForModel(Group) ?? typeof(DefaultGroupWidget);

            builder.OpenComponent(0, componentType);
            builder.AddAttribute(1, "Group", Group);
            builder.CloseComponent();
        }
Пример #17
0
 public void ProcessDiagramTest()
 {
     DiagramManager d    = new DiagramManager(new CSET_Context());
     string         test = File.ReadAllText(@"TestItems\testdiagram.xml");
     //change test to reference below if wanted
     StringReader reader   = new StringReader(test);
     var          vertices = d.ProcessDiagramVertices(reader, 2);
 }
Пример #18
0
        public GroupModel(DiagramManager diagramManager, NodeModel[] children, byte padding = 30)
        {
            _diagramManager = diagramManager;
            _padding        = padding;

            Size     = Size.Zero;
            Children = children;
            Initialize();
        }
        void ManageDiagrams(TimeRow row, double epsilon, ref Image diagramRasterized, ref Image diagramDistance, ref Image scaleDistance, ref Chart pointDiagram, ref Chart lineDiagram, ref string AnalysisResult)
        {
            DiagramManager diagram = new DiagramManager(row, (float)epsilon);

            diagram.GenerateReccurentMatrix();
            diagramRasterized = diagram.GetReccurentDiagram(_view.DiagramBox.Width, _view.DiagramBox.Height);
            diagramDistance   = diagram.GetDistanceDiagram(_view.DistanceBox.Width, _view.DistanceBox.Height);
            scaleDistance     = diagram.GetDistancePalette(_view.DistanceScaleBox.Width);

            bool[,] matrix = diagram.GetReccurentMatrix();

            int side = matrix.GetLength(0);

            pointDiagram.Series[0].MarkerSize = side > 100 ? 2 : (int)(pointDiagram.Height / side * 0.9);
            pointDiagram.Series[0].Points.Clear();

            int move      = 0;
            int max       = side * side + row.Row.Length - 1;
            int invokeVal = max / 10;

            for (int i = 0; i < side; i++)
            {
                for (int j = 0; j < side; j++)
                {
                    if (matrix[i, j] == true)
                    {
                        pointDiagram.Series[0].Points.AddXY(i + 1, j + 1);
                    }
                    if ((move % invokeVal) == 0)
                    {
                        ProgressAction?.Invoke(10, move / invokeVal);
                    }
                    move++;
                }
            }

            lineDiagram.Series[0].Points.Clear();
            for (int i = 0; i < row.Row.Length - 1; i++)
            {
                lineDiagram.Series[0].Points.AddXY((row[i]), row[i + 1]);
                if ((move % invokeVal) == 0)
                {
                    ProgressAction?.Invoke(10, move / invokeVal);
                }
                move++;
            }
            //if (move < max) ProgressAction?.Invoke(10, move / invokeVal);

            AnalysisResult = "\n Analysis: \n RR: " + diagram.RR.ToString() + "\n DET: " + diagram.DET.ToString() +
                             "\n L: " + diagram.L.ToString() + "\n DIV: " + diagram.DIV.ToString() +
                             "\n ENTR: " + diagram.ENTR.ToString() + "\n RATIO: " + diagram.RATIO.ToString();

            row.Dispose();
            diagram.Dispose();
            matrix = null;
            GC.Collect();
        }
Пример #20
0
        /// <summary>
        /// Get the Un Schema version
        /// </summary>
        /// <param name="diagram">NetworkDiagram</param>
        /// <returns>string</returns>
        /// <remarks>UN Version 3 and earlier use only Subnetwork name
        /// UN Version 4 and later use Supported subnetwork name for container
        /// UN Version 5 and later use Supporting subnetwork name for structure</remarks>
        internal static int GetSchemaVersion(NetworkDiagram diagram)
        {
            DiagramManager diagramManager = diagram.DiagramManager;
            UtilityNetwork utilityNetwork = diagramManager.GetNetwork <UtilityNetwork>();

            UtilityNetworkDefinition unDefinition = utilityNetwork.GetDefinition();

            return(Convert.ToInt32(unDefinition.GetSchemaVersion()));
        }
Пример #21
0
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            var componentType = DiagramManager.GetComponentForModel(Node) ??
                                DiagramManager.Options.DefaultNodeComponent ??
                                (Node.Layer == RenderLayer.HTML ? typeof(NodeWidget) : typeof(SvgNodeWidget));

            builder.OpenComponent(0, componentType);
            builder.AddAttribute(1, "Node", Node);
            builder.CloseComponent();
        }
Пример #22
0
        public IHttpActionResult GetTemplates()
        {
            var tm     = new TokenManager();
            var userId = tm.PayloadInt(Constants.Token_UserId);

            var dm        = new DiagramManager(new CSET_Context());
            var templates = dm.GetDiagramTemplates();

            return(Ok(templates));
        }
Пример #23
0
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            var componentType = DiagramManager.GetComponentForModel(Link) ??
                                DiagramManager.Options.DefaultLinkComponent ??
                                typeof(LinkWidget);

            builder.OpenComponent(0, componentType);
            builder.AddAttribute(1, "Link", Link);
            builder.CloseComponent();
        }
        private void DiagramManager_MouseDown(Model model, MouseEventArgs e)
        {
            if (!(model is PortModel port) || port.Locked)
            {
                return;
            }

            _initialX    = e.ClientX;
            _initialY    = e.ClientY;
            _ongoingLink = DiagramManager.AddLink(port, null);
        }
Пример #25
0
        public static void ReconnectLinksToClosestPorts(this DiagramManager diagramManager)
        {
            // Only refresh ports once
            var portsToRefresh = new HashSet <PortModel>();

            foreach (var link in diagramManager.AllLinks.ToArray())
            {
                if (link.TargetPort == null)
                {
                    continue;
                }

                var sourcePorts = link.SourcePort.Parent.Ports;
                var targetPorts = link.TargetPort.Parent.Ports;

                // Find the ports with minimal distance
                var minDistance   = double.MaxValue;
                var minSourcePort = link.SourcePort;
                var minTargetPort = link.TargetPort;
                foreach (var sourcePort in sourcePorts)
                {
                    foreach (var targetPort in targetPorts)
                    {
                        var distance = sourcePort.Position.DistanceTo(targetPort.Position);
                        if (distance < minDistance)
                        {
                            minDistance   = distance;
                            minSourcePort = sourcePort;
                            minTargetPort = targetPort;
                        }
                    }
                }

                // Reconnect
                if (link.SourcePort != minSourcePort)
                {
                    portsToRefresh.Add(link.SourcePort);
                    portsToRefresh.Add(minSourcePort);
                    link.SetSourcePort(minSourcePort);
                }

                if (link.TargetPort != minTargetPort)
                {
                    portsToRefresh.Add(link.TargetPort);
                    portsToRefresh.Add(minTargetPort);
                    link.SetTargetPort(minTargetPort);
                }
            }

            foreach (var port in portsToRefresh)
            {
                port.Refresh();
            }
        }
        /// <summary>
        /// Get the UtilityNetwork from the layer
        /// </summary>
        /// <param name="layer">Layer</param>
        /// <returns>UtilityNetwork</returns>
        private static UtilityNetwork GetUtilityNetworkFromLayer(Layer layer)
        {
            if (layer == null)
            {
                return(null);
            }

            if (layer is UtilityNetworkLayer)
            {
                UtilityNetworkLayer utilityNetworkLayer = layer as UtilityNetworkLayer;
                return(utilityNetworkLayer.GetUtilityNetwork());
            }

            else if (layer is SubtypeGroupLayer)
            {
                CompositeLayer compositeLayer = layer as CompositeLayer;
                UtilityNetwork un;

                foreach (var v in compositeLayer.Layers)
                {
                    un = GetUtilityNetworkFromLayer(v);
                    if (un != null)
                    {
                        return(un);
                    }
                }
            }

            else if (layer is FeatureLayer)
            {
                FeatureLayer featureLayer = layer as FeatureLayer;
                using FeatureClass featureClass = featureLayer.GetFeatureClass();
                if (featureClass.IsControllerDatasetSupported())
                {
                    IReadOnlyList <Dataset> controllerDatasets = featureClass.GetControllerDatasets();
                    foreach (Dataset controllerDataset in controllerDatasets)
                    {
                        if (controllerDataset is UtilityNetwork)
                        {
                            return(controllerDataset as UtilityNetwork);
                        }
                    }
                }
            }

            else if (layer is DiagramLayer dl)
            {
                NetworkDiagram diagram        = dl.GetNetworkDiagram();
                DiagramManager diagramManager = diagram.DiagramManager;

                return(diagramManager.GetNetwork <UtilityNetwork>());
            }
            return(null);
        }
Пример #27
0
        private void DiagramManager_MouseMove(Model model, MouseEventArgs e)
        {
            if (!DiagramManager.Options.AllowPanning || _initialPan == null)
            {
                return;
            }

            var deltaX = e.ClientX - _lastClientX - (DiagramManager.Pan.X - _initialPan.X);
            var deltaY = e.ClientY - _lastClientY - (DiagramManager.Pan.Y - _initialPan.Y);

            DiagramManager.UpdatePan(deltaX, deltaY);
        }
Пример #28
0
        private void DiagramManager_KeyDown(KeyboardEventArgs e)
        {
            if (!DiagramManager.Options.GroupingEnabled)
            {
                return;
            }

            if (DiagramManager.SelectedModels.Count == 0)
            {
                return;
            }

            if (!e.CtrlKey || !e.AltKey || !e.Key.Equals("g", StringComparison.InvariantCultureIgnoreCase))
            {
                return;
            }

            var selectedNodes = DiagramManager.SelectedModels
                                .Where(m => m is NodeModel)
                                .Select(m => (NodeModel)m)
                                .ToArray();

            var nodesWithGroup = selectedNodes.Where(n => n.Group != null).ToArray();

            if (nodesWithGroup.Length > 0)
            {
                // Ungroup
                foreach (var group in nodesWithGroup.GroupBy(n => n.Group !).Select(g => g.Key))
                {
                    DiagramManager.Ungroup(group);
                }
            }
            else
            {
                // Group
                if (selectedNodes.Length < 2)
                {
                    return;
                }

                if (selectedNodes.Any(n => n.Group != null))
                {
                    return;
                }

                if (selectedNodes.Select(n => n.Layer).Distinct().Count() > 1)
                {
                    return;
                }

                DiagramManager.Group(selectedNodes);
            }
        }
Пример #29
0
        private void DiagramManager_MouseMove(Model model, MouseEventArgs e)
        {
            if (_initialPan == null)
            {
                return;
            }

            var deltaX = e.ClientX - _lastClientX - (DiagramManager.Pan.X - _initialPan.X);
            var deltaY = e.ClientY - _lastClientY - (DiagramManager.Pan.Y - _initialPan.Y);

            DiagramManager.ChangePan(deltaX, deltaY);
        }
Пример #30
0
        protected override void BuildRenderTree(RenderTreeBuilder builder)
        {
            var componentType = DiagramManager.GetComponentForModel(Link) ??
                                DiagramManager.Options.Links.DefaultLinkComponent ??
                                typeof(LinkWidget);

            builder.OpenElement(0, "g");
            builder.AddAttribute(1, "class", "link");
            builder.AddAttribute(2, "onmousedown", EventCallback.Factory.Create <MouseEventArgs>(this, OnMouseDown));
            builder.AddEventStopPropagationAttribute(3, "onmousedown", true);
            builder.OpenComponent(4, componentType);
            builder.AddAttribute(5, "Link", Link);
            builder.CloseComponent();
            builder.CloseElement();
        }
Пример #31
0
		/// <summary>
		/// OnDragDrop is used to create classes corresponding to the selection dragged
		/// from the Server Explorer
		/// </summary>
		private void OnDragDrop(object sender, DragEventArgs e)
		{
			// Check if the data present is in the DSRef format
			if (e.Data.GetDataPresent(DSRefNavigator.DataSourceReferenceFormat))
			{
				try
				{
					// Create a navigator for the DSRef Consumer (and dispose it when finished)
					using(DSRefNavigator navigator = new DSRefNavigator(e.Data.GetData(
					                                                    	DSRefNavigator.DataSourceReferenceFormat)
					                                                    as Stream))
					{
						_output = new OutputWindowHelper(DTEHelper.GetDTE(Store));

						// Get connection info of the connection of selected tables
						string providerType = null;
						IDbConnection connection = ServerExplorerHelper.GetConnection(navigator, out providerType);

						IDbHelper helper;

						switch(providerType)
						{
							case "System.Data.SqlClient.SqlConnection":
								helper = new SqlHelper(connection);
								break;
                            case "System.Data.OracleClient.OracleConnection":
                            case "Oracle.DataAccess.Client.OracleConnection":
                                Log("Selecting Oracle Helper for provider " + providerType);
                                helper = new OracleHelper(connection);
                                break;
                            case "MySql.Data.MySqlClient.MySqlConnection":
								helper = new MySqlHelper(connection);
								break;
							default:
								// TODO: Support other databases with native providers.
								Log(
									string.Format(
                                        @"Failed: ActiveWriter does not support model generation through {0}. Supported providers: System.Data.SqlClient.SqlConnection, System.Data.OracleClient.OracleConnection, Oracle.DataAccess.Client.OracleConnection, MySql.Data.MySqlClient.MySqlConnection. You can help us improve this functionality, though. See http://www.castleproject.org/others/contrib/index.html to access ActiveWriter source code under the contrib repository, and check Dsl\ServerExplorerSupport\IDbHelper.cs for the start.",
										providerType));
								return;
						}

						// Get the root element where we'll add the classes
						Model model = Helper.GetModel(Store);
						if (model == null)
						{
							Log("Failed: Cannot get the model for the store.");
							return;
						}

						_manager = new DiagramManager(Store, model);
						_manager.OutputWindow = _output;

						// Create a transaction to add the clases.
						using(Transaction txAdd =
							model.Store.TransactionManager.BeginTransaction("Add classes"))
						{
							List<DSRefNode> tableList = new List<DSRefNode>();
							// Get the tables from the Server Explorer selection
							// We'll iterate this list twice to use nodes' list to
							// determine if we have to generate relations for each
							// table or not.
							foreach(DSRefNode node in navigator.ChildTableNodes)
							{
								tableList.Add(node);
							}

							_manager.Tables = tableList;

							_relations = new List<Relation>();

							foreach(DSRefNode node in tableList)
							{
								// Create the table and add it to the model
								ModelClass cls = _manager.NewClass(node.Owner, node.Name);
								PopulateClass(cls, connection, helper);
								_manager.AssignModel(cls);
							}

							// Create relations
							if (_relations != null && _relations.Count > 0)
							{
								HandleRelations();
							}

							// Commit the transaction and add tables to the model
							txAdd.Commit();
						}

						// TODO: Auto layout doesn't work well. Will check with future versions of DSL tools.
						// this.AutoLayoutShapeElements(this.NestedChildShapes);
					}
				}
				catch(Exception ex)
				{
					Debug.WriteLine(ex.Message);
				}
				finally
				{
					_manager = null;
					_relations = null;
					_output = null;
				}
			}
		}