+void
+ev_print_job_set_gnome_print_job (EvPrintJob *job, GnomePrintJob *gpj)
+{
+ g_return_if_fail (EV_IS_PRINT_JOB (job));
+
+ if (job->gnome_print_job == gpj)
+ return;
+
+ if (job->gnome_print_job)
+ g_object_unref (job->gnome_print_job);
+
+ if (gpj)
+ g_object_ref (gpj);
+
+ job->gnome_print_job = gpj;
+}
+
+void
+ev_print_job_set_document (EvPrintJob *job, EvDocument *document)
+{
+ g_return_if_fail (EV_IS_PRINT_JOB (job));
+
+ if (job->document == document)
+ return;
+
+ if (job->document)
+ g_object_ref (job->document);
+
+ if (document)
+ g_object_ref (document);
+
+ job->document = document;
+}
+
+void
+ev_print_job_use_print_dialog_settings (EvPrintJob *job, GnomePrintDialog *dialog)
+{
+ GnomePrintConfig *print_config;
+ EvPageCache *page_cache = ev_page_cache_get (job->document);
+
+ g_return_if_fail (EV_IS_PRINT_JOB (job));
+ g_return_if_fail (GNOME_IS_PRINT_DIALOG (dialog));
+
+ print_config = gnome_print_dialog_get_config (dialog);
+ gnome_print_dialog_get_copies (dialog, &job->copies, &job->collate);
+ gnome_print_config_get_page_size (print_config,
+ &job->width, &job->height);
+ gnome_print_config_get_boolean (print_config,
+ (guchar *)GNOME_PRINT_KEY_DUPLEX, &job->duplex);
+
+ page_cache = ev_page_cache_get (job->document);
+
+ /* get the printing ranges */
+ switch (gnome_print_dialog_get_range (dialog)) {
+ case GNOME_PRINT_RANGE_ALL:
+ job->first_page = 0;
+ job->last_page = ev_page_cache_get_n_pages (page_cache) - 1;
+ break;
+ case GNOME_PRINT_RANGE_RANGE:
+ gnome_print_dialog_get_range_page (dialog, &job->first_page, &job->last_page);
+ /* convert 1-based user interface to 0-based internal numbers */
+ job->first_page--;
+ job->last_page--;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ gnome_print_config_unref (print_config);
+}
+
+static gboolean
+idle_print_handler (EvPrintJob *job)
+{
+ if (!job->printing) {
+ ev_document_doc_mutex_lock ();
+ ev_file_exporter_begin (
+ EV_FILE_EXPORTER (job->document),
+ EV_FILE_FORMAT_PS,
+ job->temp_file,
+ MIN (job->first_page, job->last_page),
+ MAX (job->first_page, job->last_page),
+ job->width, job->height, job->duplex);
+ ev_document_doc_mutex_unlock ();
+ job->next_page = job->first_page;
+ job->shift = (job->first_page > job->last_page) ? -1 : 1;
+ job->printing = TRUE;
+ return TRUE;
+ }
+
+ if ((job->next_page - job->last_page) * job->shift <= 0) {
+ EvRenderContext *rc;
+#if 0
+ g_printerr ("Printing page %d\n", job->next_page);
+#endif
+ rc = ev_render_context_new (0, job->next_page, 1.0);
+
+ ev_document_doc_mutex_lock ();
+ ev_file_exporter_do_page (EV_FILE_EXPORTER (job->document), rc);
+ ev_document_doc_mutex_unlock ();
+
+ g_object_unref (rc);
+
+ if (job->collate) {
+ /* collate must repeat the same page */
+ job->copies_done++;
+ if(job->copies == job->copies_done) {
+ job->next_page += job->shift;
+ job->copies_done = 0;
+ }
+ } else {
+ job->next_page += job->shift;
+ if ((job->next_page - job->last_page) * job->shift > 0){
+ job->copies_done++;
+ if(job->copies_done < job->copies) {
+ /* more copies to go, restart to the first page */
+ job->next_page = job->first_page;
+ }
+ }
+ }
+ return TRUE;
+ } else { /* no more pages or copies */
+ ev_document_doc_mutex_lock ();
+ ev_file_exporter_end (EV_FILE_EXPORTER (job->document));
+ ev_document_doc_mutex_unlock ();
+
+ close (job->fd);
+ job->fd = 0;
+
+ gnome_print_job_print (job->gnome_print_job);
+
+ unlink (job->temp_file);
+ g_free (job->temp_file);
+
+ g_object_unref (job->gnome_print_job);
+ job->gnome_print_job = NULL;
+
+ job->printing = FALSE;
+ job->idle_id = 0;
+ return FALSE;
+ }
+}
+
+static void
+print_closure_finalize (EvPrintJob *job, GClosure *closure)
+{
+ g_object_unref (job);
+}
+