static void
chartable_sync_active_char (GtkWidget *widget,
	                        GParamSpec *pspec,
	                        MucharmapCharmap *charmap)
{
  MucharmapCharmapPrivate *priv = charmap->priv;
  GString *gs;
  const gchar *temp;
  const gchar **temps;
  gint i;
  gunichar wc;

  wc = mucharmap_chartable_get_active_character (priv->chartable);

  /* Forward the notification */
  g_object_notify (G_OBJECT (charmap), "active-character");

  if (priv->active_page == MUCHARMAP_CHARMAP_PAGE_DETAILS)
	set_details (charmap, wc);

  gs = g_string_sized_new (256);
  g_string_append_printf (gs, "U+%4.4X %s", wc,
	                      mucharmap_get_unicode_name (wc));

#if ENABLE_UNIHAN
  temp = mucharmap_get_unicode_kDefinition (wc);
  if (temp)
	g_string_append_printf (gs, "   %s", temp);
#endif

  temps = mucharmap_get_nameslist_equals (wc);
  if (temps)
	{
	  g_string_append_printf (gs, "   = %s", temps[0]);
	  for (i = 1;  temps[i];  i++)
	    g_string_append_printf (gs, "; %s", temps[i]);
	  g_free (temps);
	}

  temps = mucharmap_get_nameslist_stars (wc);
  if (temps)
	{
	  g_string_append_printf (gs, "   • %s", temps[0]);
	  for (i = 1;  temps[i];  i++)
	    g_string_append_printf (gs, "; %s", temps[i]);
	  g_free (temps);
	}

  chartable_status_message (charmap, gs->str);
  g_string_free (gs, TRUE);
}
/* makes a nice string and makes it a link to the character */
static void
insert_codepoint (MucharmapCharmap *charmap,
	              GtkTextBuffer *buffer,
	              GtkTextIter *iter,
	              gunichar uc)
{
  gchar *str;
  GtkTextTag *tag;

  str = g_strdup_printf ("U+%4.4X %s", uc,
	                     mucharmap_get_unicode_name (uc));

  tag = gtk_text_buffer_create_tag (buffer, NULL,
	                                "foreground", "blue",
	                                "underline", PANGO_UNDERLINE_SINGLE,
	                                NULL);
  /* add one so that zero is the "nothing" value, since U+0000 is a character */
  g_object_set_data (G_OBJECT (tag), "link-character", GUINT_TO_POINTER (uc + 1));

  gtk_text_buffer_insert_with_tags (buffer, iter, str, -1, tag, NULL);

  g_free (str);
}
static void
set_details (MucharmapCharmap *charmap,
	         gunichar uc)
{
  MucharmapCharmapPrivate *priv = charmap->priv;
  GtkTextBuffer *buffer;
  GtkTextIter iter;
  GString *gstemp;
  gchar *temp;
  const gchar *csp;
  gchar buf[12];
  guchar utf8[7];
  gint n, i;
  const gchar **csarr;
  gunichar *ucs;
  gunichar2 *utf16;
  MucharmapUnicodeVersion version;

  buffer = gtk_text_view_get_buffer (priv->details_view);
  gtk_text_buffer_set_text (buffer, "", 0);

  gtk_text_buffer_get_start_iter (buffer, &iter);
  gtk_text_buffer_place_cursor (buffer, &iter);
  gtk_text_buffer_insert (buffer, &iter, "\n", -1);

  n = mucharmap_unichar_to_printable_utf8 (uc, buf);
  if (n == 0)
	gtk_text_buffer_insert (
	        buffer, &iter, _("[not a printable character]"), -1);
  else
	gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, buf, n,
	                                          "gimongous", NULL);

  gtk_text_buffer_insert (buffer, &iter, "\n\n", -1);

  /* character name */
  temp = g_strdup_printf ("U+%4.4X %s\n",
	                      uc, mucharmap_get_unicode_name (uc));
  gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, temp, -1,
	                                        "big", "bold", NULL);
  g_free (temp);

  insert_heading (charmap, buffer, &iter, _("General Character Properties"));

  /* Unicode version */
  version = mucharmap_get_unicode_version (uc);
  if (version != MUCHARMAP_UNICODE_VERSION_UNASSIGNED)
	insert_vanilla_detail (charmap, buffer, &iter,
	                       _("In Unicode since:"),
	                       mucharmap_unicode_version_to_string (version));

  /* character category */
  insert_vanilla_detail (charmap, buffer, &iter, _("Unicode category:"),
	                     mucharmap_get_unicode_category_name (uc));

  /* canonical decomposition */
  conditionally_insert_canonical_decomposition (charmap, buffer, &iter, uc);

  /* representations */
  if (g_unichar_break_type(uc) != G_UNICODE_BREAK_SURROGATE)
	{
	  insert_heading (charmap, buffer, &iter, _("Various Useful Representations"));

	  n = g_unichar_to_utf8 (uc, (gchar *)utf8);
	  utf16 = g_ucs4_to_utf16 (&uc, 1, NULL, NULL, NULL);

	  /* UTF-8 */
	  gstemp = g_string_new (NULL);
	  for (i = 0;  i < n;  i++)
	g_string_append_printf (gstemp, "0x%2.2X ", utf8[i]);
	  g_string_erase (gstemp, gstemp->len - 1, -1);
	  insert_vanilla_detail (charmap, buffer, &iter, _("UTF-8:"), gstemp->str);
	  g_string_free (gstemp, TRUE);

	  /* UTF-16 */
	  gstemp = g_string_new (NULL);
	  g_string_append_printf (gstemp, "0x%4.4X", utf16[0]);
	  if (utf16[0] != '\0' && utf16[1] != '\0')
	g_string_append_printf (gstemp, " 0x%4.4X", utf16[1]);
	  insert_vanilla_detail (charmap, buffer, &iter, _("UTF-16:"), gstemp->str);
	  g_string_free (gstemp, TRUE);

	  /* an empty line */
	  gtk_text_buffer_insert (buffer, &iter, "\n", -1);

	  /* C octal \012\234 */
	  gstemp = g_string_new (NULL);
	  for (i = 0;  i < n;  i++)
	g_string_append_printf (gstemp, "\\%3.3o", utf8[i]);
	  insert_vanilla_detail (charmap, buffer, &iter,
				 _("C octal escaped UTF-8:"), gstemp->str);
	  g_string_free (gstemp, TRUE);

	  /* XML decimal entity */
	  if ((0x0001 <= uc && uc <= 0xD7FF) ||
	  (0xE000 <= uc && uc <= 0xFFFD) ||
	  (0x10000 <= uc && uc <= 0x10FFFF))
	{
	  temp = g_strdup_printf ("&#%d;", uc);
	  insert_vanilla_detail (charmap, buffer, &iter,
				 _("XML decimal entity:"), temp);
	  g_free (temp);
	}

	  g_free(utf16);
	}

  /* annotations */
  if (_mucharmap_unicode_has_nameslist_entry (uc))
	{
	  insert_heading (charmap, buffer, &iter,
	                  _("Annotations and Cross References"));

	  /* nameslist equals (alias names) */
	  csarr = mucharmap_get_nameslist_equals (uc);
	  if (csarr != NULL)
	    {
	      insert_chocolate_detail (charmap, buffer, &iter,
	                               _("Alias names:"), csarr, FALSE);
	      g_free (csarr);
	    }

	  /* nameslist stars (notes) */
	  csarr = mucharmap_get_nameslist_stars (uc);
	  if (csarr != NULL)
	    {
	      insert_chocolate_detail (charmap, buffer, &iter,
	                               _("Notes:"), csarr, TRUE);
	      g_free (csarr);
	    }

	  /* nameslist exes (see also) */
	  ucs = mucharmap_get_nameslist_exes (uc);
	  if (ucs != NULL)
	    {
	      insert_chocolate_detail_codepoints (charmap, buffer, &iter,
	                                          _("See also:"), ucs);
	      g_free (ucs);
	    }

	  /* nameslist pounds (approximate equivalents) */
	  csarr = mucharmap_get_nameslist_pounds (uc);
	  if (csarr != NULL)
	    {
	      insert_chocolate_detail (charmap, buffer, &iter,
	                               _("Approximate equivalents:"), csarr, TRUE);
	      g_free (csarr);
	    }

	  /* nameslist colons (equivalents) */
	  csarr = mucharmap_get_nameslist_colons (uc);
	  if (csarr != NULL)
	    {
	      insert_chocolate_detail (charmap, buffer, &iter,
	                               _("Equivalents:"), csarr, TRUE);
	      g_free (csarr);
	    }
	}

#if ENABLE_UNIHAN

  /* this isn't so bad efficiency-wise */
  if (mucharmap_get_unicode_kDefinition (uc)
	  || mucharmap_get_unicode_kCantonese (uc)
	  || mucharmap_get_unicode_kMandarin (uc)
	  || mucharmap_get_unicode_kJapaneseOn (uc)
	  || mucharmap_get_unicode_kJapaneseKun (uc)
	  || mucharmap_get_unicode_kTang (uc)
	  || mucharmap_get_unicode_kKorean (uc))
	{
	  insert_heading (charmap, buffer, &iter, _("CJK Ideograph Information"));

	  csp = mucharmap_get_unicode_kDefinition (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Definition in English:"), csp);

	  csp = mucharmap_get_unicode_kMandarin (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Mandarin Pronunciation:"), csp);

	  csp = mucharmap_get_unicode_kCantonese (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Cantonese Pronunciation:"), csp);

	  csp = mucharmap_get_unicode_kJapaneseOn (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Japanese On Pronunciation:"), csp);

	  csp = mucharmap_get_unicode_kJapaneseKun (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Japanese Kun Pronunciation:"), csp);

	  csp = mucharmap_get_unicode_kTang (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Tang Pronunciation:"), csp);

	  csp = mucharmap_get_unicode_kKorean (uc);
	  if (csp)
	    insert_vanilla_detail (charmap, buffer, &iter,
	                           _("Korean Pronunciation:"), csp);
	}
#endif /* #if ENABLE_UNIHAN */
}
Beispiel #4
0
void
build_table(charpick_data *p_curr_data)
{
  GtkWidget *box, *button_box, **row_box;
  GtkWidget *button, *arrow;
  gint i = 0, len = g_utf8_strlen (p_curr_data->charlist, -1);
  GtkWidget **toggle_button;
  gchar *charlist;
  gint max_width=1, max_height=1;
  gint size_ratio;

  toggle_button = g_new (GtkWidget *, len);
  
  if (p_curr_data->box)
    gtk_widget_destroy(p_curr_data->box);
    
  if (p_curr_data->panel_vertical)
    box = gtk_vbox_new (FALSE, 0);
  else 
    box = gtk_hbox_new (FALSE, 0);
  gtk_widget_show (box);
  p_curr_data->box = box;
  
  button = gtk_button_new ();
  if (g_list_length (p_curr_data->chartable) != 1)
  {
    gtk_widget_set_tooltip_text (button, _("Available palettes"));
  
    switch (mate_panel_applet_get_orient (MATE_PANEL_APPLET (p_curr_data->applet))) {
       	case MATE_PANEL_APPLET_ORIENT_DOWN:
          	arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
       		break;
       	case MATE_PANEL_APPLET_ORIENT_UP:
          	arrow = gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_OUT);  
       		break;
       	case MATE_PANEL_APPLET_ORIENT_LEFT:
       		arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_OUT);  
  		break;
       	case MATE_PANEL_APPLET_ORIENT_RIGHT:
       		arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_OUT);  
  		break;
    default:
  	  g_assert_not_reached ();
    }
    gtk_container_add (GTK_CONTAINER (button), arrow);
    gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
    /* FIXME : evil hack (see force_no_focus_padding) */
    force_no_focus_padding (button);
    gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
    g_signal_connect (G_OBJECT (button), "clicked",
                              G_CALLBACK (chooser_button_clicked),
			      p_curr_data);
    g_signal_connect (G_OBJECT (button), "button_press_event",
                               G_CALLBACK (button_press_hack),
			       p_curr_data->applet);
  
  }
  
  charlist = g_strdup (p_curr_data->charlist);
  for (i = 0; i < len; i++) {
    gchar label[7];
    GtkRequisition req;
    gchar *atk_desc;
    gchar *name;
    
    g_utf8_strncpy (label, charlist, 1);
    charlist = g_utf8_next_char (charlist);

#ifdef HAVE_MUCHARMAP
    /* TRANSLATOR: This sentance reads something like 'Insert "PILCROW SIGN"'
     *             hopefully, the name of the unicode character has already
     *             been translated.
     */
    name = g_strdup_printf (_("Insert \"%s\""),
		    mucharmap_get_unicode_name (g_utf8_get_char (label)));
#else
    name = g_strdup (_("Insert special character"));
#endif
   
    toggle_button[i] = gtk_toggle_button_new_with_label (label);
    atk_desc =  g_strdup_printf (_("insert special character %s"), label);
    set_atk_name_description (toggle_button[i], NULL, atk_desc);
    g_free (atk_desc);
    gtk_widget_show (toggle_button[i]);
    gtk_button_set_relief(GTK_BUTTON(toggle_button[i]), GTK_RELIEF_NONE);
    /* FIXME : evil hack (see force_no_focus_padding) */
    force_no_focus_padding (toggle_button[i]);
    gtk_widget_set_tooltip_text (toggle_button[i], name);
    g_free (name);
                      
    gtk_widget_size_request (toggle_button[i], &req);
    
    max_width = MAX (max_width, req.width);
    max_height = MAX (max_height, req.height-2);
  
    g_object_set_data (G_OBJECT (toggle_button[i]), "unichar", 
				GINT_TO_POINTER(g_utf8_get_char (label)));
    g_signal_connect (GTK_OBJECT (toggle_button[i]), "toggled",
		      G_CALLBACK (toggle_button_toggled_cb),
                        p_curr_data);
    g_signal_connect (GTK_OBJECT (toggle_button[i]), "button_press_event", 
                      G_CALLBACK (button_press_hack), p_curr_data->applet);
  }
  
  if (p_curr_data->panel_vertical) {
    size_ratio = p_curr_data->panel_size / max_width;
    button_box = gtk_hbox_new (TRUE, 0);
  } else {
    size_ratio = p_curr_data->panel_size / max_height;
    button_box = gtk_vbox_new (TRUE, 0);
  }

  gtk_box_pack_start (GTK_BOX (box), button_box, TRUE, TRUE, 0);
  
  size_ratio = MAX (size_ratio, 1);
  row_box = g_new0 (GtkWidget *, size_ratio);
  for (i=0; i < size_ratio; i++) {
  	if (!p_curr_data->panel_vertical) row_box[i] = gtk_hbox_new (TRUE, 0);
  	else row_box[i] = gtk_vbox_new (TRUE, 0);
  	gtk_box_pack_start (GTK_BOX (button_box), row_box[i], TRUE, TRUE, 0);
  }
  
  for (i = 0; i <len; i++) {  	
  	int delta = len/size_ratio;
  	int index;
  
	if (delta > 0)
	  	index = i / delta;
	else
		index = i;

	index = CLAMP (index, 0, size_ratio-1);	
  	gtk_box_pack_start (GTK_BOX (row_box[index]), toggle_button[i], TRUE, TRUE, 0);
  }
 
  g_free (toggle_button);
  
  gtk_container_add (GTK_CONTAINER(p_curr_data->applet), box);
  gtk_widget_show_all (p_curr_data->box);

  p_curr_data->last_index = NO_LAST_INDEX;
  p_curr_data->last_toggle_button = NULL;
  
}