/// <summary> /// Иниализация операции переноса на основании метаописания уровня иерархии /// </summary> /// <param name="treeLevel">Описатель уровня иерархии</param> internal XXTreeNodeDrag(XTreeLevelInfo treeLevel, XMetadataManager manager) { m_xmlNSManager = treeLevel.NamespaceManager; string metaname = treeLevel.Xml.GetAttribute("node-drag", m_sExtensionNamespace); if (string.IsNullOrEmpty(metaname)) { metaname = treeLevel.TreeInfo.Xml.GetAttribute("node-drag", m_sExtensionNamespace); } if (!string.IsNullOrEmpty(metaname)) { string prefix = m_xmlNSManager.LookupPrefix(m_sExtensionNamespace); m_xmlNodeDrag = manager.SelectSingleNode(prefix + ":node-drag[@n=\"" + metaname + "\"]") as XmlElement; } if (m_xmlNodeDrag == null) { m_bIsEmpty = true; } else { m_bIsEmpty = false; string sValue = m_xmlNodeDrag.GetAttribute("cache-for"); if (sValue.Length > 0) { m_cacheMode = XTreeMenuCacheModeParser.Parse(sValue); } else { m_cacheMode = XTreeMenuCacheMode.Unknow; } } }
/// <summary> /// Создает описание списка при первом обращении. /// Параметр делегата CreateCacheValue. /// </summary> /// <param name="sKey">Ключ в формате {Наименование типа}:{Наименование списка}</param> /// <param name="value">XStorageConnection</param> /// <returns>экземпляр ListInfoWithAccessCheck</returns> private static ListInfoWithAccessCheck createListInfo(string sKey, object value) { #region Copy-paste кода из XInterfaceObjectsHolder::createListInfo XStorageConnection connection = (XStorageConnection)value; XMetadataManager metadataManager = connection.MetadataManager; // Ключ для сохранения в реестре (кеше) XModel в данном случае // ДОЛЖЕН БЫТЬ в виде {Наименование типа}:{Наименование списка} // Разберем этот ключ - выделим наименование типа и наименование списка Debug.Assert(sKey.IndexOf(":") > -1, "Отсутствует символ ':' в ключе"); int nIndex = sKey.IndexOf(":"); string sTypeName = sKey.Substring(0, nIndex); Debug.Assert(sTypeName.Length > 0, "Не задан тип"); string sName = sKey.Substring(nIndex + 1, sKey.Length - nIndex - 1); // Сформируем XPath-запрос и загрузим метаописание списка; при формировании // запроса учитваем что метанаименование списка - параметр необязательный string sXPath = "ds:type[@n='" + sTypeName + "']/i:objects-list"; if (sName.Length > 0) { sXPath = sXPath + "[@n='" + sName + "']"; } XmlElement xmlList = (XmlElement)metadataManager.SelectSingleNode(sXPath); if (xmlList == null) { throw new ArgumentException( "Неизвестное определение списка i:objects-list с метанаименованием " + "'" + sName + "', для типа '" + sTypeName + "' " + "(не найдено в метаданных, XPath='" + sXPath + "')"); } #endregion //Создаем описание списка ListInfoWithAccessCheck. ListInfoWithAccessCheck listInfo = new ListInfoWithAccessCheck(xmlList, connection.MetadataManager.NamespaceManager, connection.MetadataManager.XModel); XPrivilegeSet privSet = new XPrivilegeSet(); //Зачитываем из метаданных необходимые привилегии для доступа к заданному списку и записываем их в контейнер привилегий. foreach (XmlElement xmlNode in xmlList.SelectNodes("it-sec:access-requirements/*", connection.MetadataManager.NamespaceManager)) { string sPrivName = xmlNode.GetAttribute("n"); ITSystemPrivilege priv = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName)); privSet.Add(priv); } listInfo.AccessSecurity.SetRequiredPrivileges(privSet); return(listInfo); }