Exemple #1
0
        private void ComponentBox_ItemSelected(object sender, ComponentBoxItemModel model)
        {
            if (!IsComponentBoxOpen)
            {
                return;
            }

            // Close Opened Box
            CloseComponentBox();

            // Create Component
            FrameworkElement visual         = AddNewComponent(model, this.PointFromScreen(componentBoxPosition));
            IRenderer        targetRenderer = visual.GetRenderer();

            // * Logic Binding *
            PBinder outputBinder = null;
            PBinder inputBinder  = null;

            // Component -> Component
            if (componentBox.TargetObject is BindRequest request)
            {
                var         host       = request.Source.Binder.Host as PBinderHost;
                IRenderer   renderer   = host.GetRenderer();
                IBinderHost targetHost = targetRenderer.ProvideValue();

                PBinder sourceBinder = request.Source.Binder;
                PBinder targetBinder = targetHost.GetConnectableBinders(sourceBinder).FirstOrDefault() as PBinder;

                if (sourceBinder == null || targetBinder == null)
                {
                    // 연결 실패
                    return;
                }

                BinderHelper.GetPairObject(
                    ref outputBinder, ref inputBinder,
                    (sourceBinder, sourceBinder.BindOption),
                    (targetBinder, targetBinder.BindOption));
            }

            // Layout -> Component
            if (componentBox.TargetObject is PObject pObj)
            {
                IRenderer renderer = pObj.GetRenderer();

                outputBinder = renderer.ProvideValue()[BindOptions.Output].FirstOrDefault() as PBinder;
                inputBinder  = targetRenderer.ProvideValue()[BindOptions.Input].FirstOrDefault() as PBinder;
            }

            if (outputBinder == null || inputBinder == null)
            {
                // 연결 실패
                return;
            }

            ConnectComponent(
                outputBinder.GetView <BindThumb>(),
                inputBinder.GetView <BindThumb>());
        }
Exemple #2
0
        public BindThumb(PBinder binder) : this()
        {
            this.DataContext = binder;

            this.BindOption = binder.BindOption;

            this.Binder.Binded += Binder_Binded;
        }
Exemple #3
0
        // Trigger In / Out Thumb
        private void AddTriggerThumb(PBinder binder)
        {
            var thumb = new BindThumb(binder);

            if (binder.BindOption == BindOptions.Input)
            {
                InputThumbs.Add(thumb);
            }
            else
            {
                OutputThumbs.Add(thumb);
            }

            AddThumbCore(thumb);
        }
Exemple #4
0
        protected virtual void ConnectExpressions(IEnumerable <BindExpression> expressions)
        {
            foreach (var expression in expressions)
            {
                PBinder output = Model.Project.GetComponentBinder(expression.Output);
                PBinder input  = Model.Project.GetComponentBinder(expression.Input);

                var inputRenderer  = ResolveRenderer(input);
                var outputRenderer = ResolveRenderer(output);

                if (outputRenderer.Element.IsVisible && inputRenderer.Element.IsVisible)
                {
                    Connect();
                }
                else
                {
                    if (!outputRenderer.Element.IsVisible)
                    {
                        outputRenderer.ElementAttached += Renderer_ElementAttached;
                    }

                    if (!inputRenderer.Element.IsVisible)
                    {
                        inputRenderer.ElementAttached += Renderer_ElementAttached;
                    }
                }

                void Renderer_ElementAttached(object sender, EventArgs e)
                {
                    if (outputRenderer.Element.IsVisible && inputRenderer.Element.IsVisible)
                    {
                        outputRenderer.ElementAttached -= Renderer_ElementAttached;
                        inputRenderer.ElementAttached  -= Renderer_ElementAttached;

                        Connect();
                    }
                }

                void Connect()
                {
                    BindThumb outputThumb = output.GetView <BindThumb>();
                    BindThumb inputThumb  = input.GetView <BindThumb>();

                    ConnectComponent(outputThumb, inputThumb);
                }
            }
        }
Exemple #5
0
        internal void InitializeProject()
        {
            foreach (PContentPage screen in Model.Project.Screens)
            {
                // Load Renderer
                LoadScreenRenderer(screen);

                DispatcherEx.WaitFor(DispatcherPriority.Loaded);

                // 모든 트리 탐색
                foreach (var node in screen.FindContentChildrens <PObject, PObject>())
                {
                    // Load Renderer
                    LoadElementRenderer(node.Parent, node.Child);
                }
            }

            // 로직
            foreach (PComponent component in Model.Project.Components)
            {
                LoadComponentRenderer(component);
            }

            // 연결 정보
            foreach (var expression in Model.Project.GetBindExpressions())
            {
                PBinder output = Model.Project.GetComponentBinder(expression.Output);
                PBinder input  = Model.Project.GetComponentBinder(expression.Input);

                var outputRenderer = (output.Host as PBinderHost).GetRenderer();

                outputRenderer.ElementAttached += Attached;

                void Attached(object sender, EventArgs e)
                {
                    outputRenderer.ElementAttached -= Attached;

                    BindThumb outputThumb = output.GetView <BindThumb>();
                    BindThumb inputThumb  = input.GetView <BindThumb>();

                    ConnectComponent(outputThumb, inputThumb);
                }
            }
        }
Exemple #6
0
        //string CreateLambda()
        internal static void ProcessBinderValue(DXMapper <CSharpCodeMapAttribute> mapper, IndentStringBuilder sourceBuilder, DXToken token, PBinder binder)
        {
            string valueLine = null;

            // 직접 입력
            if (binder.IsDirectValue)
            {
                object value = binder.DirectValue;

                if (value is string vStr)
                {
                    Match match = Regex.Match(vStr, "(?<=^\")(\\d+\\.\\d+|\\d+)(?=\"$)");

                    if (match.Success)
                    {
                        valueLine = vStr;
                    }
                    else if (double.TryParse(vStr, out double r))
                    {
                        valueLine = r.ToString();
                    }
                    else if (vStr == "\"\"")
                    {
                        valueLine = vStr;
                    }
                }

                if (valueLine == null)
                {
                    valueLine = mapper.MappingProvider.GetValueLine(value, true);
                }
            }
            // 연결됨
            else if (binder.Items.Count == 1)
            {
                var paramOutputHost = binder.Items[0].Host;

                var attr = paramOutputHost.GetAttribute <CSharpCodeMapAttribute>();

                if (paramOutputHost is PTrigger)
                {
                    valueLine = "sender";
                }
                else
                {
                    valueLine = mapper.Build(paramOutputHost, attr.MappingCode).Source;
                }
            }
            else
            {
                // Error
            }

            if (valueLine != null)
            {
                int idx = sourceBuilder.IndexOf(token.OriginalSource);

                // 토큰 부분 제거
                sourceBuilder.Replace(token.OriginalSource, "");

                sourceBuilder.Insert(idx, valueLine);
            }
        }
Exemple #7
0
        private string BuildBinder(BuildStackTrace trace, DXMappingResult result, PBinder binder)
        {
            // 직접 입력 값
            if (binder.IsDirectValue)
            {
                object value = binder.DirectValue;

                if (value is string vStr)
                {
                    Match match = Regex.Match(vStr, "(?<=^\")(\\d+\\.\\d+|\\d+)(?=\"$)");

                    if (match.Success)
                    {
                        return(vStr);
                    }
                    else if (double.TryParse(vStr, out double v))
                    {
                        return(v.ToString());
                    }
                    else if (vStr == "\"\"")
                    {
                        return(vStr);
                    }
                }

                return(MappingProvider.GetValueLine(value, true));
            }

            // 연결된 파라미터가 없음
            if (binder.Items.Count == 0)
            {
                return(null);
            }

            // 연결된 파라미터의 부모 (컴포넌트)
            var    previousHost = binder.Items[0].Host as PBinderHost;
            string mappingCode  = previousHost.GetAttribute <TAttribute>().MappingCode;

            if (binder.HasAttribute <TAttribute>())
            {
                mappingCode = binder.GetAttribute <TAttribute>().MappingCode;
            }

            // 코드 매핑
            var r = buildImpl(trace, previousHost, mappingCode);

            string valueLine = r.Source;

            foreach (var token in r.Errors)
            {
                result.AddErrorToken(token);
            }

            foreach (var token in r.Resolved)
            {
                result.AddResolvedToken(token);
            }

            // 대입 값인 경우 대상 속성에 따라 캐스팅이 필요함
            if ((binder as PParameterBinder).Host is PSetter setter)
            {
                if (setter.ValueBinder.Equals(binder))
                {
                    Type valueType = previousHost.GetType();

                    if (previousHost is PFunction prevFunc)
                    {
                        valueType = prevFunc.FunctionInfo.ReturnType;
                    }

                    if (previousHost is PGetter prevGetter)
                    {
                        valueType = prevGetter.Property.PropertyType;
                    }

                    if (previousHost is PLayoutBinderHost prevLayout)
                    {
                        valueType = prevLayout.LogicalParent.GetType();
                    }

                    if (previousHost is PSelector prevSelector)
                    {
                        valueType = prevSelector.TargetVisual.GetType();
                    }

                    if (setter.Property == null && previousHost is PStructure structure)
                    {
                        if (structure.Fields.Count > 0)
                        {
                            var builder = new StringBuilder();
                            var attr    = typeof(PDataField).GetAttribute <TAttribute>();

                            PDataField[] fields = structure.Fields
                                                  .Where(f => f.ValueBinder.Items.Count > 0)
                                                  .OrderBy(f => f.ValueBinder.Items[0].Host is PFunction ? 1 : 0)
                                                  .ToArray();

                            for (int i = 0; i < fields.Length; i++)
                            {
                                if (fields[i].ValueBinder.Items.Count == 0)
                                {
                                    continue;
                                }

                                var fieldResult = buildImpl(trace, fields[i], attr.MappingCode);

                                if (builder.Length > 0)
                                {
                                    builder.Append(", ");
                                }

                                builder.Append(fieldResult.Source);
                            }

                            return(builder.ToString());
                        }

                        return("");
                    }

                    if (setter.Property.PropertyType != valueType ||
                        setter.Property.Name == "Source")
                    {
                        // on wpf
                        if (setter.Property.Name == "Source")
                        {
                            return(this.MappingProvider.Casting(typeof(ImageSource), valueLine));
                        }

                        // casting
                        return(this.MappingProvider.Casting(setter.Property.PropertyType, valueLine));
                    }
                }
            }

            return(valueLine);
        }
Exemple #8
0
        public string BuildBinder(PBinder binder)
        {
            // 직접 입력 값
            if (binder.IsDirectValue)
            {
                return(this.MappingProvider.GetValueLine(binder.DirectValue, true));
            }

            // 연결된 파라미터가 없음
            if (binder.Items.Count == 0)
            {
                return(null);
            }

            // 연결된 파라미터의 부모 (컴포넌트)
            var    previousHost = binder.Items[0].Host as PBinderHost;
            string mappingCode  = previousHost.GetAttribute <TAttribute>().MappingCode;

            if (binder.HasAttribute <TAttribute>())
            {
                mappingCode = binder.GetAttribute <TAttribute>().MappingCode;
            }

            // 코드 매핑
            var r = this.Build(previousHost, mappingCode);

            string valueLine = r.Source;

            // 대입 값인 경우 대상 속성에 따라 캐스팅이 필요함
            if ((binder as PParameterBinder).Host is PSetter setter)
            {
                if (setter.ValueBinder.Equals(binder))
                {
                    Type valueType = previousHost.GetType();

                    if (previousHost is PFunction prevFunc)
                    {
                        valueType = prevFunc.FunctionInfo.ReturnType;
                    }

                    if (previousHost is PGetter prevGetter)
                    {
                        valueType = prevGetter.Property.PropertyType;
                    }

                    if (previousHost is PLayoutBinderHost prevLayout)
                    {
                        valueType = prevLayout.LogicalParent.GetType();
                    }

                    if (previousHost is PSelector prevSelector)
                    {
                        valueType = prevSelector.TargetVisual.GetType();
                    }

                    if (setter.Property.PropertyType != valueType)
                    {
                        // casting
                        return(this.MappingProvider.Casting(setter.Property.PropertyType, valueLine));
                    }
                }
            }

            return(valueLine);
        }
Exemple #9
0
 private IRenderer ResolveRenderer(PBinder binder)
 {
     return((binder.GetBinderHost() as PBinderHost).GetRenderer());
 }