#include "ev-ps-exporter.h"
#include "ev-print-job.h"
+#include "ev-page-cache.h"
#define EV_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_PRINT_JOB, EvPrintJobClass))
#define EV_IS_PRINT_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), EV_PRINT_JOB))
double width; /* FIXME unused */
double height; /* FIXME unused */
gboolean duplex; /* FIXME unused */
- int copies; /* FIXME unused */
- int collate; /* FIXME unsued */
+ int copies;
+ int collate;
+
+ /* range printing */
+ int first_page;
+ int last_page;
int fd;
char *temp_file;
guint idle_id;
gboolean printing;
int next_page;
+ int copies_done;
};
struct _EvPrintJobClass {
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));
gnome_print_config_get_page_size (print_config,
&job->width, &job->height);
gnome_print_config_get_boolean (print_config,
- GNOME_PRINT_KEY_DUPLEX, &job->duplex);
+ (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);
}
idle_print_handler (EvPrintJob *job)
{
if (!job->printing) {
- ev_ps_exporter_begin (EV_PS_EXPORTER (job->document),
- job->temp_file);
- job->next_page = 1; /* FIXME use 0-based page numbering? */
+ ev_document_doc_mutex_lock ();
+ ev_ps_exporter_begin (
+ EV_PS_EXPORTER (job->document),
+ job->temp_file, job->first_page, job->last_page,
+ job->width, job->height, job->duplex);
+ ev_document_doc_mutex_unlock ();
+ job->next_page = job->first_page;
job->printing = TRUE;
return TRUE;
}
- if (job->next_page <= ev_document_get_n_pages (job->document)) {
+ if (job->next_page <= job->last_page) {
+ EvRenderContext *rc;
#if 0
g_printerr ("Printing page %d\n", job->next_page);
#endif
- ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document),
- job->next_page);
- job->next_page++;
+ rc = ev_render_context_new (0, job->next_page, 1.0);
+
+ ev_document_doc_mutex_lock ();
+ ev_ps_exporter_do_page (EV_PS_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->copies_done = 0;
+ }
+ } else {
+ job->next_page++;
+ if (job->next_page > job->last_page){
+ 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 */
+ } else { /* no more pages or copies */
+ ev_document_doc_mutex_lock ();
ev_ps_exporter_end (EV_PS_EXPORTER (job->document));
+ ev_document_doc_mutex_unlock ();
close (job->fd);
job->fd = 0;