protected virtual bool InnerExtend(ClassDefinition extension, bool raiseEvent, bool parent) { if (extension == null || extension == this) return false; string name = KeyName; int ext_index = InnerInheritanceList.GetKeyIndex(extension.Name); int my_index = (parent) ? InnerInheritanceList.GetKeyIndex( name ) : -1; // все алгоритмы должны работать для "my_index", // тогда можно будет менять порядок своих предков if (ext_index > 0 && my_index > 0 && my_index >= ext_index) // класс уже есть в списке наследования перед нами return false; InnerFullInheritanceList = null; // что бы пересчитать потом if (CopyExtensions) { // добавить список наследования "перед" указанным индексом // (если my_index < 0, то добавим в конец) //extension.PopulateInheritanceList( InnerInheritanceList, my_index); // { для варианта "хранить только список непосредственных родителей" if (parent && my_index >= 0) InnerInheritanceList.InsertAt(my_index, extension.Name, extension); else InnerInheritanceList[extension.Name] = extension; // } if (ext_index < 0) { UpdateSlotListAfterExtention(ListChangeType.Add, extension); } else { // TODO: если extension переместили, то список определения слотов тоже // должен перестроиться.. // и методов... } } else { if (parent && my_index >= 0) InnerInheritanceList.InsertAt(my_index, extension.Name, extension); else InnerInheritanceList[extension.Name] = extension; // XXX точно не нужно навещивать обработчики? // extension.AfterSlotListChanged += OnExtensionSlotListChanged; } if ( raiseEvent ) OnExtension(ListChangeType.Add, extension); return true; }
protected virtual void OnExtensionExtend(object sender, ExtensionListChangedEventArgs args) { // TODO: перестроить списки слотов и методов... InnerFullInheritanceList = null; UpdateSlotListAfterExtention(args.ChangeType, args.Extensions); OnExtension(ListChangeType.Update, args.Extensions); }
public virtual FixedOrderDictionary PopulateInheritanceList(FixedOrderDictionary ext, int index) { if (ext == null) ext = new FixedOrderDictionary(); string name = KeyName; // XXX так изголялись, что бы менять порядок прямо в списке, а теперь тупо список перестраиваем с 0... if (index >= 0) ext.InsertAt(index, name, this); //for (int i = 0; i < InnerInheritanceList.Count; i++) { foreach (string cname in InnerInheritanceList.Keys) { ClassDefinition cd = (ClassDefinition)InnerInheritanceList[cname]; if (cd != this) cd.PopulateInheritanceList(ext, (index < 0) ? index : ext.GetKeyIndex(name)); else if (index < 0) ext[name] = this; } return ext; }