#help_index "DolDoc/Form" U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE) { CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e; if (doc->flags & DOCF_FORM) { if (doc_e==doc) goto ff_recover; while (!Bt(doldoc.type_flags_form,doc_e->type_u8) && !(doc_e->de_flags&DOCEF_LINK) || doc_e->de_flags&DOCEF_SKIP_IN_FORM) { doc_e=doc_e->next; if (doc_e==doc) { ff_recover: doc->cur_col=0; if (!giveup) { doc->cur_entry=doc_e->last; DocFormBwd(doc,TRUE); } else doc->cur_entry=doc; return; } } } while (doc_e->type_u8==DOCT_INDENT) doc_e=doc_e->next; if (doc_e!=doc_e2) { doc->cur_col=doc_e->min_col; doc->cur_entry=doc_e; } } U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE) { CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e; if (doc->flags & DOCF_FORM) { while (!Bt(doldoc.type_flags_form,doc_e->type_u8) && !(doc_e->de_flags&DOCEF_LINK) || doc_e->de_flags&DOCEF_SKIP_IN_FORM) { doc_e=doc_e->last; if (doc_e==doc) { doc->cur_col=0; if (!giveup) { doc->cur_entry=doc_e->next; DocFormFwd(doc,TRUE); } else doc->cur_entry=doc; return; } } } while (doc_e->type_u8==DOCT_INDENT) doc_e=doc_e->next; if (doc_e!=doc_e2) { doc->cur_col=doc_e->min_col; doc->cur_entry=doc_e; } } U0 DocDataFmt(CDoc *doc,CDocEntry *doc_e,I64 d=DOCM_CANCEL) { I64 i; U8 *ptr; CHashDefineStr *temph; if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR || doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) { if (d==DOCM_CANCEL) { if (doc_e->de_flags & DOCEF_DATA_IS_PTR) { if (!(ptr=doc_e->data)) return; } else ptr=&doc_e->data; switch(doc_e->raw_type) { case RT_I0: case RT_U0: d=0; break; case RT_I8: d=*ptr(I8 *); break; case RT_U8: d=*ptr(U8 *); break; case RT_I16: d=*ptr(I16 *); break; case RT_U16: d=*ptr(U16 *); break; case RT_I32: d=*ptr(I32 *); break; case RT_U32: d=*ptr(U32 *); break; default: d=*ptr(I64 *); } } if (doc_e->type_u8==DOCT_DATA) { StrPrint(doc_e->tag,doc_e->aux_str,d,doc_e->my_fmt_data); if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) { i=StrLen(doc_e->tag); doc_e->tag[i++]='_'; doc_e->tag[i]=0; } doc_e->max_col=StrLen(doc_e->tag); } else if (doc_e->de_flags & DOCEF_LST) { if (doc_e->de_flags & DOCEF_DEFINE && (temph=HashFind(doc_e->define_str, doc->win_task->hash_table,HTT_DEFINE_STR)) && 0<=dcnt) { ptr=MStrPrint("[%s]",temph->sub_lst[d]); Free(doc_e->tag); doc_e->tag=StrNew(ptr,doc->mem_task); Free(ptr); } else { Free(doc_e->tag); doc_e->tag=StrNew("[]",doc->mem_task); } } else { if (d) doc_e->de_flags|=DOCEF_CHECKED_COLLAPSED; else doc_e->de_flags&=~DOCEF_CHECKED_COLLAPSED; } } } U0 DocDataScan(CDoc *doc,CDocEntry *doc_e) { I64 i,d; U8 *ptr,*ptr1,*ptr2; CHashDefineStr *temph; if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR || doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) { if (doc_e->de_flags & DOCEF_DATA_IS_PTR) { if (!(ptr=doc_e->data)) return; } else ptr=&doc_e->data; if (doc_e->type_u8==DOCT_DATA) { i=StrLen(doc_e->tag); if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) doc_e->tag[--i]=0; if (i>doc_e->len+doc_e->min_col) doc_e->tag[doc_e->len+doc_e->min_col]=0; if (RT_I8<=doc_e->raw_type<=RT_U32) { StrScan(doc_e->tag,doc_e->aux_str,&d,doc_e->my_fmt_data); if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) doc_e->tag[i]='_'; } else if (RT_I64<=doc_e->raw_type<=RT_UF64) { StrScan(doc_e->tag,doc_e->aux_str,ptr,doc_e->my_fmt_data); if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) doc_e->tag[i]='_'; return; } } else if (doc_e->de_flags & DOCEF_LST) { d=0; if (doc_e->tag && doc_e->de_flags & DOCEF_DEFINE && (temph=HashFind(doc_e->define_str, doc->win_task->hash_table,HTT_DEFINE_STR))) { ptr1=ptr2=StrNew(doc_e->tag); if (*ptr2=='[') { ptr2++; i=StrLen(ptr2); if (ptr2[i-1]==']') ptr2[i-1]=0; } d=LstMatch(ptr2,temph->data); Free(ptr1); } } else { if (doc_e->de_flags & DOCEF_CHECKED_COLLAPSED) d=TRUE; else d=FALSE; } switch(doc_e->raw_type) { case RT_I8: case RT_U8: *ptr(U8 *)=d; case RT_I0: case RT_U0: break; case RT_I16: case RT_U16: *ptr(U16 *)=d; break; case RT_I32: case RT_U32: *ptr(U32 *)=d; break; default: *ptr(I64 *)=d; } } } #help_index "DolDoc/Input;StdIn/DolDoc" public Bool DocForm(U8 *_d,U8 *class_name=lastclass, I64 dof_flags=0,U8 *header=NULL,U8 *footer=NULL) {//User input. Supply a class name that has fmtstr definitions. //See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$. CMemberLst *ml; CDocEntry *doc_e; U8 *fmtstr; CHashClass *tempc; CDoc *doc; Bool result=FALSE; I64 old_border_src=Fs->border_src,has_action; if (!(tempc=HashFind(class_name,Fs->hash_table,HTT_CLASS))) return FALSE; doc=DocNew; doc->desc='Form'; if (header) DocPrint(doc,"%s",header); doc->flags|=DOCF_OVERSTRIKE|DOCF_FORM; if (dof_flags&DOF_MIN_SIZE) doc->flags|=DOCF_MIN_SIZE; ml=tempc->member_lst_and_root; while (ml) { if (fmtstr=MemberMetaData("fmtstr",ml)) { doc_e=DocPrint(doc,"%s",fmtstr); doc_e->data=_d+ml->offset; doc_e->my_fmt_data=MemberMetaData("fmtdata",ml); DocDataFmt(doc,doc_e); } ml=ml->next; } if (footer) DocPrint(doc,"%s",footer); if (doc->root.next!=doc) { Fs->border_src=BDS_CONST; DocRecalc(doc); if (DocEd(doc,dof_flags)) { doc_e=doc->cur_entry; result=TRUE; if (doc_e!=doc) { if (DocEntryRun(doc,doc_e,TRUE,&has_action)==DOCM_CANCEL && has_action) result=FALSE; DocUnlock(doc); } } } DocDel(doc); Fs->border_src=old_border_src; return result; } U0 DocMenuEndTaskCB() { WinToTop; throw; } public I64 DocMenu(CDoc *m,I64 dof_flags=0) {//Run menu chooser doc. Returns menu doc unlocked. U8 *old_end_cb=Fs->task_end_cb; Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC); CDocEntry *doc_e; I64 old_border_src=Fs->border_src,result=DOCM_CANCEL,has_action; Fs->task_end_cb=&DocMenuEndTaskCB; try { if (m) { m->desc='Menu'; Fs->border_src=BDS_CONST; dm_restart: if (DocEd(m,dof_flags)) { doc_e=m->cur_entry; if (doc_e!=m) { result=DocEntryRun(m,doc_e,TRUE,&has_action); DocUnlock(m); if (!has_action) { result=DOCM_CANCEL; dof_flags|=DOF_DONT_HOME; goto dm_restart; } } } } } catch { if (!Fs->except_ch) { if (!(dof_flags & DOF_INTERCEPT_TASK_END)) Exit; Fs->catch_except=TRUE; } } LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc); Fs->border_src=old_border_src; Fs->task_end_cb=old_end_cb; return result; } public I64 PopUpMenu(CDoc *doc,I64 dof_flags=0) {//Run menu chooser doc in PopUp win task. doc->flags|=DOCF_MIN_SIZE | DOCF_FORM; return PopUpPrint("DocMenu(0x%X,0x%X);",doc,dof_flags); } public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass, I64 dof_flags=DOF_MIN_SIZE,U8 *header=NULL,U8 *footer=NULL) {//See $LK,"::/Demo/DolDoc/Form.CPP"$ and $LK,"::/Demo/LastClass.CPP"$. return PopUpPrint("DocForm(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name, dof_flags,header,footer); }