/// <summary> /// Returns whether two connectors can be connected based on their data types /// </summary> /// <param name="source">The source.</param> /// <returns>True if connector's types are compatible</returns> /// <exception cref="System.NotImplementedException"></exception> public bool CanConnectTo(IConnectorOut source) { if (source.DataType == NodeDataType.List && DataType == NodeDataType.String) { return false; } if (DataType == source.DataType || DataType == NodeDataType.String || DataType == NodeDataType.Field || DataType == NodeDataType.Object) { return true; } switch (source.DataType) { case NodeDataType.String: return false; case NodeDataType.Decimal: return false; case NodeDataType.Double: return DataType == NodeDataType.Decimal; case NodeDataType.DateTime: return false; case NodeDataType.Int: case NodeDataType.Result: return DataType == NodeDataType.Double || DataType == NodeDataType.Decimal; case NodeDataType.Boolean: return false; case NodeDataType.SPCChart: return false; case NodeDataType.GageRR: return false; case NodeDataType.ChartType: return false; } if (DataType == NodeDataType.String) { return true; } throw new NotImplementedException(string.Format("The conversion from {0} to {1} is not implemented", source.DataType, DataType)); }
/// <summary> /// Determines whether the specified connectors can be connected. /// </summary> /// <param name="source">The source connector.</param> /// <param name="destination">The destination connector.</param> /// <returns>ConnectivityState</returns> public ConnectivityState CanConnect(IConnectorOut source, IConnectorIn destination) { var destinationField = FindDestinationField(destination); if (destinationField == null) return ConnectivityState.Allow(); if (!IsAccessible(destinationField)) return ConnectivityState.Refuse( string.Format(CultureInfo.InvariantCulture, "Field {0} is not accessible", destinationField.Name)); if (destinationField.DataType == NodeDataType.List || destinationField.DataType == NodeDataType.Array || destinationField.DataType == NodeDataType.FixedArray || destinationField.DataType == NodeDataType.Checklist || destinationField.DataType == NodeDataType.Sample) return ConnectivityState.Allow(); return IsValidMapping(source, GetSourceContext((DestinationField)destinationField.ParentField)) ? ConnectivityState.Allow() : ConnectivityState.Refuse(); }
/// <summary> /// Determines whether the specified connectors can be connected. /// </summary> /// <param name="source">The source connector.</param> /// <param name="destination">The destination connector.</param> /// <returns>Returns <c>true</c> if the specified connectors can be connected; otherwise, <c>false</c>.</returns> public ConnectivityState CanConnect(IConnectorOut source, IConnectorIn destination) { var sourceOwner = source.Owner as SourceFieldList; var destinationOwner = destination.Owner as DestinationFieldList; if (sourceOwner == null || destinationOwner == null) return ConnectivityState.Allow(); var sourceField = sourceOwner.GetAllFields().FirstOrDefault(f => f.ConnectorOut.Id == source.Id); var destinationField = destinationOwner.GetAllFields().FirstOrDefault(f => f.ConnectorIn.Id == destination.Id); if (sourceField == null || destinationField == null) return ConnectivityState.Allow(); var result = ConnectivityState.Allow(); if (sourceField.DataType == NodeDataType.CrossReference && destinationField.DataType == NodeDataType.CrossReference) { result &= CrossRefFieldsAreCompatible(sourceField, destinationField); } return result; }
/// <summary> /// Finds the source field. /// </summary> /// <param name="fields">The fields.</param> /// <param name="connector">The connector.</param> /// <returns>SourceField.</returns> private SourceField FindSourceField(IEnumerable<SourceField> fields, IConnectorOut connector) { foreach (var sourceField in fields) { if (sourceField.ConnectorOut == connector) return sourceField; var subfield = FindSourceField(sourceField.Subfields.Cast<SourceField>(), connector); if (subfield != null) return subfield; } return null; }
/// <summary> /// Finds the source field. /// </summary> /// <param name="connector">The connector.</param> /// <returns>SourceField.</returns> private SourceField FindSourceField(IConnectorOut connector) { var fieldList = connector.Owner as SourceFieldList; if (fieldList == null) return null; return FindSourceField(fieldList.Fields, connector); }
/// <summary> /// Gets the source context. /// </summary> /// <param name="connector">The connector.</param> /// <returns>SourceField.</returns> private SourceField GetSourceContext(IConnectorOut connector) { return FindSourceField(connector); }
/// <summary> /// Determines whether [is valid mapping] [the specified field list]. /// </summary> /// <param name="fieldList">The field list.</param> /// <param name="connector">The connector.</param> /// <param name="sourceContext">The source context.</param> /// <returns><c>true</c> if [is valid mapping] [the specified field list]; otherwise, <c>false</c>.</returns> private bool IsValidMapping(SourceFieldList fieldList, IConnectorOut connector, SourceField sourceContext) { var sourceField = FindSourceField(fieldList.Fields, connector); if (sourceField == null) return false; return CanAccess(sourceField, sourceContext); }
/// <summary> /// Determines whether [is valid mapping] [the specified connector]. /// </summary> /// <param name="connector">The connector.</param> /// <param name="sourceContext">The source context.</param> /// <returns><c>true</c> if [is valid mapping] [the specified connector]; otherwise, <c>false</c>.</returns> private bool IsValidMapping(IConnectorOut connector, SourceField sourceContext) { if (connector.Owner is ConstantExpression) return true; var oneInOneOutExpression = connector.Owner as OneInOneOutExpression; if (oneInOneOutExpression != null) return IsValidMapping(oneInOneOutExpression, sourceContext); var twoInOneOutExpression = connector.Owner as TwoInOneOutExpression; if (twoInOneOutExpression != null) return IsValidMapping(twoInOneOutExpression, sourceContext); var threeInOneOutExpression = connector.Owner as ThreeInOneOutExpression; if (threeInOneOutExpression != null) return IsValidMapping(threeInOneOutExpression, sourceContext); var fourInOneOutExpression = connector.Owner as FourInOneOutExpression; if (fourInOneOutExpression != null) return IsValidMapping(fourInOneOutExpression, sourceContext); var fiveInOneOutExpression = connector.Owner as FiveInOneOutExpression; if (fiveInOneOutExpression != null) return IsValidMapping(fiveInOneOutExpression, sourceContext); var sixInOneOutExpression = connector.Owner as SixInOneOutExpression; if (sixInOneOutExpression != null) return IsValidMapping(sixInOneOutExpression, sourceContext); var sourceFieldList = connector.Owner as SourceFieldList; if (sourceFieldList != null) return IsValidMapping(sourceFieldList, connector, sourceContext); var functionExpression = connector.Owner as FunctionExpression; if (functionExpression != null) return true; return false; }
/// <summary> /// Determines whether the specified connectors can be connected. /// </summary> /// <param name="sourceConnector">The source connector.</param> /// <param name="destinationConnector">The destination connector.</param> /// <returns>The ConnectivityState.</returns> public ConnectivityState CanConnect(IConnectorOut sourceConnector, IConnectorIn destinationConnector) { var expressionItems = new List<IExpressionObjectBase>(); ExpressionTranslator.TranslateToExpressionObjects(expressionItems, Diagram); ExpressionNodeFactory.RestoreConnections(expressionItems); if (sourceConnector != null && destinationConnector != null) return ExpressionValidator.CanConnect(sourceConnector, destinationConnector); return ConnectivityState.Refuse(); }
private Connection CreateConnection(IConnectorOut source, IConnectorIn sink) { return new Connection { Source = source, Sink = sink }; }