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
This commit is contained in:
@@ -1591,9 +1591,9 @@ wxLayoutList::DrawCursor(wxDC &dc, bool active, wxPoint const &translate)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
dc.DrawLine(coords.x, coords.y+m_CursorSize.y-1,
|
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, 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.SetLogicalFunction(wxCOPY);
|
||||||
//dc.SetBrush(wxNullBrush);
|
//dc.SetBrush(wxNullBrush);
|
||||||
|
@@ -229,134 +229,128 @@ wxLayoutWindow::OnChar(wxKeyEvent& event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!IsEditable()) // do nothing
|
/* 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_UP:
|
/* First, handle control keys */
|
||||||
m_llist->MoveCursorVertically(-1);
|
if(event.ControlDown() && ! event.AltDown())
|
||||||
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())
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
#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)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
wxString tmp;
|
switch(keyCode)
|
||||||
tmp += keyCode;
|
{
|
||||||
if(m_WrapMargin > 0 && isspace(keyCode))
|
case WXK_DELETE :
|
||||||
m_llist->WrapLine(m_WrapMargin);
|
case 'd':
|
||||||
m_llist->Insert(tmp);
|
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;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
// ALT only:
|
||||||
}
|
else if( event.AltDown() && ! event.ControlDown() )
|
||||||
}
|
{
|
||||||
SetDirty();
|
switch(keyCode)
|
||||||
SetModified();
|
{
|
||||||
|
case WXK_DELETE:
|
||||||
|
case 'd':
|
||||||
|
m_llist->DeleteWord();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 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();
|
ScrollToCursor();
|
||||||
wxRect r = *m_llist->GetUpdateRect();
|
wxRect r = *m_llist->GetUpdateRect();
|
||||||
Refresh( FALSE, &r);
|
Refresh( FALSE, &r);
|
||||||
@@ -513,8 +507,10 @@ wxLayoutWindow::InternalPaint(const wxRect *updateRect)
|
|||||||
// update rectangle (although they are drawn on the memDC, this is
|
// update rectangle (although they are drawn on the memDC, this is
|
||||||
// needed to erase it):
|
// needed to erase it):
|
||||||
m_llist->InvalidateUpdateRect();
|
m_llist->InvalidateUpdateRect();
|
||||||
if(IsEditable()) //we draw the cursor
|
m_llist->DrawCursor(*m_memDC,
|
||||||
m_llist->DrawCursor(*m_memDC,m_HaveFocus,offset);
|
m_HaveFocus && IsEditable(), // draw a thick
|
||||||
|
// cursor for editable windows with focus
|
||||||
|
offset);
|
||||||
|
|
||||||
// Now copy everything to the screen:
|
// Now copy everything to the screen:
|
||||||
#if 0
|
#if 0
|
||||||
|
Reference in New Issue
Block a user