150276Speter/**************************************************************************** 2262685Sdelphij * Copyright (c) 1998-2010,2013 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 30166124Srafan * Author: Juergen Pfeifer, 1995,1997 * 3150276Speter ****************************************************************************/ 3250276Speter 3350276Speter#include "form.priv.h" 3450276Speter 35262685SdelphijMODULE_ID("$Id: frm_data.c,v 1.16 2013/08/24 22:44:05 tom Exp $") 3650276Speter 3750276Speter/*--------------------------------------------------------------------------- 3850276Speter| Facility : libnform 3950276Speter| Function : bool data_behind(const FORM *form) 4050276Speter| 4150276Speter| Description : Check for off-screen data behind. This is nearly trivial 42166124Srafan| because the beginning of a field is fixed. 4350276Speter| 4450276Speter| Return Values : TRUE - there are off-screen data behind 4550276Speter| FALSE - there are no off-screen data behind 4650276Speter+--------------------------------------------------------------------------*/ 4776726SpeterNCURSES_EXPORT(bool) 48166124Srafandata_behind(const FORM *form) 4950276Speter{ 5050276Speter bool result = FALSE; 5150276Speter 52262629Sdelphij T((T_CALLED("data_behind(%p)"), (const void *)form)); 53166124Srafan 5450276Speter if (form && (form->status & _POSTED) && form->current) 5550276Speter { 5650276Speter FIELD *field; 5750276Speter 5850276Speter field = form->current; 5950276Speter if (!Single_Line_Field(field)) 6050276Speter { 61166124Srafan result = (form->toprow == 0) ? FALSE : TRUE; 6250276Speter } 6350276Speter else 6450276Speter { 65166124Srafan result = (form->begincol == 0) ? FALSE : TRUE; 6650276Speter } 6750276Speter } 68166124Srafan returnBool(result); 6950276Speter} 7050276Speter 7150276Speter/*--------------------------------------------------------------------------- 7250276Speter| Facility : libnform 73166124Srafan| Function : static char * Only_Padding( 74166124Srafan| WINDOW *w, 7550276Speter| int len, 7650276Speter| int pad) 7750276Speter| 78166124Srafan| Description : Test if 'length' cells starting at the current position 7950276Speter| contain a padding character. 8050276Speter| 81166124Srafan| Return Values : true if only padding cells are found 8250276Speter+--------------------------------------------------------------------------*/ 83166124SrafanNCURSES_INLINE static bool 84166124SrafanOnly_Padding(WINDOW *w, int len, int pad) 8550276Speter{ 86166124Srafan bool result = TRUE; 87166124Srafan int y, x, j; 88166124Srafan FIELD_CELL cell; 8950276Speter 90166124Srafan getyx(w, y, x); 91166124Srafan for (j = 0; j < len; ++j) 92166124Srafan { 93166124Srafan if (wmove(w, y, x + j) != ERR) 94166124Srafan { 95166124Srafan#if USE_WIDEC_SUPPORT 96166124Srafan if (win_wch(w, &cell) != ERR) 97166124Srafan { 98166124Srafan if ((chtype)CharOf(cell) != ChCharOf(pad) 99166124Srafan || cell.chars[1] != 0) 100166124Srafan { 101166124Srafan result = FALSE; 102166124Srafan break; 103166124Srafan } 104166124Srafan } 105166124Srafan#else 106262685Sdelphij cell = (FIELD_CELL) winch(w); 107166124Srafan if (ChCharOf(cell) != ChCharOf(pad)) 108166124Srafan { 109166124Srafan result = FALSE; 110166124Srafan break; 111166124Srafan } 112166124Srafan#endif 113166124Srafan } 114166124Srafan else 115166124Srafan { 116166124Srafan /* if an error, return true: no non-padding text found */ 117166124Srafan break; 118166124Srafan } 119166124Srafan } 120166124Srafan /* no need to reset the cursor position; caller does this */ 121166124Srafan return result; 12250276Speter} 12350276Speter 12450276Speter/*--------------------------------------------------------------------------- 12550276Speter| Facility : libnform 12650276Speter| Function : bool data_ahead(const FORM *form) 12750276Speter| 12850276Speter| Description : Check for off-screen data ahead. This is more difficult 12950276Speter| because a dynamic field has a variable end. 13050276Speter| 13150276Speter| Return Values : TRUE - there are off-screen data ahead 13250276Speter| FALSE - there are no off-screen data ahead 13350276Speter+--------------------------------------------------------------------------*/ 13476726SpeterNCURSES_EXPORT(bool) 135166124Srafandata_ahead(const FORM *form) 13650276Speter{ 13750276Speter bool result = FALSE; 13850276Speter 139262629Sdelphij T((T_CALLED("data_ahead(%p)"), (const void *)form)); 140166124Srafan 14150276Speter if (form && (form->status & _POSTED) && form->current) 14250276Speter { 14350276Speter FIELD *field; 14450276Speter bool cursor_moved = FALSE; 14550276Speter int pos; 14650276Speter 14750276Speter field = form->current; 14850276Speter assert(form->w); 14950276Speter 15050276Speter if (Single_Line_Field(field)) 15150276Speter { 15250276Speter int check_len; 15350276Speter 15450276Speter pos = form->begincol + field->cols; 15550276Speter while (pos < field->dcols) 15650276Speter { 15750276Speter check_len = field->dcols - pos; 158166124Srafan if (check_len >= field->cols) 15950276Speter check_len = field->cols; 16050276Speter cursor_moved = TRUE; 161166124Srafan wmove(form->w, 0, pos); 162166124Srafan if (Only_Padding(form->w, check_len, field->pad)) 163166124Srafan pos += field->cols; 16450276Speter else 16550276Speter { 16650276Speter result = TRUE; 16750276Speter break; 16850276Speter } 16950276Speter } 17050276Speter } 17150276Speter else 17250276Speter { 17350276Speter pos = form->toprow + field->rows; 17450276Speter while (pos < field->drows) 17550276Speter { 17650276Speter cursor_moved = TRUE; 177166124Srafan wmove(form->w, pos, 0); 17850276Speter pos++; 179166124Srafan if (!Only_Padding(form->w, field->cols, field->pad)) 18050276Speter { 18150276Speter result = TRUE; 18250276Speter break; 18350276Speter } 18450276Speter } 18550276Speter } 18650276Speter 18750276Speter if (cursor_moved) 188166124Srafan wmove(form->w, form->currow, form->curcol); 18950276Speter } 190166124Srafan returnBool(result); 19150276Speter} 19250276Speter 19350276Speter/* frm_data.c ends here */ 194