From: Karsten Ballüder Date: Wed, 12 May 1999 14:47:25 +0000 (+0000) Subject: Cursor movements and selections even in non-edit mode. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2184b1a53d88ae61cf196621e788e7ced4bf098e?ds=inline Cursor movements and selections even in non-edit mode. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2429 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/user/wxLayout/wxllist.cpp b/user/wxLayout/wxllist.cpp index ed081e8af0..373a92f5b9 100644 --- a/user/wxLayout/wxllist.cpp +++ b/user/wxLayout/wxllist.cpp @@ -1591,9 +1591,9 @@ wxLayoutList::DrawCursor(wxDC &dc, bool active, wxPoint const &translate) else { dc.DrawLine(coords.x, coords.y+m_CursorSize.y-1, - coords.x+m_CursorSize.x, coords.y+m_CursorSize.y-1); + coords.x, coords.y); SetUpdateRect(coords.x, coords.y+m_CursorSize.y-1); - SetUpdateRect(coords.x+m_CursorSize.x, coords.y+m_CursorSize.y-1); + SetUpdateRect(coords.x, coords.y); } dc.SetLogicalFunction(wxCOPY); //dc.SetBrush(wxNullBrush); diff --git a/user/wxLayout/wxlwindow.cpp b/user/wxLayout/wxlwindow.cpp index f95b20eb45..ec312923ac 100644 --- a/user/wxLayout/wxlwindow.cpp +++ b/user/wxLayout/wxlwindow.cpp @@ -228,135 +228,129 @@ wxLayoutWindow::OnChar(wxKeyEvent& event) ; } } - - if(!IsEditable()) // do nothing - { - switch(keyCode) - { - case WXK_UP: - m_llist->MoveCursorVertically(-1); - break; - case WXK_DOWN: - m_llist->MoveCursorVertically(1); - break; - case WXK_PRIOR: - m_llist->MoveCursorVertically(-20); - break; - case WXK_NEXT: - m_llist->MoveCursorVertically(20); - break; - default: - ; - } - return; - } - - /* First, handle control keys */ - if(event.ControlDown() && ! event.AltDown()) + + /* These two nested switches work like this: + The first one processes all non-editing keycodes, to move the + cursor, etc. It's default will process all keycodes causing + modifications to the buffer, but only if editing is allowed. + */ + switch(keyCode) { - switch(keyCode) + case WXK_RIGHT: + m_llist->MoveCursorHorizontally(1); + break; + case WXK_LEFT: + m_llist->MoveCursorHorizontally(-1); + break; + case WXK_UP: + m_llist->MoveCursorVertically(-1); + break; + case WXK_DOWN: + m_llist->MoveCursorVertically(1); + break; + case WXK_PRIOR: + m_llist->MoveCursorVertically(-20); + break; + case WXK_NEXT: + m_llist->MoveCursorVertically(20); + break; + case WXK_HOME: + m_llist->MoveCursorToBeginOfLine(); + break; + case WXK_END: + m_llist->MoveCursorToEndOfLine(); + break; + case 'c': + if(event.ControlDown()) + Copy(); + break; + default: + if( IsEditable() ) { - case WXK_DELETE : - case 'd': - m_llist->Delete(1); - break; - case 'y': - m_llist->DeleteLines(1); - break; - case 'h': // like backspace - if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1); - break; - case 'u': - m_llist->DeleteToBeginOfLine(); - break; - case 'k': - m_llist->DeleteToEndOfLine(); - break; - case 'v': - Paste(); - break; + /* First, handle control keys */ + if(event.ControlDown() && ! event.AltDown()) + { + switch(keyCode) + { + case WXK_DELETE : + case 'd': + m_llist->Delete(1); + break; + case 'y': + m_llist->DeleteLines(1); + break; + case 'h': // like backspace + if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1); + break; + case 'u': + m_llist->DeleteToBeginOfLine(); + break; + case 'k': + m_llist->DeleteToEndOfLine(); + break; + case 'v': + Paste(); + break; #ifdef WXLAYOUT_DEBUG - case WXK_F1: - m_llist->SetFont(-1,-1,-1,-1,true); // underlined - break; + case WXK_F1: + m_llist->SetFont(-1,-1,-1,-1,true); // underlined + break; #endif - default: - ; - } - } - // ALT only: - else if( event.AltDown() && ! event.ControlDown() ) - { - switch(keyCode) - { - case WXK_DELETE: - case 'd': - m_llist->DeleteWord(); - break; - default: - ; - } - } - // no control keys: - else if ( ! event.AltDown() && ! event.ControlDown()) - { - switch(keyCode) - { - case WXK_RIGHT: - m_llist->MoveCursorHorizontally(1); - break; - case WXK_LEFT: - m_llist->MoveCursorHorizontally(-1); - break; - case WXK_UP: - m_llist->MoveCursorVertically(-1); - break; - case WXK_DOWN: - m_llist->MoveCursorVertically(1); - break; - case WXK_PRIOR: - m_llist->MoveCursorVertically(-20); - break; - case WXK_NEXT: - m_llist->MoveCursorVertically(20); - break; - case WXK_HOME: - m_llist->MoveCursorToBeginOfLine(); - break; - case WXK_END: - m_llist->MoveCursorToEndOfLine(); - break; - case WXK_INSERT: - if(event.ShiftDown()) - Paste(); - break; - case WXK_DELETE : - m_llist->Delete(1); - break; - case WXK_BACK: // backspace - if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1); - break; - case WXK_RETURN: - if(m_WrapMargin > 0) - m_llist->WrapLine(m_WrapMargin); - m_llist->LineBreak(); - break; - default: - if((!(event.ControlDown() || event.AltDown() || event.MetaDown())) - && (keyCode < 256 && keyCode >= 32) - ) + default: + ; + } + } + // ALT only: + else if( event.AltDown() && ! event.ControlDown() ) { - wxString tmp; - tmp += keyCode; - if(m_WrapMargin > 0 && isspace(keyCode)) - m_llist->WrapLine(m_WrapMargin); - m_llist->Insert(tmp); + switch(keyCode) + { + case WXK_DELETE: + case 'd': + m_llist->DeleteWord(); + break; + default: + ; + } } - break; - } - } - SetDirty(); - SetModified(); + // no control keys: + else if ( ! event.AltDown() && ! event.ControlDown()) + { + switch(keyCode) + { + case WXK_INSERT: + if(event.ShiftDown()) + Paste(); + break; + case WXK_DELETE : + m_llist->Delete(1); + break; + case WXK_BACK: // backspace + if(m_llist->MoveCursorHorizontally(-1)) m_llist->Delete(1); + break; + case WXK_RETURN: + if(m_WrapMargin > 0) + m_llist->WrapLine(m_WrapMargin); + m_llist->LineBreak(); + break; + default: + if((!(event.ControlDown() || event.AltDown() || event.MetaDown())) + && (keyCode < 256 && keyCode >= 32) + ) + { + wxString tmp; + tmp += keyCode; + if(m_WrapMargin > 0 && isspace(keyCode)) + m_llist->WrapLine(m_WrapMargin); + m_llist->Insert(tmp); + } + break; + } + } + SetDirty(); + SetModified(); + }// if(IsEditable()) + }// first switch() ScrollToCursor(); wxRect r = *m_llist->GetUpdateRect(); Refresh( FALSE, &r); @@ -513,8 +507,10 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect) // update rectangle (although they are drawn on the memDC, this is // needed to erase it): m_llist->InvalidateUpdateRect(); - if(IsEditable()) //we draw the cursor - m_llist->DrawCursor(*m_memDC,m_HaveFocus,offset); + m_llist->DrawCursor(*m_memDC, + m_HaveFocus && IsEditable(), // draw a thick + // cursor for editable windows with focus + offset); // Now copy everything to the screen: #if 0