public static string CalculateReferenceValueForComponentItem(Component from, ContentBrowserItem_Component item)
        {
            CalculateReferenceValueForComponentItem(from, item, out string referenceValue, out char addSeparator);
            return(referenceValue);

            //Component to = item.Component;

            //if( from.ParentRoot == to.ParentRoot )
            //{
            //	var referenceSelectionMode = GetReferenceSelectionModeInHierarchy( item );

            //	if( referenceSelectionMode == ContentBrowserItem_Component.ReferenceSelectionModeEnum.This )
            //		return ReferenceUtils.CalculateThisReference( from, to );
            //	else if( referenceSelectionMode == ContentBrowserItem_Component.ReferenceSelectionModeEnum.Root )
            //		return ReferenceUtils.CalculateRootReference( to );
            //}

            //CalculateReferenceValueForComponentItem( item, out string referenceValue, out char addSeparator );
            //return referenceValue;
        }
        //!!!!!
        public void SelectObjects(Component[] objs)
        {
            //!!!!!slowly

            ESet <Component> objsSet = new ESet <Component>(objs);

            List <ContentBrowser.Item> items = new List <ContentBrowser.Item>();

            foreach (var item in componentsBrowser.GetAllItems())
            {
                ContentBrowserItem_Component item2 = item as ContentBrowserItem_Component;
                if (item2 != null)
                {
                    if (objsSet.Contains(item2.Component))
                    {
                        items.Add(item);
                    }
                }
            }

            componentsBrowser.SelectItems(items.ToArray());
        }
        public static void CalculateReferenceValueForComponentItem(Component from, ContentBrowserItem_Component item, out string referenceValue, out char addSeparator)
        {
            Component to = item.Component;

            //different hierarchy
            if (from == null || from.ParentRoot != to.ParentRoot)
            {
                //if( canMakeRelativeFilePath && from != null )
                //	ReferenceUtility.CalculateCurrentFolderReference( from, to, "", out referenceValue, out addSeparator );
                //else
                ReferenceUtility.CalculateResourceReference(to, "", out referenceValue, out addSeparator);
                return;
            }

            //root:, this:
            {
                var referenceSelectionMode = GetReferenceSelectionModeInHierarchy(item);

                if (referenceSelectionMode == ContentBrowserItem_Component.ReferenceSelectionModeEnum.This)
                {
                    ReferenceUtility.CalculateThisReference(from, to, "", out referenceValue, out addSeparator);
                    return;
                }
                else if (referenceSelectionMode == ContentBrowserItem_Component.ReferenceSelectionModeEnum.Root)
                {
                    ReferenceUtility.CalculateRootReference(to, "", out referenceValue, out addSeparator);
                    return;
                }
            }

            //default
            {
                //_File
                //_Type
                //_Component

                var componentItemsStack = new List <ContentBrowserItem_Component>();
                ContentBrowser.Item firstTypeOrFileItem = null;
                {
                    ContentBrowser.Item current = item;
                    do
                    {
                        if (current is ContentBrowserItem_Component)
                        {
                            if (current.Parent != null)
                            {
                                componentItemsStack.Add((ContentBrowserItem_Component)current);
                            }
                        }
                        else if (current is ContentBrowserItem_Type || current is ContentBrowserItem_File)
                        {
                            firstTypeOrFileItem = current;
                            break;
                        }
                        else
                        {
                            Log.Fatal("ContentBrowserUtils: CalculateReferenceValueForComponentItem: Internal error.");
                        }

                        current = current.Parent;
                    } while(current != null);

                    componentItemsStack.Reverse();
                }

                var result = new StringBuilder();

                //start item
                if (firstTypeOrFileItem != null)
                {
                    //_File, _Type

                    var fileItem = firstTypeOrFileItem as ContentBrowserItem_File;
                    if (fileItem != null)
                    {
                        result.Append(VirtualPathUtility.GetVirtualPathByReal(fileItem.FullPath));
                    }

                    var typeItem = firstTypeOrFileItem as ContentBrowserItem_Type;
                    if (typeItem != null)
                    {
                        result.Append(typeItem.Type.Name);
                    }

                    addSeparator = '|';
                }
                else
                {
                    //_Component
                    result.Append("root:");
                    addSeparator = '\0';
                }

                //add path of components
                foreach (var componentItem in componentItemsStack)
                {
                    if (addSeparator != '\0')
                    {
                        result.Append(addSeparator);
                    }
                    result.Append(componentItem.Component.GetPathFromParent());
                    addSeparator = '\\';
                }

                referenceValue = result.ToString();
            }
        }
        //static string _CalculateReferenceValue( bool allowThisFormat, Metadata.Property property, ContentBrowser.Item item )
        ////, out ContentBrowserItem_Component.ReferenceSelectionModeEnum topItemMode )
        //{
        //	//!!!!multiselection

        //	List<string> result = new List<string>();
        //	var topItemMode = ContentBrowserItem_Component.ReferenceSelectionModeEnum.None;
        //	ContentBrowser.Item firstTypeOrFileItem = null;
        //	ContentBrowser.Item topItem = null;

        //	ContentBrowser.Item current = item;

        //	do
        //	{
        //		var componentItem = current as ContentBrowserItem_Component;
        //		if( componentItem != null )
        //		{
        //			//_Component

        //			if( componentItem.Parent != null )
        //			{
        //				if( componentItem.ReferenceSelectionMode == ContentBrowserItem_Component.ReferenceSelectionModeEnum.This )
        //					result.Add( ".." );
        //				else
        //					result.Add( componentItem.Component.GetNameWithIndexFromParent() );
        //			}

        //			if( componentItem.Parent == null )
        //				topItemMode = componentItem.ReferenceSelectionMode;
        //		}
        //		else
        //		{
        //			//_Member
        //			var memberItem = current as ContentBrowserItem_Member;
        //			if( memberItem != null )
        //			{
        //				var member = memberItem.Member;
        //				if( member != null )
        //				{
        //					xx xx;

        //					//!!!!так?
        //					//!!!!new
        //					if( item.Owner.Mode == ContentBrowser.ModeEnum.SetReference && MetadataManager.GetTypeOfNetType( typeof( ReferenceValueType_Member ) ).IsAssignableFrom( item.Owner.SetReferenceModeData.property.TypeUnreferenced ) )
        //					{
        //						result.Add( member.Signature );
        //					}
        //					else if( member is Metadata.Property || member is Metadata.Method )
        //					{
        //						result.Add( member.Name );
        //					}
        //					else
        //					{
        //						//!!!!
        //					}
        //				}
        //			}
        //		}

        //		if( firstTypeOrFileItem == null )
        //			firstTypeOrFileItem = current as ContentBrowserItem_Type;
        //		if( firstTypeOrFileItem == null )
        //			firstTypeOrFileItem = current as ContentBrowserItem_File;

        //		topItem = current;

        //		current = current.Parent;
        //	}
        //	while( current != null );


        //	StringBuilder builder = new StringBuilder();

        //	switch( topItemMode )
        //	{
        //	case ContentBrowserItem_Component.ReferenceSelectionModeEnum.None:
        //		{
        //			if( firstTypeOrFileItem != null )
        //			{
        //				var fileItem = firstTypeOrFileItem as ContentBrowserItem_File;
        //				if( fileItem != null )
        //					builder.Append( VirtualPathUtils.GetVirtualPathByReal( fileItem.FullPath ) + "|" );

        //				var typeItem = firstTypeOrFileItem as ContentBrowserItem_Type;
        //				if( typeItem != null )
        //					builder.Append( typeItem.Type.Name + "|" );
        //			}
        //			else
        //			{
        //				var componentTopItem = topItem as ContentBrowserItem_Component;
        //				if( componentTopItem != null )
        //				{
        //					builder.Append( "root:" );
        //					var path = componentTopItem.Component.GetNamePathToAccessFromRoot();
        //					if( path != "" )
        //						result.Add( path );
        //				}
        //			}
        //		}
        //		break;

        //	case ContentBrowserItem_Component.ReferenceSelectionModeEnum.Root:
        //		builder.Append( "root:" );
        //		break;

        //	case ContentBrowserItem_Component.ReferenceSelectionModeEnum.This:
        //		builder.Append( "this:" );
        //		break;
        //	}

        //	bool first = true;
        //	for( int n = result.Count - 1; n >= 0; n-- )
        //	{
        //		if( !first )
        //			builder.Append( '\\' );
        //		builder.Append( result[ n ] );

        //		first = false;
        //	}

        //	return builder.ToString();
        //}

        static ContentBrowserItem_Component.ReferenceSelectionModeEnum GetReferenceSelectionModeInHierarchy(ContentBrowserItem_Component item)
        {
            var current = item;

            do
            {
                if (current.ReferenceSelectionMode != ContentBrowserItem_Component.ReferenceSelectionModeEnum.None)
                {
                    return(current.ReferenceSelectionMode);
                }
                current = current.Parent as ContentBrowserItem_Component;
            } while(current != null);

            return(ContentBrowserItem_Component.ReferenceSelectionModeEnum.None);
        }