private static T CreateChildElement <T>(ModelElement parent, bool raiseInstantiateEvents) where T : ModelElement
        {
            var childClass = parent.Partition.DomainDataDirectory.DomainClasses
                             .FirstOrDefault(dci => typeof(T).IsAssignableFrom(dci.ImplementationClass) && !dci.ImplementationClass.IsAbstract);
            var elementOperations = new ElementOperations(parent.Store, parent.Partition);

            if (elementOperations != null)
            {
                var elementGroupPrototype = new ElementGroupPrototype(parent.Partition, childClass.Id);

                var partition    = elementOperations.ChooseMergeTarget(parent, elementGroupPrototype).Partition;
                var element      = (T)partition.ElementFactory.CreateElement(childClass);
                var elementGroup = new ElementGroup(partition);
                elementGroup.Add(element);
                elementGroup.MarkAsRoot(element);
                elementOperations.MergeElementGroup(parent, elementGroup);

                // Flag the element in the state so that the ProductStore class sees it and doesn't
                // raise the instantiation event.
                if (!raiseInstantiateEvents)
                {
                    element.Store.PropertyBag.Add(element, null);
                }

                return(element);
            }

            return(default(T));
        }
        private bool PasteShapes()
        {
            // Get prototypes from clipboard, if they exist
            IDataObject           dataObject            = Clipboard.GetDataObject();
            ElementGroupPrototype elementGroupPrototype = ElementOperations.GetElementGroupPrototype(ServiceProvider, dataObject);

            // if we're not pasting on the diagram (i.e., the ModelRoot), we're pasting the prototype
            if (TargetElement is ModelRoot &&
                CurrentModelingDocView is EFModelDocView efModelDocView &&
                efModelDocView.Diagram is EFModelDiagram currentDiagram &&
                currentDiagram?.Store != null &&
                elementGroupPrototype != null)
            {
                Store store = efModelDocView.Diagram.Store;

                // get matching elements from the store
                List <ModelElement> modelElements = elementGroupPrototype.ProtoElements
                                                    .Select(p => store.ElementDirectory.FindElement(p.ElementId))
                                                    .Where(e => e != null)
                                                    .ToList();

                if (modelElements.Any())
                {
                    List <ModelClass>   modelClasses   = modelElements.OfType <ModelClass>().ToList();
                    List <Comment>      comments       = modelElements.OfType <Comment>().ToList();
                    List <ModelElement> everythingElse = modelElements.Except(modelClasses).Except(comments).ToList();
                    List <ShapeElement> newShapes      = new List <ShapeElement>();

                    using (Transaction t = store.TransactionManager.BeginTransaction())
                    {
                        // paste classes and comments first to ensure that any possible connector end is present before the connectors arrive
                        newShapes.AddRange(modelClasses.Select(e => EFModelDiagram.AddExistingModelElement(currentDiagram, e)));
                        newShapes.AddRange(comments.Select(e => EFModelDiagram.AddExistingModelElement(currentDiagram, e)));
                        newShapes.AddRange(everythingElse.Select(e => EFModelDiagram.AddExistingModelElement(currentDiagram, e)));
                        newShapes = newShapes.Where(s => s != null).ToList();

                        // if nothing got pasted (because it's already there), we succeeded in our paste but didn't really change
                        // the display, so nothing further needs done
                        if (!newShapes.Any())
                        {
                            return(true);
                        }

                        t.Commit();
                    }

                    using (Transaction t = store.TransactionManager.BeginTransaction())
                    {
                        Commands.LayoutDiagram(currentDiagram, newShapes);
                        t.Commit();
                    }

                    currentDiagram.Invalidate();

                    return(true);
                }
            }

            return(false);
        }
Exemple #3
0
        public string GetKey_ReturnsKey(int[] descendants)
        {
            IElement element = Message.Build(Any.Message());

            element = (descendants ?? new int[] {}).Aggregate(element, (current, index) => current[index]);
            return(ElementOperations.GetKey(element));
        }
        private static void CopyElementGraph(Store targetStore, ModelElement targetElement, ModelElement element)
        {
            var dataObject = new DataObject();

            var elementOperations = new ElementOperations(targetStore, targetStore.DefaultPartition);

            tracer.Verbose(string.Format(CultureInfo.InvariantCulture,
                                         Properties.Resources.PatternModelCloner_CloningElement, element.Id));
            elementOperations.Copy(dataObject, new List <ModelElement> {
                element
            });

            targetStore.TransactionManager.DoWithinTransaction(() =>
                                                               elementOperations.Merge(targetElement, dataObject));
        }
Exemple #5
0
        public void IsEncodingCharacterField_ReturnsFalse_OnSubcomponent()
        {
            var element = Message.Build(Any.Message());

            ElementOperations.IsEncodingCharacterField(element[1][3][1][1][1]).Should().BeFalse();
        }
Exemple #6
0
        public void IsEncodingCharacterField_ReturnsFalse_OnSegment(int index)
        {
            var element = Message.Build(Any.Message());

            ElementOperations.IsEncodingCharacterField(element[index]).Should().BeFalse();
        }
Exemple #7
0
        public bool IsEncodingCharacterField_ReturnsTrue_OnlyOnEncodingFields(int fieldIndex)
        {
            var element = Message.Build(Any.Message());

            return(ElementOperations.IsEncodingCharacterField(element[1][fieldIndex]));
        }
        private static void CopyElementGraph(Store targetStore, ModelElement targetElement, ModelElement element)
        {
            var dataObject = new DataObject();

            var elementOperations = new ElementOperations(targetStore, targetStore.DefaultPartition);

            tracer.Verbose(string.Format(CultureInfo.InvariantCulture,
                Properties.Resources.PatternModelCloner_CloningElement, element.Id));
            elementOperations.Copy(dataObject, new List<ModelElement> { element });

            targetStore.TransactionManager.DoWithinTransaction(() =>
                elementOperations.Merge(targetElement, dataObject));
        }