Fix for BCPL string handling.
[AROS-Contrib.git] / vpdf / printer.c
blob7ab52342761963609f55ff73edcc0be9b7ac2660
1 #if defined(__AROS__)
2 #define MUIMASTER_YES_INLINE_STDARG
3 #endif
5 /// System includes
6 #define AROS_ALMOST_COMPATIBLE
7 #include <proto/muimaster.h>
8 #include <libraries/mui.h>
10 #include <proto/exec.h>
11 #include <intuition/intuition.h>
12 #include <graphics/gfx.h>
13 #include <exec/libraries.h>
14 #include <proto/graphics.h>
15 #include <proto/intuition.h>
16 #include <proto/locale.h>
17 #include <mui/Rawimage_mcc.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <math.h>
22 #include <memory.h>
24 #include <proto/alib.h>
25 #include <proto/utility.h>
27 ////
29 #include <private/vapor/vapor.h>
30 #include "util.h"
31 #include "poppler_printer.h"
32 #include "printer.h"
33 #include "pagenumberclass.h"
34 #include "arrowstring_class.h"
35 #include "system/functions.h"
36 #include "locale.h"
37 #include "settings.h"
38 #include "poppler.h"
39 #include "printer_image.h"
43 struct Data
45 Object *strOutput;
46 Object *sldFirst;
47 Object *sldLast;
48 Object *cycOddEven;
49 Object *txtStatus;
50 Object *btnPrint;
51 Object *btnCancel;
52 Object *chkPS;
53 Object *btnPrefs;
54 Object *chkAutorotatescale;
55 Object *strNumbers;
56 Object *grpRight;
57 Object *chkReverse;
58 Object *chkCollate;
59 Object *strCopies;
60 Object *cycPSVersion;
61 Object *grpCollate;
62 Object *btnReset;
63 Object *grpPage;
64 Object *gauge;
65 Object *cycPageScaling;
66 Object *cycPagesPerSheet;
67 Object *cycPagesOrder;
68 Object *proc;
70 void *doc;
71 char status[256];
72 int printing;
73 int quit;
74 int close;
75 int max;
77 struct printerjob pj;
82 #define D(x) x
83 void kprintf(char *fmt,...);
85 static STRPTR oddeven[4] = {NULL};
86 static STRPTR scaling_modes[4] = {NULL};
87 static STRPTR pages_per_sheet[] = {"2", "4", "6", "9", "Custom", NULL};
88 static STRPTR pages_order[10] = {NULL};
89 static char *ps_levels[] = {"Level 2", "Level 3", NULL};
92 int pages_per_sheet_table[] = {2, 4, 6, 9, 99};
94 DEFNEW
96 Object *grpPage, *gauge, *strOutput, *sldFirst, *sldLast, *cycOddEven, *btnPrint, *btnCancel,
97 *btnCancel2, *txtStatus, *chkPS, *btnPrefs, *chkAutorotatescale;
98 Object *right_group, *strNumbers, *grpRight, *grpLeft, *chkReverse,
99 *strCopies, *chkCollate, *grpCollate, *btnReset, *cycPSVersion, *grpPSOutput;
100 Object *second_page, *cycPageScaling, *grpPageHandling, *grpDriver, *grpPagesPerSheet1,
101 *grpPagesPerSheet2, *grpPagesOrder1, *grpPagesOrder2, *cycPagesPerSheet, *cycPagesOrder;
102 Object *free_grp;
104 oddeven[0] = LOCSTR(MSG_PRINTER_ODDEVEN);
105 oddeven[1] = LOCSTR(MSG_PRINTER_ODD);
106 oddeven[2] = LOCSTR(MSG_PRINTER_EVEN);
107 scaling_modes[0] = LOCSTR(MSG_PRINTER_NONE);
108 scaling_modes[1] = LOCSTR(MSG_PRINTER_BEST);
109 scaling_modes[2] = LOCSTR(MSG_PRINTER_MULTIPLE);
110 pages_per_sheet[4] = LOCSTR(MSG_PRINTER_CUSTOM);
111 pages_order[0] = LOCSTR(MSG_PRINTER_HORIZONTAL_VERTICAL);
112 pages_order[1] = LOCSTR(MSG_PRINTER_HORIZONTAL_VERTICALREVERSED);
113 pages_order[2] = LOCSTR(MSG_PRINTER_HORIZONTALREVERSED_VERTICAL) ;
114 pages_order[3] = LOCSTR(MSG_PRINTER_HORIZONTALREVERSED_VERTICAL_REVERSED);
115 pages_order[4] = LOCSTR(MSG_PRINTER_VERTICAL_HORIZONTAL);
116 pages_order[5] = LOCSTR(MSG_PRINTER_VERTICALREVERSED_HORIZONTAL);
117 pages_order[6] = LOCSTR(MSG_PRINTER_VERTICAL_HORIZONTALREVERSED) ;
118 pages_order[7] = LOCSTR(MSG_PRINTER_VERTICAL_REVERSED_HORIZONTALREVERSED);
120 second_page = VGroup,
121 Child, HVSpace,
122 Child, HGroup,
123 Child, HSpace(0),
124 Child, RawimageObject, MUIA_Rawimage_Data, Printer, End,
126 //MUI_NewObject("Dtpic.mui",MUIA_Dtpic_Name, "progdir:printer.png", End,
127 Child, HSpace(0),
128 End,
129 Child, HVSpace,
130 Child, HGroup,
131 Child, HSpace(0),
132 Child, gauge = GaugeObject,
133 MUIA_Gauge_Horiz, TRUE,
134 MUIA_Frame, MUIV_Frame_Gauge,
135 MUIA_Gauge_InfoText, " ",
136 End,
137 Child, HSpace(0),
138 End,
139 Child, HGroup,
140 Child, HSpace(0),
141 Child, btnCancel = SimpleButton( LOCSTR( MSG_PRINTER_ABORT )),
142 Child, HSpace(0),
143 End,
144 Child, HVSpace,
145 End;
147 right_group = MUI_NewObject(MUIC_Group,
148 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
149 MUIA_Frame, MUIV_Frame_Group,
150 MUIA_Background, MUII_GroupBack,
151 MUIA_FrameTitle, LOCSTR( MSG_PRINTER_RANGE ),
152 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
153 MUIA_Group_Columns, 2,
154 MUIA_Group_Child, MUI_NewObject(MUIC_Text,
155 MUIA_Text_Contents, LOCSTR( MSG_PRINTER_PAGES ),
156 MUIA_Text_SetMax, FALSE,
157 MUIA_Text_PreParse, (LONG)"\33r",
158 MUIA_Frame, MUIV_Frame_Button,
159 MUIA_FramePhantomHoriz, TRUE,
160 MUIA_HorizWeight, 1,
161 TAG_END),
162 MUIA_Group_Child, cycOddEven = MUI_NewObject(MUIC_Cycle,
163 MUIA_Cycle_Entries, oddeven,
164 TAG_END),
165 MUIA_Group_Child, (grpLeft = MUI_NewObject(MUIC_Group,
166 MUIA_HorizWeight, 1,
167 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
168 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
169 MUIA_Frame, MUIV_Frame_Slider,
170 MUIA_FramePhantomHoriz, TRUE,
171 MUIA_Group_Child, MUI_NewObject(MUIC_Text,
172 MUIA_Text_Contents, LOCSTR( MSG_PRINTER_FIRSTPAGE ),
173 MUIA_Text_PreParse, "\33r",
174 #if !defined(__AROS__)
175 // FIXMI: AROS
176 MUIA_Frame, MUIV_Frame_SliderKnob,
177 #endif
178 MUIA_FramePhantomHoriz, TRUE,
179 TAG_END),
180 TAG_END),
181 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
182 MUIA_Frame, MUIV_Frame_Slider,
183 MUIA_FramePhantomHoriz, TRUE,
184 MUIA_Group_Child, MUI_NewObject(MUIC_Text,
185 MUIA_Text_Contents, LOCSTR( MSG_PRINTER_LASTPAGE ),
186 MUIA_Text_PreParse, "\33r",
187 #if !defined(__AROS__)
188 // FIXMI: AROS
189 MUIA_Frame, MUIV_Frame_SliderKnob,
190 #endif
191 MUIA_FramePhantomHoriz, TRUE,
192 TAG_END),
193 TAG_END),
194 TAG_END),
195 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
196 MUIA_Group_Child, MUI_NewObject(MUIC_Text,
197 MUIA_Text_Contents, LOCSTR(MSG_PRINTER_MANUAL),
198 MUIA_Text_PreParse, "\33r",
199 MUIA_Frame, MUIV_Frame_String,
200 MUIA_FramePhantomHoriz, TRUE,
201 TAG_END),
202 MUIA_Group_Child, MUI_NewObject(MUIC_Rectangle,
203 TAG_END),
204 TAG_END),
205 TAG_END)),
206 MUIA_Group_Child, (grpRight = MUI_NewObject(MUIC_Group,
207 MUIA_Group_Child, MUI_NewObject(MUIC_Group,
208 MUIA_Group_Child, sldFirst = MUI_NewObject(MUIC_Slider,
209 MUIA_Slider_Min, 1,
210 MUIA_Slider_Max, 1, // will be corrected when opened
211 MUIA_Frame, MUIV_Frame_Slider,
212 TAG_END),
213 MUIA_Group_Child, sldLast = MUI_NewObject(MUIC_Slider,
214 MUIA_Slider_Min, 1,
215 MUIA_Slider_Max, 1, // will be corrected when opened
216 MUIA_Frame, MUIV_Frame_Slider,
217 TAG_END),
218 TAG_END),
219 MUIA_Group_Child, HGroup,
220 Child, MUI_NewObject(MUIC_Group,
221 MUIA_Group_Child, strNumbers = VPDFNumberGenerator, End,
222 TAG_END),
223 Child, btnReset = TextObject,
224 ButtonFrame,
225 //MUIA_ShowMe, FALSE,
226 MUIA_Font , MUIV_Font_Button,
227 MUIA_Text_Contents , LOCSTR(MSG_PRINTER_RESET),
228 MUIA_Text_PreParse , "\33c",
229 MUIA_InputMode , MUIV_InputMode_RelVerify,
230 MUIA_Background , MUII_ButtonBack,
231 MUIA_Text_SetMax, TRUE,
232 End,
233 End,
234 TAG_END)),
236 TAG_END),
237 Child, HGroup,
238 Child, chkReverse = CheckMark(FALSE),
239 Child, TextObject, MUIA_Text_Contents, LOCSTR(MSG_PRINTER_REVERSE), End,
240 End,
241 TAG_END),
242 TAG_END);
244 grpPageHandling = VGroup,
245 MUIA_Frame, MUIV_Frame_Group,
246 MUIA_Background, MUII_GroupBack,
247 MUIA_FrameTitle, (LONG)LOCSTR(MSG_PRINTER_ORIENTATION),
248 Child, ColGroup(2),
249 Child, Label(LOCSTR(MSG_PRINTER_COPIES)),
250 Child, HGroup,
251 Child, strCopies= ArrowStringObject,
252 MA_ArrowString_Min, 1,
253 End,
254 Child, HVSpace,
255 Child, grpCollate = HGroup,
256 MUIA_ShowMe, FALSE,
257 Child, chkCollate = CheckMark(TRUE),
258 Child, MUI_NewObject(MUIC_Text,
259 MUIA_Text_Contents, LOCSTR(MSG_PRINTER_COLLATE),
260 MUIA_Text_SetMax, TRUE,
261 TAG_END),
262 End,
263 End,
264 Child, Label(LOCSTR(MSG_PRINTER_SCALING)),
265 Child, cycPageScaling = CycleObject,
266 MUIA_Cycle_Entries, scaling_modes,
267 End,
268 Child, grpPagesPerSheet1 = PageGroup,
269 MUIA_HorizWeight, 1,
270 Child, Label(" "),
271 Child, Label(LOCSTR(MSG_PRINTER_PAGESPERSHEET)),
272 End,
273 Child, grpPagesPerSheet2 = PageGroup,
274 MUIA_HorizWeight, 1,
275 Child, Label(" "),
276 Child, HGroup,
277 Child, cycPagesPerSheet = CycleObject,
278 MUIA_Cycle_Entries, pages_per_sheet,
279 End,
280 Child, free_grp = HGroup,
281 MUIA_ShowMe, FALSE,
282 Child, StringObject,
283 MUIA_String_Accept, "0123456789",
284 MUIA_Frame, MUIV_Frame_String,
285 MUIA_String_MaxLen, 3,
286 MUIA_FixWidthTxt, "12",
287 End,
288 Child, MUI_NewObject(MUIC_Text,
289 MUIA_Text_Contents, "/",
290 MUIA_Text_SetMax, TRUE,
291 TAG_END),
292 Child, StringObject,
293 MUIA_String_Accept, "0123456789",
294 MUIA_Frame, MUIV_Frame_String,
295 MUIA_String_MaxLen, 3,
296 MUIA_FixWidthTxt, "12",
297 End,
299 End,
300 End,
301 End,
302 Child, grpPagesOrder1 = PageGroup,
303 MUIA_HorizWeight, 1,
304 Child, Label(" "),
305 Child, Label(LOCSTR(MSG_PRINTER_ORDER)),
306 End,
307 Child, grpPagesOrder2 = PageGroup,
308 MUIA_HorizWeight, 1,
309 Child, Label(" "),
310 Child, cycPagesOrder = CycleObject,
311 MUIA_Cycle_Entries, pages_order,
312 End,
313 End,
314 End,
315 Child, HVSpace,
316 Child, HGroup,
317 Child, chkAutorotatescale = CheckMark(TRUE),
318 Child, TextObject,
319 MUIA_Text_Contents, LOCSTR(MSG_PRINTER_AUTOROTATE),
320 End,
321 End,
323 End;
325 grpDriver = VGroup,
326 MUIA_Frame, MUIV_Frame_Group,
327 MUIA_Background, MUII_GroupBack,
328 MUIA_FrameTitle, (LONG)LOCSTR(MSG_PRINTER_DRIVER),
329 Child, btnPrefs = SimpleButton(LOCSTR(MSG_PRINTER_PREFERENCES)),
330 Child, HGroup,
331 Child, HGroup,
332 MUIA_Weight, 1,
333 MUIA_Frame, MUIV_Frame_Button,
334 MUIA_FramePhantomHoriz, TRUE,
335 Child, chkPS = CheckMark(TRUE),
336 Child, TextObject,
337 MUIA_Text_Contents, "PostScript",
339 End,
340 End,
341 Child, grpPSOutput = HGroup,
342 MUIA_Weight, 90,
343 Child, cycPSVersion = MUI_NewObject(MUIC_Cycle,
344 MUIA_Cycle_Entries, ps_levels,
345 TAG_END),
346 Child, HVSpace,
347 Child, Label(LOCSTR(MSG_PRINTER_OUTPUT)),
348 Child, strOutput = StringObject,
349 MUIA_Frame, MUIV_Frame_String,
350 MUIA_String_Contents, "PS:",
351 MUIA_String_MaxLen, 512,
352 End,
353 End,
354 End,
355 End;
358 obj = DoSuperNew(cl, obj,
359 MUIA_Window_Title, LOCSTR(MSG_PRINTER_WINTITLE),
360 // MUIA_Window_Width, MUIV_Window_Width_Screen(50),
361 // MUIA_Window_Height, MUIV_Window_Height_Screen(50),
362 MUIA_Window_ID, MAKE_ID('P','R','T','N'),
363 MUIA_Window_AppWindow, FALSE,
364 MUIA_Window_RootObject, grpPage = PageGroup,
365 Child, VGroup,
366 Child, HGroup,
367 Child, VGroup,
368 Child, grpDriver,
369 Child, right_group,
370 End,
371 Child, grpPageHandling,
372 End,
374 Child, HGroup,
375 Child, btnPrint = SimpleButton(LOCSTR(MSG_PRINTER_PRINT)),
376 Child, HSpace(0),
377 Child, btnCancel2 = SimpleButton(LOCSTR(MSG_PRINTER_CANCEL)),
378 End,
379 End,
380 Child, second_page,
381 End,
382 TAG_MORE, INITTAGS);
383 if (obj != NULL)
386 GETDATA;
387 memset(data, 0, sizeof(struct Data));
389 data->sldFirst = sldFirst;
390 data->sldLast = sldLast;
391 data->btnPrint = btnPrint;
392 data->btnCancel = btnCancel;
393 data->strOutput = strOutput;
394 data->txtStatus = txtStatus;
395 data->cycOddEven = cycOddEven;
396 data->chkPS = chkPS;
397 data->chkAutorotatescale = chkAutorotatescale;
398 data->strNumbers = strNumbers;
399 data->grpRight = grpRight;
400 data->chkReverse = chkReverse;
401 data->chkCollate = chkCollate;
402 data->strCopies = strCopies;
403 data->grpCollate = grpCollate;
404 data->btnReset = btnReset;
405 data->grpPage = grpPage;
406 data->cycPSVersion = cycPSVersion;
407 data->gauge = gauge;
408 data->cycPageScaling = cycPageScaling;
409 data->cycPagesPerSheet = cycPagesPerSheet;
410 data->cycPagesOrder = cycPagesOrder;
411 data->max = 1;
413 data->proc = MUI_NewObject(MUIC_Process,
414 MUIA_Process_SourceClass , cl,
415 MUIA_Process_SourceObject, obj,
416 MUIA_Process_Name , "[VPDF]: Printing process",
417 MUIA_Process_Priority , -1,
418 MUIA_Process_AutoLaunch , FALSE,
419 MUIA_Process_StackSize , 1000000,
420 TAG_DONE);
422 DoMethod(data->proc, MUIM_Process_Launch);
424 DoMethod(btnPrint, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_VPDFPrinter_Start);
425 DoMethod(btnCancel, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_VPDFPrinter_Stop);
426 DoMethod(btnPrefs, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_VPDFPrinter_PrinterPrefs);
427 DoMethod(chkPS, MUIM_Notify, MUIA_Selected, MUIV_EveryTime, grpPSOutput, 3, MUIM_Set, MUIA_ShowMe, MUIV_TriggerValue);
428 DoMethod(strCopies, MUIM_Notify, MUIA_String_Integer, MUIV_EveryTime, obj, 2, MUIM_VPDFPrinter_HideCollate, MUIV_TriggerValue);
430 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 2, grpPagesPerSheet1, 3, MUIM_Set, MUIA_Group_ActivePage, 1);
431 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 2, grpPagesPerSheet2, 3, MUIM_Set, MUIA_Group_ActivePage, 1);
432 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 0, grpPagesPerSheet1, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
433 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 0, grpPagesPerSheet2, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
434 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 1, grpPagesPerSheet1, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
435 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 1, grpPagesPerSheet2, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
436 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 2, grpPagesOrder1, 3, MUIM_Set, MUIA_Group_ActivePage, 1);
437 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 2, grpPagesOrder2, 3, MUIM_Set, MUIA_Group_ActivePage, 1);
438 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 0, grpPagesOrder2, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
439 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 0, grpPagesOrder1, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
440 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 1, grpPagesOrder2, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
441 DoMethod(cycPageScaling, MUIM_Notify, MUIA_Cycle_Active, 1, grpPagesOrder1, 3, MUIM_Set, MUIA_Group_ActivePage, 0);
443 DoMethod(cycPagesPerSheet, MUIM_Notify, MUIA_Cycle_Active, 4, free_grp, 3, MUIM_Set, MUIA_ShowMe, TRUE);
444 DoMethod(cycPagesPerSheet, MUIM_Notify, MUIA_Cycle_Active, 1, free_grp, 3, MUIM_Set, MUIA_ShowMe, FALSE);
445 DoMethod(cycPagesPerSheet, MUIM_Notify, MUIA_Cycle_Active, 0, free_grp, 3, MUIM_Set, MUIA_ShowMe, FALSE);
446 DoMethod(cycPagesPerSheet, MUIM_Notify, MUIA_Cycle_Active, 2, free_grp, 3, MUIM_Set, MUIA_ShowMe, FALSE);
447 DoMethod(cycPagesPerSheet, MUIM_Notify, MUIA_Cycle_Active, 3, free_grp, 3, MUIM_Set, MUIA_ShowMe, FALSE);
449 DoMethod(sldFirst, MUIM_Notify, MUIA_Slider_Level, MUIV_EveryTime, data->strNumbers, 3, MUIM_Set, MUIA_VPDFNumberGeneratorPageStart, MUIV_TriggerValue);
450 DoMethod(sldLast, MUIM_Notify, MUIA_Slider_Level, MUIV_EveryTime, data->strNumbers, 3, MUIM_Set, MUIA_VPDFNumberGeneratorPageEnd, MUIV_TriggerValue);
451 DoMethod(btnReset, MUIM_Notify, MUIA_Pressed, FALSE, data->sldFirst, 3, MUIM_Set, MUIA_Slider_Level, 1);
453 DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, MUIV_EveryTime, obj, 1, MUIM_VPDFPrinter_Close);
454 DoMethod(btnCancel2, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, MUIM_VPDFPrinter_Close);
456 DoMethod(data->chkPS, MUIM_Notify, MUIA_Selected, MUIV_EveryTime, obj, 3, MUIM_Set, MUIA_VPDFPrinter_PrintingMode, MUIV_TriggerValue);
457 DoMethod(data->strOutput, MUIM_Notify, MUIA_String_Contents, MUIV_EveryTime, obj, 3, MUIM_Set, MUIA_VPDFPrinter_PSName, MUIV_TriggerValue);
458 DoMethod(data->cycPSVersion, MUIM_Notify, MUIA_Cycle_Active, MUIV_EveryTime, obj, 3, MUIM_Set, MUIA_VPDFPrinter_PSMode, MUIV_TriggerValue);
461 return (ULONG)obj;
466 DEFDISP
468 GETDATA;
470 data->quit = TRUE;
471 MUI_DisposeObject(data->proc);
473 return DOSUPER;
477 DEFMMETHOD(VPDFPrinter_PrintDocument)
479 GETDATA;
482 set(data->sldFirst, MUIA_Slider_Max, pdfGetPagesNum(msg->doc));
483 set(data->sldLast, MUIA_Slider_Max, pdfGetPagesNum(msg->doc));
484 set(data->sldLast, MUIA_Slider_Level, pdfGetPagesNum(msg->doc));
486 set(data->strNumbers, MUIA_VPDFNumberGeneratorPageMax, pdfGetPagesNum(msg->doc));
487 set(data->strNumbers, MUIA_VPDFNumberGeneratorPageEnd, pdfGetPagesNum(msg->doc));
488 data->max = pdfGetPagesNum(msg->doc);
489 data->doc = msg->doc;
490 data->close = FALSE;
491 data->quit = FALSE;
492 DoMethod(data->btnReset, MUIM_Notify, MUIA_Pressed, FALSE, data->sldLast, 3, MUIM_Set, MUIA_Slider_Level, data->max);
493 set(obj, MUIA_Window_Open, TRUE);
495 return TRUE;
499 DEFMMETHOD(VPDFPrinter_Start)
501 GETDATA;
502 char params[512], args[512], arg[32];
503 data->pj.first = 1;
504 data->pj.last = pdfGetPagesNum(data->doc);
506 data->pj.mode = !xget(data->chkPS, MUIA_Selected); // PS or Turboprint
508 if (data->pj.mode==1)
509 data->pj.mode = 2;
510 else
511 data->pj.mode = xget(data->cycPSVersion, MUIA_Cycle_Active);
513 data->pj.autorotatescale = xget(data->chkAutorotatescale, MUIA_Radio_Active);
514 data->pj.step = 1;
515 data->pj.reverse = xget(data->chkReverse, MUIA_Selected);
516 data->pj.step = xget(data->cycOddEven, MUIA_Cycle_Active);
519 data->pj.total_pages = DoMethod(data->strNumbers, MUIM_VPDFNumberGeneratorFirst, data->pj.reverse);
520 D(kprintf("total pages: %d", data->pj.total_pages));
522 data->pj.collate = xget(data->chkCollate, MUIA_Selected);
523 data->pj.copies = xget(data->strCopies, MUIA_String_Integer);
525 if (data->pj.copies==0)
527 data->pj.copies = 1;
528 set(data->strCopies, MUIA_String_Integer, 1);
531 if (data->pj.collate)
532 data->pj.total_pages *= data->pj.copies;
534 data->pj.page_scaling = xget(data->cycPageScaling, MUIA_Cycle_Active);
535 data->pj.pages_per_sheet = xget(data->cycPagesPerSheet, MUIA_Cycle_Active);
536 data->pj.pages_per_sheet = pages_per_sheet_table[data->pj.pages_per_sheet];
537 data->pj.pages_order = xget(data->cycPagesOrder, MUIA_Cycle_Active);
539 set (data->gauge, MUIA_Gauge_Max, data->pj.total_pages);
540 strncpy(data->pj.output, (char*)xget(data->strOutput, MUIA_String_Contents), sizeof(data->pj.output));
542 args[0]=0;
543 switch (data->pj.page_scaling)
545 case 1:
546 strcat(args, "fit-to-page ");
547 break;
548 case 2:
549 sprintf(arg, "number-up=%d ", data->pj.pages_per_sheet);
550 strcat(args, arg);
551 break;
552 default:
553 break;
556 sprintf(params, "COPIES=%d ARGS=/%s/ FORMAT=PS", data->pj.copies, args);
557 strcat(data->pj.output, params);
558 set(data->grpPage, MUIA_Group_ActivePage, 1);
560 // assuming printer thread is in ready status siting on Wait()
561 DoMethod(data->proc, MUIM_Process_Signal, SIGBREAKF_CTRL_D);
563 return TRUE;
566 DEFMMETHOD(VPDFPrinter_Stop)
568 GETDATA;
569 if (data->printing)
570 data->quit = TRUE; // this will signal printing thread which will 'recall' this method later
571 else
573 data->quit = FALSE;
575 DoMethod(obj, MUIM_VPDFPrinter_Done);
577 return TRUE;
581 DEFMMETHOD(VPDFPrinter_Done)
583 GETDATA;
585 data->printing = FALSE;
586 data->quit = FALSE;
588 if (data->close)
589 DoMethod(obj, MUIM_VPDFPrinter_Close);
591 set(data->grpPage, MUIA_Group_ActivePage, 0);
593 return TRUE;
596 DEFMMETHOD(VPDFPrinter_Close)
598 GETDATA;
600 if (!data->printing)
602 data->close = FALSE;
603 set(obj, MUIA_Window_Open, FALSE);
605 else
607 data->quit = TRUE;
608 data->close = TRUE;
611 return TRUE;
617 DEFMMETHOD(Process_Process)
619 GETDATA;
621 while(!*msg->kill)
623 Wait(SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_C);
625 if(data->quit == FALSE)
627 int i, j, k, h, pages_no;
628 struct printerjob *pj = &data->pj;
629 void *pctx;
631 D(kprintf("started printing:%d to %d\n", pj->first, pj->last));
633 data->printing = TRUE;
634 pctx = pdfPrintInit(data->doc, pj->output, pj->first, pj->last, pj);
635 if(pctx != NULL)
637 j = 0;
638 h = 0;
641 pages_no = 0; // for multipage mode
642 while((MUIV_VPDFNumberGeneratorEndPos != (i = DoMethod(data->strNumbers, MUIM_VPDFNumberGeneratorNext))) ||
643 ((pj->page_scaling==2 && (pages_no))))
645 if((pj->step == 1) && (i % 2 == 0)) continue;
646 if((pj->step == 2) && (i % 2 == 1)) continue;
648 DoMethod(_app(data->sldFirst), MUIM_Application_PushMethod, obj, 3, MUIM_VPDFPrinter_StatusUpdate, i, h);
650 k = 0;
653 int aaa;
654 pj->pages[0] = i;
655 pdfPrintPage(pctx, pj->pages, pj->autorotatescale, (pj->page_scaling==2)?pj->pages_per_sheet:1);
657 if(data->quit)
658 break;
659 k++;
660 } while ((k < pj->copies) && !pj->collate);
662 if(data->quit || (i==MUIV_VPDFNumberGeneratorEndPos))
663 break;
664 h++;
665 pages_no = 0;
667 j++;
668 if(data->quit)
669 break;
671 DoMethod(data->strNumbers, MUIM_VPDFNumberGeneratorFirst, pj->reverse);
673 while((j<pj->copies) && pj->collate);
675 else
677 DoMethod(_app(data->sldFirst), MUIM_Application_PushMethod, obj, 1, MUIM_VPDFPrinter_Error);
681 pdfPrintEnd(pctx);
682 D(kprintf("printing done...\n"));
683 DoMethod(_app(data->sldFirst), MUIM_Application_PushMethod, obj, 1, MUIM_VPDFPrinter_Done);
688 data->printing = FALSE;
691 return 0;
694 DEFMMETHOD(VPDFPrinter_StatusUpdate)
696 GETDATA;
698 snprintf(data->status, sizeof(data->status), "Printing page %ld...", msg->page_number);
699 D(kprintf("%s\n", data->status));
700 set(data->gauge, MUIA_Gauge_Current, msg->actual_page);
701 set(data->gauge, MUIA_Gauge_InfoText, data->status);
703 return TRUE;
707 DEFMMETHOD(VPDFPrinter_PrinterPrefs)
709 GETDATA;
710 if (xget(data->chkPS, MUIA_Selected))
711 SystemTagList("MOSSYS:Prefs/Preferences MOSSYS:Prefs/MPrefs/Printers.mprefs", TAG_DONE);
712 else
713 SystemTagList("MOSSYS:Prefs/Preferences MOSSYS:Prefs/MPrefs/Printer.mprefs", TAG_DONE);
715 return TRUE;
718 DEFMMETHOD(VPDFPrinter_HideCollate)
720 GETDATA;
722 if (msg->copies == 1)
724 set(data->grpCollate, MUIA_ShowMe, FALSE);
726 else
728 set(data->grpCollate, MUIA_ShowMe, TRUE);
731 return 0;
735 DEFSET
737 GETDATA;
739 FORTAG(INITTAGS)
741 case MUIA_VPDFPrinter_PSName:
743 set(data->strOutput, MUIA_String_Contents, tag->ti_Data);
745 break;
746 case MUIA_VPDFPrinter_PrintingMode:
748 set(data->chkPS, MUIA_Selected, tag->ti_Data);
750 break;
751 case MUIA_VPDFPrinter_PSMode:
753 set(data->cycPSVersion, MUIA_Cycle_Active, tag->ti_Data);
755 break;
757 NEXTTAG
759 return DOSUPER;
762 DEFMMETHOD(VPDFPrinter_Error)
764 GETDATA;
765 MUI_Request(_app(data->sldFirst), _window(obj), 0, "VPDF Print Document Error", "OK", "Failed to initialize output device", NULL);
766 return TRUE;
769 BEGINMTABLE
770 DECNEW
771 DECDISP
772 DECSET
773 DECMMETHOD(VPDFPrinter_PrintDocument)
774 DECMMETHOD(VPDFPrinter_Start)
775 DECMMETHOD(VPDFPrinter_Stop)
776 DECMMETHOD(VPDFPrinter_Done)
777 DECMMETHOD(VPDFPrinter_Close)
778 DECMMETHOD(VPDFPrinter_StatusUpdate)
779 DECMMETHOD(VPDFPrinter_PrinterPrefs)
780 DECMMETHOD(VPDFPrinter_HideCollate)
781 DECMMETHOD(VPDFPrinter_Error)
782 DECMMETHOD(Process_Process)
783 ENDMTABLE
785 DECSUBCLASS_NC(MUIC_Window, VPDFPrinterClass)