/* * Concordance Mark Fields Module MARK.CPL * * Copyright (c) 1990 Dataflight Software, Inc. * 2337 Roscomare Road, Suite 11 * Los Angeles, California 90077 * * ALL RIGHTS RESERVED. * * Unauthorized distribution, adaptation or use may be * subject to civil and criminal penalties. * */ main() { int i, db; char fs[257]; if (ver() >= 5.08) debug(-1); for(i = 1; i <= db.fields; i = i + 1) fs[i] = db.order[i]; markfields(db,fs,"Mark the Fields",15,'E'); for(i = 1; i <= db.fields; i = i + 1) db.order[i] = fs[i]; } char CR, ESC, TRUE, FALSE; char NUMBER_COLUMN; char NAME_COLUMN; char TYPE_COLUMN; short LEFT, RIGHT, UP, DOWN, PGUP, PGDN, HOME, END, ALTS, ALTC; /************************************************************************ * name markfields() * * synopsis Mark or unmark fields as selected. * * description Fields are displayed and marked as selected or not * * selected. Display begins on row parameter, mode is * * display only if editmode parameter is not 'E'. * ************************************************************************/ markfields(int db; /* Handle to data base. */ char order[]; /* Array with order of selected fields. */ text prompt; /* Prompt displayed on top of screen. */ int minrow, /* Used with Display mode, shows fields.*/ editmode) /* Edits if 'E', displays if not 'E'. */ { int i, j; /* Misc. loop variables. */ int row; /* Row on screen being edited. */ int key; /* Key stroke pressed with each loop iteration. */ int field; /* Tracks which element of fs[] array is edited.*/ float fnumber; /* Only used for user's entry of numeric order. */ char fs[257]; /* Array used internally to edit field order. */ text screen; /* Saves calling function's screen. */ if ((db.documents < 0) and editmode) messageBox("Please open a database first.", "Concordance", 0); /* Initialize local global variables. */ screen = save(0,0,MaxRow_,79); NUMBER_COLUMN = 2; NAME_COLUMN = 10; TYPE_COLUMN = 27; ESC = 27; CR = 13; UP = 18432; LEFT = 19200; RIGHT = 19712; TRUE = 1; DOWN = 20480; PGUP = 18688; PGDN = 20736; HOME = 18176; END = 20224; ALTS = 7936; ALTC = 11776; /* Use the fs[] array to track the "fields selected". */ cursoroff(); if (editmode = (upper(chr(editmode)) == "E")) minrow = 2; for(i = 1; i <= db.fields; i = i + 1) fs[i] = order[i]; if (editmode) { cls(); puts(0,0,pad(prompt,'L',80),MenuColor_); } scroll(minrow + 1, 1, MaxRow_ - 1, 36, 0, 0, MenuBackground_); box(minrow, 0, MaxRow_, 37, "3D", MenuColor_, MenuBackground_); puts(minrow+1,1," Order Field Name Type ", MenuColor_, MenuBackground_); /* puts(minrow+2,1," ", MenuColor_, MenuBackground_); for (i = minrow + 3; i < MaxRow_; i = i + 1) puts(i,1," ", MenuColor_, MenuBackground_); puts(MaxRow_,1," ", MenuColor_, MenuBackground_); */ row = minrow+3; field = 1; update(db,field,row,fs,minrow); if (editmode and (db.documents >= 0)) { /* Print the instructions. */ box(2,43,10,77,'3D',TextColor_); puts( 3,53,"Selected Fields",TextHighlight_); puts( 4,45,"Select fields and their order"); puts( 5,45,"by marking them with [+] and [-]"); puts( 6,45,"keys. Unselected fields are not"); puts( 7,45,"used in functions which allow"); puts( 8,45,"field selection, such as print."); puts( 9,45,"You must select at least one."); box(12,43,22,77,'3D', TextColor_); puts(13,50,"How to Select Fields",TextHighlight_); puts(14,45,"Select a field [+]"); puts(15,45,"Deselect a field [-]"); puts(16,45,"Toggle field [Spacebar]"); puts(17,45,"Previous field [Up]"); puts(18,45,"Next field [Down]"); puts(19,45,"First field [Home]"); puts(20,45,"Clear all fields [C]"); puts(21,45,"Select all fields [S]"); puts(23,43,"Press [Enter] when you are finished.",TextHighlight_); key = 0; while ((key <> ESC) and (key <> CR)) { dpf(db,field,row,TextHighlight_[0],fs); if ((key = getkey()) == ' ') key = fs[field] ? '-' : '+'; switch(key) { case '+':/* User selected this field. ** Add it in if it isn't already. */ if (fs[field] == 0) { /* Scan for the highest number assigned. */ j = 0; for(i = 1; i <= db.fields; i = i + 1) if (j < fs[i]) j = fs[i]; /* Assign the next highest number to this field. */ fs[field] = j + 1; } break; case '-': j = fs[field]; fs[field] = 0; if (j) { for(i = 1; i <= db.fields; i = i + 1) if (fs[i] > j) fs[i] = fs[i] - 1; NewNumbers(db, field, row, fs, minrow, j); } default: break; } switch(key) { case '+': case '-': case DOWN: if (field < db.fields) { dpf(db,field,row,TextColor_[0],fs); field = field + 1; if (row < (MaxRow_ - 1)) row = row + 1; else scroll(minrow+3,1,MaxRow_ - 1,42,1,'U'); /* scroll page up */ } break; case UP: if (field > 1) { dpf(db,field,row,TextColor_[0],fs); field = field - 1; if (row > minrow+3) row = row - 1; else scroll(minrow+3,1,MaxRow_ - 1,42,1,'D'); /* Scroll page down. */ } break; case PGDN: for(i = minrow + 3; i < (MaxRow_ - 1); i = i + 1) if (field <> db.fields) field = field + 1; update(db,field,row,fs,minrow); break; case PGUP: for(i = minrow + 3; i < (MaxRow_ - 1); i = i + 1) if (field > 1) field = field - 1; if ((row - (minrow + 3) + 1) > field) field = (row - (minrow + 3)) + 1; update(db,field,row,fs,minrow); break; case HOME: field = 1; row = minrow+3; update(db,field,row,fs,minrow); break; case END: field = db.fields; row = minrow+3; update(db,field,row,fs,minrow); break; case 'S': case 's': for(i = 1; i <= db.fields; i = i + 1) fs[i] = i; update(db,field,row,fs,minrow); break; case 'c': case 'C': for(i = 1; i <= db.fields; i = i + 1) fs[i] = 0; update(db,field,row,fs,minrow); break; case ESC: case CR: break; default: key = key & 255; if (isdigit(key)) { /* Find the maximum number in the list. */ j = 0; for(i = 0; i <= db.fields; i = i + 1) if (j < fs[i] + 1) j = fs[i] + 1; if (j > db.fields) j = db.fields; if (j == 0) j = 1; fnumber = key - '0'; cursoron(); key = 0; while((key <> ESC) and (key <> CR)) key = getnumber(row,NUMBER_COLUMN,fnumber,0.0,j,5,0); cursoroff(); if (key <> ESC) { /* Remove the current number from the list if non-zero. */ if (j = fs[field]) { fs[field] = 0; for(i = 1; i <= db.fields; i = i + 1) if ((fs[i] >= j) and (fs[i] > 0)) fs[i] = fs[i] - 1; } /* Make room for the new number if non-zero. */ if (j = fnumber) for(i = 0; i <= db.fields; i = i + 1) if ((fs[i] >= j) and (fs[i] > 0)) fs[i] = fs[i] + 1; /* Store the new number and display changes. */ fs[field] = fnumber; update(db,field,row,fs,minrow); } key = 0; } break; } } /* while ((key <> ESC) and (key <> CR)) */ /* Copy the selected field orders to the calling ** function's array if the user pressed [Enter] ** to accept their changes. [Esc] ignores any ** changes. */ if (key == CR) for(i = 1; i <= db.fields; i = i + 1) order[i] = fs[i]; cls(); cursoron(); restore(0,0,screen); } return(key); } /* markfields() */ /************************************************************************ * name FieldType * * synopsis Return a text string describing the field's type. * ************************************************************************/ FieldType(int db, field) { switch(db.type[field]) { case 'T': return("Text"); case 'D': return("Date"); case 'N': return("Numeric"); case 'P': return("Paragraph"); default : return(""); } } /* FieldType() */ /************************************************************************ * name NewNumbers * * synopsis Helper function for markfields() * ************************************************************************/ NewNumbers(int db, field, row; char fs[]; int minrow, number) { int i; int fcode; fcode = field; for(i = row; i >= minrow + 3; i = i - 1) { if (fs[fcode] >= number) puts(i, NUMBER_COLUMN, fs[fcode] ? str(fs[fcode],4) : " "); fcode = fcode - 1; } fcode = field + 1; for(i = row + 1; i <= (MaxRow_ - 1); i = i + 1) { if (fs[fcode] >= number) puts(i, NUMBER_COLUMN, fs[fcode] ? str(fs[fcode],4) : " "); fcode = fcode + 1; } } /* NewNumbers() */ /************************************************************************ * name dpf * * synopsis Display print field, field and width option displayed. * * description Field definition pointed to by field is displayed on * * the screen row passed. If the field is invalid then * * the row is cleared. * ************************************************************************/ dpf(int db, field, row, color; char fs[]) { puts(row,1," ", color, MenuBackground_); if ((field <= db.fields) and (field > 0)) { puts(row,NUMBER_COLUMN, fs[field] ? str(fs[field],4) : " ", color, MenuBackground_); puts(row,NAME_COLUMN, pad(db.name[field],'L',14), color, MenuBackground_); puts(row,TYPE_COLUMN, pad(FieldType(db,field),'L',9), color, MenuBackground_); if (color == TextHighlight_[0]) puts(row,NUMBER_COLUMN, ">", color, MenuBackground_); } } /* dpf() */ /************************************************************************ * name update() * * description Helper function for markfields() * ************************************************************************/ update(int db, field, row; char fs[]; int minrow) { int i; int fcode; fcode = field; i = row; while(i >= minrow + 3) { dpf(db,fcode,i,TextColor_[0],fs); i = i - 1; fcode = fcode - 1; } fcode = field + 1; i = row + 1; while(i <= (MaxRow_ - 1)) { dpf(db,fcode,i,TextColor_[0],fs); i = i + 1; fcode = fcode + 1; } } /* update() */ /**************************************************************** * Name: Message * * Synopsis: Displays error message and waits for key. * ****************************************************************/ Message(text message) { text screen; int key; cursoroff(); screen = save(5,13,8,69); box(5,13,8,69,"DS", MenuColor_); puts(6,14,pad(message,'C',53),MenuColor_); key = getkey(); restore(5,13,screen); return(asc(upper(chr(key)))); } /* Message() */