예제 #1
0
static LPTSTR StripPath(LPTSTR pszFileName)
{
	LPTSTR szPos;

	if((szPos = wcschr(pszFileName, '\\')) != NULL)
		DeleteChars(pszFileName, 0, szPos - pszFileName + 1);
	return pszFileName;
}
예제 #2
0
void CScreenDevice::Write (char chChar)
{
	switch (m_nState)
	{
	case ScreenStateStart:
		switch (chChar)
		{
		case '\b':
			CursorLeft ();
			break;

		case '\t':
			Tabulator ();
			break;

		case '\n':
			NewLine ();
			break;

		case '\r':
			CarriageReturn ();
			break;

		case '\x1b':
			m_nState = ScreenStateEscape;
			break;

		default:
			DisplayChar (chChar);
			break;
		}
		break;

	case ScreenStateEscape:
		switch (chChar)
		{
		case 'M':
			ReverseScroll ();
			m_nState = ScreenStateStart;
			break;

		case '[':
			m_nState = ScreenStateBracket;
			break;

		default:
			m_nState = ScreenStateStart;
			break;
		}
		break;

	case ScreenStateBracket:
		switch (chChar)
		{
		case '?':
			m_nState = ScreenStateQuestionMark;
			break;

		case 'A':
			CursorUp ();
			m_nState = ScreenStateStart;
			break;

		case 'B':
			CursorDown ();
			m_nState = ScreenStateStart;
			break;

		case 'C':
			CursorRight ();
			m_nState = ScreenStateStart;
			break;

		case 'H':
			CursorHome ();
			m_nState = ScreenStateStart;
			break;

		case 'J':
			ClearDisplayEnd ();
			m_nState = ScreenStateStart;
			break;

		case 'K':
			ClearLineEnd ();
			m_nState = ScreenStateStart;
			break;

		case 'L':
			InsertLines (1);
			m_nState = ScreenStateStart;
			break;

		case 'M':
			DeleteLines (1);
			m_nState = ScreenStateStart;
			break;

		case 'P':
			DeleteChars (1);
			m_nState = ScreenStateStart;
			break;

		default:
			if ('0' <= chChar && chChar <= '9')
			{
				m_nParam1 = chChar - '0';
				m_nState = ScreenStateNumber1;
			}
			else
			{
				m_nState = ScreenStateStart;
			}
			break;
		}
		break;

	case ScreenStateNumber1:
		switch (chChar)
		{
		case ';':
			m_nState = ScreenStateSemicolon;
			break;

		case 'L':
			InsertLines (m_nParam1);
			m_nState = ScreenStateStart;
			break;

		case 'M':
			DeleteLines (m_nParam1);
			m_nState = ScreenStateStart;
			break;

		case 'P':
			DeleteChars (m_nParam1);
			m_nState = ScreenStateStart;
			break;

		case 'X':
			EraseChars (m_nParam1);
			m_nState = ScreenStateStart;
			break;

		case 'h':
		case 'l':
			if (m_nParam1 == 4)
			{
				InsertMode (chChar == 'h');
			}
			m_nState = ScreenStateStart;
			break;
			
		case 'm':
			SetStandoutMode (m_nParam1);
			m_nState = ScreenStateStart;
			break;

		default:
			if ('0' <= chChar && chChar <= '9')
			{
				m_nParam1 *= 10;
				m_nParam1 += chChar - '0';

				if (m_nParam1 > 99)
				{
					m_nState = ScreenStateStart;
				}
			}
			else
			{
				m_nState = ScreenStateStart;
			}
			break;
		}
		break;

	case ScreenStateSemicolon:
		if ('0' <= chChar && chChar <= '9')
		{
			m_nParam2 = chChar - '0';
			m_nState = ScreenStateNumber2;
		}
		else
		{
			m_nState = ScreenStateStart;
		}
		break;

	case ScreenStateQuestionMark:
		if ('0' <= chChar && chChar <= '9')
		{
			m_nParam1 = chChar - '0';
			m_nState = ScreenStateNumber3;
		}
		else
		{
			m_nState = ScreenStateStart;
		}
		break;

	case ScreenStateNumber2:
		switch (chChar)
		{
		case 'H':
			CursorMove (m_nParam1, m_nParam2);
			m_nState = ScreenStateStart;
			break;

		case 'r':
			SetScrollRegion (m_nParam1, m_nParam2);
			m_nState = ScreenStateStart;
			break;

		default:
			if ('0' <= chChar && chChar <= '9')
			{
				m_nParam2 *= 10;
				m_nParam2 += chChar - '0';

				if (m_nParam2 > 199)
				{
					m_nState = ScreenStateStart;
				}
			}
			else
			{
				m_nState = ScreenStateStart;
			}
			break;
		}
		break;

	case ScreenStateNumber3:
		switch (chChar)
		{
		case 'h':
		case 'l':
			if (m_nParam1 == 25)
			{
				SetCursorMode (chChar == 'h');
			}
			m_nState = ScreenStateStart;
			break;

		default:
			if ('0' <= chChar && chChar <= '9')
			{
				m_nParam1 *= 10;
				m_nParam1 += chChar - '0';

				if (m_nParam1 > 99)
				{
					m_nState = ScreenStateStart;
				}
			}
			else
			{
				m_nState = ScreenStateStart;
			}
			break;
		}
		break;

	default:
		m_nState = ScreenStateStart;
		break;
	}
}
예제 #3
0
bool CUIEdit::HandleKeypress(SDL_Event *event) {
	bool Handled = false;

	if (event->type == SDL_KEYDOWN) {
		switch (event->key.keysym.sym) {
		case SDLK_ESCAPE:
		case SDLK_TAB:
		case SDLK_RETURN:
			return false;

			// ctrl+A
		case SDLK_a:
			if (CBKeyboardState::IsControlDown()) {
				m_SelStart = 0;
				m_SelEnd = strlen(m_Text);
				Handled = true;
			}
			break;

		case SDLK_BACKSPACE:
			if (m_SelStart == m_SelEnd) {
				if (Game->m_TextRTL) DeleteChars(m_SelStart, m_SelStart + 1);
				else DeleteChars(m_SelStart - 1, m_SelStart);
			} else DeleteChars(m_SelStart, m_SelEnd);
			if (m_SelEnd >= m_SelStart) m_SelEnd -= std::max(1, m_SelEnd - m_SelStart);
			m_SelStart = m_SelEnd;

			Handled = true;
			break;

		case SDLK_LEFT:
		case SDLK_UP:
			m_SelEnd--;
			if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			Handled = true;
			break;

		case SDLK_RIGHT:
		case SDLK_DOWN:
			m_SelEnd++;
			if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			Handled = true;
			break;

		case SDLK_HOME:
			if (Game->m_TextRTL) {
				m_SelEnd = strlen(m_Text);
				if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			} else {
				m_SelEnd = 0;
				if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			}
			Handled = true;
			break;

		case SDLK_END:
			if (Game->m_TextRTL) {
				m_SelEnd = 0;
				if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			} else {
				m_SelEnd = strlen(m_Text);
				if (!CBKeyboardState::IsShiftDown()) m_SelStart = m_SelEnd;
			}
			Handled = true;
			break;

		case SDLK_DELETE:
			if (m_SelStart == m_SelEnd) {
				if (Game->m_TextRTL) {
					DeleteChars(m_SelStart - 1, m_SelStart);
					m_SelEnd--;
					if (m_SelEnd < 0) m_SelEnd = 0;
				} else DeleteChars(m_SelStart, m_SelStart + 1);
			} else DeleteChars(m_SelStart, m_SelEnd);
			if (m_SelEnd > m_SelStart) m_SelEnd -= (m_SelEnd - m_SelStart);

			m_SelStart = m_SelEnd;
			Handled = true;
			break;
		}
		return Handled;
	}

	else if (event->type == SDL_TEXTINPUT) {
		if (m_SelStart != m_SelEnd) DeleteChars(m_SelStart, m_SelEnd);

		WideString wstr = StringUtil::Utf8ToWide(event->text.text);
		m_SelEnd += InsertChars(m_SelEnd, (byte  *)StringUtil::WideToAnsi(wstr).c_str(), 1);

		if (Game->m_TextRTL) m_SelEnd = m_SelStart;
		else m_SelStart = m_SelEnd;

		return true;
	}

	return false;
}