Snoopy: print correct title for OpenResource patch.
[AROS.git] / workbench / utilities / MultiView / main.c
blob07d28483cf73b88085d6a57df40ab1bd0a100976
1 /*
2 Copyright © 1995-2012, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 /*********************************************************************************************/
8 #include "global.h"
10 #include "compilerspecific.h"
11 #include "debug.h"
12 #include "arossupport.h"
14 #include <setjmp.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
23 as OM_UPDATE :-\ */
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"
33 #define ARG_FILE 0
34 #define ARG_CLIPBOARD 1
35 #define ARG_CLIPUNIT 2
36 #define ARG_SCREEN 3
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
43 #define ARG_WINDOW 10
44 #define ARG_PORTNAME 11
45 #define ARG_IMMEDIATE 12
46 #define ARG_REPEAT 13
47 #define ARG_PRTUNIT 14
49 #define NUM_ARGS 15
51 /*********************************************************************************************/
53 static struct libinfo
55 APTR var;
56 STRPTR name;
57 WORD version;
58 } libtable[] =
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 },
68 {NULL }
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)
98 struct EasyStruct es;
100 if (msg)
102 if ( IntuitionBase && !((struct Process *)FindTask(NULL))->pr_CLI )
104 es.es_StructSize = sizeof(es);
105 es.es_Flags = 0;
106 es.es_Title = "MultiView";
107 es.es_TextFormat = msg;
108 es.es_GadgetFormat = MSG(MSG_OK);
110 EasyRequestArgs(win, &es, NULL, NULL);
112 else
114 Printf("MultiView: %s\n", msg);
119 /*********************************************************************************************/
121 void WinCleanup(void)
124 if (win)
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));
134 if (msgport)
136 DeleteMsgPort(msgport);
137 msgport = NULL;
138 D(bug("[Multiview] removed msgport\n"));
140 if (appwindow)
142 RemoveAppWindow(appwindow);
143 appwindow = NULL;
144 D(bug("[Multiview] removed appwindow\n"));
147 KillWindow();
148 KillMenus();
149 KillGadgets();
150 FreeVisual();
151 CloseDTO();
152 KillICObjects();
153 KillFont();
156 /*********************************************************************************************/
158 void Cleanup(CONST_STRPTR msg)
160 OutputMessage(msg);
162 struct ScreenNotifyMessage *snmsg;
164 while (!EndScreenNotify (isnstarted))
165 Delay (10);
167 if (isnport)
169 while ((snmsg = (struct ScreenNotifyMessage *) GetMsg (isnport)))
171 ReplyMsg((struct Message *)snmsg);
173 DeleteMsgPort(isnport);
176 WinCleanup();
178 FreeArguments();
180 if (cd != BNULL)
181 CurrentDir(cd); /* restore current directory */
183 CloseLibs();
184 CleanupLocale();
186 longjmp(exit_buf, 0);
190 /*********************************************************************************************/
192 static void OpenLibs(void)
194 struct libinfo *li;
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);
201 Cleanup(s);
207 /*********************************************************************************************/
209 static void CloseLibs(void)
211 struct libinfo *li;
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);
224 if (!font)
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);
270 Cleanup(s);
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 },
311 {TAG_DONE }
313 static const struct TagItem dto_to_horiz_map[] =
315 {DTA_TopHoriz , PGA_Top },
316 {DTA_VisibleHoriz , PGA_Visible },
317 {DTA_TotalHoriz , PGA_Total },
318 {TAG_DONE }
320 static const struct TagItem vert_to_dto_map[] =
322 {PGA_Top , DTA_TopVert },
323 {TAG_DONE }
325 static const struct TagItem horiz_to_dto_map[] =
327 {PGA_Top , DTA_TopHoriz },
328 {TAG_DONE }
331 model_obj = NewObject(NULL, MODELCLASS, ICA_TARGET, ICTARGET_IDCMP,
332 TAG_DONE);
333 dto_to_vert_ic_obj = NewObject(NULL, ICCLASS, ICA_MAP, (IPTR)dto_to_vert_map,
334 TAG_DONE);
335 dto_to_horiz_ic_obj = NewObject(NULL, ICCLASS, ICA_MAP, (IPTR)dto_to_horiz_map,
336 TAG_DONE);
337 vert_to_dto_ic_obj = NewObject(NULL, ICCLASS, ICA_MAP, (IPTR)vert_to_dto_map,
338 TAG_DONE);
339 horiz_to_dto_ic_obj = NewObject(NULL, ICCLASS, ICA_MAP, (IPTR)horiz_to_dto_map,
340 TAG_DONE);
341 #if BACK_CONNECTION
342 model_to_dto_ic_obj = NewObject(NULL, ICCLASS, TAG_DONE);
343 #endif
345 if (!model_obj ||
346 !dto_to_vert_ic_obj ||
347 !dto_to_horiz_ic_obj ||
348 !vert_to_dto_ic_obj ||
349 !horiz_to_dto_ic_obj
350 #if BACK_CONNECTION
351 || !model_to_dto_ic_obj
352 #endif
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);
360 #if BACK_CONNECTION
361 DoMethod(model_obj, OM_ADDMEMBER, (IPTR) model_to_dto_ic_obj);
362 #endif
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);
376 #if BACK_CONNECTION
377 if (model_to_dto_ic_obj) DisposeObject(model_to_dto_ic_obj);
378 #endif
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[] =
415 UPIMAGE,
416 DOWNIMAGE,
417 LEFTIMAGE,
418 RIGHTIMAGE,
419 SIZEIMAGE
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] ),
429 TAG_DONE);
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,
453 TAG_DONE);
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,
464 TAG_DONE);
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,
482 TAG_DONE);
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,
493 TAG_DONE);
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,
504 TAG_DONE);
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,
522 TAG_DONE);
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)
539 WORD i;
541 for(i = 0; i < NUM_GADGETS;i++)
543 if (win) RemoveGadget(win, (struct Gadget *)gad[i]);
544 if (gad[i]) DisposeObject(gad[i]);
545 gad[i] = 0;
548 for(i = 0; i < NUM_IMAGES;i++)
550 if (img[i]) DisposeObject(img[i]);
551 img[i] = NULL;
555 /*********************************************************************************************/
557 void AddDTOToWin(void)
559 EraseRect(win->RPort, win->BorderLeft,
560 win->BorderTop,
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 ,
568 TAG_DONE);
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;
579 ULONG *methods;
580 STRPTR objname = NULL;
581 IPTR val;
582 struct DataType *dt;
584 old_dto = dto;
588 if (!old_dto && args[ARG_CLIPBOARD])
590 APTR clipunit = 0;
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,
597 GA_ID , 1000 ,
598 DTA_SourceType, DTST_CLIPBOARD ,
599 DTA_TextAttr , (IPTR)&textattr,
600 TAG_DONE);
602 D(bug("MultiView: NewDTObject returned %x\n", dto));
604 else
606 dto = NewDTObject(filename, ICA_TARGET , (IPTR)model_obj,
607 GA_ID , 1000 ,
608 DTA_TextAttr , (IPTR)&textattr,
609 TAG_DONE);
612 if (!dto)
614 ULONG errnum = IoErr();
616 if (errnum == DTERROR_UNKNOWN_DATATYPE)
618 BPTR lock = Lock(filename,ACCESS_READ);
619 if (lock)
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);
642 UnLock(lock);
646 if (errnum >= DTERROR_UNKNOWN_DATATYPE)
647 __sprintf(s, GetDTString(errnum), filename);
648 else
649 Fault(errnum, 0, s, 256);
651 if (!old_dto)
653 /* Check if file is 0-length, fail silently (AOS confirmed) */
654 STRPTR msg = s;
655 BPTR lock = Lock(filename, ACCESS_READ);
656 if (lock)
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 */
664 msg = NULL;
667 FreeDosObject(DOS_FIB, fib);
668 UnLock(lock);
671 Cleanup(msg);
673 dto = old_dto;
674 return;
676 } while (!dto);
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);
682 #if BACK_CONNECTION
683 SetAttrs(model_to_dto_ic_obj, ICA_TARGET, (IPTR)dto, TAG_DONE);
684 #endif
686 val = 0;
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;
691 pdt_zoom = 1;
694 * Add 4 Pixels for border around DataType-Object
695 * See AddDTOToWin() for details
697 if(winwidth)
699 winwidth += 4;
702 if(winheight)
704 winheight += 4;
707 GetDTAttrs(dto, DTA_ObjName, (IPTR)&objname, TAG_DONE);
708 strncpy(objnamebuffer, objname ? objname : filenamebuffer, 299);
710 dt = NULL;
711 dto_subclass_gid = 0;
712 if (GetDTAttrs(dto, DTA_DataType, (IPTR)&dt, TAG_DONE))
714 if (dt)
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" : ""));
779 if (old_dto)
781 if (win) RemoveDTObject(win, old_dto);
782 DisposeDTObject(old_dto);
784 if (win)
786 AddDTOToWin();
787 SetWindowTitles(win, objnamebuffer, (UBYTE *)~0);
788 SetMenuFlags();
790 // adopt object to current settings
791 if (dto_subclass_gid == GID_TEXT)
793 SetDTAttrs (dto, NULL, NULL,
794 TDTA_WordWrap, tdt_text_wordwrap,
795 TAG_DONE);
796 DoLayout(TRUE);
798 else if (dto_subclass_gid == GID_PICTURE)
800 // zoom has been set to 1 above
801 FitToWindow();
802 SetDTAttrs (dto, NULL, NULL,
803 PDTA_DestMode, (pdt_force_map) ? PMODE_V42 : PMODE_V43,
804 TAG_DONE);
805 SetDTAttrs (dto, NULL, NULL,
806 PDTA_DitherQuality, pdt_pict_dither ? 4 : 0,
807 TAG_DONE);
808 DoLayout(TRUE);
814 /*********************************************************************************************/
816 static void CloseDTO(void)
818 if (dto)
820 if (win) RemoveDTObject(win, dto);
821 DisposeDTObject(dto);
822 dto = NULL;
826 /*********************************************************************************************/
828 static void MakeWindow(void)
830 WORD minwidth, minheight;
831 if (pdt_fit_win)
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 ,
850 WA_DragBar , TRUE ,
851 WA_SizeGadget , TRUE ,
852 WA_Activate , 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
859 : WA_Width ) ,
860 ( winwidth ? winwidth
861 : wincoords.MaxX ) ,
862 ( winheight ? WA_InnerHeight
863 : WA_Height ) ,
864 ( winheight ? winheight
865 : wincoords.MaxY ) ,
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 |
873 IDCMP_GADGETUP |
874 IDCMP_GADGETDOWN |
875 IDCMP_MOUSEMOVE |
876 IDCMP_VANILLAKEY |
877 IDCMP_RAWKEY |
878 IDCMP_IDCMPUPDATE |
879 IDCMP_MENUPICK |
880 IDCMP_NEWSIZE |
881 IDCMP_INTUITICKS ,
882 TAG_DONE);
884 if (!win) Cleanup(MSG(MSG_CANT_CREATE_WIN));
886 AddDTOToWin();
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)
906 if (win)
908 if (dto) RemoveDTObject(win, dto);
909 if (menus) ClearMenuStrip(win);
910 CloseWindow(win);
911 win = NULL;
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,
929 SNA_Priority, 0,
930 TAG_END )) )
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;
946 switch (isnmclass)
948 case SNOTIFY_BEFORE_CLOSEWB:
949 D(bug("[Multiview] received isn before close WB msg\n"));
950 if (win)
952 WinCleanup();
954 ReplyMsg ((struct Message *) isnmsg);
955 break;
956 case SNOTIFY_AFTER_OPENWB:
957 ReplyMsg ((struct Message *) isnmsg);
958 D(bug("[Multiview] received isn after open WB msg\n"));
959 if (!win)
961 InitWin();
963 break;
964 default:
965 ReplyMsg ((struct Message *) isnmsg);
966 D(bug("[Multiview] received unexpected msg!\n"));
967 break;
972 /*********************************************************************************************/
974 static void ScrollTo(UWORD dir, UWORD quali)
976 IPTR val;
977 LONG oldtop, top, total, visible, delta = 1;
978 BOOL horiz;
979 BOOL inc;
981 #ifdef __AROS__
982 switch(dir)
984 case RAWKEY_NM_WHEEL_UP:
985 dir = CURSORUP;
986 delta = 3;
987 break;
989 case RAWKEY_NM_WHEEL_DOWN:
990 dir = CURSORDOWN;
991 delta = 3;
992 break;
994 case RAWKEY_NM_WHEEL_LEFT:
995 dir = CURSORLEFT;
996 delta = 3;
997 break;
999 case RAWKEY_NM_WHEEL_RIGHT:
1000 dir = CURSORRIGHT;
1001 delta = 3;
1002 break;
1004 #endif
1006 if ((dir == CURSORUP) || (dir == CURSORDOWN))
1008 horiz = FALSE;
1009 if (dir == CURSORUP) inc = FALSE; else inc = TRUE;
1011 GetDTAttrs(dto, DTA_TopVert, (IPTR)&val, TAG_DONE);
1012 top = (LONG)val;
1013 GetDTAttrs(dto, DTA_TotalVert, (IPTR)&val, TAG_DONE);
1014 total = (LONG)val;
1015 GetDTAttrs(dto, DTA_VisibleVert, (IPTR)&val, TAG_DONE);
1016 visible = (LONG)val;
1018 else
1020 horiz = TRUE;
1021 if (dir == CURSORLEFT) inc = FALSE; else inc = TRUE;
1023 GetDTAttrs(dto, DTA_TopHoriz, (IPTR)&val, TAG_DONE);
1024 top = (LONG)val;
1025 GetDTAttrs(dto, DTA_TotalHoriz, (IPTR)&val, TAG_DONE);
1026 total = (LONG)val;
1027 GetDTAttrs(dto, DTA_VisibleHoriz, (IPTR)&val, TAG_DONE);
1028 visible = (LONG)val;
1032 oldtop = top;
1033 if (quali & (IEQUALIFIER_LALT | IEQUALIFIER_RALT | IEQUALIFIER_CONTROL))
1035 if (inc) top = total; else top = 0;
1037 else
1038 if (quali & (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT))
1040 if (inc) top += visible - 1; else top -= visible - 1;
1042 else
1044 if (inc) top += delta; else top -= delta;
1047 if (top + visible > total) top = total - visible;
1048 if (top < 0) top = 0;
1050 if (top != oldtop)
1052 struct Gadget *g;
1054 if (horiz)
1056 g = (struct Gadget *)gad[GAD_HORIZSCROLL];
1058 else
1060 g = (struct Gadget *)gad[GAD_VERTSCROLL];
1063 SetGadgetAttrs(g, win, NULL, PGA_Top, top,
1064 TAG_DONE);
1066 #ifdef __MORPHOS__
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);
1071 #endif
1073 } /* if (top != oldtop) */
1077 /*********************************************************************************************/
1079 static void FitToWindow(void)
1081 if( pdt_fit_win )
1083 int x, y;
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;
1103 IPTR tidata;
1104 UWORD men;
1105 BOOL quitme = FALSE;
1106 const STRPTR not_supported = "Sorry, not supported yet\n";
1107 ULONG sigs;
1109 while (!quitme)
1111 // if ( (sigs & winmask) || (sigs & msgmask) )
1112 TEXT editorvarbuffer[300];
1113 struct AppMessage *appmsg;
1115 sigs = Wait(msgmask | winmask | isnmask);
1117 if (sigs & 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);
1138 if (filename)
1140 OpenDTO();
1141 FitToWindow();
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));
1149 switch (msg->Class)
1151 case IDCMP_CLOSEWINDOW:
1152 quitme = TRUE;
1153 break;
1155 case IDCMP_VANILLAKEY:
1156 D(bug("[Multiview] Vanillakey %d\n", (int)msg->Code));
1157 switch(msg->Code)
1159 case 27: /* ESC */
1160 quitme = TRUE;
1161 break;
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);
1167 break;
1169 case 9: /* TAB */
1170 if (dto_supports_next_field) DoTrigger(STM_NEXT_FIELD);
1171 else if (dto_supports_search_next) DoTrigger(STM_SEARCH_NEXT);
1172 break;
1174 case 8: /* Backspace */
1175 if (dto_supports_retrace) DoTrigger(STM_RETRACE);
1176 break;
1178 case '>':
1179 if (dto_supports_browse_next) DoTrigger(STM_BROWSE_NEXT);
1180 break;
1182 case '<':
1183 if (dto_supports_browse_prev) DoTrigger(STM_BROWSE_PREV);
1184 break;
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))
1194 DisplayBeep(NULL);
1197 break;
1199 case IDCMP_RAWKEY:
1200 switch(msg->Code)
1202 #ifdef __AROS__
1203 case RAWKEY_NM_WHEEL_UP:
1204 case RAWKEY_NM_WHEEL_DOWN:
1205 case RAWKEY_NM_WHEEL_LEFT:
1206 case RAWKEY_NM_WHEEL_RIGHT:
1207 #endif
1208 case CURSORUP:
1209 case CURSORDOWN:
1210 case CURSORRIGHT:
1211 case CURSORLEFT:
1212 ScrollTo(msg->Code, msg->Qualifier);
1213 break;
1215 #ifdef __AROS__
1216 case RAWKEY_HOME: /* HOME */
1217 ScrollTo(CURSORUP, IEQUALIFIER_LALT);
1218 break;
1220 case RAWKEY_END: /* END */
1221 ScrollTo(CURSORDOWN, IEQUALIFIER_LALT);
1222 break;
1224 case RAWKEY_PAGEUP: /* PAGE UP */
1225 ScrollTo(CURSORUP, IEQUALIFIER_LSHIFT);
1226 break;
1228 case RAWKEY_PAGEDOWN: /* PAGE DOWN */
1229 ScrollTo(CURSORDOWN, IEQUALIFIER_LSHIFT);
1230 break;
1231 #endif
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);
1239 break;
1241 } /* switch(msg->Code) */
1242 break;
1244 case IDCMP_GADGETDOWN:
1245 arrowticker = 3;
1246 activearrowgad = (struct Gadget *)msg->IAddress;
1247 switch(activearrowgad->GadgetID)
1249 case GAD_UPARROW:
1250 activearrowkind = CURSORUP;
1251 ScrollTo(CURSORUP, 0);
1252 break;
1254 case GAD_DOWNARROW:
1255 activearrowkind = CURSORDOWN;
1256 ScrollTo(CURSORDOWN, 0);
1257 break;
1259 case GAD_LEFTARROW:
1260 activearrowkind = CURSORLEFT;
1261 ScrollTo(CURSORLEFT, 0);
1262 break;
1264 case GAD_RIGHTARROW:
1265 activearrowkind = CURSORRIGHT;
1266 ScrollTo(CURSORRIGHT, 0);
1267 break;
1269 default:
1270 activearrowkind = 0;
1271 break;
1274 break;
1276 case IDCMP_INTUITICKS:
1277 if (activearrowkind)
1279 if (arrowticker)
1281 arrowticker--;
1283 else if (activearrowgad->Flags & GFLG_SELECTED)
1285 ScrollTo(activearrowkind, 0);
1288 break;
1290 case IDCMP_GADGETUP:
1291 switch(((struct Gadget *)msg->IAddress)->GadgetID)
1293 case GAD_UPARROW:
1294 case GAD_DOWNARROW:
1295 case GAD_LEFTARROW:
1296 case GAD_RIGHTARROW:
1297 activearrowkind = 0;
1298 break;
1300 break;
1302 case IDCMP_MENUPICK:
1303 men = msg->Code;
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();
1315 break;
1317 case MSG_MEN_PROJECT_SAVEAS:
1318 filename = GetFileName(MSG_ASL_SAVE_TITLE);
1319 if (filename) DoWriteMethod(filename, DTWM_RAW);
1320 break;
1322 case MSG_MEN_PROJECT_SAVEAS_IFF:
1323 filename = GetFileName(MSG_ASL_SAVE_TITLE);
1324 if (filename) DoWriteMethod(filename, DTWM_IFF);
1325 break;
1327 case MSG_MEN_PROJECT_PRINT:
1328 DoPrintMethod();
1329 break;
1331 case MSG_MEN_PROJECT_ABOUT:
1332 About();
1333 break;
1335 case MSG_MEN_PROJECT_QUIT:
1336 quitme = TRUE;
1337 break;
1339 case MSG_MEN_EDIT_MARK:
1340 #if defined(__AROS__) && !defined(__MORPHOS__)
1341 if (StartDragSelect(dto))
1342 #else
1344 struct DTSpecialInfo *si;
1347 ** ClipView example on AmigaDev CD does just the following.
1348 ** None of the checks AROS datatypes.library/StartDragSelect()
1349 ** does.
1352 si = (struct DTSpecialInfo *)(((struct Gadget *)dto)->SpecialInfo);
1353 si->si_Flags |= DTSIF_DRAGSELECT;
1355 #endif
1357 //TODO: change mouse pointer to crosshair
1359 break;
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);
1370 break;
1372 case MSG_MEN_EDIT_SELECTALL:
1373 OutputMessage(not_supported);
1374 break;
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);
1385 break;
1387 case MSG_MEN_WINDOW_SEPSCREEN:
1388 OutputMessage(not_supported);
1389 break;
1391 case MSG_MEN_WINDOW_MINIMIZE:
1392 OutputMessage(not_supported);
1393 break;
1395 case MSG_MEN_WINDOW_NORMAL:
1396 OutputMessage(not_supported);
1397 break;
1399 case MSG_MEN_WINDOW_MAXIMIZE:
1400 OutputMessage(not_supported);
1401 break;
1403 case MSG_MEN_SETTINGS_SAVEDEF:
1404 OutputMessage(not_supported);
1405 break;
1407 case MSG_MEN_PICT_ZOOM_IN:
1408 pdt_zoom++;
1409 if (pdt_zoom == -1 ) pdt_zoom = 1;
1410 DoZoom(pdt_zoom);
1411 break;
1413 case MSG_MEN_PICT_ZOOM_OUT:
1414 pdt_zoom--;
1415 if (pdt_zoom == 0 ) pdt_zoom = -2;
1416 DoZoom(pdt_zoom);
1417 break;
1419 case MSG_MEN_PICT_RESET:
1420 pdt_zoom = 1;
1421 DoZoom(pdt_zoom);
1422 break;
1424 case MSG_MEN_PICT_FIT_WIN:
1425 pdt_fit_win = (item->Flags & CHECKED) ? TRUE : FALSE;
1426 FitToWindow();
1427 DoLayout(TRUE);
1428 break;
1430 case MSG_MEN_PICT_KEEP_ASPECT:
1431 pdt_keep_aspect = (item->Flags & CHECKED) ? TRUE : FALSE;
1432 FitToWindow();
1433 DoLayout(TRUE);
1434 break;
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,
1440 TAG_DONE);
1441 DoLayout(TRUE);
1442 break;
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,
1448 TAG_DONE);
1449 DoLayout(TRUE);
1450 break;
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"));
1456 else
1457 D(bug("wordwrap disabled\n"));
1458 SetDTAttrs (dto, NULL, NULL,
1459 TDTA_WordWrap, tdt_text_wordwrap,
1460 TAG_DONE);
1461 DoLayout(TRUE);
1462 break;
1464 case MSG_MEN_TEXT_SEARCH:
1465 if (dto_supports_search) DoTrigger(STM_SEARCH);
1466 break;
1468 case MSG_MEN_TEXT_SEARCH_PREV:
1469 if (dto_supports_search_prev) DoTrigger(STM_SEARCH_PREV);
1470 break;
1472 case MSG_MEN_TEXT_SEARCH_NEXT:
1473 if (dto_supports_search_next) DoTrigger(STM_SEARCH_NEXT);
1474 break;
1476 } /* switch(GTMENUITEM_USERDATA(item)) */
1478 men = item->NextSelect;
1480 else
1482 men = MENUNULL;
1485 } /* while(men != MENUNULL) */
1486 break;
1488 case IDCMP_NEWSIZE:
1489 D(bug("IDCMP NEWSIZE\n"));
1490 FitToWindow();
1491 break;
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 */
1502 case DTA_Busy:
1503 if (tidata)
1504 SetWindowPointer (win, WA_BusyPointer, TRUE, TAG_DONE);
1505 else
1506 SetWindowPointer (win, WA_Pointer, (IPTR) NULL, TAG_DONE);
1507 break;
1509 case DTA_Title:
1510 SetWindowTitles(win, (UBYTE *)tidata, (UBYTE *)~0);
1511 break;
1513 /* Error message */
1514 case DTA_ErrorLevel:
1515 /* if (tidata)
1517 errnum = GetTagData (DTA_ErrorNumber, NULL, tags);
1518 PrintErrorMsg (errnum, (STRPTR) options[OPT_NAME]);
1520 break;
1522 /* Time to refresh */
1523 case DTA_Sync:
1524 /* Refresh the DataType object */
1525 D(bug("Multiview: DTA_SYNC\n"));
1526 RefreshDTObjects (dto, win, NULL, (IPTR) NULL);
1527 break;
1529 } /* switch (tag->ti_Tag) */
1531 } /* while ((tag = NextTagItem ((const struct TagItem **)&tstate))) */
1532 break;
1534 } /* switch (msg->Class) */
1536 ReplyMsg((struct Message *)msg);
1538 } /* while((msg = (struct IntuiMessage *)GetMsg(win->UserPort))) */
1540 } /* while (!quitme) */
1543 /*********************************************************************************************/
1545 void InitWin(void)
1547 InitDefaults();
1548 LoadFont();
1549 MakeICObjects();
1550 OpenDTO();
1551 GetVisual();
1552 MakeGadgets();
1553 menus = MakeMenus(nm);
1554 pictmenus = MakeMenus(nmpict);
1555 textmenus = MakeMenus(nmtext);
1556 SetMenuFlags();
1557 MakeWindow();
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,
1562 TAG_DONE);
1563 FitToWindow();
1566 /*********************************************************************************************/
1568 int main(int argc, char **argv)
1570 int rc;
1572 /* This is for when Cleanup() is called */
1573 rc = setjmp(exit_buf);
1574 if (rc)
1575 return rc;
1577 wincoords.MinX = 0;
1578 wincoords.MinY = 0;
1579 wincoords.MaxX = 0;
1580 wincoords.MaxY = 0;
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);
1590 InitMenus(nm);
1591 InitMenus(nmpict);
1592 InitMenus(nmtext);
1593 OpenLibs();
1595 if (argc == 0)
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;
1605 else
1607 filename = GetFileName(MSG_ASL_OPEN_TITLE);
1608 if (!filename) Cleanup(NULL);
1611 else
1613 GetArguments();
1616 InitIScreenNotify();
1617 InitWin();
1619 HandleAll();
1620 Cleanup(NULL);
1622 return 0;
1625 /*********************************************************************************************/