static Type GetMashupVisualizerType(Type dialogMashupType, Type visualizerType, TypeVisualizerMap typeVisualizerMap) { var mashupVisualizerType = default(Type); while (dialogMashupType != null && dialogMashupType != typeof(DialogMashupVisualizer)) { var mashup = typeof(VisualizerMashup <,>).MakeGenericType(dialogMashupType, visualizerType); mashupVisualizerType = typeVisualizerMap.GetTypeVisualizers(mashup).FirstOrDefault(); if (mashupVisualizerType != null) { break; } mashup = typeof(VisualizerMashup <>).MakeGenericType(dialogMashupType); mashupVisualizerType = typeVisualizerMap.GetTypeVisualizers(mashup).FirstOrDefault(); if (mashupVisualizerType != null) { break; } dialogMashupType = dialogMashupType.BaseType; } if (mashupVisualizerType.IsGenericTypeDefinition) { mashupVisualizerType = mashupVisualizerType.MakeGenericType(visualizerType); } return(mashupVisualizerType); }
public static VisualizerDialogLauncher CreateVisualizerLauncher( InspectBuilder source, VisualizerLayout visualizerLayout, TypeVisualizerMap typeVisualizerMap, ExpressionBuilderGraph workflow, Editor.GraphView.WorkflowGraphView workflowGraphView = null) { var inspectBuilder = ExpressionBuilder.GetVisualizerElement(source); if (inspectBuilder.ObservableType == null || !inspectBuilder.PublishNotifications) { return(null); } Type visualizerType = null; var deserializeVisualizer = false; Func <DialogTypeVisualizer> visualizerFactory = null; var layoutSettings = visualizerLayout.GetLayoutSettings(source); var visualizerTypes = typeVisualizerMap.GetTypeVisualizers(inspectBuilder); if (layoutSettings != null && !string.IsNullOrEmpty(layoutSettings.VisualizerTypeName)) { visualizerType = visualizerTypes.FirstOrDefault(type => type.FullName == layoutSettings.VisualizerTypeName); if (visualizerType != null && layoutSettings.VisualizerSettings != null) { var root = layoutSettings.VisualizerSettings; root.SetAttributeValue(XsdAttributeName, XsdAttributeValue); root.SetAttributeValue(XsiAttributeName, XsiAttributeValue); var serializer = new XmlSerializer(visualizerType); using (var reader = layoutSettings.VisualizerSettings.CreateReader()) { if (serializer.CanDeserialize(reader)) { var visualizer = (DialogTypeVisualizer)serializer.Deserialize(reader); visualizerFactory = () => visualizer; deserializeVisualizer = true; } } } } visualizerType ??= visualizerTypes.FirstOrDefault(); if (visualizerType == null) { return(null); } if (visualizerFactory == null) { var visualizerActivation = Expression.New(visualizerType); visualizerFactory = Expression.Lambda <Func <DialogTypeVisualizer> >(visualizerActivation).Compile(); } var launcher = new VisualizerDialogLauncher(visualizerType, inspectBuilder, visualizerFactory, workflow, source, workflowGraphView); launcher.Text = source != null?ExpressionBuilder.GetElementDisplayName(source) : null; if (deserializeVisualizer) { launcher = launcher.Visualizer.Value != null ? launcher : null; } return(launcher); }