From: Tim Silversides (silversides@btinternet.com)
Date: Wed Feb 05 2003 - 16:11:16 EST
Hi,
Below is a patch against stable to allow printing of pages in reverse
order on unix
-
Index: src/af/xap/unix/xap_UnixDlg_Print.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/xap/unix/xap_UnixDlg_Print.cpp,v
retrieving revision 1.54
diff -u -r1.54 xap_UnixDlg_Print.cpp
--- src/af/xap/unix/xap_UnixDlg_Print.cpp	11 Mar 2002 01:38:36 -0000	1.54
+++ src/af/xap/unix/xap_UnixDlg_Print.cpp	5 Feb 2003 18:59:35 -0000
@@ -77,7 +77,7 @@
                 m_persistPrintDlg.bDoPrintSelection = m_bDoPrintSelection;
                 m_persistPrintDlg.bDoPrintToFile = m_bDoPrintToFile;
                 m_persistPrintDlg.bDoCollate = m_bCollate;
-
+		m_persistPrintDlg.bDoReverse = m_bReverse;
                 m_persistPrintDlg.colorSpace = m_cColorSpace;
                 m_persistPrintDlg.szPrintCommand = m_szPrintCommand;
         }
@@ -91,6 +91,7 @@
         m_persistPrintDlg.bDoPrintSelection = m_bDoPrintSelection;
         m_persistPrintDlg.bDoPrintToFile = m_bDoPrintToFile;
         m_persistPrintDlg.bDoCollate = m_bCollate;
+	m_persistPrintDlg.bDoReverse = m_bReverse;
         m_persistPrintDlg.nCopies = m_nCopies;
         m_persistPrintDlg.nFromPage = m_nFirstPage;
         m_persistPrintDlg.nToPage = m_nLastPage;
@@ -185,6 +186,11 @@
         gtk_widget_grab_focus (entry);
 }
 
+static void entry_range_changed( GtkWidget *entry, GtkWidget *togglebutton)
+{
+	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (togglebutton), TRUE);
+}
+
 void XAP_UnixDialog_Print::_raisePrintDialog(XAP_Frame * pFrame)
 {
         // raise the actual dialog and wait for an answer.
@@ -203,6 +209,7 @@
         GtkWidget *buttonSelection;
         GtkWidget *button;
         GtkWidget *buttonCollate;
+	GtkWidget *buttonReverse;
         GtkWidget *buttonEmbedFonts;
         
         GtkWidget *spinCopies;
@@ -355,6 +362,10 @@
                         gtk_box_pack_start (GTK_BOX (hbox), buttonCollate, TRUE, TRUE, 0);
                         gtk_widget_show (buttonCollate);
                         
+			buttonReverse = gtk_check_button_new_with_label (pSS->getValue(XAP_STRING_ID_DLG_UP_Reverse));
+			gtk_box_pack_start (GTK_BOX (hbox), buttonReverse, TRUE, TRUE, 0);
+			gtk_widget_show (buttonReverse);
+
                         buttonEmbedFonts = gtk_check_button_new_with_label (pSS->getValue(XAP_STRING_ID_DLG_UP_EmbedFonts));
                         gtk_box_pack_start (GTK_BOX (hbox), buttonEmbedFonts, TRUE, TRUE, 0);
                         gtk_widget_show (buttonEmbedFonts);
@@ -434,6 +445,7 @@
                         
                         gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 5);
                         //gtk_widget_grab_default (button);
+			gtk_widget_grab_focus (button);
                         gtk_widget_show (button);
 
 
@@ -491,12 +503,17 @@
                 gtk_entry_set_text (GTK_ENTRY (entryFrom), str);
                 sprintf(str, "%d", m_persistPrintDlg.nToPage);
                 gtk_entry_set_text (GTK_ENTRY (entryTo), str);
-
+	
                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonCollate), m_persistPrintDlg.bDoCollate);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonReverse), m_persistPrintDlg.bDoReverse);
                 XAP_App::getApp()->getPrefsValueBool((const XML_Char *)XAP_PREF_KEY_EmbedFontsInPS, &m_bEmbedFonts);
                 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonEmbedFonts), m_bEmbedFonts);
                 gtk_spin_button_set_value (GTK_SPIN_BUTTON(spinCopies), m_persistPrintDlg.nCopies);
 
+		gtk_signal_connect(GTK_OBJECT(entryFrom), "changed",
+			GTK_SIGNAL_FUNC(entry_range_changed), buttonRange);
+		gtk_signal_connect(GTK_OBJECT(entryTo), "changed",
+			GTK_SIGNAL_FUNC(entry_range_changed), buttonRange);
 
         // get top level window and it's GtkWidget *
         XAP_UnixFrame * frame = static_cast<XAP_UnixFrame *>(pFrame);
@@ -519,6 +536,7 @@
                 m_bDoPrintSelection = GTK_TOGGLE_BUTTON(buttonSelection)->active;
                 m_bDoPrintToFile	= GTK_TOGGLE_BUTTON(buttonFile)->active;
                 m_bCollate			= GTK_TOGGLE_BUTTON(buttonCollate)->active;
+		m_bReverse			= GTK_TOGGLE_BUTTON(buttonReverse)->active;
                 bool bEmbedFonts 	= m_bEmbedFonts;
                 m_bEmbedFonts		= GTK_TOGGLE_BUTTON(buttonEmbedFonts)->active;
                 m_nCopies			= gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinCopies));
Index: src/af/xap/unix/xap_UnixDlg_Print.h
===================================================================
RCS file: /cvsroot/abi/src/af/xap/unix/xap_UnixDlg_Print.h,v
retrieving revision 1.19
diff -u -r1.19 xap_UnixDlg_Print.h
--- src/af/xap/unix/xap_UnixDlg_Print.h	3 Mar 2001 22:10:59 -0000	1.19
+++ src/af/xap/unix/xap_UnixDlg_Print.h	5 Feb 2003 18:59:36 -0000
@@ -73,6 +73,7 @@
                 bool		bDoPrintSelection;
                 bool		bDoPrintToFile;
                 bool		bDoCollate;
+		bool		bDoReverse;
                 bool		bEnablePrintToFile;
                 bool		bEnableSelection;
                 bool		bEnablePageRange;
Index: src/af/xap/xp/xap_Dlg_Print.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/xap/xp/xap_Dlg_Print.cpp,v
retrieving revision 1.14
diff -u -r1.14 xap_Dlg_Print.cpp
--- src/af/xap/xp/xap_Dlg_Print.cpp	20 Mar 2002 17:44:45 -0000	1.14
+++ src/af/xap/xp/xap_Dlg_Print.cpp	5 Feb 2003 18:59:38 -0000
@@ -38,6 +38,7 @@
         m_bPersistValid = false;
         m_persistNrCopies = 1;
         m_persistCollate = false;
+	m_persistReverse = false;
         m_persistColorSpace = GR_Graphics::GR_COLORSPACE_COLOR;	/* full color is default */
         m_persistPrintToFile = false;
 
@@ -202,7 +203,14 @@
 {
         UT_ASSERT(m_answer == a_OK);
 
-	return m_persistCollate;
+	return m_bCollate;
+}
+
+bool XAP_Dialog_Print::getReverse(void) const
+{
+	UT_ASSERT(m_answer == a_OK);
+
+	return m_bReverse;
 }
 
 GR_Graphics::ColorSpace XAP_Dialog_Print::getColorSpace(void) const
Index: src/af/xap/xp/xap_Dlg_Print.h
===================================================================
RCS file: /cvsroot/abi/src/af/xap/xp/xap_Dlg_Print.h,v
retrieving revision 1.11
diff -u -r1.11 xap_Dlg_Print.h
--- src/af/xap/xp/xap_Dlg_Print.h	6 Feb 2001 22:54:25 -0000	1.11
+++ src/af/xap/xp/xap_Dlg_Print.h	5 Feb 2003 18:59:39 -0000
@@ -54,6 +54,7 @@
         bool							getDoPrintToFile(const char *) const;
         UT_uint32						getNrCopies(void) const;
         bool							getCollate(void) const;
+	bool							getReverse(void) const;
         GR_Graphics::ColorSpace			getColorSpace(void) const;
         
         virtual GR_Graphics *			getPrinterGraphicsContext(void) = 0;
@@ -66,6 +67,7 @@
         UT_uint32						m_bPersistValid;		/* persists (internal) */
         UT_uint32						m_persistNrCopies;		/* persists (internal) */
         bool							m_persistCollate;		/* persists (internal) */
+	bool							m_persistReverse;		/* persists (internal) */
         GR_Graphics::ColorSpace			m_persistColorSpace;	/* persists (internal) */
         bool							m_persistPrintToFile;	/* persists (internal) */
 
@@ -77,8 +79,10 @@
         bool							m_bEnablePrintToFile;	/* input */
         bool							m_bDoPrintRange;		/* output */
         bool							m_bDoPrintSelection;	/* output */
-	bool							m_bDoPrintToFile;		/* output */
-	bool							m_bCollate;				/* output */
+	bool							m_bDoPrintToFile;	/* output */
+	bool							m_bCollate;		/* output */
+	bool							m_bReverse;		/* output */
+
         GR_Graphics::ColorSpace			m_cColorSpace;			/* output */
         UT_uint32						m_nFirstPage;			/* input/output */
         UT_uint32						m_nLastPage;			/* input/output */
Index: src/af/xap/xp/xap_String_Id.h
===================================================================
RCS file: /cvsroot/abi/src/af/xap/xp/xap_String_Id.h,v
retrieving revision 1.78.2.1
diff -u -r1.78.2.1 xap_String_Id.h
--- src/af/xap/xp/xap_String_Id.h	21 Aug 2002 07:23:08 -0000	1.78.2.1
+++ src/af/xap/xp/xap_String_Id.h	5 Feb 2003 18:59:46 -0000
@@ -154,6 +154,7 @@
 dcl(DLG_UP_To,							" to ")
 dcl(DLG_UP_Selection,					"Selection")
 dcl(DLG_UP_Collate, 					"Collate")
+dcl(DLG_UP_Reverse, 					"Reverse Order")
 dcl(DLG_UP_EmbedFonts,					"Embed Fonts")
 dcl(DLG_UP_Copies,						"Copies: ")
 dcl(DLG_UP_PrintButton, 				"Print")
Index: src/wp/ap/xp/ap_EditMethods.cpp
===================================================================
RCS file: /cvsroot/abi/src/wp/ap/xp/ap_EditMethods.cpp,v
retrieving revision 1.477.2.8
diff -u -r1.477.2.8 ap_EditMethods.cpp
--- src/wp/ap/xp/ap_EditMethods.cpp	2 Aug 2002 08:39:39 -0000	1.477.2.8
+++ src/wp/ap/xp/ap_EditMethods.cpp	5 Feb 2003 19:00:52 -0000
@@ -5635,7 +5635,7 @@
 
 bool s_actuallyPrint(PD_Document *doc,  GR_Graphics *pGraphics,
                      FV_View * pPrintView, const char *pDocName,
-		     UT_uint32 nCopies, bool bCollate,
+		     UT_uint32 nCopies, bool bCollate, bool bReverse,
                      UT_sint32 iWidth,  UT_sint32 iHeight,
                      UT_uint32 nToPage, UT_uint32 nFromPage)
 {
@@ -5663,16 +5663,50 @@
 
           XML_Char msgBuf [1024];
 
-		if (bCollate)
+		if (bCollate&&bReverse)
+		{
+			for (k=nToPage; (k >= nFromPage); k--)
+				for (j=1; (j <= nCopies); j++)
+				{
+				sprintf (msgBuf, msgTmpl, k, nToPage);
+				pFrame->setStatusMessage ( msgBuf );
+				pFrame->nullUpdate();
+
+		  		// NB we will need a better way to calc
+				// pGraphics->m_iRasterPosition when
+				// iHeight is allowed to vary page to page
+				pGraphics->m_iRasterPosition = (k-1)*iHeight;
+				pGraphics->startPage(pDocName, k, orient, iWidth, iHeight);
+				pPrintView->draw(k-1, &da);
+			}
+		}
+		else if(bCollate)
+		{
+			for (k=nFromPage; (k <= nToPage); k++)
+				for (j=1; (j <= nCopies); j++)
+				{
+					sprintf (msgBuf, msgTmpl, k, nToPage);
+					pFrame->setStatusMessage ( msgBuf );
+					pFrame->nullUpdate();
+
+					// NB we will need a better way to calc
+					// pGraphics->m_iRasterPosition when
+					// iHeight is allowed to vary page to page
+					pGraphics->m_iRasterPosition = (k-1)*iHeight;
+					pGraphics->startPage(pDocName, k, orient, iWidth, iHeight);
+					pPrintView->draw(k-1, &da);
+				}
+		}
+		else if(bReverse)
                 {
                         for (j=1; (j <= nCopies); j++)
-				for (k=nFromPage; (k <= nToPage); k++)
+				for (k=nToPage; (k >= nFromPage); k--)
                                 {
                                         sprintf (msgBuf, msgTmpl, k, nToPage);
                                         pFrame->setStatusMessage ( msgBuf );
                                         pFrame->nullUpdate();
 
-			  // NB we will need a better way to calc
+					// NB we will need a better way to calc
                                         // pGraphics->m_iRasterPosition when
                                         // iHeight is allowed to vary page to page
                                         pGraphics->m_iRasterPosition = (k-1)*iHeight;
@@ -5682,8 +5716,8 @@
                 }
                 else
                 {
-			for (k=nFromPage; (k <= nToPage); k++)
-				for (j=1; (j <= nCopies); j++)
+			for (j=1; (j <= nCopies); j++)
+				for (k=nFromPage; (k <= nToPage); k++)
                                 {
                                         sprintf (msgBuf, msgTmpl, k, nToPage);
                                         pFrame->setStatusMessage ( msgBuf );
@@ -5774,6 +5808,7 @@
 
                 UT_uint32 nCopies = pDialog->getNrCopies();
                 bool bCollate = pDialog->getCollate();
+		bool bReverse = pDialog->getReverse();
 
                 // TODO these are here temporarily to make printing work.  We'll fix the hack later.
                 // BUGBUG assumes all pages are same size and orientation
@@ -5782,7 +5817,7 @@
 
                 const char *pDocName = ((doc->getFilename()) ? doc->getFilename() : pFrame->getTempNameFromTitle());
 
-		s_actuallyPrint(doc, pGraphics, pPrintView, pDocName, nCopies, bCollate,
+		s_actuallyPrint(doc, pGraphics, pPrintView, pDocName, nCopies, bCollate,bReverse,
                                 iWidth,  iHeight, nToPage, nFromPage);
 
                 delete pDocLayout;
@@ -5851,6 +5886,7 @@
 
         UT_uint32 nCopies = 1;
         bool bCollate  = false;
+	bool bReverse  = false;
 
         // TODO these are here temporarily to make printing work.  We'll fix the hack later.
         // BUGBUG assumes all pages are same size and orientation
@@ -5859,7 +5895,7 @@
 
         const char *pDocName = ((doc->getFilename()) ? doc->getFilename() : pFrame->getTempNameFromTitle());
 
-	s_actuallyPrint(doc, pGraphics, pPrintView, pDocName, nCopies, bCollate,
+	s_actuallyPrint(doc, pGraphics, pPrintView, pDocName, nCopies, bCollate,bReverse,
                         iWidth,  iHeight, nToPage, nFromPage);
 
         delete pDocLayout;
Index: src/wp/ap/xp/ap_EditMethods.h
===================================================================
RCS file: /cvsroot/abi/src/wp/ap/xp/ap_EditMethods.h,v
retrieving revision 1.1.10.2
diff -u -r1.1.10.2 ap_EditMethods.h
--- src/wp/ap/xp/ap_EditMethods.h	2 Aug 2002 08:27:55 -0000	1.1.10.2
+++ src/wp/ap/xp/ap_EditMethods.h	5 Feb 2003 19:00:52 -0000
@@ -27,7 +27,7 @@
 // defined in ap_editmethods.cpp
 bool s_actuallyPrint(PD_Document *doc,  GR_Graphics *pGraphics,
                      FV_View * pPrintView, const char *pDocName,
-		     UT_uint32 nCopies, bool bCollate,
+		     UT_uint32 nCopies, bool bCollate, bool bReverse,
                      UT_sint32 inWidth,  UT_sint32 inHeight,
                      UT_uint32 nToPage, UT_uint32 nFromPage) ;
 
This archive was generated by hypermail 2.1.4 : Wed Feb 05 2003 - 16:15:23 EST