From 524b64a66387dc96a734d3c275192abcf3d750fa Mon Sep 17 00:00:00 2001
From: rds <rds>
Date: Thu, 30 Apr 2009 08:38:52 +0000
Subject: [PATCH] Remove style from the items...

---
 .../items/zmapWindowAlignmentFeature.c        | 15 +--
 src/zmapWindow/items/zmapWindowBasicFeature.c |  6 +-
 src/zmapWindow/items/zmapWindowCanvasItem.c   | 94 ++++++++++++++-----
 src/zmapWindow/items/zmapWindowCanvasItem.h   | 13 ++-
 src/zmapWindow/items/zmapWindowCanvasItem_I.h | 37 ++++----
 .../items/zmapWindowCollectionFeature.c       | 14 +--
 .../items/zmapWindowCollectionFeature.h       | 27 +++++-
 src/zmapWindow/items/zmapWindowGlyphItem.c    | 60 ++++++++++--
 src/zmapWindow/items/zmapWindowTextFeature.c  | 10 +-
 .../items/zmapWindowTranscriptFeature.c       |  8 +-
 10 files changed, 208 insertions(+), 76 deletions(-)

diff --git a/src/zmapWindow/items/zmapWindowAlignmentFeature.c b/src/zmapWindow/items/zmapWindowAlignmentFeature.c
index 98c793768..d502ea056 100755
--- a/src/zmapWindow/items/zmapWindowAlignmentFeature.c
+++ b/src/zmapWindow/items/zmapWindowAlignmentFeature.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr 16 15:09 2009 (rds)
+ * Last edited: Apr 29 19:47 2009 (rds)
  * Created: Wed Dec  3 10:02:22 2008 (rds)
- * CVS info:   $Id: zmapWindowAlignmentFeature.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowAlignmentFeature.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -128,18 +128,21 @@ GType zMapWindowAlignmentFeatureGetType(void)
 void zmap_window_alignment_feature_clear(ZMapWindowCanvasItem canvas_item)
 {
   ZMapWindowAlignmentFeature alignment;
+  ZMapFeatureTypeStyle style;
   unsigned int unused = 0;
 
   alignment = ZMAP_WINDOW_ALIGNMENT_FEATURE(canvas_item);
 
+  style = (ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->get_style)(canvas_item);
+
   if(alignment->flags.no_gaps_hidden  == 0 && 
      alignment->flags.no_gaps_display == 1 &&
-     zMapStyleGetGappedAligns(canvas_item->style, &unused))
+     zMapStyleGetGappedAligns(style, &unused))
     {
       zMapWindowAlignmentFeatureGappedDisplay(alignment);
     }
   else if(alignment->flags.gapped_display == 1 &&
-	  zMapStyleGetGappedAligns(canvas_item->style, &unused) == 0)
+	  zMapStyleGetGappedAligns(style, &unused) == 0)
     {
       /* remove all the gapped items... */
 
@@ -318,7 +321,7 @@ static void zmap_window_alignment_feature_set_colour(ZMapWindowCanvasItem  align
 
   fill = outline = foreground = background = NULL;
   
-  style = alignment->style;
+  style = (ZMAP_CANVAS_ITEM_GET_CLASS(alignment)->get_style)(alignment);
 
   if((colour_type == ZMAPSTYLE_COLOURTYPE_SELECTED) ||
      (zMapStyleGetColours(style, ZMAPSTYLE_COLOURTARGET_NORMAL, colour_type,
@@ -378,7 +381,7 @@ static FooCanvasItem *zmap_window_alignment_feature_add_interval(ZMapWindowCanva
   
   g_return_val_if_fail(alignment != NULL, NULL);
 
-  style = alignment->style;
+  style = (ZMAP_CANVAS_ITEM_GET_CLASS(alignment)->get_style)(alignment);
 
   if(sub_feature_in)
     sub_feature = sub_feature_in;
diff --git a/src/zmapWindow/items/zmapWindowBasicFeature.c b/src/zmapWindow/items/zmapWindowBasicFeature.c
index f5377d93a..d8234d781 100755
--- a/src/zmapWindow/items/zmapWindowBasicFeature.c
+++ b/src/zmapWindow/items/zmapWindowBasicFeature.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr 16 15:11 2009 (rds)
+ * Last edited: Apr 29 19:48 2009 (rds)
  * Created: Wed Dec  3 10:02:22 2008 (rds)
- * CVS info:   $Id: zmapWindowBasicFeature.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowBasicFeature.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -107,7 +107,7 @@ static FooCanvasItem *zmap_window_basic_feature_add_interval(ZMapWindowCanvasIte
       ZMapFeature feature;
       
       feature = basic->feature;
-      style   = basic->style;
+      style   = (ZMAP_CANVAS_ITEM_GET_CLASS(basic)->get_style)(basic);
       
       if(feature->strand == ZMAPSTRAND_REVERSE && zMapStyleColourByStrand(style))
 	status = zMapStyleGetColours(style, ZMAPSTYLE_COLOURTARGET_STRAND, 
diff --git a/src/zmapWindow/items/zmapWindowCanvasItem.c b/src/zmapWindow/items/zmapWindowCanvasItem.c
index ed803a318..049de3153 100755
--- a/src/zmapWindow/items/zmapWindowCanvasItem.c
+++ b/src/zmapWindow/items/zmapWindowCanvasItem.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr 16 15:37 2009 (rds)
+ * Last edited: Apr 29 19:43 2009 (rds)
  * Created: Wed Dec  3 09:00:20 2008 (rds)
- * CVS info:   $Id: zmapWindowCanvasItem.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowCanvasItem.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -80,6 +80,7 @@ static void zmap_window_canvas_item_set_colour(ZMapWindowCanvasItem  canvas_item
 					       ZMapWindowItemFeature unused,
 					       ZMapStyleColourType   colour_type,
 					       GdkColor             *default_fill);
+static ZMapFeatureTypeStyle zmap_window_canvas_item_get_style(ZMapWindowCanvasItem canvas_item);
 
 /* FooCanvasItem interface methods */
 static void   zmap_window_canvas_item_update      (FooCanvasItem *item,
@@ -146,8 +147,7 @@ static GQuark zmap_window_canvas_item_get_domain(void)
  *
  * Return value:  The type ID of the &ZMapWindowCanvasItem class.
  **/
-GType
-zMapWindowCanvasItemGetType (void)
+GType zMapWindowCanvasItemGetType (void)
 {
   static GType group_type = 0;
   
@@ -184,9 +184,14 @@ void zMapWindowCanvasItemCheckSize(ZMapWindowCanvasItem canvas_item)
 
   if(feature)
     {
+      ZMapFeatureTypeStyle style = NULL;
+
+      style = (ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->get_style)(canvas_item);
+
       x1 = y1 = 0.0;
-#warning FIX ME
-      x2 = 16.0;
+
+      x2 = zMapStyleGetWidth(style) - 1.0;
+
       y2 = (double)(feature->x2 - feature->x1 + 1.0);
       
       update_background_box_size(canvas_item, x1, 0.0, x2, 0.0);
@@ -218,7 +223,6 @@ ZMapWindowCanvasItem zMapWindowCanvasItemCreate(FooCanvasGroup      *parent,
 	  GObject *object;
 	  canvas_item = ZMAP_CANVAS_ITEM(item);
 	  canvas_item->feature = feature;
-	  canvas_item->style   = feature_style;
 
 	  if(ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->post_create)
 	    (* ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->post_create)(canvas_item);
@@ -339,12 +343,15 @@ void zMapWindowCanvasItemGetBumpBounds(ZMapWindowCanvasItem canvas_item,
 
   if(x1_out && x2_out)
     {
-      double w;
+      ZMapFeatureTypeStyle style;
+      double width;
 
-      w = zMapStyleGetWidth(canvas_item->style);
+      style = (ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->get_style)(canvas_item);
 
-      if(x1 + w > x2)
-	x2 += w;
+      width = zMapStyleGetWidth(style);
+
+      if(x1 + width > x2)
+	x2 = x1 + width;
 
 	
       if(x1_out)
@@ -527,6 +534,12 @@ FooCanvasItem *zMapWindowCanvasItemGetInterval(ZMapWindowCanvasItem canvas_item,
 		      point_item = child;
 		      dist = 0.0; /* text point is broken. the x factor is _not_ good enough. */
 		    }
+		  else if(ZMAP_IS_WINDOW_GLYPH_ITEM(child))
+		    {
+		      /* glyph items are quite complex and really need to check bounds rather than point. */
+		      point_item = child;
+		      dist = 0.0;
+		    }
 		  else		/* enables groups to be included in the ZMapWindowCanvasItem tree */
 		    dist = window_canvas_item_invoke_point (child, gx, gy, cx, cy, &point_item);
 
@@ -760,7 +773,7 @@ void zMapWindowCanvasItemReparent(FooCanvasItem *item, FooCanvasGroup *new_group
 /* INTERNALS */
 
 /* Class initialization function for ZMapWindowCanvasItemClass */
-static void zmap_window_canvas_item_class_init (ZMapWindowCanvasItemClass class)
+static void zmap_window_canvas_item_class_init (ZMapWindowCanvasItemClass window_class)
 {
   GObjectClass *gobject_class;
   GtkObjectClass *object_class;
@@ -776,9 +789,9 @@ static void zmap_window_canvas_item_class_init (ZMapWindowCanvasItemClass class)
       0x00, 0x00
     } ;
 
-  gobject_class = (GObjectClass *) class;
-  object_class  = (GtkObjectClass *) class;
-  item_class    = (FooCanvasItemClass *) class;
+  gobject_class = (GObjectClass *)window_class;
+  object_class  = (GtkObjectClass *)window_class;
+  item_class    = (FooCanvasItemClass *)window_class;
 
   canvas_item_type = g_type_from_name(ZMAP_WINDOW_CANVAS_ITEM_NAME);
   parent_type      = g_type_parent(canvas_item_type);
@@ -827,13 +840,16 @@ static void zmap_window_canvas_item_class_init (ZMapWindowCanvasItemClass class)
   item_class->translate = zmap_window_canvas_item_translate;
   item_class->bounds    = zmap_window_canvas_item_bounds;
 
-  class->post_create = zmap_window_canvas_item_post_create;
-  class->check_data  = zmap_window_canvas_item_check_data;
-  class->set_colour  = zmap_window_canvas_item_set_colour;
+  window_class->post_create = zmap_window_canvas_item_post_create;
+  window_class->check_data  = zmap_window_canvas_item_check_data;
+  window_class->set_colour  = zmap_window_canvas_item_set_colour;
+  window_class->get_style   = zmap_window_canvas_item_get_style;
 
-  class->fill_stipple = gdk_bitmap_create_from_data(NULL, &make_clickable_bmp_bits[0],
-						    make_clickable_bmp_width, make_clickable_bmp_height) ;
-      
+  window_class->fill_stipple = gdk_bitmap_create_from_data(NULL, &make_clickable_bmp_bits[0],
+							   make_clickable_bmp_width,
+							   make_clickable_bmp_height) ;
+  
+  //window_class->long_items   = zmapWindowLongItemCreate();
 
   return ;
 }
@@ -961,7 +977,6 @@ static void zmap_window_canvas_item_destroy (GObject *object)
     }
 
   canvas_item->feature = NULL;
-  canvas_item->style   = NULL;
 
   if(GTK_OBJECT_CLASS (group_parent_class_G)->destroy)
     (GTK_OBJECT_CLASS (group_parent_class_G)->destroy)(GTK_OBJECT(object));
@@ -1041,6 +1056,31 @@ static void zmap_window_canvas_item_post_create(ZMapWindowCanvasItem canvas_item
   return ;
 }
 
+static ZMapFeatureTypeStyle zmap_window_canvas_item_get_style(ZMapWindowCanvasItem canvas_item)
+{
+  ZMapFeatureTypeStyle style = NULL;
+  ZMapWindowItemFeatureSetData set_data;
+  FooCanvasItem *item;
+  FooCanvasItem *container_parent;
+  
+  g_return_val_if_fail(canvas_item != NULL, NULL);
+  g_return_val_if_fail(canvas_item->feature != NULL, NULL);
+
+  item = FOO_CANVAS_ITEM(canvas_item);
+
+  if(item->parent && item->parent->parent)
+    {
+      container_parent = item->parent->parent;
+      
+      set_data = g_object_get_data(G_OBJECT(container_parent), 
+				   ITEM_FEATURE_SET_DATA);
+      
+      style = zmapWindowStyleTableFind(set_data->style_table, 
+				       canvas_item->feature->style_id);
+    }
+
+  return style;
+}
 
 /* Update handler for canvas groups */
 static void zmap_window_canvas_item_update (FooCanvasItem *item, double i2w_dx, double i2w_dy, int flags)
@@ -1230,12 +1270,16 @@ static void zmap_window_canvas_item_draw (FooCanvasItem *item, GdkDrawable *draw
 
   canvas_item = ZMAP_CANVAS_ITEM(item);
 
+
   for(i = (item->object.flags & FOO_CANVAS_ITEM_VISIBLE ? 0 : WINDOW_ITEM_COUNT); 
       i < WINDOW_ITEM_COUNT; ++i)
     {
       if(i == WINDOW_ITEM_OVERLAY)
-	(* group_parent_class_G->draw) (item, drawable, expose);
-      
+	{
+	  
+	  (* group_parent_class_G->draw) (item, drawable, expose);
+	}
+
       if(!(draw_me = canvas_item->items[i]))
 	continue;
       else
@@ -1385,7 +1429,7 @@ static void zmap_window_canvas_item_set_colour(ZMapWindowCanvasItem  canvas_item
   g_return_if_fail(canvas_item != NULL);
   g_return_if_fail(interval    != NULL);
 
-  if((style = canvas_item->style))
+  if((style = (ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->get_style)(canvas_item)))
     {
       zMapStyleGetColours(style, ZMAPSTYLE_COLOURTARGET_NORMAL, colour_type,
 			  &fill, NULL, &outline);
diff --git a/src/zmapWindow/items/zmapWindowCanvasItem.h b/src/zmapWindow/items/zmapWindowCanvasItem.h
index cec1b7c44..c3bc0e8a8 100755
--- a/src/zmapWindow/items/zmapWindowCanvasItem.h
+++ b/src/zmapWindow/items/zmapWindowCanvasItem.h
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr  6 15:35 2009 (rds)
+ * Last edited: Apr 24 15:18 2009 (rds)
  * Created: Wed Dec  3 08:21:03 2008 (rds)
- * CVS info:   $Id: zmapWindowCanvasItem.h,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowCanvasItem.h,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -92,6 +92,9 @@ void zMapWindowCanvasItemGetBumpBounds(ZMapWindowCanvasItem canvas_item,
 gboolean zMapWindowCanvasItemCheckData(ZMapWindowCanvasItem canvas_item, GError **error);
 
 void zMapWindowCanvasItemClear(ZMapWindowCanvasItem canvas_item);
+void zMapWindowCanvasItemClearOverlay(ZMapWindowCanvasItem canvas_item);
+void zMapWindowCanvasItemClearUnderlay(ZMapWindowCanvasItem canvas_item);
+
 
 FooCanvasItem *zMapWindowCanvasItemGetInterval(ZMapWindowCanvasItem canvas_item,
 					       double x, double y);
@@ -101,9 +104,15 @@ ZMapWindowCanvasItem zMapWindowCanvasItemIntervalGetObject(FooCanvasItem *item);
 void zMapWindowCanvasItemSetIntervalColours(ZMapWindowCanvasItem canvas_item,
 					    ZMapStyleColourType  colour_type,
 					    GdkColor            *default_fill_colour);
+void zMapWindowCanvasItemUnmark(ZMapWindowCanvasItem canvas_item);
+void zMapWindowCanvasItemMark(ZMapWindowCanvasItem canvas_item,
+			      GdkColor            *colour,
+			      GdkBitmap           *bitmap);
 
 void zMapWindowCanvasItemReparent(FooCanvasItem *item, FooCanvasGroup *new_group);
 
+ZMapWindowCanvasItem zMapWindowCanvasItemDestroy(ZMapWindowCanvasItem canvas_item);
+
 
 #include <zmapWindowBasicFeature.h>
 #include <zmapWindowTranscriptFeature.h>
diff --git a/src/zmapWindow/items/zmapWindowCanvasItem_I.h b/src/zmapWindow/items/zmapWindowCanvasItem_I.h
index 780934bd1..d1ce2567d 100755
--- a/src/zmapWindow/items/zmapWindowCanvasItem_I.h
+++ b/src/zmapWindow/items/zmapWindowCanvasItem_I.h
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Jan 29 11:45 2009 (rds)
+ * Last edited: Apr 29 19:44 2009 (rds)
  * Created: Wed Dec  3 08:38:10 2008 (rds)
- * CVS info:   $Id: zmapWindowCanvasItem_I.h,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowCanvasItem_I.h,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -61,31 +61,36 @@ typedef struct _zmapWindowCanvasItemClassStruct
 {
   FooCanvasGroupClass __parent__;
 
+  /* long items is really class level. */
+  ZMapWindowLongItems long_items;
+
   GdkBitmap *fill_stipple;
 
   /* Useful things that the interface provides... */
 
   /* We want to use foo_canvas_item_new and have default items created.  These
    * might not be the same for all our items... */
-  void            (* post_create) (ZMapWindowCanvasItem window_canvas_item);
+  void              (* post_create) (ZMapWindowCanvasItem window_canvas_item);
+
+  ZMapFeatureTypeStyle (* get_style)(ZMapWindowCanvasItem window_canvas_item);
 
   /* This might be a no-op for some... */
-  FooCanvasItem * (* add_interval)(ZMapWindowCanvasItem  window_canvas_item,
-				   ZMapWindowItemFeature sub_feature, /* can be NULL */
-				   double top, double bottom,
-				   double left, double right);
+  FooCanvasItem *   (* add_interval)(ZMapWindowCanvasItem  window_canvas_item,
+				     ZMapWindowItemFeature sub_feature, /* can be NULL */
+				     double top, double bottom,
+				     double left, double right);
 
-  void            (* set_colour)  (ZMapWindowCanvasItem  window_canvas_item,
-				   FooCanvasItem        *interval,
-				   ZMapWindowItemFeature sub_feature,
-				   ZMapStyleColourType   colour_type,
-				   GdkColor             *deafult_fill_gdk);
+  void              (* set_colour)  (ZMapWindowCanvasItem  window_canvas_item,
+				     FooCanvasItem        *interval,
+				     ZMapWindowItemFeature sub_feature,
+				     ZMapStyleColourType   colour_type,
+				     GdkColor             *default_fill_gdk);
 
   /* Ability to check all subitems... */
-  gboolean        (* check_data)  (ZMapWindowCanvasItem window_canvas_item, GError **error);
+  gboolean        (* check_data)    (ZMapWindowCanvasItem window_canvas_item, GError **error);
 
   /* clear items... */
-  void            (* clear)       (ZMapWindowCanvasItem window_canvas_item);
+  void            (* clear)         (ZMapWindowCanvasItem window_canvas_item);
 } zmapWindowCanvasItemClassStruct;
 
 typedef struct _zmapWindowCanvasItemStruct
@@ -94,14 +99,12 @@ typedef struct _zmapWindowCanvasItemStruct
 
   ZMapFeature feature;
 
-  ZMapFeatureTypeStyle style;
-
   /* These items are separate from the group and need to be mapped,
    * realized and drawn by us. */
   FooCanvasItem *items[WINDOW_ITEM_COUNT];
 
   FooCanvasItem *mark_item;
-  
+
   unsigned int interval_type;
 
   unsigned int auto_resize_background : 1;
diff --git a/src/zmapWindow/items/zmapWindowCollectionFeature.c b/src/zmapWindow/items/zmapWindowCollectionFeature.c
index f64d0f15e..7ea44bc01 100755
--- a/src/zmapWindow/items/zmapWindowCollectionFeature.c
+++ b/src/zmapWindow/items/zmapWindowCollectionFeature.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr 22 15:19 2009 (rds)
+ * Last edited: Apr 29 20:55 2009 (rds)
  * Created: Wed Dec  3 10:02:22 2008 (rds)
- * CVS info:   $Id: zmapWindowCollectionFeature.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowCollectionFeature.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -37,7 +37,6 @@
 #include <zmapWindow_P.h>	/* ITEM_FEATURE_DATA, ITEM_FEATURE_TYPE */
 #include <math.h>
 
-typedef int (*ZMapFeatureCompareFunc)(ZMapFeature feature_a, ZMapFeature feature_b, gpointer user_data);
 
 static void zmap_window_collection_feature_class_init  (ZMapWindowCollectionFeatureClass collection_class);
 static void zmap_window_collection_feature_init        (ZMapWindowCollectionFeature      group);
@@ -204,7 +203,6 @@ void zMapWindowCollectionFeatureStaticReparent(ZMapWindowCanvasItem reparentee,
 		      NULL);
 
   new_parent->feature = reparentee->feature;
-  new_parent->style   = reparentee->style;
 
   return;
 }
@@ -233,7 +231,7 @@ static void add_colinear_lines(gpointer data, gpointer user_data)
   GdkColor *draw_colour;
   FooCanvasPoints line_points;
   double coords[4], y1, y2;
-  int colinearity = 0;
+  ColinearityType colinearity = 0;
   enum {COLINEAR_INVALID, COLINEAR_NOT, COLINEAR_IMPERFECT, COLINEAR_PERFECT};
 
   previous = colinear_data->previous;
@@ -300,6 +298,7 @@ void zMapWindowCollectionFeatureAddColinearMarkers(ZMapWindowCanvasItem   collec
 
   if(group->item_list)
     {
+      ZMapFeatureTypeStyle style;
       double x2;
       char *perfect_colour     = ZMAP_WINDOW_MATCH_PERFECT ;
       char *colinear_colour    = ZMAP_WINDOW_MATCH_COLINEAR ;
@@ -311,7 +310,10 @@ void zMapWindowCollectionFeatureAddColinearMarkers(ZMapWindowCanvasItem   collec
       colinear_data.compare_func = compare_func;
       colinear_data.compare_data = compare_data;
 
-      x2 = zMapStyleGetWidth(ZMAP_CANVAS_ITEM(colinear_data.previous)->style);
+      style = (ZMAP_CANVAS_ITEM_GET_CLASS(colinear_data.previous)->get_style)(colinear_data.parent);
+
+      x2 = zMapStyleGetWidth(style);
+
       colinear_data.x = (x2 * 0.5);
 
       gdk_color_parse(perfect_colour,     &colinear_data.perfect) ;
diff --git a/src/zmapWindow/items/zmapWindowCollectionFeature.h b/src/zmapWindow/items/zmapWindowCollectionFeature.h
index c62f4e936..1ad9010c8 100755
--- a/src/zmapWindow/items/zmapWindowCollectionFeature.h
+++ b/src/zmapWindow/items/zmapWindowCollectionFeature.h
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Jan 25 14:03 2009 (rds)
+ * Last edited: Apr 24 15:13 2009 (rds)
  * Created: Wed Dec  3 08:44:06 2008 (rds)
- * CVS info:   $Id: zmapWindowCollectionFeature.h,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowCollectionFeature.h,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -53,6 +53,13 @@ enum
     ZMAP_WINDOW_COLLECTION_GLYPH
   };
 
+typedef enum {
+  COLINEAR_INVALID, 
+  COLINEAR_NOT, 
+  COLINEAR_IMPERFECT, 
+  COLINEAR_PERFECT
+} ColinearityType ;
+
 
 /* Instance */
 typedef struct _zmapWindowCollectionFeatureStruct  zmapWindowCollectionFeature, *ZMapWindowCollectionFeature ;
@@ -62,7 +69,23 @@ typedef struct _zmapWindowCollectionFeatureStruct  zmapWindowCollectionFeature,
 typedef struct _zmapWindowCollectionFeatureClassStruct  zmapWindowCollectionFeatureClass, *ZMapWindowCollectionFeatureClass ;
 
 
+typedef ColinearityType (*ZMapFeatureCompareFunc)(ZMapFeature feature_a, ZMapFeature feature_b, gpointer user_data);
+
 /* Public funcs */
 GType zMapWindowCollectionFeatureGetType(void);
 
+ZMapWindowCanvasItem zMapWindowCollectionFeatureCreate(FooCanvasGroup *parent);
+void zMapWindowCollectionFeatureRemoveSubFeatures(ZMapWindowCanvasItem collection, 
+						  gboolean keep_in_place_x, 
+						  gboolean keep_in_place_y);
+void zMapWindowCollectionFeatureStaticReparent(ZMapWindowCanvasItem reparentee, 
+					       ZMapWindowCanvasItem new_parent);
+void zMapWindowCollectionFeatureAddColinearMarkers(ZMapWindowCanvasItem   collection,
+						   ZMapFeatureCompareFunc compare_func,
+						   gpointer               compare_data);
+void zMapWindowCollectionFeatureAddIncompleteMarkers(ZMapWindowCanvasItem collection,
+						     gboolean revcomped_features);
+void zMapWindowCollectionFeatureAddSpliceMarkers(ZMapWindowCanvasItem collection);
+
+
 #endif /* ZMAP_WINDOW_COLLECTION_FEATURE_H */
diff --git a/src/zmapWindow/items/zmapWindowGlyphItem.c b/src/zmapWindow/items/zmapWindowGlyphItem.c
index 19de279d1..f3a532c86 100755
--- a/src/zmapWindow/items/zmapWindowGlyphItem.c
+++ b/src/zmapWindow/items/zmapWindowGlyphItem.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr  6 14:44 2009 (rds)
+ * Last edited: Apr 23 14:55 2009 (rds)
  * Created: Fri Jan 16 11:20:07 2009 (rds)
- * CVS info:   $Id: zmapWindowGlyphItem.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowGlyphItem.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -850,10 +850,10 @@ static void zmap_window_glyph_item_draw (FooCanvasItem  *item,
 {
   ZMapWindowGlyphItem glyph;
   GdkPoint static_points[ZMAP_MAX_POINTS];
-  GdkPoint *points;
+  GdkPoint *points = NULL;
   int actual_num_points_drawn;
   double i2w_dx, i2w_dy;
-  char *alpha;
+  /* char *alpha; */
   
   glyph = ZMAP_WINDOW_GLYPH_ITEM (item);
 
@@ -911,7 +911,7 @@ static void zmap_window_glyph_item_draw (FooCanvasItem  *item,
 	    break;
 	  }
 
-	if (points != static_points)
+	if (points && points != static_points)
 	  g_free (points);
       }
       break;
@@ -951,7 +951,55 @@ static void zmap_window_glyph_item_draw (FooCanvasItem  *item,
 static double zmap_window_glyph_item_point (FooCanvasItem *item, double x, double y,
 					    int cx, int cy, FooCanvasItem **actual_item)
 {
-  double dist = 1000000000.0;
+  ZMapWindowGlyphItem glyph;
+  GdkPoint static_points[ZMAP_MAX_POINTS];
+  GdkPoint *points = NULL, *tmp_points;
+  double static_coords[ZMAP_MAX_POINTS * 2];
+  double *coords, *tmp_coords, i2w_dx, i2w_dy;
+  double dist, best;
+  int i;
+
+  dist = best = 1.0e36; 
+
+  g_return_val_if_fail(ZMAP_IS_WINDOW_GLYPH_ITEM(item), dist);
+
+  glyph = ZMAP_WINDOW_GLYPH_ITEM(item);
+
+  i2w_dx = 0.0;
+  i2w_dy = 0.0;
+  foo_canvas_item_i2w (item, &i2w_dx, &i2w_dy);
+  
+  /* Build array of canvas pixel coordinates */
+  if (glyph->num_points <= ZMAP_MAX_POINTS)
+    {
+      points = static_points;
+      coords = static_coords;
+    }
+  else
+    {
+      points = g_new (GdkPoint, glyph->num_points);
+      coords = g_new (double, glyph->num_points * 2);
+    }
+
+  item_to_canvas (item->canvas, glyph->coords, points, glyph->num_points, i2w_dx, i2w_dy);
+
+  tmp_points = points;
+  tmp_coords = coords;
+
+  for(i = 0; i < glyph->num_points; i++, tmp_coords+=2, tmp_points++)
+    {
+      tmp_coords[0] = tmp_points->x;
+      tmp_coords[1] = tmp_points->y;
+    }
+
+  best = foo_canvas_polygon_to_point(coords, glyph->num_points, (double)cx, (double)cy);
+
+  if(points && points != static_points)
+    g_free(points);
+
+  dist = best;
+
+  *actual_item = item;
 
   return dist;
 }
diff --git a/src/zmapWindow/items/zmapWindowTextFeature.c b/src/zmapWindow/items/zmapWindowTextFeature.c
index d570b2b7b..4ae2e25d3 100755
--- a/src/zmapWindow/items/zmapWindowTextFeature.c
+++ b/src/zmapWindow/items/zmapWindowTextFeature.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Jan 26 14:55 2009 (rds)
+ * Last edited: Apr 29 19:54 2009 (rds)
  * Created: Tue Jan 13 13:41:57 2009 (rds)
- * CVS info:   $Id: zmapWindowTextFeature.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowTextFeature.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 #include <math.h>		/* pow(), sqrt() */
@@ -219,7 +219,7 @@ static void window_text_feature_item_set_colour(ZMapWindowCanvasItem  canvas_ite
   g_return_if_fail(canvas_item != NULL);
   g_return_if_fail(interval    != NULL);
 
-  if((style = canvas_item->style))
+  if((style = (ZMAP_CANVAS_ITEM_GET_CLASS(canvas_item)->get_style)(canvas_item)))
     {
       zMapStyleGetColours(style, ZMAPSTYLE_COLOURTARGET_NORMAL, colour_type,
 			  &fill, NULL, &outline);
@@ -287,7 +287,7 @@ static void zmap_window_text_feature_set_colour(ZMapWindowCanvasItem  text,
       gdk_color_parse("black", &black);
       gdk_color_parse("white", &white);
       
-      if((style = text->style))
+      if((style = (ZMAP_CANVAS_ITEM_GET_CLASS(text)->get_style)(text)))
 	{
 	  
 	  if(!zMapStyleGetColours(style, ZMAPSTYLE_COLOURTARGET_NORMAL, ZMAPSTYLE_COLOURTYPE_SELECTED,
@@ -395,7 +395,7 @@ static FooCanvasItem *zmap_window_text_feature_add_interval(ZMapWindowCanvasItem
   char *font_name = "Lucida Console";
   gboolean mark_real_extent = FALSE;
 
-  if((style = text->style))
+  if((style = (ZMAP_CANVAS_ITEM_GET_CLASS(text)->get_style)(text)))
     {
       char *tmp_font;
       g_object_get(G_OBJECT(style),
diff --git a/src/zmapWindow/items/zmapWindowTranscriptFeature.c b/src/zmapWindow/items/zmapWindowTranscriptFeature.c
index 62a4d8b61..a1c257f85 100755
--- a/src/zmapWindow/items/zmapWindowTranscriptFeature.c
+++ b/src/zmapWindow/items/zmapWindowTranscriptFeature.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Apr  2 14:13 2009 (rds)
+ * Last edited: Apr 29 20:07 2009 (rds)
  * Created: Wed Dec  3 10:02:22 2008 (rds)
- * CVS info:   $Id: zmapWindowTranscriptFeature.c,v 1.1 2009-04-23 09:12:46 rds Exp $
+ * CVS info:   $Id: zmapWindowTranscriptFeature.c,v 1.2 2009-04-30 08:38:52 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -235,7 +235,7 @@ static void zmap_window_transcript_feature_set_colour(ZMapWindowCanvasItem  tran
   g_return_if_fail(sub_feature != NULL);
   g_return_if_fail(interval    != NULL);
 
-  style = transcript->style;
+  style = (ZMAP_CANVAS_ITEM_GET_CLASS(transcript)->get_style)(transcript);
 
   switch(sub_feature->subpart)
     {
@@ -422,7 +422,7 @@ static FooCanvasItem *zmap_window_transcript_feature_add_interval(ZMapWindowCanv
   g_return_val_if_fail(transcript  != NULL, NULL);
   g_return_val_if_fail(sub_feature != NULL, NULL);
 
-  style = transcript->style;
+  style = (ZMAP_CANVAS_ITEM_GET_CLASS(transcript)->get_style)(transcript);
 
   switch(sub_feature->subpart)
     {
-- 
GitLab