Exemplo n.º 1
0
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();
    }
}
Exemplo n.º 2
0
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);
		}
	}
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}