prism2.device: Compiler delint
[AROS.git] / workbench / utilities / MultiView / misc.c
blob30ed95698f1d2ec2f8adb929f55af79d1e0c564d
1 /*
2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 /*********************************************************************************************/
8 #include "global.h"
9 #include "version.h"
11 #include <string.h>
13 #include "compilerspecific.h"
14 #include "debug.h"
16 /*********************************************************************************************/
18 static struct MenuItem * FindMenuItem( struct Menu *menu, ULONG msgid );
19 static void ChangeItemState( ULONG msgid, BOOL state );
20 static void SetItemChecked( ULONG msgid, BOOL state );
22 /*********************************************************************************************/
24 struct NewMenu nm[] =
26 {NM_TITLE, (STRPTR)MSG_MEN_PROJECT }, /* 0 */
27 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_OPEN },
28 {NM_ITEM, NM_BARLABEL },
29 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_SAVEAS },
30 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_SAVEAS_IFF },
31 {NM_ITEM, NM_BARLABEL },
32 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_PRINT },
33 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_ABOUT },
34 {NM_ITEM, NM_BARLABEL },
35 {NM_ITEM, (STRPTR)MSG_MEN_PROJECT_QUIT },
36 {NM_TITLE, (STRPTR)MSG_MEN_EDIT }, /* 1 */
37 {NM_ITEM, (STRPTR)MSG_MEN_EDIT_MARK },
38 {NM_ITEM, (STRPTR)MSG_MEN_EDIT_COPY },
39 {NM_ITEM, NM_BARLABEL },
40 {NM_ITEM, (STRPTR)MSG_MEN_EDIT_SELECTALL },
41 {NM_ITEM, (STRPTR)MSG_MEN_EDIT_CLEARSELECTED },
42 {NM_TITLE, (STRPTR)MSG_MEN_WINDOW }, /* 2 */
43 {NM_ITEM, (STRPTR)MSG_MEN_WINDOW_SEPSCREEN , 0, CHECKIT | MENUTOGGLE },
44 {NM_ITEM, NM_BARLABEL },
45 {NM_ITEM, (STRPTR)MSG_MEN_WINDOW_MINIMIZE },
46 {NM_ITEM, (STRPTR)MSG_MEN_WINDOW_NORMAL },
47 {NM_ITEM, (STRPTR)MSG_MEN_WINDOW_MAXIMIZE },
48 {NM_TITLE, (STRPTR)MSG_MEN_SETTINGS }, /* 3 */
49 {NM_ITEM, (STRPTR)MSG_MEN_SETTINGS_SAVEDEF },
50 {NM_END}
53 struct NewMenu nmpict[] =
55 {NM_TITLE, (STRPTR)MSG_MEN_PICT },
56 {NM_ITEM, (STRPTR)MSG_MEN_PICT_ZOOM_IN },
57 {NM_ITEM, (STRPTR)MSG_MEN_PICT_ZOOM_OUT },
58 {NM_ITEM, (STRPTR)MSG_MEN_PICT_RESET },
59 {NM_ITEM, NM_BARLABEL },
60 {NM_ITEM, (STRPTR)MSG_MEN_PICT_FIT_WIN , 0, CHECKIT | MENUTOGGLE },
61 {NM_ITEM, (STRPTR)MSG_MEN_PICT_KEEP_ASPECT , 0, CHECKIT | MENUTOGGLE },
62 {NM_ITEM, NM_BARLABEL },
63 {NM_ITEM, (STRPTR)MSG_MEN_PICT_FORCE_MAP , 0, CHECKIT | MENUTOGGLE },
64 {NM_ITEM, (STRPTR)MSG_MEN_PICT_DITHER , 0, CHECKIT | MENUTOGGLE | CHECKED },
65 {NM_END}
68 struct NewMenu nmtext[] =
70 {NM_TITLE, (STRPTR)MSG_MEN_TEXT },
71 {NM_ITEM, (STRPTR)MSG_MEN_TEXT_WORDWRAP , 0, CHECKIT | MENUTOGGLE },
72 {NM_ITEM, (STRPTR)MSG_MEN_TEXT_SEARCH },
73 {NM_ITEM, (STRPTR)MSG_MEN_TEXT_SEARCH_PREV },
74 {NM_ITEM, (STRPTR)MSG_MEN_TEXT_SEARCH_NEXT },
75 {NM_END}
78 /*********************************************************************************************/
80 static struct MenuItem * FindMenuItem( struct Menu *menu, ULONG msgid )
82 struct MenuItem *item;
84 while( menu )
86 if( (IPTR)GTMENU_USERDATA(menu) == msgid )
87 return (struct MenuItem *)menu;
88 item = menu->FirstItem;
89 while( item )
91 if( (IPTR)GTMENUITEM_USERDATA(item) == msgid )
92 return item;
93 item = item->NextItem;
95 menu = menu->NextMenu;
97 return NULL;
100 /*********************************************************************************************/
102 static void ChangeItemState( ULONG msgid, BOOL state )
104 struct MenuItem *item;
106 item = FindMenuItem(menus, msgid);
107 if (item)
109 if (state) item->Flags |= ITEMENABLED; else item->Flags &= ~ITEMENABLED;
113 /*********************************************************************************************/
115 static void SetItemChecked( ULONG msgid, BOOL state )
117 struct MenuItem *item;
119 item = FindMenuItem(menus, msgid);
120 if (item)
122 if (state) item->Flags |= CHECKED; else item->Flags &= ~CHECKED;
126 /*********************************************************************************************/
128 void InitMenus(struct NewMenu *newm)
130 struct NewMenu *actnm;
132 for(actnm = newm; actnm->nm_Type != NM_END; actnm++)
134 if (actnm->nm_Label != NM_BARLABEL)
136 ULONG id = (IPTR)actnm->nm_Label;
137 CONST_STRPTR str = MSG(id);
139 if (actnm->nm_Type == NM_TITLE)
141 actnm->nm_Label = str;
142 } else {
143 actnm->nm_Label = str + 2;
144 if (str[0] != ' ') actnm->nm_CommKey = str;
146 actnm->nm_UserData = (APTR)(IPTR)id;
148 } /* if (actnm->nm_Label != NM_BARLABEL) */
150 } /* for(actnm = nm; nm->nm_Type != NM_END; nm++) */
154 /*********************************************************************************************/
156 struct Menu * MakeMenus(struct NewMenu *newm)
158 struct Menu *menu;
159 struct TagItem menu_tags[] =
161 {GTMN_NewLookMenus, TRUE},
162 {TAG_DONE }
165 menu = CreateMenusA(newm, NULL);
166 if (!menu) Cleanup(MSG(MSG_CANT_CREATE_MENUS));
168 if (!LayoutMenusA(menu, vi, menu_tags))
170 FreeMenus(menu);
171 Cleanup(MSG(MSG_CANT_CREATE_MENUS));
173 return menu;
176 /*********************************************************************************************/
178 void KillMenus(void)
180 if (win) ClearMenuStrip(win);
181 if (menus) FreeMenus(menus);
182 if (pictmenus) FreeMenus(pictmenus);
183 if (textmenus) FreeMenus(textmenus);
185 menus = NULL;
186 pictmenus = NULL;
187 textmenus = NULL;
190 /*********************************************************************************************/
192 void SetMenuFlags(void)
194 struct Menu *menu;
195 struct MenuItem *item;
196 IPTR val;
197 BOOL ret;
199 if (win) ClearMenuStrip(win);
201 ChangeItemState( MSG_MEN_PROJECT_SAVEAS, dto_supports_write );
202 ChangeItemState( MSG_MEN_PROJECT_SAVEAS_IFF, dto_supports_write_iff );
203 ChangeItemState( MSG_MEN_PROJECT_PRINT, dto_supports_print );
204 ChangeItemState( MSG_MEN_EDIT_COPY, dto_supports_copy );
205 ChangeItemState( MSG_MEN_EDIT_SELECTALL, dto_supports_selectall );
206 ChangeItemState( MSG_MEN_EDIT_CLEARSELECTED, dto_supports_clearselected );
208 item = FindMenuItem(menus, MSG_MEN_SETTINGS); /* Search last menu, then append dt group dependent menu */
209 menu = (struct Menu *)item;
210 if (menu)
212 if (dto_subclass_gid == GID_PICTURE)
214 D(bug("Multiview: is picture.datatype\n"));
215 menu->NextMenu = pictmenus;
216 SetItemChecked( MSG_MEN_PICT_FIT_WIN, pdt_fit_win );
217 SetItemChecked( MSG_MEN_PICT_KEEP_ASPECT, pdt_keep_aspect );
218 SetItemChecked( MSG_MEN_PICT_FORCE_MAP, pdt_force_map );
219 SetItemChecked( MSG_MEN_PICT_DITHER, pdt_pict_dither );
221 else if (dto_subclass_gid == GID_TEXT)
223 D(bug("Multiview: is text.datatype\n"));
224 menu->NextMenu = textmenus;
225 ret = GetDTAttrs(dto, TDTA_WordWrap, (IPTR)&val, TAG_DONE);
226 item = FindMenuItem(menus, MSG_MEN_TEXT_WORDWRAP);
227 if (ret && item)
229 if (val) item->Flags |= CHECKED; else item->Flags &= ~CHECKED;
231 SetItemChecked( MSG_MEN_TEXT_WORDWRAP, tdt_text_wordwrap );
232 ChangeItemState( MSG_MEN_TEXT_WORDWRAP, ret );
233 ChangeItemState( MSG_MEN_TEXT_SEARCH, dto_supports_search );
234 ChangeItemState( MSG_MEN_TEXT_SEARCH_PREV, dto_supports_search_prev );
235 ChangeItemState( MSG_MEN_TEXT_SEARCH_NEXT, dto_supports_search_next );
237 else
239 D(bug("Multiview: is unknown datatype\n"));
240 menu->NextMenu = NULL;
245 struct TagItem menu_tags[] =
247 {GTMN_NewLookMenus, TRUE},
248 {TAG_DONE }
251 LayoutMenusA(menus, vi, menu_tags);
254 if (win) SetMenuStrip(win, menus);
257 /*********************************************************************************************/
259 STRPTR GetFileName(ULONG msgtextid)
261 static UBYTE pathbuffer[300];
262 static UBYTE filebuffer[300];
263 struct FileRequester *req;
264 STRPTR filepart, retval = NULL;
266 AslBase = OpenLibrary("asl.library", 39);
267 if (AslBase)
269 filebuffer[299] = 0;
270 pathbuffer[299] = 0;
272 strncpy(filebuffer, FilePart(filenamebuffer), 299);
273 strncpy(pathbuffer, filenamebuffer, 299);
274 filepart = FilePart(pathbuffer);
275 *filepart = 0;
277 req = AllocAslRequestTags(ASL_FileRequest, ASLFR_TitleText , (IPTR)MSG(msgtextid),
278 ASLFR_DoPatterns , TRUE ,
279 ASLFR_InitialPattern, "~(#?.info)" ,
280 ASLFR_InitialDrawer , (IPTR)pathbuffer ,
281 ASLFR_InitialFile , (IPTR)filebuffer ,
282 ASLFR_Window , (IPTR)win ,
283 TAG_DONE);
284 if (req)
286 if (AslRequest(req, NULL))
288 strncpy(filebuffer, req->fr_Drawer, 299);
289 AddPart(filebuffer, req->fr_File, 299);
291 retval = filebuffer;
293 } /* if (AslRequest(req, NULL) */
295 FreeAslRequest(req);
297 } /* if (req) */
299 CloseLibrary(AslBase);
301 } /* if (AslBase) */
303 return retval;
306 /*********************************************************************************************/
308 void About(void)
310 struct DataType *dt = NULL;
311 struct EasyStruct es;
312 STRPTR gid_string = NULL;
313 STRPTR name_string = NULL;
314 STRPTR sp;
315 WORD i;
316 UBYTE dtver_string[100];
318 if (GetDTAttrs(dto, DTA_DataType, (IPTR)&dt, TAG_DONE))
320 if (dt)
322 gid_string = (STRPTR) GetDTString(dt->dtn_Header->dth_GroupID);
323 name_string = dt->dtn_Header->dth_Name;
327 if (!gid_string) gid_string = "";
328 if (!name_string) name_string = "";
330 for(sp = DataTypesBase->lib_IdString;
331 (*sp != 0) && ((*sp < '0') || (*sp > '9'));
332 sp++)
336 i = 0;
337 while ((*sp != 0) && (*sp != '\r') && (*sp != '\n') && (i < 99))
339 dtver_string[i++] = *sp++;
341 dtver_string[i++] = '\0';
343 es.es_StructSize = sizeof(es);
344 es.es_Flags = 0;
345 es.es_Title = MSG(MSG_ABOUT_TITLE);
346 es.es_TextFormat = MSG(MSG_ABOUT);
347 es.es_GadgetFormat = MSG(MSG_CONTINUE);
349 EasyRequest(win, &es, NULL, (IPTR)VERSION,
350 (IPTR)REVISION,
351 (IPTR)DATESTR,
352 (IPTR)dtver_string,
353 (IPTR)name_string,
354 (IPTR)gid_string);
358 /*********************************************************************************************/
360 ULONG DoTrigger(ULONG what)
362 struct dtTrigger msg;
364 msg.MethodID = DTM_TRIGGER;
365 msg.dtt_GInfo = NULL;
366 msg.dtt_Function = what;
367 msg.dtt_Data = NULL;
369 return DoDTMethodA(dto, win, NULL, (Msg)&msg);
372 /*********************************************************************************************/
374 ULONG DoWriteMethod(STRPTR name, ULONG mode)
376 struct dtWrite msg;
377 BPTR fh;
378 ULONG retval;
380 fh = BNULL;
381 if (name)
383 fh = Open( name, MODE_NEWFILE );
384 if (!fh)
386 D(bug("Multiview: Cannot open %s\n", name));
387 OutputMessage(MSG(MSG_SAVE_FAILED));
388 return FALSE;
394 msg.MethodID = DTM_WRITE;
395 msg.dtw_GInfo = NULL;
396 msg.dtw_FileHandle = fh;
397 msg.dtw_Mode = mode;
398 msg.dtw_AttrList = NULL;
400 D(bug("Multiview: Saving %s mode %ld\n", name ? name : (STRPTR)"[nothing]", mode));
401 retval = DoDTMethodA(dto, win, NULL, (Msg)&msg);
402 if (fh)
404 Close( fh );
405 if( !retval )
407 D(bug("Multiview: Error during write !\n"));
408 OutputMessage(MSG(MSG_SAVE_FAILED));
411 return retval;
414 /*********************************************************************************************/
416 ULONG DoPrintMethod(VOID)
418 struct dtPrint msg;
419 struct MsgPort *mp;
420 struct IORequest *pio;
421 ULONG retval = PDERR_CANCEL;
423 if ((mp = CreateMsgPort())) {
424 if ((pio = CreateIORequest(mp, sizeof(union printerIO)))) {
425 if (0 == OpenDevice("printer.device", 0, pio, 0)) {
426 ULONG IDCMPFlags;
428 msg.MethodID = DTM_PRINT;
429 msg.dtp_GInfo = NULL;
430 msg.dtp_PIO = (union printerIO *)pio;
431 msg.dtp_AttrList = NULL;
432 D(bug("Multiview: Printing...\n"));
434 /* We're not using PrintDTObjectA() here at this
435 * time, because we don't plan on waiting for the
436 * IDCMP_IDCMPUPDATE (DTA_PrinterStatus) message.
438 * So we just use the busy pointer while printing.
440 IDCMPFlags = win->IDCMPFlags;
441 ModifyIDCMP(win, 0);
442 SetWindowPointer(win, WA_BusyPointer, TRUE);
443 retval = DoDTMethodA(dto, win, NULL, (Msg)&msg);
444 ModifyIDCMP(win, IDCMPFlags);
445 ClearPointer(win);
447 CloseDevice(pio);
449 DeleteIORequest(pio);
451 DeleteMsgPort(mp);
454 return retval;
457 /*********************************************************************************************/
459 ULONG DoLayout(ULONG initial)
461 ULONG res;
462 struct gpLayout msg;
464 D(bug("=> erase\n"));
465 EraseRect(win->RPort, win->BorderLeft,
466 win->BorderTop,
467 win->Width - 1 - win->BorderRight,
468 win->Height - 1 - win->BorderBottom);
470 #if 1
471 msg.MethodID = GM_LAYOUT;
472 msg.gpl_GInfo = NULL;
473 msg.gpl_Initial = initial;
475 #if 0
476 D(bug("=> doasynclayout libcall\n"));
477 res = DoAsyncLayout(dto, &msg);
478 #else
479 D(bug("=> GM_Layout method\n"));
480 res = DoDTMethodA(dto, win, 0, (Msg)&msg);
481 #endif
482 D(bug("layout result %ld\n", res));
483 return res;
484 #else
485 RemoveDTObject(win, dto);
486 AddDTObject(win, NULL, dto, -1);
487 #endif
490 /*********************************************************************************************/
492 ULONG DoScaleMethod(ULONG xsize, ULONG ysize, BOOL aspect)
494 #ifdef __GNUC__
495 struct pdtScale msg;
497 D(bug(" scale width %d height %d\n", xsize, ysize));
498 msg.MethodID = PDTM_SCALE;
499 msg.ps_NewWidth = xsize;
500 msg.ps_NewHeight = ysize;
501 msg.ps_Flags = aspect ? PScale_KeepAspect : 0;
502 // D(bug("- method %08lx newwidth %ld newheight %ld flags %08lx\n", msg.MethodID, msg.ps_NewWidth, msg.ps_NewHeight, msg.ps_Flags));
504 return DoMethodA(dto, (Msg)&msg);
505 #else
506 return 0;
507 #endif
510 /*********************************************************************************************/
512 void DoZoom(WORD zoomer)
514 UWORD curwidth, curheight;
516 if (zoomer > 0)
518 curwidth = pdt_origwidth * zoomer;
519 curheight = pdt_origheight * zoomer;
521 else
523 curwidth = pdt_origwidth / -zoomer;
524 curheight = pdt_origheight / -zoomer;
526 D(bug(" zoom %d width %d height %d\n", zoomer, curwidth, curheight));
527 DoScaleMethod(curwidth, curheight, 0);
528 DoLayout(TRUE);
531 /*********************************************************************************************/