]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkprintunixdialog.c
Bug 561801 - "scheduled printing" doesn't function as expected
[~andy/gtk] / gtk / gtkprintunixdialog.c
index 9c20fca396ec0a94b93df3da4921194a8da97943..21c1efed69c4a3fc64492cb7d8e0f7edddafab70 100644 (file)
@@ -101,6 +101,8 @@ static void     set_cell_sensitivity_func          (GtkTreeViewColumn *tree_colu
                                                    GtkTreeModel      *model,
                                                    GtkTreeIter       *iter,
                                                    gpointer           data);
+static gboolean set_active_printer                 (GtkPrintUnixDialog *dialog,
+                                                   const gchar        *printer_name);
 
 /* GtkBuildable */
 static void gtk_print_unix_dialog_buildable_init                    (GtkBuildableIface *iface);
@@ -331,7 +333,7 @@ error_dialogs (GtkPrintUnixDialog *print_dialog,
   GtkPrinter                *printer = NULL;
   GtkWindow                 *toplevel = NULL;
   GtkWidget                 *dialog = NULL;
-  gchar                     *filename = NULL;
+  GFile                     *file = NULL;
   gchar                     *basename = NULL;
   gchar                     *dirname = NULL;
   int                        response;
@@ -350,15 +352,15 @@ error_dialogs (GtkPrintUnixDialog *print_dialog,
           if (option != NULL &&
               option->type == GTK_PRINTER_OPTION_TYPE_FILESAVE)
             {
-              filename = g_filename_from_uri (option->value, NULL, NULL);
+              file = g_file_new_for_uri (option->value);
 
-              if (filename != NULL &&
-                  g_file_test (filename, G_FILE_TEST_EXISTS))
+              if (file != NULL &&
+                  g_file_query_exists (file, NULL))
                 {
                   toplevel = get_toplevel (GTK_WIDGET (print_dialog));
 
-                  basename = g_path_get_basename (filename);
-                  dirname = g_path_get_dirname (filename);
+                  basename = g_file_get_basename (file);
+                  dirname = g_file_get_parse_name (g_file_get_parent (file));
 
                   dialog = gtk_message_dialog_new (toplevel,
                                                    GTK_DIALOG_MODAL |
@@ -394,17 +396,18 @@ error_dialogs (GtkPrintUnixDialog *print_dialog,
 
                   gtk_widget_destroy (dialog);
 
+                  g_free (dirname);
+                  g_free (basename);
+
                   if (response != GTK_RESPONSE_ACCEPT)
                     {
                       g_signal_stop_emission_by_name (print_dialog, "response");
+                      g_object_unref (file);
                       return TRUE;
                     }
-
-                  g_free (dirname);
-                  g_free (basename);
                 }
 
-              g_free (filename);
+              g_object_unref (file);
             }
         }
     }
@@ -644,6 +647,11 @@ printer_status_cb (GtkPrintBackend    *backend,
    * of GTK_RESPONSE_OK button inside of selected_printer_changed function. */
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->printer_treeview));
   selected_printer_changed (selection, dialog);
+
+  if (gtk_print_backend_printer_list_is_done (backend) &&
+      gtk_printer_is_default (printer) &&
+      (gtk_tree_selection_count_selected_rows (selection) == 0))
+    set_active_printer (dialog, gtk_printer_get_name (printer));
 }
 
 static void
@@ -1689,6 +1697,19 @@ update_range_sensitivity (GtkWidget *button,
   gtk_widget_set_sensitive (range, active);
 }
 
+static void
+emit_ok_response (GtkTreeView       *tree_view,
+                  GtkTreePath       *path,
+                  GtkTreeViewColumn *column,
+                  gpointer          *user_data)
+{
+  GtkPrintUnixDialog *print_dialog;
+
+  print_dialog = (GtkPrintUnixDialog *) user_data;
+
+  gtk_dialog_response (GTK_DIALOG (print_dialog), GTK_RESPONSE_OK);
+}
+
 static void
 create_main_page (GtkPrintUnixDialog *dialog)
 {
@@ -1701,6 +1722,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
   GtkTreeViewColumn *column;
   GtkTreeSelection *selection;
   GtkWidget *custom_input;
+  const gchar *range_tooltip;
 
   main_vbox = gtk_vbox_new (FALSE, 18);
   gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
@@ -1766,6 +1788,8 @@ create_main_page (GtkPrintUnixDialog *dialog)
                                                     NULL);
   gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
   gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+
+  g_signal_connect (GTK_TREE_VIEW (treeview), "row-activated", G_CALLBACK (emit_ok_response), dialog);
   
   gtk_widget_show (treeview);
   gtk_container_add (GTK_CONTAINER (scrolled), treeview);
@@ -1803,7 +1827,8 @@ create_main_page (GtkPrintUnixDialog *dialog)
                    0, 0);
  
   radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)), _("Pag_es:"));
-  gtk_widget_set_tooltip_text (radio, _("Specify one or more page ranges,\n e.g. 1-3,7,11"));
+  range_tooltip = _("Specify one or more page ranges,\n e.g. 1-3,7,11");
+  gtk_widget_set_tooltip_text (radio, range_tooltip);
  
   priv->page_range_radio = radio;
   gtk_widget_show (radio);
@@ -1811,6 +1836,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
                    0, 1, 2, 3,  GTK_FILL, 0,
                    0, 0);
   entry = gtk_entry_new ();
+  gtk_widget_set_tooltip_text (entry, range_tooltip);
   priv->page_range_entry = entry;
   gtk_widget_show (entry);
   gtk_table_attach (GTK_TABLE (table), entry,
@@ -2128,50 +2154,30 @@ dialog_get_number_up_layout (GtkPrintUnixDialog *dialog)
   GtkPrintUnixDialogPrivate *priv = dialog->priv;
   GtkPrintCapabilities       caps;
   GtkNumberUpLayout          layout;
-  GtkTextDirection           text_direction;
   const gchar               *val;
+  GEnumClass                *enum_class;
+  GEnumValue                *enum_value;
 
   val = gtk_printer_option_widget_get_value (priv->number_up_layout);
-  text_direction = gtk_widget_get_default_direction ();
 
   caps = priv->manual_capabilities | priv->printer_capabilities;
 
-  if (caps & GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT)
-    {
-      if (text_direction == GTK_TEXT_DIR_LTR)
-        layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
-      else
-        layout = GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM;
-    }
-  else
+  if ((caps & GTK_PRINT_CAPABILITY_NUMBER_UP_LAYOUT) == 0)
+    return GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
+
+  if (gtk_widget_get_direction (GTK_WIDGET (dialog)) == GTK_TEXT_DIR_LTR)
     layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
+  else
+    layout = GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM;
 
   if (val == NULL)
     return layout;
 
-  if (strcmp (val, "lrtb") == 0)
-    return GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
-
-  if (strcmp (val, "lrbt") == 0)
-    return GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP;
-
-  if (strcmp (val, "rltb") == 0)
-    return GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM;
-
-  if (strcmp (val, "rlbt") == 0)
-    return GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP;
-
-  if (strcmp (val, "tblr") == 0)
-    return GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT;
-
-  if (strcmp (val, "tbrl") == 0)
-    return GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT;
-
-  if (strcmp (val, "btlr") == 0)
-    return GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT;
-
-  if (strcmp (val, "btrl") == 0)
-    return GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT;
+  enum_class = g_type_class_ref (GTK_TYPE_NUMBER_UP_LAYOUT);
+  enum_value = g_enum_get_value_by_nick (enum_class, val);
+  if (enum_value)
+    layout = enum_value->value;
+  g_type_class_unref (enum_class);
 
   return layout;
 }
@@ -2204,7 +2210,7 @@ draw_page_cb (GtkWidget            *widget,
     (orientation == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE);
 
   number_up_layout = dialog_get_number_up_layout (dialog);
-  
+
   cr = gdk_cairo_create (widget->window);
   
   cairo_translate (cr, widget->allocation.x, widget->allocation.y);
@@ -2451,6 +2457,10 @@ update_number_up_layout (GtkPrintUnixDialog *dialog)
 
       if (dialog_get_pages_per_sheet (dialog) != 1)
         {
+          GEnumClass *enum_class;
+          GEnumValue *enum_value;
+          enum_class = g_type_class_ref (GTK_TYPE_NUMBER_UP_LAYOUT);
+
           if (dialog_get_pages_per_sheet (dialog) == 2)
             {
               option = priv->number_up_layout_2_option;
@@ -2459,43 +2469,21 @@ update_number_up_layout (GtkPrintUnixDialog *dialog)
                   layout == GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP ||
                   layout == GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT ||
                   layout == GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT)
-                gtk_printer_option_set (option, "lrtb");
+                enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM);
               else
-                gtk_printer_option_set (option, "rltb");
+                enum_value = g_enum_get_value (enum_class, GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM);
             }
           else
             {
               option = priv->number_up_layout_n_option;
 
-              switch (layout)
-                {
-                  case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM:
-                    gtk_printer_option_set (option, "lrtb");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP:
-                    gtk_printer_option_set (option, "lrbt");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM:
-                    gtk_printer_option_set (option, "rltb");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP:
-                    gtk_printer_option_set (option, "rlbt");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT:
-                    gtk_printer_option_set (option, "tblr");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT:
-                    gtk_printer_option_set (option, "tbrl");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT:
-                    gtk_printer_option_set (option, "btlr");
-                    break;
-                  case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT:
-                    gtk_printer_option_set (option, "btrl");
-                    break;
-               }
+              enum_value = g_enum_get_value (enum_class, layout);
             }
 
+          g_assert (enum_value != NULL);
+          gtk_printer_option_set (option, enum_value->value_nick);
+          g_type_class_unref (enum_class);
+
           gtk_printer_option_set_add (set, option);
         }
     }
@@ -2704,6 +2692,8 @@ create_job_page (GtkPrintUnixDialog *dialog)
   GtkWidget *main_table, *label;
   GtkWidget *frame, *table, *radio;
   GtkWidget *entry, *widget;
+  const gchar *at_tooltip;
+  const gchar *on_hold_tooltip;
 
   main_table = gtk_table_new (2, 2, FALSE);
   gtk_container_set_border_width (GTK_CONTAINER (main_table), 12);
@@ -2773,6 +2763,12 @@ create_job_page (GtkPrintUnixDialog *dialog)
    */
   radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)),
                                              _("A_t:"));
+
+  /* Translators: Ability to parse the am/pm format depends on actual locale.
+   * You can remove the am/pm values below for your locale if they are not supported. 
+   */ 
+  at_tooltip = _("Specify the time of print,\n e.g. 15:30, 2:35 pm, 14:15:20, 11:46:30 am, 4 pm");
+  gtk_widget_set_tooltip_text (radio, at_tooltip);
   priv->print_at_radio = radio;
   gtk_widget_show (radio);
   gtk_table_attach (GTK_TABLE (table), radio,
@@ -2780,6 +2776,7 @@ create_job_page (GtkPrintUnixDialog *dialog)
                    0, 0);
 
   entry = gtk_entry_new ();
+  gtk_widget_set_tooltip_text (entry, at_tooltip);
   priv->print_at_entry = entry;
   gtk_widget_show (entry);
   gtk_table_attach (GTK_TABLE (table), entry,
@@ -2792,6 +2789,8 @@ create_job_page (GtkPrintUnixDialog *dialog)
    */
   radio = gtk_radio_button_new_with_mnemonic (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio)),
                                              _("On _hold"));
+  on_hold_tooltip = _("Hold the job until it is explicitly released");
+  gtk_widget_set_tooltip_text (radio, on_hold_tooltip);
   priv->print_hold_radio = radio;
   gtk_widget_show (radio);
   gtk_table_attach (GTK_TABLE (table), radio,