// ========================================================================= // 函数功能:计算目的菜单项相对源菜单项的位置 // 输入参数: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; } }
// ========================================================================= // 函数功能:计算同层两个菜单项之间的距离(间隔几个菜单项), // 输入参数: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; } }
// =================================================================================== // 函数功能:以存在的菜单树的一个节点为根节点添加一个新的菜单树 // 输入参数: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; }