void wb_session::getAllMenuItems(ldh_sMenuCall* ip, ldh_sMenuItem** Item, wb_cdrep* cdrep, wb_orep* o, void* o_body, pwr_tUInt32 Level, int* nItems, int AddSeparator) { pwr_sMenuButton* mbp; pwr_sMenuCascade* mcp; wb_tMethod method = NULL; wb_tMethod filter; pwr_tStatus sts; Level++; memset(*Item, 0, sizeof(**Item)); if (AddSeparator) { (*Item)->Level = Level; (*Item)->Item = ldh_eMenuItem_Separator; (*Item)->MenuObject = pwr_cNObjid; (*Item)++; (*nItems)++; } else if (o->cid() == pwr_eClass_MenuButton) { mbp = (pwr_sMenuButton*)o_body; if (Level == 1) { // Check if method is overridden, ie name already exist for (int i = 0; i < *nItems; i++) { if (ldh_lMenuItem[i].Level == Level && streq(ldh_lMenuItem[i].Name, mbp->ButtonName)) { (*Item)->Disabled = 1; for (int j = i + 1; j < *nItems; j++) { if (ldh_lMenuItem[j].Level > ldh_lMenuItem[i].Level) (*Item)->Disabled = 1; else if (ldh_lMenuItem[j].Level == ldh_lMenuItem[i].Level) break; } } } } (*Item)->Level = Level; (*Item)->Item = ldh_eMenuItem_Button; (*Item)->MenuObject = o->oid(); (*Item)->Flags.f.Sensitive = 0; if (mbp->MethodName[0] != 0) { m_vrep->erep()->method(&sts, mbp->MethodName, &method); if (ODD(sts)) (*Item)->Flags.f.Sensitive = 1; } if ((*Item)->Flags.f.Sensitive == 1) { m_vrep->erep()->method(&sts, mbp->FilterName, &filter); if (ODD(sts)) (*Item)->Flags.f.Sensitive = ((wb_tMethodMenuFilter)filter)(ip, mbp); } strcpy((*Item)->Name, mbp->ButtonName); (*Item)->Method = method; (*Item)++; (*nItems)++; } else if (o->cid() == pwr_eClass_MenuSeparator) { (*Item)->Level = Level; (*Item)->Item = ldh_eMenuItem_Separator; (*Item)->MenuObject = o->oid(); (*Item)++; (*nItems)++; } else if (o->cid() == pwr_eClass_MenuCascade) { mcp = (pwr_sMenuCascade*)o_body; if (Level == 1) { // Check if method is overridden, ie name already exist for (int i = 0; i < *nItems; i++) { if (ldh_lMenuItem[i].Level == Level && streq(ldh_lMenuItem[i].Name, mcp->ButtonName)) { ldh_lMenuItem[i].Disabled = 1; for (int j = i + 1; j < *nItems; j++) { if (ldh_lMenuItem[j].Level > ldh_lMenuItem[i].Level) ldh_lMenuItem[j].Disabled = 1; else if (ldh_lMenuItem[j].Level == ldh_lMenuItem[i].Level) break; } } } } (*Item)->Level = Level; (*Item)->Item = ldh_eMenuItem_Cascade; (*Item)->Flags.f.Sensitive = 1; strcpy((*Item)->Name, mcp->ButtonName); (*Item)->MenuObject = o->oid(); (*Item)++; (*nItems)++; void* child_body; wb_orep* child = cdrep->menuFirst(&sts, o, &child_body); while (ODD(sts)) { child->ref(); getAllMenuItems(ip, Item, cdrep, child, child_body, Level, nItems, 0); wb_orep* prev = child; child = cdrep->menuAfter(&sts, child, &child_body); prev->unref(); } } }
int XNav::getAllMenuItems( xmenu_sMenuCall *ip, xmenu_sMenuItem **Item, pwr_tObjid objid, pwr_tUInt32 Level, int *nItems, int AddSeparator, pwr_sAttrRef *CurrentObject) { int sts; pwr_tCid classid; pwr_tObjid child; pwr_sMenuButton *mbp; pwr_sMenuCascade *mcp; pwr_sMenuRef *mrp; pwr_tStatus (*filter)( xmenu_sMenuCall *); int sensitive; int i; Level++; memset(*Item, 0, sizeof(**Item)); if(AddSeparator) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Separator; (*Item)->MenuObject = pwr_cNObjid; (*Item)++; (*nItems)++; } else { sts = gdh_GetObjectClass( objid, &classid); if ( EVEN(sts)) return sts; if ( classid == pwr_eClass_MenuButton) { sts = gdh_ObjidToPointer( objid, (void **) &mbp); if ( EVEN(sts)) return sts; ip->ChosenItem = *nItems; for ( i = 0; i < 5; i++) { strcpy( (*Item)->FilterArguments[i], mbp->FilterArguments[i]); } // Call any filter method (*Item)->CurrentObject = *CurrentObject; sensitive = 1; if ( strcmp( mbp->FilterName, "") != 0) { sts = GetMethod( mbp->FilterName, &filter); if ( ODD(sts)) { sts = (filter) ( ip); if ( sts == XNAV__INSENSITIVE) sensitive = 0; } } else sts = XNAV__SUCCESS; if ( ODD(sts)) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Button; (*Item)->MenuObject = objid; (*Item)->Flags.f.Sensitive = sensitive; if (strcmp( mbp->MethodName, "") == 0) (*Item)->Flags.f.Sensitive = 0; strcpy((*Item)->Name, mbp->ButtonName); strcpy( (*Item)->Method, mbp->MethodName); strcpy( (*Item)->Filter, mbp->FilterName); for ( i = 0; i < 5; i++) { strcpy( (*Item)->MethodArguments[i], mbp->MethodArguments[i]); } (*Item)++; (*nItems)++; } } else if ( classid == pwr_eClass_MenuSeparator) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Separator; (*Item)->MenuObject = objid; (*Item)++; (*nItems)++; } else if ( classid == pwr_eClass_MenuCascade) { sts = gdh_ObjidToPointer( objid, (void **) &mcp); if ( EVEN(sts)) return sts; // Call any filter method (*Item)->CurrentObject = *CurrentObject; if ( strcmp( mcp->FilterName, "") != 0) { sts = GetMethod( mcp->FilterName, &filter); if ( ODD(sts)) { sts = (filter) ( ip); } } else sts = XNAV__SUCCESS; if ( ODD(sts)) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Cascade; (*Item)->Flags.f.Sensitive = 1; strcpy((*Item)->Name, mcp->ButtonName); (*Item)->MenuObject = objid; (*Item)++; (*nItems)++; sts = gdh_GetChild( objid, &child); while( ODD(sts)) { sts = getAllMenuItems(ip, Item, child, Level, nItems, 0, CurrentObject); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } } else if ( classid == pwr_eClass_MenuRef && cdh_ObjidIsNull( CurrentObject->Objid)) { pwr_tAName aname; pwr_sAttrRef currentar; pwr_tCid current_cid; pwr_tTid a_tid; pwr_tUInt32 a_size, a_offs, a_elem; sts = gdh_ObjidToPointer( objid, (void **) &mrp); if ( EVEN(sts)) return sts; // Call any filter method (*Item)->CurrentObject = *CurrentObject; if ( strcmp( mrp->FilterName, "") != 0) { sts = GetMethod( mrp->FilterName, &filter); if ( ODD(sts)) { sts = (filter) ( ip); } } else sts = XNAV__SUCCESS; if ( ODD(sts)) { int create_object_button = 0; if ( strcmp( mrp->RefAttribute, "_SelfObject") == 0) { // Object entry for attributes char *s; sts = gdh_AttrrefToName( &ip->Pointed, aname, sizeof(aname), cdh_mName_volumeStrict); if ( EVEN(sts)) return sts; if ( (s = strrchr( aname, '.'))) *s = 0; sts = gdh_NameToAttrref( pwr_cNOid, aname, ¤tar); if ( EVEN(sts)) return sts; } else { sts = gdh_AttrrefToName( &ip->Pointed, aname, sizeof(aname), cdh_mName_volumeStrict); if ( EVEN(sts)) return sts; strcat( aname, "."); strcat( aname, mrp->RefAttribute); sts = gdh_GetAttributeCharacteristics( aname, &a_tid, &a_size, &a_offs, &a_elem); if ( ODD(sts)) { switch ( a_tid) { case pwr_eType_AttrRef: sts = gdh_GetObjectInfo( aname, ¤tar, sizeof(currentar)); break; case pwr_eType_Objid: { pwr_tOid oid; currentar = pwr_cNAttrRef; sts = gdh_GetObjectInfo( aname, &oid, sizeof(oid)); currentar = cdh_ObjidToAref( oid); break; } default: sts = 0; } } create_object_button = 0; } if ( ODD(sts) && cdh_ObjidIsNotNull( currentar.Objid)) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Ref; (*Item)->Flags.f.Sensitive = 1; strcpy((*Item)->Name, mrp->ButtonName); (*Item)->MenuObject = objid; (*Item)++; (*nItems)++; // Create a label with current object name sts = gdh_AttrrefToName( ¤tar, aname, sizeof(aname), cdh_mNName); if ( ODD(sts) && create_object_button) { (*Item)->Level = Level; (*Item)->Item = xmenu_eMenuItem_Button; (*Item)->MenuObject = pwr_cNObjid; strncpy((*Item)->Name, aname, sizeof((*Item)->Name)); (*Item)->Name[sizeof((*Item)->Name)-1] = 0; (*Item)->MenuObject = pwr_cNObjid; (*Item)->CurrentObject = currentar; (*Item)->Flags.f.Sensitive = 1; strcpy( (*Item)->Method, "$Object-OpenObject"); (*Item)++; (*nItems)++; } sts = gdh_GetAttrRefTid( ¤tar, ¤t_cid); if ( EVEN(sts)) return sts; xmenu_eItemType item_type = ip->ItemType; if ( currentar.Flags.b.Object) ip->ItemType = xmenu_eItemType_Object; else ip->ItemType = xmenu_eItemType_AttrObject; sts = GetObjectMenu(ip, current_cid, Item, Level, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; ip->ItemType = item_type; } } } } return XNAV__SUCCESS; }
pwr_tStatus wb_session::getMenu(ldh_sMenuCall* ip) { pwr_tStatus sts = 0; ldh_sMenuItem* Item = (ldh_sMenuItem*)&ldh_lMenuItem; pwr_tUInt32 i; pwr_tObjName MenuFolder; pwr_tString80 Menu; pwr_tBoolean isSame = FALSE; pwr_tClassId Class; pwr_tObjid Object; int nItems = 0; wb_name cn; for (i = 0; i < ip->SelectCount; i++) { if (cdh_ObjidIsEqual(ip->Pointed.Objid, ip->Selected[i].Objid) && ip->Pointed.Offset == ip->Selected[i].Offset && ip->Pointed.Flags.m == ip->Selected[i].Flags.m) { isSame = TRUE; break; } } sprintf(MenuFolder, "%sP%cs%c%c", ldh_lUtility[((wb_session*)ip->PointedSession)->utility()].Name, ldh_lMenuSet[ip->PointedSet].Char, ldh_lMenuSet[ip->SelectedSet].Char, (isSame ? 's' : 'n')); /* Find generic menues of pointed object */ switch (ip->PointedSet) { case ldh_eMenuSet_Object: { sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", MenuFolder); wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object); if (EVEN(sts)) return sts; wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (EVEN(sts)) break; o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } delete cdrep; o->unref(); break; } case ldh_eMenuSet_ObjectAttr: { pwr_tObjName OMenuFolder; sprintf(OMenuFolder, "%sP%cs%c%c", ldh_lUtility[((wb_session*)ip->PointedSession)->utility()].Name, 'x', 'x', 'x'); sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", OMenuFolder); wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object); if (EVEN(sts)) return sts; wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (EVEN(sts)) return sts; o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } delete cdrep; o->unref(); break; } case ldh_eMenuSet_Attribute: case ldh_eMenuSet_Array: { sprintf(Menu, "pwrs:Class-$Attribute-%s-Pointed", MenuFolder); wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Param); if (EVEN(sts)) return sts; wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (EVEN(sts)) return sts; o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } delete cdrep; o->unref(); break; } case ldh_eMenuSet_Class: { sprintf(Menu, "pwrs:Class-$Object-%s-Pointed", MenuFolder); wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object); if (EVEN(sts)) return sts; wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (EVEN(sts)) return sts; o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } delete cdrep; o->unref(); break; } default:; } /* Find specific menues of pointed object */ switch (ip->PointedSet) { case ldh_eMenuSet_Object: case ldh_eMenuSet_ObjectAttr: { if (ip->PointedSet == ldh_eMenuSet_Class) { Class = cdh_ClassObjidToId(ip->Pointed.Objid); } else { wb_attribute a = attribute(&ip->Pointed); if (!a) return sts; Class = a.tid(); } wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, Class); while (ODD(sts)) { cn = cdrep->longName(); sprintf(Menu, "%s-%s-Pointed", cn.name(), MenuFolder); wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (ODD(sts)) { o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } o->unref(); } // Get menuitems for superclass wb_cdrep* super_cdrep = cdrep->super(&sts); if (super_cdrep) { delete cdrep; cdrep = super_cdrep; } } delete cdrep; break; } default:; } switch (ip->SelectedSet) { case ldh_eMenuSet_Attribute: case ldh_eMenuSet_Array: case ldh_eMenuSet_ObjectAttr: break; case ldh_eMenuSet_Class: case ldh_eMenuSet_Many: case ldh_eMenuSet_Object: { if (ip->PointedSet != ldh_eMenuSet_Object) break; /* Find generic menues for selected object(s) */ sprintf(Menu, "pwrs:Class-$Object-%s-Selected", MenuFolder); wb_cdrep* cdrep = m_vrep->merep()->cdrep(&sts, pwr_eClass_Object); if (EVEN(sts)) return sts; wb_orep* o = m_vrep->erep()->object(&sts, Menu); if (ODD(sts)) { o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } o->unref(); } delete cdrep; /* Find specific menues for selected object(s) */ if (ip->PointedSet == ldh_eMenuSet_Class) { Class = cdh_ClassObjidToId(ip->Pointed.Objid); } else { if (m_vrep->vid() == ip->Pointed.Objid.vid) o = m_vrep->object(&sts, ip->Pointed.Objid); else // Other volume o = m_vrep->erep()->object(&sts, ip->Pointed.Objid); if (EVEN(sts)) return sts; o->ref(); Class = o->cid(); o->unref(); } cdrep = m_vrep->merep()->cdrep(&sts, Class); while (ODD(sts)) { cn = cdrep->longName(); sprintf(Menu, "%s-%s-Selected", cn.name(), MenuFolder); o = m_vrep->erep()->object(&sts, Menu); if (ODD(sts)) { o->ref(); Object = o->oid(); void* o_menu_body; wb_orep* o_menu = cdrep->menuFirst(&sts, o, &o_menu_body); while (ODD(sts)) { o_menu->ref(); getAllMenuItems(ip, &Item, cdrep, o_menu, o_menu_body, 0, &nItems, 0); wb_orep* prev = o_menu; o_menu = cdrep->menuAfter(&sts, o_menu, &o_menu_body); prev->unref(); } o->unref(); } // Get menuitems for superclass wb_cdrep* super_cdrep = cdrep->super(&sts); if (super_cdrep) { delete cdrep; cdrep = super_cdrep; } } delete cdrep; break; } default: break; } Item->Level = 0; ip->ItemList = ldh_lMenuItem; ip->ItemCount = nItems - 1; return LDH__SUCCESS; }
int XNav::GetObjectMenu( xmenu_sMenuCall *ip, pwr_tCid classid, xmenu_sMenuItem **Item, pwr_tUInt32 Level, int *nItems, int AddSeparator, pwr_sAttrRef *CurrentObject) { int sts; pwr_tObjid child; pwr_tObjid menu_objid; char menu[80]; pwr_tOName classname; pwr_sAttrRef currentar = pwr_cNAttrRef; pwr_tCid supercid; if ( cdh_ObjidIsNotNull( CurrentObject->Objid)) currentar = *CurrentObject; if ( ip->ItemType == xmenu_eItemType_Object) { // Popup-menu for an object if ( !cdh_tidIsCid( classid)) return XNAV__SUCCESS; // Get the RtXtt common menu-objects strcpy( menu, "pwrs:Class-$Object-RtXtt"); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, Level, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } // Get the RtXtt menu-objects for superclasses // TODO shadow overlayed methods... sts = gdh_GetSuperClass( classid, &supercid, CurrentObject->Objid); while ( ODD(sts)) { sts = gdh_ObjidToName( cdh_ClassIdToObjid( supercid), classname, sizeof(classname), cdh_mName_volumeStrict); if ( EVEN(sts)) return sts; sprintf( menu, "%s-RtXtt", classname); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } sts = gdh_GetSuperClass( supercid, &supercid, CurrentObject->Objid); } // Get the RtXtt menu-objects for this class, or for superclasses sts = gdh_ObjidToName( cdh_ClassIdToObjid( classid), classname, sizeof(classname), cdh_mName_volumeStrict); if ( EVEN(sts)) return sts; sprintf( menu, "%s-RtXtt", classname); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } } else if ( ip->ItemType == xmenu_eItemType_AttrObject) { // Find attribute object methods... if ( !cdh_tidIsCid( classid)) return XNAV__SUCCESS; // Get the RtXtt common menu-objects strcpy( menu, "pwrs:Class-$Object-RtXttAttrObject"); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } // Get the RtXtt menu-objects for this class sts = gdh_ObjidToName( cdh_ClassIdToObjid( classid), classname, sizeof(classname), cdh_mName_volumeStrict); if ( EVEN(sts)) return sts; sprintf( menu, "%s-RtXtt", classname); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } } else if ( ip->ItemType == xmenu_eItemType_Attribute) { // Find attribute methods... // Get the RtXttAttribute common menu-objects strcpy( menu, "pwrs:Class-$Object-RtXttAttribute"); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } } else if ( ip->ItemType == xmenu_eItemType_Crossref) { // Find attribute methods... // Get the RtXttCrossref common menu-objects strcpy( menu, "pwrs:Class-$Object-RtXttCrossref"); sts = gdh_NameToObjid( menu, &menu_objid); if ( ODD(sts)) { sts = gdh_GetChild( menu_objid, &child); while( ODD(sts)) { sts = getAllMenuItems( ip, Item, child, 0, nItems, 0, ¤tar); if ( EVEN(sts)) return sts; sts = gdh_GetNextSibling( child, &child); } } } return XNAV__SUCCESS; }