Package: xpdf-reader
Version: 3.01-9
Severity: normal
Tags: patch

This patch alows to print from xpdf usung user choosed print order
(even/odd pages etc) Order change is possible only at printer print. It
is necessary to correct module working with PS too much for print in
file. So this function may be done some later:)

screenshot: http://img440.imageshack.us/img440/5018/ssxf6.png

=patch

--- xpdf/XPDFViewer.cc  2007-01-26 02:32:15.000000000 +0300
+++ xpdf/XPDFViewer.cc.new      2007-01-26 01:21:28.000000000 +0300
@@ -2169,7 +2169,7 @@
 //------------------------------------------------------------------------
 
 void XPDFViewer::initPrintDialog() {
-  Widget sep1, sep2, row, label1, label2, okBtn, cancelBtn;
+  Widget sep1, sep2, sep3, sep4, row, label1, label2, okBtn, cancelBtn;
   Arg args[20];
   int n;
   XmString s;
@@ -2294,11 +2294,105 @@
   XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
   sep2 = XmCreateSeparator(printDialog, "sep2", args, n);
   XtManageChild(sep2);
+  
+  //----- Print All Pages
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, sep2); ++n;
+  XtSetArg(args[n], XmNtopOffset, 8); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
+  XtSetArg(args[n], XmNset, XmSET); ++n;
+  s = XmStringCreateLocalized("Print all pages");
+  XtSetArg(args[n], XmNlabelString, s); ++n;
+  printAllPages = XmCreateToggleButton(printDialog, "printAllPages", args, n);
+  XmStringFree(s);
+  XtManageChild(printAllPages);
+  XtAddCallback(printAllPages, XmNvalueChangedCallback,
+    &printAllPagesBtnCbk, (XtPointer)this);
+  
+  //----- Print Odd Pages
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, printAllPages); ++n;
+//   XtSetArg(args[n], XmNtopOffset, 4); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
+  XtSetArg(args[n], XmNset, XmUNSET); ++n;
+  s = XmStringCreateLocalized("Print odd pages");
+  XtSetArg(args[n], XmNlabelString, s); ++n;
+  printOddPages = XmCreateToggleButton(printDialog, "printOddPages", args, n);
+  XmStringFree(s);
+  XtManageChild(printOddPages);
+  XtAddCallback(printOddPages, XmNvalueChangedCallback,
+    &printOddPagesBtnCbk, (XtPointer)this);
+  
+  //----- Print Even Pages
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, printOddPages); ++n;
+//   XtSetArg(args[n], XmNtopOffset, 4); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
+  XtSetArg(args[n], XmNset, XmUNSET); ++n;
+  s = XmStringCreateLocalized("Print even pages");
+  XtSetArg(args[n], XmNlabelString, s); ++n;
+  printEvenPages = XmCreateToggleButton(printDialog, "printEvenPages", args, 
n);
+  XmStringFree(s);
+  XtManageChild(printEvenPages);
+  XtAddCallback(printEvenPages, XmNvalueChangedCallback,
+    &printEvenPagesBtnCbk, (XtPointer)this);
+  
+  //----- separator
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, printEvenPages); ++n;
+  XtSetArg(args[n], XmNtopOffset, 8); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNrightOffset, 8); ++n;
+  XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
+  sep3 = XmCreateSeparator(printDialog, "sep3", args, n);
+  XtManageChild(sep3);
+
+  //----- Print Back Order
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, sep3); ++n;
+  XtSetArg(args[n], XmNtopOffset, 8); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
+  XtSetArg(args[n], XmNset, XmUNSET); ++n;
+  s = XmStringCreateLocalized("Print back order");
+  XtSetArg(args[n], XmNlabelString, s); ++n;
+  printBackOrder = XmCreateToggleButton(printDialog, "printBackOrder", args, 
n);
+  XmStringFree(s);
+  XtManageChild(printBackOrder);
+  XtAddCallback(printBackOrder, XmNvalueChangedCallback,
+    &printBackOrderBtnCbk, (XtPointer)this);
+  
+  //----- separator
+  n = 0;
+  XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
+  XtSetArg(args[n], XmNtopWidget, printBackOrder); ++n;
+  XtSetArg(args[n], XmNtopOffset, 8); ++n;
+  XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNleftOffset, 8); ++n;
+  XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
+  XtSetArg(args[n], XmNrightOffset, 8); ++n;
+  XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
+  sep3 = XmCreateSeparator(printDialog, "sep3", args, n);
+  XtManageChild(sep3);
 
   //----- "print" and "cancel" buttons
   n = 0;
   XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
-  XtSetArg(args[n], XmNtopWidget, sep2); ++n;
+  XtSetArg(args[n], XmNtopWidget, sep3); ++n;
   XtSetArg(args[n], XmNtopOffset, 8); ++n;
   XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
   XtSetArg(args[n], XmNleftOffset, 4); ++n;
@@ -2310,7 +2404,7 @@
                &printPrintCbk, (XtPointer)this);
   n = 0;
   XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
-  XtSetArg(args[n], XmNtopWidget, sep2); ++n;
+  XtSetArg(args[n], XmNtopWidget, sep3); ++n;
   XtSetArg(args[n], XmNtopOffset, 8); ++n;
   XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
   XtSetArg(args[n], XmNrightOffset, 4); ++n;
@@ -2335,6 +2429,60 @@
   }
 }
 
+void XPDFViewer::printAllPagesBtnCbk(Widget widget, 
+  XtPointer ptr, XtPointer callData)
+{
+  XPDFViewer *viewer = (XPDFViewer *)ptr;
+  XmToggleButtonCallbackStruct *data =
+      (XmToggleButtonCallbackStruct *)callData;
+
+  if (data->set != XmSET) {
+    XmToggleButtonSetState(viewer->printAllPages, True, False);
+  }
+  XmToggleButtonSetState(viewer->printEvenPages, False, False);
+  XmToggleButtonSetState(viewer->printOddPages, False, False);
+}
+
+void XPDFViewer::printEvenPagesBtnCbk(Widget widget, 
+  XtPointer ptr, XtPointer callData)
+{
+  XPDFViewer *viewer = (XPDFViewer *)ptr;
+  XmToggleButtonCallbackStruct *data =
+      (XmToggleButtonCallbackStruct *)callData;
+
+  if (data->set != XmSET) {
+    XmToggleButtonSetState(viewer->printEvenPages, True, False);
+  }
+  XmToggleButtonSetState(viewer->printAllPages, False, False);
+  XmToggleButtonSetState(viewer->printOddPages, False, False);
+  XmToggleButtonSetState(viewer->printWithCmdBtn, True, False);
+  XmToggleButtonSetState(viewer->printToFileBtn, False, False);
+}
+
+void XPDFViewer::printOddPagesBtnCbk(Widget widget, 
+  XtPointer ptr, XtPointer callData)
+{
+  XPDFViewer *viewer = (XPDFViewer *)ptr;
+  XmToggleButtonCallbackStruct *data =
+      (XmToggleButtonCallbackStruct *)callData;
+
+  if (data->set != XmSET) {
+    XmToggleButtonSetState(viewer->printOddPages, True, False);
+  }
+  XmToggleButtonSetState(viewer->printAllPages, False, False);
+  XmToggleButtonSetState(viewer->printEvenPages, False, False);
+  XmToggleButtonSetState(viewer->printWithCmdBtn, True, False);
+  XmToggleButtonSetState(viewer->printToFileBtn, False, False);
+}
+
+void XPDFViewer::printBackOrderBtnCbk(Widget widget, XtPointer ptr,
+  XtPointer callData)
+{
+  XPDFViewer *viewer = (XPDFViewer *)ptr;
+  XmToggleButtonSetState(viewer->printWithCmdBtn, True, False);
+  XmToggleButtonSetState(viewer->printToFileBtn, False, False);
+}
+
 void XPDFViewer::setupPrintDialog() {
   PDFDoc *doc;
   char buf[20];
@@ -2402,12 +2550,17 @@
   XmToggleButtonSetState(viewer->printWithCmdBtn, False, False);
   XtVaSetValues(viewer->printFileText, XmNsensitive, True, NULL);
   XtVaSetValues(viewer->printCmdText, XmNsensitive, False, NULL);
+    
+  XmToggleButtonSetState(viewer->printAllPages, True, False);
+  XmToggleButtonSetState(viewer->printOddPages, False, False);
+  XmToggleButtonSetState(viewer->printEvenPages, False, False);
+  XmToggleButtonSetState(viewer->printBackOrder, False, False);
 }
 
 void XPDFViewer::printPrintCbk(Widget widget, XtPointer ptr,
                               XtPointer callData) {
   XPDFViewer *viewer = (XPDFViewer *)ptr;
-  unsigned char withCmd;
+  unsigned char withCmd, printAll, printOdd, printEven, printBack;
   GString *psFileName;
   int firstPage, lastPage;
   PDFDoc *doc;
@@ -2424,6 +2577,11 @@
   viewer->core->setBusyCursor(gTrue);
 
   XtVaGetValues(viewer->printWithCmdBtn, XmNset, &withCmd, NULL);
+  XtVaGetValues(viewer->printAllPages, XmNset, &printAll, NULL);
+  XtVaGetValues(viewer->printOddPages, XmNset, &printOdd, NULL);
+  XtVaGetValues(viewer->printEvenPages, XmNset, &printEven, NULL);
+  XtVaGetValues(viewer->printBackOrder, XmNset, &printBack, NULL);
+
   if (withCmd) {
     psFileName = new GString(XmTextFieldGetString(viewer->printCmdText));
     psFileName->insert(0, '|');
@@ -2444,14 +2602,72 @@
     lastPage = doc->getNumPages();
   }
 
-  psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
-                         doc->getCatalog(), firstPage, lastPage,
-                         psModePS);
-  if (psOut->isOk()) {
-    doc->displayPages(psOut, firstPage, lastPage, 72, 72,
-                     0, gTrue, globalParams->getPSCrop(), gFalse);
+  // Normal print mode
+  if (printAll && !printBack)
+  {
+    psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
+          doc->getCatalog(), firstPage, lastPage,
+          psModePS);
+    if (psOut->isOk()) {
+      doc->displayPages(psOut, firstPage, lastPage, 72, 72,
+            0, gTrue, globalParams->getPSCrop(), gFalse);
+    }
+    delete psOut;
+  }
+  // Additional prints mode's
+  else
+  {
+    int step=1, i;
+    int beginPage, endPage;
+
+    if (!printAll) 
+    {
+      step=2;
+      if (printEven)
+      {
+        firstPage+=firstPage&0x01?1:0;
+        lastPage-=lastPage&0x01?1:0;
+      }
+      else
+      {
+        firstPage+=firstPage&0x01?0:1;
+        lastPage-=lastPage&0x01?0:1;
+      }
+    }
+
+    if (printBack) 
+    {
+      step=-step;
+      beginPage=lastPage;
+      endPage=firstPage;
+    }
+    else
+    {
+      beginPage=firstPage;
+      endPage=lastPage;
+    }
+
+    if (firstPage<=lastPage)
+    {
+      for (i=beginPage;; i+=step)
+      {
+        psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
+              doc->getCatalog(), i, i, psModePS);
+        if (psOut->isOk()) {
+          doc->displayPages(psOut, i, i, 72, 72,
+                0, gTrue, globalParams->getPSCrop(), gFalse);
+        }
+        else
+        {
+          delete psOut;
+          break;
+        }
+        delete psOut;
+        if (i==endPage) break;
+      }
+    }
   }
-  delete psOut;
+  
   delete psFileName;
 
   viewer->core->setBusyCursor(gFalse);
--- xpdf/XPDFViewer.h   2005-08-17 09:34:31.000000000 +0400
+++ xpdf-3.01/xpdf/XPDFViewer.h.new     2007-01-26 00:45:09.000000000 +0300
@@ -178,6 +178,16 @@
                                 XtPointer callData);
   static void printToFileBtnCbk(Widget widget, XtPointer ptr,
                                XtPointer callData);
+  
+  static void printAllPagesBtnCbk(Widget widget, XtPointer ptr,
+                                XtPointer callData);
+  static void printEvenPagesBtnCbk(Widget widget, XtPointer ptr,
+                                XtPointer callData);
+  static void printOddPagesBtnCbk(Widget widget, XtPointer ptr,
+                                XtPointer callData);
+  static void printBackOrderBtnCbk(Widget widget, XtPointer ptr,
+                                XtPointer callData);
+
   static void printPrintCbk(Widget widget, XtPointer ptr,
                            XtPointer callData);
 
@@ -242,6 +252,8 @@
   Widget printFileText;
   Widget printFirstPage;
   Widget printLastPage;
+
+  Widget printAllPages, printEvenPages, printOddPages, printBackOrder;
 };
 
 #endif

=end patch


-- System Information:
Debian Release: 4.0
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-3-k7
Locale: LANG=ru_RU.UTF-8, LC_CTYPE=ru_RU.UTF-8 (charmap=UTF-8)

Versions of packages xpdf depends on:
ii  xpdf-common                   3.01-9     Portable Document Format (PDF) sui
ii  xpdf-reader                   3.01-9     Portable Document Format (PDF) sui
ii  xpdf-utils                    3.01-9     Portable Document Format (PDF) sui

xpdf recommends no packages.

Versions of packages xpdf-reader depends on:
ii  gsfonts       1:8.11+urwcyr1.0.7~pre41-1 Fonts for the Ghostscript interpre
ii  lesstif2      1:0.94.4-2                 OSF/Motif 2.1 implementation relea
ii  libc6         2.3.6.ds1-8                GNU C Library: Shared libraries
ii  libfreetype6  2.2.1-5                    FreeType 2 font engine, shared lib
ii  libgcc1       1:4.1.1-21                 GCC support library
ii  libice6       1:1.0.1-2                  X11 Inter-Client Exchange library
ii  libpaper1     1.1.21                     Library for handling paper charact
ii  libsm6        1:1.0.1-3                  X11 Session Management library
ii  libstdc++6    4.1.1-21                   The GNU Standard C++ Library v3
ii  libt1-5       5.1.0-2                    Type 1 font rasterizer library - r
ii  libx11-6      2:1.0.3-4                  X11 client-side library
ii  libxext6      1:1.0.1-2                  X11 miscellaneous extension librar
ii  libxp6        1:1.0.0.xsf1-1             X Printing Extension (Xprint) clie
ii  libxpm4       1:3.5.5-2                  X11 pixmap library
ii  libxt6        1:1.0.2-2                  X11 toolkit intrinsics library
ii  xpdf-common   3.01-9                     Portable Document Format (PDF) sui
ii  zlib1g        1:1.2.3-13                 compression library - runtime

-- debconf-show failed


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to