home *** CD-ROM | disk | FTP | other *** search
- /*
- fnframer.c
-
- jmd 6/23/89 new(er) framer funcs
-
- % framer_funcs
-
- C-scape 3.1
- Copyright (c) 1988-1989, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 5/24/89 jdc added sed_DoSpecial and special_key
- 5/26/89 jdc added fix for help
- 6/23/89 jmd completely rewrote
- 6/26/89 jmd added FRAME_LEFT, FRAME_RIGHT
- 7/21/89 jdc readded special_key and added immediate selection from
- sed_SearchMerge
- changed return value condition
- 8/12/89 jmd removed call to sed_GetBob
- */
-
- #include <stdio.h>
- #include <ctype.h>
-
- #include "cscape.h"
- #include "scancode.h"
- #include "oaktag.h" /* For IDs in msys.h */
- #include "msys.h"
- #include "helpdecl.h"
-
- extern void framer_fenter(_arg1(sed_type));
- extern boolean framer_fexit(_arg1(sed_type));
- extern void framer_fkey(_arg1(sed_type));
-
- #define FRAME_LEFT -31
- #define FRAME_RIGHT -32
-
- OGLOBAL field_funcs_struct framer_funcs = {
- framer_fenter,
- framer_fexit,
- framer_fkey,
- FNULL,
- FNULL
- };
-
- void framer_help(_arg1(sed_type));
- int framer_dropdown(_arg1(sed_type));
-
- void framer_fenter(sed)
- sed_type sed;
- /*
- fenter function for framer menu fields.
- */
- {
- sed_BorderPrompt(sed, (char *) sed_GetCurrFieldData(sed, 0));
- }
-
- boolean framer_fexit(sed)
- sed_type sed;
- /*
- fexit function for menu fields.
- */
- {
- sed_BorderPrompt(sed, NULL);
- return(TRUE);
- }
-
- void framer_fkey(sed)
- sed_type sed;
- /*
- */
- {
- int scancode, letter, choice, fld;
- int ret = 0;
- boolean istop;
-
- /* figure out if we're the top menu or not */
- istop = (bob_GetOwner(sed, &fld) == NULL);
-
- scancode = kb_Read();
-
- if (sed_DoSpecial(sed, scancode))
- return;
- if (special_key(sed, scancode))
- return;
-
- switch(scancode) {
- case FN1:
- framer_help(sed);
- break;
-
- case ESC:
- sed_SetBaton(sed, 0);
- sed_ToggleExit(sed);
- break;
-
- case MOU_THERE:
- /* if we're in a pulldown and the mouse was clicked in the
- top menu */
- sed_SetBaton(sed, 0);
- sed_ToggleExit(sed);
- break;
-
- case MOU_HERE:
- break;
-
- case ENTER:
- case MOU_CLICK:
- /* drop the pulldown or call the function if there ain't no pull down */
- if (msys_FieldBobExists(sed)) {
- if ((ret = framer_dropdown(sed)) != 0 && ret != FRAME_LEFT && ret != FRAME_RIGHT) {
- sed_SetBaton(sed, ret);
- sed_ToggleExit(sed);
- return;
- }
- }
- break;
-
- case DOWN:
- if (istop) {
- /* drop the pulldown */
- if (msys_FieldBobExists(sed) && !msys_FieldBobIsUfunc(sed)) {
- if ((ret = framer_dropdown(sed)) != 0 && ret != FRAME_LEFT && ret != FRAME_RIGHT) {
- sed_SetBaton(sed, ret);
- sed_ToggleExit(sed);
- return;
- }
- }
- }
- else if (sed_DownField(sed) == SED_STUCK) {
- sed_GotoFirstField(sed);
- }
- break;
-
- case UP:
- if (!istop) {
- if (sed_UpField(sed) == SED_STUCK) {
- sed_GotoLastField(sed);
- }
- }
- break;
-
- case LEFT:
- if (istop) {
- if (sed_LeftField(sed) == SED_STUCK) {
- sed_GotoLastField(sed);
- }
- }
- else {
- /* move to the next pulldown */
- sed_SetBaton(sed, FRAME_LEFT);
- sed_ToggleExit(sed);
- }
- break;
-
- case RIGHT:
- if (istop) {
- if (sed_RightField(sed) == SED_STUCK) {
- sed_GotoFirstField(sed);
- }
- }
- else {
- /* move to the next pulldown */
- sed_SetBaton(sed, FRAME_RIGHT);
- sed_ToggleExit(sed);
- }
- break;
-
- case HOME:
- sed_GotoFirstField(sed);
- break;
-
- case END:
- sed_GotoLastField(sed);
- break;
-
- default:
- /* do first letter search */
- letter = ascii(scancode);
- if ( isprint(letter)
- && (choice = sed_SearchMerge(sed, (char)letter)) != -1) {
-
- sed_GotoField(sed, choice);
- sed_SetMouseCode(sed, MOU_CLICK); /* select choice immediately */
- break;
- }
- break;
- }
-
- /* see if we we're asked to move left or right */
- switch(ret) {
- case FRAME_LEFT:
- if (sed_LeftField(sed) == SED_STUCK) {
- sed_GotoLastField(sed);
- }
- /* pass a DOWN arrow to the new field's fkey */
- sed_SetMouseCode(sed, DOWN);
- break;
-
- case FRAME_RIGHT:
- if (sed_RightField(sed) == SED_STUCK) {
- sed_GotoFirstField(sed);
- }
- /* pass a DOWN arrow to the new field's fkey */
- sed_SetMouseCode(sed, DOWN);
- break;
-
- default:
- break;
- }
- }
-
-
- int framer_dropdown(sed)
- sed_type sed;
- /*
- Display and activate a dropdown.
- if the bob is a ufunc, call it and return its value.
-
- return value > 0 quit
- return value == 0 escape back to top
- return value < 0
- */
- {
- int ret;
- int row1, col1, row2, col2;
-
- int fldno;
-
- /* remember current fieldno, it could be changed on us */
- fldno = sed_GetFieldNo(sed);
-
- sed_GetBordCorners(sed, &row1, &col1, &row2, &col2);
-
- /* compensate for border */
- if (!sed_BorderExists(sed)) {
- row2++;
- col2++;
- }
-
- if (msys_dir(sed) == MENU_HORIZONTAL) {
- col2 = sed_GetFieldCol(sed, sed_GetFieldNo(sed));
- }
- else {
- row2 = sed_GetFieldRow(sed, sed_GetFieldNo(sed));
- }
-
- /* Use baton value of BOB_DOWN to tell mouse handler
- that the pulldown is active
- */
- sed_SetBaton(sed, BOB_DOWN);
-
- msys_RepaintBob(sed, row2, col2);
- ret = msys_GoBob(sed, -1, -1);
-
- if (sed_GetFieldBob(sed, fldno) != NULL) {
- win_UnEmploy(sed_GetFieldBob(sed, fldno));
- }
-
- sed_SetBaton(sed, -1);
-
- return(ret);
- }
-
-
- void framer_help(sed)
- sed_type sed;
- /*
- */
- {
- bob_type bob;
- ufuncopen_struct ufuncopen;
- int label = 0;
-
- if (bob_GetParent(sed) == NULL) {
- /* help for topbar, chapter = bob label, paragraph = 0 */
- bob = sed_GetFieldBob(sed, sed_GetFieldNo(sed));
-
- if (bob_IsUfunc(bob)) {
- bob_Do(bob, UFUNCBM_GETUFUNC, NULL, &ufuncopen);
- label = ufuncopen.idata;
- }
- else if (bob_IsSed(bob)) {
- label = sed_GetLabel(bob);
- }
-
- help_Show(label, 0);
- }
- else {
- /* help for pulldown, chapter = label, paragraph = fieldno + 1 */
- help_Show(sed_GetLabel(sed), sed_GetFieldNo(sed) + 1);
- }
- }
-
-