📄 defaultsedit.c
字号:
intvalue, strvalue2); defaults_set_enumeration(nodename, strvalue2, (int *)NULL); if (defobjptr->nodename!=NULL) { subtree_copy(defobjptr->nodename, nodename); defaults_set_enumeration(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 Undefined: break; /* Do nothing */ default: /* Do nothing */ break; } prevobjptr = defobjptr; defobjptr = defobjptr->nodenext; } /* If there is an helpstring displayed, store this helpstring in the database *//**** Commented out in order to not allow helptext editing in defaultsedit helpobjptr = (Defobj)panel_get(helpdisplayitem, PANEL_CLIENT_DATA); if (! strequal(helpobjptr->nodename, "")) { (void)strcpy(fullname, helpobjptr->nodename); (void)strcat(fullname, "/$Help"); helpstr = (char*)panel_get_value(helpdisplayitem); if (strequal(helpstr, "")) { if (store_panel_values) { defaults_remove(fullname, (int *)NULL); } changedflg = True; } else if (!strequal(helpstr, nohelpavail)){ if (store_panel_values) { (void)convert_string(helpstr, helpstr2); defaults_set_string(fullname, helpstr2, (int *)NULL); } changedflg = True; } }****/ /* Now we have to set the changed flag for special format programs */ progname_pos = member_pos(get_cur_progname(), specformatnames); if (progname_pos != -1) { specformatnames[progname_pos]->changed = changedflg; } Debug(if (t_subtree_extractinfo) printf("<subtree_extractinfo: store_panel_values=%d changedflg=%d> ", store_panel_values,changedflg);) return changedflg;}/* * Display all information from the defaults database * for the currently selected program. * This information is displayed in the treepanel. * All panel items are created from scratch. */static voidsubtree_show(){ char namenode[DE_FULLNAME_MAX_LENGTH]; char childforkname[DE_FULLNAME_MAX_LENGTH]; char buttontext[DE_FULLNAME_MAX_LENGTH]; char accessname[DE_FULLNAME_MAX_LENGTH]; Bool flg; firstdefobj = NULL; lastinserteddefobj = NULL; last_clicked_defobj = NULL; show_message((char *)NULL, "", ""); (void)panel_paint(treepanel, PANEL_CLEAR); (void)strcpy(namenode, get_cur_progname()); /* Check if subtree has info stored in spec format, like .mailrc */ flg = specialformat_to_defaults(namenode); if (flg != True) return; /* Return if not successful conversion */ (void)strcpy(accessname, namenode); /* Set scrollbar position to zero */ (void)scrollbar_set((Scrollbar)(LINT_CAST( panel_get(treepanel, PANEL_VERTICAL_SCROLLBAR))), SCROLL_VIEW_START, 0, SCROLL_REQUEST_MOTION, SCROLL_ABSOLUTE, 0); (void)win_post_id_and_arg(treepanel, SCROLL_REQUEST, NOTIFY_SAFE, panel_get(treepanel, PANEL_VERTICAL_SCROLLBAR), NOTIFY_COPY_NULL, NOTIFY_RELEASE_NULL); subtree_showitems(accessname, False); (void)strcat(namenode, "/$Setup_program"); if (defaults_exists(namenode, (int *)NULL)) { (void)strcpy(childforkname, defaults_get_string(namenode, "", (int *)NULL)); (void)strcpy(buttontext, "Click to start setup program: "); (void)strcat(buttontext, childforkname); (void)panel_create_item(treepanel, PANEL_BUTTON, PANEL_FEEDBACK, PANEL_INVERTED, PANEL_NOTIFY_PROC, tree_runsetup_notifyproc, PANEL_LABEL_IMAGE, panel_button_image(treepanel,buttontext,0,(Pixfont *)NULL), PANEL_CLIENT_DATA, NULL, 0); cur_ylinenr = cur_ylinenr+1; } (void)panel_paint(treepanel, PANEL_CLEAR);}/* * Do a preorder traversal of the defaults database subtree denoted * by nodename, and display all leaf nodes, or intermediate nodes * with values. Display nodes as text items or choice items. */static voidsubtree_showitems(nodename, showparentflg) char* nodename; /* Full name of node to show data from */ Bool showparentflg; /* if Not showparentflg, do not make */ /* a panel_item out of nodename */{ char sibling[DE_FULLNAME_MAX_LENGTH]; Defaulttype type; /* Enumerate or String type defaults node */ if (nodename == NULL) return; type = get_nodetype(nodename); if (type==Message) { showitem(nodename, Message); return; } if (showparentflg) { if (type==Enumerate) { showitem(nodename, type); return; } else { showitem(nodename, type); } } deflt_get_fullchild(nodename, sibling); while (sibling!= NULL && strlen(sibling) != 0) { subtree_showitems(sibling, True); deflt_get_fullsibling(nodename, sibling, sibling); }}static Booldisplayable_node(nodename)/* * Returns TRUE if node with name nodename is a node which is to be displayed. * Nodenames containing $ are not displayable nodes: /fum/$Help, /fie/$Fum * Otherwise, a displayable node is a leaf node or an intermediate level * node with a non-empty string standard value or user-assigned value. * A leaf node is a node which does not have any non-dollar children. */ char* nodename;{ int nch; char childname[DE_FULLNAME_MAX_LENGTH]; int nodenamelen1; for (nch=strlen(nodename)-1; nch>0; nch--) { if (nodename[nch]=='/' ) { if (nodename[nch+1]=='$') return False; else break; } } if ( ! strequal(defaults_get_default(nodename, "", (int *)NULL), DEFAULTS_UNDEFINED) || ! strequal(defaults_get_string(nodename, "", (int *)NULL), DEFAULTS_UNDEFINED) ) return True; nodenamelen1 = strlen(nodename)+1; deflt_get_fullchild(nodename, childname); while (!strequal(childname, "") ) { if (childname[nodenamelen1] != '$') return False; /* This node has non-dollar child */ deflt_get_fullsibling(nodename, childname, childname); } return True; /* This node is a proper leaf node */}/* * Retrieve standard value from master_defaults for nodename. * Store it into standardval, which is a pointer to a string area. */static char*get_standard_valuestr(nodename, standardval) char* nodename; /* full_name of a node */ char* standardval; /* pointer to string area for standard value */{ char* tmp; if (nodename == NULL) { (void)strcpy(standardval, ""); } else if (defaults_exists(nodename, (int *)NULL)) { tmp = defaults_get_default(nodename, "", (int *)NULL); (void)strcpy(standardval, tmp); } return standardval;}/* * Create and initialize a default panel object, which groups several * panel items together. * There are text panel objects and enumeration panel objects. * Each of these contains several panel items * Each tree panel item points to an instance of */static Defobjcreate_defobj(nodename, objtype) char* nodename; Defaulttype objtype;{ Defobj defobjptr; defobjptr = (Defobj)(LINT_CAST(get_memory(sizeof *defobjptr))); defobjptr->nodetype = objtype; defobjptr->nodename = strcpy(getchars(strlen(nodename)), nodename); defobjptr->nodenext = NULL; defobjptr->ilabel = NULL; defobjptr->ivalue = NULL; defobjptr->specifichelp = False; return defobjptr;}/* * free memory occupied by defaults object and associated data. */static voidfreemem_defobj(defobjptr) Defobj defobjptr;{ if (defobjptr->nodetype==Enumerate || defobjptr->nodetype==Editenumerate) { (void)panel_free(defobjptr->ilabel); (void)panel_free(defobjptr->ivalue); (void)panel_free(defobjptr->ifill1); } else if (defobjptr->nodetype==String || defobjptr->nodetype==Editstring) { (void)panel_free(defobjptr->ilabel); (void)panel_free(defobjptr->ivalue); } free_mem((int)defobjptr->nodename); free_mem((int)defobjptr);}/* * Display defaults node with name nodename on the tree panel. */static voidshowitem(nodename, type) char* nodename; Defaulttype type;{ int ycoord; char* labelptr; Defobj defobjptr; if (type==String && !displayable_node(nodename)) return; labelptr = nodename+strlen(get_cur_progname())+1; /* add one pixel to avoid starting at pixel zero */ ycoord = PANEL_CU(cur_ylinenr) + 1; cur_ylinenr = cur_ylinenr+1; if (type==Enumerate) { defobjptr=create_enum_defobj(labelptr, nodename, ycoord, False); } else if (type==Message) { defobjptr=create_message_defobj(labelptr, nodename, ycoord, False); } else { defobjptr=create_text_defobj(labelptr, nodename, ycoord, False); } if (firstdefobj==NULL) { firstdefobj = defobjptr; lastinserteddefobj = firstdefobj; } else { lastinserteddefobj->nodenext = defobjptr; lastinserteddefobj = defobjptr; }}/* * Create a default object of type String, which represents a defaults * database text node. */static Defobjcreate_text_defobj(labelname, nodenamei, ycoord, labeleditflg) char* labelname; /* Label of panel item */ char* nodenamei; /* Full defaults database path name */ int ycoord; /* Panel item y coordinate */ Bool labeleditflg; /* True if label should be editable */{ Panel_item pitem; char standardval[DE_NAME_ITEM_MAX_LENGTH]; char valuestr[DE_NAME_ITEM_MAX_LENGTH]; char tmp[DE_NAME_ITEM_MAX_LENGTH]; char labelstr[DE_ITEM_MAX_LABEL_LENGTH]; char* nodename; int valuepos; int valuealloclen; Defobj defobjptr; Bool standarddefinedflg; if (labeleditflg) { defobjptr = create_defobj(nodenamei, Editstring); defobjptr->ilabel=panel_create_item(treepanel, PANEL_TEXT, PANEL_ITEM_X, PANEL_CU(0), PANEL_ITEM_Y, ycoord, PANEL_VALUE_DISPLAY_LENGTH, DE_STANDARD_DISPLAYLEN, PANEL_VALUE_STORED_LENGTH, DE_FULLNAME_MAX_LENGTH, PANEL_VALUE, labelname, PANEL_EVENT_PROC, tree_text_eventproc, PANEL_CLIENT_DATA, defobjptr, 0); } else { defobjptr = create_defobj(nodenamei, String); defobjptr->ilabel=panel_create_item(treepanel, PANEL_MESSAGE, PANEL_ITEM_X, PANEL_CU(0), PANEL_ITEM_Y, ycoord, PANEL_LABEL_STRING, labelname, PANEL_LABEL_BOLD, True, PANEL_EVENT_PROC, tree_text_eventproc, PANEL_CLIENT_DATA, defobjptr, 0); } nodename = defobjptr->nodename; (void)strcpy(labelstr, ""); if (defaults_exists(nodename, (int *)NULL)) { (void)strcpy(tmp, defaults_get_string(nodename, "", (int *)NULL)); } else { (void)strcpy(tmp, ""); } defaults_str_unparse(tmp, valuestr); standarddefinedflg = True; if (labeleditflg) (void)strcpy(standardval, ""); else { (void)get_standard_valuestr(nodename, tmp); if (strequal(tmp, DEFAULTS_UNDEFINED)) { defaults_str_unparse(tmp, standardval); if (strequal(valuestr, standardval)) (void)strcpy(valuestr, ""); (void)strcpy(standardval, ""); standarddefinedflg = False; } else { defaults_str_unparse(tmp, standardval); } } valuealloclen=MAX(strlen(valuestr)+DE_MIN_VALUE_STOREDLEN, 2*DE_MIN_VALUE_STOREDLEN); if (strequal(valuestr, standardval)) (void)strcpy(valuestr, ""); if (strlen(standardval)>DE_STANDARD_DISPLAYLEN) { standardval[DE_STANDARD_DISPLAYLEN-3]='\0'; (void)strcat(standardval, "..."); } if (standarddefinedflg) { (void)strcpy(labelstr, "("); (void)strcat(labelstr, standardval); (void)strcat(labelstr, "):"); } else { (void)strcpy(labelstr, " :"); } valuepos = strlen(labelname)+strlen(labelstr)+1; valuepos = MAX(DE_ITEMLABELPOS, valuepos); pitem = panel_create_item(treepanel, PANEL_TEXT, PANEL_ITEM_X, PANEL_CU(valuepos-strlen(labelstr)), PANEL_ITEM_Y, ycoord, PANEL_LABEL_STRING, labelstr, PANEL_VALUE_STORED_LENGTH, valuealloclen, PANEL_VALUE_DISPLAY_LENGTH, valuealloclen, PANEL_EVENT_PROC, tree_text_eventproc, PANEL_CLIENT_DATA, defobjptr, PANEL_PAINT, PANEL_NONE, PANEL_NOTIFY_PROC, panel_notify_proc, PANEL_NOTIFY_LEVEL, PANEL_ALL, 0); (void)panel_set(pitem, PANEL_VALUE, valuestr, PANEL_PAINT, PANEL_NONE, 0); defobjptr->ivalue=pitem; return defobjptr;}/* * Create a default object of type Message, which represents a defaults * database $Message node, which has $Message as a child. * The value of the $Message child node is the textstring which should * be printed out in the panel as a value. *//* ARGSUSED */static Defobjcreate_message_defobj(labelname, nodenamei, ycoord, labeleditflg) char* labelname; /* Label of panel item */ char* nodenamei; /* Full defaults database path name */ int ycoord; /* Panel item y coordinate */ Bool labeleditflg; /* True if label should be editable */{ char valuestr[DE_NAME_ITEM_MAX_LENGTH]; char tmp[DE_NAME_ITEM_MAX_LENGTH]; char nodename[DE_ITEM_MAX_LABEL_LENGTH]; Defobj defobjptr; defobjptr = create_defobj(nodenamei, Message); (void)strcpy(nodename, nodenamei); (void)strcat(nodename, "/$Message"); (void)strcpy(tmp, defaults_get_string(nodename, "", (int *)NULL)); defaults_str_unparse(tmp, valuestr); defobjptr->ilabel=panel_create_item(treepanel, PANEL_MESSAGE, PANEL_ITEM_X, PANEL_CU(0), PANEL_ITEM_Y, ycoord, PANEL_LABEL_STRING, valuestr, PANEL_CLIENT_DATA, defobjptr, 0); defobjptr->ivalue=NULL; return defobjptr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -