diff options
Diffstat (limited to 'mdk-stage1/newt/grid.c')
-rw-r--r-- | mdk-stage1/newt/grid.c | 389 |
1 files changed, 0 insertions, 389 deletions
diff --git a/mdk-stage1/newt/grid.c b/mdk-stage1/newt/grid.c deleted file mode 100644 index 37d2b2e74..000000000 --- a/mdk-stage1/newt/grid.c +++ /dev/null @@ -1,389 +0,0 @@ -#include <alloca.h> -#include <stdlib.h> -#include <string.h> - -#include "newt.h" -#include "newt_pr.h" - -struct gridField { - enum newtGridElement type; - union { - newtGrid grid; - newtComponent co; - } u; - int padLeft, padTop, padRight, padBottom; - int anchor; - int flags; -}; - -struct grid_s { - int rows, cols; - int width, height; /* totals, -1 means unknown */ - struct gridField ** fields; -}; - -/* this is a bit of a hack */ -extern struct componentOps formOps[]; - -newtGrid newtCreateGrid(int cols, int rows) { - newtGrid grid; - - grid = malloc(sizeof(*grid)); - grid->rows = rows; - grid->cols = cols; - - grid->fields = malloc(sizeof(*grid->fields) * cols); - while (cols--) { - grid->fields[cols] = malloc(sizeof(**(grid->fields)) * rows); - memset(grid->fields[cols], 0, sizeof(**(grid->fields)) * rows); - } - - grid->width = grid->height = -1; - - return grid; -} - -void newtGridSetField(newtGrid grid, int col, int row, - enum newtGridElement type, void * val, int padLeft, - int padTop, int padRight, int padBottom, int anchor, - int flags) { - struct gridField * field = &grid->fields[col][row]; - - if (field->type == NEWT_GRID_SUBGRID) - newtGridFree(field->u.grid, 1); - - field->type = type; - field->u.co = (void *) val; - - field->padLeft = padLeft; - field->padRight = padRight; - field->padTop = padTop; - field->padBottom = padBottom; - field->anchor = anchor; - field->flags = flags; - - grid->width = grid->height = -1; -} - -static void distSpace(int extra, int items, int * list) { - int all, some, i; - - all = extra / items; - some = extra % items; - for (i = 0; i < items; i++) { - list[i] += all; - if (some) { - list[i]++; - some--; - } - } -} - -static void shuffleGrid(newtGrid grid, int left, int top, int set) { - struct gridField * field; - int row, col; - int i, j; - int minWidth, minHeight; - int * widths, * heights; - int thisLeft, thisTop; - int x, y, remx, remy; - - widths = alloca(sizeof(*widths) * grid->cols); - memset(widths, 0, sizeof(*widths) * grid->cols); - heights = alloca(sizeof(*heights) * grid->rows); - memset(heights, 0, sizeof(*heights) * grid->rows); - - minWidth = 0; - for (row = 0; row < grid->rows; row++) { - i = 0; - for (col = 0; col < grid->cols; col++) { - field = &grid->fields[col][row]; - if (field->type == NEWT_GRID_SUBGRID) { - /* we'll have to redo this later */ - if (field->u.grid->width == -1) - shuffleGrid(field->u.grid, left, top, 0); - j = field->u.grid->width; - } else if (field->type == NEWT_GRID_COMPONENT) { - if (field->u.co->ops == formOps) - newtFormSetSize(field->u.co); - j = field->u.co->width; - } else - j = 0; - - j += field->padLeft + field->padRight; - - if (j > widths[col]) widths[col] = j; - i += widths[col]; - } - - if (i > minWidth) minWidth = i; - } - - minHeight = 0; - for (col = 0; col < grid->cols; col++) { - i = 0; - for (row = 0; row < grid->rows; row++) { - field = &grid->fields[col][row]; - if (field->type == NEWT_GRID_SUBGRID) { - /* we'll have to redo this later */ - if (field->u.grid->height == -1) - shuffleGrid(field->u.grid, 0, 0, 0); - j = field->u.grid->height; - } else if (field->type == NEWT_GRID_COMPONENT){ - j = field->u.co->height; - } else - j = 0; - - j += field->padTop + field->padBottom; - - if (j > heights[row]) heights[row] = j; - i += heights[row]; - } - - if (i > minHeight) minHeight = i; - } - - /* this catches the -1 case */ - if (grid->width < minWidth) grid->width = minWidth; /* ack! */ - if (grid->height < minHeight) grid->height = minHeight; /* ditto! */ - - if (!set) return; - - distSpace(grid->width - minWidth, grid->cols, widths); - distSpace(grid->height - minHeight, grid->rows, heights); - - thisTop = top; - for (row = 0; row < grid->rows; row++) { - i = 0; - thisLeft = left; - for (col = 0; col < grid->cols; col++) { - field = &grid->fields[col][row]; - - if (field->type == NEWT_GRID_EMPTY) continue; - - x = thisLeft + field->padLeft; - remx = widths[col] - field->padLeft - field->padRight; - y = thisTop + field->padTop; - remy = heights[row] - field->padTop - field->padBottom; - - if (field->type == NEWT_GRID_SUBGRID) { - remx -= field->u.grid->width; - remy -= field->u.grid->height; - } else if (field->type == NEWT_GRID_COMPONENT) { - remx -= field->u.co->width; - remy -= field->u.co->height; - } - - if (!(field->flags & NEWT_GRID_FLAG_GROWX)) { - if (field->anchor & NEWT_ANCHOR_RIGHT) - x += remx; - else if (!(field->anchor & NEWT_ANCHOR_LEFT)) - x += (remx / 2); - } - - if (!(field->flags & NEWT_GRID_FLAG_GROWY)) { - if (field->anchor & NEWT_ANCHOR_BOTTOM) - y += remx; - else if (!(field->anchor & NEWT_ANCHOR_TOP)) - y += (remy / 2); - } - - if (field->type == NEWT_GRID_SUBGRID) { - if (field->flags & NEWT_GRID_FLAG_GROWX) - field->u.grid->width = widths[col] - field->padLeft - - field->padRight; - if (field->flags & NEWT_GRID_FLAG_GROWY) - field->u.grid->height = heights[col] - field->padTop - - field->padBottom; - - shuffleGrid(field->u.grid, x, y, 1); - } else if (field->type == NEWT_GRID_COMPONENT) { - field->u.co->ops->place(field->u.co, x, y); - } - - thisLeft += widths[col]; - } - - thisTop += heights[row]; - } -} - -void newtGridPlace(newtGrid grid, int left, int top) { - shuffleGrid(grid, left, top, 1); -} - -void newtGridFree(newtGrid grid, int recurse) { - int row, col; - - for (col = 0; col < grid->cols; col++) { - if (recurse) { - for (row = 0; row < grid->rows; row++) { - if (grid->fields[col][row].type == NEWT_GRID_SUBGRID) - newtGridFree(grid->fields[col][row].u.grid, 1); - } - } - - free(grid->fields[col]); - } - - free(grid->fields); - free(grid); -} - -void newtGridGetSize(newtGrid grid, int * width, int * height) { - if (grid->width == -1 || grid->height == -1) { - grid->width = grid->height = -1; - shuffleGrid(grid, 0, 0, 1); - } - - *width = grid->width; - *height = grid->height; -} - -void newtGridWrappedWindow(newtGrid grid, char * title) { - int width, height, offset = 0; - - newtGridGetSize(grid, &width, &height); - if ((size_t)width < strlen(title) + 2) { - offset = ((strlen(title) + 2) - width) / 2; - width = strlen(title) + 2; - } - newtCenteredWindow(width + 2, height + 2, title); - newtGridPlace(grid, 1 + offset, 1); -} - -void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top) { - int width, height; - - newtGridGetSize(grid, &width, &height); - newtOpenWindow(left, top, width + 2, height + 2, title); - newtGridPlace(grid, 1, 1); -} - -void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, - int recurse) { - int row, col; - - for (col = 0; col < grid->cols; col++) { - for (row = 0; row < grid->rows; row++) { - if (grid->fields[col][row].type == NEWT_GRID_SUBGRID && recurse) - newtGridAddComponentsToForm(grid->fields[col][row].u.grid, - form, 1); - else if (grid->fields[col][row].type == NEWT_GRID_COMPONENT) - newtFormAddComponent(form, grid->fields[col][row].u.co); - } - } -} - -/* this handles up to 50 items */ -static newtGrid stackem(int isVert, enum newtGridElement type1, void * what1, - va_list args, int close) { - struct item { - enum newtGridElement type; - void * what; - } items[50]; - int i, num; - newtGrid grid; - - items[0].type = type1, items[0].what = what1, num = 1; - while (1) { - items[num].type = va_arg(args, enum newtGridElement); - if (items[num].type == NEWT_GRID_EMPTY) break; - - items[num].what = va_arg(args, void *); - num++; - } - - grid = newtCreateGrid(isVert ? 1 : num, isVert ? num : 1); - - for (i = 0; i < num; i++) { - newtGridSetField(grid, isVert ? 0 : i, isVert ? i : 0, - items[i].type, items[i].what, - close ? 0 : (i ? (isVert ? 0 : 1) : 0), - close ? 0 : (i ? (isVert ? 1 : 0) : 0), 0, 0, 0, 0); - } - - return grid; -} - -newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(0, type1, what1, args, 1); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridVCloseStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(1, type1, what1, args, 1); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridVStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(1, type1, what1, args, 0); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(0, type1, what1, args, 0); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle, - newtGrid buttons) { - newtGrid grid; - - grid = newtCreateGrid(1, 3); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, middle, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - - return grid; -} - -newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle, - newtGrid buttons) { - newtGrid grid; - - grid = newtCreateGrid(1, 3); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, middle, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - - return grid; -} |