From 51b45587b808f29be163d100ce08358fb6e90ca1 Mon Sep 17 00:00:00 2001
From: rnc <rnc>
Date: Mon, 28 Jun 2004 14:22:15 +0000
Subject: [PATCH] merged display code with main app, replacing graph calls with
 canvas, acedb arrays with g arrays

---
 src/zmapWindow/zmapbccol.c | 197 ++++++++++++++++++++-----------------
 1 file changed, 107 insertions(+), 90 deletions(-)

diff --git a/src/zmapWindow/zmapbccol.c b/src/zmapWindow/zmapbccol.c
index f6967b1b2..80fc61740 100755
--- a/src/zmapWindow/zmapbccol.c
+++ b/src/zmapWindow/zmapbccol.c
@@ -1,4 +1,4 @@
-/*  Last edited: Apr 15 12:46 2004 (rnc) */
+/*  Last edited: Jun 22 10:04 2004 (rnc) */
 /*  file: zmapbccol.c
  *  Author: Simon Kelley (srk@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2003
@@ -34,7 +34,8 @@
 #include <../acedb/method.h>
 #include <../acedb/bump.h>
 #include <zmapcontrol.h>
-#include <zmapcommon.h>
+#include <ZMap/zmapcommon.h>
+
 
 typedef enum { DEFAULT=0, WIDTH, OFFSET, HIST } BoxColModeType;
 
@@ -57,16 +58,17 @@ static void nbcFinalise(void *arg)
 {
   nbcPrivate *priv = (nbcPrivate *)arg;
   
-  if (priv->bump)
-    bumpDestroy(priv->bump);
+  //  if (priv->bump)
+  //    bumpDestroy(priv->bump);
 
   return;
 }
-void nbcInit(ZMapPane *pane, ZMapColumn *col)
+void nbcInit(ZMapPane pane, ZMapColumn *col)
 {
-  srMeth *meth = srMethodFromID(pane->zMapRegion, col->meth);
-  nbcPrivate *bc = handleAlloc(nbcFinalise, pane->window->handle,
-			       sizeof(nbcPrivate));
+  srMeth *meth = srMethodFromID(zMapPaneGetZMapRegion(pane), col->meth);
+  nbcPrivate *bc = (nbcPrivate*)malloc(sizeof(nbcPrivate));
+  //  nbcPrivate *bc = handleAlloc(nbcFinalise, zMapWindowGetHandle(pane->window),
+  // sizeof(nbcPrivate));
  
   col->private = bc;
 
@@ -215,8 +217,8 @@ static void nbcCalcBox (srMeth *methp, nbcPrivate *bc, float *x1p, float *x2p,
 	dx = 0.75 ;
 
       xoff = 1 ;
-      if (bc->bump)
-	bumpItem (bc->bump, 2, (y2-y1), &xoff, &y1) ;
+      //      if (bc->bump)
+      //	bumpItem (bc->bump, 2, (y2-y1), &xoff, &y1) ;
  #if 0
       else if (bc->cluster)	/* one subcolumn per key */
 	{
@@ -239,7 +241,9 @@ static void nbcCalcBox (srMeth *methp, nbcPrivate *bc, float *x1p, float *x2p,
       break ;
       
     default:
-      messcrash("Unknown bc->mode in fMapShowHomol(): %d", bc->mode) ;
+      //TODO: sort out error handling here
+      printf("Unknown bc->mode in fMapShowHomol(): %d", bc->mode) ;
+      exit;
     }
   
 
@@ -259,39 +263,50 @@ struct geneSelectData{
   int exonNumber;
 };
 
-void zMapGeneDraw(ZMapPane *pane, ZMapColumn *col, float *offset, int frame)
+void zMapGeneDraw(ZMapPane pane, ZMapColumn *col, float *offset, int frame)
 {
-  ZMapRegion *zMapRegion = pane->zMapRegion;
-  srMeth *meth = srMethodFromID(zMapRegion, col->meth);
-  int i, j;
-  int box;
-  nbcPrivate *bc = (nbcPrivate *)col->private;
-  float maxwidth = *offset;
-
+  ZMapRegion    *zMapRegion = zMapPaneGetZMapRegion(pane);
+  srMeth        *meth = srMethodFromID(zMapRegion, col->meth);
+  int            i, j;
+  int            box;
+  nbcPrivate    *bc = (nbcPrivate *)col->private;
+  float          maxwidth = *offset, width;
+  FooCanvasItem *group;
+  char           colours[30][10] = { "red", "blue", "pink", "green", "orange", "yellow", "purple", "cyan", "magenta",
+				     "red", "blue", "pink", "green", "orange", "yellow", "purple", "cyan", "magenta",
+				     "red", "blue", "pink", "green", "orange", "yellow", "purple", "cyan", "magenta" };
+				     /* I made these up.  Need to find out what meth->colour
+					equates to */
+				     
   /* temporary kludge */
   if (!zMapRegion) return;
 
-  if (meth && (meth->flags & METHOD_BUMPABLE))
-    bc->bump = bumpCreate(30, 0);
-  else
+  //  if (meth && (meth->flags & METHOD_BUMPABLE))
+  //    bc->bump = bumpCreate(30, 0);
+  //  else
     bc->bump = NULL;
 
-  for (i=0; i < arrayMax(zMapRegion->segs); i++)
+    for (i=0; i < zMapRegionGetSegs(zMapRegion)->len; i++)
       {
-	SEG *seg = arrp(zMapRegion->segs, i, SEG);
+	SEG *seg = &g_array_index(zMapRegionGetSegs(zMapRegion), SEG, i);
 	if (seg->method == col->meth &&
 	    seg->type == col->type &&
 	    zmIsOnScreen(pane, seg->x1, seg->x2))
 	  {
-	    Array exons = seg->u.transcript.exons;
-	    float e1, e2, y, x; 
+	    GArray *exons = g_array_new(FALSE, FALSE, sizeof(srExon));
+	    float e1, e2, x, y = 0;  /* y needs better default */ 
 	    int xoff = 1;
 	    struct geneSelectData *sd;
 
-	    if (bc->bump)
-	      bumpItem(bc->bump, 1, seg->x2 - seg->x1, &xoff, &y);
+	    exons = g_array_append_vals(exons,
+					&seg->u.transcript.exons, 
+					seg->u.transcript.exons.len);
+ 
+	    //	    if (bc->bump)
+	    //	      bumpItem(bc->bump, 1, seg->x2 - seg->x1, &xoff, &y);
+
+	    x = *offset + xoff + 30;
 
-	    x = *offset + xoff;
 	    if (x > maxwidth)
 	      maxwidth = x;
 	    
@@ -300,63 +315,65 @@ void zMapGeneDraw(ZMapPane *pane, ZMapColumn *col, float *offset, int frame)
 	       background on the adjoining intron obscures a little
 	       bit of the next exon. */
 
-	    for(j = 1; j <arrayMax(exons); j++)
+	    /* make a group to contain the gene */
+	    group = foo_canvas_item_new(FOO_CANVAS_GROUP(zMapPaneGetGroup(pane)),
+					foo_canvas_group_get_type(),
+					"x", (double)x,
+					"y", (double)y ,
+					NULL);
+
+	    width = meth->width * 15; /* arbitrary multiplier - needs to be rationalised */
+
+	    for (j = 1; j < exons->len; j++)
 	      { /* Intron */
 		float middle;
-		e1 = zmScreenCoord(col->pane, array(exons, j-1, srExon).x2);
-		e2 = zmScreenCoord(col->pane, array(exons, j, srExon).x1);
-		middle = 0.5 * (e1 + e2);
-		box = graphBoxStart();
-		sd = (struct geneSelectData *)
-		  halloc(sizeof(struct geneSelectData), pane->drawHandle);
-		sd->exonNumber = j;
-		sd->isIntron = TRUE;
-		sd->seg = seg;
-		zmRegBox(pane, box, col, sd);
-		graphLine(x+0.5, e1, x+0.9, middle);
-		graphLine(x+0.9, middle, x+0.5, e2);
-		graphBoxEnd();
-		graphBoxDraw(box, meth->colour, -1) ;
+
+		e1 = zmScreenCoord(col->pane, g_array_index(exons, srExon, j-1).x2);
+		e2 = zmScreenCoord(col->pane, g_array_index(exons, srExon, j  ).x1);
+		middle = (e1 + e2)/2.0;
+
+		/* TODO: if e1 < e2 then it's on the reverse strand so needs different handling */
+		if (e1 > e2); 
+		  
+		drawLine(FOO_CANVAS_GROUP(group), x+(width/2), e1, x+width, middle, colours[meth->colour], 1.0);
+		drawLine(FOO_CANVAS_GROUP(group), x+width, middle, x+(width/2), e2, colours[meth->colour], 1.0);
 	      }
 	    
-	    for (j = 0; j <arrayMax(exons); j++)
+	    for (j = 0; j <exons->len; j++)
 	      { /* exon */
-		struct geneSelectData *sd;
-		e1 = zmScreenCoord(col->pane, array(exons, j, srExon).x1);
-		e2 = zmScreenCoord(col->pane, array(exons, j, srExon).x2);
-		sd = (struct geneSelectData *)
-		  halloc(sizeof(struct geneSelectData), pane->drawHandle);
-		box = graphBoxStart();
-		sd->exonNumber = j;
-		sd->isIntron = FALSE;
-		sd->seg = seg;
-		e2 = zmScreenCoord(col->pane, array(exons, j, srExon).x2);
-		zmRegBox(pane, box, col, sd);
-		graphRectangle(x, e1, x+1, e2);
-		graphBoxEnd();
-		graphBoxDraw(box, meth->colour, -1) ;
+		e1 = zmScreenCoord(col->pane, g_array_index(exons, srExon, j).x1);
+		e2 = zmScreenCoord(col->pane, g_array_index(exons, srExon, j).x2);
+
+		/* if e1 < e2 then it's on the reverse strand so needs different handling */
+		if (e1 < e2)
+		  drawBox(group, x, e1, x+width, e2, "black", colours[meth->colour]);
+		else
+		  drawBox(group, x, e2, x+width, e1, "red", colours[meth->colour]);
 	      }
 	  }
       }
 
-  if (bc->bump) 
-    bumpDestroy (bc->bump);
+    //  if (bc->bump) 
+    //    bumpDestroy (bc->bump);
   
   *offset = maxwidth + 2.0 ;
   return;
 }
 
-void geneSelect(ZMapPane *pane, ZMapColumn *col,
+void geneSelect(ZMapPane pane, ZMapColumn *col,
 		void *arg, int box, double x, double y, BOOL isSelect)
 {
   struct geneSelectData *sd = (struct geneSelectData *)arg;
   SEG *seg = sd->seg;
-  Array exons = seg->u.transcript.exons;
+  GArray *exons = g_array_new(FALSE, FALSE, sizeof(srExon));
   Coord x1, x2;
   char *string;
-  srMeth *meth = srMethodFromID(pane->zMapRegion, col->meth);
+  srMeth *meth = srMethodFromID(zMapPaneGetZMapRegion(pane), col->meth);
   int colour = WHITE;
-  
+
+  exons = g_array_append_vals(exons, 
+			      &seg->u.transcript.exons,
+			      seg->u.transcript.exons.len);
   if (isSelect)
     {
     
@@ -364,65 +381,65 @@ void geneSelect(ZMapPane *pane, ZMapColumn *col,
       
       if (sd->isIntron)
 	{
-	  x1 = arr(exons, sd->exonNumber-1, srExon).x2 + 1 ;
-	  x2 = arr(exons, sd->exonNumber, srExon).x1 - 1 ;
+	  x1 = g_array_index(exons, srExon, sd->exonNumber-1).x2 + 1 ;
+	  x2 = g_array_index(exons, srExon, sd->exonNumber).x1 - 1 ;
 	}
       else
 	{
-	  x1 = arr(exons, sd->exonNumber, srExon).x1;
-	  x2 = arr(exons, sd->exonNumber, srExon).x2;
+	  x1 = g_array_index(exons, srExon, sd->exonNumber).x1;
+	  x2 = g_array_index(exons, srExon, sd->exonNumber).x2;
 	}
       
       string = g_strdup_printf("%s [%f] %d %d", 
 			       seg->id, seg->score, 
-			       zmVisibleCoord(pane->window, x1),
-			       zmVisibleCoord(pane->window, x2));
+			       zmVisibleCoord(zMapPaneGetZMapWindow(pane), x1),
+			       zmVisibleCoord(zMapPaneGetZMapWindow(pane), x2));
       
-      gtk_entry_set_text(GTK_ENTRY(pane->window->infoSpace), string);
+      //      gtk_entry_set_text(GTK_ENTRY(pane->window->infoSpace), string);
       g_free(string);
     }
   
-  graphBoxDraw(box, meth->colour, colour);
+  //  graphBoxDraw(box, meth->colour, colour);
 
   return;
 }
 
-void zMapFeatureColumn(ZMapPane *pane, ZMapColumn *col, float *offset, int frame)
+void zMapFeatureColumn(ZMapPane  pane, ZMapColumn *col, float *offset, int frame)
 {
-  ZMapRegion *zMapRegion = pane->zMapRegion;
+  ZMapRegion *zMapRegion = zMapPaneGetZMapRegion(pane);
   srMeth *meth = srMethodFromID(zMapRegion, col->meth);
   int i;
   nbcPrivate *bc = (nbcPrivate *)col->private;
   float maxwidth = *offset;
-  if (meth->flags & METHOD_BUMPABLE)
-    bc->bump = bumpCreate(30, 0);
-  else
+  //  if (meth->flags & METHOD_BUMPABLE)
+  //    bc->bump = bumpCreate(30, 0);
+  //  else
     bc->bump = NULL;
 
-  for (i=0; i < arrayMax(zMapRegion->segs); i++)
+    for (i=0; i < zMapRegionGetSegs(zMapRegion)->len; i++)
       {
-	SEG *seg = arrp(zMapRegion->segs, i, SEG);
+	SEG *seg = &g_array_index(zMapRegionGetSegs(zMapRegion), SEG, i);
 	if (seg->method == col->meth &&
 	    seg->type == col->type &&
 	    zmIsOnScreen(pane, seg->x1, seg->x2))
 	  {
-	    int box =  graphBoxStart();
+	    int box =  0; //graphBoxStart();
 	    float y1, y2, x1, x2;
 	    y1 = zmScreenCoord(col->pane, seg->x1);
 	    y2 = zmScreenCoord(col->pane, seg->x2+1) ;
 	    x1 = *offset;
 	    nbcCalcBox(meth, bc, &x1, &x2, &y1, &y2, seg->score);
-	    graphRectangle(x1, y1, x2, y2);
-	    graphBoxEnd();
-	    graphBoxDraw (box, BLACK, meth->colour) ;
+	    //	    graphRectangle(x1, y1, x2, y2);
+	    //	    graphBoxEnd();
+	    //	    graphBoxDraw (box, BLACK, meth->colour) ;
 	    zmRegBox(pane, box, col, seg);
 	    if (x2 > maxwidth)
 	      maxwidth = x2;
 	  }
       }
 
-  if (bc->bump) 
-    bumpDestroy (bc->bump);
+  //  if (bc->bump) 
+  //    bumpDestroy (bc->bump);
   
   *offset = maxwidth + 0.5 ;
   return;
@@ -430,16 +447,16 @@ void zMapFeatureColumn(ZMapPane *pane, ZMapColumn *col, float *offset, int frame
 
 
 
-void nbcSelect(ZMapPane *pane, ZMapColumn *col,
+void nbcSelect(ZMapPane pane, ZMapColumn *col,
 	     void *arg, int box, double x, double y, BOOL isSelect)
 {
   SEG *seg = (SEG *)arg;
   char *string = g_strdup_printf("%s [%f] %d %d", 
 				 seg->id, seg->score, 
-				 zmVisibleCoord(pane->window, seg->x1),
-				 zmVisibleCoord(pane->window, seg->x2));
+				 zmVisibleCoord(zMapPaneGetZMapWindow(pane), seg->x1),
+				 zmVisibleCoord(zMapPaneGetZMapWindow(pane), seg->x2));
 
-  gtk_entry_set_text(GTK_ENTRY(pane->window->infoSpace), string);
+  //  gtk_entry_set_text(GTK_ENTRY(pane->window->infoSpace), string);
   g_free(string);
   return;
 }
-- 
GitLab