private void ReappointReferences(RelationshipVisualRepresentation SourceRelVisRep, RelationshipVisualRepresentation ClonedRelVisRep, List <Capsule <VisualRepresentation, VisualRepresentation> > InterrelationsMap, double DeltaX, double DeltaY) { // NOTE: Each InterrelationsMap capsule contains: Value0=Original Representation, Value1=Cloned Representation. foreach (var SourceVisConn in SourceRelVisRep.VisualConnectors) { var InterRel = InterrelationsMap.FirstOrDefault( intrel => intrel.Value0.RepresentedIdea == SourceVisConn.RepresentedLink.AssociatedIdea); if (InterRel == null || InterRel.Value1 == null) { continue; } var ClonedRoleLink = new RoleBasedLink(ClonedRelVisRep.RepresentedRelationship, InterRel.Value1.RepresentedIdea, SourceVisConn.RepresentedLink.RoleDefinitor, SourceVisConn.RepresentedLink.RoleVariant); if (SourceVisConn.RepresentedLink.Descriptor != null) { ClonedRoleLink.Descriptor = (SimplePresentationElement)SourceVisConn.RepresentedLink.Descriptor.CreateClone(); } // Next, the origin and target symbols are pointed and eventually replaced by the cloned ones // (if they were within the pasted visual representations) VisualSymbol OriginSymbol = SourceVisConn.OriginSymbol; var OriginInterRel = InterrelationsMap.FirstOrDefault(intrel => intrel.Value0.MainSymbol == SourceVisConn.OriginSymbol); if (OriginInterRel != null) { OriginSymbol = OriginInterRel.Value1.MainSymbol; } VisualSymbol TargetSymbol = SourceVisConn.TargetSymbol; var TargetInterRel = InterrelationsMap.FirstOrDefault(intrel => intrel.Value0.MainSymbol == SourceVisConn.TargetSymbol); if (TargetInterRel != null) { TargetSymbol = TargetInterRel.Value1.MainSymbol; } var ClonedVisConn = new VisualConnector(ClonedRelVisRep, ClonedRoleLink, OriginSymbol, TargetSymbol, new Point(SourceVisConn.OriginPosition.X + DeltaX, SourceVisConn.OriginPosition.Y + DeltaY), new Point(SourceVisConn.TargetPosition.X + DeltaX, SourceVisConn.TargetPosition.Y + DeltaY)); ClonedVisConn.IntermediatePosition = (SourceVisConn.IntermediatePosition == Display.NULL_POINT ? Display.NULL_POINT : new Point(SourceVisConn.IntermediatePosition.X + DeltaX, SourceVisConn.IntermediatePosition.Y + DeltaY)); ClonedRelVisRep.RepresentedRelationship.AddLink(ClonedRoleLink); ClonedRelVisRep.AddVisualPart(ClonedVisConn); } ClonedRelVisRep.Render(); }
// --------------------------------------------------------------------------------------------------------------------------------------------------------- /// <summary> /// Reassign a Link, represented by the supplied Connector, to the specified new-target. /// </summary> public static void RelinkRelationship(VisualConnector Connector, VisualSymbol NewConnectedSymbol, Point RelinkingPosition, bool IsConnectingTarget) { // If ReLinking, not only changing connection position, from/to a non relationship central/main symbol... if ((IsConnectingTarget && Connector.TargetSymbol != NewConnectedSymbol && Connector.OwnerRelationshipRepresentation.MainSymbol != Connector.TargetSymbol) || (!IsConnectingTarget && Connector.OriginSymbol != NewConnectedSymbol && Connector.OwnerRelationshipRepresentation.MainSymbol != Connector.OriginSymbol)) { var CanLink = EvaluateLinkability( Connector.OwnerRelationshipRepresentation.RepresentedRelationship.RelationshipDefinitor.Value, (IsConnectingTarget ? Connector.OriginSymbol.OwnerRepresentation : NewConnectedSymbol.OwnerRepresentation /*- Connector.TargetSymbol.OwnerRepresentation*/), (IsConnectingTarget ? NewConnectedSymbol.OwnerRepresentation /*- Connector.TargetSymbol.OwnerRepresentation*/ : Connector.OriginSymbol.OwnerRepresentation), (IsConnectingTarget ? Connector.OwnerRelationshipRepresentation.RepresentedRelationship : NewConnectedSymbol.OwnerRepresentation.RepresentedIdea as Relationship), (IsConnectingTarget ? NewConnectedSymbol.OwnerRepresentation.RepresentedIdea as Relationship : Connector.OwnerRelationshipRepresentation.RepresentedRelationship), Connector.OwnerRelationshipRepresentation.RepresentedRelationship, true); if (!CanLink.Result) { Console.WriteLine("Cannot change link. Cause: " + CanLink.Message); return; } if (IsConnectingTarget) { Connector.TargetSymbol.OriginConnections.Remove(Connector); } else { Connector.OriginSymbol.TargetConnections.Remove(Connector); } Connector.RepresentedLink.AssociatedIdea.AssociatingLinks.Remove(Connector.RepresentedLink); Connector.RepresentedLink.AssociatedIdea = NewConnectedSymbol.OwnerRepresentation.RepresentedIdea; Connector.RepresentedLink.AssociatedIdea.AssociatingLinks.Add(Connector.RepresentedLink); if (IsConnectingTarget) { Connector.TargetSymbol = NewConnectedSymbol; Connector.TargetSymbol.OriginConnections.Add(Connector); } else { Connector.OriginSymbol = NewConnectedSymbol; Connector.OriginSymbol.TargetConnections.Add(Connector); } } else // else, if only changing position, then ensure that the target and origin symbol is the same if (NewConnectedSymbol != (IsConnectingTarget ? Connector.TargetSymbol : Connector.OriginSymbol)) { return; } if (IsConnectingTarget) { Connector.TargetPosition = RelinkingPosition; } else { Connector.OriginPosition = RelinkingPosition; } var NewEdgePos = RelinkingPosition.DetermineNearestIntersectingPoint( (IsConnectingTarget ? Connector.FinalOriginPoint : Connector.FinalTargetPoint), NewConnectedSymbol.OwnerRepresentation.DisplayingView.Presenter, NewConnectedSymbol.Graphic, NewConnectedSymbol.OwnerRepresentation.DisplayingView.VisualHitTestFilter); if (IsConnectingTarget) { Connector.TargetEdgePosition = NewEdgePos; } else { Connector.OriginEdgePosition = NewEdgePos; } NewConnectedSymbol.UpdateConnectorMiddleSymbolOfSimpleRel(Connector, !IsConnectingTarget, Enumerable.Empty <VisualSymbol>()); Connector.RenderElement(); Connector.OwnerRelationshipRepresentation.RepresentedRelationship.NotifyPropertyChange("DescriptiveCaption"); }
// --------------------------------------------------------------------------------------------------------------------------------------------------------- public static OperationResult <Relationship> CreateRelationship(Idea DestinationComposite, RelationshipDefinition Definitor, View TargetView, VisualRepresentation OriginRepresentation, Point OriginPosition, VisualRepresentation TargetRepresentation, Point TargetPosition, bool ExtendFromOriginRelationship = true, // (Shift not pressed) Applicable only when origin and target are both relationships. Else (Shift pressed) create Rel. from Target to Origin. bool ExtendExistingRelationship = true) // (Right-Alt not pressed) Applicable only when origin is a not (simple and hiding-central-symbol) relationship. Else (Right-Alt pressed) created Rel. from Rel. { bool EditInPlace = false; General.ContractRequiresNotNull(DestinationComposite, Definitor, TargetView, OriginRepresentation); var MaxQuota = AppExec.CurrentLicenseEdition.TechName.SelectCorresponding(LicensingConfig.IdeasCreationQuotas); if (!ProductDirector.ValidateEditionLimit(DestinationComposite.OwnerComposition.DeclaredIdeas.Count() + 1, MaxQuota, "create", "Ideas (Concepts + Relationships)")) { return(OperationResult.Failure <Relationship>("This product edition cannot create more than " + MaxQuota + " Ideas.")); } if (!ExtendFromOriginRelationship && (TargetRepresentation == null || !(TargetRepresentation.RepresentedIdea is Relationship))) { ExtendFromOriginRelationship = true; } var PotentialOriginRelationship = OriginRepresentation.RepresentedIdea as Relationship; var PotentialTargetRelationship = (TargetRepresentation == null ? (Relationship)null : TargetRepresentation.RepresentedIdea as Relationship); bool CreatingNewRelationship = (/*?*/ !ExtendExistingRelationship || /*?*/ !((PotentialOriginRelationship != null && PotentialOriginRelationship.RelationshipDefinitor.Value == Definitor) || (PotentialTargetRelationship != null && PotentialTargetRelationship.RelationshipDefinitor.Value == Definitor))); bool?ExtensionFromOriginRelationship = (CreatingNewRelationship ? (bool?)null : (PotentialOriginRelationship != null && ExtendFromOriginRelationship)); if (!CreatingNewRelationship && TargetRepresentation == null) { if (OriginRepresentation is RelationshipVisualRepresentation) { return(OperationResult.Success(((RelationshipVisualRepresentation)OriginRepresentation).RepresentedRelationship, "Creating new Relationship.")); } else { return(OperationResult.Failure <Relationship>("There is no targeted Idea to relate.")); } } if (DestinationComposite.IdeaDefinitor.CompositeContentDomain == null) { return(OperationResult.Failure <Relationship>("Destination Container doest not accept Composite-Content.", DestinationComposite)); } if (DestinationComposite.CompositeContentDomain.GlobalId != Definitor.OwnerDomain.GlobalId) { return(OperationResult.Failure <Relationship>("The destination container only accepts content of the '" + DestinationComposite.CompositeContentDomain.Name + "' Domain.")); } Relationship WorkingRelationship = null; LinkRoleDefinition OriginLinkRoleDef = null; RoleBasedLink OriginLink = null; DestinationComposite.EditEngine.StartCommandVariation("Create Relationship"); if (CreatingNewRelationship) { if (TargetRepresentation != null) { var CanLink = Definitor.CanLink(OriginRepresentation.RepresentedIdea.IdeaDefinitor, TargetRepresentation.RepresentedIdea.IdeaDefinitor); if (!CanLink.Result) { DestinationComposite.EditEngine.DiscardCommandVariation(); return(OperationResult.Failure <Relationship>(CanLink.Message)); } } string NewName = Definitor.Name; var AppendNumToName = AppExec.GetConfiguration <bool>("IdeaEditing", "Relationship.OnCreationAppendDefNameAndNumber", true); if (AppendNumToName) { NewName = NewName + " (Idea " + (DestinationComposite.CompositeIdeas.Count + 1).ToString() + ")"; } WorkingRelationship = new Relationship(DestinationComposite.OwnerComposition, Definitor, NewName, NewName.TextToIdentifier()); if (Definitor.IsVersionable) { WorkingRelationship.Version = new VersionCard(); } WorkingRelationship.AddToComposite(DestinationComposite); OriginLinkRoleDef = Definitor.GetLinkForRole(ERoleType.Origin); OriginLink = new RoleBasedLink(WorkingRelationship, OriginRepresentation.RepresentedIdea, OriginLinkRoleDef, OriginLinkRoleDef.AllowedVariants[0]); WorkingRelationship.AddLink(OriginLink); PotentialOriginRelationship = WorkingRelationship; EditInPlace = true; } else { OperationResult <bool> CanLink = OperationResult.Success(true); if (ExtensionFromOriginRelationship.IsTrue()) { WorkingRelationship = PotentialOriginRelationship; } else { WorkingRelationship = (PotentialTargetRelationship != null ? PotentialTargetRelationship : PotentialOriginRelationship); } if (TargetRepresentation != null) { CanLink = EvaluateLinkability(Definitor, OriginRepresentation, TargetRepresentation, PotentialOriginRelationship, PotentialTargetRelationship, WorkingRelationship); if (!CanLink.Result) { DestinationComposite.EditEngine.DiscardCommandVariation(); return(OperationResult.Failure <Relationship>("Cannot create/extend Relationship. Cause: " + CanLink.Message)); } } } LinkRoleDefinition WorkingLinkRoleDef = null; RoleBasedLink WorkingLink = null; if (TargetRepresentation != null && (CreatingNewRelationship || (WorkingRelationship == PotentialOriginRelationship && ExtensionFromOriginRelationship.IsTrue()))) { WorkingLinkRoleDef = Definitor.GetLinkForRole(ERoleType.Target); if (WorkingRelationship.Links.Where(link => link.RoleDefinitor == WorkingLinkRoleDef && link.AssociatedIdea == TargetRepresentation.RepresentedIdea).Any()) { DestinationComposite.EditEngine.DiscardCommandVariation(); return(OperationResult.Failure <Relationship>("Cannot create Target Link. Cause: Already exists one of the same role-type associating the same Idea.")); } WorkingLink = new RoleBasedLink(WorkingRelationship, TargetRepresentation.RepresentedIdea, WorkingLinkRoleDef, WorkingLinkRoleDef.AllowedVariants[0]); WorkingRelationship.AddLink(WorkingLink); } if (OriginRepresentation != null && !CreatingNewRelationship && WorkingRelationship == PotentialTargetRelationship && !ExtensionFromOriginRelationship.IsTrue()) { WorkingLinkRoleDef = Definitor.GetLinkForRole(ERoleType.Origin); if (WorkingRelationship.Links.Where(link => link.RoleDefinitor == WorkingLinkRoleDef && link.AssociatedIdea == OriginRepresentation.RepresentedIdea).Any()) { DestinationComposite.EditEngine.DiscardCommandVariation(); return(OperationResult.Failure <Relationship>("Cannot create Origin Link. Cause: Already exists one of the same role-type associating the same Idea.")); } WorkingLink = new RoleBasedLink(WorkingRelationship, OriginRepresentation.RepresentedIdea, WorkingLinkRoleDef, WorkingLinkRoleDef.AllowedVariants[0]); WorkingRelationship.AddLink(WorkingLink); } RelationshipVisualRepresentation Representator = null; VisualSymbol CentralSymbol = null; if (TargetPosition != Display.NULL_POINT && OriginPosition != Display.NULL_POINT) { VisualConnector OriginConnector = null; var InitialPosition = OriginPosition; var EdgeOriginPosition = OriginPosition; var EdgeTargetPosition = TargetPosition; if (CreatingNewRelationship) { // Force connect from Symbols' centers. if (OriginRepresentation != null) { EdgeOriginPosition = OriginPosition.DetermineNearestIntersectingPoint(TargetPosition, TargetView.Presenter, OriginRepresentation.MainSymbol.Graphic, TargetView.VisualHitTestFilter); } if (TargetRepresentation == null) { InitialPosition = TargetPosition; } else { EdgeTargetPosition = TargetPosition.DetermineNearestIntersectingPoint(OriginPosition, TargetView.Presenter, TargetRepresentation.MainSymbol.Graphic, TargetView.VisualHitTestFilter); InitialPosition = EdgeOriginPosition.DetermineCenterRespect(EdgeTargetPosition); } // Create representation Representator = CreateRelationshipVisualRepresentation(WorkingRelationship, TargetView, InitialPosition); CentralSymbol = Representator.MainSymbol; // Notice that here the Origin connector is being drawn, so the Target plug is empty/none (because is connected to the Relationship Central/Main Symbol). OriginConnector = new VisualConnector(Representator, OriginLink, OriginRepresentation.MainSymbol, CentralSymbol, OriginPosition, CentralSymbol.BaseCenter); } else { if (WorkingRelationship == PotentialOriginRelationship) { Representator = (RelationshipVisualRepresentation)OriginRepresentation; } else { Representator = (RelationshipVisualRepresentation)TargetRepresentation; } CentralSymbol = OriginRepresentation.MainSymbol; InitialPosition = CentralSymbol.BaseCenter; } VisualConnector TargetConnector = null; VisualConnector OriginAutoRefConnector = null; if (TargetRepresentation != null) { TargetConnector = new VisualConnector(Representator, WorkingLink, CentralSymbol, TargetRepresentation.MainSymbol, InitialPosition, TargetPosition); if (WorkingRelationship == PotentialOriginRelationship) { OriginAutoRefConnector = CentralSymbol.OriginConnections.FirstOrDefault(conn => conn.OriginSymbol == TargetRepresentation.MainSymbol); } } if (CreatingNewRelationship) { Representator.AddVisualPart(OriginConnector); } if (TargetConnector != null) { Representator.AddVisualPart(TargetConnector); } if (OriginAutoRefConnector != null) { Representator.BendAutoRefConnectors(OriginAutoRefConnector, TargetConnector); } Representator.Render(); } DestinationComposite.UpdateVersion(); DestinationComposite.EditEngine.CompleteCommandVariation(); var InformedRelationship = WorkingRelationship; if (WorkingRelationship == PotentialTargetRelationship && PotentialOriginRelationship != null) { InformedRelationship = PotentialOriginRelationship; } return(OperationResult.Success(InformedRelationship, null, null, CentralSymbol.OwnerRepresentation, EditInPlace)); }
public static void SetLabelLinkDescriptor(VisualConnector Instance, bool Value) { SetValue(Instance, __LabelLinkDescriptor.TechName, Value); }
public static bool GetLabelLinkDescriptor(VisualConnector Instance) { return((bool)GetValue(Instance, __LabelLinkDescriptor.TechName)); }
public static void SetLabelLinkVariant(VisualConnector Instance, bool Value) { SetValue(Instance, __LabelLinkVariant.TechName, Value); }
public static bool GetLabelLinkVariant(VisualConnector Instance) { return((bool)GetValue(Instance, __LabelLinkVariant.TechName)); }
public static void SetPathCorner(VisualConnector Instance, EPathCorner Value) { SetValue(Instance, __PathCorner.TechName, Value); }
public static EPathCorner GetPathCorner(VisualConnector Instance) { return((EPathCorner)GetValue(Instance, __PathCorner.TechName)); }
public static void SetPathStyle(VisualConnector Instance, EPathStyle Value) { SetValue(Instance, __PathStyle.TechName, Value); }
public static EPathStyle GetPathStyle(VisualConnector Instance) { return((EPathStyle)GetValue(Instance, __PathStyle.TechName)); }
/// <summary> /// Constructor. /// </summary> public ViewConnectorManipulationAdorner(ViewManipulationManager OwnerManager, VisualConnector WorkingConnector, AdornerLayer WorkingLayer, Action <ViewManipulationAdorner, bool, bool, bool, bool, bool, bool, bool, bool> ManipulationOperation) : base(OwnerManager, WorkingConnector, WorkingLayer) { this.TentativeAction_ = (byte)EConnectorManipulationAction.Displace; this.DefaultAction_ = (byte)EConnectorManipulationAction.Displace; this.ManipulationOperation = ManipulationOperation; var OriginEdgePoint = WorkingConnector.OriginPosition.DetermineNearestIntersectingPoint(WorkingConnector.TargetPosition, OwnerManager.OwnerView.Presenter, WorkingConnector.OriginSymbol.Graphic, OwnerManager.OwnerView.VisualHitTestFilter); var TargetEdgePoint = WorkingConnector.TargetPosition.DetermineNearestIntersectingPoint(WorkingConnector.OriginPosition, OwnerManager.OwnerView.Presenter, WorkingConnector.TargetSymbol.Graphic, OwnerManager.OwnerView.VisualHitTestFilter); var ViewPosition = Mouse.GetPosition(this.OwnerManager.OwnerView.Presenter); var DistanceToOrigin = (ViewPosition - OriginEdgePoint).Length; var DistanceToTarget = (ViewPosition - TargetEdgePoint).Length; this.ManipulationAlternatePosition = (WorkingConnector.OriginSymbol == WorkingConnector.OwnerRelationshipRepresentation.MainSymbol ? WorkingConnector.OriginPosition : WorkingConnector.TargetPosition); this.ManipulConnDisplacingPos = (this.ManipulatedConnector.IntermediatePosition == Display.NULL_POINT ? (WorkingConnector.OriginSymbol == WorkingConnector.OwnerRelationshipRepresentation.MainSymbol ? new Point((this.ManipulationAlternatePosition.X + TargetEdgePoint.X) / 2.0, (this.ManipulationAlternatePosition.Y + TargetEdgePoint.Y) / 2.0) : new Point((OriginEdgePoint.X + this.ManipulationAlternatePosition.X) / 2.0, (OriginEdgePoint.Y + this.ManipulationAlternatePosition.Y) / 2.0)) : this.ManipulatedConnector.IntermediatePosition); //T Console.WriteLine("ManConnDisPos=" + this.ManipulConnDisplacingPos + " at " + DateTime.Now.Ticks); if (DistanceToOrigin < DistanceToTarget) { this.WorkingOnOrigin = true; this.ManipulConnRelinkingPos = OriginEdgePoint; } else { this.WorkingOnOrigin = false; this.ManipulConnRelinkingPos = TargetEdgePoint; } this.ActStroke.Opacity = 0.1; }