// // Callbacks from brow // int CLogNav::brow_cb(FlowCtx* ctx, flow_tEvent event) { CLogNav* clognav; ItemMsg* item; if (event->event == flow_eEvent_ObjectDeleted) { brow_GetUserData(event->object.object, (void**)&item); delete item; return 1; } brow_GetCtxUserData((BrowCtx*)ctx, (void**)&clognav); switch (event->event) { case flow_eEvent_Key_Up: { brow_tNode* node_list; int node_count; brow_tObject object; int sts; brow_GetSelectedNodes(clognav->brow->ctx, &node_list, &node_count); if (!node_count) { sts = brow_GetLastVisible(clognav->brow->ctx, &object); if (EVEN(sts)) return 1; } else { if (!brow_IsVisible( clognav->brow->ctx, node_list[0], flow_eVisible_Partial)) { sts = brow_GetLastVisible(clognav->brow->ctx, &object); if (EVEN(sts)) return 1; } else { sts = brow_GetPrevious(clognav->brow->ctx, node_list[0], &object); if (EVEN(sts)) { sts = brow_GetLast(clognav->brow->ctx, &object); if (EVEN(sts)) { if (node_count) free(node_list); return 1; } } } } brow_SelectClear(clognav->brow->ctx); brow_SetInverse(object, 1); brow_SelectInsert(clognav->brow->ctx, object); if (!brow_IsVisible(clognav->brow->ctx, object, flow_eVisible_Full)) brow_CenterObject(clognav->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(clognav->brow->ctx, &node_list, &node_count); if (!node_count) { sts = brow_GetFirstVisible(clognav->brow->ctx, &object); if (EVEN(sts)) return 1; } else { if (!brow_IsVisible( clognav->brow->ctx, node_list[0], flow_eVisible_Partial)) { sts = brow_GetFirstVisible(clognav->brow->ctx, &object); if (EVEN(sts)) return 1; } else { sts = brow_GetNext(clognav->brow->ctx, node_list[0], &object); if (EVEN(sts)) { sts = brow_GetFirst(clognav->brow->ctx, &object); if (EVEN(sts)) { if (node_count) free(node_list); return 1; } } } } brow_SelectClear(clognav->brow->ctx); brow_SetInverse(object, 1); brow_SelectInsert(clognav->brow->ctx, object); if (!brow_IsVisible(clognav->brow->ctx, object, flow_eVisible_Full)) brow_CenterObject(clognav->brow->ctx, object, 0.75); if (node_count) free(node_list); break; } case flow_eEvent_Key_PageDown: { brow_Page(clognav->brow->ctx, 0.9); break; } case flow_eEvent_Key_PageUp: { brow_Page(clognav->brow->ctx, -0.9); break; } case flow_eEvent_ScrollDown: { brow_Page(clognav->brow->ctx, 0.1); break; } case flow_eEvent_ScrollUp: { brow_Page(clognav->brow->ctx, -0.1); break; } case flow_eEvent_SelectClear: brow_ResetSelectInverse(clognav->brow->ctx); break; case flow_eEvent_MB1Click: // Select switch (event->object.object_type) { case flow_eObjectType_Node: if (brow_FindSelectedObject(clognav->brow->ctx, event->object.object)) { brow_SelectClear(clognav->brow->ctx); } else { brow_SelectClear(clognav->brow->ctx); brow_SetInverse(event->object.object, 1); brow_SelectInsert(clognav->brow->ctx, event->object.object); } break; default: brow_SelectClear(clognav->brow->ctx); } break; case flow_eEvent_MB3Down: { brow_SetClickSensitivity(clognav->brow->ctx, flow_mSensitivity_MB3Press); break; } default:; } return 1; }
// // 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; }