ultimatepp/uppsrc/GridCtrl/GridKey.cpp
cxl e9b8d3450a ide: cosmetics, GridCtrl: Selection refactored to follow spreadsheet model
git-svn-id: svn://ultimatepp.org/upp/trunk@15558 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-12-01 13:03:42 +00:00

216 lines
No EOL
3.7 KiB
C++

#include "GridCtrl.h"
namespace Upp {
bool GridCtrl::Key(dword key, int)
{
auto NewAnchor = [&] {
ClearSelection();
anchor = curpos;
};
auto NewSelection = [&] {
ClearSelection();
if(IsValidCursor(anchor) && IsValidCursor(curpos))
SelectRange(Rect(anchor, curpos), true, select_row);
Refresh();
};
if(!IsReadOnly())
switch(key)
{
case K_ENTER:
ClearSelection();
WhenEnter();
#ifdef LOG_CALLBACKS
LGR(2, "WhenEnter()");
#endif
if(enter_like_tab)
return TabKey(true);
else if(!SwitchEdit())
return true;
/*
if(th.IsSorted())
{
th.Multisort();
Refresh();
}*/
NewAnchor();
return true;
case K_ESCAPE:
{
bool quit = true;
if(search_string.GetCount() > 0)
{
ClearFound();
quit = false;
}
else if(HasCtrls())
{
bool canceled = CancelEdit();
quit = !canceled;
}
if(quit)
{
WhenEscape();
return false;
}
else
return true;
}
case K_SHIFT|K_LEFT:
GoLeft();
NewSelection();
return true;
case K_SHIFT|K_RIGHT:
GoRight();
NewSelection();
return true;
case K_SHIFT|K_UP:
GoPrev();
NewSelection();
return true;
case K_SHIFT|K_DOWN:
GoNext();
NewSelection();
return true;
case K_SHIFT|K_PAGEUP:
GoPageUp();
NewSelection();
return true;
case K_SHIFT|K_PAGEDOWN:
GoPageDn();
NewSelection();
return true;
case K_SHIFT_HOME:
GoBegin();
NewSelection();
return true;
case K_SHIFT_END:
GoEnd();
NewSelection();
return true;
case K_UP:
GoPrev();
NewAnchor();
return true;
case K_DOWN:
GoNext();
NewAnchor();
return true;
case K_LEFT:
GoLeft();
NewAnchor();
return true;
case K_RIGHT:
GoRight();
NewAnchor();
return true;
case K_HOME:
case K_CTRL_HOME:
case K_CTRL_PAGEUP:
GoBegin();
NewAnchor();
return true;
case K_END:
case K_CTRL_END:
case K_CTRL_PAGEDOWN:
GoEnd();
NewAnchor();
return true;
case K_PAGEUP:
GoPageUp();
NewAnchor();
return true;
case K_PAGEDOWN:
GoPageDn();
NewAnchor();
return true;
case K_TAB:
return TabKey(false);
case K_SHIFT|K_TAB:
if(HasCtrls())
{
bool isprev = ShowPrevCtrl();
return focused_ctrl ? true : isprev;
}
else if(tab_changes_row)
{
bool isprev = false;
if(select_row)
isprev = GoPrev();
else
isprev = GoLeft();
ClearSelection();
return isprev;
}
else
return false;
case K_CTRL|K_F:
if(searching)
{
find.SetFocus();
return true;
}
else
return false;
case K_BACKSPACE:
{
if(searching)
{
int cnt = search_string.GetCount();
if(cnt > 0)
{
search_string.Remove(cnt - 1);
find <<= search_string;
ShowMatchedRows(search_string);
}
return true;
}
else
return false;
}
case K_F3:
if(rowfnd >= 0)
{
for(int i = rowfnd + 1; i < total_rows; i++)
{
if(vitems[i].IsFound())
{
rowfnd = i;
SetCursor0(i);
CenterCursor();
WhenSearchCursor();
return true;
}
}
for(int i = fixed_rows; i < rowfnd; i++)
{
if(vitems[i].IsFound())
{
rowfnd = i;
SetCursor0(i);
CenterCursor();
WhenSearchCursor();
return true;
}
}
return true;
}
return false;
case K_CTRL_W:
WriteClipboardText(GetColumnWidths());
return true;
default:
if(searching && !isedit && Search(key))
return true;
}
return MenuBar::Scan(WhenMenuBar, key);
}
};