示例#1
0
   /**
    * Returns a unique menu-name for a new menu under @p menuName
    * inspired by @p newMenu
    */
QString MenuFile::uniqueMenuName(const QString &menuName, const QString &newMenu, const QStringList & excludeList)
{
   QDomElement elem = findMenu(m_doc.documentElement(), menuName, false);

   QString result = newMenu;
   if (result.endsWith('/'))
       result.truncate(result.length()-1);

   QRegExp r("(.*)(?=-\\d+)");
   result = (r.indexIn(result) > -1) ? r.cap(1) : result;

   int trunc = result.length(); // Position of trailing '/'

   result.append("/");

   for(int n = 1; ++n; )
   {
      if (findMenu(elem, result, false).isNull() && !excludeList.contains(result))
         return result;

      result.truncate(trunc);
      result.append(QString("-%1/").arg(n));
   }
   return QString(); // Never reached
}
示例#2
0
void MenuFile::moveMenu(const QString &oldMenu, const QString &newMenu)
{
    m_bDirty = true;

    // Undelete the new menu
    QDomElement elem = findMenu(m_doc.documentElement(), newMenu, true);
    purgeDeleted(elem);
    elem.appendChild(m_doc.createElement(MF_NOTDELETED));

    // TODO: GET RID OF COMMON PART, IT BREAKS STUFF
    // Find common part
    QStringList oldMenuParts = QStringList::split('/', oldMenu);
    QStringList newMenuParts = QStringList::split('/', newMenu);
    QString commonMenuName;
    uint max = QMIN(oldMenuParts.count(), newMenuParts.count());
    uint i = 0;
    for(; i < max; i++)
    {
        if(oldMenuParts[i] != newMenuParts[i])
            break;
        commonMenuName += '/' + oldMenuParts[i];
    }
    QString oldMenuName;
    for(uint j = i; j < oldMenuParts.count(); j++)
    {
        if(i != j)
            oldMenuName += '/';
        oldMenuName += oldMenuParts[j];
    }
    QString newMenuName;
    for(uint j = i; j < newMenuParts.count(); j++)
    {
        if(i != j)
            newMenuName += '/';
        newMenuName += newMenuParts[j];
    }

    if(oldMenuName == newMenuName)
        return; // Can happen

    elem = findMenu(m_doc.documentElement(), commonMenuName, true);

    // Add instructions for moving
    QDomElement moveNode = m_doc.createElement(MF_MOVE);
    QDomElement node = m_doc.createElement(MF_OLD);
    node.appendChild(m_doc.createTextNode(oldMenuName));
    moveNode.appendChild(node);
    node = m_doc.createElement(MF_NEW);
    node.appendChild(m_doc.createTextNode(newMenuName));
    moveNode.appendChild(node);
    elem.appendChild(moveNode);
}
示例#3
0
void
SegmentTool::createMenu()
{
    // New version based on the one in MatrixTool.

    const QString rcFileName = "segmenttool.rc";

    //RG_DEBUG << "SegmentTool::createMenu() " << rcFileName << " - " << m_menuName << endl;

    if (!createGUI(rcFileName)) {
        std::cerr << "SegmentTool::createMenu(" << rcFileName
                  << "): menu creation failed\n";
        m_menu = 0;
        return;
    }

    QMenu *menu = findMenu(m_menuName);
    if (!menu) {
        std::cerr << "SegmentTool::createMenu(" << rcFileName
                  << "): menu name "
                  << m_menuName << " not created by RC file\n";
        return;
    }

    m_menu = menu;
}
示例#4
0
void MenuFile::removeMenu(const QString &menuName)
{
   m_bDirty = true;

   QDomElement elem = findMenu(m_doc.documentElement(), menuName, true);

   purgeDeleted(elem);
   elem.appendChild(m_doc.createElement(MF_DELETED));
}
示例#5
0
void MenuFile::addMenu(const QString &menuName, const QString &menuFile)
{
   m_bDirty = true;
   QDomElement elem = findMenu(m_doc.documentElement(), menuName, true);

   QDomElement dirElem = m_doc.createElement(MF_DIRECTORY);
   dirElem.appendChild(m_doc.createTextNode(entryToDirId(menuFile)));
   elem.appendChild(dirElem);
}
示例#6
0
/************************************************
 Search item by path. The path can be absolute or relative. If the element not
 found, the behavior depends on a parameter "createNonExisting." If it's true, then
 the missing items will be created, otherwise the function returns 0.
 ************************************************/
QDomElement XdgMenu::findMenu(QDomElement& baseElement, const QString& path, bool createNonExisting)
{
    Q_D(XdgMenu);
    // Absolute path ..................
    if (path.startsWith('/'))
    {
        QDomElement root = d->mXml.documentElement();
        return findMenu(root, path.section('/', 2), createNonExisting);
    }

    // Relative path ..................
    if (path.isEmpty())
        return baseElement;


    QString name = path.section('/', 0, 0);
    MutableDomElementIterator it(baseElement);
    while(it.hasNext())
    {
        QDomElement n = it.next();
        if (n.attribute("name") == name)
            return findMenu(n, path.section('/', 1), createNonExisting);
    }



    // Not found ......................
    if (!createNonExisting)
        return QDomElement();


    QStringList names = path.split('/', QString::SkipEmptyParts);
    QDomElement el = baseElement;
    foreach (QString name, names)
    {
        QDomElement p = el;
        el = d->mXml.createElement("Menu");
        p.appendChild(el);
        el.setAttribute("name", name);
    }
示例#7
0
void MenuFile::setLayout(const QString &menuName, const QStringList &layout)
{
   m_bDirty = true;

   QDomElement elem = findMenu(m_doc.documentElement(), menuName, true);

   purgeLayout(elem);

   QDomElement layoutNode = m_doc.createElement(MF_LAYOUT);
   elem.appendChild(layoutNode);

   for(QStringList::ConstIterator it = layout.constBegin();
       it != layout.constEnd(); ++it)
   {
      QString li = *it;
      if (li == ":S")
      {
         layoutNode.appendChild(m_doc.createElement(MF_SEPARATOR));
      }
      else if (li == ":M")
      {
         QDomElement mergeNode = m_doc.createElement(MF_MERGE);
         mergeNode.setAttribute("type", "menus");
         layoutNode.appendChild(mergeNode);
      }
      else if (li == ":F")
      {
         QDomElement mergeNode = m_doc.createElement(MF_MERGE);
         mergeNode.setAttribute("type", "files");
         layoutNode.appendChild(mergeNode);
      }
      else if (li == ":A")
      {
         QDomElement mergeNode = m_doc.createElement(MF_MERGE);
         mergeNode.setAttribute("type", "all");
         layoutNode.appendChild(mergeNode);
      }
      else if (li.endsWith('/'))
      {
         li.truncate(li.length()-1);
         QDomElement menuNode = m_doc.createElement(MF_MENUNAME);
         menuNode.appendChild(m_doc.createTextNode(li));
         layoutNode.appendChild(menuNode);
      }
      else
      {
         QDomElement fileNode = m_doc.createElement(MF_FILENAME);
         fileNode.appendChild(m_doc.createTextNode(li));
         layoutNode.appendChild(fileNode);
      }
   }
}
示例#8
0
void MenuFile::removeEntry(const QString &menuName, const QString &menuId)
{
   m_bDirty = true;
   m_removedEntries.append(menuId);

   QDomElement elem = findMenu(m_doc.documentElement(), menuName, true);

   QDomElement excludeNode;
   QDomElement includeNode;

   purgeIncludesExcludes(elem, menuId, excludeNode, includeNode);

   if (excludeNode.isNull())
   {
      excludeNode = m_doc.createElement(MF_EXCLUDE);
      elem.appendChild(excludeNode);
   }
   QDomElement fileNode = m_doc.createElement(MF_FILENAME);
   fileNode.appendChild(m_doc.createTextNode(menuId));
   excludeNode.appendChild(fileNode);
}
示例#9
0
void
MatrixTool::createMenu()
{
    MATRIX_DEBUG << "MatrixTool::createMenu() " << m_rcFileName << " - " << m_menuName << endl;

    if (!createGUI(m_rcFileName)) {
        std::cerr << "MatrixTool::createMenu(" << m_rcFileName << "): menu creation failed" << std::endl;
        m_menu = 0;
        return;
    }

    QMenu *menu = findMenu(m_menuName);
    if (!menu) {
        std::cerr << "MatrixTool::createMenu(" << m_rcFileName
                  << "): menu name "
                  << m_menuName << " not created by RC file\n";
        return;
    }

    m_menu = menu;
}    
示例#10
0
void
MatrixTool::createMenu()
{
    MATRIX_DEBUG << "MatrixTool::createMenu() " << m_rcFileName << " - " << m_menuName;

    if (!createGUI(m_rcFileName)) {
        RG_WARNING << "MatrixTool::createMenu(" << m_rcFileName << "): menu creation failed";
        m_menu = 0;
        return;
    }

    QMenu *menu = findMenu(m_menuName);
    if (!menu) {
        RG_WARNING << "MatrixTool::createMenu(" << m_rcFileName
                  << "): menu name "
                  << m_menuName << " not created by RC file";
        return;
    }

    m_menu = menu;
}    
示例#11
0
QDomElement MenuFile::findMenu(QDomElement elem, const QString &menuName, bool create)
{
   QString menuNodeName;
   QString subMenuName;
   int i = menuName.indexOf('/');
   if (i >= 0)
   {
      menuNodeName = menuName.left(i);
      subMenuName = menuName.mid(i+1);
   }
   else
   {
      menuNodeName = menuName;
   }
   if (i == 0)
      return findMenu(elem, subMenuName, create);

   if (menuNodeName.isEmpty())
      return elem;

   QDomNode n = elem.firstChild();
   while( !n.isNull() )
   {
      QDomElement e = n.toElement(); // try to convert the node to an element.
      if (e.tagName() == MF_MENU)
      {
         QString name;

         QDomNode n2 = e.firstChild();
         while ( !n2.isNull() )
         {
            QDomElement e2 = n2.toElement();
            if (!e2.isNull() && e2.tagName() == MF_NAME)
            {
               name = e2.text();
               break;
            }
            n2 = n2.nextSibling();
         }

         if (name == menuNodeName)
         {
            if (subMenuName.isEmpty())
               return e;
            else
               return findMenu(e, subMenuName, create);
         }
      }
      n = n.nextSibling();
   }

   if (!create)
      return QDomElement();

   // Create new node.
   QDomElement newElem = m_doc.createElement(MF_MENU);
   QDomElement newNameElem = m_doc.createElement(MF_NAME);
   newNameElem.appendChild(m_doc.createTextNode(menuNodeName));
   newElem.appendChild(newNameElem);
   elem.appendChild(newElem);

   if (subMenuName.isEmpty())
      return newElem;
   else
      return findMenu(newElem, subMenuName, create);
}
示例#12
0
/*---------------------------------------------------------------------
* Build a menu and Handle user selection
*/
void BuildMenu(void * menuP,char * dummyP)
{
	short int menuItemCount=0;
	int key,index;
    static int menulevel=0;
	MenuItem_T *menulistP = ((Menu_T *)menuP)->menuList;

    while(menulistP[menuItemCount].displayedString != 0)
        menuItemCount++;

	index = 0;
   	menulevel ++;
	do
    {
        if (index < 0 || index >= menuItemCount) index = 0;
        
		drawMenu((Menu_T *)menuP,index);

		//Wait for any key pressed
waitkey:
		key = GetKey();
		
		if (ISCONTROLKEY(key))
		{
			if (key == KEY_UP)
			{
				index --;
				if (index < 0)
				{
					index = menuItemCount -1;
				}
				continue;
			}
			else if (key == KEY_DOWN)
			{
				index ++;
				if (index >= menuItemCount) 
				{
					index = 0;
				}
				continue;
			}
			else if (key == KEY_ACTION)
			{
	            ;
			}
			else if (key == KEY_BACK)
			{
				//to upper level menu
	         if (menulevel > 1)
				break;
			 else goto waitkey;	
			}
			else if (key == KEY_UNKNOWN)
	      	{
	        	goto waitkey;
	      	}
		}
		else
		{
			//user activate the menu handler thru selection char(e.g. press number)
			index = findMenu(translateKey(key),menulistP);
			if (index == -1) goto waitkey;	//invalid selection, just do nothing
		}
		
    	if (menulistP[index].func)
        	menulistP[index].func(menulistP[index].arg,menulistP[index].cmdlineString);
    	else
    	{
            break;//exit the current menu
	    }

	}while(1);

   menulevel --;
}