private void GetArgsAndInitComboBoxes()
        {
            BindingDef def = null;

            foreach (ComboBox cb in _comboxes.Keys)
            {
                def = _comboxes[cb];
                cb.Items.Clear();
                Dictionary <IAction, PropertyInfo[]> atts = _bindingEnvironment.QueryCompatibleProperty(_action, def.BindingAttribute, def.PropertyInfo);
                if (atts != null && atts.Count > 0)
                {
                    foreach (IAction act in atts.Keys)
                    {
                        PropertyInfo[] ps = atts[act];
                        if (ps == null || ps.Length == 0)
                        {
                            continue;
                        }
                        foreach (PropertyInfo p in ps)
                        {
                            BindingAttribute    ba     = ArgBindingHelper.GetBingdingAttribute(p.Name, act);
                            BindingScriptObject script = new BindingScriptObject(act, ba, p, def.PropertyInfo);
                            cb.Items.Add(script);
                        }
                    }
                }
            }
        }
 public BindingScriptObject(IAction refAction, BindingAttribute refBindingAtt, PropertyInfo refPropertyInfo, PropertyInfo targetPropertyInfo)
 {
     RefAction          = refAction;
     RefPropertyInfo    = refPropertyInfo;
     RefBindingAtt      = refBindingAtt;
     TargetPropertyInfo = targetPropertyInfo;
 }
        private int CreateLabel(int top, PropertyInfo p, BindingAttribute att)
        {
            Label lb = new Label();

            lb.Top    = top;
            lb.Left   = cstLeft - 14;
            lb.Text   = "○" + att.Name + ":";
            lb.Width  = Width - lb.Left - 64;
            lb.Height = 18;
            panelTop.Controls.Add(lb);
            return(top + lb.Height);
        }
        private int CreateComboBox(int top, PropertyInfo p, BindingAttribute att, out ComboBox cb, BindingPair[] pairs)
        {
            cb = new ComboBox();
            if (pairs != null && pairs.Length > 0)
            {
                InitExistBindingPair(cb, p, pairs);
            }
            //填充现有值
            object pValue = _action.GetType().InvokeMember(p.Name, BindingFlags.GetProperty, null, _action, null);

            if (pValue != null)
            {
                cb.Text = (new BindingDef(p, att, cb).Editor).ToString(pValue);
                cb.Tag  = pValue;
            }
            //
            cb.Left  = cstLeft;
            cb.Top   = top;
            cb.Width = Width - cb.Left - cstRight;
            _comboxes.Add(cb, new BindingDef(p, att, cb));
            cb.KeyPress             += new KeyPressEventHandler(cb_KeyPress);
            cb.DropDown             += new EventHandler(cb_DropDown);
            cb.SelectedIndexChanged += new EventHandler(cb_SelectedIndexChanged);
            panelTop.Controls.Add(cb);
            if (IsRefType(att.SemanticType))
            {
                cb.Width -= 24;
                Button btnEditor = new Button();
                btnEditor.Tag = new BindingDef(p, att, cb);
                if (IsArgFile(att.SemanticType))
                {
                    btnEditor.Image = imageList1.Images[2];
                }
                else if (IsArgDirectory(att.SemanticType))
                {
                    btnEditor.Image = imageList1.Images[3];
                }
                else
                {
                    btnEditor.Image = imageList1.Images[4];
                }
                btnEditor.Left   = cb.Right + 2;
                btnEditor.Top    = cb.Top;
                btnEditor.Width  = 24;
                btnEditor.Height = 20;
                btnEditor.Click += new EventHandler(btnEditor_Click);
                panelTop.Controls.Add(btnEditor);
            }
            return(top + cb.Height + 4);
        }
Exemple #5
0
 /// <summary>
 /// 绑定引用到Action
 /// </summary>
 /// <param name="arg">参数绑定定义对象</param>
 /// <param name="act">待绑定Action</param>
 /// <param name="actType">待绑定Action的具体类型</param>
 /// <returns>是否绑定成功</returns>
 private bool BindRefValueToAction(ActionArg arg, IAction act, Type actType)
 {
     try
     {
         //从已执行队列中发现参数来源Action
         IAction resAction = FindAction(arg.RefActionId);
         if (resAction == null)
         {
             if ((act as ActionBase).Id != arg.RefActionId)
             {
                 LogError(string.Format(errRefActionLost2, act.Name, arg.Name));
                 return(false);
             }
             else
             {
                 resAction = act;
             }
         }
         //获取源Action的BingdingAttribute 元数据                                                        Filename         QualityChecker
         BindingAttribute resBindingAtt = ArgBindingHelper.GetBingdingAttribute(arg.RefName, resAction);
         if (resBindingAtt == null)
         {
             LogError(string.Format(errBindingAttributeLost4, act.Name, arg.Name, resAction.Name, arg.RefName));
             return(false);
         }
         //获取目标Action的BingdingAttribute                                                                 Filename    SpecialRegionChecker
         BindingAttribute desBindingAtt = ArgBindingHelper.GetBingdingAttribute(arg.Name, act);
         if (desBindingAtt == null)
         {
             LogError(string.Format(errBindingAttributeLost4, act.Name, arg.Name, act.Name, arg.Name));
             return(false);
         }
         //绑定参数语义类型是否兼容,泛型关系暂未做处理
         if (!resBindingAtt.SemanticType.Equals(desBindingAtt.SemanticType))
         {
             LogError(string.Format(errArgTypeNotMatch4, act.Name, arg.Name, resAction.Name, arg.RefName));
         }
         //从源Action获取绑定值                               Action1:QualityChecker.Filename
         object refValue = resAction.GetType().InvokeMember(arg.RefName, BindingFlags.GetProperty, null, resAction, null);
         //将获取到的绑定值绑定到目标Action的参数arg.Name        Action2:SpecialRegionChecker.Filename
         actType.InvokeMember(arg.Name, BindingFlags.SetProperty, null, act, new object[] { refValue });
         return(true);
     }
     catch (Exception ex)
     {
         LogError(string.Format(errBindArgFaileExceptionAtNextLog2, act.Name, arg.Name));
         LogException(ex);
         return(false);
     }
 }
        private int CreateInputControl(int top, PropertyInfo p, BindingAttribute att, BindingPair[] pairs)
        {
            ComboBox cb = null;

            top = CreateComboBox(top, p, att, out cb, pairs);
            Type type = p.PropertyType;

            if (type.BaseType != null && type.BaseType.Equals(typeof(Array)))
            {
                top = CreateListBox(top, cb, p, att);
            }
            else
            {
                _dindingDefs.Add(new BindingDef(p, att, cb));
            }
            return(top);
        }
Exemple #7
0
        public Dictionary <IAction, PropertyInfo[]> QueryCompatibleProperty(IAction action, BindingAttribute bindingAttribute, PropertyInfo propertyInfo)
        {
            if (_actionElements == null || _actionElements.Count == 0)
            {
                return(null);
            }
            Dictionary <IAction, PropertyInfo[]> atts = new Dictionary <IAction, PropertyInfo[]>();

            //
            foreach (ActionElement ele in _actionElements)
            {
                IAction act = ele.Action;
                if (act.Equals(action))
                {
                    continue;
                }
                Dictionary <PropertyInfo, BindingAttribute> ps = ArgBindingHelper.GetBindingProperties(act.GetType());
                List <PropertyInfo> infos = new List <PropertyInfo>();
                foreach (PropertyInfo info in ps.Keys)
                {
                    infos.Clear();
                    BindingAttribute ba = ps[info];
                    if (!bindingAttribute.SemanticType.Equals(ba.SemanticType))
                    {
                        continue;
                    }
                    if (!propertyInfo.PropertyType.Equals(info.PropertyType))
                    {
                        continue;
                    }
                    if (ba.Direction == enumBindingDirection.Input || ba.Direction == enumBindingDirection.None)
                    {
                        continue;
                    }
                    infos.Add(info);
                }
                if (infos.Count > 0)
                {
                    atts.Add(act, infos.ToArray());
                }
            }
            return(atts);
        }
        private int CreateListBox(int top, ComboBox cb, PropertyInfo p, BindingAttribute att)
        {
            ListBox lstBox = new ListBox();

            //
            _dindingDefs.Add(new BindingDef(p, att, lstBox));
            //
            lstBox.Left   = cstLeft;
            lstBox.Top    = top + 4;
            lstBox.Height = 100;
            lstBox.Width  = Width - lstBox.Left - 66;
            panelTop.Controls.Add(lstBox);
            //
            Button addBtn = new Button();

            //addBtn.Text = "增加";
            addBtn.Image  = imageList1.Images[0];
            addBtn.Left   = lstBox.Right + 2;
            addBtn.Top    = top + 4;
            addBtn.Width  = 24;
            addBtn.Height = 22;
            addBtn.Tag    = new BtnTag(cb, lstBox);
            addBtn.Click += new EventHandler(addBtn_Click);
            panelTop.Controls.Add(addBtn);
            //
            Button delBtn = new Button();

            //delBtn.Text = "移除";
            delBtn.Image  = imageList1.Images[1];
            delBtn.Left   = lstBox.Right + 2;
            delBtn.Top    = top + 26 + 4;
            delBtn.Width  = 24;
            delBtn.Height = 22;
            delBtn.Tag    = new BtnTag(cb, lstBox);
            delBtn.Click += new EventHandler(delBtn_Click);
            panelTop.Controls.Add(delBtn);
            //
            return(top + lstBox.Height + 8);
        }
        private void BuildControls()
        {
            Type type = _action.GetType();
            Dictionary <PropertyInfo, BindingAttribute> properites = ArgBindingHelper.GetBindingProperties(type);

            if (properites == null || properites.Count == 0)
            {
                return;
            }
            int top = 20;

            BindingPair[] pairs = null;
            if (_bindingEnvironment != null)
            {
                pairs = _bindingEnvironment.GetBindingPairs(_action);
            }
            foreach (PropertyInfo p in properites.Keys)
            {
                BindingAttribute att = properites[p];
                if (att.Direction == enumBindingDirection.None || att.Direction == enumBindingDirection.Output)
                {
                    continue;
                }
                top = CreateLabel(top, p, att);
                top = CreateInputControl(top, p, att, pairs);
            }
            foreach (Control c in panelTop.Controls)
            {
                if (c is ComboBox || c is ListBox)
                {
                    c.Anchor = c.Anchor | AnchorStyles.Right;
                }
                else if (c is Button)
                {
                    c.Anchor = AnchorStyles.Top | AnchorStyles.Right;
                }
            }
        }
 public BindingDef(PropertyInfo propertyInfo, BindingAttribute bindingAtt, Control inputControl)
 {
     PropertyInfo     = propertyInfo;
     BindingAttribute = bindingAtt;
     InputControl     = inputControl;
 }