Example #1
0
int print_data( pwr_sAttrRef *arp, FILE *fp)
{
  int		sts;
  char		*s;
  pwr_tClassId	classid;
  char		*object_p;
  pwr_tAName   	dataname;
  pwr_tAName   	objectname;
  pwr_tAName   	attributename;
  pwr_tAttrRef	aref;
  int 		object_backup;
  int		array_element = 0;
  int		index;
  int		nr;

  sts = gdh_AttrrefToName( arp, dataname, sizeof(dataname), cdh_mNName);
  if ( EVEN(sts)) return sts;

  strcpy( objectname, dataname);
  if ( !arp->Flags.b.ObjectAttr && (s = strchr( objectname, '.'))) {
    *s = 0;
    object_backup = 0;
    strcpy( attributename, dataname);
    if ( (s = strchr( dataname, '['))) {
      array_element = 1;

      nr = sscanf( s+1, "%d", &index);
      if ( nr != 1) return 0;
    }
  }
  else {
    object_backup = 1;
  }

  sts = gdh_NameToAttrref( pwr_cNOid, objectname, &aref);
  if ( EVEN(sts)) return sts;

  sts = gdh_AttrRefToPointer( &aref, (void **)&object_p);
  if ( EVEN(sts)) return sts;

  sts = gdh_GetAttrRefTid( &aref, &classid);
  if ( EVEN(sts)) return sts;

  if ( object_backup) {
    print_object( &aref, classid, object_p, 0, objectname, fp);
  }
  else {
    print_attribute( &aref, classid, object_p, attributename, array_element, index, fp);
  }
  return 1;
}
Example #2
0
void ra_result::setPointer(int resultNo, const char *pointer)
// Set pointer to result
{
  pwr_sAttrRef    attrref;
  pwr_tDlid       refid;
  pwr_tStatus     sts;
  
  resultNo_ = resultNo;
  
  sts = gdh_NameToAttrref( pwr_cNObjid, pointer, &attrref);
  if ( EVEN(sts)) throw co_error(sts);

  sts = gdh_DLRefObjectInfoAttrref( &attrref, (void**)&pointer_, &refid);
  if ( EVEN(sts)) throw co_error(sts);

  dlid_ = &refid;
}
Example #3
0
/* aaref points to ActualValue */
static int IsDisabled( pwr_tAttrRef *aaref)
{
  pwr_tDisableAttr disabled;
  pwr_tAName name;
  pwr_tAttrRef oaref;
  pwr_tStatus sts;
  char *s;
  
  sts = gdh_AttrrefToName( aaref, name, sizeof(name), cdh_mNName);  
  if ( EVEN(sts)) return 0;

  if ( (s = strrchr( name, '.')))
    *s = 0;
  else
    return 0;
       
  sts = gdh_NameToAttrref( pwr_cNObjid, name, &oaref);
  if ( EVEN(sts)) return 0;

  sts = gdh_ArefDisabled( &oaref, &disabled);
  if ( ODD(sts) && disabled)
    return 1;
  return 0;
}
Example #4
0
int XAttNav::get_select( pwr_tAttrRef *arp)
{
  brow_tNode	*node_list;
  int		node_count;
  ItemCollect	*item;
  pwr_tStatus 	sts;

  brow_GetSelectedNodes( brow->ctx, &node_list, &node_count);
  if ( node_count != 1)
    return 0;

  brow_GetUserData( node_list[0], (void **)&item);
  free( node_list);

  switch( item->type) {
  case xnav_eItemType_Collect:
    sts = gdh_NameToAttrref( pwr_cNObjid, item->name, arp);
    if ( EVEN(sts)) return sts;
    break;
  default:
    return 0;
  }
  return XATT__SUCCESS;
}
Example #5
0
XttFast::XttFast( void *parent_ctx,
		  char *name,
		  pwr_sAttrRef *fast_arp,
		  int *sts) :
  xnav(parent_ctx), fast_cnt(0), timerid(0), close_cb(0), help_cb(0), first_scan(1),
  axis_configured(false)
{
  pwr_sAttrRef aref = pwr_cNAttrRef;
  pwr_tAName fast_name;
  pwr_tAName attr_name;
  pwr_sClass_DsFastCurve fp;
  int i, j;
    
  *sts = XNAV__SUCCESS;

  // Get current status of the fast objects
  i = 0;
  aref = *fast_arp;
  if ( cdh_ObjidIsNull( aref.Objid)) {
    *sts = XNAV__FASTCONFIG;
    return;
  }

  *sts = gdh_AttrrefToName( &aref, fast_name, sizeof(fast_name), 
			  cdh_mNName);
  if (EVEN(*sts)) return;

  *sts = gdh_GetObjectInfo( fast_name, &fp, sizeof(fp));
  if ( EVEN(*sts)) return;

  max_points = fp.NoOfPoints;
  fast_function = fp.Function;

  strcpy( attr_name, fast_name);
  strcat( attr_name, ".TriggTime");
  gdh_NameToAttrref( pwr_cNObjid, attr_name, &trigg_time_attr);

  if ( fast_function & fast_mFunction_BeforeTrigg) {
    strcpy( attr_name, fast_name);
    strcat( attr_name, ".TriggIndex");
    gdh_NameToAttrref( pwr_cNObjid, attr_name, &trigg_index_attr);

    strcpy( attr_name, fast_name);
    strcat( attr_name, ".FirstIndex");
    gdh_NameToAttrref( pwr_cNObjid, attr_name, &first_index_attr);

    strcpy( attr_name, fast_name);
    strcat( attr_name, ".LastIndex");
    gdh_NameToAttrref( pwr_cNObjid, attr_name, &last_index_attr);
  }

  // Create data for time axis
  gcd = new GeCurveData( curve_eDataType_DsTrend);
  gcd->x_data[0] = (double *) malloc( 8 * max_points);
  strcpy( gcd->x_name, "Time");
  gcd->x_axis_type[0] = curve_eAxis_x;
  memcpy( &time_buff, &fp.TimeBuffer, sizeof(time_buff));

  fast_cnt = 0;
  for ( i = 0; i < FAST_CURVES; i++) {
    if ( fp.CurveValid[i]) {
      gcd->y_data[fast_cnt] = (double *) calloc( 1, 8 * max_points);
      gcd->y_axis_type[fast_cnt] = curve_eAxis_y;
      memcpy( &buff[fast_cnt], &fp.Buffers[i], sizeof(buff[0]));
      type[fast_cnt] = (pwr_eType) fp.AttributeType[i];
      fast_idx[i] = fast_cnt;
      curve_idx[fast_cnt] = i;

      *sts = gdh_AttrrefToName( &fp.Attribute[i], attr_name, 
			    sizeof(attr_name), cdh_mNName);
      if (EVEN(*sts)) continue;
      strcpy( gcd->y_name[fast_cnt], attr_name);
      fast_cnt++;
    }
  }

  if ( !fast_cnt) {
    *sts = XNAV__NOVALIDCURVE;
    free(gcd);
    gcd = 0;
    return;
  }

  // Subscribe to object
  strcpy( attr_name, fast_name);
  strcat( attr_name, ".New");
  *sts = gdh_RefObjectInfo( attr_name, (pwr_tAddress *)&new_p, 
			    &new_subid, sizeof(pwr_tBoolean));
  if ( EVEN(*sts)) return;

  for ( i = 0; i < fast_cnt; i++) {
    switch( type[i]) {
      case pwr_eType_Float32:
      case pwr_eType_Int32:
      case pwr_eType_UInt32:
        element_size[i] = 4;
        break;
      case pwr_eType_Float64:
      case pwr_eType_Int64:
      case pwr_eType_UInt64:
        element_size[i] = 8;
        break;
      case pwr_eType_Int16:
      case pwr_eType_UInt16:
        element_size[i] = 2;
        break;
      case pwr_eType_Int8:
      case pwr_eType_UInt8:
        element_size[i] = 1;
        break;
      default:
        element_size[i] = 4;
    }
    gcd->rows[i] = max_points;
  }
  gcd->cols = fast_cnt;

  axis_configured = true;
  for ( i = 0; i < FAST_CURVES; i++) {
    if ( fp.CurveValid[i]) {
      j = fast_idx[i];
      if ( fp.YMinValue[i] != fp.YMaxValue[i])
	gcd->scale( gcd->y_axis_type[j], gcd->y_value_type[j],
		    fp.YMinValue[i],  fp.YMaxValue[i],
		    &gcd->y_min_value_axis[j], &gcd->y_max_value_axis[j],
		    &gcd->y_trend_lines[j], &gcd->y_axis_lines[j], &gcd->y_axis_linelongq[j], 
		    &gcd->y_axis_valueq[j], gcd->y_format[j], &gcd->y_axis_width[j], 1, 1);
      else
	axis_configured = false;
    }
  }


  if ( fp.Active)
    first_scan = 0;
  fast_scan( this);
  gcd->select_color( 0);

  if ( strcmp( fp.Title, "") != 0)
    strcpy( title, fp.Title);
  else
    cdh_StrncpyCutOff( title, name, sizeof(title), 1);

  // timerid = XtAppAddTimeOut(
  //	XtWidgetToApplicationContext(parent_widget), 1000,
  //	(XtTimerCallbackProc)fast_scan, this);
}
Example #6
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;
}
Example #7
0
int Graph::init_object_graph( int mode)
{
    char 		classname[120];
    pwr_tClassId 	classid;
    char		*s;
    int 		sts;
    int		i;
    int		is_type = 0;
    pwr_sAttrRef	attrref;

    if ( mode == 0) {
        if ( strcmp( filename, "_none_.pwg") == 0) {
            if ( strcmp( object_name[0], "collect") == 0) {
                sts = graph_object_collect_build( this, 0);
                return sts;
            }
        }
        return 1;
    }
    if ( strcmp( filename, "_none_.pwg") == 0) {
        if ( strcmp( object_name[0], "collect") == 0)
            return 1;
    }

    // Get class from filename
    if ( (s = strrchr( filename, '/')) ||
            (s = strrchr( filename, '>')) ||
            (s = strrchr( filename, ']')) ||
            (s = strrchr( filename, ':')))
    {
        if ( strncmp( s+1, "pwr_t_", 6) == 0)
        {
            is_type = 1;
            strcpy( classname, s+7);
        }
        else if ( strncmp( s+1, "pwr_c_", 6) == 0)
            strcpy( classname, s+7);
        else
            strcpy( classname, s+1);
    }
    else
        strcpy( classname, filename);
    if ( (s = strrchr( classname, '.')))
        *s = 0;

    if ( is_type)
    {
        sts = gdh_NameToAttrref( pwr_cNObjid, object_name[0], &attrref);
        if ( EVEN(sts)) return sts;

        // Types are removed
        return 0;

    }
    else
    {
        sts = gdh_ClassNameToId( classname, &classid);
        if ( EVEN(sts)) return sts;

        sts = gdh_NameToAttrref( pwr_cNObjid, object_name[0], &attrref);
        if ( EVEN(sts)) return sts;

        for ( i = 0; graph_object_functions[i].classid; i++)
        {
            if ( classid == graph_object_functions[i].classid)
            {
                sts = (graph_object_functions[i].func)( this, &attrref);
                return sts;
            }
        }
    }
    return 0;
}
Example #8
0
//
// Callbacks from brow
//
int XAttNav::brow_cb( FlowCtx *ctx, flow_tEvent event)
{
  XAttNav		*xattnav;
  Item	 		*item;

  if ( event->event == flow_eEvent_ObjectDeleted) {
    brow_GetUserData( event->object.object, (void **)&item);
    delete item;
    return 1;
  }

  brow_GetCtxUserData( (BrowCtx *)ctx, (void **) &xattnav);
  xattnav->message( ' ', "");

  switch ( event->event) {
  case flow_eEvent_Key_Up: {
    brow_tNode	*node_list;
    int		node_count;
    brow_tObject	object;
    int		sts;

    brow_GetSelectedNodes( xattnav->brow->ctx, &node_list, &node_count);
    if ( !node_count) {
      sts = brow_GetLastVisible( xattnav->brow->ctx, &object);
      if ( EVEN(sts)) return 1;
    }
    else {
      if ( !brow_IsVisible( xattnav->brow->ctx, node_list[0], flow_eVisible_Partial)) {
	sts = brow_GetLastVisible( xattnav->brow->ctx, &object);
	if ( EVEN(sts)) return 1;
      }
      else {
	sts = brow_GetPrevious( xattnav->brow->ctx, node_list[0], &object);
	if ( EVEN(sts)) {
	  if ( node_count)
	    free( node_list);
	  return 1;
	}
      }
    }
    brow_SelectClear( xattnav->brow->ctx);
    brow_SetInverse( object, 1);
    brow_SelectInsert( xattnav->brow->ctx, object);
    if ( !brow_IsVisible( xattnav->brow->ctx, object, flow_eVisible_Full))
      brow_CenterObject( xattnav->brow->ctx, object, 0.25);
    if ( node_count)
      free( node_list);
    break;
  }
  case flow_eEvent_Key_Down: {
    brow_tNode	*node_list;
    int		node_count;
    brow_tObject	object;
    int		sts;

    brow_GetSelectedNodes( xattnav->brow->ctx, &node_list, &node_count);
    if ( !node_count) {
      sts = brow_GetFirstVisible( xattnav->brow->ctx, &object);
      if ( EVEN(sts)) return 1;
    }
    else {
      if ( !brow_IsVisible( xattnav->brow->ctx, node_list[0], flow_eVisible_Partial)) {
	sts = brow_GetFirstVisible( xattnav->brow->ctx, &object);
	if ( EVEN(sts)) return 1;
      }
      else {
	sts = brow_GetNext( xattnav->brow->ctx, node_list[0], &object);
	if ( EVEN(sts)) {
	  if ( node_count)
	    free( node_list);
	  return 1;
	}
      }
    }
    brow_SelectClear( xattnav->brow->ctx);
    brow_SetInverse( object, 1);
    brow_SelectInsert( xattnav->brow->ctx, object);
    if ( !brow_IsVisible( xattnav->brow->ctx, object, flow_eVisible_Full))
      brow_CenterObject( xattnav->brow->ctx, object, 0.75);
    if ( node_count)
      free( node_list);
    break;
  }
  case flow_eEvent_SelectClear:
    brow_ResetSelectInverse( xattnav->brow->ctx);
    break;
  case flow_eEvent_MB1Click: {
    // Select
    double ll_x, ll_y, ur_x, ur_y;
    int		sts;

    switch ( event->object.object_type) {
    case flow_eObjectType_Node:
      brow_MeasureNode( event->object.object, &ll_x, &ll_y,
			&ur_x, &ur_y);
      if ( event->object.x < ll_x + 1.0) {
	// Simulate doubleclick
	flow_tEvent doubleclick_event;

	doubleclick_event = (flow_tEvent) calloc( 1, sizeof(*doubleclick_event));
	memcpy( doubleclick_event, event, sizeof(*doubleclick_event));
	doubleclick_event->event = flow_eEvent_MB1DoubleClick;
	sts = brow_cb( ctx, doubleclick_event);
	free( (char *) doubleclick_event);
	return sts;
      }

      if ( brow_FindSelectedObject( xattnav->brow->ctx, event->object.object)) {
	brow_SelectClear( xattnav->brow->ctx);
      }
      else {
	brow_SelectClear( xattnav->brow->ctx);
	brow_SetInverse( event->object.object, 1);
	brow_SelectInsert( xattnav->brow->ctx, event->object.object);
      }
      break;
    default:
      brow_SelectClear( xattnav->brow->ctx);
    }
    break;
  }
  case flow_eEvent_Key_PageDown: {
    brow_Page( xattnav->brow->ctx, 0.8);
    break;
  }
  case flow_eEvent_Key_PageUp: {
    brow_Page( xattnav->brow->ctx, -0.8);
    break;
  }
  case flow_eEvent_ScrollDown: {
    brow_Page( xattnav->brow->ctx, 0.1);
    break;
  }
  case flow_eEvent_ScrollUp: {
    brow_Page( xattnav->brow->ctx, -0.1);
    break;
  }
  case flow_eEvent_Key_Left: {
    brow_tNode	*node_list;
    int		node_count;
    brow_tObject	object;
    int		sts;

    brow_GetSelectedNodes( xattnav->brow->ctx, &node_list, &node_count);
    if ( !node_count)
      return 1;

    if ( brow_IsOpen( node_list[0]))
      // Close this node
      object = node_list[0];
    else {
      // Close parent
      sts = brow_GetParent( xattnav->brow->ctx, node_list[0], &object);
      if ( EVEN(sts)) {
	free( node_list);
	return 1;
      }
    }
    brow_GetUserData( object, (void **)&item);
    switch( item->type) {
    case xnav_eItemType_Attr: 
      ((ItemAttr *)item)->close( xattnav->brow, 0, 0);
      break;
    case xnav_eItemType_AttrArrayElem: 
      ((ItemAttrArrayElem *)item)->close( xattnav->brow, 0, 0);
      break;
    case xnav_eItemType_AttrArray: 
      ((ItemAttrArray *)item)->close( xattnav->brow, 0, 0);
      break;
    case xnav_eItemType_AttrObject: 
      ((ItemAttrObject *)item)->close( xattnav->brow, 0, 0);
      break;
    default:
      ;
    }
    brow_SelectClear( xattnav->brow->ctx);
    brow_SetInverse( object, 1);
    brow_SelectInsert( xattnav->brow->ctx, object);
    if ( !brow_IsVisible( xattnav->brow->ctx, object, flow_eVisible_Full))
      brow_CenterObject( xattnav->brow->ctx, object, 0.25);
    free( node_list);
    break;
  }
  case flow_eEvent_MB3Down: {
    brow_SetClickSensitivity( xattnav->brow->ctx, 
			      flow_mSensitivity_MB3Press);
    break;
  }
  case flow_eEvent_MB3Press: {
    // Popup menu
    int x, y;
    pwr_sAttrRef attrref;
    int sts;

    switch ( event->object.object_type) {
    case flow_eObjectType_Node:
      brow_GetUserData( event->object.object, (void **)&item);
      if ( cdh_ObjidIsNull( item->objid))
	break;

      xattnav->popup_position( event->any.x_pixel + 8, event->any.y_pixel, &x, &y);

      memset( &attrref, 0, sizeof(attrref));
      switch ( item->type) {
      case xnav_eItemType_Attr:
      case xnav_eItemType_AttrArrayElem:
      case xnav_eItemType_AttrObject: {
	pwr_tAName attr_str;

	sts = gdh_ObjidToName( item->objid, 
			       attr_str, sizeof(attr_str), cdh_mName_volumeStrict);
	if ( EVEN(sts)) return sts;

	strcat( attr_str, ".");
	strcat( attr_str, item->name);
	sts = gdh_NameToAttrref( pwr_cNObjid, attr_str, &attrref);
	if ( EVEN(sts)) return sts;

	(xattnav->popup_menu_cb)( xattnav->parent_ctx, attrref,
				  (unsigned long)xmenu_eItemType_Attribute,
				  (unsigned long)xmenu_mUtility_AttrEditor, NULL, x, y);

	break;
      }
      case xnav_eItemType_Collect: {
	sts = gdh_NameToAttrref( pwr_cNObjid, item->name, &attrref);
	if ( EVEN(sts)) return sts;

	(xattnav->popup_menu_cb)( xattnav->parent_ctx, attrref,
				  (unsigned long)xmenu_eItemType_Attribute,
				  (unsigned long)xmenu_mUtility_AttrEditor, NULL, x, y);

	break;
      }
      case xnav_eItemType_Crossref: {
	ItemCrossref *itemc = (ItemCrossref *)item;

	memset( &attrref, 0, sizeof(attrref));
	attrref.Objid = itemc->objid;
	(xattnav->popup_menu_cb)( xattnav->parent_ctx, attrref,
				  (unsigned long)xmenu_eItemType_Crossref,
				  (unsigned long)xmenu_mUtility_AttrEditor, 
				  itemc->ref_name, x, y);
	break;
      }
      default:
	;
      }
      break;
    default:
      ;
    }
    break;
  }
  case flow_eEvent_Key_Right: {
    brow_tNode	*node_list;
    int		node_count;
    pwr_tStatus	sts;

    brow_GetSelectedNodes( xattnav->brow->ctx, &node_list, &node_count);
    if ( !node_count)
      return 1;

    brow_GetUserData( node_list[0], (void **)&item);
    switch( item->type) {
    case xnav_eItemType_Attr:
    case xnav_eItemType_AttrArrayElem:
    case xnav_eItemType_Collect:
      sts = item->open_children( xattnav->brow, 0, 0);
      if (ODD(sts)) break;

      if ( xattnav->advanced_user && xattnav->change_value_cb)
	(xattnav->change_value_cb)( xattnav->parent_ctx);
      break;
    case xnav_eItemType_AttrArray: 
      ((ItemAttrArray *)item)->open_attributes( xattnav->brow, 0, 0);
      break;
    case xnav_eItemType_AttrObject: 
      ((ItemAttrObject *)item)->open_attributes( xattnav->brow, 0, 0);
      break;
    case xnav_eItemType_Enum:
      if ( xattnav->advanced_user)
	((ItemEnum *)item)->set_value();
      break;
    case xnav_eItemType_Mask:
      if ( xattnav->advanced_user)
	((ItemMask *)item)->toggle_value();
      break;
    default:
      ;
    }
    free( node_list);
    break;
  }
  case flow_eEvent_MB1DoubleClick:
    switch ( event->object.object_type) {
    case flow_eObjectType_Node:
      brow_GetUserData( event->object.object, (void **)&item);

      switch( item->type) {
      case xnav_eItemType_Attr:
	((ItemAttr *)item)->open_children( xattnav->brow,
					   event->object.x, event->object.y);
	break;
      case xnav_eItemType_AttrArray:
	((ItemAttrArray *)item)->open_attributes( xattnav->brow,
						  event->object.x, event->object.y);
	break;
      case xnav_eItemType_AttrObject:
	((ItemAttrObject *)item)->open_attributes( xattnav->brow,
						   event->object.x, event->object.y);
	break;
      case xnav_eItemType_AttrArrayElem:
	((ItemAttrArrayElem *)item)->open_children( xattnav->brow,
						    event->object.x, event->object.y);
	break;
      case xnav_eItemType_Crossref:
	if ( xattnav->start_trace_cb) {
	  (xattnav->start_trace_cb)( xattnav->parent_ctx, item->objid, 
				     ((ItemCrossref *)item)->ref_name);
	  if ( xattnav->close_cb) {
	    (xattnav->close_cb)( xattnav->parent_ctx);
	    return 1;
	  }
	}
	break;
      default:
	;
      }
      break;
    default:
      ;
    }
    break;
  case flow_eEvent_Radiobutton: {
    switch ( event->object.object_type) {
    case flow_eObjectType_Node:
      brow_GetUserData( event->object.object, (void **)&item);
      switch( item->type) {
      case xnav_eItemType_Enum: 
	if ( !event->radiobutton.value)
	  ((ItemEnum *)item)->set_value();
	break;
      case xnav_eItemType_Mask: 
	((ItemMask *)item)->set_value( !event->radiobutton.value);
	break;
      default:
	;
      }
      break;
    default:
      ;
    }
    break;
  }
  case flow_eEvent_Map: {
    xattnav->displayed = 1;
    break;
  }

  default:
    ;
  }
  return 1;
}