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 sliderhook
;
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
) {
291 PDFDoc
*newdoc
= new PDFDoc(fileNameA
, ownerPWA
, userPWA
);
299 if (newdoc
->isOk()) {
309 GString
* title
= new GString("AROSPDF - ");
310 title
->append(fileNameA
);
311 SetAttrs(wnd
,MUIA_Window_Title
,title
->getCString() ,TAG_DONE
);
318 splashOut
->startDoc(doc
->getXRef());
321 MUI_Request(muiapp
, wnd
, 0, "AROSPDF", "Continue", "Can't open file '%s'", fileNameA
->getCString());
326 void AROSPDFApp::BackFillFullScreen() {
327 BltBitMapRastPort(bm
, 0, 0, &fsscreen
->RastPort
, 0, 0, dispW
-5, dispH
-1, 0xc0);
330 void AROSPDFApp::ToggleFullscreen() {
331 FullScreen
=!FullScreen
;
333 origscreen
=XGET(wnd
,MUIA_Window_Screen
);
334 int scx
=origscreen
->Width
;
335 int scy
=origscreen
->Height
;
336 fsscreen
=OpenScreenTags(NULL
, SA_Width
,scx
,
337 SA_Height
,scy
,TAG_DONE
);
338 if (fsscreen
!=NULL
) {
339 SetRast( &fsscreen
->RastPort
, 1 );
340 fswindow
=OpenWindowTags(NULL
,
341 WA_Width
, fsscreen
->Width
,
342 WA_Height
, fsscreen
->Height
,
343 WA_CustomScreen
, (IPTR
)fsscreen
,
348 WA_ReportMouse
, TRUE
,
349 WA_IDCMP
, IDCMP_MOUSEBUTTONS
354 | IDCMP_INACTIVEWINDOW
360 ResizeBitMap(scx
,scy
);
362 SetAttrs(wnd
,MUIA_Window_Open
,FALSE
,TAG_DONE
);
363 BackFillFullScreen();
366 if (fsscreen
!=NULL
) {
367 SetAttrs(wnd
,MUIA_Window_Open
,TRUE
,TAG_DONE
);
368 CloseWindow(fswindow
);
369 CloseScreen(fsscreen
);
374 AROSPDFApp::AROSPDFApp() {
377 if (initAROS() != 0) {
378 fprintf(stderr
, "error initializing AROS\n");
386 void AROSPDFApp::JumpToPage(int pageno
) {
391 if ((pageno
> (doc
->getNumPages())) && (page
==(doc
->getNumPages())))
396 if (page
> (doc
->getNumPages())) page
=(doc
->getNumPages());
398 SetAttrs(txtPage
, MUIA_NoNotify
,TRUE
, MUIA_String_Integer
, page
, TAG_DONE
);
399 DoMethod(txtPageCount
, MUIM_SetAsString
, MUIA_Text_Contents
, "of %ld", doc
->getNumPages());
403 int cropwidth
=doc
->getPageCropWidth(page
);
404 resolution
=72*(double)dispW
/cropwidth
;
407 int cropheight
=doc
->getPageCropHeight(page
);
408 resolution
=72*(double)dispH
/cropheight
;
411 doc
->displayPage(splashOut
, page
, resolution
, resolution
, 0, gFalse
,
414 pw
= splashOut
->getBitmapWidth();
415 ph
= splashOut
->getBitmapHeight();
418 if (pw
<= RES_HIGHER_LIMIT
&& ph
<= RES_HIGHER_LIMIT
)
420 if (pw
>= RES_LOWER_LIMIT
&& pw
>= RES_LOWER_LIMIT
)
421 resLowLimit
= gFalse
;
426 SetAttrs(vslider
, MUIA_Prop_Entries
, (LONG
)(ph
/SCROLLSPEED
),MUIA_Prop_Visible
,(LONG
)(dispH
/SCROLLSPEED
),TAG_DONE
);
427 SetAttrs(hslider
, MUIA_Prop_Entries
, (LONG
)(pw
/SCROLLSPEED
),MUIA_Prop_Visible
,(LONG
)(dispW
/SCROLLSPEED
),TAG_DONE
);
429 SetAttrs(vslider
, MUIA_NoNotify
,TRUE
,MUIA_Prop_First
, 0,hslider
, MUIA_Prop_First
, 0,TAG_DONE
);
430 DoMethod(Bmp
,MUIM_Draw
);
433 void AROSPDFApp::PageForwardBack(bool Forward
) {
434 //Page forward true = next page, false = prev page
443 void AROSPDFApp::ScrollUpDown(bool Down
) {
445 DoMethod(vslider
,MUIM_Prop_Increase
,SCROLLSPEED
);
447 DoMethod(vslider
,MUIM_Prop_Decrease
,SCROLLSPEED
);
451 AROSPDFApp::AROSPDFApp(GString
*fileNameA
, GString
*ownerPWA
, GString
*userPWA
) {
454 if (initAROS() != 0) {
455 fprintf(stderr
, "error initializing AROS\n");
459 OpenFile(fileNameA
,ownerPWA
,userPWA
);
462 void AROSPDFApp::quit() {
465 if (docLoaded
==TRUE
) {
470 int AROSPDFApp::run() {
471 // Check that the window opened
472 if (XGET(wnd
, MUIA_Window_Open
)) {
473 DoMethod(muiapp
, MUIM_Application_Execute
);
478 AROS_UFH3(ULONG
, sliderfunction
,
479 AROS_UFHA(struct Hook
*, h
, A0
),
480 AROS_UFHA(Object
*, object
, A2
),
481 AROS_UFHA(APTR
*, msg
, A1
)) {
484 AROSPDFApp
*me
=(AROSPDFApp
*)msg
[0];
485 int item
=(int)msg
[1]; //vert=1, horiz=2
486 LONG val
=(LONG
)msg
[2]; //position in scrollbar
488 me
->setVert(val
*SCROLLSPEED
);
490 me
->setHoriz(val
*SCROLLSPEED
);
497 AROS_UFH3(ULONG
, buttonhookfunc
,
498 AROS_UFHA(struct Hook
*, h
, A0
),
499 AROS_UFHA(Object
*, object
, A2
),
500 AROS_UFHA(APTR
*, msg
, A1
)) {
503 AROSPDFApp
*me
=(AROSPDFApp
*)msg
[0];
504 int item
=(int)msg
[1]; //vert=1, horiz=2
507 me
->PageForwardBack(FALSE
);
510 me
->PageForwardBack(TRUE
);
513 me
->JumpToPage(INT_MAX
);
519 me
->ZoomInOut(FALSE
);
525 me
->JumpToPageTextbox();
532 AROS_UFH3(ULONG
, menufunction
,
533 AROS_UFHA(struct Hook
*, h
, A0
),
534 AROS_UFHA(Object
*, object
, A2
),
535 AROS_UFHA(APTR
*, msg
, A1
)) {
538 AROSPDFApp
*me
=(AROSPDFApp
*)msg
[0];
539 int menuitem
=(int)msg
[1];
545 me
->RequestOpenFile();
548 me
->PageForwardBack(FALSE
);
551 me
->PageForwardBack(TRUE
);
554 me
->JumpToPage(INT_MAX
);
560 me
->ToggleFitWidth();
561 me
->DisableBestFit();
562 me
->JumpToPageTextbox();
566 me
->DisableFitWidth();
567 me
->ZoomToFit(FALSE
);
570 me
->ToggleFullscreen();
578 void AROSPDFApp::ZoomInOut(bool In
) {
581 if (resHiLimit
==gTrue
)
585 if (resLowLimit
==gTrue
)
595 void AROSPDFApp::DisableBestFit() {
597 SetAttrs((APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_BESTFIT
), MUIA_Menuitem_Checked
, FALSE
, TAG_DONE
);
600 void AROSPDFApp::DisableFitWidth() {
602 SetAttrs((APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_FITWIDTH
), MUIA_Menuitem_Checked
, FALSE
, TAG_DONE
);
605 void AROSPDFApp::JumpToPageTextbox() {
606 JumpToPage(XGET(txtPage
,MUIA_String_Integer
));
609 void AROSPDFApp::RequestOpenFile() {
610 static char infile
[1024] = "";
612 struct Screen
* curscreen
;
613 curscreen
=XGET(wnd
,MUIA_Window_Screen
);
614 if (LoadASL(curscreen
,infile
,"Open file:","","#?.pdf",FALSE
)) {
615 fileName
=new GString(infile
);
616 OpenFile(fileName
,(GString
*)NULL
,(GString
*)NULL
);
620 void AROSPDFApp::AboutMenu() {
621 MUI_RequestA(muiapp
,wnd
,0,"About AROSPDF","*OK",about_text
,NULL
);
624 int AROSPDFApp::initAROS() {
625 SplashColor paperColor
;
629 dobj
= GetDiskObject("PROGDIR:AROSPDF");
630 mcc
= MUI_CreateCustomClass(NULL
,MUIC_Area
,NULL
,sizeof(struct CustomImageData
),MyDispatcher
);
632 muiapp
= ApplicationObject
,
633 MUIA_Application_Title
, "AROSPDF",
634 MUIA_Application_Version
, "$VER: AROSPDF 0.3 (30.3.2015)",
635 MUIA_Application_Copyright
, "(C) 2009, Craig Kiesau",
636 MUIA_Application_Author
, "Craig Kiesau",
637 MUIA_Application_Description
, "A PDF viewer",
638 MUIA_Application_Base
, "APDF",
639 MUIA_Application_DiskObject
, (IPTR
)dobj
,
640 SubWindow
, wnd
= WindowObject
,
641 MUIA_Window_Title
, "AROSPDF",
642 MUIA_Window_ID
, MAKE_ID('P', 'D', 'F', 'W'),
643 MUIA_Window_Width
, 640,
644 MUIA_Window_Height
, 480,
645 MUIA_Window_Menustrip
, menustrip
=MUI_MakeObject(MUIO_MenustripNM
,MenuData1
,0),
646 WindowContents
, VGroup
,
648 Child
, butFirst
= ImageObject
,
649 MUIA_Frame
, MUIV_Frame_ImageButton
,
650 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
651 MUIA_Image_Spec
, "3:PROGDIR:resources/dblLeftArrow.png",
653 Child
, butPrev
= ImageObject
,
654 MUIA_Frame
, MUIV_Frame_ImageButton
,
655 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
656 MUIA_Image_Spec
, "3:PROGDIR:resources/leftArrow.png",
658 Child
, txtPage
=StringObject
,
659 MUIA_Frame
, MUIV_Frame_String
,
661 MUIA_Background
, MUII_TextBack
,
662 MUIA_String_Accept
, "0123456789",
663 MUIA_String_Format
, MUIV_String_Format_Right
,
665 Child
, txtPageCount
=TextObject
,
667 MUIA_Text_PreParse
, "\33l",
669 Child
, butNext
= ImageObject
,
670 MUIA_Frame
, MUIV_Frame_ImageButton
,
671 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
672 MUIA_Image_Spec
, "3:PROGDIR:resources/rightArrow.png",
674 Child
, butLast
= ImageObject
,
675 MUIA_Frame
, MUIV_Frame_ImageButton
,
676 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
677 MUIA_Image_Spec
, "3:PROGDIR:resources/dblRightArrow.png",
679 Child
, butZoomOut
= TextObject
,
681 MUIA_Frame
, MUIV_Frame_Button
,
682 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
683 MUIA_Text_Contents
, "\33c-",
685 Child
, butZoomIn
= TextObject
,
687 MUIA_Frame
, MUIV_Frame_Button
,
688 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
689 MUIA_Text_Contents
, "\33c+",
691 Child
, RectangleObject
,End
,
694 Child
, Bmp
= NewObject(mcc
->mcc_Class
,NULL
,
695 TextFrame
,MY_APP
,(void *)this, MY_BMWIDTH
, BITMAPX
, MY_BMHEIGHT
, BITMAPY
,
696 MUIA_Background
, MUII_BACKGROUND
,
699 Child
, vslider
= ScrollbarObject
,
700 MUIA_Prop_Entries
, 100,
703 Child
, hslider
= ScrollbarObject
,
704 MUIA_Group_Horiz
, TRUE
,
705 MUIA_Prop_Entries
, 100,
711 if (muiapp
!= NULL
) {
712 sliderhook
.h_Entry
= (HOOKFUNC
)sliderfunction
;
713 menuhook
.h_Entry
= (HOOKFUNC
)menufunction
;
714 buttonhook
.h_Entry
= (HOOKFUNC
)buttonhookfunc
;
716 DoMethod(vslider
, MUIM_Notify
, MUIA_Prop_First
, MUIV_EveryTime
,
717 (IPTR
)vslider
, 5, MUIM_CallHook
, (IPTR
)&sliderhook
,(AROSPDFApp
*)this,1,MUIV_TriggerValue
);
718 DoMethod(hslider
, MUIM_Notify
, MUIA_Prop_First
, MUIV_EveryTime
,
719 (IPTR
)hslider
, 5, MUIM_CallHook
, (IPTR
)&sliderhook
,(AROSPDFApp
*)this,2,MUIV_TriggerValue
);
720 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_MenuAction
, MUIV_EveryTime
,
721 (IPTR
)wnd
, 4, MUIM_CallHook
, (IPTR
)&menuhook
, (AROSPDFApp
*)this, MUIV_TriggerValue
);
722 DoMethod(butFirst
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,1);
723 DoMethod(butPrev
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,2);
724 DoMethod(butNext
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,3);
725 DoMethod(butLast
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,4);
726 DoMethod(butZoomOut
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,5);
727 DoMethod(butZoomIn
,MUIM_Notify
,MUIA_Pressed
,FALSE
,(IPTR
)muiapp
,4,MUIM_CallHook
,(IPTR
)&buttonhook
,(AROSPDFApp
*)this,6);
728 DoMethod(txtPage
,MUIM_Notify
,MUIA_String_Acknowledge
, MUIV_EveryTime
,(IPTR
)muiapp
, 4, MUIM_CallHook
, (IPTR
)&buttonhook
, (AROSPDFApp
*)this,7);
729 // Click Close gadget or hit Escape to quit
730 DoMethod(wnd
, MUIM_Notify
, MUIA_Window_CloseRequest
, TRUE
,
732 MUIM_Application_ReturnID
, MUIV_Application_ReturnID_Quit
);
733 DoMethod((APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_QUIT
), MUIM_Notify
, MUIA_Menuitem_Trigger
, MUIV_EveryTime
,
734 (IPTR
) muiapp
, 2, MUIM_Application_ReturnID
,
735 MUIV_Application_ReturnID_Quit
);
738 SetAttrs(wnd
, MUIA_Window_Open
, (LONG
)TRUE
,TAG_DONE
);
740 struct Window
*window
= (struct Window
*)XGET(wnd
, MUIA_Window_Window
);
742 bm
= AllocBitMap(BITMAPX
, BITMAPY
,
743 GetBitMapAttr(window
->RPort
->BitMap
, BMA_DEPTH
), BMF_CLEAR
,
744 window
->RPort
->BitMap
);
746 SetAttrs(Bmp
, MY_BM
,bm
,TAG_DONE
);
748 paperColor
[0] = paperColor
[1] = paperColor
[2] = 255;
749 splashOut
= new AROSSplashOutputDev(rp
, gFalse
, paperColor
, gFalse
,
750 &redraw
, (AROSPDFApp
*)this);
755 void AROSPDFApp::exitAROS()
759 SetAttrs(wnd
, MUIA_Window_Open
, FALSE
,TAG_DONE
);
761 CloseScreen(fsscreen
);
762 MUI_DisposeObject(muiapp
);
763 MUI_DeleteCustomClass(mcc
);
765 FreeDiskObject(dobj
);
768 void AROSPDFApp::redraw(AROSPDFApp
*data
)
770 AROSPDFApp
*me
= (AROSPDFApp
*)data
;
774 pw
= me
->splashOut
->getBitmapWidth();
775 ph
= me
->splashOut
->getBitmapHeight();
777 if (me
->posX
+ me
->dispW
> pw
) {
778 me
->posX
= pw
- me
->dispW
;
782 if (me
->posY
+ me
->dispH
> ph
|| me
->posY
== INT_MAX
) {
783 me
->posY
= ph
- me
->dispH
;
791 //do we need to center the doc because it's smaller than the display?
792 if (pw
<(me
->dispW
)) {
793 localx
=localx
+(me
->dispW
-pw
)/2;
794 destw
=destw
-(localx
*2);
796 if (ph
<(me
->dispH
)) {
797 localy
=localy
+(me
->dispH
-ph
)/2;
798 desth
=desth
-(localy
*2);
800 me
->splashOut
->redraw(me
->posX
, me
->posY
, localx
, localy
, destw
, desth
,me
->dispW
,me
->dispH
);
801 DoMethod(me
->Bmp
, MUIM_Draw
);
804 AROSPDFApp::~AROSPDFApp() {
808 void AROSPDFApp::ZoomToFit(bool WidthOnly
) {
809 int cropwidth
,cropheight
;
814 cropwidth
=doc
->getPageCropWidth(page
);
815 cropheight
=doc
->getPageCropHeight(page
);
816 //determine what res should be based on our display size
818 //we're gonna fit by width
819 resolution
=72*(double)dispW
/cropwidth
;
821 //we're gonna fit by height
822 resolution
=72*(double)dispH
/cropheight
;
827 void AROSPDFApp::EnableDisableGUI() {
828 //based on status we enable/disable buttons and menu options
829 //LONG docInvert=!docLoaded;
830 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Disabled
, (LONG
)!docLoaded
,
831 butFirst
,butPrev
,butNext
,butLast
,butZoomOut
,butZoomIn
,txtPage
,NULL
);
832 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Menuitem_Enabled
,(LONG
)docLoaded
,
833 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_PREVPAGE
),
834 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_NEXTPAGE
),
835 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_FIRSTPAGE
),
836 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_LASTPAGE
),
837 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_ZOOMIN
),
838 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_ZOOMOUT
),
841 //we only do this stuff when there's a doc
843 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Disabled
,TRUE
,butFirst
,butPrev
,NULL
);
844 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Menuitem_Enabled
, FALSE
,
845 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_PREVPAGE
),
846 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_FIRSTPAGE
),
849 if (page
==doc
->getNumPages()) {
850 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Disabled
,TRUE
,butNext
,butLast
,NULL
);
851 DoMethod(wnd
,MUIM_MultiSet
,MUIA_Menuitem_Enabled
, FALSE
,
852 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_NEXTPAGE
),
853 (APTR
)DoMethod(menustrip
,MUIM_FindUData
,MEN_LASTPAGE
),
859 void AROSPDFApp::ResizeBitMap(int width
, int height
){
860 //get rid of old bitmap, set new one and change the slidebars accordingly
864 struct Window
*window
= (struct Window
*)XGET(wnd
, MUIA_Window_Window
);
865 bm
= AllocBitMap(width
, height
,
866 GetBitMapAttr(window
->RPort
->BitMap
, BMA_DEPTH
), BMF_CLEAR
, window
->RPort
->BitMap
);
868 SetAttrs(Bmp
, MY_BM
, bm
,MY_BMHEIGHT
, height
, MY_BMWIDTH
,width
,TAG_DONE
);
870 bm
= AllocBitMap(width
, height
,
871 GetBitMapAttr(fsscreen
->RastPort
.BitMap
, BMA_DEPTH
), BMF_CLEAR
,
872 fsscreen
->RastPort
.BitMap
);
878 int cropwidth
=doc
->getPageCropWidth(page
);
879 resolution
=72*(double)dispW
/cropwidth
;
880 doc
->displayPage(splashOut
, page
, resolution
, resolution
, 0, gFalse
, gFalse
, gFalse
);
883 int cropheight
=doc
->getPageCropHeight(page
);
884 resolution
=72*(double)dispH
/cropheight
;
885 doc
->displayPage(splashOut
, page
, resolution
, resolution
, 0, gFalse
, gFalse
, gFalse
);
887 pw
= splashOut
->getBitmapWidth();
888 ph
= splashOut
->getBitmapHeight();
890 SetAttrs(vslider
, MUIA_Prop_Entries
, (LONG
)(ph
/SCROLLSPEED
),MUIA_Prop_Visible
,(LONG
)(height
/SCROLLSPEED
),TAG_DONE
);
891 SetAttrs(hslider
, MUIA_Prop_Entries
, (LONG
)(pw
/SCROLLSPEED
),MUIA_Prop_Visible
,(LONG
)(width
/SCROLLSPEED
),TAG_DONE
);
893 bug("Before redraw\n");
894 redraw((void *)this);
897 void AROSPDFApp::setVert(int n
) {
900 redraw((void *)this);
904 void AROSPDFApp::setHoriz(int n
) {
907 redraw((void *)this);