1 // config_languages_dlg.cpp : implementation file
2 //
3 
4 #include "studiox_includes.h"
5 #include "config_languages_dlg.h"
6 #include "afxdialogex.h"
7 
8 #ifdef _DEBUG
9 #define new DEBUG_NEW
10 #endif
11 
12 // ISO 639-1 three-letter language codes
13 // http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
14 // http://www.loc.gov/standards/iso639-2/php/code_list.php
15 
16 typedef struct {
17     char *name;
18     char *symbol;
19 } language_record;
20 
21 language_record language_list[] = {
22     {"Abkhaz",      "ab"},
23     {"Afar",        "aa"},
24     {"Afrikaans",   "af"},
25     {"Akan",        "ak"},
26     {"Albanian",    "sq"},
27     {"Amharic",     "am"},
28     {"Arabic",      "ar"},
29     {"Aragonese",   "an"},
30     {"Armenian",    "hy"},
31     {"Assamese",    "as"},
32     {"Avaric",      "av"},
33     {"Avestan",     "ae"},
34     {"Aymara",      "ay"},
35     {"Azerbaijani", "az"},
36     {"Bamanankan",  "bm"},
37     {"Bangla",      "bn"},
38     {"Bashkir",     "ba"},
39     {"Basque",      "eu"},
40     {"Belarusian",  "be"},
41     {"Bihari",      "bh"},
42     {"Bislama",     "bi"},
43     {"Bosnian",     "bs"},
44     {"Breton",      "br"},
45     {"Bulgarian",   "bg"},
46     {"Burmese",     "my"},
47     {"Catalan",     "ca"},
48     {"Chamorro",    "ch"},
49     {"Chechen",     "ce"},
50     {"Chichewa",    "ny"},
51     {"Chinese",     "zh"},
52     {"Church Slavic", "cu"},
53     {"Chuvash",     "cv"},
54     {"Cornish",     "kw"},
55     {"Corsican",    "co"},
56     {"Cree",        "cr"},
57     {"Croatian",    "hr"},
58     {"Czech",       "cs"},
59     {"Danish",      "da"},
60     {"Divehi",      "dv"},
61     {"Dutch",       "nl"},
62     {"Dzongkha",    "dz"},
63     {"English",     "en"},
64     {"Esperanto",   "eo"},
65     {"Estonian",    "et"},
66     {"Ewe",         "ee"},
67     {"Faroese",     "fo"},
68     {"Fijian",      "fj"},
69     {"Finnish",     "fi"},
70     {"French",      "fr"},
71     {"Frisian",     "fy"},
72     {"Fulah",       "ff"},
73     {"Galician",    "gl"},
74     {"Ganda",       "lg"},
75     {"Georgian",    "ka"},
76     {"German",      "de"},
77     {"Greek",       "el"},
78     {"Guarani",     "gn"},
79     {"Gujarati",    "gu"},
80     {"Haitian",     "ht"},
81     {"Hausa",       "ha"},
82     {"Hebrew",      "he"},
83     {"Herero",      "hz"},
84     {"Hindi",       "hi"},
85     {"Hiri Motu",   "ho"},
86     {"Hungarian",   "hu"},
87     {"Icelandic",   "is"},
88     {"Ido",         "io"},
89     {"Igbo",        "ig"},
90     {"Indonesian",  "id"},
91     {"Interlingue", "ie"},
92     {"Interlingua", "ia"},
93     {"Inuktitut",   "iu"},
94     {"Inupiaq",     "ik"},
95     {"Irish",       "ga"},
96 	{"Italian",     "it"},
97     {"Japanese",    "ja"},
98     {"Javanese",    "jv"},
99     {"Kalaallisut", "kl"},
100     {"Kannada",     "kn"},
101     {"Kanuri",      "kr"},
102     {"Kashmiri",    "ks"},
103     {"Kazakh",      "kk"},
104     {"Khmer",       "km"},
105     {"Kikuyu",      "ki"},
106     {"Kinyarwanda", "rw"},
107     {"Kirghiz",     "ky"},
108     {"Komi",        "kv"},
109     {"Kongo",       "kg"},
110     {"Korean",      "ko"},
111     {"Kuanyama",    "kj"},
112     {"Kurdish",     "ku"},
113     {"Lao",         "lo"},
114     {"Latin",       "la"},
115     {"Latvian",     "lv"},
116     {"Limburgan",   "li"},
117     {"Lingala",     "ln"},
118     {"Lithuanian",  "lt"},
119     {"Luba-Katanga", "lu"},
120     {"Luxembourgish", "lb"},
121     {"Macedonian",  "mk"},
122     {"Malagasy",    "mg"},
123     {"Malay",       "ms"},
124     {"Malayalam",   "ml"},
125     {"Maltese",     "mt"},
126     {"Manx",        "gv"},
127     {"Maori",       "mi"},
128     {"Marathi",     "mr"},
129     {"Marshallese", "mh"},
130     {"Mongolian",   "mn"},
131     {"Nauru",       "na"},
132     {"Navajo",      "nv"},
133     {"Ndebele",     "nd"},
134     {"Ndonga",      "ng"},
135     {"Nepali",      "ne"},
136     {"Norwegian",   "no"},
137     {"Occitan",     "oc"},
138     {"Odia",        "or"},
139     {"Ojibwa",      "oj"},
140     {"Oromo",       "om"},
141     {"Ossetian",    "os"},
142     {"Pali",        "pi"},
143     {"Panjabi",     "pa"},
144     {"Persian",     "fa"},
145     {"Polish",      "pl"},
146     {"Portuguese",  "pt"},
147     {"Pushto",      "ps"},
148     {"Quechua",     "qu"},
149     {"Romanian",    "ro"},
150     {"Romansh",     "rm"},
151     {"Rundi",       "rn"},
152     {"Russian",     "ru"},
153     {"Samoan",      "sm"},
154     {"Sango",       "sg"},
155     {"Sanskrit",    "sa"},
156     {"Sardinian",   "sc"},
157     {"Scottish Gaelic", "gd"},
158     {"Serbian",     "sr"},
159     {"Shona",       "sn"},
160     {"Sindhi",      "sd"},
161     {"Sinhala",     "si"},
162     {"Slovak",      "sk"},
163     {"Slovenian",   "sl"},
164     {"Somali",      "so"},
165     {"Sotho",       "st"},
166     {"Spanish",     "es"},
167     {"Sundanese",   "su"},
168     {"Swahili",     "sw"},
169     {"Swati",       "ss"},
170     {"Swedish",     "sv"},
171     {"Tagalog",     "tl"},
172     {"Tahitian",    "ty"},
173     {"Tajik",       "tg"},
174     {"Tamil",       "ta"},
175     {"Tatar",       "tt"},
176     {"Telugu",      "te"},
177     {"Thai",        "th"},
178     {"Tibetan",     "bo"},
179     {"Tigrinya",    "ti"},
180     {"Tonga",       "to"},
181     {"Tswana",      "tn"},
182     {"Tsonga",      "ts"},
183     {"Turkmen",     "tk"},
184     {"Turkish",     "tr"},
185     {"Twi",         "tw"},
186     {"Uighur",      "ug"},
187     {"Ukrainian",   "uk"},
188     {"Urdu",        "ur"},
189     {"Uzbek",       "uz"},
190     {"Venda",       "ve"},
191     {"Vietnamese",  "vi"},
192     {"Volap?",     "vo"},
193     {"Walloon",     "wa"},
194     {"Welsh",       "cy"},
195     {"Wolof",       "wo"},
196     {"Xhosa",       "xh"},
197     {"Yi",          "ii"},
198     {"Yiddish",     "yi"},
199     {"Yoruba",      "yo"},
200     {"Zhuang",      "za"},
201     {"Zulu",        "zu"},
202     {NULL, NULL}
203 };
204 
205 typedef struct name_convert_map_struct {
206     char *old_name;
207     char *new_name;
208 }name_convert_map;
209 
210 name_convert_map language_name_convert_list[] = {
211     {"Bambara", "Bamanankan"},
212     {"Bengali", "Bangla"},
213     {"Gaelic", "Scottish Gaelic"},
214     {"Oriya", "Odia"},
215     {"Sichuan Yi", "Yi"},
216     {NULL, NULL}
217 };
218 
219 enum config_languages_dlg_test_commands{
220     TEST_ADD_LANGUAGE = 1,
221     TEST_DELETE_LANGEUGE,
222     TEST_SELECT_LANGUAGE_INDEX,
223     TEST_SELECT_LANGUAGE_ID,
224     TEST_CHECK_SUPPORT_BIDI_TEXT,
225     TEST_CHECK_REORDER_BIDI_TEXT,
226     TEST_CHECK_SUPPORT_THAI_SHAPING,
227     TEST_CHECK_GEN_ADJUSTED_THAI,
228     TEST_SAVE_LANGUAGE_CONFIGURE,
229     TEST_CANCEL_LANGUAGE_CONFIGURE
230 };
231 
232 // config_languages_dlg dialog
233 
234 #define LANGUAGE_LIST_SIZE ((sizeof(language_list) / sizeof(language_record)) - 1)
235 
IMPLEMENT_DYNAMIC(config_languages_dlg,express_dialog)236 IMPLEMENT_DYNAMIC(config_languages_dlg, express_dialog)
237 
238 ///////////////////////////////////////////////////////////////////////////////
239 config_languages_dlg::config_languages_dlg(CWnd* pParent /*=NULL*/)
240     : express_dialog(config_languages_dlg::IDD, pParent)
241 {
242     IconId = IDB_CONFIGURE_LANGUAGES;
243     SetTitleText("Configure Languages");
244     studiox_project *project = GetOpenProject();
245 
246     if (project)
247     {
248         mNumLanguages = project->mHeader.num_languages;
249         mStartLanguages = mNumLanguages;
250 
251         if (mNumLanguages <= 0)
252         {
253             mNumLanguages = 1;
254         }
255         mLanguages.SetSize(mNumLanguages, 1);
256 
257         for (int index = 0; index < mNumLanguages; index++)
258         {
259             mLanguages[index].name = project->mHeader.languages[index].name;
260             mLanguages[index].support_bidi_text = project->mHeader.languages[index].support_bidi_text;
261             mLanguages[index].gen_reordered_bidi_text = project->mHeader.languages[index].gen_reordered_bidi_text;
262 
263             mLanguages[index].support_thai_glyph_shaping = project->mHeader.languages[index].support_thai_glyph_shaping;
264             mLanguages[index].gen_adjusted_thai_string = project->mHeader.languages[index].gen_adjusted_thai_string;
265 
266             mLanguages[index].statically_defined = project->mHeader.languages[index].statically_defined;
267         }
268     }
269 }
270 
271 ///////////////////////////////////////////////////////////////////////////////
~config_languages_dlg()272 config_languages_dlg::~config_languages_dlg()
273 {
274 }
275 
276 ///////////////////////////////////////////////////////////////////////////////
BuildCombinedLanguageName(char * name,char * symbol)277 CString config_languages_dlg::BuildCombinedLanguageName(char *name, char *symbol)
278 {
279     CString combined;
280     CString tname = CA2T(name);
281     CString tsymbol = CA2T(symbol);
282 
283     combined.Format(_T("%s [%s]"), tname, tsymbol);
284     return combined;
285 }
286 
287 ///////////////////////////////////////////////////////////////////////////////
BuildCombinedLanguageName(int index)288 CString config_languages_dlg::BuildCombinedLanguageName(int index)
289 {
290     if (language_list[index].name)
291     {
292         return BuildCombinedLanguageName(language_list[index].name,
293                     language_list[index].symbol);
294     }
295     return CString("");
296 }
297 
298 ///////////////////////////////////////////////////////////////////////////////
GetLanguageNameIndex(CString & findname)299 int config_languages_dlg::GetLanguageNameIndex(CString &findname)
300 {
301     int index = 0;
302     CString combined;
303 
304     while(language_list[index].name)
305     {
306         if (language_list[index].name == findname)
307         {
308             return index;
309         }
310         combined = BuildCombinedLanguageName(language_list[index].name, language_list[index].symbol);
311         if (combined == findname)
312         {
313             return index;
314         }
315         index++;
316     }
317 
318     return 0;
319 }
320 
321 ///////////////////////////////////////////////////////////////////////////////
GetLanguageIdIndex(CString & findid)322 int config_languages_dlg::GetLanguageIdIndex(CString &findid)
323 {
324     int index = 0;
325     CString combined;
326 
327     while(language_list[index].name)
328     {
329         if (language_list[index].symbol == findid)
330         {
331             return index;
332         }
333         index++;
334     }
335     return 0;
336 }
337 
338 ///////////////////////////////////////////////////////////////////////////////
GetLanguageId(CString & findname)339 CString config_languages_dlg::GetLanguageId(CString &findname)
340 {
341     int index = 0;
342 
343     while(language_list[index].name)
344     {
345         if (language_list[index].name == findname)
346         {
347             return CString(language_list[index].symbol);
348         }
349         index++;
350     }
351     return CString("en");
352 }
353 
354 ///////////////////////////////////////////////////////////////////////////////
GetLanguageId(int index)355 CString config_languages_dlg::GetLanguageId(int index)
356 {
357     if (index < LANGUAGE_LIST_SIZE)
358     {
359         return CString(language_list[index].symbol);
360     }
361     return CString("");
362 }
363 
364 ///////////////////////////////////////////////////////////////////////////////
GetLanguageName(int index)365 CString config_languages_dlg::GetLanguageName(int index)
366 {
367     if (index < LANGUAGE_LIST_SIZE)
368     {
369         return CString(language_list[index].name);
370     }
371     return CString("");
372 }
373 
374 ///////////////////////////////////////////////////////////////////////////////
GetStringTableIndexFromLanguageIndex(studiox_project * project,int seek_language)375 int config_languages_dlg::GetStringTableIndexFromLanguageIndex(studiox_project *project, int seek_language)
376 {
377     int table_index = 0;
378 
379     for (table_index = 0; table_index < project->mHeader.num_languages; table_index++)
380     {
381         int language_index = GetLanguageNameIndex(project->mHeader.languages[table_index].name);
382 
383         if (language_index == seek_language)
384         {
385             return table_index;
386         }
387     }
388     return -1;
389 }
390 
391 ///////////////////////////////////////////////////////////////////////////////
ConvertOldLanguageName(CString & old_language_name)392 CString config_languages_dlg::ConvertOldLanguageName(CString &old_language_name)
393 {
394     name_convert_map *list = language_name_convert_list;
395 
396     while (list->old_name)
397     {
398         if (list->old_name == old_language_name)
399         {
400             return CString(list->new_name);
401         }
402         list++;
403     }
404 
405     return old_language_name;
406 }
407 
408 
409 ///////////////////////////////////////////////////////////////////////////////
AnnounceLanguageNumberChange()410 void config_languages_dlg::AnnounceLanguageNumberChange()
411 {
412     GetDlgItem(IDC_NUM_LANGUAGES)->NotifyWinEvent(
413         EVENT_OBJECT_LIVEREGIONCHANGED,
414         OBJID_CLIENT,
415         CHILDID_SELF);
416 
417     CMainFrame* pMain = (CMainFrame*)AfxGetApp()->GetMainWnd();
418 
419     if (pMain && (!mSavedMsg.IsEmpty()))
420     {
421         CString msg;
422         msg.Format(L"Number of Languages %d", mNumLanguages);
423         pMain->GetStatusMsgControl()->SetWindowText(msg);
424         pMain->GetStatusMsgControl()->NotifyWinEvent(
425             EVENT_OBJECT_LIVEREGIONCHANGED,
426             OBJID_CLIENT,
427             CHILDID_SELF);
428     }
429 }
430 
431 ///////////////////////////////////////////////////////////////////////////////
OnInitDialog()432 BOOL config_languages_dlg::OnInitDialog()
433 {
434     express_dialog::OnInitDialog();
435     CSpinButtonCtrl * pb = (CSpinButtonCtrl *) GetDlgItem(IDC_SPIN_LANGUAGE_INDEX);
436     CEdit *ps = (CEdit *) GetDlgItem(IDC_LANGUAGE_INDEX);
437     pb->SetBuddy(ps);
438     pb->SetRange(1, mNumLanguages);
439     ps->SetWindowText(_T("1"));
440 
441     int index = 0;
442 
443     while(language_list[index].name)
444     {
445         CString lang_name;
446         lang_name = BuildCombinedLanguageName(language_list[index].name, language_list[index].symbol);
447         mLanguageNameCombo.AddString(lang_name);
448         index++;
449     }
450     mLanguageNameCombo.SetCurSel(GetLanguageNameIndex(mLanguages[0].name));
451 
452     //set bidi text support information
453     mBidiTextSupportBox.SetCheck(mLanguages[0].support_bidi_text);
454     mBidiTextGenerateBox.SetCheck(mLanguages[0].gen_reordered_bidi_text);
455     mStaticallyDefined.SetCheck(mLanguages[0].statically_defined);
456     OnClickSupportBidiTextBox();
457 
458     mThaiGlyphShapingSupport.SetCheck(mLanguages[0].support_thai_glyph_shaping);
459     mGenAdjustedThaiString.SetCheck(mLanguages[0].gen_adjusted_thai_string);
460     OnClickedThaiGlyphShapingSupport();
461 
462     AddCancelButton();
463     AddSaveButton();
464 
465     return TRUE; // return TRUE unless you set the focus to a control
466 }
467 
468 
469 ///////////////////////////////////////////////////////////////////////////////
DoDataExchange(CDataExchange * pDX)470 void config_languages_dlg::DoDataExchange(CDataExchange* pDX)
471 {
472     express_dialog::DoDataExchange(pDX);
473     DDX_Control(pDX, IDC_LANG_NAME_COMBO, mLanguageNameCombo);
474     DDX_Text(pDX, IDC_NUM_LANGUAGES, mNumLanguages);
475     SetLiveRegion(GetDlgItem(IDC_NUM_LANGUAGES)->GetSafeHwnd());
476 
477     CRect size;
478 
479     // Set the drop-down list size for each of the combo-boxes.
480     // There doesn't seem to be any way to do it in resource editor.
481     mLanguageNameCombo.GetWindowRect(&size);
482     size.bottom = size.top + 200;
483     ScreenToClient(&size);
484     mLanguageNameCombo.MoveWindow(&size);
485 
486     DDX_Control(pDX, IDC_SPIN_LANGUAGE_INDEX, mSpinLanguageIndex);
487 
488     DDX_Control(pDX, IDC_CHECK_STATICALLY_DEFINED, mStaticallyDefined);
489     DDX_Control(pDX, IDC_CHECK_SUPPORT_BIDI_TEXT, mBidiTextSupportBox);
490     DDX_Control(pDX, IDC_CHECK_REORDER_BIDI_TEXT, mBidiTextGenerateBox);
491     DDX_Control(pDX, IDC_THAI_GLYPH_SHAPING_SUPPORT, mThaiGlyphShapingSupport);
492     DDX_Control(pDX, IDC_GEN_ADJUSTED_THAI_STRING, mGenAdjustedThaiString);
493 }
494 
495 ///////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(config_languages_dlg,express_dialog)496 BEGIN_MESSAGE_MAP(config_languages_dlg, express_dialog)
497     ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_LANGUAGE_INDEX, &config_languages_dlg::OnDeltaposSpinLanguageIndex)
498     ON_BN_CLICKED(IDC_ADD_LANGUAGE, &config_languages_dlg::OnBnClickedAddLanguage)
499     ON_BN_CLICKED(IDC_DELETE_LANGUAGE, &config_languages_dlg::OnBnClickedDeleteLanguage)
500     ON_BN_CLICKED(IDCANCEL, &config_languages_dlg::OnBnClickedCancel)
501     ON_BN_CLICKED(IDOK, &config_languages_dlg::OnBnClickedOk)
502     ON_MESSAGE(STUDIO_TEST, OnTestMessage)
503     ON_BN_CLICKED(IDC_CHECK_SUPPORT_BIDI_TEXT, &config_languages_dlg::OnClickSupportBidiTextBox)
504     ON_BN_CLICKED(IDC_THAI_GLYPH_SHAPING_SUPPORT, &config_languages_dlg::OnClickedThaiGlyphShapingSupport)
505 END_MESSAGE_MAP()
506 
507 
508 ///////////////////////////////////////////////////////////////////////////////
509 // config_languages_dlg message handlers
510 
511 void config_languages_dlg::OnDeltaposSpinLanguageIndex(NMHDR *pNMHDR, LRESULT *pResult)
512 {
513     LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
514     // TODO: Add your control notification handler code here
515     int upper;
516     int lower;
517 
518     mSpinLanguageIndex.GetRange(lower, upper);
519 
520     int oldval = pNMUpDown ->iPos;
521     int newval = oldval + pNMUpDown->iDelta;
522 
523     // save the current name, update to new name, if the value is within
524     // limits
525     if (oldval <= upper && oldval >= lower &&
526         newval <= upper && newval >= lower)
527     {
528         mLanguages[oldval - 1].name = language_list[mLanguageNameCombo.GetCurSel()].name;
529 
530         //bidi text
531         mLanguages[oldval - 1].support_bidi_text = mBidiTextSupportBox.GetCheck();
532         mLanguages[oldval - 1].gen_reordered_bidi_text = mBidiTextGenerateBox.GetCheck();
533 
534         //thai string
535         mLanguages[oldval - 1].support_thai_glyph_shaping = mThaiGlyphShapingSupport.GetCheck();
536         mLanguages[oldval - 1].gen_adjusted_thai_string = mGenAdjustedThaiString.GetCheck();
537 
538         mLanguages[oldval - 1].statically_defined = mStaticallyDefined.GetCheck();
539         mLanguageNameCombo.SetCurSel(GetLanguageNameIndex(mLanguages[newval - 1].name));
540 
541         mBidiTextSupportBox.SetCheck(mLanguages[newval - 1].support_bidi_text);
542         mBidiTextGenerateBox.SetCheck(mLanguages[newval - 1].gen_reordered_bidi_text);
543         mStaticallyDefined.SetCheck(mLanguages[newval - 1].statically_defined);
544         OnClickSupportBidiTextBox();
545 
546         mThaiGlyphShapingSupport.SetCheck(mLanguages[newval - 1].support_thai_glyph_shaping);
547         mGenAdjustedThaiString.SetCheck(mLanguages[newval - 1].gen_adjusted_thai_string);
548         OnClickedThaiGlyphShapingSupport();
549     }
550     *pResult = 0;
551 }
552 
553 ///////////////////////////////////////////////////////////////////////////////
OnBnClickedAddLanguage()554 void config_languages_dlg::OnBnClickedAddLanguage()
555 {
556     // TODO: Add your control notification handler code here
557     if (mNumLanguages + 1 > MAX_LANGUAGES)
558     {
559         return;
560     }
561 
562     mNumLanguages++;
563 
564     mSpinLanguageIndex.SetRange(1, mNumLanguages);
565 
566     language_info info;
567     info.name = language_list[0].name;
568     info.statically_defined = TRUE;
569     info.support_bidi_text = FALSE;
570     info.gen_reordered_bidi_text = FALSE;
571     info.support_thai_glyph_shaping = FALSE;
572 
573     mLanguages.Add(info);
574 
575     SetDlgItemInt(IDC_NUM_LANGUAGES, mNumLanguages);
576 
577     AnnounceLanguageNumberChange();
578 }
579 
580 ///////////////////////////////////////////////////////////////////////////////
OnBnClickedDeleteLanguage()581 void config_languages_dlg::OnBnClickedDeleteLanguage()
582 {
583     if (mNumLanguages > 1)
584     {
585         int Index = mSpinLanguageIndex.GetPos();
586         mLanguages.RemoveAt(Index - 1);
587         mNumLanguages--;
588         SetDlgItemInt(IDC_NUM_LANGUAGES, mNumLanguages);
589 
590         AnnounceLanguageNumberChange();
591 
592         mSpinLanguageIndex.SetRange(1, mNumLanguages);
593 
594         if (GetDlgItemInt(IDC_LANGUAGE_INDEX) > (UINT) mNumLanguages)
595         {
596             SetDlgItemInt(IDC_LANGUAGE_INDEX, mNumLanguages);
597         }
598 
599         Index = GetDlgItemInt(IDC_LANGUAGE_INDEX);
600         mLanguageNameCombo.SetCurSel(GetLanguageNameIndex(mLanguages[Index - 1].name));
601         mBidiTextSupportBox.SetCheck(mLanguages[Index - 1].support_bidi_text);
602         mBidiTextGenerateBox.SetCheck(mLanguages[Index - 1].gen_reordered_bidi_text);
603         mStaticallyDefined.SetCheck(mLanguages[Index - 1].statically_defined);
604         OnClickSupportBidiTextBox();
605 
606         mThaiGlyphShapingSupport.SetCheck(mLanguages[Index - 1].support_thai_glyph_shaping);
607         mGenAdjustedThaiString.SetCheck(mLanguages[Index - 1].gen_adjusted_thai_string);
608         OnClickedThaiGlyphShapingSupport();
609     }
610     else
611     {
612         ErrorMsg("Encountered Improper Arguement.", this);
613     }
614 }
615 
616 ///////////////////////////////////////////////////////////////////////////////
OnBnClickedCancel()617 void config_languages_dlg::OnBnClickedCancel()
618 {
619     // just return without doing anything
620     express_dialog::OnOK();
621 }
622 
623 ///////////////////////////////////////////////////////////////////////////////
OnBnClickedOk()624 void config_languages_dlg::OnBnClickedOk()
625 {
626     int index;
627     int display;
628     int old_language;
629     int new_language;
630     BOOL copy_language;
631     studiox_project *project = GetOpenProject();
632 
633     if (!project)
634     {
635         return;
636     }
637 
638     // save the last change in case it has not been saved yet
639     index = GetDlgItemInt(IDC_LANGUAGE_INDEX);
640     mLanguages[index - 1].name = language_list[mLanguageNameCombo.GetCurSel()].name;
641     mLanguages[index - 1].support_bidi_text = mBidiTextSupportBox.GetCheck();
642     mLanguages[index - 1].gen_reordered_bidi_text = mBidiTextGenerateBox.GetCheck();
643 
644     mLanguages[index - 1].support_thai_glyph_shaping = mThaiGlyphShapingSupport.GetCheck();
645     mLanguages[index - 1].gen_adjusted_thai_string = mGenAdjustedThaiString.GetCheck();
646 
647     mLanguages[index - 1].statically_defined = mStaticallyDefined.GetCheck();
648 
649     // update the project header to hold our new langauge count and names:
650     int old_num_languages = project->mHeader.num_languages;
651     project->mHeader.num_languages = mNumLanguages;
652 
653     for (index = 0; index < mNumLanguages; index++)
654     {
655         project->mHeader.languages[index].name = mLanguages[index].name;
656 
657         project->mHeader.languages[index].support_bidi_text = mLanguages[index].support_bidi_text;
658         project->mHeader.languages[index].gen_reordered_bidi_text = mLanguages[index].gen_reordered_bidi_text;
659         project->mHeader.languages[index].support_thai_glyph_shaping = mLanguages[index].support_thai_glyph_shaping;
660         project->mHeader.languages[index].gen_adjusted_thai_string = mLanguages[index].gen_adjusted_thai_string;
661         project->mHeader.languages[index].statically_defined = mLanguages[index].statically_defined;
662     }
663 
664     for (index = old_num_languages; index < mNumLanguages; index++)
665     {
666         //for the new added languages, enabled language generation for all displays
667         for (int display = 0; display < project->mHeader.num_displays; display++)
668         {
669             project->mDisplays[display].gen_string_table[index] = TRUE;
670         }
671     }
672 
673     // make a new string tables for each display holding the new languages.
674     // Copy what we can from the old tables (matching langauge names)
675 
676     int active_display = 0;
677     if (GetProjectView())
678     {
679         active_display = GetProjectView()->GetActiveDisplay();
680     }
681 
682     for (display = 0; display < project->mHeader.num_displays; display++)
683     {
684         string_table *pOldTable = project->mDisplays[display].stable;
685         if (!pOldTable)
686         {
687             ErrorMsg("Internal Error: Source string table invalid", this);
688             express_dialog::OnOK();
689             return;
690         }
691         int num_strings = pOldTable->CountStrings();
692 
693         string_table *pNewTable = new string_table;
694         pNewTable->Initialize(mNumLanguages, pOldTable->CountStrings());
695 
696         CString id_name;
697         for (index = 1; index < num_strings; index++)
698         {
699             id_name = pOldTable->GetResourceIdName(index);
700             pNewTable->AddToDictionary(id_name, index);
701         }
702 
703         // copy the string_ids, fonts, and notes:
704         for (index = 0; index < num_strings; index++)
705         {
706             string_table_record record = pOldTable->GetRecord(index);
707             pNewTable->SetDisplayFont(index, record.font_id);
708             pNewTable->SetStringId(index, record.id_name);
709             if (!record.notes.IsEmpty())
710             {
711                 pNewTable->SetNotes(index, record.notes);
712             }
713         }
714 
715         // for each language in the new table, see if we have that
716         // language in the old table
717         for (new_language = 0; new_language < mNumLanguages; new_language++)
718         {
719             copy_language = FALSE;
720             for (old_language = 0; old_language  < mStartLanguages; old_language++)
721             {
722                 if (mLanguages[old_language].name == mLanguages[new_language].name)
723                 {
724                     copy_language = TRUE;
725                     break;
726                 }
727             }
728 
729             if (copy_language)
730             {
731                 // we found a match, copy strings from old table to new
732                 for (index = 0; index < num_strings; index++)
733                 {
734                     pNewTable->SetString(index, new_language, pOldTable->GetString(index, old_language));
735                 }
736             }
737         }
738 
739         if (display == active_display)
740         {
741             int active_language = pOldTable->GetActiveLanguage();
742 
743             if (active_language >= mNumLanguages)
744             {
745                 active_language = 0;
746             }
747 
748             pNewTable->SetActiveLanguage(active_language);
749         }
750 
751         // swap out the string tables:
752         project->mDisplays[display].stable = pNewTable;
753         if (pOldTable)
754         {
755             delete pOldTable;
756         }
757 
758         pNewTable->UpdateGuixLanguageTable(NULL, FALSE);
759     }
760 
761     express_dialog::OnOK();
762 }
763 
764 ///////////////////////////////////////////////////////////////////////////////
OnClickSupportBidiTextBox()765 void config_languages_dlg::OnClickSupportBidiTextBox()
766 {
767     BOOL enable = FALSE;
768 
769     if (mBidiTextSupportBox.GetCheck())
770     {
771         enable = TRUE;
772     }
773 
774     mBidiTextGenerateBox.EnableWindow(enable);
775 }
776 
777 ///////////////////////////////////////////////////////////////////////////////
OnClickedThaiGlyphShapingSupport()778 void config_languages_dlg::OnClickedThaiGlyphShapingSupport()
779 {
780     BOOL enabed = FALSE;
781 
782     if (mThaiGlyphShapingSupport.GetCheck())
783     {
784         enabed = TRUE;
785     }
786 
787     mGenAdjustedThaiString.EnableWindow(enabed);
788 }
789 
790 ///////////////////////////////////////////////////////////////////////////////
OnTestMessage(WPARAM wParam,LPARAM lParam)791 afx_msg LRESULT config_languages_dlg::OnTestMessage(WPARAM wParam, LPARAM lParam)
792 {
793     CWnd *pWnd;
794 
795     switch (wParam)
796     {
797     case TEST_ADD_LANGUAGE:
798         pWnd = GetDlgItem(IDC_ADD_LANGUAGE);
799         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_ADD_LANGUAGE, BN_CLICKED), (LPARAM)pWnd->GetSafeHwnd());
800         break;
801 
802     case TEST_DELETE_LANGEUGE:
803         pWnd = GetDlgItem(IDC_DELETE_LANGUAGE);
804         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_DELETE_LANGUAGE, BN_CLICKED), (LPARAM)pWnd->GetSafeHwnd());
805         break;
806 
807     case TEST_SELECT_LANGUAGE_INDEX:
808     {
809         NMUPDOWN NMUpDown;
810         NMHDR hdr;
811 
812         hdr.hwndFrom = mSpinLanguageIndex.m_hWnd;
813         hdr.idFrom = IDC_SPIN_LANGUAGE_INDEX;
814         hdr.code = UDN_DELTAPOS;
815 
816         NMUpDown.hdr = hdr;
817         NMUpDown.iPos = mSpinLanguageIndex.GetPos();
818         NMUpDown.iDelta = lParam - NMUpDown.iPos;
819 
820         mSpinLanguageIndex.SetPos(lParam);
821         SetDlgItemInt(IDC_LANGUAGE_INDEX, lParam);
822 
823         SendMessage(WM_NOTIFY, IDC_SPIN_LANGUAGE_INDEX, (LPARAM)&NMUpDown);
824         break;
825     }
826 
827     case TEST_SELECT_LANGUAGE_ID:
828     {
829         int language_index = GetLanguageNameIndex(GetTestingParam(0));
830         mLanguageNameCombo.SetCurSel(language_index);
831         SendMessage(WM_COMMAND, MAKEWPARAM(IDC_LANG_NAME_COMBO, CBN_SELCHANGE), (LPARAM)(mLanguageNameCombo.m_hWnd));
832         break;
833     }
834 
835     case TEST_CHECK_SUPPORT_BIDI_TEXT:
836         pWnd = (CWnd *)GetDlgItem(IDC_CHECK_SUPPORT_BIDI_TEXT);
837         if (pWnd->IsWindowEnabled())
838         {
839             ((CButton *)pWnd)->SetCheck(lParam);
840             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_CHECK_SUPPORT_BIDI_TEXT, BN_CLICKED), (LPARAM)pWnd->m_hWnd);
841         }
842         break;
843 
844     case TEST_CHECK_REORDER_BIDI_TEXT:
845         pWnd = (CWnd *)GetDlgItem(IDC_CHECK_REORDER_BIDI_TEXT);
846         if (pWnd->IsWindowEnabled())
847         {
848             ((CButton *)pWnd)->SetCheck(lParam);
849             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_CHECK_REORDER_BIDI_TEXT, BN_CLICKED), (LPARAM)pWnd->m_hWnd);
850         }
851         break;
852 
853     case TEST_CHECK_SUPPORT_THAI_SHAPING:
854         pWnd = (CWnd*)GetDlgItem(IDC_THAI_GLYPH_SHAPING_SUPPORT);
855         if (pWnd->IsWindowEnabled())
856         {
857             ((CButton*)pWnd)->SetCheck(lParam);
858             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_THAI_GLYPH_SHAPING_SUPPORT, BN_CLICKED), (LPARAM)pWnd->m_hWnd);
859         }
860         break;
861 
862     case TEST_CHECK_GEN_ADJUSTED_THAI:
863         pWnd = (CWnd*)GetDlgItem(IDC_GEN_ADJUSTED_THAI_STRING);
864         if (pWnd->IsWindowEnabled())
865         {
866             ((CButton*)pWnd)->SetCheck(lParam);
867             SendMessage(WM_COMMAND, MAKEWPARAM(IDC_GEN_ADJUSTED_THAI_STRING, BN_CLICKED), (LPARAM)pWnd->m_hWnd);
868         }
869         break;
870 
871     case TEST_SAVE_LANGUAGE_CONFIGURE:
872         OnBnClickedOk();
873         break;
874 
875     case TEST_CANCEL_LANGUAGE_CONFIGURE:
876         OnBnClickedCancel();
877         break;
878     }
879 
880     return 0;
881 }