void JVIKeyHandler::SetMode ( const Mode mode ) { itsMode = mode; ClearKeyBuffers(); JTextEditor* te = GetTE(); if (mode == kTextEntryMode) { te->SetCaretMode(JTextEditor::kLineCaret); } else { te->SetCaretMode(JTextEditor::kBlockCaret); } }
JBoolean JVIKeyHandler::HandleKeyPress ( const JCharacter key, const JBoolean selectText, const JTextEditor::CaretMotion motion, const JBoolean deleteToTabStop ) { JBoolean result; if (PrehandleKeyPress(key, &result)) { return result; } if (key == kJLeftArrow || key == kJRightArrow || key == kJUpArrow || key == kJDownArrow) { ClearKeyBuffers(); return kJFalse; } JTextEditor* te = GetTE(); JBoolean clearKeyBuffer = kJTrue; JArray<JIndexRange> matchList; JCharacter prevChar; if (key == 'i') { SetMode(kTextEntryMode); } else if (key == 'I') { SetMode(kTextEntryMode); const JBoolean save = te->WillMoveToFrontOfText(); te->ShouldMoveToFrontOfText(kJTrue); te->GoToEndOfLine(); te->GoToBeginningOfLine(); te->ShouldMoveToFrontOfText(save); } else if (key == 'a') { SetMode(kTextEntryMode); const JIndex i = te->GetInsertionIndex(); if (te->IndexValid(i) && (te->GetText()).GetCharacter(i) != '\n') { te->SetCaretLocation(te->GetInsertionIndex()+1); } } else if (key == 'A') { SetMode(kTextEntryMode); te->GoToEndOfLine(); } else if (key == 'O') { SetMode(kTextEntryMode); te->GoToBeginningOfLine(); const JIndex i = te->GetInsertionIndex(); te->SetCaretLocation(i-1); InsertKeyPress('\n'); if (i == 1) { te->SetCaretLocation(1); } } else if (key == 'o') { SetMode(kTextEntryMode); te->GoToEndOfLine(); InsertKeyPress('\n'); } else if ((key == '0' || key == '^') && itsKeyBuffer.IsEmpty()) { te->GoToBeginningOfLine(); } else if (key == '\n') { MoveCaretVert(1); const JBoolean save = te->WillMoveToFrontOfText(); te->ShouldMoveToFrontOfText(kJTrue); te->GoToEndOfLine(); te->GoToBeginningOfLine(); te->ShouldMoveToFrontOfText(save); } else if (key == 'G') { te->SetCaretLocation(te->GetTextLength()+1); } else if (isdigit(key)) // after 0 => beginning of line { if (!numberPattern.Match(itsKeyBuffer)) { ClearKeyBuffers(); } itsKeyBuffer.AppendCharacter(key); clearKeyBuffer = kJFalse; } else if (key == '"') { itsMode = kBufferNameMode; // don't use SetMode() itsKeyBuffer.AppendCharacter(key); clearKeyBuffer = kJFalse; } else if (key == 'X' || key == 'x') { CutBuffer* buf = GetCutBuffer(cutbufPattern); buf->Set("", kJFalse); const JSize count = GetOperationCount(); JString s; for (JIndex i=1; i<=count; i++) { if (key == 'X') { if (te->GetInsertionIndex() == 1) { break; } BackwardDelete(deleteToTabStop, &s); } else { if (te->GetInsertionIndex() >= te->GetTextLength()) { break; } ForwardDelete(deleteToTabStop, &s); } buf->buf->Append(s); } } else if (key == 'C' || key == 'D' || (key == '$' && GetPrevCharacter(&prevChar) && (prevChar == 'd' || prevChar == 'y'))) { const JBoolean del = JNegate(GetPrevCharacter(&prevChar) && prevChar == 'y' && key == '$'); YankToEndOfLine(del, JI2B(key == 'C')); } else if ((key == 'Y' || key == 'y' || key == 'd') && yankDeletePattern.Match(itsKeyBuffer, &matchList)) { if (key == 'Y' || (GetPrevCharacter(&prevChar) && prevChar == key)) { YankLines(matchList, JI2B(key == 'd')); } else { itsKeyBuffer.AppendCharacter(key); clearKeyBuffer = kJFalse; } } else if (key == 'P' || key == 'p') { CutBuffer* buf = GetCutBuffer(cutbufPattern); if (buf->buf != NULL) { const JIndex i = te->GetInsertionIndex(); if (buf->line) { te->GoToBeginningOfLine(); if (key == 'p') { MoveCaretVert(1); } } else if (key == 'p' && (te->IndexValid(i) && (te->GetText()).GetCharacter(i) != '\n')) { te->SetCaretLocation(te->GetInsertionIndex()+1); } const JSize count = GetOperationCount(); for (JIndex i=1; i<=count; i++) { te->Paste(*(buf->buf)); } } } else if (key == 'u') { te->Undo(); } else if (key == '$') // after d$ and y$ { te->GoToEndOfLine(); const JIndex i = te->GetInsertionIndex(); if (i > 1 && te->IndexValid(i) && (te->GetText()).GetCharacter(i) == '\n') { te->SetCaretLocation(i-1); } } if (clearKeyBuffer) { ClearKeyBuffers(); } return kJTrue; }
glWindow::glWindow (bool fullScreen, bool border, int width, int height, int bpp, bool stencil, std::string title, bool allowResizing, bool fitToWorkArea, ResetGLModeType resetGLMode) { m_resetGLMode = resetGLMode; // Null default values // If constructor is aborted, then destructor wont try to deallocate garbage handles. m_HDC = 0; m_HGLRC = 0; m_HWnd = 0; m_HInstance = 0; m_active = false; m_focused = false; m_visible = false; m_closing = false; m_bufStart = 0; m_bufEnd = 0; m_scanBufStart = 0; m_scanBufEnd = 0; m_showingCursor = true; // Clear key buffers ClearKeyBuffers (); // Defaults m_fov = 60; m_nearClip = 1; m_farClip = 1000; m_painting = false; m_dontPaint = false; m_pausePressed = false; m_mouseX = 0; m_mouseY = 0; m_mouseButton [0] = 0; m_mouseButton [1] = 0; m_mouseButton [2] = 0; m_mouseWheel = 0; m_mouseWheelDelta = 0; m_mouseCentred = false; m_HInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window // Create open GL window. // Note: Caller should check error state after construction. If error set, // then the window is probably unusable WNDCLASS wc; // Windows Class Structure wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window. wc.lpfnWndProc = (WNDPROC) ::WndProc; // WndProc Handles Messages wc.cbClsExtra = 0; // No Extra Window Data wc.cbWndExtra = 0; // No Extra Window Data wc.hInstance = m_HInstance; // Set The Instance wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer wc.hbrBackground = NULL; // No Background Required For GL wc.lpszMenuName = NULL; // We Don't Want A Menu wc.lpszClassName = "gbOpenGL"; // Set The Class Name if (!RegisterClass(&wc)) // Attempt To Register The Window Class { SetError ("Window class registration failed"); return; } RecreateWindow (fullScreen, border, width, height, bpp, stencil, title, allowResizing, fitToWorkArea); }