void CUIEditBox::PasteFromClipboard() { DeleteSelectionText(); if(OpenClipboard(NULL)) { HANDLE handle = GetClipboardData(CF_UNICODETEXT); if(handle) { // Convert the ANSI string to Unicode, then // insert to our buffer. WCHAR *pwszText = (WCHAR*)GlobalLock(handle); if(pwszText) { // Copy all characters up to null. if (m_bPassword) { m_wstrPassword.insert(m_nCaret, pwszText); std::wstring wstrPassword(wcslen(pwszText),L'*'); if(m_Buffer.InsertString(m_nCaret, wstrPassword.c_str())) PlaceCaret(m_nCaret + lstrlenW(pwszText)); } else { if(m_Buffer.InsertString(m_nCaret, pwszText)) PlaceCaret(m_nCaret + lstrlenW(pwszText)); } m_nSelStart = m_nCaret; GlobalUnlock(handle); } } CloseClipboard(); } }
void CGUITextBox::AddChar(TCHAR_char){ if(m_Caretx!=m_SelStartx || m_Carety!=m_SelStarty) DeleteSelectionText(); if(_char!='\n'){ m_Text[m_Carety]=m_Text[m_Carety].substr(0, m_Caretx)+_char+m_Text[m_Carety].substr(m_Caretx); m_MaxCaretx++; if(m_pHSB!=NULL && m_MaxCaretx>=((int)(m_width/8))) m_pHSB->SetMaxValue(m_pHSB->GetMaxValue()+1); PlaceCaret(m_Caretx+1, m_Carety); if(m_Caretx-m_Scrollx>=((int)(m_width/8))){ m_Scrollx++; if(m_pHSB!=NULL) m_pHSB->SetValue(m_Scrollx); } }else{ m_MaxCarety++; if(m_pVSB!=NULL && m_MaxCarety>=((int)(m_height/13))) m_pVSB->SetMaxValue(m_pVSB->GetMaxValue()+1); m_Text.push_back(""); for(UINT a=m_MaxCarety;a>m_Carety+1;a--) m_Text[a]=m_Text[a-1]; m_Text[m_Carety+1]=m_Text[m_Carety].substr(m_Caretx); m_Text[m_Carety]=m_Text[m_Carety].substr(0, m_Caretx); PlaceCaret(0, m_Carety+1); if(m_Carety-m_Scrolly>=((int)(m_height/13))){ m_Scrolly++; if(m_pVSB!=NULL) m_pVSB->SetValue(m_Scrolly); } } }
bool CUIEditBox::MsgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { if(!m_bEnabled || !m_bVisible) return false; switch(uMsg) { // Make sure that while editing, the keyup and keydown messages associated with // WM_CHAR messages don't go to any non-focused controls or cameras case WM_KEYUP: case WM_KEYDOWN: return true; case WM_CHAR: { switch((WCHAR)wParam) { // Backspace case VK_BACK: { if (m_bEditEnabled) { // If there's a selection, treat this // like a delete key. if(m_nCaret != m_nSelStart) { DeleteSelectionText(); sendEvent(EVENT_EDITBOX_CHANGE); } else if(m_nCaret > 0) { // Move the caret, then delete the char. PlaceCaret(m_nCaret - 1); m_nSelStart = m_nCaret; if (m_bPassword) { m_wstrPassword.erase(m_nCaret,1); } m_Buffer.RemoveChar(m_nCaret); sendEvent(EVENT_EDITBOX_CHANGE); } ResetCaretBlink(); } break; } case 24: // Ctrl-X Cut case VK_CANCEL: // Ctrl-C Copy { CopyToClipboard(); if (m_bEditEnabled) { // If the key is Ctrl-X, delete the selection too. if((WCHAR)wParam == 24) { DeleteSelectionText(); sendEvent(EVENT_EDITBOX_CHANGE); } } break; } // Ctrl-V Paste case 22: { if (m_bEditEnabled) { PasteFromClipboard(); sendEvent(EVENT_EDITBOX_CHANGE); } break; } // Ctrl-A Select All case 1: if(m_nSelStart == m_nCaret) { m_nSelStart = 0; PlaceCaret(m_Buffer.GetTextSize()); } break; case VK_RETURN: // Invoke the callback when the user presses Enter. sendEvent(EVENT_EDITBOX_STRING); break; // Junk characters we don't want in the string case 26: // Ctrl Z case 2: // Ctrl B case 14: // Ctrl N case 19: // Ctrl S case 4: // Ctrl D case 6: // Ctrl F case 7: // Ctrl G case 10: // Ctrl J case 11: // Ctrl K case 12: // Ctrl L case 17: // Ctrl Q case 23: // Ctrl W case 5: // Ctrl E case 18: // Ctrl R case 20: // Ctrl T case 25: // Ctrl Y case 21: // Ctrl U case 9: // Ctrl I case 15: // Ctrl O case 16: // Ctrl P case 27: // Ctrl [ case 29: // Ctrl ] case 28: // Ctrl \ break; default: if (m_bEditEnabled) { // If there's a selection and the user // starts to type, the selection should // be deleted. if(m_nCaret != m_nSelStart) DeleteSelectionText(); // If we are in overwrite mode and there is already // a char at the caret's position, simply replace it. // Otherwise, we insert the char as normal. if(!m_bInsertMode && m_nCaret < m_Buffer.GetTextSize()) { m_Buffer[m_nCaret] = (WCHAR)wParam; PlaceCaret(m_nCaret + 1); m_nSelStart = m_nCaret; } else { // Insert the char if (m_bPassword) { m_wstrPassword.insert(m_wstrPassword.begin()+m_nCaret,(WCHAR)wParam); if(m_Buffer.InsertChar(m_nCaret, L'*')) { PlaceCaret(m_nCaret + 1); m_nSelStart = m_nCaret; } } else { if(m_Buffer.InsertChar(m_nCaret, (WCHAR)wParam)) { PlaceCaret(m_nCaret + 1); m_nSelStart = m_nCaret; } } } ResetCaretBlink(); sendEvent(EVENT_EDITBOX_CHANGE); } } return true; } } return false; }
bool CUIEditBox::HandleKeyboard(UINT uMsg, WPARAM wParam, LPARAM lParam) { if(!m_bEnabled || !m_bVisible) return false; bool bHandled = false; switch(uMsg) { case WM_KEYDOWN: { switch(wParam) { case VK_TAB: // We don't process Tab in case keyboard input is enabled and the user // wishes to Tab to other controls. break; case VK_HOME: PlaceCaret(0); if(GetKeyState(VK_SHIFT) >= 0) // Shift is not down. Update selection // start along with the caret. m_nSelStart = m_nCaret; ResetCaretBlink(); bHandled = true; break; case VK_END: PlaceCaret(m_Buffer.GetTextSize()); if(GetKeyState(VK_SHIFT) >= 0) // Shift is not down. Update selection // start along with the caret. m_nSelStart = m_nCaret; ResetCaretBlink(); bHandled = true; break; case VK_INSERT: if(GetKeyState(VK_CONTROL) < 0) { // Control Insert. Copy to clipboard CopyToClipboard(); } else if(GetKeyState(VK_SHIFT) < 0) { // Shift Insert. Paste from clipboard PasteFromClipboard(); } else { // Toggle caret insert mode m_bInsertMode = !m_bInsertMode; } break; case VK_DELETE: if (m_bEditEnabled) { // Check if there is a text selection. if(m_nCaret != m_nSelStart) { DeleteSelectionText(); sendEvent(EVENT_EDITBOX_CHANGE); } else { // Deleting one character if (m_bPassword) { m_wstrPassword.erase(m_nCaret,1); } if(m_Buffer.RemoveChar(m_nCaret)) sendEvent(EVENT_EDITBOX_CHANGE); } ResetCaretBlink(); bHandled = true; } break; case VK_LEFT: if(GetKeyState(VK_CONTROL) < 0) { // Control is down. Move the caret to a new item // instead of a character. m_Buffer.GetPriorItemPos(m_nCaret, &m_nCaret); PlaceCaret(m_nCaret); } else if(m_nCaret > 0) PlaceCaret(m_nCaret - 1); if(GetKeyState(VK_SHIFT) >= 0) // Shift is not down. Update selection // start along with the caret. m_nSelStart = m_nCaret; ResetCaretBlink(); bHandled = true; break; case VK_RIGHT: if(GetKeyState(VK_CONTROL) < 0) { // Control is down. Move the caret to a new item // instead of a character. m_Buffer.GetNextItemPos(m_nCaret, &m_nCaret); PlaceCaret(m_nCaret); } else if(m_nCaret < m_Buffer.GetTextSize()) PlaceCaret(m_nCaret + 1); if(GetKeyState(VK_SHIFT) >= 0) // Shift is not down. Update selection // start along with the caret. m_nSelStart = m_nCaret; ResetCaretBlink(); bHandled = true; break; case VK_UP: case VK_DOWN: // Trap up and down arrows so that the dialog // does not switch focus to another control. bHandled = true; break; default: bHandled = wParam != VK_ESCAPE; // Let the application handle Esc. } } } return bHandled; }
bool CGUITextBox::HandleKeyboard( UINT uMsg, WPARAM wParam, LPARAM lParam ) { if(GetFocus() && wParam==m_Hotkey){ OnHotkey(); return true; } if(GetFocus() && m_bSelectable) switch(uMsg){ case WM_KEYDOWN: switch( wParam ){ case VK_UP: PlaceCaret(m_Caretx, m_Carety-1); if( GetKeyState( VK_SHIFT ) >= 0 ) SyncSelStart(); break; case VK_DOWN: PlaceCaret(m_Caretx, m_Carety+1); if( GetKeyState( VK_SHIFT ) >= 0 ) SyncSelStart(); break; case VK_LEFT: if(m_Caretx==0 && m_Carety!=0) PlaceCaret(m_Text[m_Carety-1].length(), m_Carety-1); else PlaceCaret(m_Caretx-1, m_Carety); if( GetKeyState( VK_SHIFT ) >= 0 ) SyncSelStart(); break; case VK_RIGHT: if(m_Caretx==m_MaxCaretx && m_Carety!=m_MaxCarety) PlaceCaret(0, m_Carety+1); else PlaceCaret(m_Caretx+1, m_Carety); if( GetKeyState( VK_SHIFT ) >= 0 ) SyncSelStart(); break; default: break; } break; case WM_CHAR: switch( wParam ){ case VK_BACK: if(m_Caretx==m_SelStartx && m_Carety==m_SelStarty) DeleteTextAtCaret(); else DeleteSelectionText(); break; case VK_RETURN: if(m_bEditable){ if(m_Caretx==m_SelStartx && m_Carety==m_SelStarty) AddChar('\n'); SyncSelStart(); } break; case 24: // Ctrl-X Cut case VK_CANCEL: // Ctrl-C Copy case 22: // Ctrl-V Paste case 26: // Ctrl Z case 2: // Ctrl B case 14: // Ctrl N case 19: // Ctrl S case 4: // Ctrl D case 6: // Ctrl F case 7: // Ctrl G case 10: // Ctrl J case 11: // Ctrl K case 12: // Ctrl L case 17: // Ctrl Q case 23: // Ctrl W case 5: // Ctrl E case 18: // Ctrl R case 20: // Ctrl T case 25: // Ctrl Y case 21: // Ctrl U case 9: // Ctrl I case 15: // Ctrl O case 16: // Ctrl P case 27: // Ctrl [ case 29: // Ctrl ] case 28: // Ctrl \ break; default: if(m_bEditable){ AddChar((char)wParam); SyncSelStart(); } } return true; default: return false; } return false; }