| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011 | 
							- using System;
 
- using UnityEngine;
 
- using UnityEditor;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using UnityEditor.IMGUI.Controls;
 
- namespace AssetBundleBrowser.AssetBundleModel
 
- {
 
-     internal sealed class BundleTreeItem : TreeViewItem
 
-     {   
 
-         private BundleInfo m_Bundle;
 
-         internal BundleInfo bundle
 
-         {
 
-             get { return m_Bundle; }
 
-         }
 
-         internal BundleTreeItem(BundleInfo b, int depth, Texture2D iconTexture) : base(b.nameHashCode, depth, b.displayName)
 
-         {
 
-             m_Bundle = b;
 
-             icon = iconTexture;
 
-             children = new List<TreeViewItem>();
 
-         }
 
-         internal MessageSystem.Message BundleMessage()
 
-         {
 
-             return m_Bundle.HighestMessage();
 
-         }
 
-         public override string displayName
 
-         {
 
-             get
 
-             {
 
-                 return AssetBundleBrowserMain.instance.m_ManageTab.hasSearch ? m_Bundle.m_Name.fullNativeName : m_Bundle.displayName;
 
-             }
 
-         }
 
-     }
 
-     internal class BundleNameData
 
-     {
 
-         private List<string> m_PathTokens;
 
-         private string m_FullBundleName;
 
-         private string m_ShortName;
 
-         private string m_VariantName;
 
-         private string m_FullNativeName;
 
-         //input (received from native) is a string of format:
 
-         //  /folder0/.../folderN/name.variant
 
-         //it's broken into:
 
-         //  /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName.m_variantName
 
-         // and...
 
-         //  m_fullBundleName = /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName
 
-         // and...
 
-         //  m_fullNativeName = m_fullBundleName.m_variantName which is the same as the initial input.
 
-         internal BundleNameData(string name) { SetName(name); }
 
-         internal BundleNameData(string path, string name)
 
-         {
 
-             string finalName = System.String.IsNullOrEmpty(path) ? "" : path + '/';
 
-             finalName += name;
 
-             SetName(finalName);
 
-         }
 
-         public override int GetHashCode()
 
-         {
 
-             return fullNativeName.GetHashCode();
 
-         }
 
-         internal string fullNativeName
 
-         { get { return m_FullNativeName; } }
 
-         internal void SetBundleName(string bundleName, string variantName)
 
-         {
 
-             string name = bundleName;
 
-             name += System.String.IsNullOrEmpty(variantName) ? "" : "." + variantName;
 
-             SetName(name);
 
-         }
 
-         internal string bundleName
 
-         {
 
-             get { return m_FullBundleName; }
 
-             //set { SetName(value); }
 
-         }
 
-         internal string shortName
 
-         {
 
-             get { return m_ShortName; }
 
-         }
 
-         internal string variant
 
-         {
 
-             get { return m_VariantName; }
 
-             set
 
-             {
 
-                 m_VariantName = value;
 
-                 m_FullNativeName = m_FullBundleName;
 
-                 m_FullNativeName += System.String.IsNullOrEmpty(m_VariantName) ? "" : "." + m_VariantName;
 
-             }
 
-         }
 
-         internal List<string> pathTokens
 
-         {
 
-             get { return m_PathTokens; }
 
-             set
 
-             {
 
-                 m_PathTokens = value.GetRange(0, value.Count-1);
 
-                 SetShortName(value.Last());
 
-                 GenerateFullName();
 
-             }
 
-         }
 
-         private void SetName(string name)
 
-         {
 
-             if(m_PathTokens == null)
 
-                 m_PathTokens = new List<string>();
 
-             else
 
-                 m_PathTokens.Clear();
 
-             int indexOfSlash = name.IndexOf('/');
 
-             int previousIndex = 0;
 
-             while(indexOfSlash != -1)
 
-             {
 
-                 m_PathTokens.Add(name.Substring(previousIndex, (indexOfSlash - previousIndex)));
 
-                 previousIndex = indexOfSlash + 1;
 
-                 indexOfSlash = name.IndexOf('/', previousIndex);
 
-             }
 
-             SetShortName(name.Substring(previousIndex));
 
-             GenerateFullName();
 
-         }
 
-         private void SetShortName(string inputName)
 
-         {
 
-             m_ShortName = inputName;
 
-             int indexOfDot = m_ShortName.LastIndexOf('.');
 
-             if (indexOfDot > -1)
 
-             {
 
-                 m_VariantName = m_ShortName.Substring(indexOfDot + 1);
 
-                 m_ShortName = m_ShortName.Substring(0, indexOfDot);
 
-             }
 
-             else
 
-                 m_VariantName = string.Empty;
 
-         }
 
-         internal void PartialNameChange(string newToken, int indexFromBack)
 
-         {
 
-             if(indexFromBack == 0)
 
-             {
 
-                  SetShortName(newToken);
 
-             }
 
-             else if(indexFromBack-1 < m_PathTokens.Count)
 
-             {
 
-                 m_PathTokens[m_PathTokens.Count - indexFromBack] = newToken;
 
-             }
 
-             GenerateFullName();
 
-         }
 
-         private void GenerateFullName()
 
-         {
 
-             m_FullBundleName = string.Empty;
 
-             for(int i = 0; i < m_PathTokens.Count; i++)
 
-             {
 
-                 m_FullBundleName += m_PathTokens[i];
 
-                 m_FullBundleName += '/';
 
-             }
 
-             m_FullBundleName += m_ShortName;
 
-             m_FullNativeName = m_FullBundleName;
 
-             m_FullNativeName += System.String.IsNullOrEmpty(m_VariantName) ? "" : "." + m_VariantName;
 
-         }
 
-     }
 
-     internal abstract class BundleInfo
 
-     {
 
-         protected BundleFolderInfo m_Parent;
 
-         protected bool m_DoneUpdating;
 
-         protected bool m_Dirty;
 
-         internal BundleNameData m_Name;
 
-         protected MessageSystem.MessageState m_BundleMessages = new MessageSystem.MessageState();
 
-         protected MessageSystem.Message m_CachedHighMessage = null;
 
-         internal BundleInfo(string name, BundleFolderInfo parent)
 
-         {
 
-             m_Name = new BundleNameData(name);
 
-             m_Parent = parent;
 
-         }
 
-         internal BundleFolderInfo parent
 
-         { get { return m_Parent; } }
 
-         internal virtual string displayName
 
-         {
 
-             get { return m_Name.shortName; }
 
-         }
 
-         internal virtual int nameHashCode
 
-         {
 
-             get { return m_Name.GetHashCode(); }
 
-         }
 
-         internal abstract BundleTreeItem CreateTreeView(int depth);
 
-         protected virtual void RefreshMessages()
 
-         {
 
-             RefreshEmptyStatus();
 
-             RefreshDupeAssetWarning();
 
-             var flag = m_BundleMessages.HighestMessageFlag();
 
-             m_CachedHighMessage = MessageSystem.GetMessage(flag);
 
-         }
 
-         internal abstract bool RefreshEmptyStatus();
 
-         internal abstract bool RefreshDupeAssetWarning();
 
-         internal virtual MessageSystem.Message HighestMessage()
 
-         {
 
-             if (m_CachedHighMessage == null)
 
-                 RefreshMessages();
 
-             return m_CachedHighMessage;
 
-         }
 
-         internal bool IsMessageSet(MessageSystem.MessageFlag flag)
 
-         {
 
-             return m_BundleMessages.IsSet(flag);
 
-         }
 
-         internal void SetMessageFlag(MessageSystem.MessageFlag flag, bool on)
 
-         {
 
-             m_BundleMessages.SetFlag(flag, on);
 
-         }
 
-         internal List<MessageSystem.Message> GetMessages()
 
-         {
 
-             return m_BundleMessages.GetMessages();
 
-         }
 
-         internal bool HasMessages()
 
-         {
 
-             return m_BundleMessages.HasMessages();
 
-         }
 
-         internal virtual bool HandleRename(string newName, int reverseDepth)
 
-         {
 
-             if (reverseDepth == 0)
 
-             {
 
-                 if (!m_Parent.HandleChildRename(m_Name.shortName, newName))
 
-                     return false;
 
-             }
 
-             m_Name.PartialNameChange(newName, reverseDepth);
 
-             return true;
 
-         }
 
-         internal virtual void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
 
-         {
 
-             if(isRootOfDelete)
 
-             {
 
-                 m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
 
-             }
 
-         }
 
-         abstract internal void RefreshAssetList();
 
-         abstract internal void AddAssetsToNode(AssetTreeItem node);
 
-         abstract internal void Update();
 
-         internal virtual bool doneUpdating
 
-         { get { return m_DoneUpdating; } }
 
-         internal virtual bool dirty
 
-         { get { return m_Dirty; } }
 
-         internal void ForceNeedUpdate()
 
-         {
 
-             m_DoneUpdating = false;
 
-             m_Dirty = true;
 
-         }
 
-         abstract internal void HandleReparent(string parentName, BundleFolderInfo newParent = null);
 
-         abstract internal List<AssetInfo> GetDependencies();
 
-         abstract internal bool DoesItemMatchSearch(string search);
 
-     }
 
-     internal class BundleDataInfo : BundleInfo
 
-     {
 
-         protected List<AssetInfo> m_ConcreteAssets;
 
-         protected List<AssetInfo> m_DependentAssets;
 
-         protected HashSet<string> m_BundleDependencies;
 
-         protected int m_ConcreteCounter;
 
-         protected int m_DependentCounter;
 
-         protected bool m_IsSceneBundle;
 
-         protected long m_TotalSize;
 
-         internal BundleDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
 
-         {
 
-             m_ConcreteAssets = new List<AssetInfo>();
 
-             m_DependentAssets = new List<AssetInfo>();
 
-             m_BundleDependencies = new HashSet<string>();
 
-             m_ConcreteCounter = 0;
 
-             m_DependentCounter = 0;
 
-         }
 
-         ~BundleDataInfo()
 
-         {
 
-             foreach (var asset in m_DependentAssets)
 
-             {
 
-                 AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
 
-             }
 
-         }
 
-         internal override bool HandleRename(string newName, int reverseDepth)
 
-         { 
 
-             RefreshAssetList();
 
-             if (!base.HandleRename(newName, reverseDepth))
 
-                 return false;
 
-             Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
 
-             return true;
 
-         }
 
-         internal override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant="")
 
-         {
 
-             RefreshAssetList();
 
-             base.HandleDelete(isRootOfDelete);
 
-             Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
 
-         }
 
-         internal string TotalSize()
 
-         {
 
-             if (m_TotalSize == 0)
 
-                 return "--";
 
-             return EditorUtility.FormatBytes(m_TotalSize);
 
-         }
 
-         internal override void RefreshAssetList()
 
-         {
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, false);
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, false);
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, false);
 
-             m_ConcreteAssets.Clear();
 
-             m_TotalSize = 0;
 
-             m_IsSceneBundle = false;
 
-             foreach (var asset in m_DependentAssets)
 
-             {
 
-                 AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
 
-             }
 
-             m_DependentAssets.Clear();
 
-             m_BundleDependencies.Clear();
 
-             
 
-             bool assetInBundle = false;
 
-             bool sceneError = false;
 
-             var assets = AssetBundleModel.Model.DataSource.GetAssetPathsFromAssetBundle(m_Name.fullNativeName);
 
-             foreach(var assetName in assets)
 
-             {
 
-                 if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
 
-                 {
 
-                     m_IsSceneBundle = true;
 
-                     if(assetInBundle)
 
-                         sceneError = true;
 
-                 }
 
-                 else
 
-                 {
 
-                     assetInBundle = true;
 
-                     if (m_IsSceneBundle)
 
-                         sceneError = true;
 
-                 }
 
-                 var bundleName = Model.GetBundleName(assetName);
 
-                 if (System.String.IsNullOrEmpty(bundleName))  
 
-                 {
 
-                     ///we get here if the current asset is only added due to being in an explicitly added folder
 
-                     
 
-                     var partialPath = assetName;
 
-                     while(
 
-                         !System.String.IsNullOrEmpty(partialPath) && 
 
-                         partialPath != "Assets" &&
 
-                         System.String.IsNullOrEmpty(bundleName))
 
-                     {
 
-                         partialPath = partialPath.Substring(0, partialPath.LastIndexOf('/'));
 
-                         bundleName = Model.GetBundleName(partialPath);
 
-                     }
 
-                     if(!System.String.IsNullOrEmpty(bundleName))
 
-                     {
 
-                         var folderAsset = Model.CreateAsset(partialPath, bundleName);
 
-                         folderAsset.isFolder = true;
 
-                         if (m_ConcreteAssets.FindIndex(a => a.displayName == folderAsset.displayName) == -1)
 
-                         {
 
-                             m_ConcreteAssets.Add(folderAsset);
 
-                         }
 
-                         
 
-                         m_DependentAssets.Add(Model.CreateAsset(assetName, folderAsset));
 
-                         if (m_DependentAssets != null && m_DependentAssets.Count > 0)
 
-                         {
 
-                             var last = m_DependentAssets.Last();
 
-                             if (last != null)
 
-                                 m_TotalSize += last.fileSize;
 
-                         }
 
-                     }
 
-                 }
 
-                 else
 
-                 {
 
-                     var newAsset = Model.CreateAsset (assetName, m_Name.fullNativeName);
 
-                     if (newAsset != null)
 
-                     {
 
-                         m_ConcreteAssets.Add(newAsset);
 
-                         m_TotalSize += m_ConcreteAssets.Last().fileSize;
 
-                         if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
 
-                         {
 
-                             m_IsSceneBundle = true;
 
-                             m_ConcreteAssets.Last().isScene = true;
 
-                         }
 
-                     }
 
-                 }
 
-             }
 
-             
 
-             if(sceneError)
 
-             {
 
-                 foreach (var asset in m_ConcreteAssets)
 
-                 {
 
-                     if (asset.isFolder)
 
-                     {
 
-                         asset.SetMessageFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
 
-                         m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
 
-                     }
 
-                     else
 
-                     {
 
-                         asset.SetMessageFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
 
-                         m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
 
-                     }
 
-                 }
 
-             }
 
-             m_ConcreteCounter = 0;
 
-             m_DependentCounter = 0;
 
-             m_Dirty = true;
 
-         }
 
-         internal override void AddAssetsToNode(AssetTreeItem node)
 
-         {
 
-             foreach (var asset in m_ConcreteAssets)
 
-                 node.AddChild(new AssetTreeItem(asset));
 
-             foreach (var asset in m_DependentAssets)
 
-             {
 
-                 if(!node.ContainsChild(asset))
 
-                     node.AddChild(new AssetTreeItem(asset));
 
-             }
 
-             m_Dirty = false;
 
-         }
 
-         internal HashSet<string> GetBundleDependencies()
 
-         {
 
-             return m_BundleDependencies;
 
-         }
 
-         internal override void Update()
 
-         {
 
-             int dependents = m_DependentAssets.Count;
 
-             int bundleDep = m_BundleDependencies.Count;
 
-             if(m_ConcreteCounter < m_ConcreteAssets.Count)
 
-             {
 
-                 GatherDependencies(m_ConcreteAssets[m_ConcreteCounter]);
 
-                 m_ConcreteCounter++;
 
-                 m_DoneUpdating = false;
 
-             }
 
-             else if (m_DependentCounter < m_DependentAssets.Count)
 
-             {
 
-                 GatherDependencies(m_DependentAssets[m_DependentCounter], m_Name.fullNativeName);
 
-                 m_DependentCounter++;
 
-                 m_DoneUpdating = false;
 
-             }
 
-             else
 
-             {
 
-                 m_DoneUpdating = true;
 
-             }
 
-             m_Dirty = (dependents != m_DependentAssets.Count) || (bundleDep != m_BundleDependencies.Count);
 
-             if (m_Dirty || m_DoneUpdating)
 
-                 RefreshMessages();
 
-         }
 
-         private void GatherDependencies(AssetInfo asset, string parentBundle = "")
 
-         {
 
-             if (System.String.IsNullOrEmpty(parentBundle))
 
-                 parentBundle = asset.bundleName;
 
-             if (asset == null)
 
-                 return;
 
-             var deps = asset.GetDependencies();
 
-             if (deps == null)
 
-                 return;
 
-             foreach (var ai in deps)
 
-             {
 
-                 if (ai == asset || m_ConcreteAssets.Contains(ai) || m_DependentAssets.Contains(ai))
 
-                     continue;
 
-                 var bundleName = AssetBundleModel.Model.DataSource.GetImplicitAssetBundleName(ai.fullAssetName);
 
-                 if (string.IsNullOrEmpty(bundleName))
 
-                 {
 
-                     m_DependentAssets.Add(ai);
 
-                     m_TotalSize += ai.fileSize;
 
-                     if (Model.RegisterAsset(ai, parentBundle) > 1)
 
-                     {
 
-                         SetDuplicateWarning();
 
-                     }
 
-                 }
 
-                 else if(bundleName != m_Name.fullNativeName)
 
-                 {
 
-                     m_BundleDependencies.Add(bundleName);
 
-                 }
 
-             }
 
-         }
 
-         internal override bool RefreshDupeAssetWarning()
 
-         {
 
-             foreach(var asset in m_DependentAssets)
 
-             {
 
-                 if (asset != null && asset.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles)) 
 
-                 {
 
-                     SetDuplicateWarning();
 
-                     return true;
 
-                 }
 
-             }
 
-             return false;
 
-         }
 
-         internal bool IsEmpty()
 
-         {
 
-             return (m_ConcreteAssets.Count == 0);
 
-         }
 
-         internal override bool RefreshEmptyStatus()
 
-         {
 
-             bool empty = IsEmpty();
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyBundle, empty);
 
-             return empty;
 
-         }
 
-         protected void SetDuplicateWarning()
 
-         {
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, true);
 
-             m_Dirty = true;
 
-         }
 
-         internal bool isSceneBundle
 
-         { get { return m_IsSceneBundle; } }
 
-         internal override BundleTreeItem CreateTreeView(int depth)
 
-         {
 
-             RefreshAssetList();
 
-             RefreshMessages();
 
-             if (isSceneBundle)
 
-                 return new BundleTreeItem(this, depth, Model.GetSceneIcon());
 
-             else
 
-                 return new BundleTreeItem(this, depth, Model.GetBundleIcon());
 
-         }
 
-         internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
 
-         {
 
-             RefreshAssetList();
 
-             string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
 
-             newName += m_Name.shortName;
 
-             if (newName == m_Name.bundleName)
 
-                 return;
 
-             if (newParent != null && newParent.GetChild(newName) != null)
 
-             {
 
-                 Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy.  If your desire is to merge bundles, drag one on top of the other.");
 
-                 return;
 
-             }
 
-             
 
-             foreach (var asset in m_ConcreteAssets)
 
-             {
 
-                 Model.MoveAssetToBundle(asset, newName, m_Name.variant);
 
-             }
 
-             if (newParent != null)
 
-             {
 
-                 m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
 
-                 m_Parent = newParent;
 
-                 m_Parent.AddChild(this);
 
-             }
 
-             m_Name.SetBundleName(newName, m_Name.variant);
 
-         }
 
-         internal override List<AssetInfo> GetDependencies()
 
-         {
 
-             return m_DependentAssets;
 
-         }
 
-         internal override bool DoesItemMatchSearch(string search)
 
-         {
 
-             foreach(var asset in m_ConcreteAssets)
 
-             {
 
-                 if (asset.displayName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
 
-                     return true;
 
-             }
 
-             foreach (var asset in m_DependentAssets)
 
-             {
 
-                 if (asset.displayName.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0)
 
-                     return true;
 
-             }
 
-             return false;
 
-         }
 
-     }
 
-     internal class BundleVariantDataInfo : BundleDataInfo
 
-     {
 
-         protected List<AssetInfo> m_FolderIncludeAssets = new List<AssetInfo>();
 
-         internal BundleVariantDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
 
-         {
 
-         }
 
-         internal override string displayName
 
-         {
 
-             get { return m_Name.variant; }
 
-         }
 
-         internal override void Update()
 
-         {
 
-             base.Update();
 
-             (m_Parent as BundleVariantFolderInfo).ValidateVariants();
 
-         }
 
-         internal override void RefreshAssetList()
 
-         {
 
-             m_FolderIncludeAssets.Clear();
 
-             base.RefreshAssetList();
 
-             if(m_DependentAssets.Count > 0)
 
-                 m_FolderIncludeAssets = new List<AssetInfo>(m_DependentAssets);
 
-         }
 
-         internal bool IsSceneVariant()
 
-         {
 
-             RefreshAssetList();
 
-             return isSceneBundle;
 
-         }
 
-         internal override bool HandleRename(string newName, int reverseDepth)
 
-         {
 
-             if (reverseDepth == 0)
 
-             {
 
-                 RefreshAssetList();
 
-                 if (!m_Parent.HandleChildRename(m_Name.variant, newName))
 
-                     return false;
 
-                 m_Name.variant = newName;
 
-                 Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
 
-             }
 
-             else if (reverseDepth == 1)
 
-             {
 
-                 RefreshAssetList();
 
-                 m_Name.PartialNameChange(newName + "." + m_Name.variant, 0);
 
-                 Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
 
-             }
 
-             else
 
-             {
 
-                 return base.HandleRename(newName, reverseDepth-1);
 
-             }
 
-             return true;
 
-         }
 
-         internal override void HandleDelete(bool isRootOfDelete, string forcedNewName = "", string forcedNewVariant = "")
 
-         {
 
-             RefreshAssetList();
 
-             if (isRootOfDelete)
 
-             {
 
-                 m_Parent.HandleChildRename(m_Name.variant, string.Empty);
 
-             }
 
-             Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
 
-         }
 
-         internal bool FindContentMismatch(BundleVariantDataInfo other)
 
-         {
 
-             bool result = false;
 
-             if (m_FolderIncludeAssets.Count != 0 || other.m_FolderIncludeAssets.Count != 0)
 
-             {
 
-                 var myUniqueAssets = new HashSet<string>();
 
-                 var otherUniqueAssets = new HashSet<string>(other.m_FolderIncludeAssets.Select(x => x.displayName));
 
-                 foreach (var asset in m_FolderIncludeAssets)
 
-                 {
 
-                     if (!otherUniqueAssets.Remove(asset.displayName))
 
-                     {
 
-                         myUniqueAssets.Add(asset.displayName);
 
-                     }
 
-                 }
 
-                 if (myUniqueAssets.Count > 0)
 
-                 {
 
-                     m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
 
-                     result = true;
 
-                 }
 
-                 if (otherUniqueAssets.Count > 0)
 
-                 {
 
-                     other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
 
-                     result = true;
 
-                 }
 
-             }
 
-             else //this doesn't cover the super weird case of including a folder and some explicit assets. TODO - fix that.
 
-             {
 
-                 var myUniqueAssets = new HashSet<string>();
 
-                 var otherUniqueAssets = new HashSet<string>(other.m_ConcreteAssets.Select(x => x.displayName));
 
-                 foreach (var asset in m_ConcreteAssets)
 
-                 {
 
-                     if (!otherUniqueAssets.Remove(asset.displayName))
 
-                     {
 
-                         myUniqueAssets.Add(asset.displayName);
 
-                     }
 
-                 }
 
-                 if (myUniqueAssets.Count > 0)
 
-                 {
 
-                     m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
 
-                     result = true;
 
-                 }
 
-                 if (otherUniqueAssets.Count > 0)
 
-                 {
 
-                     other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
 
-                     result = true;
 
-                 }
 
-             }
 
-             return result;
 
-         }
 
-     }
 
-     internal abstract class BundleFolderInfo : BundleInfo
 
-     {
 
-         protected Dictionary<string, BundleInfo> m_Children;
 
-         internal BundleFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
 
-         {
 
-             m_Children = new Dictionary<string, BundleInfo>();
 
-         }
 
-         
 
-         internal BundleFolderInfo(List<string> path, int depth, BundleFolderInfo parent) : base("", parent)
 
-         {
 
-             m_Children = new Dictionary<string, BundleInfo>();
 
-             m_Name = new BundleNameData("");
 
-             m_Name.pathTokens = path.GetRange(0, depth);
 
-         }
 
-         internal BundleInfo GetChild(string name)
 
-         {
 
-             if (name == null)
 
-                 return null;
 
-             BundleInfo info = null;
 
-             if (m_Children.TryGetValue(name, out info))
 
-                 return info;
 
-             return null;
 
-         }
 
-         internal Dictionary<string, BundleInfo>.ValueCollection GetChildList()
 
-         {
 
-             return m_Children.Values;
 
-         }
 
-         internal abstract void AddChild(BundleInfo info);
 
-         internal override bool HandleRename(string newName, int reverseDepth)
 
-         {
 
-             if (!base.HandleRename(newName, reverseDepth))
 
-                 return false;
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.HandleRename(newName, reverseDepth + 1);
 
-             }
 
-             return true;
 
-         }
 
-         internal override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
 
-         {
 
-             base.HandleDelete(isRootOfDelete);
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.HandleDelete(false, forcedNewName, forcedNewVariant);
 
-             }
 
-             m_Children.Clear();
 
-         }
 
-         internal override bool DoesItemMatchSearch(string search)
 
-         {
 
-             return false; //folders don't ever match.
 
-         }
 
-         protected override void RefreshMessages()
 
-         {
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, false);
 
-             foreach(var child in m_Children)
 
-             {
 
-                 if (child.Value.IsMessageSet(MessageSystem.MessageFlag.Error))
 
-                 {
 
-                     m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, true);
 
-                     break;
 
-                 }
 
-             }
 
-             base.RefreshMessages();
 
-         }
 
-         internal override bool RefreshEmptyStatus()
 
-         {
 
-             bool empty = m_Children.Count == 0;
 
-             foreach (var child in m_Children)
 
-             {
 
-                 empty |= child.Value.RefreshEmptyStatus();
 
-             }
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyFolder, empty);
 
-             return empty;
 
-         }
 
-         internal override void RefreshAssetList()
 
-         {
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.RefreshAssetList();
 
-             }
 
-         }
 
-         internal override bool RefreshDupeAssetWarning()
 
-         {
 
-             bool dupeWarning = false;
 
-             foreach (var child in m_Children)
 
-             {
 
-                 dupeWarning |= child.Value.RefreshDupeAssetWarning();
 
-             }
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.WarningInChildren, dupeWarning);
 
-             return dupeWarning;
 
-         }
 
-         internal override void AddAssetsToNode(AssetTreeItem node)
 
-         {
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.AddAssetsToNode(node);
 
-             }
 
-             m_Dirty = false;
 
-         }
 
-         internal virtual bool HandleChildRename(string oldName, string newName)
 
-         {
 
-             if (!System.String.IsNullOrEmpty(newName) && m_Children.ContainsKey(newName))
 
-             {
 
-                 Model.LogWarning("Attempting to name an item '" + newName + "' which matches existing name at this level in hierarchy.  If your desire is to merge bundles, drag one on top of the other.");
 
-                 return false;
 
-             }
 
-             BundleInfo info = null;
 
-             if (m_Children.TryGetValue(oldName, out info))
 
-             {
 
-                 m_Children.Remove(oldName);
 
-                 if (!System.String.IsNullOrEmpty(newName))
 
-                     m_Children.Add(newName, info);
 
-             }
 
-             return true;
 
-         }
 
-         internal override void Update()
 
-         {
 
-             m_Dirty = false;
 
-             m_DoneUpdating = true;
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.Update();
 
-                 m_Dirty |= child.Value.dirty;
 
-                 m_DoneUpdating &= child.Value.doneUpdating;
 
-             }
 
-             if (m_Dirty || m_DoneUpdating)
 
-                 RefreshMessages();
 
-         }
 
-         internal override bool doneUpdating
 
-         {
 
-             get
 
-             {
 
-                 foreach (var child in m_Children)
 
-                 {
 
-                     m_DoneUpdating &= child.Value.doneUpdating;
 
-                 }
 
-                 return base.doneUpdating;
 
-             }
 
-         }
 
-         internal override List<AssetInfo> GetDependencies()
 
-         {
 
-             List<AssetInfo> assets = new List<AssetInfo>();
 
-             foreach (var child in m_Children)
 
-             {
 
-                 assets.AddRange(child.Value.GetDependencies());
 
-             }
 
-             return assets;
 
-         }
 
-     }
 
-     internal class BundleFolderConcreteInfo : BundleFolderInfo
 
-     {
 
-         internal BundleFolderConcreteInfo(string name, BundleFolderInfo parent) : base(name, parent)
 
-         {
 
-         }
 
-         internal BundleFolderConcreteInfo(List<string> path, int depth, BundleFolderInfo parent) : base(path, depth, parent)
 
-         {
 
-         }
 
-         internal override void AddChild(BundleInfo info)
 
-         {
 
-             m_Children.Add(info.displayName, info);
 
-         }
 
-         internal override BundleTreeItem CreateTreeView(int depth)
 
-         {
 
-             RefreshMessages();
 
-             var result = new BundleTreeItem(this, depth, Model.GetFolderIcon());
 
-             foreach (var child in m_Children)
 
-             {
 
-                 result.AddChild(child.Value.CreateTreeView(depth + 1));
 
-             }
 
-             return result;
 
-         }
 
-         internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
 
-         {
 
-             string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
 
-             newName += displayName;
 
-             if (newName == m_Name.bundleName)
 
-                 return;
 
-             if (newParent != null && newParent.GetChild(newName) != null)
 
-             {
 
-                 Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy.  If your desire is to merge bundles, drag one on top of the other.");
 
-                 return;
 
-             }
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.HandleReparent(newName);
 
-             }
 
-             if (newParent != null)
 
-             {
 
-                 m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
 
-                 m_Parent = newParent;
 
-                 m_Parent.AddChild(this);
 
-             }
 
-             m_Name.SetBundleName(newName, m_Name.variant);
 
-         }
 
-     }
 
-     internal class BundleVariantFolderInfo : BundleFolderInfo
 
-     {
 
-         internal BundleVariantFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
 
-         {
 
-         }
 
-         internal override void AddChild(BundleInfo info)
 
-         {
 
-             m_Children.Add(info.m_Name.variant, info);
 
-         }
 
-         private bool m_validated;
 
-         internal override void Update()
 
-         {
 
-             m_validated = false;
 
-             base.Update();
 
-             if(!m_validated)
 
-                ValidateVariants();
 
-         }
 
-         internal void ValidateVariants()
 
-         {
 
-             m_validated = true;
 
-             bool childMismatch = false;
 
-             if(m_Children.Count > 1)
 
-             {
 
-                 BundleVariantDataInfo goldChild = null;
 
-                 foreach(var c in m_Children)
 
-                 {
 
-                     var child = c.Value as BundleVariantDataInfo;
 
-                     child.SetMessageFlag(MessageSystem.MessageFlag.VariantBundleMismatch, false);
 
-                     if (goldChild == null)
 
-                     {
 
-                         goldChild = child;
 
-                         continue;
 
-                     }
 
-                     childMismatch |= goldChild.FindContentMismatch(child);
 
-                 }
 
-             }
 
-             m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, childMismatch);
 
-         }
 
-         internal override BundleTreeItem CreateTreeView(int depth)
 
-         {
 
-             RefreshMessages();
 
-             Texture2D icon = null;
 
-             if ((m_Children.Count > 0) &&
 
-                 ((m_Children.First().Value as BundleVariantDataInfo).IsSceneVariant()))
 
-             {
 
-                 icon = Model.GetSceneIcon();
 
-             }
 
-             else
 
-                 icon = Model.GetBundleIcon();
 
-             var result = new BundleTreeItem(this, depth, icon);
 
-             foreach (var child in m_Children)
 
-             {
 
-                 result.AddChild(child.Value.CreateTreeView(depth + 1));
 
-             }
 
-             return result;
 
-         }
 
-         internal override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
 
-         {
 
-             string newName = System.String.IsNullOrEmpty(parentName) ? "" : parentName + '/';
 
-             newName += displayName;
 
-             if (newName == m_Name.bundleName)
 
-                 return;
 
-             if (newParent != null && newParent.GetChild(newName) != null)
 
-             {
 
-                 Model.LogWarning("An item named '" + newName + "' already exists at this level in hierarchy.  If your desire is to merge bundles, drag one on top of the other.");
 
-                 return;
 
-             }
 
-             foreach (var child in m_Children)
 
-             {
 
-                 child.Value.HandleReparent(parentName);
 
-             }
 
-             if (newParent != null)
 
-             {
 
-                 m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
 
-                 m_Parent = newParent;
 
-                 m_Parent.AddChild(this);
 
-             }
 
-             m_Name.SetBundleName(newName, string.Empty) ;
 
-         }
 
-         internal override bool HandleChildRename(string oldName, string newName)
 
-         {
 
-             var result = base.HandleChildRename(oldName, newName);
 
-             if (m_Children.Count == 0)
 
-                 HandleDelete(true);
 
-             return result;
 
-         }
 
-     }
 
- }
 
 
  |