274 lines
7.0 KiB
C
274 lines
7.0 KiB
C
|
/** \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);
|
||
|
}
|