summaryrefslogtreecommitdiff
path: root/platform/windows/gsview/gsprintbg.cs
diff options
context:
space:
mode:
Diffstat (limited to 'platform/windows/gsview/gsprintbg.cs')
-rw-r--r--platform/windows/gsview/gsprintbg.cs261
1 files changed, 261 insertions, 0 deletions
diff --git a/platform/windows/gsview/gsprintbg.cs b/platform/windows/gsview/gsprintbg.cs
new file mode 100644
index 00000000..199258e3
--- /dev/null
+++ b/platform/windows/gsview/gsprintbg.cs
@@ -0,0 +1,261 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.ComponentModel;
+using System.IO;
+using System.IO.Packaging;
+using System.Printing;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Documents.Serialization;
+using System.Windows.Media;
+using System.Windows.Xps;
+using System.Windows.Xps.Packaging;
+using System.Windows.Xps.Serialization;
+using System.Threading;
+
+namespace gsview
+{
+ public enum PrintStatus_t
+ {
+ PRINT_READY,
+ PRINT_BUSY,
+ PRINT_ERROR
+ };
+
+ public enum PrintResult_t
+ {
+ PrintOK,
+ PrintFAILED,
+ PrintCANCELLED,
+ PrintCOMPLETED
+ }
+
+ public struct PrintParams_t
+ {
+ public int num_pages;
+ public int start_page;
+ public int end_page;
+ public PrintQueue queu;
+ public FixedDocumentSequence fixdoc;
+ public PrintResult_t result;
+ public PrintStatus_t status;
+
+ };
+
+ public class PrintEventArgs : EventArgs
+ {
+ private PrintStatus_t m_status;
+ private PrintResult_t m_result;
+ private int m_percentdone;
+
+ public PrintStatus_t Status
+ {
+ get { return m_status; }
+ }
+
+ public PrintResult_t Result
+ {
+ get { return m_result; }
+ }
+
+ public int Percent
+ {
+ get { return m_percentdone; }
+ }
+
+ public PrintEventArgs(PrintStatus_t status, PrintResult_t completed, int percent)
+ {
+ m_status = status;
+ m_result = completed;
+ m_percentdone = percent;
+ }
+ }
+
+ public class gsprintbg
+ {
+ BackgroundWorker m_worker;
+ private XpsDocumentWriter m_docWriter = null;
+ PrintParams_t m_pparams;
+
+ internal delegate void PrintCallBackMain(object gsObject, PrintEventArgs info);
+ internal event PrintCallBackMain PrintUpdateMain;
+
+ private void PrintProgressChanged(object sender, ProgressChangedEventArgs e)
+ {
+ /* Callback with progress */
+ PrintEventArgs info = new PrintEventArgs(m_pparams.status, m_pparams.result, e.ProgressPercentage);
+ if (PrintUpdateMain != null)
+ PrintUpdateMain(this, info);
+ }
+
+ /* Callback */
+ private void PrintCompleted(object sender, RunWorkerCompletedEventArgs e)
+ {
+ PrintParams_t Value;
+ PrintEventArgs info;
+ PrintParams_t Params = (PrintParams_t)e.Result;
+
+ if (e.Cancelled)
+ {
+ info = new PrintEventArgs(PrintStatus_t.PRINT_READY, PrintResult_t.PrintCANCELLED, 100);
+ }
+ else
+ {
+ Value = (PrintParams_t)e.Result;
+ info = new PrintEventArgs(PrintStatus_t.PRINT_READY, PrintResult_t.PrintCOMPLETED, 100);
+ }
+ PrintUpdateMain(this, info);
+ }
+
+
+ /* Show std. print dialog */
+ public PrintDialog GetPrintDialog()
+ {
+ PrintDialog dlg = new PrintDialog();
+ /* Current page and page ranges is going to require a little work */
+ dlg.PageRangeSelection = PageRangeSelection.AllPages;
+ //dlg.UserPageRangeEnabled = true;
+ //dlg.CurrentPageEnabled = true;
+ dlg.SelectedPagesEnabled = false;
+ if (dlg.ShowDialog() == true)
+ return dlg;
+ return null;
+ }
+
+ /* Main print entry point */
+ private void Print(PrintParams_t pparams)
+ {
+ XpsDocumentWriter docwrite = GetDocWriter(pparams.queu);
+ docwrite.WritingPrintTicketRequired +=
+ new WritingPrintTicketRequiredEventHandler(PrintTicket);
+ PrintPages(docwrite, pparams.fixdoc);
+ }
+
+ /* Send it */
+ private void PrintPages(XpsDocumentWriter xpsdw, FixedDocumentSequence fixdoc)
+ {
+ m_docWriter = xpsdw;
+ xpsdw.WritingCompleted +=
+ new WritingCompletedEventHandler(AsyncCompleted);
+ xpsdw.WritingProgressChanged +=
+ new WritingProgressChangedEventHandler(AsyncProgress);
+ xpsdw.WriteAsync(fixdoc);
+ }
+
+ private void CancelAsync()
+ {
+ /* ick. This does not work in windows 8. causes crash */
+ /* https://connect.microsoft.com/VisualStudio/feedback/details/778145/xpsdocumentwriter-cancelasync-cause-crash-in-win8 */
+ m_docWriter.CancelAsync();
+ }
+
+ /* Done */
+ private void AsyncCompleted(object sender, WritingCompletedEventArgs e)
+ {
+ if (e.Cancelled)
+ m_pparams.result = PrintResult_t.PrintCANCELLED;
+ else if (e.Error != null)
+ m_pparams.result = PrintResult_t.PrintFAILED;
+ else
+ m_pparams.result = PrintResult_t.PrintCOMPLETED;
+ m_worker.ReportProgress(100);
+ }
+
+ /* Do this update with each fixed document (page) that is handled */
+ private void AsyncProgress(object sender, WritingProgressChangedEventArgs e)
+ {
+ double perc = 100.0 * (double) e.Number / (double) m_pparams.num_pages;
+ m_worker.ReportProgress((int) perc);
+ }
+
+ /* Print ticket handling. You can customize for PrintTicketLevel at
+ FixedDocumentSequencePrintTicket, FixedDocumentPrintTicket,
+ or FixedPagePrintTicket. We may want to play around with this some */
+ private void PrintTicket(Object sender, WritingPrintTicketRequiredEventArgs e)
+ {
+ if (e.CurrentPrintTicketLevel ==
+ PrintTicketLevel.FixedDocumentSequencePrintTicket)
+ {
+ PrintTicket pts = new PrintTicket();
+ pts.PageOrientation = PageOrientation.Portrait;
+ e.CurrentPrintTicket = pts;
+ }
+ }
+
+ /* Create the document write */
+ private XpsDocumentWriter GetDocWriter(PrintQueue pq)
+ {
+ XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq);
+ return xpsdw;
+ }
+
+
+ private void PrintWork(object sender, DoWorkEventArgs e)
+ {
+ PrintParams_t PParams = (PrintParams_t)e.Argument;
+ BackgroundWorker worker = sender as BackgroundWorker;
+
+ Print(PParams);
+ }
+
+ public bool IsBusy()
+ {
+ if (m_worker != null)
+ return m_worker.IsBusy;
+ else
+ return false;
+ }
+
+ public void PrintWorkThread(object data)
+ {
+ PrintParams_t PParams = (PrintParams_t) data;
+ Print(PParams);
+ }
+
+ public PrintStatus_t StartPrint(PrintParams_t pparams)
+ {
+ try
+ {
+ if (m_worker != null && m_worker.IsBusy)
+ {
+ m_worker.CancelAsync();
+ return PrintStatus_t.PRINT_BUSY;
+ }
+
+ if (m_worker == null)
+ {
+
+ Thread asyncThread = new Thread(PrintWorkThread);
+ asyncThread.SetApartmentState(ApartmentState.STA);
+ asyncThread.Start(pparams);
+
+ /* m_worker = new BackgroundWorker();
+ m_worker.WorkerReportsProgress = true;
+ m_worker.WorkerSupportsCancellation = true;
+ m_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(PrintCompleted);
+ m_worker.ProgressChanged += new ProgressChangedEventHandler(PrintProgressChanged);
+ m_worker.DoWork += new DoWorkEventHandler(PrintWork);*/
+ }
+
+ ////m_pparams = pparams;
+ //m_worker.RunWorkerAsync(pparams);
+ pparams.status = PrintStatus_t.PRINT_BUSY;
+ return PrintStatus_t.PRINT_READY;
+ }
+ catch (OutOfMemoryException e)
+ {
+ Console.WriteLine("Memory allocation failed during printing\n");
+ return PrintStatus_t.PRINT_ERROR;
+ }
+ }
+
+
+ public void Cancel()
+ {
+ m_worker.CancelAsync();
+ }
+ }
+}