void
gimp_unit_combo_box_set_active (GimpUnitComboBox *combo,
                                GimpUnit          unit)
{
  GtkTreeModel *model;
  GtkTreeIter   iter;
  gboolean      iter_valid;

  g_return_if_fail (GIMP_IS_UNIT_COMBO_BOX (combo));

  model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));

  _gimp_unit_store_sync_units (GIMP_UNIT_STORE (model));

  for (iter_valid = gtk_tree_model_get_iter_first (model, &iter);
       iter_valid;
       iter_valid = gtk_tree_model_iter_next (model, &iter))
    {
      gint iter_unit;

      gtk_tree_model_get (model, &iter,
                          GIMP_UNIT_STORE_UNIT, &iter_unit,
                          -1);

      if (unit == (GimpUnit) iter_unit)
        {
          gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
          break;
        }
    }
}
/**
 * gimp_resolution_entry_new:
 * @width_label:       Optional label for the width control.
 * @width:             Width of the item, specified in terms of @size_unit.
 * @height_label:      Optional label for the height control.
 * @height:            Height of the item, specified in terms of @size_unit.
 * @size_unit:         Unit used to specify the width and height.
 * @res_label:         Optional label for the resolution entry.
 * @initial_res:       The initial resolution.
 * @initial_unit:      The initial unit.
 *
 * Creates a new #GimpResolutionEntry widget.
 *
 * The #GimpResolutionEntry is derived from #GtkTable and will have
 * an empty border of one cell width on each side plus an empty column left
 * of the #GimpUnitMenu to allow the caller to add labels or other widgets.
 *
 * A #GimpChainButton is displayed if independent is set to %TRUE.
 *
 * Returns: A pointer to the new #GimpResolutionEntry widget.
 **/
GtkWidget *
gimp_resolution_entry_new (const gchar *width_label,
                           gdouble      width,
                           const gchar *height_label,
                           gdouble      height,
                           GimpUnit     size_unit,
                           const gchar *res_label,
                           gdouble      initial_res,
                           GimpUnit     initial_unit)
{
    GimpResolutionEntry *gre;
    GtkTreeModel        *model;

    gre = g_object_new (GIMP_TYPE_RESOLUTION_ENTRY, NULL);

    gre->unit = initial_unit;

    gtk_table_resize (GTK_TABLE (gre), 4, 4);

    gimp_resolution_entry_field_init (gre, &gre->x,
                                      &gre->width,
                                      X_CHANGED,
                                      initial_res, initial_unit,
                                      FALSE, 0);

    gtk_table_attach_defaults (GTK_TABLE (gre), gre->x.spinbutton,
                               1, 2,
                               3, 4);

    g_signal_connect (gre->x.adjustment, "value-changed",
                      G_CALLBACK (gimp_resolution_entry_value_callback),
                      &gre->x);

    gtk_widget_show (gre->x.spinbutton);

    gre->unitmenu = gimp_unit_combo_box_new ();
    model = gtk_combo_box_get_model (GTK_COMBO_BOX (gre->unitmenu));
    gimp_unit_store_set_has_pixels (GIMP_UNIT_STORE (model), FALSE);
    gimp_unit_store_set_has_percent (GIMP_UNIT_STORE (model), FALSE);
    gimp_unit_combo_box_set_active (GIMP_UNIT_COMBO_BOX (gre->unitmenu),
                                    initial_unit);

    gtk_table_attach (GTK_TABLE (gre), gre->unitmenu,
                      3, 4, 3, 4,
                      GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
    g_signal_connect (gre->unitmenu, "changed",
                      G_CALLBACK (gimp_resolution_entry_unit_callback),
                      gre);
    gtk_widget_show (gre->unitmenu);

    gimp_resolution_entry_field_init (gre, &gre->width,
                                      &gre->x,
                                      WIDTH_CHANGED,
                                      width, size_unit,
                                      TRUE, 0);

    gtk_table_attach_defaults (GTK_TABLE (gre), gre->width.spinbutton,
                               1, 2,
                               1, 2);

    gtk_table_attach_defaults (GTK_TABLE (gre), gre->width.label,
                               3, 4,
                               1, 2);

    g_signal_connect (gre->width.adjustment, "value-changed",
                      G_CALLBACK (gimp_resolution_entry_value_callback),
                      &gre->width);

    gtk_widget_show (gre->width.spinbutton);
    gtk_widget_show (gre->width.label);

    gimp_resolution_entry_field_init (gre, &gre->height, &gre->x,
                                      HEIGHT_CHANGED,
                                      height, size_unit,
                                      TRUE, 0);

    gtk_table_attach_defaults (GTK_TABLE (gre), gre->height.spinbutton,
                               1, 2, 2, 3);

    gtk_table_attach_defaults (GTK_TABLE (gre), gre->height.label,
                               3, 4, 2, 3);

    g_signal_connect (gre->height.adjustment, "value-changed",
                      G_CALLBACK (gimp_resolution_entry_value_callback),
                      &gre->height);

    gtk_widget_show (gre->height.spinbutton);
    gtk_widget_show (gre->height.label);

    if (width_label)
        gimp_resolution_entry_attach_label (gre, width_label,  1, 0, 0.0);

    if (height_label)
        gimp_resolution_entry_attach_label (gre, height_label, 2, 0, 0.0);

    if (res_label)
        gimp_resolution_entry_attach_label (gre, res_label,    3, 0, 0.0);

    return GTK_WIDGET (gre);
}