Compare commits

..

38 Commits

Author SHA1 Message Date
fb4faf2724 Remove MFC dependency 2018-09-17 09:45:56 +02:00
c75bb7ab94 Add missing #include <algorithm> 2018-09-17 09:44:25 +02:00
e47a882cdc Simplify property sheet inclusion 2018-09-17 09:42:27 +02:00
139a020cac Revert MSI URLs from HTTPS to HTTP
Updater doesn't handle HTTPS. Yet.
2018-09-17 09:38:59 +02:00
3aec40b884 Fix intermediate/output folder creation on nmake register 2018-09-03 13:10:14 +02:00
71043e48f3 Switch to wxWidgets 3.1.1 2018-09-03 13:09:35 +02:00
8a321137a0 Use local wxWidget DLLs 2018-09-03 10:26:30 +02:00
b01d3b9f58 Fix output path for Updater operations 2018-09-01 07:34:47 +02:00
2257e7aa5f Update wxExtend sub-module 2018-09-01 06:48:12 +02:00
9a0dd940c1 Update sub-modules 2018-08-31 14:26:32 +02:00
f4de83bf06 Preset version to 2.0.3 2018-08-28 08:55:21 +02:00
8596e6fb28 Set version to 2.0.2 2018-08-28 08:49:05 +02:00
d5f4b76835 Register en_US language in nmake register
When "Language" setting is absent in registry, the initialization of
wxWidget localization raises asserts.
2018-08-24 14:48:20 +02:00
6c79118505 Update font and database 2018-08-24 13:56:53 +02:00
3d56cdd59b Update submodules 2018-08-24 13:53:32 +02:00
c7677d4a90 Update Amebis URL 2018-08-24 13:41:02 +02:00
613241d5ab Use absolute devenv.com path 2018-08-24 13:40:36 +02:00
bb4304d439 Update submodule 2018-08-24 13:38:31 +02:00
8539e6eb9f Update wxWidgets to 3.0.3 2017-12-22 10:31:59 +01:00
bd914829c5 Update documentation 2017-12-22 10:28:00 +01:00
bc22273385 Update submodules 2017-12-22 10:23:59 +01:00
1d579c922b Extend copyright to 2017 2017-12-22 10:23:48 +01:00
083ee099df Update MSI build config 2017-12-22 10:03:18 +01:00
7a6607827e Update submodule 2017-12-22 10:02:58 +01:00
3839f0f99e Remove lib/MSICALib submodule 2017-12-22 09:59:51 +01:00
e0881da497 Remove lib/atlex submodule 2017-12-22 09:45:00 +01:00
fde9d40105 Main frame no longer deletes child dialogues in destructor, causing after-death wxPersist saving of deleted dialogue states later. 2017-12-22 08:50:22 +01:00
c87d95204e ZRCola::translation_db::Compose fixed to honor inputMax==-1 correctly 2017-12-22 08:47:45 +01:00
ee9db7e262 Reverted to SHA1 Authenticode signatures for Windows XP compatibility 2017-12-22 08:47:26 +01:00
520c5a9b31 ZRCola tutorial is now displayed only if ZRCola feature was installed 2017-12-22 08:46:52 +01:00
a330bd3c62 wxWidget RTL dependencies fixed 2017-12-22 08:46:31 +01:00
9d36cc2d45 Changed to RFC3161 time-stamping and forced SHA1 digest to support Vista 2017-12-22 08:46:04 +01:00
d200094c7d Folder options added 2017-12-22 08:45:14 +01:00
214991e4e3 00ZRCOla fonts replaced with ZRCOla 2017-12-22 08:44:48 +01:00
fdadb29377 Unicode apostrophe changed to ASCII version for simplicity 2017-12-22 08:44:07 +01:00
1bcea13f57 Update sub-modules 2017-12-22 08:42:44 +01:00
2fa697ea74 Font and database updated 2017-12-22 08:09:24 +01:00
c9ba0d97bf Preset version to 2.0.1 2017-12-22 08:01:52 +01:00
208 changed files with 16146 additions and 32990 deletions

5
.gitignore vendored
View File

@ -1,3 +1,6 @@
/.vs /*.opensdf
/*.sdf
/*.suo
/ipch
*.user *.user
temp temp

18
.gitmodules vendored
View File

@ -1,24 +1,18 @@
[submodule "lib/stdex"] [submodule "lib/stdex"]
path = lib/stdex path = lib/stdex
url = https://git.amebis.si/Amebis/stdex.git url = https://github.com/Amebis/stdex.git
[submodule "lib/WinStd"] [submodule "lib/WinStd"]
path = lib/WinStd path = lib/WinStd
url = https://git.amebis.si/Amebis/WinStd.git url = https://github.com/Amebis/WinStd.git
[submodule "lib/wxExtend"] [submodule "lib/wxExtend"]
path = lib/wxExtend path = lib/wxExtend
url = https://git.amebis.si/Amebis/wxExtend.git url = https://github.com/Amebis/wxExtend.git
[submodule "MSI/MSIBuild"] [submodule "MSI/MSIBuild"]
path = MSI/MSIBuild path = MSI/MSIBuild
url = https://git.amebis.si/Amebis/MSIBuild.git url = https://github.com/Amebis/MSIBuild.git
[submodule "MSI/MSICA"] [submodule "MSI/MSICA"]
path = MSI/MSICA path = MSI/MSICA
url = https://git.amebis.si/Amebis/MSICA.git url = https://github.com/Amebis/MSICA.git
[submodule "Updater"] [submodule "Updater"]
path = Updater path = Updater
url = https://git.amebis.si/Amebis/Updater.git url = https://github.com/Amebis/Updater.git
[submodule "lib/oatpp"]
path = lib/oatpp
url = https://github.com/oatpp/oatpp.git
[submodule "lib/oatpp-swagger"]
path = lib/oatpp-swagger
url = https://github.com/oatpp/oatpp-swagger.git

View File

@ -1,18 +1,17 @@
# Localization of ZRCola # Localization of ZRCola
In order to get ZRCola experience in your language the following resources should be translated: In order to get ZRCola experience in your language the following resources should be translated:
1. [ZRCola Application](https://www.transifex.com/amebis/zrcola/app/) 1. [ZRCola](https://poeditor.com/join/project/NTidhEPdDM)
2. [ZRCola Database](https://www.transifex.com/amebis/zrcola/database/) 2. [ZRCola-zrcdb](https://poeditor.com/join/project/QBuYsTwk0d)
3. [ZRCola Core](https://www.transifex.com/amebis/zrcola/core/) 3. [libZRColaUI](https://poeditor.com/join/project/vrnIvk5IOM)
4. [Updater](https://www.transifex.com/amebis/updater/updater/) and [Updater UpdCheck](https://www.transifex.com/amebis/updater/updcheck/) 4. [Updater](https://poeditor.com/join/project/oDK4ktH3ZV)
5. [wxExtend](https://www.transifex.com/amebis/wxextend/wxextend/) 5. [wxExtend](https://poeditor.com/join/project/YmsdlC3CBv)
6. Setup 6. Setup
- [ZRCola Setup](https://www.transifex.com/amebis/zrcola/setup/) - [MSIBuildUI](https://poeditor.com/join/project/ikxWBlq1o5)
- [MSIBuild UI](https://www.transifex.com/amebis/msibuild/ui/) - [MSIBuildCore](https://poeditor.com/join/project/RSCSsz9fXi)
- [MSIBuild Core](https://www.transifex.com/amebis/msibuild/core/) - [MSICALib](https://poeditor.com/join/project/cKP0wwBrHU)
- [MSICALib](https://www.transifex.com/amebis/msicalib/msicalib/) - [MSICA](https://poeditor.com/join/project/gCNPagUQvn)
- [MSICA](https://www.transifex.com/amebis/msica/msica/)
## General Guidelines ## General Guidelines

@ -1 +1 @@
Subproject commit b8364dea81f39b321d726317a9dcbf6b13a455e0 Subproject commit 951fbec79dc7ad60026d0a4c10ca329bad7d3458

@ -1 +1 @@
Subproject commit f989fdc827d8fa731977d1771097cf038a50e145 Subproject commit 04d84baa78b904a0c1202e51480729e07916e6be

5
MSI/MSM/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
/*.log
/Microsoft_VC100_CRT_x64.msm
/Microsoft_VC100_CRT_x86.msm
/Microsoft_VC100_DebugCRT_x64.msm
/Microsoft_VC100_DebugCRT_x86.msm

View File

@ -0,0 +1,2 @@
Win\System64\msvcp100.dll
Win\System64\msvcr100.dll

View File

@ -0,0 +1,24 @@
#
# Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
[splosno]
jezik=0
deli=featZRCola featUpdCheck
[parametri]

View File

@ -0,0 +1,2 @@
Win\System\msvcp100.dll
Win\System\msvcr100.dll

View File

@ -0,0 +1,24 @@
#
# Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
[splosno]
jezik=0
deli=featZRCola featUpdCheck
[parametri]

View File

@ -0,0 +1,2 @@
Win\System64\msvcp100d.dll
Win\System64\msvcr100d.dll

View File

@ -0,0 +1,24 @@
#
# Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
[splosno]
jezik=0
deli=featZRCola featUpdCheck
[parametri]

View File

@ -0,0 +1,2 @@
Win\System\msvcp100d.dll
Win\System\msvcr100d.dll

View File

@ -0,0 +1,24 @@
#
# Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
[splosno]
jezik=0
deli=featZRCola featUpdCheck
[parametri]

Binary file not shown.

View File

@ -1,5 +1,21 @@
# SPDX-License-Identifier: GPL-3.0-or-later #
# Copyright © 1991-2022 Amebis # Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
!INCLUDE "..\..\include\MSIBuildCfg.mak" !INCLUDE "..\..\include\MSIBuildCfg.mak"
!INCLUDE "..\MSIBuild\Makefile" !INCLUDE "..\MSIBuild\Makefile"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

9
MSI/ZRCola/wxWidgets/.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
/*-1.idt
/*-2.idt
/*-2.idtx
/*.Binary-1
/*.Binary-2
/*.Icon-1
/*.Icon-2
/*.lst
/*.msm

View File

@ -0,0 +1,94 @@
#
# Copyright 1991-2017 Amebis
#
# This file is part of ZRCola.
#
# ZRCola is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ZRCola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
#
!INCLUDE "..\..\..\include\MSIBuildCfg.mak"
# Note: When changing WXWIDGETS_VER or WXWIDGETS_COMPILER, the DLL filenames will change.
# Then, you MUST change the component GUIDs as well.
WXWIDGETS_VER=311
WXWIDGETS_COMPILER=_vc100
!IF "$(PLAT)" == "x64"
WXWIDGETS_PLAT=_x64
!ELSE
WXWIDGETS_PLAT=
!ENDIF
!IF "$(CFG)" == "Debug"
WXWIDGETS_CFG=ud
!ELSE
WXWIDGETS_CFG=u
!ENDIF
######################################################################
# Component
All :: "$(LANG).$(PLAT).$(CFG).Component-1.idt"
"$(LANG).$(PLAT).$(CFG).Component-1.idt" : "Makefile" "..\..\..\include\MSIBuildCfg.mak"
-if exist $@ del /f /q $@
move /y << $@ > NUL
Component ComponentId Directory_ Attributes Condition KeyPath
s$(MSIBUILD_LENGTH_ID) S38 s$(MSIBUILD_LENGTH_ID) i2 S255 S$(MSIBUILD_LENGTH_ID)
Component Component
!IF "$(PLAT)" == "Win32"
compwxbase.dll.Win32 {4C7F5A16-5B74-47D5-A405-57C7BD96F090} ZRCOLABINDIR 0 filewxbase.dll.Win32
compwxbase_net.dll.Win32 {00534942-B21F-4401-BFE4-C7677F4BE3E5} ZRCOLABINDIR 0 filewxbase_net.dll.Win32
compwxbase_xml.dll.Win32 {71E30748-DD22-4D8B-B26F-60C5150D9AAE} ZRCOLABINDIR 0 filewxbase_xml.dll.Win32
compwxmsw_core.dll.Win32 {FB8D46B9-86DC-4590-8F0A-8294F6A45E6A} ZRCOLABINDIR 0 filewxwxmsw_core.dll.Win32
compwxmsw_adv.dll.Win32 {7B7DB31D-1760-493A-BBE9-35237A6EF9E0} ZRCOLABINDIR 0 filewxmsw_adv.dll.Win32
compwxmsw_aui.dll.Win32 {49CF9864-63B6-4F43-8EC7-7294B966B419} ZRCOLABINDIR 0 filewxmsw_aui.dll.Win32
!ENDIF
!IF "$(PLAT)" == "x64"
compwxbase.dll.x64 {905D8859-BFD2-410A-81DB-93231088C066} ZRCOLABINDIR 256 filewxbase.dll.x64
compwxbase_net.dll.x64 {8A0A49C8-DAEB-4983-8E8D-9DE30AE1D0B6} ZRCOLABINDIR 256 filewxbase_net.dll.x64
compwxbase_xml.dll.x64 {24A5F181-EFE7-4542-8AAB-1D21DB74E954} ZRCOLABINDIR 256 filewxbase_xml.dll.x64
compwxmsw_core.dll.x64 {F5B3F6E6-4FFB-4A79-A794-202D6F93F716} ZRCOLABINDIR 256 filewxwxmsw_core.dll.x64
compwxmsw_adv.dll.x64 {D7722FB9-59BB-498F-93C3-78451471A023} ZRCOLABINDIR 256 filewxmsw_adv.dll.x64
compwxmsw_aui.dll.x64 {FB703979-0E3D-458E-82DD-DAC33329FA9D} ZRCOLABINDIR 256 filewxmsw_aui.dll.x64
!ENDIF
<<NOKEEP
######################################################################
# File
All :: "$(LANG).$(PLAT).$(CFG).File-1.idt"
"$(LANG).$(PLAT).$(CFG).File-1.idt" : "Makefile" "..\..\..\include\MSIBuildCfg.mak"
-if exist $@ del /f /q $@
move /y << $@ > NUL
File Component_ FileName FileSize Version Language Attributes Sequence
s$(MSIBUILD_LENGTH_ID) s$(MSIBUILD_LENGTH_ID) l255 i4 S$(MSIBUILD_LENGTH_ID) S20 I2 i2
File File
filewxbase.dll.$(PLAT) compwxbase.dll.$(PLAT) WXBASE~1.DLL|wxbase$(WXWIDGETS_VER)$(WXWIDGETS_CFG)$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
filewxbase_net.dll.$(PLAT) compwxbase_net.dll.$(PLAT) WXBASE~2.DLL|wxbase$(WXWIDGETS_VER)$(WXWIDGETS_CFG)_net$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
filewxbase_xml.dll.$(PLAT) compwxbase_xml.dll.$(PLAT) WXBASE~3.DLL|wxbase$(WXWIDGETS_VER)$(WXWIDGETS_CFG)_xml$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
filewxwxmsw_core.dll.$(PLAT) compwxmsw_core.dll.$(PLAT) WXMSW3~1.DLL|wxmsw$(WXWIDGETS_VER)$(WXWIDGETS_CFG)_core$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
filewxmsw_adv.dll.$(PLAT) compwxmsw_adv.dll.$(PLAT) WXMSW3~2.DLL|wxmsw$(WXWIDGETS_VER)$(WXWIDGETS_CFG)_adv$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
filewxmsw_aui.dll.$(PLAT) compwxmsw_aui.dll.$(PLAT) WXMSW3~3.DLL|wxmsw$(WXWIDGETS_VER)$(WXWIDGETS_CFG)_aui$(WXWIDGETS_COMPILER)$(WXWIDGETS_PLAT).dll 0 0 512 1
<<NOKEEP
######################################################################
# Build MSM module!
######################################################################
!INCLUDE "..\..\MSIBuild\MSM.mak"

BIN
MSILocal.mak Normal file

Binary file not shown.

BIN
Makefile

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,47 +6,30 @@ A Microsoft Windows application for composing texts using a wide range of Slavic
http://zrcola.zrc-sazu.si/en/ http://zrcola.zrc-sazu.si/en/
## Binaries for Download ## Binaries for Download
https://prenos.amebis.si/ZRCola/ https://www.amebis.si/prenos/ZRCola/
## Building ## Building
### Building Environment Requirements ### Building Environment Requirements
- Microsoft Windows Vista or later - Microsoft Windows Vista or later
- Microsoft Visual Studio 2017 - Microsoft Visual Studio 2010 SP1
- _sed.exe_ and _grep.exe_ - _sed.exe_ and _grep.exe_
- Command line utilities from Microsoft Windows SDK Bin folder: distributed with Visual Studio, add Bin folder to path manually. - Command line utilities from Microsoft Windows SDK Bin folder: distributed with Visual Studio, add Bin folder to path manually.
- Additional command line utilities from project's bin folder: add bin folder to path. The source code is provided on request. - Additional command line utilities from project's bin folder: add bin folder to path. The source code is provided on request.
- wxWidgets 3.1.1 - set `WXWIN` environment variable to the folder where wxWidgets include and lib files are located. Official binary builds are required.
### wxWidgets
ZRCola is using wxWidgets static libraries. You have to compile static libraries yourself.
#### Compiling wxWidgets Win32 static libraries
1. Start _x86 Native Tools Command Prompt for VS 2017_
2. Change working folder to `build\msw`
3. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 COMPILER_VERSION=141`
4. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 COMPILER_VERSION=141 BUILD=release`
#### Compiling wxWidgets x64 static libraries
1. Start _x64 Native Tools Command Prompt for VS 2017_
2. Change working folder to `build\msw`
3. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 COMPILER_VERSION=141 TARGET_CPU=X64`
4. Run: `nmake /f makefile.vc /ls RUNTIME_LIBS=static SHARED=0 COMPILER_VERSION=141 TARGET_CPU=X64 BUILD=release`
#### Specifying wxWidgets path
ZRCola compilation references wxWidgets libraries using `WXWIN` environment variable. Please set it to wxWidgets folder (e.g. `C:\SDK\wxWidgets`).
### Digital Signing of Build Outputs ### Digital Signing of Build Outputs
In order to have the build process digitally sign output files, one should provide the following: In order to have the build process digitally sign output files, one should provide the following:
1. A signing certificate installed in the current user's certificate store. 1. A signing certificate installed in the current user's certificate store.
2. The following variables in the environment: 2. The following variables in the environment:
- `ManifestCertificateThumbprint` - set the value to certificate's SHA1 thumbprint (hexadecimal, without spaces, e.g. `f61b973226c502a732d24f41aa85e192b009e7c0`). - `ManifestCertificateThumbprint` - set the value to certificate's SHA1 thumbprint (hexadecimal, without spaces, i.e. `bc0d8da45f9eeefcbe4e334e1fc262804df88d7e`).
- `ManifestTimestampRFC3161Url` - set the value to URL used to perform RFC3161 timestamp signature (e.g. `http://time.certum.pl`). In order to perform timestamp signing successfully, the computer running the build should be online and able to access this URL. - `ManifestTimestampUrl` - set the value to URL used to perform timestamp signature (i.e. `http://timestamp.verisign.com/scripts/timstamp.dll`). In order to perform timestamp signing successfully, the computer running the build should be online and able to access this URL.
Please note that only Release builds are configured for timestamp signing. Debug configurations do not attempt to timestamp sign the resulting DLL and EXE files in order to speed up the building process and enable offline building. Please note that only Release builds are configured for timestamp signing. Debug configurations do not attempt to timestamp sign the resulting DLL and EXE files in order to speed up the building process and enable offline building.
### Building ### Building
Use Microsoft NMAKE to build the project. The resulting files can be found in output subfolder. Open _x64 Native Tools Command Prompt for VS 2017_ for building. Use Microsoft NMAKE to build the project. The resulting files can be found in output subfolder.
- `nmake Clean` Delete all intermediate and output files. - `nmake Clean` Delete all intermediate and output files.
- `nmake Setup` Build a release version of project and release MSI setup files. - `nmake Setup` Build a release version of project and release MSI setup files.
@ -54,11 +37,7 @@ Use Microsoft NMAKE to build the project. The resulting files can be found in ou
- `nmake Register` Build a debug version of project, install fonts (reboot required), and Start Menu shortcuts. For development purposes only! - `nmake Register` Build a debug version of project, install fonts (reboot required), and Start Menu shortcuts. For development purposes only!
- `nmake Unregister` Remove Start Menu shortcuts, and fonts. For development purposes only! - `nmake Unregister` Remove Start Menu shortcuts, and fonts. For development purposes only!
The `/ls` flag can be appended to the commands above to reduce NMAKE's verbosity. You can combine multiple targets (e.g. nmake Unregister Clean). Please, see NMAKE reference for further reading. The `/ls` flag can be appended to the commands above to reduce NMAKE's verbosity. You can combine multiple targets (i.e. nmake Unregister Clean). Please, see NMAKE reference for further reading.
## Building and installing ZRCola webservice
ZRCola is also available as a Linux web-service. See [ZRColaWS/README.md](ZRColaWS/README.md) for instructions.
## Translating ZRCola ## Translating ZRCola
Instructions how to translate ZRCola to your language can be found [here](LOCALIZATION.md). Instructions how to translate ZRCola to your language can be found [here](LOCALIZATION.md).

@ -1 +1 @@
Subproject commit a98ef46c5d38dec796dcb78f48240c17f743e3af Subproject commit c160d4b9ebe586a199ae879c18aeb6f3ccfb0539

View File

@ -1,13 +1,11 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio Version 16 # Visual Studio 2010
VisualStudioVersion = 16.0.29728.190
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZRCola", "ZRCola\ZRCola.vcxproj", "{CD9E4170-92DD-440E-980C-D15F62032249}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZRCola", "ZRCola\ZRCola.vcxproj", "{CD9E4170-92DD-440E-980C-D15F62032249}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxExtend", "lib\wxExtend\build\wxExtendLib.vcxproj", "{D3E29951-D9F5-486D-A167-20AE8E90B1FA}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wxExtend", "lib\wxExtend\build\wxExtendDll-10.0.vcxproj", "{A3A36689-AC35-4026-93DA-A3BA0C0E767C}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CFEBC17E-C840-4507-BDE6-1EF5B52DDCC5}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CFEBC17E-C840-4507-BDE6-1EF5B52DDCC5}"
ProjectSection(SolutionItems) = preProject ProjectSection(SolutionItems) = preProject
@ -18,89 +16,86 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libZRCola", "lib\libZRCola\
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libZRColaUI", "lib\libZRColaUI\build\libZRColaUI.vcxproj", "{C0A84BD2-3870-4CD6-B281-0AB322E3C579}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libZRColaUI", "lib\libZRColaUI\build\libZRColaUI.vcxproj", "{C0A84BD2-3870-4CD6-B281-0AB322E3C579}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "stdex", "lib\stdex\build\stdex-10.0.vcxproj", "{518777CC-0A59-4415-A12A-82751ED75343}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Updater", "Updater\Updater\build\Updater.vcxproj", "{990D8CF9-4457-4DC0-AA18-4968EF434741}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Updater", "Updater\Updater\build\Updater.vcxproj", "{990D8CF9-4457-4DC0-AA18-4968EF434741}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinStd", "lib\WinStd\build\WinStd-10.0.vcxproj", "{47399D91-7EB9-41DE-B521-514BA5DB0C43}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64 Debug|x64 = Debug|x64
Release|ARM64 = Release|ARM64
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
Release|x64 = Release|x64 Release|x64 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|ARM64.ActiveCfg = Debug|ARM64
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|ARM64.Build.0 = Debug|ARM64
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|Win32.ActiveCfg = Debug|Win32 {CD9E4170-92DD-440E-980C-D15F62032249}.Debug|Win32.ActiveCfg = Debug|Win32
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|Win32.Build.0 = Debug|Win32 {CD9E4170-92DD-440E-980C-D15F62032249}.Debug|Win32.Build.0 = Debug|Win32
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|x64.ActiveCfg = Debug|x64 {CD9E4170-92DD-440E-980C-D15F62032249}.Debug|x64.ActiveCfg = Debug|x64
{CD9E4170-92DD-440E-980C-D15F62032249}.Debug|x64.Build.0 = Debug|x64 {CD9E4170-92DD-440E-980C-D15F62032249}.Debug|x64.Build.0 = Debug|x64
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|ARM64.ActiveCfg = Release|ARM64
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|ARM64.Build.0 = Release|ARM64
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|Win32.ActiveCfg = Release|Win32 {CD9E4170-92DD-440E-980C-D15F62032249}.Release|Win32.ActiveCfg = Release|Win32
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|Win32.Build.0 = Release|Win32 {CD9E4170-92DD-440E-980C-D15F62032249}.Release|Win32.Build.0 = Release|Win32
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|x64.ActiveCfg = Release|x64 {CD9E4170-92DD-440E-980C-D15F62032249}.Release|x64.ActiveCfg = Release|x64
{CD9E4170-92DD-440E-980C-D15F62032249}.Release|x64.Build.0 = Release|x64 {CD9E4170-92DD-440E-980C-D15F62032249}.Release|x64.Build.0 = Release|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Debug|Win32.ActiveCfg = Debug|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|ARM64.Build.0 = Debug|ARM64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Debug|Win32.Build.0 = Debug|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|Win32.ActiveCfg = Debug|Win32 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Debug|x64.ActiveCfg = Debug|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|Win32.Build.0 = Debug|Win32 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Debug|x64.Build.0 = Debug|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|x64.ActiveCfg = Debug|x64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Release|Win32.ActiveCfg = Release|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Debug|x64.Build.0 = Debug|x64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Release|Win32.Build.0 = Release|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|ARM64.ActiveCfg = Release|ARM64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Release|x64.ActiveCfg = Release|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|ARM64.Build.0 = Release|ARM64 {A3A36689-AC35-4026-93DA-A3BA0C0E767C}.Release|x64.Build.0 = Release|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|Win32.ActiveCfg = Release|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|Win32.Build.0 = Release|Win32
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|x64.ActiveCfg = Release|x64
{D3E29951-D9F5-486D-A167-20AE8E90B1FA}.Release|x64.Build.0 = Release|x64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|ARM64.ActiveCfg = Debug|ARM64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|ARM64.Build.0 = Debug|ARM64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|Win32.ActiveCfg = Debug|Win32 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|Win32.ActiveCfg = Debug|Win32
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|Win32.Build.0 = Debug|Win32 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|Win32.Build.0 = Debug|Win32
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|x64.ActiveCfg = Debug|x64 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|x64.ActiveCfg = Debug|x64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|x64.Build.0 = Debug|x64 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Debug|x64.Build.0 = Debug|x64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|ARM64.ActiveCfg = Release|ARM64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|ARM64.Build.0 = Release|ARM64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|Win32.ActiveCfg = Release|Win32 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|Win32.ActiveCfg = Release|Win32
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|Win32.Build.0 = Release|Win32 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|Win32.Build.0 = Release|Win32
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|x64.ActiveCfg = Release|x64 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|x64.ActiveCfg = Release|x64
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|x64.Build.0 = Release|x64 {3C61929E-7289-4101-8D0A-DA22D6E1AEA8}.Release|x64.Build.0 = Release|x64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|ARM64.ActiveCfg = Debug|ARM64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|ARM64.Build.0 = Debug|ARM64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|Win32.ActiveCfg = Debug|Win32 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|Win32.ActiveCfg = Debug|Win32
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|Win32.Build.0 = Debug|Win32 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|Win32.Build.0 = Debug|Win32
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|x64.ActiveCfg = Debug|x64 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|x64.ActiveCfg = Debug|x64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|x64.Build.0 = Debug|x64 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Debug|x64.Build.0 = Debug|x64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|ARM64.ActiveCfg = Release|ARM64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|ARM64.Build.0 = Release|ARM64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|Win32.ActiveCfg = Release|Win32 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|Win32.ActiveCfg = Release|Win32
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|Win32.Build.0 = Release|Win32 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|Win32.Build.0 = Release|Win32
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|x64.ActiveCfg = Release|x64 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|x64.ActiveCfg = Release|x64
{C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|x64.Build.0 = Release|x64 {C0A84BD2-3870-4CD6-B281-0AB322E3C579}.Release|x64.Build.0 = Release|x64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|ARM64.ActiveCfg = Debug|ARM64 {518777CC-0A59-4415-A12A-82751ED75343}.Debug|Win32.ActiveCfg = Debug|Win32
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|ARM64.Build.0 = Debug|ARM64 {518777CC-0A59-4415-A12A-82751ED75343}.Debug|Win32.Build.0 = Debug|Win32
{518777CC-0A59-4415-A12A-82751ED75343}.Debug|x64.ActiveCfg = Debug|x64
{518777CC-0A59-4415-A12A-82751ED75343}.Debug|x64.Build.0 = Debug|x64
{518777CC-0A59-4415-A12A-82751ED75343}.Release|Win32.ActiveCfg = Release|Win32
{518777CC-0A59-4415-A12A-82751ED75343}.Release|Win32.Build.0 = Release|Win32
{518777CC-0A59-4415-A12A-82751ED75343}.Release|x64.ActiveCfg = Release|x64
{518777CC-0A59-4415-A12A-82751ED75343}.Release|x64.Build.0 = Release|x64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|Win32.ActiveCfg = Debug|Win32 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|Win32.ActiveCfg = Debug|Win32
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|Win32.Build.0 = Debug|Win32 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|Win32.Build.0 = Debug|Win32
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|x64.ActiveCfg = Debug|x64 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|x64.ActiveCfg = Debug|x64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|x64.Build.0 = Debug|x64 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Debug|x64.Build.0 = Debug|x64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|ARM64.ActiveCfg = Release|ARM64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|ARM64.Build.0 = Release|ARM64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|Win32.ActiveCfg = Release|Win32 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|Win32.ActiveCfg = Release|Win32
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|Win32.Build.0 = Release|Win32 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|Win32.Build.0 = Release|Win32
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|x64.ActiveCfg = Release|x64 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|x64.ActiveCfg = Release|x64
{990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|x64.Build.0 = Release|x64 {990D8CF9-4457-4DC0-AA18-4968EF434741}.Release|x64.Build.0 = Release|x64
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Debug|Win32.ActiveCfg = Debug|Win32
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Debug|Win32.Build.0 = Debug|Win32
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Debug|x64.ActiveCfg = Debug|x64
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Debug|x64.Build.0 = Debug|x64
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Release|Win32.ActiveCfg = Release|Win32
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Release|Win32.Build.0 = Release|Win32
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Release|x64.ActiveCfg = Release|x64
{47399D91-7EB9-41DE-B521-514BA5DB0C43}.Release|x64.Build.0 = Release|x64
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{D3E29951-D9F5-486D-A167-20AE8E90B1FA} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5} {A3A36689-AC35-4026-93DA-A3BA0C0E767C} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
{3C61929E-7289-4101-8D0A-DA22D6E1AEA8} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5} {3C61929E-7289-4101-8D0A-DA22D6E1AEA8} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
{C0A84BD2-3870-4CD6-B281-0AB322E3C579} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5} {C0A84BD2-3870-4CD6-B281-0AB322E3C579} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
{518777CC-0A59-4415-A12A-82751ED75343} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
{990D8CF9-4457-4DC0-AA18-4968EF434741} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5} {990D8CF9-4457-4DC0-AA18-4968EF434741} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
EndGlobalSection {47399D91-7EB9-41DE-B521-514BA5DB0C43} = {6D85AD6A-69D6-40EB-BF0C-7495479DDCE5}
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EECB5329-0607-4D77-8BC0-48BD8C08BEF9}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

Binary file not shown.

File diff suppressed because it is too large Load Diff

14
ZRCola/ZRCola.props Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\lib\wxExtend\include;..\Updater\Updater\include;..\lib\stdex\include;..\lib\WinStd\include;..\lib\libZRCola\include;..\lib\libZRColaUI\include</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup />
</Project>

Binary file not shown.

View File

@ -1,10 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|ARM64">
<Configuration>Debug</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
@ -13,10 +9,6 @@
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
<Platform>x64</Platform> <Platform>x64</Platform>
</ProjectConfiguration> </ProjectConfiguration>
<ProjectConfiguration Include="Release|ARM64">
<Configuration>Release</Configuration>
<Platform>ARM64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32"> <ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration> <Configuration>Release</Configuration>
<Platform>Win32</Platform> <Platform>Win32</Platform>
@ -31,45 +23,62 @@
<RootNamespace>ZRCola</RootNamespace> <RootNamespace>ZRCola</RootNamespace>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Debug'">
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Release'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Platform)'=='ARM64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<WindowsSDKDesktopARM64Support>true</WindowsSDKDesktopARM64Support> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" /> <ImportGroup Label="ExtensionSettings">
<ImportGroup Label="PropertySheets"> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\$(Platform).props" /> <Import Project="..\include\Win32.props" />
<Import Project="..\include\$(Configuration).props" /> <Import Project="..\include\Debug.props" />
<Import Project="ZRCola.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\x64.props" />
<Import Project="..\include\Debug.props" />
<Import Project="ZRCola.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\Win32.props" />
<Import Project="..\include\Release.props" />
<Import Project="ZRCola.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\x64.props" />
<Import Project="..\include\Release.props" />
<Import Project="ZRCola.props" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\lib\wxExtend\include;..\Updater\Updater\include;..\lib\stdex\include;..\lib\WinStd\include;..\lib\libZRCola\include;..\lib\libZRColaUI\include</AdditionalIncludeDirectories>
</ClCompile>
<Manifest>
<EnableDpiAwareness>true</EnableDpiAwareness>
</Manifest>
<ResourceCompile>
<AdditionalIncludeDirectories>..\Updater\Updater\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="pch.cpp"> <ClCompile Include="stdafx.cpp">
<PrecompiledHeader>Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile> </ClCompile>
<ClCompile Include="zrcolaabout.cpp" /> <ClCompile Include="zrcolaabout.cpp" />
<ClCompile Include="zrcolaapp.cpp" /> <ClCompile Include="zrcolaapp.cpp" />
@ -82,11 +91,10 @@
<ClCompile Include="zrcolagui.cpp" /> <ClCompile Include="zrcolagui.cpp" />
<ClCompile Include="zrcolakeyhndlr.cpp" /> <ClCompile Include="zrcolakeyhndlr.cpp" />
<ClCompile Include="zrcolasettings.cpp" /> <ClCompile Include="zrcolasettings.cpp" />
<ClCompile Include="zrcolatranseq.cpp" />
<ClCompile Include="zrcolaupdater.cpp" /> <ClCompile Include="zrcolaupdater.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="pch.h" /> <ClInclude Include="stdafx.h" />
<ClInclude Include="zrcolaabout.h" /> <ClInclude Include="zrcolaabout.h" />
<ClInclude Include="zrcolaapp.h" /> <ClInclude Include="zrcolaapp.h" />
<ClInclude Include="zrcolachrcatpnl.h" /> <ClInclude Include="zrcolachrcatpnl.h" />
@ -98,7 +106,6 @@
<ClInclude Include="zrcolagui.h" /> <ClInclude Include="zrcolagui.h" />
<ClInclude Include="zrcolakeyhndlr.h" /> <ClInclude Include="zrcolakeyhndlr.h" />
<ClInclude Include="zrcolasettings.h" /> <ClInclude Include="zrcolasettings.h" />
<ClInclude Include="zrcolatranseq.h" />
<ClInclude Include="zrcolaupdater.h" /> <ClInclude Include="zrcolaupdater.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -108,8 +115,11 @@
<ProjectReference Include="..\lib\libZRCola\build\libZRCola.vcxproj"> <ProjectReference Include="..\lib\libZRCola\build\libZRCola.vcxproj">
<Project>{3c61929e-7289-4101-8d0a-da22d6e1aea8}</Project> <Project>{3c61929e-7289-4101-8d0a-da22d6e1aea8}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\lib\wxExtend\build\wxExtendLib.vcxproj"> <ProjectReference Include="..\lib\WinStd\build\WinStd-10.0.vcxproj">
<Project>{D3E29951-D9F5-486D-A167-20AE8E90B1FA}</Project> <Project>{47399d91-7eb9-41de-b521-514ba5db0c43}</Project>
</ProjectReference>
<ProjectReference Include="..\lib\wxExtend\build\wxExtendDll-10.0.vcxproj">
<Project>{a3a36689-ac35-4026-93da-a3ba0c0e767c}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\Updater\Updater\build\Updater.vcxproj"> <ProjectReference Include="..\Updater\Updater\build\Updater.vcxproj">
<Project>{990d8cf9-4457-4dc0-aa18-4968ef434741}</Project> <Project>{990d8cf9-4457-4dc0-aa18-4968ef434741}</Project>
@ -118,8 +128,6 @@
<ItemGroup> <ItemGroup>
<None Include="locale\ZRCola.pot" /> <None Include="locale\ZRCola.pot" />
<None Include="res\char_select.ico" /> <None Include="res\char_select.ico" />
<None Include="res\copy_composed_and_return.ico" />
<None Include="res\copy_decomposed_and_return.ico" />
<None Include="res\edit_copy.ico" /> <None Include="res\edit_copy.ico" />
<None Include="res\edit_cut.ico" /> <None Include="res\edit_cut.ico" />
<None Include="res\edit_paste.ico" /> <None Include="res\edit_paste.ico" />
@ -129,9 +137,7 @@
<None Include="res\send_composed.ico" /> <None Include="res\send_composed.ico" />
<None Include="res\send_decomposed.ico" /> <None Include="res\send_decomposed.ico" />
<None Include="res\zrcola.ico" /> <None Include="res\zrcola.ico" />
<None Include="res\ZRCola.fbp"> <None Include="ZRCola.fbp" />
<SubType>Designer</SubType>
</None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="ZRCola.rc" /> <ResourceCompile Include="ZRCola.rc" />
@ -141,9 +147,6 @@
<POCompile Include="locale\ru_RU.po" /> <POCompile Include="locale\ru_RU.po" />
<POCompile Include="locale\sl_SI.po" /> <POCompile Include="locale\sl_SI.po" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="res\composition.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
<Import Project="..\include\xgettext.targets" /> <Import Project="..\include\xgettext.targets" />

View File

@ -19,7 +19,7 @@
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="pch.cpp"> <ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="zrcolaapp.cpp"> <ClCompile Include="zrcolaapp.cpp">
@ -58,12 +58,9 @@
<ClCompile Include="zrcolachrreq.cpp"> <ClCompile Include="zrcolachrreq.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="zrcolatranseq.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="pch.h"> <ClInclude Include="stdafx.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="zrcolaapp.h"> <ClInclude Include="zrcolaapp.h">
@ -102,9 +99,6 @@
<ClInclude Include="zrcolachrreq.h"> <ClInclude Include="zrcolachrreq.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="zrcolatranseq.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="res\zrcola.ico"> <None Include="res\zrcola.ico">
@ -128,7 +122,7 @@
<None Include="res\edit_paste.ico"> <None Include="res\edit_paste.ico">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
<None Include="res\ZRCola.fbp"> <None Include="ZRCola.fbp">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
<None Include="res\char_select.ico"> <None Include="res\char_select.ico">
@ -143,12 +137,6 @@
<None Include="res\navigate_forward.ico"> <None Include="res\navigate_forward.ico">
<Filter>Resource Files</Filter> <Filter>Resource Files</Filter>
</None> </None>
<None Include="res\copy_composed_and_return.ico">
<Filter>Resource Files</Filter>
</None>
<None Include="res\copy_decomposed_and_return.ico">
<Filter>Resource Files</Filter>
</None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="ZRCola.rc"> <ResourceCompile Include="ZRCola.rc">
@ -166,9 +154,4 @@
<Filter>Resource Files\Localization</Filter> <Filter>Resource Files\Localization</Filter>
</POCompile> </POCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Image Include="res\composition.ico">
<Filter>Resource Files</Filter>
</Image>
</ItemGroup>
</Project> </Project>

View File

@ -2,30 +2,28 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ZRCola\n" "Project-Id-Version: ZRCola\n"
"POT-Creation-Date: 2022-02-17 13:32+0100\n" "POT-Creation-Date: 2016-10-18 10:07+0200\n"
"PO-Revision-Date: 2019-04-01 19:38+0200\n" "PO-Revision-Date: 2016-05-13 15:52+0200\n"
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n" "Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n" "Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
"Language: sl_SI\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 1.8.10\n"
"X-Poedit-Basepath: ..\n" "X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: _\n" "X-Poedit-KeywordsList: _\n"
"X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPath-0: .\n"
"X-Poedit-SearchPathExcluded-0: res/zrcolagui.*\n"
#: zrcolaabout.cpp:17 #: zrcolaabout.cpp:31
#, c-format #, c-format
msgid "© 2004-%s ZRC SAZU" msgid "© 2004-%s ZRC SAZU"
msgstr "" msgstr ""
#: zrcolaapp.cpp:60 zrcolafrm.cpp:118 zrcolagui.cpp:232 zrcolagui.cpp:943 #: zrcolaapp.cpp:71 zrcolafrm.cpp:90 zrcolagui.cpp:874 zrcolagui.h:104
#: zrcolagui.h:119 MSIBuild/en_US.ARM64.Debug.Feature-2.idtx:4
#: MSIBuild/en_US.ARM64.Debug.Shortcut-2.idtx:4
#: MSIBuild/en_US.ARM64.Release.Feature-2.idtx:4
#: MSIBuild/en_US.ARM64.Release.Shortcut-2.idtx:4
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4 #: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4 #: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4 #: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4
@ -37,651 +35,528 @@ msgstr ""
msgid "ZRCola" msgid "ZRCola"
msgstr "" msgstr ""
#: zrcolachrreq.cpp:35 zrcolagui.cpp:1073 #: zrcolachrreq.cpp:49 zrcolagui.cpp:1004
msgid "Character" msgid "Character"
msgstr "" msgstr ""
#: zrcolachrreq.cpp:44 zrcolagui.cpp:1101 #: zrcolachrreq.cpp:58 zrcolagui.cpp:1025
msgid "Context" msgid "Context"
msgstr "" msgstr ""
#: zrcolachrreq.cpp:50 zrcolagui.h:376 #: zrcolachrreq.cpp:64 zrcolagui.h:363
msgid "Request a New Character" msgid "Request a New Character"
msgstr "" msgstr ""
#: zrcolachrslct.cpp:75 #: zrcolachrslct.cpp:46 zrcolachrslct.cpp:226 zrcolachrslct.cpp:677
msgid "Too many digits in Unicode."
msgstr ""
#: zrcolachrslct.cpp:75 zrcolachrslct.cpp:93
msgid "Validation conflict"
msgstr ""
#: zrcolachrslct.cpp:93
#, c-format
msgid "Invalid character in Unicode found: %c"
msgstr ""
#: zrcolachrslct.cpp:201 zrcolachrslct.cpp:377 zrcolachrslct.cpp:874
msgid "▸ Search Options" msgid "▸ Search Options"
msgstr "" msgstr ""
#: zrcolachrslct.cpp:315 #: zrcolachrslct.cpp:164
msgid ", " msgid ", "
msgstr "" msgstr ""
#: zrcolachrslct.cpp:380 zrcolachrslct.cpp:871 #: zrcolachrslct.cpp:229 zrcolachrslct.cpp:674
msgid "▾ Search Options" msgid "▾ Search Options"
msgstr "" msgstr ""
#: zrcolafrm.cpp:84 #: zrcolafrm.cpp:141
msgid "No Translation" msgid ""
"ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality "
"will not be available."
msgstr "" msgstr ""
#: zrcolafrm.cpp:97 #: zrcolafrm.cpp:141 zrcolafrm.cpp:143
msgid "Custom Translation..."
msgstr ""
#: zrcolafrm.cpp:217
msgid "ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."
msgstr ""
#: zrcolafrm.cpp:217 zrcolafrm.cpp:219
msgid "Warning" msgid "Warning"
msgstr "" msgstr ""
#: zrcolafrm.cpp:219 #: zrcolafrm.cpp:143
msgid "ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available." msgid ""
"ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality "
"will not be available."
msgstr "" msgstr ""
#: zrcolafrm.cpp:513 #: zrcolafrm.cpp:351
msgid "http://zrcola.zrc-sazu.si/en/info/instructions/" msgid "http://zrcola.zrc-sazu.si/en/info/instructions/"
msgstr "" msgstr ""
#: zrcolafrm.cpp:538 #: zrcolafrm.cpp:375
msgid "http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf" msgid ""
"http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/"
"ZRCola_tipkovnica_Jun2016.pdf"
msgstr "" msgstr ""
#: zrcolagui.cpp:42 #: zrcolagui.cpp:36
msgid "E&xit" msgid "E&xit"
msgstr "" msgstr ""
#: zrcolagui.cpp:42 #: zrcolagui.cpp:36
msgid "Quit this program" msgid "Quit this program"
msgstr "" msgstr ""
#: zrcolagui.cpp:45 #: zrcolagui.cpp:39
msgid "&Program" msgid "&Program"
msgstr "" msgstr ""
#: zrcolagui.cpp:78 #: zrcolagui.cpp:72
msgid "Select &All" msgid "Select &All"
msgstr "" msgstr ""
#: zrcolagui.cpp:78 #: zrcolagui.cpp:72
msgid "Select all text" msgid "Select all text"
msgstr "" msgstr ""
#: zrcolagui.cpp:84 #: zrcolagui.cpp:78
msgid "Find C&haracter..." msgid "Find C&haracter..."
msgstr "" msgstr ""
#: zrcolagui.cpp:84 zrcolagui.cpp:224 #: zrcolagui.cpp:78 zrcolagui.cpp:180
msgid "Toggle character search to select character to insert into text" msgid "Display character search to select character to insert into text"
msgstr "" msgstr ""
#: zrcolagui.cpp:90 #: zrcolagui.cpp:89
msgid "&Send Composed" msgid "&Send Composed"
msgstr "" msgstr ""
#: zrcolagui.cpp:90 zrcolagui.cpp:226 #: zrcolagui.cpp:89 zrcolagui.cpp:182
msgid "Send composed text to source window" msgid "Send composed text to source window"
msgstr "" msgstr ""
#: zrcolagui.cpp:99 #: zrcolagui.cpp:98
msgid "Copy Composed and &Return"
msgstr ""
#: zrcolagui.cpp:99
msgid "Copy composed text to clipboard and return focus to source window"
msgstr ""
#: zrcolagui.cpp:108
msgid "Send &Decomposed" msgid "Send &Decomposed"
msgstr "" msgstr ""
#: zrcolagui.cpp:108 zrcolagui.cpp:228 #: zrcolagui.cpp:98 zrcolagui.cpp:184
msgid "Send decomposed text to source window" msgid "Send decomposed text to source window"
msgstr "" msgstr ""
#: zrcolagui.cpp:117 #: zrcolagui.cpp:107
msgid "Copy Decomposed and Re&turn"
msgstr ""
#: zrcolagui.cpp:117
msgid "Copy decomposed text to clipboard and return focus to source window"
msgstr ""
#: zrcolagui.cpp:126
msgid "Abort (De)composition" msgid "Abort (De)composition"
msgstr "" msgstr ""
#: zrcolagui.cpp:126 #: zrcolagui.cpp:107
msgid "Abort composition and return focus to source window" msgid "Abort composition and return focus to source window"
msgstr "" msgstr ""
#: zrcolagui.cpp:138 #: zrcolagui.cpp:118
msgid "(De)&composition"
msgstr ""
#: zrcolagui.cpp:139
msgid "&None"
msgstr ""
#: zrcolagui.cpp:139
msgid "No character (De)composition"
msgstr ""
#: zrcolagui.cpp:142
msgid "&ZRCola"
msgstr ""
#: zrcolagui.cpp:142
msgid "ZRCola character (De)composition"
msgstr ""
#: zrcolagui.cpp:145
msgid "&Unicode"
msgstr ""
#: zrcolagui.cpp:145
msgid "Unicode character (De)composition"
msgstr ""
#: zrcolagui.cpp:151
msgid "Tra&nslation"
msgstr ""
#: zrcolagui.cpp:156
msgid "&PUA Warning"
msgstr ""
#: zrcolagui.cpp:156 zrcolagui.cpp:243
msgid "Highlight Private Use Area Characters"
msgstr ""
#: zrcolagui.cpp:162
msgid "&Settings..." msgid "&Settings..."
msgstr "" msgstr ""
#: zrcolagui.cpp:162 #: zrcolagui.cpp:118
msgid "Open program configuration dialog" msgid "Open program configuration dialog"
msgstr "" msgstr ""
#: zrcolagui.cpp:165 #: zrcolagui.cpp:121
msgid "&Edit" msgid "&Edit"
msgstr "" msgstr ""
#: zrcolagui.cpp:169 #: zrcolagui.cpp:125
msgid "&Edit Toolbar" msgid "&Edit Toolbar"
msgstr "" msgstr ""
#: zrcolagui.cpp:169 #: zrcolagui.cpp:125
msgid "Toggle edit toolbar" msgid "Toggle edit toolbar"
msgstr "" msgstr ""
#: zrcolagui.cpp:173 #: zrcolagui.cpp:129
msgid "&Compose Toolbar" msgid "&Compose Toolbar"
msgstr "" msgstr ""
#: zrcolagui.cpp:173 #: zrcolagui.cpp:129
msgid "Toggle compose toolbar" msgid "Toggle compose toolbar"
msgstr "" msgstr ""
#: zrcolagui.cpp:179 #: zrcolagui.cpp:135
msgid "Character Catalo&g" msgid "Character Catalo&g"
msgstr "" msgstr ""
#: zrcolagui.cpp:179 #: zrcolagui.cpp:135
msgid "Toggle character catalog panel" msgid "Toggle character catalog panel"
msgstr "" msgstr ""
#: zrcolagui.cpp:182 #: zrcolagui.cpp:138
msgid "&View" msgid "&View"
msgstr "" msgstr ""
#: zrcolagui.cpp:186 #: zrcolagui.cpp:142
msgid "&Instructions..." msgid "&Instructions..."
msgstr "" msgstr ""
#: zrcolagui.cpp:186 #: zrcolagui.cpp:142
msgid "Open a web site with product instructions" msgid "Open a web site with product instructions"
msgstr "" msgstr ""
#: zrcolagui.cpp:190 #: zrcolagui.cpp:146
msgid "Keyboard &Shortcuts..." msgid "Keyboard &Shortcuts..."
msgstr "" msgstr ""
#: zrcolagui.cpp:190 #: zrcolagui.cpp:146
msgid "Open a list of keyboard shortcuts" msgid "Open a list of keyboard shortcuts"
msgstr "" msgstr ""
#: zrcolagui.cpp:196 #: zrcolagui.cpp:152
msgid "&Request a new character..." msgid "&Request a new character..."
msgstr "" msgstr ""
#: zrcolagui.cpp:196 #: zrcolagui.cpp:152
msgid "Submit a request to ZRC to add a new character" msgid "Submit a request to ZRC to add a new character"
msgstr "" msgstr ""
#: zrcolagui.cpp:200 #: zrcolagui.cpp:156
msgid "Check for &Updates..." msgid "Check for &Updates..."
msgstr "" msgstr ""
#: zrcolagui.cpp:200 #: zrcolagui.cpp:156
msgid "Check online for product update" msgid "Check online for product update"
msgstr "" msgstr ""
#: zrcolagui.cpp:206 #: zrcolagui.cpp:162
msgid "&About..." msgid "&About..."
msgstr "" msgstr ""
#: zrcolagui.cpp:209 #: zrcolagui.cpp:165
msgid "&Help" msgid "&Help"
msgstr "" msgstr ""
#: zrcolagui.cpp:214 #: zrcolagui.cpp:170
msgid "Cut" msgid "Cut"
msgstr "" msgstr ""
#: zrcolagui.cpp:214 #: zrcolagui.cpp:170
msgid "Cut selection" msgid "Cut selection"
msgstr "" msgstr ""
#: zrcolagui.cpp:216 #: zrcolagui.cpp:172
msgid "Copy" msgid "Copy"
msgstr "" msgstr ""
#: zrcolagui.cpp:216 #: zrcolagui.cpp:172
msgid "Copy selection" msgid "Copy selection"
msgstr "" msgstr ""
#: zrcolagui.cpp:218 #: zrcolagui.cpp:174
msgid "Paste" msgid "Paste"
msgstr "" msgstr ""
#: zrcolagui.cpp:218 #: zrcolagui.cpp:174
msgid "Paste selection" msgid "Paste selection"
msgstr "" msgstr ""
#: zrcolagui.cpp:221 #: zrcolagui.cpp:177
msgid "Edit" msgid "Edit"
msgstr "" msgstr ""
#: zrcolagui.cpp:224 #: zrcolagui.cpp:180
msgid "Find Character" msgid "Find Character"
msgstr "" msgstr ""
#: zrcolagui.cpp:226 #: zrcolagui.cpp:182
msgid "Send Composed" msgid "Send Composed"
msgstr "" msgstr ""
#: zrcolagui.cpp:228 #: zrcolagui.cpp:184
msgid "Send Decomposed" msgid "Send Decomposed"
msgstr "" msgstr ""
#: zrcolagui.cpp:232 #: zrcolagui.cpp:187
msgid "No (De)composition"
msgstr ""
#: zrcolagui.cpp:232
msgid "Unicode"
msgstr ""
#: zrcolagui.cpp:243
msgid "PUA Warning"
msgstr ""
#: zrcolagui.cpp:246
msgid "Compose" msgid "Compose"
msgstr "" msgstr ""
#: zrcolagui.cpp:250 #: zrcolagui.cpp:191
msgid "Character Catalog" msgid "Character Catalog"
msgstr "" msgstr ""
#: zrcolagui.cpp:254 #: zrcolagui.cpp:195
msgid "(De)Composer" msgid "(De)Composer"
msgstr "" msgstr ""
#: zrcolagui.cpp:297 #: zrcolagui.cpp:234
msgid "Decomposed Text" msgid "Decomposed Text"
msgstr "" msgstr ""
#: zrcolagui.cpp:317 #: zrcolagui.cpp:254
msgid "Decomposed Unicode Dump" msgid "Decomposed Unicode Dump"
msgstr "" msgstr ""
#: zrcolagui.cpp:344 #: zrcolagui.cpp:281
msgid "Composed Text" msgid "Composed Text"
msgstr "" msgstr ""
#: zrcolagui.cpp:364 #: zrcolagui.cpp:301
msgid "Composed Unicode Dump" msgid "Composed Unicode Dump"
msgstr "" msgstr ""
#: zrcolagui.cpp:418 #: zrcolagui.cpp:355
msgid "Select category to display" msgid "Select category to display"
msgstr "" msgstr ""
#: zrcolagui.cpp:452 #: zrcolagui.cpp:389
msgid "Show &All" msgid "Show &All"
msgstr "" msgstr ""
#: zrcolagui.cpp:453 #: zrcolagui.cpp:390
msgid "Toggle display of less frequent characters" msgid "Toggle display of less frequent characters"
msgstr "" msgstr ""
#: zrcolagui.cpp:493 #: zrcolagui.cpp:430
msgid "&Browse" msgid "&Browse"
msgstr "" msgstr ""
#: zrcolagui.cpp:500 #: zrcolagui.cpp:437
msgid "Full or partial terms from Unicode character description (in English) to search for" msgid ""
"Full or partial terms from Unicode character description (in English) to "
"search for"
msgstr "" msgstr ""
#: zrcolagui.cpp:504 #: zrcolagui.cpp:441
msgid "Search Options" msgid "Search Options"
msgstr "" msgstr ""
#: zrcolagui.cpp:505 #: zrcolagui.cpp:442
msgid "Shows/hides additional search options" msgid "Shows/hides additional search options"
msgstr "" msgstr ""
#: zrcolagui.cpp:517 #: zrcolagui.cpp:454
msgid "List of Unicode character categories to search in" msgid "List of Unicode character categories to search in"
msgstr "" msgstr ""
#: zrcolagui.cpp:524 #: zrcolagui.cpp:461
msgid "All" msgid "All"
msgstr "" msgstr ""
#: zrcolagui.cpp:525 #: zrcolagui.cpp:462
msgid "Select all categories" msgid "Select all categories"
msgstr "" msgstr ""
#: zrcolagui.cpp:529 #: zrcolagui.cpp:466
msgid "None" msgid "None"
msgstr "" msgstr ""
#: zrcolagui.cpp:530 #: zrcolagui.cpp:467
msgid "Clear category selection" msgid "Clear category selection"
msgstr "" msgstr ""
#: zrcolagui.cpp:534 #: zrcolagui.cpp:471
msgid "Invert" msgid "Invert"
msgstr "" msgstr ""
#: zrcolagui.cpp:535 #: zrcolagui.cpp:472
msgid "Invert category selection" msgid "Invert category selection"
msgstr "" msgstr ""
#: zrcolagui.cpp:574 #: zrcolagui.cpp:511
msgid "Character search results" msgid "Character search results"
msgstr "" msgstr ""
#: zrcolagui.cpp:584 #: zrcolagui.cpp:521
msgid "Re&cently Used" msgid "Re&cently Used"
msgstr "" msgstr ""
#: zrcolagui.cpp:612 #: zrcolagui.cpp:549
msgid "List of recently inserted characters" msgid "List of recently inserted characters"
msgstr "" msgstr ""
#: zrcolagui.cpp:626 #: zrcolagui.cpp:563
msgid "Preview" msgid "Preview"
msgstr "" msgstr ""
#: zrcolagui.cpp:631 #: zrcolagui.cpp:568
msgid "U+" msgid "U+"
msgstr "" msgstr ""
#: zrcolagui.cpp:636 #: zrcolagui.cpp:573
msgid "Unicode hexadecimal code" msgid "Unicode hexadecimal code"
msgstr "" msgstr ""
#: zrcolagui.cpp:641 #: zrcolagui.cpp:578
msgid "Keyboard shortcut in Composer window" msgid "Keyboard shortcut in Composer window"
msgstr "" msgstr ""
#: zrcolagui.cpp:676 #: zrcolagui.cpp:613
msgid "Character preview" msgid "Character preview"
msgstr "" msgstr ""
#: zrcolagui.cpp:681 #: zrcolagui.cpp:618
msgid "Unicode character description" msgid "Unicode character description"
msgstr "" msgstr ""
#: zrcolagui.cpp:686 #: zrcolagui.cpp:623
msgid "Character tags" msgid "Character tags"
msgstr "" msgstr ""
#: zrcolagui.cpp:691 #: zrcolagui.cpp:628
msgid "Unicode character category" msgid "Unicode character category"
msgstr "" msgstr ""
#: zrcolagui.cpp:698 #: zrcolagui.cpp:635
msgid "« Back" msgid "« Back"
msgstr "" msgstr ""
#: zrcolagui.cpp:700 #: zrcolagui.cpp:637
msgid "To previously viewed character" msgid "To previously viewed character"
msgstr "" msgstr ""
#: zrcolagui.cpp:704 #: zrcolagui.cpp:641
msgid "Forward »" msgid "Forward »"
msgstr "" msgstr ""
#: zrcolagui.cpp:706 #: zrcolagui.cpp:643
msgid "To following viewed character" msgid "To following viewed character"
msgstr "" msgstr ""
#: zrcolagui.cpp:717 #: zrcolagui.cpp:654
msgid "Re&lated" msgid "Re&lated"
msgstr "" msgstr ""
#: zrcolagui.cpp:744 #: zrcolagui.cpp:681
msgid "List of related characters" msgid "List of related characters"
msgstr "" msgstr ""
#: zrcolagui.cpp:763 #: zrcolagui.cpp:770
msgid "&Insert"
msgstr ""
#: zrcolagui.cpp:767
msgid "Insert character into decomposed text"
msgstr ""
#: zrcolagui.cpp:843
msgid "" msgid ""
"Some character native to specific language you are working with should not decompose to primitives.\n" "Some character native to specific language you are working with should not "
"decompose to primitives.\n"
"For optimal decomposition you should set the language correctly." "For optimal decomposition you should set the language correctly."
msgstr "" msgstr ""
#: zrcolagui.cpp:847 #: zrcolagui.cpp:774
msgid "Select language &automatically according to selected keyboard" msgid "Select language &automatically according to selected keyboard"
msgstr "" msgstr ""
#: zrcolagui.cpp:850 #: zrcolagui.cpp:777
msgid "&Manually select the language from the list below:" msgid "&Manually select the language from the list below:"
msgstr "" msgstr ""
#: zrcolagui.cpp:861 #: zrcolagui.cpp:789
msgid "Text Language" msgid "Text Language"
msgstr "" msgstr ""
#: zrcolagui.cpp:866 #: zrcolagui.cpp:794
msgid "" msgid ""
"ZRCola can be launched every time you log in to your computer.\n" "ZRCola can be launched every time you log in to your computer.\n"
"It will be available on the system tray and via registered shortcuts Win+F5 and Win+F6." "It will be available on the system tray and via registered shortcuts Win+F5 "
"and Win+F6."
msgstr "" msgstr ""
#: zrcolagui.cpp:870 #: zrcolagui.cpp:798
msgid "Start ZRCola &automatically on logon" msgid "Start ZRCola &automatically on logon"
msgstr "" msgstr ""
#: zrcolagui.cpp:876 #: zrcolagui.cpp:805
msgid "Startup" msgid "Startup"
msgstr "" msgstr ""
#: zrcolagui.cpp:954 #: zrcolagui.cpp:885
msgid "" msgid ""
"Program and Website Editor: Janoš Ježovnik\n" "Program and Website Editor: Janoš Ježovnik\n"
"Development: Amebis, d. o. o., Kamnik\n" "Development: Amebis, d. o. o., Kamnik\n"
"Translation into English: Janoš Ježovnik\n" "Translation into English: Janoš Ježovnik\n"
"Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia Plotnikova\n" "Translation into Russian language: Domen Krvina, Silvo Torkar, Anastasia "
"Plotnikova\n"
"Development and maintenance of the original program (20042015): Peter Weiss" "Development and maintenance of the original program (20042015): Peter Weiss"
msgstr "" msgstr ""
#: zrcolagui.cpp:962 #: zrcolagui.cpp:893
msgid "zrcola.zrc-sazu.si" msgid "zrcola.zrc-sazu.si"
msgstr "" msgstr ""
#: zrcolagui.cpp:968 #: zrcolagui.cpp:899
msgid "Texts made using ZRCola have to include in a footnote or some other appropriate part of the publication the note below:" msgid ""
"Texts made using ZRCola have to include in a footnote or some other "
"appropriate part of the publication the note below:"
msgstr "" msgstr ""
#: zrcolagui.cpp:972 #: zrcolagui.cpp:903
msgid "This text was written using the ZRCola input system (http://zrcola.zrc-sazu.si), developed at the Science and Research Centre of SAZU in Ljubljana (http://www.zrc-sazu.si) by Peter Weiss." msgid ""
"This text was written using the ZRCola input system (http://zrcola.zrc-sazu."
"si), developed at the Science and Research Centre of SAZU in Ljubljana "
"(http://www.zrc-sazu.si) by Peter Weiss."
msgstr "" msgstr ""
#: zrcolagui.cpp:1013 #: zrcolagui.cpp:944
msgid "Log" msgid "Log"
msgstr "" msgstr ""
#: zrcolagui.cpp:1029 #: zrcolagui.cpp:960
msgid "Quit and &Update..." msgid "Quit and &Update..."
msgstr "" msgstr ""
#: zrcolagui.cpp:1031 #: zrcolagui.cpp:962
msgid "Exit this program and launch product update" msgid "Exit this program and launch product update"
msgstr "" msgstr ""
#: zrcolagui.cpp:1035 #: zrcolagui.cpp:966
msgid "&Close" msgid "&Close"
msgstr "" msgstr ""
#: zrcolagui.cpp:1036 #: zrcolagui.cpp:967
msgid "Close this window" msgid "Close this window"
msgstr "" msgstr ""
#: zrcolagui.cpp:1075 #: zrcolagui.cpp:1006
msgid "Enter the &character you would like to request:" msgid "Enter the &character you would like to request:"
msgstr "" msgstr ""
#: zrcolagui.cpp:1089 #: zrcolagui.cpp:1013
msgid "Decomposed character to request" msgid "Decomposed character to request"
msgstr "" msgstr ""
#: zrcolagui.cpp:1093 #: zrcolagui.cpp:1017
msgid "" msgid ""
"Please, use the decomposed form.\n" "Please, use the decomposed form.\n"
"You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste it from the Decomposed window." "You can use ZRCola keyboard shortcuts to enter the character or Copy&&Paste "
"it from the Decomposed window."
msgstr "" msgstr ""
#: zrcolagui.cpp:1103 #: zrcolagui.cpp:1027
msgid "The &context, examples or description why and where the character is required:" msgid ""
"The &context, examples or description why and where the character is "
"required:"
msgstr "" msgstr ""
#: zrcolagui.cpp:1109 #: zrcolagui.cpp:1033
msgid "Additional notes for character request" msgid "Additional notes for character request"
msgstr "" msgstr ""
#: zrcolagui.cpp:1116 #: zrcolagui.cpp:1040
msgid "" msgid ""
"After clicking OK button, your e-mail application should open allowing you to submit the new character request to ZRCola Editor.\n" "After clicking OK button, your e-mail application should open allowing you "
"Your e-mail application might not display all the characters correctly, but the Editor will be able to read them correctly anyway." "to submit the new character request to ZRCola Editor.\n"
"Your e-mail application might not display all the characters correctly, but "
"the Editor will be able to read them correctly anyway."
msgstr "" msgstr ""
#: zrcolagui.cpp:1158 #: zrcolakeyhndlr.cpp:44
msgid "Translation"
msgstr ""
#: zrcolagui.cpp:1160
msgid "" msgid ""
"ZRCola offers multiple text translations that can be arranged in a sequence.\n" "INS key is pressed. Type the Unicode code of desired character now (up to "
"Please select desired translations and the order they are applied." "four hexadecimal digits: 0-9, A-F), then release INS."
msgstr "" msgstr ""
#: zrcolagui.cpp:1170 #: zrcolasettings.cpp:93
msgid "A&vailable:"
msgstr ""
#: zrcolagui.cpp:1185
msgid "→"
msgstr ""
#: zrcolagui.cpp:1188
msgid "←"
msgstr ""
#: zrcolagui.cpp:1197
msgid "&Selected:"
msgstr ""
#: zrcolagui.cpp:1215
msgid "↑"
msgstr ""
#: zrcolagui.cpp:1218
msgid "↓"
msgstr ""
#: zrcolagui.h:260
msgid "Character Search"
msgstr ""
#: zrcolagui.h:296
msgid "Settings"
msgstr ""
#: zrcolagui.h:322
msgid "About ZRCola"
msgstr ""
#: zrcolagui.h:347 zrcolaupdater.cpp:81
msgid "Product Update"
msgstr ""
#: zrcolagui.h:418
msgid "Custom Translation Sequence"
msgstr ""
#: zrcolakeyhndlr.cpp:30
msgid "INS key is pressed. Type the Unicode code of desired character now (up to four hexadecimal digits: 0-9, A-F), then release INS."
msgstr ""
#: zrcolasettings.cpp:73
msgid "Start ZRCola automatically on logon" msgid "Start ZRCola automatically on logon"
msgstr "" msgstr ""
#: zrcolatranseq.cpp:49 #: zrcolaupdater.cpp:94
#, c-format
msgid "Unknown translation (%u)"
msgstr ""
#: zrcolaupdater.cpp:81
msgid "" msgid ""
"This program will now close and the upgrade will be launched.\n" "This program will now close and the upgrade will be launched.\n"
"Are you sure?" "Are you sure?"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:4 #: zrcolaupdater.cpp:94 zrcolagui.h:334
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:10 msgid "Product Update"
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:15 msgstr ""
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:4
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:10 #: zrcolagui.h:246
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:15 msgid "Character Search"
msgstr ""
#: zrcolagui.h:283
msgid "Settings"
msgstr ""
#: zrcolagui.h:309
msgid "About ZRCola"
msgstr ""
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:4
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:10
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:15
@ -694,11 +569,9 @@ msgstr ""
#: MSIBuild/en_US.x64.Release.Control-2.idtx:4 #: MSIBuild/en_US.x64.Release.Control-2.idtx:4
#: MSIBuild/en_US.x64.Release.Control-2.idtx:10 #: MSIBuild/en_US.x64.Release.Control-2.idtx:10
#: MSIBuild/en_US.x64.Release.Control-2.idtx:15 #: MSIBuild/en_US.x64.Release.Control-2.idtx:15
msgid "UIHeader.bmp" msgid "binUIHeader.bmp"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:5
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:5
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:5
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:5 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:5
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:5 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:5
@ -706,39 +579,33 @@ msgstr ""
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting" msgid "[DlgTitleFont][SimpleProductName] Tutorial : Starting"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:6
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:6
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:6
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:6 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:6
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:6 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:6
#: MSIBuild/en_US.x64.Release.Control-2.idtx:6 #: MSIBuild/en_US.x64.Release.Control-2.idtx:6
msgid "tutorial1.bmp" msgid "bintutorial1.bmp"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:7
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:7
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:7
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:7 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:7
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:7 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:7
#: MSIBuild/en_US.x64.Release.Control-2.idtx:7 #: MSIBuild/en_US.x64.Release.Control-2.idtx:7
msgid "When configured, ZRCola starts at system startup and runs in the background. If needed, it can be brought up by pressing the combination Win+F5." msgid ""
"When configured, ZRCola starts at system startup and runs in the background. "
"If needed, it can be brought up by pressing the combination Win+F5."
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:8
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:8
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:8
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:8 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:8
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:8 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:8
#: MSIBuild/en_US.x64.Release.Control-2.idtx:8 #: MSIBuild/en_US.x64.Release.Control-2.idtx:8
msgid "IMPORTANT: Upon pressing the combination Win+F5 the program memorises the location of the cursor in the text. If ZRCola is brought to the foreground without using the aforementioned combination of keys, the program won't know where to insert the special characters!" msgid ""
"IMPORTANT: Upon pressing the combination Win+F5 the program memorises the "
"location of the cursor in the text. If ZRCola is brought to the foreground "
"without using the aforementioned combination of keys, the program won't know "
"where to insert the special characters!"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:9
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:14
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:19
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:9
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:14
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:19
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:9
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:14
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:19
@ -754,8 +621,6 @@ msgstr ""
msgid "&Continue" msgid "&Continue"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:11
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:11
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:11
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:11 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:11
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:11 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:11
@ -763,26 +628,23 @@ msgstr ""
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition" msgid "[DlgTitleFont][SimpleProductName] Tutorial : Composition"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:12
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:12
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:12
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:12 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:12
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:12 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:12
#: MSIBuild/en_US.x64.Release.Control-2.idtx:12 #: MSIBuild/en_US.x64.Release.Control-2.idtx:12
msgid "tutorial2.bmp" msgid "bintutorial2.bmp"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:13
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:13
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:13
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:13 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:13
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:13 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:13
#: MSIBuild/en_US.x64.Release.Control-2.idtx:13 #: MSIBuild/en_US.x64.Release.Control-2.idtx:13
msgid "The string of basic and substitute characters is entered into the upper input window of the program. In the window below the resulted special characters are displayed. To insert them in the text, the F5 key is used." msgid ""
"The string of basic and substitute characters is entered into the upper "
"input window of the program. In the window below the resulted special "
"characters are displayed. To insert them in the text, the F5 key is used."
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:16
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:16
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:16
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:16 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:16
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:16 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:16
@ -790,28 +652,22 @@ msgstr ""
msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters" msgid "[DlgTitleFont][SimpleProductName] Tutorial : Entering Characters"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:17
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:17
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:17
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:17 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:17
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:17 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:17
#: MSIBuild/en_US.x64.Release.Control-2.idtx:17 #: MSIBuild/en_US.x64.Release.Control-2.idtx:17
msgid "tutorial3.bmp" msgid "bintutorial3.bmp"
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Control-2.idtx:18
#: MSIBuild/en_US.ARM64.Release.Control-2.idtx:18
#: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18 #: MSIBuild/en_US.Win32.Debug.Control-2.idtx:18
#: MSIBuild/en_US.Win32.Release.Control-2.idtx:18 #: MSIBuild/en_US.Win32.Release.Control-2.idtx:18
#: MSIBuild/en_US.x64.Debug.Control-2.idtx:18 #: MSIBuild/en_US.x64.Debug.Control-2.idtx:18
#: MSIBuild/en_US.x64.Release.Control-2.idtx:18 #: MSIBuild/en_US.x64.Release.Control-2.idtx:18
msgid "Characters can be entered using keyboard shortcuts, the character catalogue (F4) or the character finding tool (F8)." msgid ""
"Characters can be entered using keyboard shortcuts, the character catalogue "
"(F4) or the character finding tool (F8)."
msgstr "" msgstr ""
#: MSIBuild/en_US.ARM64.Debug.Feature-2.idtx:4
#: MSIBuild/en_US.ARM64.Debug.Shortcut-2.idtx:4
#: MSIBuild/en_US.ARM64.Release.Feature-2.idtx:4
#: MSIBuild/en_US.ARM64.Release.Shortcut-2.idtx:4
#: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4 #: MSIBuild/en_US.Win32.Debug.Feature-2.idtx:4
#: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4 #: MSIBuild/en_US.Win32.Debug.Shortcut-2.idtx:4
#: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4 #: MSIBuild/en_US.Win32.Release.Feature-2.idtx:4

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
*/
#include "pch.h"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,422 +0,0 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 26 2018)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#pragma once
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/cshelp.h>
#include <wx/intl.h>
class wxZRColaCharGrid;
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/aui/aui.h>
#include <wx/aui/auibar.h>
#include <wx/choice.h>
class wxZRColaCharacterCatalogPanel;
class wxZRColaComposerPanel;
#include <wx/statusbr.h>
#include <wx/frame.h>
#include <wx/textctrl.h>
#include <wx/sizer.h>
#include <wx/statbox.h>
#include <wx/panel.h>
#include <wx/splitter.h>
#include <wx/timer.h>
#include <wx/grid.h>
#include <wx/checkbox.h>
#include <wx/srchctrl.h>
#include <wx/hyperlink.h>
#include <wx/checklst.h>
#include <wx/stattext.h>
#include <wx/button.h>
#include <wx/dialog.h>
#include <wx/radiobut.h>
#include <wx/listbox.h>
#include <wx/listbook.h>
#include <wx/listctrl.h>
#include <wx/statbmp.h>
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaFrameBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaFrameBase : public wxFrame
{
private:
protected:
enum
{
wxID_CHARACTER_SELECTOR = 1000,
wxID_SEND_DESTINATION,
wxID_COPY_DESTINATION_AND_RETURN,
wxID_SEND_SOURCE,
wxID_COPY_SOURCE_AND_RETURN,
wxID_SEND_ABORT,
wxID_COMPOSITION_NONE,
wxID_COMPOSITION_ZRCOLA,
wxID_COMPOSITION_UNICODE,
wxID_WARN_PUA,
wxID_SETTINGS,
wxID_TOOLBAR_EDIT,
wxID_TOOLBAR_TRANSLATE,
wxID_PANEL_CHRGRPS,
wxID_HELP_INSTRUCTIONS,
wxID_HELP_SHORTCUTS,
wxID_HELP_REQCHAR,
wxID_HELP_UPDATE
};
wxMenuBar* m_menubar;
wxMenu* m_menuProgram;
wxMenu* m_menuEdit;
wxMenuItem* m_menuItemCompositionNone;
wxMenuItem* m_menuItemCompositionZRCola;
wxMenuItem* m_menuItemCompositionUnicode;
wxMenu* m_menuTranslationSeq;
wxMenuItem* m_menuItemWarnPUA;
wxMenu* m_menuView;
wxMenu* m_menuHelp;
wxAuiToolBar* m_toolbarEdit;
wxAuiToolBarItem* m_toolEditCut;
wxAuiToolBarItem* m_toolEditCopy;
wxAuiToolBarItem* m_toolEditPaste;
wxAuiToolBar* m_toolbarTranslate;
wxAuiToolBarItem* m_toolCharSelect;
wxAuiToolBarItem* m_toolSendDestination;
wxAuiToolBarItem* m_toolSendSource;
wxChoice* m_toolComposition;
wxChoice* m_toolTranslationSeq;
wxAuiToolBarItem* m_toolWarnPUA;
wxZRColaCharacterCatalogPanel* m_panelChrCat;
wxStatusBar* m_statusBar;
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); }
virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); }
virtual void OnCompositionChoice( wxCommandEvent& event ) { event.Skip(); }
virtual void OnTranslationSeqChoice( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaComposerPanel* m_panel;
wxZRColaFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("ZRCola"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 600,400 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("ZRCola") );
wxAuiManager m_mgr;
~wxZRColaFrameBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaComposerPanelBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaComposerPanelBase : public wxPanel
{
private:
protected:
enum
{
wxID_TIMER_SAVE = 1000
};
wxSplitterWindow* m_splitterSource;
wxPanel* m_panelSourceEdit;
wxPanel* m_panelSourceHex;
wxTextCtrl* m_sourceHex;
wxSplitterWindow* m_splitterDestination;
wxPanel* m_panelDestinationEdit;
wxPanel* m_panelDestinationHex;
wxTextCtrl* m_destinationHex;
wxTimer m_timerSave;
// Virtual event handlers, overide them in your derived class
virtual void OnSourcePaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnSourceText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSourceHexPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnDestinationPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnDestinationText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDestinationHexPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnSaveTimer( wxTimerEvent& event ) { event.Skip(); }
public:
wxTextCtrl* m_source;
wxTextCtrl* m_destination;
wxZRColaComposerPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxT("ZRColaComposerPanel") );
~wxZRColaComposerPanelBase();
void m_splitterSourceOnIdle( wxIdleEvent& )
{
m_splitterSource->SetSashPosition( -5 );
m_splitterSource->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, this );
}
void m_splitterDestinationOnIdle( wxIdleEvent& )
{
m_splitterDestination->SetSashPosition( -5 );
m_splitterDestination->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, this );
}
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaCharacterCatalogPanelBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaCharacterCatalogPanelBase : public wxPanel
{
private:
protected:
wxChoice* m_choice;
wxZRColaCharGrid* m_grid;
wxCheckBox* m_show_all;
// Virtual event handlers, overide them in your derived class
virtual void OnChoice( wxCommandEvent& event ) { event.Skip(); }
virtual void OnGridClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnGridKeyDown( wxKeyEvent& event ) { event.Skip(); }
virtual void OnShowAll( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaCharacterCatalogPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxT("ZRColaCharacterCatalog") );
~wxZRColaCharacterCatalogPanelBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaCharSelectBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaCharSelectBase : public wxDialog
{
private:
protected:
wxSearchCtrl* m_search;
wxHyperlinkCtrl* m_search_more;
wxPanel* m_search_panel;
wxCheckListBox* m_categories;
wxHyperlinkCtrl* m_categoriesAll;
wxHyperlinkCtrl* m_categoriesNone;
wxHyperlinkCtrl* m_categoriesInvert;
wxZRColaCharGrid* m_gridResults;
wxZRColaCharGrid* m_gridRecent;
wxStaticText* m_labelUnicode;
wxTextCtrl* m_unicode;
wxTextCtrl* m_shortcut;
wxGrid* m_gridPreview;
wxTextCtrl* m_description;
wxTextCtrl* m_tags;
wxTextCtrl* m_category;
wxHyperlinkCtrl* m_navigateBack;
wxHyperlinkCtrl* m_navigateForward;
wxZRColaCharGrid* m_gridRelated;
wxButton* m_buttonInsert;
// Virtual event handlers, overide them in your derived class
virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); }
virtual void OnSearchText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSearchMore( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnCategoriesToggle( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCategoriesAll( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnCategoriesNone( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnCategoriesInvert( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnResultCellDClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnResultSelectCell( wxGridEvent& event ) { event.Skip(); }
virtual void OnResultsKeyDown( wxKeyEvent& event ) { event.Skip(); }
virtual void OnRecentCellDClick( wxGridEvent& event ) { event.Skip(); }
virtual void OnRecentSelectCell( wxGridEvent& event ) { event.Skip(); }
virtual void OnRecentKeyDown( wxKeyEvent& event ) { event.Skip(); }
virtual void OnUnicodeText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnPreviewKeyDown( wxKeyEvent& event ) { event.Skip(); }
virtual void OnNavigateBack( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnNavigateForward( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnRelatedSelectCell( wxGridEvent& event ) { event.Skip(); }
virtual void OnInsert( wxCommandEvent& event ) { event.Skip(); }
virtual void OnInsertUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
public:
wxZRColaCharSelectBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Character Search"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaCharSelect") );
~wxZRColaCharSelectBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaSettingsBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaSettingsBase : public wxDialog
{
private:
protected:
wxListbook* m_listbook;
wxPanel* m_panelLanguage;
wxStaticText* m_langLabel;
wxRadioButton* m_langAuto;
wxRadioButton* m_langManual;
wxListBox* m_languages;
wxPanel* m_panelAutoStart;
wxStaticText* m_autoStartLabel;
wxCheckBox* m_autoStart;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsApply;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnLanguageUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnApplyButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaSettingsBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaSettings") );
~wxZRColaSettingsBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaAboutBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaAboutBase : public wxDialog
{
private:
protected:
wxStaticBitmap* m_bitmapIcon;
wxStaticText* m_staticTextZRCola;
wxStaticText* m_staticTextVersion;
wxStaticText* m_staticTextColophone;
wxStaticText* m_staticTextCopyright;
wxHyperlinkCtrl* m_hyperlink;
wxStaticText* m_staticTextDeclaration;
wxTextCtrl* m_declaration;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
public:
wxZRColaAboutBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About ZRCola"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaAbout") );
~wxZRColaAboutBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaUpdaterBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaUpdaterBase : public wxDialog
{
private:
protected:
wxTextCtrl* m_log;
wxButton* m_buttonUpdate;
wxButton* m_buttonClose;
// Virtual event handlers, overide them in your derived class
virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); }
virtual void OnUpdate( wxCommandEvent& event ) { event.Skip(); }
virtual void OnClose( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaUpdaterBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Product Update"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaUpdater") );
~wxZRColaUpdaterBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaCharRequestBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaCharRequestBase : public wxDialog
{
private:
protected:
wxStaticText* m_characterLbl;
wxTextCtrl* m_character;
wxStaticText* m_characterNote;
wxStaticText* m_contextLbl;
wxTextCtrl* m_context;
wxStaticText* m_note;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaCharRequestBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Request a New Character"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaCharRequest") );
~wxZRColaCharRequestBase();
};
///////////////////////////////////////////////////////////////////////////////
/// Class wxZRColaTranslationSeqBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaTranslationSeqBase : public wxDialog
{
private:
protected:
wxStaticText* m_transLbl;
wxStaticText* m_availableLbl;
wxListBox* m_available;
wxButton* m_add;
wxButton* m_remove;
wxStaticText* m_selectedLbl;
wxListBox* m_selected;
wxButton* m_selectedUp;
wxButton* m_selectedDown;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnAvailableChar( wxKeyEvent& event ) { event.Skip(); }
virtual void OnAvailableDClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAdd( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemove( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedChar( wxKeyEvent& event ) { event.Skip(); }
virtual void OnSelectedDClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedUp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedDown( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaTranslationSeqBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Custom Translation Sequence"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaTranslationSeq") );
~wxZRColaTranslationSeqBase();
};

20
ZRCola/stdafx.cpp Normal file
View File

@ -0,0 +1,20 @@
/*
Copyright 2015-2017 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#pragma once #pragma once
@ -15,7 +29,6 @@
#include "zrcolafrm.h" #include "zrcolafrm.h"
#include "zrcolakeyhndlr.h" #include "zrcolakeyhndlr.h"
#include "zrcolasettings.h" #include "zrcolasettings.h"
#include "zrcolatranseq.h"
#include "zrcolaupdater.h" #include "zrcolaupdater.h"
#include <Updater/chkthread.h> #include <Updater/chkthread.h>
@ -23,21 +36,14 @@
#include <wxex/common.h> #include <wxex/common.h>
#include <wxex/url.h> #include <wxex/url.h>
#include <wxex/persist/auimanager.h> #include <wxex/persist/auimanager.h>
#include <wxex/persist/toplevel.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/clipbrd.h>
#include <wx/dcclient.h>
#include <wx/ffile.h> #include <wx/ffile.h>
#include <wx/msgdlg.h> #include <wx/msgdlg.h>
#include <wx/persist.h> #include <wx/persist.h>
#include <wx/persist/toplevel.h> #include <wx/persist/toplevel.h>
#include <wx/socket.h>
#include <wx/tokenzr.h>
#include <wx/utils.h> #include <wx/utils.h>
#include <wx/valtext.h> #include <wx/valtext.h>
#pragma warning(pop) #include <wx/socket.h>
#include <WinStd/MSI.h> #include <WinStd/MSI.h>
@ -46,7 +52,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include <zrcola/idrec.h> #include <stdex/idrec.h>
#if defined(__WXMSW__) #if defined(__WXMSW__)
#include <Msi.h> #include <Msi.h>

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -11,11 +25,7 @@ class wxZRColaAbout;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
/// ///

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
#if defined(__WXMSW__) #if defined(__WXMSW__)
#pragma comment(lib, "msi.lib") #pragma comment(lib, "msi.lib")
#endif #endif
@ -13,13 +27,11 @@
// ZRColaApp // ZRColaApp
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
#pragma warning(suppress: 28251) // wxWidgets implement WinMain without code analysis annotations.
wxIMPLEMENT_APP(ZRColaApp); wxIMPLEMENT_APP(ZRColaApp);
ZRColaApp::ZRColaApp() : ZRColaApp::ZRColaApp() :
m_mainWnd(NULL), m_mainWnd(NULL),
#pragma warning(suppress: 26812) // wxLanguage is unscoped
m_lang_ui(wxLANGUAGE_DEFAULT), m_lang_ui(wxLANGUAGE_DEFAULT),
wxApp() wxApp()
{ {
@ -82,7 +94,7 @@ bool ZRColaApp::OnInit()
ZRCola::recordid_t id; ZRCola::recordid_t id;
if (!stdex::idrec::read_id(dat, id, size)) break; if (!stdex::idrec::read_id(dat, id, size)) break;
if (id == ZRCola::translation_rec::id()) { if (id == ZRCola::translation_rec::id) {
dat >> ZRCola::translation_rec(m_t_db); dat >> ZRCola::translation_rec(m_t_db);
if (dat.good()) { if (dat.good()) {
has_translation_data = true; has_translation_data = true;
@ -90,66 +102,48 @@ bool ZRColaApp::OnInit()
wxFAIL_MSG(wxT("Error reading translation data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading translation data from ZRCola.zrcdb."));
m_t_db.clear(); m_t_db.clear();
} }
} else if (id == ZRCola::transet_rec::id()) { } else if (id == ZRCola::langchar_rec::id) {
dat >> ZRCola::transet_rec(m_ts_db);
if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading translation set data from ZRCola.zrcdb."));
m_ts_db.clear();
}
} else if (id == ZRCola::transeq_rec::id()) {
dat >> ZRCola::transeq_rec(m_tsq_db);
if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading translation sequence data from ZRCola.zrcdb."));
m_tsq_db.clear();
}
} else if (id == ZRCola::langchar_rec::id()) {
dat >> ZRCola::langchar_rec(m_lc_db); dat >> ZRCola::langchar_rec(m_lc_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading language character data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading language character data from ZRCola.zrcdb."));
m_lc_db.clear(); m_lc_db.clear();
} }
} else if (id == ZRCola::language_rec::id()) { } else if (id == ZRCola::language_rec::id) {
dat >> ZRCola::language_rec(m_lang_db); dat >> ZRCola::language_rec(m_lang_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading language character data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading language character data from ZRCola.zrcdb."));
m_lang_db.clear(); m_lang_db.clear();
} }
} else if (id == ZRCola::keyseq_rec::id()) { } else if (id == ZRCola::keyseq_rec::id) {
dat >> ZRCola::keyseq_rec(m_ks_db); dat >> ZRCola::keyseq_rec(m_ks_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading key sequences data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading key sequences data from ZRCola.zrcdb."));
m_ks_db.clear(); m_ks_db.clear();
} }
} else if (id == ZRCola::character_rec::id()) { } else if (id == ZRCola::character_rec::id) {
dat >> ZRCola::character_rec(m_chr_db); dat >> ZRCola::character_rec(m_chr_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading character data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading character data from ZRCola.zrcdb."));
m_chr_db.clear(); m_chr_db.clear();
} }
} else if (id == ZRCola::chrcat_rec::id()) { } else if (id == ZRCola::chrcat_rec::id) {
dat >> ZRCola::chrcat_rec(m_cc_db); dat >> ZRCola::chrcat_rec(m_cc_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading character category data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading character category data from ZRCola.zrcdb."));
m_cc_db.clear(); m_cc_db.clear();
} }
} else if (id == ZRCola::chrtag_rec::id()) { } else if (id == ZRCola::chrtag_rec::id) {
dat >> ZRCola::chrtag_rec(m_ct_db); dat >> ZRCola::chrtag_rec(m_ct_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading character tag data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading character tag data from ZRCola.zrcdb."));
m_ct_db.clear(); m_ct_db.clear();
} }
} else if (id == ZRCola::tagname_rec::id()) { } else if (id == ZRCola::tagname_rec::id) {
dat >> ZRCola::tagname_rec(m_tn_db); dat >> ZRCola::tagname_rec(m_tn_db);
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading tag name data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading tag name data from ZRCola.zrcdb."));
m_tn_db.clear(); m_tn_db.clear();
} }
} else if (id == ZRCola::highlight_rec::id()) {
dat >> ZRCola::highlight_rec(m_h_db);
if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading highlight data from ZRCola.zrcdb."));
m_h_db.clear();
}
} else } else
stdex::idrec::ignore<ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>(dat); stdex::idrec::ignore<ZRCola::recordsize_t, ZRCOLA_RECORD_ALIGN>(dat);
} }
@ -159,14 +153,13 @@ bool ZRColaApp::OnInit()
} }
} else } else
wxFAIL_MSG(wxT("ZRCola.zrcdb is not a valid ZRCola database.")); wxFAIL_MSG(wxT("ZRCola.zrcdb is not a valid ZRCola database."));
} else }
wxFAIL_MSG(wxT("ZRCola.zrcdb not found or cannot be opened."));
// Initialize sockets. Otherwise Updater thread will not work. // Initialize sockets. Otherwise Updater thread will not work.
wxSocketBase::Initialize(); wxSocketBase::Initialize();
m_mainWnd = new wxZRColaFrame(); m_mainWnd = new wxZRColaFrame();
m_mainWnd->m_panel->RestoreFromStateFile(); wxPersistentRegisterAndRestore<wxZRColaFrame>(m_mainWnd);
m_mainWnd->Show(); m_mainWnd->Show();
return true; return true;

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -13,15 +27,10 @@ class ZRColaApp;
#include "zrcolafrm.h" #include "zrcolafrm.h"
#include <WinStd/Win.h> #include <WinStd/Win.h>
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/app.h> #include <wx/app.h>
#include <wx/config.h> #include <wx/config.h>
#include <wx/intl.h> #include <wx/intl.h>
#pragma warning(pop)
#include <zrcola/character.h> #include <zrcola/character.h>
#include <zrcola/highlight.h>
#include <zrcola/language.h> #include <zrcola/language.h>
#include <zrcola/translate.h> #include <zrcola/translate.h>
#include <zrcola/tag.h> #include <zrcola/tag.h>
@ -64,8 +73,6 @@ public:
public: public:
ZRCola::translation_db m_t_db; ///< Translation database ZRCola::translation_db m_t_db; ///< Translation database
ZRCola::transet_db m_ts_db; ///< Translation set database
ZRCola::transeq_db m_tsq_db; ///< Translation sequence database
ZRCola::langchar_db m_lc_db; ///< Language character database ZRCola::langchar_db m_lc_db; ///< Language character database
ZRCola::language_db m_lang_db; ///< Language database ZRCola::language_db m_lang_db; ///< Language database
ZRCola::keyseq_db m_ks_db; ///< Key sequence database ZRCola::keyseq_db m_ks_db; ///< Key sequence database
@ -73,7 +80,6 @@ public:
ZRCola::chrcat_db m_cc_db; ///< Characted category database ZRCola::chrcat_db m_cc_db; ///< Characted category database
ZRCola::chrtag_db m_ct_db; ///< Character tag database ZRCola::chrtag_db m_ct_db; ///< Character tag database
ZRCola::tagname_db m_tn_db; ///< Tag name database ZRCola::tagname_db m_tn_db; ///< Tag name database
ZRCola::highlight_db m_h_db; ///< Highlight database
wxZRColaFrame *m_mainWnd; ///< Main window wxZRColaFrame *m_mainWnd; ///< Main window
@ -82,7 +88,7 @@ public:
protected: protected:
#ifdef __WXMSW__ #ifdef __WXMSW__
winstd::event m_running; ///< Global Win32 event to determine if another instance of ZRCola is already running winstd::win_handle m_running; ///< Global Win32 event to determine if another instance of ZRCola is already running
#endif #endif
}; };

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -11,13 +25,11 @@
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE(wxZRColaCharacterCatalogPanel, wxZRColaCharacterCatalogPanelBase) BEGIN_EVENT_TABLE(wxZRColaCharacterCatalogPanel, wxZRColaCharacterCatalogPanelBase)
EVT_MENU(wxZRColaCharacterCatalogPanel::wxID_FOCUS_SOURCE, wxZRColaCharacterCatalogPanel::OnFocusSource) EVT_MENU(wxZRColaCharacterCatalogPanel::wxID_FOCUS_DECOMPOSED, wxZRColaCharacterCatalogPanel::OnFocusDecomposed)
END_EVENT_TABLE() END_EVENT_TABLE()
wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) : wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) : wxZRColaCharacterCatalogPanelBase(parent)
m_cg_id(0),
wxZRColaCharacterCatalogPanelBase(parent)
{ {
std::fstream dat((LPCTSTR)dynamic_cast<ZRColaApp*>(wxTheApp)->GetDatabaseFilePath(), std::ios_base::in | std::ios_base::binary); std::fstream dat((LPCTSTR)dynamic_cast<ZRColaApp*>(wxTheApp)->GetDatabaseFilePath(), std::ios_base::in | std::ios_base::binary);
if (dat.good()) { if (dat.good()) {
@ -30,27 +42,26 @@ wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) :
dat >> rec; dat >> rec;
if (!dat.good()) { if (!dat.good()) {
wxFAIL_MSG(wxT("Error reading character group data from ZRCola.zrcdb.")); wxFAIL_MSG(wxT("Error reading character group data from ZRCola.zrcdb."));
m_cg_db.idxRank.clear(); m_cg_db.idxRnk.clear();
m_cg_db.data .clear(); m_cg_db.data .clear();
} }
} else } else
wxFAIL_MSG(wxT("ZRCola.zrcdb has no character group data.")); wxFAIL_MSG(wxT("ZRCola.zrcdb has no character group data."));
} }
} else } else
wxFAIL_MSG(wxT("ZRCola.zrcdb is not a valid ZRCola database.")); wxFAIL_MSG(wxT("ZRCola.zrcdb is not a valid ZRCola database."));
} else }
wxFAIL_MSG(wxT("ZRCola.zrcdb not found or cannot be opened."));
if (!m_cg_db.idxRank.empty()) { if (!m_cg_db.idxRnk.empty()) {
// Populate character group list. // Populate character group list.
for (size_t i = 0, n = m_cg_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = m_cg_db.idxRnk.size(); i < n; i++) {
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[i]; const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[i];
wxString wxString
label(cg.name(), cg.name_len()), label(cg.data, cg.name_len),
label_tran2(wxGetTranslation(label, wxT("ZRCola-zrcdb"))); label_tran2(wxGetTranslation(label, wxT("ZRCola-zrcdb")));
m_choice->Insert(label_tran2, (unsigned int)i); m_choice->Insert(label_tran2, i);
} }
m_cg_id = m_cg_db.idxRank[0].grp; m_cg_id = m_cg_db.idxRnk[0].id;
m_choice->Select(0); m_choice->Select(0);
Update(); Update();
@ -59,7 +70,7 @@ wxZRColaCharacterCatalogPanel::wxZRColaCharacterCatalogPanel(wxWindow* parent) :
// Register frame specific hotkey(s). // Register frame specific hotkey(s).
{ {
wxAcceleratorEntry entries[1]; wxAcceleratorEntry entries[1];
entries[0].Set(wxACCEL_NORMAL, WXK_ESCAPE, wxID_FOCUS_SOURCE); entries[0].Set(wxACCEL_NORMAL, WXK_ESCAPE, wxID_FOCUS_DECOMPOSED);
SetAcceleratorTable(wxAcceleratorTable(_countof(entries), entries)); SetAcceleratorTable(wxAcceleratorTable(_countof(entries), entries));
} }
} }
@ -72,10 +83,10 @@ wxZRColaCharacterCatalogPanel::~wxZRColaCharacterCatalogPanel()
void wxZRColaCharacterCatalogPanel::OnChoice(wxCommandEvent& event) void wxZRColaCharacterCatalogPanel::OnChoice(wxCommandEvent& event)
{ {
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[event.GetSelection()]; const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[event.GetSelection()];
if (m_cg_id != cg.grp) { if (m_cg_id != cg.id) {
m_cg_id = cg.grp; m_cg_id = cg.id;
Update(); Update();
} }
@ -87,8 +98,8 @@ void wxZRColaCharacterCatalogPanel::OnGridClick(wxGridEvent& event)
{ {
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
if (app->m_mainWnd) { if (app->m_mainWnd) {
app->m_mainWnd->m_panel->m_source->WriteText(m_grid->GetCellValue(event.GetRow(), event.GetCol())); app->m_mainWnd->m_panel->m_decomposed->WriteText(m_grid->GetCellValue(event.GetRow(), event.GetCol()));
app->m_mainWnd->m_panel->m_source->SetFocus(); app->m_mainWnd->m_panel->m_decomposed->SetFocus();
} }
event.Skip(); event.Skip();
@ -102,8 +113,8 @@ void wxZRColaCharacterCatalogPanel::OnGridKeyDown(wxKeyEvent& event)
case WXK_NUMPAD_ENTER: case WXK_NUMPAD_ENTER:
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
if (app->m_mainWnd) { if (app->m_mainWnd) {
app->m_mainWnd->m_panel->m_source->WriteText(m_grid->GetCellValue(m_grid->GetGridCursorRow(), m_grid->GetGridCursorCol())); app->m_mainWnd->m_panel->m_decomposed->WriteText(m_grid->GetCellValue(m_grid->GetGridCursorRow(), m_grid->GetGridCursorCol()));
app->m_mainWnd->m_panel->m_source->SetFocus(); app->m_mainWnd->m_panel->m_decomposed->SetFocus();
event.StopPropagation(); event.StopPropagation();
return; return;
@ -124,11 +135,11 @@ void wxZRColaCharacterCatalogPanel::OnShowAll(wxCommandEvent& event)
} }
void wxZRColaCharacterCatalogPanel::OnFocusSource(wxCommandEvent& event) void wxZRColaCharacterCatalogPanel::OnFocusDecomposed(wxCommandEvent& event)
{ {
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
if (app->m_mainWnd) { if (app->m_mainWnd) {
app->m_mainWnd->m_panel->m_source->SetFocus(); app->m_mainWnd->m_panel->m_decomposed->SetFocus();
event.StopPropagation(); event.StopPropagation();
return; return;
@ -140,23 +151,21 @@ void wxZRColaCharacterCatalogPanel::OnFocusSource(wxCommandEvent& event)
void wxZRColaCharacterCatalogPanel::Update() void wxZRColaCharacterCatalogPanel::Update()
{ {
const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRank[m_choice->GetSelection()]; const ZRCola::chrgrp_db::chrgrp &cg = m_cg_db.idxRnk[m_choice->GetSelection()];
if (m_show_all->GetValue()) { if (m_show_all->GetValue()) {
m_grid->SetCharacters( m_grid->SetCharacters(
wxString(cg.chrlst(), cg.chrlst_end()), wxString(cg.get_chars(), cg.char_len),
wxArrayShort(reinterpret_cast<const short*>(cg.chrshow()), reinterpret_cast<const short*>(cg.chrshow_end()))); wxArrayShort((const short*)cg.get_char_shown(), (const short*)cg.get_char_shown() + (cg.char_len + 15)/16));
} else { } else {
// Select frequently used characters only. // Select frequently used characters only.
const auto *src = cg.chrlst(); const wchar_t *src = cg.get_chars();
const uint16_t *shown = cg.chrshow(); const unsigned __int16 *shown = cg.get_char_shown();
wxArrayString chars; wxString chars;
for (size_t i = 0, i_end = cg.chrlst_len(), j = 0; i < i_end; j++) { for (unsigned __int16 i = 0, j = 0; i < cg.char_len; j++) {
for (uint16_t k = 0, mask = shown[j]; k < 16 && i < i_end; k++, mask >>= 1) { for (unsigned __int16 k = 0, mask = shown[j]; k < 16 && i < cg.char_len; k++, mask >>= 1, i++) {
size_t len = wcsnlen(src + i, i_end - i);
if (mask & 1) if (mask & 1)
chars.Add(wxString(src + i, len)); chars += src[i];
i += len + 1;
} }
} }
m_grid->SetCharacters(chars); m_grid->SetCharacters(chars);
@ -199,12 +208,12 @@ bool wxPersistentZRColaCharacterCatalogPanel::Restore()
// Restore selected character group. // Restore selected character group.
int cg_id; int cg_id;
if (RestoreValue(wxT("charGroup"), &cg_id)) { if (RestoreValue(wxT("charGroup"), &cg_id)) {
for (size_t i = 0, n = wnd->m_cg_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = wnd->m_cg_db.idxRnk.size(); i < n; i++) {
const ZRCola::chrgrp_db::chrgrp &cg = wnd->m_cg_db.idxRank[i]; const ZRCola::chrgrp_db::chrgrp &cg = wnd->m_cg_db.idxRnk[i];
if (cg.grp == cg_id) { if (cg.id == cg_id) {
if (wnd->m_cg_id != cg.grp) { if (wnd->m_cg_id != cg.id) {
wnd->m_cg_id = cg.grp; wnd->m_cg_id = cg.id;
wnd->m_choice->Select((int)i); wnd->m_choice->Select(i);
update = true; update = true;
} }

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -11,16 +25,9 @@ class wxZRColaCharacterCatalogPanel;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include <zrcolaui/chargroup.h> #include <zrcolaui/chargroup.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/persist/window.h> #include <wx/persist/window.h>
#pragma warning(pop)
/// ///
@ -31,7 +38,7 @@ class wxZRColaCharacterCatalogPanel : public wxZRColaCharacterCatalogPanelBase
public: public:
enum enum
{ {
wxID_FOCUS_SOURCE = 6000, wxID_FOCUS_DECOMPOSED = 6000,
}; };
wxZRColaCharacterCatalogPanel(wxWindow* parent); wxZRColaCharacterCatalogPanel(wxWindow* parent);
@ -44,7 +51,7 @@ protected:
virtual void OnGridClick(wxGridEvent& event); virtual void OnGridClick(wxGridEvent& event);
virtual void OnGridKeyDown(wxKeyEvent& event); virtual void OnGridKeyDown(wxKeyEvent& event);
virtual void OnShowAll(wxCommandEvent& event); virtual void OnShowAll(wxCommandEvent& event);
void OnFocusSource(wxCommandEvent& event); void OnFocusDecomposed(wxCommandEvent& event);
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
void Update(); void Update();

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -27,7 +41,7 @@ wxZRColaCharGrid::wxZRColaCharGrid(wxWindow *parent, wxWindowID id, const wxPoin
{ {
Init(); Init();
SetDefaultRowSize(FromDIP(wxZRColaCharacterGridRowHeight)); SetDefaultRowSize(wxZRColaCharacterGridRowHeight);
// Create timer for saving the state. // Create timer for saving the state.
m_timerToolTip.SetOwner(this, wxID_TOOLTIP_TIMER); m_timerToolTip.SetOwner(this, wxID_TOOLTIP_TIMER);
@ -54,24 +68,6 @@ void wxZRColaCharGrid::Init()
void wxZRColaCharGrid::SetCharacters(const wxString &chars) void wxZRColaCharGrid::SetCharacters(const wxString &chars)
{
m_chars.Clear();
const wxCStrData chr = chars.GetData();
for (size_t i = 0, i_end = chars.Length(), i_next; i < i_end; i = i_next + 1) {
i_next = i + _tcsnlen(chr + i, i_end - i);
m_chars.Add(wxString(chr + i, chr + i_next));
};
m_relevance.Clear();
m_regenerate = true;
// Invoke OnSize(), which will populate the grid.
wxSizeEvent e(GetSize(), m_windowId);
e.SetEventObject(this);
HandleWindowEvent(e);
}
void wxZRColaCharGrid::SetCharacters(const wxArrayString &chars)
{ {
m_chars = chars; m_chars = chars;
m_relevance.Clear(); m_relevance.Clear();
@ -86,12 +82,7 @@ void wxZRColaCharGrid::SetCharacters(const wxArrayString &chars)
void wxZRColaCharGrid::SetCharacters(const wxString &chars, const wxArrayShort &relevance) void wxZRColaCharGrid::SetCharacters(const wxString &chars, const wxArrayShort &relevance)
{ {
m_chars.Clear(); m_chars = chars;
const wxCStrData chr = chars.GetData();
for (size_t i = 0, i_end = chars.Length(), i_next; i < i_end; i = i_next + 1) {
i_next = i + _tcsnlen(chr + i, i_end - i);
m_chars.Add(wxString(chr + i, chr + i_next));
};
m_relevance = relevance; m_relevance = relevance;
m_regenerate = true; m_regenerate = true;
@ -104,23 +95,22 @@ void wxZRColaCharGrid::SetCharacters(const wxString &chars, const wxArrayShort &
wxString wxZRColaCharGrid::GetToolTipText(int idx) wxString wxZRColaCharGrid::GetToolTipText(int idx)
{ {
wxASSERT_MSG(idx < (int)m_chars.GetCount(), wxT("index out of bounds")); wxASSERT_MSG(idx < (int)m_chars.Length(), wxT("index out of bounds"));
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
const auto &chr = m_chars[idx];
// See if this character has a key sequence registered. // See if this character has a key sequence registered.
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::char_t)*chr.length()]); char ks[sizeof(ZRCola::keyseq_db::keyseq)] = {};
ks->ZRCola::keyseq_db::keyseq::keyseq(NULL, 0, chr.data(), chr.length()); ((ZRCola::keyseq_db::keyseq*)ks)->chr = m_chars[idx];
ZRCola::keyseq_db::indexKey::size_type start; ZRCola::keyseq_db::indexKey::size_type start;
if (app->m_ks_db.idxChr.find(*ks, start)) { if (app->m_ks_db.idxChr.find(*(ZRCola::keyseq_db::keyseq*)ks, start)) {
ZRCola::keyseq_db::keyseq &seq = app->m_ks_db.idxChr[start]; ZRCola::keyseq_db::keyseq &seq = app->m_ks_db.idxChr[start];
wxString ks_str; wxString ks_str;
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq(), seq.seq_len(), ks_str)) if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq, seq.seq_len, ks_str))
return wxString::Format(wxT("U+%s (%s)"), ZRCola::GetUnicodeDump(chr.data(), chr.length(), _T("+")).c_str(), ks_str.c_str()); return wxString::Format(wxT("U+%04X (%s)"), (int)m_chars[idx], ks_str.c_str());
} }
return wxString::Format(wxT("U+%s"), ZRCola::GetUnicodeDump(chr.data(), chr.length(), _T("+")).c_str()); return wxString::Format(wxT("U+%04X"), (int)m_chars[idx]);
} }
@ -136,19 +126,17 @@ void wxZRColaCharGrid::OnSize(wxSizeEvent& event)
// Calculate initial estimate of columns and rows. // Calculate initial estimate of columns and rows.
wxSize size(event.GetSize()); wxSize size(event.GetSize());
size_t size_t
char_count = m_chars.GetCount(); char_len = m_chars.Length();
int int
col_width = FromDIP(wxZRColaCharacterGridColumnWidth), width = size.GetWidth() - m_rowLabelWidth - m_extraWidth,
row_height = FromDIP(wxZRColaCharacterGridRowHeight), cols = std::max<int>(width / wxZRColaCharacterGridColumnWidth, 1),
width = size.GetWidth() - m_rowLabelWidth - m_extraWidth, rows = std::max<int>((char_len + cols - 1) / cols, 1);
cols = std::max<int>(width / col_width, 1),
rows = std::max<int>((int)((char_count + cols - 1) / cols), 1);
if (m_colLabelHeight + rows*row_height + m_extraHeight > size.GetHeight()) { if (m_colLabelHeight + rows*wxZRColaCharacterGridRowHeight + m_extraHeight > size.GetHeight()) {
// Vertical scrollbar will be shown. Adjust the width and recalculate layout to avoid horizontal scrollbar. // Vertical scrollbar will be shown. Adjust the width and recalculate layout to avoid horizontal scrollbar.
width = std::max<int>(width - wxSystemSettings::GetMetric(wxSYS_VSCROLL_X, this), 0); width = std::max<int>(width - wxSystemSettings::GetMetric(wxSYS_VSCROLL_X, this), 0);
cols = std::max<int>(width / col_width, 1); cols = std::max<int>(width / wxZRColaCharacterGridColumnWidth, 1);
rows = std::max<int>((int)((char_count + cols - 1) / cols), 1); rows = std::max<int>((char_len + cols - 1) / cols, 1);
} }
BeginBatch(); BeginBatch();
@ -158,14 +146,14 @@ void wxZRColaCharGrid::OnSize(wxSizeEvent& event)
wxGridStringTable *table = new wxGridStringTable(rows, cols); wxGridStringTable *table = new wxGridStringTable(rows, cols);
for (int r = 0, i = 0; r < rows; r++) for (int r = 0, i = 0; r < rows; r++)
for (int c = 0; c < cols; c++, i++) for (int c = 0; c < cols; c++, i++)
table->SetValue(r, c, i < (int)char_count ? m_chars[i] : wxEmptyString); table->SetValue(r, c, i < (int)char_len ? wxString(1, m_chars[i]) : wxEmptyString);
SetTable(table, true); SetTable(table, true);
if (!m_relevance.IsEmpty()) { if (!m_relevance.IsEmpty()) {
const wxColour colour_def; const wxColour colour_def;
const wxColour colour_irr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT); const wxColour colour_irr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT);
for (int r = 0, i = 0; r < rows; r++) for (int r = 0, i = 0; r < rows; r++)
for (int c = 0; c < cols; c++, i++) for (int c = 0; c < cols; c++, i++)
SetCellBackgroundColour(r, c, i >= (int)char_count || ((unsigned short)(m_relevance[i/16]) & (1<<(i%16))) ? colour_def : colour_irr); SetCellBackgroundColour(r, c, i >= (int)char_len || ((unsigned short)(m_relevance[i/16]) & (1<<(i%16))) ? colour_def : colour_irr);
} else { } else {
for (int r = 0, i = 0; r < rows; r++) for (int r = 0, i = 0; r < rows; r++)
for (int c = 0; c < cols; c++, i++) for (int c = 0; c < cols; c++, i++)
@ -175,7 +163,7 @@ void wxZRColaCharGrid::OnSize(wxSizeEvent& event)
} }
for (int c = 0; c < cols; c++) for (int c = 0; c < cols; c++)
SetColSize(c, col_width); SetColSize(c, wxZRColaCharacterGridColumnWidth);
//// Set column widths to stretch to full width. //// Set column widths to stretch to full width.
//for (int c = 0, x_l = 0; c < cols; c++) { //for (int c = 0, x_l = 0; c < cols; c++) {
@ -228,8 +216,8 @@ void wxZRColaCharGrid::OnMotion(wxMouseEvent& event)
if (col == wxNOT_FOUND || row == wxNOT_FOUND ) if (col == wxNOT_FOUND || row == wxNOT_FOUND )
return; return;
size_t toolTipIdx = (size_t)row*m_numCols + col; size_t toolTipIdx = row*m_numCols + col;
if (toolTipIdx >= m_chars.GetCount()) { if (toolTipIdx >= m_chars.Length()) {
// Index out of range. // Index out of range.
m_toolTipIdx = (size_t)-1; m_toolTipIdx = (size_t)-1;
m_timerToolTip.Stop(); m_timerToolTip.Stop();
@ -240,7 +228,7 @@ void wxZRColaCharGrid::OnMotion(wxMouseEvent& event)
wxWindow *gridWnd = GetGridWindow(); wxWindow *gridWnd = GetGridWindow();
if (gridWnd->GetToolTip()) { if (gridWnd->GetToolTip()) {
// The tooltip is already shown. Update it immediately. // The tooltip is already shown. Update it immediately.
gridWnd->SetToolTip(GetToolTipText((int)m_toolTipIdx)); gridWnd->SetToolTip(GetToolTipText(m_toolTipIdx));
} else { } else {
// This must be our initial entry. Schedule tooltip display after 1s. // This must be our initial entry. Schedule tooltip display after 1s.
m_timerToolTip.Start(1000, true); m_timerToolTip.Start(1000, true);
@ -253,8 +241,8 @@ void wxZRColaCharGrid::OnTooltipTimer(wxTimerEvent& event)
{ {
event.Skip(); event.Skip();
if (m_toolTipIdx >= m_chars.GetCount()) if (m_toolTipIdx >= m_chars.Length())
return; return;
GetGridWindow()->SetToolTip(GetToolTipText((int)m_toolTipIdx)); GetGridWindow()->SetToolTip(GetToolTipText(m_toolTipIdx));
} }

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -11,11 +25,7 @@ class wxZRColaCharGrid;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/grid.h> #include <wx/grid.h>
#pragma warning(pop)
/// ///
@ -44,21 +54,14 @@ public:
/// ///
/// Sets new array of characters to display /// Sets new array of characters to display
/// ///
/// \param[in] chars The string containing characters to display (zero delimited) /// \param[in] chars The string containing characters to display
/// ///
void SetCharacters(const wxString &chars); void SetCharacters(const wxString &chars);
/// ///
/// Sets new array of characters to display /// Sets new array of characters to display
/// ///
/// \param[in] chars The array of characters to display /// \param[in] chars The string containing characters to display
///
void SetCharacters(const wxArrayString &chars);
///
/// Sets new array of characters to display
///
/// \param[in] chars The string containing characters to display (zero delimited)
/// \param[in] relevance Bit-array of \p chars relevance (1=more relevant, 0=less relevant) /// \param[in] relevance Bit-array of \p chars relevance (1=more relevant, 0=less relevant)
/// ///
void SetCharacters(const wxString &chars, const wxArrayShort &relevance); void SetCharacters(const wxString &chars, const wxArrayShort &relevance);
@ -68,7 +71,7 @@ public:
/// ///
/// \returns The string containing displayed characters /// \returns The string containing displayed characters
/// ///
inline const wxArrayString& GetCharacters() const inline wxString GetCharacters() const
{ {
return m_chars; return m_chars;
} }
@ -80,14 +83,10 @@ public:
/// ///
/// \returns Grid coordinates of selected character or (-1, -1) if character not found. /// \returns Grid coordinates of selected character or (-1, -1) if character not found.
/// ///
inline wxGridCellCoords GetCharacterCoords(const wxString &c) const inline wxGridCellCoords GetCharacterCoords(wchar_t c) const
{ {
for (size_t i = 0, n = m_chars.GetCount(); ; i++) { int i = m_chars.Find(c);
if (i >= n) return i != wxNOT_FOUND ? wxGridCellCoords(i / m_numCols, i % m_numCols) : wxGridCellCoords(-1, -1);
return wxGridCellCoords(-1, -1);
else if (m_chars[i] == c)
return wxGridCellCoords((int)(i / m_numCols), i % m_numCols);
}
} }
protected: protected:
@ -103,7 +102,7 @@ private:
void Init(); // common part of all ctors void Init(); // common part of all ctors
protected: protected:
wxArrayString m_chars; ///< Array of Unicode characters to display in the grid wxString m_chars; ///< Array of Unicode characters to display in the grid
wxArrayShort m_relevance; ///< Bit-array of `m_chars` relevance wxArrayShort m_relevance; ///< Bit-array of `m_chars` relevance
private: private:

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -57,18 +71,14 @@ void wxZRColaCharRequest::OnOKButtonClick(wxCommandEvent& event)
// wxPersistentZRColaCharRequest // wxPersistentZRColaCharRequest
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaCharRequest::s_guiLevel = 1; wxPersistentZRColaCharRequest::wxPersistentZRColaCharRequest(wxZRColaCharRequest *wnd) : wxPersistentDialog(wnd)
wxPersistentZRColaCharRequest::wxPersistentZRColaCharRequest(wxZRColaCharRequest *wnd) : wxPersistentTLWEx(wnd)
{ {
} }
void wxPersistentZRColaCharRequest::Save() const void wxPersistentZRColaCharRequest::Save() const
{ {
SaveValue(wxT("guiLevel"), s_guiLevel); wxPersistentDialog::Save();
wxPersistentTLWEx::Save();
auto wnd = static_cast<const wxZRColaCharRequest*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor. auto wnd = static_cast<const wxZRColaCharRequest*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
@ -87,6 +97,5 @@ bool wxPersistentZRColaCharRequest::Restore()
if (RestoreValue(wxT("context"), &str)) if (RestoreValue(wxT("context"), &str))
wnd->m_context->SetValue(str); wnd->m_context->SetValue(str);
int guiLevel; return wxPersistentDialog::Restore();
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;
} }

View File

@ -1,24 +1,32 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
/// Forward declarations /// Forward declarations
/// ///
class wxZRColaCharRequest; class wxZRColaCharRequest;
class wxPersistentZRColaCharRequest;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include "zrcolakeyhndlr.h" #include "zrcolakeyhndlr.h"
#include <wxex/persist/toplevel.h>
/// ///
@ -41,16 +49,13 @@ protected:
/// ///
/// Supports saving/restoring wxZRColaCharRequest state /// Supports saving/restoring wxZRColaCharRequest state
/// ///
class wxPersistentZRColaCharRequest : public wxPersistentTLWEx class wxPersistentZRColaCharRequest : public wxPersistentDialog
{ {
public: public:
wxPersistentZRColaCharRequest(wxZRColaCharRequest *wnd); wxPersistentZRColaCharRequest(wxZRColaCharRequest *wnd);
virtual void Save() const; virtual void Save() const;
virtual bool Restore(); virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
}; };

View File

@ -1,177 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
//////////////////////////////////////////////////////////////////////
// wxZRColaUTF16CharValidator
//////////////////////////////////////////////////////////////////////
wxIMPLEMENT_DYNAMIC_CLASS(wxZRColaUTF16CharValidator, wxValidator);
wxZRColaUTF16CharValidator::wxZRColaUTF16CharValidator(ZRCola::char_t *val) :
m_val(val),
wxValidator()
{
}
wxObject* wxZRColaUTF16CharValidator::Clone() const
{
return new wxZRColaUTF16CharValidator(*this);
}
bool wxZRColaUTF16CharValidator::Validate(wxWindow *parent)
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
if (!ctrl->IsEnabled()) return true;
wxString val(ctrl->GetValue());
return Parse(val, 0, val.Length(), ctrl, parent);
}
bool wxZRColaUTF16CharValidator::TransferToWindow()
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
if (m_val)
((wxTextCtrl*)GetWindow())->SetValue(wxString::Format(wxT("%04X"), *m_val));
return true;
}
bool wxZRColaUTF16CharValidator::TransferFromWindow()
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
wxString val(ctrl->GetValue());
return Parse(val, 0, val.Length(), ctrl, NULL, m_val);
}
bool wxZRColaUTF16CharValidator::Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, ZRCola::char_t *val_out)
{
const wxStringCharType *buf = val_in;
ZRCola::char_t chr = 0;
for (size_t i = i_start;;) {
if (i >= i_end) {
// End of Unicode found.
if (val_out) *val_out = chr;
return true;
} else if (i >= i_start + 4) {
// Maximum characters exceeded.
ctrl->SetFocus();
ctrl->SetSelection((int)i, (int)i_end);
wxMessageBox(_("Too many digits in Unicode."), _("Validation conflict"), wxOK | wxICON_EXCLAMATION, parent);
return false;
} else if (_T('0') <= buf[i] && buf[i] <= _T('9')) {
// Digit found.
chr = (chr << 4) | (buf[i] - _T('0'));
i++;
} else if (_T('A') <= buf[i] && buf[i] <= _T('F')) {
// Capital letter found.
chr = (chr << 4) | (buf[i] - _T('A') + 10);
i++;
} else if (_T('a') <= buf[i] && buf[i] <= _T('f')) {
// Lower letter found.
chr = (chr << 4) | (buf[i] - _T('a') + 10);
i++;
} else {
// Invalid character found.
ctrl->SetFocus();
ctrl->SetSelection((long)i, (long)(i + 1));
wxMessageBox(wxString::Format(_("Invalid character in Unicode found: %c"), buf[i]), _("Validation conflict"), wxOK | wxICON_EXCLAMATION, parent);
return false;
}
}
}
//////////////////////////////////////////////////////////////////////
// wxZRColaUnicodeDumpValidator
//////////////////////////////////////////////////////////////////////
wxIMPLEMENT_DYNAMIC_CLASS(wxZRColaUnicodeDumpValidator, wxValidator);
wxZRColaUnicodeDumpValidator::wxZRColaUnicodeDumpValidator(wxString *val) :
m_val(val),
wxValidator()
{
}
wxObject* wxZRColaUnicodeDumpValidator::Clone() const
{
return new wxZRColaUnicodeDumpValidator(*this);
}
bool wxZRColaUnicodeDumpValidator::Validate(wxWindow *parent)
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
if (!ctrl->IsEnabled()) return true;
wxString val(ctrl->GetValue());
return Parse(val, 0, val.Length(), ctrl, parent);
}
bool wxZRColaUnicodeDumpValidator::TransferToWindow()
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
if (m_val)
((wxTextCtrl*)GetWindow())->SetValue(ZRCola::GetUnicodeDumpW(m_val->c_str(), m_val->length(), L"+"));
return true;
}
bool wxZRColaUnicodeDumpValidator::TransferFromWindow()
{
wxASSERT(GetWindow()->IsKindOf(CLASSINFO(wxTextCtrl)));
wxTextCtrl *ctrl = (wxTextCtrl*)GetWindow();
wxString val(ctrl->GetValue());
return Parse(val, 0, val.Length(), ctrl, NULL, m_val);
}
bool wxZRColaUnicodeDumpValidator::Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wxString *val_out)
{
const wxStringCharType *buf = val_in;
wxString str;
for (size_t i = i_start;;) {
const wxStringCharType *buf_next;
ZRCola::char_t chr;
if ((buf_next = wmemchr(buf + i, L'+', i_end - i)) != NULL) {
// Unicode dump separator found.
if (!wxZRColaUTF16CharValidator::Parse(val_in, i, buf_next - buf, ctrl, parent, &chr))
return false;
str += chr;
i = buf_next - buf + 1;
} else if (wxZRColaUTF16CharValidator::Parse(val_in, i, i_end, ctrl, parent, &chr)) {
// The rest of the FQDN parsed succesfully.
if (chr) str += chr;
if (val_out) *val_out = str;
return true;
} else
return false;
}
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -184,11 +30,11 @@ wxDEFINE_EVENT(wxEVT_SEARCH_COMPLETE, wxThreadEvent);
wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) : wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) :
m_searchChanged(false), m_searchChanged(false),
m_unicodeChanged(false), m_unicodeChanged(false),
m_char(0),
m_searchThread(NULL), m_searchThread(NULL),
wxZRColaCharSelectBase(parent) wxZRColaCharSelectBase(parent)
{ {
// Set tag lookup locale. // Set tag lookup locale.
#pragma warning(suppress: 26812) // wxLanguage is unscoped
wxLanguage language = dynamic_cast<ZRColaApp*>(wxTheApp)->m_lang_ui; wxLanguage language = dynamic_cast<ZRColaApp*>(wxTheApp)->m_lang_ui;
if (wxLANGUAGE_DEFAULT == language || if (wxLANGUAGE_DEFAULT == language ||
wxLANGUAGE_ENGLISH <= language && language <= wxLANGUAGE_ENGLISH_ZIMBABWE) m_locale = MAKELCID(MAKELANGID(LANG_ENGLISH , SUBLANG_DEFAULT), SORT_DEFAULT); wxLANGUAGE_ENGLISH <= language && language <= wxLANGUAGE_ENGLISH_ZIMBABWE) m_locale = MAKELCID(MAKELANGID(LANG_ENGLISH , SUBLANG_DEFAULT), SORT_DEFAULT);
@ -200,15 +46,15 @@ wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) :
m_search_more->SetLabel(_(L"▸ Search Options")); m_search_more->SetLabel(_(L"▸ Search Options"));
m_unicode->SetValidator(wxZRColaUnicodeDumpValidator(&m_char)); m_unicode->SetValidator(wxHexValidator<wchar_t>(&m_char, wxNUM_VAL_DEFAULT, 4));
// Fill categories. // Fill categories.
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
const auto &cc = app->m_cc_db.idxRank[i]; const auto &cc = app->m_cc_db.idxRnk[i];
int idx = m_categories->Insert(wxGetTranslation(wxString(cc.name(), cc.name_len()), wxT("ZRCola-zrcdb")), (unsigned int)i); int idx = m_categories->Insert(wxGetTranslation(wxString(cc.name, cc.name_len), wxT("ZRCola-zrcdb")), i);
m_categories->Check(idx); m_categories->Check(idx);
m_ccOrder.insert(std::make_pair(cc.cat, idx)); m_ccOrder.insert(std::make_pair(cc.id, idx));
} }
ResetResults(); ResetResults();
@ -223,10 +69,8 @@ wxZRColaCharSelect::wxZRColaCharSelect(wxWindow* parent) :
wxZRColaCharSelect::~wxZRColaCharSelect() wxZRColaCharSelect::~wxZRColaCharSelect()
{ {
if (m_searchThread) { if (m_searchThread)
#pragma warning(suppress: 26812) // wxThreadError is unscoped.
m_searchThread->Delete(); m_searchThread->Delete();
}
Disconnect(wxID_ANY, wxEVT_SEARCH_COMPLETE, wxThreadEventHandler(wxZRColaCharSelect::OnSearchComplete), NULL, this); Disconnect(wxID_ANY, wxEVT_SEARCH_COMPLETE, wxThreadEventHandler(wxZRColaCharSelect::OnSearchComplete), NULL, this);
} }
@ -240,24 +84,24 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
if (m_unicode->GetValidator()->TransferFromWindow()) { if (m_unicode->GetValidator()->TransferFromWindow()) {
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_gridPreview->SetCellValue(0, 0, m_char); m_gridPreview->SetCellValue(0, 0, wxString(1, m_char));
std::unique_ptr<ZRCola::character_db::character> ch((ZRCola::character_db::character*)new char[sizeof(ZRCola::character_db::character) + sizeof(ZRCola::char_t)*m_char.length()]); char chr[sizeof(ZRCola::character_db::character)] = {};
ch->ZRCola::character_db::character::character(m_char.data(), m_char.length()); ((ZRCola::character_db::character*)chr)->chr = m_char;
ZRCola::character_db::indexChr::size_type ch_start; size_t start;
if (app->m_chr_db.idxChr.find(*ch, ch_start)) { if (app->m_chr_db.idxChr.find(*(ZRCola::character_db::character*)chr, start)) {
const auto &chr = app->m_chr_db.idxChr[ch_start]; const auto &chr = app->m_chr_db.idxChr[start];
// Update character description. // Update character description.
m_description->SetValue(wxString(chr.desc(), chr.desc_len())); m_description->SetValue(wxString(chr.data, chr.desc_len));
{ {
// See if this character has a key sequence registered. // See if this character has a key sequence registered.
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::char_t)*m_char.length()]); char ks[sizeof(ZRCola::keyseq_db::keyseq)] = {};
ks->ZRCola::keyseq_db::keyseq::keyseq(NULL, 0, m_char.data(), m_char.length()); ((ZRCola::keyseq_db::keyseq*)ks)->chr = m_char;
ZRCola::keyseq_db::indexKey::size_type ks_start; ZRCola::keyseq_db::indexKey::size_type start;
if (app->m_ks_db.idxChr.find(*ks, ks_start)) { if (app->m_ks_db.idxChr.find(*(ZRCola::keyseq_db::keyseq*)ks, start)) {
const auto &seq = app->m_ks_db.idxChr[ks_start]; ZRCola::keyseq_db::keyseq &seq = app->m_ks_db.idxChr[start];
wxString ks_str; wxString ks_str;
if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq(), seq.seq_len(), ks_str)) if (ZRCola::keyseq_db::GetSequenceAsText(seq.seq, seq.seq_len, ks_str))
m_shortcut->SetValue(ks_str); m_shortcut->SetValue(ks_str);
else else
m_shortcut->SetValue(wxEmptyString); m_shortcut->SetValue(wxEmptyString);
@ -265,16 +109,18 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
m_shortcut->SetValue(wxEmptyString); m_shortcut->SetValue(wxEmptyString);
} }
{ {
char cc[sizeof(ZRCola::chrcat_db::chrcat)] = {};
((ZRCola::chrcat_db::chrcat*)cc)->id = chr.cat;
size_t start;
// Update character category. // Update character category.
ZRCola::chrcat_db::indexChrCat::size_type cc_start; if (app->m_cc_db.idxChrCat.find(*((ZRCola::chrcat_db::chrcat*)cc), start)) {
if (app->m_cc_db.idxChrCat.find(ZRCola::chrcat_db::chrcat(chr.cat), cc_start)) { const auto &cat = app->m_cc_db.idxChrCat[start];
const auto &cat = app->m_cc_db.idxChrCat[cc_start]; m_category->SetValue(wxGetTranslation(wxString(cat.name, cat.name_len), wxT("ZRCola-zrcdb")));
m_category->SetValue(wxGetTranslation(wxString(cat.name(), cat.name_len()), wxT("ZRCola-zrcdb")));
} else } else
m_category->SetValue(wxEmptyString); m_category->SetValue(wxEmptyString);
} }
// Update related characters. // Update related characters.
m_gridRelated->SetCharacters(wxString(chr.rel(), chr.rel_end())); m_gridRelated->SetCharacters(wxString(chr.data + chr.desc_len, chr.rel_len));
} else { } else {
m_description->SetValue(wxEmptyString); m_description->SetValue(wxEmptyString);
m_shortcut->SetValue(wxEmptyString); m_shortcut->SetValue(wxEmptyString);
@ -284,24 +130,28 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
// Find character tags. // Find character tags.
std::list<std::wstring> tag_names; std::list<std::wstring> tag_names;
std::unique_ptr<ZRCola::chrtag_db::chrtag> ct((ZRCola::chrtag_db::chrtag*)new char[sizeof(ZRCola::chrtag_db::chrtag) + sizeof(ZRCola::char_t)*m_char.length()]); ZRCola::chrtag_db::chrtag ct = { m_char };
ct->ZRCola::chrtag_db::chrtag::chrtag(m_char.data(), m_char.length()); size_t end;
ZRCola::chrtag_db::indexChr::size_type ct_start, ct_end; if (app->m_ct_db.idxChr.find(ct, start, end)) {
if (app->m_ct_db.idxChr.find(*ct, ct_start, ct_end)) { for (size_t i = start; i < end; i++) {
for (auto i = ct_start; i < ct_end; i++) { const ZRCola::chrtag_db::chrtag &ct = app->m_ct_db.idxChr[i];
// Find tag names. // Find tag names.
ZRCola::tagname_db::indexTag::size_type tn_start, tn_end; char tn[sizeof(ZRCola::tagname_db::tagname)] = {};
if (app->m_tn_db.idxTag.find(ZRCola::tagname_db::tagname(app->m_ct_db.idxChr[i].tag, m_locale), tn_start, tn_end)) { ((ZRCola::tagname_db::tagname*)tn)->locale = m_locale;
for (auto j = tn_start; j < tn_end; j++) { ((ZRCola::tagname_db::tagname*)tn)->tag = ct.tag;
const auto &tn = app->m_tn_db.idxTag[j]; size_t start, end;
if (app->m_tn_db.idxTag.find(*((ZRCola::tagname_db::tagname*)tn), start, end)) {
for (size_t i = start; i < end; i++) {
const ZRCola::tagname_db::tagname &tn = app->m_tn_db.idxTag[i];
// Add tag name to the list (prevent duplicates). // Add tag name to the list (prevent duplicates).
for (auto name = tag_names.cbegin(), name_end = tag_names.cend();; ++name) { for (auto name = tag_names.cbegin(), name_end = tag_names.cend();; ++name) {
if (name == name_end) { if (name == name_end) {
// Add name to the list. // Add name to the list.
tag_names.push_back(std::wstring(tn.name(), tn.name_end())); tag_names.push_back(std::wstring(tn.name, tn.name + tn.name_len));
break; break;
} else if (ZRCola::tagname_db::tagname::CompareName(m_locale, name->data(), (uint16_t)name->length(), tn.name(), tn.name_len()) == 0) } else if (ZRCola::tagname_db::tagname::CompareName(m_locale, name->data(), (unsigned __int16)name->length(), tn.name, tn.name_len) == 0)
// Name is already on the list. // Name is already on the list.
break; break;
} }
@ -341,10 +191,10 @@ void wxZRColaCharSelect::OnIdle(wxIdleEvent& event)
m_searchThread->m_search.assign(val.c_str(), val.Length()); m_searchThread->m_search.assign(val.c_str(), val.Length());
// Select categories. // Select categories.
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
const auto &cc = app->m_cc_db.idxRank[i]; const auto &cc = app->m_cc_db.idxRnk[i];
if (m_categories->IsChecked((unsigned int)i)) if (m_categories->IsChecked(i))
m_searchThread->m_cats.insert(cc.cat); m_searchThread->m_cats.insert(cc.id);
} }
if (m_searchThread->Run() != wxTHREAD_NO_ERROR) { if (m_searchThread->Run() != wxTHREAD_NO_ERROR) {
@ -389,8 +239,8 @@ void wxZRColaCharSelect::OnCategoriesAll(wxHyperlinkEvent& event)
event.StopPropagation(); event.StopPropagation();
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
m_categories->Check((unsigned int)i, true); m_categories->Check(i, true);
m_searchChanged = true; m_searchChanged = true;
} }
@ -401,8 +251,8 @@ void wxZRColaCharSelect::OnCategoriesNone(wxHyperlinkEvent& event)
event.StopPropagation(); event.StopPropagation();
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
m_categories->Check((unsigned int)i, false); m_categories->Check(i, false);
m_searchChanged = true; m_searchChanged = true;
} }
@ -413,8 +263,8 @@ void wxZRColaCharSelect::OnCategoriesInvert(wxHyperlinkEvent& event)
event.StopPropagation(); event.StopPropagation();
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++)
m_categories->Check((unsigned int)i, !m_categories->IsChecked((unsigned int)i)); m_categories->Check(i, !m_categories->IsChecked(i));
m_searchChanged = true; m_searchChanged = true;
} }
@ -434,10 +284,10 @@ void wxZRColaCharSelect::OnSearchComplete(wxThreadEvent& event)
if (m_searchThread) { if (m_searchThread) {
// Display results. // Display results.
wxArrayString chars; wxString chars;
chars.reserve(m_searchThread->m_hits.size()); chars.reserve(m_searchThread->m_hits.size());
for (auto i = m_searchThread->m_hits.cbegin(), i_end = m_searchThread->m_hits.cend(); i != i_end; ++i) for (auto i = m_searchThread->m_hits.cbegin(), i_end = m_searchThread->m_hits.cend(); i != i_end; ++i)
chars.Add(i->second); chars += i->second;
m_gridResults->SetCharacters(chars); m_gridResults->SetCharacters(chars);
m_searchThread->Delete(); m_searchThread->Delete();
@ -454,7 +304,7 @@ void wxZRColaCharSelect::OnResultSelectCell(wxGridEvent& event)
wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol())); wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol()));
if (!val.IsEmpty()) if (!val.IsEmpty())
NavigateTo(val); NavigateTo(val[0]);
} }
@ -464,9 +314,9 @@ void wxZRColaCharSelect::OnResultCellDClick(wxGridEvent& event)
wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol())); wxString val(m_gridResults->GetCellValue(event.GetRow(), event.GetCol()));
if (!val.IsEmpty()) { if (!val.IsEmpty()) {
NavigateTo(val); NavigateTo(val[0]);
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
m_buttonInsert->GetEventHandler()->ProcessEvent(e); m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
} }
} }
@ -478,9 +328,9 @@ void wxZRColaCharSelect::OnResultsKeyDown(wxKeyEvent& event)
case WXK_NUMPAD_ENTER: case WXK_NUMPAD_ENTER:
wxString val(m_gridResults->GetCellValue(m_gridResults->GetGridCursorRow(), m_gridResults->GetGridCursorCol())); wxString val(m_gridResults->GetCellValue(m_gridResults->GetGridCursorRow(), m_gridResults->GetGridCursorCol()));
if (!val.IsEmpty()) { if (!val.IsEmpty()) {
NavigateTo(val); NavigateTo(val[0]);
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
m_buttonInsert->GetEventHandler()->ProcessEvent(e); m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
event.StopPropagation(); event.StopPropagation();
return; return;
@ -497,7 +347,7 @@ void wxZRColaCharSelect::OnRecentSelectCell(wxGridEvent& event)
wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol())); wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol()));
if (!val.IsEmpty()) if (!val.IsEmpty())
NavigateTo(val); NavigateTo(val[0]);
} }
@ -507,9 +357,9 @@ void wxZRColaCharSelect::OnRecentCellDClick(wxGridEvent& event)
wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol())); wxString val(m_gridRecent->GetCellValue(event.GetRow(), event.GetCol()));
if (!val.IsEmpty()) { if (!val.IsEmpty()) {
NavigateTo(val); NavigateTo(val[0]);
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
m_buttonInsert->GetEventHandler()->ProcessEvent(e); m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
} }
} }
@ -521,9 +371,9 @@ void wxZRColaCharSelect::OnRecentKeyDown(wxKeyEvent& event)
case WXK_NUMPAD_ENTER: case WXK_NUMPAD_ENTER:
wxString val(m_gridRecent->GetCellValue(m_gridRecent->GetGridCursorRow(), m_gridRecent->GetGridCursorCol())); wxString val(m_gridRecent->GetCellValue(m_gridRecent->GetGridCursorRow(), m_gridRecent->GetGridCursorCol()));
if (!val.IsEmpty()) { if (!val.IsEmpty()) {
NavigateTo(val); NavigateTo(val[0]);
wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); wxCommandEvent e(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
m_buttonInsert->GetEventHandler()->ProcessEvent(e); m_sdbSizerButtonsOK->GetEventHandler()->ProcessEvent(e);
event.StopPropagation(); event.StopPropagation();
return; return;
@ -581,38 +431,24 @@ void wxZRColaCharSelect::OnRelatedSelectCell(wxGridEvent& event)
wxString val(m_gridRelated->GetCellValue(event.GetRow(), event.GetCol())); wxString val(m_gridRelated->GetCellValue(event.GetRow(), event.GetCol()));
if (!val.IsEmpty()) if (!val.IsEmpty())
NavigateTo(val); NavigateTo(val[0]);
} }
void wxZRColaCharSelect::OnInsertUpdateUI(wxUpdateUIEvent& event) void wxZRColaCharSelect::OnOKButtonClick(wxCommandEvent& event)
{
event.Enable(!m_char.empty());
}
void wxZRColaCharSelect::OnInsert(wxCommandEvent& event)
{ {
event.Skip(); event.Skip();
const wxArrayString &recent = m_gridRecent->GetCharacters(); wxString
wxArrayString val; recent(m_gridRecent->GetCharacters()),
val.reserve(recent.GetCount() + 1); val(1, m_char);
val.Add(m_char); for (size_t i = 0, n = recent.Length(); i < n; i++) {
for (size_t i = 0, n = recent.GetCount(); i < n; i++) { const wxStringCharType c = recent[i];
const wxString &c = recent[i];
if (c != m_char) if (c != m_char)
val.Add(c); val += c;
} }
m_gridRecent->SetCharacters(val); m_gridRecent->SetCharacters(val);
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
if (app->m_mainWnd) {
app->m_mainWnd->m_panel->m_source->WriteText(m_char);
app->m_mainWnd->m_panel->m_source->SetFocus();
}
Show(false);
} }
@ -621,13 +457,13 @@ void wxZRColaCharSelect::ResetResults()
// Fill the results. // Fill the results.
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
size_t i, n = app->m_chr_db.idxChr.size(); size_t i, n = app->m_chr_db.idxChr.size();
wxArrayString val; wxString val;
val.reserve(n); val.reserve(n);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
const auto &chr = app->m_chr_db.idxChr[i]; const auto &chr = app->m_chr_db.idxChr[i];
auto idx = m_ccOrder.find(chr.cat); auto idx = m_ccOrder.find(chr.cat);
if (idx == m_ccOrder.end() || m_categories->IsChecked(idx->second)) if (idx == m_ccOrder.end() || m_categories->IsChecked(idx->second))
val.Add(wxString(chr.chr(), chr.chr_len())); val += chr.chr;
} }
m_gridResults->SetCharacters(val); m_gridResults->SetCharacters(val);
} }
@ -671,7 +507,7 @@ void wxZRColaCharSelect::NavigateBy(int offset)
} }
void wxZRColaCharSelect::NavigateTo(const wxString &c) void wxZRColaCharSelect::NavigateTo(wchar_t c)
{ {
if (m_char != c) { if (m_char != c) {
// Update history state // Update history state
@ -712,20 +548,20 @@ wxZRColaCharSelect::SearchThread::SearchThread(wxZRColaCharSelect *parent) :
wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry() wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
{ {
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
std::map<std::wstring, ZRCola::charrank_t> hits; std::map<wchar_t, ZRCola::charrank_t> hits;
if (TestDestroy()) return (wxThread::ExitCode)1; if (TestDestroy()) return (wxThread::ExitCode)1;
{ {
// Search by tags: Get tags with given names. Then, get characters of found tags. // Search by tags: Get tags with given names. Then, get characters of found tags.
std::map<ZRCola::tagid_t, uint16_t> hits_tag; std::map<ZRCola::tagid_t, unsigned __int16> hits_tag;
if (!app->m_tn_db.Search(m_search.c_str(), m_parent->m_locale, hits_tag, TestDestroyS, this)) return (wxThread::ExitCode)1; if (!app->m_tn_db.Search(m_search.c_str(), m_parent->m_locale, hits_tag, TestDestroyS, this)) return (wxThread::ExitCode)1;
if (!app->m_ct_db.Search(hits_tag, app->m_chr_db, m_cats, hits, TestDestroyS, this)) return (wxThread::ExitCode)1; if (!app->m_ct_db.Search(hits_tag, app->m_chr_db, m_cats, hits, TestDestroyS, this)) return (wxThread::ExitCode)1;
} }
{ {
// Search by description and merge results. // Search by description and merge results.
std::map<std::wstring, ZRCola::charrank_t> hits_sub; std::map<wchar_t, ZRCola::charrank_t> hits_sub;
if (!app->m_chr_db.Search(m_search.c_str(), m_cats, hits, hits_sub, TestDestroyS, this)) return (wxThread::ExitCode)1; if (!app->m_chr_db.Search(m_search.c_str(), m_cats, hits, hits_sub, TestDestroyS, this)) return (wxThread::ExitCode)1;
for (auto i = hits_sub.cbegin(), i_end = hits_sub.cend(); i != i_end; ++i) { for (auto i = hits_sub.cbegin(), i_end = hits_sub.cend(); i != i_end; ++i) {
if (TestDestroy()) return (wxThread::ExitCode)1; if (TestDestroy()) return (wxThread::ExitCode)1;
@ -753,7 +589,7 @@ wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
if (i->second > rank_threshold) if (i->second > rank_threshold)
m_hits.push_back(std::make_pair(i->second, i->first)); m_hits.push_back(std::make_pair(i->second, i->first));
} }
std::qsort(m_hits.data(), m_hits.size(), sizeof(std::pair<ZRCola::charrank_t, std::wstring>), CompareHits); std::qsort(m_hits.data(), m_hits.size(), sizeof(std::pair<ZRCola::charrank_t, wchar_t>), CompareHits);
// Signal the event handler that this thread is going to be destroyed. // Signal the event handler that this thread is going to be destroyed.
// NOTE: here we assume that using the m_parent pointer is safe, // NOTE: here we assume that using the m_parent pointer is safe,
@ -766,14 +602,14 @@ wxThread::ExitCode wxZRColaCharSelect::SearchThread::Entry()
int __cdecl wxZRColaCharSelect::SearchThread::CompareHits(const void *a, const void *b) int __cdecl wxZRColaCharSelect::SearchThread::CompareHits(const void *a, const void *b)
{ {
const std::pair<ZRCola::charrank_t, ZRCola::char_t> *_a = (const std::pair<ZRCola::charrank_t, ZRCola::char_t>*)a; const std::pair<ZRCola::charrank_t, wchar_t> *_a = (const std::pair<ZRCola::charrank_t, wchar_t>*)a;
const std::pair<ZRCola::charrank_t, ZRCola::char_t> *_b = (const std::pair<ZRCola::charrank_t, ZRCola::char_t>*)b; const std::pair<ZRCola::charrank_t, wchar_t> *_b = (const std::pair<ZRCola::charrank_t, wchar_t>*)b;
if (_a->first > _b->first) return -1; if (_a->first > _b->first) return -1;
if (_a->first < _b->first) return 1; else if (_a->first < _b->first) return 1;
if (_a->second < _b->second) return -1; if (_a->second < _b->second) return -1;
if (_a->second > _b->second) return 1; else if (_a->second > _b->second) return 1;
return 0; return 0;
} }
@ -789,42 +625,25 @@ bool __cdecl wxZRColaCharSelect::SearchThread::TestDestroyS(void *cookie)
// wxPersistentZRColaCharSelect // wxPersistentZRColaCharSelect
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaCharSelect::s_guiLevel = 1; wxPersistentZRColaCharSelect::wxPersistentZRColaCharSelect(wxZRColaCharSelect *wnd) : wxPersistentDialog(wnd)
wxPersistentZRColaCharSelect::wxPersistentZRColaCharSelect(wxZRColaCharSelect *wnd) : wxPersistentTLWEx(wnd)
{ {
} }
void wxPersistentZRColaCharSelect::Save() const void wxPersistentZRColaCharSelect::Save() const
{ {
SaveValue(wxT("guiLevel"), s_guiLevel); wxPersistentDialog::Save();
wxPersistentTLWEx::Save();
auto wnd = static_cast<const wxZRColaCharSelect*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor. auto wnd = static_cast<const wxZRColaCharSelect*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString str, str2; SaveValue(wxT("recentChars"), wnd->m_gridRecent->GetCharacters());
auto &recent = wnd->m_gridRecent->GetCharacters();
for (size_t i = 0, n = recent.GetCount(); i < n; i++) {
if (i) str2 += wxT('|');
auto &chr = recent[i];
for (size_t j = 0, m = chr.Length(); j < m; j++) {
if (j) str2 += wxT('+');
str2 += wxString::Format(wxT("%04X"), chr[j]);
}
if (chr.Length() == 1)
str += chr[0];
}
SaveValue(wxT("recentChars" ), str ); // Save in legacy format for backward compatibility.
SaveValue(wxT("recentChars2"), str2); // Save in native format
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
const auto &cc = app->m_cc_db.idxRank[i]; const auto &cc = app->m_cc_db.idxRnk[i];
wxString name(wxT("category")); wxString name(wxT("category"));
name.Append(cc.cat.data, _countof(cc.cat.data)); name.Append(cc.id.data, _countof(cc.id.data));
SaveValue(name, wnd->m_categories->IsChecked((unsigned int)i)); SaveValue(name, wnd->m_categories->IsChecked(i));
} }
SaveValue(wxT("searchPanel"), wnd->m_search_panel->IsShown()); SaveValue(wxT("searchPanel"), wnd->m_search_panel->IsShown());
@ -836,32 +655,17 @@ bool wxPersistentZRColaCharSelect::Restore()
auto wnd = dynamic_cast<wxZRColaCharSelect*>(GetWindow()); auto wnd = dynamic_cast<wxZRColaCharSelect*>(GetWindow());
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString str; wxString recent;
if (RestoreValue(wxT("recentChars2"), &str)) { if (RestoreValue(wxT("recentChars"), &recent))
// Native format found. wnd->m_gridRecent->SetCharacters(recent);
wxArrayString val;
for (wxStringTokenizer tok(str, wxT("|")); tok.HasMoreTokens(); ) {
wxString chr;
for (wxStringTokenizer tok_chr(tok.GetNextToken(), wxT("+")); tok_chr.HasMoreTokens(); )
chr += (ZRCola::char_t)_tcstoul(tok_chr.GetNextToken().c_str(), NULL, 16);
val.Add(chr);
}
wnd->m_gridRecent->SetCharacters(val);
} else if (RestoreValue(wxT("recentChars"), &str)) {
// Legacy value found.
wxArrayString val;
for (size_t i = 0, n = str.Length(); i < n; i++)
val.Add(wxString(1, str[i]));
wnd->m_gridRecent->SetCharacters(val);
}
for (size_t i = 0, n = app->m_cc_db.idxRank.size(); i < n; i++) { for (size_t i = 0, n = app->m_cc_db.idxRnk.size(); i < n; i++) {
const auto &cc = app->m_cc_db.idxRank[i]; const auto &cc = app->m_cc_db.idxRnk[i];
wxString name(wxT("category")); wxString name(wxT("category"));
name.Append(cc.cat.data, _countof(cc.cat.data)); name.Append(cc.id.data, _countof(cc.id.data));
bool val; bool val;
if (RestoreValue(name, &val)) if (RestoreValue(name, &val))
wnd->m_categories->Check((unsigned int)i, val); wnd->m_categories->Check(i, val);
} }
bool search_panel; bool search_panel;
@ -877,6 +681,5 @@ bool wxPersistentZRColaCharSelect::Restore()
wnd->ResetResults(); wnd->ResetResults();
int guiLevel; return wxPersistentDialog::Restore();
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;
} }

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -12,115 +26,17 @@ class wxPersistentZRColaCharSelect;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include <zrcola/character.h> #include <zrcola/character.h>
#include <wxex/persist/toplevel.h> #include <wxex/valhex.h>
#pragma warning(push) #include <wxex/persist/dialog.h>
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/validate.h>
#include <wx/event.h> #include <wx/event.h>
#include <wx/thread.h> #include <wx/thread.h>
#pragma warning(pop)
#include <list> #include <list>
#include <map> #include <map>
#include <string>
#include <vector> #include <vector>
///
/// Validator for Unicode character
///
class wxZRColaUTF16CharValidator : public wxValidator
{
public:
///
/// Construct the validator with a value to store data
///
wxZRColaUTF16CharValidator(ZRCola::char_t *val = NULL);
///
/// Copies this validator
///
virtual wxObject* Clone() const;
///
/// Validates the value
///
virtual bool Validate(wxWindow *parent);
///
/// Transfers the value to the window
///
virtual bool TransferToWindow();
///
/// Transfers the value from the window
///
virtual bool TransferFromWindow();
///
/// Parses FQDN value
///
static bool Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wchar_t *val_out = NULL);
protected:
wchar_t *m_val; ///< Pointer to variable to receive control's parsed value
private:
wxDECLARE_DYNAMIC_CLASS(wxZRColaUTF16CharValidator);
wxDECLARE_NO_ASSIGN_CLASS(wxZRColaUTF16CharValidator);
};
///
/// Validator for Unicode dump
///
class wxZRColaUnicodeDumpValidator : public wxValidator
{
public:
///
/// Construct the validator with a value to store data
///
wxZRColaUnicodeDumpValidator(wxString *val = NULL);
///
/// Copies this validator
///
virtual wxObject* Clone() const;
///
/// Validates the value
///
virtual bool Validate(wxWindow *parent);
///
/// Transfers the value to the window
///
virtual bool TransferToWindow();
///
/// Transfers the value from the window
///
virtual bool TransferFromWindow();
///
/// Parses Unicode dump value
///
static bool Parse(const wxString &val_in, size_t i_start, size_t i_end, wxTextCtrl *ctrl, wxWindow *parent, wxString *val_out = NULL);
protected:
wxString *m_val; ///< Pointer to variable to receive control's parsed value
private:
wxDECLARE_DYNAMIC_CLASS(wxZRColaUnicodeDumpValidator);
wxDECLARE_NO_ASSIGN_CLASS(wxZRColaUnicodeDumpValidator);
};
wxDECLARE_EVENT(wxEVT_SEARCH_COMPLETE, wxThreadEvent); wxDECLARE_EVENT(wxEVT_SEARCH_COMPLETE, wxThreadEvent);
@ -156,15 +72,14 @@ protected:
virtual void OnUnicodeText(wxCommandEvent& event); virtual void OnUnicodeText(wxCommandEvent& event);
virtual void OnPreviewKeyDown(wxKeyEvent& event); virtual void OnPreviewKeyDown(wxKeyEvent& event);
virtual void OnRelatedSelectCell(wxGridEvent& event); virtual void OnRelatedSelectCell(wxGridEvent& event);
virtual void OnInsertUpdateUI(wxUpdateUIEvent& event); virtual void OnOKButtonClick(wxCommandEvent& event);
virtual void OnInsert(wxCommandEvent& event);
void ResetResults(); void ResetResults();
void NavigateBy(int offset); void NavigateBy(int offset);
void NavigateTo(const wxString &c); void NavigateTo(wchar_t c);
public: public:
wxString m_char; ///< Currently selected character (empty when none) wchar_t m_char; ///< Currently selected character (0 when none)
protected: protected:
LCID m_locale; ///< Locale for tag lookup LCID m_locale; ///< Locale for tag lookup
@ -189,7 +104,7 @@ protected:
public: public:
std::wstring m_search; ///< Search phrase std::wstring m_search; ///< Search phrase
std::set<ZRCola::chrcatid_t> m_cats; ///< Search categories std::set<ZRCola::chrcatid_t> m_cats; ///< Search categories
std::vector<std::pair<ZRCola::charrank_t, std::wstring> > m_hits; ///< Search results std::vector<std::pair<ZRCola::charrank_t, wchar_t> > m_hits; ///< Search results
protected: protected:
wxZRColaCharSelect *m_parent; ///< Thread owner wxZRColaCharSelect *m_parent; ///< Thread owner
@ -201,7 +116,7 @@ protected:
/// ///
struct NavigationState struct NavigationState
{ {
std::wstring m_char; wchar_t m_char;
struct { struct {
wxGridCellCoords m_selected; wxGridCellCoords m_selected;
} m_related; } m_related;
@ -215,16 +130,13 @@ protected:
/// ///
/// Supports saving/restoring wxZRColaCharSelect state /// Supports saving/restoring wxZRColaCharSelect state
/// ///
class wxPersistentZRColaCharSelect : public wxPersistentTLWEx class wxPersistentZRColaCharSelect : public wxPersistentDialog
{ {
public: public:
wxPersistentZRColaCharSelect(wxZRColaCharSelect *wnd); wxPersistentZRColaCharSelect(wxZRColaCharSelect *wnd);
virtual void Save() const; virtual void Save() const;
virtual bool Restore(); virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
}; };

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -11,66 +25,42 @@
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) : wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) :
m_sourceChanged(false), m_decomposedChanged(false),
m_destinationChanged(false), m_composedChanged(false),
m_sourceRestyled(false), m_selDecomposed(0, 0),
m_destinationRestyled(false), m_selComposed(0, 0),
m_styleNormal(*wxBLACK, *wxWHITE, wxFont(20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola"))),
m_stylePUA(*wxBLUE, *wxWHITE, wxFont(20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola"))),
m_styleZRColaUnicodeComposedIssues(*wxRED, *wxWHITE, wxFont(20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola"))),
m_selSource(0, 0),
m_selDestination(0, 0),
wxZRColaComposerPanelBase(parent) wxZRColaComposerPanelBase(parent)
{ {
// RichEdit control has no inner margins by default. m_decomposed->PushEventHandler(&m_keyhandler);
m_source->SetMargins(FromDIP(wxPoint(5, 2)));
m_destination->SetMargins(FromDIP(wxPoint(5, 2)));
m_source->PushEventHandler(&m_keyhandler);
}
wxZRColaComposerPanel::~wxZRColaComposerPanel()
{
m_source->PopEventHandler();
// This is a controlled exit. Purge saved state.
wxString fileName(GetStateFileName());
if (wxFileExists(fileName))
wxRemoveFile(fileName);
}
void wxZRColaComposerPanel::RestoreFromStateFile()
{
// Restore the previously saved state (if exists). // Restore the previously saved state (if exists).
wxString fileName(GetStateFileName()); wxString fileName(GetStateFileName());
if (wxFileExists(fileName)) { if (wxFileExists(fileName)) {
wxFFile file(fileName, wxT("rb")); wxFFile file(fileName, wxT("rb"));
if (file.IsOpened()) { if (file.IsOpened()) {
// Load source text. // Load decomposed text.
uint64_t n; unsigned __int64 n;
file.Read(&n, sizeof(n)); file.Read(&n, sizeof(n));
if (!file.Error()) { if (!file.Error()) {
wxString source; wxString decomposed;
file.Read(wxStringBuffer(source, (size_t)n), sizeof(wchar_t)*(size_t)n); file.Read(wxStringBuffer(decomposed, n), sizeof(wchar_t)*n);
if (!file.Error()) { if (!file.Error()) {
// Load destination text. // Load composed text.
file.Read(&n, sizeof(n)); file.Read(&n, sizeof(n));
if (!file.Error()) { if (!file.Error()) {
wxString destination; wxString composed;
file.Read(wxStringBuffer(destination, (size_t)n), sizeof(wchar_t)*(size_t)n); file.Read(wxStringBuffer(composed, n), sizeof(wchar_t)*n);
if (!file.Error()) { if (!file.Error()) {
// Restore state. // Restore state.
m_source->SetValue(source); m_decomposed->SetValue(decomposed);
m_source->GetSelection(&m_selSource.first, &m_selSource.second); m_decomposed->GetSelection(&m_selDecomposed.first, &m_selDecomposed.second);
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, source.GetData(), source.Length(), m_selSource.first, m_selSource.second); SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, decomposed.GetData(), decomposed.Length(), m_selDecomposed.first, m_selDecomposed.second);
m_sourceChanged = false; m_decomposedChanged = false;
m_destination->SetValue(destination); m_composed->SetValue(composed);
m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second); m_composed->GetSelection(&m_selComposed.first, &m_selComposed.second);
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, destination.GetData(), destination.Length(), m_selDestination.first, m_selDestination.second); SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, composed.GetData(), composed.Length(), m_selComposed.first, m_selComposed.second);
m_destinationChanged = false; m_composedChanged = false;
} }
} }
} }
@ -80,277 +70,208 @@ void wxZRColaComposerPanel::RestoreFromStateFile()
} }
wxZRColaComposerPanel::~wxZRColaComposerPanel()
{
m_decomposed->PopEventHandler();
// This is a controlled exit. Purge saved state.
wxString fileName(GetStateFileName());
if (wxFileExists(fileName))
wxRemoveFile(fileName);
}
void wxZRColaComposerPanel::SynchronizePanels() void wxZRColaComposerPanel::SynchronizePanels()
{ {
if (m_sourceChanged) { if (m_decomposedChanged) {
m_timerSave.Stop(); m_timerSave.Stop();
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString src;
size_t len = GetValue(m_decomposed, src);
wxString src = m_source->GetValue(); std::wstring norm;
size_t len = src.Length(); app->m_t_db.Decompose(src.data(), len, norm, &m_mapping1);
std::wstring dst(src.data(), len), dst2;
ZRCola::mapping_vector map;
m_mapping.clear(); std::wstring dst;
app->m_t_db.Compose(norm.data(), norm.size(), dst, &m_mapping2);
if (app->m_mainWnd->m_composition) { m_decomposed->GetSelection(&m_selDecomposed.first, &m_selDecomposed.second);
// ZRCola decompose first, then re-compose.
app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), dst2, &map);
m_mapping.push_back(std::move(map));
map.clear();
app->m_t_db.Translate(app->m_mainWnd->m_composition_id, dst2.data(), dst2.size(), dst, &map); // Update decomposed HEX dump.
m_mapping.push_back(std::move(map)); SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, src.data(), len, m_selDecomposed.first, m_selDecomposed.second);
map.clear();
}
// Other translations // Update composed text, and its HEX dump.
const ZRCola::transetid_t *sets_begin, *sets_end; m_composed->SetValue(dst);
GetTranslationSeq(sets_begin, sets_end); m_composed->SetSelection(
for (auto s = sets_begin; s != sets_end; ++s) { m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.first )),
app->m_t_db.Translate(*s, dst.data(), dst.size(), dst2, &map); m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.second)));
m_mapping.push_back(std::move(map)); SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, dst.data(), dst.length(), m_selComposed.first, m_selComposed.second);
map.clear();
dst = std::move(dst2);
dst2.clear();
}
m_source->GetSelection(&m_selSource.first, &m_selSource.second);
// Update source HEX dump.
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, src.data(), len, m_selSource.first, m_selSource.second);
// Update destination text, and its HEX dump.
m_destination->SetValue(dst);
m_destination->SetSelection(
m_selDestination.first = (long)MapToDestination(m_selSource.first ),
m_selDestination.second = (long)MapToDestination(m_selSource.second));
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, dst.data(), dst.length(), m_selDestination.first, m_selDestination.second);
// Schedule state save after 3s. // Schedule state save after 3s.
m_timerSave.Start(3000, true); m_timerSave.Start(3000, true);
} else if (m_destinationChanged) { } else if (m_composedChanged) {
m_timerSave.Stop(); m_timerSave.Stop();
wxString src;
size_t len = GetValue(m_composed, src);
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
std::wstring dst;
wxZRColaFrame *mainWnd = dynamic_cast<wxZRColaFrame*>(wxGetActiveWindow());
if (mainWnd)
app->m_t_db.Decompose(src.data(), len, &app->m_lc_db, mainWnd->m_settings->m_lang, dst, &m_mapping2);
else
app->m_t_db.Decompose(src.data(), len, dst, &m_mapping2);
wxString src = m_destination->GetValue(); m_mapping1.clear();
size_t len = src.Length(); m_mapping2.invert();
std::wstring dst(src.data(), len), dst2;
ZRCola::mapping_vector map;
m_mapping.clear(); m_composed->GetSelection(&m_selComposed.first, &m_selComposed.second);
// Other translations // Update composed HEX dump.
const ZRCola::transetid_t *sets_begin, *sets_end; SetHexValue(m_composedHex, m_selComposedHex, m_mappingComposedHex, src.data(), len, m_selComposed.first, m_selComposed.second);
GetTranslationSeq(sets_begin, sets_end);
for (auto s = sets_end; (s--) != sets_begin;) {
app->m_t_db.TranslateInv(*s, dst.data(), dst.size(), dst2, &map);
dst = std::move(dst2);
dst2.clear();
for (auto& m : map) // Update decomposed text, and its HEX dump.
m.invert(); m_decomposed->SetValue(dst);
m_mapping.push_back(std::move(map)); m_decomposed->SetSelection(
map.clear(); m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.first )),
} m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.second)));
SetHexValue(m_decomposedHex, m_selDecomposedHex, m_mappingDecomposedHex, dst.data(), dst.length(), m_selDecomposed.first, m_selDecomposed.second);
if (app->m_mainWnd->m_composition) {
// ZRCola decompose.
app->m_t_db.TranslateInv(app->m_mainWnd->m_composition_id, dst.data(), dst.size(), &app->m_lc_db, app->m_mainWnd->m_settings->m_lang, dst2, &map);
dst = std::move(dst2);
dst2.clear();
for (auto& m : map)
m.invert();
m_mapping.push_back(std::move(map));
map.clear();
}
m_destination->GetSelection(&m_selDestination.first, &m_selDestination.second);
// Update destination HEX dump.
SetHexValue(m_destinationHex, m_selDestinationHex, m_mappingDestinationHex, src.data(), len, m_selDestination.first, m_selDestination.second);
// Update source text, and its HEX dump.
m_source->SetValue(dst);
m_source->SetSelection(
m_selSource.first = (long)MapToSource(m_selDestination.first ),
m_selSource.second = (long)MapToSource(m_selDestination.second));
SetHexValue(m_sourceHex, m_selSourceHex, m_mappingSourceHex, dst.data(), dst.length(), m_selSource.first, m_selSource.second);
// Schedule state save after 3s. // Schedule state save after 3s.
m_timerSave.Start(3000, true); m_timerSave.Start(3000, true);
} }
m_sourceChanged = false; m_decomposedChanged = false;
m_destinationChanged = false; m_composedChanged = false;
} }
void wxZRColaComposerPanel::OnSourcePaint(wxPaintEvent& event)
{
event.Skip();
if (m_sourceRestyled) void wxZRColaComposerPanel::OnDecomposedPaint(wxPaintEvent& event)
return;
long from, to;
m_source->GetSelection(&from, &to);
if (m_selSource.first != from || m_selSource.second != to) {
// Save new selection first, to avoid loop.
m_selSource.first = from;
m_selSource.second = to;
m_sourceHex->SetSelection(
m_selSourceHex.first = (long)stdex::src2dst<size_t>(m_mappingSourceHex, from),
m_selSourceHex.second = (long)stdex::src2dst<size_t>(m_mappingSourceHex, to ));
m_destination->SetSelection(
m_selDestination.first = (long)MapToDestination(from),
m_selDestination.second = (long)MapToDestination(to ));
m_destinationHex->SetSelection(
m_selDestinationHex.first = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, m_selDestination.first ),
m_selDestinationHex.second = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, m_selDestination.second));
}
}
void wxZRColaComposerPanel::OnSourceHexPaint(wxPaintEvent& event)
{ {
event.Skip(); event.Skip();
long from, to; long from, to;
m_sourceHex->GetSelection(&from, &to); m_decomposed->GetSelection(&from, &to);
if (m_selSourceHex.first != from || m_selSourceHex.second != to) { if (m_selDecomposed.first != from || m_selDecomposed.second != to) {
// Save new selection first, to avoid loop. // Save new selection first, to avoid loop.
m_selSourceHex.first = from; m_selDecomposed.first = from;
m_selSourceHex.second = to; m_selDecomposed.second = to;
m_source->SetSelection( m_decomposedHex->SetSelection(
m_selSource.first = (long)stdex::dst2src<size_t>(m_mappingSourceHex, from), m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(from),
m_selSource.second = (long)stdex::dst2src<size_t>(m_mappingSourceHex, to )); m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(to ));
m_destination->SetSelection( m_composed->SetSelection(
m_selDestination.first = (long)MapToDestination(m_selSource.first ), m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(from)),
m_selDestination.second = (long)MapToDestination(m_selSource.second)); m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(to )));
m_destinationHex->SetSelection( m_composedHex->SetSelection(
m_selDestinationHex.first = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, m_selDestination.first ), m_selComposedHex.first = m_mappingComposedHex.to_dst(m_selComposed.first ),
m_selDestinationHex.second = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, m_selDestination.second)); m_selComposedHex.second = m_mappingComposedHex.to_dst(m_selComposed.second));
} }
} }
void wxZRColaComposerPanel::OnSourceText(wxCommandEvent& event) void wxZRColaComposerPanel::OnDecomposedHexPaint(wxPaintEvent& event)
{
event.Skip();
if (m_sourceRestyled)
return;
// Set the flag the source text changed to trigger idle-time translation.
m_sourceChanged = true;
m_sourceRestyled = true;
m_source->SetStyle(0, GetWindowTextLength(m_source->GetHWND()), m_styleNormal);
m_sourceRestyled = false;
}
void wxZRColaComposerPanel::OnDestinationPaint(wxPaintEvent& event)
{
event.Skip();
if (m_destinationRestyled)
return;
long from, to;
m_destination->GetSelection(&from, &to);
if (m_selDestination.first != from || m_selDestination.second != to) {
// Save new selection first, to avoid loop.
m_selDestination.first = from;
m_selDestination.second = to;
m_destinationHex->SetSelection(
m_selDestinationHex.first = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, from),
m_selDestinationHex.second = (long)stdex::src2dst<size_t>(m_mappingDestinationHex, to ));
m_source->SetSelection(
m_selSource.first = (long)MapToSource(from),
m_selSource.second = (long)MapToSource(to ));
m_sourceHex->SetSelection(
m_selSourceHex.first = (long)stdex::src2dst<size_t>(m_mappingSourceHex, m_selSource.first ),
m_selSourceHex.second = (long)stdex::src2dst<size_t>(m_mappingSourceHex, m_selSource.second));
}
}
void wxZRColaComposerPanel::OnDestinationHexPaint(wxPaintEvent& event)
{ {
event.Skip(); event.Skip();
long from, to; long from, to;
m_destinationHex->GetSelection(&from, &to); m_decomposedHex->GetSelection(&from, &to);
if (m_selDestinationHex.first != from || m_selDestinationHex.second != to) { if (m_selDecomposedHex.first != from || m_selDecomposedHex.second != to) {
// Save new selection first, to avoid loop. // Save new selection first, to avoid loop.
m_selDestinationHex.first = from; m_selDecomposedHex.first = from;
m_selDestinationHex.second = to; m_selDecomposedHex.second = to;
m_destination->SetSelection( m_decomposed->SetSelection(
m_selDestination.first = (long)stdex::dst2src<size_t>(m_mappingDestinationHex, from), m_selDecomposed.first = m_mappingDecomposedHex.to_src(from),
m_selDestination.second = (long)stdex::dst2src<size_t>(m_mappingDestinationHex, to )); m_selDecomposed.second = m_mappingDecomposedHex.to_src(to ));
m_source->SetSelection( m_composed->SetSelection(
m_selSource.first = (long)MapToSource(m_selDestination.first ), m_selComposed.first = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.first )),
m_selSource.second = (long)MapToSource(m_selDestination.second)); m_selComposed.second = m_mapping2.to_dst(m_mapping1.to_dst(m_selDecomposed.second)));
m_sourceHex->SetSelection( m_composedHex->SetSelection(
m_selSourceHex.first = (long)stdex::src2dst<size_t>(m_mappingSourceHex, m_selSource.first ), m_selComposedHex.first = m_mappingComposedHex.to_dst(m_selComposed.first ),
m_selSourceHex.second = (long)stdex::src2dst<size_t>(m_mappingSourceHex, m_selSource.second)); m_selComposedHex.second = m_mappingComposedHex.to_dst(m_selComposed.second));
} }
} }
void wxZRColaComposerPanel::OnDestinationText(wxCommandEvent& event) void wxZRColaComposerPanel::OnDecomposedText(wxCommandEvent& event)
{ {
event.Skip(); event.Skip();
if (m_destinationRestyled) // Set the flag the decomposed text changed to trigger idle-time composition.
return; m_decomposedChanged = true;
}
// Set the flag the destination text changed to trigger idle-time inverse translation.
m_destinationChanged = true;
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); void wxZRColaComposerPanel::OnComposedPaint(wxPaintEvent& event)
m_destinationRestyled = true; {
wxString src = m_destination->GetValue(); event.Skip();
app->m_h_db.Highlight(src, src.Length(), [this, app, src](ZRCola::hlghtsetid_t set, size_t start, size_t end) {
switch (set) {
case ZRCOLA_HLGHTSETID_ZRCOLA_UNICODE_COMPOSED_ISSUES:
m_destination->SetStyle((long)start, (long)end, m_styleZRColaUnicodeComposedIssues);
break;
default: long from, to;
if (app->m_mainWnd->m_warnPUA) { m_composed->GetSelection(&from, &to);
for (size_t i = start, j; i < end;) {
bool pua_i = ZRCola::ispua(src[i]); if (m_selComposed.first != from || m_selComposed.second != to) {
for (j = i + 1; j < end && pua_i == ZRCola::ispua(src[j]); j++); // Save new selection first, to avoid loop.
m_destination->SetStyle((long)i, (long)j, pua_i ? m_stylePUA : m_styleNormal); m_selComposed.first = from;
i = j; m_selComposed.second = to;
}
} else m_composedHex->SetSelection(
m_destination->SetStyle((long)start, (long)end, m_styleNormal); m_selComposedHex.first = m_mappingComposedHex.to_dst(from),
} m_selComposedHex.second = m_mappingComposedHex.to_dst(to ));
});
m_destinationRestyled = false; m_decomposed->SetSelection(
m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(from)),
m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(to )));
m_decomposedHex->SetSelection(
m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(m_selDecomposed.first ),
m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(m_selDecomposed.second));
}
}
void wxZRColaComposerPanel::OnComposedHexPaint(wxPaintEvent& event)
{
event.Skip();
long from, to;
m_composedHex->GetSelection(&from, &to);
if (m_selComposedHex.first != from || m_selComposedHex.second != to) {
// Save new selection first, to avoid loop.
m_selComposedHex.first = from;
m_selComposedHex.second = to;
m_composed->SetSelection(
m_selComposed.first = m_mappingComposedHex.to_src(from),
m_selComposed.second = m_mappingComposedHex.to_src(to ));
m_decomposed->SetSelection(
m_selDecomposed.first = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.first )),
m_selDecomposed.second = m_mapping1.to_src(m_mapping2.to_src(m_selComposed.second)));
m_decomposedHex->SetSelection(
m_selDecomposedHex.first = m_mappingDecomposedHex.to_dst(m_selDecomposed.first ),
m_selDecomposedHex.second = m_mappingDecomposedHex.to_dst(m_selDecomposed.second));
}
}
void wxZRColaComposerPanel::OnComposedText(wxCommandEvent& event)
{
event.Skip();
// Set the flag the composed text changed to trigger idle-time decomposition.
m_composedChanged = true;
} }
@ -359,21 +280,18 @@ void wxZRColaComposerPanel::OnSaveTimer(wxTimerEvent& event)
wxString fileName(GetStateFileName()); wxString fileName(GetStateFileName());
wxFFile file(fileName, wxT("wb")); wxFFile file(fileName, wxT("wb"));
if (file.IsOpened()) { if (file.IsOpened()) {
{ wxString text;
// Save source text. size_t len;
wxString text = m_source->GetValue();
size_t len = text.Length();
file.Write(&len, sizeof(len));
file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
}
{ // Save decomposed text.
// Save destination text. len = GetValue(m_decomposed, text);
wxString text = m_destination->GetValue(); file.Write(&len, sizeof(len));
size_t len = text.Length(); file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
file.Write(&len, sizeof(len));
file.Write((const wchar_t*)text, sizeof(wchar_t)*len); // Save composed text.
} len = GetValue(m_composed, text);
file.Write(&len, sizeof(len));
file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
} }
event.Skip(); event.Skip();
@ -398,6 +316,31 @@ wxString wxZRColaComposerPanel::GetStateFileName()
} }
size_t wxZRColaComposerPanel::GetValue(wxTextCtrl *wnd, wxString &text)
{
#ifdef __WINDOWS__
// Use Windows GetWindowText() function to avoid line ending conversion incompletely imposed by wxWidgets.
WXHWND hWnd = wnd->GetHWND();
size_t len = ::GetWindowTextLengthW(hWnd);
if (len < 0x100) {
WCHAR buf[0x100];
::GetWindowTextW(hWnd, buf, len + 1);
text.assign(buf, len);
} else {
LPWSTR buf = new WCHAR[len + 1];
::GetWindowTextW(hWnd, buf, len + 1);
text.assign(buf, len);
delete [] buf;
}
return len;
#else
text = wnd->GetValue();
return text.Length();
#endif
}
void wxZRColaComposerPanel::SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &range, ZRCola::mapping_vector &mapping, const wchar_t *src, size_t len, long from, long to) void wxZRColaComposerPanel::SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &range, ZRCola::mapping_vector &mapping, const wchar_t *src, size_t len, long from, long to)
{ {
wxString hex; wxString hex;
@ -406,8 +349,8 @@ void wxZRColaComposerPanel::SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &
mapping.clear(); mapping.clear();
for (size_t i = 0; i < len && src[i]; i++) { for (size_t i = 0; i < len && src[i]; i++) {
wchar_t c = src[i]; wchar_t c = src[i];
if (c == L'\n') { if (c == L'\n' || c == '\r') {
hex += L"\r\n"; hex += c;
first = true; first = true;
} else { } else {
hex += wxString::Format(first ? wxT("%04X") : wxT(" %04X"), src[i]); hex += wxString::Format(first ? wxT("%04X") : wxT(" %04X"), src[i]);
@ -418,8 +361,8 @@ void wxZRColaComposerPanel::SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &
wnd->SetValue(hex); wnd->SetValue(hex);
wnd->SetSelection( wnd->SetSelection(
range.first = (long)stdex::src2dst<size_t>(mapping, from), range.first = mapping.to_dst(from),
range.second = (long)stdex::src2dst<size_t>(mapping, to )); range.second = mapping.to_dst(to ));
} }
@ -427,9 +370,6 @@ void wxZRColaComposerPanel::SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &
// wxPersistentZRColaComposerPanel // wxPersistentZRColaComposerPanel
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaComposerPanel::s_guiLevel = 1;
wxPersistentZRColaComposerPanel::wxPersistentZRColaComposerPanel(wxZRColaComposerPanel *wnd) : wxPersistentWindow<wxZRColaComposerPanel>(wnd) wxPersistentZRColaComposerPanel::wxPersistentZRColaComposerPanel(wxZRColaComposerPanel *wnd) : wxPersistentWindow<wxZRColaComposerPanel>(wnd)
{ {
} }
@ -443,12 +383,10 @@ wxString wxPersistentZRColaComposerPanel::GetKind() const
void wxPersistentZRColaComposerPanel::Save() const void wxPersistentZRColaComposerPanel::Save() const
{ {
auto wnd = static_cast<wxZRColaComposerPanel*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor. auto const wnd = static_cast<const wxZRColaComposerPanel*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
SaveValue(wxT("guiLevel" ), s_guiLevel); SaveValue(wxT("splitDecomposed"), wnd->m_splitterDecomposed->GetSashPosition());
SaveValue(wxT("dpiX" ), wxClientDC(wnd).GetPPI().x); SaveValue(wxT("splitComposed" ), wnd->m_splitterComposed ->GetSashPosition());
SaveValue(wxT("splitDecomposed"), wnd->m_splitterSource ->GetSashPosition());
SaveValue(wxT("splitComposed" ), wnd->m_splitterDestination->GetSashPosition());
} }
@ -456,27 +394,18 @@ bool wxPersistentZRColaComposerPanel::Restore()
{ {
auto wnd = dynamic_cast<wxZRColaComposerPanel*>(GetWindow()); auto wnd = dynamic_cast<wxZRColaComposerPanel*>(GetWindow());
int guiLevel;
if (!RestoreValue(wxT("guiLevel"), &guiLevel) || guiLevel != s_guiLevel)
return true;
int dpiHorz = wxClientDC(wnd).GetPPI().x;
int dpiHorzVal;
int sashVal; int sashVal;
if (!RestoreValue(wxT("dpiX"), &dpiHorzVal))
dpiHorzVal = 96;
if (RestoreValue(wxT("splitDecomposed"), &sashVal)) { if (RestoreValue(wxT("splitDecomposed"), &sashVal)) {
// wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler. // wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler.
wnd->m_splitterSource->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, wnd ); wnd->m_splitterDecomposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDecomposedOnIdle ), NULL, wnd );
wnd->m_splitterSource->SetSashPosition(wxMulDivInt32(sashVal, dpiHorz, dpiHorzVal)); wnd->m_splitterDecomposed->SetSashPosition(sashVal);
} }
if (RestoreValue(wxT("splitComposed"), &sashVal)) { if (RestoreValue(wxT("splitComposed"), &sashVal)) {
// wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler. // wxFormBuilder sets initial splitter stash in idle event handler after GUI settles. Overriding our loaded value. Disconnect it's idle event handler.
wnd->m_splitterDestination->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, wnd ); wnd->m_splitterComposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterComposedOnIdle ), NULL, wnd );
wnd->m_splitterDestination->SetSashPosition(wxMulDivInt32(sashVal, dpiHorz, dpiHorzVal)); wnd->m_splitterComposed->SetSashPosition(sashVal);
} }
return true; return true;

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -11,19 +25,11 @@ class wxZRColaComposerPanel;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include "zrcolakeyhndlr.h" #include "zrcolakeyhndlr.h"
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/persist/window.h> #include <wx/persist/window.h>
#include <wx/timer.h> #include <wx/timer.h>
#pragma warning(pop)
#include <utility> #include <utility>
#include <vector>
/// ///
@ -35,45 +41,36 @@ public:
wxZRColaComposerPanel(wxWindow* parent); wxZRColaComposerPanel(wxWindow* parent);
virtual ~wxZRColaComposerPanel(); virtual ~wxZRColaComposerPanel();
void RestoreFromStateFile();
void SynchronizePanels(); void SynchronizePanels();
friend class wxPersistentZRColaComposerPanel; // Allow saving/restoring window state. friend class wxPersistentZRColaComposerPanel; // Allow saving/restoring window state.
protected: protected:
virtual void OnSourcePaint(wxPaintEvent& event); virtual void OnDecomposedPaint(wxPaintEvent& event);
virtual void OnSourceHexPaint(wxPaintEvent& event); virtual void OnDecomposedHexPaint(wxPaintEvent& event);
virtual void OnSourceText(wxCommandEvent& event); virtual void OnDecomposedText(wxCommandEvent& event);
virtual void OnDestinationPaint(wxPaintEvent& event); virtual void OnComposedPaint(wxPaintEvent& event);
virtual void OnDestinationHexPaint(wxPaintEvent& event); virtual void OnComposedHexPaint(wxPaintEvent& event);
virtual void OnDestinationText(wxCommandEvent& event); virtual void OnComposedText(wxCommandEvent& event);
virtual void OnSaveTimer(wxTimerEvent& event); virtual void OnSaveTimer(wxTimerEvent& event);
inline size_t MapToDestination(_In_ size_t src) const;
inline size_t MapToSource(_In_ size_t dst) const;
inline void GetTranslationSeq(_Out_ const ZRCola::transetid_t *&sets_begin, _Out_ const ZRCola::transetid_t *&sets_end) const;
static wxString GetStateFileName(); static wxString GetStateFileName();
static size_t GetValue(wxTextCtrl *wnd, wxString &text);
static void SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &range, ZRCola::mapping_vector &mapping, const wchar_t *src, size_t len, long from, long to); static void SetHexValue(wxTextCtrl *wnd, std::pair<long, long> &range, ZRCola::mapping_vector &mapping, const wchar_t *src, size_t len, long from, long to);
protected: protected:
bool m_sourceChanged; ///< Boolean flag to mark source text "dirty" to trigger translation bool m_decomposedChanged; ///< Boolean flag to mark decomposed text "dirty" to trigger composition
bool m_destinationChanged; ///< Boolean flag to mark destination text "dirty" to trigger inverse translation bool m_composedChanged; ///< Boolean flag to mark composed text "dirty" to trigger decomposition
volatile bool ZRCola::mapping_vector m_mapping1; ///< Character index mapping vector between decomposed and normalized text
m_sourceRestyled, ///< Boolean flag to mark source text is being restyled ZRCola::mapping_vector m_mapping2; ///< Character index mapping vector between normalized and composed text
m_destinationRestyled; ///< Boolean flag to mark destination text is being restyled
wxTextAttr
m_styleNormal, ///< Normal text style
m_stylePUA, ///< PUA character text style
m_styleZRColaUnicodeComposedIssues; ///< ZRCola Unicode Composed issues character text style
std::vector<ZRCola::mapping_vector> m_mapping; ///< Character index mapping vector between source and normalized text
std::pair<long, long> std::pair<long, long>
m_selSource, ///< Character index of selected text in source text control m_selDecomposed, ///< Character index of selected text in decomposed text control
m_selSourceHex, ///< Character index of selected text in source HEX dump text control m_selDecomposedHex, ///< Character index of selected text in decomposed HEX dump text control
m_selDestination, ///< Character index of selected text in destination text control m_selComposed, ///< Character index of selected text in composed text control
m_selDestinationHex; ///< Character index of selected text in destination HEX dump text control m_selComposedHex; ///< Character index of selected text in composed HEX dump text control
wxZRColaKeyHandler m_keyhandler; ///< Key handler for source window wxZRColaKeyHandler m_keyhandler; ///< Key handler for decomposed window
ZRCola::mapping_vector m_mappingSourceHex; ///< Character index mapping vector between source text and its HEX dump ZRCola::mapping_vector m_mappingDecomposedHex; ///< Character index mapping vector between decomposed text and its HEX dump
ZRCola::mapping_vector m_mappingDestinationHex; ///< Character index mapping vector between destination text and its HEX dump ZRCola::mapping_vector m_mappingComposedHex; ///< Character index mapping vector between composed text and its HEX dump
}; };
@ -88,54 +85,9 @@ public:
virtual wxString GetKind() const; virtual wxString GetKind() const;
virtual void Save() const; virtual void Save() const;
virtual bool Restore(); virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
}; };
inline size_t wxZRColaComposerPanel::MapToDestination(_In_ size_t src) const
{
for (auto m = m_mapping.cbegin(), m_end = m_mapping.cend(); m != m_end; ++m)
src = stdex::src2dst(*m, src);
return src;
}
inline size_t wxZRColaComposerPanel::MapToSource(_In_ size_t dst) const
{
for (auto m = m_mapping.crbegin(), m_end = m_mapping.crend(); m != m_end; ++m)
dst = stdex::dst2src(*m, dst);
return dst;
}
inline void wxZRColaComposerPanel::GetTranslationSeq(_Out_ const ZRCola::transetid_t *&sets_begin, _Out_ const ZRCola::transetid_t *&sets_end) const
{
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
if (app->m_mainWnd->m_transeq_id == ZRCOLA_TRANSEQID_DEFAULT) {
sets_begin = NULL;
sets_end = NULL;
} else if (app->m_mainWnd->m_transeq_id == ZRCOLA_TRANSEQID_CUSTOM) {
sets_begin = app->m_mainWnd->m_transeq->m_transeq.data();
sets_end = sets_begin + app->m_mainWnd->m_transeq->m_transeq.size();
} else {
size_t start;
if (app->m_tsq_db.idxTranSeq.find(ZRCola::transeq_db::transeq(app->m_mainWnd->m_transeq_id), start)) {
const auto &ts = app->m_tsq_db.idxTranSeq[start];
sets_begin = ts.sets();
sets_end = ts.sets_end();
} else {
sets_begin = NULL;
sets_end = NULL;
}
}
}
inline wxPersistentObject *wxCreatePersistentObject(wxZRColaComposerPanel *wnd) inline wxPersistentObject *wxCreatePersistentObject(wxZRColaComposerPanel *wnd)
{ {
return new wxPersistentZRColaComposerPanel(wnd); return new wxPersistentZRColaComposerPanel(wnd);

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -11,94 +25,52 @@
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
wxBEGIN_EVENT_TABLE(wxZRColaFrame, wxZRColaFrameBase) wxBEGIN_EVENT_TABLE(wxZRColaFrame, wxZRColaFrameBase)
EVT_MENU (wxID_EXIT , wxZRColaFrame::OnExit ) EVT_MENU (wxID_EXIT , wxZRColaFrame::OnExit )
EVT_UPDATE_UI_RANGE(wxID_CUT , wxID_CLEAR , wxZRColaFrame::OnForwardEventUpdate ) EVT_UPDATE_UI_RANGE(wxID_CUT , wxID_CLEAR , wxZRColaFrame::OnForwardEventUpdate )
EVT_MENU_RANGE (wxID_CUT , wxID_CLEAR , wxZRColaFrame::OnForwardEvent ) EVT_MENU_RANGE (wxID_CUT , wxID_CLEAR , wxZRColaFrame::OnForwardEvent )
EVT_UPDATE_UI (wxID_SELECTALL , wxZRColaFrame::OnForwardEventUpdate ) EVT_UPDATE_UI (wxID_SELECTALL , wxZRColaFrame::OnForwardEventUpdate )
EVT_MENU (wxID_SELECTALL , wxZRColaFrame::OnForwardEvent ) EVT_MENU (wxID_SELECTALL , wxZRColaFrame::OnForwardEvent )
EVT_UPDATE_UI (wxID_CHARACTER_SELECTOR , wxZRColaFrame::OnInsertCharacterUpdate ) EVT_MENU (wxID_CHARACTER_SELECTOR , wxZRColaFrame::OnInsertCharacter )
EVT_MENU (wxID_CHARACTER_SELECTOR , wxZRColaFrame::OnInsertCharacter )
EVT_UPDATE_UI_RANGE(wxID_SEND_DESTINATION , wxID_SEND_ABORT , wxZRColaFrame::OnSendUpdate ) EVT_UPDATE_UI_RANGE(wxID_SEND_COMPOSED , wxID_SEND_ABORT, wxZRColaFrame::OnSendUpdate )
EVT_MENU (wxID_COPY_DESTINATION_AND_RETURN , wxZRColaFrame::OnCopyDestinationAndReturn ) EVT_MENU (wxID_SEND_COMPOSED , wxZRColaFrame::OnSendComposed )
EVT_MENU (wxID_SEND_DESTINATION , wxZRColaFrame::OnSendDestination ) EVT_MENU (wxID_SEND_DECOMPOSED , wxZRColaFrame::OnSendDecomposed )
EVT_MENU (wxID_COPY_SOURCE_AND_RETURN , wxZRColaFrame::OnCopySourceAndReturn ) EVT_MENU (wxID_SEND_ABORT , wxZRColaFrame::OnSendAbort )
EVT_MENU (wxID_SEND_SOURCE , wxZRColaFrame::OnSendSource )
EVT_MENU (wxID_SEND_ABORT , wxZRColaFrame::OnSendAbort )
EVT_MENU (wxID_COMPOSITION_NONE , wxZRColaFrame::OnCompositionNone ) EVT_MENU (wxID_SETTINGS , wxZRColaFrame::OnSettings )
EVT_MENU (wxID_COMPOSITION_ZRCOLA , wxZRColaFrame::OnCompositionZRCola )
EVT_MENU (wxID_COMPOSITION_UNICODE , wxZRColaFrame::OnCompositionUnicode )
EVT_MENU (wxID_WARN_PUA , wxZRColaFrame::OnWarnPUA )
EVT_MENU_RANGE (wxID_TRANSLATION_SEQ_DEFAULT, wxID_TRANSLATION_SEQ_END, wxZRColaFrame::OnTranslationSeqMenu )
EVT_MENU (wxID_SETTINGS , wxZRColaFrame::OnSettings ) EVT_UPDATE_UI (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEditUpdate )
EVT_MENU (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEdit )
EVT_UPDATE_UI (wxID_TOOLBAR_COMPOSE , wxZRColaFrame::OnToolbarComposeUpdate )
EVT_MENU (wxID_TOOLBAR_COMPOSE , wxZRColaFrame::OnToolbarCompose )
EVT_UPDATE_UI (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalogUpdate)
EVT_MENU (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalog )
EVT_MENU (wxID_FOCUS_CHARACTER_CATALOG , wxZRColaFrame::OnPanelCharacterCatalogFocus )
EVT_UPDATE_UI (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEditUpdate ) EVT_MENU (wxID_HELP_INSTRUCTIONS , wxZRColaFrame::OnHelpInstructions )
EVT_MENU (wxID_TOOLBAR_EDIT , wxZRColaFrame::OnToolbarEdit ) EVT_MENU (wxID_HELP_SHORTCUTS , wxZRColaFrame::OnHelpShortcuts )
EVT_UPDATE_UI (wxID_TOOLBAR_TRANSLATE , wxZRColaFrame::OnToolbarTranslateUpdate )
EVT_MENU (wxID_TOOLBAR_TRANSLATE , wxZRColaFrame::OnToolbarTranslate )
EVT_UPDATE_UI (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalogUpdate)
EVT_MENU (wxID_PANEL_CHRGRPS , wxZRColaFrame::OnPanelCharacterCatalog )
EVT_MENU (wxID_FOCUS_CHARACTER_CATALOG , wxZRColaFrame::OnPanelCharacterCatalogFocus )
EVT_MENU (wxID_HELP_INSTRUCTIONS , wxZRColaFrame::OnHelpInstructions ) EVT_MENU (wxID_HELP_REQCHAR , wxZRColaFrame::OnHelpReqChar )
EVT_MENU (wxID_HELP_SHORTCUTS , wxZRColaFrame::OnHelpShortcuts ) EVT_MENU (wxID_HELP_UPDATE , wxZRColaFrame::OnHelpUpdate )
EVT_MENU (wxID_ABOUT , wxZRColaFrame::OnHelpAbout )
EVT_MENU (wxID_HELP_REQCHAR , wxZRColaFrame::OnHelpReqChar )
EVT_MENU (wxID_HELP_UPDATE , wxZRColaFrame::OnHelpUpdate )
EVT_MENU (wxID_ABOUT , wxZRColaFrame::OnHelpAbout )
wxEND_EVENT_TABLE() wxEND_EVENT_TABLE()
const int wxZRColaFrame::s_guiLevel = 1;
wxZRColaFrame::wxZRColaFrame() : wxZRColaFrame::wxZRColaFrame() :
m_hWndSource(NULL), m_hWndSource(NULL),
m_wasIconised(false),
m_chrSelect(NULL), m_chrSelect(NULL),
m_settings(NULL), m_settings(NULL),
m_chrReq(NULL), m_chrReq(NULL),
m_composition(true),
m_composition_id(ZRCOLA_TRANSETID_DEFAULT),
m_warnPUA(false),
m_transeq_id(ZRCOLA_TRANSEQID_DEFAULT),
m_transeq(NULL),
wxZRColaFrameBase(NULL) wxZRColaFrameBase(NULL)
{ {
{ {
// wxFrameBuilder 3.5 does not support wxAUI_TB_HORIZONTAL flag. Add it manually. // wxFrameBuilder 3.5 does not support wxAUI_TB_HORIZONTAL flag. Add it manually.
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarTranslate); wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarCompose);
paneInfo.LeftDockable(false); paneInfo.LeftDockable(false);
paneInfo.RightDockable(false); paneInfo.RightDockable(false);
m_toolbarTranslate->SetWindowStyleFlag(m_toolbarTranslate->GetWindowStyleFlag() | wxAUI_TB_HORIZONTAL); m_toolbarCompose->SetWindowStyleFlag(m_toolbarCompose->GetWindowStyleFlag() | wxAUI_TB_HORIZONTAL);
}
// Populate list of translation sequences.
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_toolTranslationSeq->Clear();
{
wxString name_tran(_("No Translation"));
m_menuTranslationSeq->AppendRadioItem(wxID_TRANSLATION_SEQ_DEFAULT, name_tran);
m_toolTranslationSeq->Append(name_tran, reinterpret_cast<void*>(ZRCOLA_TRANSEQID_DEFAULT));
}
for (size_t i = 0, n = app->m_tsq_db.idxRank.size(); ; i++) {
if (i < n) {
const ZRCola::transeq_db::transeq &ts = app->m_tsq_db.idxRank[i];
wxString
name(ts.name(), ts.name_len()),
name_tran(wxGetTranslation(name, wxT("ZRCola-zrcdb")));
m_menuTranslationSeq->AppendRadioItem((int)(wxID_TRANSLATION_SEQ_START + i), name_tran);
m_toolTranslationSeq->Append(name_tran, reinterpret_cast<void*>(ts.seq));
} else {
wxString name_tran(_("Custom Translation..."));
m_menuTranslationSeq->AppendRadioItem((int)(wxID_TRANSLATION_SEQ_START + i), name_tran);
m_toolTranslationSeq->Append(name_tran, reinterpret_cast<void*>(ZRCOLA_TRANSEQID_CUSTOM));
break;
}
} }
// Load main window icons. // Load main window icons.
@ -120,38 +92,31 @@ wxZRColaFrame::wxZRColaFrame() :
} else { } else {
// Taskbar icon creation failed. Not the end of the world. No taskbar icon then. // Taskbar icon creation failed. Not the end of the world. No taskbar icon then.
delete m_taskBarIcon; delete m_taskBarIcon;
m_taskBarIcon = NULL;
} }
wxPersistenceManager &persist_mgr = wxPersistenceManager::Get();
m_settings = new wxZRColaSettings(this); m_settings = new wxZRColaSettings(this);
persist_mgr.RegisterAndRestore(m_settings, new wxPersistentZRColaSettings(m_settings)); wxPersistentRegisterAndRestore<wxZRColaSettings>(m_settings);
m_transeq = new wxZRColaTranslationSeq(this);
persist_mgr.RegisterAndRestore(m_transeq, new wxPersistentZRColaTranslationSeq(m_transeq));
m_chrSelect = new wxZRColaCharSelect(this); m_chrSelect = new wxZRColaCharSelect(this);
persist_mgr.RegisterAndRestore(m_chrSelect, new wxPersistentZRColaCharSelect(m_chrSelect)); wxPersistentRegisterAndRestore<wxZRColaCharSelect>(m_chrSelect);
m_chrReq = new wxZRColaCharRequest(this); m_chrReq = new wxZRColaCharRequest(this);
persist_mgr.RegisterAndRestore(m_chrReq, new wxPersistentZRColaCharRequest(m_chrReq)); wxPersistentRegisterAndRestore<wxZRColaCharRequest>(m_chrReq);
// Set focus. // Set focus.
m_panel->m_source->SetFocus(); m_panel->m_decomposed->SetFocus();
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Register notification sink for language detection. // Register notification sink for language detection.
m_ulRefCount = 1; m_ulRefCount = 1;
m_tfSource = NULL; m_tfSource = NULL;
m_dwCookie = MAXDWORD;
ITfInputProcessorProfiles *pProfiles; ITfInputProcessorProfiles *pProfiles;
HRESULT hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (LPVOID*)&pProfiles); HRESULT hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, (LPVOID*)&pProfiles);
if(SUCCEEDED(hr)) { if(SUCCEEDED(hr)) {
hr = pProfiles->QueryInterface(IID_ITfSource, (LPVOID*)&m_tfSource); hr = pProfiles->QueryInterface(IID_ITfSource, (LPVOID*)&m_tfSource);
if(SUCCEEDED(hr)) { if(SUCCEEDED(hr)) {
hr = m_tfSource->AdviseSink(IID_ITfLanguageProfileNotifySink, (ITfLanguageProfileNotifySink*)this, &m_dwCookie); hr = m_tfSource->AdviseSink(IID_ITfLanguageProfileNotifySink, (ITfLanguageProfileNotifySink*)this, &m_dwCookie);
if (FAILED(hr) || m_dwCookie == MAXDWORD) { if (FAILED(hr) || m_dwCookie == -1) {
m_tfSource->Release(); m_tfSource->Release();
m_tfSource = NULL; m_tfSource = NULL;
} }
@ -168,54 +133,13 @@ wxZRColaFrame::wxZRColaFrame() :
SetAcceleratorTable(wxAcceleratorTable(_countof(entries), entries)); SetAcceleratorTable(wxAcceleratorTable(_countof(entries), entries));
} }
int guiLevel; // Restore persistent state of wxAuiManager manually, since m_mgr is not on the heap.
if (wxConfigBase::Get()->Read(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel) { wxPersistentAuiManager(&m_mgr).Restore();
// Restore persistent state of wxAuiManager manually, since m_mgr is not a standalone heap object
// and cannot be registered for persistence.
wxPersistentAuiManager(&m_mgr).Restore();
}
persist_mgr.RegisterAndRestore(this, new wxPersistentZRColaFrame(this));
// Update (de)composition selection.
if (m_composition && m_composition_id == ZRCOLA_TRANSETID_DEFAULT) {
m_menuItemCompositionZRCola->Check(true);
m_toolComposition->Select(1);
} else if (m_composition && m_composition_id == ZRCOLA_TRANSETID_UNICODE) {
m_menuItemCompositionUnicode->Check(true);
m_toolComposition->Select(2);
} else {
m_menuItemCompositionNone->Check(true);
m_toolComposition->Select(0);
}
if (m_warnPUA) {
m_menuItemWarnPUA->Check(true);
m_toolWarnPUA->SetState(m_toolWarnPUA->GetState() | wxAUI_BUTTON_STATE_CHECKED);
} else {
m_menuItemWarnPUA->Check(false);
m_toolWarnPUA->SetState(m_toolWarnPUA->GetState() & ~wxAUI_BUTTON_STATE_CHECKED);
}
// Update translation sequence selection.
for (unsigned int i = 0, n = m_toolTranslationSeq->GetCount(); ; i++) {
if (i < n) {
if (static_cast<ZRCola::transeqid_t>((size_t)m_toolTranslationSeq->GetClientData(i)) == m_transeq_id) {
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT + i, true);
m_toolTranslationSeq->SetSelection(i);
break;
}
} else {
m_transeq_id = ZRCOLA_TRANSEQID_DEFAULT;
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT, true);
m_toolTranslationSeq->SetSelection(0);
break;
}
}
// Register global hotkey(s). // Register global hotkey(s).
if (!RegisterHotKey(wxZRColaHKID_INVOKE_TRANSLATE, wxMOD_WIN, VK_F5)) if (!RegisterHotKey(wxZRColaHKID_INVOKE_COMPOSE, wxMOD_WIN, VK_F5))
wxMessageBox(_("ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING); wxMessageBox(_("ZRCola keyboard shortcut Win+F5 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING);
if (!RegisterHotKey(wxZRColaHKID_INVOKE_TRANSLATE_INV, wxMOD_WIN, VK_F6)) if (!RegisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE, wxMOD_WIN, VK_F6))
wxMessageBox(_("ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING); wxMessageBox(_("ZRCola keyboard shortcut Win+F6 could not be registered. Some functionality will not be available."), _("Warning"), wxOK | wxICON_WARNING);
} }
@ -223,14 +147,8 @@ wxZRColaFrame::wxZRColaFrame() :
wxZRColaFrame::~wxZRColaFrame() wxZRColaFrame::~wxZRColaFrame()
{ {
// Unregister global hotkey(s). // Unregister global hotkey(s).
UnregisterHotKey(wxZRColaHKID_INVOKE_TRANSLATE_INV); UnregisterHotKey(wxZRColaHKID_INVOKE_DECOMPOSE);
UnregisterHotKey(wxZRColaHKID_INVOKE_TRANSLATE ); UnregisterHotKey(wxZRColaHKID_INVOKE_COMPOSE);
// Save wxAuiManager's state before destructor is finished.
// m_mgr is not a standalone heap object and is bound to wxZRColaFrame, which is being destroyed.
wxConfigBase::Get()->Write(wxT("guiLevel"), s_guiLevel);
wxPersistentAuiManager(&m_mgr).Save();
wxPersistenceManager::Get().SaveAndUnregister(this);
#if defined(__WXMSW__) #if defined(__WXMSW__)
if (m_tfSource) { if (m_tfSource) {
@ -246,6 +164,16 @@ wxZRColaFrame::~wxZRColaFrame()
} }
void wxZRColaFrame::OnClose(wxCloseEvent& event)
{
event.Skip();
// Save wxAuiManager's state before destructor.
// Since the destructor calls m_mgr.UnInit() the regular persistence mechanism is useless to save wxAuiManager's state.
wxPersistentAuiManager(&m_mgr).Save();
}
void wxZRColaFrame::OnExit(wxCommandEvent& event) void wxZRColaFrame::OnExit(wxCommandEvent& event)
{ {
Close(); Close();
@ -272,15 +200,12 @@ void wxZRColaFrame::OnForwardEvent(wxCommandEvent& event)
} }
void wxZRColaFrame::OnInsertCharacterUpdate(wxUpdateUIEvent& event)
{
event.Check(m_chrSelect->IsVisible());
}
void wxZRColaFrame::OnInsertCharacter(wxCommandEvent& event) void wxZRColaFrame::OnInsertCharacter(wxCommandEvent& event)
{ {
m_chrSelect->Show(!m_chrSelect->IsVisible()); if (m_chrSelect->ShowModal() == wxID_OK && m_chrSelect->m_char) {
m_panel->m_decomposed->WriteText(m_chrSelect->m_char);
m_panel->m_decomposed->SetFocus();
}
} }
@ -290,37 +215,19 @@ void wxZRColaFrame::OnSendUpdate(wxUpdateUIEvent& event)
} }
void wxZRColaFrame::OnSendDestination(wxCommandEvent& event) void wxZRColaFrame::OnSendComposed(wxCommandEvent& event)
{ {
if (m_hWndSource) if (m_hWndSource)
DoSend(m_panel->m_destination->GetValue()); DoSend(m_panel->m_composed->GetValue());
event.Skip(); event.Skip();
} }
void wxZRColaFrame::OnCopyDestinationAndReturn(wxCommandEvent& event) void wxZRColaFrame::OnSendDecomposed(wxCommandEvent& event)
{ {
if (m_hWndSource) if (m_hWndSource)
DoCopyAndReturn(m_panel->m_destination->GetValue()); DoSend(m_panel->m_decomposed->GetValue());
event.Skip();
}
void wxZRColaFrame::OnSendSource(wxCommandEvent& event)
{
if (m_hWndSource)
DoSend(m_panel->m_source->GetValue());
event.Skip();
}
void wxZRColaFrame::OnCopySourceAndReturn(wxCommandEvent& event)
{
if (m_hWndSource)
DoCopyAndReturn(m_panel->m_source->GetValue());
event.Skip(); event.Skip();
} }
@ -330,67 +237,14 @@ void wxZRColaFrame::OnSendAbort(wxCommandEvent& event)
{ {
if (m_hWndSource) { if (m_hWndSource) {
// Return focus to the source window. // Return focus to the source window.
if (m_wasIconised) Iconize();
::SetActiveWindow(m_hWndSource); ::SetActiveWindow(m_hWndSource);
::SetForegroundWindow(m_hWndSource); ::SetForegroundWindow(m_hWndSource);
m_hWndSource = NULL; m_hWndSource = NULL;
} }
// Select all input in composer to prepare for the overwrite next time. // Select all input in composer to prepare for the overwrite next time.
m_panel->m_source ->SelectAll(); m_panel->m_decomposed->SelectAll();
m_panel->m_destination->SelectAll(); m_panel->m_composed->SelectAll();
event.Skip();
}
void wxZRColaFrame::OnCompositionNone(wxCommandEvent& event)
{
DoSetComposition(false, ZRCOLA_TRANSETID_DEFAULT);
m_toolbarTranslate->Refresh();
event.Skip();
}
void wxZRColaFrame::OnCompositionZRCola(wxCommandEvent& event)
{
DoSetComposition(true, ZRCOLA_TRANSETID_DEFAULT);
m_toolbarTranslate->Refresh();
event.Skip();
}
void wxZRColaFrame::OnCompositionUnicode(wxCommandEvent& event)
{
DoSetComposition(true, ZRCOLA_TRANSETID_UNICODE);
m_toolbarTranslate->Refresh();
event.Skip();
}
void wxZRColaFrame::OnCompositionChoice(wxCommandEvent& event)
{
switch (event.GetSelection()) {
case 0: DoSetComposition(false, ZRCOLA_TRANSETID_DEFAULT); break;
case 1: DoSetComposition(true, ZRCOLA_TRANSETID_DEFAULT); break;
case 2: DoSetComposition(true, ZRCOLA_TRANSETID_UNICODE); break;
}
}
void wxZRColaFrame::OnWarnPUA(wxCommandEvent& event)
{
m_warnPUA = !m_warnPUA;
m_menuItemWarnPUA->Check(m_warnPUA);
m_toolWarnPUA->SetState((m_toolWarnPUA->GetState() & ~wxAUI_BUTTON_STATE_CHECKED) | (m_warnPUA ? wxAUI_BUTTON_STATE_CHECKED : 0));
m_toolbarTranslate->Refresh();
// Notify destination text something changed and should re-paint.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
m_panel->m_destination->ProcessWindowEvent(event2);
event.Skip(); event.Skip();
} }
@ -412,8 +266,8 @@ void wxZRColaFrame::OnIdle(wxIdleEvent& event)
void wxZRColaFrame::OnTaskbarIconClick(wxTaskBarIconEvent& event) void wxZRColaFrame::OnTaskbarIconClick(wxTaskBarIconEvent& event)
{ {
Show(true);
Iconize(false); Iconize(false);
Show(true);
Raise(); Raise();
event.Skip(); event.Skip();
@ -443,45 +297,20 @@ void wxZRColaFrame::OnToolbarEdit(wxCommandEvent& event)
} }
void wxZRColaFrame::OnToolbarTranslateUpdate(wxUpdateUIEvent& event) void wxZRColaFrame::OnToolbarComposeUpdate(wxUpdateUIEvent& event)
{ {
event.Check(m_mgr.GetPane(m_toolbarTranslate).IsShown()); event.Check(m_mgr.GetPane(m_toolbarCompose).IsShown());
} }
void wxZRColaFrame::OnToolbarTranslate(wxCommandEvent& event) void wxZRColaFrame::OnToolbarCompose(wxCommandEvent& event)
{ {
wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarTranslate); wxAuiPaneInfo &paneInfo = m_mgr.GetPane(m_toolbarCompose);
paneInfo.Show(!paneInfo.IsShown()); paneInfo.Show(!paneInfo.IsShown());
m_mgr.Update(); m_mgr.Update();
} }
void wxZRColaFrame::OnTranslationSeqMenu(wxCommandEvent& event)
{
int idx = event.GetId() - wxID_TRANSLATION_SEQ_DEFAULT;
ZRCola::transeqid_t transeq_id = static_cast<ZRCola::transeqid_t>((size_t)m_toolTranslationSeq->GetClientData(idx));
DoSetTranslationSeq(idx, transeq_id);
m_toolTranslationSeq->Select(idx);
}
void wxZRColaFrame::OnTranslationSeqChoice(wxCommandEvent& event)
{
int idx = event.GetSelection();
ZRCola::transeqid_t transeq_id = static_cast<ZRCola::transeqid_t>((size_t)event.GetClientData());
DoSetTranslationSeq(idx, transeq_id);
if (m_transeq_id == ZRCOLA_TRANSEQID_DEFAULT)
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT, true);
else
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT + idx, true);
}
void wxZRColaFrame::OnPanelCharacterCatalogUpdate(wxUpdateUIEvent& event) void wxZRColaFrame::OnPanelCharacterCatalogUpdate(wxUpdateUIEvent& event)
{ {
event.Check(m_mgr.GetPane(m_panelChrCat).IsShown()); event.Check(m_mgr.GetPane(m_panelChrCat).IsShown());
@ -520,11 +349,10 @@ void wxZRColaFrame::OnHelpShortcuts(wxCommandEvent& event)
#ifdef __WXMSW__ #ifdef __WXMSW__
// Search and try to launch installed PDF. // Search and try to launch installed PDF.
#pragma warning(suppress: 26812) // INSTALLSTATE is unscoped.
INSTALLSTATE pdf_is = ::MsiGetComponentPath(_T(PRODUCT_VERSION_GUID), _T("{68AC2C38-10E2-41A3-B92C-844C03FFDF6A}"), pdf_path); INSTALLSTATE pdf_is = ::MsiGetComponentPath(_T(PRODUCT_VERSION_GUID), _T("{68AC2C38-10E2-41A3-B92C-844C03FFDF6A}"), pdf_path);
if ((pdf_is == INSTALLSTATE_LOCAL || pdf_is == INSTALLSTATE_SOURCE) && if ((pdf_is == INSTALLSTATE_LOCAL || pdf_is == INSTALLSTATE_SOURCE) &&
wxFileExists(pdf_path) && wxFileExists(pdf_path) &&
(intptr_t)::ShellExecute(GetHWND(), NULL, pdf_path.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32) return; (int)::ShellExecute(GetHWND(), NULL, pdf_path.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32) return;
#endif #endif
// Search and try to launch local PDF copy. // Search and try to launch local PDF copy.
@ -532,7 +360,7 @@ void wxZRColaFrame::OnHelpShortcuts(wxCommandEvent& event)
pdf_path = app->GetDatabasePath(); pdf_path = app->GetDatabasePath();
pdf_path += _T("ZRCola_keyboard.pdf"); pdf_path += _T("ZRCola_keyboard.pdf");
if (wxFileExists(pdf_path) && if (wxFileExists(pdf_path) &&
(intptr_t)::ShellExecute(GetHWND(), NULL, pdf_path.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32) return; (int)::ShellExecute(GetHWND(), NULL, pdf_path.c_str(), NULL, NULL, SW_SHOWNORMAL) > 32) return;
// When everything else fail, try the online version. // When everything else fail, try the online version.
wxLaunchDefaultBrowser(_("http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf")); wxLaunchDefaultBrowser(_("http://zrcola.zrc-sazu.si/wp-content/uploads/2016/06/ZRCola_tipkovnica_Jun2016.pdf"));
@ -622,10 +450,10 @@ void wxZRColaFrame::DoSend(const wxString& str)
{ {
// Prepare the INPUT table. // Prepare the INPUT table.
wxString::size_type n = str.length(); wxString::size_type n = str.length();
wxString::const_iterator i_str = str.begin(); auto i_str = str.begin();
std::vector<INPUT> input; std::vector<INPUT> input;
input.reserve(n*2); input.reserve(n*2);
for (std::vector<INPUT>::size_type i = 0; i < n; i++, ++i_str) { for (std::vector<INPUT>::size_type i = 0; i < n; i++, i_str++) {
wxString::char_type c = *i_str; wxString::char_type c = *i_str;
// Add key down event. // Add key down event.
@ -640,88 +468,15 @@ void wxZRColaFrame::DoSend(const wxString& str)
} }
// Return focus to the source window and send the input. // Return focus to the source window and send the input.
if (m_wasIconised) Iconize();
::SetActiveWindow(m_hWndSource); ::SetActiveWindow(m_hWndSource);
::SetForegroundWindow(m_hWndSource); ::SetForegroundWindow(m_hWndSource);
::Sleep(200); ::Sleep(200);
::SendInput((UINT)input.size(), input.data(), sizeof(INPUT)); ::SendInput(input.size(), input.data(), sizeof(INPUT));
m_hWndSource = NULL; m_hWndSource = NULL;
// Select all input in source and destination to prepare for the overwrite next time. // Select all input in composer and decomposed to prepare for the overwrite next time.
m_panel->m_source ->SelectAll(); m_panel->m_decomposed->SelectAll();
m_panel->m_destination->SelectAll(); m_panel->m_composed->SelectAll();
}
void wxZRColaFrame::DoCopyAndReturn(const wxString& str)
{
if (wxTheClipboard->Open()) {
wxTheClipboard->SetData(new wxTextDataObject(str));
wxTheClipboard->Close();
}
// Return focus to the source window.
if (m_wasIconised) Iconize();
::SetActiveWindow(m_hWndSource);
::SetForegroundWindow(m_hWndSource);
m_hWndSource = NULL;
// Select all input in composer and source to prepare for the overwrite next time.
m_panel->m_source->SelectAll();
m_panel->m_destination->SelectAll();
}
void wxZRColaFrame::DoSetComposition(bool enable, ZRCola::transetid_t transet_id)
{
if (enable && transet_id == ZRCOLA_TRANSETID_DEFAULT) {
m_composition = true;
m_composition_id = ZRCOLA_TRANSETID_DEFAULT;
m_menuItemCompositionZRCola->Check(true);
m_toolComposition->Select(1);
} else if (enable && transet_id == ZRCOLA_TRANSETID_UNICODE) {
m_composition = true;
m_composition_id = ZRCOLA_TRANSETID_UNICODE;
m_menuItemCompositionUnicode->Check(true);
m_toolComposition->Select(2);
} else {
m_composition = false;
m_menuItemCompositionNone->Check(true);
m_toolComposition->Select(0);
}
// Notify source text something changed and should re-translate.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
m_panel->m_source->ProcessWindowEvent(event2);
}
void wxZRColaFrame::DoSetTranslationSeq(int idx, ZRCola::transeqid_t transeq_id)
{
if (transeq_id == ZRCOLA_TRANSEQID_CUSTOM) {
// Prompt user to modify translation.
if (m_transeq->ShowModal() != wxID_OK)
return;
if (m_transeq->m_transeq.empty()) {
// User submitted an empty translation. Revert to "No Translation" case.
m_transeq_id = ZRCOLA_TRANSEQID_DEFAULT;
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT, true);
m_toolTranslationSeq->SetSelection(0);
} else {
m_transeq_id = ZRCOLA_TRANSEQID_CUSTOM;
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT + idx, true);
}
} else if (m_transeq_id != transeq_id) {
// User choose a new translation sequence.
m_transeq_id = transeq_id;
m_menuTranslationSeq->Check(wxID_TRANSLATION_SEQ_DEFAULT + idx, true);
} else
return;
// Notify source text something changed and should re-translate.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
m_panel->m_source->ProcessWindowEvent(event2);
} }
@ -734,8 +489,8 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM
WXHWND hWndSource = ::GetForegroundWindow(); WXHWND hWndSource = ::GetForegroundWindow();
switch (wParam) { switch (wParam) {
case wxZRColaHKID_INVOKE_TRANSLATE: m_panel->m_source->SetFocus(); break; case wxZRColaHKID_INVOKE_COMPOSE : m_panel->m_decomposed->SetFocus(); break;
case wxZRColaHKID_INVOKE_TRANSLATE_INV: m_panel->m_destination->SetFocus(); break; case wxZRColaHKID_INVOKE_DECOMPOSE: m_panel->m_composed ->SetFocus(); break;
default: default:
wxFAIL_MSG(wxT("not our registered shortcut")); wxFAIL_MSG(wxT("not our registered shortcut"));
return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam); return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam);
@ -747,13 +502,12 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM
} }
m_hWndSource = hWndSource; m_hWndSource = hWndSource;
m_wasIconised = IsIconized();
//if (m_state == wxABS_FLOAT) { //if (m_state == wxABS_FLOAT) {
Show(true); if (IsIconized())
Iconize(false); ::SendMessage(m_hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
Raise(); ::SetActiveWindow(m_hWnd);
::SetActiveWindow(m_hWnd); ::SetForegroundWindow(m_hWnd);
//} else if (wxAppBarIsDocked(m_state)) { //} else if (wxAppBarIsDocked(m_state)) {
// // ZRCola window is currently docked. // // ZRCola window is currently docked.
@ -768,8 +522,7 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM
// wxFAIL_MSG(wxT("unsupported application bar state")); // wxFAIL_MSG(wxT("unsupported application bar state"));
return 0; return 0;
} } else
else
return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam); return wxZRColaFrameBase::MSWWindowProc(message, wParam, lParam);
} }
@ -780,26 +533,17 @@ WXLRESULT wxZRColaFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM
// wxPersistentZRColaFrame // wxPersistentZRColaFrame
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaFrame::s_guiLevel = 1; wxPersistentZRColaFrame::wxPersistentZRColaFrame(wxZRColaFrame *wnd) : wxPersistentTLW(wnd)
wxPersistentZRColaFrame::wxPersistentZRColaFrame(wxZRColaFrame *wnd) : wxPersistentTLWEx(wnd)
{ {
} }
void wxPersistentZRColaFrame::Save() const void wxPersistentZRColaFrame::Save() const
{ {
SaveValue(wxT("guiLevel"), s_guiLevel); wxPersistentTLW::Save();
wxPersistentTLWEx::Save();
auto wnd = static_cast<const wxZRColaFrame*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor. auto wnd = static_cast<const wxZRColaFrame*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
SaveValue(wxT("composition"), wnd->m_composition);
SaveValue(wxT("compositionId"), static_cast<int>(wnd->m_composition_id));
SaveValue(wxT("warnPUA"), wnd->m_warnPUA);
SaveValue(wxT("transeqId"), static_cast<int>(wnd->m_transeq_id));
wxPersistentZRColaComposerPanel(wnd->m_panel).Save(); wxPersistentZRColaComposerPanel(wnd->m_panel).Save();
wxPersistentZRColaCharacterCatalogPanel(wnd->m_panelChrCat).Save(); wxPersistentZRColaCharacterCatalogPanel(wnd->m_panelChrCat).Save();
} }
@ -812,22 +556,5 @@ bool wxPersistentZRColaFrame::Restore()
wxPersistentZRColaCharacterCatalogPanel(wnd->m_panelChrCat).Restore(); wxPersistentZRColaCharacterCatalogPanel(wnd->m_panelChrCat).Restore();
wxPersistentZRColaComposerPanel(wnd->m_panel).Restore(); wxPersistentZRColaComposerPanel(wnd->m_panel).Restore();
int num; return wxPersistentTLW::Restore();
if (RestoreValue(wxT("transeqId"), &num))
wnd->m_transeq_id = (ZRCola::transeqid_t)num;
bool b;
if (RestoreValue(wxT("composition"), &b))
wnd->m_composition = b;
else
wnd->m_composition = wnd->m_transeq_id == ZRCOLA_TRANSEQID_DEFAULT;
if (RestoreValue(wxT("compositionId"), &num))
wnd->m_composition_id = (ZRCola::transetid_t)num;
if (RestoreValue(wxT("warnPUA"), &b))
wnd->m_warnPUA = b;
else
wnd->m_warnPUA = false;
int guiLevel;
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;
} }

View File

@ -1,33 +1,37 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
/// Forward declarations /// Forward declarations
/// ///
class wxZRColaFrame; class wxZRColaFrame;
class wxPersistentZRColaFrame;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include "zrcolachrslct.h" #include "zrcolachrslct.h"
#include "zrcolachrreq.h" #include "zrcolachrreq.h"
#include "zrcolasettings.h" #include "zrcolasettings.h"
#include "zrcolatranseq.h"
#include <zrcola/language.h> #include <zrcola/language.h>
#include <zrcola/translate.h>
#include <wxex/persist/toplevel.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/taskbar.h> #include <wx/taskbar.h>
#pragma warning(pop) #include <wx/persist/toplevel.h>
#if defined(__WXMSW__) #if defined(__WXMSW__)
#include <msctf.h> #include <msctf.h>
#endif #endif
@ -36,8 +40,8 @@ class wxPersistentZRColaFrame;
/// ///
/// Global hotkey message identifiers /// Global hotkey message identifiers
/// ///
#define wxZRColaHKID_INVOKE_TRANSLATE 0 #define wxZRColaHKID_INVOKE_COMPOSE 0
#define wxZRColaHKID_INVOKE_TRANSLATE_INV 1 #define wxZRColaHKID_INVOKE_DECOMPOSE 1
/// ///
@ -53,9 +57,6 @@ public:
enum enum
{ {
wxID_FOCUS_CHARACTER_CATALOG = 2000, wxID_FOCUS_CHARACTER_CATALOG = 2000,
wxID_TRANSLATION_SEQ_DEFAULT = 2001,
wxID_TRANSLATION_SEQ_START = 2002,
wxID_TRANSLATION_SEQ_END = 2100,
}; };
wxZRColaFrame(); wxZRColaFrame();
@ -65,32 +66,23 @@ public:
friend class wxZRColaComposerPanel; friend class wxZRColaComposerPanel;
protected: protected:
virtual void OnClose(wxCloseEvent& event);
void OnExit(wxCommandEvent& event); void OnExit(wxCommandEvent& event);
void OnForwardEventUpdate(wxUpdateUIEvent& event); void OnForwardEventUpdate(wxUpdateUIEvent& event);
void OnForwardEvent(wxCommandEvent& event); void OnForwardEvent(wxCommandEvent& event);
void OnInsertCharacterUpdate(wxUpdateUIEvent& event);
void OnInsertCharacter(wxCommandEvent& event); void OnInsertCharacter(wxCommandEvent& event);
void OnSendUpdate(wxUpdateUIEvent& event); void OnSendUpdate(wxUpdateUIEvent& event);
void OnSendDestination(wxCommandEvent& event); void OnSendComposed(wxCommandEvent& event);
void OnCopyDestinationAndReturn(wxCommandEvent& event); void OnSendDecomposed(wxCommandEvent& event);
void OnSendSource(wxCommandEvent& event);
void OnCopySourceAndReturn(wxCommandEvent& event);
void OnSendAbort(wxCommandEvent& event); void OnSendAbort(wxCommandEvent& event);
void OnCompositionNone(wxCommandEvent& event);
void OnCompositionZRCola(wxCommandEvent& event);
void OnCompositionUnicode(wxCommandEvent& event);
virtual void OnCompositionChoice(wxCommandEvent& event);
void OnWarnPUA(wxCommandEvent& event);
void OnSettings(wxCommandEvent& event); void OnSettings(wxCommandEvent& event);
virtual void OnIdle(wxIdleEvent& event); virtual void OnIdle(wxIdleEvent& event);
void OnTaskbarIconClick(wxTaskBarIconEvent& event); void OnTaskbarIconClick(wxTaskBarIconEvent& event);
virtual void OnIconize(wxIconizeEvent& event); virtual void OnIconize(wxIconizeEvent& event);
void OnToolbarEditUpdate(wxUpdateUIEvent& event); void OnToolbarEditUpdate(wxUpdateUIEvent& event);
void OnToolbarEdit(wxCommandEvent& event); void OnToolbarEdit(wxCommandEvent& event);
void OnToolbarTranslateUpdate(wxUpdateUIEvent& event); void OnToolbarComposeUpdate(wxUpdateUIEvent& event);
void OnToolbarTranslate(wxCommandEvent& event); void OnToolbarCompose(wxCommandEvent& event);
void OnTranslationSeqMenu(wxCommandEvent& event);
virtual void OnTranslationSeqChoice(wxCommandEvent& event);
void OnPanelCharacterCatalogUpdate(wxUpdateUIEvent& event); void OnPanelCharacterCatalogUpdate(wxUpdateUIEvent& event);
void OnPanelCharacterCatalog(wxCommandEvent& event); void OnPanelCharacterCatalog(wxCommandEvent& event);
void OnPanelCharacterCatalogFocus(wxCommandEvent& event); void OnPanelCharacterCatalogFocus(wxCommandEvent& event);
@ -119,9 +111,6 @@ protected:
private: private:
void DoSend(const wxString& str); void DoSend(const wxString& str);
void DoCopyAndReturn(const wxString& str);
void DoSetComposition(bool enable, ZRCola::transetid_t transet_id);
void DoSetTranslationSeq(int idx, ZRCola::transeqid_t transeq_id);
protected: protected:
#ifdef __WXMSW__ #ifdef __WXMSW__
@ -129,36 +118,24 @@ protected:
#endif #endif
protected: protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels WXHWND m_hWndSource; ///< Handle of the active window, when the ZRCola hotkey was pressed
wxTaskBarIcon *m_taskBarIcon; ///< Taskbar icon
protected: wxZRColaCharSelect *m_chrSelect; ///< Character selection dialog
WXHWND m_hWndSource; ///< Handle of the active window, when the ZRCola hotkey was pressed wxZRColaCharRequest *m_chrReq; ///< Request a New Character dialog
bool m_wasIconised; ///< Was the ZRCola window iconized, when the ZRCola hotkey was pressed wxZRColaSettings *m_settings; ///< Configuration dialog
wxTaskBarIcon *m_taskBarIcon; ///< Taskbar icon
wxZRColaCharSelect *m_chrSelect; ///< Character selection dialog
wxZRColaCharRequest *m_chrReq; ///< Request a New Character dialog
wxZRColaSettings *m_settings; ///< Configuration dialog
bool m_composition; ///< Is (de)composition enabled?
ZRCola::transetid_t m_composition_id; ///< Which (de)composition is enabled
bool m_warnPUA; ///< Mark Private-Use-Area characters in destination text
ZRCola::transeqid_t m_transeq_id; ///< Translation sequence ID
wxZRColaTranslationSeq *m_transeq; ///< Custom translation sequence dialog
}; };
/// ///
/// Supports saving/restoring wxZRColaFrame GUI state /// Supports saving/restoring wxZRColaFrame GUI state
/// ///
class wxPersistentZRColaFrame : public wxPersistentTLWEx class wxPersistentZRColaFrame : public wxPersistentTLW
{ {
public: public:
wxPersistentZRColaFrame(wxZRColaFrame *wnd); wxPersistentZRColaFrame(wxZRColaFrame *wnd);
virtual void Save() const; virtual void Save() const;
virtual bool Restore(); virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
}; };

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,12 @@
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Oct 26 2018) // C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/ // http://www.wxformbuilder.org/
// //
// PLEASE DO *NOT* EDIT THIS FILE! // PLEASE DO "NOT" EDIT THIS FILE!
/////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////
#pragma once #ifndef __ZRCOLAGUI_H__
#define __ZRCOLAGUI_H__
#include <wx/artprov.h> #include <wx/artprov.h>
#include <wx/xrc/xmlres.h> #include <wx/xrc/xmlres.h>
@ -24,7 +25,6 @@ class wxZRColaCharGrid;
#include <wx/settings.h> #include <wx/settings.h>
#include <wx/aui/aui.h> #include <wx/aui/aui.h>
#include <wx/aui/auibar.h> #include <wx/aui/auibar.h>
#include <wx/choice.h>
class wxZRColaCharacterCatalogPanel; class wxZRColaCharacterCatalogPanel;
class wxZRColaComposerPanel; class wxZRColaComposerPanel;
#include <wx/statusbr.h> #include <wx/statusbr.h>
@ -35,6 +35,7 @@ class wxZRColaComposerPanel;
#include <wx/panel.h> #include <wx/panel.h>
#include <wx/splitter.h> #include <wx/splitter.h>
#include <wx/timer.h> #include <wx/timer.h>
#include <wx/choice.h>
#include <wx/grid.h> #include <wx/grid.h>
#include <wx/checkbox.h> #include <wx/checkbox.h>
#include <wx/srchctrl.h> #include <wx/srchctrl.h>
@ -62,18 +63,12 @@ class wxZRColaFrameBase : public wxFrame
enum enum
{ {
wxID_CHARACTER_SELECTOR = 1000, wxID_CHARACTER_SELECTOR = 1000,
wxID_SEND_DESTINATION, wxID_SEND_COMPOSED,
wxID_COPY_DESTINATION_AND_RETURN, wxID_SEND_DECOMPOSED,
wxID_SEND_SOURCE,
wxID_COPY_SOURCE_AND_RETURN,
wxID_SEND_ABORT, wxID_SEND_ABORT,
wxID_COMPOSITION_NONE,
wxID_COMPOSITION_ZRCOLA,
wxID_COMPOSITION_UNICODE,
wxID_WARN_PUA,
wxID_SETTINGS, wxID_SETTINGS,
wxID_TOOLBAR_EDIT, wxID_TOOLBAR_EDIT,
wxID_TOOLBAR_TRANSLATE, wxID_TOOLBAR_COMPOSE,
wxID_PANEL_CHRGRPS, wxID_PANEL_CHRGRPS,
wxID_HELP_INSTRUCTIONS, wxID_HELP_INSTRUCTIONS,
wxID_HELP_SHORTCUTS, wxID_HELP_SHORTCUTS,
@ -84,24 +79,16 @@ class wxZRColaFrameBase : public wxFrame
wxMenuBar* m_menubar; wxMenuBar* m_menubar;
wxMenu* m_menuProgram; wxMenu* m_menuProgram;
wxMenu* m_menuEdit; wxMenu* m_menuEdit;
wxMenuItem* m_menuItemCompositionNone;
wxMenuItem* m_menuItemCompositionZRCola;
wxMenuItem* m_menuItemCompositionUnicode;
wxMenu* m_menuTranslationSeq;
wxMenuItem* m_menuItemWarnPUA;
wxMenu* m_menuView; wxMenu* m_menuView;
wxMenu* m_menuHelp; wxMenu* m_menuHelp;
wxAuiToolBar* m_toolbarEdit; wxAuiToolBar* m_toolbarEdit;
wxAuiToolBarItem* m_toolEditCut; wxAuiToolBarItem* m_toolEditCut;
wxAuiToolBarItem* m_toolEditCopy; wxAuiToolBarItem* m_toolEditCopy;
wxAuiToolBarItem* m_toolEditPaste; wxAuiToolBarItem* m_toolEditPaste;
wxAuiToolBar* m_toolbarTranslate; wxAuiToolBar* m_toolbarCompose;
wxAuiToolBarItem* m_toolCharSelect; wxAuiToolBarItem* m_toolCharSelect;
wxAuiToolBarItem* m_toolSendDestination; wxAuiToolBarItem* m_toolSendComposed;
wxAuiToolBarItem* m_toolSendSource; wxAuiToolBarItem* m_toolSendDecomposed;
wxChoice* m_toolComposition;
wxChoice* m_toolTranslationSeq;
wxAuiToolBarItem* m_toolWarnPUA;
wxZRColaCharacterCatalogPanel* m_panelChrCat; wxZRColaCharacterCatalogPanel* m_panelChrCat;
wxStatusBar* m_statusBar; wxStatusBar* m_statusBar;
@ -109,14 +96,12 @@ class wxZRColaFrameBase : public wxFrame
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); }
virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); } virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); }
virtual void OnCompositionChoice( wxCommandEvent& event ) { event.Skip(); }
virtual void OnTranslationSeqChoice( wxCommandEvent& event ) { event.Skip(); }
public: public:
wxZRColaComposerPanel* m_panel; wxZRColaComposerPanel* m_panel;
wxZRColaFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("ZRCola"), const wxPoint& pos = wxDefaultPosition, long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("ZRCola") ); wxZRColaFrameBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("ZRCola"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 600,400 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("ZRCola") );
wxAuiManager m_mgr; wxAuiManager m_mgr;
~wxZRColaFrameBase(); ~wxZRColaFrameBase();
@ -136,43 +121,43 @@ class wxZRColaComposerPanelBase : public wxPanel
wxID_TIMER_SAVE = 1000 wxID_TIMER_SAVE = 1000
}; };
wxSplitterWindow* m_splitterSource; wxSplitterWindow* m_splitterDecomposed;
wxPanel* m_panelSourceEdit; wxPanel* m_panelDecomposedEdit;
wxPanel* m_panelSourceHex; wxPanel* m_panelDecomposedHex;
wxTextCtrl* m_sourceHex; wxTextCtrl* m_decomposedHex;
wxSplitterWindow* m_splitterDestination; wxSplitterWindow* m_splitterComposed;
wxPanel* m_panelDestinationEdit; wxPanel* m_panelComposedEdit;
wxPanel* m_panelDestinationHex; wxPanel* m_panelComposedHex;
wxTextCtrl* m_destinationHex; wxTextCtrl* m_composedHex;
wxTimer m_timerSave; wxTimer m_timerSave;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnSourcePaint( wxPaintEvent& event ) { event.Skip(); } virtual void OnDecomposedPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnSourceText( wxCommandEvent& event ) { event.Skip(); } virtual void OnDecomposedText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSourceHexPaint( wxPaintEvent& event ) { event.Skip(); } virtual void OnDecomposedHexPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnDestinationPaint( wxPaintEvent& event ) { event.Skip(); } virtual void OnComposedPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnDestinationText( wxCommandEvent& event ) { event.Skip(); } virtual void OnComposedText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnDestinationHexPaint( wxPaintEvent& event ) { event.Skip(); } virtual void OnComposedHexPaint( wxPaintEvent& event ) { event.Skip(); }
virtual void OnSaveTimer( wxTimerEvent& event ) { event.Skip(); } virtual void OnSaveTimer( wxTimerEvent& event ) { event.Skip(); }
public: public:
wxTextCtrl* m_source; wxTextCtrl* m_decomposed;
wxTextCtrl* m_destination; wxTextCtrl* m_composed;
wxZRColaComposerPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxT("ZRColaComposerPanel") ); wxZRColaComposerPanelBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxT("ZRColaComposerPanel") );
~wxZRColaComposerPanelBase(); ~wxZRColaComposerPanelBase();
void m_splitterSourceOnIdle( wxIdleEvent& ) void m_splitterDecomposedOnIdle( wxIdleEvent& )
{ {
m_splitterSource->SetSashPosition( FromDIP(-5) ); m_splitterDecomposed->SetSashPosition( -5 );
m_splitterSource->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterSourceOnIdle ), NULL, this ); m_splitterDecomposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDecomposedOnIdle ), NULL, this );
} }
void m_splitterDestinationOnIdle( wxIdleEvent& ) void m_splitterComposedOnIdle( wxIdleEvent& )
{ {
m_splitterDestination->SetSashPosition( FromDIP(-5) ); m_splitterComposed->SetSashPosition( -5 );
m_splitterDestination->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterDestinationOnIdle ), NULL, this ); m_splitterComposed->Disconnect( wxEVT_IDLE, wxIdleEventHandler( wxZRColaComposerPanelBase::m_splitterComposedOnIdle ), NULL, this );
} }
}; };
@ -230,7 +215,9 @@ class wxZRColaCharSelectBase : public wxDialog
wxHyperlinkCtrl* m_navigateBack; wxHyperlinkCtrl* m_navigateBack;
wxHyperlinkCtrl* m_navigateForward; wxHyperlinkCtrl* m_navigateForward;
wxZRColaCharGrid* m_gridRelated; wxZRColaCharGrid* m_gridRelated;
wxButton* m_buttonInsert; wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); } virtual void OnIdle( wxIdleEvent& event ) { event.Skip(); }
@ -251,8 +238,7 @@ class wxZRColaCharSelectBase : public wxDialog
virtual void OnNavigateBack( wxHyperlinkEvent& event ) { event.Skip(); } virtual void OnNavigateBack( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnNavigateForward( wxHyperlinkEvent& event ) { event.Skip(); } virtual void OnNavigateForward( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnRelatedSelectCell( wxGridEvent& event ) { event.Skip(); } virtual void OnRelatedSelectCell( wxGridEvent& event ) { event.Skip(); }
virtual void OnInsert( wxCommandEvent& event ) { event.Skip(); } virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnInsertUpdateUI( wxUpdateUIEvent& event ) { event.Skip(); }
public: public:
@ -286,7 +272,8 @@ class wxZRColaSettingsBase : public wxDialog
// Virtual event handlers, overide them in your derived class // Virtual event handlers, overide them in your derived class
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); } virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnLanguageUpdate( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnLangAuto( wxCommandEvent& event ) { event.Skip(); }
virtual void OnLangManual( wxCommandEvent& event ) { event.Skip(); }
virtual void OnApplyButtonClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnApplyButtonClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
@ -378,45 +365,4 @@ class wxZRColaCharRequestBase : public wxDialog
}; };
/////////////////////////////////////////////////////////////////////////////// #endif //__ZRCOLAGUI_H__
/// Class wxZRColaTranslationSeqBase
///////////////////////////////////////////////////////////////////////////////
class wxZRColaTranslationSeqBase : public wxDialog
{
private:
protected:
wxStaticText* m_transLbl;
wxStaticText* m_availableLbl;
wxListBox* m_available;
wxButton* m_add;
wxButton* m_remove;
wxStaticText* m_selectedLbl;
wxListBox* m_selected;
wxButton* m_selectedUp;
wxButton* m_selectedDown;
wxStdDialogButtonSizer* m_sdbSizerButtons;
wxButton* m_sdbSizerButtonsOK;
wxButton* m_sdbSizerButtonsCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); }
virtual void OnUpdate( wxUpdateUIEvent& event ) { event.Skip(); }
virtual void OnAvailableChar( wxKeyEvent& event ) { event.Skip(); }
virtual void OnAvailableDClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAdd( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemove( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedChar( wxKeyEvent& event ) { event.Skip(); }
virtual void OnSelectedDClick( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedUp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSelectedDown( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOKButtonClick( wxCommandEvent& event ) { event.Skip(); }
public:
wxZRColaTranslationSeqBase( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Custom Translation Sequence"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = wxT("ZRColaTranslationSeq") );
~wxZRColaTranslationSeqBase();
};

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -33,7 +47,7 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
if (!chr) { if (!chr) {
int key = e.GetKeyCode(); int key = e.GetKeyCode();
if (WXK_NUMPAD0 <= key && key <= WXK_NUMPAD9) if (WXK_NUMPAD0 <= key && key <= WXK_NUMPAD9)
chr = '0' + (wxChar)(key - WXK_NUMPAD0); chr = '0' + (key - WXK_NUMPAD0);
} }
wxFrame *pFrame = wxDynamicCast(dynamic_cast<ZRColaApp*>(wxTheApp)->m_mainWnd, wxFrame); wxFrame *pFrame = wxDynamicCast(dynamic_cast<ZRColaApp*>(wxTheApp)->m_mainWnd, wxFrame);
if (('0' <= chr && chr <= '9' || 'A' <= chr && chr <= 'F') && m_insert_seq.size() < 4) { if (('0' <= chr && chr <= '9' || 'A' <= chr && chr <= 'F') && m_insert_seq.size() < 4) {
@ -67,14 +81,14 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
{ {
// Parse key event and save it at the end of the key sequence. // Parse key event and save it at the end of the key sequence.
ZRCola::keyseq_db::keyseq::key_t key; ZRCola::keyseq_db::keyseq::key_t key;
key.key = (wchar_t)e.GetRawKeyCode(); key.key = e.GetRawKeyCode();
#if defined(__WXMSW__) #if defined(__WXMSW__)
// Translate from local keyboard to scan code. // Translate from local keyboard to scan code.
key.key = static_cast<wchar_t>(::MapVirtualKey(key.key, MAPVK_VK_TO_VSC) & 0xffff); key.key = ::MapVirtualKey(key.key, MAPVK_VK_TO_VSC);
// Translate from scan code to U.S. Keyboard. // Translate from scan code to U.S. Keyboard.
static const HKL s_hkl = ::LoadKeyboardLayout(_T("00000409"), 0); static const HKL s_hkl = ::LoadKeyboardLayout(_T("00000409"), 0);
key.key = static_cast<wchar_t>(::MapVirtualKeyEx(key.key, MAPVK_VSC_TO_VK, s_hkl) & 0xffff); key.key = ::MapVirtualKeyEx(key.key, MAPVK_VSC_TO_VK, s_hkl);
#endif #endif
key.modifiers = key.modifiers =
(e.ShiftDown() ? ZRCola::keyseq_db::keyseq::SHIFT : 0) | (e.ShiftDown() ? ZRCola::keyseq_db::keyseq::SHIFT : 0) |
@ -82,9 +96,13 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
(e.AltDown() ? ZRCola::keyseq_db::keyseq::ALT : 0); (e.AltDown() ? ZRCola::keyseq_db::keyseq::ALT : 0);
m_seq.push_back(key); m_seq.push_back(key);
std::unique_ptr<ZRCola::keyseq_db::keyseq> ks((ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::keyseq_db::keyseq::key_t)*m_seq.size()]); auto n = m_seq.size();
ks->ZRCola::keyseq_db::keyseq::keyseq(m_seq.data(), m_seq.size()); ZRCola::keyseq_db::keyseq *ks = (ZRCola::keyseq_db::keyseq*)new char[sizeof(ZRCola::keyseq_db::keyseq) + sizeof(ZRCola::keyseq_db::keyseq::key_t)*n];
ks->chr = 0;
ks->seq_len = n;
memcpy(ks->seq, m_seq.data(), sizeof(ZRCola::keyseq_db::keyseq::key_t)*n);
found = app->m_ks_db.idxKey.find(*ks, start); found = app->m_ks_db.idxKey.find(*ks, start);
delete ks;
} }
if (found) { if (found) {
@ -98,14 +116,14 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
wxObject *obj = event.GetEventObject(); wxObject *obj = event.GetEventObject();
if (obj && obj->IsKindOf(wxCLASSINFO(wxTextCtrl))) { if (obj && obj->IsKindOf(wxCLASSINFO(wxTextCtrl))) {
// Push text to source control. // Push text to source control.
((wxTextCtrl*)obj)->WriteText(wxString(ks.chr(), ks.chr_len())); ((wxTextCtrl*)obj)->WriteText(ks.chr);
// Event is fully processed now. // Event is fully processed now.
event.StopPropagation(); event.StopPropagation();
return true; return true;
} }
} else if (start < app->m_ks_db.idxKey.size() && } else if (start < app->m_ks_db.idxKey.size() &&
ZRCola::keyseq_db::keyseq::CompareSequence(m_seq.data(), m_seq.size(), app->m_ks_db.idxKey[start].seq(), std::min<size_t>(app->m_ks_db.idxKey[start].seq_len(), m_seq.size())) == 0) ZRCola::keyseq_db::keyseq::CompareSequence(m_seq.data(), m_seq.size(), app->m_ks_db.idxKey[start].seq, std::min<unsigned __int16>(app->m_ks_db.idxKey[start].seq_len, m_seq.size())) == 0)
{ {
// The sequence is a partial match. Continue watching. // The sequence is a partial match. Continue watching.
if (pFrame && pFrame->GetStatusBar()) if (pFrame && pFrame->GetStatusBar())
@ -133,7 +151,7 @@ bool wxZRColaKeyHandler::ProcessEvent(wxEvent& event)
if (count) { if (count) {
// Zero terminate sequence and parse the Unicode value. // Zero terminate sequence and parse the Unicode value.
m_insert_seq.push_back(0); m_insert_seq.push_back(0);
wchar_t chr = (wchar_t)strtoul(m_insert_seq.data(), NULL, 16); wchar_t chr = strtoul(m_insert_seq.data(), NULL, 16);
if (chr) { if (chr) {
wxObject *obj = event.GetEventObject(); wxObject *obj = event.GetEventObject();

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -13,11 +27,7 @@ class wxZRColaKeyHandler;
#include <zrcolaui/keyboard.h> #include <zrcolaui/keyboard.h>
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/event.h> #include <wx/event.h>
#pragma warning(pop)
#include <vector> #include <vector>

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -17,12 +31,12 @@ wxZRColaSettings::wxZRColaSettings(wxWindow* parent) :
{ {
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_languages->Clear(); m_languages->Clear();
for (size_t i = 0, n = app->m_lang_db.idxLang.size(); i < n; i++) { for (size_t i = 0, n = app->m_lang_db.idxLng.size(); i < n; i++) {
const auto &lang = app->m_lang_db.idxLang[i]; const auto &lang = app->m_lang_db.idxLng[i];
wxString wxString
label(lang.name(), lang.name_len()), label(lang.name, lang.name_len),
label_tran(wxGetTranslation(label, wxT("ZRCola-zrcdb"))); label_tran(wxGetTranslation(label, wxT("ZRCola-zrcdb")));
m_languages->Insert(label_tran, (unsigned int)i); m_languages->Insert(label_tran, i);
} }
} }
@ -44,16 +58,22 @@ void wxZRColaSettings::OnInitDialog(wxInitDialogEvent& event)
(m_lang_auto ? m_langAuto : m_langManual)->SetValue(true); (m_lang_auto ? m_langAuto : m_langManual)->SetValue(true);
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
char l[sizeof(ZRCola::language_db::language)] = {};
((ZRCola::language_db::language*)l)->id = m_lang;
ZRCola::language_db::indexLang::size_type start; ZRCola::language_db::indexLang::size_type start;
m_languages->Select(app->m_lang_db.idxLang.find(ZRCola::language_db::language(m_lang), start) ? (int)start : -1); m_languages->Select(app->m_lang_db.idxLng.find(*(ZRCola::language_db::language*)l, start) ? start : -1);
} }
void wxZRColaSettings::OnLanguageUpdate(wxUpdateUIEvent& event) void wxZRColaSettings::OnLangAuto(wxCommandEvent& event)
{ {
m_languages->Enable(m_langManual->GetValue()); m_languages->Enable(!event.IsChecked());
}
wxZRColaSettingsBase::OnLanguageUpdate(event);
void wxZRColaSettings::OnLangManual(wxCommandEvent& event)
{
m_languages->Enable(event.IsChecked());
} }
@ -102,19 +122,20 @@ void wxZRColaSettings::OnApplyButtonClick(wxCommandEvent& event)
m_lang_auto = false; m_lang_auto = false;
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
const auto &lang = app->m_lang_db.idxLang[m_languages->GetSelection()]; const auto &lang = app->m_lang_db.idxLng[m_languages->GetSelection()];
if (m_lang != lang.lang) { if (m_lang != lang.id) {
m_lang = lang.lang; m_lang = lang.id;
// Notify destination text something changed and should re-inverse translate. // Notify composed text something changed and should re-decompose.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED); wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
app->m_mainWnd->m_panel->m_destination->ProcessWindowEvent(event2); app->m_mainWnd->m_panel->m_composed->ProcessWindowEvent(event2);
} }
} }
} }
void wxZRColaSettings::OnOKButtonClick(wxCommandEvent& event) void wxZRColaSettings::OnOKButtonClick(wxCommandEvent& event)
{ {
wxZRColaSettings::OnApplyButtonClick(event); wxZRColaSettings::OnApplyButtonClick(event);
@ -125,18 +146,14 @@ void wxZRColaSettings::OnOKButtonClick(wxCommandEvent& event)
// wxPersistentZRColaSettings // wxPersistentZRColaSettings
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaSettings::s_guiLevel = 1; wxPersistentZRColaSettings::wxPersistentZRColaSettings(wxZRColaSettings *wnd) : wxPersistentDialog(wnd)
wxPersistentZRColaSettings::wxPersistentZRColaSettings(wxZRColaSettings *wnd) : wxPersistentTLWEx(wnd)
{ {
} }
void wxPersistentZRColaSettings::Save() const void wxPersistentZRColaSettings::Save() const
{ {
SaveValue(wxT("guiLevel"), s_guiLevel); wxPersistentDialog::Save();
wxPersistentTLWEx::Save();
auto wnd = static_cast<const wxZRColaSettings*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor. auto wnd = static_cast<const wxZRColaSettings*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
@ -162,11 +179,11 @@ bool wxPersistentZRColaSettings::Restore()
} else if (RestoreValue(wxT("lang"), &lang) && lang.Length() == 3) { } else if (RestoreValue(wxT("lang"), &lang) && lang.Length() == 3) {
// The language was read from configuration. // The language was read from configuration.
wnd->m_lang = lang.c_str(); wnd->m_lang = lang.c_str();
} else if (!app->m_lang_db.idxLang.empty()) { } else if (!app->m_lang_db.idxLng.empty()) {
wnd->m_lang = app->m_lang_db.idxLang[0].lang; const auto &lang = app->m_lang_db.idxLng[0];
wnd->m_lang = lang.id;
} else } else
wnd->m_lang = ZRCola::langid_t::blank; wnd->m_lang = ZRCola::langid_t::blank;
int guiLevel; return wxPersistentDialog::Restore();
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;
} }

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -12,13 +26,8 @@ class wxPersistentZRColaSettings;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop) #include <wxex/persist/dialog.h>
#include <wxex/persist/toplevel.h>
#include <vector>
/// ///
@ -33,29 +42,27 @@ public:
protected: protected:
virtual void OnInitDialog(wxInitDialogEvent& event); virtual void OnInitDialog(wxInitDialogEvent& event);
virtual void OnLanguageUpdate(wxUpdateUIEvent& event); virtual void OnLangAuto(wxCommandEvent& event);
virtual void OnLangManual(wxCommandEvent& event);
virtual void OnApplyButtonClick(wxCommandEvent& event); virtual void OnApplyButtonClick(wxCommandEvent& event);
virtual void OnOKButtonClick(wxCommandEvent& event); virtual void OnOKButtonClick(wxCommandEvent& event);
public: public:
bool m_lang_auto; ///< Is language for inverse translation resolved using currently selected keyboard bool m_lang_auto; ///< Is language for decomposing resolved using currently selected keyboard
ZRCola::langid_t m_lang; ///< Language for inverse translation ZRCola::langid_t m_lang; ///< Language for decomposing
}; };
/// ///
/// Supports saving/restoring wxZRColaSettings state /// Supports saving/restoring wxZRColaSettings state
/// ///
class wxPersistentZRColaSettings : public wxPersistentTLWEx class wxPersistentZRColaSettings : public wxPersistentDialog
{ {
public: public:
wxPersistentZRColaSettings(wxZRColaSettings *wnd); wxPersistentZRColaSettings(wxZRColaSettings *wnd);
virtual void Save() const; virtual void Save() const;
virtual bool Restore(); virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
}; };

View File

@ -1,244 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
*/
#include "pch.h"
//////////////////////////////////////////////////////////////////////////
// wxZRColaTranslationSeq
//////////////////////////////////////////////////////////////////////////
wxZRColaTranslationSeq::wxZRColaTranslationSeq(wxWindow* parent) :
wxZRColaTranslationSeqBase(parent)
{
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_available->Clear();
for (size_t i = 0, n = app->m_ts_db.idxTranSet.size(); i < n; i++) {
const ZRCola::transet_db::transet &ts = app->m_ts_db.idxTranSet[i];
wxString
src(ts.src(), ts.src_len()),
dst(ts.dst(), ts.dst_len()),
src_tran(wxGetTranslation(src, wxT("ZRCola-zrcdb"))),
dst_tran(wxGetTranslation(dst, wxT("ZRCola-zrcdb"))),
label_tran(wxString::Format(wxT("%s \x00bb %s"), src_tran.c_str(), dst_tran.c_str()));
m_available->Append(label_tran, (void*)ts.set);
}
}
void wxZRColaTranslationSeq::OnInitDialog(wxInitDialogEvent& event)
{
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_selected->Clear();
for (auto s = m_transeq.cbegin(), s_end = m_transeq.cend(); s != s_end; ++s) {
ZRCola::transet_db::indexTranSet::size_type start;
if (app->m_ts_db.idxTranSet.find(ZRCola::transet_db::transet(*s), start)) {
const ZRCola::transet_db::transet &ts = app->m_ts_db.idxTranSet[start];
wxString
src(ts.src(), ts.src_len()),
dst(ts.dst(), ts.dst_len()),
src_tran(wxGetTranslation(src, wxT("ZRCola-zrcdb"))),
dst_tran(wxGetTranslation(dst, wxT("ZRCola-zrcdb"))),
label_tran(wxString::Format(wxT("%s \x00bb %s"), src_tran.c_str(), dst_tran.c_str()));
m_selected->Append(label_tran, (void*)ts.set);
} else {
wxString label_tran(wxString::Format(_("Unknown translation (%u)"), (unsigned int)*s));
m_selected->Append(label_tran, (void*)*s);
}
}
wxZRColaTranslationSeqBase::OnInitDialog(event);
}
void wxZRColaTranslationSeq::OnUpdate(wxUpdateUIEvent& event)
{
m_add->Enable(m_available->GetSelection() != wxNOT_FOUND);
int idx = m_selected->GetSelection();
m_remove ->Enable(idx != wxNOT_FOUND);
m_selectedUp ->Enable(idx != wxNOT_FOUND && (unsigned int)idx > 0);
m_selectedDown->Enable(idx != wxNOT_FOUND && (unsigned int)idx < m_selected->GetCount() - 1);
wxZRColaTranslationSeqBase::OnUpdate(event);
}
void wxZRColaTranslationSeq::OnAvailableChar(wxKeyEvent& event)
{
if (event.GetRawKeyCode() == VK_INSERT) {
int idx = m_available->GetSelection();
if (idx != wxNOT_FOUND) {
m_selected->Append(
m_available->GetString(idx),
m_available->GetClientData(idx));
}
}
wxZRColaTranslationSeqBase::OnAvailableChar(event);
}
void wxZRColaTranslationSeq::OnAvailableDClick(wxCommandEvent& event)
{
int idx = m_available->GetSelection();
if (idx != wxNOT_FOUND) {
m_selected->Append(
m_available->GetString(idx),
m_available->GetClientData(idx));
}
wxZRColaTranslationSeqBase::OnAvailableDClick(event);
}
void wxZRColaTranslationSeq::OnAdd(wxCommandEvent& event)
{
int idx = m_available->GetSelection();
wxASSERT_MSG(idx != wxNOT_FOUND, wxT("no available translation selected"));
m_selected->Append(
m_available->GetString(idx),
m_available->GetClientData(idx));
wxZRColaTranslationSeqBase::OnAdd(event);
}
void wxZRColaTranslationSeq::OnRemove(wxCommandEvent& event)
{
int idx = m_selected->GetSelection();
wxASSERT_MSG(idx != wxNOT_FOUND, wxT("no active translation selected"));
m_selected->Delete(idx);
wxZRColaTranslationSeqBase::OnRemove(event);
}
void wxZRColaTranslationSeq::OnSelectedChar(wxKeyEvent& event)
{
if (event.GetRawKeyCode() == VK_DELETE) {
int idx = m_selected->GetSelection();
if (idx != wxNOT_FOUND)
m_selected->Delete(idx);
}
wxZRColaTranslationSeqBase::OnSelectedChar(event);
}
void wxZRColaTranslationSeq::OnSelectedDClick(wxCommandEvent& event)
{
int idx = m_selected->GetSelection();
if (idx != wxNOT_FOUND)
m_selected->Delete(idx);
wxZRColaTranslationSeqBase::OnSelectedDClick(event);
}
void wxZRColaTranslationSeq::OnSelectedUp(wxCommandEvent& event)
{
int idx = m_selected->GetSelection();
wxASSERT_MSG(idx != wxNOT_FOUND && (unsigned int)idx > 0, wxT("no or first active translation selected"));
wxString label = m_selected->GetString(idx);
void *data = m_selected->GetClientData(idx);
m_selected->Delete(idx);
m_selected->Insert(label, idx - 1, data);
m_selected->Select(idx - 1);
wxZRColaTranslationSeqBase::OnSelectedUp(event);
}
void wxZRColaTranslationSeq::OnSelectedDown(wxCommandEvent& event)
{
int idx = m_selected->GetSelection();
wxASSERT_MSG(idx != wxNOT_FOUND && (unsigned int)idx < m_selected->GetCount() - 1, wxT("no or last active translation selected"));
wxString label = m_selected->GetString(idx);
void *data = m_selected->GetClientData(idx);
m_selected->Delete(idx);
m_selected->Insert(label, idx + 1, data);
m_selected->Select(idx + 1);
wxZRColaTranslationSeqBase::OnSelectedDown(event);
}
void wxZRColaTranslationSeq::OnApplyButtonClick(wxCommandEvent& event)
{
event.Skip();
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_transeq.clear();
for (unsigned int i = 0, n = m_selected->GetCount(); i < n; i++)
m_transeq.push_back(static_cast<ZRCola::transetid_t>((size_t)m_selected->GetClientData(i)));
// Notify source text something changed and should re-translate.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
app->m_mainWnd->m_panel->m_source->ProcessWindowEvent(event2);
}
void wxZRColaTranslationSeq::OnOKButtonClick(wxCommandEvent& event)
{
wxZRColaTranslationSeq::OnApplyButtonClick(event);
}
//////////////////////////////////////////////////////////////////////////
// wxPersistentZRColaTranslationSeq
//////////////////////////////////////////////////////////////////////////
const int wxPersistentZRColaTranslationSeq::s_guiLevel = 1;
wxPersistentZRColaTranslationSeq::wxPersistentZRColaTranslationSeq(wxZRColaTranslationSeq *wnd) : wxPersistentTLWEx(wnd)
{
}
void wxPersistentZRColaTranslationSeq::Save() const
{
SaveValue(wxT("guiLevel"), s_guiLevel);
wxPersistentTLWEx::Save();
auto wnd = static_cast<const wxZRColaTranslationSeq*>(GetWindow()); // dynamic_cast is not reliable as we are typically called late in the wxTopLevelWindowMSW destructor.
wxString str;
bool first = true;
for (auto s = wnd->m_transeq.cbegin(), s_end = wnd->m_transeq.cend(); s != s_end; ++s, first = false)
str += wxString::Format(first ? wxT("%u") : wxT("|%u"), *s);
SaveValue(wxT("transeq"), str);
}
bool wxPersistentZRColaTranslationSeq::Restore()
{
auto wnd = dynamic_cast<wxZRColaTranslationSeq*>(GetWindow());
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString str;
if (RestoreValue(wxT("transeq"), &str)) {
std::vector<ZRCola::transetid_t> transet;
for (wxStringTokenizer tok(str, wxT("|")); tok.HasMoreTokens(); ) {
ZRCola::transetid_t val = (ZRCola::transetid_t)_tcstoul(tok.GetNextToken().c_str(), NULL, 10);
for (size_t i = 0, n = app->m_ts_db.idxTranSet.size(); i < n; i++) {
const ZRCola::transet_db::transet &cg = app->m_ts_db.idxTranSet[i];
if (cg.set == val) {
transet.push_back(val);
break;
}
}
}
if (!transet.empty())
wnd->m_transeq = std::move(transet);
}
int guiLevel;
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;
}

View File

@ -1,73 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
*/
///
/// Forward declarations
///
class wxZRColaTranslationSeq;
class wxPersistentZRColaTranslationSeq;
#pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h"
#pragma warning(pop)
#include <zrcola/translate.h>
#include <wxex/persist/toplevel.h>
#include <vector>
///
/// Configuration dialog
///
class wxZRColaTranslationSeq : public wxZRColaTranslationSeqBase
{
public:
wxZRColaTranslationSeq(wxWindow* parent);
friend class wxPersistentZRColaTranslationSeq; // Allow saving/restoring window state.
protected:
virtual void OnInitDialog(wxInitDialogEvent& event);
virtual void OnUpdate(wxUpdateUIEvent& event);
virtual void OnAvailableChar(wxKeyEvent& event);
virtual void OnAvailableDClick(wxCommandEvent& event);
virtual void OnAdd(wxCommandEvent& event);
virtual void OnRemove(wxCommandEvent& event);
virtual void OnSelectedChar(wxKeyEvent& event);
virtual void OnSelectedDClick(wxCommandEvent& event);
virtual void OnSelectedUp(wxCommandEvent& event);
virtual void OnSelectedDown(wxCommandEvent& event);
virtual void OnApplyButtonClick(wxCommandEvent& event);
virtual void OnOKButtonClick(wxCommandEvent& event);
public:
std::vector<ZRCola::transetid_t> m_transeq; ///< Custom translation set sequence
};
///
/// Supports saving/restoring wxZRColaTranslationSeq state
///
class wxPersistentZRColaTranslationSeq : public wxPersistentTLWEx
{
public:
wxPersistentZRColaTranslationSeq(wxZRColaTranslationSeq *wnd);
virtual void Save() const;
virtual bool Restore();
protected:
static const int s_guiLevel; ///< Persisted placements/sizing are considered incompatible between different GUI levels
};
inline wxPersistentObject *wxCreatePersistentObject(wxZRColaTranslationSeq *wnd)
{
return new wxPersistentZRColaTranslationSeq(wnd);
}

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@ -27,7 +41,6 @@ wxZRColaUpdater::wxZRColaUpdater(wxWindow* parent) :
// Prepare Updater. // Prepare Updater.
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
#pragma warning(suppress: 26812) // wxLanguage is unscoped.
m_updater = new wxUpdCheckThread(app->m_lang_ui == wxLANGUAGE_DEFAULT ? wxT("en_US") : wxLocale::GetLanguageCanonicalName(app->m_lang_ui), this); m_updater = new wxUpdCheckThread(app->m_lang_ui == wxLANGUAGE_DEFAULT ? wxT("en_US") : wxLocale::GetLanguageCanonicalName(app->m_lang_ui), this);
//if (m_updater->Run() != wxTHREAD_NO_ERROR) { //if (m_updater->Run() != wxTHREAD_NO_ERROR) {
// wxFAIL_MSG(wxT("Can't create the thread!")); // wxFAIL_MSG(wxT("Can't create the thread!"));
@ -67,7 +80,7 @@ wxZRColaUpdater::~wxZRColaUpdater()
void wxZRColaUpdater::OnIdle(wxIdleEvent& event) void wxZRColaUpdater::OnIdle(wxIdleEvent& event)
{ {
if (!m_finished) { if (!m_finished) {
m_buttonUpdate->Enable(m_updater->CheckForUpdate() == wxUpdCheckThread::wxResult::UpdateAvailable); m_buttonUpdate->Enable(m_updater->CheckForUpdate() == wxUpdCheckThread::wxUpdUpdateAvailable);
m_finished = true; m_finished = true;
} }
} }

View File

@ -1,6 +1,20 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
/// ///
@ -11,16 +25,11 @@ class wxZRColaUpdater;
#pragma once #pragma once
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include "zrcolagui.h" #include "zrcolagui.h"
#pragma warning(pop)
#include <Updater/chkthread.h> #include <Updater/chkthread.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/log.h> #include <wx/log.h>
#pragma warning(pop)
/// ///

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\lib\wxExtend\include;..\lib\WinStd\include;..\lib\stdex\include;..\lib\libZRCola\include;..\lib\libZRColaUI\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>

Binary file not shown.

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration> <Configuration>Debug</Configuration>
@ -15,49 +15,44 @@
<RootNamespace>ZRColaCompile</RootNamespace> <RootNamespace>ZRColaCompile</RootNamespace>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
</PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Debug'">
<UseDebugLibraries>true</UseDebugLibraries> <UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Configuration" Condition="'$(Configuration)'=='Release'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" /> <ImportGroup Label="ExtensionSettings">
<ImportGroup Label="PropertySheets"> </ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\$(Platform).props" /> <Import Project="..\include\Win32.props" />
<Import Project="..\include\$(Configuration).props" /> <Import Project="..\include\Debug.props" />
<Import Project="ZRColaCompile.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\include\Win32.props" />
<Import Project="..\include\Release.props" />
<Import Project="ZRColaCompile.props" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="UserMacros" /> <PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>..\output\$(Platform).$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\lib\wxExtend\include;..\lib\WinStd\include;..\lib\stdex\include;..\lib\libZRCola\include;..\lib\libZRColaUI\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dbsource.cpp" /> <ClCompile Include="dbsource.cpp" />
<ClCompile Include="main.cpp" /> <ClCompile Include="main.cpp" />
<ClCompile Include="parse.cpp" /> <ClCompile Include="stdafx.cpp">
<ClCompile Include="pch.cpp"> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader>Create</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="dbsource.h" /> <ClInclude Include="dbsource.h" />
<ClInclude Include="parse.h" /> <ClInclude Include="stdafx.h" />
<ClInclude Include="pch.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\lib\libZRColaUI\build\libZRColaUI.vcxproj"> <ProjectReference Include="..\lib\libZRColaUI\build\libZRColaUI.vcxproj">
@ -66,8 +61,11 @@
<ProjectReference Include="..\lib\libZRCola\build\libZRCola.vcxproj"> <ProjectReference Include="..\lib\libZRCola\build\libZRCola.vcxproj">
<Project>{3c61929e-7289-4101-8d0a-da22d6e1aea8}</Project> <Project>{3c61929e-7289-4101-8d0a-da22d6e1aea8}</Project>
</ProjectReference> </ProjectReference>
<ProjectReference Include="..\lib\wxExtend\build\wxExtendLib.vcxproj"> <ProjectReference Include="..\lib\WinStd\build\WinStd-10.0.vcxproj">
<Project>{D3E29951-D9F5-486D-A167-20AE8E90B1FA}</Project> <Project>{47399d91-7eb9-41de-b521-514ba5db0c43}</Project>
</ProjectReference>
<ProjectReference Include="..\lib\wxExtend\build\wxExtendDll-10.0.vcxproj">
<Project>{a3a36689-ac35-4026-93da-a3ba0c0e767c}</Project>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -19,7 +19,7 @@
</Filter> </Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="pch.cpp"> <ClCompile Include="stdafx.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="main.cpp"> <ClCompile Include="main.cpp">
@ -28,20 +28,14 @@
<ClCompile Include="dbsource.cpp"> <ClCompile Include="dbsource.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="parse.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="pch.h"> <ClInclude Include="stdafx.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="dbsource.h"> <ClInclude Include="dbsource.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="parse.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="ZRColaCompile.rc"> <ResourceCompile Include="ZRColaCompile.rc">

View File

@ -1,9 +1,23 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "pch.h" #include "stdafx.h"
using namespace std; using namespace std;
using namespace stdex; using namespace stdex;
@ -14,19 +28,35 @@ using namespace winstd;
// ZRCola::DBSource::character_bank // ZRCola::DBSource::character_bank
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
ZRCola::DBSource::character_bank::character_bank() : vector<unique_ptr<ZRCola::DBSource::character> >()
{
resize(0x10000);
}
void ZRCola::DBSource::character_bank::build_related() void ZRCola::DBSource::character_bank::build_related()
{ {
// Initialize ignore list.
m_ignore.insert(L"letter");
m_ignore.insert(L"modifier");
m_ignore.insert(L"symbol");
m_ignore.insert(L"accent");
m_ignore.insert(L"with");
m_ignore.insert(L"and");
m_ignore.insert(L"capital");
m_ignore.insert(L"small");
m_ignore.insert(L"combining");
SYSTEM_INFO si; SYSTEM_INFO si;
GetSystemInfo(&si); GetSystemInfo(&si);
// Launch workers. // Launch workers.
build_related_worker **workers = new build_related_worker*[si.dwNumberOfProcessors]; build_related_worker **workers = new build_related_worker*[si.dwNumberOfProcessors];
size_type from = 0, total = size(); size_type from = 0, to;
iterator chr_from = begin(), chr_to; for (DWORD i = 0; i < si.dwNumberOfProcessors; i++) {
for (DWORD i = 0; i < si.dwNumberOfProcessors; i++, chr_from = chr_to) { to = MulDiv(i + 1, 0x10000, si.dwNumberOfProcessors);
size_type to = MulDiv(i + 1, total, si.dwNumberOfProcessors); workers[i] = new build_related_worker(this, from, to);
for (chr_to = chr_from; from < to; from++, ++chr_to); from = to;
workers[i] = new build_related_worker(this, chr_from, chr_to);
} }
// Wait for workers. // Wait for workers.
@ -37,12 +67,12 @@ void ZRCola::DBSource::character_bank::build_related()
} }
} }
delete [] workers; // This line of code sounds horrible, I know. delete workers; // This line of code sounds horrible, I know.
} }
ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In_ const character_bank *cb, _In_ iterator from, _In_ iterator to) : ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In_ const character_bank *cb, _In_ size_type from, _In_ size_type to) :
winstd::thread((HANDLE)_beginthreadex(NULL, 0, process, this, CREATE_SUSPENDED, NULL)), win_handle((HANDLE)_beginthreadex(NULL, 0, process, this, CREATE_SUSPENDED, NULL)),
m_heap(HeapCreate(0, 0, 0)), m_heap(HeapCreate(0, 0, 0)),
m_cb(cb), m_cb(cb),
m_from(from), m_from(from),
@ -56,39 +86,40 @@ ZRCola::DBSource::character_bank::build_related_worker::build_related_worker(_In
unsigned int ZRCola::DBSource::character_bank::build_related_worker::process() unsigned int ZRCola::DBSource::character_bank::build_related_worker::process()
{ {
heap_allocator<wchar_t> al(m_heap); heap_allocator<wchar_t> al(m_heap);
vector<wchar_t, heap_allocator<wchar_t> > rel(al); basic_string<wchar_t, char_traits<wchar_t>, heap_allocator<wchar_t> > rel(al);
set<wstring, less<wstring>, heap_allocator<wstring> > matching(less<wstring>(), al); set<wstring, less<wstring>, heap_allocator<wstring> > matching(less<wstring>(), al);
for (auto c = m_from; c != m_to; c++) { for (size_type i = m_from; i < m_to; i++) {
auto &chr = *(m_cb->at(i).get());
if (&chr == NULL) continue;
rel.clear(); rel.clear();
// Skip all unexisting, or self related characters. // Remove all unexisting, inactive, or self related characters.
auto m_cb_end = m_cb->cend(); for (auto j = chr.rel.length(); j--;) {
for (std::vector<wchar_t>::const_pointer c_rel = c->second.rel.data(), c_rel_end = c_rel + c->second.rel.size(), c_rel_next = c_rel_end; c_rel < c_rel_end; c_rel = c_rel_next) { wchar_t c = chr.rel[j];
c_rel_next = c_rel + wcsnlen(c_rel, c_rel_end - c_rel) + 1; if (m_cb->at(c) && (wchar_t)j != c)
if (m_cb->find(c_rel) != m_cb_end && c->first.compare(c_rel) != 0) rel += c;
rel.insert(rel.end(), c_rel, c_rel_next);
} }
// Add all characters that share enough keywords. // Add all characters that share enought keywords.
for (auto c2 = m_cb->cbegin(), c2_end = m_cb->cend(); c2 != c2_end; ++c2) { for (size_type j = 0, j_end = m_cb->size(); j < j_end; j++) {
if (c == c2) if (i == j || rel.find((wchar_t)j) != wstring::npos)
continue; continue;
bool already_present = false; const auto &chr2 = *(m_cb->at(j).get());
for (std::vector<wchar_t>::const_pointer c_rel = rel.data(), c_rel_end = c_rel + rel.size(), c_rel_next = c_rel_end; c_rel < c_rel_end; c_rel = c_rel_next) { if (&chr2 == NULL)
c_rel_next = c_rel + wcsnlen(c_rel, c_rel_end - c_rel) + 1;
if (c2->first.compare(c_rel) == 0) {
already_present = true;
break;
}
}
if (already_present)
continue; continue;
set<wstring>::size_type comparisons = 0; set<wstring>::size_type comparisons = 0;
matching.clear(); matching.clear();
for (auto term = c->second.terms_rel.cbegin(), term_end = c->second.terms_rel.cend(); term != term_end; ++term) { for (auto term = chr.terms.cbegin(), term_end = chr.terms.cend(); term != term_end; ++term) {
for (auto term2 = c2->second.terms_rel.cbegin(), term2_end = c2->second.terms_rel.cend(); term2 != term2_end; ++term2) { // Test for ignored word(s).
if (m_cb->m_ignore.find(*term) != m_cb->m_ignore.cend())
continue;
for (auto term2 = chr2.terms.cbegin(), term2_end = chr2.terms.cend(); term2 != term2_end; ++term2) {
// Test for ignored word(s).
if (m_cb->m_ignore.find(*term2) != m_cb->m_ignore.cend())
continue;
comparisons++; comparisons++;
if (*term == *term2) if (*term == *term2)
matching.insert(*term); matching.insert(*term);
@ -99,11 +130,11 @@ unsigned int ZRCola::DBSource::character_bank::build_related_worker::process()
// If 1/2 terms match, assume related. // If 1/2 terms match, assume related.
auto hits = matching.size(); auto hits = matching.size();
if (hits*hits*2 >= comparisons) if (hits*hits*2 >= comparisons)
rel.insert(rel.end(), c2->first.data(), c2->first.data() + c2->first.length() + 1); rel += chr2.chr;
} }
} }
c->second.rel.assign(rel.cbegin(), rel.cend()); chr.rel.assign(rel.c_str(), rel.length());
} }
return 0; return 0;
@ -120,7 +151,7 @@ unsigned int __stdcall ZRCola::DBSource::character_bank::build_related_worker::p
// ZRCola::DBSource::character_desc_idx // ZRCola::DBSource::character_desc_idx
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
void ZRCola::DBSource::character_desc_idx::parse_keywords(_In_ const wchar_t *str, _Inout_ set<wstring> &terms) void ZRCola::DBSource::character_desc_idx::parse_keywords(const wchar_t *str, set<wstring> &terms)
{ {
wxASSERT_MSG(str, wxT("string is NULL")); wxASSERT_MSG(str, wxT("string is NULL"));
@ -166,7 +197,7 @@ void ZRCola::DBSource::character_desc_idx::parse_keywords(_In_ const wchar_t *st
} }
void ZRCola::DBSource::character_desc_idx::add_keywords(const set<wstring> &terms, const wstring &chr, size_t sub) void ZRCola::DBSource::character_desc_idx::add_keywords(const set<wstring> &terms, wchar_t chr, size_t sub)
{ {
for (auto term = terms.cbegin(), term_end = terms.cend(); term != term_end; ++term) { for (auto term = terms.cbegin(), term_end = terms.cend(); term != term_end; ++term) {
if (sub) { if (sub) {
@ -186,7 +217,7 @@ void ZRCola::DBSource::character_desc_idx::add_keywords(const set<wstring> &term
} }
void ZRCola::DBSource::character_desc_idx::save(ZRCola::textindex<wchar_t, wchar_t, uint32_t> &idx) const void ZRCola::DBSource::character_desc_idx::save(ZRCola::textindex<wchar_t, wchar_t, unsigned __int32> &idx) const
{ {
idx .clear(); idx .clear();
idx.keys .clear(); idx.keys .clear();
@ -205,7 +236,7 @@ void ZRCola::DBSource::character_desc_idx::save(ZRCola::textindex<wchar_t, wchar
// Convert the index. // Convert the index.
for (const_iterator i = cbegin(), i_end = cend(); i != i_end; ++i) { for (const_iterator i = cbegin(), i_end = cend(); i != i_end; ++i) {
ZRCola::mappair_t<uint32_t> p = { idx.keys.size(), idx.values.size() }; ZRCola::mappair_t<unsigned __int32> p = { idx.keys.size(), idx.values.size() };
idx.push_back(p); idx.push_back(p);
idx.keys.insert(idx.keys.end(), i->first.cbegin(), i->first.cend()); idx.keys.insert(idx.keys.end(), i->first.cbegin(), i->first.cend());
idx.values.insert(idx.values.end(), i->second.cbegin(), i->second.cend()); idx.values.insert(idx.values.end(), i->second.cbegin(), i->second.cend());
@ -217,33 +248,16 @@ void ZRCola::DBSource::character_desc_idx::save(ZRCola::textindex<wchar_t, wchar
// ZRCola::DBSource // ZRCola::DBSource
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
ZRCola::DBSource::DBSource() : ZRCola::DBSource::DBSource()
m_locale(nullptr)
{ {
// Initialize ignore list.
m_terms_ignore.insert(L"letter");
m_terms_ignore.insert(L"modifier");
m_terms_ignore.insert(L"symbol");
m_terms_ignore.insert(L"accent");
m_terms_ignore.insert(L"with");
m_terms_ignore.insert(L"and");
m_terms_ignore.insert(L"capital");
m_terms_ignore.insert(L"small");
m_terms_ignore.insert(L"combining");
} }
ZRCola::DBSource::~DBSource() ZRCola::DBSource::~DBSource()
{ {
// Manually release all COM objects related to the database before we close the database. // Manually release all COM objects related to the database before we close the database.
m_pTranslationSets1.free();
m_comTranslationSets.free();
m_pTranslation1.free();
m_comTranslation.free();
m_pCharacterGroup1.free(); m_pCharacterGroup1.free();
m_comCharacterGroup.free(); m_comCharacterGroup.free();
m_pHighlight1.free();
m_comHighlight.free();
if (m_db) if (m_db)
m_db->Close(); m_db->Close();
@ -266,25 +280,19 @@ bool ZRCola::DBSource::Open(LPCTSTR filename)
cn += L"Dbq="; cn += L"Dbq=";
cn += filename; cn += filename;
cn += L";Uid=;Pwd=;"; cn += L";Uid=;Pwd=;";
#pragma warning(push)
#pragma warning(disable: 6387) // Connection15::Open() declaration is wrong: it defaults username and password parameters to NULL, but annotates them as required non-NULL.
hr = m_db->Open(bstr(cn.c_str())); hr = m_db->Open(bstr(cn.c_str()));
#pragma warning(pop)
if (SUCCEEDED(hr)) { if (SUCCEEDED(hr)) {
// Database open and ready. // Database open and ready.
m_filename = filename; m_filename = filename;
m_locale = _create_locale(LC_ALL, "Slovenian_Slovenia.1250"); m_locale = _create_locale(LC_ALL, "Slovenian_Slovenia.1250");
// Create ADO command(s).
wxASSERT_MSG(!m_comCharacterGroup, wxT("ADO command already created")); wxASSERT_MSG(!m_comCharacterGroup, wxT("ADO command already created"));
// Create ADO command(s).
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comCharacterGroup))); wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comCharacterGroup)));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_ActiveConnection(variant(m_db)))); wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_ActiveConnection(variant(m_db))));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandType(adCmdText))); wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandType(adCmdText)));
wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandText(bstr(L"SELECT [VRS_SkupineZnakov].[Znak], [VRS_SkupineZnakov].[pogost] " wxVERIFY(SUCCEEDED(m_comCharacterGroup->put_CommandText(bstr(L"SELECT [VRS_SkupineZnakov].[Znak], [VRS_SkupineZnakov].[pogost] FROM [VRS_SkupineZnakov] LEFT JOIN [VRS_CharList] ON [VRS_SkupineZnakov].[Znak]=[VRS_CharList].[znak] WHERE [VRS_CharList].[aktiven]=1 AND [VRS_SkupineZnakov].[Skupina]=? ORDER BY [VRS_SkupineZnakov].[Rang] ASC, [VRS_SkupineZnakov].[Znak] ASC"))));
L"FROM [VRS_SkupineZnakov] "
L"LEFT JOIN [VRS_CharList] ON [VRS_SkupineZnakov].[Znak]=[VRS_CharList].[znak] "
L"WHERE [VRS_CharList].[aktiven]=1 AND [VRS_SkupineZnakov].[Skupina]=? "
L"ORDER BY [VRS_SkupineZnakov].[Rang] ASC, [VRS_SkupineZnakov].[Znak] ASC"))));
{ {
// Create and add command parameters. // Create and add command parameters.
com_obj<ADOParameters> params; com_obj<ADOParameters> params;
@ -294,57 +302,6 @@ bool ZRCola::DBSource::Open(LPCTSTR filename)
wxVERIFY(SUCCEEDED(params->Append(m_pCharacterGroup1))); wxVERIFY(SUCCEEDED(params->Append(m_pCharacterGroup1)));
} }
wxASSERT_MSG(!m_comTranslation, wxT("ADO command already created"));
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comTranslation)));
wxVERIFY(SUCCEEDED(m_comTranslation->put_ActiveConnection(variant(m_db))));
wxVERIFY(SUCCEEDED(m_comTranslation->put_CommandType(adCmdText)));
wxVERIFY(SUCCEEDED(m_comTranslation->put_CommandText(bstr(L"SELECT [Komb1] AS [komb], [rang_komb1] AS [rang_komb], '' AS [Kano], 0 AS [Kanoniziraj], [Komb2] AS [znak], [rang_komb2] AS [rang_znak] "
L"FROM [VRS_ScriptRepl2] "
L"WHERE [Script]=? "
L"ORDER BY [Komb2], [rang_komb2], [rang_komb1], [Komb1]"))));
{
// Create and add command parameters.
com_obj<ADOParameters> params;
wxVERIFY(SUCCEEDED(m_comTranslation->get_Parameters(&params)));
wxASSERT_MSG(!m_pTranslation1, wxT("ADO command parameter already created"));
wxVERIFY(SUCCEEDED(m_comTranslation->CreateParameter(bstr(L"@Script"), adSmallInt, adParamInput, 0, variant(DISP_E_PARAMNOTFOUND, VT_ERROR), &m_pTranslation1)));
wxVERIFY(SUCCEEDED(params->Append(m_pTranslation1)));
}
wxASSERT_MSG(!m_comTranslationSets, wxT("ADO command already created"));
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comTranslationSets)));
wxVERIFY(SUCCEEDED(m_comTranslationSets->put_ActiveConnection(variant(m_db))));
wxVERIFY(SUCCEEDED(m_comTranslationSets->put_CommandType(adCmdText)));
wxVERIFY(SUCCEEDED(m_comTranslationSets->put_CommandText(bstr(L"SELECT [Script] "
L"FROM [VRS_Script2SeqScr] "
L"WHERE [ID]=? "
L"ORDER BY [Rank] ASC"))));
{
// Create and add command parameters.
com_obj<ADOParameters> params;
wxVERIFY(SUCCEEDED(m_comTranslationSets->get_Parameters(&params)));
wxASSERT_MSG(!m_pTranslationSets1, wxT("ADO command parameter already created"));
wxVERIFY(SUCCEEDED(m_comTranslationSets->CreateParameter(bstr(L"@ID"), adSmallInt, adParamInput, 0, variant(DISP_E_PARAMNOTFOUND, VT_ERROR), &m_pTranslationSets1)));
wxVERIFY(SUCCEEDED(params->Append(m_pTranslationSets1)));
}
wxASSERT_MSG(!m_comHighlight, wxT("ADO command already created"));
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADOCommand, NULL, CLSCTX_ALL, IID_IADOCommand, (LPVOID*)&m_comHighlight)));
wxVERIFY(SUCCEEDED(m_comHighlight->put_ActiveConnection(variant(m_db))));
wxVERIFY(SUCCEEDED(m_comHighlight->put_CommandType(adCmdText)));
wxVERIFY(SUCCEEDED(m_comHighlight->put_CommandText(bstr(L"SELECT [komb] "
L"FROM [VRS_HighlightChars2] "
L"WHERE [group]=? "
L"ORDER BY [komb]"))));
{
// Create and add command parameters.
com_obj<ADOParameters> params;
wxVERIFY(SUCCEEDED(m_comHighlight->get_Parameters(&params)));
wxASSERT_MSG(!m_pHighlight1, wxT("ADO command parameter already created"));
wxVERIFY(SUCCEEDED(m_comHighlight->CreateParameter(bstr(L"@group"), adSmallInt, adParamInput, 0, variant(DISP_E_PARAMNOTFOUND, VT_ERROR), &m_pHighlight1)));
wxVERIFY(SUCCEEDED(params->Append(m_pHighlight1)));
}
return true; return true;
} else { } else {
_ftprintf(stderr, wxT("%s: error ZCC0011: Could not open database (0x%x).\n"), (LPCTSTR)filename, hr); _ftprintf(stderr, wxT("%s: error ZCC0011: Could not open database (0x%x).\n"), (LPCTSTR)filename, hr);
@ -405,32 +362,15 @@ bool ZRCola::DBSource::GetValue(const com_obj<ADOField>& f, bool& val) const
} }
bool ZRCola::DBSource::GetValue(const com_obj<ADOField>& f, short& val) const bool ZRCola::DBSource::GetValue(const com_obj<ADOField>& f, int& val) const
{ {
wxASSERT_MSG(f, wxT("field is empty")); wxASSERT_MSG(f, wxT("field is empty"));
variant v; variant v;
wxVERIFY(SUCCEEDED(f->get_Value(&v))); wxVERIFY(SUCCEEDED(f->get_Value(&v)));
wxCHECK(SUCCEEDED(v.change_type(VT_I2)), false); wxCHECK(SUCCEEDED(v.change_type(VT_I4)), false);
val = V_I2(&v); val = V_I4(&v);
return true;
}
bool ZRCola::DBSource::GetValue(const com_obj<ADOField>& f, string& val) const
{
wxASSERT_MSG(f, wxT("field is empty"));
variant v;
wxVERIFY(SUCCEEDED(f->get_Value(&v)));
if (V_VT(&v) != VT_NULL) {
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false);
WideCharToMultiByte(CP_ACP, 0, V_BSTR(&v), ::SysStringLen(V_BSTR(&v)), val, NULL, NULL);
} else
val.clear();
return true; return true;
} }
@ -494,73 +434,35 @@ bool ZRCola::DBSource::GetUnicodeString(const com_obj<ADOField>& f, wstring& str
variant v; variant v;
wxVERIFY(SUCCEEDED(f->get_Value(&v))); wxVERIFY(SUCCEEDED(f->get_Value(&v)));
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false);
// Parse the field. Must be "xxxx+xxxx+xxxx..." sequence.
str.clear(); str.clear();
if (V_VT(&v) != VT_NULL) { for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) {
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false); // Parse Unicode code.
UINT j = 0;
// Parse the field. Must be "xxxx+xxxx+xxxx..." sequence. wchar_t c = 0;
for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) { for (; i < n && V_BSTR(&v)[i]; i++, j++) {
// Parse Unicode code. if (L'0' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'9') c = c*0x10 + (V_BSTR(&v)[i] - L'0');
UINT j = 0; else if (L'A' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'F') c = c*0x10 + (V_BSTR(&v)[i] - L'A' + 10);
wchar_t c = 0; else if (L'a' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'f') c = c*0x10 + (V_BSTR(&v)[i] - L'a' + 10);
for (; i < n && V_BSTR(&v)[i]; i++, j++) { else break;
if (L'0' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'9') c = c*0x10 + (V_BSTR(&v)[i] - L'0');
else if (L'A' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'F') c = c*0x10 + (V_BSTR(&v)[i] - L'A' + 10);
else if (L'a' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'f') c = c*0x10 + (V_BSTR(&v)[i] - L'a' + 10);
else break;
}
if (j <= 0 || 4 < j) {
bstr fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname)));
_ftprintf(stderr, wxT("%s: error ZCC0020: Syntax error in \"%.*ls\" field (\"%.*ls\"). Unicode code must be one to four hexadecimal characters long.\n"), m_filename.c_str(), fieldname.length(), (BSTR)fieldname, n, V_BSTR(&v));
return false;
}
str += c;
// Skip delimiter(s) and whitespace.
for (; i < n && V_BSTR(&v)[i] && (V_BSTR(&v)[i] == L'+' || _iswspace_l(V_BSTR(&v)[i], m_locale)); i++);
} }
if (j <= 0 || 4 < j) {
bstr fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname)));
_ftprintf(stderr, wxT("%s: error ZCC0020: Syntax error in \"%.*ls\" field (\"%.*ls\"). Unicode code must be one to four hexadecimal characters long.\n"), m_filename.c_str(), fieldname.length(), (BSTR)fieldname, n, V_BSTR(&v));
return false;
}
str += c;
// Skip delimiter(s) and whitespace.
for (; i < n && V_BSTR(&v)[i] && (V_BSTR(&v)[i] == L'+' || _iswspace_l(V_BSTR(&v)[i], m_locale)); i++);
} }
return true; return true;
} }
bool ZRCola::DBSource::GetNormPerm(const winstd::com_obj<ADOField>& f, normperm& np) const
{
wxASSERT_MSG(f, wxT("field is empty"));
variant v;
wxVERIFY(SUCCEEDED(f->get_Value(&v)));
np.clear();
if (V_VT(&v) != VT_NULL) {
wxCHECK(SUCCEEDED(v.change_type(VT_BSTR)), false);
// Parse the field. Must be "nnnn,nnnn,nnnn..." sequence.
for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) {
// Parse Unicode code.
UINT j = 0;
std::vector<size_t> p;
for (; i < n && V_BSTR(&v)[i]; i++, j++) {
if (L'0' <= V_BSTR(&v)[i] && V_BSTR(&v)[i] <= L'9') p.push_back(V_BSTR(&v)[i] - L'0');
else break;
}
if (j <= 0) {
bstr fieldname; wxVERIFY(SUCCEEDED(f->get_Name(&fieldname)));
_ftprintf(stderr, wxT("%s: error ZCC0150: Syntax error in \"%.*ls\" field (\"%.*ls\"). Permutation sequence must be at least one decimal digit long.\n"), m_filename.c_str(), fieldname.length(), (BSTR)fieldname, n, V_BSTR(&v));
return false;
}
np.insert(std::move(p));
// Skip delimiter(s) and whitespace.
for (; i < n && V_BSTR(&v)[i] && (V_BSTR(&v)[i] == L',' || _iswspace_l(V_BSTR(&v)[i], m_locale)); i++);
}
}
return true;
}
bool ZRCola::DBSource::GetLanguage(const com_obj<ADOField>& f, ZRCola::langid_t& lang) const bool ZRCola::DBSource::GetLanguage(const com_obj<ADOField>& f, ZRCola::langid_t& lang) const
{ {
wxASSERT_MSG(f, wxT("field is empty")); wxASSERT_MSG(f, wxT("field is empty"));
@ -647,7 +549,7 @@ bool ZRCola::DBSource::GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid
// Parse the field. Must be "name, name, name..." sequence. // Parse the field. Must be "name, name, name..." sequence.
names.clear(); names.clear();
for (UINT i = 0, i_end = ::SysStringLen(V_BSTR(&v)); i < i_end && V_BSTR(&v)[i];) { for (UINT i = 0, n = ::SysStringLen(V_BSTR(&v)); i < n && V_BSTR(&v)[i];) {
if (iswspace(V_BSTR(&v)[i])) { if (iswspace(V_BSTR(&v)[i])) {
// Skip leading white space. // Skip leading white space.
i++; continue; i++; continue;
@ -655,7 +557,7 @@ bool ZRCola::DBSource::GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid
// Parse name. // Parse name.
UINT j = i, j_end = i; UINT j = i, j_end = i;
for (; i < i_end && V_BSTR(&v)[i]; i++) { for (; i < n && V_BSTR(&v)[i]; i++) {
if (V_BSTR(&v)[i] == L',' || V_BSTR(&v)[i] == L';') { if (V_BSTR(&v)[i] == L',' || V_BSTR(&v)[i] == L';') {
// Delimiter found. // Delimiter found.
i++; break; i++; break;
@ -670,7 +572,7 @@ bool ZRCola::DBSource::GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid
// Add name to the list. // Add name to the list.
names.push_back(std::move(name)); names.push_back(std::move(name));
break; break;
} else if (ZRCola::tagname_db::tagname::CompareName(lcid, n->data(), (uint16_t)n->length(), name.data(), (uint16_t)name.length()) == CSTR_EQUAL) { } else if (ZRCola::tagname_db::tagname::CompareName(lcid, n->data(), (unsigned __int16)n->length(), name.data(), (unsigned __int16)name.length()) == CSTR_EQUAL) {
// Name is already on the list. // Name is already on the list.
break; break;
} }
@ -681,59 +583,6 @@ bool ZRCola::DBSource::GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid
} }
bool ZRCola::DBSource::SelectNormPermSets(winstd::com_obj<ADORecordset>& rs) const
{
// Create a new recordset.
rs.free();
wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false);
// Open it.
if (FAILED(rs->Open(variant(
L"SELECT [oblika], [oblike] "
L"FROM [VRS_CharCanoOblike] "
L"ORDER BY [oblika], [oblike]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
{
_ftprintf(stderr, wxT("%s: error ZCC0160: Error loading normalization permutation sets from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::GetNormPerm(const winstd::com_obj<ADORecordset>& rs, std::string& norm, normperm& np) const
{
wxASSERT_MSG(rs, wxT("recordset is empty"));
com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"oblika"), &f)));
wxCHECK(GetValue(f, norm), false);
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"oblike"), &f)));
wxCHECK(GetNormPerm(f, np), false);
}
// Verify all lengths match.
size_t n = norm.length();
for (auto p = np.cbegin(), p_end = np.cend(); p != p_end; ++p) {
if (p->size() != n) {
_ftprintf(stderr, wxT("%s: error ZCC0170: Inconsistent normalization sequence \"%.*hs\" permutation length. Please make sure all permutation lengths match normalization sequence length (%u).\n"), m_filename.c_str(), n, norm.c_str(), n);
return false;
}
}
return true;
}
bool ZRCola::DBSource::SelectTranslations(com_obj<ADORecordset> &rs) const bool ZRCola::DBSource::SelectTranslations(com_obj<ADORecordset> &rs) const
{ {
// Create a new recordset. // Create a new recordset.
@ -742,33 +591,12 @@ bool ZRCola::DBSource::SelectTranslations(com_obj<ADORecordset> &rs) const
// Open it. // Open it.
if (FAILED(rs->Open(variant( if (FAILED(rs->Open(variant(
L"SELECT [komb], [rang_komb], [Kano], [Kanoniziraj], [znak], [rang_znak] " L"SELECT [komb], [znak], [rang_znak] "
L"FROM [VRS_ReplChar] " L"FROM [VRS_ReplChar] "
L"WHERE [rang_komb]=1 " L"WHERE [rang_komb]=1 "
L"ORDER BY [znak], [rang_znak], [rang_komb], [komb]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText))) L"ORDER BY [znak], [rang_znak], [komb]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
{ {
_ftprintf(stderr, wxT("%s: error ZCC0040: Error loading translations from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); _ftprintf(stderr, wxT("%s: error ZCC0040: Error loading compositions from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::SelectTranslations(short set, winstd::com_obj<ADORecordset>& rs) const
{
// Create a new recordset.
rs.free();
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)));
wxVERIFY(SUCCEEDED(rs->put_CursorLocation(adUseClient)));
wxVERIFY(SUCCEEDED(rs->put_CursorType(adOpenForwardOnly)));
wxVERIFY(SUCCEEDED(rs->put_LockType(adLockReadOnly)));
// Open it.
wxVERIFY(SUCCEEDED(m_pTranslation1->put_Value(variant(set))));
if (FAILED(rs->Open(variant(m_comTranslation), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) {
_ftprintf(stderr, wxT("%s: error ZCC0100: Error loading translations from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors(); LogErrors();
return false; return false;
} }
@ -787,165 +615,19 @@ bool ZRCola::DBSource::GetTranslation(const com_obj<ADORecordset>& rs, ZRCola::D
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"komb"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"komb"), &f)));
wxCHECK(GetUnicodeString(f, t.src.str), false); wxCHECK(GetUnicodeString(f, t.decomp.str), false);
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"rang_komb"), &f)));
wxCHECK(GetValue(f, t.src.rank), false);
}
{
bool norm;
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Kanoniziraj"), &f)));
wxCHECK(GetValue(f, norm), false);
if (norm) {
com_obj<ADOField> f2;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Kano"), &f2)));
wxCHECK(GetValue(f2, t.norm), false);
} else
t.norm.clear();
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"rang_znak"), &f)));
wxCHECK(GetValue(f, t.dst.rank), false);
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
wxCHECK(GetUnicodeString(f, t.dst.str), false); wxCHECK(GetUnicodeCharacter(f, t.chr), false);
}
return true;
}
bool ZRCola::DBSource::SelectTranlationSets(com_obj<ADORecordset> &rs) const
{
// Create a new recordset.
rs.free();
wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false);
// Open it.
if (FAILED(rs->Open(variant(
L"SELECT DISTINCT [entCode], [Src_En], [Dst_En] "
L"FROM [VRS_Script2] "
L"ORDER BY [entCode], [Src_En], [Dst_En]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
{
_ftprintf(stderr, wxT("%s: error ZCC0060: Error loading translation sets from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::GetTranslationSet(const com_obj<ADORecordset>& rs, ZRCola::DBSource::transet& ts) const
{
wxASSERT_MSG(rs, wxT("recordset is empty"));
com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f)));
wxCHECK(GetValue(f, ts.set), false);
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Src_En"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"rang_znak"), &f)));
wxCHECK(GetValue(f, ts.src), false); wxCHECK(GetValue(f, t.decomp.rank), false);
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Dst_En"), &f)));
wxCHECK(GetValue(f, ts.dst), false);
}
return true;
}
bool ZRCola::DBSource::SelectTranlationSeqs(com_obj<ADORecordset> &rs) const
{
// Create a new recordset.
rs.free();
wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)), false);
// Open it.
if (FAILED(rs->Open(variant(
L"SELECT DISTINCT [ID], [Descr], [Rank] "
L"FROM [VRS_Script2Seq] "
L"ORDER BY [Rank], [Descr]"), variant(m_db), adOpenStatic, adLockReadOnly, adCmdText)))
{
_ftprintf(stderr, wxT("%s: error ZCC0060: Error loading translation sequences from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::GetTranslationSeq(const com_obj<ADORecordset>& rs, ZRCola::DBSource::transeq& ts) const
{
wxASSERT_MSG(rs, wxT("recordset is empty"));
com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"ID"), &f)));
wxCHECK(GetValue(f, ts.seq), false);
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Rank"), &f)));
wxCHECK(GetValue(f, ts.rank), false);
}
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Descr"), &f)));
wxCHECK(GetValue(f, ts.name), false);
}
// Read translation sequence sets from database.
wxVERIFY(SUCCEEDED(m_pTranslationSets1->put_Value(variant(ts.seq))));
com_obj<ADORecordset> rs_chars;
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs_chars)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorLocation(adUseClient)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorType(adOpenForwardOnly)));
wxVERIFY(SUCCEEDED(rs_chars->put_LockType(adLockReadOnly)));
if (FAILED(rs_chars->Open(variant(m_comTranslationSets), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) {
_ftprintf(stderr, wxT("%s: error ZCC0140: Error loading character group characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
{
ts.sets.clear();
com_obj<ADOFields> flds2;
wxVERIFY(SUCCEEDED(rs_chars->get_Fields(&flds2)));
com_obj<ADOField> f_set;
wxVERIFY(SUCCEEDED(flds2->get_Item(variant(L"Script"), &f_set)));
size_t n = 0;
for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext(), n++) {
short set;
wxCHECK(GetValue(f_set, set), false);
ts.sets.push_back(set);
}
} }
return true; return true;
@ -983,24 +665,24 @@ bool ZRCola::DBSource::GetKeySequence(const com_obj<ADORecordset>& rs, ZRCola::D
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Znak"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Znak"), &f)));
wxCHECK(GetUnicodeString(f, ks.chr), false); wxCHECK(GetUnicodeCharacter(f, ks.chr), false);
} }
short modifiers; int modifiers;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Modifiers"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Modifiers"), &f)));
wxCHECK(GetValue(f, modifiers), false); wxCHECK(GetValue(f, modifiers), false);
} }
short keycode1; int keycode1;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"KeyCodePre"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"KeyCodePre"), &f)));
wxCHECK(GetValue(f, keycode1), false); wxCHECK(GetValue(f, keycode1), false);
} }
short keycode; int keycode;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"KeyCode"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"KeyCode"), &f)));
@ -1018,18 +700,18 @@ bool ZRCola::DBSource::GetKeySequence(const com_obj<ADORecordset>& rs, ZRCola::D
if (keycode1) { if (keycode1) {
// First key in the sequence is complete. // First key in the sequence is complete.
keyseq::keycode kc1 = { keyseq::keycode kc1 = {
keyseq::keycode::translate_slen(static_cast<wchar_t>(keycode1)), keyseq::keycode::translate_slen(keycode1),
(modifiers & 0x100) != 0, (modifiers & 0x100) != 0,
(modifiers & 0x200) != 0, (modifiers & 0x200) != 0,
(modifiers & 0x400) != 0 }; (modifiers & 0x400) != 0 };
ks.seq.push_back(kc1); ks.seq.push_back(kc1);
keyseq::keycode kc2 = { keyseq::keycode::translate_slen(static_cast<wchar_t>(keycode)), shift }; keyseq::keycode kc2 = { keyseq::keycode::translate_slen(keycode), shift };
ks.seq.push_back(kc2); ks.seq.push_back(kc2);
} else { } else {
// First key in the sequence is only modifier(s). // First key in the sequence is only modifier(s).
keyseq::keycode kc1 = { keyseq::keycode kc1 = {
keyseq::keycode::translate_slen(static_cast<wchar_t>(keycode)), keyseq::keycode::translate_slen(keycode),
shift || (modifiers & 0x100) != 0, shift || (modifiers & 0x100) != 0,
(modifiers & 0x200) != 0, (modifiers & 0x200) != 0,
(modifiers & 0x400) != 0 }; (modifiers & 0x400) != 0 };
@ -1071,7 +753,7 @@ bool ZRCola::DBSource::GetLanguage(const com_obj<ADORecordset>& rs, ZRCola::DBSo
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"entCode"), &f)));
wxCHECK(GetLanguage(f, lang.lang), false); wxCHECK(GetLanguage(f, lang.id), false);
} }
{ {
@ -1115,7 +797,7 @@ bool ZRCola::DBSource::GetLanguageCharacter(const com_obj<ADORecordset>& rs, ZRC
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
wxCHECK(GetUnicodeString(f, lc.chr), false); wxCHECK(GetUnicodeCharacter(f, lc.chr), false);
} }
{ {
@ -1155,18 +837,18 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
com_obj<ADOFields> flds; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
wstring grp; wstring id;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"id"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"id"), &f)));
wxCHECK(GetValue(f, cg.grp), false); wxCHECK(GetValue(f, cg.id), false);
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Skupina"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Skupina"), &f)));
wxCHECK(GetValue(f, grp), false); wxCHECK(GetValue(f, id), false);
} }
{ {
@ -1182,14 +864,14 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
} }
// Read character list from database. // Read character list from database.
wxVERIFY(SUCCEEDED(m_pCharacterGroup1->put_Value(variant(grp.c_str())))); wxVERIFY(SUCCEEDED(m_pCharacterGroup1->put_Value(variant(id.c_str()))));
com_obj<ADORecordset> rs_chars; com_obj<ADORecordset> rs_chars;
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs_chars))); wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs_chars)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorLocation(adUseClient))); wxVERIFY(SUCCEEDED(rs_chars->put_CursorLocation(adUseClient)));
wxVERIFY(SUCCEEDED(rs_chars->put_CursorType(adOpenForwardOnly))); wxVERIFY(SUCCEEDED(rs_chars->put_CursorType(adOpenForwardOnly)));
wxVERIFY(SUCCEEDED(rs_chars->put_LockType(adLockReadOnly))); wxVERIFY(SUCCEEDED(rs_chars->put_LockType(adLockReadOnly)));
if (FAILED(rs_chars->Open(variant(m_comCharacterGroup), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) { if (FAILED(rs_chars->Open(variant(m_comCharacterGroup), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) {
_ftprintf(stderr, wxT("%s: error ZCC0140: Error loading character group characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str()); _ftprintf(stderr, wxT("%s: error ZCC0100: Error loading character group characters from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors(); LogErrors();
return false; return false;
} }
@ -1197,16 +879,16 @@ bool ZRCola::DBSource::GetCharacterGroup(const com_obj<ADORecordset>& rs, chrgrp
{ {
cg.chars.clear(); cg.chars.clear();
cg.show.clear(); cg.show.clear();
com_obj<ADOFields> flds2; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs_chars->get_Fields(&flds2))); wxVERIFY(SUCCEEDED(rs_chars->get_Fields(&flds)));
com_obj<ADOField> f_char, f_show; com_obj<ADOField> f_char, f_show;
wxVERIFY(SUCCEEDED(flds2->get_Item(variant(L"Znak" ), &f_char))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"Znak" ), &f_char)));
wxVERIFY(SUCCEEDED(flds2->get_Item(variant(L"pogost"), &f_show))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"pogost"), &f_show)));
size_t n = 0; for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext()) {
for (VARIANT_BOOL eof = VARIANT_TRUE; SUCCEEDED(rs_chars->get_EOF(&eof)) && !eof; rs_chars->MoveNext(), n++) { wchar_t c;
wstring c; wxCHECK(GetUnicodeCharacter(f_char, c), false);
wxCHECK(GetUnicodeString(f_char, c), false); size_t n = cg.chars.length();
cg.chars.insert(cg.chars.end(), c.data(), c.data() + c.length() + 1); cg.chars += c;
bool show; bool show;
wxCHECK(GetValue(f_show, show), false); wxCHECK(GetValue(f_show, show), false);
if ((n % 16) == 0) if ((n % 16) == 0)
@ -1250,49 +932,42 @@ bool ZRCola::DBSource::GetCharacter(const com_obj<ADORecordset>& rs, character&
com_obj<ADOFields> flds; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
wstring c; wchar_t c;
chr.second.terms.clear(); chr.rel.clear();
chr.second.terms_rel.clear();
chr.second.rel.clear();
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
wxCHECK(GetUnicodeString(f, chr.first), false); wxCHECK(GetUnicodeCharacter(f, chr.chr), false);
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_v"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_v"), &f)));
wxCHECK(GetUnicodeString(f, c), false); wxCHECK(GetUnicodeCharacter(f, c), false);
if (!c.empty() && c != chr.first) if (c && c != chr.chr)
chr.second.rel.insert(chr.second.rel.end(), c.data(), c.data() + c.length() + 1); chr.rel += c;
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_m"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak_m"), &f)));
wxCHECK(GetUnicodeString(f, c), false); wxCHECK(GetUnicodeCharacter(f, c), false);
if (!c.empty() && c != chr.first) if (c && c != chr.chr)
chr.second.rel.insert(chr.second.rel.end(), c.data(), c.data() + c.length() + 1); chr.rel += c;
} }
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"opis_en"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"opis_en"), &f)));
wxCHECK(GetValue(f, chr.second.desc), false); wxCHECK(GetValue(f, chr.desc), false);
ZRCola::DBSource::character_desc_idx::parse_keywords(chr.second.desc.c_str(), chr.second.terms);
for (auto term = chr.second.terms.cbegin(), term_end = chr.second.terms.cend(); term != term_end; ++term) {
if (m_terms_ignore.find(*term) != m_terms_ignore.cend())
continue;
chr.second.terms_rel.insert(*term);
}
} }
ZRCola::DBSource::character_desc_idx::parse_keywords(chr.desc.c_str(), chr.terms);
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f)));
wxCHECK(GetChrCat(f, chr.second.cat), false); wxCHECK(GetChrCat(f, chr.cat), false);
} }
return true; return true;
@ -1327,11 +1002,12 @@ bool ZRCola::DBSource::GetCharacterCategory(const com_obj<ADORecordset>& rs, chr
com_obj<ADOFields> flds; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
wstring id;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"kat"), &f)));
wxCHECK(GetChrCat(f, cc.cat), false); wxCHECK(GetChrCat(f, cc.id), false);
} }
{ {
@ -1377,11 +1053,12 @@ bool ZRCola::DBSource::GetCharacterTag(const winstd::com_obj<ADORecordset>& rs,
com_obj<ADOFields> flds; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
wstring id;
{ {
com_obj<ADOField> f; com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f))); wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"znak"), &f)));
wxCHECK(GetUnicodeString(f, ct.chr), false); wxCHECK(GetUnicodeCharacter(f, ct.chr), false);
} }
{ {
@ -1421,6 +1098,7 @@ bool ZRCola::DBSource::GetTagName(const winstd::com_obj<ADORecordset>& rs, tagna
com_obj<ADOFields> flds; com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds))); wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
wstring id;
tn.names.clear(); tn.names.clear();
{ {
@ -1458,41 +1136,3 @@ bool ZRCola::DBSource::GetTagName(const winstd::com_obj<ADORecordset>& rs, tagna
return true; return true;
} }
bool ZRCola::DBSource::SelectHighlights(short set, winstd::com_obj<ADORecordset>& rs) const
{
// Create a new recordset.
rs.free();
wxVERIFY(SUCCEEDED(::CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_ALL, IID_IADORecordset, (LPVOID*)&rs)));
wxVERIFY(SUCCEEDED(rs->put_CursorLocation(adUseClient)));
wxVERIFY(SUCCEEDED(rs->put_CursorType(adOpenForwardOnly)));
wxVERIFY(SUCCEEDED(rs->put_LockType(adLockReadOnly)));
// Open it.
wxVERIFY(SUCCEEDED(m_pHighlight1->put_Value(variant(set))));
if (FAILED(rs->Open(variant(m_comHighlight), variant(DISP_E_PARAMNOTFOUND, VT_ERROR)))) {
_ftprintf(stderr, wxT("%s: error ZCC0101: Error loading highlights from database. Please make sure the file is ZRCola.zrc compatible.\n"), m_filename.c_str());
LogErrors();
return false;
}
return true;
}
bool ZRCola::DBSource::GetHighlight(const com_obj<ADORecordset>& rs, ZRCola::DBSource::highlight& h) const
{
wxASSERT_MSG(rs, wxT("recordset is empty"));
com_obj<ADOFields> flds;
wxVERIFY(SUCCEEDED(rs->get_Fields(&flds)));
{
com_obj<ADOField> f;
wxVERIFY(SUCCEEDED(flds->get_Item(variant(L"komb"), &f)));
wxCHECK(GetUnicodeString(f, h.chr), false);
}
return true;
}

View File

@ -1,32 +1,31 @@
/* /*
SPDX-License-Identifier: GPL-3.0-or-later Copyright 2015-2017 Amebis
Copyright © 2015-2022 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/ */
#pragma once #pragma once
#include <zrcola/character.h> #include <zrcola/character.h>
#include <zrcola/highlight.h> #include <zrcola/common.h>
#include <zrcola/language.h>
#include <zrcola/tag.h>
#include <zrcola/translate.h>
#include <zrcolaui/chargroup.h>
#include <zrcolaui/keyboard.h>
#include <WinStd/COM.h> #include <WinStd/COM.h>
#include <WinStd/Win.h> #include <WinStd/Win.h>
#include <wxex/common.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/debug.h>
#pragma warning(pop)
#pragma warning(push)
#pragma warning(disable: 4091)
#include <adoint.h> #include <adoint.h>
#pragma warning(pop)
#include <list> #include <list>
#include <map> #include <map>
#include <memory> #include <memory>
@ -47,64 +46,31 @@ namespace ZRCola {
/// ///
class charseq { class charseq {
public: public:
short rank; ///< Sequence rank int rank; ///< Sequence rank
std::wstring str; ///< Sequence string std::wstring str; ///< Sequence string
inline charseq() : inline charseq()
rank(0)
{ {
} }
inline charseq(_In_ short _rank, _In_z_ const wchar_t *_str) : inline charseq(_In_ int _rank, _In_z_ const wchar_t *_str) :
rank(_rank), rank(_rank),
str (_str) str (_str)
{ {
} }
inline charseq(_In_ short _rank, _In_ const std::wstring &_str) : ///
rank(_rank), /// Functor to compare two sequences by `rank`, and `str` members respectively
str (_str) ///
{ struct less_rank_str {
} inline bool operator()(_In_ const charseq& a, _In_ const charseq& b) const
{
inline charseq(_In_ short _rank, _Inout_ std::wstring &&_str) : if (a.rank < b.rank) return true;
rank(_rank), else if (a.rank > b.rank) return false;
str (std::move(_str)) else if (a.str < b.str ) return true;
{ else return false;
} }
};
inline bool operator==(_In_ const charseq &other) const
{
return rank == other.rank && str == other.str;
}
inline bool operator!=(_In_ const charseq &other) const
{
return !operator==(other);
}
inline bool operator<(_In_ const charseq &other) const
{
if (rank < other.rank) return true;
else if (rank > other.rank) return false;
else if (str < other.str ) return true;
else return false;
}
inline bool operator<=(_In_ const charseq &other) const
{
return !operator>(other);
}
inline bool operator>(_In_ const charseq &other) const
{
return other.operator<(*this);
}
inline bool operator>=(_In_ const charseq &other) const
{
return !operator<(other);
}
}; };
@ -113,51 +79,11 @@ namespace ZRCola {
/// ///
class translation { class translation {
public: public:
short set; ///< Translation set ID wchar_t chr; ///< Composed character
charseq src; ///< Source sequence charseq decomp; ///< Decomposed sequence
std::string norm; ///< Normalization footprint
charseq dst; ///< Destination sequence
inline translation() : set((short)ZRCOLA_TRANSETID_DEFAULT) {}
}; };
///
/// Translation set
///
class transet {
public:
short set; ///< ID
std::wstring src; ///< Source name
std::wstring dst; ///< Destination name
inline transet() : set((short)ZRCOLA_TRANSETID_DEFAULT) {}
};
///
/// Translation sequence
///
class transeq {
public:
short seq; ///< ID
short rank; ///< Rank
std::wstring name; ///< Name
std::vector<short> sets; ///< Sets
inline transeq() :
seq(0),
rank(0)
{}
};
///
/// Normalization permutation set
///
typedef std::set<std::vector<size_t> > normperm;
/// ///
/// Key sequence /// Key sequence
/// ///
@ -188,7 +114,7 @@ namespace ZRCola {
}; };
public: public:
std::wstring chr; ///< Character wchar_t chr; ///< Character
std::vector<keycode> seq; ///< Key sequence std::vector<keycode> seq; ///< Key sequence
}; };
@ -198,10 +124,8 @@ namespace ZRCola {
/// ///
class language { class language {
public: public:
ZRCola::langid_t lang; ///< Language ID ZRCola::langid_t id; ///< Language ID
std::wstring name; ///< Name std::wstring name; ///< Language name
inline language() : lang(ZRCola::langid_t::blank) {}
}; };
@ -210,10 +134,8 @@ namespace ZRCola {
/// ///
class langchar { class langchar {
public: public:
std::wstring chr; ///> Character wchar_t chr; ///> Character
ZRCola::langid_t lang; ///< Language ID ZRCola::langid_t lang; ///< Language ID
inline langchar() : lang(ZRCola::langid_t::blank) {}
}; };
@ -222,67 +144,76 @@ namespace ZRCola {
/// ///
class chrgrp { class chrgrp {
public: public:
short grp; ///< Character group ID int id; ///< Character group ID
short rank; ///< Rank int rank; ///< Character group rank
std::wstring name; ///< Name std::wstring name; ///< Character group name
std::vector<wchar_t> chars; ///< Characters (zero-delimited) std::wstring chars; ///< Character group characters
std::vector<uint16_t> show; ///< Bit vector if particular character from \c chars is displayed initially std::vector<unsigned __int16> show; ///< Bit vector if particular character is displayed initially
inline chrgrp() : grp(0), rank(0) {}
};
///
/// Character data
///
class character_data {
public:
inline character_data()
{
cat.data[0] = 0;
cat.data[1] = 0;
}
inline character_data(_In_ const character_data &othr) :
cat (othr.cat),
desc (othr.desc),
terms (othr.terms),
terms_rel(othr.terms_rel),
rel (othr.rel)
{
}
ZRCola::chrcatid_t cat; ///< Category ID
std::wstring desc; ///< Character description
std::set<std::wstring> terms; ///< Search terms
std::set<std::wstring> terms_rel; ///< Relevant terms for relating characters
std::vector<wchar_t> rel; ///< Related characters (zero-delimited)
}; };
/// ///
/// Character /// Character
/// ///
typedef std::pair<std::wstring, character_data> character; class character {
public:
inline character()
{
chr = 0;
cat.data[0] = 0;
cat.data[1] = 0;
}
inline character(_In_ const character &othr) :
chr (othr.chr),
cat (othr.cat),
desc (othr.desc),
terms(othr.terms),
rel (othr.rel)
{
}
inline bool operator==(_In_ const character &othr) const
{
return
chr == othr.chr &&
cat == othr.cat &&
desc == othr.desc &&
terms == othr.terms &&
rel == othr.rel;
}
inline bool operator!=(_In_ const character &othr) const
{
return !operator==(othr);
}
wchar_t chr; ///< Character
ZRCola::chrcatid_t cat; ///< Category ID
std::wstring desc; ///< Character description
std::set<std::wstring> terms; ///< Search terms
std::wstring rel; ///< Related characters
};
/// ///
/// Character bank /// Character bank
/// ///
class character_bank : public std::map<std::wstring, character_data> class character_bank : public std::vector<std::unique_ptr<character> >
{ {
public: public:
character_bank();
void build_related(); void build_related();
protected: protected:
class build_related_worker : public winstd::thread class build_related_worker : public winstd::win_handle
{ {
public: public:
build_related_worker(_In_ const character_bank *cb, _In_ iterator from, _In_ iterator to); build_related_worker(_In_ const character_bank *cb, _In_ size_type from, _In_ size_type to);
inline void join() inline void join()
{ {
if (m_h != invalid) if (m_h)
WaitForSingleObject(m_h, INFINITE); WaitForSingleObject(m_h, INFINITE);
} }
@ -299,21 +230,31 @@ namespace ZRCola {
protected: protected:
const character_bank *m_cb; const character_bank *m_cb;
iterator m_from, m_to; size_type m_from, m_to;
winstd::heap m_heap; winstd::heap m_heap;
}; };
protected:
std::set<std::wstring> m_ignore;
}; };
/// ///
/// Character description index key comparator /// Character description index key comparator
/// ///
struct character_desc_idx_less struct character_desc_idx_less : public std::binary_function<std::wstring, std::wstring, bool>
{ {
inline bool operator()(const std::wstring& _Left, const std::wstring& _Right) const inline bool operator()(const std::wstring& _Left, const std::wstring& _Right) const
{ {
auto &coll = std::use_facet<std::collate<wchar_t>>(std::locale()); size_t
return coll.compare(&*_Left.cbegin(), &*_Left.cend(), &*_Right.cbegin(), &*_Right.cend()) < 0; _Left_len = _Left .size(),
_Right_len = _Right.size();
int r = _wcsncoll(_Left.c_str(), _Right.c_str(), std::min<size_t>(_Left_len, _Right_len));
if (r != 0 ) return r < 0;
else if (_Left_len < _Right_len) return true;
return false;
} }
}; };
@ -324,33 +265,33 @@ namespace ZRCola {
class character_desc_idx : public std::map<std::wstring, std::vector<wchar_t>, character_desc_idx_less> class character_desc_idx : public std::map<std::wstring, std::vector<wchar_t>, character_desc_idx_less>
{ {
public: public:
static void parse_keywords(_In_ const wchar_t *str, _Inout_ std::set<std::wstring> &terms); static void parse_keywords(const wchar_t *str, std::set<std::wstring> &terms);
void add_keywords(const std::set<std::wstring> &terms, const std::wstring &chr, size_t sub = 0); void add_keywords(const std::set<std::wstring> &terms, wchar_t chr, size_t sub = 0);
inline void add_keywords(const wchar_t *str, const std::wstring &chr, size_t sub = 0) inline void add_keywords(const wchar_t *str, wchar_t chr, size_t sub = 0)
{ {
std::set<std::wstring> terms; std::set<std::wstring> terms;
parse_keywords(str, terms); parse_keywords(str, terms);
add_keywords(terms, chr, sub); add_keywords(terms, chr, sub);
} }
void save(ZRCola::textindex<wchar_t, wchar_t, uint32_t> &idx) const; void save(ZRCola::textindex<wchar_t, wchar_t, unsigned __int32> &idx) const;
protected: protected:
inline void add_keyword(const std::wstring &term, const std::wstring &chr) inline void add_keyword(const std::wstring &term, wchar_t chr)
{ {
iterator idx = find(term); iterator idx = find(term);
if (idx == end()) { if (idx == end()) {
// New keyword. // New keyword.
insert(std::make_pair(term, mapped_type(chr.data(), chr.data() + chr.length() + 1))); insert(std::make_pair(term, std::vector<wchar_t>(1, chr)));
} else { } else {
// Append to existing keyword. // Append to existing keyword.
auto &val = idx->second; std::vector<wchar_t> &val = idx->second;
for (mapped_type::size_type i = 0, n = val.size(); ; i += wcsnlen(val.data() + i, n - i) + 1) { for (auto i = val.cbegin(), i_end = val.cend(); ; ++i) {
if (i >= n) { if (i == i_end) {
// End-of-values reached. Append character. // End-of-values reached. Append character.
val.insert(val.end(), chr.data(), chr.data() + chr.length() + 1); val.push_back(chr);
break; break;
} else if (chr.compare(val.data() + i) == 0) { } else if (*i == chr) {
// Character already among the values. // Character already among the values.
break; break;
} }
@ -365,11 +306,9 @@ namespace ZRCola {
/// ///
class chrcat { class chrcat {
public: public:
ZRCola::chrcatid_t cat; ///> Category ID ZRCola::chrcatid_t id; ///> Category ID
short rank; ///< Rank int rank; ///< Character category rank
std::wstring name; ///< Name std::wstring name; ///< Character category name
inline chrcat() : cat(ZRCola::chrcatid_t::blank), rank(0) {}
}; };
@ -378,10 +317,8 @@ namespace ZRCola {
/// ///
class chrtag { class chrtag {
public: public:
std::wstring chr; ///> Character wchar_t chr; ///> Character
short tag; ///< Tag ID int tag; ///< Tag ID
inline chrtag() : tag(0) {}
}; };
@ -390,22 +327,8 @@ namespace ZRCola {
/// ///
class tagname { class tagname {
public: public:
short tag; ///< Tag ID int tag; ///< Tag ID
std::map<LCID, std::list<std::wstring> > names; ///< Names std::map<LCID, std::list<std::wstring> > names; ///< Names
inline tagname() : tag(0) {}
};
///
/// Highlight
///
class highlight {
public:
short set; ///< Highlight set ID
std::wstring chr; ///< Character sequence
inline highlight() : set((short)ZRCOLA_HLGHTSETID_DEFAULT) {}
}; };
@ -457,6 +380,18 @@ namespace ZRCola {
return SUCCEEDED(rs->get_RecordCount(&count)) ? count : (size_t)-1; return SUCCEEDED(rs->get_RecordCount(&count)) ? count : (size_t)-1;
} }
///
/// Splits string to individual keywords
///
/// \param[in ] str String
/// \param[out] keywords Array of keywords
///
/// \returns
/// - true when successful
/// - false otherwise
///
static bool GetKeywords(const wchar_t *str, std::vector< std::wstring > &keywords);
/// ///
/// Gets boolean from ZRCola.zrc database /// Gets boolean from ZRCola.zrc database
/// ///
@ -479,19 +414,7 @@ namespace ZRCola {
/// - true when successful /// - true when successful
/// - false otherwise /// - false otherwise
/// ///
bool GetValue(const winstd::com_obj<ADOField>& f, short& val) const; bool GetValue(const winstd::com_obj<ADOField>& f, int& val) const;
///
/// Gets string from ZRCola.zrc database
///
/// \param[in] f Data field
/// \param[out] val Output string value
///
/// \returns
/// - true when successful
/// - false otherwise
///
bool GetValue(const winstd::com_obj<ADOField>& f, std::string& val) const;
/// ///
/// Gets string from ZRCola.zrc database /// Gets string from ZRCola.zrc database
@ -529,18 +452,6 @@ namespace ZRCola {
/// ///
bool GetUnicodeString(const winstd::com_obj<ADOField>& f, std::wstring& str) const; bool GetUnicodeString(const winstd::com_obj<ADOField>& f, std::wstring& str) const;
///
/// Gets encoded normalization permutations from ZRCola.zrc database
///
/// \param[in] f Data field
/// \param[out] str Output normalization permutation set
///
/// \returns
/// - true when successful
/// - false otherwise
///
bool GetNormPerm(const winstd::com_obj<ADOField>& f, normperm& np) const;
/// ///
/// Gets language ID from ZRCola.zrc database /// Gets language ID from ZRCola.zrc database
/// ///
@ -577,29 +488,6 @@ namespace ZRCola {
/// ///
bool GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid, std::list<std::wstring>& names) const; bool GetTagNames(const winstd::com_obj<ADOField>& f, LCID lcid, std::list<std::wstring>& names) const;
///
/// Returns normalization permutation sets
///
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectNormPermSets(winstd::com_obj<ADORecordset>& rs) const;
///
/// Returns normalization permutation set
///
/// \param[in] rs Recordset with results
/// \param[out] np Normalization permutation set
///
/// \returns
/// - true when succeeded
/// - false otherwise
///
bool GetNormPerm(const winstd::com_obj<ADORecordset>& rs, std::string& norm, normperm& np) const;
/// ///
/// Returns character translations /// Returns character translations
/// ///
@ -611,18 +499,6 @@ namespace ZRCola {
/// ///
bool SelectTranslations(winstd::com_obj<ADORecordset>& rs) const; bool SelectTranslations(winstd::com_obj<ADORecordset>& rs) const;
///
/// Returns character translations by set
///
/// \param[in ] set Translation set ID
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectTranslations(short set, winstd::com_obj<ADORecordset>& rs) const;
/// ///
/// Returns translation data /// Returns translation data
/// ///
@ -635,52 +511,6 @@ namespace ZRCola {
/// ///
bool GetTranslation(const winstd::com_obj<ADORecordset>& rs, translation& t) const; bool GetTranslation(const winstd::com_obj<ADORecordset>& rs, translation& t) const;
///
/// Returns translation sets
///
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectTranlationSets(winstd::com_obj<ADORecordset>& rs) const;
///
/// Returns translation set data
///
/// \param[in] rs Recordset with results
/// \param[out] lang Language
///
/// \returns
/// - true when succeeded
/// - false otherwise
///
bool GetTranslationSet(const winstd::com_obj<ADORecordset>& rs, transet& ts) const;
///
/// Returns translation sequences
///
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectTranlationSeqs(winstd::com_obj<ADORecordset>& rs) const;
///
/// Returns translation sequence data
///
/// \param[in] rs Recordset with results
/// \param[out] lang Language
///
/// \returns
/// - true when succeeded
/// - false otherwise
///
bool GetTranslationSeq(const winstd::com_obj<ADORecordset>& rs, transeq& ts) const;
/// ///
/// Returns key sequences /// Returns key sequences
/// ///
@ -865,270 +695,12 @@ namespace ZRCola {
/// ///
bool GetTagName(const winstd::com_obj<ADORecordset>& rs, tagname& tn) const; bool GetTagName(const winstd::com_obj<ADORecordset>& rs, tagname& tn) const;
///
/// Returns character highlights by set
///
/// \param[in ] set Highlight set ID
/// \param[out] rs Recordset with results
///
/// \returns
/// - true when query succeeds
/// - false otherwise
///
bool SelectHighlights(short set, winstd::com_obj<ADORecordset>& rs) const;
///
/// Returns highlight data
///
/// \param[in] rs Recordset with results
/// \param[out] h Highlight
///
/// \returns
/// - true when succeeded
/// - false otherwise
///
bool GetHighlight(const winstd::com_obj<ADORecordset>& rs, highlight& h) const;
protected: protected:
std::basic_string<TCHAR> m_filename; ///< Database filename std::basic_string<TCHAR> m_filename; ///< Database filename
winstd::com_obj<ADOConnection> m_db; ///< Database winstd::com_obj<ADOConnection> m_db; ///< Database
_locale_t m_locale; ///< Database locale _locale_t m_locale; ///< Database locale
winstd::com_obj<ADOCommand> m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery winstd::com_obj<ADOCommand> m_comCharacterGroup; ///< ADO Command for GetCharacterGroup subquery
winstd::com_obj<ADOParameter> m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter winstd::com_obj<ADOParameter> m_pCharacterGroup1; ///< \c m_comCharacterGroup parameter
winstd::com_obj<ADOCommand> m_comTranslation; ///< ADO Command for SelectTranslations subquery
winstd::com_obj<ADOParameter> m_pTranslation1; ///< \c m_comTranslations parameter
winstd::com_obj<ADOCommand> m_comTranslationSets; ///< ADO Command for GetTranslationSeq subquery
winstd::com_obj<ADOParameter> m_pTranslationSets1; ///< \c m_comTranslationSets parameter
winstd::com_obj<ADOCommand> m_comHighlight; ///< ADO Command for SelectHighlights subquery
winstd::com_obj<ADOParameter> m_pHighlight1; ///< \c m_comHighlights parameter
std::set<std::wstring> m_terms_ignore; ///< Terms to ignore when comparing characters
}; };
}; };
inline ZRCola::translation_db& operator<<(_Inout_ ZRCola::translation_db &db, _In_ const ZRCola::DBSource::translation &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.set);
db.data.push_back((uint16_t)rec.dst.rank);
db.data.push_back((uint16_t)rec.src.rank);
std::wstring::size_type n = rec.dst.str.length();
wxASSERT_MSG(n <= 0xffff, wxT("destination overflow"));
db.data.push_back((uint16_t)n);
n += rec.src.str.length();
wxASSERT_MSG(n <= 0xffff, wxT("source overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.dst.str.cbegin(), rec.dst.str.cend());
db.data.insert(db.data.end(), rec.src.str.cbegin(), rec.src.str.cend());
db.idxSrc.push_back(idx);
db.idxDst.push_back(idx);
return db;
}
inline ZRCola::transet_db& operator<<(_Inout_ ZRCola::transet_db &db, _In_ const ZRCola::DBSource::transet &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.set);
std::wstring::size_type n = rec.src.length();
wxASSERT_MSG(n <= 0xffff, wxT("translation set source name overflow"));
db.data.push_back((uint16_t)n);
n += rec.dst.length();
wxASSERT_MSG(n <= 0xffff, wxT("translation set destination name overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.src.cbegin(), rec.src.cend());
db.data.insert(db.data.end(), rec.dst.cbegin(), rec.dst.cend());
db.idxTranSet.push_back(idx);
return db;
}
inline ZRCola::transeq_db& operator<<(_Inout_ ZRCola::transeq_db &db, _In_ const ZRCola::DBSource::transeq &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.seq);
db.data.push_back((uint16_t)rec.rank);
std::wstring::size_type n = rec.name.length();
wxASSERT_MSG(n <= 0xffff, wxT("translation sequence name overflow"));
db.data.push_back((uint16_t)n);
n += rec.sets.size();
wxASSERT_MSG(n <= 0xffff, wxT("translation sequence sets overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.name.cbegin(), rec.name.cend());
for (auto s = rec.sets.cbegin(), s_end = rec.sets.cend(); s != s_end; ++s)
db.data.push_back((uint16_t)*s);
db.idxTranSeq.push_back(idx);
db.idxRank .push_back(idx);
return db;
}
inline ZRCola::keyseq_db& operator<<(_Inout_ ZRCola::keyseq_db &db, _In_ const ZRCola::DBSource::keyseq &rec)
{
uint32_t idx = db.data.size();
std::wstring::size_type n = rec.chr.length();
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
db.data.push_back((uint16_t)n);
n += rec.seq.size() * sizeof(ZRCola::keyseq_db::keyseq::key_t) / sizeof(wchar_t);
wxASSERT_MSG(n <= 0xffff, wxT("key sequence overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
for (auto kc = rec.seq.cbegin(), kc_end = rec.seq.cend(); kc != kc_end; ++kc) {
db.data.push_back(kc->key);
db.data.push_back(
(kc->shift ? ZRCola::keyseq_db::keyseq::SHIFT : 0) |
(kc->ctrl ? ZRCola::keyseq_db::keyseq::CTRL : 0) |
(kc->alt ? ZRCola::keyseq_db::keyseq::ALT : 0));
}
db.idxChr.push_back(idx);
db.idxKey.push_back(idx);
return db;
}
inline ZRCola::language_db& operator<<(_Inout_ ZRCola::language_db &db, _In_ const ZRCola::DBSource::language &rec)
{
uint32_t idx = db.data.size();
db.data.insert(db.data.end(), reinterpret_cast<const uint16_t*>(&rec.lang), reinterpret_cast<const uint16_t*>(&rec.lang + 1));
std::wstring::size_type n = rec.name.length();
wxASSERT_MSG(n <= 0xffff, wxT("language name overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.name.cbegin(), rec.name.cend());
db.idxLang.push_back(idx);
return db;
}
inline ZRCola::langchar_db& operator<<(_Inout_ ZRCola::langchar_db &db, _In_ const ZRCola::DBSource::langchar &rec)
{
uint32_t idx = db.data.size();
db.data.insert(db.data.end(), reinterpret_cast<const uint16_t*>(&rec.lang), reinterpret_cast<const uint16_t*>(&rec.lang + 1));
std::wstring::size_type n = rec.chr.length();
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
db.idxChr .push_back(idx);
#ifdef ZRCOLA_LANGCHAR_LANG_IDX
db.idxLang.push_back(idx);
#endif
return db;
}
inline ZRCola::chrgrp_db& operator<<(_Inout_ ZRCola::chrgrp_db &db, _In_ const ZRCola::DBSource::chrgrp &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.grp);
db.data.push_back((uint16_t)rec.rank);
std::wstring::size_type n = rec.name.length();
wxASSERT_MSG(n <= 0xffff, wxT("character group name overflow"));
db.data.push_back((uint16_t)n);
n += rec.chars.size();
wxASSERT_MSG(n <= 0xffff, wxT("character group characters overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.name .cbegin(), rec.name .cend());
db.data.insert(db.data.end(), rec.chars.cbegin(), rec.chars.cend());
db.data.insert(db.data.end(), rec.show .cbegin(), rec.show .cend());
db.idxRank.push_back(idx);
return db;
}
inline ZRCola::character_db& operator<<(_Inout_ ZRCola::character_db &db, _In_ const ZRCola::DBSource::character &rec)
{
uint32_t idx = db.data.size();
db.data.insert(db.data.end(), reinterpret_cast<const uint16_t*>(&rec.second.cat), reinterpret_cast<const uint16_t*>(&rec.second.cat + 1));
std::wstring::size_type n = rec.first.length();
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
db.data.push_back((uint16_t)n);
n += rec.second.desc.length();
wxASSERT_MSG(n <= 0xffff, wxT("character description overflow"));
db.data.push_back((uint16_t)n);
n += rec.second.rel.size();
wxASSERT_MSG(n <= 0xffff, wxT("related characters overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.first .cbegin(), rec.first .cend());
db.data.insert(db.data.end(), rec.second.desc.cbegin(), rec.second.desc.cend());
db.data.insert(db.data.end(), rec.second.rel .cbegin(), rec.second.rel .cend());
db.idxChr.push_back(idx);
return db;
}
inline ZRCola::chrcat_db& operator<<(_Inout_ ZRCola::chrcat_db &db, _In_ const ZRCola::DBSource::chrcat &rec)
{
uint32_t idx = db.data.size();
db.data.insert(db.data.end(), reinterpret_cast<const uint16_t*>(&rec.cat), reinterpret_cast<const uint16_t*>(&rec.cat + 1));
db.data.push_back((uint16_t)rec.rank);
std::wstring::size_type n = rec.name.length();
wxASSERT_MSG(n <= 0xffff, wxT("character category name overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.name.cbegin(), rec.name.cend());
db.idxChrCat.push_back(idx);
db.idxRank .push_back(idx);
return db;
}
inline ZRCola::chrtag_db& operator<<(_Inout_ ZRCola::chrtag_db &db, _In_ const ZRCola::DBSource::chrtag &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.tag);
std::wstring::size_type n = rec.chr.length();
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
db.idxChr.push_back(idx);
db.idxTag.push_back(idx);
return db;
}
inline ZRCola::tagname_db& operator<<(_Inout_ ZRCola::tagname_db &db, _In_ const ZRCola::DBSource::tagname &rec)
{
for (auto ln = rec.names.cbegin(), ln_end = rec.names.cend(); ln != ln_end; ++ln) {
for (auto nm = ln->second.cbegin(), nm_end = ln->second.cend(); nm != nm_end; ++nm) {
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.tag);
db.data.push_back(LOWORD(ln->first));
db.data.push_back(HIWORD(ln->first));
std::wstring::size_type n = nm->length();
wxASSERT_MSG(n <= 0xffff, wxT("tag name overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), nm->cbegin(), nm->cend());
db.idxName.push_back(idx);
db.idxTag .push_back(idx);
}
}
return db;
}
inline ZRCola::highlight_db& operator<<(_Inout_ ZRCola::highlight_db &db, _In_ const ZRCola::DBSource::highlight &rec)
{
uint32_t idx = db.data.size();
db.data.push_back((uint16_t)rec.set);
std::wstring::size_type n = rec.chr.length();
wxASSERT_MSG(n <= 0xffff, wxT("character overflow"));
db.data.push_back((uint16_t)n);
db.data.insert(db.data.end(), rec.chr.cbegin(), rec.chr.cend());
db.idxChr.push_back(idx);
return db;
}

View File

@ -2,7 +2,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ZRColaCompile\n" "Project-Id-Version: ZRColaCompile\n"
"POT-Creation-Date: 2022-02-17 13:30+0100\n" "POT-Creation-Date: 2016-10-13 11:49+0200\n"
"PO-Revision-Date: 2016-04-13 18:11+0200\n" "PO-Revision-Date: 2016-04-13 18:11+0200\n"
"Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n" "Last-Translator: Simon Rozman <simon.rozman@amebis.si>\n"
"Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n" "Language-Team: Amebis, d. o. o., Kamnik <info@amebis.si>\n"
@ -10,25 +10,26 @@ msgstr ""
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.4.2\n" "X-Generator: Poedit 1.8.9\n"
"X-Poedit-Basepath: ..\n" "X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3);\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: _\n" "X-Poedit-KeywordsList: _\n"
"X-Poedit-SearchPath-0: .\n" "X-Poedit-SearchPath-0: .\n"
#: main.cpp:239 #: main.cpp:102
msgid "Show this help message" msgid "Show this help message"
msgstr "" msgstr ""
#: main.cpp:240 #: main.cpp:103
msgid "<Input file>" msgid "<input file>"
msgstr "" msgstr ""
#: main.cpp:241 #: main.cpp:104
msgid "<Output file>" msgid "<output file>"
msgstr "" msgstr ""
#: main.cpp:242 #: main.cpp:105
msgid "Output POT catalog" msgid "<output POT catalog>"
msgstr "" msgstr ""

File diff suppressed because it is too large Load Diff

View File

@ -1,198 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2018-2022 Amebis
*/
#include "pch.h"
using namespace std;
using namespace stdex;
using namespace winstd;
//////////////////////////////////////////////////////////////////////////
// ZRCola::DecompParser
//////////////////////////////////////////////////////////////////////////
ZRCola::DecompParser::DecompParser(_In_ const std::wstring &decomposed) : m_decomposed(decomposed)
{
if (m_decomposed.empty()) {
m_sym = 0;
m_idx = 0;
} else {
m_sym = m_decomposed[0];
m_idx = 1;
}
}
void ZRCola::DecompParser::ParsePrefixes(_Inout_ std::vector<wchar_t> &prefix)
{
for (;;) {
if (
m_sym == 0x203F || // Undertie
0xE0F0 <= m_sym && m_sym <= 0xE0F3 || // 1st Set of Prefix Modifiers
m_sym == 0xE0F6 || // Above
m_sym == 0xE0F7 || // Below
0xE0F8 <= m_sym && m_sym <= 0xE0FC) // 2nd Set of Prefix Modifiers
{
// Prefix modifier
prefix.push_back(m_sym);
NextChar();
} else
break;
}
}
void ZRCola::DecompParser::ParseModifiers(_Inout_ std::vector<wchar_t> &mod)
{
for (;;) {
if (0xE000 <= m_sym && m_sym <= 0xE05B || // 1st Set of Modifiers
0xE063 <= m_sym && m_sym <= 0xE0BE || // 2nd Set of Modifiers
m_sym == 0x0023 || // Number Sign
m_sym == 0x003A || // Colon
m_sym == 0x02DE || // Rhotic Hook
m_sym == 0x2019 || // Right Single Quotation Mark
0x02B0 <= m_sym && m_sym <= 0x02FF || // Standard Unicode Modifiers
m_sym == 0xE0C0 || // Circle
m_sym == 0xE0C2 || // Square
m_sym == 0xE0CA || // Diamond
m_sym == 0xE0CD) // Not Circle
{
mod.push_back(m_sym);
NextChar();
} else
break;
}
}
ZRCola::DecompParser::Expression* ZRCola::DecompParser::ParseParentheses(_In_ wchar_t open, _In_ wchar_t close)
{
if (m_sym == open) {
// Parenthesis Start
NextChar();
if (m_sym == 0xE037) {
// EVA Parenthesis End
unique_ptr<Character> res(new Character(close));
NextChar();
return res.release();
} else {
unique_ptr<Parentheses> res(new Parentheses(open, close, ParseExpression()));
if (m_sym == close) {
// Parenthesis End
NextChar();
} else if (m_sym == open && m_idx < m_decomposed.length() && m_decomposed[m_idx] == 0xE037) {
// Decomposed Parenthesis End
NextChar();
NextChar();
} else
throw invalid_argument(string_printf("%lc is unexpected. Should end with %lc.", m_sym, close));
return res.release();
}
} else
return NULL;
}
ZRCola::DecompParser::Expression* ZRCola::DecompParser::ParseCharacter()
{
Expression *res_p;
if ((res_p = ParseParentheses(0xE0C5, 0xE0C6)) != NULL || // Superscript
(res_p = ParseParentheses(0xE0CE, 0xE0CF)) != NULL || // Subscript
(res_p = ParseParentheses(0xE2E0, 0xE2E1)) != NULL || // EVA Double
(res_p = ParseParentheses(0xE2E2, 0xE2E3)) != NULL || // EVA Condensed
(res_p = ParseParentheses(0xE2E4, 0xE2E5)) != NULL || // EVA Emphasis
(res_p = ParseParentheses(0xE2E6, 0xE2E7)) != NULL || // EVA Strike
(res_p = ParseParentheses(0xE2E8, 0xE2E9)) != NULL || // EVA Undeal
(res_p = ParseParentheses(0xE2EA, 0xE2EB)) != NULL || // EVA Italic
(res_p = ParseParentheses(0xE2EC, 0xE2ED)) != NULL || // EVA Superscript
(res_p = ParseParentheses(0xE2EE, 0xE2EF)) != NULL) // EVA Subscript
{
return res_p;
}
unique_ptr<Character> res(new Character());
ParsePrefixes(res->m_prefix);
if (m_sym < 0xE000 || 0xE0FC < m_sym ||
m_sym == 0xE0D6 || // Clockwise Top Semicircle Arrow
m_sym == 0xE0D7) // Anticlockwise Top Semicircle Arrow
{
// Base Character
res->m_char = m_sym;
NextChar();
}
ParseModifiers(res->m_mod);
return res.release();
}
ZRCola::DecompParser::Expression* ZRCola::DecompParser::ParseTerm()
{
unique_ptr<Ligature> res(new Ligature(ParseCharacter()));
while (m_sym == 0xE0C4) {
// Ligature
std::unique_ptr<Ligature::Element> res2(new Ligature::Element(m_sym));
NextChar();
ParseModifiers(res2->m_mod);
res2->m_el.reset(ParseCharacter());
res->m_rest.push_back(std::move(res2));
}
if (res->m_rest.empty()) {
// A ligature of, well one single character, is rather a character alone.
return res->m_first.release();
} else
return res.release();
}
ZRCola::DecompParser::Expression* ZRCola::DecompParser::ParseExpression()
{
unique_ptr<Expression> res(ParseTerm());
if (0xE05C <= m_sym && m_sym <= 0xE062 ||
m_sym == 0xE0C1 || // Two Characters in Circle
m_sym == 0xE0C3 || // Two Characters in Square
m_sym == 0xE0C7 || // Breved below
m_sym == 0xE0CB || // Inverse tilded
m_sym == 0xE0CC || // Diagonally Barred
0xE0D0 <= m_sym && m_sym <= 0xE0D5)
{
// Joiner of two terms
unique_ptr<Joined2> res_j(new Joined2(m_sym, res.release()));
NextChar();
ParseModifiers(res_j->m_mod);
res_j->m_second.reset(ParseTerm());
return res_j.release();
} else if (
m_sym == 0xE0C8 || // Inverse breved
m_sym == 0xE0C9) // Breved below
{
// Joiner of three terms
unique_ptr<Joined3> res_j(new Joined3(m_sym, res.release()));
NextChar();
ParseModifiers(res_j->m_mod);
res_j->m_second.reset(ParseTerm());
res_j->m_third.reset(ParseTerm());
return res_j.release();
} else
return res.release();
}
ZRCola::DecompParser::Expression* ZRCola::DecompParser::Parse()
{
unique_ptr<Expression> res(ParseExpression());
if (m_sym)
throw invalid_argument("Unexpected trailing character(s).");
return res.release();
}

View File

@ -1,140 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2018-2022 Amebis
*/
#pragma once
#include <sal.h>
#include <list>
#include <memory>
#include <string>
#include <vector>
namespace ZRCola {
///
/// Decomposed sequence parser
///
class DecompParser
{
public:
///
/// Base class for expressions
///
class Expression
{
};
///
/// Expression in "parentheses"
///
class Parentheses : public Expression
{
public:
inline Parentheses(_In_opt_ wchar_t open = 0, _In_opt_ wchar_t close = 0, _In_opt_ Expression *expr = NULL) : m_open(open), m_close(close), m_expr(expr) {}
public:
wchar_t m_open, m_close;
std::unique_ptr<Expression> m_expr;
};
///
/// Operator
///
class Operator : public Expression
{
public:
inline Operator(_In_opt_ wchar_t chr = 0) : m_char(chr) {}
wchar_t m_char;
std::vector<wchar_t> m_mod;
};
///
/// Character
///
class Character : public Operator
{
public:
inline Character(_In_opt_ wchar_t chr = 0) : Operator(chr) {}
std::vector<wchar_t> m_prefix;
};
///
/// Ligature
///
class Ligature : public Expression
{
public:
class Element : public Operator
{
public:
inline Element(_In_opt_ wchar_t chr = 0) : Operator(chr) {}
std::unique_ptr<Expression> m_el;
};
inline Ligature(_In_opt_ Expression *first = NULL) : m_first(first) {}
std::unique_ptr<Expression> m_first;
std::list<std::unique_ptr<Element> > m_rest;
};
///
/// Two joined terms
///
class Joined2 : public Operator
{
public:
Joined2(_In_opt_ wchar_t chr = 0, _In_opt_ Expression *first = NULL) : Operator(chr), m_first(first) {}
std::unique_ptr<Expression> m_first, m_second;
};
///
/// Three joined terms
///
class Joined3 : public Joined2
{
public:
Joined3(_In_opt_ wchar_t chr = 0, _In_opt_ Expression *first = NULL) : Joined2(chr, first) {}
std::unique_ptr<Expression> m_third;
};
public:
DecompParser(_In_ const std::wstring &decomposed);
protected:
inline void NextChar();
void ParsePrefixes(_Inout_ std::vector<wchar_t> &prefix);
void ParseModifiers(_Inout_ std::vector<wchar_t> &mod);
Expression* ParseParentheses(_In_ wchar_t open, _In_ wchar_t close);
Expression* ParseCharacter();
Expression* ParseTerm();
Expression* ParseExpression();
public:
Expression* Parse();
protected:
std::wstring::size_type m_idx; ///< Index of current character
const std::wstring &m_decomposed; ///< Decomposed character sequence to analyse
wchar_t m_sym; ///< Current character
};
}
inline void ZRCola::DecompParser::NextChar()
{
m_sym = m_idx < m_decomposed.length() ? m_decomposed[m_idx++] : 0;
}

View File

@ -1,6 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
*/
#include "pch.h"

View File

@ -1,45 +0,0 @@
/*
SPDX-License-Identifier: GPL-3.0-or-later
Copyright © 2015-2022 Amebis
*/
#pragma once
#include "../include/version.h"
#include "dbsource.h"
#include "parse.h"
#include <wxex/common.h>
#include <wxex/comutils.h>
#pragma warning(push)
#pragma warning(disable: WXWIDGETS_CODE_ANALYSIS_WARNINGS)
#include <wx/app.h>
#include <wx/cmdline.h>
#include <wx/config.h>
#include <wx/intl.h>
#pragma warning(pop)
#include <zrcola/idrec.h>
#include <WinStd/Common.h>
#include <initguid.h> // GUID helper to prevent LNK2001 errors (unresolved external symbol IID_IADO...)
#pragma warning(push)
#pragma warning(disable: 4091)
#include <adoint.h>
#include <adoid.h>
#pragma warning(pop)
#include <process.h>
#include <tchar.h>
#include <stdlib.h>
#include <algorithm>
#include <codecvt>
#include <cwctype>
#include <fstream>
#include <memory>
#include <set>
#include <vector>

20
ZRColaCompile/stdafx.cpp Normal file
View File

@ -0,0 +1,20 @@
/*
Copyright 2015-2017 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"

58
ZRColaCompile/stdafx.h Normal file
View File

@ -0,0 +1,58 @@
/*
Copyright 2015-2017 Amebis
This file is part of ZRCola.
ZRCola is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZRCola is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZRCola. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "../include/version.h"
#include "dbsource.h"
#include <zrcola/language.h>
#include <zrcola/translate.h>
#include <zrcola/tag.h>
#include <zrcolaui/chargroup.h>
#include <zrcolaui/keyboard.h>
#include <wx/app.h>
#include <wx/cmdline.h>
#include <wx/config.h>
#include <wx/intl.h>
#include <wxex/common.h>
#include <wxex/comutils.h>
#include <stdex/idrec.h>
#include <WinStd/Common.h>
#include <initguid.h> // GUID helper to prevent LNK2001 errors (unresolved external symbol IID_IADO...)
#include <adoint.h>
#include <adoid.h>
#include <process.h>
#include <tchar.h>
#include <stdlib.h>
#include <algorithm>
#include <codecvt>
#include <cwctype>
#include <fstream>
#include <memory>
#include <set>
#include <vector>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets">
<Import Project="..\include\$(Platform).props" />
<Import Project="..\include\$(Configuration).props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>..\output\$(Platform).$(Configuration)\</OutDir>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<CompileAsManaged>false</CompileAsManaged>
<BufferSecurityCheck>false</BufferSecurityCheck>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<SmallerTypeCheck>false</SmallerTypeCheck>
</ClCompile>
<Link>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
<ClCompile>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
<ClCompile>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="ZRColaInstall.rc" />
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More