iup-stack/iup/srccontrols/matrix/iupmat_key.c

274 lines
7.0 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief iupmatrix control
* keyboard control
*
* See Copyright Notice in "iup.h"
*/
/**************************************************************************/
/* Functions to control keys in the matrix and in the text edition */
/**************************************************************************/
#include <stdlib.h>
#include "iup.h"
#include "iupcbs.h"
#include "iupkey.h"
#include <cd.h>
#include "iup_object.h"
#include "iup_attrib.h"
#include "iup_stdcontrols.h"
#include "iupmat_def.h"
#include "iupmat_scroll.h"
#include "iupmat_aux.h"
#include "iupmat_getset.h"
#include "iupmat_key.h"
#include "iupmat_mark.h"
#include "iupmat_edit.h"
#include "iupmat_draw.h"
static void iMatrixKeyCheckMarkStart(Ihandle* ih, int c, int mark_key)
{
if (c==mark_key && ih->data->mark_multiple && ih->data->mark_mode != IMAT_MARK_NO)
{
if (ih->data->mark_lin1==-1 && ih->data->mark_col1==-1)
iupMatrixMarkBlockSet(ih, 0, ih->data->lines.focus_cell, ih->data->columns.focus_cell);
}
}
static void iMatrixKeyCheckMarkEnd(Ihandle* ih, int c, int mark_key)
{
if (ih->data->mark_multiple && ih->data->mark_mode != IMAT_MARK_NO)
{
if (c==mark_key)
{
if (ih->data->mark_lin1!=-1 && ih->data->mark_col1!=-1)
iupMatrixMarkBlockInc(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell);
}
else
iupMatrixMarkBlockReset(ih);
}
}
int iupMatrixProcessKeyPress(Ihandle* ih, int c)
{
switch (iup_XkeyBase(c))
{
case K_LSHIFT:
case K_RSHIFT:
case K_LCTRL:
case K_RCTRL:
/* won't scroll for shift+ctrl keys */
return IUP_DEFAULT;
}
/* If the focus is not visible, a scroll is done for that the focus to be visible */
if (!iupMatrixAuxIsCellStartVisible(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell))
iupMatrixScrollToVisible(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell);
switch (c)
{
case K_cHOME:
case K_sHOME:
case K_HOME:
iMatrixKeyCheckMarkStart(ih, c, K_sHOME);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyHome(ih);
ih->data->homekeycount++;
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sHOME);
break;
case K_cEND:
case K_sEND:
case K_END:
iMatrixKeyCheckMarkStart(ih, c, K_sEND);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyEnd(ih);
ih->data->endkeycount++;
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sEND);
break;
case K_sTAB:
case K_TAB:
return IUP_CONTINUE; /* do not redraw, but forwards tab processing */
case K_sLEFT:
case K_cLEFT:
case K_LEFT:
iMatrixKeyCheckMarkStart(ih, c, K_sLEFT);
if (iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyLeft(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sLEFT);
break;
case K_cRIGHT:
case K_sRIGHT:
case K_RIGHT:
iMatrixKeyCheckMarkStart(ih, c, K_sRIGHT);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyRight(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sRIGHT);
break;
case K_cUP:
case K_sUP:
case K_UP:
iMatrixKeyCheckMarkStart(ih, c, K_sUP);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyUp(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sUP);
break;
case K_cDOWN:
case K_sDOWN:
case K_DOWN:
iMatrixKeyCheckMarkStart(ih, c, K_sDOWN);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyDown(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sDOWN);
break;
case K_sPGUP:
case K_PGUP:
iMatrixKeyCheckMarkStart(ih, c, K_sPGUP);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyPgUp(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sPGUP);
break;
case K_sPGDN:
case K_PGDN:
iMatrixKeyCheckMarkStart(ih, c, K_sPGDN);
if(iupMatrixAuxCallLeaveCellCb(ih) == IUP_IGNORE)
break;
iupMATRIX_ScrollKeyPgDown(ih);
iupMatrixAuxCallEnterCellCb(ih);
iMatrixKeyCheckMarkEnd(ih, c, K_sPGDN);
break;
case K_F2:
case K_SP:
case K_sCR:
if (iupMatrixEditShow(ih))
return IUP_IGNORE; /* do not redraw */
break;
case K_CR:
if (!ih->data->edit_hide_onfocus && ih->data->editing)
(void)iupMatrixEditConfirm(ih); /* ignore return value */
else
{
if (iupMatrixEditShow(ih))
return IUP_IGNORE; /* do not redraw */
else
return IUP_DEFAULT; /* allow the dialog to process defaultenter */
}
break;
case K_ESC:
if (!ih->data->edit_hide_onfocus && ih->data->editing)
iupMatrixEditAbort(ih);
else
return IUP_DEFAULT; /* allow the dialog to process defaultesc */
break;
case K_sDEL:
case K_DEL:
IupSetAttribute(ih, "CLEARVALUE", "MARKED");
break;
default:
{
/* if a valid character is pressed enter edition mode */
if (iup_isprint(c))
{
if (iupMatrixEditShow(ih))
{
if (ih->data->datah == ih->data->texth)
{
char value[2] = { 0, 0 };
value[0] = (char)c;
IupStoreAttribute(ih->data->datah, "VALUEMASKED", value);
IupSetAttribute(ih->data->datah, "CARET", "2");
}
return IUP_IGNORE; /* do not redraw */
}
}
iupMatrixDrawUpdate(ih);
return IUP_DEFAULT;
}
}
iupMatrixDrawUpdate(ih);
return IUP_IGNORE; /* ignore processed keys */
}
void iupMatrixKeyResetHomeEndCount(Ihandle* ih)
{
ih->data->homekeycount = 0;
ih->data->endkeycount = 0;
}
int iupMatrixKeyPress_CB(Ihandle* ih, int c, int press)
{
int oldc = c;
IFniiiis cb;
if (!iupMatrixIsValid(ih, 1))
return IUP_DEFAULT;
/* there are no cells that can get the focus */
if (ih->data->columns.num <= 1 || ih->data->lines.num <= 1)
return IUP_DEFAULT;
if (!press)
return IUP_DEFAULT;
cb = (IFniiiis)IupGetCallback(ih, "ACTION_CB");
if (cb)
{
if (iup_isprint(c))
{
char value[2]={0,0};
value[0] = (char)c;
c = cb(ih, c, ih->data->lines.focus_cell, ih->data->columns.focus_cell, 0, value);
}
else
{
char* value = iupMatrixGetValue(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell);
c = cb(ih, c, ih->data->lines.focus_cell, ih->data->columns.focus_cell, 0, value);
}
if (c == IUP_IGNORE || c == IUP_CLOSE || c == IUP_CONTINUE)
return c;
else if (c == IUP_DEFAULT)
c = oldc;
}
if (c != K_HOME && c != K_sHOME)
ih->data->homekeycount = 0;
if (c != K_END && c != K_sEND)
ih->data->endkeycount = 0;
return iupMatrixProcessKeyPress(ih, c);
}