/// <summary>
        /// Creates and adds to grid a single row corresponding to a single property. Can be called recursively for embedded
        /// objects.
        /// </summary>
        /// <param name="prop"> </param>
        /// <param name="namePrefix">This is used for embedded objects, so that the propertyof an embedded object
        /// appears to have name of form "Parent.Child" </param>
        private DataRow CreatePropertyRow(Property prop, string namePrefix)
        {
            if (prop == null)
            {
                return(null);
            }

            if (propFilters.HideInherited && !prop.IsLocal)
            {
                return(null);                   //skip this property
            }


            DataRow propRow = NewRow();

            propRow[propNameColumn] = namePrefix + prop.Name;

            propRow[propTypeColumn] = CimTypeMapper.ToString(prop.Type);

            if (showOperators)
            {
                //TODO: initialize drop-down. How: in Beta2, a DataGridColumnStyle derived class
                //can be added, DataGridComboBoxColumn. Ask urtuser if they are planning to
                //to add one themselves

                propRow[operatorColumn] = string.Empty;
            }

            if (prop.Type == CimType.Object)
            {
                if ((showValues || showEmbeddedObjValue) &&
                    prop.Value is ManagementBaseObject)
                {
                    if (showOperators)
                    {
                        propRow[operatorColumn] = "ISA";
                    }
                    propRow[propValueColumn] = ((ManagementBaseObject)prop.Value).SystemProperties["__CLASS"].Value.ToString();
                }
                else
                {
                    propRow[propValueColumn] = string.Empty;
                }
            }
            else
            {
                if (showValues)
                {
                    propRow[propValueColumn] = prop.Value;
                }
                else
                {
                    propRow[propValueColumn] = string.Empty;
                }
            }
            //propRow[propDescrColumn] = WmiHelper.GetPropertyDescription(prop, wmiObj);


            //set property origin column

            if (showOrigin)
            {
                if (prop.IsLocal)
                {
                    propRow[propOrigin] = true;
                }
                else
                {
                    propRow[propOrigin] = false;
                }
            }

            if (showKeys)
            {
                propRow[propIsKey] = WmiHelper.IsKeyProperty(prop);
            }

            //grey selectionBoxColumn for expanded embedded object properties:
            if (propRow[propNameColumn].ToString().IndexOf(".") > 0)
            {
                //NOTE: this doesn't work!!! is there a way to disable input on an individual cell?
                propRow.SetUnspecified(selectionBoxColumn);
            }


            Rows.Add(propRow);

            if (prop.Type == CimType.Object && expandEmbedded)
            {
                if (prop.Value != null && prop.Value is ManagementBaseObject)
                {
                    ManagementBaseObject embeddedObj = (ManagementBaseObject)prop.Value;
                    foreach (Property embeddedProp in embeddedObj.Properties)
                    {
                        CreatePropertyRow(embeddedProp, prop.Name + ".");
                    }
                }
            }

            rowPropertyMap.Add(propRow, prop);

            return(propRow);
        }
        public override Object GetValue(Object component)
        {
            CimType CimType = prop.Type;

            if (prop == null)
            {
                return(null);
            }


            //handle embedded objects and array of embedded objects
            if (CimType == CimType.Object)
            {
                return(null);                   //disabled for Beta1: too many problems
                //throw new Exception("Displaying embedded objects is not supported in Beta1");
            }


            if (prop.Value == null)
            {
                if (prop.IsArray)
                {
                    return(Array.CreateInstance(CimTypeMapper.ToType(CimType, false, prop), 0));
                }
                return(null);
            }

            //handle datetimes, intervals and arrays of datetimes and intervals
            if (CimType == CimType.DateTime)
            {
                if (WmiHelper.IsInterval(prop))
                {
                    if (prop.IsArray)
                    {
                        string[]   strAr = (string[])prop.Value;
                        TimeSpan[] retAr = new TimeSpan[strAr.Length];
                        for (int i = 0; i < strAr.Length; i++)
                        {
                            retAr[i] = WmiHelper.ToTimeSpan(strAr[i]);
                        }
                        return(retAr);
                    }
                    else
                    {
                        return(WmiHelper.ToTimeSpan(prop.Value.ToString()));
                    }
                }
                else
                {
                    if (prop.IsArray)
                    {
                        string[]   strAr = (string[])prop.Value;
                        DateTime[] retAr = new DateTime[strAr.Length];
                        for (int i = 0; i < strAr.Length; i++)
                        {
                            retAr[i] = WmiHelper.ToDateTime(strAr[i]);
                        }
                        return(retAr);
                    }
                    else
                    {
                        return(WmiHelper.ToDateTime(prop.Value.ToString()));
                    }
                }
            }

            return(prop.Value);
        }