Example #1
0
// =========================================================================
// 函数功能:计算目的菜单项相对源菜单项的位置
// 输入参数:DestMenuitem:目的菜单项,SrcMenuitem,源菜单项
// 输出参数:Relative,目的菜单项相对于源菜单项的位置,负数表示前面,正表示后面,
// 返回值    :
// 说明          :-128表示出错了,顺序是从嫡长子到最小子的方向
// =========================================================================
bool_t CalPosRelative2SrcMenuitem(struct menu_item * DestMenuitem, struct menu_item *SrcMenuitem, s8 *RelaPos)
{
     bool_t   result=false;
     u8  num1=0,num2=0;//用来计算菜单的序号
     s8   num=0;

     if((NULL==DestMenuitem)||(NULL==SrcMenuitem))//参数检查
     {
           printf("Invalid parameter---CalPosRelative2SrcMenuitem\n");
           return result;
     }
     if(GetParMenuitem(DestMenuitem)!=GetParMenuitem(SrcMenuitem))//不是同一层菜单
     {
        printf("Not same layers----CalPosRelative2SrcMenuitem\n");
        return result;
     }
     //计算他们的序号
     num1=CalMenuitemNumber(DestMenuitem);
     num2=CalMenuitemNumber(SrcMenuitem);
     if((num1==0)||(num2==0))
     {
         return result;
     }
     else
     {
         num=num1-num2;
         *RelaPos=num;
         result=true;
         return result;
     }
}
Example #2
0
// =========================================================================
// 函数功能:计算同层两个菜单项之间的距离(间隔几个菜单项),
// 输入参数:menuitem1,第一个菜单项,menuitem2,第二个菜单项
// 输出参数:
// 返回值    :当前菜单项是同层菜单项的第几个
// 说明          :0xFF表示出错了,顺序是从嫡长子到最小子的方向
// =========================================================================
u8  CalDisBettween2Menuitem(struct menu_item * menuitem1, struct menu_item *menuitem2 )
{
     u8   result;//计算结果
     u8   num1=0,num2=0;//用来计算菜单的序号


     if((NULL==menuitem1)||(NULL==menuitem2))//参数检查
     {
           printf("Invalid parameter--CalDisBetween2Menuitem!\n");
           return 0xFF;
     }
     if(GetParMenuitem(menuitem1)!=GetParMenuitem(menuitem2))//不是同一层菜单
     {
        printf("They are not the same slayers!\n");
        return 0xFF;
     }
     //计算他们的序号
     //计算他们的序号
     num1=CalMenuitemNumber(menuitem1);
     num2=CalMenuitemNumber(menuitem2);
     if((num1==0)||(num2==0))
     {
         return 0xFF;
     }
     else
     {
         if(num1>num2)
         {
              result=num1-num2;
         }
         else
         {
              result=num2-num1;
         }
         return result;
     }
}
Example #3
0
// ===================================================================================
// 函数功能:以存在的菜单树的一个节点为根节点添加一个新的菜单树
// 输入参数:menuitem_tree:存在的菜单树的一个节点;tab_list:用户菜单树意愿表
// 输出参数:
// 返回值:添加的菜单树的根节点,一般的为menuitem_tree,但添加不成功
//          等情况下返回NULL;
// 说明:首先检查tab_list的合法性,然后按照相对位置进行添加,tablist的第一个必须是
//          是主菜单项(处于最高菜单层次,class最小)
// ===================================================================================
struct menu_item*  append_menu_branch(struct menu_item * menuitem_tree, const struct _tagMenuitemModel * tab_list)
{
    bool_t    result=false;
    u8        current_class=0;
    s8        layers=0;//todo;
    u32       num;
    u32       count=0;  //record how many tab has been added
    u32       size=CalTagMenuitemModuleTabSize(tab_list);

    struct menu_item  *current_menuitem=NULL;
    struct menu_item  *temp_menuitem=NULL;
    struct menu_item  *Mresult=NULL;

    //参数检测
    if(menuitem_tree==NULL)
    {
        return Mresult;
    }
    size=CalTagMenuitemModuleTabSize(tab_list);
    //检查列表规则,检查名字长度、class的等级等规则
    result= CheckTagMenuitemModelTab( tab_list,size);
    if(result==false)
    {
        return Mresult;
    }
    //起始点
    current_menuitem=menuitem_tree;
    current_class=tab_list[0].byClass;
    //from here we begin to add the tab to the menuitem_0x_n tree
    for(num=0; num<size; num++)
    {
        temp_menuitem=CreateMenuitem(tab_list[num].byName, tab_list[num].byTip, tab_list[num].byAttrib, \
                                     tab_list[num].passWd, tab_list[num].wPara, tab_list[num].FunctionName);
        if(NULL==temp_menuitem)
        {
            printf("Failed to creat the menuitem--not enught mem!\n");
            //内存不足,那么这颗树必然创建不成功
            DelMenuBranch(menuitem_tree);
            return Mresult;
        }
        if(tab_list[num].byClass>current_class)
        {
            //肯定只会是1,因为在规则检查里面已经检查了。
            result=AddSubMenuitem(current_menuitem,temp_menuitem,false);
            if(result==false)
            {
                printf("Low_layer: the num.%d name=%s.layers=%d class=%d,priviouse class=%d!\n",\
                       num,temp_menuitem->node.name,layers,tab_list[num].byClass,current_class);
                FreeMenuitem(temp_menuitem);
                DelMenuBranch(menuitem_tree);
                return Mresult;
            }
        }
        else if(tab_list[num].byClass==current_class)
        {
            if(num==0)
            {
                result=AddSubMenuitem(current_menuitem,temp_menuitem,true);//the first tab
            }
            else
            {
                result=AddBroMenuitem(current_menuitem,temp_menuitem,false);
            }
            if(result==false)
            {
                printf("Equ_layer: the num.%d name=%s.layers=%d class=%d,priviouse class=%d!\n",\
                       num,temp_menuitem->node.name,layers,tab_list[num].byClass,\
                       current_class);
                FreeMenuitem(temp_menuitem);
                DelMenuBranch(menuitem_tree);
                return Mresult;
            }
            else
            {

            }
        }
        else
        {
            for(layers=tab_list[num].byClass; layers<current_class; layers++)
            {
                current_menuitem=GetParMenuitem(current_menuitem);
            }
            result= AddBroMenuitem(current_menuitem, temp_menuitem,false);//first menuitem node
            if(result==false)
            {
                printf("High_layer: the num.%d name=%s.layers=%d class=%d,priviouse class=%d!\n",\
                       num,temp_menuitem->node.name,layers,tab_list[num].byClass,current_class);
                FreeMenuitem(temp_menuitem);
                DelMenuBranch(menuitem_tree);
                return Mresult;
            }
        }
        current_menuitem=temp_menuitem;
        current_class=tab_list[num].byClass;
        count++;
    }
    if(count==size)
    {
        printf("Has mount the tab completely!---num=%d\n",count);
    }
    else
    {
        printf("Has mount part of the tab!count_should_be=%d  count=%d\n",\
               size,count+1);
        result= false;
    }
    Mresult=menuitem_tree;

    return Mresult;
}