protected override MenuItem CreateMenuItem(string text, string key, string img)
        {
            string PID_SPACE_EXCHANGE_SERVER = "SpaceExchangeServer";

            MenuItem item = new MenuItem();

            item.Text        = GetLocalizedString("Text." + text);
            item.NavigateUrl = PortalUtils.NavigatePageURL(PID_SPACE_EXCHANGE_SERVER, "ItemID", ItemID.ToString(),
                                                           PortalUtils.SPACE_ID_PARAM + "=" + PackageId, DefaultPage.CONTROL_ID_PARAM + "=" + key,
                                                           "moduleDefId=exchangeserver");

            if (img == null)
            {
                item.ImageUrl = PortalUtils.GetThemedIcon("Icons/tool_48.png");
            }
            else
            {
                item.ImageUrl = PortalUtils.GetThemedIcon(img);
            }

            return(item);
        }
        private MenuItem CreateMenuItem(PackageContext cntx, XmlNode xmlNode)
        {
            string pageId = GetXmlAttribute(xmlNode, "pageID");

            if (!PortalUtils.PageExists(pageId))
            {
                return(null);
            }

            string url           = GetXmlAttribute(xmlNode, "url");
            string title         = GetXmlAttribute(xmlNode, "title");
            string imageUrl      = GetXmlAttribute(xmlNode, "imageUrl");
            string target        = GetXmlAttribute(xmlNode, "target");
            string resourceGroup = GetXmlAttribute(xmlNode, "resourceGroup");
            string quota         = GetXmlAttribute(xmlNode, "quota");
            bool   disabled      = Utils.ParseBool(GetXmlAttribute(xmlNode, "disabled"), false);

            // get custom page parameters
            XmlNodeList   xmlParameters = xmlNode.SelectNodes("Parameters/Add");
            List <string> parameters    = new List <string>();

            foreach (XmlNode xmlParameter in xmlParameters)
            {
                parameters.Add(xmlParameter.Attributes["name"].Value
                               + "=" + xmlParameter.Attributes["value"].Value);
            }

            // add menu item
            string pageUrl = !String.IsNullOrEmpty(url) ? url : PortalUtils.NavigatePageURL(
                pageId, PortalUtils.SPACE_ID_PARAM, cntx.Package.PackageId.ToString(), parameters.ToArray());
            string   pageName = !String.IsNullOrEmpty(title) ? title : PortalUtils.GetLocalizedPageName(pageId);
            MenuItem item     = new MenuItem(pageName, "", "", disabled ? null : pageUrl);

            item.ImageUrl = PortalUtils.GetThemedIcon(imageUrl);

            if (!String.IsNullOrEmpty(target))
            {
                item.Target = target;
            }
            item.Selectable = !disabled;

            // check groups/quotas
            bool display = true;

            if (cntx != null)
            {
                display = (String.IsNullOrEmpty(resourceGroup) ||
                           cntx.Groups.ContainsKey(resourceGroup)) &&
                          (String.IsNullOrEmpty(quota) ||
                           (cntx.Quotas.ContainsKey(quota) &&
                            cntx.Quotas[quota].QuotaAllocatedValue != 0));
            }

            // process nested menu items
            XmlNodeList xmlMenuNodes = xmlNode.SelectNodes("MenuItems/MenuItem");

            foreach (XmlNode xmlMenuNode in xmlMenuNodes)
            {
                MenuItem menuItem = CreateMenuItem(cntx, xmlMenuNode);
                if (menuItem != null)
                {
                    item.ChildItems.Add(menuItem);
                }
            }

            if (display && !(disabled && item.ChildItems.Count == 0))
            {
                return(item);
            }

            return(null);
        }