Files
cpython-source-deps/generic/tixFormMisc.c
2017-05-22 16:16:49 -05:00

601 lines
16 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* $Id: tixFormMisc.c,v 1.2 2004/03/28 02:44:56 hobbs Exp $ */
/*
* tixFormMisc.c --
*
* Implements the tixForm geometry manager, which has similar
* capability as the Motif Form geometry manager. Please
* refer to the documentation for the use of tixForm.
*
* Copyright (c) 1996, Expert Interface Technologies
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*/
#include <tixPort.h>
#include <tix.h>
#include <tixForm.h>
/*
* SubCommands of the tixForm command.
*/
TIX_DECLARE_SUBCMD(TixFm_Info);
static void AttachInfo _ANSI_ARGS_((Tcl_Interp * interp,
FormInfo * clientPtr, int axis, int which));
static int ConfigureAttachment _ANSI_ARGS_((FormInfo *clientPtr,
Tk_Window topLevel, Tcl_Interp* interp,
int axis, int which, CONST84 char *value));
static int ConfigureFill _ANSI_ARGS_((
FormInfo *clientPtr, Tk_Window tkwin,
Tcl_Interp* interp, CONST84 char *value));
static int ConfigurePadding _ANSI_ARGS_((
FormInfo *clientPtr, Tk_Window tkwin,
Tcl_Interp* interp, int axis, int which,
CONST84 char *value));
static int ConfigureSpring _ANSI_ARGS_((FormInfo *clientPtr,
Tk_Window topLevel, Tcl_Interp* interp,
int axis, int which, CONST84 char *value));
/*----------------------------------------------------------------------
* TixFm_Info --
*
* Return the information about the attachment of a client window
*----------------------------------------------------------------------
*/
int TixFm_Info(clientData, interp, argc, argv)
ClientData clientData; /* Main window associated with
* interpreter. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
CONST84 char **argv; /* Argument strings. */
{
Tk_Window topLevel = (Tk_Window) clientData;
FormInfo * clientPtr;
char buff[256];
int i,j;
static CONST84 char *sideNames[2][2] = {
{"-left", "-right"},
{"-top", "-bottom"}
};
static CONST84 char *padNames[2][2] = {
{"-padleft", "-padright"},
{"-padtop", "-padbottom"}
};
clientPtr = TixFm_FindClientPtrByName(interp, argv[0], topLevel);
if (clientPtr == NULL) {
return TCL_ERROR;
}
if (argc == 2) {
/* user wants some specific info
*/
for (i=0; i<2; i++) {
for (j=0; j<2; j++) {
/* Do you want to know attachment? */
if (strcmp(argv[1], sideNames[i][j]) == 0) {
AttachInfo(interp, clientPtr, i, j);
return TCL_OK;
}
/* Do you want to know padding? */
if (strcmp(argv[1], padNames[i][j]) == 0) {
sprintf(buff, "%d", clientPtr->pad[i][j]);
Tcl_AppendResult(interp, buff, NULL);
return TCL_OK;
}
}
}
Tcl_AppendResult(interp, "Unknown option \"", argv[1], "\"", NULL);
return TCL_ERROR;
}
/* Otherwise, give full info */
for (i=0; i<2; i++) {
for (j=0; j<2; j++) {
/* The information about attachment */
Tcl_AppendResult(interp, sideNames[i][j], " ", NULL);
AttachInfo(interp, clientPtr, i, j);
/* The information about padding */
Tcl_AppendResult(interp, padNames[i][j], " ", NULL);
sprintf(buff, "%d", clientPtr->pad[i][j]);
Tcl_AppendResult(interp, buff, " ", NULL);
}
}
return TCL_OK;
}
static void AttachInfo(interp, clientPtr, axis, which)
Tcl_Interp * interp;
FormInfo * clientPtr;
int axis;
int which;
{
char buff[256];
switch(clientPtr->attType[axis][which]) {
case ATT_NONE:
Tcl_AppendElement(interp, "none");
break;
case ATT_GRID:
sprintf(buff, "{%%%d %d}", clientPtr->att[axis][which].grid,
clientPtr->off[axis][which]);
Tcl_AppendResult(interp, buff, " ", NULL);
break;
case ATT_OPPOSITE:
sprintf(buff, "%d", clientPtr->off[axis][which]);
Tcl_AppendResult(interp, "{",
Tk_PathName(clientPtr->att[axis][which].widget->tkwin),
" ", buff, "} ", NULL);
break;
case ATT_PARALLEL:
sprintf(buff, "%d", clientPtr->off[axis][which]);
Tcl_AppendResult(interp, "{&",
Tk_PathName(clientPtr->att[axis][which].widget->tkwin),
" ", buff, "} ", NULL);
break;
}
}
/*----------------------------------------------------------------------
* Form Parameter Configuration
*
*----------------------------------------------------------------------
*/
static int ConfigureAttachment(clientPtr, topLevel, interp, axis, which, value)
FormInfo *clientPtr;
Tk_Window topLevel;
Tcl_Interp* interp;
int axis, which;
CONST84 char *value;
{
Tk_Window tkwin;
FormInfo * attWidget;
int code = TCL_OK;
int offset;
int grid;
int argc;
CONST84 char ** argv;
if (Tcl_SplitList(interp, value, &argc, &argv) != TCL_OK) {
return TCL_ERROR;
}
if (argc < 1 || argc > 2) {
Tcl_AppendResult(interp, "Malformed attachment value \"", value,
"\"", NULL);
code = TCL_ERROR;
goto done;
}
switch (argv[0][0]) {
case '#': /* Attached to grid */
case '%': /* Attached to percent (aka grid) */
if (Tcl_GetInt(interp, argv[0]+1, &grid) == TCL_ERROR) {
code = TCL_ERROR;
goto done;
}
clientPtr->attType[axis][which] = ATT_GRID;
clientPtr->att[axis][which].grid = grid;
break;
case '&': /* Attached to parallel widget */
tkwin = Tk_NameToWindow(interp, argv[0]+1, topLevel);
if (tkwin != NULL) {
if (Tk_IsTopLevel(tkwin)) {
Tcl_AppendResult(interp, "can't attach to \"", value,
"\": it's a top-level window", (char *) NULL);
code = TCL_ERROR;
goto done;
}
attWidget = TixFm_GetFormInfo(tkwin, 1);
TixFm_AddToMaster(clientPtr->master, attWidget);
clientPtr->attType[axis][which] = ATT_PARALLEL;
clientPtr->att[axis][which].widget = attWidget;
} else {
code = TCL_ERROR;
goto done;
}
break;
case '.': /* Attach to opposite widget */
tkwin = Tk_NameToWindow(interp, argv[0], topLevel);
if (tkwin != NULL) {
if (Tk_IsTopLevel(tkwin)) {
Tcl_AppendResult(interp, "can't attach to \"", value,
"\": it's a top-level window", (char *) NULL);
code = TCL_ERROR;
goto done;
}
attWidget = TixFm_GetFormInfo(tkwin, 1);
TixFm_AddToMaster(clientPtr->master, attWidget);
clientPtr->attType[axis][which] = ATT_OPPOSITE;
clientPtr->att[axis][which].widget = attWidget;
} else {
code = TCL_ERROR;
goto done;
}
break;
case 'n': /* none */
if (argc == 1 && strcmp(argv[0], "none") == 0) {
clientPtr->attType[axis][which] = ATT_NONE;
goto done;
} else {
Tcl_AppendResult(interp, "Malformed attachment value \"", value,
"\"", NULL);
code = TCL_ERROR;
goto done;
}
break;
default: /* Check if is attached to pixel */
/* If there is only one value, this can be the offset with implicit
* anchor point 0% or max_grid%
*/
if (argc != 1) {
Tcl_AppendResult(interp, "Malformed attachment value \"", value,
"\"", NULL);
code = TCL_ERROR;
goto done;
}
#if 1
if (Tk_GetPixels(interp, topLevel, argv[0], &offset) != TCL_OK) {
#else
if (Tcl_GetInt(interp, argv[0], &offset) == TCL_ERROR) {
#endif
code = TCL_ERROR;
goto done;
}
clientPtr->attType[axis][which] = ATT_GRID;
clientPtr->off [axis][which] = offset;
if (offset < 0 || (offset == 0 && strcmp(argv[0], "-0") ==0)) {
clientPtr->att[axis][which].grid = clientPtr->master->grids[axis];
} else {
clientPtr->att[axis][which].grid = 0;
}
goto done; /* We have already gotten both anchor and offset */
}
if (argc == 2) {
#if 1
if (Tk_GetPixels(interp, topLevel, argv[1], &offset) != TCL_OK) {
#else
if (Tcl_GetInt(interp, argv[1], &offset) == TCL_ERROR) {
#endif
code = TCL_ERROR;
goto done;
}
clientPtr->off[axis][which] = offset;
} else {
clientPtr->off[axis][which] = 0;
}
done:
if (argv) {
ckfree((char*) argv);
}
if (code == TCL_ERROR) {
clientPtr->attType[axis][which] = ATT_NONE;
clientPtr->off[axis][which] = 0;
}
return code;
}
static int ConfigurePadding(clientPtr, tkwin, interp, axis, which, value)
FormInfo *clientPtr;
Tk_Window tkwin;
Tcl_Interp* interp;
int axis, which;
CONST84 char *value;
{
int p_value;
if (Tk_GetPixels(interp, tkwin, value, &p_value) != TCL_OK) {
return TCL_ERROR;
}
else {
clientPtr->pad[axis][which] = p_value;
return TCL_OK;
}
}
static int ConfigureFill(clientPtr, tkwin, interp, value)
FormInfo *clientPtr;
Tk_Window tkwin;
Tcl_Interp* interp;
CONST84 char *value;
{
size_t len = strlen(value);
if (strncmp(value, "x", len) == 0) {
clientPtr->fill[AXIS_X] = 1;
clientPtr->fill[AXIS_Y] = 0;
}
else if (strncmp(value, "y", len) == 0) {
clientPtr->fill[AXIS_X] = 0;
clientPtr->fill[AXIS_Y] = 1;
}
else if (strncmp(value, "both", len) == 0) {
clientPtr->fill[AXIS_X] = 1;
clientPtr->fill[AXIS_Y] = 1;
}
else if (strncmp(value, "none", len) == 0) {
clientPtr->fill[AXIS_X] = 0;
clientPtr->fill[AXIS_Y] = 0;
}
else {
Tcl_AppendResult(interp, "bad fill style \"", value,
"\": must be none, x, y, or both", NULL);
return TCL_ERROR;
}
return TCL_OK;
}
static int ConfigureSpring(clientPtr, topLevel, interp, axis, which, value)
FormInfo *clientPtr;
Tk_Window topLevel;
Tcl_Interp* interp;
int axis, which;
CONST84 char *value;
{
int strength;
int i = axis, j = which;
if (Tcl_GetInt(interp, value, &strength) != TCL_OK) {
return TCL_ERROR;
}
clientPtr->spring[i][j] = strength;
if (clientPtr->attType[i][j] == ATT_OPPOSITE) {
FormInfo * oppo;
oppo = clientPtr->att[i][j].widget;
oppo->spring[i][!j] = strength;
if (strength != 0 && clientPtr->strWidget[i][j] == NULL) {
clientPtr->strWidget[i][j] = oppo;
if (oppo->strWidget[i][!j] != clientPtr) {
if (oppo->strWidget[i][!j] != NULL) {
oppo->strWidget[i][!j]->strWidget[i][j] = NULL;
oppo->strWidget[i][!j]->spring[i][j] = 0;
}
}
oppo->strWidget[i][!j] = clientPtr;
}
}
return TCL_OK;
}
int TixFm_Configure(clientPtr, topLevel, interp, argc, argv)
FormInfo *clientPtr;
Tk_Window topLevel;
Tcl_Interp* interp;
int argc;
CONST84 char **argv;
{
int i, flag, value;
for (i=0; i< argc; i+=2) {
flag = i;
value = i+1;
if (strcmp(argv[flag], "-in") == 0) {
/* Reset the parent of the widget
*/
Tcl_AppendResult(interp,
"\"-in \" must be the first option given to tixForm", NULL);
return TCL_ERROR;
} else if (strcmp(argv[flag], "-l") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-left") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-r") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-right") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-top") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-t") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-bottom") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-b") == 0) {
if (ConfigureAttachment(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-padx") == 0) {
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-pady") == 0) {
if (ConfigurePadding(clientPtr,topLevel,interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
if (ConfigurePadding(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-padleft") == 0) {
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-lp") == 0) {
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-padright")== 0){
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-rp")== 0){
if (ConfigurePadding(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-padtop")== 0) {
if (ConfigurePadding(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-tp")== 0) {
if (ConfigurePadding(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag],"-padbottom")== 0){
if (ConfigurePadding(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag],"-bp")== 0){
if (ConfigurePadding(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-leftspring") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-ls") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
0, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-rightspring") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-rs") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
0, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-topspring") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-ts") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
1, 0, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-bottomspring") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-bs") == 0) {
if (ConfigureSpring(clientPtr, topLevel, interp,
1, 1, argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else if (strcmp(argv[flag], "-fill") == 0) {
if (ConfigureFill(clientPtr, topLevel, interp,
argv[value]) == TCL_ERROR) {
return TCL_ERROR;
}
} else {
Tcl_AppendResult(interp, "Wrong option \"",
argv[i], "\".", (char *) NULL);
return TCL_ERROR;
}
}
/*
* Clear the previously set default attachment if the opposide
* edge is attached.
*/
#if 0
/* (1) The X axis */
if ((clientPtr->attType[0][0] == ATT_DEFAULT_PIXEL)
&&(clientPtr->attType[0][1] != ATT_NONE)) {
clientPtr->attType[0][0] = ATT_NONE;
}
/* (2) The Y axis */
if ((clientPtr->attType[1][0] == ATT_DEFAULT_PIXEL)
&&(clientPtr->attType[1][1] != ATT_NONE)) {
clientPtr->attType[1][0] = ATT_NONE;
}
#endif
return TCL_OK;
}