2 Copyright © 2003-2011, The AROS Development Team. All rights reserved.
6 // #define MUIMASTER_YES_INLINE_STDARG
9 #include <zune/customclasses.h>
10 #include <zune/prefseditor.h>
12 #include <proto/alib.h>
13 #include <proto/codesets.h>
14 #include <proto/intuition.h>
15 #include <proto/utility.h>
16 #include <proto/muimaster.h>
18 #include <aros/debug.h>
23 #include "registertab.h"
24 #include "page_language.h"
26 /*** Instance Data **********************************************************/
43 char **strings_available
;
44 char **strings_preferred
;
45 STRPTR
*strings_charsets
;
47 char *result
[10]; /* result array for Gadget2Prefs */
50 struct MUI_CustomClass
*Language_CLASS
;
52 static struct Hook hook_available
;
53 static struct Hook hook_preferred
;
54 static struct Hook hook_clear
;
56 /*** Helpers *****************************************************************/
58 STATIC VOID
update_language_lists(struct Language_DATA
*data
)
60 struct LanguageEntry
*entry
;
66 ForeachNode(&language_list
, entry
)
70 data
->strings_preferred
[p
] = entry
->lve
.name
;
75 data
->strings_available
[a
] = entry
->lve
.name
;
79 data
->strings_available
[a
] = NULL
;
80 data
->strings_preferred
[p
] = NULL
;
83 STATIC VOID
init_language_lists(struct Language_DATA
*data
)
86 struct LanguageEntry
*entry
;
89 data
->nr_languages
= 0;
90 ForeachNode(&language_list
, entry
)
92 D(bug("entry->lve.name: %s\n",entry
->lve
.name
));
93 entry
->preferred
= FALSE
;
95 D(bug("[language class] language %s\n",entry
->lve
.name
));
96 while (i
< 10 && /* max 10 preferred langs, see prefs/locale.h */
97 entry
->preferred
== FALSE
&&
98 localeprefs
.lp_PreferredLanguages
[i
][0])
101 if (Stricmp(localeprefs
.lp_PreferredLanguages
[i
], entry
->lve
.name
) == 0)
103 D(bug("[language class] %s is preferred\n",
105 entry
->preferred
= TRUE
;
109 data
->nr_languages
++;
112 D(bug("[language class]: nr of languages: %d\n",data
->nr_languages
));
114 data
->strings_available
= AllocVec(sizeof(char *) * (data
->nr_languages
+1), MEMF_CLEAR
);
115 data
->strings_preferred
= AllocVec(sizeof(char *) * (data
->nr_languages
+1), MEMF_CLEAR
);
117 update_language_lists(data
);
120 /*** Hooks ******************************************************************
122 * hook_func_available
123 * handles double clicks on the available languages
125 * hook_func_preferred
126 * handles double clicks on the preferred languages
129 * handles clearing of preferred languages
131 ****************************************************************************/
133 STATIC VOID
func_move_to_selected(char* selstr
, struct Language_DATA
*data
)
135 struct LanguageEntry
*entry
;
139 D(bug("func_move_to_selected(%s,..)\n",selstr
));
142 ForeachNode(&language_list
, entry
)
144 if (stricmp(selstr
, entry
->lve
.name
) == 0)
146 DoMethod(data
->preferred
,
147 MUIM_List_InsertSingle
, entry
->lve
.name
,
148 MUIV_List_Insert_Bottom
);
150 entry
->preferred
= TRUE
;
156 * DoMethod(data->available,MUIM_List_Remove, MUIV_List_Remove_Active);
157 * of course, but I also want to be able to use that for
161 GET(data
->available
,MUIA_List_Entries
,&i
);
165 DoMethod(data
->available
, MUIM_List_GetEntry
, i
, &test
);
166 if (stricmp(selstr
, test
) == 0)
168 DoMethod(data
->available
, MUIM_List_Remove
, i
);
176 void, hook_func_available
,
177 AROS_UFHA(struct Hook
*, hook
, A0
),
178 AROS_UFHA(APTR
, obj
, A2
)
183 struct Language_DATA
*data
= hook
->h_Data
;
186 D(bug("[register class] hook_func_available\n"));
188 DoMethod(obj
,MUIM_List_GetEntry
,
189 MUIV_List_GetEntry_Active
, &selstr
);
191 func_move_to_selected(selstr
, data
);
198 void, hook_func_preferred
,
199 AROS_UFHA(struct Hook
*, hook
, A0
),
200 AROS_UFHA(APTR
, obj
, A2
)
205 struct Language_DATA
*data
= hook
->h_Data
;
207 struct LanguageEntry
*entry
;
209 D(bug("[register class] hook_func_preferred\n"));
211 DoMethod(obj
,MUIM_List_GetEntry
,
212 MUIV_List_GetEntry_Active
, &selstr
);
216 D(bug("move: %s\n",selstr
));
218 ForeachNode(&language_list
, entry
)
220 if (strcmp(selstr
, entry
->lve
.name
) == 0)
222 DoMethod(data
->available
,
223 MUIM_List_InsertSingle
, entry
->lve
.name
,
224 MUIV_List_Insert_Sorted
);
225 entry
->preferred
= FALSE
;
228 DoMethod(obj
, MUIM_List_Remove
, MUIV_List_Remove_Active
);
234 STATIC VOID
func_clear(struct Language_DATA
*data
)
236 struct LanguageEntry
*entry
;
238 D(bug("[register class] func_clear\n"));
241 DoMethod(data
->preferred
, MUIM_List_Clear
);
243 /* add all old preferred languages again */
244 DoMethod(data
->available
, MUIM_Group_InitChange
);
245 ForeachNode(&language_list
, entry
)
249 entry
->preferred
= FALSE
;
250 DoMethod(data
->available
,
251 MUIM_List_InsertSingle
, entry
->lve
.name
,
252 MUIV_List_Insert_Bottom
);
255 DoMethod(data
->available
, MUIM_List_Sort
);
256 DoMethod(data
->available
, MUIM_Group_ExitChange
);
261 void, hook_func_clear
,
262 AROS_UFHA(struct Hook
*, hook
, A0
),
263 AROS_UFHA(APTR
*, obj
, A2
)
268 struct Language_DATA
*data
= hook
->h_Data
;
277 void, charset_popup_to_string
,
278 AROS_UFHA(struct Hook
*, hook
, A0
),
279 AROS_UFHA(Object
*, list
, A2
),
280 AROS_UFHA(Object
*, string
, A1
)
288 GetAttr(MUIA_Text_Contents
, string
, (IPTR
*)&oldentry
);
289 DoMethod(list
, MUIM_List_GetEntry
, MUIV_List_GetEntry_Active
, (IPTR
)&listentry
);
290 if (strcmp(listentry
, oldentry
))
292 SetAttrs(string
, MUIA_Text_Contents
, listentry
, TAG_DONE
);
293 SetAttrs(hook
->h_Data
, MUIA_PrefsEditor_Changed
, TRUE
, TAG_DONE
);
301 ULONG
, charset_string_to_popup
,
302 AROS_UFHA(struct Hook
*, hook
, A0
),
303 AROS_UFHA(Object
*, list
, A2
),
304 AROS_UFHA(Object
*, str
, A1
)
309 STRPTR strtext
, listentry
;
312 GetAttr(MUIA_Text_Contents
, str
, (IPTR
*)&strtext
);
314 for(index
= 0; ; index
++)
316 DoMethod(list
, MUIM_List_GetEntry
, index
, (IPTR
)&listentry
);
320 SET(list
, MUIA_List_Active
, MUIV_List_Active_Off
);
324 if (stricmp(strtext
, listentry
) == 0)
326 SET(list
, MUIA_List_Active
, index
);
336 static struct Hook charset_popup_to_string_hook
=
339 (HOOKFUNC
)AROS_ASMSYMNAME(charset_popup_to_string
),
344 static struct Hook charset_string_to_popup_hook
=
347 (HOOKFUNC
)AROS_ASMSYMNAME(charset_string_to_popup
),
352 /*** Methods ****************************************************************
356 static void free_strings(struct Language_DATA
*data
)
358 if (data
->strings_charsets
)
360 CodesetsFreeA(data
->strings_charsets
, NULL
);
361 data
->strings_charsets
= NULL
;
363 if(data
->strings_available
)
365 FreeVec(data
->strings_available
);
366 data
->strings_available
= NULL
;
369 if(data
->strings_preferred
)
371 FreeVec(data
->strings_preferred
);
372 data
->strings_preferred
= NULL
;
377 static Object
*handle_New_error(Object
*obj
, struct IClass
*cl
, char *error
)
379 struct Language_DATA
*data
;
382 D(bug("[Language class] %s\n"));
387 data
= INST_DATA(cl
, obj
);
391 DisposeObject(data
->clear
);
397 DisposeObject(data
->available
);
398 data
->available
=NULL
;
403 DisposeObject(data
->preferred
);
404 data
->preferred
= NULL
;
409 DisposeObject(data
->child
);
414 DisposeObject(data
->charset
);
415 data
->charset
= NULL
;
419 DisposeObject(data
->cslist
);
423 if (data
->cslistview
) {
424 DisposeObject(data
->cslistview
);
429 DisposeObject(data
->popup
);
435 CoerceMethod(cl
, obj
, OM_DISPOSE
);
439 Object
*Language__OM_NEW(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
441 struct Language_DATA
*data
;
442 struct TagItem
*tstate
, *tag
;
444 D(bug("[language class] Language Class New\n"));
447 * we create self first and then create the child,
448 * so we have self->data available already
451 obj
= (Object
*) DoSuperNewTags
459 return handle_New_error(obj
, cl
, "ERROR: Unable to create object!\n");
462 data
= INST_DATA(cl
, obj
);
464 tstate
=((struct opSet
*)msg
)->ops_AttrList
;
465 while ((tag
= (struct TagItem
*) NextTagItem((APTR
) &tstate
)))
470 data
->prefs
= (Object
*) tag
->ti_Data
;
476 return handle_New_error(obj
, cl
, "ERROR: MA_PrefsObject not supplied!\n");
478 init_language_lists(data
);
479 data
->strings_charsets
= CodesetsSupportedA(NULL
);
481 data
->clear
= MUI_MakeObject(MUIO_Button
, __(MSG_GAD_CLEAR_LANGUAGES
));
483 data
->available
= ListviewObject
, MUIA_Listview_List
,
486 MUIA_List_SourceArray
, data
->strings_available
,
490 data
->preferred
= ListviewObject
, MUIA_Listview_List
,
493 MUIA_List_SourceArray
, data
->strings_preferred
,
497 data
->charset
= TextObject
,
499 MUIA_Background
, MUII_TextBack
,
502 data
->cslist
= ListObject
,
503 MUIA_Frame
, MUIV_Frame_InputList
,
504 MUIA_Background
, MUII_ListBack
,
505 MUIA_List_AutoVisible
, TRUE
,
506 MUIA_List_SourceArray
, data
->strings_charsets
,
509 data
->cslistview
= ListviewObject
,
510 MUIA_Listview_List
, data
->cslist
,
513 charset_popup_to_string_hook
.h_Data
= data
->prefs
;
515 data
->popup
= PopobjectObject
,
516 MUIA_Popobject_Object
, data
->cslistview
,
517 MUIA_Popobject_StrObjHook
, &charset_string_to_popup_hook
,
518 MUIA_Popobject_ObjStrHook
, &charset_popup_to_string_hook
,
519 MUIA_Popstring_Button
, PopButton(MUII_PopUp
),
520 MUIA_Popstring_String
, data
->charset
,
523 if(!data
->clear
|| !data
->available
|| !data
->preferred
|| !data
->charset
|| !data
->cslist
||
524 !data
->cslistview
|| !data
->popup
)
525 return handle_New_error(obj
,cl
,"ERROR: MakeObject failed\n");
527 DoMethod(data
->cslist
, MUIM_List_Sort
);
528 DoMethod(data
->cslist
, MUIM_List_InsertSingle
, _(MSG_NOT_SPECIFIED
), MUIV_List_Insert_Top
);
530 data
->child
= VGroup
,
532 Child
, VGroup
, /* Available Languages */
533 Child
, CLabel1(_(MSG_GAD_AVAIL_LANGUAGES
)),
534 Child
, data
->available
,
536 Child
, VGroup
, /* Preferred Languages */
537 Child
, CLabel1(_(MSG_GAD_PREF_LANGUAGES
)),
538 Child
, data
->preferred
,
543 Child
, CLabel1(_(MSG_CHARACTER_SET
)),
549 return handle_New_error(obj
, cl
, "ERROR: create child failed\n");
552 DoMethod(obj
, OM_ADDMEMBER
, data
->child
);
555 DoMethod(data
->cslistview
, MUIM_Notify
, MUIA_Listview_DoubleClick
, TRUE
, data
->popup
, 2, MUIM_Popstring_Close
, TRUE
);
558 hook_available
.h_Entry
= (HOOKFUNC
) hook_func_available
;
559 hook_available
.h_Data
= data
;
562 data
->available
, MUIM_Notify
, MUIA_Listview_DoubleClick
, MUIV_EveryTime
, data
->available
,
563 2, MUIM_CallHook
, (IPTR
) &hook_available
566 hook_preferred
.h_Entry
= (HOOKFUNC
) hook_func_preferred
;
567 hook_preferred
.h_Data
= data
;
570 data
->preferred
, MUIM_Notify
, MUIA_Listview_DoubleClick
, MUIV_EveryTime
, data
->preferred
,
571 2, MUIM_CallHook
, (IPTR
) &hook_preferred
575 hook_clear
.h_Entry
= (HOOKFUNC
) hook_func_clear
;
576 hook_clear
.h_Data
= data
;
579 data
->clear
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
, data
->preferred
,
580 2, MUIM_CallHook
, (IPTR
) &hook_clear
586 data
->preferred
, MUIM_Notify
, MUIA_Listview_DoubleClick
, MUIV_EveryTime
, (IPTR
) data
->prefs
,
587 3, MUIM_Set
, MUIA_PrefsEditor_Changed
, TRUE
591 data
->available
, MUIM_Notify
, MUIA_Listview_DoubleClick
, MUIV_EveryTime
, (IPTR
) data
->prefs
,
592 3, MUIM_Set
, MUIA_PrefsEditor_Changed
, TRUE
598 /*** Get ******************************************************************/
600 static IPTR
Language__OM_GET(struct IClass
*cl
, Object
*obj
, struct opGet
*msg
)
602 struct Language_DATA
*data
= INST_DATA(cl
, obj
);
606 switch (msg
->opg_AttrID
)
608 case MUIA_Language_Preferred
: /* return array of preferred language strings */
609 for (i
= 0; i
< 10; i
++)
611 DoMethod(data
->preferred
, MUIM_List_GetEntry
, i
, &data
->result
[i
]);
613 rc
= (IPTR
) data
->result
;
615 case MUIA_Language_Characterset
:
616 GetAttr(MUIA_List_Active
, data
->cslist
, (IPTR
*)&i
);
617 D(bug("[Language::Get] Active character set entry is %d\n", i
));
618 if ((i
== 0) || (i
== MUIV_List_Active_Off
))
619 *msg
->opg_Storage
= 0;
621 GetAttr(MUIA_Text_Contents
, data
->charset
, msg
->opg_Storage
);
624 return DoSuperMethodA(cl
, obj
, (Msg
)msg
);
627 *msg
->opg_Storage
= rc
;
631 /*** Set ******************************************************************/
632 static IPTR
Language__OM_SET(struct IClass
*cl
, Object
*obj
, struct opSet
*msg
)
634 struct Language_DATA
*data
= INST_DATA(cl
, obj
);
635 struct TagItem
*tstate
, *tag
;
639 tstate
= msg
->ops_AttrList
;
642 while ((tag
= (struct TagItem
*) NextTagItem((APTR
) &tstate
)))
646 case MUIA_Language_Preferred
:
647 /* clear preferred */
649 for (i
= 0; i
< 10; i
++)
651 if(localeprefs
.lp_PreferredLanguages
[i
][0] != '\0')
653 func_move_to_selected(localeprefs
.lp_PreferredLanguages
[i
], data
);
659 case MUIA_Language_Characterset
:
661 char *charset
= (char *)tag
->ti_Data
;
663 if (!charset
|| !*charset
)
664 DoMethod(data
->cslist
, MUIM_List_GetEntry
, 0, (IPTR
*)&charset
);
665 SetAttrs(data
->charset
, MUIA_Text_Contents
, charset
, TAG_DONE
);
670 return DoSuperMethodA(cl
, obj
, (Msg
)msg
);
676 MUI_Redraw(obj
, MADF_DRAWOBJECT
);
682 static IPTR
Language__OM_DISPOSE(struct IClass
*cl
, Object
*obj
, Msg msg
)
684 struct Language_DATA
*data
= INST_DATA(cl
, obj
);
686 D(bug("Language_Dispose\n"));
690 return DoSuperMethodA(cl
, obj
, msg
);
693 /*** Setup ******************************************************************/
696 Language
, NULL
, MUIC_Group
, NULL
,
697 OM_NEW
, struct opSet
*,
698 OM_SET
, struct opSet
*,
699 OM_GET
, struct opGet
*,