/// <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> /// Возвращает описатель меню по метаданным /// </summary> /// <param name="xmlMenu">xml-узел i:level-menu,i:empty-tree-menu,i:default-level-menu</param> /// <returns>Объект меню или null, если метаописание меню не содержит структуры (i:menu)</returns> protected XTreeMenuInfo createMenuInfo(XmlElement xmlMenu) { XTreeMenuInfo menu = null; XmlNamespaceManager nsMan = m_mdManager.NamespaceManager; XTreeMenuCacheMode cacheMode; string sValue = xmlMenu.GetAttribute("cache-for"); if (sValue.Length > 0) { cacheMode = XTreeMenuCacheModeParser.Parse(sValue); } else { cacheMode = XTreeMenuCacheMode.Unknow; } xmlMenu = (XmlElement)xmlMenu.SelectSingleNode("i:menu", nsMan); if (xmlMenu != null) { string sCaption; XmlNode node = xmlMenu.SelectSingleNode("i:caption/text() | @t", nsMan); if (node != null) { sCaption = node.InnerText; } else { sCaption = String.Empty; } menu = new XTreeMenuInfo(sCaption); // заполним коллекции обрабочиков foreach (XmlElement xmlNode in xmlMenu.SelectNodes("i:macros-resolver", nsMan)) { menu.MacroResolvers.Add(new XUserCodeWeb(xmlNode.InnerText, xmlNode.GetAttribute("mode") == "replace")); } foreach (XmlElement xmlNode in xmlMenu.SelectNodes("i:visibility-handler", nsMan)) { menu.VisibilityHandlers.Add(new XUserCodeWeb(xmlNode.InnerText, xmlNode.GetAttribute("mode") == "replace")); } foreach (XmlElement xmlNode in xmlMenu.SelectNodes("i:execution-handler", nsMan)) { menu.ExecutionHandlers.Add(new XUserCodeWeb(xmlNode.InnerText, xmlNode.GetAttribute("mode") == "replace")); } buildMenuItems(menu, xmlMenu); menu.CacheMode = cacheMode; } return(menu); }
public override XmlElement ToXml(XmlDocument doc, XmlNamespaceManager nsManager) { XmlElement xmlRoot = base.ToXml(doc, nsManager); XTreeMenuCacheMode cacheMode = CacheMode; if (cacheMode == XTreeMenuCacheMode.Unknow) { cacheMode = XTreeMenuCacheMode.Level; } xmlRoot.SetAttribute("cache-for", XTreeMenuCacheModeParser.ToString(cacheMode)); return(xmlRoot); }
public XXGetNodeDragResponse Execute(XXGetTreeNodeDragRequest oRequest, IXExecutionContext oContext) { if (null == oRequest) { throw new ArgumentNullException("oRequest"); } if (null == oContext) { throw new ArgumentNullException("oContext"); } // Получаем описание иерархии XTreeInfo treeInfo = XInterfaceObjectsHolder.Instance.GetTreeInfo(oRequest.MetaName, oContext.Connection); // Получаем уровень иерархии XTreeLevelInfo treeLevelInfo = treeInfo.GetTreeLevel(oRequest.Path.GetNodeTypes()); // Описатель операции переноса: XXTreeNodeDrag treeNodeDrag = new XXTreeNodeDrag(treeLevelInfo, oContext.Connection.MetadataManager); if (treeNodeDrag.IsEmpty) { // нет меню для уровня иерархии return(new XXGetNodeDragResponse(null)); } else { // Нашли описания операции переноса; склонируем его, т.к. ссылки указывают // непосредственно на XML, который держит менеджер метаданных XmlElement xmlNodeDragNode = (XmlElement)treeNodeDrag.XmlNodeDrag.CloneNode(true); // Проставим признак кешируемости операции переноса для клиента - атрибут // cache-for узла i:node-drag; Сам атрибут определяется для операции переноса в // метаданных; если не объявлен, считается, что кеширование // задано для уровня (т.е. в качестве ключа используется путь): XTreeMenuCacheMode cacheMode = treeNodeDrag.CacheMode; if (cacheMode == XTreeMenuCacheMode.Unknow) { cacheMode = XTreeMenuCacheMode.Level; } xmlNodeDragNode.SetAttribute("cache-for", XTreeMenuCacheModeParser.ToString(cacheMode)); return(new XXGetNodeDragResponse(xmlNodeDragNode)); } }