Author: mjansen Date: Sat Mar 18 13:01:18 2017 New Revision: 74187
URL: http://svn.reactos.org/svn/reactos?rev=74187&view=rev Log: [APPLICATIONS/SYSUTILS] Add a font substitutes editor. Patch by Katayama Hirofumi MZ. CORE-12749 #resolve #comment Thanks!
Added: trunk/rosapps/applications/sysutils/fontsub/ trunk/rosapps/applications/sysutils/fontsub/CMakeLists.txt (with props) trunk/rosapps/applications/sysutils/fontsub/License.txt (with props) trunk/rosapps/applications/sysutils/fontsub/down.bmp (with props) trunk/rosapps/applications/sysutils/fontsub/fontsub.cpp (with props) trunk/rosapps/applications/sysutils/fontsub/fontsub.ico (with props) trunk/rosapps/applications/sysutils/fontsub/fontsub.svg trunk/rosapps/applications/sysutils/fontsub/fontsub_res.rc (with props) trunk/rosapps/applications/sysutils/fontsub/lang/ trunk/rosapps/applications/sysutils/fontsub/lang/en-US.rc (with props) trunk/rosapps/applications/sysutils/fontsub/lang/ja-JP.rc (with props) trunk/rosapps/applications/sysutils/fontsub/nil.bmp (with props) trunk/rosapps/applications/sysutils/fontsub/resource.h (with props) trunk/rosapps/applications/sysutils/fontsub/up.bmp (with props) Modified: trunk/rosapps/applications/sysutils/CMakeLists.txt
Modified: trunk/rosapps/applications/sysutils/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/CMake... ============================================================================== --- trunk/rosapps/applications/sysutils/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rosapps/applications/sysutils/CMakeLists.txt [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -1,5 +1,6 @@ add_subdirectory(chklib) add_subdirectory(ctm) +add_subdirectory(fontsub) add_subdirectory(gettype) add_subdirectory(kill) add_subdirectory(logevent)
Added: trunk/rosapps/applications/sysutils/fontsub/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/CMakeLists.txt (added) +++ trunk/rosapps/applications/sysutils/fontsub/CMakeLists.txt [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,16 @@ +# FontSub by Katayama Hirofumi MZ +# +# To the extent possible under law, the person who associated CC0 with +# FontSub has waived all copyright and related or neighboring rights +# to FontSub. +# +# You should have received a copy of the CC0 legalcode along with this +# work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + +set_cpp(WITH_RUNTIME WITH_STL WITH_EXCEPTIONS) + +add_executable(fontsubedit fontsub.cpp fontsub_res.rc) +set_module_type(fontsubedit win32gui UNICODE) +add_importlibs(fontsubedit advapi32 comctl32 comdlg32 shell32 gdi32 user32 msvcrt kernel32) +set_target_properties(fontsubedit PROPERTIES OUTPUT_NAME "fontsub") +add_cd_file(TARGET fontsubedit DESTINATION reactos/system32 FOR all)
Propchange: trunk/rosapps/applications/sysutils/fontsub/CMakeLists.txt ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/License.txt URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/License.txt (added) +++ trunk/rosapps/applications/sysutils/fontsub/License.txt [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,122 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. +
Propchange: trunk/rosapps/applications/sysutils/fontsub/License.txt ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/down.bmp URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== Binary file - no diff available.
Propchange: trunk/rosapps/applications/sysutils/fontsub/down.bmp ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/rosapps/applications/sysutils/fontsub/fontsub.cpp URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/fontsub.cpp (added) +++ trunk/rosapps/applications/sysutils/fontsub/fontsub.cpp [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,1603 @@ +// FontSub by Katayama Hirofumi MZ +// +// To the extent possible under law, the person who associated CC0 with +// FontSub has waived all copyright and related or neighboring rights +// to FontSub. +// +// You should have received a copy of the CC0 legalcode along with this +// work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + + +#include <windows.h> +#include <windowsx.h> +#include <commctrl.h> +#include <tchar.h> +#include <vector> // for std::vector +#include <set> // for std::set +#include <string> // for std::basic_string +#include <algorithm> // for std::sort +#include <cstdio> +#include <cstring> +#include <cassert> +#include "resource.h" + + +#define NAME_COLUMN_WIDTH 250 +#define SUB_COLUMN_WIDTH 250 +#define MAX_STRING 120 + +#ifndef _countof + #define _countof(array) (sizeof(array) / sizeof(array[0])) +#endif + +typedef std::wstring STRING; + +struct ITEM +{ + STRING m_Name, m_Substitute; + BYTE m_CharSet1, m_CharSet2; + ITEM(const STRING& Name, const STRING& Substitute, + BYTE CharSet1, BYTE CharSet2) + : m_Name(Name), m_Substitute(Substitute), + m_CharSet1(CharSet1), m_CharSet2(CharSet2) { } +}; + +/* global variables */ +HINSTANCE g_hInstance = NULL; +HWND g_hMainWnd = NULL; +HICON g_hIcon = NULL; +HWND g_hListView = NULL; +BOOL g_bModified = FALSE; +BOOL g_bNeedsReboot = FALSE; +INT g_iItem = 0; + +LPCWSTR g_pszClassName = L"ReactOS Font Substitutes Editor"; +LPCWSTR g_pszFileHeader = L"Windows Registry Editor Version 5.00"; + +WCHAR g_szTitle[MAX_STRING]; +WCHAR g_szNameHead[MAX_STRING]; +WCHAR g_szSubstituteHead[MAX_STRING]; + +INT g_iSortColumn = 0; +BOOL g_bSortAscendant = TRUE; + +LPCWSTR g_pszKey = + L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes"; + +typedef std::set<STRING> FONTNAMESET; +typedef std::vector<ITEM> ITEMVECTOR; + +FONTNAMESET g_Names; +ITEMVECTOR g_Items; +STRING g_strFontName; +STRING g_strSubstitute; +BYTE g_CharSet1 = DEFAULT_CHARSET; +BYTE g_CharSet2 = DEFAULT_CHARSET; + +typedef struct CHARSET_ENTRY +{ + BYTE CharSet; + LPCWSTR DisplayName; +} CHARSET_ENTRY; + +CHARSET_ENTRY g_CharSetList[] = +{ + { DEFAULT_CHARSET, L"DEFAULT_CHARSET (1)" }, + { ANSI_CHARSET, L"ANSI_CHARSET (0)" }, + { SYMBOL_CHARSET, L"SYMBOL_CHARSET (2)" }, + { SHIFTJIS_CHARSET, L"SHIFTJIS_CHARSET (128)" }, + { HANGUL_CHARSET, L"HANGUL_CHARSET (129)" }, + { GB2312_CHARSET, L"GB2312_CHARSET (134)" }, + { CHINESEBIG5_CHARSET, L"CHINESEBIG5_CHARSET (136)" }, + { OEM_CHARSET, L"OEM_CHARSET (255)" }, + { JOHAB_CHARSET, L"JOHAB_CHARSET (130)" }, + { HEBREW_CHARSET, L"HEBREW_CHARSET (177)" }, + { ARABIC_CHARSET, L"ARABIC_CHARSET (178)" }, + { GREEK_CHARSET, L"GREEK_CHARSET (161)" }, + { TURKISH_CHARSET, L"TURKISH_CHARSET (162)" }, + { VIETNAMESE_CHARSET, L"VIETNAMESE_CHARSET (163)" }, + { THAI_CHARSET, L"THAI_CHARSET (222)" }, + { EASTEUROPE_CHARSET, L"EASTEUROPE_CHARSET (238)" }, + { RUSSIAN_CHARSET, L"RUSSIAN_CHARSET (204)" }, + { MAC_CHARSET, L"MAC_CHARSET (77)" }, + { BALTIC_CHARSET, L"BALTIC_CHARSET (186)" } +}; +const WCHAR g_LongestName[] = L"CHINESEBIG5_CHARSET (136)"; + +static void trim(STRING& str) +{ + static const WCHAR Spaces[] = L" \t\r\n"; + size_t i = str.find_first_not_of(Spaces); + size_t j = str.find_last_not_of(Spaces); + if (i == STRING::npos || j == STRING::npos) + { + str.clear(); + } + else + { + str = str.substr(i, j - i + 1); + } +} + +static int CALLBACK +EnumFontFamExProc(const ENUMLOGFONTW *pelf, + const NEWTEXTMETRICW *pntm, + int FontType, + LPARAM lParam) +{ + switch (pelf->elfFullName[0]) + { + case UNICODE_NULL: case L'@': + break; + default: + g_Names.insert((const WCHAR *)pelf->elfFullName); + } + switch (pelf->elfLogFont.lfFaceName[0]) + { + case UNICODE_NULL: case L'@': + break; + default: + g_Names.insert(pelf->elfLogFont.lfFaceName); + } + return 1; +} + +BOOL DoLoadNames(void) +{ + g_Names.clear(); + + LOGFONTW lf; + ZeroMemory(&lf, sizeof(lf)); + lf.lfCharSet = DEFAULT_CHARSET; + + HDC hDC = CreateCompatibleDC(NULL); + EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFontFamExProc, 0, 0); + DeleteDC(hDC); + + return !g_Names.empty(); +} + +inline bool ItemCompareByNameAscend(const ITEM& Item1, const ITEM& Item2) +{ + return Item1.m_Name < Item2.m_Name; +} + +inline bool ItemCompareByNameDescend(const ITEM& Item1, const ITEM& Item2) +{ + return Item1.m_Name > Item2.m_Name; +} + +inline bool ItemCompareBySubAscend(const ITEM& Item1, const ITEM& Item2) +{ + return Item1.m_Substitute < Item2.m_Substitute; +} + +inline bool ItemCompareBySubDescend(const ITEM& Item1, const ITEM& Item2) +{ + return Item1.m_Substitute > Item2.m_Substitute; +} + +void DoSort(INT iColumn, BOOL bAscendant = TRUE) +{ + LV_COLUMN Column; + ZeroMemory(&Column, sizeof(Column)); + Column.mask = LVCF_IMAGE | LVCF_SUBITEM; + Column.iImage = 2; + Column.iSubItem = 0; + ListView_SetColumn(g_hListView, 0, &Column); + Column.iSubItem = 1; + ListView_SetColumn(g_hListView, 1, &Column); + + switch (iColumn) + { + case 0: + Column.iSubItem = 0; + if (bAscendant) + { + std::sort(g_Items.begin(), g_Items.end(), + ItemCompareByNameAscend); + Column.iImage = 0; + ListView_SetColumn(g_hListView, 0, &Column); + } + else + { + std::sort(g_Items.begin(), g_Items.end(), + ItemCompareByNameDescend); + Column.iImage = 1; + ListView_SetColumn(g_hListView, 0, &Column); + } + break; + case 1: + Column.iSubItem = 1; + if (bAscendant) + { + std::sort(g_Items.begin(), g_Items.end(), + ItemCompareBySubAscend); + Column.iImage = 0; + ListView_SetColumn(g_hListView, 1, &Column); + } + else + { + std::sort(g_Items.begin(), g_Items.end(), + ItemCompareBySubDescend); + Column.iImage = 1; + ListView_SetColumn(g_hListView, 1, &Column); + } + break; + } + g_iSortColumn = iColumn; + g_bSortAscendant = bAscendant; + InvalidateRect(g_hListView, NULL, TRUE); +} + +void LV_AddItems(HWND hwnd) +{ + ListView_DeleteAllItems(hwnd); + + LV_ITEM Item; + ZeroMemory(&Item, sizeof(Item)); + Item.mask = LVIF_PARAM; + + const INT Count = INT(g_Items.size()); + for (INT i = 0; i < Count; ++i) + { + Item.iItem = i; + Item.iSubItem = 0; + Item.lParam = i; + ListView_InsertItem(hwnd, &Item); + + Item.iItem = i; + Item.iSubItem = 1; + Item.lParam = i; + ListView_InsertItem(hwnd, &Item); + } +} + +BOOL DoLoadItems(void) +{ + ITEMVECTOR Items; + + HKEY hKey = NULL; + RegOpenKeyExW(HKEY_LOCAL_MACHINE, g_pszKey, 0, KEY_READ, &hKey); + if (hKey == NULL) + return FALSE; + + WCHAR szName[MAX_STRING], szValue[MAX_STRING]; + DWORD cbName, cbValue; + for (DWORD dwIndex = 0; ; ++dwIndex) + { + cbName = sizeof(szName); + cbValue = sizeof(szValue); + LONG Error = RegEnumValueW(hKey, dwIndex, szName, &cbName, + NULL, NULL, (LPBYTE)szValue, &cbValue); + if (Error != ERROR_SUCCESS) + break; + + BYTE CharSet1 = DEFAULT_CHARSET, CharSet2 = DEFAULT_CHARSET; + LPWSTR pch; + + pch = wcsrchr(szName, L','); + if (pch) + { + *pch = 0; + CharSet1 = (BYTE)_wtoi(pch + 1); + } + + pch = wcsrchr(szValue, L','); + if (pch) + { + *pch = 0; + CharSet2 = (BYTE)_wtoi(pch + 1); + } + + ITEM Item(szName, szValue, CharSet1, CharSet2); + trim(Item.m_Name); + trim(Item.m_Substitute); + Items.push_back(Item); + } + + RegCloseKey(hKey); + + g_Items = Items; + LV_AddItems(g_hListView); + DoSort(0, TRUE); + g_bModified = FALSE; + g_bNeedsReboot = FALSE; + + return !g_Items.empty(); +} + +BOOL DoLoad(void) +{ + return DoLoadNames() && DoLoadItems(); +} + +void LV_InvalidateRow(HWND hwnd, INT iRow = -1) +{ + if (iRow == -1) + iRow = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); + if (iRow == -1) + return; + + RECT Rect; + LPRECT GccIsWhining = &Rect; + ListView_GetItemRect(hwnd, iRow, GccIsWhining, LVIR_BOUNDS); + InvalidateRect(hwnd, &Rect, FALSE); +} + +BOOL LV_Init(HWND hwnd) +{ + ListView_SetExtendedListViewStyle(hwnd, + LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); + + HIMAGELIST hImageList; + hImageList = ImageList_Create(12, 12, ILC_COLOR8 | ILC_MASK, 2, 2); + + HBITMAP hbm; + hbm = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(2), IMAGE_BITMAP, + 12, 12, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS); + assert(hbm); + ImageList_AddMasked(hImageList, hbm, RGB(192, 192, 192)); + DeleteObject(hbm); + + hbm = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(3), IMAGE_BITMAP, + 12, 12, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS); + assert(hbm); + ImageList_AddMasked(hImageList, hbm, RGB(192, 192, 192)); + DeleteObject(hbm); + + hbm = (HBITMAP)LoadImage(g_hInstance, MAKEINTRESOURCE(4), IMAGE_BITMAP, + 12, 12, LR_CREATEDIBSECTION | LR_LOADMAP3DCOLORS); + assert(hbm); + ImageList_AddMasked(hImageList, hbm, RGB(192, 192, 192)); + DeleteObject(hbm); + + ListView_SetImageList(hwnd, hImageList, LVSIL_SMALL); + + LV_COLUMNW Column; + ZeroMemory(&Column, sizeof(Column)); + Column.mask = LVCF_FMT | LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_IMAGE; + Column.fmt = LVCFMT_LEFT; + + Column.cx = NAME_COLUMN_WIDTH; + Column.pszText = g_szNameHead; + Column.iSubItem = 0; + Column.iImage = 0; + ListView_InsertColumn(hwnd, 0, &Column); + + Column.cx = SUB_COLUMN_WIDTH; + Column.pszText = g_szSubstituteHead; + Column.iSubItem = 1; + Column.iImage = 2; + ListView_InsertColumn(hwnd, 1, &Column); + + UINT State = LVIS_SELECTED | LVIS_FOCUSED; + ListView_SetItemState(hwnd, 0, State, State); + + return TRUE; +} + +BOOL EditDlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) +{ + COMBOBOXEXITEMW Item; + ZeroMemory(&Item, sizeof(Item)); + Item.mask = CBEIF_TEXT; + + FONTNAMESET::iterator it, end = g_Names.end(); + for (it = g_Names.begin(); it != end; ++it) + { + Item.pszText = const_cast<LPWSTR>(it->c_str()); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb2)); + SendDlgItemMessageW(hwnd, cmb2, CBEM_INSERTITEM, 0, (LPARAM)&Item); + } + SetDlgItemTextW(hwnd, edt1, g_strFontName.c_str()); + SetDlgItemTextW(hwnd, cmb2, g_strSubstitute.c_str()); + + const INT Count = _countof(g_CharSetList); + for (INT i = 0; i < Count; ++i) + { + Item.pszText = const_cast<LPWSTR>(g_CharSetList[i].DisplayName); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb3)); + SendDlgItemMessageW(hwnd, cmb3, CBEM_INSERTITEM, 0, (LPARAM)&Item); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb4)); + SendDlgItemMessageW(hwnd, cmb4, CBEM_INSERTITEM, 0, (LPARAM)&Item); + } + + SendDlgItemMessageW(hwnd, cmb3, CB_SETCURSEL, 0, 0); + SendDlgItemMessageW(hwnd, cmb4, CB_SETCURSEL, 0, 0); + for (INT i = 0; i < Count; ++i) + { + if (g_CharSet1 == g_CharSetList[i].CharSet) + { + SendDlgItemMessageW(hwnd, cmb3, CB_SETCURSEL, i, 0); + } + if (g_CharSet2 == g_CharSetList[i].CharSet) + { + SendDlgItemMessageW(hwnd, cmb4, CB_SETCURSEL, i, 0); + } + } + + SIZE siz; + HDC hDC = CreateCompatibleDC(NULL); + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + GetTextExtentPoint32W(hDC, g_LongestName, lstrlenW(g_LongestName), &siz); + DeleteDC(hDC); + + SendDlgItemMessageW(hwnd, cmb3, CB_SETHORIZONTALEXTENT, siz.cx + 16, 0); + SendDlgItemMessageW(hwnd, cmb4, CB_SETHORIZONTALEXTENT, siz.cx + 16, 0); + + EnableWindow(GetDlgItem(hwnd, cmb3), FALSE); + + return TRUE; +} + +void LV_OnDelete(HWND hwnd, INT iRow = -1) +{ + if (iRow == -1) + iRow = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); + if (iRow == -1) + return; + + UINT State = LVIS_SELECTED | LVIS_FOCUSED; + ListView_SetItemState(g_hListView, iRow, State, State); + + WCHAR sz[MAX_STRING]; + LoadStringW(g_hInstance, IDS_QUERYDELETE, sz, _countof(sz)); + if (IDYES != MessageBoxW(g_hMainWnd, sz, g_szTitle, + MB_ICONINFORMATION | MB_YESNO)) + { + return; + } + + ListView_DeleteItem(hwnd, iRow); + g_Items.erase(g_Items.begin() + iRow); + g_bModified = TRUE; + + ListView_SetItemState(g_hListView, iRow, State, State); + + InvalidateRect(hwnd, NULL, TRUE); +} + +void EditDlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) +{ + WCHAR szValue[MAX_STRING]; + STRING str; + INT i; + + switch (id) + { + case IDOK: + GetDlgItemTextW(hwnd, cmb2, szValue, _countof(szValue)); + str = szValue; + trim(str); + if (str.empty()) + { + WCHAR sz[MAX_STRING]; + SendDlgItemMessageW(hwnd, cmb2, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); + SetFocus(GetDlgItem(hwnd, cmb2)); + LoadStringW(g_hInstance, IDS_ENTERNAME2, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + + g_Items[g_iItem].m_CharSet2 = DEFAULT_CHARSET; + i = SendDlgItemMessageW(hwnd, cmb4, CB_GETCURSEL, 0, 0); + if (i != CB_ERR) + { + g_Items[g_iItem].m_CharSet2 = g_CharSetList[i].CharSet; + } + g_Items[g_iItem].m_Substitute = str; + + g_bModified = TRUE; + EndDialog(hwnd, IDOK); + break; + case IDCANCEL: + EndDialog(hwnd, IDCANCEL); + break; + case psh1: + LV_OnDelete(g_hListView, g_iItem); + EndDialog(hwnd, psh1); + break; + } +} + +INT_PTR CALLBACK +EditDlg_DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + HANDLE_MSG(hwnd, WM_INITDIALOG, EditDlg_OnInitDialog); + HANDLE_MSG(hwnd, WM_COMMAND, EditDlg_OnCommand); + } + return 0; +} + +void LV_OnDblClk(HWND hwnd) +{ + g_iItem = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); + if (g_iItem == -1) + return; + + g_strFontName = g_Items[g_iItem].m_Name; + g_strSubstitute = g_Items[g_iItem].m_Substitute; + g_CharSet1 = g_Items[g_iItem].m_CharSet1; + g_CharSet2 = g_Items[g_iItem].m_CharSet2; + + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_EDIT), g_hMainWnd, + EditDlg_DlgProc); + InvalidateRect(g_hListView, NULL, TRUE); +} + +BOOL MainWnd_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct) +{ + DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_VSCROLL | + LVS_SINGLESEL | LVS_REPORT | LVS_OWNERDRAWFIXED; + DWORD dwExStyle = WS_EX_CLIENTEDGE; + g_hListView = CreateWindowEx(dwExStyle, WC_LISTVIEW, NULL, dwStyle, + 0, 0, 0, 0, + hwnd, (HMENU)1, g_hInstance, NULL); + if (g_hListView == NULL) + return FALSE; + + if (!LV_Init(g_hListView)) + return FALSE; + + if (!DoLoad()) + return FALSE; + + UINT State = LVIS_SELECTED | LVIS_FOCUSED; + ListView_SetItemState(g_hListView, 0, State, State); + SetFocus(g_hListView); + return TRUE; +} + +BOOL AddDlg_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) +{ + COMBOBOXEXITEMW Item; + ZeroMemory(&Item, sizeof(Item)); + Item.iItem = -1; + Item.mask = CBEIF_TEXT; + + FONTNAMESET::iterator it, end = g_Names.end(); + for (it = g_Names.begin(); it != end; ++it) + { + Item.pszText = const_cast<LPWSTR>(it->c_str()); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb1)); + SendDlgItemMessageW(hwnd, cmb1, CBEM_INSERTITEM, 0, (LPARAM)&Item); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb2)); + SendDlgItemMessageW(hwnd, cmb2, CBEM_INSERTITEM, 0, (LPARAM)&Item); + } + WCHAR szEnterName[MAX_STRING]; + LoadStringW(g_hInstance, IDS_ENTERNAME, szEnterName, _countof(szEnterName)); + SetDlgItemTextW(hwnd, cmb1, szEnterName); + SendDlgItemMessageW(hwnd, cmb1, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); + + const INT Count = _countof(g_CharSetList); + for (INT i = 0; i < Count; ++i) + { + Item.pszText = const_cast<LPWSTR>(g_CharSetList[i].DisplayName); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb3)); + SendDlgItemMessageW(hwnd, cmb3, CBEM_INSERTITEM, 0, (LPARAM)&Item); + Item.iItem = ComboBox_GetCount(GetDlgItem(hwnd, cmb4)); + SendDlgItemMessageW(hwnd, cmb4, CBEM_INSERTITEM, 0, (LPARAM)&Item); + } + + SendDlgItemMessageW(hwnd, cmb3, CB_SETCURSEL, 0, 0); + SendDlgItemMessageW(hwnd, cmb4, CB_SETCURSEL, 0, 0); + for (INT i = 0; i < Count; ++i) + { + if (g_CharSet1 == g_CharSetList[i].CharSet) + { + SendDlgItemMessageW(hwnd, cmb3, CB_SETCURSEL, i, 0); + } + if (g_CharSet2 == g_CharSetList[i].CharSet) + { + SendDlgItemMessageW(hwnd, cmb4, CB_SETCURSEL, i, 0); + } + } + + SIZE siz; + HDC hDC = CreateCompatibleDC(NULL); + SelectObject(hDC, GetStockObject(DEFAULT_GUI_FONT)); + GetTextExtentPoint32W(hDC, g_LongestName, lstrlenW(g_LongestName), &siz); + DeleteDC(hDC); + + SendDlgItemMessageW(hwnd, cmb3, CB_SETHORIZONTALEXTENT, siz.cx + 16, 0); + SendDlgItemMessageW(hwnd, cmb4, CB_SETHORIZONTALEXTENT, siz.cx + 16, 0); + + return TRUE; +} + +void AddDlg_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) +{ + WCHAR szKey[MAX_STRING], szValue[MAX_STRING], sz[MAX_STRING]; + INT i, iCharSet1, iCharSet2; + BYTE CharSet1, CharSet2; + STRING key, value; + switch (id) + { + case IDOK: + GetDlgItemTextW(hwnd, cmb1, szKey, _countof(szKey)); + key = szKey; + trim(key); + LoadStringW(g_hInstance, IDS_ENTERNAME, sz, _countof(sz)); + if (key.empty() || key == sz) + { + SendDlgItemMessageW(hwnd, cmb1, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); + SetFocus(GetDlgItem(hwnd, cmb1)); + LoadStringW(g_hInstance, IDS_ENTERNAME2, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + + GetDlgItemTextW(hwnd, cmb2, szValue, _countof(szValue)); + value = szValue; + trim(value); + if (value.empty()) + { + SendDlgItemMessageW(hwnd, cmb2, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); + SetFocus(GetDlgItem(hwnd, cmb2)); + LoadStringW(g_hInstance, IDS_ENTERNAME2, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + + iCharSet1 = SendDlgItemMessageW(hwnd, cmb3, CB_GETCURSEL, 0, 0); + if (iCharSet1 == CB_ERR) + iCharSet1 = 0; + iCharSet2 = SendDlgItemMessageW(hwnd, cmb4, CB_GETCURSEL, 0, 0); + if (iCharSet2 == CB_ERR) + iCharSet2 = 0; + + CharSet1 = g_CharSetList[iCharSet1].CharSet; + CharSet2 = g_CharSetList[iCharSet2].CharSet; + + for (i = 0; i < (INT)g_Items.size(); ++i) + { + if (g_Items[i].m_Name == key && + g_Items[i].m_CharSet1 == CharSet1) + { + WCHAR sz[MAX_STRING]; + SendDlgItemMessageW(hwnd, cmb1, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); + SetFocus(GetDlgItem(hwnd, cmb1)); + LoadStringW(g_hInstance, IDS_ALREADYEXISTS, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + } + { + ITEM Item(key, value, CharSet1, CharSet2); + g_Items.push_back(Item); + g_bModified = TRUE; + + i = (INT)g_Items.size(); + LV_ITEM LvItem; + ZeroMemory(&LvItem, sizeof(LvItem)); + LvItem.mask = LVIF_PARAM; + LvItem.iItem = i; + LvItem.lParam = i; + + LvItem.iSubItem = 0; + ListView_InsertItem(g_hListView, &LvItem); + + LvItem.iSubItem = 1; + ListView_InsertItem(g_hListView, &LvItem); + } + g_bModified = TRUE; + EndDialog(hwnd, IDOK); + break; + case IDCANCEL: + EndDialog(hwnd, IDCANCEL); + break; + } +} + +INT_PTR CALLBACK +AddDlg_DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + HANDLE_MSG(hwnd, WM_INITDIALOG, AddDlg_OnInitDialog); + HANDLE_MSG(hwnd, WM_COMMAND, AddDlg_OnCommand); + } + return 0; +} + +void MainWnd_OnNew(HWND hwnd) +{ + g_iItem = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); + if (g_iItem == -1) + return; + + g_strFontName = g_Items[g_iItem].m_Name; + g_strSubstitute = g_Items[g_iItem].m_Substitute; + g_CharSet1 = g_Items[g_iItem].m_CharSet1; + g_CharSet2 = g_Items[g_iItem].m_CharSet2; + + if (IDOK == DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ADD), g_hMainWnd, + AddDlg_DlgProc)) + { + INT i = ListView_GetItemCount(g_hListView) - 1; + UINT State = LVIS_SELECTED | LVIS_FOCUSED; + ListView_SetItemState(g_hListView, i, State, State); + ListView_EnsureVisible(g_hListView, i, FALSE); + } +} + +BOOL MainWnd_OnUpdateRegistry(HWND hwnd) +{ + // open the key + HKEY hKey = NULL; + RegOpenKeyExW(HKEY_LOCAL_MACHINE, g_pszKey, 0, KEY_ALL_ACCESS, &hKey); + if (hKey == NULL) + return FALSE; + + // clear all values + WCHAR szName[MAX_STRING], szValue[MAX_STRING]; + DWORD cbName, cbValue; + for (;;) + { + cbName = sizeof(szName); + cbValue = sizeof(szValue); + LONG Error = RegEnumValueW(hKey, 0, szName, &cbName, + NULL, NULL, (LPBYTE)szValue, &cbValue); + if (Error != ERROR_SUCCESS) + break; + + RegDeleteValueW(hKey, szName); + } + + // set values + size_t Count = g_Items.size(); + for (size_t i = 0; i < Count; ++i) + { + DWORD cbData = (g_Items[i].m_Substitute.size() + 1) * sizeof(WCHAR); + RegSetValueExW(hKey, g_Items[i].m_Name.c_str(), 0, + REG_SZ, (LPBYTE)g_Items[i].m_Substitute.c_str(), cbData); + } + + // close now + RegCloseKey(hKey); + + g_bModified = FALSE; + g_bNeedsReboot = TRUE; + return TRUE; +} + +LPWSTR SkipSpace(LPCWSTR pch) +{ + while (*pch && wcschr(L" \t\r\n", *pch) != NULL) + { + ++pch; + } + return const_cast<LPWSTR>(pch); +} + +LPWSTR SkipQuoted(LPWSTR pch) +{ + ++pch; // L'"' + while (*pch) + { + if (*pch == L'"') + { + ++pch; + break; + } + if (*pch == L'\') + { + ++pch; + } + ++pch; + } + return pch; +} + +void UnescapeHex(const STRING& str, size_t& i, STRING& Ret, BOOL Unicode) +{ + STRING Num; + + // hexadecimal + if (iswxdigit(str[i])) + { + Num += str[i]; + ++i; + if (iswxdigit(str[i])) + { + Num += str[i]; + ++i; + if (Unicode) + { + if (iswxdigit(str[i])) + { + Num += str[i]; + ++i; + if (iswxdigit(str[i])) + { + Num += str[i]; + ++i; + } + } + } + } + } + if (!Num.empty()) + { + Ret += (WCHAR)wcstoul(&Num[0], NULL, 16); + } +} + +void UnescapeOther(const STRING& str, size_t& i, STRING& Ret) +{ + STRING Num; + + // check octal + if (L'0' <= str[i] && str[i] < L'8') + { + Num += str[i]; + ++i; + if (L'0' <= str[i] && str[i] < L'8') + { + Num += str[i]; + ++i; + if (L'0' <= str[i] && str[i] < L'8') + { + Num += str[i]; + ++i; + } + } + } + if (Num.empty()) + { + Ret += str[i]; + ++i; + } + else + { + // octal + Ret += (WCHAR)wcstoul(&Num[0], NULL, 8); + } +} + +// process escape sequence +void UnescapeChar(const STRING& str, size_t& i, STRING& Ret) +{ + if (str[i] != L'\') + { + Ret += str[i]; + ++i; + return; + } + + ++i; + switch (str[i]) + { + case L'a': Ret += L'\a'; ++i; break; + case L'b': Ret += L'\b'; ++i; break; + case L'f': Ret += L'\f'; ++i; break; + case L'n': Ret += L'\n'; ++i; break; + case L'r': Ret += L'\r'; ++i; break; + case L't': Ret += L'\t'; ++i; break; + case L'v': Ret += L'\v'; ++i; break; + case L'x': + // hexidemical + ++i; + UnescapeHex(str, i, Ret, FALSE); + break; + case L'u': + // Unicode hexidemical + ++i; + UnescapeHex(str, i, Ret, TRUE); + break; + default: + // other case + UnescapeOther(str, i, Ret); + break; + } +} + +STRING Unquote(const STRING& str) +{ + if (str[0] != L'"') + return str; + + STRING Ret; + size_t i = 1; + while (i < str.size()) + { + if (str[i] == L'"' || str[i] == UNICODE_NULL) + break; + + UnescapeChar(str, i, Ret); + } + return Ret; +} + +BOOL DoParseFile(LPVOID pvContents, DWORD dwSize) +{ + ITEMVECTOR Items; + + LPWSTR pch, pchSep, pchStart = (LPWSTR)pvContents; + + pchStart[dwSize / sizeof(WCHAR)] = UNICODE_NULL; + + // check header + const DWORD cbHeader = lstrlenW(g_pszFileHeader) * sizeof(WCHAR); + if (memcmp(pchStart, g_pszFileHeader, cbHeader) != 0) + return FALSE; + + pchStart += cbHeader / sizeof(WCHAR); + + // find the key + WCHAR szKey[MAX_STRING]; + wsprintfW(szKey, L"[HKEY_LOCAL_MACHINE\%s]", g_pszKey); + pch = wcsstr(pchStart, szKey); + if (pch == NULL) + return FALSE; + + pchStart = pch + lstrlenW(szKey); + + for (;;) + { + pchStart = SkipSpace(pchStart); + if (*pchStart == UNICODE_NULL || *pchStart == L'[') + break; + + pch = wcschr(pchStart, L'\n'); + if (pch) + *pch = UNICODE_NULL; + + pchSep = SkipQuoted(pchStart); + if (*pchSep == L'=') + { + *pchSep = UNICODE_NULL; + + STRING key = pchStart; + trim(key); + key = Unquote(key); + + STRING value = pchSep + 1; + trim(value); + value = Unquote(value); + + BYTE CharSet1 = DEFAULT_CHARSET, CharSet2 = DEFAULT_CHARSET; + + size_t pos; + pos = key.find(L','); + if (pos != STRING::npos) + { + CharSet1 = (BYTE)_wtoi(&key[pos + 1]); + key.resize(pos); + trim(key); + } + pos = value.find(L','); + if (pos != STRING::npos) + { + CharSet2 = (BYTE)_wtoi(&value[pos + 1]); + value.resize(pos); + trim(value); + } + + ITEM Item(key, value, CharSet1, CharSet2); + Items.push_back(Item); + } + + if (pch == NULL) + break; + + pchStart = pch + 1; + } + + g_Items = Items; + g_bModified = TRUE; + + LV_AddItems(g_hListView); + return TRUE; +} + +BOOL DoImport(HWND hwnd, LPCWSTR pszFile) +{ + HANDLE hFile = CreateFileW(pszFile, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, + OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return FALSE; + + BOOL bSuccess = FALSE; + DWORD dwSize = GetFileSize(hFile, NULL); + if (dwSize != 0xFFFFFFFF) + { + std::vector<BYTE> Contents(dwSize + 2); + DWORD cbRead; + if (ReadFile(hFile, &Contents[0], dwSize, &cbRead, NULL) && + cbRead == dwSize) + { + /* check BOM */ + if (memcmp(&Contents[0], "\xFF\xFE", 2) == 0) + { + bSuccess = DoParseFile(&Contents[2], dwSize - 2); + } + else + { + bSuccess = DoParseFile(&Contents[0], dwSize); + } + } + } + CloseHandle(hFile); + + return bSuccess; +} + +STRING Escape(const STRING& str) +{ + STRING Ret; + for (size_t i = 0; i < str.size(); ++i) + { + switch (str[i]) + { + case L'"': case L'\': + Ret += L'\'; + Ret += str[i]; + break; + default: + Ret += str[i]; + } + } + return Ret; +} + +BOOL DoExport(HWND hwnd, LPCWSTR pszFile) +{ + HANDLE hFile = CreateFileW(pszFile, GENERIC_WRITE, FILE_SHARE_READ, + NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, NULL); + if (hFile == INVALID_HANDLE_VALUE) + return FALSE; + + BOOL bSuccess; + DWORD dwSize, cbWritten; + WCHAR szCharSet1[MAX_STRING], szCharSet2[MAX_STRING]; + WCHAR szLine[MAX_STRING * 2 + 4]; + + /* write header */ + dwSize = lstrlenW(g_pszFileHeader) * sizeof(WCHAR); + bSuccess = + WriteFile(hFile, "\xFF\xFE", 2, &cbWritten, NULL) && + WriteFile(hFile, g_pszFileHeader, dwSize, &cbWritten, NULL); + if (bSuccess) + { + wsprintfW(szLine, L"\r\n\r\n[HKEY_LOCAL_MACHINE\%s]\r\n", g_pszKey); + dwSize = lstrlenW(szLine) * sizeof(WCHAR); + bSuccess = WriteFile(hFile, szLine, dwSize, &cbWritten, NULL); + } + if (bSuccess) + { + size_t i, Count = g_Items.size(); + for (i = 0; i < Count; ++i) + { + if (g_Items[i].m_CharSet1 != DEFAULT_CHARSET) + wsprintfW(szCharSet1, L",%u", g_Items[i].m_CharSet1); + else + szCharSet1[0] = UNICODE_NULL; + + if (g_Items[i].m_CharSet2 != DEFAULT_CHARSET) + wsprintfW(szCharSet2, L",%u", g_Items[i].m_CharSet2); + else + szCharSet2[0] = UNICODE_NULL; + + STRING Name = Escape(g_Items[i].m_Name); + STRING Substitute = Escape(g_Items[i].m_Substitute); + wsprintfW(szLine, L""%s%s"="%s%s"\r\n", + Name.c_str(), szCharSet1, + Substitute.c_str(), szCharSet2); + + dwSize = lstrlenW(szLine) * sizeof(WCHAR); + if (!WriteFile(hFile, szLine, dwSize, &cbWritten, NULL)) + { + bSuccess = FALSE; + break; + } + } + WriteFile(hFile, L"\r\n", 2 * sizeof(WCHAR), &cbWritten, NULL); + } + CloseHandle(hFile); + + if (!bSuccess) + { + DeleteFileW(pszFile); + } + + return bSuccess; +} + +void MakeFilter(LPWSTR pszFilter) +{ + while (*pszFilter) + { + if (*pszFilter == L'|') + *pszFilter = 0; + + ++pszFilter; + } +} + +void MainWnd_OnImport(HWND hwnd) +{ + OPENFILENAMEW ofn = {0}; + WCHAR szFile[MAX_PATH] = L""; + WCHAR szImportTitle[MAX_STRING]; + WCHAR szCannotImport[MAX_STRING]; + WCHAR szImportFilter[MAX_STRING]; + LoadStringW(g_hInstance, IDS_IMPORT, szImportTitle, _countof(szImportTitle)); + LoadStringW(g_hInstance, IDS_CANTIMPORT, szCannotImport, _countof(szCannotImport)); + LoadStringW(g_hInstance, IDS_INPFILTER, szImportFilter, _countof(szImportFilter)); + MakeFilter(szImportFilter); + + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwnd; + ofn.lpstrFilter = szImportFilter; + ofn.lpstrFile = szFile; + ofn.nMaxFile = _countof(szFile); + ofn.lpstrTitle = szImportTitle; + ofn.Flags = OFN_DONTADDTORECENT | OFN_ENABLESIZING | + OFN_EXPLORER | OFN_FILEMUSTEXIST | + OFN_HIDEREADONLY | OFN_LONGNAMES | + OFN_PATHMUSTEXIST; + ofn.lpstrDefExt = L"reg"; + if (GetOpenFileNameW(&ofn)) + { + if (!DoImport(hwnd, szFile)) + { + MessageBoxW(hwnd, szCannotImport, g_szTitle, MB_ICONERROR); + } + } +} + +void MainWnd_OnExport(HWND hwnd) +{ + OPENFILENAMEW ofn = {0}; + WCHAR szFile[MAX_PATH] = L""; + WCHAR szExportTitle[MAX_STRING]; + WCHAR szCannotExport[MAX_STRING]; + WCHAR szExportFilter[MAX_STRING]; + LoadStringW(g_hInstance, IDS_EXPORT, szExportTitle, _countof(szExportTitle)); + LoadStringW(g_hInstance, IDS_CANTEXPORT, szCannotExport, _countof(szCannotExport)); + LoadStringW(g_hInstance, IDS_OUTFILTER, szExportFilter, _countof(szExportFilter)); + MakeFilter(szExportFilter); + + ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; + ofn.hwndOwner = hwnd; + ofn.lpstrFilter = szExportFilter; + ofn.lpstrFile = szFile; + ofn.nMaxFile = _countof(szFile); + ofn.lpstrTitle = szExportTitle; + ofn.Flags = OFN_DONTADDTORECENT | OFN_ENABLESIZING | + OFN_EXPLORER | OFN_HIDEREADONLY | OFN_LONGNAMES | + OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT; + ofn.lpstrDefExt = L"reg"; + if (GetSaveFileNameW(&ofn)) + { + if (!DoExport(hwnd, szFile)) + { + MessageBoxW(hwnd, szCannotExport, g_szTitle, MB_ICONERROR); + } + } +} + +void MainWnd_OnReload(HWND hwnd) +{ + DoLoad(); +} + +void MainWnd_OnEdit(HWND hwnd) +{ + LV_OnDblClk(g_hListView); +} + +void MainWnd_OnDelete(HWND hwnd) +{ + LV_OnDelete(g_hListView); +} + +void MainWnd_OnOpenRegKey(HWND hwnd) +{ + static const WCHAR s_szRegeditKey[] = + L"SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit"; + WCHAR sz[MAX_STRING]; + + // open regedit key + HKEY hKey = NULL; + LSTATUS Result = RegCreateKeyExW(HKEY_CURRENT_USER, s_szRegeditKey, 0, + NULL, 0, KEY_WRITE, NULL, &hKey, NULL); + if (Result != ERROR_SUCCESS) + { + LoadStringW(g_hInstance, IDS_CANTOPENKEY, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + + // set LastKey value + wsprintfW(sz, L"HKEY_LOCAL_MACHINE\%s", g_pszKey); + DWORD dwSize = sizeof(sz); + Result = RegSetValueExW(hKey, L"LastKey", 0, REG_SZ, + (LPBYTE)sz, dwSize); + + // close now + RegCloseKey(hKey); + + if (Result != ERROR_SUCCESS) + { + LoadStringW(g_hInstance, IDS_CANTOPENKEY, sz, _countof(sz)); + MessageBoxW(hwnd, sz, NULL, MB_ICONERROR); + return; + } + + // open by regedit + ShellExecuteW(hwnd, NULL, L"regedit.exe", NULL, NULL, SW_SHOWNORMAL); +} + +void MainWnd_OnAbout(HWND hwnd) +{ + WCHAR szAbout[MAX_PATH]; + LoadStringW(g_hInstance, IDS_ABOUT, szAbout, _countof(szAbout)); + + MSGBOXPARAMS Params; + ZeroMemory(&Params, sizeof(Params)); + Params.cbSize = sizeof(Params); + Params.hwndOwner = hwnd; + Params.hInstance = g_hInstance; + Params.lpszText = szAbout; + Params.lpszCaption = g_szTitle; + Params.dwStyle = MB_OK | MB_USERICON; + Params.lpszIcon = MAKEINTRESOURCEW(1); + Params.dwLanguageId = LANG_USER_DEFAULT; + MessageBoxIndirectW(&Params); +} + +void MainWnd_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) +{ + switch (id) + { + case ID_NEW: + MainWnd_OnNew(hwnd); + break; + case ID_EDIT: + MainWnd_OnEdit(hwnd); + break; + case ID_EXIT: + PostMessage(hwnd, WM_CLOSE, 0, 0); + break; + case ID_RELOAD: + MainWnd_OnReload(hwnd); + break; + case ID_UPDATE_REGISTRY: + MainWnd_OnUpdateRegistry(hwnd); + break; + case ID_DELETE: + MainWnd_OnDelete(hwnd); + break; + case ID_IMPORT: + MainWnd_OnImport(hwnd); + break; + case ID_EXPORT: + MainWnd_OnExport(hwnd); + break; + case ID_OPEN_REGKEY: + MainWnd_OnOpenRegKey(hwnd); + break; + case ID_ABOUT: + MainWnd_OnAbout(hwnd); + break; + } +} + +void MainWnd_OnDestroy(HWND hwnd) +{ + PostQuitMessage(0); +} + +void MainWnd_OnSize(HWND hwnd, UINT state, int cx, int cy) +{ + MoveWindow(g_hListView, 0, 0, cx, cy, TRUE); +} + +void MainWnd_OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT *lpDrawItem) +{ + if (lpDrawItem->CtlType != ODT_LISTVIEW) + return; + + HDC hDC = lpDrawItem->hDC; + SetBkMode(hDC, TRANSPARENT); + + INT iColumn = 0, x, cx; + RECT rcItem, rcSubItem, rcText; + STRING Str; + + x = -GetScrollPos(g_hListView, SB_HORZ); + + rcItem = lpDrawItem->rcItem; + if (lpDrawItem->itemState & ODS_SELECTED) + { + FillRect(hDC, &rcItem, (HBRUSH)(COLOR_HIGHLIGHT + 1)); + SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + } + else + { + FillRect(hDC, &rcItem, (HBRUSH)(COLOR_WINDOW + 1)); + SetTextColor(hDC, GetSysColor(COLOR_WINDOWTEXT)); + } + + cx = ListView_GetColumnWidth(g_hListView, iColumn); + rcSubItem = rcItem; + rcSubItem.left = x; + rcSubItem.right = x + cx; + + WCHAR sz[MAX_STRING]; + + rcText = rcSubItem; + InflateRect(&rcText, -1, -1); + Str = g_Items[lpDrawItem->itemID].m_Name; + BYTE CharSet1 = g_Items[lpDrawItem->itemID].m_CharSet1; + if (CharSet1 != DEFAULT_CHARSET) + wsprintfW(sz, L"%s,%u", Str.c_str(), CharSet1); + else + wsprintfW(sz, L"%s", Str.c_str()); + + DrawTextW(hDC, sz, lstrlenW(sz), &rcText, + DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_END_ELLIPSIS | + DT_NOPREFIX); + + x += cx; + ++iColumn; + + cx = ListView_GetColumnWidth(g_hListView, iColumn); + rcSubItem = rcItem; + rcSubItem.left = x; + rcSubItem.right = x + cx; + + rcText = rcSubItem; + InflateRect(&rcText, -1, -1); + Str = g_Items[lpDrawItem->itemID].m_Substitute; + BYTE CharSet2 = g_Items[lpDrawItem->itemID].m_CharSet2; + if (CharSet2 != DEFAULT_CHARSET) + wsprintfW(sz, L"%s,%u", Str.c_str(), CharSet2); + else + wsprintfW(sz, L"%s", Str.c_str()); + + DrawTextW(hDC, sz, lstrlenW(sz), &rcText, + DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_END_ELLIPSIS | + DT_NOPREFIX); +} + +void MainWnd_OnMeasureItem(HWND hwnd, MEASUREITEMSTRUCT *lpMeasureItem) +{ + if (lpMeasureItem->CtlType != ODT_LISTVIEW) + return; + + TEXTMETRIC tm; + HDC hDC = GetDC(hwnd); + GetTextMetrics(hDC, &tm); + ReleaseDC(hwnd, hDC); + + lpMeasureItem->itemHeight = tm.tmHeight * 4 / 3; +} + +LRESULT MainWnd_OnNotify(HWND hwnd, int idFrom, NMHDR *pnmhdr) +{ + NM_LISTVIEW *pNMLV = (NM_LISTVIEW *)pnmhdr; + LV_KEYDOWN *pLVKD = (LV_KEYDOWN *)pnmhdr; + + switch (pnmhdr->code) + { + case LVN_COLUMNCLICK: + if (pNMLV->iSubItem == g_iSortColumn) + DoSort(pNMLV->iSubItem, !g_bSortAscendant); + else + DoSort(pNMLV->iSubItem, TRUE); + break; + case NM_DBLCLK: + LV_OnDblClk(g_hListView); + break; + case LVN_KEYDOWN: + if (pLVKD->wVKey == VK_RETURN) // [Enter] key + { + LV_OnDblClk(g_hListView); + } + if (pLVKD->wVKey == VK_DELETE) // [Del] key + { + LV_OnDelete(g_hListView); + } + break; + } + return 0; +} + +LRESULT MainWnd_OnContextMenu(HWND hwnd, HWND hwndContext, UINT xPos, UINT yPos) +{ + POINT pt = {(INT)xPos, (INT)yPos}; + ScreenToClient(g_hListView, &pt); + SendMessageW(g_hListView, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y)); + + HMENU hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(2)); + if (hMenu == NULL) + return 0; + + HMENU hSubMenu = GetSubMenu(hMenu, 0); + if (hSubMenu == NULL) + return 0; + + SetForegroundWindow(hwnd); + TrackPopupMenu(hSubMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, + xPos, yPos, 0, g_hMainWnd, NULL); + PostMessage(g_hMainWnd, WM_NULL, 0, 0); + return 0; +} + +void MainWnd_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized) +{ + if (state != WA_INACTIVE) + { + SetFocus(g_hListView); + } +} + +BOOL EnableProcessPrivileges(LPCWSTR lpPrivilegeName, BOOL bEnable = TRUE) +{ + HANDLE hToken; + LUID luid; + TOKEN_PRIVILEGES tokenPrivileges; + BOOL Ret; + + Ret = ::OpenProcessToken(::GetCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + &hToken); + if (!Ret) + return Ret; // failure + + Ret = ::LookupPrivilegeValueW(NULL, lpPrivilegeName, &luid); + if (Ret) + { + tokenPrivileges.PrivilegeCount = 1; + tokenPrivileges.Privileges[0].Luid = luid; + tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; + + Ret = ::AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, 0, 0); + } + + ::CloseHandle(hToken); + return Ret; +} + +void MainWnd_OnClose(HWND hwnd) +{ + if (!g_bNeedsReboot && !g_bModified) + { + DestroyWindow(hwnd); + return; + } + + if (g_bModified) + { + WCHAR szUpdateNow[MAX_STRING]; + LoadStringW(g_hInstance, IDS_QUERYUPDATE, szUpdateNow, _countof(szUpdateNow)); + INT id = MessageBoxW(hwnd, szUpdateNow, g_szTitle, + MB_ICONINFORMATION | MB_YESNOCANCEL); + switch (id) + { + case IDYES: + MainWnd_OnUpdateRegistry(hwnd); + break; + case IDNO: + break; + case IDCANCEL: + return; + } + } + + if (g_bNeedsReboot) + { + WCHAR szRebootNow[MAX_STRING]; + LoadStringW(g_hInstance, IDS_REBOOTNOW, szRebootNow, _countof(szRebootNow)); + INT id = MessageBoxW(hwnd, szRebootNow, g_szTitle, + MB_ICONINFORMATION | MB_YESNOCANCEL); + switch (id) + { + case IDYES: + EnableProcessPrivileges(SE_SHUTDOWN_NAME, TRUE); + ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0); + break; + case IDNO: + break; + case IDCANCEL: + return; + } + } + + ::DestroyWindow(hwnd); +} + +LRESULT CALLBACK +WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + HANDLE_MSG(hwnd, WM_CREATE, MainWnd_OnCreate); + HANDLE_MSG(hwnd, WM_COMMAND, MainWnd_OnCommand); + HANDLE_MSG(hwnd, WM_DESTROY, MainWnd_OnDestroy); + HANDLE_MSG(hwnd, WM_SIZE, MainWnd_OnSize); + HANDLE_MSG(hwnd, WM_DRAWITEM, MainWnd_OnDrawItem); + HANDLE_MSG(hwnd, WM_MEASUREITEM, MainWnd_OnMeasureItem); + HANDLE_MSG(hwnd, WM_NOTIFY, MainWnd_OnNotify); + HANDLE_MSG(hwnd, WM_CONTEXTMENU, MainWnd_OnContextMenu); + HANDLE_MSG(hwnd, WM_ACTIVATE, MainWnd_OnActivate); + HANDLE_MSG(hwnd, WM_CLOSE, MainWnd_OnClose); + default: + return DefWindowProc(hwnd, uMsg, wParam, lParam); + } +} + +INT WINAPI wWinMain( + HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, + INT nCmdShow) +{ + g_hInstance = hInstance; + InitCommonControls(); + + HACCEL hAccel = LoadAcceleratorsW(hInstance, MAKEINTRESOURCEW(1)); + + LoadStringW(hInstance, IDS_TITLE, g_szTitle, _countof(g_szTitle)); + LoadStringW(hInstance, IDS_FONTNAME, g_szNameHead, _countof(g_szNameHead)); + LoadStringW(hInstance, IDS_SUBSTITUTE, g_szSubstituteHead, _countof(g_szSubstituteHead)); + + WNDCLASSW wc = {0}; + wc.style = 0; + wc.lpfnWndProc = WindowProc; + wc.hInstance = hInstance; + g_hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1)); + wc.hIcon = g_hIcon; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); + wc.lpszMenuName = MAKEINTRESOURCEW(1); + wc.lpszClassName = g_pszClassName; + if (!RegisterClassW(&wc)) + { + MessageBoxA(NULL, "ERROR: RegisterClass failed.", NULL, MB_ICONERROR); + return 1; + } + + const DWORD dwStyle = WS_OVERLAPPEDWINDOW; + INT Width = NAME_COLUMN_WIDTH + SUB_COLUMN_WIDTH + + GetSystemMetrics(SM_CXVSCROLL) + + GetSystemMetrics(SM_CXSIZEFRAME); + INT Height = 320; + + RECT Rect = { 0, 0, Width, Height }; + AdjustWindowRect(&Rect, dwStyle, TRUE); + Width = Rect.right - Rect.left; + Height = Rect.bottom - Rect.top; + + g_hMainWnd = CreateWindowW(g_pszClassName, g_szTitle, dwStyle, + CW_USEDEFAULT, CW_USEDEFAULT, Width, Height, + NULL, NULL, hInstance, NULL); + if (g_hMainWnd == NULL) + { + MessageBoxA(NULL, "ERROR: CreateWindow failed.", NULL, MB_ICONERROR); + return 2; + } + + ShowWindow(g_hMainWnd, nCmdShow); + UpdateWindow(g_hMainWnd); + + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) + { + if (TranslateAccelerator(g_hMainWnd, hAccel, &msg)) + continue; + + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return (INT)msg.wParam; +}
Propchange: trunk/rosapps/applications/sysutils/fontsub/fontsub.cpp ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/fontsub.ico URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== Binary file - no diff available.
Propchange: trunk/rosapps/applications/sysutils/fontsub/fontsub.ico ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/rosapps/applications/sysutils/fontsub/fontsub.svg URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/fontsub.svg (added) +++ trunk/rosapps/applications/sysutils/fontsub/fontsub.svg [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,368 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="256" + height="256" + viewBox="0 0 256 256" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="fontsub.svg" + inkscape:export-filename="C:\Users\katahiromz\Desktop\fontsub2\fontsub.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.35" + inkscape:cx="-96.950454" + inkscape:cy="-3.229257" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:snap-bbox="true" + inkscape:bbox-paths="true" + inkscape:bbox-nodes="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-intersection-paths="true" + inkscape:object-paths="true" + inkscape:object-nodes="true" + inkscape:snap-smooth-nodes="true" + inkscape:snap-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-center="true" + inkscape:snap-text-baseline="true" + inkscape:snap-page="true" + inkscape:snap-global="true" + inkscape:window-width="1366" + inkscape:window-height="705" + inkscape:window-x="-8" + inkscape:window-y="-8" + inkscape:window-maximized="1" + units="px" /> + <metadata + id="metadata7"> + rdf:RDF + <cc:Work + rdf:about=""> + dc:formatimage/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + dc:title</dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="ã¬ã¤ã¤ã¼ 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-796.36219)"> + <g + id="g4467" + transform="matrix(0.2822222,0,0,0.2822222,0,755.36218)"> + <rect + y="362.76154" + x="2.6432549e-006" + height="689.60077" + width="907.08661" + id="rect4240-2" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="145.27559" + x="7.7024585e-015" + height="254.62881" + width="907.08661" + id="rect4240" + style="opacity:1;fill:#b1b1b1;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="145.27559" + x="2.6432549e-006" + height="37.142868" + width="907.08661" + id="rect3336" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="1015.2194" + x="2.6432549e-006" + height="37.142868" + width="907.08661" + id="rect3336-9" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + transform="matrix(0,-1,1,0,0,0)" + y="0" + x="-1052.3622" + height="37.142868" + width="907.08661" + id="rect3336-9-4" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + transform="matrix(0,-1,1,0,0,0)" + y="869.94373" + x="-1052.3623" + height="37.142868" + width="907.08661" + id="rect3336-9-4-9" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + transform="matrix(0,-1,1,0,0,0)" + y="434.97186" + x="-1052.3623" + height="37.142868" + width="907.08661" + id="rect3336-9-4-8" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="580.2475" + x="2.6432549e-006" + height="37.142868" + width="907.08661" + id="rect3336-9-4-8-9" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="362.76154" + x="2.6432549e-006" + height="37.142868" + width="907.08661" + id="rect3336-9-4-8-9-9" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <rect + y="797.73346" + x="2.6432549e-006" + height="37.142868" + width="907.08661" + id="rect3336-9-4-8-9-9-0" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" /> + <g + id="g4346"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98" + width="147.08661" + height="37.142868" + x="-564.2475" + y="87.599564" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1" + width="118.51518" + height="37.142868" + x="-206.11475" + y="-454.30377" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8" + width="94.285751" + height="37.142868" + x="-181.88531" + y="-516.64795" + transform="scale(-1,-1)" /> + </g> + <g + transform="translate(0,-2)" + id="g4351"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4" + width="85.427803" + height="37.142868" + x="-502.58875" + y="506.45667" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6" + width="118.51518" + height="37.142868" + x="-624.97186" + y="-454.3038" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8-7" + width="117.19617" + height="37.142868" + x="-623.65283" + y="-510.8382" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4-1" + width="72.800896" + height="37.142868" + x="-552.87671" + y="586.50995" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6-6" + width="118.51518" + height="37.142868" + x="-623.65283" + y="-567.37256" + transform="scale(-1,-1)" /> + </g> + <g + id="g4346-9" + transform="translate(0,217.11474)"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-6" + width="147.08661" + height="37.142868" + x="-564.2475" + y="87.599564" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-5" + width="118.51518" + height="37.142868" + x="-206.11475" + y="-454.30377" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8-8" + width="94.285751" + height="37.142868" + x="-181.88531" + y="-516.64795" + transform="scale(-1,-1)" /> + </g> + <g + id="g4346-9-6" + transform="translate(0,434.22944)"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-6-9" + width="147.08661" + height="37.142868" + x="-564.2475" + y="87.599564" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-5-2" + width="118.51518" + height="37.142868" + x="-206.11475" + y="-454.30377" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8-8-5" + width="94.285751" + height="37.142868" + x="-181.88531" + y="-516.64795" + transform="scale(-1,-1)" /> + </g> + <g + transform="translate(0,215.61916)" + id="g4351-9"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4-8" + width="85.427803" + height="37.142868" + x="-502.58875" + y="506.45667" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6-7" + width="118.51518" + height="37.142868" + x="-624.97186" + y="-454.3038" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8-7-3" + width="117.19617" + height="37.142868" + x="-623.65283" + y="-510.8382" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4-1-2" + width="72.800896" + height="37.142868" + x="-552.87671" + y="586.50995" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6-6-4" + width="118.51518" + height="37.142868" + x="-623.65283" + y="-567.37256" + transform="scale(-1,-1)" /> + </g> + <g + transform="translate(0,433.23832)" + id="g4351-1"> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4-15" + width="85.427803" + height="37.142868" + x="-502.58875" + y="506.45667" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6-64" + width="118.51518" + height="37.142868" + x="-624.97186" + y="-454.3038" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-8-7-9" + width="117.19617" + height="37.142868" + x="-623.65283" + y="-510.8382" + transform="scale(-1,-1)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-4-1-5" + width="72.800896" + height="37.142868" + x="-552.87671" + y="586.50995" + transform="matrix(0,-1,1,0,0,0)" /> + <rect + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:10.90200043;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.50243901" + id="rect3336-9-4-98-1-6-6-6" + width="118.51518" + height="37.142868" + x="-623.65283" + y="-567.37256" + transform="scale(-1,-1)" /> + </g> + </g> + </g> +</svg>
Added: trunk/rosapps/applications/sysutils/fontsub/fontsub_res.rc URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/fontsub_res.rc (added) +++ trunk/rosapps/applications/sysutils/fontsub/fontsub_res.rc [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,46 @@ +/* FontSub by Katayama Hirofumi MZ + * + * To the extent possible under law, the person who associated CC0 with + * FontSub has waived all copyright and related or neighboring rights + * to FontSub. + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + */ +#include <windef.h> +#include <winuser.h> +#include <dlgs.h> + +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Font Substitute Editor" +#define REACTOS_STR_INTERNAL_NAME "fontsub" +#define REACTOS_STR_ORIGINAL_FILENAME "fontsub.exe" +#include <reactos/version.rc> + +/* UTF-8 */ +#pragma code_page(65001) + +1 ICON "fontsub.ico" + +2 BITMAP "up.bmp" +3 BITMAP "down.bmp" +4 BITMAP "nil.bmp" + +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif +#ifdef LANGUAGE_JA_JP + #include "lang/ja-JP.rc" +#endif + +1 ACCELERATORS +BEGIN + "O", ID_IMPORT, CONTROL, VIRTKEY + "S", ID_EXPORT, CONTROL, VIRTKEY + "N", ID_NEW, CONTROL, VIRTKEY + "L", ID_RELOAD, CONTROL, VIRTKEY + "U", ID_UPDATE_REGISTRY, CONTROL, VIRTKEY +END
Propchange: trunk/rosapps/applications/sysutils/fontsub/fontsub_res.rc ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/lang/en-US.rc URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/lang/en-US.rc (added) +++ trunk/rosapps/applications/sysutils/fontsub/lang/en-US.rc [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,106 @@ +/* FontSub by Katayama Hirofumi MZ + * + * To the extent possible under law, the person who associated CC0 with + * FontSub has waived all copyright and related or neighboring rights + * to FontSub. + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + */ + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +1 MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Import From...\tCtrl+O", ID_IMPORT + MENUITEM "&Export To...\tCtrl+S", ID_EXPORT + MENUITEM SEPARATOR + MENUITEM "Re&load from Registry\tCtrl+L", ID_RELOAD + MENUITEM "Update &Registry\tCtrl+U", ID_UPDATE_REGISTRY + MENUITEM SEPARATOR + MENUITEM "Open in Reg&edit", ID_OPEN_REGKEY + MENUITEM SEPARATOR + MENUITEM "E&xit\tAlt+F4", ID_EXIT + END + POPUP "&Edit" + BEGIN + MENUITEM "&New Item\tCtrl+N", ID_NEW + MENUITEM SEPARATOR + MENUITEM "&Edit Item\tEnter", ID_EDIT + MENUITEM SEPARATOR + MENUITEM "&Delete Item\tDel", ID_DELETE + END + POPUP "&Help" + BEGIN + MENUITEM "&About...", ID_ABOUT + END +END + +2 MENU +BEGIN + POPUP "Popup" + BEGIN + MENUITEM "&New Item\tCtrl+N", ID_NEW + MENUITEM SEPARATOR + MENUITEM "&Edit Item\tEnter", ID_EDIT + MENUITEM SEPARATOR + MENUITEM "&Delete Item\tDel", ID_DELETE + END +END + +STRINGTABLE +BEGIN + IDS_TITLE, "Font Substitutes Editor" + IDS_FONTNAME, "Font Name" + IDS_SUBSTITUTE, "Substitute" + IDS_ENTERNAME, "(Please enter a font name...)" + IDS_IMPORT, "Import" + IDS_EXPORT, "Export" + IDS_CANTIMPORT, "Could not import." + IDS_CANTEXPORT, "Could not export." + IDS_INPFILTER, "Registry Files (*.reg)|*.reg|All Files (*.*)|*.*|" + IDS_OUTFILTER, "Registry Files (*.reg)|*.reg|" + IDS_QUERYUPDATE, "Substitutes info has been modified. Update registry now?" + IDS_ALREADYEXISTS, "The same name already exists." + IDS_ENTERNAME2, "Enter the font name." + IDS_QUERYDELETE, "Do you really want to delete this item?" + IDS_CANTOPENKEY, "Could not open the registry key." + IDS_REBOOTNOW, "Registry was updated. Reboot Windows now?" + IDS_ABOUT, "FontSub (Font Substitute Editor) Version 0.5\r\nby Katayama Hirofumi MZ and The ReactOS Team\r\n\r\nThis software was released under CC0 1.0 license." +END + +IDD_ADD DIALOG 0, 0, 315, 65 +STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "Add Substitute Item" +FONT 10, "MS Shell Dlg" +BEGIN + CONTROL "Font &Name:", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 5, 55, 15 + CONTROL "", cmb1, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 6, 120, 120 + CONTROL "", cmb3, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 6, 115, 120 + CONTROL "&Substitute:", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 25, 55, 15 + CONTROL "", cmb2, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 26, 120, 120 + CONTROL "", cmb4, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 26, 115, 120 + CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 175, 45, 60, 14 + CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 240, 45, 60, 14 +END + +IDD_EDIT DIALOG 0, 0, 315, 65 +STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "Edit Substitute Item" +FONT 10, "MS Shell Dlg" +BEGIN + CONTROL "Font &Name:", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 5, 55, 15 + CONTROL "", edt1, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_BORDER | WS_TABSTOP, 70, 6, 120, 14 + CONTROL "", cmb3, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 6, 115, 120 + CONTROL "&Substitute:", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 25, 55, 15 + CONTROL "", cmb2, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 26, 120, 120 + CONTROL "", cmb4, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 26, 115, 120 + CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 175, 45, 60, 14 + CONTROL "Cancel", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 240, 45, 60, 14 + CONTROL "&Delete", psh1, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 45, 60, 14 +END
Propchange: trunk/rosapps/applications/sysutils/fontsub/lang/en-US.rc ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/lang/ja-JP.rc URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/lang/ja-JP.rc (added) +++ trunk/rosapps/applications/sysutils/fontsub/lang/ja-JP.rc [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,106 @@ +/* FontSub by Katayama Hirofumi MZ + * + * To the extent possible under law, the person who associated CC0 with + * FontSub has waived all copyright and related or neighboring rights + * to FontSub. + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + */ + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +1 MENU +BEGIN + POPUP "ãã¡ã¤ã«(&F)" + BEGIN + MENUITEM "ã¤ã³ãã¼ã(&I)...\tCtrl+O", ID_IMPORT + MENUITEM "ã¨ã¯ã¹ãã¼ã(&E)...\tCtrl+S", ID_EXPORT + MENUITEM SEPARATOR + MENUITEM "ã¬ã¸ã¹ããªããåèªã¿è¾¼ã¿(&L)\tCtrl+L", ID_RELOAD + MENUITEM "ã¬ã¸ã¹ããªã®æ´æ°(&R)\tCtrl+U", ID_UPDATE_REGISTRY + MENUITEM SEPARATOR + MENUITEM "Regeditã§éã(&E)", ID_OPEN_REGKEY + MENUITEM SEPARATOR + MENUITEM "çµäº(&X)\tAlt+F4", ID_EXIT + END + POPUP "ç·¨é(&E)" + BEGIN + MENUITEM "æ°ããé ç®(&N)\tCtrl+N", ID_NEW + MENUITEM SEPARATOR + MENUITEM "é ç®ã®ç·¨é(&E)\tEnter", ID_EDIT + MENUITEM SEPARATOR + MENUITEM "é ç®ã®åé¤(&D)\tDel", ID_DELETE + END + POPUP "ãã«ã(&H)" + BEGIN + MENUITEM "ãã¼ã¸ã§ã³æ å ±(&A)...", ID_ABOUT + END +END + +2 MENU +BEGIN + POPUP "ãããã¢ãã" + BEGIN + MENUITEM "æ°ããé ç®(&N)\tCtrl+N", ID_NEW + MENUITEM SEPARATOR + MENUITEM "é ç®ã®ç·¨é(&E)\tEnter", ID_EDIT + MENUITEM SEPARATOR + MENUITEM "é ç®ã®åé¤(&D)\tDel", ID_DELETE + END +END + +STRINGTABLE +BEGIN + IDS_TITLE, "ãã©ã³ã代æ¿ã¨ãã£ã¿" + IDS_FONTNAME, "ãã©ã³ãå" + IDS_SUBSTITUTE, "代æ¿å" + IDS_ENTERNAME, "(ãã©ã³ãåãå ¥åãã¦ä¸ãã...)" + IDS_IMPORT, "ã¤ã³ãã¼ã" + IDS_EXPORT, "ã¨ã¯ã¹ãã¼ã" + IDS_CANTIMPORT, "ã¤ã³ãã¼ãã§ãã¾ããã" + IDS_CANTEXPORT, "ã¨ã¯ã¹ãã¼ãã§ãã¾ããã" + IDS_INPFILTER, "ã¬ã¸ã¹ã㪠ãã¡ã¤ã« (*.reg)|*.reg|ãã¹ã¦ã®ãã¡ã¤ã« (*.*)|*.*|" + IDS_OUTFILTER, "ã¬ã¸ã¹ã㪠ãã¡ã¤ã« (*.reg)|*.reg|" + IDS_QUERYUPDATE, "ä»£æ¿æ å ±ã¯å¤æ´ããã¦ãã¾ããã¬ã¸ã¹ããªãæ´æ°ãã¾ããï¼" + IDS_ALREADYEXISTS, "ãã§ã«åãååãåå¨ãã¾ãã" + IDS_ENTERNAME2, "ãã©ã³ãåãå ¥åãã¦ä¸ããã" + IDS_QUERYDELETE, "æ¬å½ã«ãã®é ç®ãåé¤ãããã§ããï¼" + IDS_CANTOPENKEY, "ã¬ã¸ã¹ããªãã¼ãéãã¾ããã§ããã" + IDS_REBOOTNOW, "ã¬ã¸ã¹ããªãæ´æ°ããã¾ãããWindowsãåèµ·åãã¾ããï¼" + IDS_ABOUT, "FontSub (Font Substitute Editor) Version 0.5\r\nby Katayama Hirofumi MZ and The ReactOS Team\r\n\r\nThis software was released under CC0 1.0 license." +END + +IDD_ADD DIALOG 0, 0, 315, 65 +STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "代æ¿é ç®ã追å ãã" +FONT 10, "MS UI Gothic" +BEGIN + CONTROL "ãã©ã³ãå(&N):", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 5, 55, 15 + CONTROL "", cmb1, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 6, 120, 120 + CONTROL "", cmb3, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 6, 115, 120 + CONTROL "代æ¿å(&S):", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 25, 55, 15 + CONTROL "", cmb2, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 26, 120, 120 + CONTROL "", cmb4, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 26, 115, 120 + CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 175, 45, 60, 14 + CONTROL "ãã£ã³ã»ã«", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 240, 45, 60, 14 +END + +IDD_EDIT DIALOG 0, 0, 315, 65 +STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU +CAPTION "代æ¿é ç®ãç·¨éãã" +FONT 10, "MS UI Gothic" +BEGIN + CONTROL "ãã©ã³ãå(&N):", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 5, 55, 15 + CONTROL "", edt1, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_DISABLED | WS_BORDER | WS_TABSTOP, 70, 6, 120, 14 + CONTROL "", cmb3, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 6, 115, 120 + CONTROL "代æ¿å(&S):", -1, "STATIC", SS_RIGHT | SS_CENTERIMAGE | WS_CHILD | WS_VISIBLE | WS_GROUP, 5, 25, 55, 15 + CONTROL "", cmb2, "ComboBoxEx32", CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 70, 26, 120, 120 + CONTROL "", cmb4, "ComboBoxEx32", CBS_DROPDOWNLIST | WS_HSCROLL | WS_VSCROLL | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 195, 26, 115, 120 + CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 175, 45, 60, 14 + CONTROL "ãã£ã³ã»ã«", IDCANCEL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 240, 45, 60, 14 + CONTROL "åé¤(&D)", psh1, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 45, 60, 14 +END
Propchange: trunk/rosapps/applications/sysutils/fontsub/lang/ja-JP.rc ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/nil.bmp URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== Binary file - no diff available.
Propchange: trunk/rosapps/applications/sysutils/fontsub/nil.bmp ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream
Added: trunk/rosapps/applications/sysutils/fontsub/resource.h URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== --- trunk/rosapps/applications/sysutils/fontsub/resource.h (added) +++ trunk/rosapps/applications/sysutils/fontsub/resource.h [iso-8859-1] Sat Mar 18 13:01:18 2017 @@ -0,0 +1,40 @@ +/* FontSub by Katayama Hirofumi MZ + * + * To the extent possible under law, the person who associated CC0 with + * FontSub has waived all copyright and related or neighboring rights + * to FontSub. + * + * You should have received a copy of the CC0 legalcode along with this + * work. If not, see http://creativecommons.org/publicdomain/zero/1.0/. + */ +#define ID_NEW 100 +#define ID_EDIT 101 +#define ID_EXIT 102 +#define ID_UPDATE_REGISTRY 103 +#define ID_DELETE 104 +#define ID_IMPORT 105 +#define ID_EXPORT 106 +#define ID_RELOAD 107 +#define ID_ABOUT 108 +#define ID_OPEN_REGKEY 109 + +#define IDD_ADD 1 +#define IDD_EDIT 2 + +#define IDS_TITLE 1 +#define IDS_FONTNAME 2 +#define IDS_SUBSTITUTE 3 +#define IDS_ENTERNAME 4 +#define IDS_IMPORT 5 +#define IDS_EXPORT 6 +#define IDS_CANTIMPORT 7 +#define IDS_CANTEXPORT 8 +#define IDS_INPFILTER 9 +#define IDS_OUTFILTER 10 +#define IDS_QUERYUPDATE 11 +#define IDS_ALREADYEXISTS 12 +#define IDS_ENTERNAME2 13 +#define IDS_QUERYDELETE 14 +#define IDS_CANTOPENKEY 15 +#define IDS_REBOOTNOW 16 +#define IDS_ABOUT 17
Propchange: trunk/rosapps/applications/sysutils/fontsub/resource.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/applications/sysutils/fontsub/up.bmp URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/applications/sysutils/fonts... ============================================================================== Binary file - no diff available.
Propchange: trunk/rosapps/applications/sysutils/fontsub/up.bmp ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream