From 9f7e91a3ff27ac261c9948c1ba40159c24512b50 Mon Sep 17 00:00:00 2001
From: rds <rds>
Date: Wed, 8 Nov 2006 08:31:43 +0000
Subject: [PATCH] navigator/menu enhancements

---
 src/zmapWindow/zmapWindowNavigator.c       | 299 +++++++++------------
 src/zmapWindow/zmapWindowNavigatorMenus.c  |  29 +-
 src/zmapWindow/zmapWindowNavigatorWidget.c |   7 +-
 src/zmapWindow/zmapWindowNavigator_P.h     |   7 +-
 4 files changed, 158 insertions(+), 184 deletions(-)

diff --git a/src/zmapWindow/zmapWindowNavigator.c b/src/zmapWindow/zmapWindowNavigator.c
index 6c3322060..00a5a9502 100755
--- a/src/zmapWindow/zmapWindowNavigator.c
+++ b/src/zmapWindow/zmapWindowNavigator.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Nov  7 08:50 2006 (rds)
+ * Last edited: Nov  7 16:55 2006 (rds)
  * Created: Wed Sep  6 11:22:24 2006 (rds)
- * CVS info:   $Id: zmapWindowNavigator.c,v 1.5 2006-11-07 08:59:57 rds Exp $
+ * CVS info:   $Id: zmapWindowNavigator.c,v 1.6 2006-11-08 08:31:43 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -102,6 +102,16 @@ typedef struct
   double   click_correction;
 }TransparencyEventStruct, *TransparencyEvent;
 
+typedef struct
+{
+  ZMapWindowNavigator navigate;
+  FooCanvasItem *item;
+  double wheight;
+}RepositionTextDataStruct, *RepositionTextData;
+
+static void popupItemFriendsList(FooCanvasItem *item, ZMapWindow window);
+static void repositionText(ZMapWindowNavigator navigate);
+
 /* draw some features... */
 static ZMapFeatureContextExecuteStatus drawContext(GQuark key, 
                                                    gpointer data, 
@@ -153,6 +163,7 @@ static GQuark locus_id_G = 0;
 
 static void destroyLocusEntry(gpointer data)
 {
+  printf("%s:%d sort this\n", __FILE__, __LINE__);
   return ;
 }
 
@@ -384,7 +395,6 @@ static void positioningCB(FooCanvasGroup *container, FooCanvasPoints *points,
                           ZMapContainerLevelType level, gpointer user_data)
 {
   ZMapWindowNavigator navigate = (ZMapWindowNavigator)user_data;
-  FooCanvasGroup *align = NULL;
   double init_y1, init_y2, init_size;
   double rx1, rx2, width_x;
 
@@ -406,22 +416,21 @@ static void positioningCB(FooCanvasGroup *container, FooCanvasPoints *points,
           }
 
         init_size = init_y2 - init_y1;
+        width_x   = (double)(navigate->locator_width);
         
-        align     = zmapWindowContainerGetFeatures(navigate->container_align);
-        width_x   = (double)(navigate->locator_width) + 1.0;
-        
-        foo_canvas_item_get_bounds(FOO_CANVAS_ITEM(align), 
-                                   &rx1, NULL, 
-                                   &rx2, NULL);
-        
+        rx1 = points->coords[0];
+        rx2 = points->coords[2];
+
         navigate->locator_x1 = rx1 + width_x;
-        navigate->locator_x2 = rx2 + width_x;
+        navigate->locator_x2 = rx2 - width_x;
         
         zMapWindowNavigatorDrawLocator(navigate, init_y1, init_y2);
 
         widget = NAVIGATOR_WIDGET(navigate);
         
         zmapWindowNavigatorSizeRequest(widget, rx2 - rx1 + 1.0, init_size);
+
+        zmapWindowNavigatorFillWidget(widget);
       }
       break;
     case ZMAPCONTAINER_LEVEL_ROOT:
@@ -462,170 +471,56 @@ static gboolean navExposeHandlerCB(GtkWidget *widget, GdkEventExpose *expose, gp
   return FALSE;                 /* lets others run. */
 }
 
-typedef struct
-{
-  GList *list_start;
-  GList *list_end;
-  ZMapWindowNavigator navigate;
-  FooCanvasItem *item;
-  double wheight;
-  double last_movement;
-}UnOverlapTextDataStruct, *UnOverlapTextData;
-
-typedef struct
-{
-  FooCanvasItem *item;
-  gboolean overlapped;
-  gboolean start_overlap, end_overlap;
-  double overlap_at_start, overlap_at_end, cummulative;
-  double wy1, wy2;
-  double iy1, iy2;
-  int cy1, cy2;
-}TextualDataStruct, *TextualData;
-
 static void locus_gh_func(gpointer hash_key, gpointer hash_value, gpointer user_data)
 {
-  UnOverlapTextData data = (UnOverlapTextData)user_data;
+  RepositionTextData data = (RepositionTextData)user_data;
   ZMapFeature feature = NULL;
+  FooCanvasItem *item = NULL;
   LocusEntry locus_data = (LocusEntry)hash_value;
-  TextualData text_data = NULL;
   double text_height, start, end, mid, draw_here, dummy_x = 0.0, i2w_dy;
-  int cx = 0;
-
-  if((text_data = g_new0(TextualDataStruct, 1)))
-    {
-      feature = locus_data->feature;
-      start   = locus_data->start;
-      end     = locus_data->end;
-      
-      if((text_data->item = zmapWindowFToIFindFeatureItem(data->navigate->ftoi_hash,
-                                                          locus_data->strand, ZMAPFRAME_NONE, 
-                                                          feature)))
-        {
-          double x1, x2, y1, y2;
-          text_height = data->wheight;
-          mid         = start + ((end - start + 1.0) / 2.0);
-          draw_here   = mid - (text_height / 2.0);
-
-          text_data->iy1 = text_data->wy1 = start;
-          text_data->iy2 = text_data->wy2 = start + text_height;
-
-          foo_canvas_item_get_bounds(text_data->item, &x1, &y1, &x2, &y2);
+  double iy1, iy2, wy1, wy2;
+  int cx = 0, cy1, cy2;
 
-          /* move to the start of the locus... */
-          foo_canvas_item_move(text_data->item, 0.0, start - y1);
+  feature = locus_data->feature;
+  start   = locus_data->start;
+  end     = locus_data->end;
 
-          foo_canvas_item_get_bounds(text_data->item, &x1, &(text_data->iy1), &x2, &(text_data->iy2));
-
-          text_data->wy1 = text_data->iy1;
-          text_data->wy2 = text_data->iy2;
-
-          foo_canvas_item_i2w(text_data->item, &dummy_x, &(text_data->wy1));
-          foo_canvas_item_i2w(text_data->item, &dummy_x, &(text_data->wy2));
-
-          foo_canvas_w2c(text_data->item->canvas, dummy_x, text_data->wy1, &cx, &(text_data->cy1));
-          foo_canvas_w2c(text_data->item->canvas, dummy_x, text_data->wy2, &cx, &(text_data->cy2));
-
-          text_data->overlap_at_start = 
-            text_data->overlap_at_end = 
-            text_data->cummulative = 0.0;
-
-          if(data->list_end)
-            {
-              data->list_end = g_list_append(data->list_end, text_data);
-              data->list_end = data->list_end->next;
-            }
-          else
-            data->list_start = 
-              data->list_end = g_list_append(data->list_start, text_data);
-        }
-      else
-        zMapAssertNotReached();
-    }
-  
-  return ;
-}
-static void do_unoverlap(gpointer list_data, gpointer user_data)
-{
-
-  return ;
-}
-
-static gint sort_text_position(gconstpointer member_a, gconstpointer member_b)
-{
-  TextualData text_a = (TextualData)member_a, 
-    text_b = (TextualData)member_b;
-  gint position = 0; /* negative value if a < b; zero if a = b; positive value if a > b. */
-  gboolean lt1, lt2, gt1, gt2;
-  double ay1, ay2, by1, by2;
-
-  lt1 = lt2 = gt1 = gt2 = FALSE;
-
-  if(1)
+  if((item = zmapWindowFToIFindFeatureItem(data->navigate->ftoi_hash,
+                                           locus_data->strand, ZMAPFRAME_NONE, 
+                                           feature)))
     {
-      ay1 = (double)(text_a->cy1);
-      ay2 = (double)(text_a->cy2);
-      by1 = (double)(text_b->cy1);
-      by2 = (double)(text_b->cy2);
-    }
-  else
-    {
-      ay1 = text_a->wy1;
-      ay2 = text_a->wy2;
-      by1 = text_b->wy1;
-      by2 = text_b->wy2;
-    }
+      double x1, x2, y1, y2;
 
-  if( (( lt1 = (ay1 < by1) ) &&
-       ( lt2 = (ay2 > by1) )) 
-      ||
-      (( gt1 = (ay2 > by2) ) &&
-       ( gt2 = (ay1 < by2) ))
-      )
-    {
-      double tmp = 0.0;
-      text_a->overlapped = text_b->overlapped = TRUE;
-      if(gt1)
-        {
-          text_a->start_overlap = 
-            text_b->end_overlap = TRUE;
-          text_a->overlap_at_start = 
-            text_b->overlap_at_end = tmp = by2 - ay1;
-        }
-      if(lt1)
-        {
-          text_b->start_overlap = 
-            text_a->end_overlap = TRUE;
-          text_b->overlap_at_start = 
-            text_a->overlap_at_end = tmp = ay2 - by1;
-        }
-      text_a->cummulative += tmp;
-      text_b->cummulative += tmp;
+      text_height = data->wheight;
+      mid         = start + ((end - start + 1.0) / 2.0);
+      draw_here   = mid - (text_height / 2.0);
+      
+      iy1 = wy1 = start;
+      iy2 = wy2 = start + text_height;
+      
+      foo_canvas_item_get_bounds(item, &x1, &y1, &x2, &y2);
+      
+      /* move to the start of the locus... */
+      foo_canvas_item_move(item, 0.0, start - y1);
+      
+      foo_canvas_item_get_bounds(item, &x1, &(iy1), &x2, &(iy2));
+      
+      wy1 = iy1;
+      wy2 = iy2;
+      
+      foo_canvas_item_i2w(item, &dummy_x, &(wy1));
+      foo_canvas_item_i2w(item, &dummy_x, &(wy2));
+      
+      foo_canvas_w2c(item->canvas, dummy_x, wy1, &cx, &(cy1));
+      foo_canvas_w2c(item->canvas, dummy_x, wy2, &cx, &(cy2));
     }
-
   
-  /* can only rely on lt1 and gt1 to have been evaluated... */
-  /* i'm relying on the fact that all items are the same 
-   * height here. */
-  if(lt1)
-    {
-      position = -1;
-      printf("-");
-    }
-  else if(gt1)
-    {
-      position = 1;
-      printf("+");
-    }
-  else
-    printf(".");
-
-  return position; /* negative value if a < b; zero if a = b; positive value if a > b. */
+  return ;
 }
 
-static void unOverlapText(ZMapWindowNavigator navigate)
+static void repositionText(ZMapWindowNavigator navigate)
 {
-  UnOverlapTextDataStruct locus_gh_data = {NULL};
+  RepositionTextDataStruct locus_gh_data = {NULL};
 
   if(navigate->locus_display_hash)
     {
@@ -637,19 +532,11 @@ static void unOverlapText(ZMapWindowNavigator navigate)
 
       zmapWindowNavigatorTextSize(GTK_WIDGET(canvas), 
                                   NULL, &(locus_gh_data.wheight));
-      locus_gh_data.wheight -= (3.0 / canvas->pixels_per_unit_y);
+      //locus_gh_data.wheight -= (3.0 / canvas->pixels_per_unit_y);
 
       g_hash_table_foreach(navigate->locus_display_hash,
                            locus_gh_func,
                            &locus_gh_data);
-#ifdef RDS_DONT_INCLUDE
-      printf("\nunOverlapText: sorting first ...\n");
-      locus_gh_data.list_start = g_list_sort(locus_gh_data.list_start, sort_text_position);
-      locus_gh_data.list_end   = g_list_last(locus_gh_data.list_start);
-      printf("\nunOverlapText: doing unoverlap ...\n");
-      g_list_foreach(locus_gh_data.list_start, do_unoverlap, &locus_gh_data);
-      printf("\nunOverlapText: finished\n");
-#endif
     }
   
   return ;
@@ -667,7 +554,7 @@ static void navigateDrawFunc(NavigateDraw nav_draw, GtkWidget *widget)
   
   zmapWindowNavigatorPositioning(navigate);
   
-  unOverlapText(navigate);
+  repositionText(navigate);
 
   /* DO THIS ON FRIDAY! */
   /* port below into positioning! */
@@ -1174,8 +1061,15 @@ static void makeMenuFromCanvasItem(GdkEventButton *button, FooCanvasItem *item,
 
       if(feature_any->struct_type == ZMAPFEATURE_STRUCT_FEATURE)
         {
+          ZMapFeature feature = (ZMapFeature)feature_any;
+
           style = zmapWindowItemGetStyle(item) ;
           menu_data->item_cb  = TRUE;
+
+          if(feature->parent && feature->parent->unique_id == locus_id_G)
+            {
+              menu_sets = g_list_append(menu_sets, zmapWindowNavigatorMakeMenuLocusOps(NULL, NULL, NULL));
+            }
         }
       else
         {
@@ -1227,12 +1121,62 @@ static gboolean columnBackgroundEventCB(FooCanvasItem *item, GdkEvent *event, gp
   return event_handled;
 }
 
-static void gotoItemInWindow(ZMapWindowNavigator navigate, ZMapWindow window)
+static gboolean searchLocusSetCB(FooCanvasItem *item, gpointer user_data)
+{
+  GQuark locus_name = GPOINTER_TO_UINT(user_data);
+  ZMapFeatureAny feature_any = NULL;
+  gboolean match = FALSE;
+
+  feature_any = g_object_get_data(G_OBJECT(item), ITEM_FEATURE_DATA);
+  zMapAssert(feature_any);
+
+  switch(feature_any->struct_type)
+    {
+    case ZMAPFEATURE_STRUCT_FEATURE:
+      {
+        if(locus_name == feature_any->original_id)
+          match = TRUE;
+      }
+      break;
+    default:
+      break;
+    }
+  
+  return match;
+}
+
+static void popupItemFriendsList(FooCanvasItem *item, ZMapWindow window)
 {
-  printf("going to a locus item\n");
+  GQuark locus_quark = 0;
+  ZMapFeature feature = NULL;
+  GList *result;
+  char *wild_card = "*";
+  ZMapWindowFToIPredFuncCB callback = NULL ;
+
+  feature = g_object_get_data(G_OBJECT(item), ITEM_FEATURE_DATA);
+  zMapAssert(feature);
+
+  callback = searchLocusSetCB;
+  locus_quark = g_quark_from_string(wild_card);
+
+  if(locus_id_G == feature->parent->unique_id)
+    {
+      if((result = zmapWindowFToIFindItemSetFull(window->context_to_item,
+                                                 feature->parent->parent->parent->unique_id,
+                                                 feature->parent->parent->unique_id,
+                                                 locus_id_G, wild_card, wild_card, locus_quark,
+                                                 callback, GUINT_TO_POINTER(feature->original_id))))
+        {
+          zmapWindowListWindowCreate(window, result,
+                                     (char *)(g_quark_to_string(feature->original_id)), item);
+          g_list_free(result);  /* clean up list. */
+        }
+    }
+
 
   return ;
 }
+
 static gboolean navCanvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpointer data)
 {
   gboolean event_handled = FALSE;
@@ -1264,7 +1208,12 @@ static gboolean navCanvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpoin
               {
                 if(button->button == 1)
                   {
-
+                    /* ignore ATM */
+                  }
+                else if(button->button == 3)
+                  {
+                    /* make item menu */
+                    makeMenuFromCanvasItem(button, item, navigate);
                   }
               }
             last_but_press = button->time ;
@@ -1275,7 +1224,7 @@ static gboolean navCanvasItemEventCB(FooCanvasItem *item, GdkEvent *event, gpoin
           {
             if(button->button == 1)
               {
-                gotoItemInWindow(item, navigate->current_window);
+                popupItemFriendsList(item, navigate->current_window);
                 event_handled = TRUE;
               }
           }
diff --git a/src/zmapWindow/zmapWindowNavigatorMenus.c b/src/zmapWindow/zmapWindowNavigatorMenus.c
index 41297747f..029a85fd2 100755
--- a/src/zmapWindow/zmapWindowNavigatorMenus.c
+++ b/src/zmapWindow/zmapWindowNavigatorMenus.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Nov  3 09:05 2006 (rds)
+ * Last edited: Nov  7 15:46 2006 (rds)
  * Created: Wed Oct 18 08:21:15 2006 (rds)
- * CVS info:   $Id: zmapWindowNavigatorMenus.c,v 1.2 2006-11-06 10:43:06 rds Exp $
+ * CVS info:   $Id: zmapWindowNavigatorMenus.c,v 1.3 2006-11-08 08:31:46 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -39,6 +39,21 @@
 static void navigatorBumpMenuCB(int menu_item_id, gpointer callback_data);
 static void navigatorColumnMenuCB(int menu_item_id, gpointer callback_data);
 
+ZMapGUIMenuItem zmapWindowNavigatorMakeMenuLocusOps(int *start_index_inout,
+                                                    ZMapGUIMenuItemCallbackFunc callback_func,
+                                                    gpointer callback_data)
+{
+  static ZMapGUIMenuItemStruct menu[] = 
+    {
+      {ZMAPGUI_MENU_NORMAL, "Show Variants List", 1, NULL, NULL},
+      {ZMAPGUI_MENU_NONE,   NULL,        0, NULL, NULL}
+    };
+
+  zMapGUIPopulateMenu(menu, start_index_inout, callback_func, callback_data);
+
+  return menu;
+}
+
 ZMapGUIMenuItem zmapWindowNavigatorMakeMenuColumnOps(int *start_index_inout,
                                                      ZMapGUIMenuItemCallbackFunc callback_func,
                                                      gpointer callback_data)
@@ -117,11 +132,19 @@ static void navigatorColumnMenuCB(int menu_item_id, gpointer callback_data)
       {
         ZMapFeatureAny feature ;
 	ZMapWindowItemFeatureSetData set_data ;
+        FooCanvasItem *set_item = menu_data->item;
         GList *list ;
 	
         feature = (ZMapFeatureAny)g_object_get_data(G_OBJECT(menu_data->item), ITEM_FEATURE_DATA) ;
 
-	set_data = g_object_get_data(G_OBJECT(menu_data->item), ITEM_FEATURE_SET_DATA) ;
+        if(feature->struct_type == ZMAPFEATURE_STRUCT_FEATURE)
+          {
+            /* a small hack for the time being... */
+            set_item = zmapWindowContainerGetParentContainerFromItem(menu_data->item);
+            feature = feature->parent;
+          }
+
+        set_data = g_object_get_data(G_OBJECT(set_item), ITEM_FEATURE_SET_DATA) ;
 	zMapAssert(set_data) ;
 
 	list = zmapWindowFToIFindItemSetFull(menu_data->navigate->ftoi_hash, 
diff --git a/src/zmapWindow/zmapWindowNavigatorWidget.c b/src/zmapWindow/zmapWindowNavigatorWidget.c
index 1b85e3aff..408a4adf9 100755
--- a/src/zmapWindow/zmapWindowNavigatorWidget.c
+++ b/src/zmapWindow/zmapWindowNavigatorWidget.c
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Nov  6 09:28 2006 (rds)
+ * Last edited: Nov  7 16:29 2006 (rds)
  * Created: Mon Sep 18 17:18:37 2006 (rds)
- * CVS info:   $Id: zmapWindowNavigatorWidget.c,v 1.4 2006-11-06 10:44:04 rds Exp $
+ * CVS info:   $Id: zmapWindowNavigatorWidget.c,v 1.5 2006-11-08 08:31:49 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -194,11 +194,10 @@ void zmapWindowNavigatorFillWidget(GtkWidget *widget)
       double x1, x2, y1, y2;
       double border = class_data->text_height / target_pixels;
           
-      fetchScrollCoords(class_data, border, &x1, &y1, &x2, &y2);
-
       if(curr_pixels != target_pixels)
         foo_canvas_set_pixels_per_unit_xy(canvas, 1.0, target_pixels);
 
+      fetchScrollCoords(class_data, border, &x1, &y1, &x2, &y2);
       foo_canvas_set_scroll_region(canvas, x1, y1, x2, y2);
   }
 
diff --git a/src/zmapWindow/zmapWindowNavigator_P.h b/src/zmapWindow/zmapWindowNavigator_P.h
index 9b722e0bf..550dc3405 100755
--- a/src/zmapWindow/zmapWindowNavigator_P.h
+++ b/src/zmapWindow/zmapWindowNavigator_P.h
@@ -27,9 +27,9 @@
  *
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Nov  3 16:31 2006 (rds)
+ * Last edited: Nov  7 15:14 2006 (rds)
  * Created: Thu Sep  7 09:23:47 2006 (rds)
- * CVS info:   $Id: zmapWindowNavigator_P.h,v 1.2 2006-11-06 10:44:36 rds Exp $
+ * CVS info:   $Id: zmapWindowNavigator_P.h,v 1.3 2006-11-08 08:31:51 rds Exp $
  *-------------------------------------------------------------------
  */
 
@@ -116,6 +116,9 @@ typedef struct
 void zmapWindowNavigatorPositioning(ZMapWindowNavigator navigate);
 
 /* Menu prototypes... */
+ZMapGUIMenuItem zmapWindowNavigatorMakeMenuLocusOps(int *start_index_inout,
+                                                    ZMapGUIMenuItemCallbackFunc callback_func,
+                                                    gpointer callback_data);
 ZMapGUIMenuItem zmapWindowNavigatorMakeMenuColumnOps(int *start_index_inout,
                                                      ZMapGUIMenuItemCallbackFunc callback_func,
                                                      gpointer callback_data);
-- 
GitLab