From a30fc9fc73e1f5d83c0e7df1185fee07da1ca411 Mon Sep 17 00:00:00 2001
From: edgrif <edgrif>
Date: Thu, 14 Jan 2010 09:02:59 +0000
Subject: [PATCH] fix highlighting for shift-click to just highlight a single
 exon.

---
 src/zmapWindow/zmapWindow.c        | 22 ++++++++++----
 src/zmapWindow/zmapWindowFeature.c | 35 +++++++++++++--------
 src/zmapWindow/zmapWindowItem.c    | 49 +++++++++++++++++++-----------
 3 files changed, 69 insertions(+), 37 deletions(-)

diff --git a/src/zmapWindow/zmapWindow.c b/src/zmapWindow/zmapWindow.c
index 366bf1b9b..a30116706 100755
--- a/src/zmapWindow/zmapWindow.c
+++ b/src/zmapWindow/zmapWindow.c
@@ -26,9 +26,9 @@
  *              
  * Exported functions: See ZMap/zmapWindow.h
  * HISTORY:
- * Last edited: Jan 12 10:03 2010 (edgrif)
+ * Last edited: Jan 13 15:59 2010 (edgrif)
  * Created: Thu Jul 24 14:36:27 2003 (edgrif)
- * CVS info:   $Id: zmapWindow.c,v 1.299 2010-01-12 10:53:06 edgrif Exp $
+ * CVS info:   $Id: zmapWindow.c,v 1.300 2010-01-14 09:02:59 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -4648,17 +4648,24 @@ static char *makePrimarySelectionText(ZMapWindow window, FooCanvasItem *highligh
     {
       GString *text ;
       FooCanvasItem *item;
+      ZMapWindowCanvasItem canvas_item;
       ZMapFeature item_feature ;
       gint i = 0 ;
       int selected_start, selected_end, selected_length, dummy ;
       ZMapFeatureSubpartType item_type_int ;
 
       text = g_string_sized_new(512) ;
+
       item = FOO_CANVAS_ITEM(selected->data) ;
-      item_feature = zmapWindowItemGetFeature(item) ;
+      if (ZMAP_IS_CANVAS_ITEM(item))
+	canvas_item = item ;
+      else
+	canvas_item = zMapWindowCanvasItemIntervalGetTopLevelObject(item) ;
+      item_feature = zmapWindowItemGetFeature(canvas_item) ;
 
       /* Processing is different if there is only one item highlighted and it's a transcript. */
-      if (length == 1 && item_feature->type == ZMAPSTYLE_MODE_TRANSCRIPT && item_feature->feature.transcript.exons)
+      if (ZMAP_IS_CANVAS_ITEM(item) && length == 1
+	  && item_feature->type == ZMAPSTYLE_MODE_TRANSCRIPT && item_feature->feature.transcript.exons)
 	{
 	  /* For a transcript feature with exons put all the exons in the paste buffer. */
 	  ZMapSpan span ;
@@ -4684,7 +4691,11 @@ static char *makePrimarySelectionText(ZMapWindow window, FooCanvasItem *highligh
 	  while (selected)
 	    {
 	      item = FOO_CANVAS_ITEM(selected->data) ;
-	      item_feature = zmapWindowItemGetFeature(item) ;
+	      if (ZMAP_IS_CANVAS_ITEM(item))
+		canvas_item = item ;
+	      else
+		canvas_item = zMapWindowCanvasItemIntervalGetTopLevelObject(item) ;
+	      item_feature = zmapWindowItemGetFeature(canvas_item) ;
 
 	      if ((sub_feature = zMapWindowCanvasItemIntervalGetData(item)))
 		{
@@ -4734,7 +4745,6 @@ static gboolean possiblyPopulateWithChildData(ZMapWindow window,
 {
   gboolean populated = FALSE;
   ZMapFeatureSubPartSpan item_data;
-  ZMapFeatureSubPartSpan sub_feature;
   int fstart, fend, flength;
   int sstart, send, slength;
   gboolean ignore_this_restriction = TRUE;
diff --git a/src/zmapWindow/zmapWindowFeature.c b/src/zmapWindow/zmapWindowFeature.c
index 1be4b0321..ef6abe350 100755
--- a/src/zmapWindow/zmapWindowFeature.c
+++ b/src/zmapWindow/zmapWindowFeature.c
@@ -28,9 +28,9 @@
  *
  * Exported functions: See zmapWindow_P.h
  * HISTORY:
- * Last edited: Dec 17 10:40 2009 (edgrif)
+ * Last edited: Jan 13 13:49 2010 (edgrif)
  * Created: Mon Jan  9 10:25:40 2006 (edgrif)
- * CVS info:   $Id: zmapWindowFeature.c,v 1.169 2009-12-17 14:47:57 edgrif Exp $
+ * CVS info:   $Id: zmapWindowFeature.c,v 1.170 2010-01-14 09:04:25 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -800,6 +800,8 @@ static void featureCopySelectedItem(ZMapFeature feature_in,
 
 
 
+/* SORT OUT HIGHLIGHTING BUG....... */
+
 static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer data)
 {
   gboolean event_handled = FALSE ;
@@ -813,14 +815,17 @@ static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer
     case GDK_2BUTTON_PRESS:
       {
 	GdkEventButton *but_event = (GdkEventButton *)event ;
-	ZMapFeatureSubPartSpan sub_feature;
-	ZMapWindowCanvasItem canvas_item;
-	FooCanvasItem *sub_item = NULL ;
-	FooCanvasItem *highlight_item = NULL ;
+	ZMapFeatureSubPartSpan sub_feature ;
+	ZMapWindowCanvasItem canvas_item ;
+	FooCanvasItem *sub_item = NULL, *highlight_item = NULL ;
 
-	if(!ZMAP_IS_CANVAS_ITEM(item))
+	if (!ZMAP_IS_CANVAS_ITEM(item))
 	  {
+
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
 	    g_warning("Not a ZMapWindowCanvasItem.");
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
+
 	    return FALSE;
 	  }
 
@@ -874,28 +879,32 @@ static gboolean canvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer
 			/* Only highlight the single item user clicked on. */
 			highlight_same_names = FALSE ;
 
-			/* Annotators say they don't want subparts sub selections + multiple selections */
+			/* Annotators say they don't want subparts sub selections + multiple
+			 * selections for alignments. */
 			if (feature->type == ZMAPSTYLE_MODE_ALIGNMENT)
 			  {
 			    highlight_item = item;
 			  }
 			else
-			  highlight_item = sub_item ;
+			  {
+			    highlight_item = sub_item ;
+			  }
 
 
                         /* monkey around to get feature_copy to be the right correct data */
-                        featureCopySelectedItem(feature, &feature_copy,
-                                                highlight_item);
+                        featureCopySelectedItem(feature, &feature_copy, highlight_item);
 
 			if (zmapWindowFocusIsItemInHotColumn(window->focus, highlight_item)
 			    && window->multi_select)
                           {
                             replace_highlight = FALSE ;
-                            externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), "multiple_select", highlight_item);
+                            externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy),
+									     "multiple_select", highlight_item);
                           }
                         else
 			  {
-			    externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy), "single_select", highlight_item);
+			    externally_handled = zmapWindowUpdateXRemoteData(window, (ZMapFeatureAny)(&feature_copy),
+									     "single_select", highlight_item);
 			    window->multi_select = TRUE ;
 			  }
 		      }
diff --git a/src/zmapWindow/zmapWindowItem.c b/src/zmapWindow/zmapWindowItem.c
index 750b31ee0..5f79b9efd 100755
--- a/src/zmapWindow/zmapWindowItem.c
+++ b/src/zmapWindow/zmapWindowItem.c
@@ -26,9 +26,9 @@
  *
  * Exported functions: See zmapWindow_P.h
  * HISTORY:
- * Last edited: Nov  6 16:47 2009 (edgrif)
+ * Last edited: Jan 13 13:49 2010 (edgrif)
  * Created: Thu Sep  8 10:37:24 2005 (edgrif)
- * CVS info:   $Id: zmapWindowItem.c,v 1.120 2009-12-15 13:49:11 mh17 Exp $
+ * CVS info:   $Id: zmapWindowItem.c,v 1.121 2010-01-14 09:05:10 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -53,7 +53,7 @@ typedef struct
 {
   int start, end;
   FooCanvasItem *item;
-}StartEndTextHighlightStruct, *StartEndTextHighlight;
+} StartEndTextHighlightStruct, *StartEndTextHighlight;
 
 typedef struct
 {
@@ -76,7 +76,7 @@ typedef struct
   gboolean multiple_select;
   gint highlighted;
   gint feature_count;
-}HighlightContextStruct, *HighlightContext;
+} HighlightContextStruct, *HighlightContext;
 
 
 
@@ -115,6 +115,7 @@ static gboolean foo_canvas_items_get_intersect(FooCanvasItem *i1, FooCanvasItem
 static gboolean foo_canvas_items_intersect(FooCanvasItem *i1, FooCanvasItem *i2, double threshold);
 #endif
 
+
 /* This looks like something we will want to do often.... */
 GList *zmapWindowItemSortByPostion(GList *feature_item_list)
 {
@@ -318,12 +319,17 @@ void zMapWindowHighlightObjects(ZMapWindow window, ZMapFeatureContext context, g
 void zmapWindowHighlightObject(ZMapWindow window, FooCanvasItem *item,
 			       gboolean replace_highlight_item, gboolean highlight_same_names)
 {                                               
+  ZMapWindowCanvasItem canvas_item ;
   ZMapFeature feature ;
   GList *set_items ;
   FooCanvasItem  *framed_3ft;
 
+  canvas_item = zMapWindowCanvasItemIntervalGetObject(item) ;
+  zMapAssert(ZMAP_IS_CANVAS_ITEM(canvas_item)) ;
+
+
   /* Retrieve the feature item info from the canvas item. */
-  feature = zmapWindowItemGetFeature(item);
+  feature = zmapWindowItemGetFeature(canvas_item);
   zMapAssert(feature) ;
 
 
@@ -376,7 +382,8 @@ void zmapWindowHighlightObject(ZMapWindow window, FooCanvasItem *item,
     int frame_itr;
     for(frame_itr = ZMAPFRAME_0; frame_itr < ZMAPFRAME_2 + 1; frame_itr++)
       {
-	if((framed_3ft = zmapWindowItemGetTranslationItemFromItemFrame(window, item, frame_itr)))
+	if((framed_3ft = zmapWindowItemGetTranslationItemFromItemFrame(window,
+								       FOO_CANVAS_ITEM(canvas_item), frame_itr)))
 	  {
 	    FooCanvasGroup *container;
 	    
@@ -935,6 +942,7 @@ FooCanvasItem *zMapWindowFindFeatureItemByItem(ZMapWindow window, FooCanvasItem
   ZMapFeature feature ;
   ZMapWindowContainerFeatureSet container;
   ZMapWindowCanvasItem canvas_item;
+  ZMapFeatureSubPartSpan item_subfeature_data ;
 
   /* Retrieve the feature item info from the canvas item. */
   canvas_item = zMapWindowCanvasItemIntervalGetObject(item);
@@ -944,22 +952,21 @@ FooCanvasItem *zMapWindowFindFeatureItemByItem(ZMapWindow window, FooCanvasItem
 
   container = (ZMapWindowContainerFeatureSet)zmapWindowContainerCanvasItemGetContainer(item) ;
 
-  matching_item = zmapWindowFToIFindFeatureItem(window->context_to_item,
-						container->strand, container->frame,
-						feature) ;
-  if(FALSE)
+  if ((item_subfeature_data = (ZMapFeatureSubPartSpan)g_object_get_data(G_OBJECT(item),
+									ITEM_SUBFEATURE_DATA)))
     {
-      ZMapFeatureSubPartSpan item_subfeature_data ;
-
-      item_subfeature_data = (ZMapFeatureSubPartSpan)g_object_get_data(G_OBJECT(item),
-								       ITEM_SUBFEATURE_DATA) ;
-
       matching_item = zmapWindowFToIFindItemChild(window->context_to_item,
 						  container->strand, container->frame,
 						  feature,
 						  item_subfeature_data->start,
 						  item_subfeature_data->end) ;
     }
+  else
+    {
+      matching_item = zmapWindowFToIFindFeatureItem(window->context_to_item,
+						    container->strand, container->frame,
+						    feature) ;
+    }
 
   return matching_item ;
 }
@@ -1157,6 +1164,12 @@ void zmapWindowItemCentreOnItemSubPart(ZMapWindow window, FooCanvasItem *item,
 
   if (zmapWindowItemIsShown(item))
     {
+
+      /* THERE'S SOMETHING WRONG WITH THE GROUP TEST NOW.... */
+
+      foo_canvas_item_get_bounds(item, &ix1, &iy1, &ix2, &iy2) ;
+
+
       /* If the item is a group then we need to use its background to check in long items as the
        * group itself is not a long item. */
       if (FOO_IS_CANVAS_GROUP(item) && zmapWindowContainerUtilsIsValid(FOO_CANVAS_GROUP(item)))
@@ -1891,13 +1904,13 @@ static void highlightItem(ZMapWindow window, FooCanvasItem *item, gboolean highl
   if(highlight)
     {
       if(window->highlights_set.item)
-	zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_SELECTED, 
+	zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_SELECTED, 
 					       &(window->colour_item_highlight));
       else
-	zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_SELECTED, NULL);
+	zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_SELECTED, NULL);
     }
   else
-    zMapWindowCanvasItemSetIntervalColours(ZMAP_CANVAS_ITEM(item), ZMAPSTYLE_COLOURTYPE_NORMAL, NULL);
+    zMapWindowCanvasItemSetIntervalColours(item, ZMAPSTYLE_COLOURTYPE_NORMAL, NULL);
 
   return ;
 }
-- 
GitLab