From 2b35d09c7e7bb7c670013619efc251339a2f3bb5 Mon Sep 17 00:00:00 2001
From: rnc <rnc>
Date: Mon, 28 Jun 2004 14:23:55 +0000
Subject: [PATCH] merged display code with main app, functions to access
 private members, g arrays instead of acedb arrays

---
 src/zmapWindow/zmapWindow.c   | 604 ++++++++++++++++++++++++-
 src/zmapWindow/zmapWindow_P.h |  52 ++-
 src/zmapWindow/zmapcalls.c    | 103 +++--
 src/zmapWindow/zmapcols.c     | 189 +++++---
 src/zmapWindow/zmapcontrol.c  | 798 +++++++++++-----------------------
 src/zmapWindow/zmapcontrol.h  | 169 ++-----
 src/zmapWindow/zmapsplit.c    | 151 ++++---
 src/zmapWindow/zmapsplit.h    |   5 +-
 8 files changed, 1222 insertions(+), 849 deletions(-)

diff --git a/src/zmapWindow/zmapWindow.c b/src/zmapWindow/zmapWindow.c
index 80c33faa5..56c63e398 100755
--- a/src/zmapWindow/zmapWindow.c
+++ b/src/zmapWindow/zmapWindow.c
@@ -28,17 +28,20 @@
  *              
  * Exported functions: See ZMap/zmapWindow.h
  * HISTORY:
- * Last edited: Jun 25 14:28 2004 (edgrif)
+ * Last edited: Jun 28 15:08 2004 (rnc)
  * Created: Thu Jul 24 14:36:27 2003 (edgrif)
- * CVS info:   $Id: zmapWindow.c,v 1.10 2004-06-25 13:42:26 edgrif Exp $
+ * CVS info:   $Id: zmapWindow.c,v 1.11 2004-06-28 14:28:19 rnc Exp $
  *-------------------------------------------------------------------
  */
 
 #include <string.h>
+#include <../acedb/regular.h>
 #include <ZMap/zmapUtils.h>
+#include <ZMap/zmapcommon.h>
 #include <zmapWindow_P.h>
 
 
+
 static void dataEventCB(GtkWidget *widget, GdkEventClient *event, gpointer data) ;
 
 
@@ -259,3 +262,600 @@ static void dataEventCB(GtkWidget *widget, GdkEventClient *event, gpointer cb_da
 }
 #endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
 
+
+ZMapWindow zMapWindowCreateZMapWindow(void)
+{
+  ZMapWindow window = (ZMapWindow)malloc(sizeof(ZMapWindowStruct));
+  return window;
+}
+
+
+STORE_HANDLE zMapWindowGetHandle(ZMapWindow window)
+{
+  return window->handle;
+}
+
+
+void zMapWindowSetHandle(ZMapWindow window)
+{
+  //  window->handle = handleCreate();
+  window->handle = NULL;
+  return;
+}
+
+
+void zMapWindowCreateRegion(ZMapWindow window)
+{
+  window->focuspane->zMapRegion = (ZMapRegion*)malloc(sizeof(ZMapRegion));
+  return;
+}
+
+
+GNode *zMapWindowGetPanesTree(ZMapWindow window)
+{
+  return window->panesTree;
+}
+
+void zMapWindowSetPanesTree(ZMapWindow window, GNode *node)
+{
+  window->panesTree = node;
+  return;
+}
+
+BOOL zMapWindowGetFirstTime(ZMapWindow window)
+{
+  return window->firstTime;
+}
+
+void zMapWindowSetFirstTime(ZMapWindow window, BOOL value)
+{
+  window->firstTime = value;
+  return;
+}
+
+ZMapPane zMapWindowGetFocuspane(ZMapWindow window)
+{
+  return window->focuspane;
+}
+
+void zMapWindowSetFocuspane(ZMapWindow window, ZMapPane pane)
+{
+  window->focuspane = pane;
+  return;
+}
+
+int zMapWindowGetHeight(ZMapWindow window)
+{
+  return window->focuspane->graphHeight;
+}
+
+int zMapWindowGetRegionLength(ZMapWindow window)
+{
+  return window->focuspane->zMapRegion->length;
+}
+
+Coord zMapWindowGetRegionArea(ZMapWindow window, int num)
+{
+  if (num == 1)
+    return window->focuspane->zMapRegion->area1;
+  else
+    return window->focuspane->zMapRegion->area2;
+}
+
+void zMapWindowSetRegionArea(ZMapWindow window, Coord area, int num)
+{
+  if (num == 1)
+    window->focuspane->zMapRegion->area1 = area;
+  else
+    window->focuspane->zMapRegion->area2 = area;
+
+return;
+}
+
+BOOL zMapWindowGetRegionReverse(ZMapWindow window)
+{
+  return window->focuspane->zMapRegion->rootIsReverse;
+}
+
+
+GtkWidget *zMapWindowGetHbox(ZMapWindow window)
+{
+  return window->hbox;
+}
+
+
+void zMapWindowSetHbox(ZMapWindow window, GtkWidget *hbox)
+{
+  window->hbox = hbox;
+  return;
+}
+
+GtkWidget *zMapWindowGetHpane(ZMapWindow window)
+{
+  return window->hpane;
+}
+
+void zMapWindowSetHpane(ZMapWindow window, GtkWidget *hpane)
+{
+  window->hpane = hpane;
+  return;
+}
+
+GtkWidget *zMapWindowGetFrame(ZMapWindow window)
+{
+  return window->frame;
+}
+
+void zMapWindowSetFrame(ZMapWindow window, GtkWidget *frame)
+{
+  window->frame = frame;
+  return;
+}
+
+
+GtkWidget *zMapWindowGetVbox(ZMapWindow window)
+{
+  return window->vbox;
+}
+
+
+void zMapWindowSetVbox(ZMapWindow window, GtkWidget *vbox)
+{
+  window->vbox = vbox;
+  return;
+}
+
+
+void zMapWindowSetBorderWidth(GtkWidget *container, int width)
+{
+  gtk_container_border_width(GTK_CONTAINER(container), width);
+  return;
+}
+
+
+GtkWidget *zMapWindowGetNavigator(ZMapWindow window)
+{
+  return window->navigator;
+}
+
+
+void zMapWindowSetNavigator(ZMapWindow window, GtkWidget *navigator)
+{
+  window->navigator = navigator;
+  return;
+}
+
+FooCanvas *zMapWindowGetNavCanvas(ZMapWindow window)
+{
+  return window->navcanvas;
+}
+
+
+void zMapWindowSetNavCanvas(ZMapWindow window, FooCanvas *navcanvas)
+{
+  window->navcanvas = navcanvas;
+  return;
+}
+
+GtkWidget *zMapWindowGetZoomVbox(ZMapWindow window)
+{
+  return window->zoomvbox;
+}
+
+
+void zMapWindowSetZoomVbox(ZMapWindow window, GtkWidget *vbox)
+{
+  window->zoomvbox = vbox;
+  return;
+}
+
+
+ScreenCoord zMapWindowGetScaleOffset(ZMapWindow window)
+{
+  return window->scaleOffset;
+}
+
+
+void zMapWindowSetScaleOffset(ZMapWindow window, ScreenCoord offset)
+{
+  window->scaleOffset = offset;
+  return;
+}
+
+
+Coord zMapWindowGetCoord(ZMapWindow window, char *field)
+{
+  if (field == "s")
+    return window->navStart;
+  else
+    return window->navEnd;
+}
+
+void zMapWindowSetCoord(ZMapWindow window, char *field, int size)
+{
+  if (field == "s")
+    window->navStart = window->focuspane->zMapRegion->area1 - size;
+  else
+    window->navEnd = window->focuspane->zMapRegion->area2 + size;
+
+  if (window->navStart == window->navEnd)
+    window->navEnd = window->navStart + 1;
+
+  return;
+}
+
+
+ScreenCoord zMapWindowGetScreenCoord1(ZMapWindow window, int height)
+{
+  return zMapWindowGetScreenCoord(window, window->focuspane->zMapRegion->area1, height);
+}
+
+
+ScreenCoord zMapWindowGetScreenCoord2(ZMapWindow window, int height)
+{
+  return zMapWindowGetScreenCoord(window, window->focuspane->zMapRegion->area2, height);
+}
+
+ScreenCoord zMapWindowGetScreenCoord(ZMapWindow window, Coord coord, int height)
+{
+  return height * (coord - window->navStart) / (window->navEnd - window->navStart);
+}
+
+
+int zMapWindowGetRegionSize (ZMapWindow window)
+{
+  return window->focuspane->zMapRegion->area2 - window->focuspane->zMapRegion->area1;
+}
+
+
+InvarCoord zMapWindowGetOrigin(ZMapWindow window)
+{
+  return window->origin;
+}
+
+
+// ZMapRegion functions
+
+GPtrArray *zMapRegionNewMethods(ZMapRegion *region)
+{
+  return region->methods = g_ptr_array_new();
+}
+
+GPtrArray *zMapRegionGetMethods(ZMapRegion *region)
+{
+  return region->methods;
+}
+
+GPtrArray *zMapRegionGetOldMethods(ZMapRegion *region)
+{
+  return region->oldMethods;
+}
+
+void zMapRegionFreeMethods(ZMapRegion *region)
+{
+  g_ptr_array_free(region->methods, TRUE);
+  return;
+}
+
+void zMapRegionFreeOldMethods(ZMapRegion *region)
+{
+  g_ptr_array_free(region->oldMethods, TRUE);
+  return;
+}
+
+GArray *zMapRegionNewSegs(ZMapRegion *region)
+{
+  return region->segs = g_array_new(FALSE, FALSE, sizeof(SEG));
+}
+
+GArray *zMapRegionGetSegs(ZMapRegion *region)
+{
+  return region->segs;
+}
+
+void zMapRegionFreeSegs(ZMapRegion *region)
+{
+  free(region->segs);
+  return;
+}
+
+
+GArray *zMapRegionGetDNA(ZMapRegion *region)
+{
+  return region->dna;
+}
+
+void zMapRegionFreeDNA(ZMapRegion *region)
+{
+  g_array_free(region->dna, TRUE);
+  return;
+}
+
+
+// ZMapPane functions
+
+GArray *zMapPaneNewBox2Col(ZMapPane pane, int elements)
+{
+  pane->box2col = g_array_sized_new(FALSE, TRUE, sizeof(ZMapColumn), elements);
+}
+
+
+
+GArray *zMapPaneSetBox2Col(ZMapPane pane, ZMapColumn *col, int index)
+{
+  return g_array_insert_val(pane->box2col, index, col);
+}
+
+ZMapColumn *zMapPaneGetBox2Col(ZMapPane pane, int index)
+{
+  return &g_array_index(pane->box2col, ZMapColumn, index);
+}
+
+
+void zMapPaneFreeBox2Col(ZMapPane pane)
+{
+  if (pane->box2col)
+    g_array_free(pane->box2col, TRUE);
+  return;
+}
+
+
+GArray *zMapPaneNewBox2Seg(ZMapPane pane, int elements)
+{
+  pane->box2seg = g_array_sized_new(FALSE, TRUE, sizeof(SEG), elements);
+}
+
+GArray *zMapPaneSetBox2Seg(ZMapPane pane, ZMapColumn *seg, int index)
+{
+  return g_array_insert_val(pane->box2seg, index, seg);
+}
+
+SEG *zMapPaneGetBox2Seg(ZMapPane pane, int index)
+{
+  return &g_array_index(pane->box2seg, SEG, index);
+}
+
+void zMapPaneFreeBox2Seg(ZMapPane pane)
+{
+  if (pane->box2seg)
+    g_array_free(pane->box2seg, TRUE);
+  return;
+}
+
+
+ZMapRegion *zMapPaneGetZMapRegion(ZMapPane pane)
+{
+  return pane->zMapRegion;
+}
+
+
+FooCanvasItem *zMapPaneGetGroup(ZMapPane pane)
+{
+  return pane->group;
+}
+
+
+ZMapWindow zMapPaneGetZMapWindow(ZMapPane pane)
+{
+  return pane->window;
+}
+
+FooCanvas *zMapPaneGetCanvas(ZMapPane pane)
+{
+  return pane->canvas;
+}
+
+GPtrArray *zMapPaneGetCols(ZMapPane pane)
+{
+  return &pane->cols;
+}
+
+
+int          zMapPaneGetDNAwidth       (ZMapPane pane)
+{
+  return pane->DNAwidth;
+}
+
+
+void zMapPaneSetDNAwidth       (ZMapPane pane, int width)
+{
+  pane->DNAwidth = 100;
+  return;
+}
+
+void zMapPaneSetStepInc        (ZMapPane pane, int incr)
+{
+  pane->step_increment = incr;
+  return;
+}
+
+
+int zMapPaneGetHeight(ZMapPane pane)
+{
+  return pane->graphHeight;
+}
+
+InvarCoord zMapPaneGetCentre(ZMapPane pane)
+{
+  return pane->centre;
+}
+
+
+float zMapPaneGetBPL (ZMapPane pane)
+{
+  return pane->basesPerLine;
+}
+
+
+/* addPane is called each time we add a new pane. Creates a new frame, scrolled
+ * window and canvas.  First time through it sticks them in the window->zoomvbox, 
+ * thereafter it packs them into the lower part of the focus pane.
+ *
+ * Splitting goes like this: we make a (h or v) pane, add a new frame to the child1 
+ * position of that, then reparent the scrolled window containing the canvas into 
+ * the new frame. That's the shrinkPane() function. 
+ * Then in addPane we add a new frame in the child2 position, and into that we
+ * load a new scrolled window and canvas. 
+*/
+void addPane(ZMapWindow window, char orientation)
+{
+  ZMapPane pane = (ZMapPane)malloc(sizeof(ZMapPaneStruct));
+  GtkAdjustment *adj; 
+  GtkWidget *w;
+  GNode *node = NULL;
+
+  /* set up ZMapPane for this window */
+  pane->window = window;
+  pane->DNAwidth = 100;
+  pane->step_increment = 10;
+
+  /* create the bare graph & convert to a widget */
+  /*    pane->graph = graphNakedCreate(TEXT_FIT, "", 20, 100, TRUE);
+	pane->graphWidget = gexGraph2Widget(pane->graph);*/
+  
+  //  pane->cols = arrayHandleCreate(50, ZMapColumn, zMapWindowGetHandle(window));
+  //  pane->cols = arrayCreate(50, ZMapColumn);
+  pane->box2col = g_array_sized_new(FALSE, TRUE, sizeof(ZMapColumn), 50);
+  //  pane->box2col        = NULL;
+  //  pane->box2seg        = NULL;
+  //  pane->drawHandle     = NULL;
+  pane->frame          = gtk_frame_new(NULL);
+  pane->scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
+
+  /* The idea of the GNode tree is that panes split horizontally, ie
+   * one above the other, end up as siblings in the tree, while panes
+   * split vertically (side by side) are parents/children.  In theory
+   * this enables us to get the sizing right. In practice it's not
+   * perfect yet.*/
+  if (zMapWindowGetFirstTime(window)) 
+    { 
+      pane->zoomFactor   = 1;
+      g_node_append_data(zMapWindowGetPanesTree(window), pane);
+    }
+  else
+    {
+      pane->zoomFactor   = zMapWindowGetFocuspane(window)->zoomFactor;
+      node = g_node_find (zMapWindowGetPanesTree(window),
+			  G_IN_ORDER,
+			  G_TRAVERSE_ALL,
+			  zMapWindowGetFocuspane(window));
+      if (orientation == 'h')
+	  g_node_append_data(node->parent, pane);
+      else
+	  g_node_append_data(node, pane);
+    }
+
+  /* draw the canvas */
+  gdk_rgb_init();
+  w = foo_canvas_new();
+
+  pane->canvas = FOO_CANVAS(w);
+  foo_canvas_set_scroll_region(pane->canvas, 0.0, 0.0, 1000, 1000);
+  pane->background = foo_canvas_item_new(foo_canvas_root(pane->canvas),
+	 		foo_canvas_rect_get_type(),
+			"x1",(double)0,
+			"y1",(double)0,
+			"x2",(double)1000,
+			"y2",(double)1000,
+		 	"fill_color", "white",
+			"outline_color", "dark gray",
+			NULL);
+  
+  /* when the user clicks a button in the view, call recordFocus() */
+  g_signal_connect (GTK_OBJECT (pane->canvas), "button_press_event",
+		    GTK_SIGNAL_FUNC (recordFocus), pane);
+
+  pane->group = foo_canvas_item_new(foo_canvas_root(pane->canvas),
+                        foo_canvas_group_get_type(),
+                        "x", (double)100,
+                        "y", (double)100 ,
+                        NULL);
+
+  /* add the canvas to the scrolled window */
+  gtk_container_add(GTK_CONTAINER(pane->scrolledWindow),w);
+
+  /* you have to set the step_increment manually or the scrollbar arrows don't work.*/
+  /* Using a member of ZMapPane means I can adjust it if necessary when we zoom. */
+  GTK_LAYOUT (w)->vadjustment->step_increment = pane->step_increment;
+  GTK_LAYOUT (w)->hadjustment->step_increment = pane->step_increment;
+
+  /* add the scrolled window to the frame */
+  gtk_container_add(GTK_CONTAINER(pane->frame),pane->scrolledWindow);
+
+  /* First time through, we add the frame to the main vbox. 
+   * Subsequently it goes in the lower half of the current pane. */
+  if (zMapWindowGetFirstTime(window))
+    gtk_box_pack_start(GTK_BOX(zMapWindowGetZoomVbox(window)), pane->frame, TRUE, TRUE, 0);
+  else
+    gtk_paned_pack2(GTK_PANED(zMapWindowGetFocuspane(window)->pane), pane->frame, TRUE, TRUE);
+
+
+  /* always show scrollbars, however big the display */
+  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pane->scrolledWindow),
+       GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
+
+  adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pane->scrolledWindow)); 
+
+  //  g_signal_connect(GTK_OBJECT(adj), "value_changed", GTK_SIGNAL_FUNC(navUpdate), (gpointer)(pane));
+  //  g_signal_connect(GTK_OBJECT(adj), "changed", GTK_SIGNAL_FUNC(navChange), (gpointer)(pane)); 
+
+  /* focus on the new pane */
+  recordFocus(NULL, NULL, pane);
+  gtk_widget_grab_focus(pane->frame);
+
+  /* if we do this first time, a little blank box appears before the main display */
+  if (!zMapWindowGetFirstTime(window)) 
+    gtk_widget_show_all (zMapWindowGetFrame(window));
+
+  zMapWindowSetFirstTime(window, FALSE);
+
+  zmMainScale(pane->canvas, 30, 0, 1000);
+  return;
+}
+
+
+void drawNavigatorWind(ZMapPane pane)
+{
+  ZMapWindow window = pane->window;
+  int height;
+  Coord startWind, endWind;
+  ScreenCoord startWindf, endWindf, lenWindf;
+  ScreenCoord startScreenf, endScreenf;
+  ScreenCoord pos;
+  GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pane->scrolledWindow));
+
+
+  //  graphFitBounds(NULL, &height);
+  
+  startWind =  zmCoordFromScreen(pane, 0);
+  endWind   =  zmCoordFromScreen(pane, pane->graphHeight);
+  
+  startWindf = zMapWindowGetScreenCoord(window, startWind, height);
+  endWindf   = zMapWindowGetScreenCoord(window, endWind, height);
+  lenWindf   = endWindf - startWindf;
+  
+  startScreenf = startWindf + lenWindf * (adj->value - adj->lower)/(adj->upper - adj->lower) ;
+  endScreenf   = startWindf + lenWindf * (adj->page_size + adj->value - adj->lower)/(adj->upper - adj->lower) ;
+  
+  //  graphColor(BLACK);
+  
+  if (pane == window->focuspane)
+    pos = zMapWindowGetScaleOffset(window);
+  else
+    pos = zMapWindowGetScaleOffset(window);
+
+  /* for now we'll not actually draw anything */
+  //  pane->dragBox = graphBoxStart();
+  //  graphLine(pos, startWindf, pos, endWindf);
+  //  pane->scrollBox = graphBoxStart();
+  //  graphColor(GREEN);
+  //  graphFillRectangle(pos - 0.3, startScreenf, pos + 0.5, endScreenf);
+  //  graphBoxEnd();
+  //  graphBoxSetPick(pane->scrollBox, FALSE);
+  //  graphBoxEnd();
+  //  graphBoxDraw(pane->dragBox, -1, LIGHTGRAY);
+
+  return;
+}
+
+/****************** end of file ************************************/
diff --git a/src/zmapWindow/zmapWindow_P.h b/src/zmapWindow/zmapWindow_P.h
index a5b7fc9e0..76695d4b3 100755
--- a/src/zmapWindow/zmapWindow_P.h
+++ b/src/zmapWindow/zmapWindow_P.h
@@ -26,9 +26,9 @@
  * Description: 
  * Exported functions: See XXXXXXXXXXXXX.h
  * HISTORY:
- * Last edited: Jun 25 12:11 2004 (edgrif)
+ * Last edited: Jun 28 15:09 2004 (rnc)
  * Created: Fri Aug  1 16:45:58 2003 (edgrif)
- * CVS info:   $Id: zmapWindow_P.h,v 1.7 2004-06-25 13:42:26 edgrif Exp $
+ * CVS info:   $Id: zmapWindow_P.h,v 1.8 2004-06-28 14:28:26 rnc Exp $
  *-------------------------------------------------------------------
  */
 #ifndef ZMAP_WINDOW_P_H
@@ -41,7 +41,6 @@
 /* Test scaffoling */
 #include <ZMap/zmapFeature.h>
 
-
 typedef struct _ZMapWindowStruct
 {
   gchar *sequence ;
@@ -55,9 +54,54 @@ typedef struct _ZMapWindowStruct
   zmapVoidIntCallbackFunc app_routine ;
   void *app_data ;
 
+  STORE_HANDLE    handle;
+  GtkWidget      *frame;
+  GtkWidget      *vbox;
+  GtkItemFactory *itemFactory;
+  GtkWidget      *infoSpace;
+  GtkWidget      *navigator;
+  FooCanvas      *navcanvas;
+  InvarCoord      origin; /* that base which is VisibleCoord 1 */
+  GtkWidget      *zoomvbox;
+  GtkWidget      *toolbar;
+  GtkWidget      *hbox;
+  GtkWidget      *hpane;  /* allows the user to minimise the navigator pane */
+  GNode          *panesTree;
+  ZMapPane        focuspane;
+  BOOL            firstTime;
+  /* navigator stuff */
+  Coord           navStart, navEnd; /* Start drawing the Nav bar from here */
+  ScreenCoord     scaleOffset;
 } ZMapWindowStruct ;
 
 
+typedef struct _ZMapPaneStruct {
+  /* Data associated with one scrolling pane. */
+  ZMapWindow   window;     /* parent */
+  ZMapRegion  *zMapRegion; /* the region holding all the SEGS */
+  Graph        graph;
+  GtkWidget   *graphWidget;
+  GtkWidget   *vbox;
+  GtkWidget   *pane;
+  GtkWidget   *frame;
+  GtkWidget   *scrolledWindow;
+  FooCanvas   *canvas;     /* where we paint the display */
+  FooCanvasItem *background;
+  FooCanvasItem *group;
+  GtkWidget   *combo;
+  int          basesPerLine;
+  InvarCoord   centre;
+  int          graphHeight;
+  int          dragBox, scrollBox;
+  GPtrArray    cols;
+  GArray       *box2seg, *box2col;
+  STORE_HANDLE drawHandle; /* gets freed on each redraw. */
+  int          DNAwidth;
+  double       zoomFactor;
+  int          step_increment;
+} ZMapPaneStruct;
+
+
 typedef struct
 {
   ZMapWindow window ;
@@ -66,8 +110,6 @@ typedef struct
 
 
 
-
-
 /* Used in our event communication.... */
 #define ZMAP_ATOM  "ZMap_Atom"
 
diff --git a/src/zmapWindow/zmapcalls.c b/src/zmapWindow/zmapcalls.c
index e8e671e99..18417af9a 100755
--- a/src/zmapWindow/zmapcalls.c
+++ b/src/zmapWindow/zmapcalls.c
@@ -1,4 +1,4 @@
-/*  Last edited: Jan 30 11:34 2004 (rnc) */
+/*  Last edited: Jun 23 13:38 2004 (rnc) */
 /*  file: zmapcalls.c
  *  Author: Rob Clack (rnc@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2003
@@ -25,13 +25,13 @@
  *	Simon Kelley (Sanger Institute, UK) srk@sanger.ac.uk
  */
 
-#include <wzmap/zmapcalls.h>
+#include <zmapcalls.h>
 
 
 /* function prototypes ********************************************/
 
 static methodID srMethCreate  (SeqRegion *region, char *methodName);
-static srMeth  *srMethFromName(Array methods    , char *methodName);
+static srMeth  *srMethFromName(GPtrArray *methods, char *methodName);
 static methodID srMethodMake  (SeqRegion *region, char *methodName);
 
 void srActivate(void *seqRegion, 
@@ -62,7 +62,8 @@ BOOL zMapDisplay(Activate_cb srActivate,
 BOOL zMapCall(KEY key, KEY from, BOOL isOldGraph, void *app_data)
  {
   BOOL ret;
-  STORE_HANDLE handle = handleCreate();
+  //  STORE_HANDLE handle = handleCreate();
+  STORE_HANDLE handle = NULL;
   SeqRegion *region = halloc(sizeof(SeqRegion), handle);
 
   char *keyspec = messalloc(strlen(className(key)) + strlen(name(key)) + 2);
@@ -88,11 +89,12 @@ static methodID srMethodMake(SeqRegion *region, char *methodName)
 {
   srMeth *meth;
 
-  if ((meth = srMethFromName(region->zMapRegion->methods, methodName)))
+  if ((meth = srMethFromName(zMapRegionGetMethods(region->zMapRegion), methodName)))
     return meth->id;
-  else if ((meth = srMethFromName(region->zMapRegion->oldMethods, methodName)))
+  else if ((meth = srMethFromName(zMapRegionGetOldMethods(region->zMapRegion), methodName)))
     {
-      srMeth *new = arrayp(region->zMapRegion->methods, arrayMax(region->zMapRegion->methods), srMeth);
+      srMeth *new = g_ptr_array_index(zMapRegionGetMethods(region->zMapRegion),  
+				  zMapRegionGetMethods(region->zMapRegion)->len);
       *new = *meth;
       return new->id;
     }
@@ -105,14 +107,14 @@ static methodID srMethodMake(SeqRegion *region, char *methodName)
 /* Retrieves the method structure from the methods array, based
  * on the methodName which it recieves. */
 
-static srMeth *srMethFromName(Array methods, char *methodName)
+static srMeth *srMethFromName(GPtrArray *methods, char *methodName)
 {
   int i;
   
   if (methods)
-    for (i=0; i<arrayMax(methods); i++)
+    for (i=0; i<methods->len; i++)
       {
-	srMeth *meth = arrp(methods, i, srMeth);
+	srMeth *meth = g_ptr_array_index(methods, i);
 	if (meth->name == methodName)
 	  return meth;
       }
@@ -137,7 +139,8 @@ static methodID srMethCreate(SeqRegion *region, char *methodName)
   if (!(obj = bsCreate (methodKey))) 
     return 0;
   
-  meth = arrayp(region->zMapRegion->methods, arrayMax(region->zMapRegion->methods), srMeth);
+  meth = g_ptr_array_index(zMapRegionGetMethods(region->zMapRegion),
+			   zMapRegionGetMethods(region->zMapRegion)->len);
   meth->id = region->idc++;
   meth->name = str2p(name(methodKey), region->bucket);
   meth->flags &= ~METHOD_CALCULATED ;/* unset flag */
@@ -235,13 +238,16 @@ static methodID srMethCreate(SeqRegion *region, char *methodName)
 
 void seqRegionConvert(SeqRegion *region)
 {
-  STORE_HANDLE localHandle = handleCreate();
+  //  STORE_HANDLE localHandle = handleCreate();
+  STORE_HANDLE localHandle = NULL;
   KEYSET allKeys = sMapKeys(region->smap, localHandle);
   int i;
-  Array units = arrayHandleCreate(256, BSunit, localHandle);
+  GArray *units = g_array_new(FALSE, TRUE, 256);
+
+  zMapRegionFreeSegs(region->zMapRegion);
+  zMapRegionNewSegs(region->zMapRegion);
+  zMapRegionNewMethods(region->zMapRegion);
 
-  region->zMapRegion->segs = arrayReCreate(region->zMapRegion->segs, 1000, SEG);
-  region->zMapRegion->methods = arrayCreate(100, srMeth);
 
   for (i = 0 ; i < keySetMax(allKeys) ; i++)
     {
@@ -259,7 +265,7 @@ void seqRegionConvert(SeqRegion *region)
 	  srPhase phase = 1;
 	  BOOL isStartNotFound = FALSE;
 	  BOOL isCDS = FALSE;
-	  Array exons = NULL;
+	  GArray *exons;
 	  
 	  methodName = messalloc(strlen(name(methodKey))); /* need to remember to free this? */
       	  methodName = str2p(name(methodKey), region->bucket);
@@ -270,22 +276,26 @@ void seqRegionConvert(SeqRegion *region)
 	      bsGetData(obj, _bsRight, _Int, &phase);
 	    }
 	  
-	  if (bsFindTag(obj, str2tag("Source_Exons")) &&
+	  /* Commenting this block out so I don't have to retrofit
+	  ** a bsFlatten-equivalent.  Don't think this code will make
+	  ** it into the end result anyway. 
+	    if (bsFindTag(obj, str2tag("Source_Exons")) &&
 	      (bsFlatten (obj, 2, units)))
 	    {
 	      int j;	      type = SR_TRANSCRIPT;
 	      sMapUnsplicedMap(info, 1, 0, &x1, &x2, NULL, NULL);
 	      dnaExonsSort (units) ;
 	      
-	      exons = arrayHandleCreate(20, srExon, region->handle); 
-	      for(j = 0; j < arrayMax(units); j += 2)
+	      exons = g_array_new(FALSE, TRUE, sizeof(srExon), 20); 
+	      for(j = 0; j < units->len; j += 2)
 		{
-		  srExon *e = arrayp(exons, arrayMax(exons), srExon);
+		  srExon *e = g_array_index(exons, srExon, exons->len);
 		  sMapUnsplicedMap(info, 
-				   arr(units, j, BSunit).i, arr(units, j+1, BSunit).i,
+				   g_ptr_array_index(units, BSunit, j).i, 
+				   g_ptr_array_index(units, BSunit, j+1).i,
 				   &e->x1, &e->x2, NULL, NULL);
 		}	      
-	    }
+		}  */
 	  else
 	    sMapMap(info, 1, 0, &x1, &x2, NULL, NULL);
 	  
@@ -306,13 +316,14 @@ void seqRegionConvert(SeqRegion *region)
 	      /* If no source exons, fake one up which covers the whole of the CDS. */
 	      if (!exons)
 		{ 
-		  exons = arrayHandleCreate(1, srExon, region->handle); 
-		  array(exons, 0, srExon).x1 = cdsStart;
-		  array(exons, 0, srExon).x2 = cdsEnd;
+		  exons = g_array_new(FALSE, TRUE, 1); 
+		  g_array_insert_val(exons, 0, cdsStart);
+		  g_array_insert_val(exons, 0, cdsEnd);
 		}
 	    }
 	  
-	  seg = arrayp(region->zMapRegion->segs, arrayMax(region->zMapRegion->segs), SEG);
+	  seg = &g_array_index(zMapRegionGetSegs(region->zMapRegion), SEG, 
+			      zMapRegionGetSegs(region->zMapRegion)->len);
 	  seg->id = str2p(name(key), region->bucket);
 	  seg->type = type;
 	  seg->x1 = x1;
@@ -333,17 +344,20 @@ void seqRegionConvert(SeqRegion *region)
 	      
 	      seg->u.transcript.cdsStart = cdsStart;
 	      seg->u.transcript.cdsEnd = cdsEnd;
-	      seg->u.transcript.exons = exons;
+	      //	      seg->u.transcript.exons = exons;
 	    }
-			  
+		
+	  /* commentint this block out so I don't have to write a
+	  ** bsFlatten-equivalent.  Don't think this code will make
+	  ** it to the final version.	  
 	  if (bsFindTag(obj, str2tag("Feature")) &&
 	      bsFlatten (obj, 5, units))
 	    {
 	      int j ;
 	      
-	      for (j = 0 ; j < arrayMax(units) ; j += 5)
+	      for (j = 0 ; j < units->len ; j += 5)
 		{ 
-		  BSunit *u = arrayp(units, j, BSunit);
+		  BSunit *u = g_ptr_array_index(units, BSunit, j);
 		  SEG *seg;
 		  SMapStatus status ;
 		  
@@ -351,7 +365,7 @@ void seqRegionConvert(SeqRegion *region)
 		  if (status & SMAP_STATUS_NO_OVERLAP)
 		    continue;
 		  
-		  seg = arrayp(region->zMapRegion->segs, arrayMax(region->zMapRegion->segs), SEG);
+		  seg = g_ptr_array_index(region->zMapRegion->segs, SEG, region->zMapRegion->segs->len);
 		  seg->id = str2p(name(u[0].k), region->bucket);
 		  seg->type = SR_FEATURE;
 		  seg->x1 = x1;
@@ -360,6 +374,7 @@ void seqRegionConvert(SeqRegion *region)
 		  seg->method = srMethodMake(region, str2p(name(u[0].k), region->bucket));
 		}
 	    }
+	  */
 	  if (bsFindTag(obj, str2tag("Homol")))
 	    {
 	      
@@ -372,7 +387,7 @@ void seqRegionConvert(SeqRegion *region)
       bsDestroy(obj);
 	
     }
-  handleDestroy(localHandle);
+  //  handleDestroy(localHandle);
 }
 
 
@@ -393,7 +408,8 @@ void srActivate(void *seqRegion,
 
   /* Get out own handle */
   
-  STORE_HANDLE newHandle = handleHandleCreate(*handle);
+  //  STORE_HANDLE newHandle = handleHandleCreate(*handle);
+  STORE_HANDLE newHandle = NULL;
   
   region->handle = newHandle;
   region->smap = NULL;
@@ -458,14 +474,14 @@ static void calcSeqRegion(void *seqRegion,
   if (region->smap)
     sMapDestroy(region->smap);
   
-  if (region->zMapRegion->dna)
-    arrayDestroy(region->zMapRegion->dna);
+  if (zMapRegionGetDNA(region->zMapRegion))
+    zMapRegionFreeDNA(region->zMapRegion);
  
   if (region->bucket)
     sbDestroy(region->bucket);
   
-  region->zMapRegion->oldMethods = region->zMapRegion->methods;
-  region->zMapRegion->methods = NULL;
+  zMapRegionSetOldMethods(region->zMapRegion, zMapRegionGetMethods(region->zMapRegion));
+  zMapRegionSetMethods(region->zMapRegion, NULL);
   /* currently just put in new area - might need these to see what we have 
      already got. */
 
@@ -494,10 +510,10 @@ static void calcSeqRegion(void *seqRegion,
   /* When recalculating, for whatever reason, we need to repopulate
    * the dna array. On initial display, srGetDNA is called by
    * srActivate, but recalculation doesn't tread that path. */
-  if (!region->zMapRegion->dna)
+  if (!zMapRegionGetDNA(region->zMapRegion))
     srGetDNA(region);
 
-  arrayDestroy(region->zMapRegion->oldMethods);
+  zMapRegionFreeOldMethods(region->zMapRegion);
   
 }
  
@@ -508,10 +524,9 @@ void srGetDNA(SeqRegion *region)
 {
   
   /* TODO handle callback stuff */
-  /* I find Simon's comment disturbing, as I've structured it not to 
-   * do a callback here... RNC */
-  if (!region->zMapRegion->dna)
-    region->zMapRegion->dna = sMapDNA(region->smap, region->handle, 0);
+  /* Commenting out until I know what is required here. */
+  //  if (!zMapRegionGetDNA(region->zMapRegion))
+  //    zMapRegionSetDNA(region->zMapRegion, sMapDNA(region->smap, region->handle, 0));
   
   return;
 }
@@ -542,7 +557,7 @@ void srRevComp(SeqRegion *region)
 
 void seqRegionDestroy(SeqRegion *region)
 {
-  handleDestroy(region->handle);
+  //  handleDestroy(region->handle);  yes, I know I have to deal with this.
 }
   
 /***************************** end of file ******************************/
diff --git a/src/zmapWindow/zmapcols.c b/src/zmapWindow/zmapcols.c
index 10cb3cd07..3e1bcbe70 100755
--- a/src/zmapWindow/zmapcols.c
+++ b/src/zmapWindow/zmapcols.c
@@ -1,4 +1,4 @@
-/*  Last edited: May 14 10:34 2004 (rnc) */
+/*  Last edited: Jun 22 15:59 2004 (rnc) */
 /*  file: zmapcols.c
  *  Author: Simon Kelley (srk@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2003
@@ -27,33 +27,107 @@
 
 #include <seqregion.h>
 #include <zmapcontrol.h>
-#include <zmapcommon.h>
+#include <ZMap/zmapcommon.h>
+#include <ZMap/zmapWindow.h>
 
-static void zMapScaleColumn(ZMapPane *pane, ZMapColumn *col, float *offset, int frame)
+/*************** function prototypes *****************************************/
+
+static void zMapDNAColumn(ZMapPane pane, ZMapColumn *col, 
+		   float *offsetp, int frame);
+
+/*************** start function definitions **********************************/
+
+static void zMapScaleColumn(ZMapPane pane, ZMapColumn *col, float *offset, int frame)
 {
-  *offset = zmDrawScale( /*window->canvas,*/ *offset,
-			zmVisibleCoord(pane->window, zmCoordFromScreen(pane, 0)),
-			zmVisibleCoord(pane->window, zmCoordFromScreen(pane, pane->graphHeight)));
+  *offset = zmMainScale(zMapPaneGetCanvas(pane), *offset,
+			zmVisibleCoord(zMapPaneGetZMapWindow(pane), zmCoordFromScreen(pane, 0)),
+			zmVisibleCoord(zMapPaneGetZMapWindow(pane), 
+				       zmCoordFromScreen(pane, zMapPaneGetHeight(pane))));
 }
 
-static void pruneCols(ZMapPane *pane)
+
+/* cut this from zmapsequence.c and pasted here for now */
+void zMapDNAColumn(ZMapPane pane, ZMapColumn *col, 
+		   float *offsetp, int frame)
+{
+  float offset = *offsetp;
+  float max = offset;
+  float BPL = zMapPaneGetBPL(pane);
+  ZMapRegion *zMapRegion = zMapPaneGetZMapRegion(pane);
+  Coord seqstart = srCoord(zMapRegion, zMapPaneGetCentre(pane)) -
+    (zMapPaneGetHeight(pane) * BPL) / 2;
+  Coord seqend = srCoord(zMapRegion, zMapPaneGetCentre(pane)) +
+    (zMapPaneGetHeight(pane) * BPL) / 2;
+
+  Coord i;
+
+  if (seqstart < zMapRegion->area1)
+    seqstart = zMapRegion->area1;
+
+  if (seqend > zMapRegion->area2)
+    seqend = zMapRegion->area2;
+
+  if (zMapRegion->dna->len == 0)
+    return;
+
+  for (i = seqstart; i < seqend; i += BPL)
+    {
+      char *dnap, buff[10];
+      int j;
+      ScreenCoord y =  zmScreenCoord(pane, i);
+      sprintf(buff, "%7d", zmVisibleCoord(zMapPaneGetZMapWindow(pane), i));
+      //      graphText(buff, offset, y);
+
+      dnap = &g_array_index(zMapRegion->dna,
+			   char,
+			   i - (zMapRegion->area1-1));
+
+      for (j = 0; j < BPL; j++)
+	{
+	  float x = offset+8+j;
+	  //	  buff[0] = dnaDecodeChar[(int)*(dnap+j)];
+	  //	  buff[1] = 0;
+	  //	  graphText(buff, x, y);
+	  
+	  if (j+i > zMapRegion->area2)
+	    break;
+
+	  if (j+1 == zMapPaneGetDNAwidth(pane))
+	    {
+	      //	      graphText("...", x+1, y);
+	      j = BPL;
+	      x += 4;
+	    }
+	  
+	  if (x > max) 
+	    max = x;
+	}
+    }
+	
+  *offsetp = max+1;
+}
+
+
+static void pruneCols(ZMapPane pane)
      /* Remove Columns which have invalid methods */
 { 
   int i, j;
+  // NB all this farting about with &pane->cols must be wrong but I can't see why
+  printf("length is %d\n", zMapPaneGetCols(pane)->len);
   
-  for (i = 0; i < arrayMax(pane->cols); i++)
+  for (i = 0; i < zMapPaneGetCols(pane)->len; i++)
     {
-      ZMapColumn *c = arrp(pane->cols, i, ZMapColumn);
-      if (c->type != SR_DEFAULT && c->meth && !srMethodFromID(pane->zMapRegion, c->meth))
+      ZMapColumn *c = g_ptr_array_index(zMapPaneGetCols(pane), i);
+
+      if (c->type != SR_DEFAULT && c->meth && !srMethodFromID(zMapPaneGetZMapRegion(pane), c->meth))
 	{
-	  for (j = i+1; j < arrayMax(pane->cols); j++)
-	    arr(pane->cols, j-1, ZMapColumn) = arr(pane->cols, j, ZMapColumn);
-	  arrayMax(pane->cols)--;
+	  for (j = i+1; j < (zMapPaneGetCols(pane))->len; j++)
+	    g_ptr_array_remove_index(zMapPaneGetCols(pane), j-1); // = arr(pane->cols, j, ZMapColumn);
 	}
     }
 }
 
-static void insertCol(ZMapPane *pane, methodID meth, srType type)
+static void insertCol(ZMapPane pane, methodID meth, srType type)
 {
   /* NB call this one with type == SR_DEFAULT to put in default columns. */
 
@@ -69,11 +143,11 @@ static void insertCol(ZMapPane *pane, methodID meth, srType type)
                otherwise matches values in segs from convert routines.
   */
   static struct ZMapColDefs defs[] = {
-    { NULL,    zMapScaleColumn  , NULL, NULL      , FALSE, 1.0, "Scale"   , SR_DEFAULT },
-    { nbcInit, zMapFeatureColumn, NULL, nbcSelect , FALSE, 2.0, "Features", SR_SEQUENCE },
-    { nbcInit, zMapFeatureColumn, NULL, nbcSelect , FALSE, 2.0, "Features", SR_FEATURE },
+    { NULL,    zMapScaleColumn  , NULL, NULL      , FALSE, 1.0, "Scale"   , SR_DEFAULT    },
+    { nbcInit, zMapFeatureColumn, NULL, nbcSelect , FALSE, 2.0, "Features", SR_SEQUENCE   },
+    { nbcInit, zMapFeatureColumn, NULL, nbcSelect , FALSE, 2.0, "Features", SR_FEATURE    },
     { nbcInit, zMapGeneDraw     , NULL, geneSelect, FALSE, 2.0, "Features", SR_TRANSCRIPT },
-    { NULL,    zMapDNAColumn    , NULL, NULL      , FALSE, 11.0, "DNA"    , SR_DEFAULT },
+    { NULL,    zMapDNAColumn    , NULL, NULL      , FALSE, 11.0, "DNA"    , SR_DEFAULT    },
   };/* init,   draw,            config, select,    isframe, prio, name,     type */
 
   int i, j, k;
@@ -92,43 +166,55 @@ static void insertCol(ZMapPane *pane, methodID meth, srType type)
 	}
       else if ((type == defs[i].type))
 	{
-	  if (!(methp = srMethodFromID(pane->zMapRegion, meth)))
-	    messcrash("Failed to find method in insertCol");
-	  name = strnew(methp->name, pane->window->handle);  
+	  if (!(methp = srMethodFromID(zMapPaneGetZMapRegion(pane), meth)))
+	    {
+	      // TODO: sort out error handling here
+	      printf("Failed to find method in insertCol\n");
+	      exit;
+	    }
+	  name = (char*)g_string_new(methp->name); //previously hung on pane->window->handle);  
 	  priority = methp->priority;
 	}
       else
 	continue;
       
-      for (j = 0; 
-	   j < arrayMax(pane->cols) && 
-	     arr(pane->cols, j, ZMapColumn).priority < priority;
+
+      /* TODO: This bit is completely wrong.  I think the pane->cols array needs to be in
+      ** priority order, but GPtrArray doesn't have an insert function, just adds at the 
+      ** end.  Might have to write an insert function or use GArray instead, but for now
+      ** I'm not actually doing anything, as I've been in the pub at lunchtime and a couple
+      ** of beers is a sure way to break it. */
+      /*      for (j = 0; 
+	   j < (&pane->cols)->len && 
+	     g_ptr_array_index(pane->cols, j).priority < priority;
 	   j++);
+      */
       
+      //      if (j < (&pane->cols)->len)
+      //	{
+      //	  /* default columns */
+      //	  if (!meth &&
+      //	      g_ptr_array_index(pane->cols, j).name == name)
+      //	    continue; /* already there  */
+      //	    
+      //	  /* method columns */
+      //	  if (meth &&
+      //	      g_ptr_array_index(pane->cols, j).meth == meth &&
+      //	      g_ptr_array_index(pane->cols, j).type == type)
+      //	    continue; /* already there  */
+      //	}
       
-      if (j < arrayMax(pane->cols))
-	{
-	  /* default columns */
-	  if (!meth &&
-	      arr(pane->cols, j, ZMapColumn).name == name)
-	    continue; /* already there  */
-	    
-	  /* method columns */
-	  if (meth &&
-	      arr(pane->cols, j, ZMapColumn).meth == meth &&
-	      arr(pane->cols, j, ZMapColumn).type == type)
-	    continue; /* already there  */
-	}
-      
-      if ( j < arrayMax(pane->cols))
-	/* make space */
-	for (k = arrayMax(pane->cols); k >= j+1; k--)
-	  {
-	    ZMapColumn tmp =  array(pane->cols, k-1, ZMapColumn);
-	    *arrayp(pane->cols, k, ZMapColumn) = tmp;
-	  }
+      //      if ( j < pane->cols->len)
+      /* make space */
+      //	for (k = arrayMax(pane->cols); k >= j+1; k--)
+      //	  {
+      //	ZMapColumn tmp =  array(pane->cols, k-1, ZMapColumn);
+      //	    *arrayp(pane->cols, k, ZMapColumn) = tmp;
+      //	  }
+
       
-      c = arrayp(pane->cols, j, ZMapColumn);
+      //    c = g_ptr_array_index(pane->cols, j);
+
       c->drawFunc = defs[i].drawFunc;
       c->configFunc = defs[i].configFunc;
       c->selectFunc = defs[i].selectFunc;
@@ -141,25 +227,26 @@ static void insertCol(ZMapPane *pane, methodID meth, srType type)
       if (defs[i].initFunc)
 	(*defs[i].initFunc)(pane, c);
     }
+
 }
 
   
   
-void buildCols(ZMapPane *pane)
+void buildCols(ZMapPane pane)
      /* Add a column for each method */
 {
-  ZMapRegion *zMapRegion = pane->zMapRegion;
+  ZMapRegion *zMapRegion = zMapPaneGetZMapRegion(pane);
   int i;
-  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);
 	methodID id = seg->method;
 	if (id)
 	  insertCol(pane, id, seg->type);
       }
 }
 	
-void makezMapDefaultColumns(ZMapPane *pane)
+void makezMapDefaultColumns(ZMapPane pane)
 {
     insertCol(pane, 0, SR_DEFAULT);
 }
diff --git a/src/zmapWindow/zmapcontrol.c b/src/zmapWindow/zmapcontrol.c
index 15f93fdc7..d19dfb4b0 100755
--- a/src/zmapWindow/zmapcontrol.c
+++ b/src/zmapWindow/zmapcontrol.c
@@ -1,4 +1,4 @@
-/*  Last edited: May 14 10:34 2004 (rnc) */
+/*  Last edited: Jun 28 13:59 2004 (rnc) */
 /*  file: zmapcontrol.c
  *  Author: Simon Kelley (srk@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2003
@@ -32,30 +32,22 @@ static void *navAssoc, *winAssoc;
 
 /* function prototypes ***********************************************/
 
-static void        createZMap       (ZMapWindow *window, ZMapCallbackData *zMapCallbackData);
-static void        createZMapWindow (ZMapWindow *window, ZMapCallbackData *zMapCallbackData);
-static void        zMapZoomToolbar  (ZMapWindow *window, ZMapCallbackData *zMapCallbackData);
-static void        drawNavigator    (ZMapWindow *window);
-static void        drawWindow       (ZMapPane *pane);
-static void        navUpdate        (GtkAdjustment *adj, gpointer p);
-static void        navChange        (GtkAdjustment *adj, gpointer p);
-static void        drawNavigatorWind(ZMapPane *pane);
-static void        zMapScaleColumn  (ZMapPane *pane, float *offset, int frame);
-static void        drawBox          (FooCanvasItem *group, double x, double y, char *line_colour, char *fill_colour);
-static void        drawLine         (FooCanvasGroup *group, double x1, double y1, double x2, double y2, 
-				     char *colour, double thickness);
-static void drawGene(ZMapWindow *window);
-static void columnOfBoxes(ZMapWindow *window);
-static float zmMainScale(FooCanvas *canvas, float offset, int start, int end);
+static void        createZMap       (ZMapWindow window);
+static void        zMapZoomToolbar  (ZMapWindow window);
+static void        drawNavigator    (ZMapWindow window);
+static void        drawWindow       (ZMapPane pane);
+static void        drawGene         (ZMapWindow window);
+static void        columnOfBoxes    (ZMapWindow window);
+static void        navScale         (FooCanvas *canvas, float offset, int start, int end);
 
 /* functions ********************************************************/
 
 BOOL Quit(GtkWidget *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
 
-  if (window->panesTree)
-    g_node_destroy(window->panesTree);
+  if (zMapWindowGetPanesTree(window))
+    g_node_destroy(zMapWindowGetPanesTree(window));
 
   return TRUE;
 }
@@ -63,59 +55,48 @@ BOOL Quit(GtkWidget *widget, gpointer data)
 
 
 /* zMapDisplay
- * Main entry point for the zmap code.  Called by zMapCall() zmapcalls.c.
- * The first two params are callback routines to allow zmap to 
- * interrogate a data-source, the third being a void pointer to a
+ * Main entry point for the zmap code.  Called by zMapWindowCreate.
+ * The first param is the display window, then two callback routines to 
+ * allow zmap to interrogate a data-source. Then a void pointer to a
  * structure used in the process.  Although zmap doesn't need to know
  * directly about this structure, it needs to pass the pointer back
  * during callbacks, so AceDB can use it. 
  *
+ * This will all have to change, now we're acedb-independent.
+ *
  * We create the display window, then call the Activate 
  * callback routine to get the data, passing it a ZMapRegion in
  * which to create fmap-flavour segs for us to display, then
  * build the columns in the display.
  */
 
-BOOL zMapDisplay(Activate_cb act_cb,
-		 Calc_cb calc_cb,
-		 void *region,
-		 char *seqspec, 
-		 char *fromspec, 
-		 BOOL isOldGraph)
+BOOL zMapDisplay(ZMap        zmap,
+		 Activate_cb act_cb,
+		 Calc_cb     calc_cb,
+		 void       *region,
+		 char       *seqspec, 
+		 char       *fromspec, 
+		 BOOL        isOldGraph)
 {
+  ZMapWindow window = zmap->zMapWindow;
 
-  ZMapWindow *window = (ZMapWindow*)messalloc(sizeof(ZMapWindow));
-  Coord x1, x2;
-    
-  window->handle = handleCreate();
-  window->firstTime = TRUE;                 /* used in addPane() */
-  ZMapCallbackData *zMapCBData = halloc(sizeof(ZMapCallbackData), window->handle);
+  //  Coord x1, x2;    
+  //  zMapWindowSetHandle(window);
 
-  zMapCBData->calc_cb   = calc_cb;
-  zMapCBData->seqRegion = region;
+  zMapWindowSetFrame(window, zmap->view_parent);        
+  zMapWindowSetFirstTime(window, TRUE);                 /* used in addPane() */
 
   /* make the window in which to display the data */
-  createZMap(window, zMapCBData);
+  createZMapWindow(window);
 
-  /* Make zmapRegion  - just zmap stuff, no AceDB at all. */
-  window->focuspane->zMapRegion = srCreate(window->handle);
-  
-  /* Poke stuff in.  For xace this will be srActivate(). */
-  (*act_cb)(region, seqspec, window->focuspane->zMapRegion, &x1, &x2, &window->handle);
-  
-  /* stick the data into the display window */
-  makezMapDefaultColumns(window->focuspane);
-  buildCols(window->focuspane);
-
-  window->origin = srInvarCoord(window->focuspane->zMapRegion, x1);
-  window->focuspane->centre = srInvarCoord(window->focuspane->zMapRegion, x1);
-  window->focuspane->basesPerLine = 100;
-    
-  gtk_widget_show_all(window->window);
+  // for now, just default the areas to 0;
+  zMapWindowCreateRegion(window);
+  zMapWindowSetRegionArea(window, 0, 1);
+  zMapWindowSetRegionArea(window, 0, 2);
 
   drawNavigator(window);
 
-  drawWindow(window->focuspane);
+  drawWindow(zMapWindowGetFocuspane(window));
 
   return TRUE;
 
@@ -124,23 +105,24 @@ BOOL zMapDisplay(Activate_cb act_cb,
 
 /* zmRecalculate *******************************************************/
 
-static BOOL zmRecalculate(ZMapWindow *window, ZMapCallbackData *zMapCBData)
+static BOOL zmRecalculate(ZMapWindow window, ZMapCallbackData *zMapCBData)
 {
   /* derive the region for which we need data. */
   int min, max;
 
   Calc_cb calc_cb = zMapCBData->calc_cb;
 
-  min = zmCoordFromScreen(window->focuspane, 0);
-  max = zmCoordFromScreen(window->focuspane, window->focuspane->graphHeight);
+  min = zmCoordFromScreen(zMapWindowGetFocuspane(window), 0);
+  max = zmCoordFromScreen(zMapWindowGetFocuspane(window), 
+			  zMapWindowGetHeight(window));
 
   if (min < 0)
     min = 0;
-  if (max > window->focuspane->zMapRegion->length)
-    max = window->focuspane->zMapRegion->length;
+  if (max > zMapWindowGetRegionLength(window))
+    max = zMapWindowGetRegionLength(window);
 
-  if (min >= window->focuspane->zMapRegion->area1 &&
-      max <= window->focuspane->zMapRegion->area2)
+  if (min >= zMapWindowGetRegionArea(window, 1) &&
+      max <= zMapWindowGetRegionArea(window, 2))
     return FALSE; /* already covers area. */
   
   min -= 100000;
@@ -148,21 +130,24 @@ static BOOL zmRecalculate(ZMapWindow *window, ZMapCallbackData *zMapCBData)
 
   if (min < 0)
     min = 0;
-  if (max > window->focuspane->zMapRegion->length)
-    max = window->focuspane->zMapRegion->length;
+  if (max > zMapWindowGetRegionLength(window))
+    max = zMapWindowGetRegionLength(window);
 
-  (*calc_cb)(zMapCBData->seqRegion, min, max, window->focuspane->zMapRegion->rootIsReverse);  
+  (*calc_cb)(zMapCBData->seqRegion, min, max, 
+	     zMapWindowGetRegionReverse(window));  
 
-  buildCols(window->focuspane);
+  buildCols(zMapWindowGetFocuspane(window));
   
   return TRUE;
 }
 
 
-void zmRegBox(ZMapPane *pane, int box, ZMapColumn *col, void *arg)
+void zmRegBox(ZMapPane pane, int box, ZMapColumn *col, void *arg)
 {
-  array(pane->box2col, box, ZMapColumn *) = col;
-  array(pane->box2seg, box, void *) = arg;
+  zMapPaneSetBox2Col(pane, col, box);
+  zMapPaneSetBox2Seg(pane, arg, box);
+
+  return;
 }
 
 
@@ -175,50 +160,58 @@ static void zMapPick(int box, double x, double y)
   
   if (oldWindow && oldBox)
     {
-      col = arr(oldWindow->box2col, oldBox, ZMapColumn *);
-      seg = arr(oldWindow->box2seg, oldBox, void *);
+      col = zMapPaneGetBox2Col(*oldWindow, oldBox);
+      seg = zMapPaneGetBox2Seg(*oldWindow, oldBox);
       if (col && seg && col->selectFunc)
-	(*col->selectFunc)(oldWindow, col, seg, oldBox, x, y, FALSE);
+	(*col->selectFunc)(*oldWindow, col, seg, oldBox, x, y, FALSE);
       oldBox = 0;
       oldWindow = NULL;
     }
   
-  if (graphAssFind(&winAssoc, &oldWindow))
+  //  if (graphAssFind(&winAssoc, &oldWindow))
+  if (oldWindow)
     {
       oldBox = box;
-      col = arr(oldWindow->box2col, oldBox, ZMapColumn *);
-      seg = arr(oldWindow->box2seg, oldBox, void *);
+      col = zMapPaneGetBox2Col(*oldWindow, oldBox);
+      seg = zMapPaneGetBox2Seg(*oldWindow, oldBox);
 
       if (col && seg && col->selectFunc)
-	(*col->selectFunc)(oldWindow, col, seg, oldBox, x, y, TRUE);
+	(*col->selectFunc)(*oldWindow, col, seg, oldBox, x, y, TRUE);
     }
 
 }
 
 
 
-static void drawWindow(ZMapPane *pane)
+static void drawWindow(ZMapPane pane)
 {
   float offset = 5;
   float maxOffset = 0;
   int   frameCol, i, frame = -1;
   float oldPriority = -100000;
   
-  graphActivate(pane->graph); 
-  graphClear();
-  graphColor(BLACK);
-  graphRegister (PICK,(GraphFunc) zMapPick);
+  //  graphActivate(pane->graph); 
+  //  graphClear();
+  //  graphColor(BLACK);
+  //  graphRegister (PICK,(GraphFunc) zMapPick);
  
-  pane->box2col = arrayReCreate(pane->box2col, 500, ZMapColumn *);
-  pane->box2seg = arrayReCreate(pane->box2seg, 500, SEG *);
-  if (pane->drawHandle)
-    handleDestroy(pane->drawHandle);
-  pane->drawHandle = handleHandleCreate(pane->window->handle);
+  //  pane->box2col = arrayReCreate(pane->box2col, 500, ZMapColumn *);
+  //  pane->box2seg = arrayReCreate(pane->box2seg, 500, SEG *);
+
+  zMapPaneFreeBox2Col(pane);
+  zMapPaneFreeBox2Seg(pane);
+  zMapPaneNewBox2Col(pane, 500);
+  zMapPaneNewBox2Seg(pane, 500);
+
+  //  if (pane->drawHandle)
+  //    handleDestroy(pane->drawHandle);
+  //  pane->drawHandle = handleHandleCreate(zMapWindowGetHandle(pane->window));
+  //  pane->drawHandle = NULL;
 
-  for (i = 0; i < arrayMax(pane->cols); i++)
+  for (i = 0; i < zMapPaneGetCols(pane)->len; i++)
    
     { 
-      ZMapColumn *col = arrp(pane->cols, i, ZMapColumn);
+      ZMapColumn *col = g_ptr_array_index(zMapPaneGetCols(pane), i);
       float offsetSave = -1;
      
       /* frame : -1 -> No frame column.
@@ -236,7 +229,7 @@ static void drawWindow(ZMapPane *pane)
 	  /* in frame mode and reached end of framed columns: backtrack */
 	  frame++;
 	  i = frameCol;
-	  col = arrp(pane->cols, i, ZMapColumn);
+	  col = g_ptr_array_index(zMapPaneGetCols(pane), i);
 	}
       else if ((frame == 2) && !col->isFrame)
 	{
@@ -257,72 +250,13 @@ static void drawWindow(ZMapPane *pane)
       
     }
 
-  graphTextBounds(maxOffset, 0);
+  //  graphTextBounds(maxOffset, 0);
   
-  graphRedraw();
+  //  graphRedraw();
   
 }
   
 	      
-static void gtk_ifactory_cb (gpointer             callback_data,
-		 guint                callback_action,
-		 GtkWidget           *widget)
-{
-  g_message ("ItemFactory: activated \"%s\"", gtk_item_factory_path_from_widget (widget));
-}
-
-
-
-/* createZMap ***********************************************************
- * Draws the basics of the window - the trim around it, etc.  
- * Creates the main menu and a text entry box, then callse createZMapWindow.
- */
-static void createZMap(ZMapWindow *window, ZMapCallbackData *zMapCallbackData)
-{
-  GtkAccelGroup *accel_group = gtk_accel_group_new ();
-  static GtkItemFactoryEntry menu_items[] =
-  {
-    { "/_File",            NULL,         0,                     0, "<Branch>" },
-    { "/File/_Print",      "<control>P", gtk_ifactory_cb,       0 },
-    { "/File/Print _Whole","<control>W", gtk_ifactory_cb,       0 },
-    { "/File/P_reserve",   "<control>r", gtk_ifactory_cb,       0 },
-    { "/File/_Recalculate",NULL,         gtk_ifactory_cb,       0 },
-    { "/File/sep1",        NULL,         gtk_ifactory_cb,       0, "<Separator>" },
-    { "/File/_Quit",       "<control>Q", gtk_ifactory_cb,       0 },
-    { "/_Export",         	    	 NULL, 0,               0, "<Branch>" },
-    { "/Export/_Features", 		 NULL, gtk_ifactory_cb, 0 },
-    { "/Export/_Sequence",             	 NULL, gtk_ifactory_cb, 0 },
-    { "/Export/_Transalations",          NULL, gtk_ifactory_cb, 0 },
-    { "/Export/_EMBL dump",              NULL, gtk_ifactory_cb, 0 },
-    { "/_Help",            NULL,         0,                     0, "<LastBranch>" },
-    { "/Help/_About",      NULL,         gtk_ifactory_cb,       0 },
-  };
-
-  static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
-
-  
-  /* create top level window */
-  window->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-  g_signal_connect(GTK_OBJECT(window->window), "destroy", 
-      GTK_SIGNAL_FUNC(Quit), (gpointer) window);
-
-  gtk_widget_set_size_request(window->window, 1000, 750); 
-  window->vbox1 = gtk_vbox_new(FALSE, 4);
-  window->itemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
-  window->infoSpace = gtk_entry_new();
-
-  gtk_window_add_accel_group (GTK_WINDOW(window->window), accel_group);
-  gtk_item_factory_create_items (window->itemFactory, nmenu_items, menu_items, NULL);
-  gtk_container_add(GTK_CONTAINER(window->window), window->vbox1);
-  gtk_box_pack_start(GTK_BOX(window->vbox1), 
-		     gtk_item_factory_get_widget(window->itemFactory, "<main>"),
-		     FALSE, FALSE, 0);
-  gtk_box_pack_start(GTK_BOX(window->vbox1), window->infoSpace, FALSE, FALSE, 0);
-
-  createZMapWindow(window, zMapCallbackData);
-}
-
-
  
 /* createZMapWindow ***************************************************************
  * Creates the root node in the panesTree (which helps keep track of all the
@@ -334,62 +268,37 @@ static void createZMap(ZMapWindow *window, ZMapCallbackData *zMapCallbackData)
  * in as child2.
  */
 
-static void createZMapWindow(ZMapWindow *window, ZMapCallbackData *zMapCallbackData)
+void createZMapWindow(ZMapWindow window)
 {
-  GtkWidget *toolbar = gtk_toolbar_new();
-  zMapCallbackData->window = window;
-  ZMapPane *pane = NULL;
-  GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
+  ZMapPane pane = NULL;
  
-  window->panesTree = g_node_new(pane);
-
-  window->hbox = gtk_hbox_new(FALSE, 0);
-  window->hpane = gtk_hpaned_new();
-                                                                                           
-  /* Next into the vbox we pack an hbox to hold two toolbars.  This is
-   * so the Close Pane button can be far away from the rest, which I like. */
-  gtk_box_pack_start(GTK_BOX(window->vbox1), hbox, FALSE, FALSE, 0);
-  gtk_box_pack_start(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0);
-                                                                                           
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "H-Split", "2 panes, one above the other" , NULL, NULL,
-                          GTK_SIGNAL_FUNC(splitPane),
-                          (gpointer)window);
-                                                                                           
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Clear", NULL, NULL, NULL,
-                          NULL, NULL);
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Rev-Comp", NULL, NULL, NULL,
-                          NULL, NULL);
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "DNA", NULL, NULL, NULL,
-                          NULL, NULL);
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "GeneFind", NULL, NULL, NULL,
-                          NULL, NULL);
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Origin", NULL, NULL, NULL,
-                          NULL, NULL);
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "V-Split", "2 panes, side by side", NULL, NULL,
-                          GTK_SIGNAL_FUNC(splitHPane),
-                          (gpointer)window);
-                                                                                           
-  toolbar = gtk_toolbar_new();
-  gtk_box_pack_end(GTK_BOX(hbox), toolbar, FALSE, FALSE, 0);
-                                                                                           
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Close\nPane", NULL, NULL, NULL,
-                          GTK_SIGNAL_FUNC(closePane),
-                          (gpointer)window);
+  zMapWindowSetPanesTree(window, g_node_new(pane));
+  zMapWindowSetHpane(window, gtk_hpaned_new());
                                                                                            
   /* After the toolbars comes an hpane, so the user can adjust the width
    * of the navigator pane */
-  gtk_box_pack_start(GTK_BOX(window->vbox1), window->hpane, TRUE, TRUE, 0);
+  gtk_container_add(GTK_CONTAINER(zMapWindowGetFrame(window)), zMapWindowGetHpane(window));
                                                                                            
+  zMapWindowSetNavigator(window, gtk_scrolled_window_new(NULL, NULL));
+  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(zMapWindowGetNavigator(window)), 
+				 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+  gtk_widget_set_size_request(zMapWindowGetNavigator(window), 100, -1);
+
   /* leave window->navigator in place until navcanvas works */
-  window->navigator = graphNakedCreate(TEXT_FIT, "", 20, 100, FALSE) ;
-  gtk_widget_set_size_request(gexGraph2Widget(window->navigator), 50, -1);
-  gtk_paned_pack1(GTK_PANED(window->hpane), gexGraph2Widget(window->navigator),
+  //  zMapWindowSetNavigator(window, graphNakedCreate(TEXT_FIT, "", 20, 100, FALSE)) ;
+  //  gtk_widget_set_size_request(gexGraph2Widget(zMapWindowGetNavigator(window)), 50, -1);
+
+  gtk_paned_pack1(GTK_PANED(zMapWindowGetHpane(window)), 
+		  zMapWindowGetNavigator(window),
                   TRUE, TRUE);
                                                                                            
   /* create the splittable pane and pack it into the hpane as child2. */
-  zMapZoomToolbar(window, zMapCallbackData);
-  gtk_widget_set_size_request(window->zoomvbox, 750, -1);
-  gtk_paned_pack2(GTK_PANED(window->hpane), window->zoomvbox, TRUE, TRUE);
+  zMapZoomToolbar(window);
+
+  gtk_widget_set_size_request(zMapWindowGetZoomVbox(window), 750, -1);
+  gtk_paned_pack2(GTK_PANED(zMapWindowGetHpane(window)), 
+		  zMapWindowGetZoomVbox(window)
+		  , TRUE, TRUE);
 
   return;
 }
@@ -400,167 +309,33 @@ static void createZMapWindow(ZMapWindow *window, ZMapCallbackData *zMapCallbackD
  * sets up a bare graph.  Calls addPane to add the actual data display panel.
  * I suspect we'll end up putting the zoom buttons on the top menu line.
  */
-static void zMapZoomToolbar(ZMapWindow *window, ZMapCallbackData *zMapCallbackData)
+static void zMapZoomToolbar(ZMapWindow window)
 {
   
   GtkWidget *toolbar = gtk_toolbar_new();
   
-  window->zoomvbox = gtk_vbox_new(FALSE,0);
-
-  /* build the zoom toolbar */
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Zoom In", NULL, NULL, NULL, 
-			  GTK_SIGNAL_FUNC(zoomIn), (gpointer) window);
+  zMapWindowSetZoomVbox(window, gtk_vbox_new(FALSE,0));
 
-  gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "Zoom Out", NULL, NULL, NULL, 
-			  GTK_SIGNAL_FUNC(zoomOut), (gpointer) window);
-  //			  GTK_SIGNAL_FUNC(zoomOut), (gpointer)zMapCallbackData);
-
-  /* add zoom toolbar and scrolling window to vbox */
-  gtk_box_pack_start(GTK_BOX(window->zoomvbox), toolbar, FALSE, FALSE, 0);
 
   addPane(window, 'v');
-
-  return;
-}
-
-
-/* addPane is called each time we add a new pane. Creates a new frame, scrolled
- * window and canvas.  First time through it sticks them in the window->zoomvbox, 
- * thereafter it packs them into the lower part of the focus pane.
- *
- * Splitting goes like this: we make a (h or v) pane, add a new frame to the child1 
- * position of that, then reparent the scrolled window containing the canvas into 
- * the new frame. That's the shrinkPane() function. 
- * Then in addPane we add a new frame in the child2 position, and into that we
- * load a new scrolled window and canvas. 
-*/
-void addPane(ZMapWindow *window, char orientation)
-{
-  ZMapPane *pane = (ZMapPane*)malloc(sizeof(ZMapPane));
-  GtkAdjustment *adj; 
-  GtkWidget *w;
-  GNode *node = NULL;
-
-  /* set up ZMapPane for this window */
-  pane->window = window;
-  pane->DNAwidth = 100;
-  pane->step_increment = 10;
-
-  /* create the bare graph & convert to a widget */
-  /*    pane->graph = graphNakedCreate(TEXT_FIT, "", 20, 100, TRUE);
-	pane->graphWidget = gexGraph2Widget(pane->graph);*/
-  
-  pane->cols = arrayHandleCreate(50, ZMapColumn, window->handle);
-  pane->box2col        = NULL;
-  pane->box2seg        = NULL;
-  pane->drawHandle     = NULL;
-  pane->frame          = gtk_frame_new(NULL);
-  pane->scrolledWindow = gtk_scrolled_window_new (NULL, NULL);
-
-  /* The idea of the GNode tree is that panes split horizontally, ie
-   * one above the other, end up as siblings in the tree, while panes
-   * split vertically (side by side) are parents/children.  In theory
-   * this enables us to get the sizing right. In practice it's not
-   * perfect yet.*/
-  if (window->firstTime) 
-    { 
-      pane->zoomFactor   = 1;
-      g_node_append_data(window->panesTree, pane);
-    }
-  else
-    {
-      pane->zoomFactor   = window->focuspane->zoomFactor;
-      node = g_node_find (window->panesTree,
-			  G_IN_ORDER,
-			  G_TRAVERSE_ALL,
-			  window->focuspane);
-      if (orientation == 'h')
-	  g_node_append_data(node->parent, pane);
-      else
-	  g_node_append_data(node, pane);
-    }
-
-  /* draw the canvas */
-  gdk_rgb_init();
-  w = foo_canvas_new();
-
-  pane->canvas = FOO_CANVAS(w);
-  foo_canvas_set_scroll_region(pane->canvas, 0.0, 0.0, 1000, 1000);
-  pane->background = foo_canvas_item_new(foo_canvas_root(pane->canvas),
-	 		foo_canvas_rect_get_type(),
-			"x1",(double)0,
-			"y1",(double)0,
-			"x2",(double)1000,
-			"y2",(double)1000,
-		 	"fill_color", "white",
-			"outline_color", "dark gray",
-			NULL);
-  
-  /* when the user clicks a button in the view, call recordFocus() */
-  g_signal_connect (GTK_OBJECT (pane->canvas), "button_press_event",
-		    GTK_SIGNAL_FUNC (recordFocus), pane);
-
-  pane->group = foo_canvas_item_new(foo_canvas_root(pane->canvas),
-                        foo_canvas_group_get_type(),
-                        "x", (double)100,
-                        "y", (double)100 ,
-                        NULL);
-
-  /* add the canvas to the scrolled window */
-  gtk_container_add(GTK_CONTAINER(pane->scrolledWindow),w);
-
-  /* you have to set the step_increment manually or the scrollbar arrows don't work.*/
-  /* Using a member of ZMapPane means I can adjust it if necessary when we zoom. */
-  GTK_LAYOUT (w)->vadjustment->step_increment = pane->step_increment;
-  GTK_LAYOUT (w)->hadjustment->step_increment = pane->step_increment;
-
-  /* add the scrolled window to the frame */
-  gtk_container_add(GTK_CONTAINER(pane->frame),pane->scrolledWindow);
-
-  /* First time through, we add the frame to the main vbox. 
-   * Subsequently it goes in the lower half of the current pane. */
-  if (window->firstTime)
-    gtk_box_pack_start(GTK_BOX(window->zoomvbox), pane->frame, TRUE, TRUE, 0);
-  else
-    gtk_paned_pack2(GTK_PANED(window->focuspane->pane), pane->frame, TRUE, TRUE);
-
-
-  /* always show scrollbars, however big the display */
-  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pane->scrolledWindow),
-       GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
-
-  adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pane->scrolledWindow)); 
-
-  g_signal_connect(GTK_OBJECT(adj), "value_changed", GTK_SIGNAL_FUNC(navUpdate), (gpointer)(pane));
-  g_signal_connect(GTK_OBJECT(adj), "changed", GTK_SIGNAL_FUNC(navChange), (gpointer)(pane)); 
-
-  /* focus on the new pane */
-  recordFocus(NULL, NULL, pane);
-  gtk_widget_grab_focus(pane->frame);
-
-  /* if we do this first time, a little blank box appears before the main display */
-  if (!window->firstTime) 
-    gtk_widget_show_all (window->window);
-
-  window->firstTime = FALSE;
-
-  zmMainScale(pane->canvas, 30, 0, 1000);
   drawGene(window);
-  columnOfBoxes(window);
+  //  columnOfBoxes(window);
 
   return;
 }
 
 
 /* This is just a noddy function I used to draw a small box on the canvas */
-static void drawBox (FooCanvasItem *group, double x, double y, char *line_colour, char *fill_colour)
+void drawBox (FooCanvasItem *group, double x1, double y1, 
+	      double x2, double y2, 
+	      char *line_colour, char *fill_colour)
 {
   foo_canvas_item_new(FOO_CANVAS_GROUP(group),
                         foo_canvas_rect_get_type(),
-                        "x1"           , (double)x ,
-                        "y1"           , (double)y ,
-                        "x2"           , (double)x+14.0,
-                        "y2"           , (double)y+3.0,
+                        "x1"           , (double)x1 ,
+                        "y1"           , (double)y1 ,
+                        "x2"           , (double)x2,
+                        "y2"           , (double)y2,
                         "outline_color", line_colour          ,
                         "fill_color"   , fill_colour          ,
                         "width_units"  , (double)1,
@@ -571,7 +346,7 @@ static void drawBox (FooCanvasItem *group, double x, double y, char *line_colour
 }
 
 /* This is just a noddy function I used to draw a line  on the canvas */
-static void drawLine(FooCanvasGroup *group, double x1, double y1, double x2, double y2, 
+void drawLine(FooCanvasGroup *group, double x1, double y1, double x2, double y2, 
 		     char *colour, double thickness)
 {
   FooCanvasPoints *points;
@@ -599,11 +374,13 @@ static void drawLine(FooCanvasGroup *group, double x1, double y1, double x2, dou
 }
                                                                                 
 
-static void drawGene(ZMapWindow *window)
+static void drawGene(ZMapWindow window)
 {
   FooCanvasItem *group;
+  ZMapPane pane = zMapWindowGetFocuspane(window);
+  FooCanvas *canvas = zMapPaneGetCanvas(pane);
 
-  group = foo_canvas_item_new(foo_canvas_root(window->focuspane->canvas),
+  group = foo_canvas_item_new(foo_canvas_root(canvas),
                         foo_canvas_group_get_type(),
                         "x", (double)100,
                         "y", (double)100 ,
@@ -611,7 +388,7 @@ static void drawGene(ZMapWindow *window)
 
   //group = window->focuspane->group;
 
-  drawBox(group, 0.0, 220.0 ,"light blue", "white");
+  /*  drawBox(group, 0.0, 220.0 ,"light blue", "white");
   drawBox(group, 0.0, 260.0 ,"light blue", "white");
   drawBox(group, 0.0, 300.0 ,"light blue", "white");
   drawBox(group, 0.0, 320.0 ,"light blue", "white");
@@ -655,27 +432,29 @@ static void drawGene(ZMapWindow *window)
   drawLine(FOO_CANVAS_GROUP(group), 34.0, 400.0, 27.0, 420.0, "red", 1.0);
   drawLine(FOO_CANVAS_GROUP(group), 27.0, 423.0, 34.0, 440.0, "red", 1.0);
   drawLine(FOO_CANVAS_GROUP(group), 34.0, 440.0, 27.0, 460.0, "red", 1.0);
- 
+  */
   return;
 }
 
                
 
-static void columnOfBoxes(ZMapWindow *window)
+static void columnOfBoxes(ZMapWindow window)
 {
-  int space[12] = {1,6,9,4,5,2,8,3,7,1,6};
+  /*  int space[12] = {1,6,9,4,5,2,8,3,7,1,6};
   int i, j;
   double y = 0;
   FooCanvasItem *group;
+  ZMapPane pane = zMapWindowGetFocuspane(window);
+  FooCanvas *canvas = zMapPaneGetCanvas(pane);
 
-  group = foo_canvas_item_new(foo_canvas_root(window->focuspane->canvas),
+  group = foo_canvas_item_new(foo_canvas_root(canvas),
                         foo_canvas_group_get_type(),
                         "x", (double)100,
                         "y", (double)100 ,
                         NULL);
-
+  */
   //group = window->focuspane->group;
-
+  /*
   for (i=0; i<20; i++)
     {
       for (j=0; j<10; j++)
@@ -685,14 +464,14 @@ static void columnOfBoxes(ZMapWindow *window)
 	}
     }
 
-  group = foo_canvas_item_new(foo_canvas_root(window->focuspane->canvas),
+  group = foo_canvas_item_new(foo_canvas_root(canvas),
                         foo_canvas_group_get_type(),
                         "x", (double)100,
                         "y", (double)100 ,
                         NULL);
-
+  */
   //group = window->focuspane->group;
-
+  /*
   for (i=0, y=0; i<20; i++)
     {
       for (j=1; j<11; j++)
@@ -702,14 +481,14 @@ static void columnOfBoxes(ZMapWindow *window)
 	}
     }
 
-  group = foo_canvas_item_new(foo_canvas_root(window->focuspane->canvas),
+  group = foo_canvas_item_new(foo_canvas_root(canvas),
                         foo_canvas_group_get_type(),
                         "x", (double)100,
                         "y", (double)100 ,
                         NULL);
-
+  */
   //group = window->focuspane->group;
-
+  /*
   for (i=0, y=0; i<20; i++)
     {
       for (j=2; j<12; j++)
@@ -718,6 +497,7 @@ static void columnOfBoxes(ZMapWindow *window)
 	  y += space[j];
 	}
     }
+  */
   return;
 }
 
@@ -732,11 +512,7 @@ static void displayText(FooCanvasGroup *group, char *text, double x, double y)
 }
 
 
-/* This is commented out because I started trying to draw a scalebar after
- * I first put in some of the gnomecanvas stuff, but never succeeded completely.
- * However, when I went away to work on splitting the window, I didn't want to
- * throw this away completely. */
-static float zmMainScale(FooCanvas *canvas, float offset, int start, int end)
+float zmMainScale(FooCanvas *canvas, float offset, int start, int end)
 {
   int x, width = 5, count;
   FooCanvasItem *group;
@@ -765,93 +541,57 @@ static float zmMainScale(FooCanvas *canvas, float offset, int start, int end)
 
 
 
-/* This is the original zmDrawScale I inherited which draws a neat scalebar
- * in the navigator.  It used to do so in the main display panel, until I 
- * started using the canvas. */
-float zmDrawScale(float offset, int start, int end)
+static void navScale(FooCanvas *canvas, float offset, int start, int end)
 {
-  int height;
-  int unit, subunit, type, unitType ;
-  int x, width = 0 ;
-  float mag, cutoff;
-  char *cp, unitName[] = { 0, 'k', 'M', 'G', 'T', 'P' }, buf[2] ;
-
-  graphFitBounds(NULL, &height); 
-
-  mag = (float)height/((float)(end - start));
-  cutoff = 5/mag;
-  unit = subunit = 1.0 ;
-
-  if (cutoff < 0)
-    cutoff = -cutoff ;
-
-  while (unit < cutoff)
-    { unit *= 2 ;
-      subunit *= 5 ;
-      if (unit >= cutoff)
-	break ;
-      unit *= 2.5000001 ;	
-      if (unit >= cutoff)
-	break ;
-      unit *= 2 ;
-      subunit *= 2 ;
-    }
-  subunit /= 10 ;
-  if (subunit < 1.0)
-    subunit = 1.0 ;
-
-  for (type = 1, unitType = 0 ; unit > 0 && 1000 * type < unit && unitType < 5; 
-       unitType++, type *= 1000) ;
-  
-  if (x>0)
-    x = ((start/unit)+1)*unit;
-  else
-    x = ((start/unit)-1)*unit;  
-  
-  for (; x < end ; x += unit)
-    {
-      ScreenCoord y = (float)(x-start)*mag;
-      graphLine (offset, y, offset, y) ;
-      buf[0] = unitName[unitType] ; buf[1] = 0 ;
-      cp = messprintf ("%d%s", x/type, buf) ;
-      if (width < strlen (cp))
-        width = strlen (cp) ;
-      graphText (cp, offset+1.5, y-0.5) ;
-    }
-
+  int x, width = 5, count;
+  FooCanvasItem *group;
 
-  for (x = ((start/unit)-1)*unit ; x < end ; x += subunit)
+  group = foo_canvas_item_new(foo_canvas_root(canvas),
+			foo_canvas_group_get_type(),
+			"x",(double)offset,
+			"y",(double)0.0,
+			NULL);
+ 
+  for (x = start, count = 1 ; x < end ; x += 10, count++)
     {
-      ScreenCoord y = (float)(x-start)*mag;
-      graphLine (offset+0.5, y, offset+1, y) ;
+      drawLine(FOO_CANVAS_GROUP(group), offset-5, x, offset, x, "black", 1.0);
+      char text[25];
+      sprintf(text,"%dk", x);
+      if (count == 1)
+	displayText(FOO_CANVAS_GROUP(group), text, offset + 20, x); 
+      if (count > 9) count = 0;
     }
 			     
-  graphLine (offset+1, 0, offset+1, height) ;
-  return offset + width + 4 ;
+  drawLine(FOO_CANVAS_GROUP(group), offset+1, 0, offset+1, end, "black", 1.0);
+  return;
 
 }
 
 
+
+
 static int dragBox;
 
-/* I believe is only called by navPick */
+/* I believe navDrag is only called by navPick.  Since I don't 
+** know what navPick is doing, and don't now know what
+** navDrag is doing, I'm going to comment most of it out. */
 static void navDrag(float *x, float *y, BOOL isDone)
 {
   static BOOL isDragging = FALSE;
   static float oldY;
-  ZMapWindow *window;
-  ZMapPane *pane;
+  ZMapWindow window;
+  ZMapPane pane;
   Coord startWind, endWind;
   ScreenCoord startWindf, endWindf, lenWindf;
   int height;
   
-  graphFitBounds(NULL, &height);
-  graphAssFind(&navAssoc, &window);
+  //  graphFitBounds(NULL, &height);
+  //  graphAssFind(&navAssoc, &window);
 
-  if (dragBox == window->focuspane->dragBox)
+  /*  if (dragBox == zMapWindowGetFocuspane(window)->dragBox)
     {
-      pane = window->focuspane;
-      *x = window->scaleOffset - 0.3;
+      pane = zMapWindowGetFocuspane(window);
+      *x = zMapWindowGetScaleOffset(window) - 0.3;
     }
   else
     return;
@@ -859,8 +599,15 @@ static void navDrag(float *x, float *y, BOOL isDone)
   startWind =  zmCoordFromScreen(pane, 0);
   endWind =  zmCoordFromScreen(pane, pane->graphHeight);
   
-  startWindf = height * (startWind - window->navStart)/(window->navEnd - window->navStart);
-  endWindf = height * (endWind - window->navStart)/(window->navEnd - window->navStart);
+  startWindf = zMapWindowGetScreenCoord(window, startWind, height);
+  endWindf   = zMapWindowGetScreenCoord(window, endWind, height);
+  */
+  //  startWindf = height * (startWind - zMapWindowGetCoord(window, "s"))
+  //                      / (zMapWindowGetCoord(window, "e") - zMapWindowGetCoord(window, "s"));
+
+  //  endWindf = height * (endWind - zMapWindowGetCoord(window, "s"))
+  //    / (zMapWindowGetCoord(window, "e") - zMapWindowGetCoord(window, "s"));
+  /*
   lenWindf = endWindf - startWindf;
   
   
@@ -878,201 +625,180 @@ static void navDrag(float *x, float *y, BOOL isDone)
   if (isDone)
     {
       isDragging = FALSE;
-      pane->centre = srInvarCoord(window->focuspane->zMapRegion, 
-				  srCoord(window->focuspane->zMapRegion, pane->centre) -
-				  (oldY - *y) * (float)(window->navEnd - window->navStart)/(float)height);
-
+      pane->centre = srInvarCoord(zMapWindowGetFocuspane(window)->zMapRegion, 
+				  srCoord(zMapWindowGetFocuspane(window)->zMapRegion, pane->centre) -
+				  (oldY - *y) * (float)(zMapWindowGetCoord(window, "e") - zMapWindowGetCoord(window, "s"))/(float)height);
+  */
       /* TO DO: how do I get a zMapCBData into navDrag?
 	 ANS: when I convert the graphRegister to a g_signal_connect I can do that. 
       if (zmRecalculate(window, zMapCBData))
 	drawNavigator(window);
       */
       printf("Well, I'm in navDrag\n");
-
-      drawWindow(pane); 
-      graphActivate(window->navigator);
-    }
+      
+      // we don't have a pane or window, so can't do anything with them here.
+      //      drawWindow(pane); 
+      //      graphActivate(zMapWindowGetNavigator(window));
+      //    }
   
 }
 
+/* not sure what navPick is supposed to do, so not
+** going to give it a signal_connect for now. Params
+** are all wrong, anyway. */
 static void navPick(int box, double x, double y)
 {
-  ZMapWindow *window;
+  ZMapWindow window;
 
-  graphAssFind(&navAssoc, &window);
+  //  graphAssFind(&navAssoc, &window);
 
-  if (box == window->focuspane->dragBox)
+  //  if (box == zMapWindowGetFocuspane(window)->dragBox)
     {
       dragBox = box;
-      graphBoxDrag(box, navDrag);
+      //      graphBoxDrag(box, navDrag);
     }
 }
 
 static void navResize(void)
 {
-  ZMapWindow *window;
+  ZMapWindow window;
   
-  if (graphAssFind(&navAssoc, &window))
+  //  if (graphAssFind(&navAssoc, &window))
     drawNavigator(window);
 }
 
-static void navChange(GtkAdjustment *adj, gpointer p)
+void navChange(GtkAdjustment *adj, gpointer p)
 {
-  ZMapPane *pane = (ZMapPane *)p;
+  ZMapPane pane = (ZMapPane)p;
   
-  drawNavigator(pane->window);
+  drawNavigator(zMapPaneGetZMapWindow(pane));
 }
 
 
 
-static void drawNavigator(ZMapWindow *window)
+static void drawNavigator(ZMapWindow window)
 {
   int height;
   ScreenCoord startCalcf, endCalcf;
   int areaSize;
+  GtkWidget *w;
+  GtkRequisition req;
   
-  graphActivate(window->navigator);
-  graphAssociate(&navAssoc, window);
-  graphRegister (PICK,(GraphFunc) navPick) ;
-  graphRegister(RESIZE, (GraphFunc) navResize);
-  graphClear();
+  //  graphActivate(zMapWindowGetNavigator(window));
+  //  graphAssociate(&navAssoc, window);
+  //  graphRegister (PICK,(GraphFunc) navPick) ;
+  //  graphRegister(RESIZE, (GraphFunc) navResize);
+  //  graphClear();
 
-  graphFitBounds(NULL, &height);
+  //  graphFitBounds(NULL, &height);
   
-  areaSize = window->focuspane->zMapRegion->area2 - window->focuspane->zMapRegion->area1;
+  areaSize = zMapWindowGetRegionSize(window);
   if (areaSize < 1) areaSize = 1;
 
-  window->navStart = window->focuspane->zMapRegion->area1 - areaSize/2;
-  window->navEnd = window->focuspane->zMapRegion->area2 + areaSize/2;
-  if (window->navStart == window->navEnd) window->navEnd = window->navStart + 1;
+  zMapWindowSetCoord(window, "s", areaSize/2);
+  zMapWindowSetCoord(window, "e", areaSize/2);
+  startCalcf = zMapWindowGetScreenCoord1(window, height);
+  endCalcf   = zMapWindowGetScreenCoord2(window, height);
 
-  startCalcf = height * (window->focuspane->zMapRegion->area1 - window->navStart)/(window->navEnd - window->navStart);
-  endCalcf = height * (window->focuspane->zMapRegion->area2 - window->navStart)/(window->navEnd - window->navStart);
-  
-    graphColor(LIGHTGRAY);
-    graphFillRectangle(0, startCalcf, 100.0, endCalcf);
-      /*
-  foo_canvas_item_new(foo_canvas_window(window->navcanvas),
+  w = foo_canvas_new();
+
+  zMapWindowSetNavCanvas(window, FOO_CANVAS(w));
+  foo_canvas_set_scroll_region(zMapWindowGetNavCanvas(window), 0.0, 0.0, 200.0, 500.0);
+ 
+  foo_canvas_item_new(foo_canvas_root(zMapWindowGetNavCanvas(window)),
 			foo_canvas_rect_get_type(),
-			"x1",(double)0,
-			"y1",(double)startCalcf,
-			"x2",(double)100,
-			"y2",(double)endCalcf,
-			"fill_color", "lightgray",
+			"x1",(double)0.0,
+			"y1",(double)0.0,
+			"x2",(double)200.0,
+			"y2",(double)500.0,
+			"fill_color", "white",
 			NULL);
-      */
-  graphColor(BLACK);
 
-  window->scaleOffset = zmDrawScale(1.0, window->navStart, window->navEnd);
-  drawNavigatorWind(window->focuspane);
+  //  g_signal_connect(GTK_OBJECT(zMapWindowGetNavCanvas(window)), "event", 
+  //		   GTK_SIGNAL_FUNC(navPick), (gpointer) zMapWindowGetNavCanvas(window));
+
+  //  graphColor(BLACK);
+
+  zMapWindowSetScaleOffset(window, 
+			   zmMainScale(zMapWindowGetNavCanvas(window),
+				       1.0, zMapWindowGetCoord(window, "s"), 
+				       zMapWindowGetCoord(window, "e")));
+  drawNavigatorWind(zMapWindowGetFocuspane(window));
 
-  graphRedraw();
+  gtk_container_add(GTK_CONTAINER(zMapWindowGetNavigator(window)), w);
+
+  navScale(FOO_CANVAS(w), 10, 0, 1000);
+
+  //  graphRedraw();
 }
 
 
-static void navUpdate(GtkAdjustment *adj, gpointer p)
+void navUpdate(GtkAdjustment *adj, gpointer p)
 {
-  ZMapPane *pane = (ZMapPane *)p;
-  ZMapWindow *window = pane->window;
+  ZMapPane pane = (ZMapPane)p;
+  ZMapWindow window = zMapPaneGetZMapWindow(pane);
   int height;
   Coord startWind, endWind;
   ScreenCoord startWindf, startScreenf, endWindf, lenWindf;
   float x1, y1, x2, y2;
 
-  if (!GTK_WIDGET_REALIZED(window->window))
+  if (!GTK_WIDGET_REALIZED(zMapWindowGetFrame(window)))
     return;
 
-  graphActivate(window->navigator);
-  graphFitBounds(NULL, &height);
-  graphBoxDim(pane->scrollBox, &x1, &y1, &x2, &y2);
+  //  graphActivate(zMapWindowGetNavigator(window));
+  //  graphFitBounds(NULL, &height);
+  //  graphBoxDim(pane->scrollBox, &x1, &y1, &x2, &y2);
 
   startWind =  zmCoordFromScreen(pane, 0);
-  endWind =  zmCoordFromScreen(pane, pane->graphHeight);
+  endWind =  zmCoordFromScreen(pane, zMapPaneGetHeight(pane));
   
-  startWindf = height * (startWind - window->navStart)/(window->navEnd - window->navStart);
-  endWindf = height * (endWind - window->navStart)/(window->navEnd - window->navStart);
+  startWindf = zMapWindowGetScreenCoord(window, startWind, height);
+  endWindf = zMapWindowGetScreenCoord(window, endWind, height);
   lenWindf = endWindf - startWindf;
   
   startScreenf = startWindf + lenWindf * (adj->value - adj->lower)/(adj->upper - adj->lower) ;
 
-  graphBoxShift(pane->scrollBox, x1, startScreenf);
+  //  graphBoxShift(pane->scrollBox, x1, startScreenf);
 }
 
 
 
-static void drawNavigatorWind(ZMapPane *pane)
-{
-  ZMapWindow *window = pane->window;
-  int height;
-  Coord startWind, endWind;
-  ScreenCoord startWindf, endWindf, lenWindf;
-  ScreenCoord startScreenf, endScreenf;
-  ScreenCoord pos;
-  
-  GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(pane->scrolledWindow));
-  graphFitBounds(NULL, &height);
-  
-  startWind =  zmCoordFromScreen(pane, 0);
-  endWind =  zmCoordFromScreen(pane, pane->graphHeight);
-  
-  startWindf = height * (startWind - window->navStart)/(window->navEnd - window->navStart);
-  endWindf = height * (endWind - window->navStart)/(window->navEnd - window->navStart);
-  lenWindf = endWindf - startWindf;
-  
-  startScreenf = startWindf + lenWindf * (adj->value - adj->lower)/(adj->upper - adj->lower) ;
-  endScreenf = startWindf + lenWindf * (adj->page_size + adj->value - adj->lower)/(adj->upper - adj->lower) ;
-  
-  graphColor(BLACK);
-  
-  if (pane == window->focuspane)
-    pos = window->scaleOffset;
-  else
-    pos = window->scaleOffset + 1.0;
-
-  pane->dragBox = graphBoxStart();
-  graphLine(pos, startWindf, pos, endWindf);
-  pane->scrollBox = graphBoxStart();
-  graphColor(GREEN);
-  graphFillRectangle(pos - 0.3, startScreenf, pos + 0.5, endScreenf);
-  graphBoxEnd();
-  graphBoxSetPick(pane->scrollBox, FALSE);
-  graphBoxEnd();
-  graphBoxDraw(pane->dragBox, -1, LIGHTGRAY);
-
-}
-
 /* Coordinate stuff ****************************************************/
 
-VisibleCoord zmVisibleCoord(ZMapWindow *window, Coord coord)
+VisibleCoord zmVisibleCoord(ZMapWindow window, Coord coord)
 {
-  return coord - srCoord(window->focuspane->zMapRegion, window->origin) + 1;
+  ZMapPane    pane   = zMapWindowGetFocuspane(window);
+  ZMapRegion *region = zMapPaneGetZMapRegion(pane);
+
+  return coord - srCoord(region, zMapWindowGetOrigin(window)) + 1;
 }
 
 
-ScreenCoord zmScreenCoord(ZMapPane *pane, Coord coord)
+ScreenCoord zmScreenCoord(ZMapPane pane, Coord coord)
 {
-  Coord basesFromCent = coord - srCoord(pane->window->focuspane->zMapRegion, pane->centre);
-  float linesFromCent = ((float)basesFromCent)/((float)pane->basesPerLine);
+  ZMapRegion *region  = zMapPaneGetZMapRegion(pane);
+  Coord basesFromCent = coord - srCoord(region, zMapPaneGetCentre(pane));
+  float linesFromCent = ((float)basesFromCent)/zMapPaneGetBPL(pane);
 
-  return linesFromCent + (float)(pane->graphHeight/2);
+  return linesFromCent + (float)(zMapPaneGetHeight(pane)/2);
 }
 
 
-Coord zmCoordFromScreen(ZMapPane *pane, ScreenCoord coord)
+Coord zmCoordFromScreen(ZMapPane pane, ScreenCoord coord)
 {
-  float linesFromCent = coord - (pane->graphHeight/2);
-  int basesFromCent = linesFromCent * pane->basesPerLine;
+  float linesFromCent = coord - (zMapPaneGetHeight(pane)/2);
+  int basesFromCent = linesFromCent * zMapPaneGetBPL(pane);
 
-  return srCoord(pane->zMapRegion, pane->centre) + basesFromCent;
+  return srCoord(zMapPaneGetZMapRegion(pane), zMapPaneGetCentre(pane)) + basesFromCent;
 }
 
 
-BOOL zmIsOnScreen(ZMapPane *pane, Coord coord1, Coord coord2)
+BOOL zmIsOnScreen(ZMapPane pane, Coord coord1, Coord coord2)
 {
   if (zmScreenCoord(pane, coord2) < 0)
     return FALSE;
 
-  if (zmScreenCoord(pane, coord1) > pane->graphHeight)
+  if (zmScreenCoord(pane, coord1) > zMapPaneGetHeight(pane))
     return FALSE;
 
   return TRUE;
diff --git a/src/zmapWindow/zmapcontrol.h b/src/zmapWindow/zmapcontrol.h
index c6274101f..913a22b2f 100755
--- a/src/zmapWindow/zmapcontrol.h
+++ b/src/zmapWindow/zmapcontrol.h
@@ -1,4 +1,4 @@
-/*  Last edited: May 14 10:34 2004 (rnc) */
+/*  Last edited: Jun 25 13:51 2004 (rnc) */
 /*  file: zmapcontrol.h
  *  Author: Simon Kelley (srk@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2003
@@ -30,154 +30,51 @@
 
 #include <gtk/gtk.h>
 #include <libfoocanvas/libfoocanvas.h>
-#include <zmapcommon.h>
-#include <seqregion.h>
+#include <ZMap/zmapcommon.h>
+#include <../zmapWindow/seqregion.h>
+#include <../zmapControl/ZMap_P.h>
 
 
-typedef struct zMapWindow ZMapWindow;
-typedef struct zMapPane ZMapPane;
-
-typedef int   VisibleCoord;
-typedef float ScreenCoord;
-typedef char *Base;
-
-
-struct zMapWindow {
-  /* Data associated with whole window. */
-  STORE_HANDLE    handle;
-  GtkWidget      *window;
-  GtkWidget      *vbox1;
-  GtkItemFactory *itemFactory;
-  GtkWidget      *infoSpace;
-  Graph           navigator;
-  FooCanvas      *navcanvas;
-  InvarCoord      origin; /* that base which is VisibleCoord 1 */
-  GtkWidget      *zoomvbox;
-  GtkWidget      *toolbar;
-  GtkWidget      *hbox;
-  GtkWidget      *hpane;  /* allows the user to minimise the navigator pane */
-  GNode          *panesTree;
-  ZMapPane       *focuspane;
-  BOOL            firstTime;
-  /* navigator stuff */
-  Coord           navStart, navEnd; /* Start drawing the Nav bar from here */
-  ScreenCoord     scaleOffset;
-};
-
-struct zMapPane {
-  /* Data associated with one scrolling pane. */
-  ZMapWindow  *window; /* parent */
-  ZMapRegion  *zMapRegion; /* the region holding all the SEGS */
-  Graph        graph;
-  GtkWidget   *graphWidget;
-  GtkWidget   *vbox;
-  GtkWidget   *pane;
-  GtkWidget   *frame;
-  GtkWidget   *scrolledWindow;
-  FooCanvas   *canvas;    /* where we paint the display */
-  FooCanvasItem *background;
-  FooCanvasItem *group;
-  GtkWidget   *combo;
-  int          basesPerLine;
-  InvarCoord   centre;
-  int          graphHeight;
-  int          dragBox, scrollBox;
-  Array        cols;
-  Array        box2seg, box2col;
-  STORE_HANDLE drawHandle; /* gets freed on each redraw. */
-  int          DNAwidth;
-  double       zoomFactor;
-  int          step_increment;
-  gulong       hid1, hid2, hid3;
-};
-
-struct zMapColumn;
-typedef struct zMapColumn ZMapColumn;
-
-/* callback function prototypes********************************
- * These must be here as they're referred to in zMapColumn below
- */
-typedef void (*colDrawFunc)  (ZMapPane *pane, ZMapColumn *col,
-			      float *offset, int frame);
-typedef void (*colConfFunc)  (void);
-typedef void (*colInitFunc)  (ZMapPane *pane, ZMapColumn *col);
-typedef void (*colSelectFunc)(ZMapPane *pane, ZMapColumn *col,
-			      void *seg, int box, 
-			      double x, double y,
-			      BOOL isSelect);
-
-/**************************************************************/
-
-struct zMapColumn {
-  ZMapPane *pane;
-  colInitFunc initFunc;
-  colDrawFunc drawFunc;
-  colConfFunc configFunc;
-  colSelectFunc selectFunc;
-  BOOL isFrame;
-  float priority;
-  char *name;
-  float startx, endx; /* filled in by drawing code */
-  methodID meth; /* method */
-  srType type;
-  void *private;
-};
-
-struct ZMapColDefs {
-  colInitFunc initFunc;
-  colDrawFunc drawFunc;
-  colConfFunc configFunc;
-  colSelectFunc selectFunc;
-  BOOL isFrame;
-  float priority; /* only for default columns. */
-  char *name;
-  srType type;
-}; 
-
-
-typedef struct {
-  ZMapWindow *window;             /* the window pane  */
-  Calc_cb calc_cb;            /* callback routine */
-  void *seqRegion;            /* AceDB region     */
-} ZMapCallbackData;
-
 
 /* function prototypes ************************************/
 
-BOOL zMapDisplay(Activate_cb act_cb,
-		 Calc_cb calc_cb,
-		 void *region,
-		 char *seqspec, 
-		 char *fromspec, 
-		 BOOL isOldGraph);
+BOOL zMapDisplay(ZMap        zmap,
+		 Activate_cb act_cb,
+		 Calc_cb     calc_cb,
+		 void       *region,
+		 char       *seqspec, 
+		 char       *fromspec, 
+		 BOOL        isOldGraph);
 
-void zmRegBox(ZMapPane *pane, int box, ZMapColumn *col, void *seg);
+void zmRegBox(ZMapPane pane, int box, ZMapColumn *col, void *seg);
 
 /* Column drawing code ************************************/
 
-void  zMapFeatureColumn(ZMapPane *pane, ZMapColumn *col,
-			float *offset, int frame);
-void  zMapDNAColumn    (ZMapPane *pane, ZMapColumn *col,
-			float *offsetp, int frame);
-void  buildCols        (ZMapPane *pane);
-void  makezMapDefaultColumns(ZMapPane *pane);
+void  createZMapWindow (ZMapWindow window);
+void  zMapFeatureColumn(ZMapPane   pane, ZMapColumn *col,
+			float     *offset, int frame);
+void  buildCols        (ZMapPane   pane);
+void  makezMapDefaultColumns(ZMapPane  pane);
 /*float zmDrawScale     (FooCanvas *canvas, float offset, int start, int end);*/
-float zmDrawScale       (float offset, int start, int end);
-void  nbcInit           (ZMapPane *pane, ZMapColumn *col);
-void  nbcSelect         (ZMapPane *pane, ZMapColumn *col,
-			 void *seg, int box, double x, double y, BOOL isSelect);
-void  zMapGeneDraw      (ZMapPane *pane, ZMapColumn *col, float *offset, int frame);
-void  geneSelect        (ZMapPane *pane, ZMapColumn *col,
-			 void *arg, int box, double x, double y, BOOL isSelect);
+float zmDrawScale       (float     offset, int start, int end);
+void  nbcInit           (ZMapPane  pane, ZMapColumn *col);
+void  nbcSelect         (ZMapPane  pane, ZMapColumn *col,
+			 void     *seg, int box, double x, double y, BOOL isSelect);
+void  zMapGeneDraw      (ZMapPane  pane, ZMapColumn *col, float *offset, int frame);
+void  geneSelect        (ZMapPane  pane, ZMapColumn *col,
+			 void     *arg, int box, double x, double y, BOOL isSelect);
+void  drawLine          (FooCanvasGroup *group, double x1, double y1, double x2, double y2, 
+			 char *colour, double thickness);
+void  drawBox           (FooCanvasItem *group, double x1, double y1, 
+			 double x2, double y2, char *line_colour, char *fill_colour);
 
 /* other routines *****************************************/
 
-BOOL         zmIsOnScreen     (ZMapPane *pane, Coord coord1, Coord coord2);
-VisibleCoord zmVisibleCoord   (ZMapWindow   *window  , Coord coord);
-ScreenCoord  zmScreenCoord    (ZMapPane *pane, Coord coord);
-Coord        zmCoordFromScreen(ZMapPane *pane, ScreenCoord coord);
-void         addPane          (ZMapWindow *window, char orientation);
-BOOL         Quit             (GtkWidget *widget, gpointer data);
+BOOL         zmIsOnScreen     (ZMapPane    pane,   Coord coord1, Coord coord2);
+VisibleCoord zmVisibleCoord   (ZMapWindow  window, Coord coord);
+ScreenCoord  zmScreenCoord    (ZMapPane    pane,   Coord coord);
+Coord        zmCoordFromScreen(ZMapPane    pane,   ScreenCoord coord);
+BOOL         Quit             (GtkWidget  *widget, gpointer data);
 
      
 #endif
diff --git a/src/zmapWindow/zmapsplit.c b/src/zmapWindow/zmapsplit.c
index 8734e35ff..d33414b01 100755
--- a/src/zmapWindow/zmapsplit.c
+++ b/src/zmapWindow/zmapsplit.c
@@ -1,4 +1,4 @@
-/*  Last edited: May 14 10:33 2004 (rnc) */
+/*  Last edited: Jun 28 15:15 2004 (rnc) */
 /*  file: zmapsplit.c
  *  Author: Rob Clack (rnc@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2004
@@ -26,18 +26,19 @@
  */
  
 #include <zmapsplit.h>
+#include <zmapWindow_P.h>
 
 /* function prototypes **************************************************/
 
-static void  shrinkPane      (ZMapWindow *window);
-static void  resizePanes     (ZMapWindow *window);
-static void  resizeOnePane   (GNode *node, gpointer user_data);
-static void  scaleCanvas     (ZMapWindow *window, double zoomFactor);
-static void  shrinkHPane     (ZMapWindow *window);
-static void  resizeHPanes    (ZMapWindow *window);
-static int   unfocus         (GNode *node, gpointer data);
-static int   resizeOneHPane  (GNode *node, gpointer data);
-static void  exciseNode      (GNode *node);
+static void  shrinkPane      (ZMapWindow window);
+static void  resizePanes     (ZMapWindow window);
+static void  resizeOnePane   (GNode     *node, gpointer user_data);
+static void  scaleCanvas     (ZMapWindow window, double zoomFactor);
+static void  shrinkHPane     (ZMapWindow window);
+static void  resizeHPanes    (ZMapWindow window);
+static int   unfocus         (GNode     *node, gpointer data);
+static int   resizeOneHPane  (GNode     *node, gpointer data);
+static void  exciseNode      (GNode     *node);
 
 /* end of prototypes ***************************************************/
 
@@ -65,29 +66,31 @@ static void  exciseNode      (GNode *node);
  * the width the same.  I'm leaving the zoomFactor in the ZMapPane
  * structure for now in case I need it for when the user specifies
  * the bases-per-line magnification, which I've not looked at yet. */
-static void scaleCanvas(ZMapWindow *window, double zoomFactor)
+static void scaleCanvas(ZMapWindow window, double zoomFactor)
 {
-  foo_canvas_set_pixels_per_unit_xy(window->focuspane->canvas, 1.0, zoomFactor);
+  foo_canvas_set_pixels_per_unit_xy(zMapWindowGetFocuspane(window)->canvas, 1.0, zoomFactor);
   return;
 }
 
 
 void zoomIn(GtkWindow *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
+  ZMapPane pane = zMapWindowGetFocuspane(window);
 
-  window->focuspane->zoomFactor *= 2;
-  scaleCanvas(window, window->focuspane->zoomFactor);
+  pane->zoomFactor *= 2;
+
+  scaleCanvas(window, pane->zoomFactor);
   return;
 }
 
 
 void zoomOut(GtkWindow *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
 
-  window->focuspane->zoomFactor /= 2;
-  scaleCanvas(window, window->focuspane->zoomFactor);
+  zMapWindowGetFocuspane(window)->zoomFactor /= 2;
+  scaleCanvas(window, zMapWindowGetFocuspane(window)->zoomFactor);
   return;
 }
 
@@ -96,7 +99,7 @@ void zoomOut(GtkWindow *widget, gpointer data)
  * of the prototype it's helpful to have unfocussed backgrounds grey */
 static int unfocus(GNode *node, gpointer data)
 {
-  ZMapPane *pane = (ZMapPane*)node->data;
+  ZMapPane pane = (ZMapPane)node->data;
 
   if (pane) /* skip the actual root node which is not a valid widget */
     {
@@ -111,20 +114,20 @@ static int unfocus(GNode *node, gpointer data)
 
 int recordFocus(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
-  ZMapPane *pane = (ZMapPane*)data;
-  ZMapWindow *window = pane->window;
+  ZMapPane pane = (ZMapPane)data;
+  ZMapWindow window = pane->window;
   GNode *node;
  
   /* point the parent window's focuspane pointer at this pane */
   if (pane)
-    window->focuspane = pane;
+    zMapWindowSetFocuspane(window, pane);
   else /* if pane is null, arbitrarily focus on the first valid pane */
     {
-      node = g_node_first_child(window->panesTree);
-      window->focuspane = node->data;
+      node = g_node_first_child(zMapWindowGetPanesTree(window));
+      zMapWindowSetFocuspane(window, node->data);
     }
   
-  g_node_traverse(window->panesTree, 
+  g_node_traverse(zMapWindowGetPanesTree(window), 
 		  G_IN_ORDER,
 		  G_TRAVERSE_ALL, 
 		  -1,
@@ -141,39 +144,41 @@ int recordFocus(GtkWidget *widget, GdkEvent *event, gpointer data)
 /* shrinkPane is not quite the right name for this function.  We don't
  * actually shrink the pane, we add a new pane and frame and reposition
  * the scrolled window into that.  Later on we resize all panes. */
-static void shrinkPane(ZMapWindow *window)
+static void shrinkPane(ZMapWindow window)
 {
-  ZMapPane *pane = (ZMapPane*)malloc(sizeof(ZMapPane));
+  ZMapPane pane = (ZMapPane)malloc(sizeof(ZMapPaneStruct));
   GNode *node = NULL;
 
   /* create a new vpane and hook the old scrolled window up to it */
   pane->window = window;
   pane->pane         = gtk_vpaned_new();
   pane->frame        = gtk_frame_new(NULL);;
-  pane->scrolledWindow      = window->focuspane->scrolledWindow;
-  pane->canvas       = window->focuspane->canvas;
-  pane->background   = window->focuspane->background;
+  pane->scrolledWindow = zMapWindowGetFocuspane(window)->scrolledWindow;
+  pane->canvas       = zMapWindowGetFocuspane(window)->canvas;
+  pane->background   = zMapWindowGetFocuspane(window)->background;
+  pane->zoomFactor   = zMapWindowGetFocuspane(window)->zoomFactor;
   
   /* when the user clicks a button in the canvas, call recordFocus() */
   g_signal_connect (GTK_OBJECT (pane->canvas), "button_press_event",
 		    GTK_SIGNAL_FUNC (recordFocus), pane); 
-
-  gtk_widget_reparent(GTK_WIDGET(window->focuspane->scrolledWindow), pane->frame);
+  /* reparent the scrolled window into the new frame & pack1 the frame into the new vpane,
+  ** then add the new vpane to the frame of the pane which currently has focus, ie that being split.  */
+  gtk_widget_reparent(GTK_WIDGET(zMapWindowGetFocuspane(window)->scrolledWindow), pane->frame);
   gtk_paned_pack1(GTK_PANED(pane->pane), pane->frame, TRUE, TRUE);
-  gtk_container_add(GTK_CONTAINER(window->focuspane->frame), pane->pane);
+  gtk_container_add(GTK_CONTAINER(zMapWindowGetFocuspane(window)->frame), pane->pane);
 
-  /* remove the old ZMapPane from windowsTree, and add the new one */
-  node = g_node_find(window->panesTree,
+  /* remove the old ZMapPane from panesTree, and add the new one */
+  node = g_node_find(zMapWindowGetPanesTree(window),
 		     G_IN_ORDER,
 		     G_TRAVERSE_ALL,
-		     (gpointer)window->focuspane);
+		     (gpointer)zMapWindowGetFocuspane(window));
 
   g_node_append_data(node->parent, pane);
   exciseNode(node);
 
   /* do we really need this? */
-  gtk_widget_hide(window->focuspane->frame);
-  window->focuspane = pane;
+  //  gtk_widget_hide(zMapWindowGetFocuspane(window)->frame);
+  zMapWindowSetFocuspane(window, pane);
 
   return;
 }
@@ -181,7 +186,7 @@ static void shrinkPane(ZMapWindow *window)
 
 void splitPane(GtkWidget *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
 
   /* shrink the old pane */
   shrinkPane(window);
@@ -195,7 +200,7 @@ void splitPane(GtkWidget *widget, gpointer data)
 
 /* resizing the panes doesn't really work too well, but it's not too
  * bad for a few panes and time is short. */
-static void resizePanes(ZMapWindow *window)
+static void resizePanes(ZMapWindow window)
 {
   GtkRequisition req;
   GNode *node = NULL;
@@ -203,10 +208,10 @@ static void resizePanes(ZMapWindow *window)
   guint panes = 0;
 
   /* count how many panes there are in this column */
-  node = g_node_find(window->panesTree,
+  node = g_node_find(zMapWindowGetPanesTree(window),
 		     G_IN_ORDER,
 		     G_TRAVERSE_ALL,
-		     window->focuspane);
+		     zMapWindowGetFocuspane(window));
 
   last =  g_node_last_child(node->parent);
   /* first child is number 0 */
@@ -218,10 +223,10 @@ static void resizePanes(ZMapWindow *window)
   /* get size of the window & divide it by the number of panes.
    * Note there's a small kludge here to adjust for a better fit.
    * Don't know why it needs the -8. */
-  gtk_widget_size_request(GTK_WIDGET(window->vbox1), &req);
+  gtk_widget_size_request(GTK_WIDGET(zMapWindowGetFrame(window)), &req);
   req.height = (req.height/panes) - 8;
 
-  g_node_children_foreach(window->panesTree, 
+  g_node_children_foreach(zMapWindowGetPanesTree(window), 
 		  G_TRAVERSE_LEAFS, 
 		  resizeOnePane, 
 		  &req);
@@ -231,7 +236,7 @@ static void resizePanes(ZMapWindow *window)
 
 static void resizeOnePane(GNode *node, gpointer data)
 {
-  ZMapPane *pane = (ZMapPane*)node->data;
+  ZMapPane pane = (ZMapPane)node->data;
   GtkRequisition *req = (GtkRequisition*)data;
 
   if (pane)  
@@ -244,38 +249,40 @@ static void resizeOnePane(GNode *node, gpointer data)
 /* shrinkHPane is not quite the right name for this function.  We don't
  * actually shrink the pane, we add a new, half-size one and reposition
  * the scrolled window into that */
-static void shrinkHPane(ZMapWindow *window)
+static void shrinkHPane(ZMapWindow window)
 {
-  ZMapPane *pane = (ZMapPane*)malloc(sizeof(ZMapPane));
+  ZMapPane pane = (ZMapPane)malloc(sizeof(ZMapPaneStruct));
   GNode *node = NULL;
 
   /* create a new hpane and hook the old scrolled window up to it */
   pane->window = window;
   pane->pane         = gtk_hpaned_new();
   pane->frame        = gtk_frame_new(NULL);
-  pane->scrolledWindow      = window->focuspane->scrolledWindow;
-  pane->canvas       = window->focuspane->canvas;
-  pane->background   = window->focuspane->background;
+  pane->scrolledWindow = zMapWindowGetFocuspane(window)->scrolledWindow;
+  pane->canvas       = zMapWindowGetFocuspane(window)->canvas;
+  pane->background   = zMapWindowGetFocuspane(window)->background;
+  pane->zoomFactor   = zMapWindowGetFocuspane(window)->zoomFactor;
+
   
   /* when the user clicks a button in the canvas, call recordFocus() */
   g_signal_connect (GTK_OBJECT (pane->canvas), "button_press_event",
 		    GTK_SIGNAL_FUNC (recordFocus), pane); 
 
-  gtk_widget_reparent(GTK_WIDGET(window->focuspane->scrolledWindow), pane->frame);
+  gtk_widget_reparent(GTK_WIDGET(zMapWindowGetFocuspane(window)->scrolledWindow), pane->frame);
   gtk_paned_pack1(GTK_PANED(pane->pane), pane->frame, TRUE, TRUE);
-  gtk_container_add(GTK_CONTAINER(window->focuspane->frame), pane->pane);
+  gtk_container_add(GTK_CONTAINER(zMapWindowGetFocuspane(window)->frame), pane->pane);
 
   /* add new pane to windowsTree. */
-  node = g_node_find(window->panesTree,
+  node = g_node_find(zMapWindowGetPanesTree(window),
 		     G_IN_ORDER,
 		     G_TRAVERSE_ALL,
-		     window->focuspane);
+		     zMapWindowGetFocuspane(window));
   g_node_append_data(node->parent, pane);
   exciseNode(node);
 
   /* do we really need this? */  
-  gtk_widget_hide(window->focuspane->frame);
-  window->focuspane = pane;
+  gtk_widget_hide(zMapWindowGetFocuspane(window)->frame);
+  zMapWindowSetFocuspane(window, pane);
 
   return;
 }
@@ -283,7 +290,7 @@ static void shrinkHPane(ZMapWindow *window)
 
 void splitHPane(GtkWidget *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
 
   /* slim the old pane */
   shrinkHPane(window);
@@ -307,13 +314,13 @@ static int resizeOneHPane(GNode *node, gpointer data)
 }  
 
 
-static void resizeHPanes(ZMapWindow *window)
+static void resizeHPanes(ZMapWindow window)
 {
   GtkRequisition req;
   guint panes = 0;
 
   /* count how many columns there are */
-  panes = g_node_n_nodes(window->panesTree, 
+  panes = g_node_n_nodes(zMapWindowGetPanesTree(window), 
 			G_TRAVERSE_NON_LEAFS);
   if (panes == 0)
     panes = 1;
@@ -321,10 +328,10 @@ static void resizeHPanes(ZMapWindow *window)
   /* get size of the window & divide it by the number of panes.
    * Note there's a small kludge here to adjust for a better fit.
    * Don't know why it needs the -8. */
-  gtk_widget_size_request(GTK_WIDGET(window->zoomvbox), &req);
+  gtk_widget_size_request(GTK_WIDGET(zMapWindowGetZoomVbox(window)), &req);
   req.width = (req.width/panes) - 8;
 
-  g_node_traverse(g_node_get_root(window->panesTree), 
+  g_node_traverse(g_node_get_root(zMapWindowGetPanesTree(window)), 
 		  G_IN_ORDER,
 		  G_TRAVERSE_NON_LEAFS, 
 		  -1,
@@ -371,7 +378,7 @@ static void exciseNode(GNode *node)
 
 void closePane(GtkWidget *widget, gpointer data)
 {
-  ZMapWindow *window = (ZMapWindow*)data;
+  ZMapWindow window = (ZMapWindow)data;
   GNode *node = NULL;
   GNode *next = NULL;
   GNode *parent = NULL;
@@ -380,7 +387,7 @@ void closePane(GtkWidget *widget, gpointer data)
 
 
   /* count panes but forget the root node which isn't one */
-  guint panes = g_node_n_nodes(window->panesTree, G_TRAVERSE_ALL) - 1;
+  guint panes = g_node_n_nodes(zMapWindowGetPanesTree(window), G_TRAVERSE_ALL) - 1;
   int discard;  
 
   if (panes == 1)
@@ -388,10 +395,10 @@ void closePane(GtkWidget *widget, gpointer data)
   else
     {
       /* now decide where to focus after closing the pane */
-      node = g_node_find(window->panesTree, 
+      node = g_node_find(zMapWindowGetPanesTree(window), 
 			 G_IN_ORDER,
 			 G_TRAVERSE_ALL,
-			 window->focuspane);
+			 zMapWindowGetFocuspane(window));
       if (node->prev)
 	next = node->prev;
       else if (node->next)
@@ -403,7 +410,7 @@ void closePane(GtkWidget *widget, gpointer data)
       else
 	{
 	  printf("Don't know where to focus now!\n");
-	  parent = g_node_get_root(window->panesTree);
+	  parent = g_node_get_root(zMapWindowGetPanesTree(window));
 	  next = parent->children;
 	}
 
@@ -413,14 +420,14 @@ void closePane(GtkWidget *widget, gpointer data)
       * we add a pane to the current frame, then delete the corresponding node
       * from the panesTree.  When we delete panes from the display, we also need
       * to remove these extra frames as they become empty. */
-      pane_up1 = gtk_widget_get_ancestor(window->focuspane->frame, GTK_TYPE_PANED);
+      pane_up1 = gtk_widget_get_ancestor(zMapWindowGetFocuspane(window)->frame, GTK_TYPE_PANED);
       frame    = gtk_widget_get_ancestor(pane_up1, GTK_TYPE_FRAME);
       pane_up2 = gtk_widget_get_ancestor(frame, GTK_TYPE_PANED);
 
-      gtk_object_destroy(GTK_OBJECT(window->focuspane->canvas));
-      gtk_widget_destroy(window->focuspane->scrolledWindow);
-      gtk_widget_destroy(window->focuspane->frame);
-      free(window->focuspane);
+      gtk_object_destroy(GTK_OBJECT(zMapWindowGetFocuspane(window)->canvas));
+      gtk_widget_destroy(zMapWindowGetFocuspane(window)->scrolledWindow);
+      gtk_widget_destroy(zMapWindowGetFocuspane(window)->frame);
+      free(zMapWindowGetFocuspane(window));
             
       children = gtk_container_get_children(GTK_CONTAINER(pane_up1));
       if (children == NULL)
@@ -444,7 +451,7 @@ void closePane(GtkWidget *widget, gpointer data)
        * a canvas and scroll bars) after closing multiply-split windows, but life 
        * is short! */
       discard = recordFocus(NULL, NULL, next->data);
-      gtk_widget_grab_focus(((ZMapPane*)next->data)->frame);
+      gtk_widget_grab_focus(((ZMapPane)next->data)->frame);
       
       resizePanes(window);                                                                                
     }
diff --git a/src/zmapWindow/zmapsplit.h b/src/zmapWindow/zmapsplit.h
index bc29b7bc4..947b218dd 100755
--- a/src/zmapWindow/zmapsplit.h
+++ b/src/zmapWindow/zmapsplit.h
@@ -1,4 +1,4 @@
-/*  Last edited: May 14 10:33 2004 (rnc) */
+/*  Last edited: Jun 25 11:19 2004 (rnc) */
 /*  file: zmapsplit.h
  *  Author: Rob Clack (rnc@sanger.ac.uk)
  *  Copyright (c) Sanger Institute, 2004
@@ -32,13 +32,12 @@
 #include <stdlib.h>
 #include <gtk/gtk.h>
 #include <libfoocanvas/libfoocanvas.h>
-#include <zmapcontrol.h>
+#include <../zmapWindow/zmapcontrol.h>
 
 /* function prototypes */
 
 void  zoomIn          (GtkWindow *widget, gpointer data);
 void  zoomOut         (GtkWindow *widget, gpointer data);
-int   recordFocus     (GtkWidget *widget, GdkEvent *event, gpointer data); 
 void  splitPane       (GtkWidget *widget, gpointer data);
 void  splitHPane      (GtkWidget *widget, gpointer data);
 void  closePane       (GtkWidget *widget, gpointer data);
-- 
GitLab