Index: client/gui-gtk-2.0/editprop.c
===================================================================
--- client/gui-gtk-2.0/editprop.c	(révision 17059)
+++ client/gui-gtk-2.0/editprop.c	(copie de travail)
@@ -337,6 +337,7 @@
 struct objprop {
   int id;
   const char *name;
+  const char *tooltip;
   int flags;
   int valtype;
   int column_id;
@@ -348,11 +349,13 @@
 
 static struct objprop *objprop_new(int id,
                                    const char *name,
+                                   const char *tooltip,
                                    int flags,
                                    int valtype,
                                    struct property_page *parent);
 static int objprop_get_id(const struct objprop *op);
 static const char *objprop_get_name(const struct objprop *op);
+static const char *objprop_get_tooltip(const struct objprop *op);
 static int objprop_get_valtype(const struct objprop *op);
 static struct property_page *objprop_get_property_page(const struct objprop *op);
 
@@ -2420,6 +2423,17 @@
 }
 
 /****************************************************************************
+  Return a description (translated) of the property.
+****************************************************************************/
+static const char *objprop_get_tooltip(const struct objprop *op)
+{
+  if (!op) {
+    return NULL;
+  }
+  return op->tooltip;
+}
+
+/****************************************************************************
   Create and return a cell renderer corresponding to this object property,
   suitable to be used with a tree view. May return NULL if this object
   property cannot exist in a list store.
@@ -2522,8 +2536,7 @@
 ****************************************************************************/
 static void objprop_setup_widget(struct objprop *op)
 {
-  GtkWidget *w = NULL;
-  GtkWidget *hbox, *hbox2, *label, *image, *entry, *spin, *button;
+  GtkWidget *ebox, *hbox, *hbox2, *label, *image, *entry, *spin, *button;
   struct extviewer *ev = NULL;
   int propid;
 
@@ -2535,9 +2548,11 @@
     return;
   }
 
+  ebox = gtk_event_box_new();
+  op->widget = ebox;
+
   hbox = gtk_hbox_new(TRUE, 4);
-  w = hbox;
-  op->widget = w;
+  gtk_container_add(GTK_CONTAINER(ebox), hbox);
 
   label = gtk_label_new(NULL);
   gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
@@ -2995,6 +3010,7 @@
 ****************************************************************************/
 static struct objprop *objprop_new(int id,
                                    const char *name,
+                                   const char *tooltip,
                                    int flags,
                                    int valtype,
                                    struct property_page *parent)
@@ -3004,6 +3020,7 @@
   op = fc_calloc(1, sizeof(*op));
   op->id = id;
   op->name = name;
+  op->tooltip = tooltip;
   op->flags = flags;
   op->valtype = valtype;
   op->column_id = -1;
@@ -3710,121 +3727,126 @@
 static void property_page_setup_objprops(struct property_page *pp)
 {
 
-#define ADDPROP(ARG_id, ARG_name, ARG_flags, ARG_valtype) do {\
-  struct objprop *MY_op = objprop_new(ARG_id, ARG_name,\
-                                      ARG_flags, ARG_valtype, pp);\
-  hash_insert(pp->objprop_table, FC_INT_TO_PTR(MY_op->id), MY_op);\
+#define ADDPROP(ARG_id, ARG_name, ARG_tooltip, ARG_flags, ARG_valtype) do { \
+  struct objprop *MY_op = objprop_new(ARG_id, ARG_name, ARG_tooltip,        \
+                                      ARG_flags, ARG_valtype, pp);          \
+  hash_insert(pp->objprop_table, FC_INT_TO_PTR(MY_op->id), MY_op);          \
 } while (0)
 
   switch (property_page_get_objtype(pp)) {
 
   case OBJTYPE_TILE:
-    ADDPROP(OPID_TILE_IMAGE, _("Image"),
+    ADDPROP(OPID_TILE_IMAGE, _("Image"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_PIXBUF);
-    ADDPROP(OPID_TILE_TERRAIN, _("Terrain"),
+    ADDPROP(OPID_TILE_TERRAIN, _("Terrain"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_TILE_RESOURCE, _("Resource"),
+    ADDPROP(OPID_TILE_RESOURCE, _("Resource"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_TILE_INDEX, _("Index"),
+    ADDPROP(OPID_TILE_INDEX, _("Index"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_TILE_X, Q_("?coordinate:X"),
+    ADDPROP(OPID_TILE_X, Q_("?coordinate:X"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_TILE_Y, Q_("?coordinate:Y"),
+    ADDPROP(OPID_TILE_Y, Q_("?coordinate:Y"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
     /* TRANS: The coordinate X in native coordinates.
      * The freeciv coordinate system is described in doc/HACKING. */
-    ADDPROP(OPID_TILE_NAT_X, _("NAT X"),
+    ADDPROP(OPID_TILE_NAT_X, _("NAT X"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
     /* TRANS: The coordinate Y in native coordinates.
      * The freeciv coordinate system is described in doc/HACKING. */
-    ADDPROP(OPID_TILE_NAT_Y, _("NAT Y"),
+    ADDPROP(OPID_TILE_NAT_Y, _("NAT Y"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_TILE_CONTINENT, _("Continent"),
+    ADDPROP(OPID_TILE_CONTINENT, _("Continent"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_TILE_XY, Q_("?coordinates:X,Y"),
+    ADDPROP(OPID_TILE_XY, Q_("?coordinates:X,Y"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_TILE_SPECIALS, _("Specials"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BV_SPECIAL);
-    ADDPROP(OPID_TILE_BASES, _("Bases"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BV_BASES);
-    ADDPROP(OPID_TILE_ADDRESS, _("Address"),
+    ADDPROP(OPID_TILE_SPECIALS, _("Specials"),  NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE,
+            VALTYPE_BV_SPECIAL);
+    ADDPROP(OPID_TILE_BASES, _("Bases"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE,
+            VALTYPE_BV_BASES);
+    ADDPROP(OPID_TILE_ADDRESS, _("Address"), NULL /* _("FIXME") */,
             OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_TILE_VISION, _("Vision"),
+    ADDPROP(OPID_TILE_VISION, _("Vision"), NULL /* _("FIXME") */,
             OPF_HAS_WIDGET, VALTYPE_TILE_VISION_DATA);
     break;
 
   case OBJTYPE_UNIT:
-    ADDPROP(OPID_UNIT_IMAGE, _("Image"),
+    ADDPROP(OPID_UNIT_IMAGE, _("Image"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_PIXBUF);
-    ADDPROP(OPID_UNIT_ADDRESS, _("Address"),
+    ADDPROP(OPID_UNIT_ADDRESS, _("Address"), NULL /* _("FIXME") */,
             OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_UNIT_TYPE, _("Type"),
+    ADDPROP(OPID_UNIT_TYPE, _("Type"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_UNIT_ID, _("ID"),
+    ADDPROP(OPID_UNIT_ID, _("ID"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_UNIT_XY, Q_("?coordinates:X,Y"),
+    ADDPROP(OPID_UNIT_XY, Q_("?coordinates:X,Y"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_UNIT_MOVES_LEFT, _("Moves Left"),
+    ADDPROP(OPID_UNIT_MOVES_LEFT, _("Moves Left"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_UNIT_FUEL, _("Fuel"),
+    ADDPROP(OPID_UNIT_FUEL, _("Fuel"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_UNIT_MOVED, _("Moved"),
+    ADDPROP(OPID_UNIT_MOVED, _("Moved"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
-    ADDPROP(OPID_UNIT_DONE_MOVING, _("Done Moving"),
+    ADDPROP(OPID_UNIT_DONE_MOVING, _("Done Moving"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
     /* TRANS: HP = Hit Points of a unit. */
-    ADDPROP(OPID_UNIT_HP, _("HP"),
+    ADDPROP(OPID_UNIT_HP, _("HP"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_UNIT_VETERAN, _("Veteran"),
+    ADDPROP(OPID_UNIT_VETERAN, _("Veteran"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
     break;
 
   case OBJTYPE_CITY:
-    ADDPROP(OPID_CITY_IMAGE, _("Image"),
+    ADDPROP(OPID_CITY_IMAGE, _("Image"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_PIXBUF);
-    ADDPROP(OPID_CITY_NAME, _("Name"),
+    ADDPROP(OPID_CITY_NAME, _("Name"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
-    ADDPROP(OPID_CITY_ADDRESS, _("Address"),
+    ADDPROP(OPID_CITY_ADDRESS, _("Address"), NULL /* _("FIXME") */,
             OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_CITY_ID, _("ID"),
+    ADDPROP(OPID_CITY_ID, _("ID"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_INT);
-    ADDPROP(OPID_CITY_XY, Q_("?coordinates:X,Y"),
+    ADDPROP(OPID_CITY_XY, Q_("?coordinates:X,Y"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_CITY_SIZE, _("Size"),
+    ADDPROP(OPID_CITY_SIZE, _("Size"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_CITY_BUILDINGS, _("Buildings"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BUILT_ARRAY);
-    ADDPROP(OPID_CITY_FOOD_STOCK, _("Food Stock"),
+    ADDPROP(OPID_CITY_BUILDINGS, _("Buildings"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE,
+            VALTYPE_BUILT_ARRAY);
+    ADDPROP(OPID_CITY_FOOD_STOCK, _("Food Stock"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_CITY_SHIELD_STOCK, _("Shield Stock"),
+    ADDPROP(OPID_CITY_SHIELD_STOCK, _("Shield Stock"), NULL /* _("FIXME") */,
             OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
     break;
 
   case OBJTYPE_PLAYER:
-    ADDPROP(OPID_PLAYER_NAME, _("Name"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
-    ADDPROP(OPID_PLAYER_ADDRESS, _("Address"),
+    ADDPROP(OPID_PLAYER_NAME, _("Name"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
+    ADDPROP(OPID_PLAYER_ADDRESS, _("Address"), NULL /* _("FIXME") */,
             OPF_HAS_WIDGET, VALTYPE_STRING);
-    ADDPROP(OPID_PLAYER_NATION, _("Nation"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_NATION);
-    ADDPROP(OPID_PLAYER_INVENTIONS, _("Inventions"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INVENTIONS_ARRAY);
-    ADDPROP(OPID_PLAYER_GOLD, _("Gold"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
+    ADDPROP(OPID_PLAYER_NATION, _("Nation"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_NATION);
+    ADDPROP(OPID_PLAYER_INVENTIONS, _("Inventions"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE,
+            VALTYPE_INVENTIONS_ARRAY);
+    ADDPROP(OPID_PLAYER_GOLD, _("Gold"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
     break;
 
   case OBJTYPE_GAME:
-    ADDPROP(OPID_GAME_YEAR, _("Year"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
-    ADDPROP(OPID_GAME_SCENARIO, _("Scenario"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
-    ADDPROP(OPID_GAME_SCENARIO_NAME, _("Scenario Name"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
+    ADDPROP(OPID_GAME_YEAR, _("Year"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_INT);
+    ADDPROP(OPID_GAME_SCENARIO, _("Scenario"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
+    ADDPROP(OPID_GAME_SCENARIO_NAME, _("Scenario Name"), NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
     ADDPROP(OPID_GAME_SCENARIO_DESC, _("Scenario Description"),
-            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE,
-            VALTYPE_STRING);
-    ADDPROP(OPID_GAME_SCENARIO_PLAYERS, _("Save Players"), OPF_IN_LISTVIEW
-            | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
+            NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_STRING);
+    ADDPROP(OPID_GAME_SCENARIO_PLAYERS, _("Save Players"),
+            NULL /* _("FIXME") */,
+            OPF_IN_LISTVIEW | OPF_HAS_WIDGET | OPF_EDITABLE, VALTYPE_BOOL);
     break;
 
   default:
@@ -3974,7 +3996,7 @@
   int num_columns = 0;
   GType *gtype_array;
   int col_id = 1;
-  const char *attr_type_str, *name;
+  const char *attr_type_str, *name, *tooltip;
   char title[64];
 
   if (!(0 <= objtype && objtype < NUM_OBJTYPES)) {
@@ -4203,6 +4225,10 @@
       continue;
     }
     gtk_box_pack_start(GTK_BOX(vbox2), w, FALSE, FALSE, 0);
+    tooltip = objprop_get_tooltip(op);
+    if (NULL != tooltip) {
+      gtk_tooltips_set_tip(pp->tooltips, w, tooltip, NULL);
+    }
   } property_page_objprop_iterate_end;
 
   hbox2 = gtk_hbox_new(FALSE, 4);
