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

2355 lines
74 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief IupMatrix control core
*
* See Copyright Notice in "iup.h"
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
#include <string.h>
#include "iup.h"
#include "iupcbs.h"
#include "iupcontrols.h"
#include <cd.h>
#ifdef USE_OLD_CDIUP
#include <cdiup.h>
#else
#include <iupdraw_cd.h>
#endif
#include "iup_cdutil.h"
#include "iup_object.h"
#include "iup_attrib.h"
#include "iup_str.h"
#include "iup_drv.h"
#include "iup_drvfont.h"
#include "iup_stdcontrols.h"
#include "iup_controls.h"
#include "iup_register.h"
#include "iup_assert.h"
#include "iup_flatscrollbar.h"
#include "iupmat_def.h"
#include "iupmat_getset.h"
#include "iupmat_scroll.h"
#include "iupmat_aux.h"
#include "iupmat_mem.h"
#include "iupmat_mouse.h"
#include "iupmat_key.h"
#include "iupmat_numlc.h"
#include "iupmat_colres.h"
#include "iupmat_mark.h"
#include "iupmat_edit.h"
#include "iupmat_draw.h"
int iupMatrixIsValid(Ihandle* ih, int check_cells)
{
if (!ih->data->cd_canvas)
return 0;
if (check_cells && ((ih->data->columns.num == 0) || (ih->data->lines.num == 0)))
return 0;
return 1;
}
static char* iMatrixGetOriginAttrib(Ihandle* ih)
{
return iupStrReturnIntInt(ih->data->lines.first, ih->data->columns.first, ':');
}
static char* iMatrixGetOriginOffsetAttrib(Ihandle* ih)
{
return iupStrReturnIntInt(ih->data->lines.first_offset, ih->data->columns.first_offset, ':');
}
static int iMatrixSetOriginAttrib(Ihandle* ih, const char* value)
{
int lin = IUP_INVALID_ID, col = IUP_INVALID_ID;
/* Get the parameters. The '*' indicates that want to keep the table in
the same line or column */
if (iupStrToIntInt(value, &lin, &col, ':') != 2)
{
if (lin != IUP_INVALID_ID)
col = ih->data->columns.first;
else if (col != IUP_INVALID_ID)
lin = ih->data->lines.first;
else
return 0;
}
/* Check if the cell exists */
if (!iupMatrixCheckCellPos(ih, lin, col))
return 0;
/* Can not be non scrollable cell */
if ((lin < ih->data->lines.num_noscroll) || (col < ih->data->columns.num_noscroll))
return 0;
ih->data->columns.first = col;
ih->data->columns.first_offset = 0;
ih->data->lines.first = lin;
ih->data->lines.first_offset = 0;
value = iupAttribGet(ih, "ORIGINOFFSET");
if (value)
{
int lin_offset, col_offset;
if (iupStrToIntInt(value, &lin_offset, &col_offset, ':') == 2)
{
if (col_offset < ih->data->columns.dt[col].size)
ih->data->columns.first_offset = col_offset;
if (lin_offset < ih->data->lines.dt[lin].size)
ih->data->lines.first_offset = lin_offset;
}
}
/* when "first" is changed must update scroll pos */
iupMatrixAuxUpdateScrollPos(ih, IMAT_PROCESS_COL);
iupMatrixAuxUpdateScrollPos(ih, IMAT_PROCESS_LIN);
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetShowAttrib(Ihandle* ih, const char* value)
{
int lin = IUP_INVALID_ID, col = IUP_INVALID_ID;
/* Get the parameters. The '*' indicates that want to keep the table in
the same line or column */
if (iupStrToIntInt(value, &lin, &col, ':') != 2)
{
if (lin != IUP_INVALID_ID)
col = ih->data->columns.first;
else if (col != IUP_INVALID_ID)
lin = ih->data->lines.first;
else
return 0;
}
/* Check if the cell exists */
if (!iupMatrixCheckCellPos(ih, lin, col))
return 0;
if (!iupMatrixAuxIsCellStartVisible(ih, lin, col))
iupMatrixScrollToVisible(ih, lin, col);
return 0;
}
static int iMatrixSetFocusCellAttrib(Ihandle* ih, const char* value)
{
int lin = IUP_INVALID_ID, col = IUP_INVALID_ID;
if (iupStrToIntInt(value, &lin, &col, ':') == 2)
{
if (!iupMatrixCheckCellPos(ih, lin, col))
return 0;
if (lin == 0 || col == 0) /* title can NOT have the focus */
return 0;
if (lin >= ih->data->lines.num || col >= ih->data->columns.num)
return 0;
ih->data->lines.focus_cell = lin;
ih->data->columns.focus_cell = col;
if (ih->data->cd_canvas)
iupMatrixDrawUpdate(ih);
}
return 0;
}
static char* iMatrixGetFocusCellAttrib(Ihandle* ih)
{
return iupStrReturnIntInt(ih->data->lines.focus_cell, ih->data->columns.focus_cell, ':');
}
static int iMatrixSetUseTitleSizeAttrib(Ihandle* ih, const char* value)
{
/* can be set only before map */
if (ih->handle)
return 0;
if (iupStrBoolean(value))
ih->data->use_title_size = 1;
else
ih->data->use_title_size = 0;
return 0;
}
static char* iMatrixGetUseTitleSizeAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->use_title_size);
}
static int iMatrixSetResizeDragAttrib(Ihandle* ih, const char* value)
{
/* can be set only before map */
if (ih->handle)
return 0;
if (iupStrBoolean(value))
ih->data->colres_drag = 1;
else
ih->data->colres_drag = 0;
return 0;
}
static char* iMatrixGetResizeDragAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->colres_drag);
}
static int iMatrixSetLimitExpandAttrib(Ihandle* ih, const char* value)
{
/* can be set only before map */
if (ih->handle)
return 0;
ih->data->limit_expand = iupStrBoolean(value);
return 0;
}
static char* iMatrixGetLimitExpandAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->limit_expand);
}
static int iMatrixSetHiddenTextMarksAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->hidden_text_marks = 1;
else
ih->data->hidden_text_marks = 0;
return 0;
}
static char* iMatrixGetHiddenTextMarksAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->hidden_text_marks);
}
static int iMatrixSetValueAttrib(Ihandle* ih, const char* value)
{
if (ih->data->columns.num <= 1 || ih->data->lines.num <= 1)
return 0;
if (ih->data->editing)
IupStoreAttribute(ih->data->datah, "VALUE", value);
else
iupMatrixSetValue(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell, value, 0);
return 0;
}
static char* iMatrixGetValueAttrib(Ihandle* ih)
{
if (ih->data->columns.num <= 1 || ih->data->lines.num <= 1)
return NULL;
if (ih->data->editing)
return iupMatrixEditGetValue(ih);
else
return iupMatrixGetValue(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell);
}
static int iMatrixSetCaretAttrib(Ihandle* ih, const char* value)
{
IupStoreAttribute(ih->data->texth, "CARET", value);
return 1;
}
static int iMatrixSetInsertAttrib(Ihandle* ih, const char* value)
{
IupStoreAttribute(ih->data->texth, "INSERT", value);
return 1;
}
static char* iMatrixGetCaretAttrib(Ihandle* ih)
{
return IupGetAttribute(ih->data->texth, "CARET");
}
static int iMatrixSetSelectionAttrib(Ihandle* ih, const char* value)
{
IupStoreAttribute(ih->data->texth, "SELECTION", value);
return 1;
}
static char* iMatrixGetSelectionAttrib(Ihandle* ih)
{
return IupGetAttribute(ih->data->texth, "SELECTION");
}
static int iMatrixSetMultilineAttrib(Ihandle* ih, const char* value)
{
IupStoreAttribute(ih->data->texth, "MULTILINE", value);
if (iupStrBoolean(value))
IupSetAttribute(ih->data->texth, "SCROLLBAR", "VERTICAL");
return 1;
}
static char* iMatrixGetMultilineAttrib(Ihandle* ih)
{
return IupGetAttribute(ih->data->texth, "MULTILINE");
}
static char* iMatrixGetCountAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->lines.num > ih->data->columns.num ? ih->data->lines.num : ih->data->columns.num);
}
static char* iMatrixGetNumLinAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->lines.num - 1); /* the attribute does not include the title */
}
static char* iMatrixGetNumColAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->columns.num - 1); /* the attribute does not include the title */
}
static int iMatrixSetMarkModeAttrib(Ihandle* ih, const char* value)
{
if (iupStrEqualNoCase(value, "CELL"))
ih->data->mark_mode = IMAT_MARK_CELL;
else if (iupStrEqualNoCase(value, "LIN"))
ih->data->mark_mode = IMAT_MARK_LIN;
else if (iupStrEqualNoCase(value, "COL"))
ih->data->mark_mode = IMAT_MARK_COL;
else if (iupStrEqualNoCase(value, "LINCOL"))
ih->data->mark_mode = IMAT_MARK_LINCOL;
else
ih->data->mark_mode = IMAT_MARK_NO;
if (ih->handle)
{
iupMatrixMarkClearAll(ih, 0);
iupMatrixDraw(ih, 1);
}
return 0;
}
static char* iMatrixGetMarkModeAttrib(Ihandle* ih)
{
char* mark2str[] = { "NO", "LIN", "COL", "LINCOL", "CELL" };
return mark2str[ih->data->mark_mode];
}
static int iMatrixSetMarkAreaAttrib(Ihandle* ih, const char* value)
{
if (iupStrEqualNoCase(value, "NOT_CONTINUOUS"))
ih->data->mark_continuous = 0;
else
ih->data->mark_continuous = 1;
if (ih->handle)
{
iupMatrixMarkClearAll(ih, 0);
iupMatrixDraw(ih, 1);
}
return 0;
}
static char* iMatrixGetMarkAreaAttrib(Ihandle* ih)
{
if (ih->data->mark_continuous)
return "CONTINUOUS";
else
return "NOT_CONTINUOUS";
}
static int iMatrixSetMarkMultipleAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->mark_multiple = 1;
else
ih->data->mark_multiple = 0;
if (ih->handle)
{
iupMatrixMarkClearAll(ih, 0);
iupMatrixDraw(ih, 1);
}
return 0;
}
static char* iMatrixGetMarkMultipleAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->mark_multiple);
}
static int iMatrixSetEditHideOnFocusAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->edit_hide_onfocus = 1;
else
ih->data->edit_hide_onfocus = 0;
return 0;
}
static char* iMatrixGetEditHideOnFocusAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->edit_hide_onfocus);
}
static char* iMatrixGetEditCellAttrib(Ihandle* ih)
{
if (ih->data->editing)
return iupStrReturnIntInt(ih->data->edit_lin, ih->data->edit_col, ':');
else
return NULL;
}
static char* iMatrixGetEditTextAttrib(Ihandle* ih)
{
if (ih->data->editing)
return iupStrReturnBoolean(ih->data->datah == ih->data->texth);
else
return NULL;
}
static int iMatrixSetEditModeAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
iupMatrixEditShow(ih);
else
{
iupMatrixEditHide(ih);
iupMatrixDrawUpdate(ih);
}
return 1;
}
static char* iMatrixGetEditModeAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(iupMatrixEditIsVisible(ih));
}
static char* iMatrixGetEditingAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->editing);
}
static int iMatrixSetEditNextAttrib(Ihandle* ih, const char* value)
{
if (iupStrEqualNoCase(value, "NONE"))
ih->data->editnext = IMAT_EDITNEXT_NONE;
else if (iupStrEqualNoCase(value, "COL"))
ih->data->editnext = IMAT_EDITNEXT_COL;
else if (iupStrEqualNoCase(value, "COLCR"))
ih->data->editnext = IMAT_EDITNEXT_COLCR;
else if (iupStrEqualNoCase(value, "LINCR"))
ih->data->editnext = IMAT_EDITNEXT_LINCR;
else
ih->data->editnext = IMAT_EDITNEXT_LIN;
return 0;
}
static char* iMatrixGetEditNextAttrib(Ihandle* ih)
{
switch (ih->data->editnext)
{
case IMAT_EDITNEXT_NONE: return "NONE";
case IMAT_EDITNEXT_COL: return "COL";
case IMAT_EDITNEXT_LINCR: return "LINCR";
case IMAT_EDITNEXT_COLCR: return "COLCR";
default: return "LIN";
}
}
static int iMatrixHasColWidth(Ihandle* ih, int col)
{
char* value = iupAttribGetId(ih, "WIDTH", col);
if (!value)
value = iupAttribGetId(ih, "RASTERWIDTH", col);
return (value != NULL);
}
static int iMatrixHasLineHeight(Ihandle* ih, int lin)
{
char* value = iupAttribGetId(ih, "HEIGHT", lin);
if (!value)
value = iupAttribGetId(ih, "RASTERHEIGHT", lin);
return (value != NULL);
}
static void iMatrixFitLines(Ihandle* ih, int height)
{
/* expand each line height to fit the matrix height */
int line_height, lin, empty, has_line_height,
*empty_lines, empty_num = 0, visible_num, empty_lin_visible = 0;
/* get only from the hash table or the default value, do NOT get from the actual number of visible lines */
visible_num = iupAttribGetInt(ih, "NUMLIN_VISIBLE") + 1; /* include the title line */
empty_lines = malloc(ih->data->lines.num*sizeof(int));
/* ignore the lines that already have HEIGHT or RASTERHEIGHT */
for (lin = 0; lin < ih->data->lines.num; lin++)
{
has_line_height = iMatrixHasLineHeight(ih, lin);
empty = 1;
/* when lin==0 the line exists if size is defined,
but also exists if some title text is defined in non callback mode. */
line_height = iupMatrixGetLineHeight(ih, lin, lin == 0 ? 1 : 0);
/* the line does not exists */
if (lin == 0 && !has_line_height && !line_height)
empty = 0; /* don't resize this line */
/* if the height is defined to be 0, it can not be used */
if (has_line_height && !line_height)
empty = 0; /* don't resize this line */
if (line_height)
{
if (lin < visible_num)
height -= line_height;
}
else if (empty)
{
if (lin < visible_num)
empty_lin_visible++;
empty_lines[empty_num] = lin;
empty_num++;
}
}
if (empty_num && empty_lin_visible)
{
int i;
line_height = height / empty_lin_visible - (IMAT_PADDING_H + IMAT_FRAME_H);
for (i = 0; i < empty_num; i++)
iupAttribSetIntId(ih, "RASTERHEIGHT", empty_lines[i], line_height);
}
free(empty_lines);
}
static void iMatrixFitColumns(Ihandle* ih, int width)
{
/* expand each column width to fit the matrix width */
int column_width, col, empty, has_col_width,
*empty_columns, empty_num = 0, visible_num, empty_col_visible = 0;
/* get only from the hash table or the default value, do NOT get from the actual number of visible columns */
visible_num = iupAttribGetInt(ih, "NUMCOL_VISIBLE") + 1; /* include the title column */
empty_columns = malloc(ih->data->columns.num*sizeof(int));
/* ignore the columns that already have WIDTH or RASTERWIDTH */
for (col = 0; col < ih->data->columns.num; col++)
{
has_col_width = iMatrixHasColWidth(ih, col);
empty = 1;
/* when col==0 the col exists if size is defined,
but also exists if some title text is defined in non callback mode. */
column_width = iupMatrixGetColumnWidth(ih, col, col == 0 ? 1 : 0);
/* the col does not exists */
if (col == 0 && !has_col_width && !column_width)
empty = 0; /* don't resize this col */
/* if the width is defined to be 0, it can not be used */
if (has_col_width && !column_width)
empty = 0; /* don't resize this col */
if (column_width)
{
if (col < visible_num)
width -= column_width;
}
else if (empty)
{
if (col < visible_num)
empty_col_visible++;
empty_columns[empty_num] = col;
empty_num++;
}
}
if (empty_num && empty_col_visible)
{
int i;
column_width = width / empty_col_visible - (IMAT_PADDING_W + IMAT_FRAME_W);
for (i = 0; i < empty_num; i++)
iupAttribSetIntId(ih, "RASTERWIDTH", empty_columns[i], column_width);
}
free(empty_columns);
}
static int iMatrixSetFitToSizeAttrib(Ihandle* ih, const char* value)
{
int w, h;
int sb, sb_w = 0, sb_h = 0, border = 0;
sb = iupMatrixGetScrollbar(ih);
/* add scrollbar */
if (sb)
{
int sb_size = iupMatrixGetScrollbarSize(ih);
if (sb & IUP_SB_HORIZ)
sb_h += sb_size; /* sb horizontal affects vertical size */
if (sb & IUP_SB_VERT)
sb_w += sb_size; /* sb vertical affects horizontal size */
}
if (iupAttribGetBoolean(ih, "BORDER"))
border = 1;
IupGetIntInt(ih, "RASTERSIZE", &w, &h);
if (iupStrEqualNoCase(value, "LINES"))
iMatrixFitLines(ih, h - sb_h - 2 * border);
else if (iupStrEqualNoCase(value, "COLUMNS"))
iMatrixFitColumns(ih, w - sb_w - 2 * border);
else
{
iMatrixFitLines(ih, h - sb_h - 2 * border);
iMatrixFitColumns(ih, w - sb_w - 2 * border);
}
ih->data->need_calcsize = 1;
IupUpdate(ih); /* post a redraw, because FITTOSIZE can be set inside a resize_cb */
return 0;
}
static void iMatrixFitColText(Ihandle* ih, int col)
{
/* find the largest cel in the col */
int lin, max_width = 0, max;
for (lin = 0; lin < ih->data->lines.num; lin++)
{
char* title_value = iupMatrixGetValueDisplay(ih, lin, col);
if (title_value && title_value[0])
{
int w;
iupdrvFontGetMultiLineStringSize(ih, title_value, &w, NULL);
if (w > max_width)
max_width = w;
}
}
max = iupAttribGetIntId(ih, "FITMAXWIDTH", col);
if (max && max > max_width)
max_width = max;
iupAttribSetIntId(ih, "RASTERWIDTH", col, max_width);
}
static void iMatrixFitLineText(Ihandle* ih, int line)
{
/* find the highest cel in the line */
int col, max_height = 0, max;
for (col = 0; col < ih->data->columns.num; col++)
{
char* title_value = iupMatrixGetValueDisplay(ih, line, col);
if (title_value && title_value[0])
{
int h;
iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &h);
if (h > max_height)
max_height = h;
}
}
max = iupAttribGetIntId(ih, "FITMAXHEIGHT", line);
if (max && max > max_height)
max_height = max;
iupAttribSetIntId(ih, "RASTERHEIGHT", line, max_height);
}
static int iMatrixSetFitToTextAttrib(Ihandle* ih, const char* value)
{
if (!value || value[0] == 0)
return 0;
if (value[0] == 'C')
{
int col;
if (iupStrToInt(value + 1, &col))
iMatrixFitColText(ih, col);
}
else if (value[0] == 'L')
{
int line;
if (iupStrToInt(value + 1, &line))
iMatrixFitLineText(ih, line);
}
ih->data->need_calcsize = 1;
IupUpdate(ih); /* post a redraw, because FITTOSIZE can be set inside a resize_cb */
return 0;
}
static int iMatrixSetNumColNoScrollAttrib(Ihandle* ih, const char* value)
{
int num = 0;
if (iupStrToInt(value, &num))
{
if (num < 0) num = 0;
num++; /* add room for title column */
ih->data->columns.num_noscroll = num;
if (ih->data->columns.num_noscroll >= ih->data->columns.num)
ih->data->columns.num_noscroll = ih->data->columns.num - 1;
if (ih->data->columns.num_noscroll < 1)
ih->data->columns.num_noscroll = 1;
if (ih->data->columns.first < ih->data->columns.num_noscroll)
{
ih->data->columns.first = ih->data->columns.num_noscroll;
ih->data->columns.first_offset = 0;
/* when "first" is changed must update scroll pos */
iupMatrixAuxUpdateScrollPos(ih, IMAT_PROCESS_COL);
}
ih->data->need_calcsize = 1;
if (ih->handle)
iupMatrixDraw(ih, 1);
}
return 0;
}
static int iMatrixSetNumLinNoScrollAttrib(Ihandle* ih, const char* value)
{
int num = 0;
if (iupStrToInt(value, &num))
{
if (num < 0) num = 0;
num++; /* add room for title line */
ih->data->lines.num_noscroll = num;
if (ih->data->lines.num_noscroll >= ih->data->lines.num)
ih->data->lines.num_noscroll = ih->data->lines.num - 1;
if (ih->data->lines.num_noscroll < 1)
ih->data->lines.num_noscroll = 1;
if (ih->data->lines.first < ih->data->lines.num_noscroll)
{
ih->data->lines.first = ih->data->lines.num_noscroll;
ih->data->lines.first_offset = 0;
/* when "first" is changed must update scroll pos */
iupMatrixAuxUpdateScrollPos(ih, IMAT_PROCESS_LIN);
}
ih->data->need_calcsize = 1;
if (ih->handle)
iupMatrixDraw(ih, 1);
}
return 0;
}
static int iMatrixSetNoScrollAsTitleAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->noscroll_as_title = 1;
else
ih->data->noscroll_as_title = 0;
return 0;
}
static char* iMatrixGetNoScrollAsTitleAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->noscroll_as_title);
}
static char* iMatrixGetNumColNoScrollAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->columns.num_noscroll - 1); /* the attribute does not include the title */
}
static char* iMatrixGetNumLinNoScrollAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->lines.num_noscroll - 1); /* the attribute does not include the title */
}
static int iMatrixSetCopyLinAttrib(Ihandle* ih, int from_lin, const char* value)
{
int to_lin = 0;
if (!iupStrToInt(value, &to_lin))
return 0;
if (!iupMATRIX_CHECK_LIN(ih, from_lin) || !iupMATRIX_CHECK_LIN(ih, to_lin) || from_lin == to_lin)
return 0;
iupMatrixAuxCopyLin(ih, from_lin, to_lin);
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetCopyColAttrib(Ihandle* ih, int from_col, const char* value)
{
int to_col = 0;
if (!iupStrToInt(value, &to_col))
return 0;
if (!iupMATRIX_CHECK_COL(ih, from_col) || !iupMATRIX_CHECK_COL(ih, to_col) || from_col == to_col)
return 0;
iupMatrixAuxCopyCol(ih, from_col, to_col);
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetMoveColAttrib(Ihandle* ih, int from_col, const char* value)
{
char str[50];
int to_col = 0;
if (!iupStrToInt(value, &to_col))
return 0;
if (!iupMATRIX_CHECK_COL(ih, from_col) || !iupMATRIX_CHECK_COL(ih, to_col) || from_col == to_col)
return 0;
iupMatrixSetAddColAttrib(ih, value);
if (to_col < from_col)
from_col++;
iMatrixSetCopyColAttrib(ih, from_col, value);
sprintf(str, "%d", from_col);
iupMatrixSetDelColAttrib(ih, str);
return 0;
}
static int iMatrixSetMoveLinAttrib(Ihandle* ih, int from_lin, const char* value)
{
char str[50];
int to_lin = 0;
if (!iupStrToInt(value, &to_lin))
return 0;
if (!iupMATRIX_CHECK_LIN(ih, from_lin) || !iupMATRIX_CHECK_LIN(ih, to_lin) || from_lin == to_lin)
return 0;
iupMatrixSetAddLinAttrib(ih, value);
if (to_lin < from_lin)
from_lin++;
iMatrixSetCopyLinAttrib(ih, from_lin, value);
sprintf(str, "%d", from_lin);
iupMatrixSetDelLinAttrib(ih, str);
return 0;
}
static int iMatrixSetSizeAttrib(Ihandle* ih, int pos, const char* value)
{
(void)pos;
(void)value;
ih->data->need_calcsize = 1;
IupUpdate(ih); /* post a redraw */
return 1; /* always save in the hash table, so when FONT is changed SIZE can be updated */
}
static char* iMatrixGetWidthAttrib(Ihandle* ih, int col)
{
return iupMatrixGetSize(ih, col, IMAT_PROCESS_COL, 0);
}
static char* iMatrixGetHeightAttrib(Ihandle* ih, int lin)
{
return iupMatrixGetSize(ih, lin, IMAT_PROCESS_LIN, 0);
}
static char* iMatrixGetRasterWidthAttrib(Ihandle* ih, int col)
{
return iupMatrixGetSize(ih, col, IMAT_PROCESS_COL, 1);
}
static char* iMatrixGetRasterHeightAttrib(Ihandle* ih, int lin)
{
return iupMatrixGetSize(ih, lin, IMAT_PROCESS_LIN, 1);
}
static char* iMatrixGetAlignmentAttrib(Ihandle* ih, int col)
{
char* align = iupAttribGetId(ih, "ALIGNMENT", col);
if (!align)
{
align = iupAttribGet(ih, "ALIGNMENT");
if (align)
return align;
else
{
if (col == 0)
return "ALEFT";
else
return "ACENTER";
}
}
return NULL;
}
static int iMatrixSetIdValueAttrib(Ihandle* ih, int lin, int col, const char* value)
{
if (iupMatrixCheckCellPos(ih, lin, col))
iupMatrixSetValue(ih, lin, col, value, 0);
return 0;
}
static char* iMatrixGetIdValueAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
return iupMatrixGetValue(ih, lin, col);
return NULL;
}
static char* iMatrixGetCellAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
return iupMatrixGetValueDisplay(ih, lin, col);
return NULL;
}
static char* iMatrixGetCellOffsetAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
int x, y;
if (iupMatrixGetCellOffset(ih, lin, col, &x, &y))
return iupStrReturnIntInt(x, y, 'x');
}
return NULL;
}
static char* iMatrixGetCellSizeAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
return iupStrReturnIntInt(ih->data->columns.dt[col].size, ih->data->lines.dt[lin].size, 'x');
return NULL;
}
static int iMatrixSetNeedRedraw(Ihandle* ih)
{
ih->data->need_redraw = 1;
return 1;
}
static int iMatrixSetFlatAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->flat = 1;
else
ih->data->flat = 0;
IupUpdate(ih); /* post a redraw */
return 0; /* do not store value in hash table */
}
static char* iMatrixGetFlatAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->flat);
}
static void iMatrixClearAttribFlags(Ihandle* ih, unsigned char *flags, int lin, int col)
{
int is_marked = (*flags) & IMAT_IS_MARKED;
if ((*flags) & IMAT_HAS_FONT)
iupAttribSetId2(ih, "FONT", lin, col, NULL);
if ((*flags) & IMAT_HAS_FGCOLOR)
iupAttribSetId2(ih, "FGCOLOR", lin, col, NULL);
if ((*flags) & IMAT_HAS_BGCOLOR)
iupAttribSetId2(ih, "BGCOLOR", lin, col, NULL);
if ((*flags) & IMAT_HAS_FRAMEHORIZCOLOR)
iupAttribSetId2(ih, "FRAMEHORIZCOLOR", lin, col, NULL);
if ((*flags) & IMAT_HAS_FRAMEVERTCOLOR)
iupAttribSetId2(ih, "FRAMEVERTCOLOR", lin, col, NULL);
if (lin == IUP_INVALID_ID)
{
iupAttribSetId(ih, "ALIGNMENT", col, NULL);
iupAttribSetId(ih, "SORTSIGN", col, NULL);
}
if (col == IUP_INVALID_ID)
iupAttribSetId(ih, "LINEALIGNMENT", lin, NULL);
if (lin == 0)
iupAttribSetId(ih, "ALIGNMENTLIN", 0, NULL);
iupAttribSetId2(ih, "ALIGN", lin, col, NULL);
*flags = 0; /* clear all flags, except marked state */
if (is_marked)
*flags = IMAT_IS_MARKED;
}
static int iMatrixSetClearAttribAttrib(Ihandle* ih, int lin, int col, const char* value)
{
if (lin == IUP_INVALID_ID && col == IUP_INVALID_ID)
{
if (iupStrEqualNoCase(value, "ALL"))
{
/* all cells attributes */
if (!ih->data->callback_mode)
{
for (lin = 0; lin < ih->data->lines.num; lin++)
{
for (col = 0; col < ih->data->columns.num; col++)
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
/* all line attributes */
for (lin = 0; lin < ih->data->lines.num; lin++)
iMatrixClearAttribFlags(ih, &(ih->data->lines.dt[lin].flags), lin, IUP_INVALID_ID);
/* all column attributes */
for (col = 0; col < ih->data->columns.num; col++)
iMatrixClearAttribFlags(ih, &(ih->data->columns.dt[col].flags), IUP_INVALID_ID, col);
}
else if (iupStrEqualNoCase(value, "CONTENTS"))
{
if (!ih->data->callback_mode)
{
for (lin = 1; lin < ih->data->lines.num; lin++)
{
for (col = 1; col < ih->data->columns.num; col++)
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
}
else if (iupStrEqualNoCase(value, "MARKED"))
{
IFnii mark_cb = (IFnii)IupGetCallback(ih, "MARK_CB");
if (!ih->data->callback_mode)
{
for (lin = 1; lin < ih->data->lines.num; lin++)
{
for (col = 1; col < ih->data->columns.num; col++)
{
if (iupMatrixGetMark(ih, lin, col, mark_cb))
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
}
}
}
else
{
if (lin == IUP_INVALID_ID)
{
int lin1 = 0, lin2 = ih->data->lines.num - 1;
if (!iupStrEqualNoCase(value, "ALL"))
iupStrToIntInt(value, &lin1, &lin2, '-');
if (!iupMATRIX_CHECK_COL(ih, col) ||
!iupMATRIX_CHECK_LIN(ih, lin1) ||
!iupMATRIX_CHECK_LIN(ih, lin2))
return 0;
if (lin1 == 0 && lin2 == ih->data->lines.num - 1)
iMatrixClearAttribFlags(ih, &(ih->data->columns.dt[col].flags), IUP_INVALID_ID, col);
if (!ih->data->callback_mode)
{
for (lin = lin1; lin <= lin2; lin++)
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
else if (col == IUP_INVALID_ID)
{
int col1 = 0, col2 = ih->data->columns.num - 1;
if (!iupStrEqualNoCase(value, "ALL"))
iupStrToIntInt(value, &col1, &col2, '-');
if (!iupMATRIX_CHECK_LIN(ih, lin) ||
!iupMATRIX_CHECK_COL(ih, col1) ||
!iupMATRIX_CHECK_COL(ih, col2))
return 0;
if (col1 == 0 && col2 == ih->data->columns.num - 1)
iMatrixClearAttribFlags(ih, &(ih->data->lines.dt[lin].flags), lin, IUP_INVALID_ID);
if (!ih->data->callback_mode)
{
for (col = col1; col <= col2; col++)
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
else
{
int lin1 = lin, lin2 = ih->data->lines.num - 1;
int col1 = col, col2 = ih->data->columns.num - 1;
iupStrToIntInt(value, &lin2, &col2, ':');
if (!iupMATRIX_CHECK_LIN(ih, lin1) ||
!iupMATRIX_CHECK_LIN(ih, lin2) ||
!iupMATRIX_CHECK_COL(ih, col1) ||
!iupMATRIX_CHECK_COL(ih, col2))
return 0;
if (lin1 == 0 && lin2 == ih->data->lines.num - 1)
{
for (col = 0; col < ih->data->columns.num; col++)
iMatrixClearAttribFlags(ih, &(ih->data->columns.dt[col].flags), IUP_INVALID_ID, col);
}
if (col1 == 0 && col2 == ih->data->columns.num - 1)
{
for (lin = 0; lin < ih->data->lines.num; lin++)
iMatrixClearAttribFlags(ih, &(ih->data->lines.dt[lin].flags), lin, IUP_INVALID_ID);
}
if (!ih->data->callback_mode)
{
for (lin = lin1; lin <= lin2; lin++)
{
for (col = col1; col <= col2; col++)
iMatrixClearAttribFlags(ih, &(ih->data->cells[lin][col].flags), lin, col);
}
}
}
}
if (ih->handle)
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetClearValueAttrib(Ihandle* ih, int lin, int col, const char* value)
{
if (ih->data->undo_redo) iupAttribSetClassObject(ih, "UNDOPUSHBEGIN", "CLEARVALUE");
if (lin == IUP_INVALID_ID && col == IUP_INVALID_ID)
{
if (iupStrEqualNoCase(value, "ALL"))
{
for (lin = 0; lin < ih->data->lines.num; lin++)
{
for (col = 0; col < ih->data->columns.num; col++)
iupMatrixModifyValue(ih, lin, col, NULL);
}
}
else if (iupStrEqualNoCase(value, "CONTENTS"))
{
for (lin = 1; lin < ih->data->lines.num; lin++)
{
for (col = 1; col < ih->data->columns.num; col++)
iupMatrixModifyValue(ih, lin, col, NULL);
}
}
else if (iupStrEqualNoCase(value, "MARKED"))
{
IFnii mark_cb = (IFnii)IupGetCallback(ih, "MARK_CB");
for (lin = 1; lin < ih->data->lines.num; lin++)
{
for (col = 1; col < ih->data->columns.num; col++)
{
if (iupMatrixGetMark(ih, lin, col, mark_cb))
iupMatrixModifyValue(ih, lin, col, NULL);
}
}
}
}
else
{
if (lin == IUP_INVALID_ID)
{
int lin1 = 0, lin2 = ih->data->lines.num - 1;
iupStrToIntInt(value, &lin1, &lin2, '-');
if (!iupMATRIX_CHECK_COL(ih, col) ||
!iupMATRIX_CHECK_LIN(ih, lin1) ||
!iupMATRIX_CHECK_LIN(ih, lin2))
return 0;
for (lin = lin1; lin <= lin2; lin++)
iupMatrixModifyValue(ih, lin, col, NULL);
}
else if (col == IUP_INVALID_ID)
{
int col1 = 0, col2 = ih->data->columns.num - 1;
iupStrToIntInt(value, &col1, &col2, '-');
if (!iupMATRIX_CHECK_LIN(ih, lin) ||
!iupMATRIX_CHECK_COL(ih, col1) ||
!iupMATRIX_CHECK_COL(ih, col2))
return 0;
for (col = col1; col <= col2; col++)
iupMatrixModifyValue(ih, lin, col, NULL);
}
else
{
int lin1 = lin, lin2 = ih->data->lines.num - 1;
int col1 = col, col2 = ih->data->columns.num - 1;
iupStrToIntInt(value, &lin2, &col2, ':');
if (!iupMATRIX_CHECK_LIN(ih, lin1) ||
!iupMATRIX_CHECK_LIN(ih, lin2) ||
!iupMATRIX_CHECK_COL(ih, col1) ||
!iupMATRIX_CHECK_COL(ih, col2))
return 0;
for (lin = lin1; lin <= lin2; lin++)
{
for (col = col1; col <= col2; col++)
iupMatrixModifyValue(ih, lin, col, NULL);
}
}
}
if (ih->data->undo_redo) iupAttribSetClassObject(ih, "UNDOPUSHEND", NULL);
iupBaseCallValueChangedCb(ih);
if (ih->handle)
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetShowFillValueAttrib(Ihandle* ih, const char* value)
{
if (iupStrBoolean(value))
ih->data->show_fill_value = 1;
else
ih->data->show_fill_value = 0;
return 0;
}
static char* iMatrixGetShowFillValueAttrib(Ihandle* ih)
{
return iupStrReturnBoolean(ih->data->show_fill_value);
}
static int iMatrixSetAttribFlags(Ihandle* ih, int lin, int col, const char* value, unsigned char attr)
{
if (lin >= 0 || col >= 0)
{
iupMatrixSetCellFlag(ih, lin, col, attr, value != NULL);
ih->data->need_redraw = 1;
}
return 1;
}
static int iMatrixSetBgColorAttrib(Ihandle* ih, int lin, int col, const char* value)
{
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_BGCOLOR);
}
static int iMatrixSetFgColorAttrib(Ihandle* ih, int lin, int col, const char* value)
{
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_FGCOLOR);
}
static int iMatrixSetTypeAttrib(Ihandle* ih, int lin, int col, const char* value)
{
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_TYPE);
}
static char* iMatrixGetFontAttribute(Ihandle* ih, int lin, int col)
{
char* font = NULL;
if (lin != IUP_INVALID_ID && col != IUP_INVALID_ID)
font = iupAttribGetId2(ih, "FONT", lin, col);
if (!font && lin != IUP_INVALID_ID)
font = iupAttribGetId2(ih, "FONT", lin, IUP_INVALID_ID);
if (!font && col != IUP_INVALID_ID)
font = iupAttribGetId2(ih, "FONT", IUP_INVALID_ID, col);
if (!font)
font = IupGetAttribute(ih, "FONT");
return font;
}
static int iMatrixSetFontStyleAttrib(Ihandle* ih, int lin, int col, const char* value)
{
int size = 0;
int is_bold = 0,
is_italic = 0,
is_underline = 0,
is_strikeout = 0;
char typeface[1024];
char* font;
if (!value)
return 0;
font = iMatrixGetFontAttribute(ih, lin, col);
if (!font)
return 0;
if (!iupGetFontInfo(font, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout))
return 0;
IupSetfAttributeId2(ih, "FONT", lin, col, "%s, %s %d", typeface, value, size);
return 0;
}
static char* iMatrixGetFontStyleAttrib(Ihandle* ih, int lin, int col)
{
int size = 0;
int is_bold = 0,
is_italic = 0,
is_underline = 0,
is_strikeout = 0;
char typeface[1024];
char* font = iMatrixGetFontAttribute(ih, lin, col);
if (!font)
return NULL;
if (!iupGetFontInfo(font, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout))
return NULL;
return iupStrReturnStrf("%s%s%s%s", is_bold ? "Bold " : "", is_italic ? "Italic " : "", is_underline ? "Underline " : "", is_strikeout ? "Strikeout " : "");
}
static int iMatrixSetFontSizeAttrib(Ihandle* ih, int lin, int col, const char* value)
{
int size = 0;
int is_bold = 0,
is_italic = 0,
is_underline = 0,
is_strikeout = 0;
char typeface[1024];
char* font;
if (!value)
return 0;
font = iMatrixGetFontAttribute(ih, lin, col);
if (!font)
return 0;
if (!iupGetFontInfo(font, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout))
return 0;
IupSetfAttributeId2(ih, "FONT", lin, col, "%s, %s%s%s%s %s", typeface, is_bold ? "Bold " : "", is_italic ? "Italic " : "", is_underline ? "Underline " : "", is_strikeout ? "Strikeout " : "", value);
return 0;
}
static char* iMatrixGetFontSizeAttrib(Ihandle* ih, int lin, int col)
{
int size = 0;
int is_bold = 0,
is_italic = 0,
is_underline = 0,
is_strikeout = 0;
char typeface[1024];
char* font = iMatrixGetFontAttribute(ih, lin, col);
if (!font)
return NULL;
if (!iupGetFontInfo(font, typeface, &size, &is_bold, &is_italic, &is_underline, &is_strikeout))
return NULL;
return iupStrReturnInt(size);
}
static int iMatrixSetFontAttrib(Ihandle* ih, int lin, int col, const char* value)
{
if (lin == IUP_INVALID_ID && col == IUP_INVALID_ID) /* empty id */
{
if (!value)
value = IupGetGlobal("DEFAULTFONT");
if (!iupdrvSetFontAttrib(ih, value))
return 0;
return 1;
}
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_FONT);
}
static char* iMatrixGetFontAttrib(Ihandle* ih, int lin, int col)
{
if (lin == IUP_INVALID_ID && col == IUP_INVALID_ID) /* empty id */
{
char* value = iupAttribGetInherit(ih, "FONT");
if (!value)
return IupGetGlobal("DEFAULTFONT");
else
return value;
}
return NULL;
}
static int iMatrixSetFrameHorizColorAttrib(Ihandle* ih, int lin, int col, const char* value)
{
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_FRAMEHORIZCOLOR);
}
static int iMatrixSetFrameVertColorAttrib(Ihandle* ih, int lin, int col, const char* value)
{
return iMatrixSetAttribFlags(ih, lin, col, value, IMAT_HAS_FRAMEVERTCOLOR);
}
static int iMatrixSetMergeAttrib(Ihandle* ih, int lin, int col, const char* value)
{
int l, c;
if (lin == 0 && col == 0)
return 0;
if (iupStrToIntInt(value, &l, &c, ':') == 2)
{
/* merge of title cells can not include regular cells */
if (lin == 0 && l != 0)
return 0;
if (col == 0 && c != 0)
return 0;
/* can not merge with already merged cells */
if (iupMatrixHasMerged(ih, lin, l, col, c))
return 0;
iupMatrixMergeRange(ih, lin, l, col, c);
}
return 0;
}
static char* iMatrixGetMergeAttrib(Ihandle* ih, int lin, int col)
{
int merged = iupMatrixGetMerged(ih, lin, col);
return iupStrReturnBoolean(merged);
}
static int iMatrixSetMergeSplitAttrib(Ihandle* ih, const char* value)
{
int lin, col;
if (iupStrToIntInt(value, &lin, &col, ':') == 2)
{
int merged = iupMatrixGetMerged(ih, lin, col);
if (merged)
iupMatrixMergeSplitRange(ih, merged);
}
return 0;
}
static char* iMatrixGetMergedStartAttrib(Ihandle* ih, int lin, int col)
{
int merged = iupMatrixGetMerged(ih, lin, col);
if (merged)
{
int startLin, startCol;
iupMatrixGetMergedRect(ih, merged, &startLin, NULL, &startCol, NULL);
return iupStrReturnIntInt(startLin, startCol, ':');
}
else
return NULL;
}
static char* iMatrixGetMergedEndAttrib(Ihandle* ih, int lin, int col)
{
int merged = iupMatrixGetMerged(ih, lin, col);
if (merged)
{
int endLin, endCol;
iupMatrixGetMergedRect(ih, merged, NULL, &endLin, NULL, &endCol);
return iupStrReturnIntInt(endLin, endCol, ':');
}
else
return NULL;
}
static char* iMatrixGetBgColorAttrib(Ihandle* ih, int lin, int col)
{
if (lin == IUP_INVALID_ID && col == IUP_INVALID_ID) /* empty id - return the global default value */
{
/* check the hash table */
char *color = iupAttribGet(ih, "BGCOLOR");
/* If not defined return the default for normal cells */
if (!color)
color = IupGetGlobal("TXTBGCOLOR");
return color;
}
return NULL;
}
static char* iMatrixGetCellBgColorAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
unsigned char r = 255, g = 255, b = 255;
int active = iupdrvIsActive(ih);
char* mark = iupMatrixGetMarkAttrib(ih, lin, col);
iupMatrixGetBgRGB(ih, lin, col, &r, &g, &b, mark && mark[0] == '1', active);
return iupStrReturnRGB(r, g, b);
}
else
return NULL;
}
static char* iMatrixGetCellFgColorAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
unsigned char r = 0, g = 0, b = 0;
int active = iupdrvIsActive(ih);
char* mark = iupMatrixGetMarkAttrib(ih, lin, col);
iupMatrixGetFgRGB(ih, lin, col, &r, &g, &b, mark && mark[0] == '1', active);
return iupStrReturnRGB(r, g, b);
}
else
return NULL;
}
static char* iMatrixGetCellFontAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
return iupMatrixGetFont(ih, lin, col);
else
return NULL;
}
static char* iMatrixGetCellTypeAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
int type = iupMatrixGetType(ih, lin, col);
if (type == IMAT_TYPE_COLOR)
return "COLOR";
else if (type == IMAT_TYPE_FILL)
return "FILL";
else if (type == IMAT_TYPE_IMAGE)
return "IMAGE";
else /* TEXT */
return "TEXT";
}
else
return NULL;
}
static char* iMatrixGetCellAlignmentAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
const char* vert_align_str[3] = {"ACENTER", "ATOP", "ABOTTOM"};
const char* horiz_align_str[3] = { "ACENTER", "ALEFT", "ARIGHT" };
char* str = iupStrGetMemory(30);
int col_alignment, lin_alignment;
if (lin == 0)
col_alignment = iupMatrixGetColAlignmentLin0(ih);
else
col_alignment = iupMatrixGetColAlignment(ih, col);
lin_alignment = iupMatrixGetLinAlignment(ih, lin);
iupMatrixGetCellAlign(ih, lin, col, &col_alignment, &lin_alignment);
sprintf(str, "%s:%s", horiz_align_str[col_alignment], vert_align_str[lin_alignment]);
return str;
}
else
return NULL;
}
static char* iMatrixGetCellFrameHorizColorAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
long framecolor = cdIupConvertColor(iupAttribGetStr(ih, "FRAMECOLOR"));
int transp, check_title = 0;
if (lin == 0 || col == 0)
check_title = 1;
transp = iupMatrixGetFrameHorizColor(ih, lin, col, &framecolor, check_title);
if (transp)
return NULL;
return iupStrReturnRGB(cdRed(framecolor), cdGreen(framecolor), cdBlue(framecolor));
}
else
return NULL;
}
static char* iMatrixGetCellFrameVertColorAttrib(Ihandle* ih, int lin, int col)
{
if (iupMatrixCheckCellPos(ih, lin, col))
{
long framecolor = cdIupConvertColor(iupAttribGetStr(ih, "FRAMECOLOR"));
int transp, check_title = 0;
if (lin == 0 || col == 0)
check_title = 1;
transp = iupMatrixGetFrameVertColor(ih, lin, col, &framecolor, check_title);
if (transp)
return NULL;
return iupStrReturnRGB(cdRed(framecolor), cdGreen(framecolor), cdBlue(framecolor));
}
else
return NULL;
}
static void iMatrixConvertLinColToPos(Ihandle* ih, int lin, int col, int *pos)
{
*pos = lin*ih->data->columns.num + col;
}
static void iMatrixConvertPosToLinCol(Ihandle* ih, int pos, int *lin, int *col)
{
*lin = pos / ih->data->columns.num;
*col = pos % ih->data->columns.num;
}
static int iMatrixConvertXYToPos(Ihandle* ih, int x, int y)
{
int lin, col;
if (iupMatrixGetCellFromXY(ih, x, y, &lin, &col))
{
int pos;
iMatrixConvertLinColToPos(ih, lin, col, &pos);
return pos;
}
return -1;
}
static char* iMatrixGetNumColVisibleAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->columns.last - ih->data->columns.first);
}
static char* iMatrixGetNumLinVisibleAttrib(Ihandle* ih)
{
return iupStrReturnInt(ih->data->lines.last - ih->data->lines.first);
}
static int iMatrixSetActiveAttrib(Ihandle* ih, const char* value)
{
if (!iupStrBoolean(value) && ih->data->editing)
iupMatrixEditHide(ih);
iupBaseSetActiveAttrib(ih, value);
iupMatrixDraw(ih, 1);
return 0;
}
static int iMatrixSetVisibleAttrib(Ihandle* ih, const char* value)
{
if (!iupStrBoolean(value) && ih->data->editing)
iupMatrixEditHide(ih);
return iupBaseSetVisibleAttrib(ih, value);
}
static int iMatrixWheel_CB(Ihandle* ih, float delta)
{
iupFlatScrollBarWheelUpdate(ih, delta);
return IUP_DEFAULT;
}
static int iMatrixSetFlatScrollbarAttrib(Ihandle* ih, const char* value)
{
/* can only be set before map */
if (ih->handle)
return IUP_DEFAULT;
if (value && !iupStrEqualNoCase(value, "NO"))
{
if (iupFlatScrollBarCreate(ih))
{
IupSetAttribute(ih, "SCROLLBAR", "NO");
IupSetCallback(ih, "WHEEL_CB", (Icallback)iMatrixWheel_CB);
}
return 1;
}
else
return 0;
}
/*****************************************************************************/
/* Callbacks registered to the Canvas */
/*****************************************************************************/
static int iMatrixFocus_CB(Ihandle* ih, int focus)
{
int rc = IUP_DEFAULT;
if (!iupMatrixIsValid(ih, 1))
return IUP_DEFAULT;
if (IupGetGlobal("MOTIFVERSION"))
{
if (iupAttribGet(ih, "_IUPMAT_DROPDOWN") || /* from iMatrixEditDropDown_CB, in Motif */
iupAttribGet(ih, "_IUPMAT_DOUBLECLICK")) /* from iMatrixMouseLeftPress, in Motif */
return IUP_DEFAULT;
}
ih->data->has_focus = focus;
iupMatrixDrawUpdate(ih);
if (focus)
iupMatrixAuxCallEnterCellCb(ih);
else
iupMatrixAuxCallLeaveCellCb(ih);
return rc;
}
static int iMatrixResize_CB(Ihandle* ih)
{
int old_w = ih->data->w,
old_h = ih->data->h;
#ifdef USE_OLD_DRAW
cdCanvasActivate(ih->data->cd_canvas);
cdCanvasGetSize(ih->data->cd_canvas, &(ih->data->w), &(ih->data->h), NULL, NULL);
#else
IupGetIntInt(ih, "DRAWSIZE", &(ih->data->w), &(ih->data->h));
#endif
if (old_w != ih->data->w || old_h != ih->data->h)
{
ih->data->need_calcsize = 1;
if (ih->data->edit_hide_onfocus)
{
ih->data->edit_hidden_byfocus = 1;
iupMatrixEditHide(ih);
ih->data->edit_hidden_byfocus = 0;
}
}
if (ih->data->columns.num > 0 && ih->data->lines.num > 0)
{
IFnii cb = (IFnii)IupGetCallback(ih, "RESIZEMATRIX_CB");
if (cb) cb(ih, ih->data->w, ih->data->h);
}
return IUP_DEFAULT;
}
static int iMatrixRedraw_CB(Ihandle* ih)
{
if (!ih->data->cd_canvas)
return IUP_DEFAULT;
if (ih->data->callback_mode || /* in callback mode the values are not changed by attributes, so we can NOT wait for a REDRAW */
ih->data->need_redraw || /* if some of the attributes that do not automatically redraw were set */
ih->data->need_calcsize) /* if something changed the matrix size */
iupMatrixDraw(ih, 0);
#ifdef USE_OLD_DRAW
iupMatrixDrawUpdate(ih);
#else
iupMatrixDrawCB(ih);
#endif
return IUP_DEFAULT;
}
/***************************************************************************/
static int iMatrixCreateMethod(Ihandle* ih, void **params)
{
if (params && params[0])
{
char* action_cb = (char*)params[0];
iupAttribSetStr(ih, "ACTION_CB", action_cb);
}
/* free the data allocated by IupCanvas */
free(ih->data);
ih->data = iupALLOCCTRLDATA();
/* change the IupCanvas default values */
iupAttribSet(ih, "SCROLLBAR", "YES");
iupAttribSet(ih, "BORDER", "NO");
iupAttribSet(ih, "CURSOR", "IupMatrixCrossCursor");
/* IupCanvas callbacks */
IupSetCallback(ih, "ACTION", (Icallback)iMatrixRedraw_CB);
IupSetCallback(ih, "RESIZE_CB", (Icallback)iMatrixResize_CB);
IupSetCallback(ih, "FOCUS_CB", (Icallback)iMatrixFocus_CB);
IupSetCallback(ih, "BUTTON_CB", (Icallback)iupMatrixMouseButton_CB);
IupSetCallback(ih, "MOTION_CB", (Icallback)iupMatrixMouseMove_CB);
IupSetCallback(ih, "KEYPRESS_CB", (Icallback)iupMatrixKeyPress_CB);
IupSetCallback(ih, "SCROLL_CB", (Icallback)iupMatrixScroll_CB);
/* Create the edit fields */
iupMatrixEditCreate(ih);
/* defaults that are non zero */
ih->data->datah = ih->data->texth;
ih->data->mark_continuous = 1;
ih->data->columns.num = 1;
ih->data->lines.num = 1;
ih->data->columns.num_noscroll = 1;
ih->data->lines.num_noscroll = 1;
ih->data->noscroll_as_title = 0;
ih->data->need_calcsize = 1;
ih->data->need_redraw = 1;
ih->data->lines.first = 1;
ih->data->columns.first = 1;
ih->data->lines.focus_cell = 1;
ih->data->columns.focus_cell = 1;
ih->data->mark_lin1 = -1;
ih->data->mark_col1 = -1;
ih->data->mark_lin2 = -1;
ih->data->mark_col2 = -1;
ih->data->edit_hide_onfocus = 1;
return IUP_NOERROR;
}
static void iMatrixDestroyMethod(Ihandle* ih)
{
iupFlatScrollBarRelease(ih);
}
static int iMatrixMapMethod(Ihandle* ih)
{
#ifdef USE_OLD_CDIUP
ih->data->cd_canvas = cdCreateCanvas(CD_IUPDBUFFER, ih);
#else
ih->data->cd_canvas = cdCreateCanvas(CD_IUPDRAW, ih);
#endif
if (!ih->data->cd_canvas)
return IUP_ERROR;
if (IupGetCallback(ih, "VALUE_CB"))
{
ih->data->callback_mode = 1;
if (!IupGetCallback(ih, "VALUE_EDIT_CB"))
iupAttribSet(ih, "READONLY", "YES");
}
iupMatrixMemAlloc(ih);
IupSetCallback(ih, "_IUP_XY2POS_CB", (Icallback)iMatrixConvertXYToPos);
IupSetCallback(ih, "_IUP_POS2LINCOL_CB", (Icallback)iMatrixConvertPosToLinCol);
IupSetCallback(ih, "_IUP_LINCOL2POS_CB", (Icallback)iMatrixConvertLinColToPos);
return IUP_NOERROR;
}
static void iMatrixUnMapMethod(Ihandle* ih)
{
if (ih->data->cd_canvas)
{
iupAttribSetStr(ih, "_IUPCD_LASTFONT", NULL); /* Cache in IupCdSetFont */
cdKillCanvas(ih->data->cd_canvas);
ih->data->cd_canvas = NULL;
}
iupMatrixMemRelease(ih);
}
static int iMatrixGetNaturalWidth(Ihandle* ih, int *full_width)
{
int width = 0, visible_num, col;
/* get only from the hash table or the default value, do NOT get from the actual number of visible columns */
visible_num = iupAttribGetInt(ih, "NUMCOL_VISIBLE") + 1; /* include the title column */
if (iupAttribGetInt(ih, "NUMCOL_VISIBLE_LAST"))
{
int start = ih->data->columns.num - (visible_num - 1);
if (start < 1) start = 1; /* title is computed apart */
width += iupMatrixGetColumnWidth(ih, 0, 1); /* always compute title */
for (col = start; col < ih->data->columns.num; col++)
width += iupMatrixGetColumnWidth(ih, col, 1);
if (ih->data->limit_expand)
{
*full_width = width;
for (col = 1; col < start; col++)
(*full_width) += iupMatrixGetColumnWidth(ih, col, 1);
}
}
else
{
for (col = 0; col < visible_num; col++) /* visible_num can be > numcol */
width += iupMatrixGetColumnWidth(ih, col, 1);
if (ih->data->limit_expand)
{
*full_width = width;
for (col = visible_num; col < ih->data->columns.num; col++)
(*full_width) += iupMatrixGetColumnWidth(ih, col, 1);
}
}
return width;
}
static int iMatrixGetNaturalHeight(Ihandle* ih, int *full_height)
{
int height = 0, visible_num, lin;
visible_num = iupAttribGetInt(ih, "NUMLIN_VISIBLE") + 1; /* add the title line */
if (iupAttribGetInt(ih, "NUMLIN_VISIBLE_LAST"))
{
int start = ih->data->lines.num - (visible_num - 1);
if (start < 1) start = 1; /* title is computed apart */
height += iupMatrixGetLineHeight(ih, 0, 1); /* always compute title */
for (lin = start; lin < ih->data->lines.num; lin++)
height += iupMatrixGetLineHeight(ih, lin, 1);
if (ih->data->limit_expand)
{
*full_height = height;
for (lin = 1; lin < start; lin++)
(*full_height) += iupMatrixGetLineHeight(ih, lin, 1);
}
}
else
{
for (lin = 0; lin < visible_num; lin++) /* visible_num can be > numlin */
height += iupMatrixGetLineHeight(ih, lin, 1);
if (ih->data->limit_expand)
{
*full_height = height;
for (lin = visible_num; lin < ih->data->lines.num; lin++)
(*full_height) += iupMatrixGetLineHeight(ih, lin, 1);
}
}
return height;
}
int iupMatrixGetWidth(Ihandle* ih)
{
int w = ih->data->w;
if (iupFlatScrollBarGet(ih) & IUP_SB_VERT && !iupAttribGetBoolean(ih, "YHIDDEN"))
{
if (!iupAttribGetBoolean(ih, "SHOWFLOATING"))
{
int sb_size = iupAttribGetInt(ih, "SCROLLBARSIZE");
w -= sb_size;
}
}
return w;
}
int iupMatrixGetHeight(Ihandle* ih)
{
int h = ih->data->h;
if (iupFlatScrollBarGet(ih) & IUP_SB_HORIZ && !iupAttribGetBoolean(ih, "XHIDDEN"))
{
if (!iupAttribGetBoolean(ih, "SHOWFLOATING"))
{
int sb_size = iupAttribGetInt(ih, "SCROLLBARSIZE");
h -= sb_size;
}
}
return h;
}
int iupMatrixGetScrollbar(Ihandle* ih)
{
int flat = iupFlatScrollBarGet(ih);
if (flat != IUP_SB_NONE)
return flat;
else
{
if (!ih->handle)
ih->data->canvas.sb = iupBaseGetScrollbar(ih);
return ih->data->canvas.sb;
}
}
int iupMatrixGetScrollbarSize(Ihandle* ih)
{
if (iupFlatScrollBarGet(ih) != IUP_SB_NONE)
{
if (iupAttribGetBoolean(ih, "SHOWFLOATING"))
return 0;
else
return iupAttribGetInt(ih, "SCROLLBARSIZE");
}
else
return iupdrvGetScrollbarSize();
}
static void iMatrixComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand)
{
int sb, sb_w = 0, sb_h = 0, full_width = 0, full_height = 0, border = 0;
(void)children_expand; /* unset if not name container */
sb = iupMatrixGetScrollbar(ih);
/* add scrollbar */
if (sb)
{
int sb_size = iupMatrixGetScrollbarSize(ih);
if (sb & IUP_SB_HORIZ)
sb_h += sb_size; /* sb horizontal affects vertical size */
if (sb & IUP_SB_VERT)
sb_w += sb_size; /* sb vertical affects horizontal size */
}
if (iupAttribGetBoolean(ih, "BORDER"))
border = 1;
*w = iMatrixGetNaturalWidth(ih, &full_width);
*h = iMatrixGetNaturalHeight(ih, &full_height);
if (ih->data->limit_expand)
{
/* the maximum size does NOT include the scrollbars when AUTOHIDE=Yes */
if (!iupAttribGetBoolean(ih, "YAUTOHIDE"))
full_width += sb_w;
else if (*w == full_width) /* all columns can be visible, */
sb_w = 0; /* so do NOT reserve space for the vertical scrollbar */
if (!iupAttribGetBoolean(ih, "XAUTOHIDE"))
full_height += sb_h;
else if (*h == full_height) /* all lines can be visible, */
sb_h = 0; /* so do NOT reserve space for the horizontal scrollbar */
full_width += 2 * border;
full_height += 2 * border;
IupSetfAttribute(ih, "MAXSIZE", "%dx%d", full_width, full_height);
}
*w += sb_w + 2 * border;
*h += sb_h + 2 * border;
}
static void iMatrixSetChildrenCurrentSizeMethod(Ihandle* ih, int shrink)
{
if (iupFlatScrollBarGet(ih) != IUP_SB_NONE)
iupFlatScrollBarSetChildrenCurrentSize(ih, shrink);
}
static void iMatrixSetChildrenPositionMethod(Ihandle* ih, int x, int y)
{
if (iupFlatScrollBarGet(ih) != IUP_SB_NONE)
iupFlatScrollBarSetChildrenPosition(ih);
(void)x;
(void)y;
}
static void iMatrixCreateCursor(void)
{
Ihandle *imgcursor;
unsigned char matrx_img_cur_excel[15 * 15] =
{
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1,
1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
imgcursor = IupImage(15, 15, matrx_img_cur_excel);
IupSetAttribute(imgcursor, "0", "BGCOLOR");
IupSetAttribute(imgcursor, "1", "0 0 0");
IupSetAttribute(imgcursor, "2", "255 255 255");
IupSetAttribute(imgcursor, "HOTSPOT", "7:7"); /* Centered Hotspot */
IupSetHandle("IupMatrixCrossCursor", imgcursor);
IupSetHandle("matrx_img_cur_excel", imgcursor); /* for backward compatibility */
}
Iclass* iupMatrixNewClass(void)
{
Iclass* ic = iupClassNew(iupRegisterFindClass("canvas"));
ic->name = "matrix";
ic->format = "a"; /* one ACTION_CB callback name */
ic->format_attr = "ACTION_CB";
ic->nativetype = IUP_TYPECANVAS;
ic->childtype = IUP_CHILDNONE;
ic->is_interactive = 1;
ic->has_attrib_id = 2; /* has attributes with IDs that must be parsed */
/* Class functions */
ic->New = iupMatrixNewClass;
ic->Create = iMatrixCreateMethod;
ic->Destroy = iMatrixDestroyMethod;
ic->Map = iMatrixMapMethod;
ic->UnMap = iMatrixUnMapMethod;
ic->ComputeNaturalSize = iMatrixComputeNaturalSizeMethod;
ic->SetChildrenCurrentSize = iMatrixSetChildrenCurrentSizeMethod;
ic->SetChildrenPosition = iMatrixSetChildrenPositionMethod;
/* Do not need to set base attributes because they are inherited from IupCanvas */
/* IupMatrix Callbacks */
/* --- Interaction --- */
iupClassRegisterCallback(ic, "ACTION_CB", "iiiis");
iupClassRegisterCallback(ic, "CLICK_CB", "iis");
iupClassRegisterCallback(ic, "RELEASE_CB", "iis");
iupClassRegisterCallback(ic, "MOUSEMOVE_CB", "ii");
iupClassRegisterCallback(ic, "ENTERITEM_CB", "ii");
iupClassRegisterCallback(ic, "LEAVEITEM_CB", "ii");
iupClassRegisterCallback(ic, "SCROLLTOP_CB", "ii");
iupClassRegisterCallback(ic, "COLRESIZE_CB", "i");
iupClassRegisterCallback(ic, "TOGGLEVALUE_CB", "iii");
iupClassRegisterCallback(ic, "RESIZEMATRIX_CB", "ii");
iupClassRegisterCallback(ic, "EDITCLICK_CB", "iis");
iupClassRegisterCallback(ic, "EDITRELEASE_CB", "iis");
iupClassRegisterCallback(ic, "EDITMOUSEMOVE_CB", "ii");
/* --- Drawing --- */
iupClassRegisterCallback(ic, "BGCOLOR_CB", "iiIII");
iupClassRegisterCallback(ic, "FGCOLOR_CB", "iiIII");
iupClassRegisterCallback(ic, "FONT_CB", "ii=s");
iupClassRegisterCallback(ic, "DRAW_CB", "iiiiiiC");
iupClassRegisterCallback(ic, "DROPCHECK_CB", "ii");
iupClassRegisterCallback(ic, "TYPE_CB", "ii=s");
iupClassRegisterCallback(ic, "TRANSLATEVALUE_CB", "iis=s");
/* --- Editing --- */
iupClassRegisterCallback(ic, "MENUDROP_CB", "nii");
iupClassRegisterCallback(ic, "DROP_CB", "nii");
iupClassRegisterCallback(ic, "DROPSELECT_CB", "iinsii");
iupClassRegisterCallback(ic, "EDITION_CB", "iii");
iupClassRegisterCallback(ic, "VALUECHANGED_CB", "");
/* --- Callback Mode --- */
iupClassRegisterCallback(ic, "VALUE_CB", "ii=s");
iupClassRegisterCallback(ic, "VALUE_EDIT_CB", "iis");
iupClassRegisterCallback(ic, "MARK_CB", "ii");
iupClassRegisterCallback(ic, "MARKEDIT_CB", "iii");
/* Overwrite IupCanvas Attributes */
iupClassRegisterAttribute(ic, "ACTIVE", iupBaseGetActiveAttrib, iMatrixSetActiveAttrib, IUPAF_SAMEASSYSTEM, "YES", IUPAF_DEFAULT);
iupClassRegisterAttribute(ic, "VISIBLE", iupBaseGetVisibleAttrib, iMatrixSetVisibleAttrib, "YES", "NO", IUPAF_NO_SAVE | IUPAF_DEFAULT);
/* Change the Canvas default */
iupClassRegisterReplaceAttribDef(ic, "CURSOR", "IupMatrixCrossCursor", "ARROW");
iupClassRegisterReplaceAttribDef(ic, "BORDER", "NO", "YES");
iupClassRegisterReplaceAttribDef(ic, "SCROLLBAR", "YES", NULL);
/* IupMatrix Attributes - CELL */
iupClassRegisterAttributeId2(ic, "IDVALUE", iMatrixGetIdValueAttrib, iMatrixSetIdValueAttrib, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FOCUSCELL", iMatrixGetFocusCellAttrib, iMatrixSetFocusCellAttrib, IUPAF_SAMEASSYSTEM, "1:1", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT); /* can be NOT mapped */
/*OLD*/iupClassRegisterAttribute(ic, "FOCUS_CELL", iMatrixGetFocusCellAttrib, iMatrixSetFocusCellAttrib, IUPAF_SAMEASSYSTEM, "1:1", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT); /* can be NOT mapped */
iupClassRegisterAttribute(ic, "VALUE", iMatrixGetValueAttrib, iMatrixSetValueAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NO_DEFAULTVALUE | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "BGCOLOR", iMatrixGetBgColorAttrib, iMatrixSetBgColorAttrib, IUPAF_NOT_MAPPED);
iupClassRegisterAttributeId2(ic, "FGCOLOR", NULL, iMatrixSetFgColorAttrib, IUPAF_NOT_MAPPED);
iupClassRegisterAttributeId2(ic, "TYPE", NULL, iMatrixSetTypeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FONT", iMatrixGetFontAttrib, iMatrixSetFontAttrib, IUPAF_NOT_MAPPED);
iupClassRegisterAttributeId2(ic, "FONTSTYLE", iMatrixGetFontStyleAttrib, iMatrixSetFontStyleAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FONTSIZE", iMatrixGetFontSizeAttrib, iMatrixSetFontSizeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FRAMEHORIZCOLOR", NULL, iMatrixSetFrameHorizColorAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FRAMEVERTCOLOR", NULL, iMatrixSetFrameVertColorAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FRAMETITLEHORIZCOLOR", NULL, iMatrixSetFrameHorizColorAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "FRAMETITLEVERTCOLOR", NULL, iMatrixSetFrameVertColorAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FRAMECOLOR", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, IUPAF_SAMEASSYSTEM, "100 100 100", IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FRAMETITLEHIGHLIGHT", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, IUPAF_SAMEASSYSTEM, "Yes", IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FRAMEBORDER", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLOFFSET", iMatrixGetCellOffsetAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLSIZE", iMatrixGetCellSizeAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLBGCOLOR", iMatrixGetCellBgColorAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLFGCOLOR", iMatrixGetCellFgColorAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLFONT", iMatrixGetCellFontAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLTYPE", iMatrixGetCellTypeAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLFRAMEHORIZCOLOR", iMatrixGetCellFrameHorizColorAttrib, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLFRAMEVERTCOLOR", iMatrixGetCellFrameVertColorAttrib, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELLALIGNMENT", iMatrixGetCellAlignmentAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CELL", iMatrixGetCellAttrib, NULL, IUPAF_READONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "TOGGLEVALUE", NULL, (IattribSetId2Func)iMatrixSetNeedRedraw, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "ALIGN", NULL, (IattribSetId2Func)iMatrixSetNeedRedraw, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "TOGGLECENTERED", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "TOGGLEIMAGEON", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "TOGGLEIMAGEOFF", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FLAT", iMatrixGetFlatAttrib, iMatrixSetFlatAttrib, NULL, NULL, IUPAF_NOT_MAPPED);
iupClassRegisterAttributeId2(ic, "MERGE", iMatrixGetMergeAttrib, iMatrixSetMergeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MERGESPLIT", NULL, iMatrixSetMergeSplitAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "MERGED", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT); /* internal, returns the merged range number */
iupClassRegisterAttributeId2(ic, "MERGEDSTART", iMatrixGetMergedStartAttrib, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "MERGEDEND", iMatrixGetMergedEndAttrib, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
/* IupMatrix Attributes - COLUMN */
iupClassRegisterAttributeId(ic, "ALIGNMENT", iMatrixGetAlignmentAttrib, (IattribSetIdFunc)iMatrixSetNeedRedraw, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ALIGNMENTLIN0", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, IUPAF_SAMEASSYSTEM, "ACENTER", IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "LINEALIGNMENT", NULL, (IattribSetIdFunc)iMatrixSetNeedRedraw, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "SORTSIGN", NULL, (IattribSetIdFunc)iMatrixSetNeedRedraw, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SORTIMAGEDOWN", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SORTIMAGEUP", NULL, (IattribSetFunc)iMatrixSetNeedRedraw, NULL, NULL, IUPAF_IHANDLENAME | IUPAF_NO_INHERIT);
/* IupMatrix Attributes - SIZE */
iupClassRegisterAttribute(ic, "COUNT", iMatrixGetCountAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMLIN", iMatrixGetNumLinAttrib, iupMatrixSetNumLinAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMCOL", iMatrixGetNumColAttrib, iupMatrixSetNumColAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMLIN_NOSCROLL", iMatrixGetNumLinNoScrollAttrib, iMatrixSetNumLinNoScrollAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMCOL_NOSCROLL", iMatrixGetNumColNoScrollAttrib, iMatrixSetNumColNoScrollAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NOSCROLLASTITLE", iMatrixGetNoScrollAsTitleAttrib, iMatrixSetNoScrollAsTitleAttrib, IUPAF_SAMEASSYSTEM, "NO", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMLIN_VISIBLE", iMatrixGetNumLinVisibleAttrib, NULL, IUPAF_SAMEASSYSTEM, "3", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMCOL_VISIBLE", iMatrixGetNumColVisibleAttrib, NULL, IUPAF_SAMEASSYSTEM, "4", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMLIN_VISIBLE_LAST", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "NUMCOL_VISIBLE_LAST", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "WIDTHDEF", NULL, NULL, IUPAF_SAMEASSYSTEM, "80", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HEIGHTDEF", NULL, NULL, IUPAF_SAMEASSYSTEM, "8", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "WIDTH", iMatrixGetWidthAttrib, iMatrixSetSizeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "HEIGHT", iMatrixGetHeightAttrib, iMatrixSetSizeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "RASTERWIDTH", iMatrixGetRasterWidthAttrib, iMatrixSetSizeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "RASTERHEIGHT", iMatrixGetRasterHeightAttrib, iMatrixSetSizeAttrib, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FITTOSIZE", NULL, iMatrixSetFitToSizeAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "FITTOTEXT", NULL, iMatrixSetFitToTextAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "FITMAXHEIGHT", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "FITMAXWIDTH", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "COPYLIN", NULL, iMatrixSetCopyLinAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "COPYCOL", NULL, iMatrixSetCopyColAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MOVELIN", NULL, iMatrixSetMoveLinAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MOVECOL", NULL, iMatrixSetMoveColAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MINCOLWIDTH", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MINCOLWIDTHDEF", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
/* IupMatrix Attributes - MARK */
iupClassRegisterAttribute(ic, "MARKED", iupMatrixGetMarkedAttrib, iupMatrixSetMarkedAttrib, NULL, NULL, IUPAF_NO_INHERIT); /* noticed that for MARKED the matrix must be mapped */
iupClassRegisterAttributeId2(ic, "MARK", iupMatrixGetMarkAttrib, iupMatrixSetMarkAttrib, IUPAF_NO_SAVE | IUPAF_NO_INHERIT); /* noticed that for MARK the matrix must be mapped */
/*OLD*/iupClassRegisterAttribute(ic, "MARK_MODE", iMatrixGetMarkModeAttrib, iMatrixSetMarkModeAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MARKMODE", iMatrixGetMarkModeAttrib, iMatrixSetMarkModeAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "AREA", iMatrixGetMarkAreaAttrib, iMatrixSetMarkAreaAttrib, IUPAF_SAMEASSYSTEM, "CONTINUOUS", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MARKAREA", iMatrixGetMarkAreaAttrib, iMatrixSetMarkAreaAttrib, IUPAF_SAMEASSYSTEM, "CONTINUOUS", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MULTIPLE", iMatrixGetMarkMultipleAttrib, iMatrixSetMarkMultipleAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MARKMULTIPLE", iMatrixGetMarkMultipleAttrib, iMatrixSetMarkMultipleAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MARKATTITLE", NULL, NULL, IUPAF_SAMEASSYSTEM, "Yes", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HLCOLOR", NULL, NULL, IUPAF_SAMEASSYSTEM, "TXTHLCOLOR", IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HLCOLORALPHA", NULL, NULL, IUPAF_SAMEASSYSTEM, "128", IUPAF_NO_INHERIT);
/* IupMatrix Attributes - ACTION (only mapped) */
iupClassRegisterAttribute(ic, "ADDLIN", NULL, iupMatrixSetAddLinAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT); /* allowing these methods to be called before map will avoid its storage in the hash table */
iupClassRegisterAttribute(ic, "DELLIN", NULL, iupMatrixSetDelLinAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ADDCOL", NULL, iupMatrixSetAddColAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "DELCOL", NULL, iupMatrixSetDelColAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ORIGIN", iMatrixGetOriginAttrib, iMatrixSetOriginAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "ORIGINOFFSET", iMatrixGetOriginOffsetAttrib, NULL, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SHOW", NULL, iMatrixSetShowAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
/*OLD*/iupClassRegisterAttribute(ic, "EDIT_MODE", iMatrixGetEditModeAttrib, iMatrixSetEditModeAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITMODE", iMatrixGetEditModeAttrib, iMatrixSetEditModeAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITING", iMatrixGetEditingAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITNEXT", iMatrixGetEditNextAttrib, iMatrixSetEditNextAttrib, IUPAF_SAMEASSYSTEM, "LIN", IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "REDRAW", NULL, iupMatrixDrawSetRedrawAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CLEARVALUE", NULL, iMatrixSetClearValueAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId2(ic, "CLEARATTRIB", NULL, iMatrixSetClearAttribAttrib, IUPAF_WRITEONLY | IUPAF_NO_INHERIT);
/* IupMatrix Attributes - EDITION */
iupClassRegisterAttribute(ic, "CARET", iMatrixGetCaretAttrib, iMatrixSetCaretAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "INSERT", NULL, iMatrixSetInsertAttrib, NULL, NULL, IUPAF_WRITEONLY | IUPAF_NO_SAVE | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SELECTION", iMatrixGetSelectionAttrib, iMatrixSetSelectionAttrib, NULL, NULL, IUPAF_NO_SAVE | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "MULTILINE", iMatrixGetMultilineAttrib, iMatrixSetMultilineAttrib, NULL, NULL, IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MASK", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MASKINT", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MASKFLOAT", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MASKNOEMPTY", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttributeId(ic, "MASKCASEI", NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITHIDEONFOCUS", iMatrixGetEditHideOnFocusAttrib, iMatrixSetEditHideOnFocusAttrib, IUPAF_SAMEASSYSTEM, "Yes", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITCELL", iMatrixGetEditCellAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITTEXT", iMatrixGetEditTextAttrib, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "EDITVALUE", NULL, NULL, NULL, NULL, IUPAF_READONLY | IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
/* IupMatrix Attributes - GENERAL */
iupClassRegisterAttribute(ic, "USETITLESIZE", iMatrixGetUseTitleSizeAttrib, iMatrixSetUseTitleSizeAttrib, IUPAF_SAMEASSYSTEM, "NO", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "LIMITEXPAND", iMatrixGetLimitExpandAttrib, iMatrixSetLimitExpandAttrib, IUPAF_SAMEASSYSTEM, "NO", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HIDDENTEXTMARKS", iMatrixGetHiddenTextMarksAttrib, iMatrixSetHiddenTextMarksAttrib, IUPAF_SAMEASSYSTEM, "NO", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "READONLY", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "RESIZEMATRIX", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "RESIZEMATRIXCOLOR", NULL, NULL, IUPAF_SAMEASSYSTEM, "102 102 102", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "RESIZEDRAG", iMatrixGetResizeDragAttrib, iMatrixSetResizeDragAttrib, IUPAF_SAMEASSYSTEM, "YES", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "HIDEFOCUS", NULL, NULL, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "SHOWFILLVALUE", iMatrixGetShowFillValueAttrib, iMatrixSetShowFillValueAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupClassRegisterAttribute(ic, "TYPECOLORINACTIVE", NULL, NULL, IUPAF_SAMEASSYSTEM, "Yes", IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
/* Flat Scrollbar */
iupFlatScrollBarRegister(ic);
iupClassRegisterAttribute(ic, "FLATSCROLLBAR", NULL, iMatrixSetFlatScrollbarAttrib, NULL, NULL, IUPAF_NOT_MAPPED | IUPAF_NO_INHERIT);
iupMatrixRegisterEx(ic);
if (!IupGetHandle("IupMatrixCrossCursor"))
iMatrixCreateCursor();
/* Change the Canvas flags */
iupClassRegisterReplaceAttribFlags(ic, "DX", IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
iupClassRegisterReplaceAttribFlags(ic, "DY", IUPAF_NO_SAVE | IUPAF_NO_INHERIT);
return ic;
}
/*****************************************************************************************************/
Ihandle* IupMatrix(const char* action)
{
void *params[2];
params[0] = (void*)action;
params[1] = NULL;
return IupCreatev("matrix", params);
}