Ejemplo n.º 1
0
//
// Custom the tooltip
//
static gboolean qq_tray_on_show_tooltip(GtkWidget* widget
                                            , int x
                                            , int y
                                            , gboolean keybord_mode
                                            , GtkTooltip* tip
                                            , gpointer data)
{
    GdkPixbuf *pb;
    if(info -> me -> qqnumber == NULL || info -> me -> qqnumber -> len <=0){
        // Not login. 
        pb = gdk_pixbuf_new_from_file_at_size(IMGDIR"/webqq_icon.png"
                                                , 35, 35, NULL);
        gtk_tooltip_set_markup(tip, "<b>GtkQQ</b>"); 
        gtk_tooltip_set_icon(tip, pb);
        g_object_unref(pb);
        return TRUE;
    }
    gchar buf[500];
    g_snprintf(buf, 500, CONFIGDIR"/faces/%s", info -> me -> qqnumber -> str);
    pb = gdk_pixbuf_new_from_file_at_size(buf, 35, 35, NULL);
    gtk_tooltip_set_icon(tip, pb);
    g_object_unref(pb);
    g_snprintf(buf, 500, "<b>%s</b><span color='blue'>(%s)</span>"
                                    , info -> me -> nick -> str
                                    , info -> me -> qqnumber -> str);
    gtk_tooltip_set_markup(tip, buf); 
    return TRUE;
}
Ejemplo n.º 2
0
/**
 * \internal
 */
gboolean __category_edit_on_query_tooltip(GtkTreeView * tree_view, GtkTooltip * tooltip,
        GtkTreeIter * iter, GtkTreeViewColumn * column,
        CategoryEdit * category_edit)
{
    gchar *stock;
    gtk_tree_model_get(GTK_TREE_MODEL(GEBR_GUI_SEQUENCE_EDIT(category_edit)->list_store), iter,
                       1, &stock, -1);
    if (stock == NULL)
        return FALSE;
    if (gtk_tree_view_column_get_sort_column_id(column) != 1)
        return FALSE;

    gchar *name;
    gtk_tree_model_get(GTK_TREE_MODEL(GEBR_GUI_SEQUENCE_EDIT(category_edit)->list_store), iter,
                       0, &name, -1);
    GebrValidateCase *validate_case = gebr_validate_get_validate_case(GEBR_VALIDATE_CASE_CATEGORY);
    GString *tooltip_string = g_string_new("");
    gboolean can_fix;
    gchar *fixes = gebr_validate_case_automatic_fixes_msg(validate_case, name, &can_fix);
    g_string_printf(tooltip_string, "%s\n\n%s", gebr_validate_case_get_message (validate_case), fixes);
    g_free(fixes);
    gtk_tooltip_set_markup(tooltip, tooltip_string->str);
    g_string_free(tooltip_string, TRUE);

    g_free(stock);
    g_free(name);

    return TRUE;
}
Ejemplo n.º 3
0
static gboolean cm_tree_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode,
                                      GtkTooltip *tooltip, CookieManagerPage *cmp)
{
    GtkTreeIter iter;
    GtkTreeModel *model;

    if (gtk_tree_view_get_tooltip_context(GTK_TREE_VIEW(widget), &x, &y,
                                          keyboard_mode, &model, NULL, &iter))
    {
        gchar *tooltip_text;
        SoupCookie *cookie;

        gtk_tree_model_get(model, &iter, COOKIE_MANAGER_COL_COOKIE, &cookie, -1);

        if (cookie == NULL) /* not an item */
            return FALSE;

        tooltip_text = cm_get_cookie_description_text(cookie);

        gtk_tooltip_set_markup(tooltip, tooltip_text);

        g_free(tooltip_text);

        return TRUE;
    }

    return FALSE;
}
Ejemplo n.º 4
0
static gboolean
query_tooltip_drawing_area_cb (GtkWidget  *widget,
			       gint        x,
			       gint        y,
			       gboolean    keyboard_tip,
			       GtkTooltip *tooltip,
			       gpointer    data)
{
  gint i;

  if (keyboard_tip)
    return FALSE;

  for (i = 0; i < G_N_ELEMENTS (rectangles); i++)
    {
      struct Rectangle *r = &rectangles[i];

      if (r->x < x && x < r->x + 50
	  && r->y < y && y < r->y + 50)
        {
	  gtk_tooltip_set_markup (tooltip, r->tooltip);
	  return TRUE;
	}
    }

  return FALSE;
}
static gboolean
wp_view_tooltip_cb (GtkWidget  *widget,
                    gint x,
                    gint y,
                    gboolean keyboard_mode,
                    GtkTooltip *tooltip,
                    AppearanceData *data)
{
  GtkTreeIter iter;
  MateWPItem *item;

  if (gtk_icon_view_get_tooltip_context (data->wp_view,
                                         &x, &y,
                                         keyboard_mode,
                                         NULL,
                                         NULL,
                                         &iter))
    {
      gtk_tree_model_get (data->wp_model, &iter, 1, &item, -1);
      gtk_tooltip_set_markup (tooltip, item->description);

      return TRUE;
    }

  return FALSE;
}
Ejemplo n.º 6
0
static gboolean
bidding_query_tooltip (GtkWidget *widget, gint x, gint y, gboolean keyboard_mode,
		GtkTooltip *tooltip, window_board_t *bidding_store)
{
	if (keyboard_mode) {
		printf ("FIXME: keyboard usage\n");
		return FALSE;
	}
	GtkTreeIter iter;
	gboolean ret = gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (widget),
			&x, &y, keyboard_mode, NULL, NULL, &iter);
	if (!ret) {
		gtk_tooltip_set_text (tooltip, NULL);
		// TODO: don't show anything at all, or something interesting
		// y<0 -> headings
		return TRUE;
	}

	int i;
	int width = 0;
	for (i = 0; i < 4; i++) {
		width += gtk_tree_view_column_get_width (win->bidding_column[i]);
		// TODO: cache this, or use gtk_tree_view_get_path_at_pos
		if (x < width)
			break;
	}
	assert (i < 4);

	gchar *alert;
	gtk_tree_model_get (GTK_TREE_MODEL (win->bidding_store), &iter, 2 * i + 1, &alert, -1);
	gtk_tooltip_set_markup (tooltip, !alert || *alert ? alert : _("(no explanation)"));
	return TRUE;
}
Ejemplo n.º 7
0
static gboolean
treeview_query_tooltip (GtkWidget  *widget,
			gint        x,
			gint        y,
			gboolean    keyboard_tip,
			GtkTooltip *tooltip,
			gpointer    data)
{
	GtkTreeIter iter;
	GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
	GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
	GtkTreePath *path = NULL;
	gpointer *tab;
	gchar *tip;

	if (keyboard_tip)
	{
		gtk_tree_view_get_cursor (tree_view, &path, NULL);

		if (path == NULL)
		{
			return FALSE;
		}
	}
	else
	{
		gint bin_x, bin_y;

		gtk_tree_view_convert_widget_to_bin_window_coords (tree_view,
								   x, y,
								   &bin_x, &bin_y);

		if (!gtk_tree_view_get_path_at_pos (tree_view,
						    bin_x, bin_y,
						    &path,
						    NULL, NULL, NULL))
		{
			return FALSE;
		}
	}

	gtk_tree_model_get_iter (model, &iter, path);
	gtk_tree_model_get (model,
			    &iter,
			    TAB_COLUMN,
			    &tab,
			    -1);

	tip = _pluma_tab_get_tooltips (PLUMA_TAB (tab));
	gtk_tooltip_set_markup (tooltip, tip);

	g_free (tip);
	gtk_tree_path_free (path);

	return TRUE;
}
Ejemplo n.º 8
0
static gboolean canvas_tooltip(GtkWidget *widget, gint x, gint y,
    gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data)
{
	struct coord pos = canvas_to_coord(x, y);
	const char *res;

	res = tool_tip(pos);
	if (!res)
		return FALSE;
	gtk_tooltip_set_markup(tooltip, res);
	return TRUE;
}
Ejemplo n.º 9
0
static void
gtk_tooltip_reset (GtkTooltip *tooltip)
{
  gtk_tooltip_set_markup (tooltip, NULL);
  gtk_tooltip_set_icon (tooltip, NULL);
  gtk_tooltip_set_tip_area (tooltip, NULL);

  /* See if the custom widget is again set from the query-tooltip
   * callback.
   */
  tooltip->custom_was_reset = FALSE;
}
Ejemplo n.º 10
0
//
// Group list tool tip
//
static gboolean qq_group_list_on_show_tooltip(GtkWidget* widget
                                            , int x
                                            , int y
                                            , gboolean keybord_mode
                                            , GtkTooltip* tip
                                            , gpointer data)
{
    gchar *name, *code;
	GtkTreeView *tree = GTK_TREE_VIEW(widget);
    GtkTreeModel *model = gtk_tree_view_get_model(tree); 
    GtkTreePath *path;
    GtkTreeIter iter;

	if(!gtk_tree_view_get_tooltip_context(tree , &x , &y , keybord_mode
						, &model , &path , &iter)){
		return FALSE;
    }
    gtk_tree_model_get(model, &iter
                        , BDY_LIST_NAME, &name
                        , BDY_LIST_UIN, &code
                        , -1);
    QQGroup *grp = qq_info_lookup_group_by_code(info, code);
    if(grp == NULL){
        gtk_tree_path_free(path);
        g_free(name);
        g_free(code);
        return FALSE;
    }

    gchar buf[100];
    const gchar *levelstr = NULL;
    gint tmpint = (gint)strtol(grp -> level -> str, NULL, 10);
    switch(tmpint)
    {
    case 0:
        levelstr = "普通群";
        break;
    case 1:
        levelstr = "高级群";
        break;
    default:
        levelstr = "";
        break;
    }
    g_snprintf(buf, 100, "%s - %s", name, levelstr);
    gtk_tooltip_set_markup(tip, buf);
    gtk_tree_view_set_tooltip_row(tree, tip, path);

    gtk_tree_path_free(path);
    g_free(name);
    g_free(code);
    return TRUE;
}
Ejemplo n.º 11
0
static gboolean
query_tooltip_cb (GtkWidget  *widget,
		  gint        x,
		  gint        y,
		  gboolean    keyboard_tip,
		  GtkTooltip *tooltip,
		  gpointer    data)
{
  gtk_tooltip_set_markup (tooltip, gtk_button_get_label (GTK_BUTTON (widget)));
  gtk_tooltip_set_icon_from_icon_name (tooltip, "edit-delete",
                                       GTK_ICON_SIZE_MENU);

  return TRUE;
}
Ejemplo n.º 12
0
static gboolean
query_tooltip__ (GtkWidget  *widget,
			gint        x,
			gint        y,
			gboolean    keyboard_mode,
			GtkTooltip *tooltip,
			gpointer    user_data)
{
	GtkTreePath *path;
	GtkTreeModel *model;
	switch((char)(long)user_data) {
	case 'i':
	{
		GtkIconView *view = GTK_ICON_VIEW (widget);
		if (!gtk_icon_view_get_tooltip_context (view, &x, &y, keyboard_mode, NULL, &path, NULL))
			return FALSE;
		model = gtk_icon_view_get_model (view);
		break;
	}
	case 't':
	{
		GtkTreeView *view = GTK_TREE_VIEW (widget);
		if (!gtk_tree_view_get_tooltip_context (view, &x, &y, keyboard_mode, NULL, &path, NULL))
			return FALSE;
		model = gtk_tree_view_get_model (view);
		break;
	}
	default:
		return FALSE;
	}
	int id = get_id__(model, path);
	if(id <= 0)
		return FALSE;

	callback_item___* si = callback_item__(id);
	if(si->tooltip_.size() > 0) {
		gtk_tooltip_set_markup (tooltip, si->tooltip_.c_str());
		return TRUE;
	}
	return FALSE;
}
Ejemplo n.º 13
0
static gboolean
query_tooltip_tree_view_cb (GtkWidget  *widget,
			    gint        x,
			    gint        y,
			    gboolean    keyboard_tip,
			    GtkTooltip *tooltip,
			    gpointer    data)
{
  GtkTreeIter iter;
  GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
  GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
  GtkTreePath *path = NULL;
  gchar *tmp;
  gchar *pathstring;

  char buffer[512];

  if (!gtk_tree_view_get_tooltip_context (tree_view, &x, &y,
					  keyboard_tip,
					  &model, &path, &iter))
    return FALSE;

  gtk_tree_model_get (model, &iter, 0, &tmp, -1);
  pathstring = gtk_tree_path_to_string (path);

  g_snprintf (buffer, 511, "<b>Path %s:</b> %s", pathstring, tmp);
  gtk_tooltip_set_markup (tooltip, buffer);

  gtk_tree_view_set_tooltip_row (tree_view, tooltip, path);

  gtk_tree_path_free (path);
  g_free (pathstring);
  g_free (tmp);

  return TRUE;
}
Ejemplo n.º 14
0
static gboolean
git_source_view_query_tooltip (GtkWidget *widget,
                               gint x, gint y,
                               gboolean keyboard_tooltip,
                               GtkTooltip *tooltip)
{
  GitSourceView *sview = (GitSourceView *) widget;
  GitSourceViewPrivate *priv = sview->priv;
  gint line_num, num_lines;
  gboolean ret = TRUE;
  GString *markup;
  const gchar *part;
  gchar *part_markup;
  const GitAnnotatedSourceLine *line;
  GitCommit *commit;

  if (priv->line_height < 1 || priv->paint_source == NULL)
    return FALSE;

  num_lines = git_annotated_source_get_n_lines (priv->paint_source);

  line_num = (y + priv->y_offset) / priv->line_height;

  if (x < 0 || x >= priv->max_hash_length
      || line_num < 0 || line_num >= num_lines)
    return FALSE;

  line = git_annotated_source_get_line (priv->paint_source, line_num);
  commit = line->commit;

  markup = g_string_new ("");

  if ((part = git_commit_get_prop (commit, "author")))
    {
      part_markup = g_markup_printf_escaped ("<b>%s</b>", part);
      g_string_append (markup, part_markup);
      g_free (part_markup);
    }
  if ((part = git_commit_get_prop (commit, "author-mail")))
    {
      if (markup->len > 0)
        g_string_append_c (markup, ' ');
      part_markup = g_markup_escape_text (part, -1);
      g_string_append (markup, part_markup);
      g_free (part_markup);
    }
  if ((part = git_commit_get_prop (commit, "author-time")))
    {
      GTimeVal time_;
      char *tail;

      errno = 0;
      time_.tv_sec = strtol (part, &tail, 10);
      time_.tv_usec = 0;

      if (errno == 0 && *tail == '\0')
        {
          gchar *display_time;

          if (markup->len > 0)
            g_string_append_c (markup, '\n');

          display_time = git_format_time_for_display (&time_);
          part_markup = g_markup_escape_text (display_time, -1);
          g_free (display_time);
          g_string_append (markup, part_markup);
          g_free (part_markup);
        }
    }
  if ((part = git_commit_get_prop (commit, "summary")))
    {
      gchar *stripped_part;

      if (markup->len > 0)
        g_string_append_c (markup, '\n');

      while (*part && isspace (*part))
        part++;
      stripped_part = g_strdup (part);
      g_strchomp (stripped_part);

      part_markup = g_markup_printf_escaped ("<i>%s</i>", stripped_part);
      g_free (stripped_part);
      g_string_append (markup, part_markup);
      g_free (part_markup);
    }

  if (markup->len > 0)
    {
      GdkRectangle tip_area;

      tip_area.x = 0;
      tip_area.y = line_num * priv->line_height - priv->y_offset;
      tip_area.width = priv->max_hash_length;
      tip_area.height = priv->line_height;
      gtk_tooltip_set_markup (tooltip, markup->str);
      gtk_tooltip_set_tip_area (tooltip, &tip_area);
    }
  else
    ret = FALSE;

  g_string_free (markup, TRUE);

  return ret;
}
Ejemplo n.º 15
0
static gboolean
treeview_query_tooltip (GtkWidget           *widget,
			gint                 x,
			gint                 y,
			gboolean             keyboard_tip,
			GtkTooltip          *tooltip,
			GeditDocumentsPanel *panel)
{
	GtkTreeIter iter;
	GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
	GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
	GtkTreePath *path = NULL;
	GeditNotebook *notebook;
	GeditTab *tab;
	gchar *tip;

	gedit_debug (DEBUG_PANEL);

	if (keyboard_tip)
	{
		gtk_tree_view_get_cursor (tree_view, &path, NULL);

		if (path == NULL)
		{
			return FALSE;
		}
	}
	else
	{
		gint bin_x, bin_y;

		gtk_tree_view_convert_widget_to_bin_window_coords (tree_view,
								   x, y,
								   &bin_x, &bin_y);

		if (!gtk_tree_view_get_path_at_pos (tree_view,
						    bin_x, bin_y,
						    &path,
						    NULL, NULL, NULL))
		{
			return FALSE;
		}
	}

	gtk_tree_model_get_iter (model, &iter, path);
	gtk_tree_model_get (model,
			    &iter,
			    NOTEBOOK_COLUMN, &notebook,
			    TAB_COLUMN, &tab,
			    -1);

	if (tab != NULL)
	{
		tip = _gedit_tab_get_tooltip (tab);
		g_object_unref (tab);
	}
	else
	{
		tip = notebook_get_tooltip (panel->priv->mnb, notebook);
	}

	gtk_tooltip_set_markup (tooltip, tip);

	g_object_unref (notebook);
	g_free (tip);
	gtk_tree_path_free (path);

	return TRUE;
}
Ejemplo n.º 16
0
Archivo: gnac-ui.c Proyecto: GNOME/gnac
static gboolean
gnac_ui_query_tooltip_cb(GtkStatusIcon *status_icon,
                         gint           x,
                         gint           y,
                         gboolean       keyboard_mode,
                         GtkTooltip    *tooltip,
                         gpointer       user_data)
{
  GError *error = NULL;
  GFile *tooltip_file = g_file_new_for_uri(tooltip_path);
  LibgnacTags *tags = libgnac_metadata_extract(metadata, tooltip_file, &error);
  if (error) {
    libgnac_debug("Failed to extract metadata for %s: %s",
        tooltip_path, error->message);
    g_clear_error(&error);
  }
  g_object_unref(tooltip_file);

  const gchar *album = libgnac_metadata_tag_exists(tags, GST_TAG_ALBUM) ?
      g_value_get_string(LIBGNAC_METADATA_TAG_ALBUM(tags)) : NULL;
  const gchar *artist = libgnac_metadata_tag_exists(tags, GST_TAG_ARTIST) ?
      g_value_get_string(LIBGNAC_METADATA_TAG_ARTIST(tags)) : NULL;
  const gchar *title = libgnac_metadata_tag_exists(tags, GST_TAG_TITLE) ?
      g_value_get_string(LIBGNAC_METADATA_TAG_TITLE(tags)) : NULL;

  gchar *text;

  if (title)
  {
    text = g_markup_printf_escaped("  <b>%s</b>  \n"
        "  <span color=\"#888\">%s</span> %s  \n"
        "  <span color=\"#888\">%s</span> %s  ",
        title,
        /* Translators: title by artist from album */
        _("by"), artist ? artist : _("Unknown Artist"),
        /* Translators: title by artist from album */
        _("from"), album ? album : _("Unknown Album"));
  }
  else
  {
    gchar *name = gnac_utils_get_display_name(tooltip_path, NULL);
    if (name) {
      text = g_markup_printf_escaped("  <b>%s</b>  ", name);
    } else {
      text = g_strdup(tooltip_path);
    }
    g_free(name);
  }

  gtk_tooltip_set_markup(tooltip, text);
  g_free(text);

  /* check wether we have a cover to display */
  if (libgnac_metadata_tag_exists(tags, GST_TAG_IMAGE)) {
    GdkPixbuf *pixbuf = g_value_get_object(LIBGNAC_METADATA_TAG_IMAGE(tags));
    pixbuf = gnac_ui_utils_scale_pixbuf(pixbuf, 64, 64);
    pixbuf = gnac_ui_utils_add_border_to_pixbuf(pixbuf);
    gtk_tooltip_set_icon(tooltip, pixbuf);
    g_object_unref(pixbuf);
  }

  return TRUE;
}
Ejemplo n.º 17
0
static gboolean
on_log_view_query_tooltip (GtkWidget *log_view, gint x, gint y,
                           gboolean keyboard_mode, GtkTooltip *tooltip,
                           GitLogPane *self)
{
	gboolean ret;
	GtkTreeViewColumn *ref_icon_column;
	gint bin_x;
	gint bin_y;
	GtkTreeViewColumn *current_column;
	GtkTreePath *path;
	GtkTreeModel *model;
	GtkTreeIter iter;
	GitRevision *revision;
	gchar *sha;
	GList *ref_list;
	GList *current_ref;
	GString *tooltip_string;
	gchar *ref_name;
	GitRefType ref_type;
	
	ret = FALSE;
	
	ref_icon_column = gtk_tree_view_get_column (GTK_TREE_VIEW (log_view), 0);
	
	gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (log_view),
													   x, y, &bin_x, &bin_y);
	if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (log_view), bin_x, 
									   bin_y, &path, &current_column, NULL, 
	                                   NULL))
	{
		/* We need to be in the ref icon column */
		if (current_column == ref_icon_column)
		{
			model = gtk_tree_view_get_model (GTK_TREE_VIEW (log_view));
			gtk_tree_model_get_iter (model, &iter, path);

			gtk_tree_model_get (model, &iter, LOG_COL_REVISION, &revision, -1);
			sha = git_revision_get_sha (revision);

			g_object_unref (revision);

			ref_list = g_hash_table_lookup (self->priv->refs, sha);
			g_free (sha);

			if (ref_list)
			{
				current_ref = ref_list;
				tooltip_string = g_string_new ("");

				while (current_ref)
				{
					ref_name = git_ref_get_name (GIT_REF (current_ref->data));
					ref_type = git_ref_get_ref_type (GIT_REF (current_ref->data));

					if (tooltip_string->len > 0)
						g_string_append (tooltip_string, "\n");

					switch (ref_type)
					{
						case GIT_REF_TYPE_BRANCH:
							g_string_append_printf (tooltip_string,
							                        _("<b>Branch:</b> %s"),
							                        ref_name );
							break;
						case GIT_REF_TYPE_TAG:
							g_string_append_printf (tooltip_string,
							                        _("<b>Tag:</b> %s"),
							                        ref_name);
							break;
						case GIT_REF_TYPE_REMOTE:
							g_string_append_printf (tooltip_string,
							                        _("<b>Remote:</b> %s"),
							                        ref_name);
							break;
						default:
							break;
					}

					g_free (ref_name);
					current_ref = g_list_next (current_ref);
				}

				gtk_tooltip_set_markup (tooltip, tooltip_string->str);
				g_string_free (tooltip_string, TRUE);

				ret = TRUE;
			}
		}

		gtk_tree_path_free (path);
	}
	
	return ret;	
}
Ejemplo n.º 18
0
static gboolean
_dtv_query_tooltip (GtkWidget  *widget,
                    gint        x,
                    gint        y,
                    gboolean    keyboard_mode,
                    GtkTooltip *tooltip)
{
  int                    bin_x, bin_y;
  GtkTreePath           *path = NULL;
  GtkTreeViewColumn     *column;
  GtkTreeIter            iter;
  GtkTreeModel          *model;
  GdkRectangle           cell_area;
  GString               *markup;
  gboolean               had_info = FALSE;

  gtk_tree_view_convert_widget_to_bin_window_coords (
	GTK_TREE_VIEW (widget), x, y, &bin_x, &bin_y);

  if (gtk_tree_view_get_path_at_pos
	(GTK_TREE_VIEW (widget), bin_x, bin_y, &path, &column, NULL, NULL)) {

    model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
    if (gtk_tree_model_get_iter (model, &iter, path)) {
      /* show some useful  information */
      Diagram   *diagram;
      Layer     *layer;
      DiaObject *object;


      gtk_tree_model_get (model, &iter, DIAGRAM_COLUMN, &diagram, -1);
      gtk_tree_model_get (model, &iter, LAYER_COLUMN, &layer, -1);
      gtk_tree_model_get (model, &iter, OBJECT_COLUMN, &object, -1);

      markup = g_string_new (NULL);

      if (diagram) {
        gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Diagram"), diagram->filename);
        g_string_append (markup, em);
        g_free (em);
      }

      if (layer) {
        gchar *name = layer_get_name (layer);
        gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Layer"), name);
        g_string_append (markup, em);
        g_free (em);
        g_free (name);
      } else if (diagram) {
	int layers = data_layer_count (DIA_DIAGRAM_DATA (diagram));
	g_string_append_printf (markup, g_dngettext (GETTEXT_PACKAGE, "%d Layer", "%d Layers",
			        layers), layers);
      }
      if (object) {
        gchar *em = g_markup_printf_escaped ("<b>%s</b>: %s\n", _("Type"), object->type->name);
        g_string_append (markup, em);
        g_free (em);
        g_string_append_printf (markup, "<b>%s</b>: %g,%g\n", Q_("object|Position"), 
			        object->position.x, object->position.y);
	g_string_append_printf (markup, "%d %s", 
	                        g_list_length (object->children), _("Children"));
        /* and some dia_object_get_meta ? */
      } else if (layer) {
	int objects = layer_object_count (layer);
	g_string_append_printf (markup, g_dngettext (GETTEXT_PACKAGE, "%d Object", "%d Objects",
	                        objects), objects);
      }

      if (markup->len > 0) {
        gtk_tree_view_get_cell_area (GTK_TREE_VIEW (widget), path, column, &cell_area);

        gtk_tree_view_convert_bin_window_to_widget_coords
			(GTK_TREE_VIEW (widget), cell_area.x, cell_area.y,
			 &cell_area.x, &cell_area.y);

        gtk_tooltip_set_tip_area (tooltip, &cell_area);
        gtk_tooltip_set_markup (tooltip, markup->str);
	had_info = TRUE;
      }

      /* drop references */
      if (diagram)
        g_object_unref (diagram);
      g_string_free (markup, TRUE);
    }
    gtk_tree_path_free (path);
    if (had_info)
      return TRUE;
  }

  return GTK_WIDGET_CLASS (_dtv_parent_class)->query_tooltip 
						(widget, x, y, keyboard_mode, tooltip);
}