Indentation cleanup.
[AROS-Contrib.git] / arospdf / xpdf / AROSPDFApp.cc
bloba3a14acaf4db9ed3d889a9fa27797290757314ac
1 //========================================================================
2 //
3 // AROSPDFApp.cc
4 //
5 // Copyright 2009 Craig Kiesau
6 //
7 //========================================================================
9 #include <time.h>
10 #include <limits.h>
11 #include "PDFDoc.h"
12 #include "AROSPDFApp.h"
13 long __stack = 8192;
15 #define RES_LOWER_LIMIT 200
16 #define RES_HIGHER_LIMIT 2000
18 #define XGET(OBJ, ATTR) ({IPTR b; GetAttr(ATTR, OBJ, &b); b; })
20 enum {
21 ADD_METHOD=1,
22 MEN_PROJECT,MEN_OPEN, MEN_ABOUT,MEN_QUIT,
23 MEN_EDIT,MEN_FIND,MEN_FINDNEXT,
24 MEN_VIEW,MEN_FULLSCREEN,MEN_CONTINUOUS,MEN_ZOOMIN,MEN_ZOOMOUT,MEN_BESTFIT,MEN_FITWIDTH,
25 MEN_GO,MEN_FIRSTPAGE,MEN_PREVPAGE,MEN_NEXTPAGE,MEN_LASTPAGE
28 static struct NewMenu MenuData1[]=
30 {NM_TITLE, "AROSPDF", 0, 0, 0, (APTR)MEN_PROJECT },
31 {NM_ITEM, "Open File...", "O", 0, 0, (APTR)MEN_OPEN },
32 {NM_ITEM, NM_BARLABEL, 0, 0, 0, (APTR)0 },
33 {NM_ITEM, "About AROSPDF", "?", 0, 0, (APTR)MEN_ABOUT },
34 {NM_ITEM, NM_BARLABEL, 0, 0, 0, (APTR)0 },
35 {NM_ITEM, "Quit", "Q", 0, 0, (APTR)MEN_QUIT },
37 {NM_TITLE, "Edit", 0, NM_MENUDISABLED, 0, (APTR)MEN_EDIT },
38 {NM_ITEM, "Find...", 0, 0, 0, (APTR)MEN_FIND },
39 {NM_ITEM, "Find Next", 0, 0, 0, (APTR)MEN_FINDNEXT },
41 {NM_TITLE, "View", 0, 0, 0, (APTR)MEN_VIEW },
42 //{NM_ITEM, "Fullscreen", 0, NM_ITEMDISABLED, 0, (APTR)MEN_FULLSCREEN },
43 //{NM_ITEM, "Continuous", 0, NM_ITEMDISABLED, 0, (APTR)MEN_CONTINUOUS }, //CHECKIT|MENUTOGGLE|
44 {NM_ITEM, NM_BARLABEL, 0, 0, 0, (APTR)0 },
45 {NM_ITEM, "Zoom In", 0, 0, 0, (APTR)MEN_ZOOMIN },
46 {NM_ITEM, "Zoom Out", 0, 0, 0, (APTR)MEN_ZOOMOUT },
47 {NM_ITEM, "Best Fit", 0, CHECKIT|MENUTOGGLE, 0, (APTR)MEN_BESTFIT },
48 {NM_ITEM, "Fit Width", 0, CHECKIT|MENUTOGGLE, 0, (APTR)MEN_FITWIDTH },
50 {NM_TITLE, "Go", 0, 0, 0, (APTR)MEN_GO },
51 {NM_ITEM, "First Page", 0, 0, 0, (APTR)MEN_FIRSTPAGE },
52 {NM_ITEM, "Previous Page", 0, 0, 0, (APTR)MEN_PREVPAGE },
53 {NM_ITEM, NM_BARLABEL, 0, 0, 0, (APTR)0 },
54 {NM_ITEM, "Next Page", 0, 0, 0, (APTR)MEN_NEXTPAGE },
55 {NM_ITEM, "Last Page", 0, 0, 0, (APTR)MEN_LASTPAGE },
56 {NM_END, NULL, 0, 0, 0, (APTR)0 },
59 static struct Hook myhook;
60 static struct Hook buttonhook;
61 static struct Hook menuhook;
63 char about_text[] ="\33cAROSPDF\n\nCopyright 2009-2010 Craig Kiesau\nver 0.2.32 (2010/07/01)\nckiesau@aros.org\n\nBased on xpdf 3.0.2 Copyright 1996-2007 Glyph and Cog";
65 long min(long a, long b)
67 return (a < b ? a : b);
70 BOOL LoadASL(struct Screen * curscreen,STRPTR filename,STRPTR title,STRPTR ifile,STRPTR pattern,BOOL folders) {
71 char current_dir[300] = "";
72 BOOL ok=FALSE;
73 struct FileRequester * freq=NULL;
75 if ((freq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,NULL))) {
76 if (AslRequestTags(freq,
77 ASLFR_TitleText, (IPTR)title,
78 ASLFR_Window, 0,
79 ASLFR_Flags1, FRF_DOPATTERNS,
80 ASLFR_InitialFile, (IPTR)ifile,
81 ASLFR_InitialDrawer, (IPTR)current_dir,
82 ASLFR_InitialPattern, (IPTR)pattern,
83 ASLFR_DrawersOnly, folders,
84 ASLFR_Screen, curscreen,
85 /*ASLFR_UserData, app,
86 ASLFR_IntuiMsgFunc, &IntuiMsgHook,*/
87 TAG_DONE)) {
88 strcpy(current_dir,freq->rf_Dir);
90 strcpy(filename,freq->rf_Dir);
91 if(AddPart(filename,freq->rf_File,255))//MAXFILENAME))
92 ok=TRUE;
94 FreeAslRequest(freq);
96 return ok;
99 struct CustomImageData
101 AROSPDFApp * app;
102 struct MUI_EventHandlerNode ehnode;
103 struct BitMap * bitmap;
104 LONG width, height;
106 #define MY_APP 0x8022UL
107 #define MY_RP 0x8023UL
108 #define MY_BM 0x8024UL
109 #define MY_BMWIDTH 0x8025UL
110 #define MY_BMHEIGHT 0x8026UL
112 IPTR mNew(struct IClass *cl,Object *obj,Msg msg) {
113 struct CustomImageData *data;
114 struct TagItem *tags,*tag;
116 if (!(obj = (Object *)DoSuperMethodA(cl,obj,(Msg)msg)))
117 return(0);
119 data = (CustomImageData*)INST_DATA(cl,obj);
121 for (tags=((struct opSet *)msg)->ops_AttrList ; (tag=NextTagItem(&tags));) {
122 switch (tag->ti_Tag) {
123 case MY_APP:
124 if (tag->ti_Data)
125 data->app = ((AROSPDFApp *)tag->ti_Data);
126 break;
127 case MY_BM:
128 if (tag->ti_Data) {
129 data->bitmap = ((struct BitMap *)tag->ti_Data);
131 break;
132 case MY_BMWIDTH:
133 if (tag->ti_Data)
134 data->width = tag->ti_Data;
135 break;
136 case MY_BMHEIGHT:
137 if (tag->ti_Data)
138 data->height = tag->ti_Data;
139 break;
142 return (IPTR)obj;
145 IPTR mSet(struct IClass *cl,Object *obj,Msg msg) {
146 struct CustomImageData *data = (CustomImageData*)INST_DATA(cl,obj);
147 struct TagItem *tags,*tag;
149 for (tags=((struct opSet *)msg)->ops_AttrList ; (tag=NextTagItem(&tags));) {
150 switch (tag->ti_Tag) {
151 case MY_APP:
152 if (tag->ti_Data)
153 data->app = ((AROSPDFApp *)tag->ti_Data);
154 break;
155 case MY_BM:
156 if (tag->ti_Data) {
157 data->bitmap = ((struct BitMap *)tag->ti_Data);
159 break;
160 case MY_BMWIDTH:
161 if (tag->ti_Data)
162 data->width = tag->ti_Data;
163 break;
164 case MY_BMHEIGHT:
165 if (tag->ti_Data)
166 data->height = tag->ti_Data;
167 break;
170 return DoSuperMethodA(cl,obj,msg);
173 IPTR mGet(struct IClass *cl,Object *obj,Msg msg) {
174 //struct CustomImageData *data = INST_DATA(cl,obj);
175 //IPTR *store = ((struct opGet *)msg)->opg_Storage;
177 switch (((struct opGet *)msg)->opg_AttrID) {
181 return DoSuperMethodA(cl,obj,msg);
184 IPTR mAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg) {
185 //struct CustomImageData *data = INST_DATA(cl,obj);
186 DoSuperMethodA(cl,obj,(Msg)msg);
187 msg->MinMaxInfo->MinWidth += 1;
188 msg->MinMaxInfo->DefWidth += _width(obj);
189 msg->MinMaxInfo->MaxWidth += MUI_MAXMAX;
191 msg->MinMaxInfo->MinHeight += 1;
192 msg->MinMaxInfo->DefHeight += _mheight(obj);
193 msg->MinMaxInfo->MaxHeight += MUI_MAXMAX;
194 return 0;
197 IPTR mDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg) {
198 struct CustomImageData *data = (CustomImageData*)INST_DATA(cl,obj);
199 struct RastPort *rp;
200 ULONG mleft, mtop, mwidth, mheight;
202 DoSuperMethodA(cl, obj, (Msg)msg);
203 if (data->app->isReady()) {
204 if ((data->width != XGET(data->app->getBM(),MUIA_Width)) || (data->height != XGET(data->app->getBM(),MUIA_Height)))
205 data->app->ResizeBitMap(XGET(data->app->getBM(),MUIA_Width),XGET(data->app->getBM(),MUIA_Height));
208 rp = _rp(obj);
209 mleft = _mleft(obj);
210 mtop = _mtop(obj);
211 mwidth = _width(obj);
212 mheight = _mheight(obj);
214 mwidth = min(mwidth, data->width);
215 mheight = min(mheight, data->height);
217 if (data->app->isReady()) {
218 BltBitMapRastPort(data->bitmap, 0, 0, rp, mleft, mtop, mwidth-5, mheight-1, 0xc0);
220 return 0;
223 IPTR mSetup(struct IClass *cl,Object *obj,Msg msg) {
224 struct CustomImageData *data = INST_DATA(cl,obj);
226 if (!DoSuperMethodA(cl,obj,msg))
227 return(FALSE);
229 data->ehnode.ehn_Object = obj;
230 data->ehnode.ehn_Class = cl;
231 data->ehnode.ehn_Events = IDCMP_MOUSEBUTTONS | IDCMP_RAWKEY;
232 DoMethod(_win(obj),MUIM_Window_AddEventHandler,&data->ehnode);
234 return TRUE;
237 IPTR mHandleEvent(struct IClass *cl, Object *obj, struct MUIP_HandleEvent *msg) {
238 struct CustomImageData *data = INST_DATA(cl,obj);
240 if (msg->imsg) {
241 switch (msg->imsg->Class) {
242 case IDCMP_RAWKEY:
243 switch (msg->imsg->Code) {
244 case RAWKEY_UP:
245 case RAWKEY_NM_WHEEL_UP:
246 data->app->ScrollUpDown(FALSE);
247 break;
248 case RAWKEY_DOWN:
249 case RAWKEY_NM_WHEEL_DOWN:
250 data->app->ScrollUpDown(TRUE);
251 break;
252 case RAWKEY_PAGEUP:
253 data->app->PageForwardBack(FALSE);
254 break;
255 case RAWKEY_PAGEDOWN:
256 data->app->PageForwardBack(TRUE);
257 break;
259 break;
262 return 0;
265 IPTR mCleanup(struct IClass *cl,Object *obj,Msg msg) {
266 struct CustomImageData *data = INST_DATA(cl,obj);
268 DoMethod(_win(obj),MUIM_Window_RemEventHandler,&data->ehnode);
269 return DoSuperMethodA(cl,obj,msg);
272 BOOPSI_DISPATCHER(IPTR, MyDispatcher, cl, obj, msg)
274 switch (msg->MethodID)
276 case OM_NEW : return(mNew (cl,obj,(APTR)msg));
277 case OM_SET : return(mSet (cl,obj,(APTR)msg));
278 case OM_GET : return(mGet (cl,obj,(APTR)msg));
279 case MUIM_AskMinMax : return(mAskMinMax(cl,obj,(APTR)msg));
280 case MUIM_Draw : return(mDraw (cl,obj,(APTR)msg));
281 case MUIM_Setup : return(mSetup (cl,obj,(APTR)msg));
282 case MUIM_Cleanup : return(mCleanup (cl,obj,(APTR)msg));
283 case MUIM_HandleEvent : return(mHandleEvent(cl,obj,(struct MUIP_HandleEvent*)msg));
286 return DoSuperMethodA(cl,obj,msg);
288 BOOPSI_DISPATCHER_END
290 void AROSPDFApp::OpenFile(GString *fileNameA, GString *ownerPWA, GString *userPWA) {
291 //int pw, ph;
293 if (docLoaded) {
294 delete doc;
295 ready=FALSE;
296 docLoaded=FALSE;
297 } else {
298 dispW=BITMAPX;
299 dispH=BITMAPY;
301 doc = new PDFDoc(fileNameA, ownerPWA, userPWA);
302 if (userPWA) {
303 delete userPWA;
305 if (ownerPWA) {
306 delete ownerPWA;
309 if (!doc->isOk()) {
310 fprintf(stderr, "error opening document\n");
311 ok = gFalse;
312 delete doc;
313 return;
315 GString * title = new GString("AROSPDF - ");
316 title->append(fileNameA);
317 SetAttrs(wnd,MUIA_Window_Title,title->getCString() ,TAG_DONE);
318 delete title;
319 resolution = 100;
320 page = 1;
321 posX = 0;
322 posY = 0;
324 splashOut->startDoc(doc->getXRef());
325 JumpToPage(1);
328 void AROSPDFApp::BackFillFullScreen() {
329 BltBitMapRastPort(bm, 0, 0, &fsscreen->RastPort, 0, 0, dispW-5, dispH-1, 0xc0);
332 void AROSPDFApp::ToggleFullscreen() {
333 FullScreen=!FullScreen;
334 if (FullScreen) {
335 origscreen=XGET(wnd,MUIA_Window_Screen);
336 int scx=origscreen->Width;
337 int scy=origscreen->Height;
338 fsscreen=OpenScreenTags(NULL, SA_Width,scx,
339 SA_Height,scy,TAG_DONE);
340 if (fsscreen!=NULL) {
341 SetRast( &fsscreen->RastPort, 1 );
342 fswindow=OpenWindowTags(NULL,
343 WA_Width, fsscreen->Width,
344 WA_Height, fsscreen->Height,
345 WA_CustomScreen, (IPTR)fsscreen,
346 WA_Backdrop, TRUE,
347 WA_Borderless, TRUE,
348 WA_RMBTrap, TRUE,
349 WA_Activate, TRUE,
350 WA_ReportMouse, TRUE,
351 WA_IDCMP, IDCMP_MOUSEBUTTONS
352 | IDCMP_RAWKEY
353 | IDCMP_DISKINSERTED
354 | IDCMP_DISKREMOVED
355 | IDCMP_ACTIVEWINDOW
356 | IDCMP_INACTIVEWINDOW
357 | IDCMP_MOUSEMOVE
358 | IDCMP_DELTAMOVE,
359 TAG_DONE);
360 BestFit=TRUE;
361 DisableFitWidth();
362 ResizeBitMap(scx,scy);
363 ZoomToFit(FALSE);
364 SetAttrs(wnd,MUIA_Window_Open,FALSE,TAG_DONE);
365 BackFillFullScreen();
367 } else {
368 if (fsscreen!=NULL) {
369 SetAttrs(wnd,MUIA_Window_Open,TRUE,TAG_DONE);
370 CloseWindow(fswindow);
371 CloseScreen(fsscreen);
376 AROSPDFApp::AROSPDFApp() {
377 ready=FALSE;
378 docLoaded=FALSE;
379 if (initAROS() != 0) {
380 fprintf(stderr, "error initializing AROS\n");
381 ok = gFalse;
382 return;
384 EnableDisableGUI();
385 ok = gTrue;
388 void AROSPDFApp::JumpToPage(int pageno) {
389 int pw,ph;
391 if (pageno==0)
392 return;
393 if ((pageno > (doc->getNumPages())) && (page==(doc->getNumPages())))
394 return;
396 page=pageno;
398 if (page > (doc->getNumPages())) page=(doc->getNumPages());
399 if (!FullScreen) {
400 SetAttrs(txtPage, MUIA_NoNotify,TRUE, MUIA_String_Integer, page, TAG_DONE);
401 DoMethod(txtPageCount, MUIM_SetAsString, MUIA_Text_Contents, "of %ld", doc->getNumPages());
403 posY=0;
404 if (FitWidth) {
405 int cropwidth=doc->getPageCropWidth(page);
406 resolution=72*(double)dispW/cropwidth;
408 if (BestFit) {
409 int cropheight=doc->getPageCropHeight(page);
410 resolution=72*(double)dispH/cropheight;
413 doc->displayPage(splashOut, page, resolution, resolution, 0, gFalse,
414 gFalse, gFalse);
416 pw = splashOut->getBitmapWidth();
417 ph = splashOut->getBitmapHeight();
418 resLowLimit = gTrue;
419 resHiLimit = gTrue;
420 if (pw <= RES_HIGHER_LIMIT && ph <= RES_HIGHER_LIMIT)
421 resHiLimit = gFalse;
422 if (pw >= RES_LOWER_LIMIT && pw >= RES_LOWER_LIMIT)
423 resLowLimit = gFalse;
424 ready=TRUE;
425 docLoaded=TRUE;
426 if (!FullScreen)
427 EnableDisableGUI();
428 SetAttrs(vslider, MUIA_Prop_Entries, (LONG)(ph/SCROLLSPEED),MUIA_Prop_Visible,(LONG)(dispH/SCROLLSPEED),TAG_DONE);
429 SetAttrs(hslider, MUIA_Prop_Entries, (LONG)(pw/SCROLLSPEED),MUIA_Prop_Visible,(LONG)(dispW/SCROLLSPEED),TAG_DONE);
430 ok = gTrue;
431 SetAttrs(vslider, MUIA_NoNotify,TRUE,MUIA_Prop_First, 0,hslider, MUIA_Prop_First, 0,TAG_DONE);
432 DoMethod(Bmp,MUIM_Draw);
435 void AROSPDFApp::PageForwardBack(bool Forward) {
436 //Page forward true = next page, false = prev page
437 int pageno=page;
438 if (Forward)
439 pageno+=1;
440 else
441 pageno-=1;
442 JumpToPage(pageno);
445 void AROSPDFApp::ScrollUpDown(bool Down) {
446 if (Down) {
447 DoMethod(vslider,MUIM_Prop_Increase,SCROLLSPEED);
448 } else {
449 DoMethod(vslider,MUIM_Prop_Decrease,SCROLLSPEED);
453 AROSPDFApp::AROSPDFApp(GString *fileNameA, GString *ownerPWA, GString *userPWA) {
454 ready=FALSE;
455 docLoaded=FALSE;
456 if (initAROS() != 0) {
457 fprintf(stderr, "error initializing AROS\n");
458 ok = gFalse;
459 return;
461 OpenFile(fileNameA,ownerPWA,userPWA);
464 void AROSPDFApp::quit() {
465 exitAROS();
466 delete splashOut;
467 if (docLoaded==TRUE) {
468 delete doc;
472 int AROSPDFApp::run() {
473 //int oldX, oldY;
474 //int pw, ph;
475 ULONG sigs=0;
476 // Check that the window opened
477 if (XGET(wnd, MUIA_Window_Open)) {
478 // Main loop
479 while((LONG)DoMethod(muiapp, MUIM_Application_NewInput, (IPTR)&sigs) != MUIV_Application_ReturnID_Quit) {
480 if (sigs) {
481 sigs = Wait(sigs | SIGBREAKF_CTRL_C);
482 if (sigs & SIGBREAKF_CTRL_C)
483 break;
487 return 0;
490 AROS_UFH3(ULONG, myfunction,
491 AROS_UFHA(struct Hook *, h, A0),
492 AROS_UFHA(Object *, object, A2),
493 AROS_UFHA(APTR *, msg, A1)) {
494 AROS_USERFUNC_INIT
496 AROSPDFApp *me=(AROSPDFApp *)msg[0];
497 int item=(int)msg[1]; //vert=1, horiz=2
498 LONG val=(LONG)msg[2]; //position in scrollbar
499 if (item==1)
500 me->setVert(val*SCROLLSPEED);
501 else if (item==2)
502 me->setHoriz(val*SCROLLSPEED);
504 return 0;
506 AROS_USERFUNC_EXIT
509 AROS_UFH3(ULONG, buttonhookfunc,
510 AROS_UFHA(struct Hook *, h, A0),
511 AROS_UFHA(Object *, object, A2),
512 AROS_UFHA(APTR *, msg, A1)) {
513 AROS_USERFUNC_INIT
515 AROSPDFApp *me=(AROSPDFApp *)msg[0];
516 int item=(int)msg[1]; //vert=1, horiz=2
517 switch (item) {
518 case 2:
519 me->PageForwardBack(FALSE);
520 break;
521 case 3:
522 me->PageForwardBack(TRUE);
523 break;
524 case 4:
525 me->JumpToPage(INT_MAX);
526 break;
527 case 1:
528 me->JumpToPage(1);
529 break;
530 case 5:
531 me->ZoomInOut(FALSE);
532 break;
533 case 6:
534 me->ZoomInOut(TRUE);
535 break;
536 case 7:
537 me->JumpToPageTextbox();
539 return 0;
541 AROS_USERFUNC_EXIT
544 AROS_UFH3(ULONG, menufunction,
545 AROS_UFHA(struct Hook *, h, A0),
546 AROS_UFHA(Object *, object, A2),
547 AROS_UFHA(APTR *, msg, A1)) {
548 AROS_USERFUNC_INIT
550 AROSPDFApp *me=(AROSPDFApp *)msg[0];
551 int menuitem=(int)msg[1];
552 switch (menuitem) {
553 case MEN_ABOUT:
554 me->AboutMenu();
555 break;
556 case MEN_OPEN:
557 me->RequestOpenFile();
558 break;
559 case MEN_PREVPAGE:
560 me->PageForwardBack(FALSE);
561 break;
562 case MEN_NEXTPAGE:
563 me->PageForwardBack(TRUE);
564 break;
565 case MEN_LASTPAGE:
566 me->JumpToPage(INT_MAX);
567 break;
568 case MEN_FIRSTPAGE:
569 me->JumpToPage(1);
570 break;
571 case MEN_FITWIDTH:
572 me->ToggleFitWidth();
573 me->DisableBestFit();
574 me->JumpToPageTextbox();
575 break;
576 case MEN_BESTFIT:
577 me->ToggleBestFit();
578 me->DisableFitWidth();
579 me->ZoomToFit(FALSE);
580 break;
581 case MEN_FULLSCREEN:
582 me->ToggleFullscreen();
583 break;
585 return 0;
587 AROS_USERFUNC_EXIT
590 void AROSPDFApp::ZoomInOut(bool In) {
591 //int pw,ph;
592 if (In) {
593 if (resHiLimit==gTrue)
594 return;
595 else resolution+=20;
596 } else {
597 if (resLowLimit==gTrue)
598 return;
599 else
600 resolution-=20;
602 DisableFitWidth();
603 DisableBestFit();
604 JumpToPage(page);
607 void AROSPDFApp::DisableBestFit() {
608 BestFit=FALSE;
609 SetAttrs((APTR)DoMethod(menustrip,MUIM_FindUData,MEN_BESTFIT), MUIA_Menuitem_Checked, FALSE, TAG_DONE);
612 void AROSPDFApp::DisableFitWidth() {
613 FitWidth=FALSE;
614 SetAttrs((APTR)DoMethod(menustrip,MUIM_FindUData,MEN_FITWIDTH), MUIA_Menuitem_Checked, FALSE, TAG_DONE);
617 void AROSPDFApp::JumpToPageTextbox() {
618 JumpToPage(XGET(txtPage,MUIA_String_Integer));
621 void AROSPDFApp::RequestOpenFile() {
622 static char infile[1024] = "";
623 GString *fileName;
624 struct Screen * curscreen;
625 curscreen=XGET(wnd,MUIA_Window_Screen);
626 if (LoadASL(curscreen,infile,"Open file:","","#?.pdf",FALSE)) {
627 fileName=new GString(infile);
628 OpenFile(fileName,(GString*)NULL,(GString*)NULL);
632 void AROSPDFApp::AboutMenu() {
633 MUI_RequestA(muiapp,wnd,0,"About AROSPDF","*OK",about_text,NULL);
636 int AROSPDFApp::initAROS() {
637 SplashColor paperColor;
638 FitWidth=FALSE;
639 BestFit=FALSE;
640 FullScreen=FALSE;
641 mcc = MUI_CreateCustomClass(NULL,MUIC_Area,NULL,sizeof(struct CustomImageData),MyDispatcher);
642 // GUI creation
643 muiapp = ApplicationObject,
644 MUIA_Application_Title , "AROSPDF",
645 MUIA_Application_Version , "$VER: AROSPDF-0.2.1 (2009/07/15)",
646 MUIA_Application_Copyright , "©2009, Craig Kiesau",
647 MUIA_Application_Author , "Craig Kiesau",
648 MUIA_Application_Description, "A PDF viewer",
649 MUIA_Application_Base , "APDF",
650 SubWindow, wnd = WindowObject,
651 MUIA_Window_Title, "AROSPDF",
652 MUIA_Window_Width, 640,
653 MUIA_Window_Height, 480,
654 MUIA_Window_Menustrip, menustrip=MUI_MakeObject(MUIO_MenustripNM,MenuData1,0),
655 WindowContents, VGroup,
656 Child, HGroup,
657 Child, butFirst = ImageObject,
658 MUIA_Frame, MUIV_Frame_ImageButton,
659 MUIA_InputMode, MUIV_InputMode_RelVerify,
660 MUIA_Image_Spec, "3:PROGDIR:resources/dblLeftArrow.png",
661 End,
662 Child, butPrev = ImageObject,
663 MUIA_Frame, MUIV_Frame_ImageButton,
664 MUIA_InputMode, MUIV_InputMode_RelVerify,
665 MUIA_Image_Spec, "3:PROGDIR:resources/leftArrow.png",
666 End,
667 Child, txtPage=StringObject,
668 MUIA_Frame, MUIV_Frame_String,
669 MUIA_FixWidth, 40,
670 MUIA_Background, MUII_TextBack,
671 MUIA_String_Accept, "0123456789",
672 MUIA_String_Format, MUIV_String_Format_Right,
673 End,
674 Child, txtPageCount=TextObject,
675 MUIA_FixWidth, 40,
676 MUIA_Text_PreParse, "\33l",
677 End,
678 Child, butNext = ImageObject,
679 MUIA_Frame, MUIV_Frame_ImageButton,
680 MUIA_InputMode, MUIV_InputMode_RelVerify,
681 MUIA_Image_Spec, "3:PROGDIR:resources/rightArrow.png",
682 End,
683 Child, butLast = ImageObject,
684 MUIA_Frame, MUIV_Frame_ImageButton,
685 MUIA_InputMode, MUIV_InputMode_RelVerify,
686 MUIA_Image_Spec, "3:PROGDIR:resources/dblRightArrow.png",
687 End,
688 Child, butZoomOut = TextObject,
689 MUIA_FixWidth, 40,
690 MUIA_Frame, MUIV_Frame_Button,
691 MUIA_InputMode, MUIV_InputMode_RelVerify,
692 MUIA_Text_Contents, "\33c-",
693 End,
694 Child, butZoomIn = TextObject,
695 MUIA_FixWidth, 40,
696 MUIA_Frame, MUIV_Frame_Button,
697 MUIA_InputMode, MUIV_InputMode_RelVerify,
698 MUIA_Text_Contents, "\33c+",
699 End,
700 Child, RectangleObject,End,
701 End,//HGroup
702 Child, HGroup,
703 Child, Bmp = NewObject(mcc->mcc_Class,NULL,
704 TextFrame,MY_APP,(void *)this, MY_BMWIDTH, BITMAPX, MY_BMHEIGHT, BITMAPY,
705 MUIA_Background, MUII_BACKGROUND,
706 TAG_DONE),
707 //End, //Bmp
708 Child, vslider = ScrollbarObject,
709 MUIA_Prop_Entries, 100,
710 End,
711 End, // HGroup
712 Child, hslider = ScrollbarObject,
713 MUIA_Group_Horiz, TRUE,
714 MUIA_Prop_Entries, 100,
715 End,
716 End,
717 End, //VGroup
718 End;
720 if (muiapp != NULL) {
721 myhook.h_Entry = (HOOKFUNC)myfunction;
722 menuhook.h_Entry = (HOOKFUNC)menufunction;
723 buttonhook.h_Entry = (HOOKFUNC)buttonhookfunc;
725 DoMethod(vslider, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime,
726 (IPTR)vslider, 5, MUIM_CallHook, (IPTR)&myhook,(AROSPDFApp *)this,1,MUIV_TriggerValue);
727 DoMethod(hslider, MUIM_Notify, MUIA_Prop_First, MUIV_EveryTime,
728 (IPTR)hslider, 5, MUIM_CallHook, (IPTR)&myhook,(AROSPDFApp *)this,2,MUIV_TriggerValue);
729 DoMethod(wnd, MUIM_Notify, MUIA_Window_MenuAction, MUIV_EveryTime,
730 (IPTR)wnd, 4, MUIM_CallHook, (IPTR)&menuhook, (AROSPDFApp *)this, MUIV_TriggerValue);
731 DoMethod(butFirst,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,1);
732 DoMethod(butPrev,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,2);
733 DoMethod(butNext,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,3);
734 DoMethod(butLast,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,4);
735 DoMethod(butZoomOut,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,5);
736 DoMethod(butZoomIn,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)muiapp,4,MUIM_CallHook,(IPTR)&buttonhook,(AROSPDFApp*)this,6);
737 DoMethod(txtPage,MUIM_Notify,MUIA_String_Acknowledge, MUIV_EveryTime,(IPTR)muiapp, 4, MUIM_CallHook, (IPTR)&buttonhook, (AROSPDFApp*)this,7);
738 // Click Close gadget or hit Escape to quit
739 DoMethod(wnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
740 (IPTR)muiapp, 2,
741 MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
742 DoMethod((APTR)DoMethod(menustrip,MUIM_FindUData,MEN_QUIT), MUIM_Notify, MUIA_Menuitem_Trigger, MUIV_EveryTime,
743 (IPTR) muiapp, 2, MUIM_Application_ReturnID,
744 MUIV_Application_ReturnID_Quit);
746 // Open the window
747 SetAttrs(wnd, MUIA_Window_Open, (LONG)TRUE,TAG_DONE);
749 struct Window *window = (struct Window *)XGET(wnd, MUIA_Window_Window);
750 rp=CreateRastPort();
751 bm = AllocBitMap(BITMAPX, BITMAPY,
752 GetBitMapAttr(window->RPort->BitMap, BMA_DEPTH), BMF_CLEAR,
753 window->RPort->BitMap);
754 rp->BitMap=bm;
755 SetAttrs(Bmp, MY_BM,bm,TAG_DONE);
757 paperColor[0] = paperColor[1] = paperColor[2] = 255;
758 splashOut = new AROSSplashOutputDev(rp, gFalse, paperColor, gFalse,
759 &redraw, (AROSPDFApp *)this);
761 return 0;
764 void AROSPDFApp::exitAROS()
766 FreeRastPort(rp);
767 FreeBitMap(bm);
768 SetAttrs(wnd, MUIA_Window_Open, FALSE,TAG_DONE);
769 if (FullScreen)
770 CloseScreen(fsscreen);
771 MUI_DisposeObject(muiapp);
772 MUI_DeleteCustomClass(mcc);
775 void AROSPDFApp::redraw(AROSPDFApp *data)
777 AROSPDFApp *me = (AROSPDFApp *)data;
778 int pw, ph;
779 int localx, localy;
780 int destw, desth;
781 pw = me->splashOut->getBitmapWidth();
782 ph = me->splashOut->getBitmapHeight();
784 if (me->posX + me->dispW > pw) {
785 me->posX = pw - me->dispW;
786 if (me->posX < 0)
787 me->posX = 0;
789 if (me->posY + me->dispH > ph || me->posY == INT_MAX) {
790 me->posY = ph - me->dispH;
791 if (me->posY < 0)
792 me->posY = 0;
794 localx=0;
795 localy=0;
796 destw=me->dispW;
797 desth=me->dispH;
798 //do we need to center the doc because it's smaller than the display?
799 if (pw<(me->dispW)) {
800 localx=localx+(me->dispW-pw)/2;
801 destw=destw-(localx*2);
803 if (ph<(me->dispH)) {
804 localy=localy+(me->dispH-ph)/2;
805 desth=desth-(localy*2);
807 me->splashOut->redraw(me->posX, me->posY, localx, localy, destw, desth,me->dispW,me->dispH);
808 DoMethod(me->Bmp, MUIM_Draw);
811 AROSPDFApp::~AROSPDFApp() {
812 return;
815 void AROSPDFApp::ZoomToFit(bool WidthOnly) {
816 int cropwidth,cropheight;
817 if (!docLoaded)
818 return;
819 if (!BestFit)
820 return;
821 cropwidth=doc->getPageCropWidth(page);
822 cropheight=doc->getPageCropHeight(page);
823 //determine what res should be based on our display size
824 if (WidthOnly) {
825 //we're gonna fit by width
826 resolution=72*(double)dispW/cropwidth;
827 } else {
828 //we're gonna fit by height
829 resolution=72*(double)dispH/cropheight;
831 JumpToPage(page);
834 void AROSPDFApp::EnableDisableGUI() {
835 //based on status we enable/disable buttons and menu options
836 //LONG docInvert=!docLoaded;
837 DoMethod(wnd,MUIM_MultiSet,MUIA_Disabled, (LONG)!docLoaded,
838 butFirst,butPrev,butNext,butLast,butZoomOut,butZoomIn,txtPage,NULL);
839 DoMethod(wnd,MUIM_MultiSet,MUIA_Menuitem_Enabled,(LONG)docLoaded,
840 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_PREVPAGE),
841 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_NEXTPAGE),
842 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_FIRSTPAGE),
843 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_LASTPAGE),
844 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_ZOOMIN),
845 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_ZOOMOUT),
846 NULL);
847 if (docLoaded) {
848 //we only do this stuff when there's a doc
849 if (page==1) {
850 DoMethod(wnd,MUIM_MultiSet,MUIA_Disabled,TRUE,butFirst,butPrev,NULL);
851 DoMethod(wnd,MUIM_MultiSet,MUIA_Menuitem_Enabled, FALSE,
852 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_PREVPAGE),
853 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_FIRSTPAGE),
854 NULL);
856 if (page==doc->getNumPages()) {
857 DoMethod(wnd,MUIM_MultiSet,MUIA_Disabled,TRUE,butNext,butLast,NULL);
858 DoMethod(wnd,MUIM_MultiSet,MUIA_Menuitem_Enabled, FALSE,
859 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_NEXTPAGE),
860 (APTR)DoMethod(menustrip,MUIM_FindUData,MEN_LASTPAGE),
861 NULL);
866 void AROSPDFApp::ResizeBitMap(int width, int height){
867 //get rid of old bitmap, set new one and change the slidebars accordingly
868 int pw,ph;
869 FreeBitMap(bm);
870 if (!FullScreen) {
871 struct Window *window = (struct Window *)XGET(wnd, MUIA_Window_Window);
872 bm = AllocBitMap(width, height,
873 GetBitMapAttr(window->RPort->BitMap, BMA_DEPTH), BMF_CLEAR, window->RPort->BitMap);
874 rp->BitMap=bm;
875 SetAttrs(Bmp, MY_BM, bm,MY_BMHEIGHT, height, MY_BMWIDTH,width,TAG_DONE);
876 } else {
877 bm = AllocBitMap(width, height,
878 GetBitMapAttr(fsscreen->RastPort.BitMap, BMA_DEPTH), BMF_CLEAR,
879 fsscreen->RastPort.BitMap);
880 rp->BitMap=bm;
882 dispW=width;
883 dispH=height;
884 if (FitWidth) {
885 int cropwidth=doc->getPageCropWidth(page);
886 resolution=72*(double)dispW/cropwidth;
887 doc->displayPage(splashOut, page, resolution, resolution, 0, gFalse, gFalse, gFalse);
889 if(BestFit) {
890 int cropheight=doc->getPageCropHeight(page);
891 resolution=72*(double)dispH/cropheight;
892 doc->displayPage(splashOut, page, resolution, resolution, 0, gFalse, gFalse, gFalse);
894 pw = splashOut->getBitmapWidth();
895 ph = splashOut->getBitmapHeight();
896 if (!FullScreen) {
897 SetAttrs(vslider, MUIA_Prop_Entries, (LONG)(ph/SCROLLSPEED),MUIA_Prop_Visible,(LONG)(height/SCROLLSPEED),TAG_DONE);
898 SetAttrs(hslider, MUIA_Prop_Entries, (LONG)(pw/SCROLLSPEED),MUIA_Prop_Visible,(LONG)(width/SCROLLSPEED),TAG_DONE);
900 bug("Before redraw\n");
901 redraw((void *)this);
904 void AROSPDFApp::setVert(int n) {
905 if (docLoaded) {
906 posY=n;
907 redraw((void *)this);
911 void AROSPDFApp::setHoriz(int n) {
912 if (docLoaded) {
913 posX=n;
914 redraw((void *)this);