iup-stack/iup/srccontrols/matrixex/iupmatex_sort.c

359 lines
11 KiB
C
Raw Permalink Normal View History

2023-02-20 16:44:45 +00:00
/** \file
* \brief IupMatrix Expansion Library.
*
* See Copyright Notice in "iup.h"
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include "iup.h"
#include "iupcbs.h"
#include "iupcontrols.h"
#include "iup_array.h"
#include "iup_object.h"
#include "iup_attrib.h"
#include "iup_str.h"
#include "iup_matrixex.h"
static void iMatrixExSortUpdateSelection(ImatExData* matex_data, int sort_col, int lin1, int lin2)
{
char* markmode = IupGetAttribute(matex_data->ih, "MARKMODE");
if (iupStrEqualNoCase(markmode, "COL") || iupStrEqualNoCase(markmode, "LINCOL"))
{
int col, num_col = IupGetInt(matex_data->ih, "NUMCOL");
char* marked = malloc(num_col+2);
marked[0] = 'C';
for(col = 1; col <= num_col; ++col)
marked[col] = '0';
marked[col] = 0;
marked[sort_col] = '1';
IupSetStrAttribute(matex_data->ih, "MARKED", marked);
IupSetAttribute(matex_data->ih, "REDRAW", "ALL");
free(marked);
}
else if (iupStrEqualNoCase(markmode, "CELL"))
{
int num_col = IupGetInt(matex_data->ih, "NUMCOL");
int num_lin = IupGetInt(matex_data->ih, "NUMLIN");
int pos, lin, col, count = num_lin*num_col; /* marked does not include titles */
char* marked = malloc(count+1);
for(pos = 0; pos < count; pos++)
{
lin = (pos / num_col) + 1;
col = (pos % num_col) + 1;
if (col == sort_col && lin >= lin1 && lin <= lin2)
marked[pos] = '1';
else
marked[pos] = '0';
}
marked[pos] = 0;
IupSetStrAttribute(matex_data->ih, "MARKED", marked);
IupSetAttribute(matex_data->ih, "REDRAW", "ALL");
free(marked);
}
}
static int iMatrixExSortDialogSort_CB(Ihandle* ih_button)
{
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_button, "MATRIX_EX_DATA");
Ihandle* ih_matrix = IupGetDialogChild(ih_button, "INTERVAL");
int col = IupGetIntId2(ih_matrix, "", 1, 1);
int casesensitive = IupGetInt(IupGetDialogChild(ih_button, "CASESENSITIVE"), "VALUE");
int ascending = IupGetInt(IupGetDialogChild(ih_button, "ASCENDING"), "VALUE");
iupAttribSet(matex_data->ih, "SORTCOLUMNCASESENSITIVE", casesensitive? "Yes": "No");
iupAttribSet(matex_data->ih, "SORTCOLUMNORDER", ascending? "ASCENDING": "DESCENDING");
if (IupGetIntId2(ih_matrix, "TOGGLEVALUE", 2, 1))
IupSetAttributeId(matex_data->ih, "SORTCOLUMN", col, "ALL");
else
{
int lin1 = IupGetIntId2(ih_matrix, "", 3, 1);
int lin2 = IupGetIntId2(ih_matrix, "", 4, 1);
IupSetfAttributeId(matex_data->ih, "SORTCOLUMN", col, "%d-%d", lin1, lin2);
}
return IUP_DEFAULT;
}
static int iMatrixExSortDialogReset_CB(Ihandle* ih_button)
{
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_button, "MATRIX_EX_DATA");
IupSetAttribute(matex_data->ih, "SORTCOLUMN", "RESET");
return IUP_DEFAULT;
}
static int iMatrixExSortDialogInvert_CB(Ihandle* ih_button)
{
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_button, "MATRIX_EX_DATA");
IupSetAttribute(matex_data->ih, "SORTCOLUMN", "INVERT");
return IUP_DEFAULT;
}
static int iMatrixExSortDialogClose_CB(Ihandle* ih_button)
{
(void)ih_button;
return IUP_CLOSE;
}
static int iMatrixExSortToggleValue_CB(Ihandle *ih_matrix, int lin, int col, int status)
{
if (lin!=2 || col!=1)
return IUP_DEFAULT;
if (status) /* All Lines? disable lin1 && lin2 */
{
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_matrix, "MATRIX_EX_DATA");
int num_lin = IupGetInt(matex_data->ih, "NUMLIN");
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 3, 1, "220 220 220");
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 4, 1, "220 220 220");
IupSetIntId2(ih_matrix, "", 3, 1, 1);
IupSetIntId2(ih_matrix, "", 4, 1, num_lin);
iMatrixExSortUpdateSelection(matex_data, col, 1, num_lin);
}
else
{
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 3, 1, NULL);
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 4, 1, NULL);
}
IupSetAttribute(ih_matrix, "REDRAW", "ALL");
return IUP_DEFAULT;
}
static int iMatrixExSortDropCheck_CB(Ihandle *ih_matrix, int lin, int col)
{
(void)ih_matrix;
if (lin==2 && col==1)
return IUP_CONTINUE;
return IUP_IGNORE;
}
static int iMatrixExSortEdition_CB(Ihandle *ih_matrix, int lin, int col, int mode, int update)
{
if (mode==1)
{
if (lin==2 && col==1)
return IUP_IGNORE;
else if ((lin==3 && col==1) ||
(lin==4 && col==1))
{
if (IupGetIntId2(ih_matrix, "TOGGLEVALUE", 2, 1))
return IUP_IGNORE;
}
}
else /* mode==0 */
{
if (lin==1 && col==1)
{
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_matrix, "MATRIX_EX_DATA");
int num_col = IupGetInt(matex_data->ih, "NUMCOL");
col = IupGetInt(ih_matrix, "VALUE");
if (col < 1 || col > num_col)
return IUP_IGNORE;
else
{
int lin1 = IupGetIntId2(ih_matrix, "", 3, 1);
int lin2 = IupGetIntId2(ih_matrix, "", 4, 1);
iMatrixExSortUpdateSelection(matex_data, col, lin1, lin2);
}
}
else if ((lin==3 && col==1) ||
(lin==4 && col==1))
{
int lin1, lin2;
ImatExData* matex_data = (ImatExData*)IupGetAttribute(ih_matrix, "MATRIX_EX_DATA");
int num_lin = IupGetInt(matex_data->ih, "NUMLIN");
if (lin==3)
lin1 = IupGetInt(ih_matrix, "VALUE");
else
lin1 = IupGetIntId2(ih_matrix, "", 3, 1);
if (lin==4)
lin2 = IupGetInt(ih_matrix, "VALUE");
else
lin2 = IupGetIntId2(ih_matrix, "", 4, 1);
if (lin1 < 1 || lin1 > lin2 || lin2 > num_lin)
return IUP_IGNORE;
else
{
col = IupGetIntId2(ih_matrix, "", 1, 1);
iMatrixExSortUpdateSelection(matex_data, col, lin1, lin2);
}
}
}
(void)update;
return IUP_DEFAULT;
}
static Ihandle* iMatrixExSortCreateDialog(ImatExData* matex_data)
{
Ihandle *ih_matrix, *matrix_box, *options_box, *reset, *sort, *invert,
*dlg, *close, *dlg_box, *button_box, *parent;
ih_matrix = IupSetAttributes(IupMatrix(NULL),
"NUMLIN=4, "
"NUMCOL=1, "
"NUMLIN_VISIBLE=4, "
"NUMCOL_VISIBLE=1, "
"ALIGNMENT0=ALEFT, "
"ALIGNMENT1=ARIGHT, "
"SCROLLBAR=NO, "
"USETITLESIZE=Yes, "
"NAME=INTERVAL, "
"MASK1:1=/d+, "
"MASK3:1=/d+, "
"MASK4:1=/d+, "
"HEIGHT0=0, "
"WIDTH1=40");
IupSetStrAttributeId2(ih_matrix, "", 1, 0, "_@IUP_COLUMN");
IupSetStrAttributeId2(ih_matrix, "", 2, 0, "_@IUP_ALLLINES");
IupSetStrAttributeId2(ih_matrix, "", 3, 0, "_@IUP_FIRSTLINE");
IupSetStrAttributeId2(ih_matrix, "", 4, 0, "_@IUP_LASTLINE");
IupSetCallback(ih_matrix, "TOGGLEVALUE_CB", (Icallback)iMatrixExSortToggleValue_CB);
IupSetCallback(ih_matrix, "DROPCHECK_CB", (Icallback)iMatrixExSortDropCheck_CB);
IupSetCallback(ih_matrix, "EDITION_CB", (Icallback)iMatrixExSortEdition_CB);
matrix_box = IupVbox(
ih_matrix,
NULL);
options_box = IupVbox(
IupSetAttributes(IupFrame(IupRadio(IupVbox(
IupSetAttributes(IupToggle("_@IUP_ASCENDING", NULL), "NAME=ASCENDING"),
IupSetAttributes(IupToggle("_@IUP_DESCENDING", NULL), "NAME=DESCENDING"),
NULL))), "TITLE=_@IUP_ORDER, GAP=5, MARGIN=5x5"),
IupSetAttributes(IupToggle("_@IUP_CASESENSITIVE", NULL), "NAME=CASESENSITIVE"),
NULL);
IupSetAttribute(options_box,"GAP","10");
sort = IupButton("_@IUP_SORT", NULL);
IupSetStrAttribute(sort, "PADDING", IupGetGlobal("DEFAULTBUTTONPADDING"));
IupSetCallback(sort, "ACTION", (Icallback)iMatrixExSortDialogSort_CB);
invert = IupButton("_@IUP_INVERT", NULL);
IupSetStrAttribute(invert, "PADDING", IupGetGlobal("DEFAULTBUTTONPADDING"));
IupSetCallback(invert, "ACTION", (Icallback)iMatrixExSortDialogInvert_CB);
IupSetStrAttribute(invert,"TIP" ,"_@IUP_INVERT_TIP");
reset = IupButton("_@IUP_RESET", NULL);
IupSetStrAttribute(reset, "PADDING", IupGetGlobal("DEFAULTBUTTONPADDING"));
IupSetCallback(reset, "ACTION", (Icallback)iMatrixExSortDialogReset_CB);
close = IupButton("_@IUP_CLOSE", NULL);
IupSetStrAttribute(close, "PADDING", IupGetGlobal("DEFAULTBUTTONPADDING"));
IupSetCallback(close, "ACTION", (Icallback)iMatrixExSortDialogClose_CB);
button_box = IupHbox(
IupFill(),
sort,
invert,
reset,
close,
NULL);
IupSetAttribute(button_box,"MARGIN","0x0");
IupSetAttribute(button_box, "NORMALIZESIZE", "HORIZONTAL");
IupSetAttribute(button_box,"GAP","5");
dlg_box = IupVbox(
IupSetAttributes(IupHbox(
matrix_box,
options_box,
NULL), "MARGIN=0x0, GAP=15"),
button_box,
NULL);
IupSetAttribute(dlg_box,"MARGIN","10x10");
IupSetAttribute(dlg_box,"GAP","15");
dlg = IupDialog(dlg_box);
parent = IupGetDialog(matex_data->ih);
IupSetStrAttribute(dlg,"TITLE","_@IUP_SORTBYCOLUMN");
IupSetAttribute(dlg,"MINBOX","NO");
IupSetAttribute(dlg,"MAXBOX","NO");
IupSetAttribute(dlg,"BORDER","NO");
IupSetAttribute(dlg,"RESIZE","NO");
IupSetAttribute(dlg, "TOOLBOX","YES");
IupSetAttributeHandle(dlg,"DEFAULTENTER", sort);
IupSetAttributeHandle(dlg,"DEFAULTESC", close);
IupSetAttributeHandle(dlg,"PARENTDIALOG", parent);
IupSetAttribute(dlg, "MATRIX_EX_DATA", (char*)matex_data); /* do not use "_IUP_MATEX_DATA" to enable inheritance */
if (IupGetAttribute(parent, "ICON"))
IupSetStrAttribute(dlg,"ICON", IupGetAttribute(parent, "ICON"));
else
IupSetStrAttribute(dlg,"ICON", IupGetGlobal("ICON"));
return dlg;
}
void iupMatrixExSortShowDialog(ImatExData* matex_data)
{
int x, y, col, lin1, lin2, num_lin;
Ihandle* ih_matrix;
Ihandle* dlg_sort = iMatrixExSortCreateDialog(matex_data);
IupSetStrAttribute(IupGetDialogChild(dlg_sort, "CASESENSITIVE"), "VALUE", iupAttribGetStr(matex_data->ih, "SORTCOLUMNCASESENSITIVE"));
if (iupStrEqualNoCase(iupAttribGetStr(matex_data->ih, "SORTCOLUMNORDER"), "DESCENDING"))
IupSetAttribute(IupGetDialogChild(dlg_sort, "DESCENDING"), "VALUE", "Yes");
else
IupSetAttribute(IupGetDialogChild(dlg_sort, "ASCENDING"), "VALUE", "Yes");
ih_matrix = IupGetDialogChild(dlg_sort, "INTERVAL");
col = IupGetInt2(matex_data->ih, "FOCUSCELL");
IupSetIntId2(ih_matrix, "", 1, 1, col);
num_lin = IupGetInt(matex_data->ih, "NUMLIN");
lin1 = 1;
lin2 = num_lin;
IupGetIntInt(matex_data->ih, "SORTCOLUMNINTERVAL", &lin1, &lin2);
if (lin1 < 1) lin1 = 1;
if (lin2 > num_lin) lin2 = num_lin;
if (lin1 > lin2) lin1 = lin2;
if (lin1==1 && lin2==num_lin)
{
IupSetStrAttributeId2(ih_matrix, "TOGGLEVALUE", 2, 1, "Yes");
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 3, 1, "220 220 220");
IupSetStrAttributeId2(ih_matrix, "BGCOLOR", 4, 1, "220 220 220");
}
else
IupSetStrAttributeId2(ih_matrix, "TOGGLEVALUE", 2, 1, "No");
IupSetIntId2(ih_matrix, "", 3, 1, lin1);
IupSetIntId2(ih_matrix, "", 4, 1, lin2);
iMatrixExSortUpdateSelection(matex_data, col, lin1, lin2);
iupMatrixExGetDialogPosition(matex_data, &x, &y);
IupPopup(dlg_sort, x, y);
IupDestroy(dlg_sort);
}
void iupMatrixExRegisterSort(Iclass* ic)
{
/* Defined in IupMatrix - Exported
SORTCOLUMN (RESET, INVERT, lin1-lin2)
SORTCOLUMNORDER (ASCENDING, DESCENDING)
SORTCOLUMNCASESENSITIVE (Yes, No) */
(void)ic;
}