[drgeo/goffice: 73/82] use gi18n.h for gettext macros. ditto. add drgeo_mdi.h. removed gettext



commit 7cee7b683f3df149f328e1d8e55edb20d8685d51
Author: Jean Brefort <jean brefort normalesup org>
Date:   Sat Feb 25 17:03:27 2006 +0000

    use gi18n.h for gettext macros. ditto. add drgeo_mdi.h. removed gettext
    
    2006-02-25  Jean Brefort  <jean brefort normalesup org>
    
    	* drgenius_mdi.cc: use gi18n.h for gettext macros.
    	* drgeo_adaptDialog.cc: ditto.
    	* geo/Makefile.am: add drgeo_mdi.h.
    	* geo/define.h: removed gettext macros
    	* geo/drgeo_angle.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_arcCircle.cc: use gi18n-lib.h and add GetBounds.
    	* geo/drgeo_arcCircle.h: add GetBounds.
    	* geo/drgeo_circle.cc: use gi18n-lib.h and add GetBounds.
    	* geo/drgeo_circle.h: add GetBounds.
    	* geo/drgeo_config.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_control.cc: ditto.
    	* geo/drgeo_dialog.cc: ditto.
    	* geo/drgeo_drawable.cc: set NULL tool before destroying a drgeoDrawableUI
    	[#1438665].
    	* geo/drgeo_equation.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_figure.cc: don't try to save area related stuff is area is NULL.
    	* geo/drgeo_halfLine.cc: use gi18n-lib.h and add GetBounds.
    	* geo/drgeo_halfLine.h: add GetBounds.
    	* geo/drgeo_line.cc: use gi18n-lib.h and add GetBounds.
    	* geo/drgeo_line.h: add GetBounds.
    	* geo/drgeo_locus.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_mdi.cc: minor typo.
    	* geo/drgeo_menu.cc: use GETTEXT_PACKAGE when calling libglade.
    	* geo/drgeo_numeric.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_point.cc: use gi18n-lib.h and point::GetBounds returns false
    	when masked.
    	* geo/drgeo_point.h: removed unuseful virtual.
    	* geo/drgeo_polygon.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_repere.cc: ditto.
    	* geo/drgeo_scm_helper.cc: ditto.
    	* geo/drgeo_script.cc: ditto.
    	* geo/drgeo_segment.cc: ditto.
    	* geo/drgeo_tool.cc: ditto.
    	* geo/drgeo_toolbar.cc: use GETTEXT_PACKAGE when calling libglade.
    	* geo/drgeo_value.cc: use gi18n-lib.h for gettext macros.
    	* geo/drgeo_vector.cc: ditto.
    	* geo/geo_view.cc: ditto.
    	* glade/Makefile.am: add areabounds.glade
    	* glade/areabounds.glade: new glade file.
    	* goffice/Makefile.am: add new files.
    	* goffice/drgeo.cc: implement editing and add limits to the drawing area.
    	* goffice/drgeo_areabounds.cc: edit drawing area limits.
    	* goffice/drgeo_areabounds.h: ditto.
    	* goffice/drgeo_cairodrawable.cc: displays almost anything except text.
    	* goffice/drgeo_cairodrawable.h: ditto.
    	* goffice/drgeo_dummydrawable.cc: used when determining size.
    	* goffice/drgeo_dummydrawable.h: ditto.
    	* goffice/drgeo_gpdrawable.cc: prints almost anything, except text.
    	* goffice/drgeo_gpdrawable.h: ditto.
    	* goffice/drgeo_impl.h: component implementation.
    	* goffice/goffice_mdi.cc: make edition work.
    	* goffice/goffice_mdi.h: ditto.
    	* goffice/goffice_window.cc: editor window.
    	* goffice/goffice_window.h: ditto.

 ChangeLog                      |   69 ++++++-
 drgenius_mdi.cc                |    3 +-
 drgeo_adaptDialog.cc           |    2 +
 geo/Makefile.am                |    2 +-
 geo/define.h                   |    5 -
 geo/drgeo_angle.cc             |    1 +
 geo/drgeo_arcCircle.cc         |   46 ++++-
 geo/drgeo_arcCircle.h          |    2 +
 geo/drgeo_circle.cc            |   14 ++
 geo/drgeo_circle.h             |   49 ++--
 geo/drgeo_config.cc            |    2 +
 geo/drgeo_control.cc           |    3 +-
 geo/drgeo_dialog.cc            |    2 +
 geo/drgeo_drawable.cc          |    1 +
 geo/drgeo_drawable.h           |    1 -
 geo/drgeo_equation.cc          |    1 +
 geo/drgeo_figure.cc            |   39 ++--
 geo/drgeo_halfLine.cc          |   29 +++
 geo/drgeo_halfLine.h           |    2 +
 geo/drgeo_line.cc              |   29 +++
 geo/drgeo_line.h               |    2 +
 geo/drgeo_locus.cc             |    2 +-
 geo/drgeo_mdi.cc               |    2 +-
 geo/drgeo_menu.cc              |    2 +-
 geo/drgeo_numeric.cc           |    1 +
 geo/drgeo_point.cc             |    3 +
 geo/drgeo_point.h              |    2 +-
 geo/drgeo_polygon.cc           |    1 +
 geo/drgeo_repere.cc            |    1 +
 geo/drgeo_scm_helper.cc        |    2 +
 geo/drgeo_script.cc            |    4 +-
 geo/drgeo_segment.cc           |    1 +
 geo/drgeo_tool.cc              |    2 +
 geo/drgeo_toolbar.cc           |   19 +-
 geo/drgeo_value.cc             |    1 +
 geo/drgeo_vector.cc            |    4 +-
 geo/geo_view.cc                |    2 +
 glade/Makefile.am              |    4 +-
 glade/areabounds.glade         |  495 ++++++++++++++++++++++++++++++++++++++++
 goffice/Makefile.am            |   33 +++-
 goffice/drgeo.cc               |  257 ++++++++++++++++++---
 goffice/drgeo_areabounds.cc    |  222 ++++++++++++++++++
 goffice/drgeo_areabounds.h     |   53 +++++
 goffice/drgeo_cairodrawable.cc |  139 +++++++++++-
 goffice/drgeo_cairodrawable.h  |    8 +-
 goffice/drgeo_dummydrawable.cc |   44 ++++
 goffice/drgeo_dummydrawable.h  |   52 +++++
 goffice/drgeo_gpdrawable.cc    |  146 +++++++++++--
 goffice/drgeo_gpdrawable.h     |    8 +-
 goffice/drgeo_impl.h           |   43 ++++
 goffice/goffice_mdi.cc         |  121 +++++++++--
 goffice/goffice_mdi.h          |   40 ++--
 goffice/goffice_window.cc      |  297 ++++++++++++++++++++++++
 goffice/goffice_window.h       |   60 +++++
 54 files changed, 2197 insertions(+), 178 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 7bb206f..3a51f2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -27,6 +27,63 @@
 
 	* configure.ac: Add "zh_HK" to ALL_LINGUAS.
 
+2006-02-25  Jean Brefort  <jean brefort normalesup org>
+
+	* drgenius_mdi.cc: use gi18n.h for gettext macros.
+	* drgeo_adaptDialog.cc: ditto.
+	* geo/Makefile.am: add drgeo_mdi.h.
+	* geo/define.h: removed gettext macros
+	* geo/drgeo_angle.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_arcCircle.cc: use gi18n-lib.h and add GetBounds.
+	* geo/drgeo_arcCircle.h: add GetBounds.
+	* geo/drgeo_circle.cc: use gi18n-lib.h and add GetBounds.
+	* geo/drgeo_circle.h: add GetBounds.
+	* geo/drgeo_config.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_control.cc: ditto.
+	* geo/drgeo_dialog.cc: ditto.
+	* geo/drgeo_drawable.cc: set NULL tool before destroying a drgeoDrawableUI
+	[#1438665].
+	* geo/drgeo_equation.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_figure.cc: don't try to save area related stuff is area is NULL.
+	* geo/drgeo_halfLine.cc: use gi18n-lib.h and add GetBounds.
+	* geo/drgeo_halfLine.h: add GetBounds.
+	* geo/drgeo_line.cc: use gi18n-lib.h and add GetBounds.
+	* geo/drgeo_line.h: add GetBounds.
+	* geo/drgeo_locus.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_mdi.cc: minor typo.
+	* geo/drgeo_menu.cc: use GETTEXT_PACKAGE when calling libglade.
+	* geo/drgeo_numeric.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_point.cc: use gi18n-lib.h and point::GetBounds returns false
+	when masked.
+	* geo/drgeo_point.h: removed unuseful virtual.
+	* geo/drgeo_polygon.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_repere.cc: ditto.
+	* geo/drgeo_scm_helper.cc: ditto.
+	* geo/drgeo_script.cc: ditto.
+	* geo/drgeo_segment.cc: ditto.
+	* geo/drgeo_tool.cc: ditto.
+	* geo/drgeo_toolbar.cc: use GETTEXT_PACKAGE when calling libglade.
+	* geo/drgeo_value.cc: use gi18n-lib.h for gettext macros.
+	* geo/drgeo_vector.cc: ditto.
+	* geo/geo_view.cc: ditto.
+	* glade/Makefile.am: add areabounds.glade
+	* glade/areabounds.glade: new glade file.
+	* goffice/Makefile.am: add new files.
+	* goffice/drgeo.cc: implement editing and add limits to the drawing area.
+	* goffice/drgeo_areabounds.cc: edit drawing area limits.
+	* goffice/drgeo_areabounds.h: ditto.
+	* goffice/drgeo_cairodrawable.cc: displays almost anything except text.
+	* goffice/drgeo_cairodrawable.h: ditto.
+	* goffice/drgeo_dummydrawable.cc: used when determining size.
+	* goffice/drgeo_dummydrawable.h: ditto.
+	* goffice/drgeo_gpdrawable.cc: prints almost anything, except text.
+	* goffice/drgeo_gpdrawable.h: ditto.
+	* goffice/drgeo_impl.h: component implementation.
+	* goffice/goffice_mdi.cc: make edition work.
+	* goffice/goffice_mdi.h: ditto.
+	* goffice/goffice_window.cc: editor window.
+	* goffice/goffice_window.h: ditto.
+
 2006-02-08  Jean Brefort  <jean brefort normalesup org>
 
 	* goffice/drgeo_cairodrawable.cc: now display all lines and points styles.
@@ -144,7 +201,11 @@
 
 	* configure.ac: Fix up the Norwegian entries in ALL_LINGUAS.
 
+<<<<<<< HEAD
 2005-05-05  I�aki Larra�aga  <dooteo euskalgnu org>
+=======
+2005-05-05  Iñaki Larrañaga  <dooteo euskalgnu org>
+>>>>>>> use gi18n.h for gettext macros. ditto. add drgeo_mdi.h. removed gettext
 
 	* configure.ac: Added "eu" (Basque) to ALL_LINGUAS.
 
@@ -341,7 +402,7 @@
 
 	* drgeo_init.cc (drgeoInit): Load Serbian constant definitions.
 
-2003-09-16  Danilo � egan  <dsegan gmx net>
+2003-09-16  Danilo ��� egan  <dsegan gmx net>
 
 	* configure.ac: Added "sr" and "sr Latn" to ALL_LINGUAS.
 
@@ -762,7 +823,7 @@
 	* configure.in: Check if extra ncurses/ is required or not. Thanks
 	to Vladimir Tamara <vtamara gnu org>.
 	
-2000-11-28  Martin NorbÃ?â?¬ck  <d95mback dtek chalmers se>
+2000-11-28  Martin Norb���ck  <d95mback dtek chalmers se>
 
 	* drgenius.desktop: Added Swedish translation.
 
@@ -870,7 +931,7 @@ Sun May 21 01:01:31 2000  George Lebl <jirka 5z com>
 
 2000-02-15  Hilaire Fernandes  <hilaire seul org>
 
-	* drgenius_menus.c (toolbar): Use icons provide by Fr�©d�©ric
+	* drgenius_menus.c (toolbar): Use icons provide by Fr���©d���©ric
 	Toussaint for the toolbar.
 
 Fri Feb 11 19:08:53 2000  George Lebl <jirka 5z com>
@@ -1403,7 +1464,7 @@ Mon May 17 23:55:50 1999  George Lebl  <jirka 5z com>
 
 	* configure.in: raised version
 
-1999-05-18 03:27 1999  Tomas Ã?Â?gren  <stric ing umu se>
+1999-05-18 03:27 1999  Tomas Ã?Â?Ã?Â?gren  <stric ing umu se>
 
 	* src/*.c: Fixed i18n support
 
diff --git a/drgenius_mdi.cc b/drgenius_mdi.cc
index 97d98e8..9daf7c3 100644
--- a/drgenius_mdi.cc
+++ b/drgenius_mdi.cc
@@ -20,7 +20,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <config.h>
+#include "config.h"
 #include <glade/glade.h>
 #include <errno.h>
 
@@ -35,6 +35,7 @@
 #include "drgeo_gtkhelpers.h"
 #include "drgeo_scm_helper.h"
 #include "drgeo_tool.h"
+#include <glib/gi18n.h>
 
 #define DATA_BEGIN  ((char) 2)
 #define DATA_END  ((char) 5)
diff --git a/drgeo_adaptDialog.cc b/drgeo_adaptDialog.cc
index 9feba41..070bb80 100644
--- a/drgeo_adaptDialog.cc
+++ b/drgeo_adaptDialog.cc
@@ -21,6 +21,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include <stdio.h>
 #include <time.h>
 #include <unistd.h>
@@ -32,6 +33,7 @@
 #include "drgeo_figure.h"
 #include "drgeo_menu.h"
 #include "drgenius_mdi.h"
+#include <glib/gi18n-lib.h>
 
 #ifndef G_PLATFORM_WIN32
    #include <crypt.h>
diff --git a/geo/Makefile.am b/geo/Makefile.am
index bc016a9..de12609 100644
--- a/geo/Makefile.am
+++ b/geo/Makefile.am
@@ -80,7 +80,7 @@ libgeo_la_SOURCES = \
 	drgeo_scm_api.h drgeo_scm_api.cc			\
 	drgeo_scm_helper.h drgeo_scm_helper.cc			\
 	drgeo_gtkhelpers.h drgeo_gtkhelpers.cc		\
-	drgeo_mdi.cc
+	drgeo_mdi.h drgeo_mdi.cc
 
 CLEANFILES = $(BUILT_SOURCES)
 
diff --git a/geo/define.h b/geo/define.h
index d2c5f89..b602ab8 100755
--- a/geo/define.h
+++ b/geo/define.h
@@ -24,11 +24,6 @@
 #ifndef define_h
 #define define_h
 
-// Gettext macro
-#define  _(x)  gettext (x)
-#define N_(x)  x
-
-
 // Epsilon
 #define EPSILON (10e-10)
 
diff --git a/geo/drgeo_angle.cc b/geo/drgeo_angle.cc
index f77a578..413d01a 100644
--- a/geo/drgeo_angle.cc
+++ b/geo/drgeo_angle.cc
@@ -30,6 +30,7 @@
 #include "drgeo_repere.h"
 #include "drgeo_drgeoStyle.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 angle::angle (drgeoPoint & p, liste_elem & parents, angleType type, gboolean createdFromMacro, liste_elem * figureList):
 value (p, createdFromMacro, figureList)
diff --git a/geo/drgeo_arcCircle.cc b/geo/drgeo_arcCircle.cc
index efa0b24..85604c5 100644
--- a/geo/drgeo_arcCircle.cc
+++ b/geo/drgeo_arcCircle.cc
@@ -31,7 +31,7 @@
 #include "drgeo_direction.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
-
+#include <glib/gi18n-lib.h>
 
 arcCircle::arcCircle (liste_elem & parents, arcCircleType type, gboolean createdFromMacro, liste_elem * figureList):
 geometricObject (createdFromMacro, figureList)
@@ -520,3 +520,47 @@ arcCircle::getIntersection (geometricObject & c, drgeoPoint & p, gint k)
       }
     }
 }
+
+gboolean
+arcCircle::getBounds (double &left, double &top, double &right, double &bottom)
+{
+	if (style.mask == yes)
+		return false;
+	double x = center.getX (), y = center.getY (), cur, end,
+		xc, yc, step = M_PI / 2.;
+	if (length > 0) {
+		cur = origin;
+		end = origin + length;
+	} else {
+		end = origin;
+		cur = origin + length;
+	}
+	left = right = x + radius * cos (cur);
+	top = bottom = y + radius * sin (cur);
+	cur = ceil (cur / step) * step;
+	while (cur < end) {
+		xc = x + radius * cos (cur);
+		yc = y + radius * sin (cur);
+		if (xc < left)
+			left = xc;
+		if (xc > right)
+			right = xc;
+		if (yc < bottom)
+			bottom = yc;
+		if (yc > top)
+			top = yc;
+		cur += step;
+	}
+	xc = x + radius * cos (end);
+	yc = y + radius * sin (end);
+	if (xc < left)
+		left = xc;
+	if (xc > right)
+		right = xc;
+	if (yc < bottom)
+		bottom = yc;
+	if (yc > top)
+		top = yc;
+	cur += step;
+	return true;
+}
diff --git a/geo/drgeo_arcCircle.h b/geo/drgeo_arcCircle.h
index 22300ec..2a1f623 100644
--- a/geo/drgeo_arcCircle.h
+++ b/geo/drgeo_arcCircle.h
@@ -51,6 +51,8 @@ public:
   drgeoPoint & getClosestPoint (drgeoPoint & p);
   gdouble getAbscissa (drgeoPoint & p);
   gboolean getIntersection (geometricObject & c, drgeoPoint & p, gint k);
+  gboolean getBounds (double &left, double &top, double &right,
+			double &bottom);
 protected:
   drgeoPoint center;
   gdouble radius, origin, length;
diff --git a/geo/drgeo_circle.cc b/geo/drgeo_circle.cc
index ad30e20..91e4c50 100644
--- a/geo/drgeo_circle.cc
+++ b/geo/drgeo_circle.cc
@@ -31,6 +31,7 @@
 #include "drgeo_direction.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 circle::circle (liste_elem & parents, circleType type, gboolean createdFromMacro, liste_elem * figureList):
 geometricObject (createdFromMacro, figureList)
@@ -458,3 +459,16 @@ circle::getIntersection (geometricObject & c, drgeoPoint & p, gint k)
       break;
     }
 }
+
+gboolean
+circle::getBounds (double &left, double &top, double &right, double &bottom)
+{
+	if (style.mask == yes)
+		return false;
+	double x = center.getX (), y = center.getY ();
+	left = x - radius;
+	right = x + radius;
+	bottom = y - radius;
+	top = y + radius;
+	return true;
+}
diff --git a/geo/drgeo_circle.h b/geo/drgeo_circle.h
index 2dd147d..e68e9af 100644
--- a/geo/drgeo_circle.h
+++ b/geo/drgeo_circle.h
@@ -28,30 +28,33 @@
 
 class circle:public geometricObject
 {
-public:
-  circle (liste_elem & parents, circleType type,
-	  gboolean createdFromMacro, liste_elem * figureList);
-  circle (xmlNodePtr tree, GHashTable * itemIdToAdress,
-	  liste_elem * figureList);
-  ~circle ()
-  {
-  };
-  void draw (drgeoDrawable & area, char force);
-  void update (drgeoDrawable & area);
-  gboolean overObject (drgeoPoint & mouse, gdouble range);
-  void move (drgeoVector & t);
-  void initName ();
-  void save (xmlNodePtr tree, liste_elem & figureList);
-  void updateDescription ();
-  drgeoPoint & getCenter ();
-  gdouble getRadius ();
-  drgeoPoint & getPointAt (gdouble abscissa);
-  drgeoPoint & getClosestPoint (drgeoPoint & p);
-  gdouble getAbscissa (drgeoPoint & p);
-  gboolean getIntersection (geometricObject & c, drgeoPoint & p, gint k);
+      public:
+	circle (liste_elem & parents, circleType type,
+		gboolean createdFromMacro, liste_elem * figureList);
+	circle (xmlNodePtr tree, GHashTable * itemIdToAdress,
+		liste_elem * figureList);
+	~circle ()
+	{
+	};
+	void draw (drgeoDrawable & area, char force);
+	void update (drgeoDrawable & area);
+	gboolean overObject (drgeoPoint & mouse, gdouble range);
+	void move (drgeoVector & t);
+	void initName ();
+	void save (xmlNodePtr tree, liste_elem & figureList);
+	void updateDescription ();
+	drgeoPoint & getCenter ();
+	gdouble getRadius ();
+	drgeoPoint & getPointAt (gdouble abscissa);
+	drgeoPoint & getClosestPoint (drgeoPoint & p);
+	gdouble getAbscissa (drgeoPoint & p);
+	gboolean getIntersection (geometricObject & c, drgeoPoint & p,
+				  gint k);
+	gboolean getBounds (double &left, double &top, double &right,
+			    double &bottom);
 protected:
-  drgeoPoint center;
-  gdouble radius;
+	drgeoPoint center;
+	gdouble radius;
 };
 
 #endif /* DRGEO_CIRCLE_H */
diff --git a/geo/drgeo_config.cc b/geo/drgeo_config.cc
index 7f27a4a..eb48c62 100644
--- a/geo/drgeo_config.cc
+++ b/geo/drgeo_config.cc
@@ -22,12 +22,14 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include <libintl.h>
 #include "define.h"
 #include "drgeo_config.h"
 #include "drgeo_gtkhelpers.h"
 #include "drgeo_drgeoStyle.h"
 #include "drgeo_mdi.h"
+#include <glib/gi18n-lib.h>
 
 extern int numericPrecision;
 extern drgeoMDI *mdi;
diff --git a/geo/drgeo_control.cc b/geo/drgeo_control.cc
index bee4571..d605d3f 100644
--- a/geo/drgeo_control.cc
+++ b/geo/drgeo_control.cc
@@ -20,10 +20,11 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-
+#include "config.h"
 #include "drgeo_mdi.h"
 #include "drgeo_control.h"
 #include "drgeo_gtkdrawable.h"
+#include <glib/gi18n-lib.h>
 
 extern drgeoMDI *mdi;
 
diff --git a/geo/drgeo_dialog.cc b/geo/drgeo_dialog.cc
index f80cb52..4182e46 100644
--- a/geo/drgeo_dialog.cc
+++ b/geo/drgeo_dialog.cc
@@ -20,6 +20,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include <gtk/gtk.h>
 #include <string.h>
 #include <libintl.h>
@@ -29,6 +30,7 @@
 #include "drgeo_gtkdrawable.h"
 #include "drgeo_numeric.h"
 #include "drgeo_mdi.h"
+#include <glib/gi18n-lib.h>
 
 extern drgeoMDI *mdi;
 
diff --git a/geo/drgeo_drawable.cc b/geo/drgeo_drawable.cc
index 9c9f30b..68ff604 100644
--- a/geo/drgeo_drawable.cc
+++ b/geo/drgeo_drawable.cc
@@ -310,6 +310,7 @@ drgeoDrawableUI::drgeoDrawableUI ()
 drgeoDrawableUI::~drgeoDrawableUI ()
 {
   printf ("drgeoDrawableUI destructor \n");
+  setTool (NULL);
   delete animationToolDialogLess;
   delete macroPlayToolDialogLess;
   delete macroPlayTool;
diff --git a/geo/drgeo_drawable.h b/geo/drgeo_drawable.h
index f8ef7a6..7846142 100644
--- a/geo/drgeo_drawable.h
+++ b/geo/drgeo_drawable.h
@@ -237,7 +237,6 @@ private:
     class drgeoTool * tool;	// The current tool in use.  This tool
   // is determining the way user actions
   // are handled.
-
 };
 
 #endif
diff --git a/geo/drgeo_equation.cc b/geo/drgeo_equation.cc
index 979b3d5..372810e 100644
--- a/geo/drgeo_equation.cc
+++ b/geo/drgeo_equation.cc
@@ -26,6 +26,7 @@
 #include "drgeo_direction.h"
 #include "drgeo_circle.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 equation::equation (drgeoPoint & p, liste_elem & parents, equationType type, gboolean createdFromMacro, liste_elem * figureList):
 string (createdFromMacro, figureList)
diff --git a/geo/drgeo_figure.cc b/geo/drgeo_figure.cc
index 9fec01c..6291886 100644
--- a/geo/drgeo_figure.cc
+++ b/geo/drgeo_figure.cc
@@ -186,28 +186,30 @@ gboolean drgeoFigure::saveAs (xmlNodePtr drgeoXml, const gchar * name)
   tree = xmlNewChild (drgeoXml, NULL, BAD_CAST "drgeo", NULL);
   xmlSetProp (tree, BAD_CAST "name", BAD_CAST name);
 
-  // Save the scale and coordinate of the origin
-  xml_set_double_prop (tree, "scale", area->getScale ());
-  center = area->getAreaCenter ();
-  xml_set_double_prop (tree, "origin_x", center.getX ());
-  xml_set_double_prop (tree, "origin_y", center.getY ());
   if (showGrid)
     xmlSetProp (tree, BAD_CAST "grid", BAD_CAST "True");
   else
     xmlSetProp (tree, BAD_CAST "grid", BAD_CAST "False");
-
-  /* eventually save the printing area if defined */
-  if (((drgeoGtkDrawable *) area)->printingArea ())
-    {
-      p1 = ((drgeoGtkDrawable *) area)->getPrintingAreaBR ();
-      p2 = ((drgeoGtkDrawable *) area)->getPrintingAreaTL ();
-
-      tree1 = xmlNewChild (tree, NULL, BAD_CAST "boundingBox", NULL);
-      xml_set_double_prop (tree1, "tl_x", p2.getX ());
-      xml_set_double_prop (tree1, "tl_y", p2.getY ());
-      xml_set_double_prop (tree1, "br_x", p1.getX ());
-      xml_set_double_prop (tree1, "br_y", p1.getY ());
-    }
+  if (area) {
+	// Save the scale and coordinate of the origin
+	xml_set_double_prop (tree, "scale", area->getScale ());
+	center = area->getAreaCenter ();
+	xml_set_double_prop (tree, "origin_x", center.getX ());
+	xml_set_double_prop (tree, "origin_y", center.getY ());
+	
+	/* eventually save the printing area if defined */
+	if (((drgeoGtkDrawable *) area)->printingArea ())
+	{
+	  p1 = ((drgeoGtkDrawable *) area)->getPrintingAreaBR ();
+	  p2 = ((drgeoGtkDrawable *) area)->getPrintingAreaTL ();
+	
+	  tree1 = xmlNewChild (tree, NULL, BAD_CAST "boundingBox", NULL);
+	  xml_set_double_prop (tree1, "tl_x", p2.getX ());
+	  xml_set_double_prop (tree1, "tl_y", p2.getY ());
+	  xml_set_double_prop (tree1, "br_x", p1.getX ());
+	  xml_set_double_prop (tree1, "br_y", p1.getY ());
+	}
+  }
 
   /* eventually save the customized ui */
   if (getPassword ())
@@ -1517,6 +1519,7 @@ gboolean drgeoFigure::getBounds (double &left, double &top,
 	liste_elem *fig;
 	geometricObject *item;
 	double itleft, ittop, itright, itbottom;
+	updateItems ();
 	fig = getFigureList ();
 	fig->init_lire ();
 	while ((item = (geometricObject *) fig->lire (0)) != NULL)
diff --git a/geo/drgeo_halfLine.cc b/geo/drgeo_halfLine.cc
index 5933f3e..1946b15 100644
--- a/geo/drgeo_halfLine.cc
+++ b/geo/drgeo_halfLine.cc
@@ -28,6 +28,7 @@
 #include "drgeo_point.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 halfLine::halfLine (liste_elem & parents, halfLineType type, gboolean createdFromMacro, liste_elem * figureList):
 direction (parents, (transformationType) type, createdFromMacro, figureList)
@@ -332,3 +333,31 @@ halfLine::getIntersection (geometricObject & c, drgeoPoint & p, gint k)
       break;
     }
 }
+
+gboolean
+halfLine::getBounds (double &left, double &top, double &right, double &bottom)
+{
+	if (style.mask == yes)
+		return false;
+	double x0 = origin.getX (), y0 = origin.getY (),
+		x1 = u.getX (), y1 = u.getY (), a = atan2 (y1, x1); 
+	left = x0;
+	bottom = y0;
+	right = x0 + 2. * cos (a);
+	top = y0 + 2. * sin (a);
+	if (type == HALFLINE_2PTS) {
+		right += x1;
+		top += y1;
+	}
+	if (left > right) {
+		a = left;
+		left = right;
+		right = a;
+	}
+	if (bottom > top) {
+		a = bottom;
+		bottom = top;
+		top = a;
+	}
+	return true;
+}
diff --git a/geo/drgeo_halfLine.h b/geo/drgeo_halfLine.h
index 61f507e..f5669b8 100644
--- a/geo/drgeo_halfLine.h
+++ b/geo/drgeo_halfLine.h
@@ -47,6 +47,8 @@ public:
   drgeoPoint & getClosestPoint (drgeoPoint & p);
   gdouble getAbscissa (drgeoPoint & p);
   gboolean getIntersection (geometricObject & c, drgeoPoint & p, gint k);
+  gboolean getBounds (double &left, double &top,
+				  double &right, double &bottom);
 protected:
 };
 
diff --git a/geo/drgeo_line.cc b/geo/drgeo_line.cc
index be34450..b0beef2 100644
--- a/geo/drgeo_line.cc
+++ b/geo/drgeo_line.cc
@@ -28,6 +28,7 @@
 #include "drgeo_point.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 line::line (liste_elem & parents, lineType type, gboolean createdFromMacro, liste_elem * figureList):
 direction (parents, (transformationType) type, createdFromMacro, figureList)
@@ -407,3 +408,31 @@ line::getIntersection (geometricObject & c, drgeoPoint & p, gint k)
     }
 }
 
+gboolean line::getBounds (double &left, double &top,
+				  double &right, double &bottom)
+{
+	if (style.mask == yes)
+		return false;
+	double x0 = origin.getX (), y0 = origin.getY (),
+		x1 = u.getX (), y1 = u.getY (), a = atan2 (y1, x1); 
+	// add 2 units around each points or just origin
+	left = x0 - 2. * cos (a);
+	bottom = y0 - 2. * sin (a);
+	right = x0 + 2. * cos (a);
+	top = y0 + 2. * sin (a);
+	if (type == LINE_2PTS) {
+		right += x1;
+		top += y1;
+	}
+	if (left > right) {
+		a = left;
+		left = right;
+		right = a;
+	}
+	if (bottom > top) {
+		a = bottom;
+		bottom = top;
+		top = a;
+	}
+	return true;
+}
diff --git a/geo/drgeo_line.h b/geo/drgeo_line.h
index f0898df..de7d8a8 100644
--- a/geo/drgeo_line.h
+++ b/geo/drgeo_line.h
@@ -47,6 +47,8 @@ public:
   drgeoPoint & getClosestPoint (drgeoPoint & p);
   gdouble getAbscissa (drgeoPoint & p);
   gboolean getIntersection (geometricObject & c, drgeoPoint & p, gint k);
+  gboolean getBounds (double &left, double &top,
+				  double &right, double &bottom);
 protected:
 };
 
diff --git a/geo/drgeo_locus.cc b/geo/drgeo_locus.cc
index 6e3ed40..5b6baa3 100644
--- a/geo/drgeo_locus.cc
+++ b/geo/drgeo_locus.cc
@@ -27,7 +27,7 @@
 #include "drgeo_drawable.h"
 #include "drgeo_gtkdrawable.h"
 #include "traite.h"		/* FIXME : move the method updateItems as a static method in drgeo_locus.* */
-
+#include <glib/gi18n-lib.h>
 
 enum locusState
 {
diff --git a/geo/drgeo_mdi.cc b/geo/drgeo_mdi.cc
index a984f51..efe6004 100644
--- a/geo/drgeo_mdi.cc
+++ b/geo/drgeo_mdi.cc
@@ -20,7 +20,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <config.h>
+#include "config.h"
 #include "drgeo_mdi.h"
 
 drgeoMDI::drgeoMDI ()
diff --git a/geo/drgeo_menu.cc b/geo/drgeo_menu.cc
index 5ddc812..8bedec6 100644
--- a/geo/drgeo_menu.cc
+++ b/geo/drgeo_menu.cc
@@ -36,7 +36,7 @@ drgeoMenu::drgeoMenu (geoView *view):
   GtkWidget *w;
 
   // Build the pop up menu 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeoMDI.glade","geoMenu", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeoMDI.glade","geoMenu", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   
   // take a reference of each menu item so we can :
diff --git a/geo/drgeo_numeric.cc b/geo/drgeo_numeric.cc
index 22c31c4..06d2f35 100644
--- a/geo/drgeo_numeric.cc
+++ b/geo/drgeo_numeric.cc
@@ -32,6 +32,7 @@
 #include "drgeo_repere.h"
 #include "drgeo_drgeoStyle.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 int numericPrecision;
 
diff --git a/geo/drgeo_point.cc b/geo/drgeo_point.cc
index 20b3956..f693fcf 100644
--- a/geo/drgeo_point.cc
+++ b/geo/drgeo_point.cc
@@ -22,6 +22,7 @@
  */
 
 #include "config.h"
+#include <glib/gi18n-lib.h>
 #include "drgeo_point.h"
 #include "drgeo_direction.h"
 #include "drgeo_value.h"
@@ -561,6 +562,8 @@ point::preferedShape (gchar *attr)
 gboolean 
 point::getBounds (double &left, double &top, double &right, double &bottom)
 {
+	if (style.mask == yes)
+		return false;
 	left = right = p.getX();
 	top = bottom = p.getY();
 	return true;
diff --git a/geo/drgeo_point.h b/geo/drgeo_point.h
index 6626196..fdbe250 100644
--- a/geo/drgeo_point.h
+++ b/geo/drgeo_point.h
@@ -53,7 +53,7 @@ public:
   gdouble getAbscissa ();
   void * getExtra ();
   drgeoPointType preferedShape (gchar *attr);
-  virtual gboolean getBounds (double &left, double &top,
+  gboolean getBounds (double &left, double &top,
 				  double &right, double &bottom);
 protected:
   drgeoPoint p;
diff --git a/geo/drgeo_polygon.cc b/geo/drgeo_polygon.cc
index e7c8417..d5c83d0 100644
--- a/geo/drgeo_polygon.cc
+++ b/geo/drgeo_polygon.cc
@@ -29,6 +29,7 @@
 #include "drgeo_repere.h"
 #include "drgeo_drgeoStyle.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 polygon::polygon (liste_elem & parents, polygonType type, gboolean createdFromMacro, liste_elem * figureList):
 geometricObject (createdFromMacro, figureList)
diff --git a/geo/drgeo_repere.cc b/geo/drgeo_repere.cc
index 8024746..6104a2f 100644
--- a/geo/drgeo_repere.cc
+++ b/geo/drgeo_repere.cc
@@ -27,6 +27,7 @@
 #include "drgeo_direction.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 repere::repere (liste_elem & parents, repereType type, gboolean createdFromMacro, liste_elem * figureList):
 geometricObject (createdFromMacro, figureList)
diff --git a/geo/drgeo_scm_helper.cc b/geo/drgeo_scm_helper.cc
index d561cac..d8bff1b 100644
--- a/geo/drgeo_scm_helper.cc
+++ b/geo/drgeo_scm_helper.cc
@@ -21,11 +21,13 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include <errno.h>
 #include <libintl.h>
 #include "define.h"
 #include "drgeo_scm_helper.h"
 #include "drgeo_mdi.h"
+#include <glib/gi18n-lib.h>
 
 extern drgeoMDI *mdi;
 
diff --git a/geo/drgeo_script.cc b/geo/drgeo_script.cc
index 3876b08..30e7fdc 100644
--- a/geo/drgeo_script.cc
+++ b/geo/drgeo_script.cc
@@ -21,11 +21,12 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <guile/gh.h>
 #include "config.h"
+#include <guile/gh.h>
 #include "drgeo_script.h"
 #include "drgeo_drawable.h"
 #include "drgeo_scm_helper.h"
+#include <glib/gi18n-lib.h>
 
 extern int numericPrecision;
 
@@ -266,4 +267,3 @@ script::getExtra ()
 {
   return (void *) g_strdup (scriptCode);
 }
-
diff --git a/geo/drgeo_segment.cc b/geo/drgeo_segment.cc
index 36d89a4..35b0fcd 100644
--- a/geo/drgeo_segment.cc
+++ b/geo/drgeo_segment.cc
@@ -28,6 +28,7 @@
 #include "drgeo_point.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 segment::segment (liste_elem & parents, segmentType type, gboolean createdFromMacro, liste_elem * figureList):
 direction (parents, (transformationType) type, createdFromMacro, figureList)
diff --git a/geo/drgeo_tool.cc b/geo/drgeo_tool.cc
index 6a13f8a..d7b3a86 100644
--- a/geo/drgeo_tool.cc
+++ b/geo/drgeo_tool.cc
@@ -22,10 +22,12 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include <string.h>
 
 #include "drgeo_tool.h"
 #include "drgeo_point.h"
+#include <glib/gi18n-lib.h>
 
 drgeoState 
 drgeoTool::getDrgeoState ()
diff --git a/geo/drgeo_toolbar.cc b/geo/drgeo_toolbar.cc
index 5629bab..01ef878 100644
--- a/geo/drgeo_toolbar.cc
+++ b/geo/drgeo_toolbar.cc
@@ -36,7 +36,7 @@ drgeoToolbar::drgeoToolbar (geoView *view):
   // . attach a referecence of this class instance
 
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","menuBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","menuBar", GETTEXT_PACKAGE);
   setTopControlerWidget (xml);
 
   fetchWidgetParent (xml,&p_toolbar, "menuBar",
@@ -49,7 +49,7 @@ drgeoToolbar::drgeoToolbar (geoView *view):
   
 
   /* short cut bar */
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","shortcutBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","shortcutBar", GETTEXT_PACKAGE);
   setShortcutControlerWidget (xml);
   fetchWidgetParent (xml,&p_shortcutBar, "shortcutBar",
 		     (gpointer) this);
@@ -57,7 +57,7 @@ drgeoToolbar::drgeoToolbar (geoView *view):
   g_object_unref (G_OBJECT (xml));
 
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","pointBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","pointBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setPointControlerWidget (xml);
   fetchWidgetParent (xml,&p_pointBar, "pointBar", 
@@ -66,14 +66,14 @@ drgeoToolbar::drgeoToolbar (geoView *view):
   gtk_toolbar_set_tooltips (GTK_TOOLBAR (w), true);
   g_object_unref (G_OBJECT (xml));
   
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","curveBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","curveBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setCurveControlerWidget (xml);
   fetchWidgetParent (xml,&p_curveBar, "curveBar",
 		     (gpointer) this);
   g_object_unref (G_OBJECT (xml));
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","transformationBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","transformationBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setTransformationControlerWidget (xml);
   fetchWidgetParent (xml,&p_transformationBar, 
@@ -81,21 +81,21 @@ drgeoToolbar::drgeoToolbar (geoView *view):
 		     (gpointer) this);
   g_object_unref (G_OBJECT (xml));
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","numericBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","numericBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setNumericControlerWidget (xml);
   fetchWidgetParent (xml,&p_numericBar, "numericBar",
 		     (gpointer) this);
   g_object_unref (G_OBJECT (xml));
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","macroBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","macroBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setMacroControlerWidget (xml);
   fetchWidgetParent (xml,&p_macroBar, "macroBar",
 		     (gpointer) this);
   g_object_unref (G_OBJECT (xml));
 
-  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","otherBar", NULL);
+  xml = glade_xml_new (DRGEO_GLADEDIR"/drgeo2.glade","otherBar", GETTEXT_PACKAGE);
   glade_xml_signal_autoconnect (xml);
   setOtherControlerWidget (xml);
   fetchWidgetParent (xml,&p_otherBar, "otherBar",
@@ -337,6 +337,3 @@ on_zoom_valeur_changed (GtkEditable * w, gpointer data)
   else if (zoom == 25.)
     control->view ()->setZoomFactorMenu (z25);
 }
-
-
-
diff --git a/geo/drgeo_value.cc b/geo/drgeo_value.cc
index 6830cb0..99d708a 100644
--- a/geo/drgeo_value.cc
+++ b/geo/drgeo_value.cc
@@ -24,6 +24,7 @@
 #include "config.h"
 #include "drgeo_value.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 value::value (drgeoPoint & p, gboolean createdFromMacro, liste_elem * figureList):
 string (p, createdFromMacro, figureList)
diff --git a/geo/drgeo_vector.cc b/geo/drgeo_vector.cc
index 3f33542..7d2a8e5 100644
--- a/geo/drgeo_vector.cc
+++ b/geo/drgeo_vector.cc
@@ -21,14 +21,14 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <math.h>
-
 #include "config.h"
+#include <math.h>
 #include "drgeo_vector.h"
 #include "drgeo_repere.h"
 #include "drgeo_point.h"
 #include "liste_elem.h"
 #include "drgeo_drawable.h"
+#include <glib/gi18n-lib.h>
 
 vector::vector (liste_elem & parents, vectorType type, gboolean createdFromMacro, liste_elem * figureList):
 direction (parents, (transformationType) type, createdFromMacro, figureList)
diff --git a/geo/geo_view.cc b/geo/geo_view.cc
index 162d72e..52def00 100644
--- a/geo/geo_view.cc
+++ b/geo/geo_view.cc
@@ -20,12 +20,14 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include "config.h"
 #include "geo_view.h"
 #include "drgeo_figure.h"
 #include "drgeo_menu.h"
 #include "drgeo_toolbar.h"
 #include "drgeo_gtkdrawable.h"
 #include "drgeo_config.h"
+#include <glib/gi18n-lib.h>
 
 extern gchar *toolName[];
 
diff --git a/glade/Makefile.am b/glade/Makefile.am
index 5e3ba00..e0f72f1 100644
--- a/glade/Makefile.am
+++ b/glade/Makefile.am
@@ -113,7 +113,7 @@ icons_DATA = \
 glade_DATA = \
 	drgeo2.glade			\
 	drgenius2.glade			\
-	drgeoMDI.glade
+	drgeoMDI.glade			\
+	areabounds.glade
 
 EXTRA_DIST = $(icons_DATA) $(glade_DATA)
-
diff --git a/glade/areabounds.glade b/glade/areabounds.glade
new file mode 100644
index 0000000..922a84c
--- /dev/null
+++ b/glade/areabounds.glade
@@ -0,0 +1,495 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd";>
+
+<glade-interface>
+
+<widget class="GtkDialog" id="area-bounds">
+  <property name="visible">True</property>
+  <property name="title" translatable="yes">Dr Geo component</property>
+  <property name="type">GTK_WINDOW_TOPLEVEL</property>
+  <property name="window_position">GTK_WIN_POS_NONE</property>
+  <property name="modal">False</property>
+  <property name="resizable">False</property>
+  <property name="destroy_with_parent">False</property>
+  <property name="icon">drgeo.png</property>
+  <property name="decorated">True</property>
+  <property name="skip_taskbar_hint">False</property>
+  <property name="skip_pager_hint">False</property>
+  <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+  <property name="focus_on_map">True</property>
+  <property name="urgency_hint">False</property>
+  <property name="has_separator">True</property>
+
+  <child internal-child="vbox">
+    <widget class="GtkVBox" id="dialog-vbox1">
+      <property name="visible">True</property>
+      <property name="homogeneous">False</property>
+      <property name="spacing">0</property>
+
+      <child internal-child="action_area">
+	<widget class="GtkHButtonBox" id="dialog-action_area1">
+	  <property name="visible">True</property>
+	  <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+	  <child>
+	    <widget class="GtkButton" id="cancel">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-6</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkButton" id="OK">
+	      <property name="visible">True</property>
+	      <property name="can_default">True</property>
+	      <property name="has_default">True</property>
+	      <property name="can_focus">True</property>
+	      <property name="has_focus">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
+	      <property name="relief">GTK_RELIEF_NORMAL</property>
+	      <property name="focus_on_click">True</property>
+	      <property name="response_id">-5</property>
+	    </widget>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="pack_type">GTK_PACK_END</property>
+	</packing>
+      </child>
+
+      <child>
+	<widget class="GtkVBox" id="vbox1">
+	  <property name="visible">True</property>
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+
+	  <child>
+	    <widget class="GtkHBox" id="hbox4">
+	      <property name="visible">True</property>
+	      <property name="homogeneous">False</property>
+	      <property name="spacing">0</property>
+
+	      <child>
+		<widget class="GtkLabel" id="label1">
+		  <property name="visible">True</property>
+		  <property name="label" translatable="yes">&lt;b&gt;Displayed area bounds&lt;/b&gt;</property>
+		  <property name="use_underline">False</property>
+		  <property name="use_markup">True</property>
+		  <property name="justify">GTK_JUSTIFY_LEFT</property>
+		  <property name="wrap">False</property>
+		  <property name="selectable">False</property>
+		  <property name="xalign">0.5</property>
+		  <property name="yalign">0.5</property>
+		  <property name="xpad">0</property>
+		  <property name="ypad">0</property>
+		  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		  <property name="width_chars">-1</property>
+		  <property name="single_line_mode">False</property>
+		  <property name="angle">0</property>
+		</widget>
+		<packing>
+		  <property name="padding">0</property>
+		  <property name="expand">False</property>
+		  <property name="fill">False</property>
+		</packing>
+	      </child>
+
+	      <child>
+		<placeholder/>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">False</property>
+	      <property name="fill">False</property>
+	    </packing>
+	  </child>
+
+	  <child>
+	    <widget class="GtkAlignment" id="alignment1">
+	      <property name="visible">True</property>
+	      <property name="xalign">0.5</property>
+	      <property name="yalign">0.5</property>
+	      <property name="xscale">1</property>
+	      <property name="yscale">1</property>
+	      <property name="top_padding">5</property>
+	      <property name="bottom_padding">5</property>
+	      <property name="left_padding">10</property>
+	      <property name="right_padding">10</property>
+
+	      <child>
+		<widget class="GtkTable" id="table1">
+		  <property name="visible">True</property>
+		  <property name="n_rows">4</property>
+		  <property name="n_columns">5</property>
+		  <property name="homogeneous">False</property>
+		  <property name="row_spacing">4</property>
+		  <property name="column_spacing">0</property>
+
+		  <child>
+		    <widget class="GtkLabel" id="label7">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Y&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label6">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;X&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">0</property>
+		      <property name="right_attach">1</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label4">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Automatic</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label5">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">Automatic</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">False</property>
+		      <property name="justify">GTK_JUSTIFY_LEFT</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">3</property>
+		      <property name="right_attach">4</property>
+		      <property name="top_attach">1</property>
+		      <property name="bottom_attach">2</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label2">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Minimum&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_CENTER</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">3</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkLabel" id="label3">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes">&lt;b&gt;Maximum&lt;/b&gt;</property>
+		      <property name="use_underline">False</property>
+		      <property name="use_markup">True</property>
+		      <property name="justify">GTK_JUSTIFY_CENTER</property>
+		      <property name="wrap">False</property>
+		      <property name="selectable">False</property>
+		      <property name="xalign">0.5</property>
+		      <property name="yalign">0.5</property>
+		      <property name="xpad">0</property>
+		      <property name="ypad">0</property>
+		      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+		      <property name="width_chars">-1</property>
+		      <property name="single_line_mode">False</property>
+		      <property name="angle">0</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">3</property>
+		      <property name="right_attach">5</property>
+		      <property name="top_attach">0</property>
+		      <property name="bottom_attach">1</property>
+		      <property name="x_options">fill</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSpinButton" id="xmin">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="climb_rate">1</property>
+		      <property name="digits">2</property>
+		      <property name="numeric">True</property>
+		      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		      <property name="snap_to_ticks">False</property>
+		      <property name="wrap">False</property>
+		      <property name="adjustment">0 -100 100 1 10 10</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">2</property>
+		      <property name="right_attach">3</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSpinButton" id="xmax">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="climb_rate">1</property>
+		      <property name="digits">2</property>
+		      <property name="numeric">True</property>
+		      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		      <property name="snap_to_ticks">False</property>
+		      <property name="wrap">False</property>
+		      <property name="adjustment">0 -100 100 1 10 10</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">4</property>
+		      <property name="right_attach">5</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSpinButton" id="ymin">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="climb_rate">1</property>
+		      <property name="digits">2</property>
+		      <property name="numeric">True</property>
+		      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		      <property name="snap_to_ticks">False</property>
+		      <property name="wrap">False</property>
+		      <property name="adjustment">0 -100 100 1 10 10</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">2</property>
+		      <property name="right_attach">3</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkSpinButton" id="ymax">
+		      <property name="visible">True</property>
+		      <property name="can_focus">True</property>
+		      <property name="climb_rate">1</property>
+		      <property name="digits">2</property>
+		      <property name="numeric">True</property>
+		      <property name="update_policy">GTK_UPDATE_ALWAYS</property>
+		      <property name="snap_to_ticks">False</property>
+		      <property name="wrap">False</property>
+		      <property name="adjustment">0 -100 100 1 10 10</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">4</property>
+		      <property name="right_attach">5</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto-xmax">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">False</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">3</property>
+		      <property name="right_attach">4</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="x_options"></property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto-ymax">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">False</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">3</property>
+		      <property name="right_attach">4</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="x_options"></property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto-ymin">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">False</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">3</property>
+		      <property name="bottom_attach">4</property>
+		      <property name="x_options"></property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+
+		  <child>
+		    <widget class="GtkCheckButton" id="auto-xmin">
+		      <property name="visible">True</property>
+		      <property name="label" translatable="yes"></property>
+		      <property name="use_underline">True</property>
+		      <property name="relief">GTK_RELIEF_NORMAL</property>
+		      <property name="focus_on_click">False</property>
+		      <property name="active">False</property>
+		      <property name="inconsistent">False</property>
+		      <property name="draw_indicator">True</property>
+		    </widget>
+		    <packing>
+		      <property name="left_attach">1</property>
+		      <property name="right_attach">2</property>
+		      <property name="top_attach">2</property>
+		      <property name="bottom_attach">3</property>
+		      <property name="x_options"></property>
+		      <property name="y_options"></property>
+		    </packing>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	    <packing>
+	      <property name="padding">0</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	    </packing>
+	  </child>
+	</widget>
+	<packing>
+	  <property name="padding">0</property>
+	  <property name="expand">True</property>
+	  <property name="fill">True</property>
+	</packing>
+      </child>
+    </widget>
+  </child>
+</widget>
+
+</glade-interface>
diff --git a/goffice/Makefile.am b/goffice/Makefile.am
index 811f7f2..d1e1334 100644
--- a/goffice/Makefile.am
+++ b/goffice/Makefile.am
@@ -1,3 +1,8 @@
+helpdir = $(datadir)/drgeo/help
+gladedir = $(datadir)/drgeo/glade
+scmdir = $(datadir)/drgeo/scm
+appicondir = $(datadir)/pixmaps
+
 if WITH_GOFFICE
 
 goffice_drgeo_LTLIBRARIES = drgeo.la
@@ -5,7 +10,11 @@ goffice_drgeodir = $(GOFFICE_PLUGINS_DIR)/drgeo
 drgeo_la_LDFLAGS = -module -avoid-version -no-undefined
 drgeo_la_LIBADD = \
 	$(top_builddir)/geo/libgeo.la \
-	@GODRGEO_LIBS@
+	$(GODRGEO_LIBS)	\
+	$(INTLLIBS) \
+	$(DRGEO_LIBS) \
+	$(GUILE_LDFLAGS) \
+	-lcrypt 		
 xml_DATA = $(xml_in_files:.xml.in=.xml)
 
 else
@@ -16,16 +25,34 @@ xml_DATA =
 
 endif
 
-AM_CPPFLAGS = -I$(top_srcdir) -DGNOMELOCALEDIR=\"$(datadir)/locale\" @GODRGEO_CFLAGS@
+INCLUDES = \
+	-DGNOMELOCALEDIR=\""$(datadir)/locale"\" 	\
+	-DDRGEO_GLADEDIR=\""$(gladedir)"\"		\
+	-DDRGEO_SCMDIR=\""$(scmdir)"\"			\
+	-DDRGEO_HELPDIR=\""$(helpdir)"\"		\
+	-DDRGEO_ICONDIR=\""$(appicondir)"\"		\
+	-I$(includedir) 				\
+	-I$(top_srcdir)					\
+	-I$(srcdir)/geo 				\
+	$(GODRGEO_CFLAGS) 				\
+	$(DRGEO_CFLAGS) 				\
+	$(GUILE_CFLAGS)
 
 drgeo_la_SOURCES =	\
 		drgeo.cc	\
+		drgeo-impl.h	\
 		goffice_mdi.cc	\
 		goffice_mdi.h	\
 		drgeo_cairodrawable.cc	\
 		drgeo_cairodrawable.h	\
 		drgeo_gpdrawable.cc	\
-		drgeo_gpdrawable.h
+		drgeo_gpdrawable.h	\
+		goffice_window.cc	\
+		goffice_window.h	\
+		drgeo_dummydrawable.cc	\
+		drgeo_dummydrawable.h	\
+		drgeo_areabounds.cc	\
+		drgeo_areabounds.h
 
 xml_in_files = plugin.xml.in
 xmldir	 = $(goffice_drgeodir)
diff --git a/goffice/drgeo.cc b/goffice/drgeo.cc
index 4cc95ab..cc2db6d 100644
--- a/goffice/drgeo.cc
+++ b/goffice/drgeo.cc
@@ -2,9 +2,7 @@
  * DrGeo GOffice component
  * drgeo.cc
  *
- * Copyright (C) 2006
- *
- * Developed by Jean Bréfort <jean brefort normalesup org>
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
  * This program is free software; you can redistribute it and/or 
  * modify it under the terms of the GNU General Public License as 
@@ -22,21 +20,16 @@
  * USA
  */
  
-#include <config.h>
+#include "config.h"
 #include <drgenius_help.h>
-#include <geo/drgeo_figure.h>
 #include "goffice_mdi.h"
+#include "goffice_window.h"
 #include "drgeo_cairodrawable.h"
 #include "drgeo_gpdrawable.h"
+#include "drgeo_dummydrawable.h"
 
 #include <libxml/tree.h>
-#ifdef _
-#	undef _
-#	undef N_
-#endif
 #include <glib/gi18n-lib.h>
-#include <goffice/component/goffice-component.h>
-#include <goffice/component/go-component.h>
 #include <gsf/gsf-impl-utils.h>
 #include <goffice/app/module-plugin-defs.h>
 #include <locale.h>
@@ -45,19 +38,24 @@ extern "C" {
 
 gofficeMDI *mdi;	
 
+enum {
+	GO_DRGEO_PROP_0,
+	GO_DRGEO_PROP_XMIN,
+	GO_DRGEO_PROP_XMAX,
+	GO_DRGEO_PROP_YMIN,
+	GO_DRGEO_PROP_YMAX,
+	GO_DRGEO_PROP_AUTO_XMIN,
+	GO_DRGEO_PROP_AUTO_XMAX,
+	GO_DRGEO_PROP_AUTO_YMIN,
+	GO_DRGEO_PROP_AUTO_YMAX,
+};
+
 extern GOPluginModuleDepend const go_plugin_depends [] = {
     { "goffice", GOFFICE_API_VERSION }
 };
 extern GOPluginModuleHeader const go_plugin_header =
 	{ GOFFICE_MODULE_PLUGIN_MAGIC_NUMBER, G_N_ELEMENTS (go_plugin_depends) };
 
-typedef struct
-{
-	GOComponent parent;
-	drgeoFigure *figure;
-	double xoffset, yoffset, width, height;
-} GODrGeoComponent;
-
 typedef GOComponentClass GODrGeoComponentClass;
 
 #define GO_DRGEO_COMPONENT_TYPE	(go_drgeo_component_get_type ())
@@ -73,8 +71,48 @@ go_drgeo_component_get_data (GOComponent *component, gpointer *data, int *length
 									void (**clearfunc) (gpointer))
 {
 	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (component);
-	bool result = true;
-	return result;
+	xmlDocPtr xml = NULL;
+	char *old_num_locale;
+
+	if (!godrgeo->figure || godrgeo->figure->getFigureList ()->nb_elem == 0) {
+		*data = NULL;
+		*length = 0;
+		*clearfunc = NULL;
+		return true;
+	}
+	
+	old_num_locale = g_strdup (setlocale (LC_NUMERIC, NULL));
+	setlocale(LC_NUMERIC, "C");
+
+	xml = xmlNewDoc((xmlChar*)"1.0");
+	xml->children =  xmlNewDocNode (xml, NULL, (xmlChar*) "drgenius", NULL);
+	godrgeo->figure->saveAs (xml->children, "embedded");
+	xmlChar *mem;
+	int size;
+	xmlDocDumpMemory (xml, &mem, &size);
+	xmlFreeDoc (xml);
+	*data = mem;
+	*length = size;
+	*clearfunc = xmlFree;
+	setlocale (LC_NUMERIC, old_num_locale);
+	g_free (old_num_locale);
+
+	return true;
+}
+
+static void
+go_drgeo_component_update_bounds (GODrGeoComponent *godrgeo)
+{
+	GOComponent *component = GO_COMPONENT (godrgeo);
+	godrgeo->xoffset = (godrgeo->auto_xmin)? godrgeo->left: godrgeo->xmin;
+	godrgeo->width = ((godrgeo->auto_xmax)? godrgeo->right: godrgeo->xmax)
+				- godrgeo->xoffset;
+	godrgeo->yoffset = (godrgeo->auto_ymax)? godrgeo->top: godrgeo->ymax;
+	godrgeo->height = godrgeo->yoffset
+				-((godrgeo->auto_ymin)? godrgeo->bottom: godrgeo->ymin);
+	component->ascent = godrgeo->height / 2.54;
+	component->descent = 0.;
+	component->width = godrgeo->width / 2.54;
 }
 
 static void
@@ -96,31 +134,34 @@ go_drgeo_component_set_data (GOComponent *component, char const *data, int lengt
 	setlocale (LC_NUMERIC, old_num_locale);
 	g_free (old_num_locale);
 	xmlFreeDoc (xml);
-	double left, top, right, bottom;
-	godrgeo->figure->getBounds (left, top, right, bottom);
-	godrgeo->xoffset = left - 0.2;
-	godrgeo->yoffset = top + 0.2;
-	godrgeo->height = top - bottom + 0.4;
-	godrgeo->width = right - left + 0.4;
-	component->ascent = godrgeo->height / 2.54;
-	component->descent = 0.;
-	component->width = godrgeo->width / 2.54;
+	drgeoDummyDrawable d;
+	godrgeo->figure->setDrawable (&d);
+	godrgeo->figure->getBounds (godrgeo->left, godrgeo->top,
+								godrgeo->right, godrgeo->bottom);
+	godrgeo->figure->setDrawable (NULL);
+	godrgeo->left -= 0.2;
+	godrgeo->right += 0.2;
+	godrgeo->bottom -= 0.2;
+	godrgeo->top += 0.2;
+	go_drgeo_component_update_bounds (godrgeo);
 }
 
 static void
 go_drgeo_component_draw (GOComponent *component, int width_pixels, int height_pixels)
 {
 	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (component);
-	gdk_pixbuf_fill (component->pixbuf, 0);
+	gdk_pixbuf_fill (component->pixbuf, 0xffffff00);
 	cairo_surface_t* surface = cairo_image_surface_create_for_data (
               				gdk_pixbuf_get_pixels (component->pixbuf),
 							CAIRO_FORMAT_ARGB32,
 							width_pixels, height_pixels, 
                				gdk_pixbuf_get_rowstride (component->pixbuf));
 	drgeoCairoDrawable *drawable = new drgeoCairoDrawable (godrgeo->figure, surface);
-	drawable->scale = width_pixels / godrgeo->width;
-	drawable->setOffset (godrgeo->xoffset, godrgeo->yoffset);
+	drawable->setMetrics (width_pixels / godrgeo->width,
+							godrgeo->xoffset, godrgeo->yoffset,
+							godrgeo->width, godrgeo->height);
 	godrgeo->figure->redraw (0);
+	godrgeo->figure->setDrawable (NULL);
 	delete drawable;
 }
 
@@ -130,17 +171,114 @@ go_drgeo_component_print (GOComponent *component, GnomePrintContext *gpc,
 {
 	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (component);
 	drgeoGPDrawable *drawable = new drgeoGPDrawable (godrgeo->figure, gpc);
-	drawable->scale = width / godrgeo->width;
-	drawable->setOffset (godrgeo->xoffset, godrgeo->yoffset - godrgeo->height);
+	drawable->setMetrics (width / godrgeo->width, godrgeo->xoffset,
+						godrgeo->yoffset - godrgeo->height,
+						godrgeo->width, godrgeo->height);
 	godrgeo->figure->redraw (0);
+	godrgeo->figure->setDrawable (NULL);
 	delete drawable;
 }
 
+static gboolean
+go_drgeo_component_edit (GOComponent *component)
+{
+	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (component);
+	if (!godrgeo->figure) {
+		component->ascent = 0.;
+		component->descent = 0.;
+		component->width = 0.;
+	}
+	mdi->EditComponent (godrgeo);
+	return true;
+}
+
+static void
+go_drgeo_component_get_property (GObject *obj, guint param_id,
+		       GValue *value, GParamSpec *pspec)
+{
+	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (obj);
+	switch (param_id) {
+	case GO_DRGEO_PROP_XMIN:
+		g_value_set_double (value, godrgeo->xmin);
+		break;
+	case GO_DRGEO_PROP_XMAX:
+		g_value_set_double (value, godrgeo->xmax);
+		break;
+	case GO_DRGEO_PROP_YMIN:
+		g_value_set_double (value, godrgeo->ymin);
+		break;
+	case GO_DRGEO_PROP_YMAX:
+		g_value_set_double (value, godrgeo->ymax);
+		break;
+	case GO_DRGEO_PROP_AUTO_XMIN:
+		g_value_set_boolean (value, godrgeo->auto_xmin);
+		break;
+	case GO_DRGEO_PROP_AUTO_XMAX:
+		g_value_set_boolean (value, godrgeo->auto_xmax);
+		break;
+	case GO_DRGEO_PROP_AUTO_YMIN:
+		g_value_set_boolean (value, godrgeo->auto_ymin);
+		break;
+	case GO_DRGEO_PROP_AUTO_YMAX:
+		g_value_set_boolean (value, godrgeo->auto_ymax);
+		break;
+
+	default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
+		 break;
+	}
+}
+
+static void
+go_drgeo_component_set_property (GObject *obj, guint param_id,
+		       GValue const *value, GParamSpec *pspec)
+{
+	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (obj);
+	switch (param_id) {
+	case GO_DRGEO_PROP_XMIN:
+		godrgeo->xmin = g_value_get_double (value);
+		godrgeo->auto_xmin = false;
+		break;
+	case GO_DRGEO_PROP_XMAX:
+		godrgeo->xmax = g_value_get_double (value);
+		godrgeo->auto_xmax = false;
+		break;
+	case GO_DRGEO_PROP_YMIN:
+		godrgeo->ymin = g_value_get_double (value);
+		godrgeo->auto_ymin = false;
+		break;
+	case GO_DRGEO_PROP_YMAX:
+		godrgeo->ymax = g_value_get_double (value);
+		godrgeo->auto_ymax = false;
+		break;
+	case GO_DRGEO_PROP_AUTO_XMIN:
+		if ((godrgeo->auto_xmin = g_value_get_boolean (value)))
+			godrgeo->xmin = 0.;
+		break;
+	case GO_DRGEO_PROP_AUTO_XMAX:
+		if ((godrgeo->auto_xmax = g_value_get_boolean (value)))
+			godrgeo->xmax = 0.;
+		break;
+	case GO_DRGEO_PROP_AUTO_YMIN:
+		if ((godrgeo->auto_ymin = g_value_get_boolean (value)))
+			godrgeo->ymin = 0.;
+		break;
+	case GO_DRGEO_PROP_AUTO_YMAX:
+		if ((godrgeo->auto_ymax = g_value_get_boolean (value)))
+			godrgeo->ymax = 0.;
+		break;
+
+	default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, param_id, pspec);
+		 return; /* NOTE : RETURN */
+	}
+	go_drgeo_component_update_bounds (godrgeo);
+}
 
 static void
 go_drgeo_component_finalize (GObject *obj)
 {
 	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (obj);
+	if (godrgeo->window)
+		godrgeo->window->Destroy ();
 	G_OBJECT_CLASS (godrgeo_parent_klass)->finalize (obj);
 }
 
@@ -149,9 +287,13 @@ go_drgeo_component_init (GOComponent *component)
 {
 	GODrGeoComponent *godrgeo = GO_DRGEO_COMPONENT (component);
 	component->resizable = false;
-	component->editable = false;
+	component->editable = true;
 	component->needs_window = false;
 	godrgeo->figure = NULL;
+	godrgeo->window = NULL;
+	godrgeo->xmin = godrgeo->xmax = godrgeo->ymin = godrgeo->ymax = 0.;
+	godrgeo->auto_xmin = godrgeo->auto_xmax = godrgeo->auto_ymin =
+		godrgeo->auto_ymax = true;
 }
 
 static void
@@ -159,6 +301,8 @@ go_drgeo_component_class_init (GOComponentClass *klass)
 {
 	GObjectClass *obj_klass = (GObjectClass *) klass;
 	obj_klass->finalize = go_drgeo_component_finalize;
+	obj_klass->set_property = go_drgeo_component_set_property;
+	obj_klass->get_property = go_drgeo_component_get_property;
 
 	godrgeo_parent_klass = (GObjectClass*) g_type_class_peek_parent (klass);
 
@@ -166,7 +310,48 @@ go_drgeo_component_class_init (GOComponentClass *klass)
 	klass->set_data = go_drgeo_component_set_data;
 	klass->draw = go_drgeo_component_draw;
 	klass->print = go_drgeo_component_print;
-//	klass->edit = go_drgeo_component_edit;
+	klass->edit = go_drgeo_component_edit;
+
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_XMIN,
+		g_param_spec_double ("drgeo-xmin", "drgeo-xmin",
+			"x at left of displayed area",
+			-200., 200., 0.,
+			(GParamFlags) (G_PARAM_READWRITE | GOC_PARAM_PERSISTENT)));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_XMAX,
+		g_param_spec_double ("drgeo-xmax", "drgeo-xmax",
+			"x at right of displayed area",
+			-200., 200., 0.,
+			(GParamFlags) (G_PARAM_READWRITE | GOC_PARAM_PERSISTENT)));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_YMIN,
+		g_param_spec_double ("drgeo-ymin", "drgeo-ymin",
+			"y at bottom of displayed area",
+			-200., 200., 0.,
+			(GParamFlags) (G_PARAM_READWRITE | GOC_PARAM_PERSISTENT)));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_YMAX,
+		g_param_spec_double ("drgeo-ymax", "drgeo-ymax",
+			"y at top of displayed area",
+			-200., 200., 0.,
+			(GParamFlags) (G_PARAM_READWRITE | GOC_PARAM_PERSISTENT)));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_AUTO_XMIN,
+		g_param_spec_boolean ("drgeo-auto-xmin", "drgeo-auto-xmin",
+			"Use automatic xmin",
+			true,
+			(GParamFlags) G_PARAM_READWRITE));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_AUTO_XMAX,
+		g_param_spec_boolean ("drgeo-auto-xmax", "drgeo-auto-xmax",
+			"Use automatic xmax",
+			true,
+			(GParamFlags) G_PARAM_READWRITE));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_AUTO_YMIN,
+		g_param_spec_boolean ("drgeo-auto-ymin", "drgeo-auto-ymin",
+			"Use automatic ymin",
+			true,
+			(GParamFlags) G_PARAM_READWRITE));
+	g_object_class_install_property (obj_klass, GO_DRGEO_PROP_AUTO_YMAX,
+		g_param_spec_boolean ("drgeo-auto-ymax", "drgeo-auto-ymax",
+			"Use automatic ymax",
+			true,
+			(GParamFlags) G_PARAM_READWRITE));
 }
 
 GSF_DYNAMIC_CLASS (GODrGeoComponent, go_drgeo_component,
diff --git a/goffice/drgeo_areabounds.cc b/goffice/drgeo_areabounds.cc
new file mode 100644
index 0000000..51c75b3
--- /dev/null
+++ b/goffice/drgeo_areabounds.cc
@@ -0,0 +1,222 @@
+/* 
+ * DrGeo GOffice component
+ * drgeo_areabounds.cc
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#include "config.h"
+#include "drgeo_areabounds.h"
+#include "goffice_window.h"
+#include <glib/gi18n-lib.h>
+
+static void
+destroy_cb (drgeoAreaBoundsDlg *dlg)
+{
+	delete dlg;
+}
+
+static void
+apply_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->Apply ();
+}
+
+static void
+close_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->Destroy ();
+}
+
+static void
+xmin_toggled_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->xminToggled ();
+}
+
+static void
+xmax_toggled_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->xmaxToggled ();
+}
+
+static void
+ymin_toggled_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->yminToggled ();
+}
+
+static void
+ymax_toggled_cb (drgeoAreaBoundsDlg *dlg)
+{
+	dlg->ymaxToggled ();
+}
+
+drgeoAreaBoundsDlg::drgeoAreaBoundsDlg (GODrGeoComponent *component, gofficeWindow *window)
+{
+	m_component = component;
+	m_parent = window;
+	xml = glade_xml_new (DRGEO_GLADEDIR"/areabounds.glade", "area-bounds", GETTEXT_PACKAGE);
+	m_window = glade_xml_get_widget (xml, "area-bounds");
+	gtk_window_set_transient_for (GTK_WINDOW (m_window), m_parent->getWindow ());
+	g_signal_connect_swapped (G_OBJECT (m_window), "destroy", G_CALLBACK (destroy_cb), this);
+	GtkWidget *w = glade_xml_get_widget (xml, "OK");
+	g_signal_connect_swapped (G_OBJECT (w), "clicked", G_CALLBACK (apply_cb), this);
+	w = glade_xml_get_widget (xml, "cancel");
+	g_signal_connect_swapped (G_OBJECT (w), "clicked", G_CALLBACK (close_cb), this);
+	m_xmin = glade_xml_get_widget (xml, "xmin");
+	m_auto_xmin = glade_xml_get_widget (xml, "auto-xmin");
+	if (component->auto_xmin) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmin), component->left);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_auto_xmin), true);
+		gtk_widget_set_sensitive (m_xmin, false);
+	} else
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmin), component->xmin);
+	g_signal_connect_swapped (G_OBJECT (m_auto_xmin), "toggled", G_CALLBACK (xmin_toggled_cb), this);
+	m_xmax = glade_xml_get_widget (xml, "xmax");
+	m_auto_xmax = glade_xml_get_widget (xml, "auto-xmax");
+	if (component->auto_xmax) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmax), component->right);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_auto_xmax), true);
+		gtk_widget_set_sensitive (m_xmax, false);
+	} else
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmax), component->xmax);
+	g_signal_connect_swapped (G_OBJECT (m_auto_xmax), "toggled", G_CALLBACK (xmax_toggled_cb), this);
+	m_ymin = glade_xml_get_widget (xml, "ymin");
+	m_auto_ymin = glade_xml_get_widget (xml, "auto-ymin");
+	if (component->auto_ymin) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymin), component->bottom);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_auto_ymin), true);
+		gtk_widget_set_sensitive (m_ymin, false);
+	} else
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymin), component->ymin);
+	g_signal_connect_swapped (G_OBJECT (m_auto_ymin), "toggled", G_CALLBACK (ymin_toggled_cb), this);
+	m_ymax = glade_xml_get_widget (xml, "ymax");
+	m_auto_ymax = glade_xml_get_widget (xml, "auto-ymax");
+	if (component->auto_ymax) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymax), component->top);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (m_auto_ymax), true);
+		gtk_widget_set_sensitive (m_ymax, false);
+	} else
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymax), component->ymax);
+	g_signal_connect_swapped (G_OBJECT (m_auto_ymax), "toggled", G_CALLBACK (ymax_toggled_cb), this);
+}
+
+drgeoAreaBoundsDlg::~drgeoAreaBoundsDlg ()
+{
+	g_object_unref (G_OBJECT (xml));
+	if (m_parent)
+		m_parent->notifyBoundsDlgDestroyed ();
+}
+
+void drgeoAreaBoundsDlg::Apply ()
+{
+	double xmin, xmax, ymin, ymax;
+	bool auto_xmin, auto_ymin;
+	xmin = gtk_spin_button_get_value (GTK_SPIN_BUTTON (m_xmin));
+	xmax = gtk_spin_button_get_value (GTK_SPIN_BUTTON (m_xmax));
+	auto_xmin = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_xmin));
+	if (xmin >= xmax) {
+		GtkDialog* box = GTK_DIALOG (gtk_message_dialog_new (GTK_WINDOW (m_window),
+				GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+				_("x minimum must be lower than x maximum.")));
+		GdkPixbuf *pixbuf = gtk_window_get_icon (GTK_WINDOW (m_window));
+		gtk_window_set_icon (GTK_WINDOW (box), pixbuf);
+		if (gtk_dialog_run (box) != GTK_RESPONSE_NONE)
+			gtk_widget_destroy (GTK_WIDGET (box));
+		gtk_window_set_focus (GTK_WINDOW (m_window), (auto_xmin)? m_xmax: m_xmin);
+		return;
+	}
+	ymin = gtk_spin_button_get_value (GTK_SPIN_BUTTON (m_ymin));
+	ymax = gtk_spin_button_get_value (GTK_SPIN_BUTTON (m_ymax));
+	auto_ymin = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_ymin));
+	if (ymin >= ymax) {
+		GtkDialog* box = GTK_DIALOG (gtk_message_dialog_new (GTK_WINDOW (m_window),
+				GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+				_("y minimum must be lower than y maximum.")));
+		GdkPixbuf *pixbuf = gtk_window_get_icon (GTK_WINDOW (m_window));
+		gtk_window_set_icon (GTK_WINDOW (box), pixbuf);
+		if (gtk_dialog_run (box) != GTK_RESPONSE_NONE)
+			gtk_widget_destroy (GTK_WIDGET (box));
+		gtk_window_set_focus (GTK_WINDOW (m_window), (auto_ymin)? m_ymax: m_ymin);
+		return;
+	}
+	g_object_set (
+		m_component,
+		"drgeo-xmin", xmin,
+		"drgeo-auto-xmin", auto_xmin,
+		"drgeo-xmax", xmax,
+		"drgeo-auto-xmax", gtk_toggle_button_get_active (
+			GTK_TOGGLE_BUTTON (m_auto_ymin)),
+		"drgeo-xmin", xmin,
+		"drgeo-auto-xmin", auto_xmin,
+		"drgeo-xmax", xmax,
+		"drgeo-auto-xmax", gtk_toggle_button_get_active (
+			GTK_TOGGLE_BUTTON (m_auto_ymin)),
+		NULL);
+	Destroy ();
+}
+
+void drgeoAreaBoundsDlg::Destroy ()
+{
+	gtk_widget_destroy (m_window);
+}
+
+void drgeoAreaBoundsDlg::xminToggled ()
+{
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_xmin))) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmin), m_component->left);
+		gtk_widget_set_sensitive (m_xmin, false);
+	} else {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmin), m_component->xmin);
+		gtk_widget_set_sensitive (m_xmin, true);
+	}
+}
+
+void drgeoAreaBoundsDlg::xmaxToggled ()
+{
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_xmax))) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmax), m_component->right);
+		gtk_widget_set_sensitive (m_xmax, false);
+	} else {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_xmax), m_component->xmax);
+		gtk_widget_set_sensitive (m_xmax, true);
+	}
+}
+
+void drgeoAreaBoundsDlg::yminToggled ()
+{
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_ymin))) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymin), m_component->bottom);
+		gtk_widget_set_sensitive (m_ymin, false);
+	} else {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymin), m_component->ymin);
+		gtk_widget_set_sensitive (m_ymin, true);
+	}
+}
+
+void drgeoAreaBoundsDlg::ymaxToggled ()
+{
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (m_auto_ymax))) {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymax), m_component->top);
+		gtk_widget_set_sensitive (m_ymax, false);
+	} else {
+		gtk_spin_button_set_value (GTK_SPIN_BUTTON (m_ymax), m_component->ymax);
+		gtk_widget_set_sensitive (m_ymax, true);
+	}
+}
diff --git a/goffice/drgeo_areabounds.h b/goffice/drgeo_areabounds.h
new file mode 100644
index 0000000..da97f53
--- /dev/null
+++ b/goffice/drgeo_areabounds.h
@@ -0,0 +1,53 @@
+/* 
+ * DrGeo GOffice component
+ * drgeo_areabounds.h
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#ifndef DRGEO_AREABOUNDS_H
+#define DRGEO_AREABOUNDS_H
+
+#include "drgeo_impl.h"
+#include <glade/glade.h>
+
+class gofficeWindow;
+
+class drgeoAreaBoundsDlg
+{
+public:
+	drgeoAreaBoundsDlg (GODrGeoComponent *component, gofficeWindow *window);
+	~drgeoAreaBoundsDlg ();
+
+	void Apply ();
+	void Destroy ();
+	void xminToggled ();
+	void xmaxToggled ();
+	void yminToggled ();
+	void ymaxToggled ();
+
+private:
+	GODrGeoComponent *m_component;
+	GladeXML *xml;
+	GtkWidget *m_window;
+	GtkWidget *m_auto_xmin, *m_auto_xmax, *m_auto_ymin, *m_auto_ymax;
+	GtkWidget *m_xmin, *m_xmax, *m_ymin, *m_ymax;
+	gofficeWindow *m_parent;
+};
+
+#endif
diff --git a/goffice/drgeo_cairodrawable.cc b/goffice/drgeo_cairodrawable.cc
index a895365..25d64fa 100644
--- a/goffice/drgeo_cairodrawable.cc
+++ b/goffice/drgeo_cairodrawable.cc
@@ -2,9 +2,7 @@
  * DrGeo GOffice component
  * drgeo_cairodrawable.cc
  *
- * Copyright (C) 2006
- *
- * Developed by Jean Bréfort <jean brefort normalesup org>
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
  * This program is free software; you can redistribute it and/or 
  * modify it under the terms of the GNU General Public License as 
@@ -22,15 +20,19 @@
  * USA
  */
  
-#include <config.h>
+#include "config.h"
 #include "drgeo_cairodrawable.h"
-#include <geo/couleur.h>
+#include "geo/couleur.h"
 #include <math.h>
 
 static cairo_pattern_t *cairoColor[drgeoColorNumber] = {
 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
 };
 
+static cairo_pattern_t *alphacairoColor[drgeoColorNumber] = {
+	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
 drgeoCairoDrawable::drgeoCairoDrawable (drgeoFigure * figure, cairo_surface_t *surface)
 {
 	if (cairoColor[drgeoColorBlack] == NULL) {
@@ -48,6 +50,20 @@ drgeoCairoDrawable::drgeoCairoDrawable (drgeoFigure * figure, cairo_surface_t *s
 		cairoColor[drgeoColorYellow] = cairo_pattern_create_rgb (.129412, .941176, 1.);
 		cairoColor[drgeoColorTips] = cairo_pattern_create_rgb (.752941, 1., 1.);
 		cairoColor[drgeoColorPrintingArea] = cairo_pattern_create_rgb (.941176, .941176, .941176);
+		alphacairoColor[drgeoColorBlack] = cairo_pattern_create_rgba (0., 0., 0., .5);
+		alphacairoColor[drgeoColorDarkGrey] = cairo_pattern_create_rgba (.333333, .333333, .333333, .5);
+		alphacairoColor[drgeoColorGrey] = cairo_pattern_create_rgba (.666667, .666667, .666667, .5);
+		alphacairoColor[drgeoColorWhite] = cairo_pattern_create_rgba (1., 1., 1., .5);
+		alphacairoColor[drgeoColorDarkGreen] = cairo_pattern_create_rgba (0., .392157, 0., .5);
+		alphacairoColor[drgeoColorGreen] = cairo_pattern_create_rgba (0., .921569, 0., .5);
+		alphacairoColor[drgeoColorDarkBlue] = cairo_pattern_create_rgba (1., .219608, .176471, .5);
+		alphacairoColor[drgeoColorBlue] = cairo_pattern_create_rgba (1., .694118, .313725, .5);
+		alphacairoColor[drgeoColorBordeaux] = cairo_pattern_create_rgba (0., 0., .568627, .5);
+		alphacairoColor[drgeoColorRed] = cairo_pattern_create_rgba (0., 0., .921569, .5);
+		alphacairoColor[drgeoColorOrange] = cairo_pattern_create_rgba (.168627, .6, 1., .5);
+		alphacairoColor[drgeoColorYellow] = cairo_pattern_create_rgba (.129412, .941176, 1., .5);
+		alphacairoColor[drgeoColorTips] = cairo_pattern_create_rgba (.752941, 1., 1., .5);
+		alphacairoColor[drgeoColorPrintingArea] = cairo_pattern_create_rgba (.941176, .941176, .941176, .5);
 	}
 	setFigure (figure);
 	m_Surf = surface;
@@ -143,15 +159,46 @@ void drgeoCairoDrawable::drawPoint (drgeoStyle & style, drgeoPoint & point)
 
 void drgeoCairoDrawable::drawPolygon (drgeoStyle & style, drgeoPoint * point, gint number)
 {
+	if (style.mask == yes)
+		return;
+
+	int i;
+
+	cairo_set_source (m_Cairo, alphacairoColor[style.color]);
+	
+	cairo_new_path (m_Cairo);
+	cairo_move_to (m_Cairo,	point[0].getX (), point[0].getY ());
+	for (i=1; i < number; i++)
+		cairo_line_to (m_Cairo,	point[i].getX (), point[i].getY ());
+	cairo_close_path (m_Cairo);
+	cairo_fill (m_Cairo);
 }
 
 void drgeoCairoDrawable::drawLine (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end)
 {
+	if (style.mask == yes)
+		return;
+
+	double width = m_Size.getX (), height = m_Size.getY (),
+		x = m_Center.getX (), y = m_Center.getY ();
+	
+	
+	clipLine (style, start, end, y + height / 2., y - height / 2,
+		x - width / 2., x + width / 2.);
 }
 
 void drgeoCairoDrawable::drawHalfLine (drgeoStyle & style, drgeoPoint & start,
 		 drgeoVector & vect)
 {
+	if (style.mask == yes)
+		return;
+
+	double width = m_Size.getX (), height = m_Size.getY (),
+		x = m_Center.getX (), y = m_Center.getY ();
+	
+	
+	clipHalfLine (style, start, vect, y + height / 2., y - height / 2,
+		x - width / 2., x + width / 2.);
 }
 
 void drgeoCairoDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end)
@@ -170,7 +217,6 @@ void drgeoCairoDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, dr
 			cairo_set_dash (m_Cairo, dashes, 2, 0.);
 		}
 		break;
-		break;
 	case drgeoThicknessNormal:
 		cairo_set_line_width (m_Cairo, .025);
 		cairo_set_dash (m_Cairo, NULL, 0, 0.);
@@ -193,16 +239,89 @@ void drgeoCairoDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, dr
 
 void drgeoCairoDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center, double radius)
 {
+	if (style.mask == yes)
+		return;
+
+	cairo_set_source (m_Cairo, cairoColor[style.color]);
+
+	switch (style.thick)
+	{
+	case drgeoThicknessDashed:
+		{
+			double dashes[] = {.1, .1};
+			cairo_set_line_width (m_Cairo, .025);
+			cairo_set_dash (m_Cairo, dashes, 2, 0.);
+		}
+		break;
+	case drgeoThicknessNormal:
+		cairo_set_line_width (m_Cairo, .025);
+		cairo_set_dash (m_Cairo, NULL, 0, 0.);
+		break;
+	case drgeoThicknessLarge:
+		cairo_set_line_width (m_Cairo, .05);
+		cairo_set_dash (m_Cairo, NULL, 0, 0.);
+		break;
+	}
+
+	cairo_set_line_cap (m_Cairo, CAIRO_LINE_CAP_ROUND);
+	cairo_set_line_join (m_Cairo, CAIRO_LINE_JOIN_MITER);
+
+	// Draw the line.
+	cairo_new_path (m_Cairo);
+	cairo_arc (m_Cairo, center.getX (), center.getY (), radius, 0, 2 * M_PI);
+	cairo_stroke (m_Cairo);
 }
 
 void drgeoCairoDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center,
 	   drgeoPoint & point)
 {
+	double radius;
+	
+	radius = (point - center).norm ();
+	drawCircle (style, center, radius);
 }
 
 void drgeoCairoDrawable::drawArc (drgeoStyle & style, drgeoPoint & center, double radius,
 	double start, double length)
 {
+	if (style.mask == yes)
+		return;
+
+	double end;
+	if (length > 0)
+		end = start + length;
+	else {
+		end = start;
+		start += length;
+	}
+
+	cairo_set_source (m_Cairo, cairoColor[style.color]);
+
+	switch (style.thick)
+	{
+	case drgeoThicknessDashed:
+		{
+			double dashes[] = {.1, .1};
+			cairo_set_line_width (m_Cairo, .025);
+			cairo_set_dash (m_Cairo, dashes, 2, 0.);
+		}
+		break;
+	case drgeoThicknessNormal:
+		cairo_set_line_width (m_Cairo, .025);
+		cairo_set_dash (m_Cairo, NULL, 0, 0.);
+		break;
+	case drgeoThicknessLarge:
+		cairo_set_line_width (m_Cairo, .05);
+		cairo_set_dash (m_Cairo, NULL, 0, 0.);
+		break;
+	}
+
+	cairo_set_line_cap (m_Cairo, CAIRO_LINE_CAP_ROUND);
+	cairo_set_line_join (m_Cairo, CAIRO_LINE_JOIN_MITER);
+
+	cairo_new_path (m_Cairo);
+	cairo_arc (m_Cairo, center.getX (), center.getY (), radius, start, end);
+	cairo_stroke (m_Cairo);
 }
 
 void drgeoCairoDrawable::drawText (drgeoPoint & where, char *text, drgeoColorType fontColor)
@@ -219,14 +338,20 @@ double drgeoCairoDrawable::stringHeight (char *text)
 
 drgeoPoint drgeoCairoDrawable::getAreaCenter ()
 {
+	return m_Center;
 }
 
 drgeoPoint drgeoCairoDrawable::getAreaSize ()
 {
+	return m_Size;
 }
 
-void drgeoCairoDrawable::setOffset (double xOffset, double yOffset)
+void drgeoCairoDrawable::setMetrics (double Scale, double xOffset, double yOffset,
+				double width, double height)
 {
+	scale = Scale;
 	cairo_scale (m_Cairo, scale, -scale);
 	cairo_translate (m_Cairo, -xOffset, -yOffset);
+	m_Center = drgeoPoint (xOffset + width / 2., yOffset - height / 2.);
+	m_Size = drgeoPoint (width, height);
 }
diff --git a/goffice/drgeo_cairodrawable.h b/goffice/drgeo_cairodrawable.h
index f4d61a6..528073c 100644
--- a/goffice/drgeo_cairodrawable.h
+++ b/goffice/drgeo_cairodrawable.h
@@ -2,9 +2,7 @@
  * DrGeo GOffice component
  * drgeo_cairodrawable.h
  *
- * Copyright (C) 2006
- *
- * Developed by Jean Bréfort <jean brefort normalesup org>
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
  * This program is free software; you can redistribute it and/or 
  * modify it under the terms of the GNU General Public License as 
@@ -51,11 +49,13 @@ public:
 	double stringHeight (char *text);
 	drgeoPoint getAreaCenter ();
 	drgeoPoint getAreaSize ();
-	void setOffset (double xOffset, double yOffset);
+	void setMetrics (double Scale, double xOffset, double yOffset,
+				double width, double height);
 
 private:
 	cairo_surface_t *m_Surf;
 	cairo_t *m_Cairo;
+	drgeoPoint m_Center, m_Size;
 };
 
 #endif
diff --git a/goffice/drgeo_dummydrawable.cc b/goffice/drgeo_dummydrawable.cc
new file mode 100644
index 0000000..33d99c8
--- /dev/null
+++ b/goffice/drgeo_dummydrawable.cc
@@ -0,0 +1,44 @@
+/* 
+ * DrGeo GOffice component
+ * drgeo_dummydrawable.cc
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+ 
+#include "config.h"
+#include "drgeo_dummydrawable.h"
+
+static drgeoPoint c (0., 0.), s (300., 300.);
+
+drgeoDummyDrawable::drgeoDummyDrawable () {;}
+void drgeoDummyDrawable::drawPoint (drgeoStyle & style, drgeoPoint & point) {;}
+void drgeoDummyDrawable::drawPolygon (drgeoStyle & style, drgeoPoint * point, gint number) {;}
+void drgeoDummyDrawable::drawLine (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end) {;}
+void drgeoDummyDrawable::drawHalfLine (drgeoStyle & style, drgeoPoint & start,
+		 drgeoVector & vect) {;}
+void drgeoDummyDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end) {;}
+void drgeoDummyDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center, double radius) {;}
+void drgeoDummyDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center,
+	   drgeoPoint & point) {;}
+void drgeoDummyDrawable::drawArc (drgeoStyle & style, drgeoPoint & center, double radius,
+	double start, double length) {;}
+void drgeoDummyDrawable::drawText (drgeoPoint & where, char *text, drgeoColorType fontColor) {;}
+double drgeoDummyDrawable::stringWidth (char *text) {return 0.;}
+double drgeoDummyDrawable::stringHeight (char *text) {return 0.;}
+drgeoPoint drgeoDummyDrawable::getAreaCenter () {return c;}
+drgeoPoint drgeoDummyDrawable::getAreaSize () {return s;}
diff --git a/goffice/drgeo_dummydrawable.h b/goffice/drgeo_dummydrawable.h
new file mode 100644
index 0000000..b5dde3c
--- /dev/null
+++ b/goffice/drgeo_dummydrawable.h
@@ -0,0 +1,52 @@
+/* 
+ * DrGeo GOffice component
+ * drgeo_cairodrawable.h
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#ifndef DRGEO_DUMMYDRAWABLE_H
+#define DRGEO_DUMMYDRAWABLE_H
+
+#include <geo/drgeo_drawable.h>
+#include <cairo/cairo.h>
+
+class drgeoDummyDrawable: public drgeoDrawable
+{
+public:
+	drgeoDummyDrawable ();
+
+	void drawPoint (drgeoStyle & style, drgeoPoint & point);
+	void drawPolygon (drgeoStyle & style, drgeoPoint * point, gint number);
+	void drawLine (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end);
+	void drawHalfLine (drgeoStyle & style, drgeoPoint & start,
+			 drgeoVector & vect);
+	void drawSegment (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end);
+	void drawCircle (drgeoStyle & style, drgeoPoint & center, double radius);
+	void drawCircle (drgeoStyle & style, drgeoPoint & center,
+		   drgeoPoint & point);
+	void drawArc (drgeoStyle & style, drgeoPoint & center, double radius,
+		double start, double length);
+	void drawText (drgeoPoint & where, char *text, drgeoColorType fontColor);
+	double stringWidth (char *text);
+	double stringHeight (char *text);
+	drgeoPoint getAreaCenter ();
+	drgeoPoint getAreaSize ();
+};
+
+#endif
diff --git a/goffice/drgeo_gpdrawable.cc b/goffice/drgeo_gpdrawable.cc
index ef499f5..f4fccec 100644
--- a/goffice/drgeo_gpdrawable.cc
+++ b/goffice/drgeo_gpdrawable.cc
@@ -2,9 +2,7 @@
  * DrGeo GOffice component
  * drgeo_gnome_printdrawable.cc
  *
- * Copyright (C) 2006
- *
- * Developed by Jean Bréfort <jean brefort normalesup org>
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
  * This program is free software; you can redistribute it and/or 
  * modify it under the terms of the GNU General Public License as 
@@ -22,9 +20,10 @@
  * USA
  */
  
-#include <config.h>
+#include "config.h"
 #include "drgeo_gpdrawable.h"
-#include <geo/couleur.h>
+#include "geo/couleur.h"
+#include <math.h>
 
 drgeoGPDrawable::drgeoGPDrawable (drgeoFigure * figure, GnomePrintContext *pc)
 {
@@ -76,20 +75,20 @@ void drgeoGPDrawable::drawPoint (drgeoStyle & style, drgeoPoint & point)
 		gnome_print_setlinejoin (m_pc, 1);
 	
 		gnome_print_newpath (m_pc);
-		gnome_print_moveto (m_pc,	x - radius, y - radius);
-		gnome_print_lineto (m_pc,	x + radius, y + radius);
+		gnome_print_moveto (m_pc, x - radius, y - radius);
+		gnome_print_lineto (m_pc, x + radius, y + radius);
 		gnome_print_stroke (m_pc);
 		gnome_print_newpath (m_pc);
-		gnome_print_moveto (m_pc,	x - radius, y + radius);
-		gnome_print_lineto (m_pc,	x + radius, y - radius);
+		gnome_print_moveto (m_pc, x - radius, y + radius);
+		gnome_print_lineto (m_pc, x + radius, y - radius);
 		gnome_print_stroke (m_pc);
 		break;
 	case drgeoPointRec:
-		gnome_print_moveto (m_pc,	x - radius, y - radius);
-		gnome_print_lineto (m_pc,	x + radius, y - radius);
-		gnome_print_lineto (m_pc,	x + radius, y + radius);
-		gnome_print_lineto (m_pc,	x - radius, y + radius);
-		gnome_print_lineto (m_pc,	x - radius, y - radius);
+		gnome_print_moveto (m_pc, x - radius, y - radius);
+		gnome_print_lineto (m_pc, x + radius, y - radius);
+		gnome_print_lineto (m_pc, x + radius, y + radius);
+		gnome_print_lineto (m_pc, x - radius, y + radius);
+		gnome_print_lineto (m_pc, x - radius, y - radius);
 		gnome_print_fill (m_pc);
 		break;
 	case drgeoPointRoundEmpty:
@@ -119,15 +118,47 @@ void drgeoGPDrawable::drawPoint (drgeoStyle & style, drgeoPoint & point)
 
 void drgeoGPDrawable::drawPolygon (drgeoStyle & style, drgeoPoint * point, gint number)
 {
+	if (style.mask == yes)
+		return;
+
+	int i;
+
+	setColor (style.color);
+	gnome_print_setopacity (m_pc, 0.5);
+
+	gnome_print_newpath (m_pc);
+	gnome_print_moveto (m_pc, point[0].getX (), point[0].getY ());
+	for (i=1; i < number; i++)
+		gnome_print_lineto (m_pc,point[i].getX (), point[i].getY ());
+	gnome_print_closepath (m_pc);
+	gnome_print_fill (m_pc);
 }
 
 void drgeoGPDrawable::drawLine (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end)
 {
+	if (style.mask == yes)
+		return;
+
+	double width = m_Size.getX (), height = m_Size.getY (),
+		x = m_Center.getX (), y = m_Center.getY ();
+	
+	
+	clipLine (style, start, end, y + height / 2., y - height / 2,
+		x - width / 2., x + width / 2.);
 }
 
 void drgeoGPDrawable::drawHalfLine (drgeoStyle & style, drgeoPoint & start,
 		 drgeoVector & vect)
 {
+	if (style.mask == yes)
+		return;
+
+	double width = m_Size.getX (), height = m_Size.getY (),
+		x = m_Center.getX (), y = m_Center.getY ();
+	
+	
+	clipHalfLine (style, start, vect, y + height / 2., y - height / 2,
+		x - width / 2., x + width / 2.);
 }
 
 void drgeoGPDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, drgeoPoint & end)
@@ -168,16 +199,95 @@ void drgeoGPDrawable::drawSegment (drgeoStyle & style, drgeoPoint & start, drgeo
 
 void drgeoGPDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center, double radius)
 {
+	if (style.mask == yes)
+		return;
+
+	setColor (style.color);
+
+	switch (style.thick)
+	{
+	case drgeoThicknessDashed:
+		{
+			double dashes[] = {4.0, 2.0};
+			gnome_print_setlinewidth (m_pc, .025);
+			gnome_print_setdash (m_pc, 2, dashes, 0.);
+		}
+		break;
+	case drgeoThicknessNormal:
+		gnome_print_setlinewidth (m_pc, .025);
+		gnome_print_setdash (m_pc, 0, NULL, 0.);
+		break;
+	case drgeoThicknessLarge:
+		gnome_print_setlinewidth (m_pc, .05);
+		gnome_print_setdash (m_pc, 0, NULL, 0.);
+		break;
+	}
+
+	gnome_print_setlinecap (m_pc, 1);
+	gnome_print_setlinejoin (m_pc, 1);
+
+	// Draw the circle.
+	double x = center.getX (), y = center.getY ();
+	gnome_print_newpath (m_pc);
+	gnome_print_moveto (m_pc, x + radius, y);
+	gnome_print_arcto (m_pc, x, y, radius, 0., 180., 0);
+	gnome_print_arcto (m_pc, x, y, radius, 180., 360., 0);
+	gnome_print_stroke (m_pc);
 }
 
 void drgeoGPDrawable::drawCircle (drgeoStyle & style, drgeoPoint & center,
 	   drgeoPoint & point)
 {
+	double radius;
+	
+	radius = (point - center).norm ();
+	drawCircle (style, center, radius);
 }
 
 void drgeoGPDrawable::drawArc (drgeoStyle & style, drgeoPoint & center, double radius,
 	double start, double length)
 {
+	if (style.mask == yes)
+		return;
+
+	double end;
+	if (length > 0)
+		end = start + length;
+	else {
+		end = start;
+		start += length;
+	}
+
+	setColor (style.color);
+
+	switch (style.thick)
+	{
+	case drgeoThicknessDashed:
+		{
+			double dashes[] = {4.0, 2.0};
+			gnome_print_setlinewidth (m_pc, .025);
+			gnome_print_setdash (m_pc, 2, dashes, 0.);
+		}
+		break;
+	case drgeoThicknessNormal:
+		gnome_print_setlinewidth (m_pc, .025);
+		gnome_print_setdash (m_pc, 0, NULL, 0.);
+		break;
+	case drgeoThicknessLarge:
+		gnome_print_setlinewidth (m_pc, .05);
+		gnome_print_setdash (m_pc, 0, NULL, 0.);
+		break;
+	}
+
+	gnome_print_setlinecap (m_pc, 1);
+	gnome_print_setlinejoin (m_pc, 1);
+
+	// Draw the arc.
+	double x = center.getX (), y = center.getY ();
+	gnome_print_newpath (m_pc);
+	gnome_print_moveto (m_pc, x + radius * cos (start), y * sin (start));
+	gnome_print_arcto (m_pc, x, y, radius, start * 180. / M_PI, end * 180. / M_PI, 0);
+	gnome_print_stroke (m_pc);
 }
 
 void drgeoGPDrawable::drawText (drgeoPoint & where, char *text, drgeoColorType fontColor)
@@ -194,16 +304,22 @@ double drgeoGPDrawable::stringHeight (char *text)
 
 drgeoPoint drgeoGPDrawable::getAreaCenter ()
 {
+	return m_Center;
 }
 
 drgeoPoint drgeoGPDrawable::getAreaSize ()
 {
+	return m_Size;
 }
 
-void drgeoGPDrawable::setOffset (double xOffset, double yOffset)
+void drgeoGPDrawable::setMetrics (double Scale, double xOffset, double yOffset,
+				double width, double height)
 {
+	scale = Scale;
 	gnome_print_scale (m_pc, scale, scale);
 	gnome_print_translate (m_pc, -xOffset, -yOffset);
+	m_Center = drgeoPoint (xOffset + width / 2., yOffset + height / 2.);
+	m_Size = drgeoPoint (width, height);
 }
 
 void drgeoGPDrawable::setColor (enum drgeoColorType color)
diff --git a/goffice/drgeo_gpdrawable.h b/goffice/drgeo_gpdrawable.h
index 5e8ce3a..52835c3 100644
--- a/goffice/drgeo_gpdrawable.h
+++ b/goffice/drgeo_gpdrawable.h
@@ -2,9 +2,7 @@
  * DrGeo GOffice component
  * drgeo_cairodrawable.h
  *
- * Copyright (C) 2006
- *
- * Developed by Jean Bréfort <jean brefort normalesup org>
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
  * This program is free software; you can redistribute it and/or 
  * modify it under the terms of the GNU General Public License as 
@@ -51,13 +49,15 @@ public:
 	double stringHeight (char *text);
 	drgeoPoint getAreaCenter ();
 	drgeoPoint getAreaSize ();
-	void setOffset (double xOffset, double yOffset);
+	void setMetrics (double Scale, double xOffset, double yOffset,
+				double width, double height);
 
 private:
 	void setColor (enum drgeoColorType color);
 
 private:
 	GnomePrintContext *m_pc;
+	drgeoPoint m_Center, m_Size;
 };
 
 #endif
diff --git a/goffice/drgeo_impl.h b/goffice/drgeo_impl.h
new file mode 100644
index 0000000..8514021
--- /dev/null
+++ b/goffice/drgeo_impl.h
@@ -0,0 +1,43 @@
+/* 
+ * DrGeo GOffice component
+ * drgeo_impl.h
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+ 
+#ifndef DRGEO_IMPL_H
+#define DRGEO_IMPL_H
+
+#include <goffice/component/goffice-component.h>
+#include <goffice/component/go-component.h>
+#include <geo/drgeo_figure.h>
+
+class gofficeWindow;
+	
+typedef struct
+{
+	GOComponent parent;
+	drgeoFigure *figure;
+	gofficeWindow *window;
+	double xoffset, yoffset, width, height;
+	double left, right, bottom, top;
+	double xmin, xmax, ymin, ymax;
+	bool auto_xmin, auto_xmax, auto_ymin, auto_ymax;
+} GODrGeoComponent;
+
+#endif	/*	DRGEO_IMPL_H	*/
diff --git a/goffice/goffice_mdi.cc b/goffice/goffice_mdi.cc
index 4309b16..27f0cdf 100644
--- a/goffice/goffice_mdi.cc
+++ b/goffice/goffice_mdi.cc
@@ -1,30 +1,112 @@
-/* Dr Genius an interactive geometry software
- * (C) Copyright Jean Bréfort  2006
- * jean brefort normalesup org 
- * 
+/* 
+ * DrGeo GOffice component
+ * goffice_mdi.cc
  *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public Licences as by published
- * by the Free Software Foundation; either version 2; or (at your option)
- * any later version
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * This program is distributed in the hope that it will entertaining,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of 
- * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- * Publis License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.
- * 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  */
 
-#include <config.h>
+#include "config.h"
 #include "goffice_mdi.h"
+#include "goffice_window.h"
+#include <geo/drgeo_scm_api.h>
+#include <geo/drgeo_scm_interface.h>
+#include <locale.h>
 
 gofficeMDI::gofficeMDI (): drgeoMDI ()
 {
+//	setlocale (LC_NUMERIC, "C");
+	scm_init_guile ();
+
+	// source pasted from drgeo_init.cc
+	SCM ret;
+	// Code to handle user configurations
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_config.scm");
+	// The Dr. Geo Scheme interface
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface.scm");
+	// The Scheme interface constants and synonymes and their
+	// translations in other national language
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface_constant.scm");
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface_constant_fr.scm");
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface_constant_sr.scm");
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface_constant_es.scm");
+	ret = gh_load (DRGEO_SCMDIR"/drgeo_scm_interface_constant_nl.scm");
+
+	// source pasted from drgenius_main.cc
+	/* Load user preferences */
+	loadUserPreferences ();
+	
+	/* declare drgeo API in guile */
+	gh_new_procedure ("move", (SCM (*) ()) drgeo_scm_move, 2, 0, 0);
+	gh_new_procedure ("getAbscissa", (SCM (*) ()) drgeo_scm_getAbscissa, 1, 0, 0);
+	gh_new_procedure ("setAbscissa", (SCM (*) ()) drgeo_scm_setAbscissa, 2, 0, 0);
+	gh_new_procedure ("getCoordinates", (SCM (*) ()) drgeo_scm_getCoordinates, 1, 0, 0);
+	gh_new_procedure ("setCoordinates", (SCM (*) ()) drgeo_scm_setCoordinates, 2, 0, 0);
+	gh_new_procedure ("getUnit", (SCM (*) ()) drgeo_scm_getUnit, 1, 0, 0);
+	gh_new_procedure ("getNormal", (SCM (*) ()) drgeo_scm_getNormal, 1, 0, 0);
+	gh_new_procedure ("getSlope", (SCM (*) ()) drgeo_scm_getSlope, 1, 0, 0);
+	gh_new_procedure ("getNorm", (SCM (*) ()) drgeo_scm_getNorm, 1, 0, 0);
+	gh_new_procedure ("getLength", (SCM (*) ()) drgeo_scm_getLength, 1, 0, 0);
+	gh_new_procedure ("getCenter", (SCM (*) ()) drgeo_scm_getCenter, 1, 0, 0);
+	gh_new_procedure ("getRadius", (SCM (*) ()) drgeo_scm_getRadius, 1, 0, 0);
+	gh_new_procedure ("getValue", (SCM (*) ()) drgeo_scm_getValue, 1, 0, 0);
+	gh_new_procedure ("setValue", (SCM (*) ()) drgeo_scm_setValue, 2, 0, 0);
+	gh_new_procedure ("getAngle", (SCM (*) ()) drgeo_scm_getAngle, 1, 0, 0);
+	
+	/* declare the drgeo interface in Guile */
+	gh_new_procedure ("drgeoMake-figure", (SCM (*) ()) drgeo_scm_make_figure, 1, 0, 0);
+	gh_new_procedure ("drgeoMake-freePoint", (SCM (*) ()) drgeo_scm_make_freePoint, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-pointOnCurve", (SCM (*) ()) drgeo_scm_make_pointOnCurve, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-middle2Points", (SCM (*) ()) drgeo_scm_make_middle2Points, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-middleSegment", (SCM (*) ()) drgeo_scm_make_middleSegment, 3, 0, 0);
+	gh_new_procedure ("drgeoMake-intersection", (SCM (*) ()) drgeo_scm_make_intersection, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-segmentExtremity", (SCM (*) ()) drgeo_scm_make_segmentExtremity, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-line", (SCM (*) ()) drgeo_scm_make_line, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-parallel", (SCM (*) ()) drgeo_scm_make_parallel, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-orthogonal", (SCM (*) ()) drgeo_scm_make_orthogonal, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-ray", (SCM (*) ()) drgeo_scm_make_ray, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-vector", (SCM (*) ()) drgeo_scm_make_vector, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-circle2Points", (SCM (*) ()) drgeo_scm_make_circle2Points, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-circleRadius", (SCM (*) ()) drgeo_scm_make_circleRadius, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-circleSegment", (SCM (*) ()) drgeo_scm_make_circleSegment, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-arc", (SCM (*) ()) drgeo_scm_make_arc, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-locus", (SCM (*) ()) drgeo_scm_make_locus, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-polygon", (SCM (*) ()) drgeo_scm_make_polygon, 3, 0, 0);
+	gh_new_procedure ("drgeoMake-freeValue", (SCM (*) ()) drgeo_scm_make_freeValue, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-segmentLength", (SCM (*) ()) drgeo_scm_make_segmentLength, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-vectorNorm", (SCM (*) ()) drgeo_scm_make_vectorNorm, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-distancePointCircle", (SCM (*) ()) drgeo_scm_make_distancePointCircle, 6, 0, 0);
+	gh_new_procedure ("drgeoMake-distancePointLine", (SCM (*) ()) drgeo_scm_make_distancePointLine, 6, 0, 0);
+	gh_new_procedure ("drgeoMake-distancePointPoint", (SCM (*) ()) drgeo_scm_make_distancePointPoint, 6, 0, 0);
+	gh_new_procedure ("drgeoMake-circleLength", (SCM (*) ()) drgeo_scm_make_circleLength, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-lineSlope", (SCM (*) ()) drgeo_scm_make_lineSlope, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-arcLength", (SCM (*) ()) drgeo_scm_make_arcLength, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-geometricAngle", (SCM (*) ()) drgeo_scm_make_geometricAngle, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-orientedAngle", (SCM (*) ()) drgeo_scm_make_orientedAngle, 6, 0, 0);
+	
+	gh_new_procedure ("drgeoMake-rotation", (SCM (*) ()) drgeo_scm_make_rotation, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-scale", (SCM (*) ()) drgeo_scm_make_scale, 5, 0, 0);
+	gh_new_procedure ("drgeoMake-symmetry", (SCM (*) ()) drgeo_scm_make_symmetry, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-reflexion", (SCM (*) ()) drgeo_scm_make_reflexion, 4, 0, 0);
+	gh_new_procedure ("drgeoMake-translation", (SCM (*) ()) drgeo_scm_make_translation, 4, 0, 0);
+	gh_new_procedure ("change-color", (SCM (*) ()) drgeo_scm_change_color, 3, 0, 0);
+	gh_new_procedure ("change-thickness", (SCM (*) ()) drgeo_scm_change_thickness, 3, 0, 0);
+	gh_new_procedure ("change-pointShape", (SCM (*) ()) drgeo_scm_change_pointShape, 3, 0, 0);
+	gh_new_procedure ("change-masked", (SCM (*) ()) drgeo_scm_change_masked, 2, 0, 0);
 }
 
 gofficeMDI::~gofficeMDI ()
@@ -68,3 +150,8 @@ void gofficeMDI::newGeometricDocument (xmlNodePtr tree)
 void gofficeMDI::setMacroMenuItemDescription (gchar *name, gchar *description)
 {
 }
+
+void gofficeMDI::EditComponent (GODrGeoComponent *component)
+{
+	new gofficeWindow (this, component);
+}
diff --git a/goffice/goffice_mdi.h b/goffice/goffice_mdi.h
index 725fcde..bac1944 100644
--- a/goffice/goffice_mdi.h
+++ b/goffice/goffice_mdi.h
@@ -1,29 +1,32 @@
-/* Dr Genius an interactive geometry software
- * (C) Copyright Jean Bréfort  2006
- * jean brefort normalesup org 
- * 
+/*
+ * DrGeo GOffice component
+ * goffice_mdi.cc
  *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
  *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public Licences as by published
- * by the Free Software Foundation; either version 2; or (at your option)
- * any later version
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * This program is distributed in the hope that it will entertaining,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of 
- * MERCHANTABILTY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- * Publis License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.
- * 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
  */
 
 #ifndef GOFFICE_MDI_H
 #define GOFFICE_MDI_H
 
 #include <geo/drgeo_mdi.h>
+#include "drgeo_impl.h"
+
+class gofficeWindow;
 
 class gofficeMDI: public drgeoMDI
 {
@@ -40,6 +43,11 @@ public:
 	virtual void reconcile_grayout_undo ();
 	virtual void newGeometricDocument (xmlNodePtr tree);
 	virtual void setMacroMenuItemDescription (gchar *name, gchar *description);
+	void EditComponent (GODrGeoComponent *component);
+	void setActiveWindow (gofficeWindow *window) {m_ActiveWindow = window;}
+
+private:
+	gofficeWindow *m_ActiveWindow;
 };
 
 #endif /* GOFFICE_MDI_H */
diff --git a/goffice/goffice_window.cc b/goffice/goffice_window.cc
new file mode 100644
index 0000000..1c193c2
--- /dev/null
+++ b/goffice/goffice_window.cc
@@ -0,0 +1,297 @@
+/* 
+ * DrGeo GOffice component
+ * goffice_window.cc
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+ 
+#include "config.h"
+#include "goffice_window.h"
+#include "drgeo_areabounds.h"
+#include <geo/geo_view.h>
+#include <glade/glade.h>
+#include <glib/gi18n-lib.h>
+
+static void
+save_cb (GtkWidget* widget, gofficeWindow *window)
+{
+	window->Save ();
+}
+
+static void
+close_cb (GtkWidget* widget, gofficeWindow *window)
+{
+	window->Close ();
+}
+
+static void
+undo_cb (GtkWidget* widget, gofficeWindow *window)
+{
+	window->Undo ();
+}
+
+static void
+redo_cb (GtkWidget* widget, gofficeWindow *window)
+{
+	window->Redo ();
+}
+
+static void
+bounds_cb (GtkWidget* widget, gofficeWindow *window)
+{
+	window->Bounds ();
+}
+
+static void
+help_cb ()
+{
+}
+
+static void
+about_cb ()
+{
+}
+
+static void
+focus_in_cb (gofficeWindow *window)
+{
+	window->setActive ();
+}
+
+static void
+destroy_cb (gofficeWindow *window)
+{
+	delete window;
+}
+
+static void show_menu_tip_cb (GtkWidget *proxy, gofficeWindow* Win)
+{
+	GtkAction *action = (GtkAction*) g_object_get_data (G_OBJECT (proxy), "action");
+	char *tip;
+	g_object_get (action, "tooltip", &tip, NULL);
+	if (tip != NULL){
+		Win->SetStatusText (tip);
+		g_free (tip);
+	}
+}
+
+static void clear_menu_tip_cb (gofficeWindow* Win)
+{
+		Win->ClearStatus ();
+}
+
+static void connect_proxy_cb (GtkUIManager *ui, GtkAction *action, GtkWidget *proxy, gofficeWindow* Win)
+{
+	/* connect whether there is a tip or not it may change later */
+	if (GTK_IS_MENU_ITEM (proxy)) {
+		g_object_set_data (G_OBJECT (proxy), "action", action);
+		g_object_connect (proxy,
+			"signal::select",  G_CALLBACK (show_menu_tip_cb), Win,
+			"swapped_signal::deselect", G_CALLBACK (clear_menu_tip_cb), Win,
+			NULL);
+	}
+}
+
+static void disconnect_proxy_cb (GtkUIManager *ui, GtkAction *action, GtkWidget *proxy, gofficeWindow* Win)
+{
+	if (GTK_IS_MENU_ITEM (proxy)) {
+		g_object_set_data (G_OBJECT (proxy), "action", NULL);
+		g_object_disconnect (proxy,
+			"any_signal::select",  G_CALLBACK (show_menu_tip_cb), Win,
+			"any_signal::deselect", G_CALLBACK (clear_menu_tip_cb), Win,
+			NULL);
+	}
+}
+
+static GtkActionEntry entries[] = {
+  { "FileMenu", NULL, N_("_File") },
+	  { "Save", GTK_STOCK_SAVE, N_("_Save"), "<control>S",
+		  N_("Save the current figure"), G_CALLBACK (save_cb) },
+	  { "Close", GTK_STOCK_CLOSE, N_("_Close"), "<control>W",
+		  N_("Close the current figure"), G_CALLBACK (close_cb) },
+  { "EditMenu", NULL, N_("_Edit") },
+	  { "Undo", GTK_STOCK_UNDO, N_("_Undo"), "<control>Z",
+		  N_("Undo the last action"), G_CALLBACK (undo_cb) },
+	  { "Redo", GTK_STOCK_REDO, N_("_Redo"), "<shift><control>Z",
+		  N_("Redo the undone action"), G_CALLBACK (redo_cb) },
+	  { "Bounds", NULL, N_("_Component area bounds"), NULL,
+		  N_("Set explicit bounds to the displayed area of the embedded object"),
+		  G_CALLBACK (bounds_cb) },
+  { "HelpMenu", NULL, N_("_Help") },
+	  { "Help", GTK_STOCK_HELP, N_("_Contents"), "F1",
+		  N_("User manual"), G_CALLBACK (help_cb) },
+	  { "About", NULL, N_("_About"), NULL,
+		  N_("About Dr Geo..."), G_CALLBACK (about_cb) }
+};
+
+static const char *ui_description =
+"<ui>"
+"  <menubar name='MainMenu'>"
+"    <menu action='FileMenu'>"
+"      <menuitem action='Save'/>"
+"      <menuitem action='Close'/>"
+"    </menu>"
+"    <menu action='EditMenu'>"
+"      <menuitem action='Undo'/>"
+"      <menuitem action='Redo'/>"
+"	   <separator name='edit-sep1'/>"
+"      <menuitem action='Bounds'/>"
+"    </menu>"
+"    <menu action='HelpMenu'>"
+"      <menuitem action='Help'/>"
+"      <menuitem action='About'/>"
+"    </menu>"
+"  </menubar>"
+"  <toolbar name='MainToolbar'>"
+"    <toolitem action='Undo'/>"
+"    <toolitem action='Redo'/>"
+"  </toolbar>"
+"</ui>";
+
+gofficeWindow::gofficeWindow (gofficeMDI *mdi, GODrGeoComponent *component)
+{
+	GladeXML *xml;
+	GtkWidget *w, *vbox;
+	GtkActionGroup *action_group;
+	GtkAccelGroup *accel_group;
+	GError *error;
+	GdkPixbuf *icon;
+
+	m_component = component;
+	m_component->window = this;
+	m_mdi = mdi;
+	m_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_title (GTK_WINDOW (m_window), _("Dr Geo"));
+	gtk_window_resize (GTK_WINDOW (m_window), 640, 480);
+	g_object_connect (G_OBJECT (m_window),
+				"swapped_signal::focus-in-event", G_CALLBACK (focus_in_cb), this,
+				"swapped_signal::destroy", G_CALLBACK (destroy_cb), this,
+				NULL);
+	vbox = gtk_vbox_new (FALSE, 0); 
+	gtk_container_add (GTK_CONTAINER (m_window), vbox);
+
+	action_group = gtk_action_group_new ("MenuActions");
+	gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
+	gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), this);
+
+	m_UIManager = gtk_ui_manager_new ();
+	g_object_connect (m_UIManager,
+		"signal::connect_proxy",    G_CALLBACK (connect_proxy_cb), this,
+		"signal::disconnect_proxy", G_CALLBACK (disconnect_proxy_cb), this,
+		NULL);
+	gtk_ui_manager_insert_action_group (m_UIManager, action_group, 0);
+
+	accel_group = gtk_ui_manager_get_accel_group (m_UIManager);
+	gtk_window_add_accel_group (GTK_WINDOW (m_window), accel_group);
+	
+	error = NULL;
+	if (!gtk_ui_manager_add_ui_from_string (m_UIManager, ui_description, -1, &error)){
+		g_message ("building menus failed: %s", error->message);
+		g_error_free (error);
+		exit (EXIT_FAILURE);
+	}
+
+	w = gtk_ui_manager_get_widget (m_UIManager, "/MainMenu");
+	gtk_box_pack_start (GTK_BOX (vbox), w, false, false, 0);
+	w = gtk_ui_manager_get_widget (m_UIManager, "/MainToolbar");
+	gtk_toolbar_set_style(GTK_TOOLBAR (w), GTK_TOOLBAR_ICONS);
+	gtk_toolbar_set_show_arrow(GTK_TOOLBAR (w), false);
+	gtk_toolbar_set_tooltips(GTK_TOOLBAR (w), true);
+	gtk_box_pack_start (GTK_BOX (vbox), w, false, false, 0);
+
+	if (component->figure) {
+		// Duplicate the figure
+		xmlDocPtr doc = xmlNewDoc((xmlChar*)"1.0");
+		doc->children =  xmlNewDocNode (doc, NULL, (xmlChar*) "drgenius", NULL);
+		component->figure->saveAs (doc->children, "embedded");
+		m_view = new geoView (doc->children->children);
+		xmlFreeDoc (doc);
+	} else
+		m_view = new geoView (NULL);
+	gtk_box_pack_start_defaults (GTK_BOX (vbox), m_view->widgetView ());
+	m_status_bar = gtk_statusbar_new ();	
+	m_statusId = gtk_statusbar_get_context_id (GTK_STATUSBAR (m_status_bar), "status");
+	gtk_box_pack_start (GTK_BOX (vbox), m_status_bar, false, false, 0);
+	icon = gdk_pixbuf_new_from_file (DRGEO_GLADEDIR"/drgeo.png", &error);
+	if (error) {
+		g_message ("error while loading icon file: %s", error->message);
+		g_error_free (error);
+	} else {
+		gtk_window_set_icon (GTK_WINDOW (m_window), icon);
+		g_object_unref (icon);
+	}
+	gtk_widget_show_all (m_window);
+	m_boundsDlg = NULL;
+}
+
+gofficeWindow::~gofficeWindow ()
+{
+	if (!m_component->figure)
+		go_component_emit_changed (GO_COMPONENT (m_component));
+	m_component->window = NULL;
+	delete m_view;
+	if (m_boundsDlg)
+		m_boundsDlg->Destroy ();
+}
+
+void gofficeWindow::Save ()
+{
+	if (m_component->figure)
+		delete m_component->figure;
+	xmlDocPtr doc = xmlNewDoc((xmlChar*)"1.0");
+	doc->children =  xmlNewDocNode (doc, NULL, (xmlChar*) "drgenius", NULL);
+	m_view->figure ()->saveAs (doc->children, "embedded");
+  	m_component->figure = new drgeoFigure (doc->children->children);
+	m_component->figure->setDrawable (NULL);
+	xmlFreeDoc (doc);
+	go_component_emit_changed (GO_COMPONENT (m_component));
+}
+
+void gofficeWindow::Close ()
+{
+	Destroy ();
+}
+
+void gofficeWindow::Undo ()
+{
+}
+
+void gofficeWindow::Redo ()
+{
+}
+
+void gofficeWindow::Bounds ()
+{
+	if (!m_boundsDlg)
+	 m_boundsDlg = new drgeoAreaBoundsDlg (m_component, this);
+}
+
+void gofficeWindow::ClearStatus()
+{
+	gtk_statusbar_pop (GTK_STATUSBAR (m_status_bar), m_statusId);
+}
+
+void gofficeWindow::SetStatusText(const char* text)
+{
+	gtk_statusbar_push (GTK_STATUSBAR (m_status_bar), m_statusId, text);
+}
+
+void gofficeWindow::Destroy ()
+{
+	gtk_widget_destroy (m_window);
+}
diff --git a/goffice/goffice_window.h b/goffice/goffice_window.h
new file mode 100644
index 0000000..086c434
--- /dev/null
+++ b/goffice/goffice_window.h
@@ -0,0 +1,60 @@
+/* 
+ * DrGeo GOffice component
+ * goffice_window.cc
+ *
+ * Copyright (C) 2006 Jean Bréfort <jean brefort normalesup org>
+ *
+ * This program is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU General Public License as 
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ */
+
+#ifndef GOFFICE_WINDOW_H
+#define GOFFICE_WINDOW_H
+
+#include "drgeo_impl.h"
+#include "goffice_mdi.h"
+
+class geoView;
+class drgeoAreaBoundsDlg;
+
+class gofficeWindow
+{
+public:
+	gofficeWindow (gofficeMDI *mdi, GODrGeoComponent *component);
+	~gofficeWindow ();
+
+	void setActive () {m_mdi->setActiveWindow (this);}
+	void Save ();
+	void Close ();
+	void Undo ();
+	void Redo ();
+	void Bounds ();
+	void ClearStatus();
+	void SetStatusText(const char* text);
+	void Destroy ();
+	GtkWindow *getWindow () {return GTK_WINDOW (m_window);}
+	void notifyBoundsDlgDestroyed () {m_boundsDlg = NULL;}
+
+private:
+	GODrGeoComponent *m_component;
+	gofficeMDI *m_mdi;
+	geoView *m_view;
+	GtkWidget *m_status_bar, *m_window;
+	GtkUIManager *m_UIManager;
+	unsigned m_statusId;
+	drgeoAreaBoundsDlg *m_boundsDlg;
+};
+
+#endif /* GOFFICE_WINDOW_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]