UI: Introduce PUA warning

Private-Use-Area characters are not correctly rendered unless ZRCola
font is used. The PUA characters are now displayed in blue.

This commit also required to upgrade (de)composition text box to use
RichEdit control.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2021-04-02 13:48:19 +02:00
parent e43a5a0ef0
commit 34e409ef2f
12 changed files with 1856 additions and 51 deletions

Binary file not shown.

View File

@ -266,6 +266,19 @@
<property name="shortcut"></property> <property name="shortcut"></property>
<property name="unchecked_bitmap"></property> <property name="unchecked_bitmap"></property>
</object> </object>
<object class="wxMenuItem" expanded="0">
<property name="bitmap"></property>
<property name="checked">0</property>
<property name="enabled">1</property>
<property name="help">Toggle PUA warning</property>
<property name="id">wxID_WARN_PUA_MENU</property>
<property name="kind">wxITEM_CHECK</property>
<property name="label">&amp;PUA Warning</property>
<property name="name">m_menuItemWarnPUA</property>
<property name="permission">protected</property>
<property name="shortcut"></property>
<property name="unchecked_bitmap"></property>
</object>
<object class="separator" expanded="0"> <object class="separator" expanded="0">
<property name="name">separator5</property> <property name="name">separator5</property>
<property name="permission">none</property> <property name="permission">none</property>
@ -670,6 +683,17 @@
<property name="statusbar">Toggle ZRCola character (De)composition</property> <property name="statusbar">Toggle ZRCola character (De)composition</property>
<property name="tooltip">ZRCola (De)composition</property> <property name="tooltip">ZRCola (De)composition</property>
</object> </object>
<object class="tool" expanded="0">
<property name="bitmap">Load From Icon Resource; warn_pua.ico; [24; 24]</property>
<property name="context_menu">0</property>
<property name="id">wxID_WARN_PUA_TOOLBAR</property>
<property name="kind">wxITEM_CHECK</property>
<property name="label">PUA Warning</property>
<property name="name">m_toolWarnPUA</property>
<property name="permission">protected</property>
<property name="statusbar">Toggle PUA warning</property>
<property name="tooltip">Highlight PUA Characters</property>
</object>
</object> </object>
<object class="CustomControl" expanded="0"> <object class="CustomControl" expanded="0">
<property name="BottomDockable">1</property> <property name="BottomDockable">1</property>
@ -1016,7 +1040,7 @@
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style">wxTE_MULTILINE</property> <property name="style">wxTE_MULTILINE|wxTE_RICH</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="toolbar_pane">0</property> <property name="toolbar_pane">0</property>
<property name="tooltip"></property> <property name="tooltip"></property>
@ -1358,7 +1382,7 @@
<property name="resize">Resizable</property> <property name="resize">Resizable</property>
<property name="show">1</property> <property name="show">1</property>
<property name="size"></property> <property name="size"></property>
<property name="style">wxTE_MULTILINE</property> <property name="style">wxTE_MULTILINE|wxTE_RICH</property>
<property name="subclass"></property> <property name="subclass"></property>
<property name="toolbar_pane">0</property> <property name="toolbar_pane">0</property>
<property name="tooltip"></property> <property name="tooltip"></property>

BIN
ZRCola/res/warn_pua.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

1690
ZRCola/res/warn_pua.pdf Normal file

File diff suppressed because one or more lines are too long

View File

@ -140,6 +140,9 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
m_menuItemComposition = new wxMenuItem( m_menuEdit, wxID_COMPOSITION_MENU, wxString( _("&ZRCola (De)composition") ) , _("Toggle ZRCola character (De)composition"), wxITEM_CHECK ); m_menuItemComposition = new wxMenuItem( m_menuEdit, wxID_COMPOSITION_MENU, wxString( _("&ZRCola (De)composition") ) , _("Toggle ZRCola character (De)composition"), wxITEM_CHECK );
m_menuEdit->Append( m_menuItemComposition ); m_menuEdit->Append( m_menuItemComposition );
m_menuItemWarnPUA = new wxMenuItem( m_menuEdit, wxID_WARN_PUA_MENU, wxString( _("&PUA Warning") ) , _("Toggle PUA warning"), wxITEM_CHECK );
m_menuEdit->Append( m_menuItemWarnPUA );
m_menuEdit->AppendSeparator(); m_menuEdit->AppendSeparator();
wxMenuItem* m_menuSettings; wxMenuItem* m_menuSettings;
@ -219,6 +222,8 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
m_toolbarTranslate->AddControl( m_toolTranslationSeq ); m_toolbarTranslate->AddControl( m_toolTranslationSeq );
m_toolComposition = m_toolbarTranslate->AddTool( wxID_COMPOSITION_TOOLBAR, _("ZRCola (De)composition"), wxIcon( wxT("composition.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_CHECK, _("ZRCola (De)composition"), _("Toggle ZRCola character (De)composition"), NULL ); m_toolComposition = m_toolbarTranslate->AddTool( wxID_COMPOSITION_TOOLBAR, _("ZRCola (De)composition"), wxIcon( wxT("composition.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_CHECK, _("ZRCola (De)composition"), _("Toggle ZRCola character (De)composition"), NULL );
m_toolWarnPUA = m_toolbarTranslate->AddTool( wxID_WARN_PUA_TOOLBAR, _("PUA Warning"), wxIcon( wxT("warn_pua.ico"), wxBITMAP_TYPE_ICO_RESOURCE, 24, 24 ), wxNullBitmap, wxITEM_CHECK, _("Highlight PUA Characters"), _("Toggle PUA warning"), NULL );
m_toolbarTranslate->Realize(); m_toolbarTranslate->Realize();
m_mgr.AddPane( m_toolbarTranslate, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() ); m_mgr.AddPane( m_toolbarTranslate, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() );
@ -271,7 +276,7 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
wxStaticBoxSizer* bSizerSourceEdit2; wxStaticBoxSizer* bSizerSourceEdit2;
bSizerSourceEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL ); bSizerSourceEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL );
m_source = new wxTextCtrl( bSizerSourceEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); m_source = new wxTextCtrl( bSizerSourceEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_RICH );
m_source->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) ); m_source->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) );
m_source->SetMinSize( wxSize( 100,25 ) ); m_source->SetMinSize( wxSize( 100,25 ) );
@ -318,7 +323,7 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
wxStaticBoxSizer* bSizerDestinationEdit2; wxStaticBoxSizer* bSizerDestinationEdit2;
bSizerDestinationEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL ); bSizerDestinationEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL );
m_destination = new wxTextCtrl( bSizerDestinationEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); m_destination = new wxTextCtrl( bSizerDestinationEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_RICH );
m_destination->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) ); m_destination->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) );
m_destination->SetMinSize( wxSize( 100,25 ) ); m_destination->SetMinSize( wxSize( 100,25 ) );

View File

@ -68,6 +68,7 @@ class wxZRColaFrameBase : public wxFrame
wxID_COPY_SOURCE_AND_RETURN, wxID_COPY_SOURCE_AND_RETURN,
wxID_SEND_ABORT, wxID_SEND_ABORT,
wxID_COMPOSITION_MENU, wxID_COMPOSITION_MENU,
wxID_WARN_PUA_MENU,
wxID_SETTINGS, wxID_SETTINGS,
wxID_TOOLBAR_EDIT, wxID_TOOLBAR_EDIT,
wxID_TOOLBAR_TRANSLATE, wxID_TOOLBAR_TRANSLATE,
@ -76,7 +77,8 @@ class wxZRColaFrameBase : public wxFrame
wxID_HELP_SHORTCUTS, wxID_HELP_SHORTCUTS,
wxID_HELP_REQCHAR, wxID_HELP_REQCHAR,
wxID_HELP_UPDATE, wxID_HELP_UPDATE,
wxID_COMPOSITION_TOOLBAR wxID_COMPOSITION_TOOLBAR,
wxID_WARN_PUA_TOOLBAR
}; };
wxMenuBar* m_menubar; wxMenuBar* m_menubar;
@ -84,6 +86,7 @@ class wxZRColaFrameBase : public wxFrame
wxMenu* m_menuEdit; wxMenu* m_menuEdit;
wxMenu* m_menuTranslationSeq; wxMenu* m_menuTranslationSeq;
wxMenuItem* m_menuItemComposition; wxMenuItem* m_menuItemComposition;
wxMenuItem* m_menuItemWarnPUA;
wxMenu* m_menuView; wxMenu* m_menuView;
wxMenu* m_menuHelp; wxMenu* m_menuHelp;
wxAuiToolBar* m_toolbarEdit; wxAuiToolBar* m_toolbarEdit;
@ -96,6 +99,7 @@ class wxZRColaFrameBase : public wxFrame
wxAuiToolBarItem* m_toolSendSource; wxAuiToolBarItem* m_toolSendSource;
wxChoice* m_toolTranslationSeq; wxChoice* m_toolTranslationSeq;
wxAuiToolBarItem* m_toolComposition; wxAuiToolBarItem* m_toolComposition;
wxAuiToolBarItem* m_toolWarnPUA;
wxZRColaCharacterCatalogPanel* m_panelChrCat; wxZRColaCharacterCatalogPanel* m_panelChrCat;
wxStatusBar* m_statusBar; wxStatusBar* m_statusBar;

View File

@ -19,6 +19,11 @@
#include "pch.h" #include "pch.h"
static inline bool is_pua(_In_ wchar_t c)
{
return L'\ue000' <= c && c <= L'\uf8ff';
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// wxZRColaComposerPanel // wxZRColaComposerPanel
@ -27,10 +32,18 @@
wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) : wxZRColaComposerPanel::wxZRColaComposerPanel(wxWindow* parent) :
m_sourceChanged(false), m_sourceChanged(false),
m_destinationChanged(false), m_destinationChanged(false),
m_sourceRestyled(false),
m_destinationRestyled(false),
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_selSource(0, 0), m_selSource(0, 0),
m_selDestination(0, 0), m_selDestination(0, 0),
wxZRColaComposerPanelBase(parent) wxZRColaComposerPanelBase(parent)
{ {
// RichEdit control has no inner margins by default.
m_source->SetMargins(FromDIP(wxPoint(5, 2)));
m_destination->SetMargins(FromDIP(wxPoint(5, 2)));
m_source->PushEventHandler(&m_keyhandler); m_source->PushEventHandler(&m_keyhandler);
// Restore the previously saved state (if exists). // Restore the previously saved state (if exists).
@ -88,8 +101,8 @@ void wxZRColaComposerPanel::SynchronizePanels()
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString src; wxString src = m_source->GetValue();
size_t len = GetValue(m_source, src); size_t len = src.Length();
std::wstring dst(src.data(), len), dst2; std::wstring dst(src.data(), len), dst2;
ZRCola::mapping_vector map; ZRCola::mapping_vector map;
@ -132,8 +145,8 @@ void wxZRColaComposerPanel::SynchronizePanels()
auto app = dynamic_cast<ZRColaApp*>(wxTheApp); auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
wxString src; wxString src = m_destination->GetValue();
size_t len = GetValue(m_destination, src); size_t len = src.Length();
std::wstring dst(src.data(), len), dst2; std::wstring dst(src.data(), len), dst2;
ZRCola::mapping_vector map; ZRCola::mapping_vector map;
@ -185,6 +198,9 @@ void wxZRColaComposerPanel::OnSourcePaint(wxPaintEvent& event)
{ {
event.Skip(); event.Skip();
if (m_sourceRestyled)
return;
long from, to; long from, to;
m_source->GetSelection(&from, &to); m_source->GetSelection(&from, &to);
@ -239,8 +255,15 @@ void wxZRColaComposerPanel::OnSourceText(wxCommandEvent& event)
{ {
event.Skip(); event.Skip();
if (m_sourceRestyled)
return;
// Set the flag the source text changed to trigger idle-time translation. // Set the flag the source text changed to trigger idle-time translation.
m_sourceChanged = true; m_sourceChanged = true;
m_sourceRestyled = true;
m_source->SetStyle(0, GetWindowTextLength(m_source->GetHWND()), m_styleNormal);
m_sourceRestyled = false;
} }
@ -248,6 +271,9 @@ void wxZRColaComposerPanel::OnDestinationPaint(wxPaintEvent& event)
{ {
event.Skip(); event.Skip();
if (m_destinationRestyled)
return;
long from, to; long from, to;
m_destination->GetSelection(&from, &to); m_destination->GetSelection(&from, &to);
@ -302,8 +328,26 @@ void wxZRColaComposerPanel::OnDestinationText(wxCommandEvent& event)
{ {
event.Skip(); event.Skip();
if (m_destinationRestyled)
return;
// Set the flag the destination text changed to trigger idle-time inverse translation. // Set the flag the destination text changed to trigger idle-time inverse translation.
m_destinationChanged = true; m_destinationChanged = true;
auto app = dynamic_cast<ZRColaApp*>(wxTheApp);
m_destinationRestyled = true;
if (app->m_mainWnd->m_warnPUA) {
wxString src = m_destination->GetValue();
size_t len = src.Length();
for (size_t i = 0, j; i < len;) {
bool pua_i = is_pua(src[i]);
for (j = i + 1; j < len && pua_i == is_pua(src[j]); j++);
m_destination->SetStyle((long)i, (long)j, pua_i ? m_stylePUA : m_styleNormal);
i = j;
}
} else
m_destination->SetStyle(0, GetWindowTextLength(m_destination->GetHWND()), m_styleNormal);
m_destinationRestyled = false;
} }
@ -312,19 +356,22 @@ 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; {
size_t len;
// Save source text. // Save source text.
len = GetValue(m_source, text); wxString text = m_source->GetValue();
size_t len = text.Length();
file.Write(&len, sizeof(len)); file.Write(&len, sizeof(len));
file.Write((const wchar_t*)text, sizeof(wchar_t)*len); file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
}
{
// Save destination text. // Save destination text.
len = GetValue(m_destination, text); wxString text = m_destination->GetValue();
size_t len = text.Length();
file.Write(&len, sizeof(len)); file.Write(&len, sizeof(len));
file.Write((const wchar_t*)text, sizeof(wchar_t)*len); file.Write((const wchar_t*)text, sizeof(wchar_t)*len);
} }
}
event.Skip(); event.Skip();
} }
@ -348,31 +395,6 @@ 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, (int)(len + 1));
text.assign(buf, len);
} else {
LPWSTR buf = new WCHAR[len + 1];
::GetWindowTextW(hWnd, buf, (int)(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;
@ -381,8 +403,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' || c == '\r') { if (c == L'\n') {
hex += c; hex += L"\r\n";
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]);

View File

@ -66,12 +66,17 @@ protected:
inline void GetTranslationSeq(_Out_ const ZRCola::transetid_t *&sets_begin, _Out_ const ZRCola::transetid_t *&sets_end) 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_sourceChanged; ///< Boolean flag to mark source text "dirty" to trigger translation
bool m_destinationChanged; ///< Boolean flag to mark destination text "dirty" to trigger inverse translation bool m_destinationChanged; ///< Boolean flag to mark destination text "dirty" to trigger inverse translation
volatile bool
m_sourceRestyled, ///< Boolean flag to mark source text is being restyled
m_destinationRestyled; ///< Boolean flag to mark destination text is being restyled
wxTextAttr
m_styleNormal, ///< Normal text style
m_stylePUA; ///< PUA character text style
std::vector<ZRCola::mapping_vector> m_mapping; ///< Character index mapping vector between source and normalized text 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_selSource, ///< Character index of selected text in source text control

View File

@ -44,6 +44,8 @@ wxBEGIN_EVENT_TABLE(wxZRColaFrame, wxZRColaFrameBase)
EVT_MENU (wxID_COMPOSITION_MENU , wxZRColaFrame::OnCompositionMenu ) EVT_MENU (wxID_COMPOSITION_MENU , wxZRColaFrame::OnCompositionMenu )
EVT_MENU (wxID_COMPOSITION_TOOLBAR , wxZRColaFrame::OnCompositionToolbar ) EVT_MENU (wxID_COMPOSITION_TOOLBAR , wxZRColaFrame::OnCompositionToolbar )
EVT_MENU (wxID_WARN_PUA_MENU , wxZRColaFrame::OnWarnPUAMenu )
EVT_MENU (wxID_WARN_PUA_TOOLBAR , wxZRColaFrame::OnWarnPUAToolbar )
EVT_MENU_RANGE (wxID_TRANSLATION_SEQ_DEFAULT, wxID_TRANSLATION_SEQ_END, wxZRColaFrame::OnTranslationSeqMenu ) EVT_MENU_RANGE (wxID_TRANSLATION_SEQ_DEFAULT, wxID_TRANSLATION_SEQ_END, wxZRColaFrame::OnTranslationSeqMenu )
EVT_MENU (wxID_SETTINGS , wxZRColaFrame::OnSettings ) EVT_MENU (wxID_SETTINGS , wxZRColaFrame::OnSettings )
@ -75,6 +77,7 @@ wxZRColaFrame::wxZRColaFrame() :
m_settings(NULL), m_settings(NULL),
m_chrReq(NULL), m_chrReq(NULL),
m_composition(true), m_composition(true),
m_warnPUA(false),
m_transeq_id(ZRCOLA_TRANSEQID_DEFAULT), m_transeq_id(ZRCOLA_TRANSEQID_DEFAULT),
m_transeq(NULL), m_transeq(NULL),
wxZRColaFrameBase(NULL) wxZRColaFrameBase(NULL)
@ -195,6 +198,14 @@ wxZRColaFrame::wxZRColaFrame() :
m_toolComposition->SetState(m_toolComposition->GetState() & ~wxAUI_BUTTON_STATE_CHECKED); m_toolComposition->SetState(m_toolComposition->GetState() & ~wxAUI_BUTTON_STATE_CHECKED);
} }
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. // Update translation sequence selection.
for (unsigned int i = 0, n = m_toolTranslationSeq->GetCount(); ; i++) { for (unsigned int i = 0, n = m_toolTranslationSeq->GetCount(); ; i++) {
if (i < n) { if (i < n) {
@ -370,6 +381,33 @@ void wxZRColaFrame::OnCompositionToolbar(wxCommandEvent& event)
} }
void wxZRColaFrame::OnWarnPUAMenu(wxCommandEvent& event)
{
m_warnPUA = m_menuItemWarnPUA->IsChecked();
m_toolWarnPUA->SetState((m_toolWarnPUA->GetState() & ~wxAUI_BUTTON_STATE_CHECKED) | (m_warnPUA ? wxAUI_BUTTON_STATE_CHECKED : 0));
m_toolbarTranslate->Refresh();
// Notify source text something changed and should re-translate.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
m_panel->m_source->ProcessWindowEvent(event2);
event.Skip();
}
void wxZRColaFrame::OnWarnPUAToolbar(wxCommandEvent& event)
{
m_warnPUA = (m_toolWarnPUA->GetState() & wxAUI_BUTTON_STATE_CHECKED) ? true : false;
m_menuItemWarnPUA->Check(m_warnPUA);
// Notify source text something changed and should re-translate.
wxCommandEvent event2(wxEVT_COMMAND_TEXT_UPDATED);
m_panel->m_source->ProcessWindowEvent(event2);
event.Skip();
}
void wxZRColaFrame::OnSettings(wxCommandEvent& event) void wxZRColaFrame::OnSettings(wxCommandEvent& event)
{ {
m_settings->ShowModal(); m_settings->ShowModal();
@ -746,6 +784,7 @@ void wxPersistentZRColaFrame::Save() const
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("composition"), wnd->m_composition);
SaveValue(wxT("warnPUA"), wnd->m_warnPUA);
SaveValue(wxT("transeqId"), static_cast<int>(wnd->m_transeq_id)); SaveValue(wxT("transeqId"), static_cast<int>(wnd->m_transeq_id));
wxPersistentZRColaComposerPanel(wnd->m_panel).Save(); wxPersistentZRColaComposerPanel(wnd->m_panel).Save();
@ -769,6 +808,10 @@ bool wxPersistentZRColaFrame::Restore()
wnd->m_composition = b; wnd->m_composition = b;
else else
wnd->m_composition = wnd->m_transeq_id == ZRCOLA_TRANSEQID_DEFAULT; wnd->m_composition = wnd->m_transeq_id == ZRCOLA_TRANSEQID_DEFAULT;
if (RestoreValue(wxT("warnPUA"), &b))
wnd->m_warnPUA = b;
else
wnd->m_warnPUA = false;
int guiLevel; int guiLevel;
return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true; return RestoreValue(wxT("guiLevel"), &guiLevel) && guiLevel == s_guiLevel ? wxPersistentTLWEx::Restore() : true;

View File

@ -92,6 +92,8 @@ protected:
void OnSendAbort(wxCommandEvent& event); void OnSendAbort(wxCommandEvent& event);
void OnCompositionMenu(wxCommandEvent& event); void OnCompositionMenu(wxCommandEvent& event);
void OnCompositionToolbar(wxCommandEvent& event); void OnCompositionToolbar(wxCommandEvent& event);
void OnWarnPUAMenu(wxCommandEvent& event);
void OnWarnPUAToolbar(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);
@ -149,6 +151,7 @@ protected:
wxZRColaCharRequest *m_chrReq; ///< Request a New Character dialog wxZRColaCharRequest *m_chrReq; ///< Request a New Character dialog
wxZRColaSettings *m_settings; ///< Configuration dialog wxZRColaSettings *m_settings; ///< Configuration dialog
bool m_composition; ///< Is (de)composition enabled? bool m_composition; ///< Is (de)composition enabled?
bool m_warnPUA; ///< Mark Private-Use-Area characters in destination text
ZRCola::transeqid_t m_transeq_id; ///< Translation sequence ID ZRCola::transeqid_t m_transeq_id; ///< Translation sequence ID
wxZRColaTranslationSeq *m_transeq; ///< Custom translation sequence dialog wxZRColaTranslationSeq *m_transeq; ///< Custom translation sequence dialog
}; };

View File

@ -140,6 +140,9 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
m_menuItemComposition = new wxMenuItem( m_menuEdit, wxID_COMPOSITION_MENU, wxString( _("&ZRCola (De)composition") ) , _("Toggle ZRCola character (De)composition"), wxITEM_CHECK ); m_menuItemComposition = new wxMenuItem( m_menuEdit, wxID_COMPOSITION_MENU, wxString( _("&ZRCola (De)composition") ) , _("Toggle ZRCola character (De)composition"), wxITEM_CHECK );
m_menuEdit->Append( m_menuItemComposition ); m_menuEdit->Append( m_menuItemComposition );
m_menuItemWarnPUA = new wxMenuItem( m_menuEdit, wxID_WARN_PUA_MENU, wxString( _("&PUA Warning") ) , _("Toggle PUA warning"), wxITEM_CHECK );
m_menuEdit->Append( m_menuItemWarnPUA );
m_menuEdit->AppendSeparator(); m_menuEdit->AppendSeparator();
wxMenuItem* m_menuSettings; wxMenuItem* m_menuSettings;
@ -219,6 +222,8 @@ wxZRColaFrameBase::wxZRColaFrameBase( wxWindow* parent, wxWindowID id, const wxS
m_toolbarTranslate->AddControl( m_toolTranslationSeq ); m_toolbarTranslate->AddControl( m_toolTranslationSeq );
m_toolComposition = m_toolbarTranslate->AddTool( wxID_COMPOSITION_TOOLBAR, _("ZRCola (De)composition"), wxIcon( wxT("composition.ico"), wxBITMAP_TYPE_ICO_RESOURCE, FromDIP(24), FromDIP(24) ), wxNullBitmap, wxITEM_CHECK, _("ZRCola (De)composition"), _("Toggle ZRCola character (De)composition"), NULL ); m_toolComposition = m_toolbarTranslate->AddTool( wxID_COMPOSITION_TOOLBAR, _("ZRCola (De)composition"), wxIcon( wxT("composition.ico"), wxBITMAP_TYPE_ICO_RESOURCE, FromDIP(24), FromDIP(24) ), wxNullBitmap, wxITEM_CHECK, _("ZRCola (De)composition"), _("Toggle ZRCola character (De)composition"), NULL );
m_toolWarnPUA = m_toolbarTranslate->AddTool( wxID_WARN_PUA_TOOLBAR, _("PUA Warning"), wxIcon( wxT("warn_pua.ico"), wxBITMAP_TYPE_ICO_RESOURCE, FromDIP(24), FromDIP(24) ), wxNullBitmap, wxITEM_CHECK, _("Highlight PUA Characters"), _("Toggle PUA warning"), NULL );
m_toolbarTranslate->Realize(); m_toolbarTranslate->Realize();
m_mgr.AddPane( m_toolbarTranslate, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() ); m_mgr.AddPane( m_toolbarTranslate, wxAuiPaneInfo().Name( wxT("toolbarCompose") ).Top().Caption( _("Compose") ).PinButton( true ).Dock().Resizable().FloatingSize( wxSize( -1,-1 ) ).LeftDockable( false ).RightDockable( false ).Row( 0 ).Layer( 1 ).ToolbarPane() );
@ -271,7 +276,7 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
wxStaticBoxSizer* bSizerSourceEdit2; wxStaticBoxSizer* bSizerSourceEdit2;
bSizerSourceEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL ); bSizerSourceEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelSourceEdit, wxID_ANY, _("Decomposed Text") ), wxVERTICAL );
m_source = new wxTextCtrl( bSizerSourceEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); m_source = new wxTextCtrl( bSizerSourceEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_RICH );
m_source->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) ); m_source->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) );
m_source->SetMinSize( FromDIP(wxSize( 100,25 )) ); m_source->SetMinSize( FromDIP(wxSize( 100,25 )) );
@ -318,7 +323,7 @@ wxZRColaComposerPanelBase::wxZRColaComposerPanelBase( wxWindow* parent, wxWindow
wxStaticBoxSizer* bSizerDestinationEdit2; wxStaticBoxSizer* bSizerDestinationEdit2;
bSizerDestinationEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL ); bSizerDestinationEdit2 = new wxStaticBoxSizer( new wxStaticBox( m_panelDestinationEdit, wxID_ANY, _("Composed Text") ), wxVERTICAL );
m_destination = new wxTextCtrl( bSizerDestinationEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); m_destination = new wxTextCtrl( bSizerDestinationEdit2->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_RICH );
m_destination->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) ); m_destination->SetFont( wxFont( 20, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("ZRCola") ) );
m_destination->SetMinSize( FromDIP(wxSize( 100,25 )) ); m_destination->SetMinSize( FromDIP(wxSize( 100,25 )) );

View File

@ -68,6 +68,7 @@ class wxZRColaFrameBase : public wxFrame
wxID_COPY_SOURCE_AND_RETURN, wxID_COPY_SOURCE_AND_RETURN,
wxID_SEND_ABORT, wxID_SEND_ABORT,
wxID_COMPOSITION_MENU, wxID_COMPOSITION_MENU,
wxID_WARN_PUA_MENU,
wxID_SETTINGS, wxID_SETTINGS,
wxID_TOOLBAR_EDIT, wxID_TOOLBAR_EDIT,
wxID_TOOLBAR_TRANSLATE, wxID_TOOLBAR_TRANSLATE,
@ -76,7 +77,8 @@ class wxZRColaFrameBase : public wxFrame
wxID_HELP_SHORTCUTS, wxID_HELP_SHORTCUTS,
wxID_HELP_REQCHAR, wxID_HELP_REQCHAR,
wxID_HELP_UPDATE, wxID_HELP_UPDATE,
wxID_COMPOSITION_TOOLBAR wxID_COMPOSITION_TOOLBAR,
wxID_WARN_PUA_TOOLBAR
}; };
wxMenuBar* m_menubar; wxMenuBar* m_menubar;
@ -84,6 +86,7 @@ class wxZRColaFrameBase : public wxFrame
wxMenu* m_menuEdit; wxMenu* m_menuEdit;
wxMenu* m_menuTranslationSeq; wxMenu* m_menuTranslationSeq;
wxMenuItem* m_menuItemComposition; wxMenuItem* m_menuItemComposition;
wxMenuItem* m_menuItemWarnPUA;
wxMenu* m_menuView; wxMenu* m_menuView;
wxMenu* m_menuHelp; wxMenu* m_menuHelp;
wxAuiToolBar* m_toolbarEdit; wxAuiToolBar* m_toolbarEdit;
@ -96,6 +99,7 @@ class wxZRColaFrameBase : public wxFrame
wxAuiToolBarItem* m_toolSendSource; wxAuiToolBarItem* m_toolSendSource;
wxChoice* m_toolTranslationSeq; wxChoice* m_toolTranslationSeq;
wxAuiToolBarItem* m_toolComposition; wxAuiToolBarItem* m_toolComposition;
wxAuiToolBarItem* m_toolWarnPUA;
wxZRColaCharacterCatalogPanel* m_panelChrCat; wxZRColaCharacterCatalogPanel* m_panelChrCat;
wxStatusBar* m_statusBar; wxStatusBar* m_statusBar;