Esempio n. 1
0
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();
    }
  }
}
Esempio n. 2
0
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, &currentar);
	  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, &currentar, 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( &currentar, 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( &currentar, &current_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, &currentar);
	  if ( EVEN(sts)) return sts;

	  ip->ItemType = item_type;
        }
      }
    }
  }
  return XNAV__SUCCESS;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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, &currentar);
          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, &currentar);
	    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, &currentar);
          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, &currentar);
          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, &currentar);
          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, &currentar);
          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, &currentar);
          if ( EVEN(sts)) return sts;
          sts = gdh_GetNextSibling( child, &child);
        }
      }
    }

  return XNAV__SUCCESS;
}