2 Copyright © 1995-2009, The AROS Development Team. All rights reserved.
6 /*********************************************************************************************/
13 #include "compilerspecific.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 /*********************************************************************************************/
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
},
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
},
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
},
78 /*********************************************************************************************/
80 static struct MenuItem
* FindMenuItem( struct Menu
*menu
, ULONG msgid
)
82 struct MenuItem
*item
;
86 if( (IPTR
)GTMENU_USERDATA(menu
) == msgid
)
87 return (struct MenuItem
*)menu
;
88 item
= menu
->FirstItem
;
91 if( (IPTR
)GTMENUITEM_USERDATA(item
) == msgid
)
93 item
= item
->NextItem
;
95 menu
= menu
->NextMenu
;
100 /*********************************************************************************************/
102 static void ChangeItemState( ULONG msgid
, BOOL state
)
104 struct MenuItem
*item
;
106 item
= FindMenuItem(menus
, msgid
);
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
);
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
;
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
)
159 struct TagItem menu_tags
[] =
161 {GTMN_NewLookMenus
, TRUE
},
165 menu
= CreateMenusA(newm
, NULL
);
166 if (!menu
) Cleanup(MSG(MSG_CANT_CREATE_MENUS
));
168 if (!LayoutMenusA(menu
, vi
, menu_tags
))
171 Cleanup(MSG(MSG_CANT_CREATE_MENUS
));
176 /*********************************************************************************************/
180 if (win
) ClearMenuStrip(win
);
181 if (menus
) FreeMenus(menus
);
182 if (pictmenus
) FreeMenus(pictmenus
);
183 if (textmenus
) FreeMenus(textmenus
);
190 /*********************************************************************************************/
192 void SetMenuFlags(void)
195 struct MenuItem
*item
;
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
;
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
);
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
);
239 D(bug("Multiview: is unknown datatype\n"));
240 menu
->NextMenu
= NULL
;
245 struct TagItem menu_tags
[] =
247 {GTMN_NewLookMenus
, TRUE
},
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);
272 strncpy(filebuffer
, FilePart(filenamebuffer
), 299);
273 strncpy(pathbuffer
, filenamebuffer
, 299);
274 filepart
= FilePart(pathbuffer
);
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
,
286 if (AslRequest(req
, NULL
))
288 strncpy(filebuffer
, req
->fr_Drawer
, 299);
289 AddPart(filebuffer
, req
->fr_File
, 299);
293 } /* if (AslRequest(req, NULL) */
299 CloseLibrary(AslBase
);
306 /*********************************************************************************************/
310 struct DataType
*dt
= NULL
;
311 struct EasyStruct es
;
312 STRPTR gid_string
= NULL
;
313 STRPTR name_string
= NULL
;
316 UBYTE dtver_string
[100];
318 if (GetDTAttrs(dto
, DTA_DataType
, (IPTR
)&dt
, TAG_DONE
))
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'));
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
);
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
,
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
;
369 return DoDTMethodA(dto
, win
, NULL
, (Msg
)&msg
);
372 /*********************************************************************************************/
374 ULONG
DoWriteMethod(STRPTR name
, ULONG mode
)
383 fh
= Open( name
, MODE_NEWFILE
);
386 D(bug("Multiview: Cannot open %s\n", name
));
387 OutputMessage(MSG(MSG_SAVE_FAILED
));
394 msg
.MethodID
= DTM_WRITE
;
395 msg
.dtw_GInfo
= NULL
;
396 msg
.dtw_FileHandle
= fh
;
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
);
407 D(bug("Multiview: Error during write !\n"));
408 OutputMessage(MSG(MSG_SAVE_FAILED
));
414 /*********************************************************************************************/
416 ULONG
DoPrintMethod(VOID
)
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)) {
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
;
442 SetWindowPointer(win
, WA_BusyPointer
, TRUE
);
443 retval
= DoDTMethodA(dto
, win
, NULL
, (Msg
)&msg
);
444 ModifyIDCMP(win
, IDCMPFlags
);
449 DeleteIORequest(pio
);
457 /*********************************************************************************************/
459 ULONG
DoLayout(ULONG initial
)
464 D(bug("=> erase\n"));
465 EraseRect(win
->RPort
, win
->BorderLeft
,
467 win
->Width
- 1 - win
->BorderRight
,
468 win
->Height
- 1 - win
->BorderBottom
);
471 msg
.MethodID
= GM_LAYOUT
;
472 msg
.gpl_GInfo
= NULL
;
473 msg
.gpl_Initial
= initial
;
476 D(bug("=> doasynclayout libcall\n"));
477 res
= DoAsyncLayout(dto
, &msg
);
479 D(bug("=> GM_Layout method\n"));
480 res
= DoDTMethodA(dto
, win
, 0, (Msg
)&msg
);
482 D(bug("layout result %ld\n", res
));
485 RemoveDTObject(win
, dto
);
486 AddDTObject(win
, NULL
, dto
, -1);
490 /*********************************************************************************************/
492 ULONG
DoScaleMethod(ULONG xsize
, ULONG ysize
, BOOL aspect
)
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
);
510 /*********************************************************************************************/
512 void DoZoom(WORD zoomer
)
514 UWORD curwidth
, curheight
;
518 curwidth
= pdt_origwidth
* zoomer
;
519 curheight
= pdt_origheight
* zoomer
;
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);
531 /*********************************************************************************************/