📄 defaultsedit.c
字号:
PANEL_VALUE_DISPLAY_LENGTH, DE_STANDARD_DISPLAYLEN, PANEL_VALUE_STORED_LENGTH, DE_FULLNAME_MAX_LENGTH, PANEL_VALUE, panel_get(old, PANEL_LABEL_STRING), PANEL_NOTIFY_PROC, tree_choice_notifyproc, PANEL_CLIENT_DATA, defobjptr, PANEL_PAINT, PANEL_NONE, 0); } else if (defobjptr->nodetype==String) { defobjptr->nodetype=Editstring; defobjptr->ilabel=panel_create_item(treepanel, PANEL_TEXT, PANEL_ITEM_X, PANEL_CU(0), PANEL_ITEM_Y, (int)panel_get(old, PANEL_ITEM_Y), PANEL_VALUE_DISPLAY_LENGTH, DE_STANDARD_DISPLAYLEN, PANEL_VALUE_STORED_LENGTH, DE_FULLNAME_MAX_LENGTH, PANEL_VALUE, panel_get(old, PANEL_LABEL_STRING), PANEL_EVENT_PROC, tree_text_eventproc, PANEL_CLIENT_DATA, defobjptr, PANEL_PAINT, PANEL_NONE, 0); } (void)panel_set(old, PANEL_PAINT, PANEL_NONE, 0); (void)panel_free(old); (void)panel_paint(defobjptr->ilabel, PANEL_CLEAR); last_clicked_defobj = NULL;}/* * Insert a new defaults object into the tree panel and the linked list * of defaults objects. * Copy label name and possible value from the preceeding node. *//* ARGSUSED */static voidmenu_insert_notifyproc(it, event) Panel_item it; Event event;{ Recttype rectptr; int totheight; int ycoord; Panel_item item; char nodename[DE_FULLNAME_MAX_LENGTH]; Defobj succptr; Defobj defobjptr; char* labelptr; if (!check_clicked_defobj(True)) return; if (last_clicked_defobj->nodetype==Helpstring) { show_message((char *)NULL, "Click on an item first!", ""); return; } item=last_clicked_defobj->ivalue; rectptr = (Recttype)(LINT_CAST(panel_get(item, PANEL_ITEM_RECT))); totheight = rectptr->r_height + (int)(LINT_CAST(panel_get(treepanel, PANEL_ITEM_Y_GAP))); ycoord = (int)panel_get(item, PANEL_ITEM_Y); tree_scrollup(ycoord, -totheight); (void)strcpy(nodename, getnodename_defobj(last_clicked_defobj)); labelptr = nodename+strlen(get_cur_progname())+1; defobjptr=create_text_defobj(labelptr, nodename, ycoord+totheight, True); succptr = last_clicked_defobj->nodenext; defobjptr->nodename = NULL; last_clicked_defobj->nodenext = defobjptr; defobjptr->nodenext = succptr; (void)panel_paint(treepanel, PANEL_CLEAR); last_clicked_defobj = NULL;}/* * Delete defaults object, both in the treepanel and in the database *//* ARGSUSED */static voidmenu_delete_notifyproc(it, event) Panel_item it; Event event;{ Recttype rectptr; int totheight; int ycoord; Panel_item item; Defobj defobjptr; Defobj prevptr; if (!check_clicked_defobj(True)) return; if (last_clicked_defobj->nodetype==Helpstring) { show_message((char *)NULL, "Click on an item first!", ""); return; } item=last_clicked_defobj->ivalue; rectptr = (Recttype)(LINT_CAST(panel_get(item, PANEL_ITEM_RECT))); totheight = rectptr->r_height + (int)panel_get(treepanel, PANEL_ITEM_Y_GAP); ycoord = (int)(LINT_CAST(panel_get(item, PANEL_ITEM_Y))); if (last_clicked_defobj->nodename!=NULL) { defaults_remove(last_clicked_defobj->nodename, (int *)NULL); } /* Update nodenext pointer field of predecessor of deleted node */ defobjptr = last_clicked_defobj->nodenext; if (last_clicked_defobj==firstdefobj) { firstdefobj = defobjptr; } else { prevptr=firstdefobj; while (prevptr->nodenext != last_clicked_defobj) { prevptr = prevptr->nodenext; } prevptr->nodenext = defobjptr; } freemem_defobj(last_clicked_defobj); last_clicked_defobj = NULL; tree_scrollup(ycoord, totheight); (void)panel_paint(treepanel, PANEL_CLEAR);}/* * This proc is called when setup program finishes processing. * Reads in parameters stored in .defaults file by the setup program. *//* ARGSUSED */static Notify_valuedemo_child_wait3(client, pid, status, rusage) Notify_client client; int pid; union wait* status; struct rusage* rusage;{ char name[DE_FULLNAME_MAX_LENGTH]; show_message((char *)NULL, "Loading defaults parameters written into .defaults by demo program", get_cur_progname()); sleep(1); (void)strcpy(name, get_cur_progname()); /* Read parameters written to .defaults file by demo program */ defaults_special_mode(); /* Actually reads the whole database */ /* defaults_reread(name, NULL); Commented out temporarily because of bug in defaults_reread */ subtree_clearitems(); subtree_show(); show_message((char *)NULL, "", "");} /* * This event proc is called whenever a text or a message item is clicked on * in the tree panel subwindow. It is also called when the label of a * choice object (implemented as a message item) is clicked on. * A help message is displayed in the help subwindow * by the proc showhelpitem. */static voidtree_text_eventproc(item, event) Panel_item item; Event *event;{ if (event_action(event) == MS_LEFT && event_is_up(event)) { last_clicked_defobj = (Defobj)(LINT_CAST( panel_get(item, PANEL_CLIENT_DATA))); last_clicked_defobj->specifichelp = False; showhelpitem(last_clicked_defobj, False); } (void)panel_default_handle_event(item, event);}/* This is the notify procedure for the password item. It is called on *//* every input character. All characters are accepted. The showdtop () *//* routine is called upon a \r\n\t. */static unsigned char edit_char, edit_word, edit_line;Panel_setting panel_notify_proc(panel_item, event)Panel_item panel_item;Event *event;{ register unsigned short w = event_id(event); char s[80], t[80]; /* * Here we accept and report non-printing characters to make entering * the line editing characters more intuitive. * * The start-up edit chars are cached so that we don't report them * during user type-in. Note that these chars do not change even * after the user has saved replacements into her defaults. */ if (!edit_char) edit_char = *(char *)defaults_get_string("/Text/Edit_back_char", "\0177", 0); if (!edit_word) edit_word = *(char *)defaults_get_string("/Text/Edit_back_word", "\027", 0); if (!edit_line) edit_line = *(char *)defaults_get_string("/Text/Edit_back_line", "\025", 0); if (((0 <= w && w < (unsigned short) ' ') || w == 0177) && !(w == edit_char || w == edit_word || w == edit_line || w == 0177 || w == 027 || w == 025)) { *s = (char) event_id(event); *(s+1) = '\0'; defaults_str_unparse(s, t); strcpy(s, "You have entered the non-printing character "); strcat(s, t); show_message((char *)NULL, "", s); } switch (w) { case '\011': /* tab */ case '\012': /* new line */ case '\015': /* return */ return (PANEL_NONE); default: return (PANEL_INSERT); }}/* * This event proc is called whenever a text or a message item is clicked on * in the message subwindow where help texts are displayed. */static voidhelp_text_eventproc(item, event) Panel_item item; Event *event;{ if (event_action(event) == MS_LEFT && event_is_up(event)) { last_clicked_defobj = (Defobj)(LINT_CAST(panel_get(item, PANEL_CLIENT_DATA))); last_clicked_defobj->specifichelp = False; } (void)panel_default_handle_event(item, event);}/* * This notifyproc is called whenever a choice item in the treepanel * is clicked on. A help message is displayed in the help subwindow * by the proc showhelpitem. *//* ARGSUSED */static voidtree_choice_notifyproc(item, value, event) Panel_item item; int value; Event *event;{ last_clicked_defobj = (Defobj)(LINT_CAST(panel_get(item, PANEL_CLIENT_DATA))); last_clicked_defobj->specifichelp = True; showhelpitem(last_clicked_defobj, False);} /* * Run the setup program when the relevant button in the current * tree panel subwindow is clicked. * This button exists only for programs which have the $Setup_program * parameter defined. *//* ARGSUSED */static voidtree_runsetup_notifyproc(item, event) Panel_item item; Event *event;{ run_setup_prog();}/* * Iterate over all default objects and items in treepanel and delete them. */static voidsubtree_clearitems(){ Defobj defobjptr; Panel_item firstitem; Panel_item tmpitem; cur_ylinenr = 0; defobjptr = firstdefobj; while (defobjptr != NULL) { firstdefobj=defobjptr->nodenext; freemem_defobj(defobjptr); defobjptr = firstdefobj; } firstdefobj = NULL; lastinserteddefobj = NULL; /* Clean up any remaining buttons in the treepanel */ firstitem = panel_get(treepanel, PANEL_FIRST_ITEM); while (firstitem != NULL) { tmpitem = panel_get(firstitem, PANEL_NEXT_ITEM); (void)panel_free(firstitem); firstitem = tmpitem; }}/* * Return the defaults full path nodename corresponding to defaults object * pointed to by defobjptr. */static char*getnodename_defobj(defobjptr) Defobj defobjptr;{ char tmpname[DE_FULLNAME_MAX_LENGTH]; char* nodename; if (defobjptr==NULL) { deferror("NULL pointer in getnodename_defobj", False); stop(); } if (defobjptr->nodetype==Editstring || defobjptr->nodetype==Editenumerate) { (void)strcpy(tmpname, get_cur_progname()); (void)strcat(tmpname, "/"); (void)strcat(tmpname, (char*)panel_get(defobjptr->ilabel, PANEL_VALUE)); nodename = getchars(strlen(tmpname)); (void)strcpy(nodename, tmpname); return nodename; } return defobjptr->nodename;}Debug( Bool t_subtree_extractinfo = False; )/* * subtree_extractinfo() checks each panel item and if it reflects a * different value than that stored in the in-memory database, * and if store_panel_values is true, it extracts the new values * from the items and copies it to the database. It also returns a * Bool(ean) which indicates whethe any of the items reflect different * values. * * When store_panel_values is False, subtree_extractinfo() essentially * tests whether or not there are values in the parameters that might * need saving. */static Boolsubtree_extractinfo(store_panel_values) Bool store_panel_values;{ Defobj defobjptr; Defobj prevobjptr; int intvalue; char* strvalue; char strvalue2[DE_NAME_ITEM_MAX_LENGTH]; char* nodename; Bool changedflg; /* True if any panel value change */ int progname_pos; /* Possible program name position */ changedflg = False; defobjptr = firstdefobj; prevobjptr = firstdefobj; while (defobjptr != NULL) { switch (defobjptr->nodetype) { case Message: { /* do nothing */ } break; case Enumerate: intvalue = (int)panel_get_value(defobjptr->ivalue); (void)get_enum_member_string(defobjptr->nodename, intvalue, strvalue2); if ((store_panel_values && deflt_always_save( defobjptr->nodename)) || (!strequal(strvalue2, defaults_get_string(defobjptr->nodename, strvalue2, (int *)NULL))) ) { if (store_panel_values) { /* set_enumeration same as set_string but does additional checking */ defaults_set_enumeration(defobjptr->nodename, strvalue2, (int *)NULL); } changedflg = True; } break; case String: strvalue = panel_get_value(defobjptr->ivalue); (void)convert_string(strvalue, strvalue2); if (strequal(strvalue, "")) { (void)strcpy(strvalue2, defaults_get_default(defobjptr->nodename, "", (int *)NULL)); } if (!strequal(strvalue2, defaults_get_string(defobjptr->nodename, strvalue2, (int *)NULL)) ) { if (store_panel_values) { defaults_set_string(defobjptr->nodename, strvalue2, (int *)NULL); } changedflg = True; } break; case Editstring: /* This text node was inserted. Extract the label string and construct a corresponding node in the defaults database. */ nodename=getnodename_defobj(defobjptr); changedflg = True; if (store_panel_values) { if (! strequal(nodename, "")) { strvalue = panel_get_value(defobjptr->ivalue); (void)convert_string(strvalue, strvalue2); if (strequal(strvalue, "") && defaults_exists(nodename, (int *)NULL)) { (void)strcpy(strvalue2, defaults_get_default(nodename, "", (int *)NULL)); } defaults_set_string(nodename, strvalue2, (int *)NULL); if (defobjptr->nodename!=NULL) { subtree_copy(defobjptr->nodename, nodename); defaults_set_string(nodename, strvalue2, (int *)NULL); defaults_move(getnodename_defobj(prevobjptr), nodename, False, (int *)NULL); defaults_remove(defobjptr->nodename, (int *)NULL); } else { defaults_move(getnodename_defobj(prevobjptr), nodename, False, (int *)NULL); } } } break; case Editenumerate: { /* This enumeration node was inserted. Extract the label string and construct a corresponding node in the defaults database. */ nodename=getnodename_defobj(defobjptr); changedflg = True; if (store_panel_values) { if (! strequal(nodename, "")) { intvalue = (int)panel_get_value(defobjptr->ivalue); (void)get_enum_member_string(defobjptr->nodename,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -