aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/tasks-control.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/tasks-control.c')
-rw-r--r--calendar/gui/tasks-control.c213
1 files changed, 213 insertions, 0 deletions
diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c
index 4f892c486d..979a3abb6e 100644
--- a/calendar/gui/tasks-control.c
+++ b/calendar/gui/tasks-control.c
@@ -25,10 +25,17 @@
#include <gtk/gtksignal.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
+#include <libgnome/gnome-paper.h>
#include <libgnome/gnome-util.h>
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-dialog-util.h>
#include <libgnomeui/gnome-stock.h>
+#include <libgnomeprint/gnome-print.h>
+#include <libgnomeprint/gnome-print-copies.h>
+#include <libgnomeprint/gnome-print-master.h>
+#include <libgnomeprint/gnome-print-master-preview.h>
+#include <libgnomeprint/gnome-print-preview.h>
+#include <libgnomeprint/gnome-printer-dialog.h>
#include <bonobo/bonobo-control.h>
#include <bonobo/bonobo-ui-util.h>
#include <gal/widgets/e-gui-utils.h>
@@ -88,6 +95,12 @@ static void tasks_control_expunge_cmd (BonoboUIComponent *uic,
static void tasks_control_settings_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path);
+static void tasks_control_print_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path);
+static void tasks_control_print_preview_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path);
BonoboControl *
@@ -258,12 +271,16 @@ static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("TasksMarkComplete", tasks_control_complete_cmd),
BONOBO_UI_VERB ("TasksExpunge", tasks_control_expunge_cmd),
BONOBO_UI_VERB ("TasksSettings", tasks_control_settings_cmd),
+ BONOBO_UI_VERB ("TasksPrint", tasks_control_print_cmd),
+ BONOBO_UI_VERB ("TasksPrintPreview", tasks_control_print_preview_cmd),
BONOBO_UI_VERB_END
};
static EPixmap pixmaps [] = {
E_PIXMAP ("/menu/File/New/NewFirstItem/NewTask", "new_task-16.png"),
+ E_PIXMAP ("/menu/File/Print/Print", "print.xpm"),
+ E_PIXMAP ("/menu/File/Print/PrintPreview", "print-preview.xpm"),
E_PIXMAP ("/menu/EditPlaceholder/Edit/TasksCut", "16_cut.png"),
E_PIXMAP ("/menu/EditPlaceholder/Edit/TasksCopy", "16_copy.png"),
E_PIXMAP ("/menu/EditPlaceholder/Edit/TasksPaste", "16_paste.png"),
@@ -274,6 +291,7 @@ static EPixmap pixmaps [] = {
E_PIXMAP ("/Toolbar/Copy", "buttons/copy.png"),
E_PIXMAP ("/Toolbar/Paste", "buttons/paste.png"),
E_PIXMAP ("/Toolbar/Delete", "buttons/delete-message.png"),
+ E_PIXMAP ("/Toolbar/Print", "buttons/print.png"),
E_PIXMAP_END
};
@@ -484,3 +502,198 @@ tasks_control_settings_cmd (BonoboUIComponent *uic, gpointer data, const char *p
else
cal_prefs_dialog_show (prefs_dialog, CAL_PREFS_DIALOG_PAGE_TASKS);
}
+
+
+static void
+print_title (GnomePrintContext *pc,
+ double page_width, double page_height)
+{
+ GnomeFont *font;
+ char *text;
+ double w, x, y;
+
+ font = gnome_font_new_closest ("Times", GNOME_FONT_BOLD, 0, 18);
+
+ text = _("Tasks");
+ w = gnome_font_get_width_utf8 (font, text);
+
+ x = (page_width - w) / 2;
+ y = page_height - gnome_font_get_ascender (font);
+
+ gnome_print_moveto (pc, x, y);
+ gnome_print_setfont (pc, font);
+ gnome_print_setrgbcolor (pc, 0, 0, 0);
+ gnome_print_show (pc, text);
+
+ gtk_object_unref (GTK_OBJECT (font));
+}
+
+
+static void
+print_tasks (ETasks *tasks, gboolean preview, gboolean landscape,
+ int copies, gboolean collate)
+{
+ ECalendarTable *cal_table;
+ EPrintable *printable;
+ ETable *etable;
+ GnomePrintMaster *master;
+ GnomePrintContext *pc;
+ const GnomePaper *paper_info;
+ double l, r, t, b, page_width, page_height, left_margin, bottom_margin;
+
+ cal_table = e_tasks_get_calendar_table (tasks);
+ etable = e_calendar_table_get_table (E_CALENDAR_TABLE (cal_table));
+ printable = e_table_get_printable (etable);
+
+ master = gnome_print_master_new ();
+
+ paper_info = gnome_paper_with_name (gnome_paper_name_default ());
+ gnome_print_master_set_paper (master, paper_info);
+
+ gnome_print_master_set_copies (master, copies, collate);
+ pc = gnome_print_master_get_context (master);
+ e_printable_reset (printable);
+
+ l = gnome_paper_lmargin (paper_info);
+ r = gnome_paper_pswidth (paper_info)
+ - gnome_paper_rmargin (paper_info);
+ t = gnome_paper_psheight (paper_info)
+ - gnome_paper_tmargin (paper_info);
+ b = gnome_paper_bmargin (paper_info);
+
+ if (landscape) {
+ page_width = t - b;
+ page_height = r - l;
+ left_margin = b;
+ bottom_margin = gnome_paper_rmargin (paper_info);
+ } else {
+ page_width = r - l;
+ page_height = t - b;
+ left_margin = l;
+ bottom_margin = b;
+ }
+
+ while (e_printable_data_left (printable)) {
+ gnome_print_beginpage (pc, "Tasks");
+ gnome_print_gsave (pc);
+ if (landscape) {
+ gnome_print_rotate (pc, 90);
+ gnome_print_translate (pc, 0, -gnome_paper_pswidth (paper_info));
+ }
+
+ gnome_print_translate (pc, left_margin, bottom_margin);
+
+ print_title (pc, page_width, page_height);
+
+ e_printable_print_page (printable, pc,
+ page_width, page_height - 24, TRUE);
+
+ gnome_print_grestore (pc);
+ gnome_print_showpage (pc);
+ }
+ gnome_print_master_close (master);
+
+ if (preview) {
+ GnomePrintMasterPreview *gpmp;
+ gpmp = gnome_print_master_preview_new_with_orientation (master, _("Print Preview"), landscape);
+ gtk_widget_show (GTK_WIDGET (gpmp));
+ } else {
+ gnome_print_master_print (master);
+ }
+
+ gtk_object_unref (GTK_OBJECT (master));
+ gtk_object_unref (GTK_OBJECT (printable));
+}
+
+
+/* File/Print callback */
+static void
+tasks_control_print_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path)
+{
+ ETasks *tasks;
+ GtkWidget *gpd, *mode_box, *portrait_radio, *landscape_radio;
+ GtkWidget *dialog_vbox, *dialog_hbox, *mode_frame;
+ GList *children;
+ GSList *group;
+ gboolean preview = FALSE, landscape = FALSE;
+ GnomePrinter *printer;
+ int copies;
+ gboolean collate;
+
+ tasks = E_TASKS (data);
+
+ gpd = gnome_print_dialog_new (_("Print Tasks"),
+ GNOME_PRINT_DIALOG_COPIES);
+
+ mode_frame = gtk_frame_new (_("Orientation"));
+
+ mode_box = gtk_vbox_new (FALSE, 4);
+ gtk_container_add (GTK_CONTAINER (mode_frame), mode_box);
+
+ /* Portrait */
+ portrait_radio = gtk_radio_button_new_with_label (NULL, _("Portrait"));
+ group = gtk_radio_button_group (GTK_RADIO_BUTTON (portrait_radio));
+ gtk_box_pack_start (GTK_BOX (mode_box), portrait_radio,
+ FALSE, FALSE, 0);
+
+ /* Landscape */
+ landscape_radio = gtk_radio_button_new_with_label (group,
+ _("Landscape"));
+ gtk_box_pack_start (GTK_BOX (mode_box), landscape_radio,
+ FALSE, FALSE, 0);
+
+ gtk_widget_show_all (mode_frame);
+
+ /* A bit of a hack to insert our own Orientation option. */
+ dialog_vbox = GNOME_DIALOG (gpd)->vbox;
+ children = gtk_container_children (GTK_CONTAINER (dialog_vbox));
+ dialog_hbox = children->next->data;
+ g_list_free (children);
+ gtk_box_pack_start (GTK_BOX (dialog_hbox), mode_frame,
+ FALSE, FALSE, 3);
+
+ gnome_dialog_set_default (GNOME_DIALOG (gpd), GNOME_PRINT_PRINT);
+
+ /* Run dialog */
+ switch (gnome_dialog_run (GNOME_DIALOG (gpd))) {
+ case GNOME_PRINT_PRINT:
+ break;
+
+ case GNOME_PRINT_PREVIEW:
+ preview = TRUE;
+ break;
+
+ case -1:
+ return;
+
+ default:
+ gnome_dialog_close (GNOME_DIALOG (gpd));
+ return;
+ }
+
+ gnome_print_dialog_get_copies (GNOME_PRINT_DIALOG (gpd),
+ &copies, &collate);
+ if (GTK_TOGGLE_BUTTON (landscape_radio)->active)
+ landscape = TRUE;
+
+ printer = gnome_print_dialog_get_printer (GNOME_PRINT_DIALOG (gpd));
+
+ gnome_dialog_close (GNOME_DIALOG (gpd));
+
+ print_tasks (tasks, preview, landscape, copies, collate);
+}
+
+static void
+tasks_control_print_preview_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path)
+{
+ ETasks *tasks;
+
+ tasks = E_TASKS (data);
+
+ print_tasks (tasks, TRUE, FALSE, 1, FALSE);
+}
+