1 /*************************************************************************\
5 * Copyright 2000-2002 Emmanuel Lesueur *
7 \*************************************************************************/
13 #include <libraries/mui.h>
14 #include <devices/rawkeycodes.h>
15 #include <proto/intuition.h>
16 #include <proto/muimaster.h>
17 #include <proto/utility.h>
19 #include "docscroll.h"
21 #include "docbitmap.h"
28 #define kprintf dprintf
31 # define AA(x,y,z) x,y,z
36 #define BROKEN_KILLNOTIFY
41 #define historySize 50
42 #define numBookmarks 10
49 typedef struct History History
;
56 struct DocScrollData
{
57 struct comm_info
*comm_info
;
58 struct page_info
*pages
;
87 History history
[historySize
];
88 History bookmark
[numBookmarks
];
89 struct MUI_EventHandlerNode ehn
;
92 typedef struct DocScrollData DocScrollData
;
96 * Virtual group class that notifies its dimensions changes.
105 typedef struct VGroupData VGroupData
;
107 Static ULONG
vgNew(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
) {
108 if(obj
=(Object
*)DoSuperMethodA(cl
,obj
,(APTR
)msg
)) {
109 VGroupData
* dat
=INST_DATA(cl
,obj
);
110 memset(dat
,0,sizeof(*dat
));
115 Static ULONG
vgGet(struct IClass
*cl
,Object
*obj
,struct opGet
*msg
) {
116 if(msg
->opg_AttrID
==MYATTR_Virtgroup_GeometryChange
) {
120 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
123 Static ULONG
vgDraw(struct IClass
*cl
,Object
*obj
,struct MUIP_Draw
*msg
) {
124 VGroupData
*dat
=INST_DATA(cl
,obj
);
128 get(obj
,MUIA_Virtgroup_Width
,&w
);
129 get(obj
,MUIA_Virtgroup_Height
,&h
);
130 if(w1
!=dat
->width
|| h1
!=dat
->height
|| w
!=dat
->vwidth
|| h
!=dat
->vheight
) {
135 set(obj
,MYATTR_Virtgroup_GeometryChange
,TRUE
);
137 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
141 Static ULONG
vgHandleInput(struct IClass
*cl
,Object
*obj
,struct MUIP_HandleInput
*msg
) {
142 /* Don't pass middle button events to the superclass */
143 /* We could use MUIA_Virtgroup_Input=FALSE, but then mouse events aren't
144 'clipped' to the virtual frame */
145 if(msg
->imsg
&& msg
->imsg
->Class
==IDCMP_MOUSEBUTTONS
&&
146 (msg
->imsg
->Code
==MIDDLEDOWN
|| msg
->imsg
->Code
==MIDDLEUP
)) {
150 get(obj
,MUIA_Group_ChildList
,&list
);
152 while(o
=NextObject(&state
))
153 DoMethodA(o
,(APTR
)msg
);
156 return DoSuperMethodA(cl
,obj
,msg
);
159 /* Only called with MUI 3.8- */
160 Static ULONG
vgHandleInput(struct IClass
*cl
,Object
*obj
,struct MUIP_HandleInput
*msg
) {
161 /* Don't pass mouse events outside the clip box to the children */
162 if(msg
->imsg
&& msg
->imsg
->Class
==IDCMP_MOUSEBUTTONS
&&
163 (msg
->imsg
->Code
==SELECTDOWN
|| msg
->imsg
->Code
==MIDDLEDOWN
||
164 msg
->imsg
->Code
==MENUDOWN
) &&
165 (msg
->imsg
->MouseX
<_mleft(obj
) || msg
->imsg
->MouseX
>=_mright(obj
) ||
166 msg
->imsg
->MouseY
<_mtop(obj
) || msg
->imsg
->MouseY
>=_mbottom(obj
)))
168 return DoSuperMethodA(cl
,obj
,msg
);
172 BEGIN_DISPATCHER(vgDispatcher
,cl
,obj
,msg
) {
173 switch(msg
->MethodID
) {
174 case OM_NEW
: return vgNew(cl
,obj
,(APTR
)msg
);
175 //case OM_SET: return vgSet(cl,obj,(APTR)msg);
176 case OM_GET
: return vgGet(cl
,obj
,(APTR
)msg
);
177 case MUIM_Draw
: return vgDraw(cl
,obj
,(APTR
)msg
);
178 case MUIM_HandleInput
: if(is38
) return vgHandleInput(cl
,obj
,(APTR
)msg
); break;
180 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
182 END_DISPATCHER(vgDispatcher
)
184 struct MUI_CustomClass
*vgroup_mcc
;
186 Static
void update_sizes(struct IClass
*cl
,Object
*obj
);
188 Static
void update_dpi(struct IClass
*cl
,Object
*obj
) {
189 DocScrollData
*dat
=INST_DATA(cl
,obj
);
190 int dpi
=dat
->dpi
==-1?0x7fffffff:dat
->dpi
;
194 static in_update_dpi
;
198 DB(kprintf("update_dpi() dpi=%ld\n",dat
->dpi
);)
199 get(dat
->pageset
,MUIA_Group_ChildList
,&list
);
201 while(o
=NextObject(&state
)) {
203 get(o
,MYATTR_DocBitmap_DPI
,&dpi1
);
204 DB(kprintf("o=%lx, dpi=%ld\n",o
,dpi1
);)
205 if(dpi1
>0 && dpi1
<dpi
)
208 DB(kprintf("-> dpi=%ld\n",dpi
);)
210 struct page_info
*pages
=dat
->pages
;
212 set(dat
->pageset
,MYATTR_PageSet_DPI
,dpi
);
215 for(k
=0;k
<dat
->num_pages
;++k
) {
219 update_sizes(cl
,obj
);
225 Static
void calc_sizes(DocScrollData
*dat
) {
227 int total_height
=0,num
=0,max_width
=1,num2
=0;
228 struct page_info
*pages
=dat
->pages
;
231 get(dat
->pageset
,MYATTR_PageSet_Columns
,&dat
->columns
);
232 dat
->skip
=!(dat
->columns
&1);
233 for(k
=-dat
->skip
;k
<dat
->num_pages
;) {
237 for(i
=0;i
<dat
->columns
&& k
<dat
->num_pages
;++i
) {
238 if(k
>=0 && pages
[k
].width
>0) {
239 total_width
+=pages
[k
].width
;
240 if(pages
[k
].height
>max_height
)
241 max_height
=pages
[k
].height
;
246 total_height
+=max_height
;
250 if(total_width
>max_width
)
251 max_width
=total_width
;
254 dat
->average_height
=total_height
/num
;
255 dat
->total_height
=total_height
+dat
->average_height
*num2
+SPACING
*(num
+num2
-1);
257 dat
->average_height
=1;
260 dat
->average_width
=1;
262 dat
->max_width
=max_width
;
263 DB(kprintf("num=%ld, num2=%ld, num_pages=%ld, skip=%ld\n"
264 "total_width=%ld, max_width=%ld, avg_width=%ld\n"
265 "total_height=%ld, max_height=%ld, avg_height=%ld\n",
266 num
,num2
,dat
->num_pages
,dat
->skip
,
267 dat
->total_width
,dat
->max_width
,dat
->average_width
,
268 dat
->total_height
,dat
->max_height
,dat
->average_height
);)
269 set(dat
->hscroll
,MUIA_Prop_Entries
,dat
->max_width
);
270 set(dat
->vscroll
,MUIA_Prop_Entries
,dat
->total_height
);
273 Static
void update_sizes(struct IClass
*cl
,Object
*obj
) {
274 DocScrollData
*dat
=INST_DATA(cl
,obj
);
279 //DB(kprintf("update_sizes: num_pages=%ld\n",dat->num_pages);)
280 if(dat
->mode
==vmContinuous
&&
281 (dat
->zoom
==zoomPage
|| dat
->zoom
==zoomWidth
))
285 get(dat
->pageset
,MUIA_Group_ChildList
,&list
);
287 while(o
=NextObject(&state
)) {
288 int page
,width
,height
;
289 get(o
,MYATTR_DocBitmap_Page
,&page
);
290 //DB(kprintf("o=%lx, page=%ld\n",o,page);)
292 if(page
<dat
->num_pages
) {
293 get(o
,MYATTR_DocBitmap_Width
,&width
);
294 get(o
,MYATTR_DocBitmap_Height
,&height
);
295 //DB(kprintf("width=%ld, height=%ld\n",width,height);)
296 if(dat
->pages
[page
].width
!=width
||
297 dat
->pages
[page
].height
!=height
) {
299 dat
->pages
[page
].width
=width
;
300 dat
->pages
[page
].height
=height
;
309 Static ULONG
dsSet(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
) {
310 DocScrollData
*dat
=INST_DATA(cl
,obj
);
311 struct TagItem
*tags
=msg
->ops_AttrList
;
313 BOOL no_history
=FALSE
;
315 while(tag
=NextTagItem(&tags
)) {
316 switch(tag
->ti_Tag
) {
317 case MYATTR_DocScroll_NoHistory
:
318 no_history
=tag
->ti_Data
;
321 case MYATTR_DocScroll_DocChanged
:
322 dat
->docchanged
=(Object
*)tag
->ti_Data
;
325 case MYATTR_DocScroll_Document
:
326 if(tag
->ti_Data
!=(LONG
)dat
->doc
) {
327 struct MYS_DocBitmap_CropBox box
;
328 ULONG page
,zoom
,rotate
,textaa
,fillaa
,strokeaa
,page1
;
329 get((Object
*)tag
->ti_Data
,MYATTR_Document_NumPages
,&dat
->num_pages
);
330 get((Object
*)tag
->ti_Data
,MYATTR_Document_OpenPage
,&page
);
331 if(!no_history
&& dat
->doc
) {
334 get(dat
->doc
,MYATTR_Document_Dir
,&dir
);
335 get(dat
->doc
,MYATTR_Document_Name
,&name
);
336 DoMethod5(obj
,MYM_DocScroll_HistoryPush
,dat
->page
,dir
,name
);
338 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
339 dat
->doc
=(Object
*)tag
->ti_Data
;
340 DB(kprintf("DocScroll: open page %d\n",page
);)
341 page1
=GetTagData(MYATTR_DocScroll_Page
,-1,msg
->ops_AttrList
);
344 get(dat
->doc
,MYATTR_Document_OpenZoom
,&zoom
);
345 get(dat
->doc
,MYATTR_Document_OpenRotate
,&rotate
);
346 get(dat
->doc
,MYATTR_Document_OpenCropBox
,&box
);
348 get(dat
->doc
,MYATTR_Document_OpenTextAA
,&textaa
);
349 get(dat
->doc
,MYATTR_Document_OpenFillAA
,&fillaa
);
350 get(dat
->doc
,MYATTR_Document_OpenStrokeAA
,&strokeaa
);
352 DB(kprintf("DocScroll: set document. openzoom %d openpage %d\n",zoom
,page
);)
354 DB(kprintf("DocScroll: set pageset params\n"));
355 SetAttrs(dat
->pageset
,
356 MYATTR_PageSet_Document
,dat
->doc
,
357 MYATTR_PageSet_Page
,page
,
358 MYATTR_PageSet_Zoom
,zoom
,
359 MYATTR_PageSet_Rotate
,rotate
,
360 MYATTR_PageSet_CropBox
,&box
,
361 AA(MYATTR_PageSet_TextAA
,textaa
,)
362 AA(MYATTR_PageSet_FillAA
,fillaa
,)
363 AA(MYATTR_PageSet_StrokeAA
,strokeaa
,)
365 DB(kprintf("DocScroll: set self params\n"));
367 MYATTR_DocScroll_NoHistory
,TRUE
,
368 MYATTR_DocScroll_Page
,page
,
369 MYATTR_DocScroll_Zoom
,zoom
,
371 set(obj
,MYATTR_DocScroll_DocChanged
,dat
->doc
);
372 DoMethod2(obj
,MYM_DocScroll_ResetData
);
373 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
377 case MYATTR_DocScroll_Page
: {
383 else if(p
>dat
->num_pages
)
386 DB(kprintf("docscroll: set(page,%ld)\n",p
);)
387 if(!no_history
&& dat
->doc
)
388 DoMethod5(obj
,MYM_DocScroll_HistoryPush
,dat
->page
,0,NULL
);
389 if(dat
->mode
==vmContinuous
) {
393 struct page_info
*pages
=dat
->pages
;
394 //set(dat->pageset,MYATTR_PageSet_Page,p);
397 //set(dat->vgroup,MUIA_Virtgroup_Top,0);
398 for(k
=-dat
->skip
;k
+dat
->columns
<p
;) {
400 for(i
=0;i
<dat
->columns
&& k
<dat
->num_pages
;++i
) {
402 int h
=pages
[k
].height
<0 ? dat
->average_height
: pages
[k
].height
;
408 t
+=max_height
+SPACING
;
412 DB(kprintf("set_page(%ld) -> top=%ld\n",dat
->page
,t
);)
413 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
414 nnset(dat
->vscroll
,MUIA_Prop_First
,t
);
415 nnset(dat
->pageset
,MYATTR_PageSet_Page
,p
);
416 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
420 if(dat
->mode
!=vmSpecial
)
421 set(dat
->pageset
,MYATTR_PageSet_Page
,p
);
427 case MYATTR_DocScroll_ViewMode
:
428 if(tag
->ti_Data
!=dat
->mode
) {
429 int old_mode
=dat
->mode
;
430 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
431 dat
->mode
=tag
->ti_Data
;
432 if(dat
->mode
==vmContinuous
) {
433 get(dat
->pageset
,MYATTR_PageSet_Rows
,&dat
->orig_rows
);
434 set(dat
->pageset
,MYATTR_PageSet_StripMode
,TRUE
);
435 DB(kprintf("orig_rows=%ld\n",dat
->orig_rows
);)
437 #ifndef BROKEN_KILLNOTIFY
438 DoMethod3(dat
->vscroll
,MUIM_KillNotify
,MUIA_Prop_First
);
439 DoMethod3(dat
->vgroup
,MUIM_KillNotify
,MUIA_Virtgroup_Top
);
440 DoMethod3(dat
->vgroup
,MUIM_KillNotify
,MUIA_Virtgroup_Height
);
441 if(dat
->mode
==vmContinuous
) {
442 DoMethod7(dat
->vscroll
,MUIM_Notify
,MUIA_Prop_First
,MUIV_EveryTime
,
443 //_app(obj),4,MUIM_Application_PushMethod,
444 obj
,1,MYM_DocScroll_PosChanged
);
446 DoMethod9(dat
->vscroll
,MUIM_Notify
,MUIA_Prop_First
,MUIV_EveryTime
,
447 dat
->vgroup
,3,MUIM_Set
,MUIA_Virtgroup_Top
,MUIV_TriggerValue
);
448 DoMethod9(dat
->vgroup
,MUIM_Notify
,MUIA_Virtgroup_Top
,MUIV_EveryTime
,
449 dat
->vscroll
,3,MUIM_Set
,MUIA_Prop_First
,MUIV_TriggerValue
);
450 DoMethod9(dat
->vgroup
,MUIM_Notify
,MUIA_Virtgroup_Height
,MUIV_EveryTime
,
451 dat
->vscroll
,3,MUIM_Set
,MUIA_Prop_Entries
,MUIV_TriggerValue
);
454 DoMethod2(obj
,MYM_DocScroll_UpdateState
);
455 if(dat
->mode
==vmContinuous
) {
459 MYATTR_DocScroll_NoHistory
,TRUE
,
460 MYATTR_DocScroll_Page
,p
,
463 if(old_mode
==vmContinuous
) {
464 DB(kprintf("rows reset to %ld\n",dat
->orig_rows
);)
465 SetAttrs(dat
->pageset
,
466 MYATTR_PageSet_Rows
,dat
->orig_rows
,
467 MYATTR_PageSet_StripMode
,FALSE
,
468 MYATTR_PageSet_YOffset
,0,
471 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
475 case MYATTR_DocScroll_Quiet
:
477 * When this attribute is set, no drawing operation is done,
478 * neither by the pageset object, nor by the virtual group that
479 * contains it. Unfortunately, when the position of the
480 * virtual group is changed, the visible area is scrolled
481 * without going through the MUIM_Draw method of the virtual
482 * group. So a 'quiet' mode for the virtual group can not be
483 * implemented by subclassing the MUIC_Virtgroup class.
484 * Instead, we do it in the following way: we put the virtual group
485 * in a page group together with a RectangleObject that has
486 * FillArea=FALSE. Switching to the RectangleObject page prevents
487 * the virtual group from drawing anything.
489 set(dat
->pageset
,MYATTR_PageSet_Quiet
,tag
->ti_Data
);
491 set(obj
,MUIA_Group_ActivePage
,1);
495 set(obj
,MUIA_Group_ActivePage
,0);
497 DB(kprintf("docscroll %lx: quiet=%ld\n",obj
,dat
->quiet
);)
500 case MYATTR_DocScroll_Zoom
:
501 if(dat
->zoom
!=tag
->ti_Data
) {
502 DB(kprintf("docscroll: zoom=%ld (was %d)\n",tag
->ti_Data
,dat
->zoom
);)
503 dat
->zoom
=tag
->ti_Data
;
504 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
505 if(dat
->zoom
==zoomPage
) {
506 if(dat
->mode
!=vmContinuous
)
507 set(obj
,MYATTR_DocScroll_ViewMode
,vmFitPage
);
508 } else if(dat
->mode
==vmFitPage
) {
509 set(obj
,MYATTR_DocScroll_ViewMode
,vmFix
);
511 if(dat
->zoom
==zoomPage
|| dat
->zoom
==zoomWidth
)
513 set(dat
->pageset
,MYATTR_PageSet_Zoom
,dat
->zoom
);
514 DoMethod2(obj
,MYM_DocScroll_UpdateState
);
515 /*if(dat->mode==vmContinuous &&
516 (dat->zoom==zoomPage || dat->zoom==zoomWidth)) {
518 set(dat->pageset,MYATTR_PageSet_DPI,dat->dpi);
520 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
525 if(msg
->MethodID
==OM_NEW
)
528 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
531 Static Object
*getParent(Object
*o
) {
533 get(o
, MUIA_Parent
, &p
);
537 Static ULONG
dsNew(struct IClass
*cl
,Object
*obj
,struct opSet
*msg
) {
538 Object
*vscroll
,*hscroll
,*vgroup
,*pageset
,*pgroup
,*rect
,*fgroup
;
539 struct TagItem tags
[4];
540 struct comm_info
*ci
;
543 DB(kprintf("new DocScrollObject\n");)
545 pageset
=(Object
*)GetTagData(MYATTR_DocScroll_Contents
,0,msg
->ops_AttrList
);
546 ci
=(struct comm_info
*)GetTagData(MYATTR_DocScroll_CommInfo
,0,msg
->ops_AttrList
);
547 full_screen
=GetTagData(MYATTR_DocScroll_FullScreen
,0,msg
->ops_AttrList
);
552 vgroup
=myVirtgroupObject
,
553 //MUIA_FillArea,FALSE,
554 MUIA_Virtgroup_Input
,FALSE
,
558 tags
[0].ti_Tag
=MUIA_Group_PageMode
;
559 tags
[0].ti_Data
=TRUE
;
560 tags
[1].ti_Tag
=MUIA_Group_Child
;
561 tags
[1].ti_Data
=(LONG
)(pgroup
=VGroup
,
562 MUIA_Group_Columns
,2,
563 MUIA_Group_Spacing
,0,
565 /* put the frame in another group, so that the size
566 of the inner area is the size of vgroup */
567 MUIA_Frame
,full_screen
?MUIV_Frame_None
:MUIV_Frame_Virtual
,
570 Child
,vscroll
=ScrollbarObject
,
572 Child
,hscroll
=ScrollbarObject
,
573 MUIA_Group_Horiz
,TRUE
,
575 Child
,rect
=RectangleObject
,
578 tags
[2].ti_Tag
=MUIA_Group_Child
;
579 tags
[2].ti_Data
=(LONG
)RectangleObject
, /* hack for MYATTR_DocScroll_Quiet */
582 tags
[3].ti_Tag
=TAG_MORE
;
583 tags
[3].ti_Data
=(LONG
)msg
->ops_AttrList
;
584 msg
->ops_AttrList
=tags
;
586 if(obj
=(Object
*)DoSuperMethodA(cl
,obj
,(APTR
)msg
)) {
587 DocScrollData
* dat
=INST_DATA(cl
,obj
);
590 memset(dat
,0,sizeof(*dat
));
592 dat
->pageset
=pageset
;
596 dat
->hscroll
=hscroll
;
597 dat
->vscroll
=vscroll
;
603 // kiero: use parent as it seems obj is not real parent of these objects. this one should be safe
604 if (getParent(hscroll
))
605 DoMethod3(getParent(hscroll
),OM_REMMEMBER
,hscroll
);
606 if (getParent(vscroll
))
607 DoMethod3(getParent(vscroll
),OM_REMMEMBER
,vscroll
);
609 DoMethod3(getParent(rect
),OM_REMMEMBER
,rect
);
611 dat
->has_hscroll
=FALSE
;//TRUE;
612 dat
->has_vscroll
=FALSE
;//TRUE;
614 get(dat
->pageset
,MYATTR_PageSet_Page
,&dat
->page
);
615 get(dat
->pageset
,MYATTR_PageSet_Rows
,&dat
->orig_rows
);
616 set(dat
->pageset
,MYATTR_PageSet_VGroup
,vgroup
);
617 set(obj
,MYATTR_DocScroll_ViewMode
,vmFix
);
618 get(dat
->pageset
,MYATTR_PageSet_Zoom
,&t
);
619 DB(kprintf("DocScroll: zoom %d pageset zoom %d\n",dat
->zoom
,t
);)
620 set(obj
,MYATTR_DocScroll_Zoom
,t
);
622 DoMethod9(pageset
,MUIM_Notify
,MYATTR_PageSet_Page
,MUIV_EveryTime
,
623 obj
,3,MUIM_Set
,MYATTR_DocScroll_Page
,MUIV_TriggerValue
);
624 DoMethod9(pageset
,MUIM_Notify
,MYATTR_PageSet_DocChanged
,MUIV_EveryTime
,
625 obj
,3,MUIM_Set
,MYATTR_DocScroll_Document
,MUIV_TriggerValue
);
626 //DoMethod7(vscroll,MUIM_Notify,MUIA_Prop_First,MUIV_EveryTime,
627 // obj,1,MYM_DocScroll_PosChanged);
628 //DoMethod9(pageset,MUIM_Notify,MYATTR_PageSet_Zoom,MUIV_EveryTime,
629 // obj,3,MUIM_Set,MYATTR_DocScroll_Zoom,MUIV_TriggerValue);
630 DoMethod7(pageset
,MUIM_Notify
,MYATTR_PageSet_Rotate
,MUIV_EveryTime
,
631 //app,3,MUIM_Application_PushMethod,
632 obj
,1,MYM_DocScroll_UpdateState
);
633 DoMethod7(pageset
,MUIM_Notify
,MYATTR_PageSet_Columns
,MUIV_EveryTime
,
634 //app,3,MUIM_Application_PushMethod,
635 obj
,1,MYM_DocScroll_Layout
);
636 DoMethod7(pageset
,MUIM_Notify
,MYATTR_PageSet_Rows
,MUIV_EveryTime
,
637 //app,3,MUIM_Application_PushMethod,
638 obj
,1,MYM_DocScroll_Layout
);
639 DoMethod7(pageset
,MUIM_Notify
,MYATTR_PageSet_Back
,TRUE
,
640 obj
,1,MYM_DocScroll_Backward
);
641 /*DoMethod9(vgroup,MUIM_Notify,MUIA_Height,MUIV_EveryTime,
642 vscroll,3,MUIM_Set,MUIA_Prop_Visible,MUIV_TriggerValue);*/
643 DoMethod9(vgroup
,MUIM_Notify
,MUIA_Virtgroup_Width
,MUIV_EveryTime
,
644 hscroll
,3,MUIM_Set
,MUIA_Prop_Entries
,MUIV_TriggerValue
);
645 DoMethod9(vgroup
,MUIM_Notify
,MUIA_Virtgroup_Left
,MUIV_EveryTime
,
646 hscroll
,3,MUIM_Set
,MUIA_Prop_First
,MUIV_TriggerValue
);
647 DoMethod9(hscroll
,MUIM_Notify
,MUIA_Prop_First
,MUIV_EveryTime
,
648 vgroup
,3,MUIM_Set
,MUIA_Virtgroup_Left
,MUIV_TriggerValue
);
649 /*DoMethod9(vgroup,MUIM_Notify,MUIA_Width,MUIV_EveryTime,
650 hscroll,3,MUIM_Set,MUIA_Prop_Visible,MUIV_TriggerValue);*/
651 #ifdef BROKEN_KILLNOTIFY
652 DoMethod7(vscroll
,MUIM_Notify
,MUIA_Prop_First
,MUIV_EveryTime
,
653 //app,4,MUIM_Application_PushMethod,
654 obj
,1,MYM_DocScroll_PosChanged
);
656 DoMethod7(vgroup
,MUIM_Notify
,MYATTR_Virtgroup_GeometryChange
,MUIV_EveryTime
,
657 //app,3,MUIM_Application_PushMethod,
658 obj
,1,MYM_DocScroll_UpdateScroll
);
659 get(pageset
,MYATTR_PageSet_Document
,&t
);
660 DB(kprintf("doc=%lx\n",t
);)
663 MYATTR_DocScroll_Document
,t
,
664 MYATTR_DocScroll_Page
,dat
->page
,
669 msg
->ops_AttrList
=(APTR
)tags
[3].ti_Data
;
674 Static ULONG
dsDispose(struct IClass
*cl
,Object
*obj
,Msg msg
) {
675 DocScrollData
*dat
=INST_DATA(cl
,obj
);
677 MyFreeMem(dat
->pages
);
678 for(n
=0;n
<dat
->histTot
;++n
) {
679 MyFreeMem(dat
->history
[n
].name
);
680 UnLock(dat
->history
[n
].dir
);
682 for(n
=0;n
<numBookmarks
;++n
) {
683 MyFreeMem(dat
->bookmark
[n
].name
);
684 UnLock(dat
->bookmark
[n
].dir
);
686 return DoSuperMethodA(cl
,obj
,msg
);
689 Static ULONG
dsGet(struct IClass
*cl
,Object
*obj
,struct opGet
*msg
) {
690 DocScrollData
*dat
=INST_DATA(cl
,obj
);
691 switch(msg
->opg_AttrID
) {
692 case MYATTR_DocScroll_ViewMode
:
693 *msg
->opg_Storage
=dat
->mode
;
695 case MYATTR_DocScroll_DocChanged
:
696 *msg
->opg_Storage
=(LONG
)dat
->docchanged
;
698 case MYATTR_DocScroll_Document
:
699 *msg
->opg_Storage
=(LONG
)dat
->doc
;
701 case MYATTR_DocScroll_Page
:
702 *msg
->opg_Storage
=dat
->page
;
704 case MYATTR_DocScroll_Zoom
:
705 *msg
->opg_Storage
=dat
->zoom
;
708 return DoSuperMethodA(cl
,obj
,(APTR
)msg
);
711 Static ULONG
dsSetup(struct IClass
*cl
,Object
*obj
,Msg msg
) {
712 DocScrollData
*dat
=INST_DATA(cl
,obj
);
713 if(!DoSuperMethodA(cl
,obj
,msg
))
715 //MUI_RequestIDCMP(obj,IDCMP_RAWKEY);
716 dat
->ehn
.ehn_Priority
=0;
717 dat
->ehn
.ehn_Flags
=0;
718 dat
->ehn
.ehn_Object
=obj
;
719 dat
->ehn
.ehn_Class
=NULL
;
720 dat
->ehn
.ehn_Events
=IDCMP_RAWKEY
;
721 DoMethod3(_win(obj
),MUIM_Window_AddEventHandler
,&dat
->ehn
);
725 Static ULONG
dsCleanup(struct IClass
*cl
,Object
*obj
,Msg msg
) {
726 DocScrollData
*dat
=INST_DATA(cl
,obj
);
727 DoMethod3(_win(obj
),MUIM_Window_RemEventHandler
,&dat
->ehn
);
728 //MUI_RejectIDCMP(obj,IDCMP_RAWKEY);
729 return DoSuperMethodA(cl
,obj
,msg
);
732 /*Static ULONG dsAskMinMax(struct IClass *cl,Object *obj,Msg msg) {
733 DocScrollData *dat=INST_DATA(cl,obj);
734 ULONG r=DoSuperMethodA(cl,obj,msg);
736 get(dat->vgroup,MUIA_Width,&w);
737 get(dat->vgroup,MUIA_Height,&h);
738 DB(kprintf("askminmax-> %ld/%ld, %ld/%ld\n",w,dat->max_width,h,dat->total_height);)
739 SetAttrs(dat->hscroll,
740 MUIA_Prop_Entries,dat->max_width,
743 SetAttrs(dat->vscroll,
744 MUIA_Prop_Entries,dat->total_height,
750 /*Static ULONG dsDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg) {
751 ULONG r=DoSuperMethodA(cl,obj,msg);
752 if(msg->flags&MADF_DRAWOBJECT) {
757 Static ULONG
dsHandleEvent(struct IClass
*cl
,Object
*obj
,struct MUIP_HandleEvent
*msg
) {
758 DocScrollData
*dat
=INST_DATA(cl
,obj
);
760 #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
761 #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright(obj)) && _between(_mtop(obj),(y),_mbottom(obj)))
765 ULONG mouse_inside
= _isinobject(msg
->imsg
->MouseX
, msg
->imsg
->MouseY
);
767 switch(msg
->imsg
->Class
) {
769 if(msg
->imsg
->Code
>=0x50 && msg
->imsg
->Code
<=0x59) {
771 int n
=msg
->imsg
->Code
-0x50;
772 if(msg
->imsg
->Qualifier
&IEQUALIFIER_LSHIFT
||
773 msg
->imsg
->Qualifier
&IEQUALIFIER_RSHIFT
) {
776 MyFreeMem(dat
->bookmark
[n
].name
);
777 UnLock(dat
->bookmark
[n
].dir
);
778 get(dat
->doc
,MYATTR_Document_Dir
,&dir
);
779 get(dat
->doc
,MYATTR_Document_Name
,&name
);
780 dat
->bookmark
[n
].dir
=DupLock(dir
);
781 CopyStr(&dat
->bookmark
[n
].name
,name
);
782 dat
->bookmark
[n
].page
=dat
->page
;
784 if(dat
->bookmark
[n
].name
) {
785 Object
*app
,*win
,*doc
;
786 get(obj
,MUIA_ApplicationObject
,&app
);
787 get(obj
,MUIA_WindowObject
,&win
);
788 doc
=getDocument(dat
->comm_info
,app
,win
,dat
->bookmark
[n
].dir
,dat
->bookmark
[n
].name
);
791 MYATTR_DocScroll_Document
,doc
,
792 MYATTR_DocScroll_Page
,dat
->bookmark
[n
].page
,
796 } else if (mouse_inside
&& msg
->imsg
->Code
== RAWKEY_NM_WHEEL_UP
) {
797 DoMethod3(obj
,MYM_DocScroll_PageUp
, 15);
798 } else if (mouse_inside
&& msg
->imsg
->Code
== RAWKEY_NM_WHEEL_DOWN
) {
799 DoMethod3(obj
,MYM_DocScroll_PageDown
, 15);
800 } else if (mouse_inside
&& msg
->imsg
->Code
== RAWKEY_NM_WHEEL_LEFT
) {
802 get(dat
->hscroll
,MUIA_Prop_First
,&t
);
803 set(dat
->hscroll
,MUIA_Prop_First
,t
-30);
804 } else if (mouse_inside
&& msg
->imsg
->Code
== RAWKEY_NM_WHEEL_RIGHT
) {
806 get(dat
->hscroll
,MUIA_Prop_First
,&t
);
807 set(dat
->hscroll
,MUIA_Prop_First
,t
+30);
809 struct InputEvent ie
={0};
812 ie
.ie_Class
=IECLASS_RAWKEY
;
814 ie
.ie_Code
=msg
->imsg
->Code
;
815 ie
.ie_Qualifier
=msg
->imsg
->Qualifier
;
816 ie
.ie_EventAddress
=*(APTR
*)msg
->imsg
->IAddress
;
817 n
=MapRawKey(&ie
,buf
,sizeof(buf
),NULL
);
820 rc
= MUI_EventHandlerRC_Eat
; // eat event when we processed the key
824 DoMethod3(obj
,MYM_DocScroll_PageUp
, 80);
827 DoMethod3(obj
,MYM_DocScroll_PageDown
, 80);
830 DoMethod2(dat
->pageset
,MYM_PageSet_RLeft
);
833 DoMethod2(dat
->pageset
,MYM_PageSet_RRight
);
836 DoMethod2(dat
->pageset
,MYM_PageSet_Crop
);
839 DoMethod2(dat
->pageset
,MYM_PageSet_UnCrop
);
842 if(dat
->zoom
<maxZoom
-1)
843 set(obj
,MYATTR_DocScroll_Zoom
,dat
->zoom
+1);
846 if(dat
->zoom
>minZoom
)
847 set(obj
,MYATTR_DocScroll_Zoom
,dat
->zoom
-1);
850 rc
= prevrc
; // restore event state
857 switch(msg
->muikey
) {
859 DoMethod3(obj
,MYM_DocScroll_PageUp
, 10);
860 rc
= MUI_EventHandlerRC_Eat
;
863 DoMethod3(obj
,MYM_DocScroll_PageDown
, 10);
864 rc
= MUI_EventHandlerRC_Eat
;
868 get(dat
->hscroll
,MUIA_Prop_First
,&t
);
869 set(dat
->hscroll
,MUIA_Prop_First
,t
-20);
870 rc
= MUI_EventHandlerRC_Eat
;
875 get(dat
->hscroll
,MUIA_Prop_First
,&t
);
876 set(dat
->hscroll
,MUIA_Prop_First
,t
+20);
877 rc
= MUI_EventHandlerRC_Eat
;
881 DoMethod3(obj
,MYM_DocScroll_PageUp
, 80);
882 rc
= MUI_EventHandlerRC_Eat
;
884 case MUIKEY_PAGEDOWN
:
885 DoMethod3(obj
,MYM_DocScroll_PageDown
, 80);
886 rc
= MUI_EventHandlerRC_Eat
;
889 set(obj
,MYATTR_DocScroll_Page
,1);
890 rc
= MUI_EventHandlerRC_Eat
;
893 set(obj
,MYATTR_DocScroll_Page
,dat
->num_pages
);
894 rc
= MUI_EventHandlerRC_Eat
;
896 case MUIKEY_LINESTART
:
897 set(dat
->hscroll
,MUIA_Prop_First
,0);
898 rc
= MUI_EventHandlerRC_Eat
;
901 set(dat
->hscroll
,MUIA_Prop_First
,0x7fffffff);
902 rc
= MUI_EventHandlerRC_Eat
;
904 case MUIKEY_WORDLEFT
: {
906 get(dat
->hscroll
,MUIA_Prop_First
,&f
);
907 get(dat
->hscroll
,MUIA_Prop_Visible
,&v
);
908 set(dat
->hscroll
,MUIA_Prop_First
,f
-v
+30);
909 rc
= MUI_EventHandlerRC_Eat
;
912 case MUIKEY_WORDRIGHT
: {
914 get(dat
->hscroll
,MUIA_Prop_First
,&f
);
915 get(dat
->hscroll
,MUIA_Prop_Visible
,&v
);
916 set(dat
->hscroll
,MUIA_Prop_First
,f
+v
-30);
917 rc
= MUI_EventHandlerRC_Eat
;
926 return rc
;//DoSuperMethodA(cl,obj,(Msg)msg);
929 Static ULONG
dsUpdateScroll(struct IClass
*cl
,Object
*obj
) {
930 DocScrollData
*dat
=INST_DATA(cl
,obj
);
931 int w
,h
,w1
,h1
,w2
,h2
,w3
,h3
;
932 static int in_update_scroll
;
933 BOOL rem_hscroll
,rem_vscroll
;
935 if(in_update_scroll
>=2 || dat
->mode
==vmSpecial
)
939 DB(kprintf("update_scroll\n");)
941 if(dat
->zoom
==zoomWidth
) {
942 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
943 get(dat
->vgroup
,MUIA_Width
,&w
);
944 DB(kprintf("zoomWidth(%ld)\n",w
);)
945 SetAttrs(dat
->pageset
,
946 MYATTR_PageSet_Zoom
,zoomWidth
,
947 MYATTR_PageSet_VisWidth
,w
,
950 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
951 } else if(dat
->zoom
==zoomPage
&& dat
->mode
==vmContinuous
) {
952 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
953 get(dat
->vgroup
,MUIA_Width
,&w
);
954 get(dat
->vgroup
,MUIA_Height
,&h
);
955 DB(kprintf("cont. zoomPage(%ld,%ld)\n",w
,h
);)
956 SetAttrs(dat
->pageset
,
957 MYATTR_PageSet_Zoom
,zoomPage
,
958 MYATTR_PageSet_VisWidth
,w
,
959 MYATTR_PageSet_VisHeight
,h
,
962 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
965 get(obj
,MUIA_Width
,&w2
);
966 get(obj
,MUIA_Height
,&h2
);
968 DB(kprintf("not visible\n");)
972 get(dat
->vgroup
,MUIA_Width
,&w
);
973 get(dat
->vgroup
,MUIA_Height
,&h
);
974 get(dat
->pgroup
,MUIA_Width
,&w3
);
975 get(dat
->pgroup
,MUIA_Height
,&h3
);
976 get(dat
->vgroup
,MUIA_Virtgroup_Width
,&w1
);
977 SetAttrs(dat
->hscroll
,
978 MUIA_Prop_Entries
,w1
,
982 if(dat
->mode
==vmFitPage
) {
985 DB(kprintf("zoomPage(%ld,%ld)\n",w2
-w3
+w
,h2
-h3
+h
);)
986 SetAttrs(dat
->pageset
,
987 MYATTR_PageSet_VisWidth
,w2
-(w3
-w
),
988 MYATTR_PageSet_VisHeight
,h2
-(h3
-h
),
991 if(dat
->mode
==vmContinuous
) {
992 update_sizes(cl
,obj
);
993 SetAttrs(dat
->vscroll
,
994 MUIA_Prop_Entries
,h1
=dat
->total_height
,
998 get(dat
->vgroup
,MUIA_Virtgroup_Height
,&h1
);
999 SetAttrs(dat
->vscroll
,
1000 MUIA_Prop_Entries
,h1
,
1001 MUIA_Prop_Visible
,h
,
1005 DB(kprintf("w=%ld, h=%ld, w1=%ld, h1=%ld, w2=%ld, h2=%ld, w3=%ld, h3=%ld\n",w
,h
,w1
,h1
,w2
,h2
,w3
,h3
);)
1006 if(w2
-(w3
-w
)>=w1
&& h2
-(h3
-h
)>=h1
) {
1021 if(in_update_scroll
>1) {
1026 if(rem_hscroll
==dat
->has_hscroll
|| rem_vscroll
==dat
->has_vscroll
) {
1027 Object
* g
=dat
->pgroup
;
1028 //set(obj,MYATTR_DocScroll_Quiet,TRUE);
1029 if(DoMethod2(g
,MUIM_Group_InitChange
)) {
1032 if(dat
->has_hscroll
) {
1033 DB(kprintf("removing hscroll\n");)
1034 DoMethod3(g
,OM_REMMEMBER
,dat
->hscroll
);
1035 if(dat
->has_vscroll
)
1036 DoMethod3(g
,OM_REMMEMBER
,dat
->rect
);
1037 dat
->has_hscroll
=FALSE
;
1040 if(!dat
->has_hscroll
) {
1041 DB(kprintf("adding hscroll\n");)
1042 DoMethod3(g
,OM_ADDMEMBER
,dat
->hscroll
);
1043 if(dat
->has_vscroll
)
1044 DoMethod3(g
,OM_ADDMEMBER
,dat
->rect
);
1045 dat
->has_hscroll
=TRUE
;
1049 if(dat
->has_vscroll
) {
1050 DB(kprintf("removing vscroll\n");)
1051 DoMethod3(g
,OM_REMMEMBER
,dat
->vscroll
);
1052 if(dat
->has_hscroll
)
1053 DoMethod3(g
,OM_REMMEMBER
,dat
->rect
);
1054 set(g
,MUIA_Group_Columns
,1);
1055 dat
->has_vscroll
=FALSE
;
1058 if(!dat
->has_vscroll
) {
1059 DB(kprintf("adding vscroll\n");)
1060 DoMethod3(g
,OM_ADDMEMBER
,dat
->vscroll
);
1061 if(dat
->has_hscroll
) {
1062 DoMethod3(g
,OM_ADDMEMBER
,dat
->rect
);
1063 DoMethod7(g
,MUIM_Group_Sort
,dat
->fgroup
,dat
->vscroll
,dat
->hscroll
,dat
->rect
,NULL
);
1065 set(g
,MUIA_Group_Columns
,2);
1066 dat
->has_vscroll
=TRUE
;
1070 DoMethod2(g
,MUIM_Group_ExitChange
);
1072 //set(obj,MYATTR_DocScroll_Quiet,FALSE);
1074 DB(kprintf("ok\n");)
1079 Static ULONG
dsPageDown(struct IClass
*cl
,Object
*obj
,struct MYP_DocScroll_PageUpDown
* msg
) {
1080 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1082 get(dat
->vscroll
,MUIA_Prop_First
,&f
);
1083 get(dat
->vscroll
,MUIA_Prop_Visible
,&v
);
1084 get(dat
->vscroll
,MUIA_Prop_Entries
,&e
);
1085 if(dat
->mode
==vmContinuous
|| (dat
->mode
==vmFix
&& f
+v
<e
))
1086 set(dat
->vscroll
,MUIA_Prop_First
,f
+v
*msg
->percent
/100);
1087 else if (dat
->page
< dat
->num_pages
) {
1089 MYATTR_DocScroll_Quiet
,TRUE
,
1090 MYATTR_DocScroll_Page
,dat
->page
+1,
1092 set(dat
->vscroll
,MUIA_Prop_First
,0);
1093 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
1098 Static ULONG
dsPageUp(struct IClass
*cl
,Object
*obj
,struct MYP_DocScroll_PageUpDown
* msg
) {
1099 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1101 get(dat
->vscroll
,MUIA_Prop_First
,&f
);
1102 get(dat
->vscroll
,MUIA_Prop_Visible
,&v
);
1103 if(dat
->mode
==vmContinuous
|| (dat
->mode
==vmFix
&& f
>0))
1104 set(dat
->vscroll
,MUIA_Prop_First
,f
-v
*msg
->percent
/100);
1105 else if (dat
->page
> 1)
1108 get(dat
->vscroll
,MUIA_Prop_Entries
,&e
);
1110 MYATTR_DocScroll_Quiet
,TRUE
,
1111 MYATTR_DocScroll_Page
,dat
->page
-1,
1113 set(dat
->vscroll
,MUIA_Prop_First
,e
);
1114 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
1119 Static ULONG
dsPosChanged(struct IClass
*cl
,Object
* obj
) {
1120 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1121 int top
,t
=0,k
,l
,vis_height
,bottom
,s
;
1122 struct page_info
*pages
=dat
->pages
;
1123 static int in_pos_changed
;
1125 get(dat
->vscroll
,MUIA_Prop_First
,&top
);
1126 if(dat
->mode
!=vmContinuous
) {
1127 set(dat
->vgroup
,MUIA_Virtgroup_Top
,top
);
1130 if(!pages
|| in_pos_changed
|| ((dat
->zoom
==zoomPage
|| dat
->zoom
==zoomWidth
) && dat
->dpi
<=0))
1132 DB(kprintf("pos_changed:\n");)
1133 get(dat
->vgroup
,MUIA_Height
,&vis_height
);
1134 DB({int total
; int vis
;
1135 get(dat
->vscroll
,MUIA_Prop_Entries
,&total
);
1136 get(dat
->vscroll
,MUIA_Prop_Visible
,&vis
);
1137 kprintf("prop: total=%ld, vis=%ld, top=%ld, vgroup:vis=%ld\n",total
,vis
,top
,vis_height
);
1142 for(k
=-dat
->skip
;k
<dat
->num_pages
&& t
<=top
;) {
1147 for(i
=0;i
<dat
->columns
&& k
<dat
->num_pages
;++i
) {
1149 int h
=pages
[k
].height
<=0 ? dat
->average_height
: pages
[k
].height
;
1155 t
+=max_height
+SPACING
;
1161 DB(kprintf("->t=%ld, page=%ld, cur=%ld, vis=%ld\n",s
,l
,k
,vis_height
+top
-s
);)
1162 /*if(dat->page!=k) {
1163 DoMethod5(obj,MYM_DocScroll_HistoryPush,dat->page,0,NULL);
1166 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
1167 DoMethod6(dat
->pageset
,MYM_PageSet_VStrip
,l
,vis_height
+top
-s
,s
,k
);
1168 //set(dat->pageset,MYATTR_PageSet_Page,k);
1169 dat
->mode
=vmSpecial
;
1170 set(obj
,MYATTR_DocScroll_Page
,k
);
1171 dat
->mode
=vmContinuous
;
1172 //set(dat->pageset,MYATTR_PageSet_YOffset,s);
1173 //DB(kprintf("yoffset=%ld\n",s);)
1174 set(dat
->vgroup
,MUIA_Virtgroup_Top
,top
-s
);
1175 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
1176 update_sizes(cl
,obj
);
1177 DB(kprintf("~pos_changed(%ld):\n",dat
->page
);)
1182 Static ULONG
dsLayout(struct IClass
*cl
,Object
*obj
) {
1183 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1184 if(dat
->mode
==vmContinuous
) {
1186 dsPosChanged(cl
,obj
);
1191 Static ULONG
dsResetData(struct IClass
*cl
,Object
*obj
) {
1192 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1194 MyFreeMem(dat
->pages
);
1195 if(dat
->mode
==vmContinuous
)
1196 dat
->pages
=MyAllocMem(dat
->num_pages
*sizeof(*dat
->pages
));
1201 struct page_info
*pages
=dat
->pages
;
1202 for(k
=0;k
<dat
->num_pages
;++k
) {
1206 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
1207 update_sizes(cl
,obj
);
1210 MYATTR_DocScroll_NoHistory
,TRUE
,
1211 MYATTR_DocScroll_Page
,p
,
1213 dsPosChanged(cl
,obj
);
1214 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
1219 Static ULONG
dsUpdateState(struct IClass
*cl
,Object
*obj
) {
1220 set(obj
,MYATTR_DocScroll_Quiet
,TRUE
);
1221 dsResetData(cl
,obj
);
1223 dsUpdateScroll(cl
,obj
);
1224 set(obj
,MYATTR_DocScroll_Quiet
,FALSE
);
1228 Static ULONG
dsHistoryPush(struct IClass
*cl
,Object
*obj
,struct MYP_DocScroll_HistoryPush
*msg
) {
1229 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1230 DB(kprintf("historyPush(%ld,%lx,%s)\n",msg
->page
,msg
->dir
,msg
->name
?msg
->name
:"NULL"));
1231 while(dat
->histCur
<dat
->histTot
) {
1234 h
=dat
->history
+dat
->histTot
;
1238 if(dat
->histCur
==historySize
) {
1239 MyFreeMem(dat
->history
->name
);
1240 UnLock(dat
->history
->dir
);
1241 memmove(dat
->history
,dat
->history
+1,(historySize
-1)*sizeof(struct History
));
1245 dat
->history
[dat
->histCur
].page
=msg
->page
;
1246 dat
->history
[dat
->histCur
].dir
=DupLock(msg
->dir
);
1247 dat
->history
[dat
->histCur
].name
=NULL
;
1249 CopyStr(&dat
->history
[dat
->histCur
].name
,msg
->name
);;
1255 Static ULONG
dsHistory(struct IClass
*cl
,Object
*obj
,struct History
*h
) {
1256 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1257 Object
*doc
=dat
->doc
;
1263 get(doc
,MYATTR_Document_Dir
,&dir
);
1264 get(doc
,MYATTR_Document_Name
,&name
);
1265 get(obj
,MUIA_ApplicationObject
,&app
);
1266 get(obj
,MUIA_WindowObject
,&win
);
1267 doc
=getDocument(dat
->comm_info
,app
,win
,h
->dir
,h
->name
);
1270 CopyStr(&h
->name
,name
);
1272 h
->dir
=DupLock(dir
);
1276 MYATTR_DocScroll_NoHistory
,TRUE
,
1277 MYATTR_DocScroll_Document
,doc
,
1278 MYATTR_DocScroll_Page
,p
,
1283 Static ULONG
dsBackward(struct IClass
*cl
,Object
*obj
) {
1284 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1285 if(dat
->histCur
>0 && dsHistory(cl
,obj
,dat
->history
+dat
->histCur
-1)) {
1292 Static ULONG
dsForward(struct IClass
*cl
,Object
*obj
) {
1293 DocScrollData
*dat
=INST_DATA(cl
,obj
);
1294 if(dat
->histCur
<dat
->histTot
&& dsHistory(cl
,obj
,dat
->history
+dat
->histCur
)) {
1301 BEGIN_DISPATCHER(dsDispatcher
,cl
,obj
,msg
) {
1302 switch(msg
->MethodID
) {
1303 case OM_NEW
: return dsNew (cl
,obj
,(APTR
)msg
);
1304 case OM_DISPOSE
: return dsDispose (cl
,obj
,(APTR
)msg
);
1305 case OM_SET
: return dsSet (cl
,obj
,(APTR
)msg
);
1306 case OM_GET
: return dsGet (cl
,obj
,(APTR
)msg
);
1307 // case MUIM_AskMinMax : return dsAskMinMax (cl,obj,(APTR)msg);
1308 // case MUIM_Draw : return dsDraw (cl,obj,(APTR)msg);
1309 case MUIM_Setup
: return dsSetup(cl
,obj
,(APTR
)msg
);
1310 case MUIM_Cleanup
: return dsCleanup(cl
,obj
,(APTR
)msg
);
1311 case MUIM_HandleEvent
: return dsHandleEvent(cl
,obj
,(APTR
)msg
);
1312 case MYM_DocScroll_PageDown
: return dsPageDown(cl
,obj
,(APTR
)msg
);
1313 case MYM_DocScroll_PageUp
: return dsPageUp(cl
,obj
,(APTR
)msg
);
1314 case MYM_DocScroll_PosChanged
: return dsPosChanged(cl
,obj
);
1315 case MYM_DocScroll_Layout
: return dsLayout(cl
,obj
);
1316 case MYM_DocScroll_ResetData
: return dsResetData(cl
,obj
);
1317 case MYM_DocScroll_UpdateScroll
: return dsUpdateScroll(cl
,obj
);
1318 case MYM_DocScroll_UpdateState
: return dsUpdateState(cl
,obj
);
1319 case MYM_DocScroll_HistoryPush
: return dsHistoryPush(cl
,obj
,(APTR
)msg
);
1320 case MYM_DocScroll_Backward
: return dsBackward(cl
,obj
);
1321 case MYM_DocScroll_Forward
: return dsForward(cl
,obj
);
1323 return DoSuperMethodA(cl
,obj
,msg
);
1325 END_DISPATCHER(dsDispatcher
)
1328 struct MUI_CustomClass
*docscroll_mcc
;
1331 BOOL
createDocScrollClass(void) {
1333 if(vgroup_mcc
=MUI_CreateCustomClass(NULL
,MUIC_Virtgroup
,NULL
,sizeof(VGroupData
),(APTR
)&vgDispatcher
)) {
1334 if(docscroll_mcc
=MUI_CreateCustomClass(NULL
,MUIC_Group
,NULL
,sizeof(DocScrollData
),(APTR
)&dsDispatcher
))
1336 MUI_DeleteCustomClass(vgroup_mcc
);
1344 BOOL
deleteDocScrollClass(void) {
1345 if(count
&& --count
==0) {
1346 MUI_DeleteCustomClass(docscroll_mcc
);
1347 MUI_DeleteCustomClass(vgroup_mcc
);