1 //========================================================================
5 // Copyright 2009 Craig Kiesau
7 //========================================================================
12 #include "AROSPDFApp.h"
15 #define RES_LOWER_LIMIT 200
16 #define RES_HIGHER_LIMIT 2000
18 #define XGET(OBJ, ATTR) ({IPTR b; GetAttr(ATTR, OBJ, &b); b; })
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] = "";
73 struct FileRequester
* freq
=NULL
;
75 if ((freq
= (struct FileRequester
*)AllocAslRequest(ASL_FileRequest
,NULL
))) {
76 if (AslRequestTags(freq
,
77 ASLFR_TitleText
, (IPTR
)title
,
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,*/
88 strcpy(current_dir
,freq
->rf_Dir
);
90 strcpy(filename
,freq
->rf_Dir
);
91 if(AddPart(filename
,freq
->rf_File
,255))//MAXFILENAME))
99 struct CustomImageData
102 struct MUI_EventHandlerNode ehnode
;
103 struct BitMap
* bitmap
;
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
)))
119 data
= (CustomImageData
*)INST_DATA(cl
,obj
);
121 for (tags
=((struct opSet
*)msg
)->ops_AttrList
; (tag
=NextTagItem(&tags
));) {
122 switch (tag
->ti_Tag
) {
125 data
->app
= ((AROSPDFApp
*)tag
->ti_Data
);
129 data
->bitmap
= ((struct BitMap
*)tag
->ti_Data
);
134 data
->width
= tag
->ti_Data
;
138 data
->height
= tag
->ti_Data
;
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
) {
153 data
->app
= ((AROSPDFApp
*)tag
->ti_Data
);
157 data
->bitmap
= ((struct BitMap
*)tag
->ti_Data
);
162 data
->width
= tag
->ti_Data
;
166 data
->height
= tag
->ti_Data
;
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
;
197 IPTR
mDraw(struct IClass
*cl
,Object
*obj
,struct MUIP_Draw
*msg
) {
198 struct CustomImageData
*data
= (CustomImageData
*)INST_DATA(cl
,obj
);
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
));
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);
223 IPTR
mSetup(struct IClass
*cl
,Object
*obj
,Msg msg
) {
224 struct CustomImageData
*data
= INST_DATA(cl
,obj
);
226 if (!DoSuperMethodA(cl
,obj
,msg
))
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
);
237 IPTR
mHandleEvent(struct IClass
*cl
, Object
*obj
, struct MUIP_HandleEvent
*msg
) {
238 struct CustomImageData
*data
= INST_DATA(cl
,obj
);
241 switch (msg
->imsg
->Class
) {
243 switch (msg
->imsg
->Code
) {
245 case RAWKEY_NM_WHEEL_UP
:
246 data
->app
->ScrollUpDown(FALSE
);
249 case RAWKEY_NM_WHEEL_DOWN
:
250 data
->app
->ScrollUpDown(TRUE
);
253 data
->app
->PageForwardBack(FALSE
);
255 case RAWKEY_PAGEDOWN
:
256 data
->app
->PageForwardBack(TRUE
);
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
) {
301 doc
= new PDFDoc(fileNameA
, ownerPWA
, userPWA
);
310 fprintf(stderr
, "error opening document\n");
315 GString
* title
= new GString("AROSPDF - ");
316 title
->append(fileNameA
);
317 SetAttrs(wnd
,MUIA_Window_Title
,title
->getCString() ,TAG_DONE
);
324 splashOut
->startDoc(doc
->getXRef());
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
;
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
,
350 WA_ReportMouse
, TRUE
,
351 WA_IDCMP
, IDCMP_MOUSEBUTTONS
356 | IDCMP_INACTIVEWINDOW
362 ResizeBitMap(scx
,scy
);
364 SetAttrs(wnd
,MUIA_Window_Open
,FALSE
,TAG_DONE
);
365 BackFillFullScreen();
368 if (fsscreen
!=NULL
) {
369 SetAttrs(wnd
,MUIA_Window_Open
,TRUE
,TAG_DONE
);
370 CloseWindow(fswindow
);
371 CloseScreen(fsscreen
);
376 AROSPDFApp::AROSPDFApp() {
379 if (initAROS() != 0) {
380 fprintf(stderr
, "error initializing AROS\n");
388 void AROSPDFApp::JumpToPage(int pageno
) {
393 if ((pageno
> (doc
->getNumPages())) && (page
==(doc
->getNumPages())))
398 if (page
> (doc
->getNumPages())) page
=(doc
->getNumPages());
400 SetAttrs(txtPage
, MUIA_NoNotify
,TRUE
, MUIA_String_Integer
, page
, TAG_DONE
);
401 DoMethod(txtPageCount
, MUIM_SetAsString
, MUIA_Text_Contents
, "of %ld", doc
->getNumPages());
405 int cropwidth
=doc
->getPageCropWidth(page
);
406 resolution
=72*(double)dispW
/cropwidth
;
409 int cropheight
=doc
->getPageCropHeight(page
);
410 resolution
=72*(double)dispH
/cropheight
;
413 doc
->displayPage(splashOut
, page
, resolution
, resolution
, 0, gFalse
,
416 pw
= splashOut
->getBitmapWidth();
417 ph
= splashOut
->getBitmapHeight();
420 if (pw
<= RES_HIGHER_LIMIT
&& ph
<= RES_HIGHER_LIMIT
)
422 if (pw
>= RES_LOWER_LIMIT
&& pw
>= RES_LOWER_LIMIT
)
423 resLowLimit
= gFalse
;
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
);
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
445 void AROSPDFApp::ScrollUpDown(bool Down
) {
447 DoMethod(vslider
,MUIM_Prop_Increase
,SCROLLSPEED
);
449 DoMethod(vslider
,MUIM_Prop_Decrease
,SCROLLSPEED
);
453 AROSPDFApp::AROSPDFApp(GString
*fileNameA
, GString
*ownerPWA
, GString
*userPWA
) {
456 if (initAROS() != 0) {
457 fprintf(stderr
, "error initializing AROS\n");
461 OpenFile(fileNameA
,ownerPWA
,userPWA
);
464 void AROSPDFApp::quit() {
467 if (docLoaded
==TRUE
) {
472 int AROSPDFApp::run() {
476 // Check that the window opened
477 if (XGET(wnd
, MUIA_Window_Open
)) {
479 while((LONG
)DoMethod(muiapp
, MUIM_Application_NewInput
, (IPTR
)&sigs
) != MUIV_Application_ReturnID_Quit
) {
481 sigs
= Wait(sigs
| SIGBREAKF_CTRL_C
);
482 if (sigs
& SIGBREAKF_CTRL_C
)
490 AROS_UFH3(ULONG
, myfunction
,
491 AROS_UFHA(struct Hook
*, h
, A0
),
492 AROS_UFHA(Object
*, object
, A2
),
493 AROS_UFHA(APTR
*, msg
, A1
)) {
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
500 me
->setVert(val
*SCROLLSPEED
);
502 me
->setHoriz(val
*SCROLLSPEED
);
509 AROS_UFH3(ULONG
, buttonhookfunc
,
510 AROS_UFHA(struct Hook
*, h
, A0
),
511 AROS_UFHA(Object
*, object
, A2
),
512 AROS_UFHA(APTR
*, msg
, A1
)) {
515 AROSPDFApp
*me
=(AROSPDFApp
*)msg
[0];
516 int item
=(int)msg
[1]; //vert=1, horiz=2
519 me
->PageForwardBack(FALSE
);
522 me
->PageForwardBack(TRUE
);
525 me
->JumpToPage(INT_MAX
);
531 me
->ZoomInOut(FALSE
);
537 me
->JumpToPageTextbox();
544 AROS_UFH3(ULONG
, menufunction
,
545 AROS_UFHA(struct Hook
*, h
, A0
),
546 AROS_UFHA(Object
*, object
, A2
),
547 AROS_UFHA(APTR
*, msg
, A1
)) {
550 AROSPDFApp
*me
=(AROSPDFApp
*)msg
[0];
551 int menuitem
=(int)msg
[1];
557 me
->RequestOpenFile();
560 me
->PageForwardBack(FALSE
);
563 me
->PageForwardBack(TRUE
);
566 me
->JumpToPage(INT_MAX
);
572 me
->ToggleFitWidth();
573 me
->DisableBestFit();
574 me
->JumpToPageTextbox();
578 me
->DisableFitWidth();
579 me
->ZoomToFit(FALSE
);
582 me
->ToggleFullscreen();
590 void AROSPDFApp::ZoomInOut(bool In
) {
593 if (resHiLimit
==gTrue
)
597 if (resLowLimit
==gTrue
)
607 void AROSPDFApp::DisableBestFit() {
609 SetAttrs((APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_BESTFIT
), MUIA_Menuitem_Checked
, FALSE
, TAG_DONE
);
612 void AROSPDFApp::DisableFitWidth() {
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] = "";
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
;
641 mcc
= MUI_CreateCustomClass(NULL
,MUIC_Area
,NULL
,sizeof(struct CustomImageData
),MyDispatcher
);
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
,
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",
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",
667 Child
, txtPage
=StringObject
,
668 MUIA_Frame
, MUIV_Frame_String
,
670 MUIA_Background
, MUII_TextBack
,
671 MUIA_String_Accept
, "0123456789",
672 MUIA_String_Format
, MUIV_String_Format_Right
,
674 Child
, txtPageCount
=TextObject
,
676 MUIA_Text_PreParse
, "\33l",
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",
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",
688 Child
, butZoomOut
= TextObject
,
690 MUIA_Frame
, MUIV_Frame_Button
,
691 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
692 MUIA_Text_Contents
, "\33c-",
694 Child
, butZoomIn
= TextObject
,
696 MUIA_Frame
, MUIV_Frame_Button
,
697 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
698 MUIA_Text_Contents
, "\33c+",
700 Child
, RectangleObject
,End
,
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
,
708 Child
, vslider
= ScrollbarObject
,
709 MUIA_Prop_Entries
, 100,
712 Child
, hslider
= ScrollbarObject
,
713 MUIA_Group_Horiz
, TRUE
,
714 MUIA_Prop_Entries
, 100,
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
,
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
);
747 SetAttrs(wnd
, MUIA_Window_Open
, (LONG
)TRUE
,TAG_DONE
);
749 struct Window
*window
= (struct Window
*)XGET(wnd
, MUIA_Window_Window
);
751 bm
= AllocBitMap(BITMAPX
, BITMAPY
,
752 GetBitMapAttr(window
->RPort
->BitMap
, BMA_DEPTH
), BMF_CLEAR
,
753 window
->RPort
->BitMap
);
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);
764 void AROSPDFApp::exitAROS()
768 SetAttrs(wnd
, MUIA_Window_Open
, FALSE
,TAG_DONE
);
770 CloseScreen(fsscreen
);
771 MUI_DisposeObject(muiapp
);
772 MUI_DeleteCustomClass(mcc
);
775 void AROSPDFApp::redraw(AROSPDFApp
*data
)
777 AROSPDFApp
*me
= (AROSPDFApp
*)data
;
781 pw
= me
->splashOut
->getBitmapWidth();
782 ph
= me
->splashOut
->getBitmapHeight();
784 if (me
->posX
+ me
->dispW
> pw
) {
785 me
->posX
= pw
- me
->dispW
;
789 if (me
->posY
+ me
->dispH
> ph
|| me
->posY
== INT_MAX
) {
790 me
->posY
= ph
- 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() {
815 void AROSPDFApp::ZoomToFit(bool WidthOnly
) {
816 int cropwidth
,cropheight
;
821 cropwidth
=doc
->getPageCropWidth(page
);
822 cropheight
=doc
->getPageCropHeight(page
);
823 //determine what res should be based on our display size
825 //we're gonna fit by width
826 resolution
=72*(double)dispW
/cropwidth
;
828 //we're gonna fit by height
829 resolution
=72*(double)dispH
/cropheight
;
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
),
848 //we only do this stuff when there's a doc
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
),
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
),
866 void AROSPDFApp::ResizeBitMap(int width
, int height
){
867 //get rid of old bitmap, set new one and change the slidebars accordingly
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
);
875 SetAttrs(Bmp
, MY_BM
, bm
,MY_BMHEIGHT
, height
, MY_BMWIDTH
,width
,TAG_DONE
);
877 bm
= AllocBitMap(width
, height
,
878 GetBitMapAttr(fsscreen
->RastPort
.BitMap
, BMA_DEPTH
), BMF_CLEAR
,
879 fsscreen
->RastPort
.BitMap
);
885 int cropwidth
=doc
->getPageCropWidth(page
);
886 resolution
=72*(double)dispW
/cropwidth
;
887 doc
->displayPage(splashOut
, page
, resolution
, resolution
, 0, gFalse
, gFalse
, gFalse
);
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();
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
) {
907 redraw((void *)this);
911 void AROSPDFApp::setHoriz(int n
) {
914 redraw((void *)this);