From 73f268aa5442407f943415d2c5b77e7c41d18433 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Fri, 8 Nov 2019 11:34:53 +0300 Subject: [PATCH 01/18] Add symbol table dialog --- apps/common/main/lib/util/character.js | 1335 +++++++++++++++++ .../common/main/lib/view/SymbolTableDialog.js | 961 ++++++++++++ .../main/app/controller/Toolbar.js | 22 + .../main/app/template/Toolbar.template | 1 + apps/documenteditor/main/app/view/Toolbar.js | 14 +- 5 files changed, 2332 insertions(+), 1 deletion(-) create mode 100644 apps/common/main/lib/util/character.js create mode 100644 apps/common/main/lib/view/SymbolTableDialog.js diff --git a/apps/common/main/lib/util/character.js b/apps/common/main/lib/util/character.js new file mode 100644 index 000000000..c16d6c080 --- /dev/null +++ b/apps/common/main/lib/util/character.js @@ -0,0 +1,1335 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2019 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +"use strict"; + +(function (window, undefined) +{ + + var lcid_unknown = 0x0000; // Unknown + var lcid_ar = 0x0001; // Arabic + var lcid_bg = 0x0002; // Bulgarian + var lcid_ca = 0x0003; // Catalan + var lcid_zhHans = 0x0004; // Chinese, Han (Simplified variant) + var lcid_cs = 0x0005; // Czech + var lcid_da = 0x0006; // Danish + var lcid_de = 0x0007; // German + var lcid_el = 0x0008; // Modern Greek (1453-) + var lcid_en = 0x0009; // English + var lcid_es = 0x000a; // Spanish + var lcid_fi = 0x000b; // Finnish + var lcid_fr = 0x000c; // French + var lcid_he = 0x000d; // Hebrew + var lcid_hu = 0x000e; // Hungarian + var lcid_is = 0x000f; // Icelandic + var lcid_it = 0x0010; // Italian + var lcid_ja = 0x0011; // Japanese + var lcid_ko = 0x0012; // Korean + var lcid_nl = 0x0013; // Dutch + var lcid_no = 0x0014; // Norwegian + var lcid_pl = 0x0015; // Polish + var lcid_pt = 0x0016; // Portuguese + var lcid_rm = 0x0017; // Romansh + var lcid_ro = 0x0018; // Romanian + var lcid_ru = 0x0019; // Russian + var lcid_hr = 0x001a; // Croatian + var lcid_sk = 0x001b; // Slovak + var lcid_sq = 0x001c; // Albanian + var lcid_sv = 0x001d; // Swedish + var lcid_th = 0x001e; // Thai + var lcid_tr = 0x001f; // Turkish + var lcid_ur = 0x0020; // Urdu + var lcid_id = 0x0021; // Indonesian + var lcid_uk = 0x0022; // Ukrainian + var lcid_be = 0x0023; // Belarusian + var lcid_sl = 0x0024; // Slovenian + var lcid_et = 0x0025; // Estonian + var lcid_lv = 0x0026; // Latvian + var lcid_lt = 0x0027; // Lithuanian + var lcid_tg = 0x0028; // Tajik + var lcid_fa = 0x0029; // Persian + var lcid_vi = 0x002a; // Vietnamese + var lcid_hy = 0x002b; // Armenian + var lcid_az = 0x002c; // Azerbaijani + var lcid_eu = 0x002d; // Basque + var lcid_hsb = 0x002e; // Upper Sorbian + var lcid_mk = 0x002f; // Macedonian + var lcid_tn = 0x0032; // Tswana + var lcid_xh = 0x0034; // Xhosa + var lcid_zu = 0x0035; // Zulu + var lcid_af = 0x0036; // Afrikaans + var lcid_ka = 0x0037; // Georgian + var lcid_fo = 0x0038; // Faroese + var lcid_hi = 0x0039; // Hindi + var lcid_mt = 0x003a; // Maltese + var lcid_se = 0x003b; // Northern Sami + var lcid_ga = 0x003c; // Irish + var lcid_ms = 0x003e; // Malay (macrolanguage) + var lcid_kk = 0x003f; // Kazakh + var lcid_ky = 0x0040; // Kirghiz + var lcid_sw = 0x0041; // Swahili (macrolanguage) + var lcid_tk = 0x0042; // Turkmen + var lcid_uz = 0x0043; // Uzbek + var lcid_tt = 0x0044; // Tatar + var lcid_bn = 0x0045; // Bengali + var lcid_pa = 0x0046; // Panjabi + var lcid_gu = 0x0047; // Gujarati + var lcid_or = 0x0048; // Oriya + var lcid_ta = 0x0049; // Tamil + var lcid_te = 0x004a; // Telugu + var lcid_kn = 0x004b; // Kannada + var lcid_ml = 0x004c; // Malayalam + var lcid_as = 0x004d; // Assamese + var lcid_mr = 0x004e; // Marathi + var lcid_sa = 0x004f; // Sanskrit + var lcid_mn = 0x0050; // Mongolian + var lcid_bo = 0x0051; // Tibetan + var lcid_cy = 0x0052; // Welsh + var lcid_km = 0x0053; // Central Khmer + var lcid_lo = 0x0054; // Lao + var lcid_gl = 0x0056; // Galician + var lcid_kok = 0x0057; // Konkani (macrolanguage) + var lcid_syr = 0x005a; // Syriac + var lcid_si = 0x005b; // Sinhala + var lcid_iu = 0x005d; // Inuktitut + var lcid_am = 0x005e; // Amharic + var lcid_tzm = 0x005f; // Central Atlas Tamazight + var lcid_ne = 0x0061; // Nepali + var lcid_fy = 0x0062; // Western Frisian + var lcid_ps = 0x0063; // Pushto + var lcid_fil = 0x0064; // Filipino + var lcid_dv = 0x0065; // Dhivehi + var lcid_ha = 0x0068; // Hausa + var lcid_yo = 0x006a; // Yoruba + var lcid_quz = 0x006b; // Cusco Quechua + var lcid_nso = 0x006c; // Pedi + var lcid_ba = 0x006d; // Bashkir + var lcid_lb = 0x006e; // Luxembourgish + var lcid_kl = 0x006f; // Kalaallisut + var lcid_ig = 0x0070; // Igbo + var lcid_ii = 0x0078; // Sichuan Yi + var lcid_arn = 0x007a; // Mapudungun + var lcid_moh = 0x007c; // Mohawk + var lcid_br = 0x007e; // Breton + var lcid_ug = 0x0080; // Uighur + var lcid_mi = 0x0081; // Maori + var lcid_oc = 0x0082; // Occitan (post 1500) + var lcid_co = 0x0083; // Corsican + var lcid_gsw = 0x0084; // Swiss German + var lcid_sah = 0x0085; // Yakut + var lcid_qut = 0x0086; // + var lcid_rw = 0x0087; // Kinyarwanda + var lcid_wo = 0x0088; // Wolof + var lcid_prs = 0x008c; // Dari + var lcid_gd = 0x0091; // Scottish Gaelic + var lcid_arSA = 0x0401; // Arabic, Saudi Arabia + var lcid_bgBG = 0x0402; // Bulgarian, Bulgaria + var lcid_caES = 0x0403; // Catalan, Spain + var lcid_zhTW = 0x0404; // Chinese, Taiwan, Province of China + var lcid_csCZ = 0x0405; // Czech, Czech Republic + var lcid_daDK = 0x0406; // Danish, Denmark + var lcid_deDE = 0x0407; // German, Germany + var lcid_elGR = 0x0408; // Modern Greek (1453-), Greece + var lcid_enUS = 0x0409; // English, United States + var lcid_esES_tradnl = 0x040a; // Spanish + var lcid_fiFI = 0x040b; // Finnish, Finland + var lcid_frFR = 0x040c; // French, France + var lcid_heIL = 0x040d; // Hebrew, Israel + var lcid_huHU = 0x040e; // Hungarian, Hungary + var lcid_isIS = 0x040f; // Icelandic, Iceland + var lcid_itIT = 0x0410; // Italian, Italy + var lcid_jaJP = 0x0411; // Japanese, Japan + var lcid_koKR = 0x0412; // Korean, Republic of Korea + var lcid_nlNL = 0x0413; // Dutch, Netherlands + var lcid_nbNO = 0x0414; // Norwegian Bokmal, Norway + var lcid_plPL = 0x0415; // Polish, Poland + var lcid_ptBR = 0x0416; // Portuguese, Brazil + var lcid_rmCH = 0x0417; // Romansh, Switzerland + var lcid_roRO = 0x0418; // Romanian, Romania + var lcid_ruRU = 0x0419; // Russian, Russian Federation + var lcid_hrHR = 0x041a; // Croatian, Croatia + var lcid_skSK = 0x041b; // Slovak, Slovakia + var lcid_sqAL = 0x041c; // Albanian, Albania + var lcid_svSE = 0x041d; // Swedish, Sweden + var lcid_thTH = 0x041e; // Thai, Thailand + var lcid_trTR = 0x041f; // Turkish, Turkey + var lcid_urPK = 0x0420; // Urdu, Pakistan + var lcid_idID = 0x0421; // Indonesian, Indonesia + var lcid_ukUA = 0x0422; // Ukrainian, Ukraine + var lcid_beBY = 0x0423; // Belarusian, Belarus + var lcid_slSI = 0x0424; // Slovenian, Slovenia + var lcid_etEE = 0x0425; // Estonian, Estonia + var lcid_lvLV = 0x0426; // Latvian, Latvia + var lcid_ltLT = 0x0427; // Lithuanian, Lithuania + var lcid_tgCyrlTJ = 0x0428; // Tajik, Cyrillic, Tajikistan + var lcid_faIR = 0x0429; // Persian, Islamic Republic of Iran + var lcid_viVN = 0x042a; // Vietnamese, Viet Nam + var lcid_hyAM = 0x042b; // Armenian, Armenia + var lcid_azLatnAZ = 0x042c; // Azerbaijani, Latin, Azerbaijan + var lcid_euES = 0x042d; // Basque, Spain + var lcid_wenDE = 0x042e; // Sorbian languages, Germany + var lcid_mkMK = 0x042f; // Macedonian, The Former Yugoslav Republic of Macedonia + var lcid_stZA = 0x0430; // Southern Sotho, South Africa + var lcid_tsZA = 0x0431; // Tsonga, South Africa + var lcid_tnZA = 0x0432; // Tswana, South Africa + var lcid_venZA = 0x0433; // South Africa + var lcid_xhZA = 0x0434; // Xhosa, South Africa + var lcid_zuZA = 0x0435; // Zulu, South Africa + var lcid_afZA = 0x0436; // Afrikaans, South Africa + var lcid_kaGE = 0x0437; // Georgian, Georgia + var lcid_foFO = 0x0438; // Faroese, Faroe Islands + var lcid_hiIN = 0x0439; // Hindi, India + var lcid_mtMT = 0x043a; // Maltese, Malta + var lcid_seNO = 0x043b; // Northern Sami, Norway + var lcid_msMY = 0x043e; // Malay (macrolanguage), Malaysia + var lcid_kkKZ = 0x043f; // Kazakh, Kazakhstan + var lcid_kyKG = 0x0440; // Kirghiz, Kyrgyzstan + var lcid_swKE = 0x0441; // Swahili (macrolanguage), Kenya + var lcid_tkTM = 0x0442; // Turkmen, Turkmenistan + var lcid_uzLatnUZ = 0x0443; // Uzbek, Latin, Uzbekistan + var lcid_ttRU = 0x0444; // Tatar, Russian Federation + var lcid_bnIN = 0x0445; // Bengali, India + var lcid_paIN = 0x0446; // Panjabi, India + var lcid_guIN = 0x0447; // Gujarati, India + var lcid_orIN = 0x0448; // Oriya, India + var lcid_taIN = 0x0449; // Tamil, India + var lcid_teIN = 0x044a; // Telugu, India + var lcid_knIN = 0x044b; // Kannada, India + var lcid_mlIN = 0x044c; // Malayalam, India + var lcid_asIN = 0x044d; // Assamese, India + var lcid_mrIN = 0x044e; // Marathi, India + var lcid_saIN = 0x044f; // Sanskrit, India + var lcid_mnMN = 0x0450; // Mongolian, Mongolia + var lcid_boCN = 0x0451; // Tibetan, China + var lcid_cyGB = 0x0452; // Welsh, United Kingdom + var lcid_kmKH = 0x0453; // Central Khmer, Cambodia + var lcid_loLA = 0x0454; // Lao, Lao People's Democratic Republic + var lcid_myMM = 0x0455; // Burmese, Myanmar + var lcid_glES = 0x0456; // Galician, Spain + var lcid_kokIN = 0x0457; // Konkani (macrolanguage), India + var lcid_mni = 0x0458; // Manipuri + var lcid_sdIN = 0x0459; // Sindhi, India + var lcid_syrSY = 0x045a; // Syriac, Syrian Arab Republic + var lcid_siLK = 0x045b; // Sinhala, Sri Lanka + var lcid_chrUS = 0x045c; // Cherokee, United States + var lcid_iuCansCA = 0x045d; // Inuktitut, Unified Canadian Aboriginal Syllabics, Canada + var lcid_amET = 0x045e; // Amharic, Ethiopia + var lcid_tmz = 0x045f; // Tamanaku + var lcid_neNP = 0x0461; // Nepali, Nepal + var lcid_fyNL = 0x0462; // Western Frisian, Netherlands + var lcid_psAF = 0x0463; // Pushto, Afghanistan + var lcid_filPH = 0x0464; // Filipino, Philippines + var lcid_dvMV = 0x0465; // Dhivehi, Maldives + var lcid_binNG = 0x0466; // Bini, Nigeria + var lcid_fuvNG = 0x0467; // Nigerian Fulfulde, Nigeria + var lcid_haLatnNG = 0x0468; // Hausa, Latin, Nigeria + var lcid_ibbNG = 0x0469; // Ibibio, Nigeria + var lcid_yoNG = 0x046a; // Yoruba, Nigeria + var lcid_quzBO = 0x046b; // Cusco Quechua, Bolivia + var lcid_nsoZA = 0x046c; // Pedi, South Africa + var lcid_baRU = 0x046d; // Bashkir, Russian Federation + var lcid_lbLU = 0x046e; // Luxembourgish, Luxembourg + var lcid_klGL = 0x046f; // Kalaallisut, Greenland + var lcid_igNG = 0x0470; // Igbo, Nigeria + var lcid_krNG = 0x0471; // Kanuri, Nigeria + var lcid_gazET = 0x0472; // West Central Oromo, Ethiopia + var lcid_tiER = 0x0473; // Tigrinya, Eritrea + var lcid_gnPY = 0x0474; // Guarani, Paraguay + var lcid_hawUS = 0x0475; // Hawaiian, United States + var lcid_soSO = 0x0477; // Somali, Somalia + var lcid_iiCN = 0x0478; // Sichuan Yi, China + var lcid_papAN = 0x0479; // Papiamento, Netherlands Antilles + var lcid_arnCL = 0x047a; // Mapudungun, Chile + var lcid_mohCA = 0x047c; // Mohawk, Canada + var lcid_brFR = 0x047e; // Breton, France + var lcid_ugCN = 0x0480; // Uighur, China + var lcid_miNZ = 0x0481; // Maori, New Zealand + var lcid_ocFR = 0x0482; // Occitan (post 1500), France + var lcid_coFR = 0x0483; // Corsican, France + var lcid_gswFR = 0x0484; // Swiss German, France + var lcid_sahRU = 0x0485; // Yakut, Russian Federation + var lcid_qutGT = 0x0486; // Guatemala + var lcid_rwRW = 0x0487; // Kinyarwanda, Rwanda + var lcid_woSN = 0x0488; // Wolof, Senegal + var lcid_prsAF = 0x048c; // Dari, Afghanistan + var lcid_pltMG = 0x048d; // Plateau Malagasy, Madagascar + var lcid_gdGB = 0x0491; // Scottish Gaelic, United Kingdom + var lcid_arIQ = 0x0801; // Arabic, Iraq + var lcid_zhCN = 0x0804; // Chinese, China + var lcid_deCH = 0x0807; // German, Switzerland + var lcid_enGB = 0x0809; // English, United Kingdom + var lcid_esMX = 0x080a; // Spanish, Mexico + var lcid_frBE = 0x080c; // French, Belgium + var lcid_itCH = 0x0810; // Italian, Switzerland + var lcid_nlBE = 0x0813; // Dutch, Belgium + var lcid_nnNO = 0x0814; // Norwegian Nynorsk, Norway + var lcid_ptPT = 0x0816; // Portuguese, Portugal + var lcid_roMO = 0x0818; // Romanian, Macao + var lcid_ruMO = 0x0819; // Russian, Macao + var lcid_srLatnCS = 0x081a; // Serbian, Latin, Serbia and Montenegro + var lcid_svFI = 0x081d; // Swedish, Finland + var lcid_urIN = 0x0820; // Urdu, India + var lcid_azCyrlAZ = 0x082c; // Azerbaijani, Cyrillic, Azerbaijan + var lcid_dsbDE = 0x082e; // Lower Sorbian, Germany + var lcid_seSE = 0x083b; // Northern Sami, Sweden + var lcid_gaIE = 0x083c; // Irish, Ireland + var lcid_msBN = 0x083e; // Malay (macrolanguage), Brunei Darussalam + var lcid_uzCyrlUZ = 0x0843; // Uzbek, Cyrillic, Uzbekistan + var lcid_bnBD = 0x0845; // Bengali, Bangladesh + var lcid_paPK = 0x0846; // Panjabi, Pakistan + var lcid_mnMongCN = 0x0850; // Mongolian, Mongolian, China + var lcid_boBT = 0x0851; // Tibetan, Bhutan + var lcid_sdPK = 0x0859; // Sindhi, Pakistan + var lcid_iuLatnCA = 0x085d; // Inuktitut, Latin, Canada + var lcid_tzmLatnDZ = 0x085f; // Central Atlas Tamazight, Latin, Algeria + var lcid_neIN = 0x0861; // Nepali, India + var lcid_quzEC = 0x086b; // Cusco Quechua, Ecuador + var lcid_tiET = 0x0873; // Tigrinya, Ethiopia + var lcid_arEG = 0x0c01; // Arabic, Egypt + var lcid_zhHK = 0x0c04; // Chinese, Hong Kong + var lcid_deAT = 0x0c07; // German, Austria + var lcid_enAU = 0x0c09; // English, Australia + var lcid_esES = 0x0c0a; // Spanish, Spain + var lcid_frCA = 0x0c0c; // French, Canada + var lcid_srCyrlCS = 0x0c1a; // Serbian, Cyrillic, Serbia and Montenegro + var lcid_seFI = 0x0c3b; // Northern Sami, Finland + var lcid_tmzMA = 0x0c5f; // Tamanaku, Morocco + var lcid_quzPE = 0x0c6b; // Cusco Quechua, Peru + var lcid_arLY = 0x1001; // Arabic, Libyan Arab Jamahiriya + var lcid_zhSG = 0x1004; // Chinese, Singapore + var lcid_deLU = 0x1007; // German, Luxembourg + var lcid_enCA = 0x1009; // English, Canada + var lcid_esGT = 0x100a; // Spanish, Guatemala + var lcid_frCH = 0x100c; // French, Switzerland + var lcid_hrBA = 0x101a; // Croatian, Bosnia and Herzegovina + var lcid_smjNO = 0x103b; // Lule Sami, Norway + var lcid_arDZ = 0x1401; // Arabic, Algeria + var lcid_zhMO = 0x1404; // Chinese, Macao + var lcid_deLI = 0x1407; // German, Liechtenstein + var lcid_enNZ = 0x1409; // English, New Zealand + var lcid_esCR = 0x140a; // Spanish, Costa Rica + var lcid_frLU = 0x140c; // French, Luxembourg + var lcid_bsLatnBA = 0x141a; // Bosnian, Latin, Bosnia and Herzegovina + var lcid_smjSE = 0x143b; // Lule Sami, Sweden + var lcid_arMA = 0x1801; // Arabic, Morocco + var lcid_enIE = 0x1809; // English, Ireland + var lcid_esPA = 0x180a; // Spanish, Panama + var lcid_frMC = 0x180c; // French, Monaco + var lcid_srLatnBA = 0x181a; // Serbian, Latin, Bosnia and Herzegovina + var lcid_smaNO = 0x183b; // Southern Sami, Norway + var lcid_arTN = 0x1c01; // Arabic, Tunisia + var lcid_enZA = 0x1c09; // English, South Africa + var lcid_esDO = 0x1c0a; // Spanish, Dominican Republic + var lcid_frWest = 0x1c0c; // French + var lcid_srCyrlBA = 0x1c1a; // Serbian, Cyrillic, Bosnia and Herzegovina + var lcid_smaSE = 0x1c3b; // Southern Sami, Sweden + var lcid_arOM = 0x2001; // Arabic, Oman + var lcid_enJM = 0x2009; // English, Jamaica + var lcid_esVE = 0x200a; // Spanish, Venezuela + var lcid_frRE = 0x200c; // French, Reunion + var lcid_bsCyrlBA = 0x201a; // Bosnian, Cyrillic, Bosnia and Herzegovina + var lcid_smsFI = 0x203b; // Skolt Sami, Finland + var lcid_arYE = 0x2401; // Arabic, Yemen + var lcid_enCB = 0x2409; // English + var lcid_esCO = 0x240a; // Spanish, Colombia + var lcid_frCG = 0x240c; // French, Congo + var lcid_srLatnRS = 0x241a; // Serbian, Latin, Serbia + var lcid_smnFI = 0x243b; // Inari Sami, Finland + var lcid_arSY = 0x2801; // Arabic, Syrian Arab Republic + var lcid_enBZ = 0x2809; // English, Belize + var lcid_esPE = 0x280a; // Spanish, Peru + var lcid_frSN = 0x280c; // French, Senegal + var lcid_srCyrlRS = 0x281a; // Serbian, Cyrillic, Serbia + var lcid_arJO = 0x2c01; // Arabic, Jordan + var lcid_enTT = 0x2c09; // English, Trinidad and Tobago + var lcid_esAR = 0x2c0a; // Spanish, Argentina + var lcid_frCM = 0x2c0c; // French, Cameroon + var lcid_srLatnME = 0x2c1a; // Serbian, Latin, Montenegro + var lcid_arLB = 0x3001; // Arabic, Lebanon + var lcid_enZW = 0x3009; // English, Zimbabwe + var lcid_esEC = 0x300a; // Spanish, Ecuador + var lcid_frCI = 0x300c; // French, Cote d'Ivoire + var lcid_srCyrlME = 0x301a; // Serbian, Cyrillic, Montenegro + var lcid_arKW = 0x3401; // Arabic, Kuwait + var lcid_enPH = 0x3409; // English, Philippines + var lcid_esCL = 0x340a; // Spanish, Chile + var lcid_frML = 0x340c; // French, Mali + var lcid_arAE = 0x3801; // Arabic, United Arab Emirates + var lcid_enID = 0x3809; // English, Indonesia + var lcid_esUY = 0x380a; // Spanish, Uruguay + var lcid_frMA = 0x380c; // French, Morocco + var lcid_arBH = 0x3c01; // Arabic, Bahrain + var lcid_enHK = 0x3c09; // English, Hong Kong + var lcid_esPY = 0x3c0a; // Spanish, Paraguay + var lcid_frHT = 0x3c0c; // French, Haiti + var lcid_arQA = 0x4001; // Arabic, Qatar + var lcid_enIN = 0x4009; // English, India + var lcid_esBO = 0x400a; // Spanish, Bolivia + var lcid_enMY = 0x4409; // English, Malaysia + var lcid_esSV = 0x440a; // Spanish, El Salvador + var lcid_enSG = 0x4809; // English, Singapore + var lcid_esHN = 0x480a; // Spanish, Honduras + var lcid_esNI = 0x4c0a; // Spanish, Nicaragua + var lcid_esPR = 0x500a; // Spanish, Puerto Rico + var lcid_esUS = 0x540a; // Spanish, United States + var lcid_bsCyrl = 0x641a; // Bosnian, Cyrillic + var lcid_bsLatn = 0x681a; // Bosnian, Latin + var lcid_srCyrl = 0x6c1a; // Serbian, Cyrillic + var lcid_srLatn = 0x701a; // Serbian, Latin + var lcid_smn = 0x703b; // Inari Sami + var lcid_azCyrl = 0x742c; // Azerbaijani, Cyrillic + var lcid_sms = 0x743b; // Skolt Sami + var lcid_zh = 0x7804; // Chinese + var lcid_nn = 0x7814; // Norwegian Nynorsk + var lcid_bs = 0x781a; // Bosnian + var lcid_azLatn = 0x782c; // Azerbaijani, Latin + var lcid_sma = 0x783b; // Southern Sami + var lcid_uzCyrl = 0x7843; // Uzbek, Cyrillic + var lcid_mnCyrl = 0x7850; // Mongolian, Cyrillic + var lcid_iuCans = 0x785d; // Inuktitut, Unified Canadian Aboriginal Syllabics + var lcid_zhHant = 0x7c04; // Chinese, Han (Traditional variant) + var lcid_nb = 0x7c14; // Norwegian Bokmal + var lcid_sr = 0x7c1a; // Serbian + var lcid_tgCyrl = 0x7c28; // Tajik, Cyrillic + var lcid_dsb = 0x7c2e; // Lower Sorbian + var lcid_smj = 0x7c3b; // Lule Sami + var lcid_uzLatn = 0x7c43; // Uzbek, Latin + var lcid_mnMong = 0x7c50; // Mongolian, Mongolian + var lcid_iuLatn = 0x7c5d; // Inuktitut, Latin + var lcid_tzmLatn = 0x7c5f; // Central Atlas Tamazight, Latin + var lcid_haLatn = 0x7c68; // Hausa, Latin + + + /** + * @enum {number} + */ + var c_oUnicodeRangesLID = { + Unknown: 0, + Basic_Latin: 1, + Latin_1_Supplement: 2, + Latin_Extended_A: 3, + Latin_Extended_B: 4, + IPA_Extensions: 5, + Spacing_Modifier_Letters: 6, + Combining_Diacritical_Marks: 7, + Greek_and_Coptic: 8, + Cyrillic: 9, + Cyrillic_Supplement: 10, + Armenian: 11, + Hebrew: 12, + Arabic: 13, + Syriac: 14, + Arabic_Supplement: 15, + Thaana: 16, + NKo: 17, + Samaritan: 18, + Mandaic: 19, + Arabic_Extended_A: 20, + Devanagari: 21, + Bengali: 22, + Gurmukhi: 23, + Gujarati: 24, + Oriya: 25, + Tamil: 26, + Telugu: 27, + Kannada: 28, + Malayalam: 29, + Sinhala: 30, + Thai: 31, + Lao: 32, + Tibetan: 33, + Myanmar: 34, + Georgian: 35, + Hangul_Jamo: 36, + Ethiopic: 37, + Ethiopic_Supplement: 38, + Cherokee: 39, + Unified_Canadian_Aboriginal_Syllabics: 40, + Ogham: 41, + Runic: 42, + Tagalog: 43, + Hanunoo: 44, + Buhid: 45, + Tagbanwa: 46, + Khmer: 47, + Mongolian: 48, + Unified_Canadian_Aboriginal_Syllabics_Extended: 49, + Limbu: 50, + Tai_Le: 51, + New_Tai_Lue: 52, + Khmer_Symbols: 53, + Buginese: 54, + Tai_Tham: 55, + Combining_Diacritical_Marks_Extended: 56, + Balinese: 57, + Sundanese: 58, + Batak: 59, + Lepcha: 60, + Ol_Chiki: 61, + Cyrillic_Extended_C: 62, + Sundanese_Supplement: 63, + Vedic_Extensions: 64, + Phonetic_Extensions: 65, + Phonetic_Extensions_Supplement: 66, + Combining_Diacritical_Marks_Supplement: 67, + Latin_Extended_Additional: 68, + Greek_Extended: 69, + General_Punctuation: 70, + Superscripts_and_Subscripts: 71, + Currency_Symbols: 72, + Combining_Diacritical_Marks_for_Symbols: 73, + Letterlike_Symbols: 74, + Number_Forms: 75, + Arrows: 76, + Mathematical_Operators: 77, + Miscellaneous_Technical: 78, + Control_Pictures: 79, + Optical_Character_Recognition: 80, + Enclosed_Alphanumerics: 81, + Box_Drawing: 82, + Block_Elements: 83, + Geometric_Shapes: 84, + Miscellaneous_Symbols: 85, + Dingbats: 86, + Miscellaneous_Mathematical_Symbols_A: 87, + Supplemental_Arrows_A: 88, + Braille_Patterns: 89, + Supplemental_Arrows_B: 90, + Miscellaneous_Mathematical_Symbols_B: 91, + Supplemental_Mathematical_Operators: 92, + Miscellaneous_Symbols_and_Arrows: 93, + Glagolitic: 94, + Latin_Extended_C: 95, + Coptic: 96, + Georgian_Supplement: 97, + Tifinagh: 98, + Ethiopic_Extended: 99, + Cyrillic_Extended_A: 100, + Supplemental_Punctuation: 101, + CJK_Radicals_Supplement: 102, + Kangxi_Radicals: 103, + Ideographic_Description_Characters: 104, + CJK_Symbols_and_Punctuation: 105, + Hiragana: 106, + Katakana: 107, + Bopomofo: 108, + Hangul_Compatibility_Jamo: 109, + Kanbun: 110, + Bopomofo_Extended: 111, + CJK_Strokes: 112, + Katakana_Phonetic_Extensions: 113, + Enclosed_CJK_Letters_and_Months: 114, + CJK_Compatibility: 115, + CJK_Unified_Ideographs_Extension: 116, + Yijing_Hexagram_Symbols: 117, + CJK_Unified_Ideographs: 118, + Yi_Syllables: 119, + Yi_Radicals: 120, + Lisu: 121, + Vai: 122, + Cyrillic_Extended_B: 123, + Bamum: 124, + Modifier_Tone_Letters: 125, + Latin_Extended_D: 126, + Syloti_Nagri: 127, + Common_Indic_Number_Forms: 128, + Phags_pa: 129, + Saurashtra: 130, + Devanagari_Extended: 131, + Kayah_Li: 132, + Rejang: 133, + Hangul_Jamo_Extended_A: 134, + Javanese: 135, + Myanmar_Extended_B: 136, + Cham: 137, + Myanmar_Extended_A: 138, + Tai_Viet: 139, + Meetei_Mayek_Extensions: 140, + Ethiopic_Extended_A: 141, + Latin_Extended_E: 142, + Cherokee_Supplement: 143, + Meetei_Mayek: 144, + Hangul_Syllables: 145, + Hangul_Jamo_Extended_B: 146, + High_Surrogates: 147, + High_Private_Use_Surrogates: 148, + Low_Surrogates: 149, + Private_Use_Area: 150, + CJK_Compatibility_Ideographs: 151, + Alphabetic_Presentation_Forms: 152, + Arabic_Presentation_Forms_A: 153, + Variation_Selectors: 154, + Vertical_Forms: 155, + Combining_Half_Marks: 156, + CJK_Compatibility_Forms: 157, + Small_Form_Variants: 158, + Arabic_Presentation_Forms_B: 159, + Halfwidth_and_Fullwidth_Forms: 160, + Specials: 161, + Linear_B_Syllabary: 162, + Linear_B_Ideograms: 163, + Aegean_Numbers: 164, + Ancient_Greek_Numbers: 165, + Ancient_Symbols: 166, + Phaistos_Disc: 167, + Lycian: 168, + Carian: 169, + Coptic_Epact_Numbers: 170, + Old_Italic: 171, + Gothic: 172, + Old_Permic: 173, + Ugaritic: 174, + Old_Persian: 175, + Deseret: 176, + Shavian: 177, + Osmanya: 178, + Osage: 179, + Elbasan: 180, + Caucasian_Albanian: 181, + Linear_A: 182, + Cypriot_Syllabary: 183, + Imperial_Aramaic: 184, + Palmyrene: 185, + Nabataean: 186, + Hatran: 187, + Phoenician: 188, + Lydian: 189, + Meroitic_Hieroglyphs: 190, + Meroitic_Cursive: 191, + Kharoshthi: 192, + Old_South_Arabian: 193, + Old_North_Arabian: 194, + Manichaean: 195, + Avestan: 196, + Inscriptional_Parthian: 197, + Inscriptional_Pahlavi: 198, + Psalter_Pahlavi: 199, + Old_Turkic: 200, + Old_Hungarian: 201, + Rumi_Numeral_Symbols: 202, + Brahmi: 203, + Kaithi: 204, + Sora_Sompeng: 205, + Chakma: 206, + Mahajani: 207, + Sharada: 208, + Sinhala_Archaic_Numbers: 209, + Khojki: 210, + Multani: 211, + Khudawadi: 212, + Grantha: 213, + Newa: 214, + Tirhuta: 215, + Siddham: 216, + Modi: 217, + Mongolian_Supplement: 218, + Takri: 219, + Ahom: 220, + Warang_Citi: 221, + Pau_Cin_Hau: 222, + Bhaiksuki: 223, + Marchen: 224, + Cuneiform: 225, + Cuneiform_Numbers_and_Punctuation: 226, + Early_Dynastic_Cuneiform: 227, + Egyptian_Hieroglyphs: 228, + Anatolian_Hieroglyphs: 229, + Bamum_Supplement: 230, + Mro: 231, + Bassa_Vah: 232, + Pahawh_Hmong: 233, + Miao: 234, + Ideographic_Symbols_and_Punctuation: 235, + Tangut: 236, + Tangut_Components: 237, + Kana_Supplement: 238, + Duployan: 239, + Shorthand_Format_Controls: 240, + Byzantine_Musical_Symbols: 241, + Musical_Symbols: 242, + Ancient_Greek_Musical_Notation: 243, + Tai_Xuan_Jing_Symbols: 244, + Counting_Rod_Numerals: 245, + Mathematical_Alphanumeric_Symbols: 246, + Sutton_SignWriting: 247, + Glagolitic_Supplement: 248, + Mende_Kikakui: 249, + Adlam: 250, + Arabic_Mathematical_Alphabetic_Symbols: 251, + Mahjong_Tiles: 252, + Domino_Tiles: 253, + Playing_Cards: 254, + Enclosed_Alphanumeric_Supplement: 255, + Enclosed_Ideographic_Supplement: 256, + Miscellaneous_Symbols_and_Pictographs: 257, + Emoticons: 258, + Ornamental_Dingbats: 259, + Transport_and_Map_Symbols: 260, + Alchemical_Symbols: 261, + Geometric_Shapes_Extended: 262, + Supplemental_Arrows_C: 263, + Supplemental_Symbols_and_Pictographs: 264, + CJK_Unified_Ideographs_Extension_B: 265, + CJK_Unified_Ideographs_Extension_C: 266, + CJK_Unified_Ideographs_Extension_D: 267, + CJK_Unified_Ideographs_Extension_E: 268, + CJK_Compatibility_Ideographs_Supplement: 269, + Tags: 270, + Variation_Selectors_Supplement: 271, + Supplementary_Private_Use_Area_A: 272, + Supplementary_Private_Use_Area_B: 273 + }; + + /** + * @enum {number} + */ + var c_oCodePagesOS2_1 = { + Latin_1: 0, + Latin_2: 1, + Cyrillic: 2, + Greek: 3, + Turkish: 4, + Hebrew: 5, + Arabic: 6, + Windows_Baltic: 7, + Vietnamese: 8, + + Thai: 16, + JIS_Japan: 17, + Chinese_Simplified: 18, + Korean_Wansung: 19, + Chinese_Traditional: 20, + Korean_Johab: 21, + + Macintosh_Character_Set_US_Roman: 29, + OEM_Character_Set: 30, + Symbol_Character_Set: 31 + }; + + /** + * @enum {number} + */ + var c_oCodePagesOS2_2 = { + IBM_Greek: 48 - 32, + MS_DOS_Russian: 49 - 32, + MS_DOS_Nordic: 50 - 32, + Arabic: 51 - 32, + MS_DOS_Canadian_French: 52 - 32, + Hebrew: 53 - 32, + MS_DOS_Icelandic: 54 - 32, + MS_DOS_Portuguese: 55 - 32, + IBM_Turkish: 56 - 32, + IBM_Cyrillic: 57 - 32, + Latin_2: 58 - 32, + MS_DOS_Baltic: 59 - 32, + Greek_437: 60 - 32, + Arabic_708: 61 - 32, + WE_Latin_1: 62 - 32, + US: 63 - 32 + }; + + /** + * @enum {number} + */ + var c_oUnicodeRangeOS2_1 = { + Basic_Latin: 0, + Latin_1_Supplement: 1, + Latin_Extended_A: 2, + Latin_Extended_B: 3, + IPA_Extensions: 4, + Spacing_Modifier_Letters: 5, + Combining_Diacritical_Marks: 6, + Greek_and_Coptic: 7, + Coptic: 8, + Cyrillic: 9, + Armenian: 10, + Hebrew: 11, + Vai: 12, + Arabic: 13, + NKo: 14, + Devanagari: 15, + Bengali: 16, + Gurmukhi: 17, + Gujarati: 18, + Oriya: 19, + Tamil: 20, + Telugu: 21, + Kannada: 22, + Malayalam: 23, + Thai: 24, + Lao: 25, + Georgian: 26, + Balinese: 27, + Hangul_Jamo: 28, + Latin_Extended_Additional: 29, + Greek_Extended: 30, + General_Punctuation: 31 + }; + + /** + * @enum {number} + */ + var c_oUnicodeRangeOS2_2 = { + Superscripts_And_Subscripts: 32 - 32, + Currency_Symbols: 33 - 32, + Combining_Diacritical_Marks_For_Symbols: 34 - 32, + Letterlike_Symbols: 35 - 32, + Number_Forms: 36 - 32, + Arrows: 37 - 32, + Mathematical_Operators: 38 - 32, + Miscellaneous_Technical: 39 - 32, + Control_Pictures: 40 - 32, + Optical_Character_Recognition: 41 - 32, + Enclosed_Alphanumerics: 42 - 32, + Box_Drawing: 43 - 32, + Block_Elements: 44 - 32, + Geometric_Shapes: 45 - 32, + Miscellaneous_Symbols: 46 - 32, + Dingbats: 47 - 32, + CJK_Symbols_And_Punctuation: 48 - 32, + Hiragana: 49 - 32, + Katakana: 50 - 32, + Bopomofo: 51 - 32, + Hangul_Compatibility_Jamo: 52 - 32, + Phags_pa: 53 - 32, + Enclosed_CJK_Letters_And_Months: 54 - 32, + CJK_Compatibility: 55 - 32, + Hangul_Syllables: 56 - 32, + Non_Plane: 57 - 32, + Phoenician: 58 - 32, + CJK_Unified_Ideographs: 59 - 32, + Private_Use_Area_plane_0: 60 - 32, + CJK_Strokes: 61 - 32, + Alphabetic_Presentation_Forms: 62 - 32, + Arabic_Presentation_Forms_A: 63 - 32 + }; + + /** + * @enum {number} + */ + var c_oUnicodeRangeOS2_3 = { + Combining_Half_Marks: 64 - 64, + Vertical_Forms: 65 - 64, + Small_Form_Variants: 66 - 64, + Arabic_Presentation_Forms_B: 67 - 64, + Halfwidth_And_Fullwidth_Forms: 68 - 64, + Specials: 69 - 64, + Tibetan: 70 - 64, + Syriac: 71 - 64, + Thaana: 72 - 64, + Sinhala: 73 - 64, + Myanmar: 74 - 64, + Ethiopic: 75 - 64, + Cherokee: 76 - 64, + Unified_Canadian_Aboriginal_Syllabics: 77 - 64, + Ogham: 78 - 64, + Runic: 79 - 64, + Khmer: 80 - 64, + Mongolian: 81 - 64, + Braille_Patterns: 82 - 64, + Yi_Syllables: 83 - 64, + Tagalog: 84 - 64, + Old_Italic: 85 - 64, + Gothic: 86 - 64, + Deseret: 87 - 64, + Byzantine_Musical_Symbols: 88 - 64, + Mathematical_Alphanumeric_Symbols: 89 - 64, + Private_Use_plane_15: 90 - 64, + Variation_Selectors: 91 - 64, + Tags: 92 - 64, + Limbu: 93 - 64, + Tai_Le: 94 - 64, + New_Tai_Lue: 95 - 64 + }; + + /** + * @enum {number} + */ + var c_oUnicodeRangeOS2_4 = { + Buginese: 96 - 96, + Glagolitic: 97 - 96, + Tifinagh: 98 - 96, + Yijing_Hexagram_Symbols: 99 - 96, + Syloti_Nagri: 100 - 96, + Linear_B_Syllabary: 101 - 96, + Ancient_Greek_Numbers: 102 - 96, + Ugaritic: 103 - 96, + Old_Persian: 104 - 96, + Shavian: 105 - 96, + Osmanya: 106 - 96, + Cypriot_Syllabary: 107 - 96, + Kharoshthi: 108 - 96, + Tai_Xuan_Jing_Symbols: 109 - 96, + Cuneiform: 110 - 96, + Counting_Rod_Numerals: 111 - 96, + Sundanese: 112 - 96, + Lepcha: 113 - 96, + Ol_Chiki: 114 - 96, + Saurashtra: 115 - 96, + Kayah_Li: 116 - 96, + Rejang: 117 - 96, + Cham: 118 - 96, + Ancient_Symbols: 119 - 96, + Phaistos_Disc: 120 - 96, + Carian: 121 - 96, + Domino_Tiles: 122 - 96 + }; + + /** + * @param {_start} start range value + * @param {_end} end range value + * @param {_name} not used range name + * @param {_lid} language id for ooxml format + * @param {_picks} in os/2 font table: [ulUnicodeRange1, ulUnicodeRange2, ulUnicodeRange3, ulUnicodeRange4, ulCodePageRange1, ulCodePageRange2]; + */ + function CRange(_start, _end, _name, _lid, _picks) + { + this.Start = _start; + this.End = _end; + this.Name = _name; + this.Lid = _lid; + this.Param = _picks; + }; + + var c_oUnicodeRanges = [ + new CRange(0x0020, 0x007E, c_oUnicodeRangesLID.Basic_Latin, lcid_enUS, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1), 0]), + new CRange(0x00A0, 0x00FF, c_oUnicodeRangesLID.Latin_1_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin) | (1 << c_oUnicodeRangeOS2_1.Latin_1_Supplement), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1), 0]), + new CRange(0x0100, 0x017F, c_oUnicodeRangesLID.Latin_Extended_A, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin) | (1 << c_oUnicodeRangeOS2_1.Latin_Extended_A), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1) | (1 << c_oCodePagesOS2_1.Latin_2) | (1 << c_oCodePagesOS2_1.Turkish) | (1 << c_oCodePagesOS2_1.Windows_Baltic), 0]), + new CRange(0x0180, 0x024F, c_oUnicodeRangesLID.Latin_Extended_B, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin) | (1 << c_oUnicodeRangeOS2_1.Latin_Extended_B), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1) | (1 << c_oCodePagesOS2_1.Latin_2) | (1 << c_oCodePagesOS2_1.Turkish) | (1 << c_oCodePagesOS2_1.Windows_Baltic), 0]), + new CRange(0x0250, 0x02AF, c_oUnicodeRangesLID.IPA_Extensions, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.IPA_Extensions), 0, 0, 0, 0, 0]), + new CRange(0x02B0, 0x02FF, c_oUnicodeRangesLID.Spacing_Modifier_Letters, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Spacing_Modifier_Letters), 0, 0, 0, 0, 0]), + new CRange(0x0300, 0x036F, c_oUnicodeRangesLID.Combining_Diacritical_Marks, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Combining_Diacritical_Marks), 0, 0, 0, 0, 0]), + new CRange(0x0370, 0x03FF, c_oUnicodeRangesLID.Greek_and_Coptic, lcid_elGR, [(1 << c_oUnicodeRangeOS2_1.Greek_and_Coptic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Greek), 0]), + new CRange(0x0400, 0x04FF, c_oUnicodeRangesLID.Cyrillic, lcid_ruRU, [(1 << c_oUnicodeRangeOS2_1.Cyrillic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Cyrillic), 0]), + new CRange(0x0500, 0x052F, c_oUnicodeRangesLID.Cyrillic_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Cyrillic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Cyrillic), 0]), + new CRange(0x0530, 0x058F, c_oUnicodeRangesLID.Armenian, lcid_hyAM, [(1 << c_oUnicodeRangeOS2_1.Armenian), 0, 0, 0, 0, 0]), + new CRange(0x0590, 0x05FF, c_oUnicodeRangesLID.Hebrew, lcid_heIL, [(1 << c_oUnicodeRangeOS2_1.Hebrew), 0, 0, 0, (1 << c_oCodePagesOS2_1.Hebrew), (1 << c_oCodePagesOS2_2.Hebrew)]), + new CRange(0x0600, 0x06FF, c_oUnicodeRangesLID.Arabic, lcid_ar, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x0700, 0x074F, c_oUnicodeRangesLID.Syriac, lcid_syrSY, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x0750, 0x077F, c_oUnicodeRangesLID.Arabic_Supplement, lcid_ar, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x0780, 0x07BF, c_oUnicodeRangesLID.Thaana, lcid_dvMV, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x07C0, 0x07FF, c_oUnicodeRangesLID.NKo, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.NKo), 0, 0, 0, 0, 0]), + new CRange(0x0800, 0x083F, c_oUnicodeRangesLID.Samaritan, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Hebrew), 0, 0, 0, (1 << c_oCodePagesOS2_1.Hebrew), 0]), + new CRange(0x0840, 0x085F, c_oUnicodeRangesLID.Mandaic, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x08A0, 0x08FF, c_oUnicodeRangesLID.Arabic_Extended_A, lcid_ar, [(1 << c_oUnicodeRangeOS2_1.Arabic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0x0900, 0x097F, c_oUnicodeRangesLID.Devanagari, lcid_hiIN, [(1 << c_oUnicodeRangeOS2_1.Devanagari), 0, 0, 0, 0, 0]), + new CRange(0x0980, 0x09FF, c_oUnicodeRangesLID.Bengali, lcid_bnIN, [(1 << c_oUnicodeRangeOS2_1.Bengali), 0, 0, 0, 0, 0]), + new CRange(0x0A00, 0x0A7F, c_oUnicodeRangesLID.Gurmukhi, lcid_paIN, [(1 << c_oUnicodeRangeOS2_1.Gurmukhi), 0, 0, 0, 0, 0]), + new CRange(0x0A80, 0x0AFF, c_oUnicodeRangesLID.Gujarati, lcid_guIN, [(1 << c_oUnicodeRangeOS2_1.Gujarati), 0, 0, 0, 0, 0]), + new CRange(0x0B00, 0x0B7F, c_oUnicodeRangesLID.Oriya, lcid_orIN, [(1 << c_oUnicodeRangeOS2_1.Oriya), 0, 0, 0, 0, 0]), + new CRange(0x0B80, 0x0BFF, c_oUnicodeRangesLID.Tamil, lcid_taIN, [(1 << c_oUnicodeRangeOS2_1.Tamil), 0, 0, 0, 0, 0]), + new CRange(0x0C00, 0x0C7F, c_oUnicodeRangesLID.Telugu, lcid_teIN, [(1 << c_oUnicodeRangeOS2_1.Telugu), 0, 0, 0, 0, 0]), + new CRange(0x0C80, 0x0CFF, c_oUnicodeRangesLID.Kannada, lcid_knIN, [(1 << c_oUnicodeRangeOS2_1.Kannada), 0, 0, 0, 0, 0]), + new CRange(0x0D00, 0x0D7F, c_oUnicodeRangesLID.Malayalam, lcid_mlIN, [(1 << c_oUnicodeRangeOS2_1.Malayalam), 0, 0, 0, 0, 0]), + new CRange(0x0D80, 0x0DFF, c_oUnicodeRangesLID.Sinhala, lcid_siLK, [0, 0, (1 << c_oUnicodeRangeOS2_3.Sinhala), 0, 0, 0]), + new CRange(0x0E00, 0x0E7F, c_oUnicodeRangesLID.Thai, lcid_thTH, [(1 << c_oUnicodeRangeOS2_1.Thai), 0, 0, 0, (1 << c_oCodePagesOS2_1.Thai), 0]), + new CRange(0x0E80, 0x0EFF, c_oUnicodeRangesLID.Lao, lcid_loLA, [(1 << c_oUnicodeRangeOS2_1.Lao), 0, 0, 0, 0, 0]), + new CRange(0x0F00, 0x0FFF, c_oUnicodeRangesLID.Tibetan, lcid_boBT, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tibetan), 0, 0, 0]), + new CRange(0x1000, 0x109F, c_oUnicodeRangesLID.Myanmar, lcid_myMM, [0, 0, (1 << c_oUnicodeRangeOS2_3.Myanmar), 0, 0, 0]), + new CRange(0x10A0, 0x10FF, c_oUnicodeRangesLID.Georgian, lcid_kaGE, [(1 << c_oUnicodeRangeOS2_1.Georgian), 0, 0, 0, 0, 0]), + new CRange(0x1100, 0x11FF, c_oUnicodeRangesLID.Hangul_Jamo, lcid_koKR, [(1 << c_oUnicodeRangeOS2_1.Hangul_Jamo), 0, 0, 0, (1 << c_oCodePagesOS2_1.Korean_Wansung), 0]), + new CRange(0x1200, 0x137F, c_oUnicodeRangesLID.Ethiopic, lcid_gazET, [0, 0, (1 << c_oUnicodeRangeOS2_3.Ethiopic), 0, 0, 0]), + new CRange(0x1380, 0x139F, c_oUnicodeRangesLID.Ethiopic_Supplement, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Ethiopic), 0, 0, 0]), + new CRange(0x13A0, 0x13FF, c_oUnicodeRangesLID.Cherokee, lcid_chrUS, [0, 0, (1 << c_oUnicodeRangeOS2_3.Cherokee), 0, 0, 0]), + new CRange(0x1400, 0x167F, c_oUnicodeRangesLID.Unified_Canadian_Aboriginal_Syllabics, lcid_iuCansCA, [0, 0, (1 << c_oUnicodeRangeOS2_3.Unified_Canadian_Aboriginal_Syllabics), 0, 0, 0]), + new CRange(0x1680, 0x169F, c_oUnicodeRangesLID.Ogham, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Ogham), 0, 0, 0]), + new CRange(0x16A0, 0x16FF, c_oUnicodeRangesLID.Runic, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Runic), 0, 0, 0]), + new CRange(0x1700, 0x171F, c_oUnicodeRangesLID.Tagalog, lcid_filPH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tagalog), 0, 0, 0]), + new CRange(0x1720, 0x173F, c_oUnicodeRangesLID.Hanunoo, lcid_filPH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tagalog), 0, 0, 0]), + new CRange(0x1740, 0x175F, c_oUnicodeRangesLID.Buhid, lcid_filPH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tagalog), 0, 0, 0]), + new CRange(0x1760, 0x177F, c_oUnicodeRangesLID.Tagbanwa, lcid_filPH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tagalog), 0, 0, 0]), + new CRange(0x1780, 0x17FF, c_oUnicodeRangesLID.Khmer, lcid_kmKH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Khmer), 0, 0, 0]), + new CRange(0x1800, 0x18AF, c_oUnicodeRangesLID.Mongolian, lcid_mnMN, [0, 0, (1 << c_oUnicodeRangeOS2_3.Mongolian), 0, 0, 0]), + new CRange(0x18B0, 0x18FF, c_oUnicodeRangesLID.Unified_Canadian_Aboriginal_Syllabics_Extended, lcid_iuCansCA, [0, 0, (1 << c_oUnicodeRangeOS2_3.Unified_Canadian_Aboriginal_Syllabics), 0, 0, 0]), + new CRange(0x1900, 0x194F, c_oUnicodeRangesLID.Limbu, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Limbu), 0, 0, 0]), + new CRange(0x1950, 0x197F, c_oUnicodeRangesLID.Tai_Le, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tai_Le), 0, 0, 0]), + new CRange(0x1980, 0x19DF, c_oUnicodeRangesLID.New_Tai_Lue, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.New_Tai_Lue), 0, 0, 0]), + new CRange(0x19E0, 0x19FF, c_oUnicodeRangesLID.Khmer_Symbols, lcid_kmKH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Khmer), 0, 0, 0]), + new CRange(0x1A00, 0x1A1F, c_oUnicodeRangesLID.Buginese, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Buginese), 0, 0, 0]), + new CRange(0x1A20, 0x1AAF, c_oUnicodeRangesLID.Tai_Tham, lcid_thTH, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tai_Le), 0, 0, 0]), + new CRange(0x1AB0, 0x1AFF, c_oUnicodeRangesLID.Combining_Diacritical_Marks_Extended, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Combining_Diacritical_Marks), 0, 0, 0, 0, 0]), + new CRange(0x1B00, 0x1B7F, c_oUnicodeRangesLID.Balinese, lcid_idID, [(1 << c_oUnicodeRangeOS2_1.Balinese), 0, 0, 0, 0, 0]), + new CRange(0x1B80, 0x1BBF, c_oUnicodeRangesLID.Sundanese, lcid_idID, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Sundanese), 0, 0]), + new CRange(0x1BC0, 0x1BFF, c_oUnicodeRangesLID.Batak, lcid_idID, []), + new CRange(0x1C00, 0x1C4F, c_oUnicodeRangesLID.Lepcha, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Lepcha), 0, 0]), + new CRange(0x1C50, 0x1C7F, c_oUnicodeRangesLID.Ol_Chiki, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Ol_Chiki), 0, 0]), + new CRange(0x1C80, 0x1C8F, c_oUnicodeRangesLID.Cyrillic_Extended_C, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Cyrillic), 0, 0, 0, 0, 0]), + new CRange(0x1CC0, 0x1CCF, c_oUnicodeRangesLID.Sundanese_Supplement, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Sundanese), 0, 0]), + new CRange(0x1CD0, 0x1CFF, c_oUnicodeRangesLID.Vedic_Extensions, lcid_unknown, []), + new CRange(0x1D00, 0x1D7F, c_oUnicodeRangesLID.Phonetic_Extensions, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.IPA_Extensions), 0, 0, 0, 0, 0]), + new CRange(0x1D80, 0x1DBF, c_oUnicodeRangesLID.Phonetic_Extensions_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.IPA_Extensions), 0, 0, 0, 0, 0]), + new CRange(0x1DC0, 0x1DFF, c_oUnicodeRangesLID.Combining_Diacritical_Marks_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Combining_Diacritical_Marks), 0, 0, 0, 0, 0]), + new CRange(0x1E00, 0x1EFF, c_oUnicodeRangesLID.Latin_Extended_Additional, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Latin_Extended_Additional), 0, 0, 0, (1 << c_oCodePagesOS2_1.Vietnamese), 0]), + new CRange(0x1F00, 0x1FFF, c_oUnicodeRangesLID.Greek_Extended, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Greek_Extended), 0, 0, 0, 0, 0]), + new CRange(0x2000, 0x206F, c_oUnicodeRangesLID.General_Punctuation, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Punctuation), 0, 0, 0, 0, 0]), + new CRange(0x2070, 0x209F, c_oUnicodeRangesLID.Superscripts_and_Subscripts, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Superscripts_And_Subscripts), 0, 0, 0, 0]), + new CRange(0x20A0, 0x20CF, c_oUnicodeRangesLID.Currency_Symbols, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Currency_Symbols), 0, 0, 0, 0]), + new CRange(0x20D0, 0x20FF, c_oUnicodeRangesLID.Combining_Diacritical_Marks_for_Symbols, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Combining_Diacritical_Marks_For_Symbols), 0, 0, 0, 0]), + new CRange(0x2100, 0x214F, c_oUnicodeRangesLID.Letterlike_Symbols, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Letterlike_Symbols), 0, 0, 0, 0]), + new CRange(0x2150, 0x218F, c_oUnicodeRangesLID.Number_Forms, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Number_Forms), 0, 0, 0, 0]), + new CRange(0x2190, 0x21FF, c_oUnicodeRangesLID.Arrows, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arrows), 0, 0, 0, 0]), + new CRange(0x2200, 0x22FF, c_oUnicodeRangesLID.Mathematical_Operators, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Mathematical_Operators), 0, 0, 0, 0]), + new CRange(0x2300, 0x23FF, c_oUnicodeRangesLID.Miscellaneous_Technical, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Miscellaneous_Technical), 0, 0, 0, 0]), + new CRange(0x2400, 0x243F, c_oUnicodeRangesLID.Control_Pictures, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Control_Pictures), 0, 0, 0, 0]), + new CRange(0x2440, 0x245F, c_oUnicodeRangesLID.Optical_Character_Recognition, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Optical_Character_Recognition), 0, 0, 0, 0]), + new CRange(0x2460, 0x24FF, c_oUnicodeRangesLID.Enclosed_Alphanumerics, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Enclosed_Alphanumerics), 0, 0, 0, 0]), + new CRange(0x2500, 0x257F, c_oUnicodeRangesLID.Box_Drawing, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Box_Drawing), 0, 0, 0, 0]), + new CRange(0x2580, 0x259F, c_oUnicodeRangesLID.Block_Elements, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Block_Elements), 0, 0, 0, 0]), + new CRange(0x25A0, 0x25FF, c_oUnicodeRangesLID.Geometric_Shapes, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Geometric_Shapes), 0, 0, 0, 0]), + new CRange(0x2600, 0x26FF, c_oUnicodeRangesLID.Miscellaneous_Symbols, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Miscellaneous_Symbols), 0, 0, 0, 0]), + new CRange(0x2700, 0x27BF, c_oUnicodeRangesLID.Dingbats, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Dingbats), 0, 0, 0, 0]), + new CRange(0x27C0, 0x27EF, c_oUnicodeRangesLID.Miscellaneous_Mathematical_Symbols_A, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Mathematical_Operators), 0, 0, 0, 0]), + new CRange(0x27F0, 0x27FF, c_oUnicodeRangesLID.Supplemental_Arrows_A, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arrows), 0, 0, 0, 0]), + new CRange(0x2800, 0x28FF, c_oUnicodeRangesLID.Braille_Patterns, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Braille_Patterns), 0, 0, 0]), + new CRange(0x2900, 0x297F, c_oUnicodeRangesLID.Supplemental_Arrows_B, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arrows), 0, 0, 0, 0]), + new CRange(0x2980, 0x29FF, c_oUnicodeRangesLID.Miscellaneous_Mathematical_Symbols_B, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Mathematical_Operators), 0, 0, 0, 0]), + new CRange(0x2A00, 0x2AFF, c_oUnicodeRangesLID.Supplemental_Mathematical_Operators, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Mathematical_Operators), 0, 0, 0, 0]), + new CRange(0x2B00, 0x2BFF, c_oUnicodeRangesLID.Miscellaneous_Symbols_and_Arrows, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arrows), 0, 0, 0, 0]), + new CRange(0x2C00, 0x2C5F, c_oUnicodeRangesLID.Glagolitic, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_2.Glagolitic), 0, 0]), + new CRange(0x2C60, 0x2C7F, c_oUnicodeRangesLID.Latin_Extended_C, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Latin_Extended_Additional), 0, 0, 0, 0, 0]), + new CRange(0x2C80, 0x2CFF, c_oUnicodeRangesLID.Coptic, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Coptic), 0, 0, 0, 0, 0]), + new CRange(0x2D00, 0x2D2F, c_oUnicodeRangesLID.Georgian_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Georgian), 0, 0, 0, 0, 0]), + new CRange(0x2D30, 0x2D7F, c_oUnicodeRangesLID.Tifinagh, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Tifinagh), 0, 0]), + new CRange(0x2D80, 0x2DDF, c_oUnicodeRangesLID.Ethiopic_Extended, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Ethiopic), 0, 0, 0]), + new CRange(0x2DE0, 0x2DFF, c_oUnicodeRangesLID.Cyrillic_Extended_A, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Cyrillic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Cyrillic), 0]), + new CRange(0x2E00, 0x2E7F, c_oUnicodeRangesLID.Supplemental_Punctuation, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.General_Punctuation), 0, 0, 0, 0, 0]), + new CRange(0x2E80, 0x2EFF, c_oUnicodeRangesLID.CJK_Radicals_Supplement, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, 0, 0]), + new CRange(0x2F00, 0x2FDF, c_oUnicodeRangesLID.Kangxi_Radicals, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, 0, 0]), + new CRange(0x2FF0, 0x2FFF, c_oUnicodeRangesLID.Ideographic_Description_Characters, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, 0, 0]), + new CRange(0x3000, 0x303F, c_oUnicodeRangesLID.CJK_Symbols_and_Punctuation, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Symbols_And_Punctuation), 0, 0, (1 << c_oCodePagesOS2_1.JIS_Japan) | (1 << c_oCodePagesOS2_1.OEM_Character_Set), 0]), + new CRange(0x3040, 0x309F, c_oUnicodeRangesLID.Hiragana, lcid_jaJP, [0, (1 << c_oUnicodeRangeOS2_2.Hiragana), 0, 0, 0, 0]), + new CRange(0x30A0, 0x30FF, c_oUnicodeRangesLID.Katakana, lcid_jaJP, [0, (1 << c_oUnicodeRangeOS2_2.Katakana), 0, 0, 0, 0]), + new CRange(0x3100, 0x312F, c_oUnicodeRangesLID.Bopomofo, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Bopomofo), 0, 0, 0, 0]), + new CRange(0x3130, 0x318F, c_oUnicodeRangesLID.Hangul_Compatibility_Jamo, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Hangul_Compatibility_Jamo), 0, 0, (1 << c_oCodePagesOS2_1.Korean_Wansung), 0]), + new CRange(0x3190, 0x319F, c_oUnicodeRangesLID.Kanbun, lcid_zhCN, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, 0, 0]), + new CRange(0x31A0, 0x31BF, c_oUnicodeRangesLID.Bopomofo_Extended, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Bopomofo), 0, 0, 0, 0]), + new CRange(0x31C0, 0x31EF, c_oUnicodeRangesLID.CJK_Strokes, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Strokes), 0, 0, 0, 0]), + new CRange(0x31F0, 0x31FF, c_oUnicodeRangesLID.Katakana_Phonetic_Extensions, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Katakana), 0, 0, 0, 0]), + new CRange(0x3200, 0x32FF, c_oUnicodeRangesLID.Enclosed_CJK_Letters_and_Months, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Enclosed_CJK_Letters_And_Months), 0, 0, 0, 0]), + new CRange(0x3300, 0x33FF, c_oUnicodeRangesLID.CJK_Compatibility, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Compatibility), 0, 0, 0, 0]), + new CRange(0x3400, 0x4DBF, c_oUnicodeRangesLID.CJK_Unified_Ideographs_Extension, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x4DC0, 0x4DFF, c_oUnicodeRangesLID.Yijing_Hexagram_Symbols, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Yijing_Hexagram_Symbols), (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x4E00, 0x9FFF, c_oUnicodeRangesLID.CJK_Unified_Ideographs, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Unified_Ideographs), 0, 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional) | (1 << c_oCodePagesOS2_1.JIS_Japan) | (1 << c_oCodePagesOS2_1.OEM_Character_Set), 0]), + new CRange(0xA000, 0xA48F, c_oUnicodeRangesLID.Yi_Syllables, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Yi_Syllables), 0, 0, 0]), + new CRange(0xA490, 0xA4CF, c_oUnicodeRangesLID.Yi_Radicals, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Yi_Radicals), 0, 0, 0]), + new CRange(0xA4D0, 0xA4FF, c_oUnicodeRangesLID.Lisu, lcid_unknown, []), + new CRange(0xA500, 0xA63F, c_oUnicodeRangesLID.Vai, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Vai), 0, 0, 0, 0, 0]), + new CRange(0xA640, 0xA69F, c_oUnicodeRangesLID.Cyrillic_Extended_B, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Cyrillic), 0, 0, 0, (1 << c_oCodePagesOS2_1.Cyrillic), 0]), + new CRange(0xA6A0, 0xA6FF, c_oUnicodeRangesLID.Bamum, lcid_unknown, []), + new CRange(0xA700, 0xA71F, c_oUnicodeRangesLID.Modifier_Tone_Letters, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Spacing_Modifier_Letters), 0, 0, 0, 0, 0]), + new CRange(0xA720, 0xA7FF, c_oUnicodeRangesLID.Latin_Extended_D, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Latin_Extended_Additional), 0, 0, 0, 0, 0]), + new CRange(0xA800, 0xA82F, c_oUnicodeRangesLID.Syloti_Nagri, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Syloti_Nagri), 0, 0]), + new CRange(0xA830, 0xA83F, c_oUnicodeRangesLID.Common_Indic_Number_Forms, lcid_unknown, []), + new CRange(0xA840, 0xA87F, c_oUnicodeRangesLID.Phags_pa, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Phags_pa), 0, 0, 0, 0]), + new CRange(0xA880, 0xA8DF, c_oUnicodeRangesLID.Saurashtra, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Saurashtra), 0, 0]), + new CRange(0xA8E0, 0xA8FF, c_oUnicodeRangesLID.Devanagari_Extended, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Devanagari), 0, 0, 0, 0, 0]), + new CRange(0xA900, 0xA92F, c_oUnicodeRangesLID.Kayah_Li, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Kayah_Li), 0, 0]), + new CRange(0xA930, 0xA95F, c_oUnicodeRangesLID.Rejang, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Rejang), 0, 0]), + new CRange(0xA960, 0xA97F, c_oUnicodeRangesLID.Hangul_Jamo_Extended_A, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Hangul_Jamo), 0, 0, 0, 0, 0]), + new CRange(0xA980, 0xA9DF, c_oUnicodeRangesLID.Javanese, lcid_idID, []), + new CRange(0xA9E0, 0xA9FF, c_oUnicodeRangesLID.Myanmar_Extended_B, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Myanmar), 0, 0, 0]), + new CRange(0xAA00, 0xAA5F, c_oUnicodeRangesLID.Cham, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Cham), 0, 0]), + new CRange(0xAA60, 0xAA7F, c_oUnicodeRangesLID.Myanmar_Extended_A, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Myanmar), 0, 0, 0]), + new CRange(0xAA80, 0xAADF, c_oUnicodeRangesLID.Tai_Viet, lcid_unknown, []), + new CRange(0xAAE0, 0xAAFF, c_oUnicodeRangesLID.Meetei_Mayek_Extensions, lcid_unknown, []), + new CRange(0xAB00, 0xAB2F, c_oUnicodeRangesLID.Ethiopic_Extended_A, lcid_unknown, []), + new CRange(0xAB30, 0xAB6F, c_oUnicodeRangesLID.Latin_Extended_E, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Latin_Extended_Additional), 0, 0, 0, 0, 0]), + new CRange(0xAB70, 0xABBF, c_oUnicodeRangesLID.Cherokee_Supplement, lcid_unknown, []), + new CRange(0xABC0, 0xABFF, c_oUnicodeRangesLID.Meetei_Mayek, lcid_unknown, []), + new CRange(0xAC00, 0xD7AF, c_oUnicodeRangesLID.Hangul_Syllables, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Hangul_Syllables), 0, 0, (1 << c_oCodePagesOS2_1.Korean_Wansung), 0]), + new CRange(0xD7B0, 0xD7FF, c_oUnicodeRangesLID.Hangul_Jamo_Extended_B, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Hangul_Jamo), 0, 0, 0, 0, 0]), + new CRange(0xD800, 0xDB7F, c_oUnicodeRangesLID.High_Surrogates, lcid_unknown, []), + new CRange(0xDB80, 0xDBFF, c_oUnicodeRangesLID.High_Private_Use_Surrogates, lcid_unknown, []), + new CRange(0xDC00, 0xDFFF, c_oUnicodeRangesLID.Low_Surrogates, lcid_unknown, []), + new CRange(0xE000, 0xF8FF, c_oUnicodeRangesLID.Private_Use_Area, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Private_Use_Area_plane_0), 0, 0, 0, 0]), + new CRange(0xF900, 0xFAFF, c_oUnicodeRangesLID.CJK_Compatibility_Ideographs, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.CJK_Compatibility_Ideographs), 0, 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0xFB00, 0xFB4F, c_oUnicodeRangesLID.Alphabetic_Presentation_Forms, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Alphabetic_Presentation_Forms), 0, 0, 0, 0]), + new CRange(0xFB50, 0xFDFF, c_oUnicodeRangesLID.Arabic_Presentation_Forms_A, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arabic_Presentation_Forms_A), 0, 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0xFE00, 0xFE0F, c_oUnicodeRangesLID.Variation_Selectors, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Variation_Selectors), 0, 0, 0]), + new CRange(0xFE10, 0xFE1F, c_oUnicodeRangesLID.Vertical_Forms, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Vertical_Forms), 0, 0, 0]), + new CRange(0xFE20, 0xFE2F, c_oUnicodeRangesLID.Combining_Half_Marks, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Combining_Half_Marks), 0, 0, 0]), + new CRange(0xFE30, 0xFE4F, c_oUnicodeRangesLID.CJK_Compatibility_Forms, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Vertical_Forms), 0, 0, 0]), + new CRange(0xFE50, 0xFE6F, c_oUnicodeRangesLID.Small_Form_Variants, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Small_Form_Variants), 0, 0, 0]), + new CRange(0xFE70, 0xFEFF, c_oUnicodeRangesLID.Arabic_Presentation_Forms_B, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Arabic_Presentation_Forms_B), 0, (1 << c_oCodePagesOS2_1.Arabic), (1 << c_oCodePagesOS2_2.Arabic) | (1 << c_oCodePagesOS2_2.Arabic_708)]), + new CRange(0xFF00, 0xFFEF, c_oUnicodeRangesLID.Halfwidth_and_Fullwidth_Forms, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Halfwidth_And_Fullwidth_Forms), 0, (1 << c_oCodePagesOS2_1.Korean_Wansung) | (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional) | (1 << c_oCodePagesOS2_1.JIS_Japan) | (1 << c_oCodePagesOS2_1.OEM_Character_Set), 0]), + new CRange(0xFFF0, 0xFFFF, c_oUnicodeRangesLID.Specials, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Specials), 0, 0, 0]), + new CRange(0x10000, 0x1007F, c_oUnicodeRangesLID.Linear_B_Syllabary, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Linear_B_Syllabary), 0, 0]), + new CRange(0x10080, 0x100FF, c_oUnicodeRangesLID.Linear_B_Ideograms, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Linear_B_Syllabary), 0, 0]), + new CRange(0x10100, 0x1013F, c_oUnicodeRangesLID.Aegean_Numbers, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Linear_B_Syllabary), 0, 0]), + new CRange(0x10140, 0x1018F, c_oUnicodeRangesLID.Ancient_Greek_Numbers, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Ancient_Greek_Numbers), 0, 0]), + new CRange(0x10190, 0x101CF, c_oUnicodeRangesLID.Ancient_Symbols, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Ancient_Symbols), 0, 0]), + new CRange(0x101D0, 0x101FF, c_oUnicodeRangesLID.Phaistos_Disc, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Phaistos_Disc), 0, 0]), + new CRange(0x10280, 0x1029F, c_oUnicodeRangesLID.Lycian, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Carian), 0, 0]), + new CRange(0x102A0, 0x102DF, c_oUnicodeRangesLID.Carian, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Carian), 0, 0]), + new CRange(0x102E0, 0x102FF, c_oUnicodeRangesLID.Coptic_Epact_Numbers, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Coptic), 0, 0, 0, 0, 0]), + new CRange(0x10300, 0x1032F, c_oUnicodeRangesLID.Old_Italic, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Old_Italic), 0, 0, 0]), + new CRange(0x10330, 0x1034F, c_oUnicodeRangesLID.Gothic, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Gothic), 0, 0, 0]), + new CRange(0x10350, 0x1037F, c_oUnicodeRangesLID.Old_Permic, lcid_unknown, []), + new CRange(0x10380, 0x1039F, c_oUnicodeRangesLID.Ugaritic, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Ugaritic), 0, 0]), + new CRange(0x103A0, 0x103DF, c_oUnicodeRangesLID.Old_Persian, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Old_Persian), 0, 0]), + new CRange(0x10400, 0x1044F, c_oUnicodeRangesLID.Deseret, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Deseret), 0, 0, 0]), + new CRange(0x10450, 0x1047F, c_oUnicodeRangesLID.Shavian, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Shavian), 0, 0]), + new CRange(0x10480, 0x104AF, c_oUnicodeRangesLID.Osmanya, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Osmanya), 0, 0]), + new CRange(0x104B0, 0x104FF, c_oUnicodeRangesLID.Osage, lcid_unknown, []), + new CRange(0x10500, 0x1052F, c_oUnicodeRangesLID.Elbasan, lcid_unknown, []), + new CRange(0x10530, 0x1056F, c_oUnicodeRangesLID.Caucasian_Albanian, lcid_unknown, []), + new CRange(0x10600, 0x1077F, c_oUnicodeRangesLID.Linear_A, lcid_unknown, []), + new CRange(0x10800, 0x1083F, c_oUnicodeRangesLID.Cypriot_Syllabary, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Cypriot_Syllabary), 0, 0]), + new CRange(0x10840, 0x1085F, c_oUnicodeRangesLID.Imperial_Aramaic, lcid_unknown, []), + new CRange(0x10860, 0x1087F, c_oUnicodeRangesLID.Palmyrene, lcid_unknown, []), + new CRange(0x10880, 0x108AF, c_oUnicodeRangesLID.Nabataean, lcid_unknown, []), + new CRange(0x108E0, 0x108FF, c_oUnicodeRangesLID.Hatran, lcid_unknown, []), + new CRange(0x10900, 0x1091F, c_oUnicodeRangesLID.Phoenician, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Phoenician), 0, 0, 0, 0]), + new CRange(0x10920, 0x1093F, c_oUnicodeRangesLID.Lydian, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Carian), 0, 0]), + new CRange(0x10980, 0x1099F, c_oUnicodeRangesLID.Meroitic_Hieroglyphs, lcid_unknown, []), + new CRange(0x109A0, 0x109FF, c_oUnicodeRangesLID.Meroitic_Cursive, lcid_unknown, []), + new CRange(0x10A00, 0x10A5F, c_oUnicodeRangesLID.Kharoshthi, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Kharoshthi), 0, 0]), + new CRange(0x10A60, 0x10A7F, c_oUnicodeRangesLID.Old_South_Arabian, lcid_unknown, []), + new CRange(0x10A80, 0x10A9F, c_oUnicodeRangesLID.Old_North_Arabian, lcid_unknown, []), + new CRange(0x10AC0, 0x10AFF, c_oUnicodeRangesLID.Manichaean, lcid_unknown, []), + new CRange(0x10B00, 0x10B3F, c_oUnicodeRangesLID.Avestan, lcid_unknown, []), + new CRange(0x10B40, 0x10B5F, c_oUnicodeRangesLID.Inscriptional_Parthian, lcid_unknown, []), + new CRange(0x10B60, 0x10B7F, c_oUnicodeRangesLID.Inscriptional_Pahlavi, lcid_unknown, []), + new CRange(0x10B80, 0x10BAF, c_oUnicodeRangesLID.Psalter_Pahlavi, lcid_unknown, []), + new CRange(0x10C00, 0x10C4F, c_oUnicodeRangesLID.Old_Turkic, lcid_unknown, []), + new CRange(0x10C80, 0x10CFF, c_oUnicodeRangesLID.Old_Hungarian, lcid_unknown, []), + new CRange(0x10E60, 0x10E7F, c_oUnicodeRangesLID.Rumi_Numeral_Symbols, lcid_unknown, []), + new CRange(0x11000, 0x1107F, c_oUnicodeRangesLID.Brahmi, lcid_unknown, []), + new CRange(0x11080, 0x110CF, c_oUnicodeRangesLID.Kaithi, lcid_unknown, []), + new CRange(0x110D0, 0x110FF, c_oUnicodeRangesLID.Sora_Sompeng, lcid_unknown, []), + new CRange(0x11100, 0x1114F, c_oUnicodeRangesLID.Chakma, lcid_unknown, []), + new CRange(0x11150, 0x1117F, c_oUnicodeRangesLID.Mahajani, lcid_unknown, []), + new CRange(0x11180, 0x111DF, c_oUnicodeRangesLID.Sharada, lcid_unknown, []), + new CRange(0x111E0, 0x111FF, c_oUnicodeRangesLID.Sinhala_Archaic_Numbers, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Sinhala), 0, 0, 0]), + new CRange(0x11200, 0x1124F, c_oUnicodeRangesLID.Khojki, lcid_unknown, []), + new CRange(0x11280, 0x112AF, c_oUnicodeRangesLID.Multani, lcid_unknown, []), + new CRange(0x112B0, 0x112FF, c_oUnicodeRangesLID.Khudawadi, lcid_unknown, []), + new CRange(0x11300, 0x1137F, c_oUnicodeRangesLID.Grantha, lcid_unknown, []), + new CRange(0x11400, 0x1147F, c_oUnicodeRangesLID.Newa, lcid_unknown, []), + new CRange(0x11480, 0x114DF, c_oUnicodeRangesLID.Tirhuta, lcid_unknown, []), + new CRange(0x11580, 0x115FF, c_oUnicodeRangesLID.Siddham, lcid_unknown, []), + new CRange(0x11600, 0x1165F, c_oUnicodeRangesLID.Modi, lcid_unknown, []), + new CRange(0x11660, 0x1167F, c_oUnicodeRangesLID.Mongolian_Supplement, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Mongolian), 0, 0, 0]), + new CRange(0x11680, 0x116CF, c_oUnicodeRangesLID.Takri, lcid_unknown, []), + new CRange(0x11700, 0x1173F, c_oUnicodeRangesLID.Ahom, lcid_unknown, []), + new CRange(0x118A0, 0x118FF, c_oUnicodeRangesLID.Warang_Citi, lcid_unknown, []), + new CRange(0x11AC0, 0x11AFF, c_oUnicodeRangesLID.Pau_Cin_Hau, lcid_unknown, []), + new CRange(0x11C00, 0x11C6F, c_oUnicodeRangesLID.Bhaiksuki, lcid_unknown, []), + new CRange(0x11C70, 0x11CBF, c_oUnicodeRangesLID.Marchen, lcid_unknown, []), + new CRange(0x12000, 0x123FF, c_oUnicodeRangesLID.Cuneiform, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Cuneiform), 0, 0]), + new CRange(0x12400, 0x1247F, c_oUnicodeRangesLID.Cuneiform_Numbers_and_Punctuation, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Cuneiform), 0, 0]), + new CRange(0x12480, 0x1254F, c_oUnicodeRangesLID.Early_Dynastic_Cuneiform, lcid_unknown, []), + new CRange(0x13000, 0x1342F, c_oUnicodeRangesLID.Egyptian_Hieroglyphs, lcid_unknown, []), + new CRange(0x14400, 0x1467F, c_oUnicodeRangesLID.Anatolian_Hieroglyphs, lcid_unknown, []), + new CRange(0x16800, 0x16A3F, c_oUnicodeRangesLID.Bamum_Supplement, lcid_unknown, []), + new CRange(0x16A40, 0x16A6F, c_oUnicodeRangesLID.Mro, lcid_unknown, []), + new CRange(0x16AD0, 0x16AFF, c_oUnicodeRangesLID.Bassa_Vah, lcid_unknown, []), + new CRange(0x16B00, 0x16B8F, c_oUnicodeRangesLID.Pahawh_Hmong, lcid_unknown, []), + new CRange(0x16F00, 0x16F9F, c_oUnicodeRangesLID.Miao, lcid_zhCN, []), + new CRange(0x16FE0, 0x16FFF, c_oUnicodeRangesLID.Ideographic_Symbols_and_Punctuation, lcid_unknown, []), + new CRange(0x17000, 0x187FF, c_oUnicodeRangesLID.Tangut, lcid_unknown, []), + new CRange(0x18800, 0x18AFF, c_oUnicodeRangesLID.Tangut_Components, lcid_unknown, []), + new CRange(0x1B000, 0x1B0FF, c_oUnicodeRangesLID.Kana_Supplement, lcid_unknown, []), + new CRange(0x1BC00, 0x1BC9F, c_oUnicodeRangesLID.Duployan, lcid_unknown, []), + new CRange(0x1BCA0, 0x1BCAF, c_oUnicodeRangesLID.Shorthand_Format_Controls, lcid_unknown, []), + new CRange(0x1D000, 0x1D0FF, c_oUnicodeRangesLID.Byzantine_Musical_Symbols, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Byzantine_Musical_Symbols), 0, 0, 0]), + new CRange(0x1D100, 0x1D1FF, c_oUnicodeRangesLID.Musical_Symbols, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Byzantine_Musical_Symbols), 0, 0, 0]), + new CRange(0x1D200, 0x1D24F, c_oUnicodeRangesLID.Ancient_Greek_Musical_Notation, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Byzantine_Musical_Symbols), 0, 0, 0]), + new CRange(0x1D300, 0x1D35F, c_oUnicodeRangesLID.Tai_Xuan_Jing_Symbols, lcid_unknown, []), + new CRange(0x1D360, 0x1D37F, c_oUnicodeRangesLID.Counting_Rod_Numerals, lcid_unknown, []), + new CRange(0x1D400, 0x1D7FF, c_oUnicodeRangesLID.Mathematical_Alphanumeric_Symbols, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Mathematical_Alphanumeric_Symbols), 0, 0, 0]), + new CRange(0x1D800, 0x1DAAF, c_oUnicodeRangesLID.Sutton_SignWriting, lcid_unknown, []), + new CRange(0x1E000, 0x1E02F, c_oUnicodeRangesLID.Glagolitic_Supplement, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Glagolitic), 0, 0]), + new CRange(0x1E800, 0x1E8DF, c_oUnicodeRangesLID.Mende_Kikakui, lcid_unknown, []), + new CRange(0x1E900, 0x1E95F, c_oUnicodeRangesLID.Adlam, lcid_unknown, []), + new CRange(0x1EE00, 0x1EEFF, c_oUnicodeRangesLID.Arabic_Mathematical_Alphabetic_Symbols, lcid_unknown, []), + new CRange(0x1F000, 0x1F02F, c_oUnicodeRangesLID.Mahjong_Tiles, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Domino_Tiles), 0, 0]), + new CRange(0x1F030, 0x1F09F, c_oUnicodeRangesLID.Domino_Tiles, lcid_unknown, [0, 0, 0, (1 << c_oUnicodeRangeOS2_4.Domino_Tiles), 0, 0]), + new CRange(0x1F0A0, 0x1F0FF, c_oUnicodeRangesLID.Playing_Cards, lcid_unknown, []), + new CRange(0x1F100, 0x1F1FF, c_oUnicodeRangesLID.Enclosed_Alphanumeric_Supplement, lcid_unknown, []), + new CRange(0x1F200, 0x1F2FF, c_oUnicodeRangesLID.Enclosed_Ideographic_Supplement, lcid_unknown, []), + new CRange(0x1F300, 0x1F5FF, c_oUnicodeRangesLID.Miscellaneous_Symbols_and_Pictographs, lcid_unknown, []), + new CRange(0x1F600, 0x1F64F, c_oUnicodeRangesLID.Emoticons, lcid_unknown, []), + new CRange(0x1F650, 0x1F67F, c_oUnicodeRangesLID.Ornamental_Dingbats, lcid_unknown, []), + new CRange(0x1F680, 0x1F6FF, c_oUnicodeRangesLID.Transport_and_Map_Symbols, lcid_unknown, []), + new CRange(0x1F700, 0x1F77F, c_oUnicodeRangesLID.Alchemical_Symbols, lcid_unknown, []), + new CRange(0x1F780, 0x1F7FF, c_oUnicodeRangesLID.Geometric_Shapes_Extended, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Geometric_Shapes), 0, 0, 0, 0]), + new CRange(0x1F800, 0x1F8FF, c_oUnicodeRangesLID.Supplemental_Arrows_C, lcid_unknown, [0, (1 << c_oUnicodeRangeOS2_2.Arrows), 0, 0, 0, 0]), + new CRange(0x1F900, 0x1F9FF, c_oUnicodeRangesLID.Supplemental_Symbols_and_Pictographs, lcid_unknown, []), + new CRange(0x20000, 0x2A6DF, c_oUnicodeRangesLID.CJK_Unified_Ideographs_Extension_B, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.CJK_Unified_Ideographs), 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x2A700, 0x2B73F, c_oUnicodeRangesLID.CJK_Unified_Ideographs_Extension_C, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.CJK_Unified_Ideographs), 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x2B740, 0x2B81F, c_oUnicodeRangesLID.CJK_Unified_Ideographs_Extension_D, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.CJK_Unified_Ideographs), 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x2B820, 0x2CEAF, c_oUnicodeRangesLID.CJK_Unified_Ideographs_Extension_E, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.CJK_Unified_Ideographs), 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0x2F800, 0x2FA1F, c_oUnicodeRangesLID.CJK_Compatibility_Ideographs_Supplement, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.CJK_Strokes), 0, (1 << c_oCodePagesOS2_1.Chinese_Simplified) | (1 << c_oCodePagesOS2_1.Chinese_Traditional), 0]), + new CRange(0xE0000, 0xE007F, c_oUnicodeRangesLID.Tags, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Tags), 0, 0, 0]), + new CRange(0xE0100, 0xE01EF, c_oUnicodeRangesLID.Variation_Selectors_Supplement, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Variation_Selectors), 0, 0, 0]), + new CRange(0xF0000, 0xFFFFF, c_oUnicodeRangesLID.Supplementary_Private_Use_Area_A, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Private_Use_plane_15), 0, 0, 0]), + new CRange(0x100000, 0x10FFFF, c_oUnicodeRangesLID.Supplementary_Private_Use_Area_B, lcid_unknown, [0, 0, (1 << c_oUnicodeRangeOS2_3.Private_Use_plane_15), 0, 0, 0]) + ]; + + function getRangeBySymbol(_char, _array) + { + // search range by symbol + var _start = 0; + var _end = _array.length - 1; + + var _center = 0; + var _range = null; + + if (_start >= _end) + return null; + + while (_start < _end) + { + var _center = (_start + _end) >> 1; + var _range = _array[_center]; + + if (_range.Start > _char) + _end = _center - 1; + else if (_range.End < _char) + _start = _center + 1; + else + return _array[_center]; + } + + if (_start > _end) + return null; + + _range = _array[_start]; + if (_range.Start > _char || _range.End < _char) + return null; + + return _array[_start]; + } + + window.getSupportedFonts = function(_char) + { + var _range = getRangeBySymbol(_char, c_oUnicodeRanges); + return window.getSupportedFontsByRange(_range); + }; + + window.getSupportedFontsByRange = function(_range) + { + if (null == _range) + return []; + + var _system_fonts = AscFonts.g_fontApplication.g_fontSelections.List; + var _count = _system_fonts.length; + + var _retArray = []; + + for (var j = 0; j < _count; j++) + { + var _select = _system_fonts[j]; + + var _param = _range.Param; + + if (_param[0] != (_select.m_ulUnicodeRange1 & _param[0])) + continue; + + if (_param[1] != (_select.m_ulUnicodeRange2 & _param[1])) + continue; + + if (_param[2] != (_select.m_ulUnicodeRange3 & _param[2])) + continue; + + if (_param[3] != (_select.m_ulUnicodeRange4 & _param[3])) + continue; + + if (_range.Name == c_oUnicodeRangesLID.CJK_Unified_Ideographs) + { + if (0 == (_select.m_ulCodePageRange1 & _param[4])) + continue; + } + else + { + if (_param[4] != (_select.m_ulCodePageRange1 & _param[4])) + continue; + } + + if (_param[5] != (_select.m_ulCodePageRange2 & _param[5])) + continue; + + _retArray.push(_select.m_wsFontName); + } + + return _retArray; + }; + + window.getSupportedRangesByFont = function(_select) + { + var _ret = []; + for(var i = 0; i < c_oUnicodeRanges.length; ++i) + { + var _range = c_oUnicodeRanges[i]; + var _param = _range.Param; + if (_param[0] != (_select.m_ulUnicodeRange1 & _param[0])) + continue; + + if (_param[1] != (_select.m_ulUnicodeRange2 & _param[1])) + continue; + + if (_param[2] != (_select.m_ulUnicodeRange3 & _param[2])) + continue; + + if (_param[3] != (_select.m_ulUnicodeRange4 & _param[3])) + continue; + + /*if (_range.Name == c_oUnicodeRangesLID.CJK_Unified_Ideographs) + { + if (0 == (_select.m_ulCodePageRange1 & _param[4])) + continue; + } + else + { + if (_param[4] != (_select.m_ulCodePageRange1 & _param[4])) + continue; + }*/ + + + if (_param[4] != (_select.m_ulCodePageRange1 & _param[4])) + continue; + + if (_param[5] != (_select.m_ulCodePageRange2 & _param[5])) + continue; + _ret.push(_range); + } + + if(_ret.length === 0) + { + _ret.push(new CRange(0x0020, 0x007E, c_oUnicodeRangesLID.Basic_Latin, lcid_enUS, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1), 0])); + _ret.push(new CRange(0x00A0, 0x00FF, c_oUnicodeRangesLID.Latin_1_Supplement, lcid_unknown, [(1 << c_oUnicodeRangeOS2_1.Basic_Latin) | (1 << c_oUnicodeRangeOS2_1.Latin_1_Supplement), 0, 0, 0, (1 << c_oCodePagesOS2_1.Latin_1), 0])); + } + return _ret; + }; +})(window); \ No newline at end of file diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js new file mode 100644 index 000000000..55316f740 --- /dev/null +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -0,0 +1,961 @@ +/* + * + * (c) Copyright Ascensio System SIA 2010-2019 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-12 Ernesta Birznieka-Upisha + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +/** + * SymbolTableDialog.js + * + * Created by Julia Radzhabova on 07.11.2019 + * Copyright (c) 2019 Ascensio System SIA. All rights reserved. + * + */ +if (Common === undefined) + var Common = {}; +define([ + 'common/main/lib/util/utils', + 'common/main/lib/util/character', + 'common/main/lib/component/InputField', + 'common/main/lib/component/Window' +], function () { 'use strict'; + + var oRangeNames = {}; + oRangeNames[1] = 'Basic Latin'; + oRangeNames[2] = 'Latin 1 Supplement'; + oRangeNames[3] = 'Latin Extended A'; + oRangeNames[4] = 'Latin Extended B'; + oRangeNames[5] = 'IPA Extensions'; + oRangeNames[6] = 'Spacing Modifier Letters'; + oRangeNames[7] = 'Combining Diacritical Marks'; + oRangeNames[8] = 'Greek and Coptic'; + oRangeNames[9] = 'Cyrillic'; + oRangeNames[10] = 'Cyrillic Supplement'; + oRangeNames[11] = 'Armenian'; + oRangeNames[12] = 'Hebrew'; + oRangeNames[13] = 'Arabic'; + oRangeNames[14] = 'Syriac'; + oRangeNames[15] = 'Arabic Supplement'; + oRangeNames[16] = 'Thaana'; + oRangeNames[17] = 'NKo'; + oRangeNames[18] = 'Samaritan'; + oRangeNames[19] = 'Mandaic'; + oRangeNames[20] = 'Arabic Extended A'; + oRangeNames[21] = 'Devanagari'; + oRangeNames[22] = 'Bengali'; + oRangeNames[23] = 'Gurmukhi'; + oRangeNames[24] = 'Gujarati'; + oRangeNames[25] = 'Oriya'; + oRangeNames[26] = 'Tamil'; + oRangeNames[27] = 'Telugu'; + oRangeNames[28] = 'Kannada'; + oRangeNames[29] = 'Malayalam'; + oRangeNames[30] = 'Sinhala'; + oRangeNames[31] = 'Thai'; + oRangeNames[32] = 'Lao'; + oRangeNames[33] = 'Tibetan'; + oRangeNames[34] = 'Myanmar'; + oRangeNames[35] = 'Georgian'; + oRangeNames[36] = 'Hangul Jamo'; + oRangeNames[37] = 'Ethiopic'; + oRangeNames[38] = 'Ethiopic Supplement'; + oRangeNames[39] = 'Cherokee'; + oRangeNames[40] = 'Unified Canadian Aboriginal Syllabics'; + oRangeNames[41] = 'Ogham'; + oRangeNames[42] = 'Runic'; + oRangeNames[43] = 'Tagalog'; + oRangeNames[44] = 'Hanunoo'; + oRangeNames[45] = 'Buhid'; + oRangeNames[46] = 'Tagbanwa'; + oRangeNames[47] = 'Khmer'; + oRangeNames[48] = 'Mongolian'; + oRangeNames[49] = 'Unified Canadian Aboriginal Syllabics Extended'; + oRangeNames[50] = 'Limbu'; + oRangeNames[51] = 'Tai Le'; + oRangeNames[52] = 'New Tai Lue'; + oRangeNames[53] = 'Khmer Symbols'; + oRangeNames[54] = 'Buginese'; + oRangeNames[55] = 'Tai Tham'; + oRangeNames[56] = 'Combining Diacritical Marks Extended'; + oRangeNames[57] = 'Balinese'; + oRangeNames[58] = 'Sundanese'; + oRangeNames[59] = 'Batak'; + oRangeNames[60] = 'Lepcha'; + oRangeNames[61] = 'Ol Chiki'; + oRangeNames[62] = 'Cyrillic Extended C'; + oRangeNames[63] = 'Sundanese Supplement'; + oRangeNames[64] = 'Vedic Extensions'; + oRangeNames[65] = 'Phonetic Extensions'; + oRangeNames[66] = 'Phonetic Extensions Supplement'; + oRangeNames[67] = 'Combining Diacritical Marks Supplement'; + oRangeNames[68] = 'Latin Extended Additional'; + oRangeNames[69] = 'Greek Extended'; + oRangeNames[70] = 'General Punctuation'; + oRangeNames[71] = 'Superscripts and Subscripts'; + oRangeNames[72] = 'Currency Symbols'; + oRangeNames[73] = 'Combining Diacritical Marks for Symbols'; + oRangeNames[74] = 'Letterlike Symbols'; + oRangeNames[75] = 'Number Forms'; + oRangeNames[76] = 'Arrows'; + oRangeNames[77] = 'Mathematical Operators'; + oRangeNames[78] = 'Miscellaneous Technical'; + oRangeNames[79] = 'Control Pictures'; + oRangeNames[80] = 'Optical Character Recognition'; + oRangeNames[81] = 'Enclosed Alphanumerics'; + oRangeNames[82] = 'Box Drawing'; + oRangeNames[83] = 'Block Elements'; + oRangeNames[84] = 'Geometric Shapes'; + oRangeNames[85] = 'Miscellaneous Symbols'; + oRangeNames[86] = 'Dingbats'; + oRangeNames[87] = 'Miscellaneous Mathematical Symbols A'; + oRangeNames[88] = 'Supplemental Arrows A'; + oRangeNames[89] = 'Braille Patterns'; + oRangeNames[90] = 'Supplemental Arrows B'; + oRangeNames[91] = 'Miscellaneous Mathematical Symbols B'; + oRangeNames[92] = 'Supplemental Mathematical Operators'; + oRangeNames[93] = 'Miscellaneous Symbols and Arrows'; + oRangeNames[94] = 'Glagolitic'; + oRangeNames[95] = 'Latin Extended C'; + oRangeNames[96] = 'Coptic'; + oRangeNames[97] = 'Georgian Supplement'; + oRangeNames[98] = 'Tifinagh'; + oRangeNames[99] = 'Ethiopic Extended'; + oRangeNames[100] = 'Cyrillic Extended A'; + oRangeNames[101] = 'Supplemental Punctuation'; + oRangeNames[102] = 'CJK Radicals Supplement'; + oRangeNames[103] = 'Kangxi Radicals'; + oRangeNames[104] = 'Ideographic Description Characters'; + oRangeNames[105] = 'CJK Symbols and Punctuation'; + oRangeNames[106] = 'Hiragana'; + oRangeNames[107] = 'Katakana'; + oRangeNames[108] = 'Bopomofo'; + oRangeNames[109] = 'Hangul Compatibility Jamo'; + oRangeNames[110] = 'Kanbun'; + oRangeNames[111] = 'Bopomofo Extended'; + oRangeNames[112] = 'CJK Strokes'; + oRangeNames[113] = 'Katakana Phonetic Extensions'; + oRangeNames[114] = 'Enclosed CJK Letters and Months'; + oRangeNames[115] = 'CJK Compatibility'; + oRangeNames[116] = 'CJK Unified Ideographs Extension'; + oRangeNames[117] = 'Yijing Hexagram Symbols'; + oRangeNames[118] = 'CJK Unified Ideographs'; + oRangeNames[119] = 'Yi Syllables'; + oRangeNames[120] = 'Yi Radicals'; + oRangeNames[121] = 'Lisu'; + oRangeNames[122] = 'Vai'; + oRangeNames[123] = 'Cyrillic Extended B'; + oRangeNames[124] = 'Bamum'; + oRangeNames[125] = 'Modifier Tone Letters'; + oRangeNames[126] = 'Latin Extended D'; + oRangeNames[127] = 'Syloti Nagri'; + oRangeNames[128] = 'Common Indic Number Forms'; + oRangeNames[129] = 'Phags pa'; + oRangeNames[130] = 'Saurashtra'; + oRangeNames[131] = 'Devanagari Extended'; + oRangeNames[132] = 'Kayah Li'; + oRangeNames[133] = 'Rejang'; + oRangeNames[134] = 'Hangul Jamo Extended A'; + oRangeNames[135] = 'Javanese'; + oRangeNames[136] = 'Myanmar Extended B'; + oRangeNames[137] = 'Cham'; + oRangeNames[138] = 'Myanmar Extended A'; + oRangeNames[139] = 'Tai Viet'; + oRangeNames[140] = 'Meetei Mayek Extensions'; + oRangeNames[141] = 'Ethiopic Extended A'; + oRangeNames[142] = 'Latin Extended E'; + oRangeNames[143] = 'Cherokee Supplement'; + oRangeNames[144] = 'Meetei Mayek'; + oRangeNames[145] = 'Hangul Syllables'; + oRangeNames[146] = 'Hangul Jamo Extended B'; + oRangeNames[147] = 'High Surrogates'; + oRangeNames[148] = 'High Private Use Surrogates'; + oRangeNames[149] = 'Low Surrogates'; + oRangeNames[150] = 'Private Use Area'; + oRangeNames[151] = 'CJK Compatibility Ideographs'; + oRangeNames[152] = 'Alphabetic Presentation Forms'; + oRangeNames[153] = 'Arabic Presentation Forms A'; + oRangeNames[154] = 'Variation Selectors'; + oRangeNames[155] = 'Vertical Forms'; + oRangeNames[156] = 'Combining Half Marks'; + oRangeNames[157] = 'CJK Compatibility Forms'; + oRangeNames[158] = 'Small Form Variants'; + oRangeNames[159] = 'Arabic Presentation Forms B'; + oRangeNames[160] = 'Halfwidth and Fullwidth Forms'; + oRangeNames[161] = 'Specials'; + oRangeNames[162] = 'Linear B Syllabary'; + oRangeNames[163] = 'Linear B Ideograms'; + oRangeNames[164] = 'Aegean Numbers'; + oRangeNames[165] = 'Ancient Greek Numbers'; + oRangeNames[166] = 'Ancient Symbols'; + oRangeNames[167] = 'Phaistos Disc'; + oRangeNames[168] = 'Lycian'; + oRangeNames[169] = 'Carian'; + oRangeNames[170] = 'Coptic Epact Numbers'; + oRangeNames[171] = 'Old Italic'; + oRangeNames[172] = 'Gothic'; + oRangeNames[173] = 'Old Permic'; + oRangeNames[174] = 'Ugaritic'; + oRangeNames[175] = 'Old Persian'; + oRangeNames[176] = 'Deseret'; + oRangeNames[177] = 'Shavian'; + oRangeNames[178] = 'Osmanya'; + oRangeNames[179] = 'Osage'; + oRangeNames[180] = 'Elbasan'; + oRangeNames[181] = 'Caucasian Albanian'; + oRangeNames[182] = 'Linear A'; + oRangeNames[183] = 'Cypriot Syllabary'; + oRangeNames[184] = 'Imperial Aramaic'; + oRangeNames[185] = 'Palmyrene'; + oRangeNames[186] = 'Nabataean'; + oRangeNames[187] = 'Hatran'; + oRangeNames[188] = 'Phoenician'; + oRangeNames[189] = 'Lydian'; + oRangeNames[190] = 'Meroitic Hieroglyphs'; + oRangeNames[191] = 'Meroitic Cursive'; + oRangeNames[192] = 'Kharoshthi'; + oRangeNames[193] = 'Old South Arabian'; + oRangeNames[194] = 'Old North Arabian'; + oRangeNames[195] = 'Manichaean'; + oRangeNames[196] = 'Avestan'; + oRangeNames[197] = 'Inscriptional Parthian'; + oRangeNames[198] = 'Inscriptional Pahlavi'; + oRangeNames[199] = 'Psalter Pahlavi'; + oRangeNames[200] = 'Old Turkic'; + oRangeNames[201] = 'Old Hungarian'; + oRangeNames[202] = 'Rumi Numeral Symbols'; + oRangeNames[203] = 'Brahmi'; + oRangeNames[204] = 'Kaithi'; + oRangeNames[205] = 'Sora Sompeng'; + oRangeNames[206] = 'Chakma'; + oRangeNames[207] = 'Mahajani'; + oRangeNames[208] = 'Sharada'; + oRangeNames[209] = 'Sinhala Archaic Numbers'; + oRangeNames[210] = 'Khojki'; + oRangeNames[211] = 'Multani'; + oRangeNames[212] = 'Khudawadi'; + oRangeNames[213] = 'Grantha'; + oRangeNames[214] = 'Newa'; + oRangeNames[215] = 'Tirhuta'; + oRangeNames[216] = 'Siddham'; + oRangeNames[217] = 'Modi'; + oRangeNames[218] = 'Mongolian Supplement'; + oRangeNames[219] = 'Takri'; + oRangeNames[220] = 'Ahom'; + oRangeNames[221] = 'Warang Citi'; + oRangeNames[222] = 'Pau Cin Hau'; + oRangeNames[223] = 'Bhaiksuki'; + oRangeNames[224] = 'Marchen'; + oRangeNames[225] = 'Cuneiform'; + oRangeNames[226] = 'Cuneiform Numbers and Punctuation'; + oRangeNames[227] = 'Early Dynastic Cuneiform'; + oRangeNames[228] = 'Egyptian Hieroglyphs'; + oRangeNames[229] = 'Anatolian Hieroglyphs'; + oRangeNames[230] = 'Bamum Supplement'; + oRangeNames[231] = 'Mro'; + oRangeNames[232] = 'Bassa Vah'; + oRangeNames[233] = 'Pahawh Hmong'; + oRangeNames[234] = 'Miao'; + oRangeNames[235] = 'Ideographic Symbols and Punctuation'; + oRangeNames[236] = 'Tangut'; + oRangeNames[237] = 'Tangut Components'; + oRangeNames[238] = 'Kana Supplement'; + oRangeNames[239] = 'Duployan'; + oRangeNames[240] = 'Shorthand Format Controls'; + oRangeNames[241] = 'Byzantine Musical Symbols'; + oRangeNames[242] = 'Musical Symbols'; + oRangeNames[243] = 'Ancient Greek Musical Notation'; + oRangeNames[244] = 'Tai Xuan Jing Symbols'; + oRangeNames[245] = 'Counting Rod Numerals'; + oRangeNames[246] = 'Mathematical Alphanumeric Symbols'; + oRangeNames[247] = 'Sutton SignWriting'; + oRangeNames[248] = 'Glagolitic Supplement'; + oRangeNames[249] = 'Mende Kikakui'; + oRangeNames[250] = 'Adlam'; + oRangeNames[251] = 'Arabic Mathematical Alphabetic Symbols'; + oRangeNames[252] = 'Mahjong Tiles'; + oRangeNames[253] = 'Domino Tiles'; + oRangeNames[254] = 'Playing Cards'; + oRangeNames[255] = 'Enclosed Alphanumeric Supplement'; + oRangeNames[256] = 'Enclosed Ideographic Supplement'; + oRangeNames[257] = 'Miscellaneous Symbols and Pictographs'; + oRangeNames[258] = 'Emoticons'; + oRangeNames[259] = 'Ornamental Dingbats'; + oRangeNames[260] = 'Transport and Map Symbols'; + oRangeNames[261] = 'Alchemical Symbols'; + oRangeNames[262] = 'Geometric Shapes Extended'; + oRangeNames[263] = 'Supplemental Arrows C'; + oRangeNames[264] = 'Supplemental Symbols and Pictographs'; + oRangeNames[265] = 'CJK Unified Ideographs Extension B'; + oRangeNames[266] = 'CJK Unified Ideographs Extension C'; + oRangeNames[267] = 'CJK Unified Ideographs Extension D'; + oRangeNames[268] = 'CJK Unified Ideographs Extension E'; + oRangeNames[269] = 'CJK Compatibility Ideographs Supplement'; + oRangeNames[270] = 'Tags'; + oRangeNames[271] = 'Variation Selectors Supplement'; + oRangeNames[272] = 'Supplementary Private Use Area A'; + oRangeNames[273] = 'Supplementary Private Use Area B'; + + var aFontSelects = []; + var aRanges = []; + var aRecents = []; + var nCurrentFont = -1;// индекс в aFontSelects + var nCurrentSymbol = -1;// code + var bMainFocus = true;//фокус в основной таблице + var nFontNameRecent = -1; + + var nMaxRecent = 36; + var bScrollMouseUp = false; + + var sInitFont = ""; + var sInitSymbol = ""; + + var nLastScroll = -1000; + var bShowTooltip = true; + + Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ + options: { + width: 400, + style: 'min-width: 230px;', + cls: 'modal-dlg', + buttons: ['ok', 'cancel'] + }, + + initialize : function(options) { + _.extend(this.options, { + title: this.textTitle + }, options || {}); + + this.template = [ + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
', + '
', + '', + '
', + '
', + '', + '
', + '
', + '
' + ].join(''); + + this.options.tpl = _.template(this.template)(this.options); + this.api = this.options.api; + + var fontList = this.api.pluginMethod_GetFontList(); + fontList.sort(function(a, b){ + if(a.m_wsFontName < b.m_wsFontName) return -1; + if(a.m_wsFontName > b.m_wsFontName) return 1; + return 0; + }); + + var oCurFont, oLastFont; + var data = []; + var oFontsByName = {}; + var sCurFontNameInMap; + for(var i = 0; i < fontList.length; ++i){ + oCurFont = fontList[i]; + sCurFontNameInMap = oCurFont.m_wsFontName; + oLastFont = oFontsByName[sCurFontNameInMap]; + if(!oLastFont){ + oFontsByName[sCurFontNameInMap] = oCurFont; + } + else{ + if(oLastFont.m_bBold && oLastFont.m_bItalic){ + oFontsByName[sCurFontNameInMap] = oCurFont; + } + else if(oLastFont.m_bBold && !oCurFont.m_bBold){ + oFontsByName[sCurFontNameInMap] = oCurFont; + } + else if(oLastFont.m_bItalic && !oCurFont.m_bBold && !oCurFont.m_bItalic){ + oFontsByName[sCurFontNameInMap] = oCurFont; + } + } + } + delete oFontsByName['ASCW3']; + var i = 0; + for(var key in oFontsByName){ + if(oFontsByName.hasOwnProperty(key)){ + data.push(oFontsByName[key]); + data[data.length-1].value = i++; + data[data.length-1].displayValue = oFontsByName[key].m_wsFontName; + } + } + + //initialize params + aFontSelects = data; + aFontSelects.sort(function(a, b){return (a.displayValue.toLowerCase() > b.displayValue.toLowerCase()) ? 1 : -1;}); + if(!oFontsByName[sInitFont]){ + if(oFontsByName['Cambria Math']){ + sInitFont = 'Cambria Math'; + } + else if(oFontsByName['Asana-Math']){ + sInitFont = 'Asana-Math'; + } + } + if(oFontsByName[sInitFont]){ + for(i = 0; i < aFontSelects.length; ++i){ + if(aFontSelects[i].displayValue === sInitFont){ + nCurrentFont = i; + break; + } + } + } + if (nCurrentFont < 0) + nCurrentFont = 0; + + + aRanges = this.getArrRangesByFont(nCurrentFont); + if(sInitSymbol && sInitSymbol.length > 0){ + nCurrentSymbol = this.fixedCharCodeAt(sInitSymbol, 0); + if(false === nCurrentSymbol){ + nCurrentSymbol = -1; + } + else{ + for(i = 0; i < aRanges.length; ++i){ + if(nCurrentSymbol >= aRanges[i].Start && nCurrentSymbol <= aRanges[i].End){ + break; + } + } + if(i === aRanges.length){ + nCurrentSymbol = -1; + } + } + } + if(nCurrentSymbol === -1){ + nCurrentSymbol = aRanges[0].Start; + } + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var me = this, + $window = this.getChild(); + + this.cmbFonts = new Common.UI.ComboBox({ + el : $window.find('#symbol-table-cmb-fonts'), + cls : 'input-group-nr', + data : aFontSelects, + editable : false, + menuStyle : 'min-width: 100%; max-height: 200px;' + }).on('selected', function(combo, record) { + var oCurrentRange = me.getRangeBySymbol(aRanges, nCurrentSymbol); + nCurrentFont = record.value; + aRanges = me.getArrRangesByFont(nCurrentFont); + if(oCurrentRange){ + for(var i = 0; i < aRanges.length; ++i){ + if(oCurrentRange.Name === aRanges[i].Name){ + break; + } + } + if(i === aRanges.length){ + nCurrentSymbol = aRanges[0].Start; + } + } + else{ + nCurrentSymbol = aRanges[0].Start; + } + bMainFocus = true; + me.updateView(); + }); + this.cmbFonts.setValue(nCurrentFont); + + this.cmbRange = new Common.UI.ComboBox({ + el : $window.find('#symbol-table-cmb-range'), + cls : 'input-group-nr', + editable : false, + menuStyle : 'min-width: 100%; max-height: 200px;' + }); + this.updateRangeSelector(); + + me.inputCode = new Common.UI.InputField({ + el : $window.find('#symbol-table-text-code'), + allowBlank : false, + blankError : me.txtEmpty, + style : 'width: 100%;', + validateOnBlur: false, + validateOnChange: true + }).on('changing', function(cmp, newValue, oldValue) { + me.isTextChanged = true; + }); + + // this.updateView(undefined, undefined, undefined, true); + + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + }, + + show: function() { + Common.UI.Window.prototype.show.apply(this, arguments); + + var me = this; + _.delay(function(){ + // me.inputUrl.cmpEl.find('input').focus(); + },50); + }, + + setSettings: function (props) { + }, + + getSettings: function () { + }, + + onBtnClick: function(event) { + this._handleInput(event.currentTarget.attributes['result'].value); + }, + + onPrimary: function(event) { + this._handleInput('ok'); + return false; + }, + + _handleInput: function(state) { + if (this.options.handler) { + this.options.handler.call(this, this, state); + } + + this.close(); + }, + + encodeSurrogateChar: function(nUnicode) { + if (nUnicode < 0x10000) + { + return String.fromCharCode(nUnicode); + } + else + { + nUnicode = nUnicode - 0x10000; + var nLeadingChar = 0xD800 | (nUnicode >> 10); + var nTrailingChar = 0xDC00 | (nUnicode & 0x3FF); + return String.fromCharCode(nLeadingChar) + String.fromCharCode(nTrailingChar); + } + }, + + fixedCharCodeAt: function(str, idx) { + idx = idx || 0; + var code = str.charCodeAt(idx); + var hi, low; + if (0xD800 <= code && code <= 0xDBFF) { + hi = code; + low = str.charCodeAt(idx + 1); + if (isNaN(low)) { + throw 'Старшая часть суррогатной пары без следующей младшей в fixedCharCodeAt()'; + } + return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; + } + if (0xDC00 <= code && code <= 0xDFFF) { + return false; + } + return code; + }, + + getArrRangesByFont: function(nFontName){ + var _ret = getSupportedRangesByFont(aFontSelects[nFontName]); + if(_ret.length === 0){ + _ret.push({Start:0x20, End: 0xFF}); + } + if(_ret[0].Start < 0x20){ + _ret[0].Start = 0x20; + } + return _ret; + }, + + getRangeBySymbol: function(arrRanges, nCode){ + for(var i = 0; i < arrRanges.length; ++i){ + if(arrRanges[i].Start <= nCode && arrRanges[i].End >= nCode){ + return arrRanges[i]; + } + } + return null; + }, + + getRangeByName: function(arrRanges, nName){ + for(var i = 0; i < arrRanges.length; ++i){ + if(arrRanges[i].Name === nName){ + return arrRanges[i]; + } + } + return null; + }, + + getLinearIndexByCode: function(arrRanges, nCode){ + var nLinearIndex = -1; + var nCounter = 0; + var oCurRange; + for(var i = 0; i < arrRanges.length; ++i){ + oCurRange = arrRanges[i]; + if(oCurRange.Start > nCode){ + return -1; + } + if(oCurRange.Start <= nCode && oCurRange.End >= nCode){ + return nCounter + (nCode - oCurRange.Start); + } + nCounter += (oCurRange.End - oCurRange.Start + 1); + } + return nLinearIndex; + }, + + getCodeByLinearIndex: function(arrRanges, nIndex){ + if(nIndex < 0){ + return -1; + } + var nCount = 0; + var oCurRange = arrRanges[0]; + var nDiff; + for(var i = 0; i < arrRanges.length; ++i){ + oCurRange = arrRanges[i]; + nDiff = oCurRange.End - oCurRange.Start + 1; + if(nCount + nDiff > nIndex){ + return oCurRange.Start + nIndex - nCount; + } + nCount += nDiff; + } + return -1; + }, + + createTable: function(arrSym, nRowsCount, nColsCount, oDiv){ + + var nDivCount = nRowsCount*nColsCount; + var nCellsCounter = 0; + var sInnerHtml = ''; + var sId; + var sStyle = 'style=\'border-bottom: none\''; + var sCellStyle; + for(var i = 0; i < nDivCount; ++i){ + + + if(((i / nColsCount) >> 0) === (nRowsCount - 1)){ + sCellStyle = sStyle; + } + else{ + sCellStyle = ''; + } + if(i < arrSym.length){ + sId = 'c' + arrSym[i]; + sInnerHtml += '
' + '&#' + arrSym[i].toString(10) + '
'; + } + else{ + sInnerHtml += '
'; + } + ++nCellsCounter; + if(nCellsCounter >= nColsCount){ + sInnerHtml += '
'; + nCellsCounter = 0; + } + } + oDiv.innerHTML = sInnerHtml; + }, + + fillRecentSymbols: function(){ + var sRecents = window.localStorage.getItem('recentSymbols'); + var aRecentCookies; + if(sRecents != ''){ + aRecentCookies = JSON.parse(sRecents); + } + if(Array.isArray(aRecentCookies)){ + aRecents = aRecentCookies; + } + }, + + saveRecent: function(){ + var sJSON = JSON.stringify(aRecents); + window.localStorage.setItem('recentSymbols', sJSON); + }, + + checkRecent: function(sSymbol, sFont){ + if(aRecents.length === 0){ + aRecents.push({symbol: sSymbol, font: sFont}); + return; + } + for(var i = 0; i < aRecents.length; ++i){ + if(aRecents[i].symbol === sSymbol && aRecents[i].font === sFont){ + aRecents.splice(i, 1); + break; + } + } + aRecents.splice(0, 0, {symbol: sSymbol, font: sFont}); + if(aRecents.length > nMaxRecent){ + aRecents.splice(nMaxRecent, aRecents.length - nMaxRecent); + } + this.saveRecent(); + }, + + createCell: function(nSymbolCode, sFontName){ + var sId; + if(sFontName){ + var nFontIndex = 0; + aFontSelects[nCurrentFont].displayValue + for(var i = 0; i < aFontSelects.length; ++i){ + if(aFontSelects[i].displayValue === sFontName){ + nFontIndex = i; + break; + } + } + sId = 'r_' + nSymbolCode + '_' + nFontIndex; + } + else{ + sId = 'r' + nSymbolCode; + } + var _ret = $('
&#' + nSymbolCode.toString() + '
'); + _ret.addClass('cell'); + _ret.addClass('noselect'); + _ret.mousedown(cellClickHandler); + if(sFontName){ + _ret.css('font-family', '\'' + sFontName + '\''); + } + //_ret.mouseup(function (e) { + // e.stopPropagation(); + //}); + return _ret; + }, + + updateRecents: function(){ + var oRecentsDiv = $('#recent-table'); + oRecentsDiv.empty(); + var nRecents = Math.min(this.getColsCount(), aRecents.length); + if(aRecents.length === 0){ + oRecentsDiv.css('border', '1px solid rgb(247, 247, 247)'); + return; + } + oRecentsDiv.css('border', '1px solid rgb(122, 122, 122)'); + for(var i = 0; i < nRecents; ++i){ + var oCell = this.createCell(aRecents[i].symbol, aRecents[i].font); + + oCell.css('border-bottom', 'none'); + oRecentsDiv.append(oCell); + if(i === (nRecents - 1)){ + oCell.css('border-right', 'none'); + } + } + }, + + getColsCount: function(){ + var nMaxWidth = $('#main-div').innerWidth() - 17 - 2; + return ((nMaxWidth/CELL_WIDTH) >> 0); + }, + + getMaxHeight: function(){ + + var nMaxHeight = $('#main-div').innerHeight() - 10 - $('#header-div').outerHeight(true) - $('#recent-symbols-wrap').outerHeight(true) + - $('#value-wrap').outerHeight(true) - $('#insert-button').outerHeight(true) - 2; + return nMaxHeight; + }, + + getRowsCount: function() { + return Math.max(1, ((this.getMaxHeight()/CELL_HEIGHT) >> 0)); + }, + + getAllSymbolsCount: function(arrRanges){ + var _count = 0; + var oRange; + for(var i = 0; i < arrRanges.length; ++i){ + oRange = arrRanges[i]; + _count += (oRange.End - oRange.Start + 1); + } + return _count; + }, + + setTable: function(nStartCode){ + var nColsCount = this.getColsCount(); + var nRowsCount = this.getRowsCount(); + var nIndexSymbol = this.getLinearIndexByCode(aRanges, nStartCode); + var nAllSymbolsCount = this.getAllSymbolsCount(aRanges); + var nAllRowsCount = Math.ceil(nAllSymbolsCount/nColsCount); + var nRowsSkip = Math.max(0, Math.min(nAllRowsCount - nRowsCount, ((nIndexSymbol / nColsCount) >> 0))); + var nFirst = nRowsSkip*nColsCount; + var nSymbolsCount = nRowsCount*nColsCount; + var aSymbols = []; + var nCode; + for(var i = 0; i < nSymbolsCount; ++i){ + nCode = this.getCodeByLinearIndex(aRanges, nFirst + i); + if(nCode === -1){ + break; + } + aSymbols.push(nCode); + } + var oSymbolTable = $('#symbols-table')[0]; + $('#symbols-table').css('font-family', '\'' + aFontSelects[nCurrentFont].displayValue + '\''); + this.createTable(aSymbols, nRowsCount, nColsCount, oSymbolTable); + return nRowsSkip; + }, + + updateView: function(bUpdateTable, nTopSymbol, bUpdateInput, bUpdateRecents, bUpdateRanges) { + //fill ranges combo box + if(bMainFocus){ + if(bUpdateRanges !== false){ + this.updateRangeSelector(); + } + } + + if(bMainFocus){ + if(aFontSelects[nCurrentFont]){ + $("#font-name-label").text(aFontSelects[nCurrentFont].displayValue); + } + else{ + $("#font-name-label").text(''); + } + } + else{ + if(aFontSelects[nFontNameRecent]){ + $("#font-name-label").text(aFontSelects[nFontNameRecent].displayValue); + } + else{ + $("#font-name-label").text(''); + } + } + + if(bUpdateTable !== false){ + //fill fonts combo box + this.cmbFonts.setValue(nCurrentFont); + } +/* + //main table + var nRowsCount = this.getRowsCount(); + + var nHeight = nRowsCount*CELL_HEIGHT - 1; + $('#scrollable-table-div').height(nHeight); + $('#scrollable-table-div').css('margin-bottom', this.getMaxHeight() - nHeight); + + + bScrollMouseUp = false; + if(bUpdateTable !== false){ + //fill table + var nSymbol = (nTopSymbol !== null && nTopSymbol !== undefined)? nTopSymbol : nCurrentSymbol; + var nRowSkip = this.setTable(nSymbol); + //update scroll + var nSymbolsCount = this.getAllSymbolsCount(aRanges); + var nAllRowsCount = Math.ceil(nSymbolsCount/this.getColsCount()); + var nFullHeight = nAllRowsCount*CELL_HEIGHT; + + var nOldHeight = $("#fake-symbol-table-wrap").height(); + $("#fake-symbol-table-wrap").height(nHeight); + $("#fake-symbol-table").height(nFullHeight); + + + var container = document.getElementById('fake-symbol-table-wrap'); + // if(nOldHeight !== nHeight){ + // Ps.destroy(); + // Ps = new PerfectScrollbar('#' + container.id, { + // minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)) + // }); + // } + bShowTooltip = false; + container.scrollTop = nRowSkip*CELL_HEIGHT; + // Ps.update(); + bShowTooltip = true; + var aCells = $('#symbols-table > .cell'); + aCells.mousedown(cellClickHandler); + //aCells.mouseup(function (e) { + // e.stopPropagation(); + //}); + } + + //fill recent + if(bUpdateRecents){ + this.updateRecents(); + } + + //reset selection + $('.cell').removeClass('cell-selected'); + + //select current cell + if(bMainFocus){ + $('#c' + nCurrentSymbol).addClass('cell-selected'); + } + else{ + $('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected'); + } + + //update input + if(bUpdateInput !== false){ + this.updateInput(); + } +*/ + }, + + updateInput: function(){ + + var sVal = nCurrentSymbol.toString(16).toUpperCase(); + var sValLen = sVal.length; + for(var i = sValLen; i < 5; ++i){ + sVal = '0' + sVal; + } + $('#symbol-code-input').val(sVal); + }, + + updateRangeSelector: function() { + var oCurrentRange = this.getRangeBySymbol(aRanges, nCurrentSymbol); + if(!oCurrentRange || !oCurrentRange.Name){ + this.cmbRange.setDisabled(true); + this.cmbRange.setValue(''); + } + else{ + this.cmbRange.setDisabled(false); + var oOption, i, data = []; + for(i = 0; i < aRanges.length; ++i){ + data.push({ + value: aRanges[i].Name, + displayValue: oRangeNames[aRanges[i].Name] + }); + } + this.cmbRange.setData(data); + this.cmbRange.setValue(oCurrentRange.Name); + } + }, + + textTitle: 'Symbol Table', + textFont: 'Font', + textRange: 'Range', + textRecent: 'Recently used symbols', + textCode: 'Unicode HEX value' + }, Common.Views.SymbolTableDialog || {})) +}); \ No newline at end of file diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 71c5041ce..723176eac 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -47,6 +47,7 @@ define([ 'common/main/lib/view/ImageFromUrlDialog', 'common/main/lib/view/InsertTableDialog', 'common/main/lib/view/SelectFileDlg', + 'common/main/lib/view/SymbolTableDialog', 'common/main/lib/util/define', 'documenteditor/main/app/view/Toolbar', 'documenteditor/main/app/view/DropcapSettingsAdvanced', @@ -324,6 +325,7 @@ define([ toolbar.listStyles.on('contextmenu', _.bind(this.onListStyleContextMenu, this)); toolbar.styleMenu.on('hide:before', _.bind(this.onListStyleBeforeHide, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); + toolbar.btnInsertSymbol.on('click', _.bind(this.onInsertSymbolClick, this)); toolbar.mnuNoControlsColor.on('click', _.bind(this.onNoControlsColor, this)); toolbar.mnuControlsColorPicker.on('select', _.bind(this.onSelectControlsColor, this)); Common.Gateway.on('insertimage', _.bind(this.insertImage, this)); @@ -820,6 +822,8 @@ define([ need_disable = paragraph_locked || header_locked || in_chart || !can_add_image&&!in_equation || control_plain; toolbar.btnInsertEquation.setDisabled(need_disable); + toolbar.btnInsertSymbol.setDisabled(!in_para || paragraph_locked || header_locked); + need_disable = paragraph_locked || header_locked || in_equation; toolbar.btnSuperscript.setDisabled(need_disable); toolbar.btnSubscript.setDisabled(need_disable); @@ -2470,6 +2474,24 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertEquation); }, + onInsertSymbolClick: function() { + if (this.api) { + var me = this, + win = new Common.Views.SymbolTableDialog({ + api: me.api, + handler: function(dlg, result) { + if (result == 'ok') { + // dlg.getSettings(); + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + win.show(); + // win.setSettings(); + } + Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertSymbol); + }, + onApiMathTypes: function(equation) { this._equationTemp = equation; var me = this; diff --git a/apps/documenteditor/main/app/template/Toolbar.template b/apps/documenteditor/main/app/template/Toolbar.template index c50e0c0e7..aba5de34a 100644 --- a/apps/documenteditor/main/app/template/Toolbar.template +++ b/apps/documenteditor/main/app/template/Toolbar.template @@ -108,6 +108,7 @@
+
diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index acdb1b86a..8b850c99d 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -583,6 +583,14 @@ define([ }); this.paragraphControls.push(this.btnInsertEquation); + this.btnInsertSymbol = new Common.UI.Button({ + id: 'tlbtn-insertsymbol', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-insertequation', + caption: me.capBtnInsSymbol + }); + this.paragraphControls.push(this.btnInsertSymbol); + this.btnDropCap = new Common.UI.Button({ id: 'tlbtn-dropcap', cls: 'btn-toolbar x-huge icon-top', @@ -1309,6 +1317,7 @@ define([ _injectComponent('#slot-btn-blankpage', this.btnBlankPage); _injectComponent('#slot-btn-insshape', this.btnInsertShape); _injectComponent('#slot-btn-insequation', this.btnInsertEquation); + _injectComponent('#slot-btn-inssymbol', this.btnInsertSymbol); _injectComponent('#slot-btn-pageorient', this.btnPageOrient); _injectComponent('#slot-btn-pagemargins', this.btnPageMargins); _injectComponent('#slot-btn-pagesize', this.btnPageSize); @@ -1579,6 +1588,7 @@ define([ this.btnBlankPage.updateHint(this.tipBlankPage); this.btnInsertShape.updateHint(this.tipInsertShape); this.btnInsertEquation.updateHint(this.tipInsertEquation); + this.btnInsertSymbol.updateHint(this.tipInsertSymbol); this.btnDropCap.updateHint(this.tipDropCap); this.btnContentControls.updateHint(this.tipControls); this.btnColumns.updateHint(this.tipColumns); @@ -2324,7 +2334,9 @@ define([ capBtnWatermark: 'Watermark', textEditWatermark: 'Custom Watermark', textRemWatermark: 'Remove Watermark', - tipWatermark: 'Edit watermark' + tipWatermark: 'Edit watermark', + capBtnInsSymbol: 'Symbol', + tipInsertSymbol: 'Insert symbol' } })(), DE.Views.Toolbar || {})); }); From 28861851fb9634eece9818a9525f196b60f9742a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 11 Nov 2019 16:45:44 +0300 Subject: [PATCH 02/18] Symbol table refactoring --- .../common/main/lib/view/SymbolTableDialog.js | 456 ++++++++++++++---- .../main/resources/less/symboltable.less | 54 +++ .../main/app/controller/Toolbar.js | 3 +- .../main/resources/less/app.less | 1 + 4 files changed, 431 insertions(+), 83 deletions(-) create mode 100644 apps/common/main/resources/less/symboltable.less diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 55316f740..014e91d5e 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -322,6 +322,9 @@ define([ oRangeNames[272] = 'Supplementary Private Use Area A'; oRangeNames[273] = 'Supplementary Private Use Area B'; + var CELL_WIDTH = 31; + var CELL_HEIGHT = 33; + var aFontSelects = []; var aRanges = []; var aRecents = []; @@ -337,11 +340,16 @@ define([ var sInitSymbol = ""; var nLastScroll = -1000; - var bShowTooltip = true; + + var sLastId = ""; + var nLastTime = -1000; + + var lastTime = -1; + var lastKeyCode = -1; Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ options: { - width: 400, + width: 450, style: 'min-width: 230px;', cls: 'modal-dlg', buttons: ['ok', 'cancel'] @@ -353,8 +361,8 @@ define([ }, options || {}); this.template = [ - '
', - '', + '
', + '
', '', '', '', '', - '', '', '', - '', '', '', - '', + '', + '', + '', + '', + '', '', '
', '', @@ -366,21 +374,38 @@ define([ '
', - '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', + '
', '
', + '', '', - '
', + '
', '
', + '', '', + '', + '
', '
', '
', + '
', + '
', '
' @@ -389,6 +414,9 @@ define([ this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; + var filter = Common.localStorage.getKeysFilter(); + this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; + var fontList = this.api.pluginMethod_GetFontList(); fontList.sort(function(a, b){ if(a.m_wsFontName < b.m_wsFontName) return -1; @@ -487,7 +515,8 @@ define([ cls : 'input-group-nr', data : aFontSelects, editable : false, - menuStyle : 'min-width: 100%; max-height: 200px;' + search : true, + menuStyle : 'min-width: 100%; max-height: 209px;' }).on('selected', function(combo, record) { var oCurrentRange = me.getRangeBySymbol(aRanges, nCurrentSymbol); nCurrentFont = record.value; @@ -507,6 +536,7 @@ define([ } bMainFocus = true; me.updateView(); + me.previewPanel.focus(); }); this.cmbFonts.setValue(nCurrentFont); @@ -514,7 +544,13 @@ define([ el : $window.find('#symbol-table-cmb-range'), cls : 'input-group-nr', editable : false, - menuStyle : 'min-width: 100%; max-height: 200px;' + menuStyle : 'min-width: 100%; max-height: 209px;' + }).on('selected', function(combo, record) { + var oCurrentRange = me.getRangeByName(aRanges, parseInt(record.value)); + nCurrentSymbol = oCurrentRange.Start; + bMainFocus = true; + me.updateView(undefined, undefined, undefined, undefined, false); + me.previewPanel.focus(); }); this.updateRangeSelector(); @@ -526,10 +562,36 @@ define([ validateOnBlur: false, validateOnChange: true }).on('changing', function(cmp, newValue, oldValue) { - me.isTextChanged = true; + var value = parseInt(newValue, 16); + if(!isNaN(value) && value > 0x1F){ + var oRange = me.getRangeBySymbol(aRanges, value); + if(oRange){ + var bUpdateTable = (me.$window.find("#c" + value).length === 0); + nCurrentSymbol = value; + bMainFocus = true; + me.updateView(bUpdateTable, undefined, false); + } + } + }).on('change:after', function(cmp, newValue, oldValue) { + me.updateInput(); }); - // this.updateView(undefined, undefined, undefined, true); + //fill recents + this.fillRecentSymbols(); + + var container = this.$window.find('#fake-symbol-table-wrap'); + container.perfectScrollbar({ + theme: 'custom-theme', + minScrollbarLength: 50 + }); + + this.previewPanel = this.$window.find('#id-preview-data'); + this.previewParent = this.previewPanel.parent(); + this.previewScrolled = this.$window.find('#id-preview'); + this.previewInner = this.previewScrolled.find('div:first-child'); + this.recentPanel = this.$window.find('#symbol-table-recent'); + this.fontLabel = this.$window.find("#symbol-table-label-font"); + this.updateView(undefined, undefined, undefined, true); $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); }, @@ -537,16 +599,43 @@ define([ show: function() { Common.UI.Window.prototype.show.apply(this, arguments); + if (!this.binding) + this.binding = {}; + this.binding.keydownSymbols = _.bind(this.onKeyDown,this); + this.binding.keypressSymbols = _.bind(this.onKeyPress,this); + $(document).on('keydown.' + this.cid, '#symbol-table-scrollable-div #id-preview-data, #symbol-table-recent', this.binding.keydownSymbols); + $(document).on('keypress.' + this.cid, '#symbol-table-scrollable-div #id-preview-data, #symbol-table-recent', this.binding.keypressSymbols); + var me = this; _.delay(function(){ - // me.inputUrl.cmpEl.find('input').focus(); + me.previewPanel.focus(); },50); }, + close: function(suppressevent) { + $(document).off('keydown.' + this.cid, this.binding.keydownSymbols); + $(document).off('keypress.' + this.cid, this.binding.keypressSymbols); + + Common.UI.Window.prototype.close.apply(this, arguments); + }, + setSettings: function (props) { }, getSettings: function () { + return this.getPasteSymbol(this.$window.find('.cell-selected').attr('id')); + }, + + getPasteSymbol: function(cellId) { + var bUpdateRecents = cellId[0] === 'c'; + var sFont; + if(bUpdateRecents){ + sFont = aFontSelects[nCurrentFont].displayValue; + } else { + var nFontId = parseInt(cellId.split('_')[2]); + sFont = aFontSelects[nFontId].displayValue; + } + return {font: sFont, symbol: this.encodeSurrogateChar(nCurrentSymbol), updateRecents: bUpdateRecents}; }, onBtnClick: function(event) { @@ -559,8 +648,13 @@ define([ }, _handleInput: function(state) { + var settings = this.getPasteSymbol(this.$window.find('.cell-selected').attr('id')); + if (state=='ok') { + settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); + settings.updateRecents && this.updateRecents(); + } if (this.options.handler) { - this.options.handler.call(this, this, state); + this.options.handler.call(this, this, state, settings); } this.close(); @@ -662,8 +756,7 @@ define([ return -1; }, - createTable: function(arrSym, nRowsCount, nColsCount, oDiv){ - + createTable: function(arrSym, nRowsCount, nColsCount){ var nDivCount = nRowsCount*nColsCount; var nCellsCounter = 0; var sInnerHtml = ''; @@ -692,23 +785,24 @@ define([ nCellsCounter = 0; } } - oDiv.innerHTML = sInnerHtml; + this.previewPanel.html(sInnerHtml); + // this.previewPanel[0].innerHTML = sInnerHtml; }, fillRecentSymbols: function(){ - var sRecents = window.localStorage.getItem('recentSymbols'); + var sRecents = Common.localStorage.getItem(this.appPrefix + 'recentSymbols'); var aRecentCookies; if(sRecents != ''){ aRecentCookies = JSON.parse(sRecents); } - if(Array.isArray(aRecentCookies)){ + if(_.isArray(aRecentCookies)){ aRecents = aRecentCookies; } }, saveRecent: function(){ var sJSON = JSON.stringify(aRecents); - window.localStorage.setItem('recentSymbols', sJSON); + Common.localStorage.setItem(this.appPrefix + 'recentSymbols', sJSON); }, checkRecent: function(sSymbol, sFont){ @@ -730,10 +824,10 @@ define([ }, createCell: function(nSymbolCode, sFontName){ - var sId; + var sId = '', + symbol = ''; if(sFontName){ var nFontIndex = 0; - aFontSelects[nCurrentFont].displayValue for(var i = 0; i < aFontSelects.length; ++i){ if(aFontSelects[i].displayValue === sFontName){ nFontIndex = i; @@ -741,52 +835,77 @@ define([ } } sId = 'r_' + nSymbolCode + '_' + nFontIndex; - } - else{ + symbol = '&#' + nSymbolCode.toString(); + } else if (nSymbolCode!==undefined) { sId = 'r' + nSymbolCode; + symbol = '&#' + nSymbolCode.toString(); } - var _ret = $('
&#' + nSymbolCode.toString() + '
'); + var _ret = $('
' + symbol + '
'); _ret.addClass('cell'); _ret.addClass('noselect'); - _ret.mousedown(cellClickHandler); + _ret.mousedown(_.bind(this.cellClickHandler, this)); if(sFontName){ _ret.css('font-family', '\'' + sFontName + '\''); } - //_ret.mouseup(function (e) { - // e.stopPropagation(); - //}); return _ret; }, - updateRecents: function(){ - var oRecentsDiv = $('#recent-table'); - oRecentsDiv.empty(); - var nRecents = Math.min(this.getColsCount(), aRecents.length); - if(aRecents.length === 0){ - oRecentsDiv.css('border', '1px solid rgb(247, 247, 247)'); + cellClickHandler: function (e) { + var id = $(e.target).attr('id'); + if(!id){ return; } - oRecentsDiv.css('border', '1px solid rgb(122, 122, 122)'); - for(var i = 0; i < nRecents; ++i){ - var oCell = this.createCell(aRecents[i].symbol, aRecents[i].font); + var nTime = (new Date()).getTime(); + if(id === sLastId && (nTime - nLastTime) < 300 ){ + this.cellDblClickHandler(e) + } + else{ + if(id[0] === 'c'){ + nCurrentSymbol = parseInt(id.slice(1, id.length)); + bMainFocus = true; + } + else{ + var aStrings = id.split('_'); + nCurrentSymbol = parseInt(aStrings[1]); + nFontNameRecent = parseInt(aStrings[2]); + bMainFocus = false; + } + this.updateView(false); + } + sLastId = e.target.id; + nLastTime = nTime; + }, + cellDblClickHandler: function (e){ + var settings = this.getPasteSymbol($(e.target).attr('id')); + settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); + settings.updateRecents && this.updateView(false, undefined, undefined, true); + this.fireEvent('symbol:dblclick', [this, settings]); + }, + + updateRecents: function(){ + var oRecentsDiv = this.recentPanel; + oRecentsDiv.empty(); + var nCols = this.getColsCount(), + nRecents = aRecents.length; + oRecentsDiv.width(nCols * CELL_WIDTH); + for(var i = 0; i < nCols; ++i){ + var oCell = (i> 0); }, getMaxHeight: function(){ - - var nMaxHeight = $('#main-div').innerHeight() - 10 - $('#header-div').outerHeight(true) - $('#recent-symbols-wrap').outerHeight(true) - - $('#value-wrap').outerHeight(true) - $('#insert-button').outerHeight(true) - 2; + var nMaxHeight = this.$window.find('#symbol-table-scrollable-div').innerHeight(); return nMaxHeight; }, @@ -822,9 +941,8 @@ define([ } aSymbols.push(nCode); } - var oSymbolTable = $('#symbols-table')[0]; - $('#symbols-table').css('font-family', '\'' + aFontSelects[nCurrentFont].displayValue + '\''); - this.createTable(aSymbols, nRowsCount, nColsCount, oSymbolTable); + this.previewPanel.css('font-family', '\'' + aFontSelects[nCurrentFont].displayValue + '\''); + this.createTable(aSymbols, nRowsCount, nColsCount); return nRowsSkip; }, @@ -838,18 +956,18 @@ define([ if(bMainFocus){ if(aFontSelects[nCurrentFont]){ - $("#font-name-label").text(aFontSelects[nCurrentFont].displayValue); + this.fontLabel.text(aFontSelects[nCurrentFont].displayValue); } else{ - $("#font-name-label").text(''); + this.fontLabel.text(''); } } else{ if(aFontSelects[nFontNameRecent]){ - $("#font-name-label").text(aFontSelects[nFontNameRecent].displayValue); + this.fontLabel.text(aFontSelects[nFontNameRecent].displayValue); } else{ - $("#font-name-label").text(''); + this.fontLabel.text(''); } } @@ -857,15 +975,10 @@ define([ //fill fonts combo box this.cmbFonts.setValue(nCurrentFont); } -/* + //main table var nRowsCount = this.getRowsCount(); - var nHeight = nRowsCount*CELL_HEIGHT - 1; - $('#scrollable-table-div').height(nHeight); - $('#scrollable-table-div').css('margin-bottom', this.getMaxHeight() - nHeight); - - bScrollMouseUp = false; if(bUpdateTable !== false){ //fill table @@ -876,27 +989,35 @@ define([ var nAllRowsCount = Math.ceil(nSymbolsCount/this.getColsCount()); var nFullHeight = nAllRowsCount*CELL_HEIGHT; - var nOldHeight = $("#fake-symbol-table-wrap").height(); - $("#fake-symbol-table-wrap").height(nHeight); - $("#fake-symbol-table").height(nFullHeight); + this.previewInner.height(nFullHeight); + if (!this.scrollerY) + this.scrollerY = new Common.UI.Scroller({ + el: this.previewScrolled, + minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)), + alwaysVisibleY: true, + wheelSpeed: Math.min((Math.floor(this.previewPanel.height()/CELL_HEIGHT) * CELL_HEIGHT)/10, 20), + useKeyboard: false, + onChange: _.bind(function(){ + if (this.scrollerY) { + this._preventUpdateScroll = true; + this.onScrollEnd(); + this._preventUpdateScroll = false; + this.previewParent.height(nHeight); + this.previewParent.css({top: this.scrollerY.getScrollTop()}); + } + }, this) + }); + if (!this._preventUpdateScroll) { + this.scrollerY.update({ + minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)) + }); + this.scrollerY.scrollTop(nRowSkip*CELL_HEIGHT); + } - var container = document.getElementById('fake-symbol-table-wrap'); - // if(nOldHeight !== nHeight){ - // Ps.destroy(); - // Ps = new PerfectScrollbar('#' + container.id, { - // minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)) - // }); - // } - bShowTooltip = false; - container.scrollTop = nRowSkip*CELL_HEIGHT; - // Ps.update(); - bShowTooltip = true; - var aCells = $('#symbols-table > .cell'); - aCells.mousedown(cellClickHandler); - //aCells.mouseup(function (e) { - // e.stopPropagation(); - //}); + var aCells = this.previewPanel.find('.cell'); + aCells.off('mousedown'); + aCells.mousedown(_.bind(this.cellClickHandler, this)); } //fill recent @@ -905,31 +1026,74 @@ define([ } //reset selection - $('.cell').removeClass('cell-selected'); + this.$window.find('.cell').removeClass('cell-selected'); //select current cell if(bMainFocus){ - $('#c' + nCurrentSymbol).addClass('cell-selected'); + this.$window.find('#c' + nCurrentSymbol).addClass('cell-selected'); } else{ - $('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected'); + this.$window.find('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected'); } //update input if(bUpdateInput !== false){ this.updateInput(); } -*/ + }, + + onScrollEnd: function(){ + if(this.scrollerY.getScrollTop() === nLastScroll){ + return; + } + + var nSymbolsCount = this.getAllSymbolsCount(aRanges); + var nColsCount = this.getColsCount(); + var nRows = this.getRowsCount(); + var nAllRowsCount = Math.ceil(nSymbolsCount/nColsCount); + var nFullHeight = nAllRowsCount*CELL_HEIGHT; + var nRowSkip = Math.max(0, Math.min(nAllRowsCount - nRows, (nAllRowsCount*this.scrollerY.getScrollTop()/nFullHeight + 0.5) >> 0)); + nLastScroll = this.scrollerY.getScrollTop(); + if(!bMainFocus){ + nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount); + bMainFocus = true; + } + else{ + var oFirstCell = this.previewPanel.children()[0]; + if(oFirstCell){ + var id = oFirstCell.id; + if(id){ + var nOldFirstCode = parseInt(id.slice(1, id.length)); + var nOldFirstLinearIndex = this.getLinearIndexByCode(aRanges, nOldFirstCode); + var nOldCurrentLinearIndex = this.getLinearIndexByCode(aRanges, nCurrentSymbol); + var nDiff = nOldCurrentLinearIndex - nOldFirstLinearIndex; + var nNewCurLinearIndex = nRowSkip*nColsCount + nDiff; + nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nNewCurLinearIndex); + var nFirstIndex = nRowSkip*nColsCount; + nNewCurLinearIndex -= nColsCount; + while(nCurrentSymbol === -1 && nNewCurLinearIndex >= nFirstIndex){ + nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nNewCurLinearIndex); + nNewCurLinearIndex -= nColsCount; + } + if(nCurrentSymbol === -1){ + nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nFirstIndex); + } + } + else{ + nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount); + } + } + } + this.updateView(true, this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount)); }, updateInput: function(){ - var sVal = nCurrentSymbol.toString(16).toUpperCase(); var sValLen = sVal.length; for(var i = sValLen; i < 5; ++i){ sVal = '0' + sVal; } - $('#symbol-code-input').val(sVal); + this.inputCode.setValue(sVal); }, updateRangeSelector: function() { @@ -952,6 +1116,134 @@ define([ } }, + onKeyDown: function(e){ + if(document.activeElement){ + if(document.activeElement.nodeName && document.activeElement.nodeName.toLowerCase() === 'span'){ + return; + } + } + var value = e.which || e.charCode || e.keyCode || 0; + var bFill = true; + if(bMainFocus){ + var nCode = -1; + if ( value === 37 ){//left + nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - 1); + } + else if ( value === 38 ){//top + nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - this.getColsCount()); + } + else if ( value === 39 ){//right + nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + 1); + } + else if ( value === 40 ){//bottom + nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + this.getColsCount()); + } + else if(value === 36){//home + if(aRanges.length > 0){ + nCode = aRanges[0].Start; + } + } + else if(value === 35){//end + if(aRanges.length > 0){ + nCode = aRanges[aRanges.length - 1].End; + } + } + else if(value === 13){//enter + this.checkRecent(nCurrentSymbol, aFontSelects[nCurrentFont].displayName); + this.fireEvent('symbol:dblclick', {font: aFontSelects[nCurrentFont].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); + } + else{ + bFill = false; + } + if(nCode > -1){ + nCurrentSymbol = nCode; + var bUpdateTable = this.$window.find('#c' + nCurrentSymbol).length === 0; + this.updateView(bUpdateTable); + } + } + else{ + var oSelectedCell, aStrings; + if ( value === 37 ){//left + oSelectedCell = this.$window.find('.cell-selected')[0]; + if(oSelectedCell && oSelectedCell.id[0] === 'r'){ + var oPresCell = this.$window.find(oSelectedCell).prev(); + if(oPresCell.length > 0){ + aStrings = this.$window.find(oPresCell).attr('id').split('_'); + nCurrentSymbol = parseInt(aStrings[1]); + nFontNameRecent = parseInt(aStrings[2]); + this.updateView(false); + } + } + } + else if ( value === 39 ){//right + oSelectedCell = this.$window.find('.cell-selected')[0]; + if(oSelectedCell && oSelectedCell.id[0] === 'r'){ + var oNextCell = this.$window.find(oSelectedCell).next(); + if(oNextCell.length > 0){ + aStrings = this.$window.find(oNextCell).attr('id').split('_'); + nCurrentSymbol = parseInt(aStrings[1]); + nFontNameRecent = parseInt(aStrings[2]); + this.updateView(false); + } + } + } + else if(value === 36){//home + var oFirstCell = this.$window.find('#recent-table').children()[0]; + if(oFirstCell){ + aStrings = oFirstCell.id.split('_'); + nCurrentSymbol = parseInt(aStrings[1]); + nFontNameRecent = parseInt(aStrings[2]); + this.updateView(false); + } + } + else if(value === 35){//end + var aChildren = this.recentPanel.children(); + var oLastCell = aChildren[aChildren.length - 1]; + if(oLastCell){ + aStrings = oLastCell.id.split('_'); + nCurrentSymbol = parseInt(aStrings[1]); + nFontNameRecent = parseInt(aStrings[2]); + this.updateView(false); + } + } + else if(value === 13){//enter + this.fireEvent('symbol:dblclick', {font: aFontSelects[nFontNameRecent].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); + } + else{ + bFill = false; + } + } + + if(bFill){ + lastKeyCode = value; + lastTime = (new Date()).getTime(); + } + }, + + onKeyPress: function(e){ + if(document.activeElement){ + if(document.activeElement.nodeName && document.activeElement.nodeName.toLowerCase() === 'span'){ + return; + } + } + var value = e.which || e.charCode || e.keyCode || 0; + if(lastKeyCode === value){ + if(Math.abs(lastTime - (new Date()).getTime()) < 1000){ + return; + } + } + if(!isNaN(value) && value > 0x1F){ + var oRange = this.getRangeBySymbol(aRanges, value); + if(oRange){ + var bUpdateTable = (this.$window.find("#c" + value).length === 0); + nCurrentSymbol = value; + bMainFocus = true; + this.updateView(bUpdateTable, undefined, true); + } + } + e.preventDefault && e.preventDefault(); + }, + textTitle: 'Symbol Table', textFont: 'Font', textRange: 'Range', diff --git a/apps/common/main/resources/less/symboltable.less b/apps/common/main/resources/less/symboltable.less new file mode 100644 index 000000000..70bdfc5d1 --- /dev/null +++ b/apps/common/main/resources/less/symboltable.less @@ -0,0 +1,54 @@ +#symbol-table-scrollable-div, #symbol-table-recent { + div{ + display: inline-block; + vertical-align: top; + } + + .cell{ + width: 31px; + height: 33px; + border-right: 1px solid @gray-soft; + border-bottom: 1px solid @gray-soft; + background: #ffffff; + align-content: center; + vertical-align: middle; + text-align: center; + font-size: 22px; + -khtml-user-select: none; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + cursor: default; + overflow:hidden; + display: inline-block; + } + + .cell-selected{ + background-color: @gray-darker; + color: white; + } +} + +#symbol-table-recent { + width: 100%; + height: 32px; + overflow: hidden; + border: @gray-soft solid 1px; +} + +#symbol-table-scrollable-div { + #id-preview { + width: 100%; + height: 132px !important; + position:relative; + overflow:hidden; + border: @gray-soft solid 1px; + } + + #id-preview-data { + width: 100%; + height: 134px !important; + position:relative; + overflow:hidden; + } +} diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 723176eac..aa4a1e330 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2481,7 +2481,8 @@ define([ api: me.api, handler: function(dlg, result) { if (result == 'ok') { - // dlg.getSettings(); + var settings = dlg.getSettings(); + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); } diff --git a/apps/documenteditor/main/resources/less/app.less b/apps/documenteditor/main/resources/less/app.less index cfeb6e07d..d07e1e5e4 100644 --- a/apps/documenteditor/main/resources/less/app.less +++ b/apps/documenteditor/main/resources/less/app.less @@ -118,6 +118,7 @@ @import "../../../../common/main/resources/less/toolbar.less"; @import "../../../../common/main/resources/less/language-dialog.less"; @import "../../../../common/main/resources/less/winxp_fix.less"; +@import "../../../../common/main/resources/less/symboltable.less"; // App // -------------------------------------------------- From 5fba110d35c7c249f4dc0bae8df0922b83b537b6 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Mon, 11 Nov 2019 17:48:09 +0300 Subject: [PATCH 03/18] Symbol table refactoring --- .../common/main/lib/view/SymbolTableDialog.js | 38 +++++++++---------- .../main/app/controller/Toolbar.js | 25 +++++++----- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 014e91d5e..4c339d210 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -350,6 +350,7 @@ define([ Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ options: { width: 450, + height: 395, style: 'min-width: 230px;', cls: 'modal-dlg', buttons: ['ok', 'cancel'] @@ -413,6 +414,7 @@ define([ this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; + this.type = this.options.type || 0; // 0 - close on OK, single adding symbol var filter = Common.localStorage.getKeysFilter(); this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; @@ -619,13 +621,6 @@ define([ Common.UI.Window.prototype.close.apply(this, arguments); }, - setSettings: function (props) { - }, - - getSettings: function () { - return this.getPasteSymbol(this.$window.find('.cell-selected').attr('id')); - }, - getPasteSymbol: function(cellId) { var bUpdateRecents = cellId[0] === 'c'; var sFont; @@ -649,14 +644,15 @@ define([ _handleInput: function(state) { var settings = this.getPasteSymbol(this.$window.find('.cell-selected').attr('id')); - if (state=='ok') { - settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); - settings.updateRecents && this.updateRecents(); - } if (this.options.handler) { this.options.handler.call(this, this, state, settings); } - + if (state=='ok') { + settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); + settings.updateRecents && this.updateRecents(); + if (this.type) + return; + } this.close(); }, @@ -877,10 +873,14 @@ define([ }, cellDblClickHandler: function (e){ - var settings = this.getPasteSymbol($(e.target).attr('id')); - settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); - settings.updateRecents && this.updateView(false, undefined, undefined, true); - this.fireEvent('symbol:dblclick', [this, settings]); + if (!this.type) + this._handleInput('ok'); + else { + var settings = this.getPasteSymbol($(e.target).attr('id')); + settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font); + settings.updateRecents && this.updateView(false, undefined, undefined, true); + this.fireEvent('symbol:dblclick', this, settings); + } }, updateRecents: function(){ @@ -1149,8 +1149,8 @@ define([ } } else if(value === 13){//enter - this.checkRecent(nCurrentSymbol, aFontSelects[nCurrentFont].displayName); - this.fireEvent('symbol:dblclick', {font: aFontSelects[nCurrentFont].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); + this.checkRecent(nCurrentSymbol, aFontSelects[nCurrentFont].displayValue); + this.fireEvent('symbol:dblclick', this, {font: aFontSelects[nCurrentFont].displayValue, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); } else{ bFill = false; @@ -1207,7 +1207,7 @@ define([ } } else if(value === 13){//enter - this.fireEvent('symbol:dblclick', {font: aFontSelects[nFontNameRecent].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); + this.fireEvent('symbol:dblclick', this, {font: aFontSelects[nFontNameRecent].displayValue, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); } else{ bFill = false; diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index aa4a1e330..00eb7fa76 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2478,17 +2478,21 @@ define([ if (this.api) { var me = this, win = new Common.Views.SymbolTableDialog({ - api: me.api, - handler: function(dlg, result) { - if (result == 'ok') { - var settings = dlg.getSettings(); - me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + api: me.api, + // modal: false, + // type: 1, + // buttons: [{value: 'ok', caption: this.textInsert}, 'close'], + handler: function(dlg, result, settings) { + if (result == 'ok') { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + } + Common.NotificationCenter.trigger('edit:complete', me.toolbar); } - Common.NotificationCenter.trigger('edit:complete', me.toolbar); - } - }); + }); win.show(); - // win.setSettings(); + win.on('symbol:dblclick', function(cmp, settings) { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + }); } Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertSymbol); }, @@ -3291,7 +3295,8 @@ define([ confirmAddFontName: 'The font you are going to save is not available on the current device.
The text style will be displayed using one of the device fonts, the saved font will be used when it is available.
Do you want to continue?', notcriticalErrorTitle: 'Warning', txtMarginsW: 'Left and right margins are too high for a given page wight', - txtMarginsH: 'Top and bottom margins are too high for a given page height' + txtMarginsH: 'Top and bottom margins are too high for a given page height', + textInsert: 'Insert' }, DE.Controllers.Toolbar || {})); }); \ No newline at end of file From 1097955fbfc0dc5bcaae8447bf7d509ac48ce37e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Nov 2019 12:17:15 +0300 Subject: [PATCH 04/18] Symbol table: fix loading fonts --- .../common/main/lib/view/SymbolTableDialog.js | 57 ++++++++++--------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 4c339d210..fe5e70132 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -419,6 +419,37 @@ define([ var filter = Common.localStorage.getKeysFilter(); this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; + if (aFontSelects.length<1) + this.initFonts(); + + if (nCurrentFont < 0) + nCurrentFont = 0; + + aRanges = this.getArrRangesByFont(nCurrentFont); + if(sInitSymbol && sInitSymbol.length > 0){ + nCurrentSymbol = this.fixedCharCodeAt(sInitSymbol, 0); + if(false === nCurrentSymbol){ + nCurrentSymbol = -1; + } + else{ + for(var i = 0; i < aRanges.length; ++i){ + if(nCurrentSymbol >= aRanges[i].Start && nCurrentSymbol <= aRanges[i].End){ + break; + } + } + if(i === aRanges.length){ + nCurrentSymbol = -1; + } + } + } + if(nCurrentSymbol === -1){ + nCurrentSymbol = aRanges[0].Start; + } + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + initFonts: function() { var fontList = this.api.pluginMethod_GetFontList(); fontList.sort(function(a, b){ if(a.m_wsFontName < b.m_wsFontName) return -1; @@ -478,32 +509,6 @@ define([ } } } - if (nCurrentFont < 0) - nCurrentFont = 0; - - - aRanges = this.getArrRangesByFont(nCurrentFont); - if(sInitSymbol && sInitSymbol.length > 0){ - nCurrentSymbol = this.fixedCharCodeAt(sInitSymbol, 0); - if(false === nCurrentSymbol){ - nCurrentSymbol = -1; - } - else{ - for(i = 0; i < aRanges.length; ++i){ - if(nCurrentSymbol >= aRanges[i].Start && nCurrentSymbol <= aRanges[i].End){ - break; - } - } - if(i === aRanges.length){ - nCurrentSymbol = -1; - } - } - } - if(nCurrentSymbol === -1){ - nCurrentSymbol = aRanges[0].Start; - } - - Common.UI.Window.prototype.initialize.call(this, this.options); }, render: function() { From 57e744435aaf40715c9f3c153c082f0230260671 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Nov 2019 14:33:47 +0300 Subject: [PATCH 05/18] Add translation for symbol table ranges --- .../common/main/lib/view/SymbolTableDialog.js | 22 +- .../common/main/resources/symboltable/ru.json | 275 ++++++++++++++++++ .../main/app/controller/Toolbar.js | 1 + apps/documenteditor/main/locale/en.json | 7 + apps/documenteditor/main/locale/ru.json | 5 + 5 files changed, 308 insertions(+), 2 deletions(-) create mode 100644 apps/common/main/resources/symboltable/ru.json diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index fe5e70132..24b183c9f 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -347,6 +347,17 @@ define([ var lastTime = -1; var lastKeyCode = -1; + var loadTranslation = function(lang, callback) { + lang = lang.split(/[\-_]/)[0].toLocaleLowerCase(); + Common.Utils.loadConfig('resources/symboltable/' + lang + '.json', function (langJson) { + for (var i=1; i<274; i++) { + var val = oRangeNames[i]; + oRangeNames[i] = langJson[val] || val; + } + callback && callback(); + }); + }; + Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ options: { width: 450, @@ -419,8 +430,8 @@ define([ var filter = Common.localStorage.getKeysFilter(); this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; - if (aFontSelects.length<1) - this.initFonts(); + var init = (aFontSelects.length<1); + init && this.initFonts(); if (nCurrentFont < 0) nCurrentFont = 0; @@ -446,6 +457,13 @@ define([ nCurrentSymbol = aRanges[0].Start; } + if (init && this.options.lang && this.options.lang != 'en') { + var me = this; + loadTranslation(this.options.lang, function(){ + me.updateRangeSelector(); + }); + } + Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/resources/symboltable/ru.json b/apps/common/main/resources/symboltable/ru.json new file mode 100644 index 000000000..c9cded905 --- /dev/null +++ b/apps/common/main/resources/symboltable/ru.json @@ -0,0 +1,275 @@ +{ + "Basic Latin": "Основная латиница", + "Latin 1 Supplement": "Дополнительная латиница-1", + "Latin Extended A": "Расширенная латиница-A", + "Latin Extended B": "Расширенная латиница-B", + "IPA Extensions": "Международный фонетический алфавит", + "Spacing Modifier Letters": "Некомбинируемые протяжённые символы-модификаторы", + "Combining Diacritical Marks": "Комбинируемые диакритические знаки", + "Greek and Coptic": "Греческий и коптский алфавиты", + "Cyrillic": "Кириллица", + "Cyrillic Supplement": "Кириллица. Дополнительные символы", + "Armenian": "Армянский алфавит", + "Hebrew": "Иврит", + "Arabic": "Арабский", + "Syriac": "Сирийский", + "Arabic Supplement": "Дополнительные символы арабского письма", + "Thaana": "Тана", + "NKo": "Нко", + "Samaritan": "Самаритянское письмо", + "Mandaic": "Мандейский алфавит", + "Arabic Extended A": "Расширенный набор символов арабского письма-A", + "Devanagari": "Деванагари", + "Bengali": "Бенгальский", + "Gurmukhi": "Гурмукхи", + "Gujarati": "Гуджарати", + "Oriya": "Ория", + "Tamil": "Тамильская письменность", + "Telugu": "Телугу", + "Kannada": "Каннада", + "Malayalam": "Малаялам", + "Sinhala": "Сингальская письменность", + "Thai": "Тайская письменность", + "Lao": "Лаосская письменность", + "Tibetan": "Тибетская письменность", + "Myanmar": "Бирманский", + "Georgian": "Грузинский", + "Hangul Jamo": "Хангыль чамо", + "Ethiopic": "Эфиопская слоговая письменность", + "Ethiopic Supplement": "Дополнительные символы эфиопской письменности", + "Cherokee": "Письменность чероки", + "Unified Canadian Aboriginal Syllabics": "Канадское слоговое письмо", + "Ogham": "Огамическое письмо", + "Runic": "Руническая письменность", + "Tagalog": "Тагальская письменность. Байбайин", + "Hanunoo": "Хануноо", + "Buhid": "Бухид", + "Tagbanwa": "Тагбанва", + "Khmer": "Кхмерская письменность", + "Mongolian": "Старомонгольская письменность", + "Unified Canadian Aboriginal Syllabics Extended": "Расширенный набор символов канадского слогового письма", + "Limbu": "Письменность лимбу", + "Tai Le": "Письменность тай лы", + "New Tai Lue": "Новый алфавит тай лы", + "Khmer Symbols": "Кхмерские символы", + "Buginese": "Бугийская письменность. Лонтара", + "Tai Tham": "Тай Тхам", + "Combining Diacritical Marks Extended": "Комбинируемые диакритические знаки (расширение)", + "Balinese": "Балийское письмо", + "Sundanese": "Сунданское письмо", + "Batak": "Батакское письмо", + "Lepcha": "Письмо лепча", + "Ol Chiki": "Письменность Ол-чики", + "Cyrillic Extended C": "Расширенная кириллица C", + "Sundanese Supplement": "Сунданское расширенное письмо", + "Vedic Extensions": "Ведические символы", + "Phonetic Extensions": "Фонетические расширения", + "Phonetic Extensions Supplement": "Дополнительные фонетические расширения", + "Combining Diacritical Marks Supplement": "Дополнительные комбинируемые диакритические знаки", + "Latin Extended Additional": "Дополнительная расширенная латиница", + "Greek Extended": "Расширенный набор символов греческого алфавита", + "General Punctuation": "Знаки пунктуации", + "Superscripts and Subscripts": "Надстрочные и подстрочные знаки", + "Currency Symbols": "Символы валют", + "Combining Diacritical Marks for Symbols": "Комбинируемые диакритические знаки для символов", + "Letterlike Symbols": "Буквоподобные символы", + "Number Forms": "Числовые формы", + "Arrows": "Стрелки", + "Mathematical Operators": "Математические операторы", + "Miscellaneous Technical": "Разнообразные технические символы", + "Control Pictures": "Значки управляющих кодов", + "Optical Character Recognition": "Символы оптического распознавания", + "Enclosed Alphanumerics": "Вложенные буквы и цифры", + "Box Drawing": "Символы для рисования рамок", + "Block Elements": "Символы заполнения", + "Geometric Shapes": "Геометрические фигуры", + "Miscellaneous Symbols": "Разнообразные символы", + "Dingbats": "Дингбаты", + "Miscellaneous Mathematical Symbols A": "Разнообразные математические символы-A", + "Supplemental Arrows A": "Дополнительные стрелки-A", + "Braille Patterns": "Азбука Брайля", + "Supplemental Arrows B": "Дополнительные стрелки-B", + "Miscellaneous Mathematical Symbols B": "Разнообразные математические символы-B", + "Supplemental Mathematical Operators": "Дополнительные математические операторы", + "Miscellaneous Symbols and Arrows": "Разнообразные символы и стрелки", + "Glagolitic": "Глаголица", + "Latin Extended C": "Расширенная латиница C", + "Coptic": "Коптский алфавит", + "Georgian Supplement": "Дополнительные символы грузинского алфавита", + "Tifinagh": "Тифинаг (Древнеливийское письмо)", + "Ethiopic Extended": "Расширенный набор символов эфиопского письма", + "Cyrillic Extended A": "Расширенная кириллица A", + "Supplemental Punctuation": "Дополнительные знаки пунктуации", + "CJK Radicals Supplement": "Дополнительные иероглифические ключи ККЯ", + "Kangxi Radicals": "Иероглифические ключи словаря Канси", + "Ideographic Description Characters": "Символы описания иероглифов", + "CJK Symbols and Punctuation": "Символы и пунктуация ККЯ", + "Hiragana": "Хирагана", + "Katakana": "Катакана", + "Bopomofo": "Чжуинь. Бопомофо", + "Hangul Compatibility Jamo": "Комбинируемые чамо Хангыля", + "Kanbun": "Канбун(китайский)", + "Bopomofo Extended": "Расширенный набор символов бопомофо, чжуинь", + "CJK Strokes": "Черты ККЯ", + "Katakana Phonetic Extensions": "Фонетические расширения катаканы", + "Enclosed CJK Letters and Months": "Вложенные буквы и месяцы ККЯ", + "CJK Compatibility": "Знаки совместимости ККЯ", + "CJK Unified Ideographs Extension": "Унифицированные иероглифы ККЯ. Расширение А", + "Yijing Hexagram Symbols": "Гексаграммы И-Цзин", + "CJK Unified Ideographs": "Унифицированные иероглифы ККЯ", + "Yi Syllables": "Слоги. Письмо И", + "Yi Radicals": "Радикалы. Письмо И", + "Lisu": "Лису", + "Vai": "Слоговая письменность ваи", + "Cyrillic Extended B": "Расширенная кириллица-B", + "Bamum": "Письмо бамум", + "Modifier Tone Letters": "Символы изменения тона", + "Latin Extended D": "Расширенная латиница-D", + "Syloti Nagri": "Силоти нагри", + "Common Indic Number Forms": "Индийские числовые символы", + "Phags pa": "Квадратное письмо Пагба-ламы", + "Saurashtra": "Саураштра", + "Devanagari Extended": "Расширенный набор символов деванагари", + "Kayah Li": "Кайях Ли", + "Rejang": "Реджанг", + "Hangul Jamo Extended A": "Хангыль", + "Javanese": "Яванская письменность", + "Myanmar Extended B": "Расширенный бирманский-B", + "Cham": "Чамское письмо", + "Myanmar Extended A": "Мьянманская письменность. Расширение A", + "Tai Viet": "Письменность Тай Вьет", + "Meetei Mayek Extensions": "Мейтей расширенная", + "Ethiopic Extended A": "Набор расширенных символов эфиопского письма-А", + "Latin Extended E": "Расширенная латиница-E", + "Cherokee Supplement": "Письменность чероки (дополнение)", + "Meetei Mayek": "Мейтей (Манипури)", + "Hangul Syllables": "Слоги Хангыля", + "Hangul Jamo Extended B": "Расширенные хангыль чамо B", + "High Surrogates": "Верхняя часть суррогатных пар", + "High Private Use Surrogates": "Верхняя часть суррогатных пар для частного использования", + "Low Surrogates": "Нижняя часть суррогатных пар", + "Private Use Area": "Область для частного использования", + "CJK Compatibility Ideographs": "Совместимые иероглифы ККЯ", + "Alphabetic Presentation Forms": "Алфавитные формы представления", + "Arabic Presentation Forms A": "Формы представления арабских букв-A", + "Variation Selectors": "Селекторы вариантов начертания", + "Vertical Forms": "Вертикальные формы", + "Combining Half Marks": "Комбинируемые половинки символов", + "CJK Compatibility Forms": "Формы совместимости ККЯ", + "Small Form Variants": "Варианты малого размера", + "Arabic Presentation Forms B": "Формы представления арабских букв-B", + "Halfwidth and Fullwidth Forms": "Полуширинные и полноширинные формы", + "Specials": "Специальные символы", + "Linear B Syllabary": "Слоги линейного письма Б", + "Linear B Ideograms": "Идеограммы линейного письма Б", + "Aegean Numbers": "Эгейские цифры", + "Ancient Greek Numbers": "Древнегреческие единицы измерения", + "Ancient Symbols": "Древние символы", + "Phaistos Disc": "Символы фестского диска", + "Lycian": "Ликийский алфавит", + "Carian": "Алфавит карийского языка", + "Coptic Epact Numbers": "Коптские числа епакты", + "Old Italic": "Этрусский (староитальянский) алфавит", + "Gothic": "Готский алфавит", + "Old Permic": "Древнепермское письмо", + "Ugaritic": "Угаритский алфавит", + "Old Persian": "Древнеперсидский клинописный алфавит", + "Deseret": "Дезеретский алфавит", + "Shavian": "Алфавит Бернарда Шоу", + "Osmanya": "Османья (сомалийский алфавит)", + "Osage": "Оседж", + "Elbasan": "Эльбасанское письмо", + "Caucasian Albanian": "Агванское письмо (Кавказская Албания)", + "Linear A": "Линейное письмо А", + "Cypriot Syllabary": "Слоговая письменность острова Кипр", + "Imperial Aramaic": "Имперское арамейское письмо", + "Palmyrene": "Пальмирский алфавит", + "Nabataean": "Набатейское письмо", + "Hatran": "Хатран", + "Phoenician": "Финикийское письмо", + "Lydian": "Лидийский алфавит", + "Meroitic Hieroglyphs": "Лидийский алфавит", + "Meroitic Cursive": "Курсивное мероитское письмо", + "Kharoshthi": "Кхароштхи", + "Old South Arabian": "Старый южноаравийский алфавит", + "Old North Arabian": "Старый североаравийский алфавит", + "Manichaean": "Манихейское письмо", + "Avestan": "Авестийский алфавит", + "Inscriptional Parthian": "Пехлевийское письмо для парфянского языка", + "Inscriptional Pahlavi": "Эпиграфическое пехлевийское письмо", + "Psalter Pahlavi": "Псалтырь пехлеви", + "Old Turkic": "Древнетюркское руническое письмо", + "Old Hungarian": "Венгерские руны", + "Rumi Numeral Symbols": "Цифры системы руми", + "Brahmi": "Брахмическая письменность", + "Kaithi": "Кайтхи", + "Sora Sompeng": "Соранг сомпенг", + "Chakma": "Чакма", + "Mahajani": "Махаяни", + "Sharada": "Шарада", + "Sinhala Archaic Numbers": "Сингальские архаические цифры", + "Khojki": "Кходжики", + "Multani": "Мултани", + "Khudawadi": "Кхудабади", + "Grantha": "Грантха", + "Newa": "Нева", + "Tirhuta": "Тирхута", + "Siddham": "Сиддхаматрика", + "Modi": "Моди", + "Mongolian Supplement": "Монгольский (дополнение)", + "Takri": "Такри", + "Ahom": "Письмо ахом", + "Warang Citi": "Варанг-кшити", + "Pau Cin Hau": "Пау Цин Хау", + "Bhaiksuki": "Байсаки", + "Marchen": "Марчен", + "Cuneiform": "Клинопись", + "Cuneiform Numbers and Punctuation": "Клинописные цифры и знаки препинания", + "Early Dynastic Cuneiform": "Ранняя династическая клинопись", + "Egyptian Hieroglyphs": "Египетские иероглифы", + "Anatolian Hieroglyphs": "Анатолийские иероглифы", + "Bamum Supplement": "Письмо бамум (дополнение)", + "Mro": "Мру", + "Bassa Vah": "Письмо басса", + "Pahawh Hmong": "Пахау хмонг", + "Miao": "Письмо Полларда (миао)", + "Ideographic Symbols and Punctuation": "Идеографические символы и знаки препинания", + "Tangut": "Тангутское письмо", + "Tangut Components": "Компоненты тангутского письма", + "Kana Supplement": "Кана (дополнение)", + "Duployan": "Дюплойе", + "Shorthand Format Controls": "Форматирующие символы стенографии", + "Byzantine Musical Symbols": "Византийские музыкальные символы", + "Musical Symbols": "Музыкальные символы", + "Ancient Greek Musical Notation": "Древнегреческие музыкальные символы", + "Tai Xuan Jing Symbols": "Символы Тай Сюань Цзин", + "Counting Rod Numerals": "Счётные палочки", + "Mathematical Alphanumeric Symbols": "Математические буквенно-цифровые символы", + "Sutton SignWriting": "Жестовая письменность Саттон", + "Glagolitic Supplement": "Глаголица (расширение)", + "Mende Kikakui": "Письмо кикакуи для языка менде", + "Adlam": "Адлам", + "Arabic Mathematical Alphabetic Symbols": "Арабские математические буквенно-цифровые символы", + "Mahjong Tiles": "Кости для маджонга", + "Domino Tiles": "Кости для домино", + "Playing Cards": "Игральные карты", + "Enclosed Alphanumeric Supplement": "Вложенные буквенно-цифровые символы (дополнение)", + "Enclosed Ideographic Supplement": "Вложенные идеографические символы (дополнение)", + "Miscellaneous Symbols and Pictographs": "Различные символы и пиктограммы", + "Emoticons": "Эмотикон (эмоджи)", + "Ornamental Dingbats": "Элементы орнамента", + "Transport and Map Symbols": "Транспортные и картографические символы", + "Alchemical Symbols": "Алхимические символы", + "Geometric Shapes Extended": "Геометрические фигуры (расширение)", + "Supplemental Arrows C": "Дополнительные стрелки-С", + "Supplemental Symbols and Pictographs": "Символы и пиктограммы (дополнение)", + "CJK Unified Ideographs Extension B": "Унифицированные иероглифы ККЯ. Расширение B", + "CJK Unified Ideographs Extension C": "Унифицированные иероглифы ККЯ. Расширение C", + "CJK Unified Ideographs Extension D": "Унифицированные иероглифы ККЯ. Расширение D", + "CJK Unified Ideographs Extension E": "Унифицированные иероглифы ККЯ. Расширение E", + "CJK Compatibility Ideographs Supplement": "Унифицированные иероглифы ККЯ (дополнение)", + "Tags": "Теги", + "Variation Selectors Supplement": "Селекторы вариантов начертания (дополнение)", + "Supplementary Private Use Area A": "Дополнительная область для частного использования — A", + "Supplementary Private Use Area B": "Дополнительная область для частного использования — B" +} \ No newline at end of file diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 00eb7fa76..34bae5604 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2479,6 +2479,7 @@ define([ var me = this, win = new Common.Views.SymbolTableDialog({ api: me.api, + lang: me.mode.lang, // modal: false, // type: 1, // buttons: [{value: 'ok', caption: this.textInsert}, 'close'], diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index a488c637e..eb1cf3cef 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -299,6 +299,11 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textFont": "Font", + "Common.Views.SymbolTableDialog.textRange": "Range", + "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", + "Common.Views.SymbolTableDialog.textCode": "Unicode HEX value", "DE.Controllers.LeftMenu.leavePageText": "All unsaved changes in this document will be lost.
Click \"Cancel\" then \"Save\" to save them. Click \"OK\" to discard all the unsaved changes.", "DE.Controllers.LeftMenu.newDocumentTitle": "Unnamed document", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Warning", @@ -2238,6 +2243,8 @@ "DE.Views.Toolbar.txtScheme7": "Equity", "DE.Views.Toolbar.txtScheme8": "Flow", "DE.Views.Toolbar.txtScheme9": "Foundry", + "DE.Views.Toolbar.capBtnInsSymbol": "Symbol", + "DE.Views.Toolbar.tipInsertSymbol": "Insert symbol", "DE.Views.WatermarkSettingsDialog.textAuto": "Auto", "DE.Views.WatermarkSettingsDialog.textBold": "Bold", "DE.Views.WatermarkSettingsDialog.textColor": "Text color", diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index e2ab5772e..919cfa650 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -299,6 +299,11 @@ "Common.Views.SignSettingsDialog.textShowDate": "Показывать дату подписи в строке подписи", "Common.Views.SignSettingsDialog.textTitle": "Настройка подписи", "Common.Views.SignSettingsDialog.txtEmpty": "Это поле необходимо заполнить", + "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textFont": "Шрифт", + "Common.Views.SymbolTableDialog.textRange": "Набор", + "Common.Views.SymbolTableDialog.textRecent": "Ранее использовавшиеся символы", + "Common.Views.SymbolTableDialog.textCode": "Код знака из Юникод (шестн.)", "DE.Controllers.LeftMenu.leavePageText": "Все несохраненные изменения в этом документе будут потеряны.
Нажмите кнопку \"Отмена\", а затем нажмите кнопку \"Сохранить\", чтобы сохранить их. Нажмите кнопку \"OK\", чтобы сбросить все несохраненные изменения.", "DE.Controllers.LeftMenu.newDocumentTitle": "Документ без имени", "DE.Controllers.LeftMenu.notcriticalErrorTitle": "Внимание", From eb19033e23a68727ddeae97cf2f56dd79d670944 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Nov 2019 14:57:26 +0300 Subject: [PATCH 06/18] Add icon for symbol table --- .../resources/img/controls/toolbarbig.png | Bin 18165 -> 24513 bytes .../resources/img/controls/toolbarbig@2x.png | Bin 39819 -> 53929 bytes apps/common/main/resources/less/toolbar.less | 1 + apps/documenteditor/main/app/view/Toolbar.js | 2 +- 4 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/common/main/resources/img/controls/toolbarbig.png b/apps/common/main/resources/img/controls/toolbarbig.png index 29c5eb05a9366d243e06b0c53b29d96647aea1f8..735a2dbae0e309c031255539f16ba21cdd72e615 100644 GIT binary patch literal 24513 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
    S=I*YvR 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 literal 18165 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 Y556M<2+OfyI{*Lx07*qoM6N<$g4?nvu>b%7 diff --git a/apps/common/main/resources/img/controls/toolbarbig@2x.png b/apps/common/main/resources/img/controls/toolbarbig@2x.png index f5127cb0f6ac5db87f312eaba723192d748dbc0a..a1b2b36efabc227bec3bae6fbbd38a3ece57d1e5 100644 GIT binary patch literal 53929 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 literal 39819 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 Pe+H^4YbljIFc0}Z+FWbp diff --git a/apps/common/main/resources/less/toolbar.less b/apps/common/main/resources/less/toolbar.less index cbab0599b..074fc78fc 100644 --- a/apps/common/main/resources/less/toolbar.less +++ b/apps/common/main/resources/less/toolbar.less @@ -533,6 +533,7 @@ .button-normal-icon(btn-caption, 76, @toolbar-big-icon-size); .button-normal-icon(btn-calculation, 80, @toolbar-big-icon-size); .button-normal-icon(btn-scale, 81, @toolbar-big-icon-size); +.button-normal-icon(btn-symbol, 84, @toolbar-big-icon-size); [applang=ru] { .btn-toolbar { diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index 8b850c99d..70ab3fc48 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -586,7 +586,7 @@ define([ this.btnInsertSymbol = new Common.UI.Button({ id: 'tlbtn-insertsymbol', cls: 'btn-toolbar x-huge icon-top', - iconCls: 'btn-insertequation', + iconCls: 'btn-symbol', caption: me.capBtnInsSymbol }); this.paragraphControls.push(this.btnInsertSymbol); From 5d74f76d4d2064d68514580031092247e6e5607d Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Nov 2019 15:01:59 +0300 Subject: [PATCH 07/18] Fix non-modal mode for symbol table dialog. Update translation --- .../common/main/lib/view/SymbolTableDialog.js | 41 +++++++++---------- .../main/app/controller/Toolbar.js | 11 +++-- apps/documenteditor/main/locale/en.json | 1 + 3 files changed, 25 insertions(+), 28 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 24b183c9f..181083aea 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -391,7 +391,7 @@ define([ '
    ', '
    ', '
    ', - '
    ', + '
    ', '
    ', '
    ', '
    ', @@ -401,7 +401,7 @@ define([ '', '', '', - '
    ', + '
    ', '', '', '', @@ -413,7 +413,7 @@ define([ '', '', '', - '
    ', + '
    ', '', '', '
    ', @@ -561,7 +561,9 @@ define([ } bMainFocus = true; me.updateView(); - me.previewPanel.focus(); + setTimeout(function(){ + me.previewPanel.focus(); + }, 1); }); this.cmbFonts.setValue(nCurrentFont); @@ -575,7 +577,9 @@ define([ nCurrentSymbol = oCurrentRange.Start; bMainFocus = true; me.updateView(undefined, undefined, undefined, undefined, false); - me.previewPanel.focus(); + setTimeout(function(){ + me.previewPanel.focus(); + }, 1); }); this.updateRangeSelector(); @@ -1149,32 +1153,28 @@ define([ var bFill = true; if(bMainFocus){ var nCode = -1; - if ( value === 37 ){//left + if ( value === Common.UI.Keys.LEFT ){//left nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - 1); } - else if ( value === 38 ){//top + else if ( value === Common.UI.Keys.UP ){//top nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - this.getColsCount()); } - else if ( value === 39 ){//right + else if ( value === Common.UI.Keys.RIGHT ){//right nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + 1); } - else if ( value === 40 ){//bottom + else if ( value === Common.UI.Keys.DOWN ){//bottom nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + this.getColsCount()); } - else if(value === 36){//home + else if(value === Common.UI.Keys.HOME){//home if(aRanges.length > 0){ nCode = aRanges[0].Start; } } - else if(value === 35){//end + else if(value === Common.UI.Keys.END){//end if(aRanges.length > 0){ nCode = aRanges[aRanges.length - 1].End; } } - else if(value === 13){//enter - this.checkRecent(nCurrentSymbol, aFontSelects[nCurrentFont].displayValue); - this.fireEvent('symbol:dblclick', this, {font: aFontSelects[nCurrentFont].displayValue, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); - } else{ bFill = false; } @@ -1186,7 +1186,7 @@ define([ } else{ var oSelectedCell, aStrings; - if ( value === 37 ){//left + if ( value === Common.UI.Keys.LEFT ){//left oSelectedCell = this.$window.find('.cell-selected')[0]; if(oSelectedCell && oSelectedCell.id[0] === 'r'){ var oPresCell = this.$window.find(oSelectedCell).prev(); @@ -1198,7 +1198,7 @@ define([ } } } - else if ( value === 39 ){//right + else if ( value === Common.UI.Keys.RIGHT ){//right oSelectedCell = this.$window.find('.cell-selected')[0]; if(oSelectedCell && oSelectedCell.id[0] === 'r'){ var oNextCell = this.$window.find(oSelectedCell).next(); @@ -1210,7 +1210,7 @@ define([ } } } - else if(value === 36){//home + else if(value === Common.UI.Keys.HOME){//home var oFirstCell = this.$window.find('#recent-table').children()[0]; if(oFirstCell){ aStrings = oFirstCell.id.split('_'); @@ -1219,7 +1219,7 @@ define([ this.updateView(false); } } - else if(value === 35){//end + else if(value === Common.UI.Keys.END){//end var aChildren = this.recentPanel.children(); var oLastCell = aChildren[aChildren.length - 1]; if(oLastCell){ @@ -1229,9 +1229,6 @@ define([ this.updateView(false); } } - else if(value === 13){//enter - this.fireEvent('symbol:dblclick', this, {font: aFontSelects[nFontNameRecent].displayValue, symbol: this.encodeSurrogateChar(nCurrentSymbol)}); - } else{ bFill = false; } diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 34bae5604..ed898d49c 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -2480,14 +2480,14 @@ define([ win = new Common.Views.SymbolTableDialog({ api: me.api, lang: me.mode.lang, - // modal: false, - // type: 1, - // buttons: [{value: 'ok', caption: this.textInsert}, 'close'], + modal: false, + type: 1, + buttons: [{value: 'ok', caption: this.textInsert}, 'close'], handler: function(dlg, result, settings) { if (result == 'ok') { me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); - } - Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } else + Common.NotificationCenter.trigger('edit:complete', me.toolbar); } }); win.show(); @@ -2495,7 +2495,6 @@ define([ me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); }); } - Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertSymbol); }, onApiMathTypes: function(equation) { diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index eb1cf3cef..65546eae4 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -996,6 +996,7 @@ "DE.Controllers.Toolbar.txtSymbol_vdots": "Vertical ellipsis", "DE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "DE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "DE.Controllers.Toolbar.textInsert": "Insert", "DE.Controllers.Viewport.textFitPage": "Fit to Page", "DE.Controllers.Viewport.textFitWidth": "Fit to Width", "DE.Views.AddNewCaptionLabelDialog.textLabel": "Label:", From 6bae248efb8be8a50b7b55ae29f17b3d2fc598a4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Tue, 12 Nov 2019 15:11:44 +0300 Subject: [PATCH 08/18] Update build script (add symbol table translation) --- build/documenteditor.json | 6 ++++++ build/presentationeditor.json | 6 ++++++ build/spreadsheeteditor.json | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/build/documenteditor.json b/build/documenteditor.json index 98abaf31c..954eb878c 100644 --- a/build/documenteditor.json +++ b/build/documenteditor.json @@ -151,6 +151,12 @@ "cwd": "../apps/documenteditor/main/resources/watermark", "src": "*", "dest": "../deploy/web-apps/apps/documenteditor/main/resources/watermark" + }, + { + "expand": true, + "cwd": "../apps/common/main/resources/symboltable", + "src": "*", + "dest": "../deploy/web-apps/apps/documenteditor/main/resources/symboltable" } ], "help": [ diff --git a/build/presentationeditor.json b/build/presentationeditor.json index 78f988361..8471938ef 100644 --- a/build/presentationeditor.json +++ b/build/presentationeditor.json @@ -145,6 +145,12 @@ "cwd": "../apps/presentationeditor/main/locale/", "src": "*", "dest": "../deploy/web-apps/apps/presentationeditor/main/locale/" + }, + { + "expand": true, + "cwd": "../apps/common/main/resources/symboltable", + "src": "*", + "dest": "../deploy/web-apps/apps/presentationeditor/main/resources/symboltable" } ], "help": [ diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json index ecb9798a9..9e05fc9b8 100644 --- a/build/spreadsheeteditor.json +++ b/build/spreadsheeteditor.json @@ -159,6 +159,12 @@ "cwd": "../apps/spreadsheeteditor/main/resources/formula-lang", "src": "*", "dest": "../deploy/web-apps/apps/spreadsheeteditor/main/resources/formula-lang" + }, + { + "expand": true, + "cwd": "../apps/common/main/resources/symboltable", + "src": "*", + "dest": "../deploy/web-apps/apps/spreadsheeteditor/main/resources/symboltable" } ], "help": [ From d01da7458f3cb9861cd8c698004a4526a4348aca Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Nov 2019 13:44:20 +0300 Subject: [PATCH 09/18] Fix resizing of symbol table dialog --- .../common/main/lib/view/SymbolTableDialog.js | 144 ++++++++++++------ .../main/resources/less/symboltable.less | 4 +- 2 files changed, 102 insertions(+), 46 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 181083aea..213d503fd 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -347,6 +347,10 @@ define([ var lastTime = -1; var lastKeyCode = -1; + var minScrollbarLength = 20; + var wheelSpeed = 20; + + var loadTranslation = function(lang, callback) { lang = lang.split(/[\-_]/)[0].toLocaleLowerCase(); Common.Utils.loadConfig('resources/symboltable/' + lang + '.json', function (langJson) { @@ -360,16 +364,31 @@ define([ Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ options: { + resizable : true, + minwidth : 450, + minheight : 394, width: 450, - height: 395, - style: 'min-width: 230px;', + height: 396, cls: 'modal-dlg', buttons: ['ok', 'cancel'] }, initialize : function(options) { + var filter = Common.localStorage.getKeysFilter(); + this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; + + var path = this.appPrefix + 'settings-size-symbol-table', + size = Common.Utils.InternalSettings.get(path); + if (size==null || size==undefined) { + size = Common.localStorage.getItem(path) || ''; + Common.Utils.InternalSettings.set(path, size); + } + size = size ? JSON.parse(size) : []; + _.extend(this.options, { - title: this.textTitle + title: this.textTitle, + width : size[0] || 450, + height : size[1] || 396 }, options || {}); this.template = [ @@ -387,7 +406,7 @@ define([ '', '', '', - '
    ', + '
    ', '
    ', '
    ', '
    ', @@ -401,7 +420,7 @@ define([ '', '', '', - '
    ', + '
    ', '', '', '', @@ -427,9 +446,6 @@ define([ this.api = this.options.api; this.type = this.options.type || 0; // 0 - close on OK, single adding symbol - var filter = Common.localStorage.getKeysFilter(); - this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : ''; - var init = (aFontSelects.length<1); init && this.initFonts(); @@ -465,6 +481,9 @@ define([ } Common.UI.Window.prototype.initialize.call(this, this.options); + + this.on('resizing', _.bind(this.onWindowResizing, this)); + this.on('resize', _.bind(this.onWindowResize, this)); }, initFonts: function() { @@ -535,6 +554,9 @@ define([ var me = this, $window = this.getChild(); + var $border = $window.find('.resize-border'); + $border.css({'background': 'none', 'border': 'none'}); + this.cmbFonts = new Common.UI.ComboBox({ el : $window.find('#symbol-table-cmb-fonts'), cls : 'input-group-nr', @@ -595,7 +617,7 @@ define([ if(!isNaN(value) && value > 0x1F){ var oRange = me.getRangeBySymbol(aRanges, value); if(oRange){ - var bUpdateTable = (me.$window.find("#c" + value).length === 0); + var bUpdateTable = ($window.find("#c" + value).length === 0); nCurrentSymbol = value; bMainFocus = true; me.updateView(bUpdateTable, undefined, false); @@ -608,18 +630,14 @@ define([ //fill recents this.fillRecentSymbols(); - var container = this.$window.find('#fake-symbol-table-wrap'); - container.perfectScrollbar({ - theme: 'custom-theme', - minScrollbarLength: 50 - }); - - this.previewPanel = this.$window.find('#id-preview-data'); + this.symbolTablePanel = $window.find('#symbol-table-scrollable-div'); + this.previewPanel = $window.find('#id-preview-data'); this.previewParent = this.previewPanel.parent(); - this.previewScrolled = this.$window.find('#id-preview'); + this.previewScrolled = $window.find('#id-preview'); this.previewInner = this.previewScrolled.find('div:first-child'); - this.recentPanel = this.$window.find('#symbol-table-recent'); - this.fontLabel = this.$window.find("#symbol-table-label-font"); + this.recentPanel = $window.find('#symbol-table-recent'); + this.fontLabel = $window.find("#symbol-table-label-font"); + this.boxPanel = $window.find('.box'); this.updateView(undefined, undefined, undefined, true); $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); @@ -809,7 +827,6 @@ define([ } } this.previewPanel.html(sInnerHtml); - // this.previewPanel[0].innerHTML = sInnerHtml; }, fillRecentSymbols: function(){ @@ -927,13 +944,12 @@ define([ }, getColsCount: function(){ - var nMaxWidth = this.$window.find('#symbol-table-scrollable-div').innerWidth(); + var nMaxWidth = this.boxPanel.innerWidth()-13; return ((nMaxWidth/CELL_WIDTH) >> 0); }, getMaxHeight: function(){ - var nMaxHeight = this.$window.find('#symbol-table-scrollable-div').innerHeight(); - return nMaxHeight; + return this.symbolTablePanel.innerHeight(); }, getRowsCount: function() { @@ -982,20 +998,9 @@ define([ } if(bMainFocus){ - if(aFontSelects[nCurrentFont]){ - this.fontLabel.text(aFontSelects[nCurrentFont].displayValue); - } - else{ - this.fontLabel.text(''); - } - } - else{ - if(aFontSelects[nFontNameRecent]){ - this.fontLabel.text(aFontSelects[nFontNameRecent].displayValue); - } - else{ - this.fontLabel.text(''); - } + this.fontLabel.text(aFontSelects[nCurrentFont] ? aFontSelects[nCurrentFont].displayValue : ''); + } else { + this.fontLabel.text(aFontSelects[nFontNameRecent] ? aFontSelects[nFontNameRecent].displayValue : ''); } if(bUpdateTable !== false){ @@ -1005,7 +1010,7 @@ define([ //main table var nRowsCount = this.getRowsCount(); - var nHeight = nRowsCount*CELL_HEIGHT - 1; + var nHeight = nRowsCount*CELL_HEIGHT; bScrollMouseUp = false; if(bUpdateTable !== false){ //fill table @@ -1017,13 +1022,17 @@ define([ var nFullHeight = nAllRowsCount*CELL_HEIGHT; this.previewInner.height(nFullHeight); + this.previewPanel.height(nHeight); + this.previewScrolled.height(nHeight); - if (!this.scrollerY) + if (!this.scrollerY) { + minScrollbarLength = Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)); + wheelSpeed = Math.min((Math.floor(this.previewPanel.height()/CELL_HEIGHT) * CELL_HEIGHT)/10, 20); this.scrollerY = new Common.UI.Scroller({ el: this.previewScrolled, - minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)), + minScrollbarLength: minScrollbarLength, alwaysVisibleY: true, - wheelSpeed: Math.min((Math.floor(this.previewPanel.height()/CELL_HEIGHT) * CELL_HEIGHT)/10, 20), + wheelSpeed: wheelSpeed, useKeyboard: false, onChange: _.bind(function(){ if (this.scrollerY) { @@ -1035,9 +1044,11 @@ define([ } }, this) }); + } if (!this._preventUpdateScroll) { this.scrollerY.update({ - minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)) + minScrollbarLength: minScrollbarLength, + wheelSpeed: wheelSpeed }); this.scrollerY.scrollTop(nRowSkip*CELL_HEIGHT); } @@ -1058,8 +1069,7 @@ define([ //select current cell if(bMainFocus){ this.$window.find('#c' + nCurrentSymbol).addClass('cell-selected'); - } - else{ + } else { this.$window.find('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected'); } @@ -1264,6 +1274,52 @@ define([ e.preventDefault && e.preventDefault(); }, + onWindowResize: function (args) { + var size = this.getSize(); + if (args && args[1]=='start') { + this._preventUpdateScroll = true; + this.curSize = {resize: false, width: size[0], height: size[1]}; + } else if (this.curSize.resize) { + this._preventUpdateScroll = false; + this.curSize.height = size[1] - 264; + var rows = Math.max(1, ((this.curSize.height/CELL_HEIGHT) >> 0)), + height = rows*CELL_HEIGHT; + + this.symbolTablePanel.css({'height': this.curSize.height + 'px'}); + this.previewPanel.css({'height': height + 'px'}); + this.previewScrolled.css({'height': height + 'px'}); + this.scrollerY = null; + + this.updateView(undefined, undefined, undefined, true); + + var valJson = JSON.stringify(size); + Common.localStorage.setItem(this.appPrefix + 'settings-size-symbol-table', valJson); + Common.Utils.InternalSettings.set(this.appPrefix + 'settings-size-symbol-table', valJson); + } + }, + + onWindowResizing: function () { + if (!this.curSize) return; + + var size = this.getSize(); + if (size[0] !== this.curSize.width || size[1] !== this.curSize.height) { + if (!this.curSize.resize) + this.curSize.resize = true; + + this.curSize.width = size[0]; + this.curSize.height = size[1] - 264; + + var rows = Math.max(1, ((this.curSize.height/CELL_HEIGHT) >> 0)), + height = rows*CELL_HEIGHT; + + this.symbolTablePanel.css({'height': this.curSize.height + 'px'}); + this.previewPanel.css({'height': height + 'px'}); + this.previewScrolled.css({'height': height + 'px'}); + + this.updateView(undefined, undefined, undefined, true); + } + }, + textTitle: 'Symbol Table', textFont: 'Font', textRange: 'Range', diff --git a/apps/common/main/resources/less/symboltable.less b/apps/common/main/resources/less/symboltable.less index 70bdfc5d1..6b064a595 100644 --- a/apps/common/main/resources/less/symboltable.less +++ b/apps/common/main/resources/less/symboltable.less @@ -39,7 +39,7 @@ #symbol-table-scrollable-div { #id-preview { width: 100%; - height: 132px !important; + height: 132px; position:relative; overflow:hidden; border: @gray-soft solid 1px; @@ -47,7 +47,7 @@ #id-preview-data { width: 100%; - height: 134px !important; + height: 132px; position:relative; overflow:hidden; } From 56042f4c89cdf4fddb37dfadec505b75f6aa190a Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Nov 2019 14:47:32 +0300 Subject: [PATCH 10/18] [SSE] Fix appearance of comment popover in view mode --- apps/common/main/lib/controller/Comments.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/controller/Comments.js b/apps/common/main/lib/controller/Comments.js index b8f30b6c4..7d541f276 100644 --- a/apps/common/main/lib/controller/Comments.js +++ b/apps/common/main/lib/controller/Comments.js @@ -821,6 +821,7 @@ define([ } }, onApiShowComment: function (uids, posX, posY, leftX, opts, hint) { + var apihint = hint; var same_uids = (0 === _.difference(this.uids, uids).length) && (0 === _.difference(uids, this.uids).length); if (hint && this.isSelectedComment && same_uids && !this.isModeChanged) { @@ -886,7 +887,7 @@ define([ this.animate = false; } - this.isSelectedComment = !hint || !this.hintmode; + this.isSelectedComment = !apihint || !this.hintmode; this.uids = _.clone(uids); comments.push(comment); From 690746b7f40bfdef554520dc08b1ba87a1dbdd0f Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Wed, 13 Nov 2019 16:09:47 +0300 Subject: [PATCH 11/18] Fix symbol table layout --- .../common/main/lib/view/SymbolTableDialog.js | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 213d503fd..85d54508a 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -365,9 +365,9 @@ define([ Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({ options: { resizable : true, - minwidth : 450, + minwidth : 448, minheight : 394, - width: 450, + width: 448, height: 396, cls: 'modal-dlg', buttons: ['ok', 'cancel'] @@ -387,25 +387,27 @@ define([ _.extend(this.options, { title: this.textTitle, - width : size[0] || 450, + width : size[0] || 448, height : size[1] || 396 }, options || {}); this.template = [ '
    ', - '', + '
    ', '', - '', - '', '', + '
    ', + '', '', '
    ', '
    ', + '', '', '
    ', '
    ', + '', '', - '', '', '', - '', '', + '
    ', + '', '
    ', '
    ', '
    ', @@ -418,23 +420,25 @@ define([ '
    ', + '', '', '
    ', '
    ', + '', '', - '', - '', '', '', - '', - '', '', From d682c626078e6f769f48f51e1e77ce44e6465f8d Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 10:51:53 +0300 Subject: [PATCH 12/18] [Common] Fix window resize --- apps/common/main/lib/component/Window.js | 45 ++++++++++++++---------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/apps/common/main/lib/component/Window.js b/apps/common/main/lib/component/Window.js index 606e98736..e90270a40 100644 --- a/apps/common/main/lib/component/Window.js +++ b/apps/common/main/lib/component/Window.js @@ -348,20 +348,11 @@ define([ maxwidth = (this.initConfig.maxwidth) ? this.initConfig.maxwidth : main_width, maxheight = (this.initConfig.maxheight) ? this.initConfig.maxheight : main_height; - if (this.resizing.type[0]>0) { - this.resizing.maxx = Math.min(main_width, left+maxwidth); - this.resizing.minx = left+this.initConfig.minwidth; - } else if (this.resizing.type[0]<0) { - this.resizing.maxx = left+this.resizing.initw-this.initConfig.minwidth; - this.resizing.minx = Math.max(0, left+this.resizing.initw-maxwidth); - } - if (this.resizing.type[1]>0) { - this.resizing.maxy = Math.min(main_height, top+maxheight); - this.resizing.miny = top+this.initConfig.minheight; - } else if (this.resizing.type[1]<0) { - this.resizing.maxy = top+this.resizing.inith-this.initConfig.minheight; - this.resizing.miny = Math.max(0, top+this.resizing.inith-maxheight); - } + this.resizing.minw = this.initConfig.minwidth; + this.resizing.maxw = (this.resizing.type[0]>0) ? Math.min(main_width-left, maxwidth) : Math.min(left+this.resizing.initw, maxwidth); + + this.resizing.minh = this.initConfig.minheight; + this.resizing.maxh = (this.resizing.type[1]>0) ? Math.min(main_height-top, maxheight) : Math.min(top+this.resizing.inith, maxheight); $(document.body).css('cursor', el.css('cursor')); this.$window.find('.resize-border').addClass('resizing'); @@ -378,16 +369,34 @@ define([ zoom = (event instanceof jQuery.Event) ? Common.Utils.zoom() : 1, pageX = event.pageX*zoom, pageY = event.pageY*zoom; - if (this.resizing.type[0] && pageXthis.resizing.minx) { + if (this.resizing.type[0]) { + var new_width = this.resizing.initw + (pageX - this.resizing.initpage_x) * this.resizing.type[0]; + if (new_width>this.resizing.maxw) { + pageX = pageX - (new_width-this.resizing.maxw) * this.resizing.type[0]; + new_width = this.resizing.maxw; + } else if (new_widththis.resizing.miny) { + if (this.resizing.type[1]) { + var new_height = this.resizing.inith + (pageY - this.resizing.initpage_y) * this.resizing.type[1]; + if (new_height>this.resizing.maxh) { + pageY = pageY - (new_height-this.resizing.maxh) * this.resizing.type[1]; + new_height = this.resizing.maxh; + } else if (new_height Date: Thu, 14 Nov 2019 10:52:54 +0300 Subject: [PATCH 13/18] Fix symbol table dialog --- apps/common/main/lib/view/SymbolTableDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index 85d54508a..e8eea6645 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -366,7 +366,7 @@ define([ options: { resizable : true, minwidth : 448, - minheight : 394, + minheight : 396, width: 448, height: 396, cls: 'modal-dlg', From bdbde4cde68f3189d3b8b04a2fecd196a513d03c Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 11:48:58 +0300 Subject: [PATCH 14/18] [PE][SSE] Add symbol from symbol table --- .../main/app/controller/Toolbar.js | 27 ++++++++++++++++++- .../main/app/template/Toolbar.template | 1 + .../main/app/view/Toolbar.js | 17 ++++++++++-- apps/presentationeditor/main/locale/en.json | 5 +++- .../main/resources/less/app.less | 1 + .../main/app/controller/Toolbar.js | 27 ++++++++++++++++++- .../main/app/template/Toolbar.template | 1 + .../main/app/view/Toolbar.js | 16 +++++++++-- apps/spreadsheeteditor/main/locale/en.json | 3 +++ .../main/resources/less/app.less | 1 + 10 files changed, 92 insertions(+), 7 deletions(-) diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 54e414d37..64d75d653 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -49,6 +49,7 @@ define([ 'common/main/lib/view/InsertTableDialog', 'common/main/lib/view/SelectFileDlg', 'common/main/lib/view/ListSettingsDialog', + 'common/main/lib/view/SymbolTableDialog', 'common/main/lib/util/define', 'presentationeditor/main/app/collection/SlideThemes', 'presentationeditor/main/app/view/Toolbar', @@ -310,6 +311,7 @@ define([ toolbar.btnSlideSize.menu.on('item:click', _.bind(this.onSlideSize, this)); toolbar.listTheme.on('click', _.bind(this.onListThemeSelect, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); + toolbar.btnInsertSymbol.on('click', _.bind(this.onInsertSymbolClick, this)); toolbar.btnEditHeader.on('click', _.bind(this.onEditHeaderClick, this, 'header')); toolbar.btnInsDateTime.on('click', _.bind(this.onEditHeaderClick, this, 'datetime')); toolbar.btnInsSlideNum.on('click', _.bind(this.onEditHeaderClick, this, 'slidenum')); @@ -1825,6 +1827,28 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertEquation); }, + onInsertSymbolClick: function() { + if (this.api) { + var me = this, + win = new Common.Views.SymbolTableDialog({ + api: me.api, + lang: me.toolbar.mode.lang, + type: 1, + buttons: [{value: 'ok', caption: this.textInsert}, 'close'], + handler: function(dlg, result, settings) { + if (result == 'ok') { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + } else + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + win.show(); + win.on('symbol:dblclick', function(cmp, settings) { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + }); + } + }, + onApiMathTypes: function(equation) { this._equationTemp = equation; var me = this; @@ -2528,7 +2552,8 @@ define([ txtMatrix_2_2_LineBracket : 'Empty Matrix with Brackets', txtMatrix_2_2_DLineBracket : 'Empty Matrix with Brackets', txtMatrix_Flat_Round : 'Sparse Matrix', - txtMatrix_Flat_Square : 'Sparse Matrix' + txtMatrix_Flat_Square : 'Sparse Matrix', + textInsert: 'Insert' }, PE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/template/Toolbar.template b/apps/presentationeditor/main/app/template/Toolbar.template index 0b8287bc6..4d5e1c3d2 100644 --- a/apps/presentationeditor/main/app/template/Toolbar.template +++ b/apps/presentationeditor/main/app/template/Toolbar.template @@ -129,6 +129,7 @@
    +
    diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 13f52082c..a5cb95d6b 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -543,6 +543,15 @@ define([ }); me.slideOnlyControls.push(this.btnInsertEquation); + me.btnInsertSymbol = new Common.UI.Button({ + id: 'tlbtn-insertsymbol', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-symbol', + caption: me.capBtnInsSymbol, + lock: [_set.slideDeleted, _set.paragraphLock, _set.lostConnect, _set.noSlides, _set.noParagraphSelected] + }); + me.paragraphControls.push(me.btnInsertSymbol); + me.btnInsertHyperlink = new Common.UI.Button({ id: 'tlbtn-insertlink', cls: 'btn-toolbar x-huge icon-top', @@ -815,7 +824,7 @@ define([ this.btnSubscript, this.btnFontColor, this.btnClearStyle, this.btnCopyStyle, this.btnMarkers, this.btnNumbers, this.btnDecLeftOffset, this.btnIncLeftOffset, this.btnLineSpace, this.btnHorizontalAlign, this.btnVerticalAlign, this.btnShapeArrange, this.btnShapeAlign, this.btnInsertTable, this.btnInsertChart, - this.btnInsertEquation, this.btnInsertHyperlink, this.btnColorSchemas, this.btnSlideSize, this.listTheme, this.mnuShowSettings + this.btnInsertEquation, this.btnInsertSymbol, this.btnInsertHyperlink, this.btnColorSchemas, this.btnSlideSize, this.listTheme, this.mnuShowSettings ]; // Disable all components before load document @@ -933,6 +942,7 @@ define([ _injectComponent('#slot-btn-arrange-shape', this.btnShapeArrange); _injectComponent('#slot-btn-align-shape', this.btnShapeAlign); _injectComponent('#slot-btn-insertequation', this.btnInsertEquation); + _injectComponent('#slot-btn-inssymbol', this.btnInsertSymbol); _injectComponent('#slot-btn-insertlink', this.btnInsertHyperlink); _injectComponent('#slot-btn-inserttable', this.btnInsertTable); _injectComponent('#slot-btn-insertchart', this.btnInsertChart); @@ -1044,6 +1054,7 @@ define([ this.btnInsertTable.updateHint(this.tipInsertTable); this.btnInsertChart.updateHint(this.tipInsertChart); this.btnInsertEquation.updateHint(this.tipInsertEquation); + this.btnInsertSymbol.updateHint(this.tipInsertSymbol); this.btnInsertHyperlink.updateHint(this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); this.btnInsertTextArt.updateHint(this.tipInsertTextArt); this.btnColorSchemas.updateHint(this.tipColorSchemas); @@ -1676,7 +1687,9 @@ define([ capBtnInsHeader: 'Header/Footer', capBtnSlideNum: 'Slide Number', capBtnDateTime: 'Date & Time', - textListSettings: 'List Settings' + textListSettings: 'List Settings', + capBtnInsSymbol: 'Symbol', + tipInsertSymbol: 'Insert symbol' } }()), PE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index e1c99e63b..dd431ece4 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -908,6 +908,7 @@ "PE.Controllers.Toolbar.txtSymbol_vdots": "Vertical ellipsis", "PE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "PE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "PE.Controllers.Toolbar.textInsert": "Insert", "PE.Controllers.Viewport.textFitPage": "Fit to Slide", "PE.Controllers.Viewport.textFitWidth": "Fit to Width", "PE.Views.ChartSettings.textAdvanced": "Show advanced settings", @@ -1798,5 +1799,7 @@ "PE.Views.Toolbar.txtScheme8": "Flow", "PE.Views.Toolbar.txtScheme9": "Foundry", "PE.Views.Toolbar.txtSlideAlign": "Align to Slide", - "PE.Views.Toolbar.txtUngroup": "Ungroup" + "PE.Views.Toolbar.txtUngroup": "Ungroup", + "PE.Views.Toolbar.capBtnInsSymbol": "Symbol", + "PE.Views.Toolbar.tipInsertSymbol": "Insert symbol" } \ No newline at end of file diff --git a/apps/presentationeditor/main/resources/less/app.less b/apps/presentationeditor/main/resources/less/app.less index 0e0890b76..9f99ba211 100644 --- a/apps/presentationeditor/main/resources/less/app.less +++ b/apps/presentationeditor/main/resources/less/app.less @@ -114,6 +114,7 @@ @import "../../../../common/main/resources/less/toolbar.less"; @import "../../../../common/main/resources/less/language-dialog.less"; @import "../../../../common/main/resources/less/winxp_fix.less"; +@import "../../../../common/main/resources/less/symboltable.less"; // App // -------------------------------------------------- diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index f37309543..1c6b65022 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -44,6 +44,7 @@ define([ 'common/main/lib/view/CopyWarningDialog', 'common/main/lib/view/ImageFromUrlDialog', 'common/main/lib/view/SelectFileDlg', + 'common/main/lib/view/SymbolTableDialog', 'common/main/lib/util/define', 'spreadsheeteditor/main/app/view/Toolbar', 'spreadsheeteditor/main/app/collection/TableTemplates', @@ -323,6 +324,7 @@ define([ toolbar.btnInsertText.on('click', _.bind(this.onBtnInsertTextClick, this)); toolbar.btnInsertShape.menu.on('hide:after', _.bind(this.onInsertShapeHide, this)); toolbar.btnInsertEquation.on('click', _.bind(this.onInsertEquationClick, this)); + toolbar.btnInsertSymbol.on('click', _.bind(this.onInsertSymbolClick, this)); toolbar.btnTableTemplate.menu.on('show:after', _.bind(this.onTableTplMenuOpen, this)); toolbar.btnPercentStyle.on('click', _.bind(this.onNumberFormat, this)); toolbar.btnCurrencyStyle.on('click', _.bind(this.onNumberFormat, this)); @@ -2763,6 +2765,28 @@ define([ Common.NotificationCenter.trigger('edit:complete', this.toolbar, this.toolbar.btnInsertEquation); }, + onInsertSymbolClick: function() { + if (this.api) { + var me = this, + win = new Common.Views.SymbolTableDialog({ + api: me.api, + lang: me.toolbar.mode.lang, + type: 1, + buttons: [{value: 'ok', caption: this.textInsert}, 'close'], + handler: function(dlg, result, settings) { + if (result == 'ok') { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + } else + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + win.show(); + win.on('symbol:dblclick', function(cmp, settings) { + me.api.pluginMethod_PasteHtml("" + settings.symbol + ""); + }); + } + }, + onApiMathTypes: function(equation) { this._equationTemp = equation; var me = this; @@ -3811,7 +3835,8 @@ define([ textPivot: 'Pivot Table', txtTable_TableStyleMedium: 'Table Style Medium', txtTable_TableStyleDark: 'Table Style Dark', - txtTable_TableStyleLight: 'Table Style Light' + txtTable_TableStyleLight: 'Table Style Light', + textInsert: 'Insert' }, SSE.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/template/Toolbar.template b/apps/spreadsheeteditor/main/app/template/Toolbar.template index 9d812e6b3..b1f14757a 100644 --- a/apps/spreadsheeteditor/main/app/template/Toolbar.template +++ b/apps/spreadsheeteditor/main/app/template/Toolbar.template @@ -142,6 +142,7 @@
    +
    diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index 08ac23eba..80741de00 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -714,6 +714,14 @@ define([ menu : new Common.UI.Menu({cls: 'menu-shapes'}) }); + me.btnInsertSymbol = new Common.UI.Button({ + id: 'tlbtn-insertsymbol', + cls: 'btn-toolbar x-huge icon-top', + iconCls: 'btn-symbol', + caption: me.capBtnInsSymbol, + lock: [_set.selImage, _set.selChart, _set.selShape, _set.editFormula, _set.selRangeEdit, _set.coAuth, _set.coAuthText, _set.lostConnect] + }); + me.btnTableTemplate = new Common.UI.Button({ id : 'id-toolbar-btn-ttempl', cls : 'btn-toolbar', @@ -1459,7 +1467,7 @@ define([ me.btnItalic, me.btnUnderline, me.btnStrikeout, me.btnSubscript, me.btnTextColor, me.btnHorizontalAlign, me.btnAlignLeft, me.btnAlignCenter,me.btnAlignRight,me.btnAlignJust, me.btnVerticalAlign, me.btnAlignTop, me.btnAlignMiddle, me.btnAlignBottom, me.btnWrap, me.btnTextOrient, me.btnBackColor, me.btnInsertTable, - me.btnMerge, me.btnInsertFormula, me.btnNamedRange, me.btnIncDecimal, me.btnInsertShape, me.btnInsertEquation, + me.btnMerge, me.btnInsertFormula, me.btnNamedRange, me.btnIncDecimal, me.btnInsertShape, me.btnInsertEquation, me.btnInsertSymbol, me.btnInsertText, me.btnInsertTextArt, me.btnSortUp, me.btnSortDown, me.btnSetAutofilter, me.btnClearAutofilter, me.btnTableTemplate, me.btnPercentStyle, me.btnCurrencyStyle, me.btnDecDecimal, me.btnAddCell, me.btnDeleteCell, me.cmbNumberFormat, me.btnBorders, me.btnInsertImage, me.btnInsertHyperlink, @@ -1635,6 +1643,7 @@ define([ _injectComponent('#slot-btn-instext', this.btnInsertText); _injectComponent('#slot-btn-instextart', this.btnInsertTextArt); _injectComponent('#slot-btn-insequation', this.btnInsertEquation); + _injectComponent('#slot-btn-inssymbol', this.btnInsertSymbol); _injectComponent('#slot-btn-sortdesc', this.btnSortDown); _injectComponent('#slot-btn-sortasc', this.btnSortUp); _injectComponent('#slot-btn-setfilter', this.btnSetAutofilter); @@ -1717,6 +1726,7 @@ define([ _updateHint(this.btnInsertHyperlink, this.tipInsertHyperlink + Common.Utils.String.platformKey('Ctrl+K')); _updateHint(this.btnInsertShape, this.tipInsertShape); _updateHint(this.btnInsertEquation, this.tipInsertEquation); + _updateHint(this.btnInsertSymbol, this.tipInsertSymbol); _updateHint(this.btnSortDown, this.txtSortAZ); _updateHint(this.btnSortUp, this.txtSortZA); _updateHint(this.btnSetAutofilter, this.txtFilter + ' (Ctrl+Shift+L)'); @@ -2520,6 +2530,8 @@ define([ textManyPages: 'pages', textHeight: 'Height', textWidth: 'Width', - textMorePages: 'More pages' + textMorePages: 'More pages', + capBtnInsSymbol: 'Symbol', + tipInsertSymbol: 'Insert symbol' }, SSE.Views.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 6463233b9..57ebf73da 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -1098,6 +1098,7 @@ "SSE.Controllers.Toolbar.txtTable_TableStyleMedium": "Table Style Medium", "SSE.Controllers.Toolbar.warnLongOperation": "The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?", "SSE.Controllers.Toolbar.warnMergeLostData": "Only the data from the upper-left cell will remain in the merged cell.
    Are you sure you want to continue?", + "SSE.Controllers.Toolbar.textInsert": "Insert", "SSE.Controllers.Viewport.textFreezePanes": "Freeze Panes", "SSE.Controllers.Viewport.textHideFBar": "Hide Formula Bar", "SSE.Controllers.Viewport.textHideGridlines": "Hide Gridlines", @@ -2437,6 +2438,8 @@ "SSE.Views.Toolbar.txtTime": "Time", "SSE.Views.Toolbar.txtUnmerge": "Unmerge Cells", "SSE.Views.Toolbar.txtYen": "¥ Yen", + "SSE.Views.Toolbar.capBtnInsSymbol": "Symbol", + "SSE.Views.Toolbar.tipInsertSymbol": "Insert symbol", "SSE.Views.Top10FilterDialog.textType": "Show", "SSE.Views.Top10FilterDialog.txtBottom": "Bottom", "SSE.Views.Top10FilterDialog.txtItems": "Item", diff --git a/apps/spreadsheeteditor/main/resources/less/app.less b/apps/spreadsheeteditor/main/resources/less/app.less index 665d6f51e..5bd93bc68 100644 --- a/apps/spreadsheeteditor/main/resources/less/app.less +++ b/apps/spreadsheeteditor/main/resources/less/app.less @@ -115,6 +115,7 @@ @import "../../../../common/main/resources/less/toolbar.less"; @import "../../../../common/main/resources/less/language-dialog.less"; @import "../../../../common/main/resources/less/winxp_fix.less"; +@import "../../../../common/main/resources/less/symboltable.less"; // App // -------------------------------------------------- From da9f9026dd13b824ff1431af791d85475a220e2d Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 11:53:07 +0300 Subject: [PATCH 15/18] Update translation --- apps/presentationeditor/main/locale/en.json | 5 +++++ apps/spreadsheeteditor/main/locale/en.json | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index dd431ece4..77c8ffa81 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -220,6 +220,11 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textFont": "Font", + "Common.Views.SymbolTableDialog.textRange": "Range", + "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", + "Common.Views.SymbolTableDialog.textCode": "Unicode HEX value", "PE.Controllers.LeftMenu.newDocumentTitle": "Unnamed presentation", "PE.Controllers.LeftMenu.notcriticalErrorTitle": "Warning", "PE.Controllers.LeftMenu.requestEditRightsText": "Requesting editing rights...", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index 57ebf73da..c363e0e39 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -214,6 +214,11 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", + "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textFont": "Font", + "Common.Views.SymbolTableDialog.textRange": "Range", + "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", + "Common.Views.SymbolTableDialog.textCode": "Unicode HEX value", "SSE.Controllers.DataTab.textWizard": "Text to Columns", "SSE.Controllers.DocumentHolder.alignmentText": "Alignment", "SSE.Controllers.DocumentHolder.centerText": "Center", From d72b54c730d9e8d99366c99a10c44d84fcfe186e Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 12:06:10 +0300 Subject: [PATCH 16/18] [PE] Fix Bug 43540 --- apps/presentationeditor/main/app/controller/Toolbar.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 64d75d653..4bff6451a 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -475,7 +475,7 @@ define([ case 0: this.toolbar.btnMarkers.toggle(true, true); this.toolbar.mnuMarkersPicker.selectByIndex(this._state.bullets.subtype, true); - this.toolbar.mnuMarkerSettings.setDisabled(this._state.bullets.subtype<0); + this.toolbar.mnuMarkerSettings && this.toolbar.mnuMarkerSettings.setDisabled(this._state.bullets.subtype<0); break; case 1: var idx = 0; @@ -504,7 +504,7 @@ define([ } this.toolbar.btnNumbers.toggle(true, true); this.toolbar.mnuNumbersPicker.selectByIndex(idx, true); - this.toolbar.mnuNumberSettings.setDisabled(idx==0); + this.toolbar.mnuNumberSettings && this.toolbar.mnuNumberSettings.setDisabled(idx==0); break; } } @@ -1670,8 +1670,8 @@ define([ this.toolbar.mnuMarkersPicker.selectByIndex(0, true); this.toolbar.mnuNumbersPicker.selectByIndex(0, true); - this.toolbar.mnuMarkerSettings.setDisabled(true); - this.toolbar.mnuNumberSettings.setDisabled(true); + this.toolbar.mnuMarkerSettings && this.toolbar.mnuMarkerSettings.setDisabled(true); + this.toolbar.mnuNumberSettings && this.toolbar.mnuNumberSettings.setDisabled(true); }, _getApiTextSize: function () { From 29bb234686fb78e3f27692fab702548dc6ede0fa Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 13:46:59 +0300 Subject: [PATCH 17/18] Change translation --- apps/common/main/lib/view/SymbolTableDialog.js | 2 +- apps/documenteditor/main/locale/en.json | 2 +- apps/documenteditor/main/locale/ru.json | 2 +- apps/presentationeditor/main/locale/en.json | 2 +- apps/spreadsheeteditor/main/locale/en.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index e8eea6645..ab23cb3b7 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -1324,7 +1324,7 @@ define([ } }, - textTitle: 'Symbol Table', + textTitle: 'Symbol', textFont: 'Font', textRange: 'Range', textRecent: 'Recently used symbols', diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 31a578370..50c07692a 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -299,7 +299,7 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", - "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textTitle": "Symbol", "Common.Views.SymbolTableDialog.textFont": "Font", "Common.Views.SymbolTableDialog.textRange": "Range", "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index 44695cd59..cb5315757 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -299,7 +299,7 @@ "Common.Views.SignSettingsDialog.textShowDate": "Показывать дату подписи в строке подписи", "Common.Views.SignSettingsDialog.textTitle": "Настройка подписи", "Common.Views.SignSettingsDialog.txtEmpty": "Это поле необходимо заполнить", - "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textTitle": "Symbol", "Common.Views.SymbolTableDialog.textFont": "Шрифт", "Common.Views.SymbolTableDialog.textRange": "Набор", "Common.Views.SymbolTableDialog.textRecent": "Ранее использовавшиеся символы", diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index 77c8ffa81..5ad8010bb 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -220,7 +220,7 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", - "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textTitle": "Symbol", "Common.Views.SymbolTableDialog.textFont": "Font", "Common.Views.SymbolTableDialog.textRange": "Range", "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index c363e0e39..56a78e04e 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -214,7 +214,7 @@ "Common.Views.SignSettingsDialog.textShowDate": "Show sign date in signature line", "Common.Views.SignSettingsDialog.textTitle": "Signature Setup", "Common.Views.SignSettingsDialog.txtEmpty": "This field is required", - "Common.Views.SymbolTableDialog.textTitle": "Symbol Table", + "Common.Views.SymbolTableDialog.textTitle": "Symbol", "Common.Views.SymbolTableDialog.textFont": "Font", "Common.Views.SymbolTableDialog.textRange": "Range", "Common.Views.SymbolTableDialog.textRecent": "Recently used symbols", From 82cfe9c710b55a645619739f86fef7a4e03aced4 Mon Sep 17 00:00:00 2001 From: Julia Radzhabova Date: Thu, 14 Nov 2019 16:30:55 +0300 Subject: [PATCH 18/18] Fix fonts list in the symbol table --- apps/common/main/lib/view/SymbolTableDialog.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/common/main/lib/view/SymbolTableDialog.js b/apps/common/main/lib/view/SymbolTableDialog.js index ab23cb3b7..601c7070d 100644 --- a/apps/common/main/lib/view/SymbolTableDialog.js +++ b/apps/common/main/lib/view/SymbolTableDialog.js @@ -526,7 +526,6 @@ define([ for(var key in oFontsByName){ if(oFontsByName.hasOwnProperty(key)){ data.push(oFontsByName[key]); - data[data.length-1].value = i++; data[data.length-1].displayValue = oFontsByName[key].m_wsFontName; } } @@ -534,6 +533,9 @@ define([ //initialize params aFontSelects = data; aFontSelects.sort(function(a, b){return (a.displayValue.toLowerCase() > b.displayValue.toLowerCase()) ? 1 : -1;}); + for(i = 0; i < aFontSelects.length; ++i){ + aFontSelects[i].value = i; + } if(!oFontsByName[sInitFont]){ if(oFontsByName['Cambria Math']){ sInitFont = 'Cambria Math';
    ', + '', '', '', + '', '
    ', + '', '
    ', '
    ', + '', '
    ', '