2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
6 /*********************************************************************************************/
10 #include "compilerspecific.h"
12 #include "arossupport.h"
16 extern struct NewMenu nm
[];
17 extern struct NewMenu nmpict
[];
18 extern struct NewMenu nmtext
[];
20 /*********************************************************************************************/
22 /* Many datatype classes seem to rely on OM_NOTIFY calls coming back to the datatype object
25 #define BACK_CONNECTION 1
27 /*********************************************************************************************/
29 #define ARG_TEMPLATE "FILE,CLIPBOARD/S,CLIPUNIT/K/N,SCREEN/S,PUBSCREEN/K,REQUESTER/S," \
30 "BOOKMARK/S,FONTNAME/K,FONTSIZE/K/N,BACKDROP/S,WINDOW/S," \
31 "PORTNAME/K,IMMEDIATE/S,REPEAT/S,PRTUNIT/K/N"
34 #define ARG_CLIPBOARD 1
35 #define ARG_CLIPUNIT 2
37 #define ARG_PUBSCREEN 4
38 #define ARG_REQUESTER 5
39 #define ARG_BOOKMARK 6
40 #define ARG_FONTNAME 7
41 #define ARG_FONTSIZE 8
42 #define ARG_BACKDROP 9
44 #define ARG_PORTNAME 11
45 #define ARG_IMMEDIATE 12
47 #define ARG_PRTUNIT 14
51 /*********************************************************************************************/
60 {&IntuitionBase
, "intuition.library" , 39 },
61 {&GfxBase
, "graphics.library" , 39 },
62 {&GadToolsBase
, "gadtools.library" , 39 },
63 {&LayersBase
, "layers.library" , 39 },
64 {&UtilityBase
, "utility.library" , 39 },
65 {&KeymapBase
, "keymap.library" , 39 },
66 {&DataTypesBase
, "datatypes.library" , 39 },
67 {&DiskfontBase
, "diskfont.library" , 39 },
71 static struct TextAttr textattr
;
72 static struct TextFont
*font
;
73 static struct RDArgs
*myargs
;
74 static IPTR args
[NUM_ARGS
];
75 static UBYTE fontname
[256];
76 static WORD winwidth
, winheight
;
77 static WORD sizeimagewidth
, sizeimageheight
;
78 static BOOL model_has_members
;
79 static jmp_buf exit_buf
;
81 /*********************************************************************************************/
83 static void CloseLibs(void);
84 static void KillFont(void);
85 static void FreeArguments(void);
86 static void KillICObjects(void);
87 static void FreeVisual(void);
88 static void KillGadgets(void);
89 static void CloseDTO(void);
90 static void KillWindow(void);
91 static void ScrollTo(UWORD dir
, UWORD quali
);
92 static void FitToWindow(void);
94 /*********************************************************************************************/
96 void OutputMessage(CONST_STRPTR msg
)
102 if ( IntuitionBase
&& !((struct Process
*)FindTask(NULL
))->pr_CLI
)
104 es
.es_StructSize
= sizeof(es
);
106 es
.es_Title
= "MultiView";
107 es
.es_TextFormat
= msg
;
108 es
.es_GadgetFormat
= MSG(MSG_OK
);
110 EasyRequestArgs(win
, &es
, NULL
, NULL
);
114 Printf("MultiView: %s\n", msg
);
119 /*********************************************************************************************/
121 void WinCleanup(void)
126 wincoords
.MinX
= win
->LeftEdge
;
127 wincoords
.MinY
= win
->TopEdge
;
128 wincoords
.MaxX
= win
->Width
;
129 wincoords
.MaxY
= win
->Height
;
131 D(bug("[Multiview] WinCleanup() MinX = %d MinY = %d MaxX = %d MaxY = %d\n",
132 wincoords
.MinX
, wincoords
.MinY
, wincoords
.MaxX
, wincoords
.MaxY
));
136 DeleteMsgPort(msgport
);
138 D(bug("[Multiview] removed msgport\n"));
142 RemoveAppWindow(appwindow
);
144 D(bug("[Multiview] removed appwindow\n"));
156 /*********************************************************************************************/
158 void Cleanup(CONST_STRPTR msg
)
162 struct ScreenNotifyMessage
*snmsg
;
164 while (!EndScreenNotify (isnstarted
))
169 while ((snmsg
= (struct ScreenNotifyMessage
*) GetMsg (isnport
)))
171 ReplyMsg((struct Message
*)snmsg
);
173 DeleteMsgPort(isnport
);
181 CurrentDir(cd
); /* restore current directory */
186 longjmp(exit_buf
, 0);
190 /*********************************************************************************************/
192 static void OpenLibs(void)
196 for(li
= libtable
; li
->var
; li
++)
198 if (!((*(struct Library
**)li
->var
) = OpenLibrary(li
->name
, li
->version
)))
200 __sprintf(s
, MSG(MSG_CANT_OPEN_LIB
), li
->name
, li
->version
);
207 /*********************************************************************************************/
209 static void CloseLibs(void)
213 for(li
= libtable
; li
->var
; li
++)
215 if (*(struct Library
**)li
->var
) CloseLibrary((*(struct Library
**)li
->var
));
219 /*********************************************************************************************/
221 static void LoadFont(void)
223 font
= OpenDiskFont(&textattr
);
226 textattr
.ta_Name
= "topaz.font";
227 textattr
.ta_YSize
= 8;
228 textattr
.ta_Style
= 0;
229 textattr
.ta_Flags
= 0;
231 font
= OpenFont(&textattr
);
235 /*********************************************************************************************/
237 static void KillFont(void)
239 if (font
) CloseFont(font
);
242 /*********************************************************************************************/
244 static void InitDefaults(void)
246 struct TextFont
*defaultfont
= GfxBase
->DefaultFont
;
248 /* This might be a bit problematic depending on how default system font
249 switching through Font prefs program works and if then the previous
250 default system font is closed or not. So this is very likely only safe
251 when in such a case the previous font is not closed (means -> the font
252 will remain in memory in any case)
254 ClipView example program on Amiga Dev CD also does it like this. So ... */
256 textattr
.ta_Name
= defaultfont
->tf_Message
.mn_Node
.ln_Name
;
257 textattr
.ta_YSize
= defaultfont
->tf_YSize
;
258 textattr
.ta_Style
= defaultfont
->tf_Style
;
259 textattr
.ta_Flags
= defaultfont
->tf_Flags
;
262 /*********************************************************************************************/
264 static void GetArguments(void)
267 if (!(myargs
= ReadArgs(ARG_TEMPLATE
, args
, NULL
)))
269 Fault(IoErr(), 0, s
, 256);
273 filename
= (STRPTR
)args
[ARG_FILE
];
274 if (!filename
&& !args
[ARG_CLIPBOARD
])
276 filename
= GetFileName(MSG_ASL_OPEN_TITLE
);
277 if (!filename
) Cleanup(NULL
);
280 if (args
[ARG_FONTNAME
])
282 strncpy(fontname
, (char *)args
[ARG_FONTNAME
], 255 - 5);
283 if (!strstr(fontname
, ".font")) strcat(fontname
, ".font");
285 textattr
.ta_Name
= fontname
;
288 if (args
[ARG_FONTSIZE
])
290 textattr
.ta_YSize
= *(LONG
*)args
[ARG_FONTSIZE
];
295 /*********************************************************************************************/
297 static void FreeArguments(void)
299 if (myargs
) FreeArgs(myargs
);
302 /*********************************************************************************************/
304 static void MakeICObjects(void)
306 static const struct TagItem dto_to_vert_map
[] =
308 {DTA_TopVert
, PGA_Top
},
309 {DTA_VisibleVert
, PGA_Visible
},
310 {DTA_TotalVert
, PGA_Total
},
313 static const struct TagItem dto_to_horiz_map
[] =
315 {DTA_TopHoriz
, PGA_Top
},
316 {DTA_VisibleHoriz
, PGA_Visible
},
317 {DTA_TotalHoriz
, PGA_Total
},
320 static const struct TagItem vert_to_dto_map
[] =
322 {PGA_Top
, DTA_TopVert
},
325 static const struct TagItem horiz_to_dto_map
[] =
327 {PGA_Top
, DTA_TopHoriz
},
331 model_obj
= NewObject(NULL
, MODELCLASS
, ICA_TARGET
, ICTARGET_IDCMP
,
333 dto_to_vert_ic_obj
= NewObject(NULL
, ICCLASS
, ICA_MAP
, (IPTR
)dto_to_vert_map
,
335 dto_to_horiz_ic_obj
= NewObject(NULL
, ICCLASS
, ICA_MAP
, (IPTR
)dto_to_horiz_map
,
337 vert_to_dto_ic_obj
= NewObject(NULL
, ICCLASS
, ICA_MAP
, (IPTR
)vert_to_dto_map
,
339 horiz_to_dto_ic_obj
= NewObject(NULL
, ICCLASS
, ICA_MAP
, (IPTR
)horiz_to_dto_map
,
342 model_to_dto_ic_obj
= NewObject(NULL
, ICCLASS
, TAG_DONE
);
346 !dto_to_vert_ic_obj
||
347 !dto_to_horiz_ic_obj
||
348 !vert_to_dto_ic_obj
||
351 || !model_to_dto_ic_obj
355 Cleanup(MSG(MSG_CANT_CREATE_IC
));
358 DoMethod(model_obj
, OM_ADDMEMBER
, (IPTR
) dto_to_vert_ic_obj
);
359 DoMethod(model_obj
, OM_ADDMEMBER
, (IPTR
) dto_to_horiz_ic_obj
);
361 DoMethod(model_obj
, OM_ADDMEMBER
, (IPTR
) model_to_dto_ic_obj
);
364 model_has_members
= TRUE
;
368 /*********************************************************************************************/
370 static void KillICObjects(void)
372 if (!model_has_members
)
374 if (dto_to_vert_ic_obj
) DisposeObject(dto_to_vert_ic_obj
);
375 if (dto_to_horiz_ic_obj
) DisposeObject(dto_to_horiz_ic_obj
);
377 if (model_to_dto_ic_obj
) DisposeObject(model_to_dto_ic_obj
);
381 if (model_obj
) DisposeObject(model_obj
);
382 if (vert_to_dto_ic_obj
) DisposeObject(vert_to_dto_ic_obj
);
383 if (horiz_to_dto_ic_obj
) DisposeObject(horiz_to_dto_ic_obj
);
386 /*********************************************************************************************/
388 static void GetVisual(void)
390 scr
= LockPubScreen((CONST_STRPTR
)args
[ARG_PUBSCREEN
]);
391 if (!scr
) Cleanup(MSG(MSG_CANT_LOCK_SCR
));
393 dri
= GetScreenDrawInfo(scr
);
394 if (!dri
) Cleanup(MSG(MSG_CANT_GET_DRI
));
396 vi
= GetVisualInfoA(scr
, NULL
);
397 if (!vi
) Cleanup(MSG(MSG_CANT_GET_VI
));
400 /*********************************************************************************************/
402 static void FreeVisual(void)
404 if (vi
) FreeVisualInfo(vi
);
405 if (dri
) FreeScreenDrawInfo(scr
, dri
);
406 if (scr
) UnlockPubScreen(NULL
, scr
);
409 /*********************************************************************************************/
411 static void MakeGadgets(void)
413 static WORD img2which
[] =
422 IPTR imagew
[NUM_IMAGES
], imageh
[NUM_IMAGES
];
423 WORD v_offset
, h_offset
, btop
, i
;
425 for(i
= 0; i
< NUM_IMAGES
; i
++)
427 img
[i
] = NewObject(NULL
, SYSICLASS
, SYSIA_DrawInfo
, (IPTR
)( dri
),
428 SYSIA_Which
, (IPTR
)( img2which
[i
] ),
431 if (!img
[i
]) Cleanup(MSG(MSG_CANT_CREATE_SYSIMAGE
));
433 GetAttr(IA_Width
,(Object
*)img
[i
],&imagew
[i
]);
434 GetAttr(IA_Height
,(Object
*)img
[i
],&imageh
[i
]);
437 sizeimagewidth
= imagew
[IMG_SIZE
];
438 sizeimageheight
= imageh
[IMG_SIZE
];
440 btop
= scr
->WBorTop
+ dri
->dri_Font
->tf_YSize
+ 1;
442 v_offset
= imagew
[IMG_DOWNARROW
] / 4;
443 h_offset
= imageh
[IMG_LEFTARROW
] / 4;
445 gad
[GAD_UPARROW
] = NewObject(NULL
, BUTTONGCLASS
,
446 GA_Image
, (IPTR
)( img
[IMG_UPARROW
] ),
447 GA_RelRight
, (IPTR
)( -imagew
[IMG_UPARROW
] + 1 ),
448 GA_RelBottom
, (IPTR
)( -imageh
[IMG_DOWNARROW
] - imageh
[IMG_UPARROW
] - imageh
[IMG_SIZE
] + 1 ),
449 GA_ID
, (IPTR
)( GAD_UPARROW
),
450 GA_RightBorder
, (IPTR
)TRUE
,
451 GA_Immediate
, (IPTR
)TRUE
,
452 GA_RelVerify
, (IPTR
)TRUE
,
455 gad
[GAD_DOWNARROW
] = NewObject(NULL
, BUTTONGCLASS
,
456 GA_Image
, (IPTR
)( img
[IMG_DOWNARROW
] ),
457 GA_RelRight
, (IPTR
)( -imagew
[IMG_UPARROW
] + 1 ),
458 GA_RelBottom
, (IPTR
)( -imageh
[IMG_UPARROW
] - imageh
[IMG_SIZE
] + 1 ),
459 GA_ID
, (IPTR
)( GAD_DOWNARROW
),
460 GA_RightBorder
, (IPTR
)TRUE
,
461 GA_Previous
, (IPTR
)( gad
[GAD_UPARROW
] ),
462 GA_Immediate
, (IPTR
)TRUE
,
463 GA_RelVerify
, (IPTR
)TRUE
,
466 gad
[GAD_VERTSCROLL
] = NewObject(NULL
, PROPGCLASS
,
467 GA_Top
, (IPTR
)( btop
+ 1 ),
468 GA_RelRight
, (IPTR
)( -imagew
[IMG_DOWNARROW
] + v_offset
+ 1 ),
469 GA_Width
, (IPTR
)( imagew
[IMG_DOWNARROW
] - v_offset
* 2 ),
470 GA_RelHeight
, (IPTR
)( -imageh
[IMG_DOWNARROW
] - imageh
[IMG_UPARROW
] - imageh
[IMG_SIZE
] - btop
-2 ),
471 GA_ID
, (IPTR
)( GAD_VERTSCROLL
),
472 GA_Previous
, (IPTR
)( gad
[GAD_DOWNARROW
] ),
473 GA_RightBorder
, (IPTR
)TRUE
,
474 GA_RelVerify
, (IPTR
)TRUE
,
475 GA_Immediate
, (IPTR
)TRUE
,
476 PGA_NewLook
, (IPTR
)TRUE
,
477 PGA_Borderless
, (IPTR
)TRUE
,
478 PGA_Total
, (IPTR
)100,
479 PGA_Visible
, (IPTR
)100,
480 PGA_Freedom
, (IPTR
)FREEVERT
,
481 PGA_NotifyBehaviour
, (IPTR
)PG_BEHAVIOUR_NICE
,
484 gad
[GAD_RIGHTARROW
] = NewObject(NULL
, BUTTONGCLASS
,
485 GA_Image
, (IPTR
)( img
[IMG_RIGHTARROW
] ),
486 GA_RelRight
, (IPTR
)( -imagew
[IMG_SIZE
] - imagew
[IMG_RIGHTARROW
] + 1 ),
487 GA_RelBottom
, (IPTR
)( -imageh
[IMG_RIGHTARROW
] + 1 ),
488 GA_ID
, (IPTR
)( GAD_RIGHTARROW
),
489 GA_BottomBorder
, (IPTR
)TRUE
,
490 GA_Previous
, (IPTR
)( gad
[GAD_VERTSCROLL
] ),
491 GA_Immediate
, (IPTR
)TRUE
,
492 GA_RelVerify
, (IPTR
)TRUE
,
495 gad
[GAD_LEFTARROW
] = NewObject(NULL
, BUTTONGCLASS
,
496 GA_Image
, (IPTR
)( img
[IMG_LEFTARROW
] ),
497 GA_RelRight
, (IPTR
)( -imagew
[IMG_SIZE
] - imagew
[IMG_RIGHTARROW
] - imagew
[IMG_LEFTARROW
] + 1 ),
498 GA_RelBottom
, (IPTR
)( -imageh
[IMG_RIGHTARROW
] + 1 ),
499 GA_ID
, (IPTR
)( GAD_LEFTARROW
),
500 GA_BottomBorder
, (IPTR
)TRUE
,
501 GA_Previous
, (IPTR
)( gad
[GAD_RIGHTARROW
] ),
502 GA_Immediate
, (IPTR
)TRUE
,
503 GA_RelVerify
, (IPTR
)TRUE
,
506 gad
[GAD_HORIZSCROLL
] = NewObject(NULL
, PROPGCLASS
,
507 GA_Left
, (IPTR
)( scr
->WBorLeft
),
508 GA_RelBottom
, (IPTR
)( -imageh
[IMG_LEFTARROW
] + h_offset
+ 1 ),
509 GA_RelWidth
, (IPTR
)( -imagew
[IMG_LEFTARROW
] - imagew
[IMG_RIGHTARROW
] - imagew
[IMG_SIZE
] - scr
->WBorRight
- 2 ),
510 GA_Height
, (IPTR
)( imageh
[IMG_LEFTARROW
] - (h_offset
* 2) ),
511 GA_ID
, (IPTR
)( GAD_HORIZSCROLL
),
512 GA_Previous
, (IPTR
)( gad
[GAD_LEFTARROW
] ),
513 GA_BottomBorder
, (IPTR
)TRUE
,
514 GA_RelVerify
, (IPTR
)TRUE
,
515 GA_Immediate
, (IPTR
)TRUE
,
516 PGA_NewLook
, (IPTR
)TRUE
,
517 PGA_Borderless
, (IPTR
)TRUE
,
518 PGA_Total
, (IPTR
)100,
519 PGA_Visible
, (IPTR
)100,
520 PGA_Freedom
, (IPTR
)FREEHORIZ
,
521 PGA_NotifyBehaviour
, (IPTR
)PG_BEHAVIOUR_NICE
,
524 for(i
= 0;i
< NUM_GADGETS
;i
++)
526 if (!gad
[i
]) Cleanup(MSG(MSG_CANT_CREATE_GADGET
));
529 SetAttrs(gad
[GAD_VERTSCROLL
] , ICA_TARGET
, (IPTR
)vert_to_dto_ic_obj
, TAG_DONE
);
530 SetAttrs(gad
[GAD_HORIZSCROLL
], ICA_TARGET
, (IPTR
)horiz_to_dto_ic_obj
, TAG_DONE
);
531 SetAttrs(dto_to_vert_ic_obj
, ICA_TARGET
, (IPTR
)gad
[GAD_VERTSCROLL
], TAG_DONE
);
532 SetAttrs(dto_to_horiz_ic_obj
, ICA_TARGET
, (IPTR
)gad
[GAD_HORIZSCROLL
], TAG_DONE
);
535 /*********************************************************************************************/
537 static void KillGadgets(void)
541 for(i
= 0; i
< NUM_GADGETS
;i
++)
543 if (win
) RemoveGadget(win
, (struct Gadget
*)gad
[i
]);
544 if (gad
[i
]) DisposeObject(gad
[i
]);
548 for(i
= 0; i
< NUM_IMAGES
;i
++)
550 if (img
[i
]) DisposeObject(img
[i
]);
555 /*********************************************************************************************/
557 void AddDTOToWin(void)
559 EraseRect(win
->RPort
, win
->BorderLeft
,
561 win
->Width
- 1 - win
->BorderRight
,
562 win
->Height
- 1 - win
->BorderBottom
);
564 SetDTAttrs (dto
, NULL
, NULL
, GA_Left
, win
->BorderLeft
+ 2 ,
565 GA_Top
, win
->BorderTop
+ 2 ,
566 GA_RelWidth
, - win
->BorderLeft
- win
->BorderRight
- 4 ,
567 GA_RelHeight
, - win
->BorderTop
- win
->BorderBottom
- 4 ,
570 AddDTObject(win
, NULL
, dto
, -1);
571 RefreshDTObjects(dto
, win
, NULL
, 0); // seems to be needed by text datatype to render more than first line at start...
574 /*********************************************************************************************/
576 static void OpenDTO(void)
578 struct DTMethod
*triggermethods
;
580 STRPTR objname
= NULL
;
588 if (!old_dto
&& args
[ARG_CLIPBOARD
])
592 if (args
[ARG_CLIPUNIT
]) clipunit
= *(APTR
*)args
[ARG_CLIPUNIT
];
594 D(bug("MultiView: calling NewDTObject\n"));
596 dto
= NewDTObject(clipunit
, ICA_TARGET
, (IPTR
)model_obj
,
598 DTA_SourceType
, DTST_CLIPBOARD
,
599 DTA_TextAttr
, (IPTR
)&textattr
,
602 D(bug("MultiView: NewDTObject returned %x\n", dto
));
606 dto
= NewDTObject(filename
, ICA_TARGET
, (IPTR
)model_obj
,
608 DTA_TextAttr
, (IPTR
)&textattr
,
614 ULONG errnum
= IoErr();
616 if (errnum
== DTERROR_UNKNOWN_DATATYPE
)
618 BPTR lock
= Lock(filename
,ACCESS_READ
);
621 struct DataType
*dtn
;
622 if ((dtn
= ObtainDataTypeA(DTST_FILE
, (APTR
)lock
, NULL
)))
624 if (!Stricmp(dtn
->dtn_Header
->dth_Name
, "directory"))
626 /* file is a directory and no directory.datatype is installed */
627 strncpy(filenamebuffer
, (filename
? filename
: (STRPTR
)""), 298);
628 filenamebuffer
[298]=0;
630 if (strlen(filenamebuffer
) &&
631 filenamebuffer
[strlen(filenamebuffer
)-1] != ':' &&
632 filenamebuffer
[strlen(filenamebuffer
)-1] != '/')
634 strcat(filenamebuffer
,"/");
637 filename
= GetFileName(MSG_ASL_OPEN_TITLE
);
638 if (filename
) continue;
640 ReleaseDataType(dtn
);
646 if (errnum
>= DTERROR_UNKNOWN_DATATYPE
)
647 __sprintf(s
, GetDTString(errnum
), filename
);
649 Fault(errnum
, 0, s
, 256);
653 /* Check if file is 0-length, fail silently (AOS confirmed) */
655 BPTR lock
= Lock(filename
, ACCESS_READ
);
658 struct FileInfoBlock
* fib
= AllocDosObject(DOS_FIB
, NULL
);
659 if (Examine(lock
, fib
))
661 if (fib
->fib_Size
== 0)
663 /* prog_exitcode = 20; */ /* ABIV1 Multiview no longer exits in Cleanup */
667 FreeDosObject(DOS_FIB
, fib
);
678 strncpy(filenamebuffer
, (filename
? filename
: (STRPTR
)""), 299);
680 SetAttrs(vert_to_dto_ic_obj
, ICA_TARGET
, (IPTR
)dto
, TAG_DONE
);
681 SetAttrs(horiz_to_dto_ic_obj
, ICA_TARGET
, (IPTR
)dto
, TAG_DONE
);
683 SetAttrs(model_to_dto_ic_obj
, ICA_TARGET
, (IPTR
)dto
, TAG_DONE
);
687 GetDTAttrs(dto
, DTA_NominalHoriz
, (IPTR
)&val
, TAG_DONE
);
688 pdt_origwidth
= winwidth
= (WORD
)val
;
689 GetDTAttrs(dto
, DTA_NominalVert
, (IPTR
)&val
, TAG_DONE
);
690 pdt_origheight
= winheight
= (WORD
)val
;
694 * Add 4 Pixels for border around DataType-Object
695 * See AddDTOToWin() for details
707 GetDTAttrs(dto
, DTA_ObjName
, (IPTR
)&objname
, TAG_DONE
);
708 strncpy(objnamebuffer
, objname
? objname
: filenamebuffer
, 299);
711 dto_subclass_gid
= 0;
712 if (GetDTAttrs(dto
, DTA_DataType
, (IPTR
)&dt
, TAG_DONE
))
716 dto_subclass_gid
= dt
->dtn_Header
->dth_GroupID
;
720 dto_supports_write
= FALSE
;
721 dto_supports_write_iff
= FALSE
;
722 dto_supports_print
= FALSE
;
723 dto_supports_copy
= FALSE
;
724 dto_supports_selectall
= FALSE
;
725 dto_supports_clearselected
= FALSE
;
727 if (DoWriteMethod(NULL
, DTWM_RAW
)) dto_supports_write
= TRUE
; /* probe raw saving */
728 if ((methods
= GetDTMethods(dto
)))
730 if (FindMethod(methods
, DTM_WRITE
)) dto_supports_write_iff
= TRUE
;
731 if (FindMethod(methods
, DTM_PRINT
)) dto_supports_print
= TRUE
;
732 if (FindMethod(methods
, DTM_COPY
)) dto_supports_copy
= TRUE
;
733 if (FindMethod(methods
, DTM_SELECT
)) dto_supports_selectall
= TRUE
;
734 if (FindMethod(methods
, DTM_CLEARSELECTED
)) dto_supports_clearselected
= TRUE
;
737 dto_supports_activate_field
= FALSE
;
738 dto_supports_next_field
= FALSE
;
739 dto_supports_prev_field
= FALSE
;
740 dto_supports_retrace
= FALSE
;
741 dto_supports_browse_next
= FALSE
;
742 dto_supports_browse_prev
= FALSE
;
743 dto_supports_search
= FALSE
;
744 dto_supports_search_next
= FALSE
;
745 dto_supports_search_prev
= FALSE
;
747 if ((triggermethods
= (struct DTMethod
*)GetDTTriggerMethods(dto
)))
749 if (FindTriggerMethod(triggermethods
, NULL
, STM_ACTIVATE_FIELD
)) dto_supports_activate_field
= TRUE
;
750 if (FindTriggerMethod(triggermethods
, NULL
, STM_NEXT_FIELD
)) dto_supports_next_field
= TRUE
;
751 if (FindTriggerMethod(triggermethods
, NULL
, STM_PREV_FIELD
)) dto_supports_prev_field
= TRUE
;
752 if (FindTriggerMethod(triggermethods
, NULL
, STM_RETRACE
)) dto_supports_retrace
= TRUE
;
753 if (FindTriggerMethod(triggermethods
, NULL
, STM_BROWSE_NEXT
)) dto_supports_browse_next
= TRUE
;
754 if (FindTriggerMethod(triggermethods
, NULL
, STM_BROWSE_PREV
)) dto_supports_browse_prev
= TRUE
;
755 if (FindTriggerMethod(triggermethods
, NULL
, STM_SEARCH
)) dto_supports_search
= TRUE
;
756 if (FindTriggerMethod(triggermethods
, NULL
, STM_SEARCH_NEXT
)) dto_supports_search_next
= TRUE
;
757 if (FindTriggerMethod(triggermethods
, NULL
, STM_SEARCH_PREV
)) dto_supports_search_prev
= TRUE
;
760 D(bug("\nMultiview: Found Methods:%s%s%s%s%s%s\n",
761 dto_supports_write
? " DTM_WRITE->RAW" : "",
762 dto_supports_write_iff
? " DTM_WRITE->IFF" : "",
763 dto_supports_print
? " DTM_PRINT" : "",
764 dto_supports_copy
? " DTM_COPY" : "",
765 dto_supports_selectall
? " DTM_SELECT" : "",
766 dto_supports_clearselected
? " DTM_CLEARSELECTED" : ""));
768 D(bug("Multiview: Found Triggers:%s%s%s%s%s%s%s\n\n",
769 dto_supports_activate_field
? " STM_ACTIVATE_FIELD" : "",
770 dto_supports_next_field
? " STM_NEXT_FIELD" : "",
771 dto_supports_prev_field
? " STM_PREV_FIELD" : "",
772 dto_supports_retrace
? " STM_RETRACE" : "",
773 dto_supports_browse_next
? " STM_BROWSE_NEXT" : "",
774 dto_supports_browse_prev
? " STM_BROWSE_PREV" : "",
775 dto_supports_search
? " STM_SEARCH" : "",
776 dto_supports_search_next
? " STM_SEARCH_NEXT" : "",
777 dto_supports_search_prev
? " STM_SEARCH_PREV" : ""));
781 if (win
) RemoveDTObject(win
, old_dto
);
782 DisposeDTObject(old_dto
);
787 SetWindowTitles(win
, objnamebuffer
, (UBYTE
*)~0);
790 // adopt object to current settings
791 if (dto_subclass_gid
== GID_TEXT
)
793 SetDTAttrs (dto
, NULL
, NULL
,
794 TDTA_WordWrap
, tdt_text_wordwrap
,
798 else if (dto_subclass_gid
== GID_PICTURE
)
800 // zoom has been set to 1 above
802 SetDTAttrs (dto
, NULL
, NULL
,
803 PDTA_DestMode
, (pdt_force_map
) ? PMODE_V42
: PMODE_V43
,
805 SetDTAttrs (dto
, NULL
, NULL
,
806 PDTA_DitherQuality
, pdt_pict_dither
? 4 : 0,
814 /*********************************************************************************************/
816 static void CloseDTO(void)
820 if (win
) RemoveDTObject(win
, dto
);
821 DisposeDTObject(dto
);
826 /*********************************************************************************************/
828 static void MakeWindow(void)
830 WORD minwidth
, minheight
;
832 winwidth
= winheight
= 0;
834 if (wincoords
.MinX
== 0)
835 wincoords
.MinX
= (- scr
->LeftEdge
);
836 if (wincoords
.MinY
== 0)
837 wincoords
.MinY
= ( (- scr
->TopEdge
) < (scr
->BarHeight
+ 1) ) ? (scr
->BarHeight
+ 1) : (- scr
->TopEdge
);
838 if (wincoords
.MaxX
== 0)
839 wincoords
.MaxX
= scr
->ViewPort
.DWidth
;
840 if (wincoords
.MaxY
== 0)
841 wincoords
.MaxY
= scr
->ViewPort
.DHeight
- scr
->BarHeight
- 2;
843 minwidth
= ( (winwidth
) && (winwidth
< 50) ) ? winwidth
: 50;
844 minheight
= ( (winheight
) && (winheight
< 50) ) ? winheight
: 50;
846 win
= OpenWindowTags(0, WA_PubScreen
, (IPTR
)scr
,
847 WA_Title
, (IPTR
)objnamebuffer
,
848 WA_CloseGadget
, TRUE
,
849 WA_DepthGadget
, TRUE
,
851 WA_SizeGadget
, TRUE
,
853 WA_SimpleRefresh
, TRUE
,
854 WA_NoCareRefresh
, TRUE
,
855 WA_NewLookMenus
, TRUE
,
856 WA_Left
, wincoords
.MinX
,
857 WA_Top
, wincoords
.MinY
,
858 ( winwidth
? WA_InnerWidth
860 ( winwidth
? winwidth
862 ( winheight
? WA_InnerHeight
864 ( winheight
? winheight
866 WA_AutoAdjust
, TRUE
,
867 WA_MinWidth
, minwidth
,
868 WA_MinHeight
, minheight
,
869 WA_MaxWidth
, 16383 ,
870 WA_MaxHeight
, 16383 ,
871 WA_Gadgets
, (IPTR
)gad
[GAD_UPARROW
],
872 WA_IDCMP
, IDCMP_CLOSEWINDOW
|
884 if (!win
) Cleanup(MSG(MSG_CANT_CREATE_WIN
));
888 SetMenuStrip(win
, menus
);
890 winmask
= 1L << win
->UserPort
->mp_SigBit
;
891 if (!(msgport
= CreateMsgPort()))
893 Cleanup(MSG(MSG_CANT_CREATE_MSGPORT
));
895 if (!(appwindow
= AddAppWindow(0, 0, win
, msgport
, NULL
)))
897 Cleanup(MSG(MSG_CANT_ADD_APPWINDOW
));
899 msgmask
= 1L << msgport
->mp_SigBit
;
902 /*********************************************************************************************/
904 static void KillWindow(void)
908 if (dto
) RemoveDTObject(win
, dto
);
909 if (menus
) ClearMenuStrip(win
);
913 winwidth
= winheight
= 0;
917 /*********************************************************************************************/
919 static void InitIScreenNotify(void)
921 if (!(isnport
= CreateMsgPort()))
923 Cleanup(MSG(MSG_CANT_CREATE_MSGPORT
));
925 if ( (isnstarted
= StartScreenNotifyTags(SNA_Notify
, SNOTIFY_WAIT_REPLY
|
926 SNOTIFY_BEFORE_CLOSEWB
|
927 SNOTIFY_AFTER_OPENWB
,
928 SNA_MsgPort
, isnport
,
932 isnmask
= 1L << isnport
->mp_SigBit
;
936 /************************************************************************************/
937 /* Handle Intuition's ScreenNotify signals */
939 static void HandleIScreenNotify(void)
941 struct ScreenNotifyMessage
*isnmsg
;
942 while ((isnmsg
= (struct ScreenNotifyMessage
*) GetMsg (isnport
)))
944 IPTR isnmclass
= isnmsg
->snm_Class
;
948 case SNOTIFY_BEFORE_CLOSEWB
:
949 D(bug("[Multiview] received isn before close WB msg\n"));
954 ReplyMsg ((struct Message
*) isnmsg
);
956 case SNOTIFY_AFTER_OPENWB
:
957 ReplyMsg ((struct Message
*) isnmsg
);
958 D(bug("[Multiview] received isn after open WB msg\n"));
965 ReplyMsg ((struct Message
*) isnmsg
);
966 D(bug("[Multiview] received unexpected msg!\n"));
972 /*********************************************************************************************/
974 static void ScrollTo(UWORD dir
, UWORD quali
)
977 LONG oldtop
, top
, total
, visible
, delta
= 1;
984 case RAWKEY_NM_WHEEL_UP
:
989 case RAWKEY_NM_WHEEL_DOWN
:
994 case RAWKEY_NM_WHEEL_LEFT
:
999 case RAWKEY_NM_WHEEL_RIGHT
:
1006 if ((dir
== CURSORUP
) || (dir
== CURSORDOWN
))
1009 if (dir
== CURSORUP
) inc
= FALSE
; else inc
= TRUE
;
1011 GetDTAttrs(dto
, DTA_TopVert
, (IPTR
)&val
, TAG_DONE
);
1013 GetDTAttrs(dto
, DTA_TotalVert
, (IPTR
)&val
, TAG_DONE
);
1015 GetDTAttrs(dto
, DTA_VisibleVert
, (IPTR
)&val
, TAG_DONE
);
1016 visible
= (LONG
)val
;
1021 if (dir
== CURSORLEFT
) inc
= FALSE
; else inc
= TRUE
;
1023 GetDTAttrs(dto
, DTA_TopHoriz
, (IPTR
)&val
, TAG_DONE
);
1025 GetDTAttrs(dto
, DTA_TotalHoriz
, (IPTR
)&val
, TAG_DONE
);
1027 GetDTAttrs(dto
, DTA_VisibleHoriz
, (IPTR
)&val
, TAG_DONE
);
1028 visible
= (LONG
)val
;
1033 if (quali
& (IEQUALIFIER_LALT
| IEQUALIFIER_RALT
| IEQUALIFIER_CONTROL
))
1035 if (inc
) top
= total
; else top
= 0;
1038 if (quali
& (IEQUALIFIER_LSHIFT
| IEQUALIFIER_RSHIFT
))
1040 if (inc
) top
+= visible
- 1; else top
-= visible
- 1;
1044 if (inc
) top
+= delta
; else top
-= delta
;
1047 if (top
+ visible
> total
) top
= total
- visible
;
1048 if (top
< 0) top
= 0;
1056 g
= (struct Gadget
*)gad
[GAD_HORIZSCROLL
];
1060 g
= (struct Gadget
*)gad
[GAD_VERTSCROLL
];
1063 SetGadgetAttrs(g
, win
, NULL
, PGA_Top
, top
,
1067 /* Looks like setting PGA_Top on Amiga does not cause OM_NOTIFIEs
1068 to be sent (to dto). Or something like that. */
1070 SetDTAttrs(dto
, win
, NULL
, (horiz
? DTA_TopHoriz
: DTA_TopVert
), top
, TAG_DONE
);
1073 } /* if (top != oldtop) */
1077 /*********************************************************************************************/
1079 static void FitToWindow(void)
1085 x
= win
->Width
- (win
->BorderLeft
+ win
->BorderRight
+ 4);
1086 y
= win
->Height
- (win
->BorderTop
+ win
->BorderBottom
+ 4);
1087 D(bug("=> width %ld height %ld\n", x
, y
));
1088 DoScaleMethod(x
, y
, pdt_keep_aspect
);
1089 // DoLayout(TRUE); seems to be done by intuition ?
1093 /*********************************************************************************************/
1095 static void HandleAll(void)
1097 struct IntuiMessage
*msg
;
1098 struct TagItem
*tstate
, *tags
;
1099 struct TagItem
*tag
;
1100 struct MenuItem
*item
;
1101 struct Gadget
*activearrowgad
= NULL
;
1102 WORD arrowticker
= 0, activearrowkind
= 0;
1105 BOOL quitme
= FALSE
;
1106 const STRPTR not_supported
= "Sorry, not supported yet\n";
1111 // if ( (sigs & winmask) || (sigs & msgmask) )
1112 TEXT editorvarbuffer
[300];
1113 struct AppMessage
*appmsg
;
1115 sigs
= Wait(msgmask
| winmask
| isnmask
);
1119 HandleIScreenNotify();
1122 while ( (msgport
) && (appmsg
= (struct AppMessage
*) GetMsg(msgport
)) )
1124 if (appmsg
->am_Type
== AMTYPE_APPWINDOW
)
1126 if (appmsg
->am_NumArgs
>= 1)
1128 NameFromLock(appmsg
->am_ArgList
->wa_Lock
, filenamebuffer
, 299);
1129 AddPart(filenamebuffer
, appmsg
->am_ArgList
->wa_Name
, 299);
1130 filename
= filenamebuffer
;
1131 D(bug("[Multiview] appwindow received message: filename = %s\n", filename
));
1135 ReplyMsg ((struct Message
*) appmsg
);
1136 ActivateWindow(win
);
1144 } /* while ((appmsg = (struct AppMessage *) GetMsg(msgport))) */
1146 while( (win
) && (msg
= (struct IntuiMessage
*)GetMsg(win
->UserPort
)) )
1148 // D(if (msg->Class!=IDCMP_INTUITICKS) bug(" Msg Class %08lx\n", (long)msg->Class));
1151 case IDCMP_CLOSEWINDOW
:
1155 case IDCMP_VANILLAKEY
:
1156 D(bug("[Multiview] Vanillakey %d\n", (int)msg
->Code
));
1163 case 13: /* RETURN */
1164 if (dto_supports_activate_field
) DoTrigger(STM_ACTIVATE_FIELD
);
1165 else if (dto_supports_search
) DoTrigger(STM_SEARCH
);
1166 RefreshDTObjects (dto
, win
, NULL
, (IPTR
) NULL
);
1170 if (dto_supports_next_field
) DoTrigger(STM_NEXT_FIELD
);
1171 else if (dto_supports_search_next
) DoTrigger(STM_SEARCH_NEXT
);
1174 case 8: /* Backspace */
1175 if (dto_supports_retrace
) DoTrigger(STM_RETRACE
);
1179 if (dto_supports_browse_next
) DoTrigger(STM_BROWSE_NEXT
);
1183 if (dto_supports_browse_prev
) DoTrigger(STM_BROWSE_PREV
);
1186 } /* switch(msg->Code) */
1187 if (strchr(MSG(MSG_SHORTCUT_EDITOR
), ToUpper(msg
->Code
)))
1189 if ( (GetVar("editor", (STRPTR
) editorvarbuffer
, 299, GVF_GLOBAL_ONLY
)) != -1L )
1191 __sprintf(s
, "Run QUIET \"%s\" \"%s\"", editorvarbuffer
, filename
);
1192 D(bug("[Multiview] editor command: '%s'\n", s
));
1193 if (SystemTags(s
, TAG_END
))
1203 case RAWKEY_NM_WHEEL_UP
:
1204 case RAWKEY_NM_WHEEL_DOWN
:
1205 case RAWKEY_NM_WHEEL_LEFT
:
1206 case RAWKEY_NM_WHEEL_RIGHT
:
1212 ScrollTo(msg
->Code
, msg
->Qualifier
);
1216 case RAWKEY_HOME
: /* HOME */
1217 ScrollTo(CURSORUP
, IEQUALIFIER_LALT
);
1220 case RAWKEY_END
: /* END */
1221 ScrollTo(CURSORDOWN
, IEQUALIFIER_LALT
);
1224 case RAWKEY_PAGEUP
: /* PAGE UP */
1225 ScrollTo(CURSORUP
, IEQUALIFIER_LSHIFT
);
1228 case RAWKEY_PAGEDOWN
: /* PAGE DOWN */
1229 ScrollTo(CURSORDOWN
, IEQUALIFIER_LSHIFT
);
1233 case 0x42: /* SHIFT TAB? */
1234 if (msg
->Qualifier
& (IEQUALIFIER_LSHIFT
| IEQUALIFIER_RSHIFT
))
1236 if (dto_supports_prev_field
) DoTrigger(STM_PREV_FIELD
);
1237 else if (dto_supports_search_prev
) DoTrigger(STM_SEARCH_PREV
);
1241 } /* switch(msg->Code) */
1244 case IDCMP_GADGETDOWN
:
1246 activearrowgad
= (struct Gadget
*)msg
->IAddress
;
1247 switch(activearrowgad
->GadgetID
)
1250 activearrowkind
= CURSORUP
;
1251 ScrollTo(CURSORUP
, 0);
1255 activearrowkind
= CURSORDOWN
;
1256 ScrollTo(CURSORDOWN
, 0);
1260 activearrowkind
= CURSORLEFT
;
1261 ScrollTo(CURSORLEFT
, 0);
1264 case GAD_RIGHTARROW
:
1265 activearrowkind
= CURSORRIGHT
;
1266 ScrollTo(CURSORRIGHT
, 0);
1270 activearrowkind
= 0;
1276 case IDCMP_INTUITICKS
:
1277 if (activearrowkind
)
1283 else if (activearrowgad
->Flags
& GFLG_SELECTED
)
1285 ScrollTo(activearrowkind
, 0);
1290 case IDCMP_GADGETUP
:
1291 switch(((struct Gadget
*)msg
->IAddress
)->GadgetID
)
1296 case GAD_RIGHTARROW
:
1297 activearrowkind
= 0;
1302 case IDCMP_MENUPICK
:
1304 // D(bug(" * MV: men %08lx\n", (long)men));
1305 while(men
!= MENUNULL
)
1307 if ((item
= ItemAddress(menus
, men
)))
1309 // D(bug(" * MV: item %08lx menus %08lx\n", (long)item, (long)menus));
1310 switch((IPTR
)GTMENUITEM_USERDATA(item
))
1312 case MSG_MEN_PROJECT_OPEN
:
1313 filename
= GetFileName(MSG_ASL_OPEN_TITLE
);
1314 if (filename
) OpenDTO();
1317 case MSG_MEN_PROJECT_SAVEAS
:
1318 filename
= GetFileName(MSG_ASL_SAVE_TITLE
);
1319 if (filename
) DoWriteMethod(filename
, DTWM_RAW
);
1322 case MSG_MEN_PROJECT_SAVEAS_IFF
:
1323 filename
= GetFileName(MSG_ASL_SAVE_TITLE
);
1324 if (filename
) DoWriteMethod(filename
, DTWM_IFF
);
1327 case MSG_MEN_PROJECT_PRINT
:
1331 case MSG_MEN_PROJECT_ABOUT
:
1335 case MSG_MEN_PROJECT_QUIT
:
1339 case MSG_MEN_EDIT_MARK
:
1340 #if defined(__AROS__) && !defined(__MORPHOS__)
1341 if (StartDragSelect(dto
))
1344 struct DTSpecialInfo
*si
;
1347 ** ClipView example on AmigaDev CD does just the following.
1348 ** None of the checks AROS datatypes.library/StartDragSelect()
1352 si
= (struct DTSpecialInfo
*)(((struct Gadget
*)dto
)->SpecialInfo
);
1353 si
->si_Flags
|= DTSIF_DRAGSELECT
;
1357 //TODO: change mouse pointer to crosshair
1361 case MSG_MEN_EDIT_COPY
:
1363 struct dtGeneral dtg
;
1365 dtg
.MethodID
= DTM_COPY
;
1366 dtg
.dtg_GInfo
= NULL
;
1368 DoDTMethodA(dto
, win
, NULL
, (Msg
)&dtg
);
1372 case MSG_MEN_EDIT_SELECTALL
:
1373 OutputMessage(not_supported
);
1376 case MSG_MEN_EDIT_CLEARSELECTED
:
1378 struct dtGeneral dtg
;
1380 dtg
.MethodID
= DTM_CLEARSELECTED
;
1381 dtg
.dtg_GInfo
= NULL
;
1383 DoDTMethodA(dto
, win
, NULL
, (Msg
)&dtg
);
1387 case MSG_MEN_WINDOW_SEPSCREEN
:
1388 OutputMessage(not_supported
);
1391 case MSG_MEN_WINDOW_MINIMIZE
:
1392 OutputMessage(not_supported
);
1395 case MSG_MEN_WINDOW_NORMAL
:
1396 OutputMessage(not_supported
);
1399 case MSG_MEN_WINDOW_MAXIMIZE
:
1400 OutputMessage(not_supported
);
1403 case MSG_MEN_SETTINGS_SAVEDEF
:
1404 OutputMessage(not_supported
);
1407 case MSG_MEN_PICT_ZOOM_IN
:
1409 if (pdt_zoom
== -1 ) pdt_zoom
= 1;
1413 case MSG_MEN_PICT_ZOOM_OUT
:
1415 if (pdt_zoom
== 0 ) pdt_zoom
= -2;
1419 case MSG_MEN_PICT_RESET
:
1424 case MSG_MEN_PICT_FIT_WIN
:
1425 pdt_fit_win
= (item
->Flags
& CHECKED
) ? TRUE
: FALSE
;
1430 case MSG_MEN_PICT_KEEP_ASPECT
:
1431 pdt_keep_aspect
= (item
->Flags
& CHECKED
) ? TRUE
: FALSE
;
1436 case MSG_MEN_PICT_FORCE_MAP
:
1437 pdt_force_map
= (item
->Flags
& CHECKED
) ? TRUE
: FALSE
;
1438 SetDTAttrs (dto
, NULL
, NULL
,
1439 PDTA_DestMode
, (pdt_force_map
) ? PMODE_V42
: PMODE_V43
,
1444 case MSG_MEN_PICT_DITHER
:
1445 pdt_pict_dither
= (item
->Flags
& CHECKED
) ? TRUE
: FALSE
;
1446 SetDTAttrs (dto
, NULL
, NULL
,
1447 PDTA_DitherQuality
, pdt_pict_dither
? 4 : 0,
1452 case MSG_MEN_TEXT_WORDWRAP
:
1453 tdt_text_wordwrap
= (item
->Flags
& CHECKED
) ? TRUE
: FALSE
;
1454 if (tdt_text_wordwrap
)
1455 D(bug("wordwrap enabled\n"));
1457 D(bug("wordwrap disabled\n"));
1458 SetDTAttrs (dto
, NULL
, NULL
,
1459 TDTA_WordWrap
, tdt_text_wordwrap
,
1464 case MSG_MEN_TEXT_SEARCH
:
1465 if (dto_supports_search
) DoTrigger(STM_SEARCH
);
1468 case MSG_MEN_TEXT_SEARCH_PREV
:
1469 if (dto_supports_search_prev
) DoTrigger(STM_SEARCH_PREV
);
1472 case MSG_MEN_TEXT_SEARCH_NEXT
:
1473 if (dto_supports_search_next
) DoTrigger(STM_SEARCH_NEXT
);
1476 } /* switch(GTMENUITEM_USERDATA(item)) */
1478 men
= item
->NextSelect
;
1485 } /* while(men != MENUNULL) */
1489 D(bug("IDCMP NEWSIZE\n"));
1493 case IDCMP_IDCMPUPDATE
:
1494 tstate
= tags
= (struct TagItem
*) msg
->IAddress
;
1495 while ((tag
= NextTagItem(&tstate
)) != NULL
)
1497 tidata
= tag
->ti_Data
;
1498 // D(bug("IDCMP UPDATE %08lx %08lx\n", (long)tag->ti_Tag, (long)tag->ti_Data));
1499 switch (tag
->ti_Tag
)
1501 /* Change in busy state */
1504 SetWindowPointer (win
, WA_BusyPointer
, TRUE
, TAG_DONE
);
1506 SetWindowPointer (win
, WA_Pointer
, (IPTR
) NULL
, TAG_DONE
);
1510 SetWindowTitles(win
, (UBYTE
*)tidata
, (UBYTE
*)~0);
1514 case DTA_ErrorLevel
:
1517 errnum = GetTagData (DTA_ErrorNumber, NULL, tags);
1518 PrintErrorMsg (errnum, (STRPTR) options[OPT_NAME]);
1522 /* Time to refresh */
1524 /* Refresh the DataType object */
1525 D(bug("Multiview: DTA_SYNC\n"));
1526 RefreshDTObjects (dto
, win
, NULL
, (IPTR
) NULL
);
1529 } /* switch (tag->ti_Tag) */
1531 } /* while ((tag = NextTagItem ((const struct TagItem **)&tstate))) */
1534 } /* switch (msg->Class) */
1536 ReplyMsg((struct Message
*)msg
);
1538 } /* while((msg = (struct IntuiMessage *)GetMsg(win->UserPort))) */
1540 } /* while (!quitme) */
1543 /*********************************************************************************************/
1553 menus
= MakeMenus(nm
);
1554 pictmenus
= MakeMenus(nmpict
);
1555 textmenus
= MakeMenus(nmtext
);
1558 SetDTAttrs (dto
, NULL
, NULL
,
1559 PDTA_DestMode
, (pdt_force_map
) ? PMODE_V42
: PMODE_V43
,
1560 PDTA_DitherQuality
, (pdt_pict_dither
) ? 4 : 0,
1561 TDTA_WordWrap
, tdt_text_wordwrap
,
1566 /*********************************************************************************************/
1568 int main(int argc
, char **argv
)
1572 /* This is for when Cleanup() is called */
1573 rc
= setjmp(exit_buf
);
1582 pdt_fit_win
= FALSE
;
1583 pdt_keep_aspect
= FALSE
;
1584 pdt_force_map
= FALSE
;
1585 pdt_pict_dither
= TRUE
;
1586 tdt_text_wordwrap
= TRUE
;
1587 separate_screen
= FALSE
;
1589 InitLocale("System/Utilities/MultiView.catalog", 1);
1597 struct WBStartup
*startup
= (struct WBStartup
*) argv
;
1599 if (startup
->sm_NumArgs
>= 2)
1601 /* FIXME: all arguments but the first are ignored */
1602 cd
= CurrentDir(startup
->sm_ArgList
[1].wa_Lock
);
1603 filename
= startup
->sm_ArgList
[1].wa_Name
;
1607 filename
= GetFileName(MSG_ASL_OPEN_TITLE
);
1608 if (!filename
) Cleanup(NULL
);
1616 InitIScreenNotify();
1625 /*********************************************************************************************/