void CCandidateWindow::_OnKeyDownRegword(UINT uVKey) { WCHAR ch; BYTE sf; _GetChSf(uVKey, ch, sf); //確定していないとき if(!regwordfixed) { _pTextService->showcandlist = FALSE; //候補一覧表示をループさせる _HandleKey((WPARAM)uVKey, SKK_NULL); _Update(); if(_pInputModeWindow != NULL) { _pInputModeWindow->_Redraw(); } return; } if(_pTextService->_IsKeyVoid(ch, (BYTE)uVKey)) { _pTextService->_UpdateLanguageBar(); if(_pInputModeWindow != NULL) { _pInputModeWindow->_Redraw(); } if(sf == SKK_ENTER) { return; } } switch(sf) { case SKK_ENTER: _RestoreStatusReg(); _ClearStatusReg(); regwordfixed = FALSE; regwordul = FALSE; regword = FALSE; //スペースのみのとき空として扱う if(std::regex_match(regwordtext, std::wregex(L"^\\s+$"))) { regwordtext.clear(); } if(regwordtext.empty()) //空のときはキャンセル扱い { regwordtext.clear(); regwordtextpos = 0; if(!_reg) { _InitList(); _uIndex = _PageIndex[_PageIndex.size() - 1]; _Update(); _UpdateUIElement(); if(_pInputModeWindow != NULL) { _pInputModeWindow->_Show(FALSE); } } else { if(_pCandidateWindowParent == NULL) { if(_pTextService->candidates.empty()) { _InvokeSfHandler(SKK_CANCEL); } else { _InvokeSfHandler(SKK_PREV_CAND); } } else { _PreEndReq(); if(_pTextService->candidates.empty()) { _HandleKey(0, SKK_CANCEL); } else { _HandleKey(0, SKK_PREV_CAND); } _EndReq(); } } } else { std::wstring conv; std::wstring candidate; std::wstring annotation; std::wsmatch result; std::wstring okurikey; //候補と注釈を、行頭以外の最後のセミコロンで分割 if(std::regex_search(regwordtext, result, std::wregex(L".+;"))) { candidate = result.str().substr(0, result.str().size() - 1); annotation = result.suffix(); } else { candidate = regwordtext; annotation.clear(); } if(_pTextService->okuriidx != 0) { okurikey = _pTextService->kana.substr(_pTextService->okuriidx + 1); if(okurikey.size() >= 2 && IS_SURROGATE_PAIR(okurikey.c_str()[0], okurikey.c_str()[1])) { okurikey = okurikey.substr(0, 2); } else { okurikey = okurikey.substr(0, 1); } } //候補変換 _pTextService->_ConvertWord(REQ_CONVERTCND, _pTextService->searchkeyorg, candidate, okurikey, conv); if(_pTextService->searchkey.empty() || conv.empty()) { //変換見出し語が空文字列または //変換済み候補が空文字列であれば未変換見出し語を見出し語とする _pTextService->searchkey = _pTextService->searchkeyorg; } if(conv.empty()) { conv = candidate; } _pTextService->candidates.push_back(CANDIDATE (CANDIDATEBASE(conv, annotation), (CANDIDATEBASE(candidate, annotation)))); _pTextService->candidx = _pTextService->candidates.size() - 1; _pTextService->candorgcnt = 0; regwordtext.clear(); regwordtextpos = 0; if(_pCandidateWindowParent == NULL) { _InvokeSfHandler(SKK_ENTER); } else { _PreEndReq(); _HandleKey(0, SKK_ENTER); _EndReq(); } } break; case SKK_CANCEL: _RestoreStatusReg(); _ClearStatusReg(); regwordfixed = FALSE; regwordul = FALSE; regword = FALSE; regwordtext.clear(); regwordtextpos = 0; if(!_reg) { _InitList(); _uIndex = _PageIndex[_PageIndex.size() - 1]; _Update(); _UpdateUIElement(); if(_pInputModeWindow != NULL) { _pInputModeWindow->_Show(FALSE); } } else { if(_pCandidateWindowParent == NULL) { if(_pTextService->candidates.empty()) { _InvokeSfHandler(SKK_CANCEL); } else { _InvokeSfHandler(SKK_PREV_CAND); } } else { _PreEndReq(); if(_pTextService->candidates.empty()) { _HandleKey(0, SKK_CANCEL); } else { _HandleKey(0, SKK_PREV_CAND); } _EndReq(); } } break; case SKK_BACK: if(comptext.empty() && regwordtextpos > 0 && regwordtext.size() > 0) { // surrogate pair if(regwordtext.size() >= 2 && regwordtextpos >= 2 && IS_SURROGATE_PAIR(regwordtext[regwordtextpos - 2], regwordtext[regwordtextpos - 1])) { regwordtextpos -= 2; regwordtext.erase(regwordtext.begin() + regwordtextpos); regwordtext.erase(regwordtext.begin() + regwordtextpos); } else { --regwordtextpos; regwordtext.erase(regwordtext.begin() + regwordtextpos); } _Update(); } break; case SKK_DELETE: if(comptext.empty() && regwordtextpos < regwordtext.size()) { // surrogate pair if(regwordtext.size() >= regwordtextpos + 2 && IS_SURROGATE_PAIR(regwordtext[regwordtextpos + 0], regwordtext[regwordtextpos + 1])) { regwordtext.erase(regwordtext.begin() + regwordtextpos); regwordtext.erase(regwordtext.begin() + regwordtextpos); } else { regwordtext.erase(regwordtext.begin() + regwordtextpos); } _Update(); } break; case SKK_LEFT: if(comptext.empty() && regwordtextpos > 0 && regwordtext.size() > 0) { // surrogate pair if(regwordtext.size() >= 2 && regwordtextpos >= 2 && IS_SURROGATE_PAIR(regwordtext[regwordtextpos - 2], regwordtext[regwordtextpos - 1])) { regwordtextpos -= 2; } else { --regwordtextpos; } _Update(); } break; case SKK_UP: if(comptext.empty()) { regwordtextpos = 0; _Update(); } break; case SKK_RIGHT: if(comptext.empty() && regwordtextpos < regwordtext.size()) { // surrogate pair if(regwordtext.size() >= regwordtextpos + 2 && IS_SURROGATE_PAIR(regwordtext[regwordtextpos + 0], regwordtext[regwordtextpos + 1])) { regwordtextpos += 2; } else { ++regwordtextpos; } _Update(); } break; case SKK_DOWN: if(comptext.empty()) { regwordtextpos = regwordtext.size(); _Update(); } break; case SKK_PASTE: if(IsClipboardFormatAvailable(CF_UNICODETEXT)) { if(OpenClipboard(NULL)) { HANDLE hCB = GetClipboardData(CF_UNICODETEXT); if(hCB != NULL) { LPWSTR pwCB = (LPWSTR)GlobalLock(hCB); if(pwCB != NULL) { std::wstring scb = std::regex_replace(std::wstring(pwCB), std::wregex(L"[\\x00-\\x19]"), std::wstring(L"")); regwordtext.insert(regwordtextpos, scb); regwordtextpos += scb.size(); _Update(); _UpdateUIElement(); GlobalUnlock(hCB); } } CloseClipboard(); } } break; default: _HandleKey((WPARAM)uVKey, SKK_NULL); if(_pInputModeWindow != NULL) { _pInputModeWindow->_Redraw(); } break; } }
CCandidateWindow::CCandidateWindow(CTextService *pTextService, CCandidateList *pCandidateList) { DllAddRef(); _cRef = 1; _pTextService = pTextService; _pTextService->AddRef(); _pCandidateList = pCandidateList; _pCandidateList->AddRef(); _pCandidateWindow = nullptr; _pCandidateWindowParent = nullptr; _pInputModeWindow = nullptr; _hwnd = nullptr; _hwndParent = nullptr; _preEnd = FALSE; _rect = {0, 0, 0, 0}; _depth = 0; _vertical = FALSE; _dwUIElementId = 0; _bShow = FALSE; _dwFlags = 0; _uShowedCount = 0; _uCount = 0; _uIndex = 0; _uPageCnt = 0; _CandCount.clear(); _PageIndex.clear(); _CandStr.clear(); _uPageCandNum = 0; hFont = nullptr; _pD2DFactory = nullptr; _pD2DDCRT = nullptr; for(int i = 0; i < DISPLAY_COLOR_NUM; i++) { _pD2DBrush[i] = nullptr; } _drawtext_option = D2D1_DRAW_TEXT_OPTIONS_NONE; _pDWFactory = nullptr; _pDWTF = nullptr; _mode = 0; _ulsingle = FALSE; _regmode = FALSE; _regfixed = FALSE; _regtext.clear(); _regtextpos = 0; _regcomp.clear(); candidates.clear(); candidx = 0; candorgcnt = 0; searchkey.clear(); searchkeyorg.clear(); _ClearStatusReg(); }