From 50e967e61f19fafe015b7b78cf066410ac1f8286 Mon Sep 17 00:00:00 2001 From: edgrif <edgrif> Date: Fri, 13 Jan 2006 18:46:31 +0000 Subject: [PATCH] add functions to validate feature poitners, add features to sets, remove features. --- src/include/ZMap/zmapFeature.h | 30 +++++-- src/zmapFeature/zmapFeature.c | 143 ++++++++++++++++++++++++++++++--- 2 files changed, 155 insertions(+), 18 deletions(-) diff --git a/src/include/ZMap/zmapFeature.h b/src/include/ZMap/zmapFeature.h index 993bca2ec..58606bc5c 100755 --- a/src/include/ZMap/zmapFeature.h +++ b/src/include/ZMap/zmapFeature.h @@ -1,4 +1,3 @@ - /* File: zmapFeature.h * Author: Ed Griffiths (edgrif@sanger.ac.uk) * Copyright (c) Sanger Institute, 2004 @@ -26,9 +25,9 @@ * Description: Data structures describing a sequence feature. * * HISTORY: - * Last edited: Jan 5 16:36 2006 (edgrif) + * Last edited: Jan 13 14:52 2006 (edgrif) * Created: Fri Jun 11 08:37:19 2004 (edgrif) - * CVS info: $Id: zmapFeature.h,v 1.54 2006-01-06 16:19:31 edgrif Exp $ + * CVS info: $Id: zmapFeature.h,v 1.55 2006-01-13 18:46:32 edgrif Exp $ *------------------------------------------------------------------- */ #ifndef ZMAP_FEATURE_H @@ -424,10 +423,13 @@ typedef struct ZMapFeatureTypeStyleStruct_ char *description ; /* Description of what this style represents. */ - /* I'm not sure this will work...how will we know ?? if there no features then we can't get - * the style...but lets leave this as a place holder.... */ + /* I don't want a general show/hide flag here because we should get that dynamically from the + * state of the column canvas item. */ + gboolean hide_initially ; /* Is the column hidden initially ? */ + gboolean show_when_empty ; /* If TRUE, features column is displayed even if there are no features. */ + GdkColor foreground ; /* Overlaid on background. */ GdkColor background ; /* Fill colour. */ GdkColor outline ; /* Surround/line colour. */ @@ -518,6 +520,13 @@ ZMapFeature zMapFeatureFindFeatureInSet(ZMapFeatureSet feature_set, GQuark featu GData *zMapFeatureFindSetInContext(ZMapFeatureContext feature_context, GQuark set_id) ; +gboolean zMapFeatureIsValid(ZMapFeatureAny any_feature) ; +gboolean zMapFeatureTypeIsValid(ZMapFeatureStuctType group_type) ; +ZMapFeatureAny zMapFeatureGetParentGroup(ZMapFeatureAny any_feature, ZMapFeatureStuctType group_type) ; + + + + ZMapFeatureContext zMapFeatureContextCreate(char *sequence, int start, int end, GList *styles, GList *feature_set_names) ; gboolean zMapFeatureContextMerge(ZMapFeatureContext *current_context_inout, @@ -570,14 +579,21 @@ ZMapFeatureTypeStyle zMapFeatureGetStyle(ZMapFeature feature) ; ZMapFeatureSet zMapFeatureGetSet(ZMapFeature feature) ; void zmapFeatureDestroy(ZMapFeature feature) ; - ZMapFeatureSet zMapFeatureSetCreate(char *source, GData *features) ; ZMapFeatureSet zMapFeatureSetIDCreate(GQuark original_id, GQuark unique_id, GData *features) ; -void zMapFeatureSetAddFeature(ZMapFeatureSet feature_set, ZMapFeature feature) ; +gboolean zMapFeatureSetAddFeature(ZMapFeatureSet feature_set, ZMapFeature feature) ; +gboolean zMapFeatureSetRemoveFeature(ZMapFeatureSet feature_set, ZMapFeature feature) ; char *zMapFeatureSetGetName(ZMapFeatureSet feature_set) ; +gboolean zMapFeatureSetFindFeature(ZMapFeatureSet feature_set, ZMapFeature feature) ; void zMapFeatureSetDestroy(ZMapFeatureSet feature_set, gboolean free_data) ; +ZMapFeatureAny zMapFeatureGetGroup(ZMapFeatureAny any_feature, ZMapFeatureStuctType group_type) ; + + + +/* Style functions. */ + GList *zMapStylesGetNames(GList *styles) ; ZMapFeatureTypeStyle zMapFeatureTypeCreate(char *name, char *outline, char *foreground, char *background, diff --git a/src/zmapFeature/zmapFeature.c b/src/zmapFeature/zmapFeature.c index ef699eeae..6039d4740 100755 --- a/src/zmapFeature/zmapFeature.c +++ b/src/zmapFeature/zmapFeature.c @@ -27,9 +27,9 @@ * * Exported functions: See zmapView_P.h * HISTORY: - * Last edited: Nov 22 11:41 2005 (edgrif) + * Last edited: Jan 13 18:45 2006 (edgrif) * Created: Fri Jul 16 13:05:58 2004 (edgrif) - * CVS info: $Id: zmapFeature.c,v 1.29 2005-11-24 15:53:29 edgrif Exp $ + * CVS info: $Id: zmapFeature.c,v 1.30 2006-01-13 18:46:31 edgrif Exp $ *------------------------------------------------------------------- */ @@ -104,6 +104,80 @@ static void removeNotFreeFeatureSet(GQuark key_id, gpointer data, gpointer user_ +/*! + * Function to do some validity checking on a ZMapFeatureAny struct. Always more you + * could do but this is better than nothing. + * + * Returns TRUE if the struct is OK, FALSE otherwise. + * + * @param any_feature The feature to validate. + * @return gboolean TRUE if feature is valid, FALSE otherwise. + * */ +gboolean zMapFeatureIsValid(ZMapFeatureAny any_feature) +{ + gboolean result = FALSE ; + + if (any_feature + && zMapFeatureTypeIsValid(any_feature->struct_type) + && any_feature->unique_id != ZMAPFEATURE_NULLQUARK + && any_feature->original_id != ZMAPFEATURE_NULLQUARK) + result = TRUE ; + + return result ; +} + +gboolean zMapFeatureTypeIsValid(ZMapFeatureStuctType group_type) +{ + gboolean result = FALSE ; + + if (group_type >= ZMAPFEATURE_STRUCT_CONTEXT + && group_type <= ZMAPFEATURE_STRUCT_FEATURE) + result = TRUE ; + + return result ; +} + + + +/*! + * Function to return the _parent_ group of group_type of the feature any_feature. + * This is a generalised function to stop all the poking about through the context + * hierachy that is otherwise required. Note you can only go _UP_ the tree with + * this function because going down is a one-to-many mapping. + * + * Returns the feature group or NULL if there is no parent group or there is some problem + * with the arguments like asking for a group at or below the level of any_feature. + * + * @param any_feature The feature for which you wish to find the parent group. + * @param group_type The type/level of the parent group you want to find. + * @return ZMapFeatureAny The parent group or NULL. + * */ +ZMapFeatureAny zMapFeatureGetParentGroup(ZMapFeatureAny any_feature, ZMapFeatureStuctType group_type) +{ + ZMapFeatureAny result = NULL ; + + zMapAssert(zMapFeatureIsValid(any_feature) + && group_type >= ZMAPFEATURE_STRUCT_CONTEXT + && group_type <= ZMAPFEATURE_STRUCT_FEATURE) ; + + if (any_feature->struct_type > group_type) + { + ZMapFeatureAny group = any_feature ; + + while (group->struct_type > group_type) + { + group = group->parent ; + } + + result = group ; + } + + return result ; +} + + + + /*! * Returns TRUE if feature context has DNA, FALSE otherwise. @@ -156,6 +230,11 @@ ZMapFeature zmapFeatureCreateEmpty(void) + + + + + /*! * Adds the standard data fields to an empty feature. * */ @@ -307,8 +386,6 @@ gboolean zMapFeatureAddAlignmentData(ZMapFeature feature, } - - /*! * Destroys a feature, freeing up all of its resources. * @@ -378,21 +455,65 @@ ZMapFeatureSet zMapFeatureSetIDCreate(GQuark original_id, GQuark unique_id, GDat } -/* Features must not be null to be added we need at least the feature id and probably should. - * check for more. */ -void zMapFeatureSetAddFeature(ZMapFeatureSet feature_set, ZMapFeature feature) +/* Feature must not be null to be added we need at least the feature id and probably should. + * check for more. + * + * Returns FALSE if feature is already in set. + * */ +gboolean zMapFeatureSetAddFeature(ZMapFeatureSet feature_set, ZMapFeature feature) { + gboolean result = FALSE ; + zMapAssert(feature_set && feature && feature->unique_id != ZMAPFEATURE_NULLQUARK) ; - feature->parent = (ZMapFeatureAny)feature_set ; + if (!zMapFeatureSetFindFeature(feature_set, feature)) + { + feature->parent = (ZMapFeatureAny)feature_set ; - g_datalist_id_set_data_full(&(feature_set->features), feature->unique_id, feature, - destroyFeature) ; + g_datalist_id_set_data_full(&(feature_set->features), feature->unique_id, feature, + destroyFeature) ; - return ; + result = TRUE ; + } + + return result ; +} + + +/* Returns TRUE if the feature could be found in the feature_set, FALSE otherwise. */ +gboolean zMapFeatureSetFindFeature(ZMapFeatureSet feature_set, ZMapFeature feature) +{ + gboolean result = FALSE ; + + zMapAssert(feature_set && feature) ; + + if (g_datalist_id_get_data(&(feature_set->features), feature->unique_id)) + result = TRUE ; + + return result ; } +/* Feature must exist in set to be removed. + * + * Returns FALSE if feature is not in set. + * */ +gboolean zMapFeatureSetRemoveFeature(ZMapFeatureSet feature_set, ZMapFeature feature) +{ + gboolean result = FALSE ; + + zMapAssert(feature_set && feature && feature->unique_id != ZMAPFEATURE_NULLQUARK) ; + + if (zMapFeatureSetFindFeature(feature_set, feature)) + { + g_datalist_id_remove_data(&(feature_set->features), feature->unique_id) ; + + result = TRUE ; + } + + return result ; +} + void zMapFeatureSetDestroy(ZMapFeatureSet feature_set, gboolean free_data) { -- GitLab