Delete trailing whitespace at end of lines.
[pspp-builds.git] / lib / gtksheet / gtksheet.c
index dd7d4190f0e4972f93d58df61c3d154667648bb6..49c708ace3dd6fe9e18e14ea70a01f67d45b95fd 100644 (file)
@@ -1,4 +1,4 @@
-/* This version of GtkSheet has been *heavily* modified, for the specific 
+/* This version of GtkSheet has been *heavily* modified, for the specific
    requirements of PSPPIRE. */
 
 /* GtkSheet widget for Gtk+.
@@ -16,7 +16,7 @@
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  * SECTION:gtksheet
  * @short_description: spreadsheet widget for gtk2
  *
- * GtkSheet is a matrix widget for GTK+. It consists of an scrollable grid of 
+ * GtkSheet is a matrix widget for GTK+. It consists of an scrollable grid of
  * cells where you can allocate text. Cell contents can be edited interactively
  * through a specially designed entry, GtkItemEntry. It is also a container
- * subclass, allowing you to display buttons, curves, pixmaps and any other 
+ * subclass, allowing you to display buttons, curves, pixmaps and any other
  * widgets in it.
  *
  * You can also set many attributes as: border, foreground and background color,
@@ -37,6 +37,8 @@
  * The testgtksheet program shows how easy is to create a spreadsheet-like GUI
  * using this widget.
  */
+#include <config.h>
+
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include "gtkextra-marshal.h"
 #include "gsheetmodel.h"
 
-
 /* sheet flags */
 enum
-{ 
+{
   GTK_SHEET_IS_LOCKED       = 1 << 0,
   GTK_SHEET_IS_FROZEN       = 1 << 1,
   GTK_SHEET_IN_XDRAG        = 1 << 2,
@@ -79,6 +80,9 @@ enum
 #define GTK_SHEET_SET_FLAGS(sheet,flag)    (GTK_SHEET_FLAGS (sheet) |= (flag))
 #define GTK_SHEET_UNSET_FLAGS(sheet,flag)  (GTK_SHEET_FLAGS (sheet) &= ~(flag))
 
+#define GTK_SHEET_IS_LOCKED(sheet)   (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IS_LOCKED)
+
+
 #define GTK_SHEET_IS_FROZEN(sheet)   (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IS_FROZEN)
 #define GTK_SHEET_IN_XDRAG(sheet)    (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_XDRAG)
 #define GTK_SHEET_IN_YDRAG(sheet)    (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_YDRAG)
@@ -87,7 +91,7 @@ enum
 #define GTK_SHEET_IN_RESIZE(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_RESIZE)
 #define GTK_SHEET_IN_CLIP(sheet) (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_IN_CLIP)
 #define GTK_SHEET_REDRAW_PENDING(sheet)   (GTK_SHEET_FLAGS (sheet) & GTK_SHEET_REDRAW_PENDING)
+
 #define CELL_SPACING 1
 #define DRAG_WIDTH 6
 #define TIMEOUT_SCROLL 20
@@ -101,6 +105,11 @@ enum
 #define DEFAULT_COLUMN_WIDTH 80
 
 
+static void gtk_sheet_column_title_button_draw(GtkSheet *sheet, gint column);
+
+static void gtk_sheet_row_title_button_draw(GtkSheet *sheet, gint row);
+
+
 static gboolean gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col);
 
 static inline
@@ -108,36 +117,36 @@ void dispose_string (const GtkSheet *sheet, gchar *text)
 {
   GSheetModel *model  = gtk_sheet_get_model(sheet);
 
-  if ( ! model ) 
+  if ( ! model )
     return;
 
   if (g_sheet_model_free_strings(model))
     g_free(text);
 }
 
-static inline 
-guint DEFAULT_ROW_HEIGHT(GtkWidget *widget) 
-{ 
+static inline
+guint DEFAULT_ROW_HEIGHT(GtkWidget *widget)
+{
   if(!widget->style->font_desc) return 24;
   else {
-    PangoContext *context = gtk_widget_get_pango_context(widget); 
+    PangoContext *context = gtk_widget_get_pango_context(widget);
     PangoFontMetrics *metrics = pango_context_get_metrics(context,
                                   widget->style->font_desc,
-                                  pango_context_get_language(context)); 
-    guint val = pango_font_metrics_get_descent(metrics) + 
+                                  pango_context_get_language(context));
+    guint val = pango_font_metrics_get_descent(metrics) +
                 pango_font_metrics_get_ascent(metrics);
     pango_font_metrics_unref(metrics);
     return PANGO_PIXELS(val)+2*CELLOFFSET;
   }
 }
-static inline guint DEFAULT_FONT_ASCENT(GtkWidget *widget) 
-{ 
+static inline guint DEFAULT_FONT_ASCENT(GtkWidget *widget)
+{
   if(!widget->style->font_desc) return 12;
   else {
-    PangoContext *context = gtk_widget_get_pango_context(widget); 
+    PangoContext *context = gtk_widget_get_pango_context(widget);
     PangoFontMetrics *metrics = pango_context_get_metrics(context,
                                   widget->style->font_desc,
-                                  pango_context_get_language(context)); 
+                                  pango_context_get_language(context));
     guint val = pango_font_metrics_get_ascent(metrics);
     pango_font_metrics_unref(metrics);
     return PANGO_PIXELS(val);
@@ -158,14 +167,14 @@ static inline guint STRING_WIDTH(GtkWidget *widget,
   return PANGO_PIXELS(rect.width);
 }
 
-static inline guint DEFAULT_FONT_DESCENT(GtkWidget *widget) 
-{ 
+static inline guint DEFAULT_FONT_DESCENT(GtkWidget *widget)
+{
   if(!widget->style->font_desc) return 12;
   else {
-    PangoContext *context = gtk_widget_get_pango_context(widget); 
+    PangoContext *context = gtk_widget_get_pango_context(widget);
     PangoFontMetrics *metrics = pango_context_get_metrics(context,
                                   widget->style->font_desc,
-                                  pango_context_get_language(context)); 
+                                  pango_context_get_language(context));
     guint val =  pango_font_metrics_get_descent(metrics);
     pango_font_metrics_unref(metrics);
     return PANGO_PIXELS(val);
@@ -174,20 +183,20 @@ static inline guint DEFAULT_FONT_DESCENT(GtkWidget *widget)
 
 
 static gint
-yyy_row_is_visible(GtkSheet *sheet, gint row)
+yyy_row_is_visible(const GtkSheet *sheet, gint row)
 {
   GSheetRow *row_geo = sheet->row_geometry;
 
-  return g_sheet_row_get_visibility(row_geo, row, sheet);
+  return g_sheet_row_get_visibility(row_geo, row, 0);
 }
 
 
 static gint
-yyy_row_is_sensitive(GtkSheet *sheet, gint row)
+yyy_row_is_sensitive(const GtkSheet *sheet, gint row)
 {
   GSheetRow *row_geo = sheet->row_geometry;
 
-  return g_sheet_row_get_sensitivity(row_geo, row, sheet);
+  return g_sheet_row_get_sensitivity(row_geo, row, 0);
 }
 
 
@@ -197,7 +206,7 @@ yyy_row_count(const GtkSheet *sheet)
 {
   GSheetRow *row_geo = sheet->row_geometry;
 
-  return g_sheet_row_get_row_count(row_geo, sheet);
+  return g_sheet_row_get_row_count(row_geo, 0);
 }
 
 static inline gint
@@ -205,17 +214,17 @@ yyy_row_height(const GtkSheet *sheet, gint row)
 {
   GSheetRow *row_geo = sheet->row_geometry;
 
-  return g_sheet_row_get_height(row_geo, row, sheet);
+  return g_sheet_row_get_height(row_geo, row, 0);
 }
 
 static gint
-yyy_row_top_ypixel(GtkSheet *sheet, gint row)
+yyy_row_top_ypixel(const GtkSheet *sheet, gint row)
 {
   GSheetRow *geo = sheet->row_geometry;
 
-  gint y = g_sheet_row_start_pixel(geo, row, sheet);
+  gint y = g_sheet_row_start_pixel(geo, row, 0);
 
-  if ( sheet->column_titles_visible ) 
+  if ( sheet->column_titles_visible )
     y += sheet->column_title_area.height;
 
   return y;
@@ -224,56 +233,56 @@ yyy_row_top_ypixel(GtkSheet *sheet, gint row)
 
 /* Return the row containing pixel Y */
 static gint
-yyy_row_ypixel_to_row(GtkSheet *sheet, gint y)
+yyy_row_ypixel_to_row(const GtkSheet *sheet, gint y)
 {
   GSheetRow *geo = sheet->row_geometry;
 
   gint cy = sheet->voffset;
 
-  if(sheet->column_titles_visible) 
+  if(sheet->column_titles_visible)
     cy += sheet->column_title_area.height;
-  
-  if(y < cy) return 0;
 
+  if(y < cy) return 0;
 
-  return g_sheet_row_pixel_to_row(geo, y - cy, sheet);
+  return  g_sheet_row_pixel_to_row(geo, y - cy, 0);
 }
 
 
 /* gives the top pixel of the given row in context of
  * the sheet's voffset */
 static inline gint
-ROW_TOP_YPIXEL(GtkSheet *sheet, gint row)
+ROW_TOP_YPIXEL(const GtkSheet *sheet, gint row)
 {
   return (sheet->voffset + yyy_row_top_ypixel(sheet, row));
 }
 
 
-/* returns the row index from a y pixel location in the 
+/* returns the row index from a y pixel location in the
  * context of the sheet's voffset */
-static inline gint 
-ROW_FROM_YPIXEL(GtkSheet *sheet, gint y)
+static inline gint
+ROW_FROM_YPIXEL(const GtkSheet *sheet, gint y)
 {
   return (yyy_row_ypixel_to_row(sheet, y));
 }
 
-static inline const GtkSheetButton *
-xxx_column_button(GtkSheet *sheet, gint col)
+static inline GtkSheetButton *
+xxx_column_button(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
+  if ( col < 0 ) return NULL ;
 
-  return g_sheet_column_get_button(col_geo, col, sheet);
+  return g_sheet_column_get_button(col_geo, col);
 }
 
 
 static inline gint
-xxx_column_left_xpixel(GtkSheet *sheet, gint col)
+xxx_column_left_xpixel(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *geo = sheet->column_geometry;
 
-  gint x = g_sheet_column_start_pixel(geo, col, sheet);
+  gint x = g_sheet_column_start_pixel(geo, col);
 
-  if ( sheet->row_titles_visible ) 
+  if ( sheet->row_titles_visible )
     x += sheet->row_title_area.width;
 
   return x;
@@ -284,15 +293,15 @@ xxx_column_width(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_width(col_geo, col, sheet);
+  return g_sheet_column_get_width(col_geo, col);
 }
 
 
 static inline void
 xxx_set_column_width(GtkSheet *sheet, gint col, gint width)
 {
-  if ( sheet->column_geometry ) 
-    g_sheet_column_set_width(sheet->column_geometry, col, width, sheet);
+  if ( sheet->column_geometry )
+    g_sheet_column_set_width(sheet->column_geometry, col, width);
 }
 
 static inline void
@@ -300,7 +309,7 @@ xxx_column_set_left_column(GtkSheet *sheet, gint col, gint i)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  g_sheet_column_set_left_text_column(col_geo, col, i, sheet);
+  g_sheet_column_set_left_text_column(col_geo, col, i);
 }
 
 static inline gint
@@ -308,7 +317,7 @@ xxx_column_left_column(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_left_text_column(col_geo, col, sheet);
+  return g_sheet_column_get_left_text_column(col_geo, col);
 }
 
 static inline void
@@ -316,7 +325,7 @@ xxx_column_set_right_column(GtkSheet *sheet, gint col, gint i)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  g_sheet_column_set_right_text_column(col_geo, col, i, sheet);
+  g_sheet_column_set_right_text_column(col_geo, col, i);
 }
 
 static inline gint
@@ -324,7 +333,7 @@ xxx_column_right_column(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_right_text_column(col_geo, col, sheet);
+  return g_sheet_column_get_right_text_column(col_geo, col);
 }
 
 static inline GtkJustification
@@ -332,31 +341,31 @@ xxx_column_justification(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_justification(col_geo, col, sheet);
+  return g_sheet_column_get_justification(col_geo, col);
 }
 
 static inline gint
-xxx_column_is_visible(GtkSheet *sheet, gint col)
+xxx_column_is_visible(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_visibility(col_geo, col, sheet);
+  return g_sheet_column_get_visibility(col_geo, col);
 }
 
 
 static inline gint
-xxx_column_is_sensitive(GtkSheet *sheet, gint col)
+xxx_column_is_sensitive(const GtkSheet *sheet, gint col)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_sensitivity(col_geo, col, sheet);
+  return g_sheet_column_get_sensitivity(col_geo, col);
 }
 
 
 /* gives the left pixel of the given column in context of
  * the sheet's hoffset */
 static inline gint
-COLUMN_LEFT_XPIXEL(GtkSheet *sheet, gint ncol)
+COLUMN_LEFT_XPIXEL(const GtkSheet *sheet, gint ncol)
 {
   return (sheet->hoffset + xxx_column_left_xpixel(sheet, ncol));
 }
@@ -366,25 +375,25 @@ xxx_column_count(const GtkSheet *sheet)
 {
   GSheetColumn *col_geo = sheet->column_geometry;
 
-  return g_sheet_column_get_column_count(col_geo, sheet);
+  return g_sheet_column_get_column_count(col_geo);
 }
 
-/* returns the column index from a x pixel location in the 
+/* returns the column index from a x pixel location in the
  * context of the sheet's hoffset */
 static inline gint
-COLUMN_FROM_XPIXEL (GtkSheet * sheet,
+COLUMN_FROM_XPIXEL (const GtkSheet * sheet,
                    gint x)
 {
   gint i, cx;
 
   cx = sheet->hoffset;
-  if( sheet->row_titles_visible ) 
+  if( sheet->row_titles_visible )
     cx += sheet->row_title_area.width;
 
   if(x < cx) return 0;
   for (i = 0; i < xxx_column_count(sheet); i++)
     {
-      if (x >= cx  && x <= (cx + xxx_column_width(sheet, i)) && 
+      if (x >= cx  && x <= (cx + xxx_column_width(sheet, i)) &&
          xxx_column_is_visible(sheet, i))
        return i;
       if( xxx_column_is_visible(sheet, i))
@@ -400,12 +409,12 @@ static inline gint SHEET_HEIGHT(GtkSheet *sheet)
 {
   const gint n_rows = yyy_row_count(sheet);
 
-  return yyy_row_top_ypixel(sheet, n_rows - 1) + 
+  return yyy_row_top_ypixel(sheet, n_rows - 1) +
     yyy_row_height(sheet, n_rows - 1);
 }
 
 
-static inline const GtkSheetButton *
+static inline GtkSheetButton *
 yyy_row_button(GtkSheet *sheet, gint row)
 {
   GSheetRow *row_geo = sheet->row_geometry;
@@ -419,7 +428,7 @@ yyy_row_button(GtkSheet *sheet, gint row)
 static inline void
 yyy_set_row_height(GtkSheet *sheet, gint row, gint height)
 {
-  if ( sheet->row_geometry ) 
+  if ( sheet->row_geometry )
     g_sheet_row_set_height(sheet->row_geometry, row, height, sheet);
 }
 
@@ -431,10 +440,10 @@ static inline gint SHEET_WIDTH(GtkSheet *sheet)
   gint i,cx;
 
   cx = ( sheet->row_titles_visible ? sheet->row_title_area.width : 0);
+
   for (i=0; i < xxx_column_count(sheet); i++)
     if(xxx_column_is_visible(sheet, i)) cx += xxx_column_width(sheet, i);
-  
+
   return cx;
 }
 
@@ -444,15 +453,15 @@ static inline gint SHEET_WIDTH(GtkSheet *sheet)
 #define MAX_VISIBLE_COLUMN(sheet) sheet->view.coli
 
 
-static inline gint
-POSSIBLE_XDRAG(GtkSheet *sheet, gint x, gint *drag_column)
+static inline gboolean
+POSSIBLE_XDRAG(const GtkSheet *sheet, gint x, gint *drag_column)
 {
  gint column, xdrag;
 
  column=COLUMN_FROM_XPIXEL(sheet, x);
  *drag_column=column;
 
- xdrag=COLUMN_LEFT_XPIXEL(sheet,column)+CELL_SPACING;
+ xdrag = COLUMN_LEFT_XPIXEL(sheet, column)+CELL_SPACING;
  if(x <= xdrag+DRAG_WIDTH/2 && column != 0){
    while(! xxx_column_is_visible(sheet, column-1) && column>0) column--;
    *drag_column=column-1;
@@ -464,13 +473,12 @@ POSSIBLE_XDRAG(GtkSheet *sheet, gint x, gint *drag_column)
    return xxx_column_is_sensitive(sheet, column);
 
  return FALSE;
-} 
+}
 
-static inline gint
-POSSIBLE_YDRAG(GtkSheet *sheet, gint y, gint *drag_row)
+static inline gboolean
+POSSIBLE_YDRAG(const GtkSheet *sheet, gint y, gint *drag_row)
 {
  gint row, ydrag;
-
  row=ROW_FROM_YPIXEL(sheet, y);
  *drag_row=row;
 
@@ -485,65 +493,83 @@ POSSIBLE_YDRAG(GtkSheet *sheet, gint y, gint *drag_row)
 
  if(y >= ydrag-DRAG_WIDTH/2 && y <= ydrag+DRAG_WIDTH/2)
    return yyy_row_is_sensitive(sheet, row);
+
+
  return FALSE;
-}        
+}
 
-static inline gint POSSIBLE_DRAG(GtkSheet *sheet, gint x, gint y,
-                            gint *drag_row, gint *drag_column)
+static inline gboolean
+POSSIBLE_DRAG(const GtkSheet *sheet, gint x, gint y,
+             gint *drag_row, gint *drag_column)
 {
   gint ydrag, xdrag;
 
-  *drag_column=COLUMN_FROM_XPIXEL(sheet,x);
-  *drag_row=ROW_FROM_YPIXEL(sheet,y);
+  /* Can't drag if nothing is selected */
+  if ( sheet->range.row0 < 0 || sheet->range.rowi < 0 ||
+       sheet->range.col0 < 0 || sheet->range.coli < 0 )
+    return FALSE;
 
-  if(x>=COLUMN_LEFT_XPIXEL(sheet,sheet->range.col0)-DRAG_WIDTH/2 &&
-     x<=COLUMN_LEFT_XPIXEL(sheet,sheet->range.coli)+
-     xxx_column_width(sheet, sheet->range.coli) + DRAG_WIDTH/2){
-    ydrag=ROW_TOP_YPIXEL(sheet,sheet->range.row0);
-     if(y>=ydrag-DRAG_WIDTH/2 && y<=ydrag+DRAG_WIDTH/2){
-        *drag_row=sheet->range.row0;
-        return TRUE;
-     }
-     ydrag=ROW_TOP_YPIXEL(sheet,sheet->range.rowi)+
-           yyy_row_height(sheet, sheet->range.rowi);
-     if(y>=ydrag-DRAG_WIDTH/2 && y<=ydrag+DRAG_WIDTH/2){
-        *drag_row=sheet->range.rowi;
-        return TRUE;
-     }
-  }
+  *drag_column = COLUMN_FROM_XPIXEL(sheet, x);
+  *drag_row = ROW_FROM_YPIXEL(sheet, y);
 
-  if(y>=ROW_TOP_YPIXEL(sheet,sheet->range.row0)-DRAG_WIDTH/2 &&
-     y<=ROW_TOP_YPIXEL(sheet,sheet->range.rowi)+
-        yyy_row_height(sheet, sheet->range.rowi)+DRAG_WIDTH/2){
-     xdrag=COLUMN_LEFT_XPIXEL(sheet,sheet->range.col0);
-     if(x>=xdrag-DRAG_WIDTH/2 && x<=xdrag+DRAG_WIDTH/2){
-        *drag_column=sheet->range.col0;
-        return TRUE;
-     }
-     xdrag=COLUMN_LEFT_XPIXEL(sheet,sheet->range.coli)+
-           xxx_column_width(sheet, sheet->range.coli);
-     if(x>=xdrag-DRAG_WIDTH/2 && x<=xdrag+DRAG_WIDTH/2){
-        *drag_column=sheet->range.coli;
-        return TRUE;
-     }
-  }
+  if(x >= COLUMN_LEFT_XPIXEL(sheet, sheet->range.col0) - DRAG_WIDTH/2 &&
+     x <= COLUMN_LEFT_XPIXEL(sheet, sheet->range.coli) +
+     xxx_column_width(sheet, sheet->range.coli) + DRAG_WIDTH/2)
+    {
+      ydrag=ROW_TOP_YPIXEL(sheet,sheet->range.row0);
+      if(y >= ydrag - DRAG_WIDTH/2 && y <= ydrag + DRAG_WIDTH/2)
+       {
+         *drag_row = sheet->range.row0;
+         return TRUE;
+       }
+      ydrag = ROW_TOP_YPIXEL(sheet, sheet->range.rowi) +
+       yyy_row_height(sheet, sheet->range.rowi);
+      if(y >= ydrag - DRAG_WIDTH/2 && y <= ydrag+DRAG_WIDTH/2)
+       {
+         *drag_row = sheet->range.rowi;
+         return TRUE;
+       }
+    }
+
+  if(y >= ROW_TOP_YPIXEL(sheet, sheet->range.row0) - DRAG_WIDTH/2 &&
+     y <= ROW_TOP_YPIXEL(sheet, sheet->range.rowi) +
+     yyy_row_height(sheet, sheet->range.rowi) + DRAG_WIDTH/2)
+    {
+      xdrag = COLUMN_LEFT_XPIXEL(sheet, sheet->range.col0);
+      if(x >= xdrag-DRAG_WIDTH/2 && x <= xdrag + DRAG_WIDTH/2)
+       {
+         *drag_column = sheet->range.col0;
+         return TRUE;
+       }
+      xdrag = COLUMN_LEFT_XPIXEL(sheet, sheet->range.coli) +
+       xxx_column_width(sheet, sheet->range.coli);
+      if(x >= xdrag - DRAG_WIDTH/2 && x <= xdrag + DRAG_WIDTH/2)
+       {
+         *drag_column = sheet->range.coli;
+         return TRUE;
+       }
+    }
   return FALSE;
 }
 
-static inline gint POSSIBLE_RESIZE(GtkSheet *sheet, gint x, gint y,
+static inline gboolean
+POSSIBLE_RESIZE(const GtkSheet *sheet, gint x, gint y,
                             gint *drag_row, gint *drag_column)
 {
   gint xdrag, ydrag;
-  
-  xdrag=COLUMN_LEFT_XPIXEL(sheet,sheet->range.coli)+
+
+  /* Can't drag if nothing is selected */
+  if ( sheet->range.row0 < 0 || sheet->range.rowi < 0 ||
+       sheet->range.col0 < 0 || sheet->range.coli < 0 )
+    return FALSE;
+
+  xdrag = COLUMN_LEFT_XPIXEL(sheet,sheet->range.coli)+
     xxx_column_width(sheet, sheet->range.coli);
 
-  ydrag=ROW_TOP_YPIXEL(sheet,sheet->range.rowi)+
+  ydrag = ROW_TOP_YPIXEL(sheet,sheet->range.rowi)+
            yyy_row_height(sheet, sheet->range.rowi);
 
-  if(sheet->state == GTK_SHEET_COLUMN_SELECTED) 
+  if(sheet->state == GTK_SHEET_COLUMN_SELECTED)
         ydrag = ROW_TOP_YPIXEL(sheet, sheet->view.row0);
 
   if(sheet->state == GTK_SHEET_ROW_SELECTED)
@@ -555,7 +581,7 @@ static inline gint POSSIBLE_RESIZE(GtkSheet *sheet, gint x, gint y,
   if(x>=xdrag-DRAG_WIDTH/2 && x<=xdrag+DRAG_WIDTH/2 &&
      y>=ydrag-DRAG_WIDTH/2 && y<=ydrag+DRAG_WIDTH/2) return TRUE;
 
-  return FALSE;  
+  return FALSE;
 }
 
 static void gtk_sheet_class_init               (GtkSheetClass * klass);
@@ -572,8 +598,8 @@ static gint gtk_sheet_expose                        (GtkWidget * widget,
                                                 GdkEventExpose * event);
 static void gtk_sheet_forall                   (GtkContainer *container,
                                                 gboolean include_internals,
-                                                GtkCallback  callback, 
-                                                gpointer  callback_data); 
+                                                GtkCallback  callback,
+                                                gpointer  callback_data);
 
 static void gtk_sheet_set_scroll_adjustments   (GtkSheet *sheet,
                                                 GtkAdjustment *hadjustment,
@@ -608,39 +634,39 @@ static gint gtk_sheet_flash                       (gpointer data);
 /* Drawing Routines */
 
 /* draw cell background and frame */
-static void gtk_sheet_cell_draw_default        (GtkSheet *sheet, 
+static void gtk_sheet_cell_draw_default        (GtkSheet *sheet,
                                                 gint row, gint column);
 
 /* draw cell border */
-static void gtk_sheet_cell_draw_border                 (GtkSheet *sheet, 
-                                                gint row, gint column, 
+static void gtk_sheet_cell_draw_border                 (GtkSheet *sheet,
+                                                gint row, gint column,
                                                 gint mask);
 
 /* draw cell contents */
-static void gtk_sheet_cell_draw_label          (GtkSheet *sheet, 
+static void gtk_sheet_cell_draw_label          (GtkSheet *sheet,
                                                 gint row, gint column);
 
 /* draw visible part of range. If range==NULL then draw the whole screen */
-static void gtk_sheet_range_draw               (GtkSheet *sheet, 
+static void gtk_sheet_range_draw               (GtkSheet *sheet,
                                                 const GtkSheetRange *range);
 
 /* highlight the visible part of the selected range */
-static void gtk_sheet_range_draw_selection     (GtkSheet *sheet, 
+static void gtk_sheet_range_draw_selection     (GtkSheet *sheet,
                                                 GtkSheetRange range);
 
 /* Selection */
 
-static gint gtk_sheet_move_query               (GtkSheet *sheet, 
+static gint gtk_sheet_move_query               (GtkSheet *sheet,
                                                 gint row, gint column);
 static void gtk_sheet_real_select_range        (GtkSheet * sheet,
-                                                GtkSheetRange * range);
+                                                const GtkSheetRange * range);
 static void gtk_sheet_real_unselect_range      (GtkSheet * sheet,
                                                 const GtkSheetRange * range);
-static void gtk_sheet_extend_selection         (GtkSheet *sheet, 
+static void gtk_sheet_extend_selection         (GtkSheet *sheet,
                                                 gint row, gint column);
-static void gtk_sheet_new_selection            (GtkSheet *sheet, 
+static void gtk_sheet_new_selection            (GtkSheet *sheet,
                                                 GtkSheetRange *range);
-static void gtk_sheet_draw_border              (GtkSheet *sheet, 
+static void gtk_sheet_draw_border              (GtkSheet *sheet,
                                                 GtkSheetRange range);
 static void gtk_sheet_draw_corners             (GtkSheet *sheet,
                                                 GtkSheetRange range);
@@ -648,24 +674,24 @@ static void gtk_sheet_draw_corners                (GtkSheet *sheet,
 
 /* Active Cell handling */
 
-static void gtk_sheet_entry_changed            (GtkWidget *widget, 
+static void gtk_sheet_entry_changed            (GtkWidget *widget,
                                                 gpointer data);
 static gboolean gtk_sheet_deactivate_cell      (GtkSheet *sheet);
 static void gtk_sheet_hide_active_cell         (GtkSheet *sheet);
-static gboolean gtk_sheet_activate_cell                (GtkSheet *sheet, 
+static gboolean gtk_sheet_activate_cell                (GtkSheet *sheet,
                                                 gint row, gint col);
 static void gtk_sheet_draw_active_cell         (GtkSheet *sheet);
 static void gtk_sheet_show_active_cell         (GtkSheet *sheet);
-static void gtk_sheet_click_cell               (GtkSheet *sheet, 
-                                                gint row, 
+static void gtk_sheet_click_cell               (GtkSheet *sheet,
+                                                gint row,
                                                 gint column,
                                                 gboolean *veto);
 
 /* Backing Pixmap */
 
-static void gtk_sheet_make_backing_pixmap      (GtkSheet *sheet, 
+static void gtk_sheet_make_backing_pixmap      (GtkSheet *sheet,
                                                 guint width, guint height);
-static void gtk_sheet_draw_backing_pixmap      (GtkSheet *sheet, 
+static void gtk_sheet_draw_backing_pixmap      (GtkSheet *sheet,
                                                 GtkSheetRange range);
 /* Scrollbars */
 
@@ -682,9 +708,9 @@ static void hadjustment_value_changed               (GtkAdjustment * adjustment,
 
 static void draw_xor_vline                     (GtkSheet * sheet);
 static void draw_xor_hline                     (GtkSheet * sheet);
-static void draw_xor_rectangle                 (GtkSheet *sheet, 
+static void draw_xor_rectangle                 (GtkSheet *sheet,
                                                 GtkSheetRange range);
-static void gtk_sheet_draw_flashing_range      (GtkSheet *sheet, 
+static void gtk_sheet_draw_flashing_range      (GtkSheet *sheet,
                                                 GtkSheetRange range);
 static guint new_column_width                  (GtkSheet * sheet,
                                                 gint column,
@@ -695,7 +721,7 @@ static guint new_row_height                         (GtkSheet * sheet,
 /* Sheet Button */
 
 static void create_global_button               (GtkSheet *sheet);
-static void global_button_clicked              (GtkWidget *widget, 
+static void global_button_clicked              (GtkWidget *widget,
                                                 gpointer data);
 /* Sheet Entry */
 
@@ -709,23 +735,21 @@ static void size_allocate_column_title_buttons    (GtkSheet * sheet);
 static void size_allocate_row_title_buttons    (GtkSheet * sheet);
 
 
-static void gtk_sheet_button_draw              (GtkSheet *sheet, 
-                                                gint row, gint column);
 static void size_allocate_global_button        (GtkSheet *sheet);
 static void gtk_sheet_button_size_request      (GtkSheet *sheet,
-                                                const GtkSheetButton *button, 
+                                                const GtkSheetButton *button,
                                                 GtkRequisition *requisition);
 
 /* Attributes routines */
-static void init_attributes                    (GtkSheet *sheet, gint col,  
+static void init_attributes                    (const GtkSheet *sheet, gint col,
                                                 GtkSheetCellAttr *attributes);
 
 
 /* Memory allocation routines */
-static void gtk_sheet_real_range_clear                 (GtkSheet *sheet, 
-                                                const GtkSheetRange *range, 
+static void gtk_sheet_real_range_clear                 (GtkSheet *sheet,
+                                                const GtkSheetRange *range,
                                                 gboolean delete);
-static void gtk_sheet_real_cell_clear          (GtkSheet *sheet, 
+static void gtk_sheet_real_cell_clear          (GtkSheet *sheet,
                                                 gint row,
                                                 gint column,
                                                 gboolean delete);
@@ -739,8 +763,8 @@ static void gtk_sheet_realize_child         (GtkSheet *sheet,
 static void gtk_sheet_position_child           (GtkSheet *sheet,
                                                 GtkSheetChild *child);
 static void gtk_sheet_position_children                (GtkSheet *sheet);
-static void gtk_sheet_child_show               (GtkSheetChild *child); 
-static void gtk_sheet_child_hide               (GtkSheetChild *child); 
+static void gtk_sheet_child_show               (GtkSheetChild *child);
+static void gtk_sheet_child_hide               (GtkSheetChild *child);
 static void gtk_sheet_column_size_request       (GtkSheet *sheet,
                                                  gint col,
                                                  guint *requisition);
@@ -751,20 +775,20 @@ static void gtk_sheet_row_size_request          (GtkSheet *sheet,
 
 /* Signals */
 
-extern void 
+extern void
 _gtkextra_signal_emit(GtkObject *object, guint signal_id, ...);
 
 enum {
-      SELECT_ROW, 
-      SELECT_COLUMN, 
+      SELECT_ROW,
+      SELECT_COLUMN,
       DOUBLE_CLICK_ROW,
       DOUBLE_CLICK_COLUMN,
       SELECT_RANGE,
       CLIP_RANGE,
       RESIZE_RANGE,
       MOVE_RANGE,
-      TRAVERSE, 
-      DEACTIVATE, 
+      TRAVERSE,
+      DEACTIVATE,
       ACTIVATE,
       SET_CELL,
       CLEAR_CELL,
@@ -782,7 +806,7 @@ GType
 gtk_sheet_get_type ()
 {
   static GType sheet_type = 0;
-                                                                                
+
   if (!sheet_type)
     {
       static const GTypeInfo sheet_info =
@@ -791,10 +815,10 @@ gtk_sheet_get_type ()
         NULL,
         NULL,
         (GClassInitFunc) gtk_sheet_class_init,
-        NULL,        
-        NULL,       
+        NULL,
+        NULL,
         sizeof (GtkSheet),
-        0,         
+        0,
         (GInstanceInitFunc) gtk_sheet_init,
         NULL,
       };
@@ -1058,7 +1082,7 @@ gtk_sheet_class_init (GtkSheetClass * klass)
 
 }
 
-static void 
+static void
 gtk_sheet_init (GtkSheet *sheet)
 {
   sheet->column_geometry = NULL;
@@ -1084,7 +1108,7 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->column_title_area.y=0;
   sheet->column_title_area.width=0;
   sheet->column_title_area.height=DEFAULT_ROW_HEIGHT(GTK_WIDGET(sheet));
+
   sheet->row_title_window=NULL;
   sheet->row_title_area.x=0;
   sheet->row_title_area.y=0;
@@ -1100,10 +1124,10 @@ gtk_sheet_init (GtkSheet *sheet)
   sheet->sheet_entry=NULL;
   sheet->pixmap=NULL;
 
-  sheet->range.row0=0;
-  sheet->range.rowi=0;
-  sheet->range.col0=0;
-  sheet->range.coli=0;
+  sheet->range.row0 = 0;
+  sheet->range.rowi = 0;
+  sheet->range.col0 = 0;
+  sheet->range.coli = 0;
 
   sheet->state=GTK_SHEET_NORMAL;
 
@@ -1134,15 +1158,59 @@ gtk_sheet_init (GtkSheet *sheet)
 }
 
 
+/* Callback which occurs whenever columns are inserted/deleted in the model */
+static void
+columns_inserted_deleted_callback (GSheetModel *model, gint first_column, gint n_columns,
+                     gpointer data)
+{
+  gint i;
+  GtkSheet *sheet = GTK_SHEET(data);
+
+  GtkSheetRange range;
+  gint model_columns = g_sheet_model_get_column_count(model);
+
+
+  /* Need to update all the columns starting from the first column and onwards.
+   * Previous column are unchanged, so don't need to be updated.
+   */
+  range.col0 = first_column;
+  range.row0 = 0;
+  range.coli = xxx_column_count(sheet) - 1;
+  range.rowi = yyy_row_count(sheet) - 1;
+
+  sheet->view.col0 =
+    COLUMN_FROM_XPIXEL(sheet, sheet->row_title_area.width + 1);
+
+  sheet->view.coli =
+    COLUMN_FROM_XPIXEL(sheet, sheet->sheet_window_width);
+
+  if ( sheet->view.coli > range.coli)
+    sheet->view.coli = range.coli;
+
+  adjust_scrollbars(sheet);
+
+  if (sheet->active_cell.col >= model_columns)
+    gtk_sheet_activate_cell(sheet, sheet->active_cell.row, model_columns - 1);
+
+  for(i = first_column; i <= MAX_VISIBLE_COLUMN(sheet); i++)
+    gtk_sheet_column_title_button_draw(sheet, i);
+
+  gtk_sheet_range_draw(sheet, &range);
+}
+
+
 /* Callback which occurs whenever rows are inserted/deleted in the model */
-static void 
-rows_inserted_deleted_callback (GSheetModel *m, gint first_row, gint n_rows,
+static void
+rows_inserted_deleted_callback (GSheetModel *model, gint first_row, gint n_rows,
                      gpointer data)
 {
+  gint i;
   GtkSheet *sheet = GTK_SHEET(data);
 
   GtkSheetRange range;
 
+  gint model_rows = g_sheet_model_get_row_count(model);
+
   /* Need to update all the rows starting from the first row and onwards.
    * Previous rows are unchanged, so don't need to be updated.
    */
@@ -1150,16 +1218,32 @@ rows_inserted_deleted_callback (GSheetModel *m, gint first_row, gint n_rows,
   range.col0 = 0;
   range.rowi = yyy_row_count(sheet) - 1;
   range.coli = xxx_column_count(sheet) - 1;
-  
+
+  sheet->view.row0 =
+    ROW_FROM_YPIXEL(sheet, sheet->column_title_area.height + 1);
+  sheet->view.rowi =
+    ROW_FROM_YPIXEL(sheet, sheet->sheet_window_height - 1);
+
+  if ( sheet->view.rowi > range.rowi)
+    sheet->view.rowi = range.rowi;
+
+  adjust_scrollbars(sheet);
+
+  if (sheet->active_cell.row >= model_rows)
+    gtk_sheet_activate_cell(sheet, model_rows - 1, sheet->active_cell.col);
+
+  for(i = first_row; i <= MAX_VISIBLE_ROW(sheet); i++)
+    gtk_sheet_row_title_button_draw(sheet, i);
+
   gtk_sheet_range_draw(sheet, &range);
 }
 
-/* 
+/*
    If row0 or rowi are negative, then all rows will be updated.
    If col0 or coli are negative, then all columns will be updated.
 */
-static void 
-range_update_callback (GSheetModel *m, gint row0, gint col0, 
+static void
+range_update_callback (GSheetModel *m, gint row0, gint col0,
      gint rowi, gint coli, gpointer data)
 {
   GtkSheet *sheet = GTK_SHEET(data);
@@ -1186,7 +1270,7 @@ range_update_callback (GSheetModel *m, gint row0, gint col0,
       range.col0=MIN_VISIBLE_COLUMN(sheet);
       range.coli=MAX_VISIBLE_COLUMN(sheet);
     }
-  
+
   gtk_sheet_range_draw(sheet, &range);
 }
 
@@ -1218,7 +1302,7 @@ gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo, const gchar *title,
 
   gtk_sheet_construct(GTK_SHEET(widget), vgeo, hgeo, title);
 
-  if (model) 
+  if (model)
     gtk_sheet_set_model(GTK_SHEET(widget), model);
 
 
@@ -1242,7 +1326,7 @@ gtk_sheet_set_model(GtkSheet *sheet, GSheetModel *model)
 
   sheet->model = model;
 
-  g_signal_connect(model, "range_changed", 
+  g_signal_connect(model, "range_changed",
                   G_CALLBACK(range_update_callback), sheet);
 
   g_signal_connect(model, "rows_inserted",
@@ -1251,28 +1335,48 @@ gtk_sheet_set_model(GtkSheet *sheet, GSheetModel *model)
   g_signal_connect(model, "rows_deleted",
                   G_CALLBACK(rows_inserted_deleted_callback), sheet);
 
-}
+  g_signal_connect(model, "columns_inserted",
+                  G_CALLBACK(columns_inserted_deleted_callback), sheet);
 
+  g_signal_connect(model, "columns_deleted",
+                  G_CALLBACK(columns_inserted_deleted_callback), sheet);
+
+}
 
 
+/* Call back for when the column titles have changed.
+   FIRST is the first column changed.
+   N_COLUMNS is the number of columns which have changed, or -1, which
+   indicates that the column has changed to its right-most extremity
+ */
 static void
 column_titles_changed(GtkWidget *w, gint first, gint n_columns, gpointer data)
 {
   GtkSheet *sheet = GTK_SHEET(data);
+  gboolean extremity = FALSE;
+
+  if ( n_columns == -1 )
+    {
+      extremity = TRUE;
+      n_columns = xxx_column_count(sheet) - 1 ;
+    }
 
+  if(!GTK_SHEET_IS_FROZEN(sheet))
+    {
+      gint i;
+      for ( i = first ; i <= first + n_columns ; ++i )
+       {
+         gtk_sheet_column_title_button_draw(sheet, i);
+         gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[CHANGED], -1, i);
+       }
+    }
+  if ( extremity)
+    gtk_sheet_column_title_button_draw(sheet, -1);
 
-  if(!GTK_SHEET_IS_FROZEN(sheet)){  
-    gint i;
-    for ( i = first ; i <= MAX_VISIBLE_COLUMN(sheet) ; ++i ) 
-      {
-       gtk_sheet_button_draw(sheet, -1, i);
-       gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[CHANGED], -1, i);
-      }
-  }
 }
 
 static void
-gtk_sheet_construct (GtkSheet *sheet, 
+gtk_sheet_construct (GtkSheet *sheet,
                     GSheetRow *vgeo,
                     GSheetColumn *hgeo,
                     const gchar *title)
@@ -1282,7 +1386,7 @@ gtk_sheet_construct (GtkSheet *sheet,
 
   sheet->column_geometry = hgeo;
   sheet->row_geometry = vgeo;
-  
+
 
   sheet->columns_resizable = TRUE;
   sheet->rows_resizable = TRUE;
@@ -1293,7 +1397,6 @@ gtk_sheet_construct (GtkSheet *sheet,
   sheet->column_titles_visible = TRUE;
   sheet->autoscroll = TRUE;
   sheet->justify_entry = TRUE;
-  sheet->locked = FALSE;
 
 
   /* create sheet entry */
@@ -1306,7 +1409,7 @@ gtk_sheet_construct (GtkSheet *sheet,
   if(title)
      sheet->name = g_strdup(title);
 
-  g_signal_connect(sheet->column_geometry, "columns_changed", 
+  g_signal_connect(sheet->column_geometry, "columns_changed",
                   G_CALLBACK(column_titles_changed), sheet);
 
 }
@@ -1317,17 +1420,17 @@ gtk_sheet_new_with_custom_entry (GSheetRow *rows, GSheetColumn *columns, const g
                                  GtkType entry_type)
 {
   GtkWidget *widget;
-  
+
   widget = gtk_type_new (gtk_sheet_get_type ());
 
-  gtk_sheet_construct_with_custom_entry(GTK_SHEET(widget), 
+  gtk_sheet_construct_with_custom_entry(GTK_SHEET(widget),
                                        rows, columns, title, entry_type);
+
   return widget;
 }
 
 void
-gtk_sheet_construct_with_custom_entry (GtkSheet *sheet, 
+gtk_sheet_construct_with_custom_entry (GtkSheet *sheet,
                                       GSheetRow *vgeo,
                                       GSheetColumn *hgeo,
                                       const gchar *title,
@@ -1360,15 +1463,12 @@ gtk_sheet_change_entry(GtkSheet *sheet, GtkType entry_type)
 
   if(state == GTK_SHEET_NORMAL)
     {
-      gtk_sheet_show_active_cell(sheet); 
+      gtk_sheet_show_active_cell(sheet);
       g_signal_connect(G_OBJECT(gtk_sheet_get_entry(sheet)),
                         "changed",
                         G_CALLBACK(gtk_sheet_entry_changed),
                         sheet);
-
-
     }
 }
 
 void
@@ -1378,10 +1478,10 @@ gtk_sheet_show_grid(GtkSheet *sheet, gboolean show)
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if(show == sheet->show_grid) return;
+
   sheet->show_grid = show;
 
-  if(!GTK_SHEET_IS_FROZEN(sheet)) 
+  if(!GTK_SHEET_IS_FROZEN(sheet))
     gtk_sheet_range_draw(sheet, NULL);
 }
 
@@ -1406,7 +1506,7 @@ gtk_sheet_set_background(GtkSheet *sheet, GdkColor *color)
   } else
     sheet->bg_color = *color;
 
-  if(!GTK_SHEET_IS_FROZEN(sheet)) 
+  if(!GTK_SHEET_IS_FROZEN(sheet))
     gtk_sheet_range_draw(sheet, NULL);
 }
 
@@ -1422,7 +1522,7 @@ gtk_sheet_set_grid(GtkSheet *sheet, GdkColor *color)
   }else
     sheet->grid_color = *color;
 
-  if(!GTK_SHEET_IS_FROZEN(sheet)) 
+  if(!GTK_SHEET_IS_FROZEN(sheet))
     gtk_sheet_range_draw(sheet, NULL);
 }
 
@@ -1585,16 +1685,33 @@ gtk_sheet_set_locked             (GtkSheet *sheet, gboolean locked)
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
-  sheet->locked = locked;
+  if ( locked )
+    {
+      GTK_SHEET_SET_FLAGS(sheet,GTK_SHEET_IS_LOCKED);
+      gtk_widget_hide(sheet->sheet_entry);
+      gtk_widget_unmap(sheet->sheet_entry);
+    }
+  else
+    {
+      GTK_SHEET_UNSET_FLAGS(sheet,GTK_SHEET_IS_LOCKED);
+      if (GTK_WIDGET_MAPPED(GTK_WIDGET(sheet)))
+       {
+         gtk_widget_show (sheet->sheet_entry);
+         gtk_widget_map (sheet->sheet_entry);
+       }
+    }
+
+  gtk_entry_set_editable(GTK_ENTRY(sheet->sheet_entry), locked);
+
 }
 
 gboolean
-gtk_sheet_locked                    (GtkSheet *sheet)
+gtk_sheet_locked                    (const GtkSheet *sheet)
 {
   g_return_val_if_fail (sheet != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
 
-  return sheet->locked;
+  return GTK_SHEET_IS_LOCKED(sheet);
 }
 
 /* This routine has problems with gtk+-1.2 related with the
@@ -1676,10 +1793,10 @@ gtk_sheet_thaw(GtkSheet *sheet)
   sheet->old_hadjustment = -1.;
 
   if(sheet->hadjustment)
-      gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment),
                              "value_changed");
   if(sheet->vadjustment)
-      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                              "value_changed");
 
   if(sheet->state == GTK_STATE_NORMAL)
@@ -1710,7 +1827,7 @@ gtk_sheet_set_row_titles_width(GtkSheet *sheet, guint width)
 
  sheet->old_hadjustment = -1.;
  if(sheet->hadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment),
                              "value_changed");
  size_allocate_global_button(sheet);
 }
@@ -1728,7 +1845,7 @@ gtk_sheet_set_column_titles_height(GtkSheet *sheet, guint height)
 
  sheet->old_vadjustment = -1.;
  if(sheet->vadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                              "value_changed");
  size_allocate_global_button(sheet);
 }
@@ -1751,21 +1868,22 @@ gtk_sheet_show_column_titles(GtkSheet *sheet)
                           sheet->column_title_area.width,
                           sheet->column_title_area.height);
 
-  for(col = MIN_VISIBLE_COLUMN(sheet); 
-      col <= MAX_VISIBLE_COLUMN(sheet); 
+  for(col = MIN_VISIBLE_COLUMN(sheet);
+      col <= MAX_VISIBLE_COLUMN(sheet);
       col++)
     {
-      const GtkSheetButton *button = xxx_column_button(sheet, col);
+      GtkSheetButton *button = xxx_column_button(sheet, col);
       GtkSheetChild *child = button->child;
       if(child)
         gtk_sheet_child_show(child);
+      gtk_sheet_button_free(button);
     }
   adjust_scrollbars(sheet);
- } 
+ }
 
  sheet->old_vadjustment = -1.;
  if(sheet->vadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                              "value_changed");
  size_allocate_global_button(sheet);
 }
@@ -1789,8 +1907,8 @@ gtk_sheet_show_row_titles(GtkSheet *sheet)
                           sheet->row_title_area.width,
                           sheet->row_title_area.height);
 
-  for(row = MIN_VISIBLE_ROW(sheet); 
-      row <= MAX_VISIBLE_ROW(sheet); 
+  for(row = MIN_VISIBLE_ROW(sheet);
+      row <= MAX_VISIBLE_ROW(sheet);
       row++)
     {
       const GtkSheetButton *button = yyy_row_button(sheet, row);
@@ -1805,7 +1923,7 @@ gtk_sheet_show_row_titles(GtkSheet *sheet)
 
  sheet->old_hadjustment = -1.;
  if(sheet->hadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment),
                              "value_changed");
  size_allocate_global_button(sheet);
 }
@@ -1820,26 +1938,27 @@ gtk_sheet_hide_column_titles(GtkSheet *sheet)
  sheet->column_titles_visible = FALSE;
 
  if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))){
-  if(sheet->column_title_window) 
+  if(sheet->column_title_window)
     gdk_window_hide(sheet->column_title_window);
-  if(GTK_WIDGET_VISIBLE(sheet->button)) 
+  if(GTK_WIDGET_VISIBLE(sheet->button))
     gtk_widget_hide(sheet->button);
 
-  for(col = MIN_VISIBLE_COLUMN(sheet); 
-      col <= MAX_VISIBLE_COLUMN(sheet); 
+  for(col = MIN_VISIBLE_COLUMN(sheet);
+      col <= MAX_VISIBLE_COLUMN(sheet);
       col++)
     {
-      const GtkSheetButton *button = xxx_column_button(sheet, col);
+      GtkSheetButton *button = xxx_column_button(sheet, col);
       GtkSheetChild *child = button->child;
       if(child)
         gtk_sheet_child_hide(child);
+      gtk_sheet_button_free(button);
   }
   adjust_scrollbars(sheet);
  }
+
  sheet->old_vadjustment = -1.;
  if(sheet->vadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                              "value_changed");
 }
 
@@ -1854,12 +1973,12 @@ gtk_sheet_hide_row_titles(GtkSheet *sheet)
 
 
  if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))){
-  if(sheet->row_title_window) 
+  if(sheet->row_title_window)
     gdk_window_hide(sheet->row_title_window);
-  if(GTK_WIDGET_VISIBLE(sheet->button)) 
+  if(GTK_WIDGET_VISIBLE(sheet->button))
     gtk_widget_hide(sheet->button);
-  for(row = MIN_VISIBLE_ROW(sheet); 
-      row <= MAX_VISIBLE_ROW(sheet); 
+  for(row = MIN_VISIBLE_ROW(sheet);
+      row <= MAX_VISIBLE_ROW(sheet);
       row++)
     {
       const GtkSheetButton *button = yyy_row_button(sheet, row);
@@ -1873,7 +1992,7 @@ gtk_sheet_hide_row_titles(GtkSheet *sheet)
 
  sheet->old_hadjustment = -1.;
  if(sheet->hadjustment)
-     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), 
+     gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment),
                              "value_changed");
 }
 
@@ -1955,11 +2074,11 @@ gtk_sheet_moveto (GtkSheet * sheet,
        sheet->vadjustment->value = y;
 
       sheet->old_vadjustment = -1.;
-      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                               "value_changed");
 
-    } 
-     
+    }
+
   /* adjust horizontal scrollbar */
   if (column >= 0 && col_align >= 0.)
     {
@@ -1980,7 +2099,7 @@ gtk_sheet_moveto (GtkSheet * sheet,
         while(min_col >= 0 && min_col > MIN_VISIBLE_COLUMN(sheet)){
          if(xxx_column_is_visible(sheet, min_col))
           adjust += xxx_column_width(sheet, min_col);
-        
+
          if(adjust >= width){
            break;
          }
@@ -1997,7 +2116,7 @@ gtk_sheet_moveto (GtkSheet * sheet,
        sheet->hadjustment->value = x;
 
       sheet->old_vadjustment = -1.;
-      gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment),
                               "value_changed");
 
     }
@@ -2052,7 +2171,7 @@ gtk_sheet_select_row (GtkSheet * sheet,
   if (row < 0 || row >= yyy_row_count(sheet))
     return;
 
-  if(sheet->state != GTK_SHEET_NORMAL) 
+  if(sheet->state != GTK_SHEET_NORMAL)
      gtk_sheet_real_unselect_range(sheet, NULL);
   else
   {
@@ -2061,32 +2180,29 @@ gtk_sheet_select_row (GtkSheet * sheet,
      if(!veto) return;
   }
 
-  sheet->state=GTK_SHEET_ROW_SELECTED;                     
-  sheet->range.row0=row;
-  sheet->range.col0=0;
-  sheet->range.rowi=row;
+  sheet->state=GTK_SHEET_ROW_SELECTED;
+  sheet->range.row0 = row;
+  sheet->range.col0 = 0;
+  sheet->range.rowi = row;
   sheet->range.coli = xxx_column_count(sheet) - 1;
-  sheet->active_cell.row=row;
-  sheet->active_cell.col=0;
+  sheet->active_cell.row = row;
+  sheet->active_cell.col = 0;
 
   gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_ROW], row);
   gtk_sheet_real_select_range(sheet, NULL);
-
 }
 
 
 void
-gtk_sheet_select_column (GtkSheet * sheet,
-                        gint column)
+gtk_sheet_select_column (GtkSheet * sheet, gint column)
 {
-  
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_IS_SHEET (sheet));
 
   if (column < 0 || column >= xxx_column_count(sheet))
     return;
 
-  if(sheet->state != GTK_SHEET_NORMAL) 
+  if(sheet->state != GTK_SHEET_NORMAL)
      gtk_sheet_real_unselect_range(sheet, NULL);
   else
   {
@@ -2095,17 +2211,16 @@ gtk_sheet_select_column (GtkSheet * sheet,
      if(!veto) return;
   }
 
-  sheet->state=GTK_SHEET_COLUMN_SELECTED;                     
-  sheet->range.row0=0;
-  sheet->range.col0=column;
-  sheet->range.rowi= yyy_row_count(sheet) - 1;
-  sheet->range.coli=column;
-  sheet->active_cell.row=0;
-  sheet->active_cell.col=column;
+  sheet->state=GTK_SHEET_COLUMN_SELECTED;
+  sheet->range.row0 = 0;
+  sheet->range.col0 = column;
+  sheet->range.rowi = yyy_row_count(sheet) - 1;
+  sheet->range.coli = column;
+  sheet->active_cell.row = 0;
+  sheet->active_cell.col = column;
 
   gtk_signal_emit (GTK_OBJECT (sheet), sheet_signals[SELECT_COLUMN], column);
   gtk_sheet_real_select_range(sheet, NULL);
-
 }
 
 void
@@ -2125,7 +2240,7 @@ gtk_sheet_clip_range (GtkSheet *sheet, const GtkSheetRange *range)
     sheet->clip_range=*range;
 
   sheet->interval=0;
-  sheet->clip_timer=gtk_timeout_add(TIMEOUT_FLASH, gtk_sheet_flash, sheet); 
+  sheet->clip_timer=gtk_timeout_add(TIMEOUT_FLASH, gtk_sheet_flash, sheet);
 
   gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[CLIP_RANGE],
                                      &sheet->clip_range);
@@ -2170,14 +2285,14 @@ gtk_sheet_flash(gpointer data)
   if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return TRUE;
   if(!GTK_WIDGET_DRAWABLE(GTK_WIDGET(sheet))) return TRUE;
   if(!gtk_sheet_range_isvisible(sheet, sheet->clip_range)) return TRUE;
-  if(GTK_SHEET_IN_XDRAG(sheet)) return TRUE; 
-  if(GTK_SHEET_IN_YDRAG(sheet)) return TRUE; 
+  if(GTK_SHEET_IN_XDRAG(sheet)) return TRUE;
+  if(GTK_SHEET_IN_YDRAG(sheet)) return TRUE;
 
   GDK_THREADS_ENTER();
+
   x=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.col0)+1;
   y=ROW_TOP_YPIXEL(sheet,sheet->clip_range.row0)+1;
-  width=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.coli)-x+ 
+  width=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.coli)-x+
     xxx_column_width(sheet, sheet->clip_range.coli) - 1;
   height=ROW_TOP_YPIXEL(sheet,sheet->clip_range.rowi)-y+
     yyy_row_height(sheet, sheet->clip_range.rowi)-1;
@@ -2247,17 +2362,17 @@ gtk_sheet_draw_flashing_range(GtkSheet *sheet, GtkSheetRange range)
   gint x,y,width,height;
 
   if(!gtk_sheet_range_isvisible(sheet, sheet->clip_range)) return;
-  
+
   clip_area.x=COLUMN_LEFT_XPIXEL(sheet, MIN_VISIBLE_COLUMN(sheet));
   clip_area.y=ROW_TOP_YPIXEL(sheet, MIN_VISIBLE_ROW(sheet));
   clip_area.width=sheet->sheet_window_width;
   clip_area.height=sheet->sheet_window_height;
 
-  gdk_gc_set_clip_rectangle(sheet->xor_gc, &clip_area);  
+  gdk_gc_set_clip_rectangle(sheet->xor_gc, &clip_area);
 
   x=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.col0)+1;
   y=ROW_TOP_YPIXEL(sheet,sheet->clip_range.row0)+1;
-  width=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.coli)-x+ 
+  width=COLUMN_LEFT_XPIXEL(sheet,sheet->clip_range.coli)-x+
     xxx_column_width(sheet, sheet->clip_range.coli) - 1;
   height=ROW_TOP_YPIXEL(sheet,sheet->clip_range.rowi)-y+
              yyy_row_height(sheet, sheet->clip_range.rowi)-1;
@@ -2275,7 +2390,7 @@ gtk_sheet_draw_flashing_range(GtkSheet *sheet, GtkSheetRange range)
 
   gdk_gc_set_line_attributes(sheet->xor_gc, 1, 1, 0 ,0 );
 
-  gdk_draw_rectangle(sheet->sheet_window, sheet->xor_gc, FALSE, 
+  gdk_draw_rectangle(sheet->sheet_window, sheet->xor_gc, FALSE,
                      x, y,
                      width, height);
 
@@ -2332,7 +2447,7 @@ gtk_sheet_cell_isvisible (GtkSheet * sheet,
   return gtk_sheet_range_isvisible(sheet, range);
 }
 
-void 
+void
 gtk_sheet_get_visible_range(GtkSheet *sheet, GtkSheetRange *range)
 {
 
@@ -2375,10 +2490,10 @@ gtk_sheet_set_vadjustment (GtkSheet      *sheet,
   g_return_if_fail (GTK_IS_SHEET (sheet));
   if (adjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
-  
+
   if (sheet->vadjustment == adjustment)
     return;
-  
+
   old_adjustment = sheet->vadjustment;
 
   if (sheet->vadjustment)
@@ -2421,10 +2536,10 @@ gtk_sheet_set_hadjustment (GtkSheet      *sheet,
   g_return_if_fail (GTK_IS_SHEET (sheet));
   if (adjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
-  
+
   if (sheet->hadjustment == adjustment)
     return;
-  
+
   old_adjustment = sheet->hadjustment;
 
   if (sheet->hadjustment)
@@ -2464,6 +2579,7 @@ gtk_sheet_set_scroll_adjustments (GtkSheet *sheet,
 {
    if(sheet->hadjustment != hadjustment)
          gtk_sheet_set_hadjustment (sheet, hadjustment);
+
    if(sheet->vadjustment != vadjustment)
          gtk_sheet_set_vadjustment (sheet, vadjustment);
 }
@@ -2541,10 +2657,10 @@ gtk_sheet_destroy (GtkObject * object)
   children = sheet->children;
   while(children){
     GtkSheetChild *child = (GtkSheetChild *)children->data;
-    if(child && child->widget) 
+    if(child && child->widget)
       gtk_sheet_remove(GTK_CONTAINER(sheet), child->widget);
     children = sheet->children;
-  }  
+  }
   sheet->children = NULL;
 
   if (GTK_OBJECT_CLASS (parent_class)->destroy)
@@ -2651,7 +2767,7 @@ gtk_sheet_realize (GtkWidget * widget)
 
   attributes.x = 0;
   attributes.y = 0;
-  attributes.width = sheet->sheet_window_width, 
+  attributes.width = sheet->sheet_window_width,
   attributes.height = sheet->sheet_window_height;
 
   sheet->sheet_window = gdk_window_new (widget->window, &attributes, attributes_mask);
@@ -2663,12 +2779,12 @@ gtk_sheet_realize (GtkWidget * widget)
   gdk_window_show (sheet->sheet_window);
 
   /* backing_pixmap */
-  gtk_sheet_make_backing_pixmap(sheet, 0, 0);  
+  gtk_sheet_make_backing_pixmap(sheet, 0, 0);
 
   /* GCs */
-  if(sheet->fg_gc) 
+  if(sheet->fg_gc)
       gdk_gc_unref(sheet->fg_gc);
-  if(sheet->bg_gc) 
+  if(sheet->bg_gc)
       gdk_gc_unref(sheet->bg_gc);
   sheet->fg_gc = gdk_gc_new (widget->window);
   sheet->bg_gc = gdk_gc_new (widget->window);
@@ -2710,7 +2826,7 @@ gtk_sheet_realize (GtkWidget * widget)
 */
   if(!sheet->cursor_drag)
        sheet->cursor_drag = gdk_cursor_new(GDK_PLUS);
+
   if(sheet->column_titles_visible)
      gdk_window_show(sheet->column_title_window);
   if(sheet->row_titles_visible)
@@ -2729,7 +2845,7 @@ gtk_sheet_realize (GtkWidget * widget)
     {
       child = children->data;
       children = children->next;
+
       gtk_sheet_realize_child(sheet, child);
     }
 }
@@ -2841,10 +2957,14 @@ gtk_sheet_map (GtkWidget * widget)
            gdk_window_show (sheet->row_title_window);
       }
 
-      if(!GTK_WIDGET_MAPPED (sheet->sheet_entry)){
-                 gtk_widget_show (sheet->sheet_entry);
-                 gtk_widget_map (sheet->sheet_entry);
-      }
+      if(!GTK_WIDGET_MAPPED (sheet->sheet_entry)
+        && ! gtk_sheet_locked(sheet)
+        && sheet->active_cell.row  >=0
+        && sheet->active_cell.col  >=0 )
+       {
+         gtk_widget_show (sheet->sheet_entry);
+         gtk_widget_map (sheet->sheet_entry);
+       }
 
       if (GTK_WIDGET_VISIBLE (sheet->button) &&
          !GTK_WIDGET_MAPPED (sheet->button)){
@@ -2858,8 +2978,8 @@ gtk_sheet_map (GtkWidget * widget)
                  gtk_widget_map (GTK_BIN(sheet->button)->child);
 
       gtk_sheet_range_draw(sheet, NULL);
-      gtk_sheet_activate_cell(sheet, 
-                              sheet->active_cell.row, 
+      gtk_sheet_activate_cell(sheet,
+                              sheet->active_cell.row,
                               sheet->active_cell.col);
 
       children = sheet->children;
@@ -2945,7 +3065,7 @@ gtk_sheet_cell_draw_default (GtkSheet *sheet, gint row, gint col)
   widget = GTK_WIDGET (sheet);
 
   gtk_sheet_get_attributes(sheet, row, col, &attributes);
+
   /* select GC for background rectangle */
   gdk_gc_set_foreground (sheet->fg_gc, &attributes.foreground);
   gdk_gc_set_foreground (sheet->bg_gc, &attributes.background);
@@ -3029,19 +3149,19 @@ gtk_sheet_cell_draw_border (GtkSheet *sheet, gint row, gint col, gint mask)
    if(attributes.border.mask & GTK_SHEET_RIGHT_BORDER & mask)
       gdk_draw_line(sheet->pixmap, sheet->fg_gc,
                     area.x+area.width, area.y-width/2,
-                    area.x+area.width, 
+                    area.x+area.width,
                     area.y+area.height+width/2+1);
 
    if(attributes.border.mask & GTK_SHEET_TOP_BORDER & mask)
       gdk_draw_line(sheet->pixmap, sheet->fg_gc,
                     area.x-width/2,area.y,
-                    area.x+area.width+width/2+1, 
+                    area.x+area.width+width/2+1,
                     area.y);
 
    if(attributes.border.mask & GTK_SHEET_BOTTOM_BORDER & mask)
       gdk_draw_line(sheet->pixmap, sheet->fg_gc,
                     area.x-width/2, area.y+area.height,
-                    area.x+area.width+width/2+1, 
+                    area.x+area.width+width/2+1,
                     area.y+area.height);
   }
 
@@ -3055,7 +3175,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
   GdkRectangle area, clip_area;
   gint i;
   gint text_width, text_height, y;
-  gint xoffset=0;  
+  gint xoffset=0;
   gint size, sizel, sizer;
   GdkGC *fg_gc, *bg_gc;
   GtkSheetCellAttr attributes;
@@ -3064,7 +3184,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
   PangoRectangle logical_rect;
   PangoLayoutLine *line;
   PangoFontMetrics *metrics;
-  PangoContext *context = gtk_widget_get_pango_context(GTK_WIDGET(sheet)); 
+  PangoContext *context = gtk_widget_get_pango_context(GTK_WIDGET(sheet));
   gint ascent, descent, y_pos;
 
   gchar *label;
@@ -3114,7 +3234,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
 
   metrics = pango_context_get_metrics(context,
                                   attributes.font_desc,
-                                  pango_context_get_language(context)); 
+                                  pango_context_get_language(context));
 
   ascent = pango_font_metrics_get_ascent(metrics) / PANGO_SCALE;
   descent = pango_font_metrics_get_descent(metrics) / PANGO_SCALE;
@@ -3142,12 +3262,12 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
     case GTK_JUSTIFY_RIGHT:
           size=area.width;
           area.x+=area.width;
-          if(!gtk_sheet_clip_text(sheet)){          
+          if(!gtk_sheet_clip_text(sheet)){
            for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){
              if( !gtk_sheet_cell_empty(sheet, row, i)) break;
              if(size>=text_width+CELLOFFSET) break;
              size+=xxx_column_width(sheet, i);
-            xxx_column_set_right_column(sheet, i, 
+            xxx_column_set_right_column(sheet, i,
                                         MAX(col,
                                             xxx_column_right_column(sheet, i)));
            }
@@ -3161,21 +3281,21 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
           sizel=area.width/2;
           sizer=area.width/2;
          area.x+=area.width/2;
-          if(!gtk_sheet_clip_text(sheet)){          
+          if(!gtk_sheet_clip_text(sheet)){
            for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){
              if( ! gtk_sheet_cell_empty(sheet, row, i)) break;
              if(sizer>=text_width/2) break;
              sizer+= xxx_column_width(sheet, i);
-            xxx_column_set_left_column(sheet, i, 
+            xxx_column_set_left_column(sheet, i,
                                        MIN(
-                                           col, 
+                                           col,
                                            xxx_column_left_column(sheet, i)));
            }
            for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){
              if( ! gtk_sheet_cell_empty(sheet, row, i)) break;
              if(sizel>=text_width/2) break;
              sizel+=xxx_column_width(sheet, i);
-            xxx_column_set_right_column(sheet, i, 
+            xxx_column_set_right_column(sheet, i,
                                         MAX(col,
                                             xxx_column_right_column(sheet, i)));
            }
@@ -3188,14 +3308,14 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
       case GTK_JUSTIFY_LEFT:
       default:
           size=area.width;
-          if(!gtk_sheet_clip_text(sheet)){          
+          if(!gtk_sheet_clip_text(sheet)){
            for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){
              if(! gtk_sheet_cell_empty(sheet, row, i)) break;
              if(size>=text_width+CELLOFFSET) break;
              size+=xxx_column_width(sheet, i);
-            xxx_column_set_left_column(sheet, i, 
+            xxx_column_set_left_column(sheet, i,
                                        MIN(
-                                           col, 
+                                           col,
                                            xxx_column_left_column(sheet, i)));
 
            }
@@ -3225,7 +3345,7 @@ gtk_sheet_cell_draw_label (GtkSheet *sheet, gint row, gint col)
                   area.x,
                   area.y,
                   area.width,
-                  area.height);      
+                  area.height);
 
 }
 
@@ -3240,7 +3360,7 @@ gtk_sheet_range_draw(GtkSheet *sheet, const GtkSheetRange *range)
 
  g_return_if_fail(sheet != NULL);
  g_return_if_fail(GTK_SHEET(sheet));
+
  if(!GTK_WIDGET_DRAWABLE(GTK_WIDGET(sheet))) return;
  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
  if(!GTK_WIDGET_MAPPED(GTK_WIDGET(sheet))) return;
@@ -3249,15 +3369,16 @@ gtk_sheet_range_draw(GtkSheet *sheet, const GtkSheetRange *range)
  {
    drawing_range.row0=MIN_VISIBLE_ROW(sheet);
    drawing_range.col0=MIN_VISIBLE_COLUMN(sheet);
-   drawing_range.rowi=MAX_VISIBLE_ROW(sheet);
+   drawing_range.rowi=MIN(MAX_VISIBLE_ROW(sheet), yyy_row_count(sheet) - 1);
    drawing_range.coli=MAX_VISIBLE_COLUMN(sheet);
-/*
+
+
    gdk_draw_rectangle (sheet->pixmap,
                       GTK_WIDGET(sheet)->style->white_gc,
                       TRUE,
                       0,0,
                       sheet->sheet_window_width,sheet->sheet_window_height);
-*/
+
  }
  else
  {
@@ -3282,7 +3403,7 @@ gtk_sheet_range_draw(GtkSheet *sheet, const GtkSheetRange *range)
                         sheet->fg_gc,
                         TRUE,
                         area.x,area.y,
-                        sheet->sheet_window_width - area.x, 
+                        sheet->sheet_window_width - area.x,
                         sheet->sheet_window_height);
 
      gdk_draw_pixmap(sheet->sheet_window,
@@ -3292,14 +3413,14 @@ gtk_sheet_range_draw(GtkSheet *sheet, const GtkSheetRange *range)
                     area.y,
                     area.x,
                     area.y,
-                    sheet->sheet_window_width - area.x, 
-                    sheet->sheet_window_height);                  
+                    sheet->sheet_window_width - area.x,
+                    sheet->sheet_window_height);
    }
+
  if(drawing_range.rowi == yyy_row_count(sheet) - 1){
   area.x=0;
   area.y=ROW_TOP_YPIXEL(sheet,
-                       yyy_row_count(sheet) - 1) + 
+                       yyy_row_count(sheet) - 1) +
     yyy_row_height(sheet, yyy_row_count(sheet) - 1) + 1;
 
   gdk_gc_set_foreground(sheet->fg_gc, &sheet->bg_color);
@@ -3339,28 +3460,29 @@ gtk_sheet_range_draw(GtkSheet *sheet, const GtkSheetRange *range)
  for(i=drawing_range.row0; i<=drawing_range.rowi; i++)
   for(j=drawing_range.col0; j<=drawing_range.coli; j++)
                   gtk_sheet_cell_draw_label (sheet, i, j);
-     
+
  for(i=drawing_range.row0; i<=drawing_range.rowi; i++)
    for(j= xxx_column_left_column(sheet, drawing_range.col0);
        j<drawing_range.col0; j++)
      gtk_sheet_cell_draw_label (sheet, i, j);
-    
+
  for(i=drawing_range.row0; i<=drawing_range.rowi; i++)
-   for(j = drawing_range.coli+1; 
+   for(j = drawing_range.coli+1;
        j <= xxx_column_right_column(sheet, drawing_range.coli);
        j++)
-     gtk_sheet_cell_draw_label (sheet, i, j); 
+     gtk_sheet_cell_draw_label (sheet, i, j);
 
   gtk_sheet_draw_backing_pixmap(sheet, drawing_range);
 
-  if(sheet->state != GTK_SHEET_NORMAL && gtk_sheet_range_isvisible(sheet, sheet->range))
+  if(sheet->state != GTK_SHEET_NORMAL &&
+     gtk_sheet_range_isvisible(sheet, sheet->range))
        gtk_sheet_range_draw_selection(sheet, drawing_range);
-  
-  if(sheet->state == GTK_STATE_NORMAL && 
+
+  if(sheet->state == GTK_STATE_NORMAL &&
      sheet->active_cell.row >= drawing_range.row0 &&
      sheet->active_cell.row <= drawing_range.rowi &&
      sheet->active_cell.col >= drawing_range.col0 &&
-     sheet->active_cell.col <= drawing_range.coli)    
+     sheet->active_cell.col <= drawing_range.coli)
                             gtk_sheet_show_active_cell(sheet);
 
 }
@@ -3394,7 +3516,7 @@ gtk_sheet_range_draw_selection(GtkSheet *sheet, GtkSheetRange range)
   for(i=range.row0; i<=range.rowi; i++){
    for(j=range.col0; j<=range.coli; j++){
 
-    if(gtk_sheet_cell_get_state(sheet, i, j)==GTK_STATE_SELECTED && 
+    if(gtk_sheet_cell_get_state(sheet, i, j)==GTK_STATE_SELECTED &&
        xxx_column_is_visible(sheet, j) && yyy_row_is_visible(sheet, i)){
 
 #if 0
@@ -3407,63 +3529,66 @@ gtk_sheet_range_draw_selection(GtkSheet *sheet, GtkSheetRange range)
       area.width= xxx_column_width(sheet, j);
       area.height=yyy_row_height(sheet, i);
 
-      if(i==sheet->range.row0){
-            area.y=area.y+2;
-            area.height=area.height-2;
-      }
+      if(i==sheet->range.row0)
+       {
+         area.y=area.y+2;
+         area.height=area.height-2;
+       }
       if(i==sheet->range.rowi) area.height=area.height-3;
-      if(j==sheet->range.col0){
-            area.x=area.x+2;
-            area.width=area.width-2;
-      }
+      if(j==sheet->range.col0)
+       {
+         area.x=area.x+2;
+         area.width=area.width-2;
+       }
       if(j==sheet->range.coli) area.width=area.width-3;
 
-      if(i!=sheet->active_cell.row || j!=sheet->active_cell.col){
-       gdk_draw_rectangle (sheet->sheet_window,
-                          sheet->xor_gc,
-                          TRUE,
-                          area.x+1,area.y+1,
-                          area.width,area.height);
-      }
+      if(i!=sheet->active_cell.row || j!=sheet->active_cell.col)
+       {
+         gdk_draw_rectangle (sheet->sheet_window,
+                             sheet->xor_gc,
+                             TRUE,
+                             area.x+1,area.y+1,
+                             area.width,area.height);
+       }
     }
 
    }
   }
 
   gtk_sheet_draw_border(sheet, sheet->range);
-
 }
 
 static void
 gtk_sheet_draw_backing_pixmap(GtkSheet *sheet, GtkSheetRange range)
 {
   gint x,y,width,height;
-  
+
   if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
+
   x = COLUMN_LEFT_XPIXEL(sheet,range.col0);
-  y = ROW_TOP_YPIXEL(sheet, range.row0);  
+  y = ROW_TOP_YPIXEL(sheet, range.row0);
   width = COLUMN_LEFT_XPIXEL(sheet, range.coli) - x +
     xxx_column_width(sheet, range.coli);
 
   height=ROW_TOP_YPIXEL(sheet, range.rowi)-y+yyy_row_height(sheet, range.rowi);
 
-  if(range.row0==sheet->range.row0){
-          y=y-5;
-          height=height+5;
-  }
-  if(range.rowi==sheet->range.rowi) height=height+5;
-  if(range.col0==sheet->range.col0){
-            x=x-5;
-            width=width+5;
-  }
-  if(range.coli==sheet->range.coli) width=width+5;
+  if(range.row0 == sheet->range.row0)
+    {
+      y=y-5;
+      height=height+5;
+    }
+  if(range.rowi==sheet->range.rowi) height = height + 5;
+  if(range.col0==sheet->range.col0)
+    {
+      x = x-5;
+      width = width+5;
+    }
+  if(range.coli == sheet->range.coli) width = width + 5;
 
-  
-  width=MIN(width, sheet->sheet_window_width-x);
-  height=MIN(height, sheet->sheet_window_height-y);
+  width = MIN(width, sheet->sheet_window_width - x);
+  height = MIN(height, sheet->sheet_window_height - y);
 
-  x--; 
+  x--;
   y--;
   width+=2;
   height+=2;
@@ -3473,9 +3598,9 @@ gtk_sheet_draw_backing_pixmap(GtkSheet *sheet, GtkSheetRange range)
   y = (sheet->column_titles_visible)
        ? MAX(y, sheet->column_title_area.height) : MAX(y, 0);
 
-  if(range.coli == xxx_column_count(sheet) - 1) 
-    width = sheet->sheet_window_width - x; 
-  if(range.rowi == yyy_row_count(sheet)    - 1) 
+  if(range.coli == xxx_column_count(sheet) - 1)
+    width = sheet->sheet_window_width - x;
+  if(range.rowi == yyy_row_count(sheet)    - 1)
     height=sheet->sheet_window_height - y;
 
   gdk_draw_pixmap(sheet->sheet_window,
@@ -3486,11 +3611,11 @@ gtk_sheet_draw_backing_pixmap(GtkSheet *sheet, GtkSheetRange range)
                   x,
                   y,
                   width+1,
-                  height+1);                  
+                  height+1);
 }
 
 
-void 
+void
 gtk_sheet_set_cell_text(GtkSheet *sheet, gint row, gint col, const gchar *text)
 {
  GtkSheetCellAttr attributes;
@@ -3504,7 +3629,7 @@ gtk_sheet_set_cell_text(GtkSheet *sheet, gint row, gint col, const gchar *text)
  gtk_sheet_set_cell(sheet, row, col, attributes.justification, text);
 }
 
-static inline gint 
+static inline gint
 safe_strcmp(const gchar *s1, const gchar *s2)
 {
   if ( !s1 && !s2) return 0;
@@ -3513,14 +3638,14 @@ safe_strcmp(const gchar *s1, const gchar *s2)
   return strcmp(s1, s2);
 }
 
-void 
-gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col, 
+void
+gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col,
                    GtkJustification justification,
                    const gchar *text)
 {
   GSheetModel *model ;
   gboolean changed ;
-  gchar *old_text ; 
+  gchar *old_text ;
 
   GtkSheetRange range;
   gint text_width;
@@ -3553,7 +3678,7 @@ gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col,
       gchar *s = gtk_sheet_cell_get_text(sheet, row, col);
       text_width = 0;
       if(s && strlen(s) > 0) {
-       text_width = STRING_WIDTH(GTK_WIDGET(sheet), 
+       text_width = STRING_WIDTH(GTK_WIDGET(sheet),
                                  attributes.font_desc, text);
       }
       dispose_string(sheet, s);
@@ -3573,7 +3698,7 @@ gtk_sheet_set_cell(GtkSheet *sheet, gint row, gint col,
        gtk_sheet_range_draw(sheet, &range);
   }
 
-  if ( changed ) 
+  if ( changed )
     gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[CHANGED], row, col);
 
 }
@@ -3628,20 +3753,20 @@ gtk_sheet_real_cell_clear (GtkSheet *sheet, gint row, gint column, gboolean dele
 {
   GSheetModel *model =  gtk_sheet_get_model(sheet);
 
-  gchar *old_text = gtk_sheet_cell_get_text(sheet, row, column); 
+  gchar *old_text = gtk_sheet_cell_get_text(sheet, row, column);
+
   if (old_text && strlen(old_text) > 0 )
     {
       g_sheet_model_datum_clear(model, row, column);
-      
+
       if(GTK_IS_OBJECT(sheet) && G_OBJECT(sheet)->ref_count > 0)
-       gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[CLEAR_CELL], 
+       gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[CLEAR_CELL],
                        row, column);
-    }  
+    }
 
   dispose_string (sheet, old_text);
 }
-    
+
 void
 gtk_sheet_range_clear (GtkSheet *sheet, const GtkSheetRange *range)
 {
@@ -3659,10 +3784,10 @@ gtk_sheet_range_delete (GtkSheet *sheet, const GtkSheetRange *range)
 
   gtk_sheet_real_range_clear(sheet, range, TRUE);
 }
+
 
 static void
-gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range, 
+gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range,
                             gboolean delete)
 {
   gint i, j;
@@ -3674,7 +3799,7 @@ gtk_sheet_real_range_clear (GtkSheet *sheet, const GtkSheetRange *range,
     clear.col0=0;
     clear.coli = xxx_column_count(sheet) - 1;
   }else
-    clear=*range;  
+    clear=*range;
 
   clear.row0=MAX(clear.row0, 0);
   clear.col0=MAX(clear.col0, 0);
@@ -3696,27 +3821,27 @@ gtk_sheet_cell_empty (const GtkSheet *sheet, gint row, gint col)
   gboolean empty;
   char *text = gtk_sheet_cell_get_text(sheet, row, col);
   empty = (text == NULL );
+
   dispose_string(sheet, text);
 
   return empty;
 }
 
 
-gchar *     
+gchar *
 gtk_sheet_cell_get_text (const GtkSheet *sheet, gint row, gint col)
 {
   GSheetModel *model;
   g_return_val_if_fail (sheet != NULL, NULL);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), NULL);
 
-  if(col >= xxx_column_count(sheet) || row >= yyy_row_count(sheet)) 
+  if(col >= xxx_column_count(sheet) || row >= yyy_row_count(sheet))
     return NULL;
   if(col < 0 || row < 0) return NULL;
 
   model =  gtk_sheet_get_model(sheet);
 
-  if ( !model ) 
+  if ( !model )
     return NULL;
 
   return g_sheet_model_get_string(model, row, col);
@@ -3743,11 +3868,11 @@ gtk_sheet_cell_get_state (GtkSheet *sheet, gint row, gint col)
      return GTK_STATE_NORMAL;
      break;
    case GTK_SHEET_ROW_SELECTED:
-     if(row>=range->row0 && row<=range->rowi) 
+     if(row>=range->row0 && row<=range->rowi)
        return GTK_STATE_SELECTED;
      break;
    case GTK_SHEET_COLUMN_SELECTED:
-     if(col>=range->col0 && col<=range->coli) 
+     if(col>=range->col0 && col<=range->coli)
        return GTK_STATE_SELECTED;
      break;
    case GTK_SHEET_RANGE_SELECTED:
@@ -3771,7 +3896,7 @@ gtk_sheet_get_pixel_info (GtkSheet * sheet,
   g_return_val_if_fail (sheet != NULL, 0);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), 0);
 
-  /* bounds checking, return false if the user clicked 
+  /* bounds checking, return false if the user clicked
    * on a blank area */
   trow = ROW_FROM_YPIXEL (sheet, y);
   if (trow >= yyy_row_count(sheet))
@@ -3797,7 +3922,7 @@ gtk_sheet_get_cell_area  (GtkSheet * sheet,
   g_return_val_if_fail (sheet != NULL, 0);
   g_return_val_if_fail (GTK_IS_SHEET (sheet), 0);
 
-  if(row >= yyy_row_count(sheet) || column >= xxx_column_count(sheet)) 
+  if(row >= yyy_row_count(sheet) || column >= xxx_column_count(sheet))
     return FALSE;
 
   area->x = (column == -1) ? 0 : (COLUMN_LEFT_XPIXEL(sheet, column) -
@@ -3825,19 +3950,19 @@ gtk_sheet_get_cell_area  (GtkSheet * sheet,
            area->y -= sheet->column_title_area.height;
 
   area->width=sheet->column[column].width;
-  area->height=yyy_row_height(sheet, row);  
+  area->height=yyy_row_height(sheet, row);
 */
   return TRUE;
 }
 
-gboolean 
+gboolean
 gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint column)
 {
  g_return_val_if_fail (sheet != NULL, 0);
  g_return_val_if_fail (GTK_IS_SHEET (sheet), 0);
 
- if(row < 0 || column < 0) return FALSE;
- if(row >= yyy_row_count(sheet) || column >= xxx_column_count(sheet)) 
+ if(row < -1 || column < -1) return FALSE;
+ if(row >= yyy_row_count(sheet) || column >= xxx_column_count(sheet))
    return FALSE;
 
  if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)))
@@ -3845,11 +3970,17 @@ gtk_sheet_set_active_cell (GtkSheet *sheet, gint row, gint column)
        if(!gtk_sheet_deactivate_cell(sheet)) return FALSE;
    }
 
- sheet->active_cell.row=row;
- sheet->active_cell.col=column;
+ sheet->active_cell.row = row;
+ sheet->active_cell.col = column;
+
+ if ( row == -1 || column == -1)
+   {
+     gtk_sheet_hide_active_cell(sheet);
+     return TRUE;
+   }
+
  if(!gtk_sheet_activate_cell(sheet, row, column)) return FALSE;
+
  if(gtk_sheet_autoscroll(sheet))
    gtk_sheet_move_query(sheet, row, column);
 
@@ -3895,21 +4026,22 @@ gtk_sheet_entry_changed(GtkWidget *widget, gpointer data)
 
  GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IS_FROZEN);
 
- if(text && strlen(text) > 0){
-      gtk_sheet_get_attributes(sheet, row, col, &attributes); 
-      justification=attributes.justification;
-      gtk_sheet_set_cell(sheet, row, col, justification, text);
- }
+ if(text && strlen(text) > 0)
+   {
+     gtk_sheet_get_attributes(sheet, row, col, &attributes);
+     justification = attributes.justification;
+     gtk_sheet_set_cell(sheet, row, col, justification, text);
+   }
 
  if(sheet->freeze_count == 0)
         GTK_SHEET_UNSET_FLAGS(sheet, GTK_SHEET_IS_FROZEN);
+
  sheet->active_cell.row=row;;
  sheet->active_cell.col=col;
 }
 
 
-static gboolean 
+static gboolean
 gtk_sheet_deactivate_cell(GtkSheet *sheet)
 {
  gboolean veto = TRUE;
@@ -3920,27 +4052,30 @@ gtk_sheet_deactivate_cell(GtkSheet *sheet)
  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return FALSE;
  if(sheet->state != GTK_SHEET_NORMAL) return FALSE;
 
- _gtkextra_signal_emit(GTK_OBJECT(sheet),sheet_signals[DEACTIVATE], 
+ _gtkextra_signal_emit(GTK_OBJECT(sheet),sheet_signals[DEACTIVATE],
                                    sheet->active_cell.row,
                                    sheet->active_cell.col, &veto);
 
  if(!veto) return FALSE;
 
+ if ( sheet->active_cell.row == -1 || sheet->active_cell.col == -1 )
+   return TRUE;
+
  gtk_signal_disconnect_by_func(GTK_OBJECT(gtk_sheet_get_entry(sheet)),
                               (GtkSignalFunc) gtk_sheet_entry_changed,
                               GTK_OBJECT(GTK_WIDGET(sheet)));
 
  gtk_sheet_hide_active_cell(sheet);
- sheet->active_cell.row=-1;
- sheet->active_cell.col=-1;
+ sheet->active_cell.row = -1;
+ sheet->active_cell.col = -1;
+
  if(GTK_SHEET_REDRAW_PENDING(sheet)){
    GTK_SHEET_UNSET_FLAGS(sheet, GTK_SHEET_REDRAW_PENDING);
    gtk_sheet_range_draw(sheet, NULL);
  }
 
  return TRUE;
-}      
+}
 
 static void
 gtk_sheet_hide_active_cell(GtkSheet *sheet)
@@ -3962,10 +4097,11 @@ gtk_sheet_hide_active_cell(GtkSheet *sheet)
 
  text=gtk_entry_get_text(GTK_ENTRY(gtk_sheet_get_entry(sheet)));
 
- gtk_sheet_get_attributes(sheet, row, col, &attributes); 
+ gtk_sheet_get_attributes(sheet, row, col, &attributes);
  justification=attributes.justification;
 
- if(text && strlen(text)!=0){
+ if(text && strlen(text) != 0)
+ {
       gtk_sheet_set_cell(sheet, row, col, justification, text);
       gtk_signal_emit(GTK_OBJECT(sheet),sheet_signals[SET_CELL], row, col);
  }
@@ -3982,6 +4118,7 @@ gtk_sheet_hide_active_cell(GtkSheet *sheet)
  row_button_release(sheet, row);
 #endif
 
+ gtk_widget_hide(sheet->sheet_entry);
  gtk_widget_unmap(sheet->sheet_entry);
 
  if(row != -1 && col != -1)
@@ -3993,7 +4130,7 @@ gtk_sheet_hide_active_cell(GtkSheet *sheet)
                    COLUMN_LEFT_XPIXEL(sheet,col)-1,
                    ROW_TOP_YPIXEL(sheet,row)-1,
                   xxx_column_width(sheet, col) + 4,
-                   yyy_row_height(sheet, row)+4);   
+                   yyy_row_height(sheet, row)+4);
 
  gtk_widget_grab_focus(GTK_WIDGET(sheet));
 
@@ -4010,7 +4147,7 @@ gtk_sheet_activate_cell(GtkSheet *sheet, gint row, gint col)
  g_return_val_if_fail (GTK_IS_SHEET (sheet), FALSE);
 
  if(row < 0 || col < 0) return FALSE;
- if(row >= yyy_row_count(sheet) || col >= xxx_column_count(sheet)) 
+ if(row >= yyy_row_count(sheet) || col >= xxx_column_count(sheet))
    return FALSE;
 
 /* _gtkextra_signal_emit(GTK_OBJECT(sheet),sheet_signals[ACTIVATE], row, col, &veto);
@@ -4023,17 +4160,17 @@ gtk_sheet_activate_cell(GtkSheet *sheet, gint row, gint col)
         gtk_sheet_real_unselect_range(sheet, NULL);
  }
 
- sheet->range.row0=row;
- sheet->range.col0=col;
- sheet->range.rowi=row;
- sheet->range.coli=col;
- sheet->active_cell.row=row;
- sheet->active_cell.col=col;
- sheet->selection_cell.row=row;
- sheet->selection_cell.col=col;
+ sheet->range.row0 = row;
+ sheet->range.col0 = col;
+ sheet->range.rowi = row;
+ sheet->range.coli = col;
+ sheet->active_cell.row = row;
+ sheet->active_cell.col = col;
+ sheet->selection_cell.row = row;
+ sheet->selection_cell.col = col;
 #if 0
  row_button_set(sheet, row);
- column_button_set(sheet, col); 
+ column_button_set(sheet, col);
 #endif
 
  GTK_SHEET_UNSET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
@@ -4068,7 +4205,7 @@ gtk_sheet_show_active_cell(GtkSheet *sheet)
  /* Don't show the active cell, if there is no active cell: */
  if(!(row >= 0 && col >= 0)) /* e.g row or coll == -1. */
    return;
-  
+
  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
  if(sheet->state != GTK_SHEET_NORMAL) return;
  if(GTK_SHEET_IN_SELECTION(sheet)) return;
@@ -4077,7 +4214,7 @@ gtk_sheet_show_active_cell(GtkSheet *sheet)
 
  sheet_entry = GTK_ENTRY(gtk_sheet_get_entry(sheet));
 
- gtk_sheet_get_attributes(sheet, row, col, &attributes); 
+ gtk_sheet_get_attributes(sheet, row, col, &attributes);
 
  justification = GTK_JUSTIFY_LEFT;
 
@@ -4085,20 +4222,19 @@ gtk_sheet_show_active_cell(GtkSheet *sheet)
       justification = attributes.justification;
 
  text = gtk_sheet_cell_get_text(sheet, row, col);
- if ( ! text ) 
+ if ( ! text )
         text = g_strdup("");
 
  gtk_entry_set_visibility(GTK_ENTRY(sheet_entry), attributes.is_visible);
 
- if(gtk_sheet_locked(sheet) || !attributes.is_editable){ 
-            gtk_entry_set_editable(GTK_ENTRY(sheet_entry), FALSE);
- }else{
-            gtk_entry_set_editable(GTK_ENTRY(sheet_entry), TRUE);
- }
+ if(gtk_sheet_locked(sheet) || !attributes.is_editable)
+   gtk_entry_set_editable(GTK_ENTRY(sheet_entry), FALSE);
+ else
+   gtk_entry_set_editable(GTK_ENTRY(sheet_entry), TRUE);
 
 /*** Added by John Gotts. Mar 25, 2005 *********/
  old_text = gtk_entry_get_text(GTK_ENTRY(sheet_entry));
- if (strcmp(old_text, text) != 0) 
+ if (strcmp(old_text, text) != 0)
 {
   if(!GTK_IS_ITEM_ENTRY(sheet_entry))
      gtk_entry_set_text(GTK_ENTRY(sheet_entry), text);
@@ -4127,8 +4263,8 @@ gtk_sheet_draw_active_cell(GtkSheet *sheet)
 
     row = sheet->active_cell.row;
     col = sheet->active_cell.col;
-    if(row<0 || col<0) return;
+
+    if(row < 0 || col < 0) return;
 
     if(!gtk_sheet_cell_isvisible(sheet, row, col)) return;
 #if 0
@@ -4206,10 +4342,10 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
   aux_range.coli=MIN(new_range.coli, MAX_VISIBLE_COLUMN(sheet));
 
   for(i=range->row0; i<=range->rowi; i++){
-   for(j=range->col0; j<=range->coli; j++){     
+   for(j=range->col0; j<=range->coli; j++){
 
     state=gtk_sheet_cell_get_state(sheet, i, j);
-    selected=(i<=new_range.rowi && i>=new_range.row0 && 
+    selected=(i<=new_range.rowi && i>=new_range.row0 &&
         j<=new_range.coli && j>=new_range.col0) ? TRUE : FALSE;
 
     if(state==GTK_STATE_SELECTED && selected &&
@@ -4227,11 +4363,11 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
        mask2 = i==new_range.row0 ? 1 : 0;
        mask2 = i==new_range.rowi ? mask2+2 : mask2;
        mask2 = j==new_range.col0 ? mask2+4 : mask2;
-       mask2 = j==new_range.coli ? mask2+8 : mask2;     
+       mask2 = j==new_range.coli ? mask2+8 : mask2;
 
        if(mask1 != mask2){
          x=COLUMN_LEFT_XPIXEL(sheet,j);
-         y=ROW_TOP_YPIXEL(sheet, i);  
+         y=ROW_TOP_YPIXEL(sheet, i);
          width=COLUMN_LEFT_XPIXEL(sheet, j)-x+
           xxx_column_width(sheet, j);
          height=ROW_TOP_YPIXEL(sheet, i)-y+yyy_row_height(sheet, i);
@@ -4255,11 +4391,11 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
                   x+1,
                   y+1,
                   width,
-                  height);           
+                  height);
 
          if(i != sheet->active_cell.row || j != sheet->active_cell.col){
            x=COLUMN_LEFT_XPIXEL(sheet,j);
-           y=ROW_TOP_YPIXEL(sheet, i);  
+           y=ROW_TOP_YPIXEL(sheet, i);
            width=COLUMN_LEFT_XPIXEL(sheet, j)-x+
             xxx_column_width(sheet, j);
 
@@ -4288,17 +4424,17 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
   }
 
   for(i=range->row0; i<=range->rowi; i++){
-   for(j=range->col0; j<=range->coli; j++){     
+   for(j=range->col0; j<=range->coli; j++){
 
     state=gtk_sheet_cell_get_state(sheet, i, j);
-    selected=(i<=new_range.rowi && i>=new_range.row0 && 
+    selected=(i<=new_range.rowi && i>=new_range.row0 &&
         j<=new_range.coli && j>=new_range.col0) ? TRUE : FALSE;
 
-    if(state==GTK_STATE_SELECTED && !selected &&   
+    if(state==GTK_STATE_SELECTED && !selected &&
        xxx_column_is_visible(sheet, j) && yyy_row_is_visible(sheet, i)){
 
       x=COLUMN_LEFT_XPIXEL(sheet,j);
-      y=ROW_TOP_YPIXEL(sheet, i);  
+      y=ROW_TOP_YPIXEL(sheet, i);
       width=COLUMN_LEFT_XPIXEL(sheet, j)-x+ xxx_column_width(sheet, j);
       height=ROW_TOP_YPIXEL(sheet, i)-y+yyy_row_height(sheet, i);
 
@@ -4321,16 +4457,16 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
                   x+1,
                   y+1,
                   width,
-                  height);           
+                  height);
     }
    }
   }
 
   for(i=range->row0; i<=range->rowi; i++){
-   for(j=range->col0; j<=range->coli; j++){     
+   for(j=range->col0; j<=range->coli; j++){
 
     state=gtk_sheet_cell_get_state(sheet, i, j);
-    selected=(i<=new_range.rowi && i>=new_range.row0 && 
+    selected=(i<=new_range.rowi && i>=new_range.row0 &&
         j<=new_range.coli && j>=new_range.col0) ? TRUE : FALSE;
 
     if(state!=GTK_STATE_SELECTED && selected &&
@@ -4338,7 +4474,7 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
        (i != sheet->active_cell.row || j != sheet->active_cell.col)){
 
       x=COLUMN_LEFT_XPIXEL(sheet,j);
-      y=ROW_TOP_YPIXEL(sheet, i);  
+      y=ROW_TOP_YPIXEL(sheet, i);
       width=COLUMN_LEFT_XPIXEL(sheet, j)-x+ xxx_column_width(sheet, j);
       height=ROW_TOP_YPIXEL(sheet, i)-y+yyy_row_height(sheet, i);
 
@@ -4359,13 +4495,13 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
                           x+1,y+1,
                           width,height);
 
-    }   
+    }
 
    }
   }
 
   for(i=aux_range.row0; i<=aux_range.rowi; i++){
-   for(j=aux_range.col0; j<=aux_range.coli; j++){     
+   for(j=aux_range.col0; j<=aux_range.coli; j++){
 
     if(xxx_column_is_visible(sheet, j) && yyy_row_is_visible(sheet, i)){
 
@@ -4379,10 +4515,10 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
        mask2 = i==new_range.row0 ? 1 : 0;
        mask2 = i==new_range.rowi ? mask2+2 : mask2;
        mask2 = j==new_range.col0 ? mask2+4 : mask2;
-       mask2 = j==new_range.coli ? mask2+8 : mask2;    
+       mask2 = j==new_range.coli ? mask2+8 : mask2;
        if(mask2!=mask1 || (mask2==mask1 && state!=GTK_STATE_SELECTED)){
          x=COLUMN_LEFT_XPIXEL(sheet,j);
-         y=ROW_TOP_YPIXEL(sheet, i);  
+         y=ROW_TOP_YPIXEL(sheet, i);
          width=xxx_column_width(sheet, j);
          height=yyy_row_height(sheet, i);
          if(mask2 & 1)
@@ -4392,7 +4528,7 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
                                   x+1,y-1,
                                   width,3);
 
-           
+
          if(mask2 & 2)
                gdk_draw_rectangle (sheet->sheet_window,
                                   sheet->xor_gc,
@@ -4415,14 +4551,14 @@ gtk_sheet_new_selection(GtkSheet *sheet, GtkSheetRange *range)
                                   x+width-1,y+1,
                                   3,height);
 
-       
 
-       }         
 
-    } 
+       }
+
+    }
 
    }
-  } 
+  }
 
 
   *range=new_range;
@@ -4442,7 +4578,7 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
 
   x=COLUMN_LEFT_XPIXEL(sheet,new_range.col0);
   y=ROW_TOP_YPIXEL(sheet,new_range.row0);
-  width=COLUMN_LEFT_XPIXEL(sheet,new_range.coli)-x+ 
+  width=COLUMN_LEFT_XPIXEL(sheet,new_range.coli)-x+
     xxx_column_width(sheet, new_range.coli);
 
   height=ROW_TOP_YPIXEL(sheet,new_range.rowi)-y+
@@ -4474,7 +4610,7 @@ gtk_sheet_draw_border (GtkSheet *sheet, GtkSheetRange new_range)
                         width-2*i,height-2*i);
 
   gdk_gc_set_clip_rectangle(sheet->xor_gc, NULL);
-  
+
   gtk_sheet_draw_corners(sheet, new_range);
 
 }
@@ -4496,7 +4632,7 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
                        x-1,
                        y-1,
                        3,
-                       3);         
+                       3);
        gdk_draw_rectangle (sheet->sheet_window,
                           sheet->xor_gc,
                            TRUE,
@@ -4523,7 +4659,7 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
                        x-width,
                        y-width,
                        2*width+1,
-                       2*width+1);         
+                       2*width+1);
        gdk_draw_rectangle (sheet->sheet_window,
                           sheet->xor_gc,
                            TRUE,
@@ -4537,7 +4673,7 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
        y=ROW_TOP_YPIXEL(sheet,range.rowi)+
          yyy_row_height(sheet, range.rowi);
        width = 1;
-       if(sheet->state == GTK_SHEET_ROW_SELECTED) 
+       if(sheet->state == GTK_SHEET_ROW_SELECTED)
          {
              x = COLUMN_LEFT_XPIXEL(sheet, sheet->view.col0)+3;
              width = 3;
@@ -4550,7 +4686,7 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
                        x-width,
                        y-width,
                        2*width+1,
-                       2*width+1);         
+                       2*width+1);
        gdk_draw_rectangle (sheet->sheet_window,
                           sheet->xor_gc,
                            TRUE,
@@ -4574,7 +4710,7 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
                        x-width,
                        y-width,
                        2*width+1,
-                       2*width+1);         
+                       2*width+1);
        gdk_draw_rectangle (sheet->sheet_window,
                           sheet->xor_gc,
                            TRUE,
@@ -4588,52 +4724,25 @@ gtk_sheet_draw_corners(GtkSheet *sheet, GtkSheetRange range)
 
 static void
 gtk_sheet_real_select_range (GtkSheet * sheet,
-                            GtkSheetRange * range)
+                            const GtkSheetRange * range)
 {
   gint state;
 
   g_return_if_fail (sheet != NULL);
 
-  if(range==NULL) range=&sheet->range;
+  if(range == NULL) range = &sheet->range;
+
+  memcpy(&sheet->range, range, sizeof(*range));
 
   if(range->row0 < 0 || range->rowi < 0) return;
   if(range->col0 < 0 || range->coli < 0) return;
 
-  state=sheet->state;
-
-#if 0
-  if(state==GTK_SHEET_COLUMN_SELECTED || state==GTK_SHEET_RANGE_SELECTED){
-   for(i=sheet->range.col0; i< range->col0; i++)
-    column_button_release(sheet, i);
-   for(i=range->coli+1; i<= sheet->range.coli; i++)
-    column_button_release(sheet, i);
-   for(i=range->col0; i<=range->coli; i++){
-    column_button_set(sheet, i);
-   }
-  }
-  if(state==GTK_SHEET_ROW_SELECTED || state==GTK_SHEET_RANGE_SELECTED){
-   for(i=sheet->range.row0; i< range->row0; i++)
-    row_button_release(sheet, i);
-   for(i=range->rowi+1; i<= sheet->range.rowi; i++)
-    row_button_release(sheet, i);
-   for(i=range->row0; i<=range->rowi; i++){
-    row_button_set(sheet, i);
-   }
-  }
-#endif
+  state = sheet->state;
 
   if(range->coli != sheet->range.coli || range->col0 != sheet->range.col0 ||
      range->rowi != sheet->range.rowi || range->row0 != sheet->range.row0)
          {
-
-           gtk_sheet_new_selection(sheet, range);
-
-          sheet->range.col0=range->col0;
-          sheet->range.coli=range->coli;
-          sheet->range.row0=range->row0;
-          sheet->range.rowi=range->rowi;
-
+           gtk_sheet_new_selection(sheet, &sheet->range);
         }
   else
          {
@@ -4641,7 +4750,7 @@ gtk_sheet_real_select_range (GtkSheet * sheet,
            gtk_sheet_range_draw_selection(sheet, sheet->range);
          }
 
-  gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[SELECT_RANGE], range);
+  gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[SELECT_RANGE], &sheet->range);
 }
 
 void
@@ -4654,7 +4763,10 @@ gtk_sheet_select_range(GtkSheet * sheet, const GtkSheetRange *range)
   if(range->row0 < 0 || range->rowi < 0) return;
   if(range->col0 < 0 || range->coli < 0) return;
 
-  if(sheet->state != GTK_SHEET_NORMAL) 
+
+  if ( gtk_sheet_locked(sheet)) return ;
+
+  if(sheet->state != GTK_SHEET_NORMAL)
        gtk_sheet_real_unselect_range(sheet, NULL);
   else
   {
@@ -4682,7 +4794,8 @@ gtk_sheet_unselect_range (GtkSheet * sheet)
 {
   gtk_sheet_real_unselect_range(sheet, NULL);
   sheet->state = GTK_STATE_NORMAL;
-  gtk_sheet_activate_cell(sheet, sheet->active_cell.row, sheet->active_cell.col);
+  gtk_sheet_activate_cell(sheet,
+                         sheet->active_cell.row, sheet->active_cell.col);
 }
 
 
@@ -4693,16 +4806,14 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet,
   g_return_if_fail (sheet != NULL);
   g_return_if_fail (GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)));
 
-  if(range==NULL){
-     range=&sheet->range;
-  }
+  if( range == NULL)
+    range = &sheet->range;
 
   if(range->row0 < 0 || range->rowi < 0) return;
   if(range->col0 < 0 || range->coli < 0) return;
 
-  if (gtk_sheet_range_isvisible (sheet, *range)){
+  if (gtk_sheet_range_isvisible (sheet, *range))
     gtk_sheet_draw_backing_pixmap(sheet, *range);
-  }
 
 #if 0
   for(i=range->col0; i<=range->coli; i++){
@@ -4714,6 +4825,11 @@ gtk_sheet_real_unselect_range (GtkSheet * sheet,
   }
 #endif
 
+  sheet->range.row0 = -1;
+  sheet->range.rowi = -1;
+  sheet->range.col0 = -1;
+  sheet->range.coli = -1;
+
   gtk_sheet_position_children(sheet);
 }
 
@@ -4733,55 +4849,58 @@ gtk_sheet_expose (GtkWidget * widget,
 
   if (GTK_WIDGET_DRAWABLE (widget))
   {
-      range.row0=ROW_FROM_YPIXEL(sheet,event->area.y);
-      range.col0=COLUMN_FROM_XPIXEL(sheet,event->area.x);
-      range.rowi=ROW_FROM_YPIXEL(sheet,event->area.y+event->area.height);
-      range.coli=COLUMN_FROM_XPIXEL(sheet,event->area.x+event->area.width);
+      range.row0 = ROW_FROM_YPIXEL(sheet, event->area.y);
+      range.col0 = COLUMN_FROM_XPIXEL(sheet, event->area.x);
+      range.rowi = ROW_FROM_YPIXEL(sheet, event->area.y + event->area.height);
+      range.coli = COLUMN_FROM_XPIXEL(sheet, event->area.x + event->area.width);
 
       /* exposure events on the sheet */
-      if(event->window == sheet->row_title_window && sheet->row_titles_visible){
-         gint i;
-         for(i = MIN_VISIBLE_ROW(sheet); i <= MAX_VISIBLE_ROW(sheet); i++)
-           gtk_sheet_button_draw(sheet,i,-1);
-      }
-
-      if(event->window == sheet->column_title_window && sheet->column_titles_visible){
-         gint i;
-         for(i = MIN_VISIBLE_COLUMN(sheet); i <= MAX_VISIBLE_COLUMN(sheet); i++)
-           gtk_sheet_button_draw(sheet,-1,i);
-      }
-
-      if (event->window == sheet->sheet_window){
-        gtk_sheet_draw_backing_pixmap(sheet, range);
-              
-        if(sheet->state != GTK_SHEET_NORMAL){
-                if(gtk_sheet_range_isvisible(sheet, sheet->range))          
-                   gtk_sheet_draw_backing_pixmap(sheet, sheet->range);
-                if(GTK_SHEET_IN_RESIZE(sheet) || GTK_SHEET_IN_DRAG(sheet))
-                   gtk_sheet_draw_backing_pixmap(sheet, sheet->drag_range);
-
-                if(gtk_sheet_range_isvisible(sheet, sheet->range))          
-                   gtk_sheet_range_draw_selection(sheet, sheet->range);
-                if(GTK_SHEET_IN_RESIZE(sheet) || GTK_SHEET_IN_DRAG(sheet))
-                   draw_xor_rectangle(sheet, sheet->drag_range);
-        }
+      if(event->window == sheet->row_title_window &&
+        sheet->row_titles_visible)
+       {
+         gint i;
+         for(i = MIN_VISIBLE_ROW(sheet); i <= MAX_VISIBLE_ROW(sheet); i++)
+           gtk_sheet_row_title_button_draw(sheet, i);
+       }
 
-        if((!GTK_SHEET_IN_XDRAG(sheet)) && (!GTK_SHEET_IN_YDRAG(sheet))){
-             if(sheet->state == GTK_SHEET_NORMAL){ 
-                 gtk_sheet_draw_active_cell(sheet);
-                 if(!GTK_SHEET_IN_SELECTION(sheet))
-                         gtk_widget_queue_draw(sheet->sheet_entry);
-             }
-        }
+      if(event->window == sheet->column_title_window &&
+        sheet->column_titles_visible)
+       {
+         gint i;
+         for(i = MIN_VISIBLE_COLUMN(sheet); i <= MAX_VISIBLE_COLUMN(sheet); i++)
+           gtk_sheet_column_title_button_draw(sheet, i);
+       }
 
+      if (event->window == sheet->sheet_window)
+       {
+         gtk_sheet_draw_backing_pixmap(sheet, range);
 
-      }
+         if(sheet->state != GTK_SHEET_NORMAL)
+           {
+             if(gtk_sheet_range_isvisible(sheet, sheet->range))
+               gtk_sheet_draw_backing_pixmap(sheet, sheet->range);
+             if(GTK_SHEET_IN_RESIZE(sheet) || GTK_SHEET_IN_DRAG(sheet))
+               gtk_sheet_draw_backing_pixmap(sheet, sheet->drag_range);
+
+             if(gtk_sheet_range_isvisible(sheet, sheet->range))
+               gtk_sheet_range_draw_selection(sheet, sheet->range);
+             if(GTK_SHEET_IN_RESIZE(sheet) || GTK_SHEET_IN_DRAG(sheet))
+               draw_xor_rectangle(sheet, sheet->drag_range);
+           }
 
+         if((!GTK_SHEET_IN_XDRAG(sheet)) && (!GTK_SHEET_IN_YDRAG(sheet)))
+           {
+             if(sheet->state == GTK_SHEET_NORMAL){
+               gtk_sheet_draw_active_cell(sheet);
+               if(!GTK_SHEET_IN_SELECTION(sheet))
+                 gtk_widget_queue_draw(sheet->sheet_entry);
+             }
+           }
+       }
   }
 
   if(sheet->state != GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION(sheet))
-     gtk_widget_grab_focus(GTK_WIDGET(sheet));
+    gtk_widget_grab_focus(GTK_WIDGET(sheet));
 
   (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
 
@@ -4809,19 +4928,19 @@ gtk_sheet_button_press (GtkWidget * widget,
       gtk_widget_get_pointer (widget, &x, &y);
       gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
 
-      if (event->window == sheet->column_title_window ) 
+      if (event->window == sheet->column_title_window )
        {
-         gtk_signal_emit (GTK_OBJECT (sheet), 
+         gtk_signal_emit (GTK_OBJECT (sheet),
                           sheet_signals[DOUBLE_CLICK_COLUMN], column);
        }
-      else if (event->window == sheet->row_title_window ) 
+      else if (event->window == sheet->row_title_window )
        {
-         gtk_signal_emit (GTK_OBJECT (sheet), 
+         gtk_signal_emit (GTK_OBJECT (sheet),
                           sheet_signals[DOUBLE_CLICK_ROW], row);
        }
     }
 
-  
+
 /*
   if(event->type != GDK_BUTTON_PRESS) return TRUE;
 */
@@ -4887,7 +5006,7 @@ gtk_sheet_button_press (GtkWidget * widget,
                       GDK_BUTTON_RELEASE_MASK,
                       NULL, NULL, event->time);
      gtk_grab_add(GTK_WIDGET(sheet));
-     sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet); 
+     sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet);
      gtk_widget_grab_focus(GTK_WIDGET(sheet));
 
      if(sheet->selection_mode != GTK_SELECTION_SINGLE &&
@@ -4914,35 +5033,40 @@ gtk_sheet_button_press (GtkWidget * widget,
         GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_RESIZE);
      }
      else if(sheet->cursor_drag->type==GDK_TOP_LEFT_ARROW &&
-            !GTK_SHEET_IN_SELECTION(sheet) && !GTK_SHEET_IN_DRAG(sheet)) {
-            if(sheet->state==GTK_STATE_NORMAL) {
-              row=sheet->active_cell.row;
-              column=sheet->active_cell.col;
-              if(!gtk_sheet_deactivate_cell(sheet)) return FALSE;
-              sheet->active_cell.row=row;
-              sheet->active_cell.col=column;
-              sheet->drag_range=sheet->range;
-              sheet->state=GTK_SHEET_RANGE_SELECTED;
-              gtk_sheet_select_range(sheet, &sheet->drag_range);
-            }
-            sheet->x_drag=x;
-            sheet->y_drag=y;
-            if(row < sheet->range.row0) row++;
-            if(row > sheet->range.rowi) row--;
-            if(column < sheet->range.col0) column++;
-            if(column > sheet->range.coli) column--;
-            sheet->drag_cell.row=row;
-            sheet->drag_cell.col=column;
-            sheet->drag_range=sheet->range;
-            draw_xor_rectangle(sheet, sheet->drag_range);
-            GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_DRAG);
-          }
-          else 
-          {
-           gtk_sheet_click_cell(sheet, row, column, &veto);
-           if(veto) GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
-          }
-
+            !GTK_SHEET_IN_SELECTION(sheet)
+            && ! GTK_SHEET_IN_DRAG(sheet)
+            && ! gtk_sheet_locked(sheet)
+            && sheet->active_cell.row >= 0
+            && sheet->active_cell.col >= 0
+            )
+       {
+        if(sheet->state==GTK_STATE_NORMAL) {
+          row=sheet->active_cell.row;
+          column=sheet->active_cell.col;
+          if(!gtk_sheet_deactivate_cell(sheet)) return FALSE;
+          sheet->active_cell.row=row;
+          sheet->active_cell.col=column;
+          sheet->drag_range=sheet->range;
+          sheet->state=GTK_SHEET_RANGE_SELECTED;
+          gtk_sheet_select_range(sheet, &sheet->drag_range);
+        }
+        sheet->x_drag=x;
+        sheet->y_drag=y;
+        if(row < sheet->range.row0) row++;
+        if(row > sheet->range.rowi) row--;
+        if(column < sheet->range.col0) column++;
+        if(column > sheet->range.coli) column--;
+        sheet->drag_cell.row=row;
+        sheet->drag_cell.col=column;
+        sheet->drag_range=sheet->range;
+        draw_xor_rectangle(sheet, sheet->drag_range);
+        GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_DRAG);
+       }
+     else
+       {
+        gtk_sheet_click_cell(sheet, row, column, &veto);
+        if(veto) GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
+       }
     }
 
     if(event->window == sheet->column_title_window){
@@ -4951,7 +5075,7 @@ gtk_sheet_button_press (GtkWidget * widget,
      if(xxx_column_is_sensitive(sheet, column)){
        gtk_sheet_click_cell(sheet, -1, column, &veto);
        gtk_grab_add(GTK_WIDGET(sheet));
-       sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet); 
+       sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet);
        gtk_widget_grab_focus(GTK_WIDGET(sheet));
        GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
      }
@@ -4963,7 +5087,7 @@ gtk_sheet_button_press (GtkWidget * widget,
      if(yyy_row_is_sensitive(sheet, row)){
        gtk_sheet_click_cell(sheet, row, -1, &veto);
        gtk_grab_add(GTK_WIDGET(sheet));
-       sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet); 
+       sheet->timer=gtk_timeout_add(TIMEOUT_SCROLL, gtk_sheet_scroll, sheet);
        gtk_widget_grab_focus(GTK_WIDGET(sheet));
        GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
      }
@@ -4978,7 +5102,7 @@ gtk_sheet_scroll(gpointer data)
  GtkSheet *sheet;
  gint x,y,row,column;
  gint move;
-  
+
  sheet=GTK_SHEET(data);
 
  GDK_THREADS_ENTER();
@@ -4993,13 +5117,13 @@ gtk_sheet_scroll(gpointer data)
 
  if(GTK_SHEET_IN_DRAG(sheet) || GTK_SHEET_IN_RESIZE(sheet)){
        move=gtk_sheet_move_query(sheet, row, column);
-       if(move) draw_xor_rectangle(sheet, sheet->drag_range);      
- }       
+       if(move) draw_xor_rectangle(sheet, sheet->drag_range);
+ }
 
  GDK_THREADS_LEAVE();
 
  return TRUE;
-      
+
 }
 
 static void
@@ -5013,14 +5137,14 @@ gtk_sheet_click_cell(GtkSheet *sheet, gint row, gint column, gboolean *veto)
       }
 
       if(column >= 0 && row >= 0)
-       if(! xxx_column_is_visible(sheet, column) || !yyy_row_is_visible(sheet, row)) 
+       if(! xxx_column_is_visible(sheet, column) || !yyy_row_is_visible(sheet, row))
          {
            *veto = FALSE;
            return;
          }
 
       _gtkextra_signal_emit(GTK_OBJECT(sheet), sheet_signals[TRAVERSE],
-                            sheet->active_cell.row, sheet->active_cell.col, 
+                            sheet->active_cell.row, sheet->active_cell.col,
                             &row, &column, veto);
 
       if(!*veto){
@@ -5097,22 +5221,24 @@ gtk_sheet_button_release (GtkWidget * widget,
 {
   GtkSheet *sheet;
   gint x,y;
+
   sheet=GTK_SHEET(widget);
 
   /* release on resize windows */
-  if (GTK_SHEET_IN_XDRAG (sheet)){
-         GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
-          GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
-         gtk_widget_get_pointer (widget, &x, NULL);
-         gdk_pointer_ungrab (event->time);
-         draw_xor_vline (sheet);
-         
-         gtk_sheet_set_column_width (sheet, sheet->drag_cell.col, new_column_width (sheet, sheet->drag_cell.col, &x));
-          sheet->old_hadjustment = -1.;
-          gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), "value_changed");
-         return TRUE;
-  }
+  if (GTK_SHEET_IN_XDRAG (sheet))
+    {
+      GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_XDRAG);
+      GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_SELECTION);
+      gtk_widget_get_pointer (widget, &x, NULL);
+      gdk_pointer_ungrab (event->time);
+      draw_xor_vline (sheet);
+
+      gtk_sheet_set_column_width (sheet, sheet->drag_cell.col,
+                                 new_column_width (sheet, sheet->drag_cell.col, &x));
+      sheet->old_hadjustment = -1.;
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->hadjustment), "value_changed");
+      return TRUE;
+    }
 
   if (GTK_SHEET_IN_YDRAG (sheet)){
          GTK_SHEET_UNSET_FLAGS (sheet, GTK_SHEET_IN_YDRAG);
@@ -5120,14 +5246,14 @@ gtk_sheet_button_release (GtkWidget * widget,
          gtk_widget_get_pointer (widget, NULL, &y);
          gdk_pointer_ungrab (event->time);
          draw_xor_hline (sheet);
-         
+
          gtk_sheet_set_row_height (sheet, sheet->drag_cell.row, new_row_height (sheet, sheet->drag_cell.row, &y));
           sheet->old_vadjustment = -1.;
           gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), "value_changed");
          return TRUE;
   }
 
-  
+
   if (GTK_SHEET_IN_DRAG(sheet)){
       GtkSheetRange old_range;
       draw_xor_rectangle(sheet, sheet->drag_range);
@@ -5135,7 +5261,7 @@ gtk_sheet_button_release (GtkWidget * widget,
       gdk_pointer_ungrab (event->time);
 
       gtk_sheet_real_unselect_range(sheet, NULL);
-      
+
       sheet->active_cell.row = sheet->active_cell.row +
                                (sheet->drag_range.row0 - sheet->range.row0);
       sheet->active_cell.col = sheet->active_cell.col +
@@ -5159,7 +5285,7 @@ gtk_sheet_button_release (GtkWidget * widget,
       gdk_pointer_ungrab (event->time);
 
       gtk_sheet_real_unselect_range(sheet, NULL);
-      
+
       sheet->active_cell.row = sheet->active_cell.row +
                                (sheet->drag_range.row0 - sheet->range.row0);
       sheet->active_cell.col = sheet->active_cell.col +
@@ -5185,7 +5311,7 @@ gtk_sheet_button_release (GtkWidget * widget,
   if(sheet->state == GTK_SHEET_NORMAL && GTK_SHEET_IN_SELECTION(sheet)){
       GTK_SHEET_UNSET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
       gdk_pointer_ungrab (event->time);
-      gtk_sheet_activate_cell(sheet, sheet->active_cell.row, 
+      gtk_sheet_activate_cell(sheet, sheet->active_cell.row,
                                      sheet->active_cell.col);
   }
 
@@ -5207,179 +5333,214 @@ gtk_sheet_motion (GtkWidget * widget,
   GtkSheet *sheet;
   GdkModifierType mods;
   GdkCursorType new_cursor;
-  gint x, y, row, column;
+  gint x, y;
+  gint row, column;
 
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_SHEET (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-
   sheet = GTK_SHEET (widget);
 
   /* selections on the sheet */
   x = event->x;
   y = event->y;
 
-  if(event->window == sheet->column_title_window && gtk_sheet_columns_resizable(sheet)){
-    gtk_widget_get_pointer(widget, &x, &y);
-    if(!GTK_SHEET_IN_SELECTION(sheet) && POSSIBLE_XDRAG(sheet, x, &column)){
-      new_cursor=GDK_SB_H_DOUBLE_ARROW;
-      if(new_cursor != sheet->cursor_drag->type){
-        gdk_cursor_destroy(sheet->cursor_drag);
-        sheet->cursor_drag=gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
-        gdk_window_set_cursor(sheet->column_title_window,sheet->cursor_drag);
-      }
-    }else{
-      new_cursor=GDK_TOP_LEFT_ARROW;
-      if(!GTK_SHEET_IN_XDRAG(sheet) && new_cursor != sheet->cursor_drag->type){
-        gdk_cursor_destroy(sheet->cursor_drag);
-        sheet->cursor_drag=gdk_cursor_new(GDK_TOP_LEFT_ARROW);
-        gdk_window_set_cursor(sheet->column_title_window,sheet->cursor_drag);
-      }
+  if(event->window == sheet->column_title_window &&
+     gtk_sheet_columns_resizable(sheet))
+    {
+      gtk_widget_get_pointer(widget, &x, &y);
+      if(!GTK_SHEET_IN_SELECTION(sheet) &&
+        POSSIBLE_XDRAG(sheet, x, &column))
+       {
+         new_cursor = GDK_SB_H_DOUBLE_ARROW;
+         if(new_cursor != sheet->cursor_drag->type)
+           {
+             gdk_cursor_destroy(sheet->cursor_drag);
+             sheet->cursor_drag = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW);
+             gdk_window_set_cursor(sheet->column_title_window,
+                                   sheet->cursor_drag);
+           }
+       }
+      else
+       {
+         new_cursor = GDK_TOP_LEFT_ARROW;
+         if(!GTK_SHEET_IN_XDRAG(sheet) &&
+            new_cursor != sheet->cursor_drag->type)
+           {
+             gdk_cursor_destroy(sheet->cursor_drag);
+             sheet->cursor_drag = gdk_cursor_new(GDK_TOP_LEFT_ARROW);
+             gdk_window_set_cursor(sheet->column_title_window,
+                                   sheet->cursor_drag);
+           }
+       }
     }
-  }      
-
-  if(event->window == sheet->row_title_window && gtk_sheet_rows_resizable(sheet)){
-    gtk_widget_get_pointer(widget, &x, &y);
-    if(!GTK_SHEET_IN_SELECTION(sheet) && POSSIBLE_YDRAG(sheet,y, &column)){
-      new_cursor=GDK_SB_V_DOUBLE_ARROW;
-      if(new_cursor != sheet->cursor_drag->type){
-        gdk_cursor_destroy(sheet->cursor_drag);
-        sheet->cursor_drag=gdk_cursor_new(GDK_SB_V_DOUBLE_ARROW);
-        gdk_window_set_cursor(sheet->row_title_window,sheet->cursor_drag);
-      }
-    }else{
-      new_cursor=GDK_TOP_LEFT_ARROW;
-      if(!GTK_SHEET_IN_YDRAG(sheet) && new_cursor != sheet->cursor_drag->type){
-        gdk_cursor_destroy(sheet->cursor_drag);
-        sheet->cursor_drag=gdk_cursor_new(GDK_TOP_LEFT_ARROW);
-        gdk_window_set_cursor(sheet->row_title_window,sheet->cursor_drag);
-      }
+
+  if(event->window == sheet->row_title_window &&
+     gtk_sheet_rows_resizable(sheet))
+    {
+      gtk_widget_get_pointer(widget, &x, &y);
+      if(!GTK_SHEET_IN_SELECTION(sheet) && POSSIBLE_YDRAG(sheet,y, &column))
+       {
+         new_cursor = GDK_SB_V_DOUBLE_ARROW;
+         if(new_cursor != sheet->cursor_drag->type){
+           gdk_cursor_destroy(sheet->cursor_drag);
+           sheet->cursor_drag = gdk_cursor_new(GDK_SB_V_DOUBLE_ARROW);
+           gdk_window_set_cursor(sheet->row_title_window, sheet->cursor_drag);
+         }
+       }
+      else
+       {
+         new_cursor = GDK_TOP_LEFT_ARROW;
+         if(!GTK_SHEET_IN_YDRAG(sheet) &&
+            new_cursor != sheet->cursor_drag->type)
+           {
+             gdk_cursor_destroy(sheet->cursor_drag);
+             sheet->cursor_drag = gdk_cursor_new(GDK_TOP_LEFT_ARROW);
+             gdk_window_set_cursor(sheet->row_title_window, sheet->cursor_drag);
+           }
+       }
     }
-  }      
-
-  new_cursor=GDK_PLUS;
-  if(!POSSIBLE_DRAG(sheet,x,y,&row,&column) && !GTK_SHEET_IN_DRAG(sheet) &&
-     !POSSIBLE_RESIZE(sheet,x,y,&row,&column) && !GTK_SHEET_IN_RESIZE(sheet) &&
-     event->window == sheet->sheet_window && 
-     new_cursor != sheet->cursor_drag->type){
-         gdk_cursor_destroy(sheet->cursor_drag);
-         sheet->cursor_drag=gdk_cursor_new(GDK_PLUS);
-         gdk_window_set_cursor(sheet->sheet_window,sheet->cursor_drag);
-  }
 
-  new_cursor=GDK_TOP_LEFT_ARROW;
-  if(!(POSSIBLE_RESIZE(sheet,x,y,&row,&column) || GTK_SHEET_IN_RESIZE(sheet)) &&
-     (POSSIBLE_DRAG(sheet, x,y,&row,&column) || GTK_SHEET_IN_DRAG(sheet)) && 
-     event->window == sheet->sheet_window && 
-     new_cursor != sheet->cursor_drag->type){
-         gdk_cursor_destroy(sheet->cursor_drag);
-         sheet->cursor_drag=gdk_cursor_new(GDK_TOP_LEFT_ARROW);
-         gdk_window_set_cursor(sheet->sheet_window,sheet->cursor_drag);
-  }
+  new_cursor = GDK_PLUS;
+  if( event->window == sheet->sheet_window &&
+     !POSSIBLE_DRAG(sheet, x, y, &row, &column) &&
+     !GTK_SHEET_IN_DRAG(sheet) &&
+     !POSSIBLE_RESIZE(sheet, x, y, &row, &column) &&
+     !GTK_SHEET_IN_RESIZE(sheet) &&
+     new_cursor != sheet->cursor_drag->type)
+    {
+      gdk_cursor_destroy(sheet->cursor_drag);
+      sheet->cursor_drag = gdk_cursor_new(GDK_PLUS);
+      gdk_window_set_cursor(sheet->sheet_window, sheet->cursor_drag);
+    }
+
+  new_cursor = GDK_TOP_LEFT_ARROW;
+  if( event->window == sheet->sheet_window &&
+      !(POSSIBLE_RESIZE(sheet,x,y,&row,&column) || GTK_SHEET_IN_RESIZE(sheet)) &&     (POSSIBLE_DRAG(sheet, x,y,&row,&column) || GTK_SHEET_IN_DRAG(sheet)) &&
+
+      new_cursor != sheet->cursor_drag->type)
+    {
+      gdk_cursor_destroy(sheet->cursor_drag);
+      sheet->cursor_drag=gdk_cursor_new(GDK_TOP_LEFT_ARROW);
+      gdk_window_set_cursor(sheet->sheet_window,sheet->cursor_drag);
+    }
 
   new_cursor=GDK_SIZING;
-  if(!GTK_SHEET_IN_DRAG(sheet) &&
-     (POSSIBLE_RESIZE(sheet,x,y,&row,&column) || GTK_SHEET_IN_RESIZE(sheet)) &&
-     event->window == sheet->sheet_window && 
-     new_cursor != sheet->cursor_drag->type){
-         gdk_cursor_destroy(sheet->cursor_drag);
-         sheet->cursor_drag=gdk_cursor_new(GDK_SIZING);
-         gdk_window_set_cursor(sheet->sheet_window,sheet->cursor_drag);
-  }
+  if( event->window == sheet->sheet_window &&
+      !GTK_SHEET_IN_DRAG(sheet) &&
+      (POSSIBLE_RESIZE(sheet, x, y, &row, &column) ||
+       GTK_SHEET_IN_RESIZE(sheet)) &&
+      new_cursor != sheet->cursor_drag->type)
+    {
+      gdk_cursor_destroy(sheet->cursor_drag);
+      sheet->cursor_drag=gdk_cursor_new(GDK_SIZING);
+      gdk_window_set_cursor(sheet->sheet_window,sheet->cursor_drag);
+    }
 
   gdk_window_get_pointer (widget->window, &x, &y, &mods);
   if(!(mods & GDK_BUTTON1_MASK)) return FALSE;
 
-  if (GTK_SHEET_IN_XDRAG (sheet)){
-       if (event->is_hint || event->window != widget->window)
-           gtk_widget_get_pointer (widget, &x, NULL);
-         else
-           x = event->x;
+  if (GTK_SHEET_IN_XDRAG (sheet))
+    {
+      if (event->is_hint || event->window != widget->window)
+       gtk_widget_get_pointer (widget, &x, NULL);
+      else
+       x = event->x;
 
-         new_column_width (sheet, sheet->drag_cell.col, &x);
-         if (x != sheet->x_drag)
-           {
-             draw_xor_vline (sheet);
-             sheet->x_drag = x;
-             draw_xor_vline (sheet);
-           }
-          return TRUE;
-  }
+      new_column_width (sheet, sheet->drag_cell.col, &x);
+      if (x != sheet->x_drag)
+       {
+         draw_xor_vline (sheet);
+         sheet->x_drag = x;
+         draw_xor_vline (sheet);
+       }
+      return TRUE;
+    }
 
-  if (GTK_SHEET_IN_YDRAG (sheet)){
-         if (event->is_hint || event->window != widget->window)
-           gtk_widget_get_pointer (widget, NULL, &y);
-         else
-           y = event->y;
+  if (GTK_SHEET_IN_YDRAG (sheet))
+    {
+      if (event->is_hint || event->window != widget->window)
+       gtk_widget_get_pointer (widget, NULL, &y);
+      else
+       y = event->y;
 
-         new_row_height (sheet, sheet->drag_cell.row, &y);
-         if (y != sheet->y_drag)
+      new_row_height (sheet, sheet->drag_cell.row, &y);
+      if (y != sheet->y_drag)
+       {
+         draw_xor_hline (sheet);
+         sheet->y_drag = y;
+         draw_xor_hline (sheet);
+       }
+      return TRUE;
+    }
+
+  if (GTK_SHEET_IN_DRAG(sheet))
+    {
+      GtkSheetRange aux;
+      column=COLUMN_FROM_XPIXEL(sheet,x)-sheet->drag_cell.col;
+      row=ROW_FROM_YPIXEL(sheet,y)-sheet->drag_cell.row;
+      if(sheet->state==GTK_SHEET_COLUMN_SELECTED) row=0;
+      if(sheet->state==GTK_SHEET_ROW_SELECTED) column=0;
+      sheet->x_drag=x;
+      sheet->y_drag=y;
+      aux=sheet->range;
+      if(aux.row0+row >= 0 && aux.rowi+row < yyy_row_count(sheet) &&
+        aux.col0+column >= 0 && aux.coli+column < xxx_column_count(sheet))
+       {
+         aux=sheet->drag_range;
+         sheet->drag_range.row0 = sheet->range.row0 + row;
+         sheet->drag_range.col0 = sheet->range.col0 + column;
+         sheet->drag_range.rowi = sheet->range.rowi + row;
+         sheet->drag_range.coli = sheet->range.coli + column;
+         if(aux.row0 != sheet->drag_range.row0 ||
+            aux.col0 != sheet->drag_range.col0)
            {
-             draw_xor_hline (sheet);
-             sheet->y_drag = y;
-             draw_xor_hline (sheet);
+             draw_xor_rectangle (sheet, aux);
+             draw_xor_rectangle (sheet, sheet->drag_range);
            }
-          return TRUE;
-  }
+       }
+      return TRUE;
+    }
 
-  if (GTK_SHEET_IN_DRAG(sheet)){
-       GtkSheetRange aux;
-       column=COLUMN_FROM_XPIXEL(sheet,x)-sheet->drag_cell.col;
-       row=ROW_FROM_YPIXEL(sheet,y)-sheet->drag_cell.row;
-       if(sheet->state==GTK_SHEET_COLUMN_SELECTED) row=0;
-       if(sheet->state==GTK_SHEET_ROW_SELECTED) column=0;
-       sheet->x_drag=x;
-       sheet->y_drag=y;
-       aux=sheet->range;
-       if(aux.row0+row >= 0 && aux.rowi+row < yyy_row_count(sheet) &&
-          aux.col0+column >= 0 && aux.coli+column < xxx_column_count(sheet)){
-             aux=sheet->drag_range;
-             sheet->drag_range.row0=sheet->range.row0+row;
-             sheet->drag_range.col0=sheet->range.col0+column;
-             sheet->drag_range.rowi=sheet->range.rowi+row;
-             sheet->drag_range.coli=sheet->range.coli+column;
-             if(aux.row0 != sheet->drag_range.row0 ||
-                aux.col0 != sheet->drag_range.col0){
-                draw_xor_rectangle (sheet, aux);
-                draw_xor_rectangle (sheet, sheet->drag_range);
-             }
-       }
-       return TRUE;
-  }
+  if (GTK_SHEET_IN_RESIZE(sheet))
+    {
+      GtkSheetRange aux;
+      gint v_h, current_col, current_row, col_threshold, row_threshold;
+      v_h=1;
 
-  if (GTK_SHEET_IN_RESIZE(sheet)){
-       GtkSheetRange aux;
-       gint v_h, current_col, current_row, col_threshold, row_threshold;
-       v_h=1;
-
-       if(abs(x-COLUMN_LEFT_XPIXEL(sheet,sheet->drag_cell.col)) >
-          abs(y-ROW_TOP_YPIXEL(sheet,sheet->drag_cell.row))) v_h=2;
-        
-       current_col = COLUMN_FROM_XPIXEL(sheet,x);
-       current_row = ROW_FROM_YPIXEL(sheet,y);
-       column = current_col-sheet->drag_cell.col;
-       row    = current_row-sheet->drag_cell.row;
-
-       /*use half of column width resp. row height as threshold to expand selection*/
-       col_threshold = COLUMN_LEFT_XPIXEL(sheet,current_col)+xxx_column_width (sheet,current_col)/2;
-       if (column > 0){
-         if (x < col_threshold)
-           column-=1;
-       }
-       else if (column < 0){
-         if (x > col_threshold) 
-          column+=1;
-       }
-       row_threshold = ROW_TOP_YPIXEL(sheet,current_row)+yyy_row_height (sheet, current_row)/2;
-       if (row > 0){
-         if(y < row_threshold)
-           row-=1;
-       }
-       else if (row < 0){
-         if(y > row_threshold)
-           row+=1;       
-       }
+      if(abs(x-COLUMN_LEFT_XPIXEL(sheet,sheet->drag_cell.col)) >
+        abs(y-ROW_TOP_YPIXEL(sheet,sheet->drag_cell.row))) v_h=2;
+
+      current_col = COLUMN_FROM_XPIXEL(sheet,x);
+      current_row = ROW_FROM_YPIXEL(sheet,y);
+      column = current_col-sheet->drag_cell.col;
+      row    = current_row-sheet->drag_cell.row;
+
+      /*use half of column width resp. row height as threshold to expand selection*/
+      col_threshold = COLUMN_LEFT_XPIXEL(sheet,current_col)+xxx_column_width (sheet,current_col)/2;
+      if (column > 0)
+       {
+         if (x < col_threshold)
+           column-=1;
+       }
+      else if (column < 0)
+       {
+         if (x > col_threshold)
+           column+=1;
+       }
+       row_threshold = ROW_TOP_YPIXEL(sheet,current_row) +
+        yyy_row_height (sheet, current_row)/2;
+       if (row > 0)
+        {
+          if(y < row_threshold)
+            row-=1;
+        }
+       else if (row < 0)
+        {
+          if(y > row_threshold)
+            row+=1;
+        }
 
        if(sheet->state==GTK_SHEET_COLUMN_SELECTED) row=0;
        if(sheet->state==GTK_SHEET_ROW_SELECTED) column=0;
@@ -5387,7 +5548,7 @@ gtk_sheet_motion (GtkWidget * widget,
        sheet->y_drag=y;
        aux=sheet->range;
 
-       if(v_h==1) 
+       if(v_h==1)
            column=0;
        else
            row=0;
@@ -5402,7 +5563,7 @@ gtk_sheet_motion (GtkWidget * widget,
              if(row>0) sheet->drag_range.rowi=sheet->range.rowi+row;
              if(column<0) sheet->drag_range.col0=sheet->range.col0+column;
              if(column>0) sheet->drag_range.coli=sheet->range.coli+column;
-             
+
              if(aux.row0 != sheet->drag_range.row0 ||
                 aux.rowi != sheet->drag_range.rowi ||
                 aux.col0 != sheet->drag_range.col0 ||
@@ -5414,7 +5575,7 @@ gtk_sheet_motion (GtkWidget * widget,
        return TRUE;
   }
 
-  
+
 
   gtk_sheet_get_pixel_info (sheet, x, y, &row, &column);
 
@@ -5449,7 +5610,7 @@ gtk_sheet_move_query(GtkSheet *sheet, gint row, gint column)
          new_row = MIN(yyy_row_count(sheet), row + 1);
           row_move = TRUE;
           if(MAX_VISIBLE_ROW(sheet) == yyy_row_count(sheet) - 1 &&
-             ROW_TOP_YPIXEL(sheet, yyy_row_count(sheet)-1) + 
+             ROW_TOP_YPIXEL(sheet, yyy_row_count(sheet)-1) +
              yyy_row_height(sheet, yyy_row_count(sheet)-1) < height){
                  row_move = FALSE;
                 row_align = -1.;
@@ -5464,13 +5625,13 @@ gtk_sheet_move_query(GtkSheet *sheet, gint row, gint column)
           new_col = MIN(xxx_column_count(sheet) - 1, column + 1);
           column_move = TRUE;
           if(MAX_VISIBLE_COLUMN(sheet) == (xxx_column_count(sheet) - 1) &&
-             COLUMN_LEFT_XPIXEL(sheet, xxx_column_count(sheet) - 1) + 
+             COLUMN_LEFT_XPIXEL(sheet, xxx_column_count(sheet) - 1) +
              xxx_column_width(sheet, xxx_column_count(sheet) - 1) < width)
            {
              column_move = FALSE;
              col_align = -1.;
            }
-  } 
+  }
   if(column<MIN_VISIBLE_COLUMN(sheet) && sheet->state!=GTK_SHEET_ROW_SELECTED) {
          col_align = 0.;
           column_move = TRUE;
@@ -5508,7 +5669,7 @@ gtk_sheet_extend_selection(GtkSheet *sheet, gint row, gint column)
          break;
     case GTK_SHEET_COLUMN_SELECTED:
         row = yyy_row_count(sheet) - 1;
-         break; 
+         break;
     case GTK_SHEET_NORMAL:
         sheet->state=GTK_SHEET_RANGE_SELECTED;
          r=sheet->active_cell.row;
@@ -5525,7 +5686,7 @@ gtk_sheet_extend_selection(GtkSheet *sheet, gint row, gint column)
                    COLUMN_LEFT_XPIXEL(sheet,c)-1,
                    ROW_TOP_YPIXEL(sheet,r)-1,
                    xxx_column_width(sheet, c)+4,
-                   yyy_row_height(sheet, r)+4);   
+                   yyy_row_height(sheet, r)+4);
          gtk_sheet_range_draw_selection(sheet, sheet->range);
     case GTK_SHEET_RANGE_SELECTED:
          sheet->state=GTK_SHEET_RANGE_SELECTED;
@@ -5578,12 +5739,12 @@ gtk_sheet_key_press(GtkWidget *widget,
     if(key->keyval=='c' || key->keyval == 'C' && sheet->state != GTK_STATE_NORMAL)
             gtk_sheet_clip_range(sheet, sheet->range);
     if(key->keyval=='x' || key->keyval == 'X')
-            gtk_sheet_unclip_range(sheet);    
+            gtk_sheet_unclip_range(sheet);
     return FALSE;
   }
 */
 
-  extend_selection = (key->state & GDK_SHIFT_MASK) || key->keyval==GDK_Shift_L 
+  extend_selection = (key->state & GDK_SHIFT_MASK) || key->keyval==GDK_Shift_L
 || key->keyval==GDK_Shift_R;
 
   state=sheet->state;
@@ -5592,9 +5753,9 @@ gtk_sheet_key_press(GtkWidget *widget,
 
   switch(key->keyval){
     case GDK_Return: case GDK_KP_Enter:
-      if(sheet->state == GTK_SHEET_NORMAL && 
+      if(sheet->state == GTK_SHEET_NORMAL &&
          !GTK_SHEET_IN_SELECTION(sheet))
-         gtk_signal_emit_stop_by_name(GTK_OBJECT(gtk_sheet_get_entry(sheet)), 
+         gtk_signal_emit_stop_by_name(GTK_OBJECT(gtk_sheet_get_entry(sheet)),
                                      "key_press_event");
       row = sheet->active_cell.row;
       col = sheet->active_cell.col;
@@ -5604,7 +5765,7 @@ gtk_sheet_key_press(GtkWidget *widget,
            col = MIN_VISIBLE_COLUMN(sheet);
       if(row < yyy_row_count(sheet) - 1){
            row = row + scroll;
-           while(!yyy_row_is_visible(sheet, row) && row<yyy_row_count(sheet)-1) 
+           while(!yyy_row_is_visible(sheet, row) && row<yyy_row_count(sheet)-1)
             row++;
       }
       gtk_sheet_click_cell(sheet, row, col, &veto);
@@ -5613,42 +5774,42 @@ gtk_sheet_key_press(GtkWidget *widget,
    case GDK_ISO_Left_Tab:
       row = sheet->active_cell.row;
       col = sheet->active_cell.col;
-      if(sheet->state == GTK_SHEET_ROW_SELECTED) 
+      if(sheet->state == GTK_SHEET_ROW_SELECTED)
            col = MIN_VISIBLE_COLUMN(sheet)-1;
-      if(sheet->state == GTK_SHEET_COLUMN_SELECTED) 
+      if(sheet->state == GTK_SHEET_COLUMN_SELECTED)
            row = MIN_VISIBLE_ROW(sheet);
       if(col > 0){
-           col = col - scroll; 
+           col = col - scroll;
            while(! xxx_column_is_visible(sheet, col) && col>0) col--;
           col=MAX(0, col);
-      }       
+      }
       gtk_sheet_click_cell(sheet, row, col, &veto);
       extend_selection = FALSE;
       break;
    case GDK_Tab:
       row = sheet->active_cell.row;
       col = sheet->active_cell.col;
-      if(sheet->state == GTK_SHEET_ROW_SELECTED) 
+      if(sheet->state == GTK_SHEET_ROW_SELECTED)
            col = MIN_VISIBLE_COLUMN(sheet)-1;
-      if(sheet->state == GTK_SHEET_COLUMN_SELECTED) 
+      if(sheet->state == GTK_SHEET_COLUMN_SELECTED)
            row = MIN_VISIBLE_ROW(sheet);
       if(col < xxx_column_count(sheet) - 1)
        {
-         col = col + scroll; 
-         while(! xxx_column_is_visible(sheet, col) && 
-               col < xxx_column_count(sheet) - 1) 
+         col = col + scroll;
+         while(! xxx_column_is_visible(sheet, col) &&
+               col < xxx_column_count(sheet) - 1)
            col++;
-       }       
+       }
       gtk_sheet_click_cell(sheet, row, col, &veto);
       extend_selection = FALSE;
       break;
 /*    case GDK_BackSpace:
       if(sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0){
        if(sheet->active_cell.col > 0){
-            col = sheet->active_cell.col - scroll; 
+            col = sheet->active_cell.col - scroll;
            row = sheet->active_cell.row;
             while(!sheet->column[col].is_visible && col > 0) col--;
-       }       
+       }
       }
       gtk_sheet_click_cell(sheet, row, col, &veto);
       extend_selection = FALSE;
@@ -5674,9 +5835,9 @@ gtk_sheet_key_press(GtkWidget *widget,
       }
       col = sheet->active_cell.col;
       row = sheet->active_cell.row;
-      if(state==GTK_SHEET_COLUMN_SELECTED) 
+      if(state==GTK_SHEET_COLUMN_SELECTED)
              row = MIN_VISIBLE_ROW(sheet);
-      if(state==GTK_SHEET_ROW_SELECTED) 
+      if(state==GTK_SHEET_ROW_SELECTED)
              col = MIN_VISIBLE_COLUMN(sheet);
       row = row - scroll;
       while(!yyy_row_is_visible(sheet, row) && row > 0) row--;
@@ -5705,9 +5866,9 @@ gtk_sheet_key_press(GtkWidget *widget,
       col = sheet->active_cell.col;
       row = sheet->active_cell.row;
       if(sheet->active_cell.row < yyy_row_count(sheet)-1){
-          if(state==GTK_SHEET_COLUMN_SELECTED) 
+          if(state==GTK_SHEET_COLUMN_SELECTED)
                 row = MIN_VISIBLE_ROW(sheet)-1;
-          if(state==GTK_SHEET_ROW_SELECTED) 
+          if(state==GTK_SHEET_ROW_SELECTED)
                 col = MIN_VISIBLE_COLUMN(sheet);
           row = row + scroll;
            while(!yyy_row_is_visible(sheet, row) && row < yyy_row_count(sheet)-1) row++;
@@ -5727,7 +5888,7 @@ gtk_sheet_key_press(GtkWidget *widget,
         if(sheet->selection_cell.col < xxx_column_count(sheet) - 1)
          {
            col = sheet->selection_cell.col + 1;
-           while(! xxx_column_is_visible(sheet, col) && col < xxx_column_count(sheet) - 1) 
+           while(! xxx_column_is_visible(sheet, col) && col < xxx_column_count(sheet) - 1)
              col++;
            gtk_sheet_extend_selection(sheet, sheet->selection_cell.row, col);
          }
@@ -5737,12 +5898,12 @@ gtk_sheet_key_press(GtkWidget *widget,
       row = sheet->active_cell.row;
       if(sheet->active_cell.col < xxx_column_count(sheet) - 1){
            col ++;
-          if(state==GTK_SHEET_ROW_SELECTED) 
+          if(state==GTK_SHEET_ROW_SELECTED)
                 col = MIN_VISIBLE_COLUMN(sheet)-1;
-          if(state==GTK_SHEET_COLUMN_SELECTED) 
+          if(state==GTK_SHEET_COLUMN_SELECTED)
                 row = MIN_VISIBLE_ROW(sheet);
            while(! xxx_column_is_visible(sheet, col) && col < xxx_column_count(sheet) - 1) col++;
-           if(strlen(gtk_entry_get_text(GTK_ENTRY(gtk_sheet_get_entry(sheet)))) == 0 
+           if(strlen(gtk_entry_get_text(GTK_ENTRY(gtk_sheet_get_entry(sheet)))) == 0
               || force_move) {
                gtk_sheet_click_cell(sheet, row, col, &veto);
            }
@@ -5761,16 +5922,16 @@ gtk_sheet_key_press(GtkWidget *widget,
         }
         if(sheet->selection_cell.col > 0){
           col = sheet->selection_cell.col - 1;
-          while(! xxx_column_is_visible(sheet, col) && col > 0) col--;          
+          while(! xxx_column_is_visible(sheet, col) && col > 0) col--;
           gtk_sheet_extend_selection(sheet, sheet->selection_cell.row, col);
         }
        return TRUE;
       }
       col = sheet->active_cell.col - 1;
       row = sheet->active_cell.row;
-      if(state==GTK_SHEET_ROW_SELECTED) 
+      if(state==GTK_SHEET_ROW_SELECTED)
                 col = MIN_VISIBLE_COLUMN(sheet)-1;
-      if(state==GTK_SHEET_COLUMN_SELECTED) 
+      if(state==GTK_SHEET_COLUMN_SELECTED)
                 row = MIN_VISIBLE_ROW(sheet);
       while(! xxx_column_is_visible(sheet, col) && col > 0) col--;
       col = MAX(0, col);
@@ -5800,7 +5961,7 @@ gtk_sheet_key_press(GtkWidget *widget,
         GTK_SHEET_SET_FLAGS(sheet, GTK_SHEET_IN_SELECTION);
         if(extend_selection) return TRUE;
       }
-      if(state == GTK_SHEET_ROW_SELECTED) 
+      if(state == GTK_SHEET_ROW_SELECTED)
         sheet->active_cell.col=MIN_VISIBLE_COLUMN(sheet);
       if(state == GTK_SHEET_COLUMN_SELECTED)
         sheet->active_cell.row=MIN_VISIBLE_ROW(sheet);
@@ -5813,7 +5974,7 @@ gtk_sheet_key_press(GtkWidget *widget,
                                  sheet->active_cell.col);
 
   return TRUE;
-} 
+}
 
 static void
 gtk_sheet_size_request (GtkWidget * widget,
@@ -5834,11 +5995,11 @@ gtk_sheet_size_request (GtkWidget * widget,
   requisition->height = 3*DEFAULT_ROW_HEIGHT(widget);
 
   /* compute the size of the column title area */
-  if(sheet->column_titles_visible) 
+  if(sheet->column_titles_visible)
      requisition->height += sheet->column_title_area.height;
 
   /* compute the size of the row title area */
-  if(sheet->row_titles_visible) 
+  if(sheet->row_titles_visible)
      requisition->width += sheet->row_title_area.width;
 
   sheet->view.row0=ROW_FROM_YPIXEL(sheet, sheet->column_title_area.height+1);
@@ -5846,10 +6007,10 @@ gtk_sheet_size_request (GtkWidget * widget,
   sheet->view.col0=COLUMN_FROM_XPIXEL(sheet, sheet->row_title_area.width+1);
   sheet->view.coli=COLUMN_FROM_XPIXEL(sheet, sheet->sheet_window_width);
 
-  if(!sheet->column_titles_visible) 
+  if(!sheet->column_titles_visible)
      sheet->view.row0=ROW_FROM_YPIXEL(sheet, 1);
 
-  if(!sheet->row_titles_visible) 
+  if(!sheet->row_titles_visible)
      sheet->view.col0=COLUMN_FROM_XPIXEL(sheet, 1);
 
   children = sheet->children;
@@ -5862,7 +6023,7 @@ gtk_sheet_size_request (GtkWidget * widget,
   }
 }
 
+
 static void
 gtk_sheet_size_allocate (GtkWidget * widget,
                         GtkAllocation * allocation)
@@ -5893,7 +6054,7 @@ gtk_sheet_size_allocate (GtkWidget * widget,
   sheet->internal_allocation.y = 0;
   sheet->internal_allocation.width = allocation->width - 2*border_width;
   sheet->internal_allocation.height = allocation->height - 2*border_width;
-       
+
   sheet_allocation.x = 0;
   sheet_allocation.y = 0;
   sheet_allocation.width = allocation->width - 2*border_width;
@@ -5914,7 +6075,7 @@ gtk_sheet_size_allocate (GtkWidget * widget,
   sheet->column_title_area.y = 0;
   if(sheet->row_titles_visible)
        sheet->column_title_area.x = sheet->row_title_area.width;
-  sheet->column_title_area.width = sheet_allocation.width - 
+  sheet->column_title_area.width = sheet_allocation.width -
                                      sheet->column_title_area.x;
   if(GTK_WIDGET_REALIZED(widget) && sheet->column_titles_visible)
       gdk_window_move_resize (sheet->column_title_window,
@@ -5955,7 +6116,7 @@ gtk_sheet_size_allocate (GtkWidget * widget,
 
   if(!sheet->column_titles_visible)
        sheet->view.row0=ROW_FROM_YPIXEL(sheet, 1);
-      
+
   if(!sheet->row_titles_visible)
        sheet->view.col0=COLUMN_FROM_XPIXEL(sheet, 1);
 
@@ -5963,7 +6124,7 @@ gtk_sheet_size_allocate (GtkWidget * widget,
   size_allocate_row_title_buttons(sheet);
 
   /* re-scale backing pixmap */
-  gtk_sheet_make_backing_pixmap(sheet, 0, 0); 
+  gtk_sheet_make_backing_pixmap(sheet, 0, 0);
   gtk_sheet_position_children(sheet);
 
   /* set the scrollbars adjustments */
@@ -6004,15 +6165,15 @@ size_allocate_column_title_buttons (GtkSheet * sheet)
   if(MAX_VISIBLE_COLUMN(sheet) == xxx_column_count(sheet) - 1)
      gdk_window_clear_area (sheet->column_title_window,
                            0,0,
-                           sheet->column_title_area.width, 
+                           sheet->column_title_area.width,
                             sheet->column_title_area.height);
 
   if(!GTK_WIDGET_DRAWABLE(sheet)) return;
 
   for (i = MIN_VISIBLE_COLUMN(sheet); i <= MAX_VISIBLE_COLUMN(sheet); i++)
-      gtk_sheet_button_draw(sheet,-1,i);
+    gtk_sheet_column_title_button_draw(sheet, i);
 }
-       
+
 static void
 size_allocate_row_title_buttons (GtkSheet * sheet)
 {
@@ -6031,7 +6192,7 @@ size_allocate_row_title_buttons (GtkSheet * sheet)
       height -= sheet->column_title_area.height;
       y = sheet->column_title_area.height;
     }
-    
+
   if(sheet->row_title_area.height != height || sheet->row_title_area.y != y)
     {
       sheet->row_title_area.y = y;
@@ -6045,21 +6206,25 @@ size_allocate_row_title_buttons (GtkSheet * sheet)
   if(MAX_VISIBLE_ROW(sheet) == yyy_row_count(sheet)-1)
     gdk_window_clear_area (sheet->row_title_window,
                           0,0,
-                          sheet->row_title_area.width, 
+                          sheet->row_title_area.width,
                            sheet->row_title_area.height);
 
   if(!GTK_WIDGET_DRAWABLE(sheet)) return;
 
   for(i = MIN_VISIBLE_ROW(sheet); i <= MAX_VISIBLE_ROW(sheet); i++)
-      gtk_sheet_button_draw(sheet,i,-1);
+    {
+      if ( i >= yyy_row_count(sheet))
+       break;
+      gtk_sheet_row_title_button_draw(sheet, i);
+    }
 }
-         
+
 
 static void
 gtk_sheet_size_allocate_entry(GtkSheet *sheet)
 {
  GtkAllocation shentry_allocation;
- GtkSheetCellAttr attributes;
+ GtkSheetCellAttr attributes = { 0 };
  GtkEntry *sheet_entry;
  GtkStyle *style = NULL, *previous_style = NULL;
  gint row, col;
@@ -6071,51 +6236,54 @@ gtk_sheet_size_allocate_entry(GtkSheet *sheet)
 
  sheet_entry = GTK_ENTRY(gtk_sheet_get_entry(sheet));
 
- gtk_sheet_get_attributes(sheet, sheet->active_cell.row, sheet->active_cell.col, &attributes); 
-
- if(GTK_WIDGET_REALIZED(sheet->sheet_entry)){
-
-  if(!GTK_WIDGET(sheet_entry)->style) 
-        gtk_widget_ensure_style(GTK_WIDGET(sheet_entry));
+ if ( ! gtk_sheet_get_attributes(sheet, sheet->active_cell.row,
+                                sheet->active_cell.col,
+                                &attributes) )
+   return ;
 
-  previous_style = GTK_WIDGET(sheet_entry)->style;
-
-  style = gtk_style_copy(previous_style);
-  style->bg[GTK_STATE_NORMAL] = attributes.background;
-  style->fg[GTK_STATE_NORMAL] = attributes.foreground;
-  style->text[GTK_STATE_NORMAL] = attributes.foreground;
-  style->bg[GTK_STATE_ACTIVE] = attributes.background;
-  style->fg[GTK_STATE_ACTIVE] = attributes.foreground;
-  style->text[GTK_STATE_ACTIVE] = attributes.foreground;
-
-  pango_font_description_free(style->font_desc);
-  style->font_desc = pango_font_description_copy(attributes.font_desc);
-
-  GTK_WIDGET(sheet_entry)->style = style;
-  gtk_widget_size_request(sheet->sheet_entry, NULL);
-  GTK_WIDGET(sheet_entry)->style = previous_style;
-
-  if(style != previous_style){
-    if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
-      style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL];
-      style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL];
-      style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE];
-      style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE];
-    }
-    gtk_widget_set_style(GTK_WIDGET(sheet_entry), style);
-  }
- }
+ if ( GTK_WIDGET_REALIZED(sheet->sheet_entry) )
+   {
+     if(!GTK_WIDGET(sheet_entry)->style)
+       gtk_widget_ensure_style(GTK_WIDGET(sheet_entry));
+
+     previous_style = GTK_WIDGET(sheet_entry)->style;
+
+     style = gtk_style_copy(previous_style);
+     style->bg[GTK_STATE_NORMAL] = attributes.background;
+     style->fg[GTK_STATE_NORMAL] = attributes.foreground;
+     style->text[GTK_STATE_NORMAL] = attributes.foreground;
+     style->bg[GTK_STATE_ACTIVE] = attributes.background;
+     style->fg[GTK_STATE_ACTIVE] = attributes.foreground;
+     style->text[GTK_STATE_ACTIVE] = attributes.foreground;
+
+     pango_font_description_free(style->font_desc);
+     g_assert(attributes.font_desc);
+     style->font_desc = pango_font_description_copy(attributes.font_desc);
+
+     GTK_WIDGET(sheet_entry)->style = style;
+     gtk_widget_size_request(sheet->sheet_entry, NULL);
+     GTK_WIDGET(sheet_entry)->style = previous_style;
+
+     if(style != previous_style){
+       if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
+        style->bg[GTK_STATE_NORMAL] = previous_style->bg[GTK_STATE_NORMAL];
+        style->fg[GTK_STATE_NORMAL] = previous_style->fg[GTK_STATE_NORMAL];
+        style->bg[GTK_STATE_ACTIVE] = previous_style->bg[GTK_STATE_ACTIVE];
+        style->fg[GTK_STATE_ACTIVE] = previous_style->fg[GTK_STATE_ACTIVE];
+       }
+       gtk_widget_set_style(GTK_WIDGET(sheet_entry), style);
+     }
+   }
 
  if(GTK_IS_ITEM_ENTRY(sheet_entry))
-    max_size = GTK_ITEM_ENTRY(sheet_entry)->text_max_size;
+   max_size = GTK_ITEM_ENTRY(sheet_entry)->text_max_size;
  else
-    max_size = 0;
+   max_size = 0;
 
  text_size = 0;
  text = gtk_entry_get_text(GTK_ENTRY(sheet_entry));
- if(text && strlen(text) > 0){ 
-     text_size = STRING_WIDTH(GTK_WIDGET(sheet), attributes.font_desc, text);
- }
+ if(text && strlen(text) > 0)
+   text_size = STRING_WIDTH(GTK_WIDGET(sheet), attributes.font_desc, text);
 
  column_width=xxx_column_width(sheet, sheet->active_cell.col);
 
@@ -6130,16 +6298,16 @@ gtk_sheet_size_allocate_entry(GtkSheet *sheet)
  shentry_allocation.width = column_width;
  shentry_allocation.height = yyy_row_height(sheet, sheet->active_cell.row);
 
- if(GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
-
-   shentry_allocation.height -= 2*CELLOFFSET;
-   shentry_allocation.y += CELLOFFSET;
-   if(gtk_sheet_clip_text(sheet))
-     shentry_allocation.width = column_width - 2*CELLOFFSET;
-   else
-     shentry_allocation.width = size;
-
-   switch(GTK_ITEM_ENTRY(sheet_entry)->justification){
+ if(GTK_IS_ITEM_ENTRY(sheet->sheet_entry))
+   {
+     shentry_allocation.height -= 2*CELLOFFSET;
+     shentry_allocation.y += CELLOFFSET;
+     if(gtk_sheet_clip_text(sheet))
+       shentry_allocation.width = column_width - 2*CELLOFFSET;
+     else
+       shentry_allocation.width = size;
+
+     switch(GTK_ITEM_ENTRY(sheet_entry)->justification){
      case GTK_JUSTIFY_CENTER:
        shentry_allocation.x += (column_width)/2 - size/2;
        break;
@@ -6150,16 +6318,16 @@ gtk_sheet_size_allocate_entry(GtkSheet *sheet)
      case GTK_JUSTIFY_FILL:
        shentry_allocation.x += CELLOFFSET;
        break;
-    }
-
- }
+     }
+   }
 
- if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry)){
-   shentry_allocation.x += 2;
-   shentry_allocation.y += 2;
-   shentry_allocation.width -= MIN(shentry_allocation.width, 3);
-   shentry_allocation.height -= MIN(shentry_allocation.height, 3);
- }
+ if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry))
+   {
+     shentry_allocation.x += 2;
+     shentry_allocation.y += 2;
+     shentry_allocation.width -= MIN(shentry_allocation.width, 3);
+     shentry_allocation.height -= MIN(shentry_allocation.height, 3);
+   }
 
  gtk_widget_size_allocate(sheet->sheet_entry, &shentry_allocation);
 
@@ -6174,11 +6342,13 @@ gtk_sheet_entry_set_max_size(GtkSheet *sheet)
  gint sizel=0, sizer=0;
  gint row,col;
  GtkJustification justification;
+ gchar *s = NULL;
 
  row=sheet->active_cell.row;
  col=sheet->active_cell.col;
 
- if(!GTK_IS_ITEM_ENTRY(sheet->sheet_entry) || gtk_sheet_clip_text(sheet)) return;
+ if( ! GTK_IS_ITEM_ENTRY(sheet->sheet_entry) || gtk_sheet_clip_text(sheet))
+   return;
 
  justification = GTK_ITEM_ENTRY(sheet->sheet_entry)->justification;
 
@@ -6186,34 +6356,52 @@ gtk_sheet_entry_set_max_size(GtkSheet *sheet)
   case GTK_JUSTIFY_FILL:
   case GTK_JUSTIFY_LEFT:
     for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){
-     if(gtk_sheet_cell_get_text(sheet, row, i)) break;
+      if((s = gtk_sheet_cell_get_text(sheet, row, i)))
+       {
+         g_free(s);
+         break;
+       }
      size+=xxx_column_width(sheet, i);
     }
     size = MIN(size, sheet->sheet_window_width - COLUMN_LEFT_XPIXEL(sheet, col));
     break;
-  case GTK_JUSTIFY_RIGHT:
-    for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){
-     if(gtk_sheet_cell_get_text(sheet, row, i)) break;
-     size+=xxx_column_width(sheet, i);
-    }
+ case GTK_JUSTIFY_RIGHT:
+   for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--)
+     {
+       if((s = gtk_sheet_cell_get_text(sheet, row, i)))
+        {
+          g_free(s);
+          break;
+        }
+       size+=xxx_column_width(sheet, i);
+     }
     break;
   case GTK_JUSTIFY_CENTER:
     for(i=col+1; i<=MAX_VISIBLE_COLUMN(sheet); i++){
-/*     if(gtk_sheet_cell_get_text(sheet, row, i)) break;
+/*     if((s = gtk_sheet_cell_get_text(sheet, row, i)))
+            {
+            g_free(s);
+            break;
+            }
 */
      sizer+=xxx_column_width(sheet, i);
     }
-    for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--){
-     if(gtk_sheet_cell_get_text(sheet, row, i)) break;
-     sizel+=xxx_column_width(sheet, i);
-    }
+    for(i=col-1; i>=MIN_VISIBLE_COLUMN(sheet); i--)
+      {
+       if((s = gtk_sheet_cell_get_text(sheet, row, i)))
+         {
+           g_free(s);
+           break;
+         }
+       sizel+=xxx_column_width(sheet, i);
+      }
     size=2*MIN(sizel, sizer);
     break;
  }
 
- if(size!=0) size+=xxx_column_width(sheet, col);
GTK_ITEM_ENTRY(sheet->sheet_entry)->text_max_size=size;
-
+ if(size != 0)
  size += xxx_column_width(sheet, col);
+ GTK_ITEM_ENTRY(sheet->sheet_entry)->text_max_size = size;
 }
 
 static void
@@ -6226,54 +6414,50 @@ create_sheet_entry(GtkSheet *sheet)
 
  widget = GTK_WIDGET(sheet);
 
- if(sheet->sheet_entry){
-    /* avoids warnings */
-    gtk_widget_ref(sheet->sheet_entry);
-    gtk_widget_unparent(sheet->sheet_entry);
-    gtk_widget_destroy(sheet->sheet_entry);
- }
+ if(sheet->sheet_entry)
+   {
+     /* avoids warnings */
+     gtk_widget_ref(sheet->sheet_entry);
+     gtk_widget_unparent(sheet->sheet_entry);
+     gtk_widget_destroy(sheet->sheet_entry);
+   }
 
- if(sheet->entry_type){
+ if(sheet->entry_type)
+   {
+     if(!g_type_is_a (sheet->entry_type, GTK_TYPE_ENTRY))
+       {
+       parent = GTK_WIDGET(gtk_type_new(sheet->entry_type));
 
-   if(!g_type_is_a (sheet->entry_type, GTK_TYPE_ENTRY)){
+       sheet->sheet_entry = parent;
 
-     parent = GTK_WIDGET(gtk_type_new(sheet->entry_type));
+       entry = gtk_sheet_get_entry (sheet);
+       if(GTK_IS_ENTRY(entry))
+        found_entry = TRUE;
+       }
+     else
+       {
+        parent = GTK_WIDGET(gtk_type_new(sheet->entry_type));
+        entry = parent;
+        found_entry = TRUE;
+       }
 
+   if(!found_entry)
+     {
+       g_warning ("Entry type must be GtkEntry subclass, using default");
+       entry = gtk_item_entry_new();
+       sheet->sheet_entry = entry;
+     }
+   else
      sheet->sheet_entry = parent;
-
-     entry = gtk_sheet_get_entry (sheet);
-     if(GTK_IS_ENTRY(entry)) found_entry = TRUE;
-
-   } else {
-
-     parent = GTK_WIDGET(gtk_type_new(sheet->entry_type));
-     entry = parent;
-     found_entry = TRUE;
-
-   }             
-                                    
-   if(!found_entry){
-
-     g_warning ("Entry type must be GtkEntry subclass, using default");
+ }
+ else
+   {
      entry = gtk_item_entry_new();
      sheet->sheet_entry = entry;
-
-   } else {
-
-     sheet->sheet_entry = parent;
-
    }
 
-
- } else {
-
-     entry = gtk_item_entry_new();
-     sheet->sheet_entry = entry;
-
- }
  gtk_widget_size_request(sheet->sheet_entry, NULL);
+
  if(GTK_WIDGET_REALIZED(sheet))
    {
       gtk_widget_set_parent_window (sheet->sheet_entry, sheet->sheet_window);
@@ -6283,9 +6467,9 @@ create_sheet_entry(GtkSheet *sheet)
 
  gtk_signal_connect_object(GTK_OBJECT(entry),"key_press_event",
                            (GtkSignalFunc) gtk_sheet_entry_key_press,
-                           GTK_OBJECT(sheet)); 
+                           GTK_OBJECT(sheet));
 
- gtk_widget_show (sheet->sheet_entry); 
+ gtk_widget_show (sheet->sheet_entry);
 }
 
 
@@ -6300,7 +6484,7 @@ find_entry(GtkWidget *w, gpointer user_data)
     }
 }
 
-GtkWidget * 
+GtkWidget *
 gtk_sheet_get_entry(GtkSheet *sheet)
 {
  GtkWidget *parent;
@@ -6320,11 +6504,11 @@ gtk_sheet_get_entry(GtkSheet *sheet)
  if(GTK_IS_TABLE(parent)) children = GTK_TABLE(parent)->children;
  if(GTK_IS_BOX(parent)) children = GTK_BOX(parent)->children;
 
- if(GTK_IS_CONTAINER(parent)) 
+ if(GTK_IS_CONTAINER(parent))
    {
      gtk_container_forall(GTK_CONTAINER(parent), find_entry, &entry);
-     
-     if(GTK_IS_ENTRY(entry))  
+
+     if(GTK_IS_ENTRY(entry))
        return entry;
    }
 
@@ -6336,14 +6520,14 @@ gtk_sheet_get_entry(GtkSheet *sheet)
                  entry = table_child->widget;
       }
       if(GTK_IS_BOX(parent)){
-                 box_child = children->data; 
+                 box_child = children->data;
                  entry = box_child->widget;
       }
 
-      if(GTK_IS_ENTRY(entry))  
+      if(GTK_IS_ENTRY(entry))
                                 break;
-      children = children->next;                        
- } 
+      children = children->next;
+ }
 
 
  if(!GTK_IS_ENTRY(entry))   return NULL;
@@ -6352,7 +6536,7 @@ gtk_sheet_get_entry(GtkSheet *sheet)
 
 }
 
-GtkWidget * 
+GtkWidget *
 gtk_sheet_get_entry_widget(GtkSheet *sheet)
 {
  g_return_val_if_fail (sheet != NULL, NULL);
@@ -6362,215 +6546,239 @@ gtk_sheet_get_entry_widget(GtkSheet *sheet)
  return (sheet->sheet_entry);
 }
 
-#if 0
-/* BUTTONS */
-static void
-row_button_set (GtkSheet *sheet, gint row)
-{
-  if(sheet->row[row].button.state == GTK_STATE_ACTIVE) return;
-
-  sheet->row[row].button.state = GTK_STATE_ACTIVE;
-  gtk_sheet_button_draw(sheet, row, -1);
-}
 
 static void
-row_button_release (GtkSheet *sheet, gint row)
+gtk_sheet_button_draw(GtkSheet *sheet, GdkWindow *window,
+                     GtkSheetButton *button, gboolean is_sensitive,
+                     GdkRectangle allocation)
 {
-  if(sheet->row[row].button.state == GTK_STATE_NORMAL) return;
-
-  sheet->row[row].button.state = GTK_STATE_NORMAL;
-  gtk_sheet_button_draw(sheet, row, -1);
-}
-#endif
-
-static void
-gtk_sheet_button_draw (GtkSheet *sheet, gint row, gint column)
-{
-  GdkWindow *window = NULL;
   GtkShadowType shadow_type;
-  guint width = 0, height = 0;
-  gint x = 0, y = 0;
-  gint index = 0;
   gint text_width = 0, text_height = 0;
-  const GtkSheetButton *button = NULL;
   GtkSheetChild *child = NULL;
-  GdkRectangle allocation;
-  gboolean is_sensitive = FALSE;
+  PangoAlignment align = PANGO_ALIGN_LEFT;
+
+  gboolean rtl ;
+
   gint state = 0;
   gint len = 0;
   gchar *line = 0;
 
-  PangoAlignment align = PANGO_ALIGN_LEFT; 
-  gboolean rtl;
+  g_return_if_fail(sheet != NULL);
+  g_return_if_fail(button != NULL);
 
   rtl = gtk_widget_get_direction(GTK_WIDGET(sheet)) == GTK_TEXT_DIR_RTL;
 
-  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
-
-  if(row >= 0 && !yyy_row_is_visible(sheet, row)) return;
-  if(column >= 0 && ! xxx_column_is_visible(sheet, column)) return;
-  if(row >= 0 && !sheet->row_titles_visible) return;
-  if(column >= 0 && !sheet->column_titles_visible) return;
-  if(column>=0 && column < MIN_VISIBLE_COLUMN(sheet)) return;
-  if(column>=0 && column > MAX_VISIBLE_COLUMN(sheet)) return;
-  if(row>=0 && row < MIN_VISIBLE_ROW(sheet)) return;
-  if(row>=0 && row > MAX_VISIBLE_ROW(sheet)) return;
-  if( (row == -1) && (column == -1) ) return; 
-
-  if(row==-1){
-     window=sheet->column_title_window;
-     button= xxx_column_button(sheet, column);
-     index=column;
-     x = COLUMN_LEFT_XPIXEL(sheet, column)+CELL_SPACING;
-     if(sheet->row_titles_visible) x -= sheet->row_title_area.width;
-     y = 0;
-     width = xxx_column_width(sheet, column);
-     height = sheet->column_title_area.height;
-     is_sensitive=xxx_column_is_sensitive(sheet, column);
-  }
-  if(column==-1){
-     window=sheet->row_title_window;
-     button = yyy_row_button(sheet, row);
-     index=row;
-     x = 0;
-     y = ROW_TOP_YPIXEL(sheet, row)+CELL_SPACING;
-     if(sheet->column_titles_visible) y-=sheet->column_title_area.height;
-     width = sheet->row_title_area.width;
-     height = yyy_row_height(sheet, row);
-     is_sensitive=yyy_row_is_sensitive(sheet, row);
-  }
-
-  allocation.x = x;
-  allocation.y = y;
-  allocation.width = width;
-  allocation.height = height;
   gdk_window_clear_area (window,
-                         x, y,
-                        width, height);
+                         allocation.x, allocation.y,
+                        allocation.width, allocation.height);
 
   gtk_paint_box (sheet->button->style, window,
-                 GTK_STATE_NORMAL, GTK_SHADOW_OUT, 
+                 GTK_STATE_NORMAL, GTK_SHADOW_OUT,
                  &allocation, GTK_WIDGET(sheet->button),
-                 "buttondefault", x, y, width, height);
+                 "buttondefault",
+                allocation.x, allocation.y,
+                allocation.width, allocation.height);
 
   state = button->state;
-  if(!is_sensitive) state=GTK_STATE_INSENSITIVE;
+  if(!is_sensitive) state = GTK_STATE_INSENSITIVE;
 
   if (state == GTK_STATE_ACTIVE)
-     shadow_type = GTK_SHADOW_IN;
+    shadow_type = GTK_SHADOW_IN;
   else
-     shadow_type = GTK_SHADOW_OUT;
+    shadow_type = GTK_SHADOW_OUT;
 
   if(state != GTK_STATE_NORMAL && state != GTK_STATE_INSENSITIVE)
     gtk_paint_box (sheet->button->style, window,
-                  button->state, shadow_type, 
+                  button->state, shadow_type,
                   &allocation, GTK_WIDGET(sheet->button),
-                  "button", x, y, width, height);
+                  "button",
+                  allocation.x, allocation.y,
+                  allocation.width, allocation.height);
 
-  if(button->label_visible){
+  if(button->label_visible)
+    {
 
-    text_height=DEFAULT_ROW_HEIGHT(GTK_WIDGET(sheet))-2*CELLOFFSET;
+      text_height=DEFAULT_ROW_HEIGHT(GTK_WIDGET(sheet))-2*CELLOFFSET;
 
-    gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->fg_gc[button->state], 
-                              &allocation);
-    gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->white_gc, &allocation);
+      gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->fg_gc[button->state],
+                               &allocation);
+      gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->white_gc, &allocation);
 
-    y += 2*sheet->button->style->ythickness;
+      allocation.y += 2*sheet->button->style->ythickness;
 
 
-    if(button->label && strlen(button->label)>0){
-           gchar *words = 0;
-           PangoLayout *layout = NULL;
-           gint real_x = x, real_y = y;
+      if(button->label && strlen(button->label)>0){
+       gchar *words = 0;
+       PangoLayout *layout = NULL;
+       gint real_x = allocation.x, real_y = allocation.y;
 
-           words=button->label;
-           line = g_new(gchar, 1);
-           line[0]='\0';
+       words=button->label;
+       line = g_new(gchar, 1);
+       line[0]='\0';
 
-           while(words && *words != '\0'){
-             if(*words != '\n'){
-                len=strlen(line);
-                line=g_realloc(line, len+2);
-                line[len]=*words;
-                line[len+1]='\0';
-             }
-             if(*words == '\n' || *(words+1) == '\0'){
-               text_width = STRING_WIDTH(GTK_WIDGET(sheet), GTK_WIDGET(sheet)->style->font_desc, line);
-
-               layout = gtk_widget_create_pango_layout (GTK_WIDGET(sheet), line);
-               switch(button->justification){
-                 case GTK_JUSTIFY_LEFT:
-                   real_x = x + CELLOFFSET;
-                   align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
-                   break;
-                 case GTK_JUSTIFY_RIGHT:
-                   real_x = x + width - text_width - CELLOFFSET;
-                   align = rtl ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
-                   break;
-                 case GTK_JUSTIFY_CENTER:
-                 default:
-                   real_x = x + (width - text_width)/2;
-                   align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
-                   pango_layout_set_justify (layout, TRUE);
-               }
-               pango_layout_set_alignment (layout, align);
-               gtk_paint_layout (GTK_WIDGET(sheet)->style,
-                                 window,
-                                 state,
-                                 FALSE,
-                                 &allocation,
-                                 GTK_WIDGET(sheet),
-                                 "label",
-                                 real_x, real_y,
-                                 layout);
-               g_object_unref(G_OBJECT(layout));
-
-               real_y += text_height + 2;
-
-               g_free(line);
-               line = g_new(gchar, 1);
-               line[0]='\0';
-             }
-             words++;
-           }
-           g_free(line);
-    }
+       while(words && *words != '\0'){
+         if(*words != '\n'){
+           len=strlen(line);
+           line=g_realloc(line, len+2);
+           line[len]=*words;
+           line[len+1]='\0';
+         }
+         if(*words == '\n' || *(words+1) == '\0'){
+           text_width = STRING_WIDTH(GTK_WIDGET(sheet), GTK_WIDGET(sheet)->style->font_desc, line);
+
+           layout = gtk_widget_create_pango_layout (GTK_WIDGET(sheet), line);
+           switch(button->justification){
+           case GTK_JUSTIFY_LEFT:
+             real_x = allocation.x + CELLOFFSET;
+             align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
+             break;
+           case GTK_JUSTIFY_RIGHT:
+             real_x = allocation.x + allocation.width - text_width - CELLOFFSET;
+             align = rtl ? PANGO_ALIGN_LEFT : PANGO_ALIGN_RIGHT;
+             break;
+           case GTK_JUSTIFY_CENTER:
+           default:
+             real_x = allocation.x + (allocation.width - text_width)/2;
+             align = rtl ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT;
+             pango_layout_set_justify (layout, TRUE);
+           }
+           pango_layout_set_alignment (layout, align);
+           gtk_paint_layout (GTK_WIDGET(sheet)->style,
+                             window,
+                             state,
+                             FALSE,
+                             &allocation,
+                             GTK_WIDGET(sheet),
+                             "label",
+                             real_x, real_y,
+                             layout);
+           g_object_unref(G_OBJECT(layout));
+
+           real_y += text_height + 2;
+
+           g_free(line);
+           line = g_new(gchar, 1);
+           line[0]='\0';
+         }
+         words++;
+       }
+       g_free(line);
+      }
 
-    gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->fg_gc[button->state],
-                            NULL);
-    gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->white_gc, NULL);
+      gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->fg_gc[button->state],
+                               NULL);
+      gdk_gc_set_clip_rectangle(GTK_WIDGET(sheet)->style->white_gc, NULL);
 
-  }
+    }
 
-  if((child = button->child) && (child->widget)){
+  if((child = button->child) && (child->widget))
+    {
       child->x = allocation.x;
       child->y = allocation.y;
 
-      child->x += (width - child->widget->requisition.width) / 2; 
-      child->y += (height - child->widget->requisition.height) / 2;
+      child->x += (allocation.width - child->widget->requisition.width) / 2;
+      child->y += (allocation.height - child->widget->requisition.height) / 2;
       allocation.x = child->x;
       allocation.y = child->y;
       allocation.width = child->widget->requisition.width;
       allocation.height = child->widget->requisition.height;
 
-      x = child->x;
-      y = child->y;
+      allocation.x = child->x;
+      allocation.y = child->y;
 
       gtk_widget_set_state(child->widget, button->state);
 
       if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) &&
-         GTK_WIDGET_MAPPED(child->widget))
-            {
-              gtk_widget_size_allocate(child->widget, 
-                                       &allocation);
-              gtk_widget_queue_draw(child->widget);
-            }
-  }
-   
+        GTK_WIDGET_MAPPED(child->widget))
+       {
+         gtk_widget_size_allocate(child->widget,
+                                  &allocation);
+         gtk_widget_queue_draw(child->widget);
+       }
+    }
+
+  gtk_sheet_button_free(button);
+}
+
+
+/* COLUMN value of -1 indicates that the area to the right of the rightmost
+   button should be redrawn */
+static void
+gtk_sheet_column_title_button_draw(GtkSheet *sheet, gint column)
+{
+  GdkWindow *window = NULL;
+  GdkRectangle allocation;
+  GtkSheetButton *button = NULL;
+  gboolean is_sensitive = FALSE;
+
+  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
+
+  if(column >= 0 && ! xxx_column_is_visible(sheet, column)) return;
+  if(column >= 0 && !sheet->column_titles_visible) return;
+  if(column>=0 && column < MIN_VISIBLE_COLUMN(sheet)) return;
+  if(column>=0 && column > MAX_VISIBLE_COLUMN(sheet)) return;
+
+  window = sheet->column_title_window;
+  allocation.y = 0;
+  allocation.height = sheet->column_title_area.height;
+
+  if ( column == -1 )
+    {
+      const gint cols = xxx_column_count(sheet) ;
+      allocation.x = COLUMN_LEFT_XPIXEL(sheet, cols - 1)
+       ;
+      allocation.width = sheet->column_title_area.width
+       + sheet->column_title_area.x
+       - allocation.x;
+
+      gdk_window_clear_area (window,
+                            allocation.x, allocation.y,
+                            allocation.width, allocation.height);
+    }
+  else
+    {
+      button = xxx_column_button(sheet, column);
+      allocation.x = COLUMN_LEFT_XPIXEL(sheet, column) + CELL_SPACING;
+      if(sheet->row_titles_visible)
+       allocation.x -= sheet->row_title_area.width;
+
+      allocation.width = xxx_column_width(sheet, column);
+
+      is_sensitive = xxx_column_is_sensitive(sheet, column);
+      gtk_sheet_button_draw(sheet, window, button,
+                           is_sensitive, allocation);
+    }
 }
 
+static void
+gtk_sheet_row_title_button_draw(GtkSheet *sheet, gint row)
+{
+  GdkWindow *window = NULL;
+  GdkRectangle allocation;
+  GtkSheetButton *button = NULL;
+  gboolean is_sensitive = FALSE;
+
+
+  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))) return;
+
+  if(row >= 0 && !yyy_row_is_visible(sheet, row)) return;
+  if(row >= 0 && !sheet->row_titles_visible) return;
+  if(row>=0 && row < MIN_VISIBLE_ROW(sheet)) return;
+  if(row>=0 && row > MAX_VISIBLE_ROW(sheet)) return;
+
+
+  window=sheet->row_title_window;
+  button = yyy_row_button(sheet, row);
+  allocation.x = 0;
+  allocation.y = ROW_TOP_YPIXEL(sheet, row) + CELL_SPACING;
+  if(sheet->column_titles_visible)
+    allocation.y -= sheet->column_title_area.height;
+  allocation.width = sheet->row_title_area.width;
+  allocation.height = yyy_row_height(sheet, row);
+  is_sensitive = yyy_row_is_sensitive(sheet, row);
+
+  gtk_sheet_button_draw(sheet, window, button, is_sensitive, allocation);
+}
 
 /* SCROLLBARS
  *
@@ -6585,7 +6793,7 @@ static void
 adjust_scrollbars (GtkSheet * sheet)
 {
 
- if(sheet->vadjustment){ 
+ if(sheet->vadjustment){
   sheet->vadjustment->page_size = sheet->sheet_window_height;
   sheet->vadjustment->page_increment = sheet->sheet_window_height / 2;
   sheet->vadjustment->step_increment = DEFAULT_ROW_HEIGHT(GTK_WIDGET(sheet));
@@ -6594,9 +6802,9 @@ adjust_scrollbars (GtkSheet * sheet)
 /*
   if (sheet->sheet_window_height - sheet->voffset > SHEET_HEIGHT (sheet))
     {
-      sheet->vadjustment->value = MAX(0, SHEET_HEIGHT (sheet) - 
+      sheet->vadjustment->value = MAX(0, SHEET_HEIGHT (sheet) -
        sheet->sheet_window_height);
-      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT (sheet->vadjustment),
                               "value_changed");
     }
 */
@@ -6613,9 +6821,9 @@ adjust_scrollbars (GtkSheet * sheet)
 /*
   if (sheet->sheet_window_width - sheet->hoffset > SHEET_WIDTH (sheet))
     {
-      sheet->hadjustment->value = MAX(0, SHEET_WIDTH (sheet) - 
+      sheet->hadjustment->value = MAX(0, SHEET_WIDTH (sheet) -
        sheet->sheet_window_width);
-      gtk_signal_emit_by_name (GTK_OBJECT(sheet->hadjustment), 
+      gtk_signal_emit_by_name (GTK_OBJECT(sheet->hadjustment),
                               "value_changed");
     }
 */
@@ -6623,7 +6831,7 @@ adjust_scrollbars (GtkSheet * sheet)
 
  }
 /*
- if(GTK_WIDGET_REALIZED(sheet)) 
+ if(GTK_WIDGET_REALIZED(sheet))
    {
      if(sheet->row_titles_visible){
                  size_allocate_row_title_buttons(sheet);
@@ -6684,10 +6892,10 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
 
   if(GTK_SHEET_IS_FROZEN(sheet)) return;
 
-  row=ROW_FROM_YPIXEL(sheet,sheet->column_title_area.height + CELL_SPACING);
+  row = ROW_FROM_YPIXEL(sheet,sheet->column_title_area.height + CELL_SPACING);
   if(!sheet->column_titles_visible)
-     row=ROW_FROM_YPIXEL(sheet,CELL_SPACING);
-    
+     row=ROW_FROM_YPIXEL(sheet, CELL_SPACING);
+
   old_value = -sheet->voffset;
 
   new_row = g_sheet_row_pixel_to_row(sheet->row_geometry,
@@ -6696,71 +6904,77 @@ vadjustment_value_changed (GtkAdjustment * adjustment,
   y = g_sheet_row_start_pixel(sheet->row_geometry, new_row, sheet);
 
   if (adjustment->value > sheet->old_vadjustment && sheet->old_vadjustment > 0. &&
-      yyy_row_height(sheet, row) > sheet->vadjustment->step_increment){
-/* This avoids embarrassing twitching */
-          if(row == new_row && row != yyy_row_count(sheet) - 1 &&
-             adjustment->value - sheet->old_vadjustment >= 
-                          sheet->vadjustment->step_increment &&
-             new_row + 1 != MIN_VISIBLE_ROW(sheet)){
-                new_row+=1;
-                y=y+yyy_row_height(sheet, row);
-          }
-  }
+      yyy_row_height(sheet, row) > sheet->vadjustment->step_increment)
+    {
+      /* This avoids embarrassing twitching */
+      if(row == new_row && row != yyy_row_count(sheet) - 1 &&
+        adjustment->value - sheet->old_vadjustment >=
+        sheet->vadjustment->step_increment &&
+        new_row + 1 != MIN_VISIBLE_ROW(sheet)){
+       new_row+=1;
+       y=y+yyy_row_height(sheet, row);
+      }
+    }
 
-/* Negative old_adjustment enforces the redraw, otherwise avoid spureous redraw */
-  if(sheet->old_vadjustment >= 0. && row == new_row){
+  /* Negative old_adjustment enforces the redraw, otherwise avoid
+     spureous redraw */
+  if(sheet->old_vadjustment >= 0. && row == new_row)
+    {
       sheet->old_vadjustment = sheet->vadjustment->value;
       return;
-  }
+    }
 
   sheet->old_vadjustment = sheet->vadjustment->value;
   adjustment->value=y;
 
-  if(new_row == 0){
-   sheet->vadjustment->step_increment=  yyy_row_height(sheet, 0);
-  }else{
-   sheet->vadjustment->step_increment=
-   MIN(yyy_row_height(sheet, new_row), yyy_row_height(sheet, new_row-1));
-  }
 
-  sheet->vadjustment->value=adjustment->value;
+  if(new_row == 0)
+    {
+      sheet->vadjustment->step_increment =  yyy_row_height(sheet, 0);
+    }
+  else
+    {
+      sheet->vadjustment->step_increment =
+       MIN(yyy_row_height(sheet, new_row), yyy_row_height(sheet, new_row-1));
+    }
+
+  sheet->vadjustment->value = adjustment->value;
 
   value = adjustment->value;
 
   if (value >= -sheet->voffset)
-       {
-         /* scroll down */
-         diff = value + sheet->voffset;
-       }
+    {
+      /* scroll down */
+      diff = value + sheet->voffset;
+    }
   else
-       {
-         /* scroll up */
-         diff = -sheet->voffset - value;
-       }
+    {
+      /* scroll up */
+      diff = -sheet->voffset - value;
+    }
 
-      sheet->voffset = -value;
-  sheet->view.row0=ROW_FROM_YPIXEL(sheet, sheet->column_title_area.height+1);
-  sheet->view.rowi=ROW_FROM_YPIXEL(sheet, sheet->sheet_window_height-1);
+  sheet->voffset = -value;
+
+  sheet->view.row0=ROW_FROM_YPIXEL(sheet, sheet->column_title_area.height + 1);
+  sheet->view.rowi=ROW_FROM_YPIXEL(sheet, sheet->sheet_window_height - 1);
   if(!sheet->column_titles_visible)
-     sheet->view.row0=ROW_FROM_YPIXEL(sheet, 1);
+    sheet->view.row0=ROW_FROM_YPIXEL(sheet, 1);
 
   if(GTK_WIDGET_REALIZED(sheet->sheet_entry) &&
-     sheet->state == GTK_SHEET_NORMAL && 
+     sheet->state == GTK_SHEET_NORMAL &&
      sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 &&
      !gtk_sheet_cell_isvisible(sheet, sheet->active_cell.row,
-                                      sheet->active_cell.col))
+                              sheet->active_cell.col))
     {
       const gchar *text;
 
       text = gtk_entry_get_text(GTK_ENTRY(gtk_sheet_get_entry(sheet)));
 
-      if(!text || strlen(text)==0) 
-             gtk_sheet_cell_clear(sheet,
-                                  sheet->active_cell.row,
-                                  sheet->active_cell.col);
-       gtk_widget_unmap(sheet->sheet_entry);
+      if(!text || strlen(text)==0)
+       gtk_sheet_cell_clear(sheet,
+                            sheet->active_cell.row,
+                            sheet->active_cell.col);
+      gtk_widget_unmap(sheet->sheet_entry);
     }
 
   gtk_sheet_position_children(sheet);
@@ -6805,7 +7019,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
       xxx_column_width(sheet, i) > sheet->hadjustment->step_increment){
 /* This avoids embarrassing twitching */
           if(column == new_column && column != xxx_column_count(sheet) - 1 &&
-             adjustment->value - sheet->old_hadjustment >= 
+             adjustment->value - sheet->old_hadjustment >=
                           sheet->hadjustment->step_increment &&
              new_column + 1 != MIN_VISIBLE_COLUMN(sheet)){
              new_column+=1;
@@ -6854,7 +7068,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
     sheet->view.col0=COLUMN_FROM_XPIXEL(sheet, 1);
 
   if(GTK_WIDGET_REALIZED(sheet->sheet_entry) &&
-     sheet->state == GTK_SHEET_NORMAL && 
+     sheet->state == GTK_SHEET_NORMAL &&
      sheet->active_cell.row >= 0 && sheet->active_cell.col >= 0 &&
      !gtk_sheet_cell_isvisible(sheet, sheet->active_cell.row,
                                       sheet->active_cell.col))
@@ -6862,7 +7076,7 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
       const gchar *text;
 
       text = gtk_entry_get_text(GTK_ENTRY(gtk_sheet_get_entry(sheet)));
-      if(!text || strlen(text)==0) 
+      if(!text || strlen(text)==0)
              gtk_sheet_cell_clear(sheet,
                                   sheet->active_cell.row,
                                   sheet->active_cell.col);
@@ -6875,41 +7089,41 @@ hadjustment_value_changed (GtkAdjustment * adjustment,
   gtk_sheet_range_draw(sheet, NULL);
   size_allocate_column_title_buttons(sheet);
 }
-       
+
 
 /* COLUMN RESIZING */
-static void                          
+static void
 draw_xor_vline (GtkSheet * sheet)
 {
   GtkWidget *widget;
-  
+
   g_return_if_fail (sheet != NULL);
-  
+
   widget = GTK_WIDGET (sheet);
 
-  gdk_draw_line (widget->window, sheet->xor_gc,  
-                 sheet->x_drag,                                       
-                 sheet->column_title_area.height,                               
-                 sheet->x_drag,                                             
+  gdk_draw_line (widget->window, sheet->xor_gc,
+                 sheet->x_drag,
+                 sheet->column_title_area.height,
+                 sheet->x_drag,
                  sheet->sheet_window_height + 1);
 }
 
 /* ROW RESIZING */
-static void                          
+static void
 draw_xor_hline (GtkSheet * sheet)
 {
   GtkWidget *widget;
-  
+
   g_return_if_fail (sheet != NULL);
-  
+
   widget = GTK_WIDGET (sheet);
 
-  gdk_draw_line (widget->window, sheet->xor_gc,  
+  gdk_draw_line (widget->window, sheet->xor_gc,
                 sheet->row_title_area.width,
-                 sheet->y_drag,                                       
-                        
-                sheet->sheet_window_width + 1,                      
-                 sheet->y_drag);                                             
+                 sheet->y_drag,
+
+                sheet->sheet_window_width + 1,
+                 sheet->y_drag);
 }
 
 /* SELECTED RANGE */
@@ -6967,9 +7181,9 @@ draw_xor_rectangle(GtkSheet *sheet, GtkSheetRange range)
 
    gdk_gc_set_foreground(sheet->xor_gc, &values.foreground);
 
-}                      
+}
+
 
-  
 /* this function returns the new width of the column being resized given
  * the column and x position of the cursor; the x cursor position is passed
  * in as a pointer and automaticaly corrected if it's beyond min/max limits */
@@ -7005,9 +7219,9 @@ new_column_width (GtkSheet * sheet,
     width = min_width;
 
   xxx_set_column_width(sheet, column, width);
-  sheet->view.coli=COLUMN_FROM_XPIXEL(sheet, sheet->sheet_window_width);
+  sheet->view.coli = COLUMN_FROM_XPIXEL(sheet, sheet->sheet_window_width);
   size_allocate_column_title_buttons (sheet);
-  
+
   return width;
 }
 
@@ -7070,16 +7284,17 @@ gtk_sheet_set_column_width (GtkSheet * sheet,
 
   xxx_set_column_width(sheet, column, width);
 
-  if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) && !GTK_SHEET_IS_FROZEN(sheet)){
-    size_allocate_column_title_buttons (sheet);
-    adjust_scrollbars (sheet);
-    gtk_sheet_size_allocate_entry(sheet);
-    gtk_sheet_range_draw (sheet, NULL);
-  } else
+  if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) && !GTK_SHEET_IS_FROZEN(sheet))
+    {
+      size_allocate_column_title_buttons (sheet);
+      adjust_scrollbars (sheet);
+      gtk_sheet_size_allocate_entry(sheet);
+      gtk_sheet_range_draw (sheet, NULL);
+    }
 
   gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[CHANGED], -1, column);
-  gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[NEW_COL_WIDTH], column, width);
-
+  gtk_signal_emit(GTK_OBJECT(sheet), sheet_signals[NEW_COL_WIDTH],
+                 column, width);
 }
 
 
@@ -7116,10 +7331,11 @@ gtk_sheet_set_row_height (GtkSheet * sheet,
 
 
 gboolean
-gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *attributes)
+gtk_sheet_get_attributes(const GtkSheet *sheet, gint row, gint col,
+                        GtkSheetCellAttr *attributes)
 {
- const GdkColor *fg, *bg; 
- const GtkJustification *j ; 
+ const GdkColor *fg, *bg;
+ const GtkJustification *j ;
  const PangoFontDescription *font_desc ;
  const GtkSheetCellBorder *border ;
 
@@ -7130,18 +7346,18 @@ gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *
 
  init_attributes(sheet, col, attributes);
 
- if ( !sheet->model) 
-        return FALSE;
+ if ( !sheet->model)
+   return FALSE;
 
  attributes->is_editable = g_sheet_model_is_editable(sheet->model, row, col);
  attributes->is_visible = g_sheet_model_is_visible(sheet->model, row, col);
 
  fg = g_sheet_model_get_foreground(sheet->model, row, col);
- if ( fg ) 
+ if ( fg )
    attributes->foreground =  *fg;
 
  bg = g_sheet_model_get_background(sheet->model, row, col);
- if ( bg ) 
+ if ( bg )
    attributes->background =  *bg;
 
  j = g_sheet_model_get_justification(sheet->model, row, col);
@@ -7158,9 +7374,9 @@ gtk_sheet_get_attributes(GtkSheet *sheet, gint row, gint col, GtkSheetCellAttr *
 }
 
 static void
-init_attributes(GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
+init_attributes(const GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
 {
- /* DEFAULT VALUES */    
+ /* DEFAULT VALUES */
  attributes->foreground = GTK_WIDGET(sheet)->style->black;
  attributes->background = sheet->bg_color;
  if(!GTK_WIDGET_REALIZED(GTK_WIDGET(sheet))){
@@ -7179,9 +7395,7 @@ init_attributes(GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
  attributes->is_editable = TRUE;
  attributes->is_visible = TRUE;
  attributes->font_desc = GTK_WIDGET(sheet)->style->font_desc;
-
-}       
+}
 
 
 /********************************************************************
@@ -7192,10 +7406,10 @@ init_attributes(GtkSheet *sheet, gint col, GtkSheetCellAttr *attributes)
  * gtk_sheet_remove
  * gtk_sheet_move_child
  * gtk_sheet_position_child
- * gtk_sheet_position_children 
+ * gtk_sheet_position_children
  * gtk_sheet_realize_child
  * gtk_sheet_get_child_at
- ********************************************************************/ 
+ ********************************************************************/
 
 GtkSheetChild *
 gtk_sheet_put(GtkSheet *sheet, GtkWidget *child, gint x, gint y)
@@ -7210,7 +7424,7 @@ gtk_sheet_put(GtkSheet *sheet, GtkWidget *child, gint x, gint y)
 
   child_info = g_new (GtkSheetChild, 1);
   child_info->widget = child;
-  child_info->x = x;  
+  child_info->x = x;
   child_info->y = y;
   child_info->attached_to_cell = FALSE;
   child_info->floating = TRUE;
@@ -7227,11 +7441,11 @@ gtk_sheet_put(GtkSheet *sheet, GtkWidget *child, gint x, gint y)
 
   if (GTK_WIDGET_VISIBLE(GTK_WIDGET(sheet)))
     {
-       if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) && 
+       if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) &&
           (!GTK_WIDGET_REALIZED(child) || GTK_WIDGET_NO_WINDOW(child)))
         gtk_sheet_realize_child(sheet, child_info);
 
-       if(GTK_WIDGET_MAPPED(GTK_WIDGET(sheet)) && 
+       if(GTK_WIDGET_MAPPED(GTK_WIDGET(sheet)) &&
           !GTK_WIDGET_MAPPED(child))
         gtk_widget_map(child);
     }
@@ -7349,8 +7563,8 @@ gtk_sheet_attach        (GtkSheet *sheet,
 }
 
 void
-gtk_sheet_button_attach                (GtkSheet *sheet, 
-                                GtkWidget *widget, 
+gtk_sheet_button_attach                (GtkSheet *sheet,
+                                GtkWidget *widget,
                                 gint row, gint col)
 {
   GtkSheetButton *button = 0;
@@ -7362,8 +7576,8 @@ gtk_sheet_button_attach           (GtkSheet *sheet,
 
   child = g_new (GtkSheetChild, 1);
   child->widget = widget;
-  child->x = 0;  
-  child->y = 0;  
+  child->x = 0;
+  child->y = 0;
   child->attached_to_cell = TRUE;
   child->floating = FALSE;
   child->row = row;
@@ -7380,11 +7594,11 @@ gtk_sheet_button_attach         (GtkSheet *sheet,
 
   if (GTK_WIDGET_VISIBLE(GTK_WIDGET(sheet)))
     {
-       if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) && 
+       if(GTK_WIDGET_REALIZED(GTK_WIDGET(sheet)) &&
           (!GTK_WIDGET_REALIZED(widget) || GTK_WIDGET_NO_WINDOW(widget)))
         gtk_sheet_realize_child(sheet, child);
 
-       if(GTK_WIDGET_MAPPED(GTK_WIDGET(sheet)) && 
+       if(GTK_WIDGET_MAPPED(GTK_WIDGET(sheet)) &&
           !GTK_WIDGET_MAPPED(widget))
         gtk_widget_map(widget);
     }
@@ -7418,13 +7632,13 @@ label_size_request(GtkSheet *sheet, gchar *label, GtkRequisition *req)
     }
     words++;
   }
+
   if(n > 0) req->height -= 2;
 }
 
 static void
 gtk_sheet_button_size_request  (GtkSheet *sheet,
-                                 const GtkSheetButton *button, 
+                                 const GtkSheetButton *button,
                                  GtkRequisition *button_requisition)
 {
   GtkRequisition requisition;
@@ -7437,7 +7651,7 @@ gtk_sheet_button_size_request     (GtkSheet *sheet,
   } else {
      label_requisition.height = DEFAULT_ROW_HEIGHT(GTK_WIDGET(sheet));
      label_requisition.width = COLUMN_MIN_WIDTH;
-  } 
+  }
 
   if(button->child)
   {
@@ -7456,7 +7670,7 @@ gtk_sheet_button_size_request     (GtkSheet *sheet,
   *button_requisition = requisition;
   button_requisition->width = MAX(requisition.width, label_requisition.width);
   button_requisition->height = MAX(requisition.height, label_requisition.height);
+
 }
 
 static void
@@ -7467,7 +7681,7 @@ gtk_sheet_row_size_request      (GtkSheet *sheet,
   GtkRequisition button_requisition;
   GList *children;
 
-  gtk_sheet_button_size_request(sheet, 
+  gtk_sheet_button_size_request(sheet,
                                yyy_row_button(sheet, row),
                                &button_requisition);
 
@@ -7498,7 +7712,7 @@ gtk_sheet_column_size_request   (GtkSheet *sheet,
   GtkRequisition button_requisition;
   GList *children;
 
-  gtk_sheet_button_size_request(sheet, 
+  gtk_sheet_button_size_request(sheet,
                                xxx_column_button(sheet, col),
                                &button_requisition);
 
@@ -7547,7 +7761,7 @@ gtk_sheet_move_child(GtkSheet *sheet, GtkWidget *widget, gint x, gint y)
        children = children->next;
     }
 
-  g_warning("Widget must be a GtkSheet child"); 
+  g_warning("Widget must be a GtkSheet child");
 
 }
 
@@ -7556,14 +7770,14 @@ gtk_sheet_position_child(GtkSheet *sheet, GtkSheetChild *child)
 {
    GtkRequisition child_requisition;
    GtkAllocation child_allocation;
-   gint xoffset = 0; 
+   gint xoffset = 0;
    gint yoffset = 0;
    gint x = 0, y = 0;
    GdkRectangle area;
 
    gtk_widget_get_child_requisition(child->widget, &child_requisition);
 
-   if(sheet->column_titles_visible) 
+   if(sheet->column_titles_visible)
              yoffset = sheet->column_title_area.height;
 
    if(sheet->row_titles_visible)
@@ -7574,15 +7788,15 @@ gtk_sheet_position_child(GtkSheet *sheet, GtkSheetChild *child)
       child->x = COLUMN_LEFT_XPIXEL(sheet, child->col);
       child->y = ROW_TOP_YPIXEL(sheet, child->row);
 
-      if(sheet->row_titles_visible) 
+      if(sheet->row_titles_visible)
                                     child->x-=sheet->row_title_area.width;
-      if(sheet->column_titles_visible) 
+      if(sheet->column_titles_visible)
                                     child->y-=sheet->column_title_area.height;
 
       width = xxx_column_width(sheet, child->col);
       height = yyy_row_height(sheet, child->row);
 */
-      
+
       gtk_sheet_get_cell_area(sheet, child->row, child->col, &area);
       child->x = area.x + child->xpadding;
       child->y = area.y + child->ypadding;
@@ -7631,8 +7845,8 @@ gtk_sheet_position_child(GtkSheet *sheet, GtkSheetChild *child)
    }
    else
    {
-      x = child_allocation.x = child->x + sheet->hoffset + xoffset;   
-      x = child_allocation.x = child->x + xoffset;   
+      x = child_allocation.x = child->x + sheet->hoffset + xoffset;
+      x = child_allocation.x = child->x + xoffset;
       y = child_allocation.y = child->y + sheet->voffset + yoffset;
       y = child_allocation.y = child->y + yoffset;
       child_allocation.width = child_requisition.width;
@@ -7688,7 +7902,7 @@ gtk_sheet_position_children(GtkSheet *sheet)
            gtk_sheet_position_child(sheet, child);
 
      if(child->row == -1){
-        if(child->col < MIN_VISIBLE_COLUMN(sheet) || 
+        if(child->col < MIN_VISIBLE_COLUMN(sheet) ||
            child->col > MAX_VISIBLE_COLUMN(sheet))
               gtk_sheet_child_hide(child);
         else
@@ -7701,10 +7915,10 @@ gtk_sheet_position_children(GtkSheet *sheet)
         else
               gtk_sheet_child_show(child);
      }
+
      children = children->next;
    }
-    
+
 }
 
 static void
@@ -7762,7 +7976,7 @@ gtk_sheet_realize_child(GtkSheet *sheet, GtkSheetChild *child)
 }
 
 
-   
+
 GtkSheetChild *
 gtk_sheet_get_child_at(GtkSheet *sheet, gint row, gint col)
 {
@@ -7779,25 +7993,25 @@ gtk_sheet_get_child_at(GtkSheet *sheet, gint row, gint col)
      child = (GtkSheetChild *)children->data;
 
      if(child->attached_to_cell)
-        if(child->row == row && child->col == col) break; 
-     
+        if(child->row == row && child->col == col) break;
+
      children = children->next;
    }
 
-  if(children) return child; 
+  if(children) return child;
 
   return NULL;
 }
 
 static void
-gtk_sheet_child_hide(GtkSheetChild *child) 
+gtk_sheet_child_hide(GtkSheetChild *child)
 {
   g_return_if_fail(child != NULL);
   gtk_widget_hide(child->widget);
 }
 
 static void
-gtk_sheet_child_show(GtkSheetChild *child) 
+gtk_sheet_child_show(GtkSheetChild *child)
 {
   g_return_if_fail(child != NULL);
 
@@ -7812,3 +8026,27 @@ gtk_sheet_get_model(const GtkSheet *sheet)
   return sheet->model;
 }
 
+
+GtkSheetButton *
+gtk_sheet_button_new(void)
+{
+  GtkSheetButton *button = g_malloc(sizeof(GtkSheetButton));
+
+  button->state = GTK_STATE_NORMAL;
+  button->label = NULL;
+  button->label_visible = TRUE;
+  button->child = NULL;
+  button->justification = GTK_JUSTIFY_FILL;
+
+  return button;
+}
+
+
+inline void
+gtk_sheet_button_free(GtkSheetButton *button)
+{
+  if (!button) return ;
+
+  g_free(button->label);
+  g_free(button);
+}