Exemplo n.º 1
0
bool GuiTextEdit::OnKeyEvent(const KeyEvent& ke)
{
  if (!IsVisible())
  {
    return false;
  }

  // Buttons can generate key events, so this GuiTextEdit object may not have the focus (the button
  //  just clicked would have it). So the last GuiTextEdit to have the focus should accept this key.
  if (!HasFocus())
  {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Key event ignored by " << m_name << " as does not have focus.\n";
#endif
    return false;
  }

  // Is this the current or most recent GuiTextEdit to have focus ?
  // TODO 

  if (!ke.keyDown)
  {
    return true;
  }

  switch (ke.keyType)
  {
  case AMJU_KEY_CHAR:
    // Prevent chars like Tab 
    if (ke.key >= ' ') // && ke.key <= (char)127)
    {
      Insert(ke.key);
    }
    else
    {
      // TODO Alert user that character is out of range
    }
    break;

  case AMJU_KEY_UP:
  case AMJU_KEY_DOWN:
    // TODO Multi line text
    break;

  case AMJU_KEY_LEFT:
#ifdef MACOSX
    if (ke.modifier & AMJU_KEY_MOD_ALT) // jump to prev word
#else
    if (ke.modifier & AMJU_KEY_MOD_CTRL)
#endif
    {
      // Prev word
      if (ke.modifier & AMJU_KEY_MOD_SHIFT)
      {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Prev word + select\n";
#endif
        m_caret = PrevWord(m_caret);
        m_triListSelection = 0;
      }
      else
      {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Prev word\n";
#endif
        m_caret = PrevWord(m_caret);
        m_selectedText = m_caret; 
        m_triListSelection = 0;
      }
    }
    else if (ke.modifier & AMJU_KEY_MOD_SHIFT)
    {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Prev char + select\n";
#endif
      // Select char to left
      if (m_caret > 0)
      {
        m_caret--;
        m_triListSelection = 0;
      }
    }
    else 
    {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Prev char\n";
#endif
      if (m_caret > 0)
      {
        // Move caret left
        m_caret--;
        m_selectedText = m_caret; 
        m_triListSelection = 0;
      }
    }
    break;

  case AMJU_KEY_RIGHT:
#ifdef MACOSX
    if (ke.modifier & AMJU_KEY_MOD_ALT) // jump to next word
#else
    if (ke.modifier & AMJU_KEY_MOD_CTRL)
#endif
    {
      // Next word
      if (ke.modifier & AMJU_KEY_MOD_SHIFT)
      {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Next word + select\n";
#endif
        m_caret = NextWord(m_caret);
        m_triListSelection = 0;
      }
      else 
      {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Next word\n";
#endif
        m_caret = NextWord(m_caret);
        m_selectedText = m_caret; 
        m_triListSelection = 0;
      }
    }
    else if (ke.modifier & AMJU_KEY_MOD_SHIFT)
    {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Next char + select\n";
#endif
      if (m_caret < (int)m_text.size())
      {
        m_caret++;
        m_triListSelection = 0;
      } 
    }
    else 
    {
#ifdef TEXT_EDIT_DEBUG
std::cout << "Next char\n";
#endif
      if (m_caret < (int)m_text.size())
      {
        m_caret++;
        m_selectedText = m_caret; 
        m_triListSelection = 0;
      }
    }

    break;

  case AMJU_KEY_ENTER:
    // TODO multi-line
    ExecuteCommand();
    break;

  case AMJU_KEY_SPACE:
    Insert(' ');
    break;

  case AMJU_KEY_ESC:
    // OnCancel();
    break;

  case AMJU_KEY_BACKSPACE:
    {
      int left = std::min(m_caret, m_selectedText);  
      int right = std::max(m_caret, m_selectedText);  
      if (left == right && m_caret > 0)
      {
        left--;
      }

      std::string leftStr = m_text.substr(0, left);
      std::string rightStr = m_text.substr(right);
      m_text = leftStr + rightStr;
      m_caret = left;
      m_selectedText = m_caret; 
      m_triListSelection = 0;
  
      if (m_onChangeFunc)
      {
        m_onChangeFunc(this);
      }
      m_triList = 0; // force rebuild
    }
    break;

  case AMJU_KEY_DELETE:
    //if ()
    {
      int left = std::min(m_caret, m_selectedText);  
      int right = std::max(m_caret, m_selectedText);  
      if (left == right && m_caret < (int)m_text.size())
      {
        right++;
      }

      std::string leftStr = m_text.substr(0, left);
      std::string rightStr = m_text.substr(right);
      m_text = leftStr + rightStr;
      m_caret = left;
      m_selectedText = m_caret; 
      m_triListSelection = 0;

      if (m_onChangeFunc)
      {
        m_onChangeFunc(this);
      }
      m_triList = 0; // force rebuild
    }
    break;

  default:
#ifdef _DEBUG
std::cout << "Unexpected key type: " << ke.keyType << " key: '" << ke.key << "' (int: " << (int)ke.key << ")\n"; 
#endif
//    Assert(0); // handle this key ?
    break;
  }

  if (m_caret >= m_last || m_caret <= m_first)
  {
    RecalcFirstLast();
  }

  return true; // handled
}
Exemplo n.º 2
0
void scSelection::MoveSelect( eSelectMove moveSelect )
{
	int setmax = 1;
	
	switch ( moveSelect ) {		
		case ePrevChar:
		case eNextChar:			
		case ePrevCharInPara:
		case eNextCharInPara:
			SLCCharacterMove( *this, moveSelect );
			break;

		case ePrevWord:
			PrevWord( );		
			break;
		case eNextWord:	
			NextWord( );
			break;

		case ePrevSpellWord:
			PrevSpellWord( );		
			break;
		case eNextSpellWord:	
			NextSpellWord( );
			break;
		
		case eStartWord:
			StartWord( );
			break;
			
		case eEndWord:
			EndWord( );
			break;
		
		case ePrevEntireLine:
			PrevEntireLine();
			break;		
			
		case eNextEntireLine:
			NextEntireLine();
			break;

		case ePrevLine:
			PrevLine();
			setmax = 0;
			break;
			
		case eNextLine:	
			NextLine();
			setmax = 0;
			break;
			
		case eStartLine:
			StartLine();
			break;
			
		case eEndLine:
			EndLine();
			break;
			
		case ePrevPara:
		case eNextPara:		
		case eFirstPara:		
		case eLastPara:		
			Para( moveSelect );
			break;
			
		case eBeginPara:
			BeginPara();
			break;
		case eEndPara:
			EndPara();		
			break;
			
		case ePrevEntireColumn:
			PrevColumn();
			break;
		case eNextEntireColumn:
			NextColumn();
			break;

		case eBeginColumn:
			StartColumn( );
			break;
		case eEndColumn:
			EndColumn();
			break;
			
		case eStartStream:
			fMark.SelectStartStream();
			fPoint.SelectStartStream();
			break;

		case eEndStream:
			fMark.SelectEndStream();
			fPoint.SelectEndStream();
			break;

		default:
			SCDebugBreak();
			break;
	}
	fMark.UpdateInfo( setmax );
	fPoint.UpdateInfo( setmax );	
}
Exemplo n.º 3
0
/* ---------- page/scroll keys ----------- */
static int DoScrolling(WINDOW wnd, int c, PARAM p2)
{
    switch (c)    {
        case PGUP:
        case PGDN:
            if (isMultiLine(wnd))
                BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
            break;
        case CTRL_PGUP:
        case CTRL_PGDN:
            BaseWndProc(EDITBOX, wnd, KEYBOARD, c, p2);
            break;
        case HOME:
            Home(wnd);
            break;
        case END:
            End(wnd);
            break;
        case CTRL_FWD:
            NextWord(wnd);
            break;
        case CTRL_BS:
            PrevWord(wnd);
            break;
        case CTRL_HOME:
            if (isMultiLine(wnd))    {
                SendMessage(wnd, SCROLLDOC, TRUE, 0);
                wnd->CurrLine = 0;
                wnd->WndRow = 0;
            }
            Home(wnd);
            break;
        case CTRL_END:
			if (isMultiLine(wnd) &&
					wnd->WndRow+wnd->wtop+1 < wnd->wlines
						&& wnd->wlines > 0) {
                SendMessage(wnd, SCROLLDOC, FALSE, 0);
                SetLinePointer(wnd, wnd->wlines-1);
                wnd->WndRow =
                    min(ClientHeight(wnd)-1, wnd->wlines-1);
                Home(wnd);
            }
            End(wnd);
            break;
        case UP:
            if (isMultiLine(wnd))
                Upward(wnd);
            break;
        case DN:
            if (isMultiLine(wnd))
                Downward(wnd);
            break;
        case FWD:
            Forward(wnd);
            break;
        case BS:
            Backward(wnd);
            break;
        default:
            return FALSE;
    }
    if (!KeyBoardMarking && TextBlockMarked(wnd))    {
        ClearTextBlock(wnd);
        SendMessage(wnd, PAINT, 0, 0);
    }
    SendMessage(wnd, KEYBOARD_CURSOR, WndCol, wnd->WndRow);
    return TRUE;
}
Exemplo n.º 4
0
void scSelection::Extend( eSelectMove moveSelect )
{
	int setmax = 1;
	
	switch ( moveSelect ) {		
		case ePrevChar:
			fPoint.SelectPrevChar();
			break;
		case eNextChar:
			fPoint.SelectNextChar();
			break;
			
		case ePrevWord:
		{
			TextMarker mark = fMark;
			PrevWord();
			fMark = mark;
			break;
		}
			
		case eNextWord:
		{
			TextMarker mark = fMark;
			NextWord( );
			fMark = mark;
			break;
		}

		case ePrevSpellWord:
			fPoint.SelectPrevSpellWord( );		
			break;
		case eNextSpellWord:	
			fPoint.SelectNextSpellWord( );
			break;
		
		case eStartWord:
			fPoint.SelectStartWord( );
			break;
			
		case eEndWord:
			fPoint.SelectEndWord( );
			break;
		
		case ePrevEntireLine:
			fPoint.SelectPrevLine();
			fPoint.SelectStartLine();
			break;		
			
		case eNextEntireLine:
			fPoint.SelectNextLine();
			fPoint.SelectEndLine();
			break;

		case ePrevLine:
			fPoint.SelectPrevLine();
			setmax = 0;
			break;
			
		case eNextLine:	
			fPoint.SelectNextLine();
			setmax = 0;
			break;
			
		case eStartLine:
			fPoint.SelectStartLine();			
			break;
			
		case eEndLine:
			fPoint.SelectEndLine();
			break;
			
		case eBeginPara:
			fPoint.SelectStartPara();
			break;

		case eEndPara:
			fPoint.SelectEndPara();		
			break;
			
		case eBeginColumn:
			fPoint.SelectStartColumn();
			break;

		case eEndColumn:
			fPoint.SelectEndColumn();
			break;

		case ePrevCharInPara:
			fPoint.SelectPrevCharInPara();
			break;

		case eNextCharInPara:
			fPoint.SelectNextCharInPara();
			break;

		case ePrevPara:
			fPoint.SelectPrevPara();
			break;

		case eNextPara:	
			fPoint.SelectNextPara();
			break;

		case eFirstPara:
			fPoint.SelectStartStream();
			break;

		case eLastPara:	
			fPoint.SelectEndStream();
			break;

		case eStartStream:
			fPoint.SelectStartStream();
			break;

		case eEndStream:
			fPoint.SelectEndStream();
			break;

		case ePrevEntireColumn:
		case eNextEntireColumn:
			
		default:
			SCDebugBreak();
			break;
	}
	fMark.UpdateInfo( setmax );
	fPoint.UpdateInfo( setmax );	
}