169 lines
4.2 KiB
C
169 lines
4.2 KiB
C
|
/** \file
|
||
|
* \brief iupmatrix column resize
|
||
|
*
|
||
|
* See Copyright Notice in "iup.h"
|
||
|
*/
|
||
|
|
||
|
/*******************************************************************/
|
||
|
/* Interactive Column Resize Functions and WIDTH change */
|
||
|
/*******************************************************************/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#include "iup.h"
|
||
|
#include "iupcbs.h"
|
||
|
|
||
|
#include <cd.h>
|
||
|
|
||
|
#include "iup_object.h"
|
||
|
#include "iup_attrib.h"
|
||
|
#include "iup_str.h"
|
||
|
#include "iup_stdcontrols.h"
|
||
|
|
||
|
#include "iup_cdutil.h"
|
||
|
|
||
|
#include "iupmat_def.h"
|
||
|
#include "iupmat_colres.h"
|
||
|
#include "iupmat_draw.h"
|
||
|
#include "iupmat_aux.h"
|
||
|
#include "iupmat_edit.h"
|
||
|
|
||
|
#define IMAT_COLRES_TOL 3
|
||
|
|
||
|
static int iMatrixGetColResCheck(Ihandle* ih, int x, int y)
|
||
|
{
|
||
|
if (ih->data->lines.dt[0].size &&
|
||
|
y < ih->data->lines.dt[0].size &&
|
||
|
iupAttribGetBoolean(ih, "RESIZEMATRIX"))
|
||
|
{
|
||
|
int x_col = 0, col;
|
||
|
|
||
|
/* Check if it is in the non scrollable columns */
|
||
|
for(col = 0; col < ih->data->columns.num_noscroll; col++)
|
||
|
{
|
||
|
x_col += ih->data->columns.dt[col].size;
|
||
|
if (abs(x_col-x) < IMAT_COLRES_TOL)
|
||
|
return col;
|
||
|
}
|
||
|
|
||
|
/* Check if it is in the visible columns */
|
||
|
for(col = ih->data->columns.first; col <= ih->data->columns.last; col++)
|
||
|
{
|
||
|
x_col += ih->data->columns.dt[col].size;
|
||
|
if (col == ih->data->columns.first)
|
||
|
x_col -= ih->data->columns.first_offset;
|
||
|
|
||
|
if (abs(x_col-x) < IMAT_COLRES_TOL)
|
||
|
return col;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/* Verify if the mouse is in the intersection between two of column titles,
|
||
|
if so the resize is started */
|
||
|
int iupMatrixColResStart(Ihandle* ih, int x, int y)
|
||
|
{
|
||
|
int col = iMatrixGetColResCheck(ih, x, y);
|
||
|
if (col != -1)
|
||
|
{
|
||
|
ih->data->colres_drag_col_start_x = x;
|
||
|
ih->data->colres_dragging = 1;
|
||
|
ih->data->colres_drag_col = col;
|
||
|
ih->data->colres_color = cdIupConvertColor(iupAttribGetStr(ih, "RESIZEMATRIXCOLOR"));
|
||
|
return 1;
|
||
|
}
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void iupMatrixColResFinish(Ihandle* ih, int x)
|
||
|
{
|
||
|
int min_width = iupAttribGetIntId(ih, "MINCOLWIDTH", ih->data->colres_drag_col);
|
||
|
int delta = x - ih->data->colres_drag_col_start_x;
|
||
|
int width = ih->data->columns.dt[ih->data->colres_drag_col].size + delta;
|
||
|
|
||
|
if (min_width == 0)
|
||
|
min_width = iupAttribGetInt(ih, "MINCOLWIDTHDEF");
|
||
|
|
||
|
width -= IMAT_PADDING_W + IMAT_FRAME_W;
|
||
|
|
||
|
if (width < min_width)
|
||
|
width = min_width;
|
||
|
|
||
|
ih->data->colres_dragging = 0;
|
||
|
ih->data->colres_feedback = 0;
|
||
|
|
||
|
iupAttribSetIntId(ih, "RASTERWIDTH", ih->data->colres_drag_col, width);
|
||
|
iupAttribSetId(ih, "WIDTH", ih->data->colres_drag_col, NULL);
|
||
|
|
||
|
ih->data->need_calcsize = 1;
|
||
|
|
||
|
if (!ih->data->edit_hide_onfocus && ih->data->editing)
|
||
|
{
|
||
|
iupMatrixAuxCalcSizes(ih);
|
||
|
iupMatrixEditUpdatePos(ih);
|
||
|
}
|
||
|
|
||
|
iupMatrixDraw(ih, 0);
|
||
|
|
||
|
{
|
||
|
IFni cb = (IFni)IupGetCallback(ih, "COLRESIZE_CB");
|
||
|
if (cb)
|
||
|
cb(ih, ih->data->colres_drag_col);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Change the column width interactively, just change the line in the screen.
|
||
|
When the user finishes the drag, the iupMatrixColResFinish function is called
|
||
|
to truly change the column width. */
|
||
|
void iupMatrixColResMove(Ihandle* ih, int x)
|
||
|
{
|
||
|
int y1, y2;
|
||
|
|
||
|
int delta = x - ih->data->colres_drag_col_start_x;
|
||
|
int width = ih->data->columns.dt[ih->data->colres_drag_col].size + delta;
|
||
|
if (width < 0)
|
||
|
return;
|
||
|
|
||
|
y1 = ih->data->lines.dt[0].size; /* from the bottom of the line of titles */
|
||
|
y2 = iupMatrixGetHeight(ih) - 1; /* to the bottom of the matrix */
|
||
|
|
||
|
if (ih->data->colres_drag)
|
||
|
{
|
||
|
iupMatrixColResFinish(ih, x);
|
||
|
|
||
|
iupMatrixDrawUpdate(ih);
|
||
|
|
||
|
ih->data->colres_dragging = 1; /* keep dragging */
|
||
|
ih->data->colres_drag_col_start_x = x;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ih->data->colres_feedback = 1;
|
||
|
ih->data->colres_x = x;
|
||
|
ih->data->colres_y1 = iupMATRIX_INVERTYAXIS(ih, y1);
|
||
|
ih->data->colres_y2 = iupMATRIX_INVERTYAXIS(ih, y2);
|
||
|
|
||
|
iupMatrixDrawUpdate(ih);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Change the cursor when it passes over a group of the column titles. */
|
||
|
int iupMatrixColResCheckChangeCursor(Ihandle* ih, int x, int y)
|
||
|
{
|
||
|
int col = iMatrixGetColResCheck(ih, x, y);
|
||
|
if (col != -1)
|
||
|
return 1;
|
||
|
else /* It is in the empty area after the last column, or inside a cell */
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int iupMatrixColResIsResizing(Ihandle* ih)
|
||
|
{
|
||
|
return ih->data->colres_dragging;
|
||
|
}
|
||
|
|