hschumann2/TempleOS-Source-Code
0832
1 2#help_index "DolDoc/Form"3 4U0 DocFormFwd(CDoc *doc,Bool giveup=FALSE)5{6 CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;7 if (doc->flags & DOCF_FORM) {8 if (doc_e==doc) goto ff_recover;9 while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&10 !(doc_e->de_flags&DOCEF_LINK) ||11 doc_e->de_flags&DOCEF_SKIP_IN_FORM) {12 doc_e=doc_e->next;13 if (doc_e==doc) {14ff_recover:15 doc->cur_col=0;16 if (!giveup) {17 doc->cur_entry=doc_e->last;18 DocFormBwd(doc,TRUE);19 } else20 doc->cur_entry=doc;21 return;22 }23 }24 }25 while (doc_e->type_u8==DOCT_INDENT)26 doc_e=doc_e->next;27 if (doc_e!=doc_e2) {28 doc->cur_col=doc_e->min_col;29 doc->cur_entry=doc_e;30 }31}32 33U0 DocFormBwd(CDoc *doc,Bool giveup=FALSE)34{35 CDocEntry *doc_e=doc->cur_entry,*doc_e2=doc_e;36 if (doc->flags & DOCF_FORM) {37 while (!Bt(doldoc.type_flags_form,doc_e->type_u8) &&38 !(doc_e->de_flags&DOCEF_LINK) ||39 doc_e->de_flags&DOCEF_SKIP_IN_FORM) {40 doc_e=doc_e->last;41 if (doc_e==doc) {42 doc->cur_col=0;43 if (!giveup) {44 doc->cur_entry=doc_e->next;45 DocFormFwd(doc,TRUE);46 } else47 doc->cur_entry=doc;48 return;49 }50 }51 }52 while (doc_e->type_u8==DOCT_INDENT)53 doc_e=doc_e->next;54 if (doc_e!=doc_e2) {55 doc->cur_col=doc_e->min_col;56 doc->cur_entry=doc_e;57 }58}59 60U0 DocDataFmt(CDoc *doc,CDocEntry *doc_e,I64 d=DOCM_CANCEL)61{62 I64 i;63 U8 *ptr,*ptr2;64 CHashDefineStr *tmph;65 if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||66 doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {67 if (d==DOCM_CANCEL) {68 if (doc_e->de_flags&DOCEF_DEREF_DATA &&69 !(doc_e->de_flags&DOCEF_REMALLOC_DATA)) {70 if (!(ptr=doc_e->data)) return;71 } else72 ptr=&doc_e->data;73 switch (doc_e->raw_type) {74 case RT_I0:75 case RT_U0: d=0; break;76 case RT_I8: d=*ptr(I8 *); break;77 case RT_U8: d=*ptr(U8 *); break;78 case RT_I16: d=*ptr(I16 *); break;79 case RT_U16: d=*ptr(U16 *); break;80 case RT_I32: d=*ptr(I32 *); break;81 case RT_U32: d=*ptr(U32 *); break;82 default: d=*ptr(I64 *);83 }84 }85 if (doc_e->type_u8==DOCT_DATA) {86 if (doc_e->de_flags & DOCEF_REMALLOC_DATA) {87 ptr=MStrPrint(doc_e->aux_str,d,doc_e->my_fmt_data);88 i=StrLen(ptr);89 if (!doc_e->data) {90 doc_e->data=CAlloc(2,doc->mem_task);91 doc_e->len=MSize(doc_e->data)-2;92 }93 if (doc_e->len+doc_e->min_col>i)94 MemCpy(doc_e->tag,ptr,i+1);95 else {96 ptr2=MAlloc(i+8,doc->mem_task);97 doc_e->len=MSize(ptr2)-doc_e->min_col-2; //See DataTagWidth98 MemCpy(ptr2,ptr,i+1);99 Free(doc_e->tag);100 doc_e->tag=ptr2;101 }102 Free(ptr);103 } else {104 StrPrint(doc_e->tag,doc_e->aux_str,d,doc_e->my_fmt_data);105 i=StrLen(doc_e->tag);106 }107 if (doc_e->de_flags & DOCEF_HAS_TERMINATOR) {108 doc_e->tag[i++]='_';109 doc_e->tag[i]=0;110 }111 doc_e->max_col=i;112 } else if (doc_e->de_flags & DOCEF_LST) {113 if (doc_e->de_flags & DOCEF_DEFINE && (tmph=HashFind(doc_e->define_str,114 doc->win_task->hash_table,HTT_DEFINE_STR)) && 0<=d<tmph->cnt) {115 ptr=MStrPrint("[%s]",tmph->sub_idx[d]);116 Free(doc_e->tag);117 doc_e->tag=StrNew(ptr,doc->mem_task);118 Free(ptr);119 } else {120 Free(doc_e->tag);121 doc_e->tag=StrNew("[]",doc->mem_task);122 }123 } else {124 if (d)125 doc_e->de_flags|=DOCEF_CHECKED_COLLAPSED;126 else127 doc_e->de_flags&=~DOCEF_CHECKED_COLLAPSED;128 }129 }130}131 132U0 DocDataScan(CDoc *doc,CDocEntry *doc_e)133{134 I64 i,d;135 U8 *ptr,*ptr1,*ptr2;136 CHashDefineStr *tmph;137 if (doc_e->type_u8==DOCT_DATA && doc_e->de_flags&DOCEF_AUX_STR ||138 doc_e->type_u8==DOCT_CHECK_BOX || doc_e->de_flags & DOCEF_LST) {139 if (doc_e->de_flags&DOCEF_DEREF_DATA &&140 !(doc_e->de_flags&DOCEF_REMALLOC_DATA)) {141 if (!(ptr=doc_e->data)) return;142 } else143 ptr=&doc_e->data;144 if (doc_e->type_u8==DOCT_DATA) {145 i=StrLen(doc_e->tag);146 if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)147 doc_e->tag[--i]=0;148 if (i>doc_e->len+doc_e->min_col)149 doc_e->tag[doc_e->len+doc_e->min_col]=0;150 if (RT_I8<=doc_e->raw_type<=RT_U32) {151 StrScan(doc_e->tag,doc_e->aux_str,&d,doc_e->my_fmt_data);152 if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)153 doc_e->tag[i]='_';154 } else if (RT_I64<=doc_e->raw_type<=RT_UF64) {155 if (doc_e->de_flags & DOCEF_REMALLOC_DATA) {156 ptr=MAlloc(i-doc_e->min_col+8,doc->mem_task);157 MemCpy(ptr,doc_e->tag+doc_e->min_col,i-doc_e->min_col+1);158 Free(doc_e->data);159 doc_e->data=ptr;160 doc_e->len=MSize(ptr)-1;161 } else162 StrScan(doc_e->tag,doc_e->aux_str,ptr,doc_e->my_fmt_data);163 if (doc_e->de_flags & DOCEF_HAS_TERMINATOR)164 doc_e->tag[i]='_';165 return;166 }167 } else if (doc_e->de_flags & DOCEF_LST) {168 d=0;169 if (doc_e->tag && doc_e->de_flags & DOCEF_DEFINE &&170 (tmph=HashFind(doc_e->define_str,171 doc->win_task->hash_table,HTT_DEFINE_STR))) {172 ptr1=ptr2=StrNew(doc_e->tag);173 if (*ptr2=='[') {174 ptr2++;175 i=StrLen(ptr2);176 if (ptr2[i-1]==']')177 ptr2[i-1]=0;178 }179 d=LstMatch(ptr2,tmph->data);180 Free(ptr1);181 }182 } else {183 if (doc_e->de_flags & DOCEF_CHECKED_COLLAPSED)184 d=TRUE;185 else186 d=FALSE;187 }188 switch (doc_e->raw_type) {189 case RT_I8:190 case RT_U8:191 *ptr(U8 *)=d;192 case RT_I0:193 case RT_U0:194 break;195 case RT_I16:196 case RT_U16:197 *ptr(U16 *)=d;198 break;199 case RT_I32:200 case RT_U32:201 *ptr(U32 *)=d;202 break;203 default:204 *ptr(I64 *)=d;205 }206 }207}208 209#help_index "DolDoc/Input;StdIn/DolDoc"210public Bool DocForm(U8 *_d,U8 *class_name=lastclass,211 I64 dof_flags=0,U8 *header=NULL,U8 *footer=NULL)212{//User input. Supply a class name that has format definitions.213//See ::/Demo/DolDoc/Form.HC and ::/Demo/LastClass.HC.214 CMemberLst *ml;215 CDocEntry *doc_e;216 U8 *format;217 CHashClass *tmpc,*tmpc2;218 CDoc *doc;219 Bool res=FALSE;220 I64 old_border_src=Fs->border_src,has_action;221 if (!(tmpc=HashFind(class_name,Fs->hash_table,HTT_CLASS)))222 return FALSE;223 doc=DocNew;224 doc->desc='Form';225 if (header) DocPrint(doc,"%s",header);226 doc->flags|=DOCF_OVERSTRIKE|DOCF_FORM;227 if (dof_flags&DOF_SIZE_MIN)228 doc->flags|=DOCF_SIZE_MIN;229 ml=tmpc->member_lst_and_root;230 while (ml) {231 if ((format=MemberMetaData("format",ml)) &&232 (doc_e=DocPrint(doc,"%s",format))) {233 tmpc2=ml->member_class;234 if ((doc_e->type_u8==DOCT_DATA || doc_e->type_u8==DOCT_LST ||235 doc_e->type_u8==DOCT_CHECK_BOX) && !tmpc2->ptr_stars_cnt) {236 tmpc2=OptClassFwd(tmpc2);237 tmpc2-=tmpc2->ptr_stars_cnt;238 if (tmpc2->type & HTT_INTERNAL_TYPE) {239 if (ml->dim.next) { //Array240 if (tmpc2->raw_type==RT_U8 &&241 LBtr(&doc_e->de_flags,&DOCEf_DFT_LEN)) {242 doc_e->len=ml->dim.total_cnt;243 if (doc_e->de_flags&DOCEF_HAS_TERMINATOR)244 doc_e->len--;245 Free(doc_e->tag); //See DataTagWidth246 doc_e->tag=MAlloc(doc_e->len+doc_e->min_col+2,247 doc->mem_task); //+2 because "_\0"248 }249 } else if (LBtr(&doc_e->de_flags,DOCEf_DFT_RAW_TYPE))250 doc_e->raw_type=tmpc2->raw_type;251 }252 }253 if (doc_e->de_flags&DOCEF_REMALLOC_DATA) {254 doc_e->user_data=_d+ml->offset;255 doc_e->data=*doc_e->user_data(U8 **);256 } else257 doc_e->data=_d+ml->offset;258 doc_e->my_fmt_data=MemberMetaData("data",ml);259 DocDataFmt(doc,doc_e);260 }261 ml=ml->next;262 }263 if (footer) DocPrint(doc,"%s",footer);264 if (doc->head.next!=doc) {265 Fs->border_src=BDS_CONST;266 DocRecalc(doc);267 if (DocEd(doc,dof_flags)) {268 doc_e=doc->cur_entry;269 res=TRUE;270 if (doc_e!=doc) {271 if (DocEntryRun(doc,doc_e,TRUE,&has_action)==DOCM_CANCEL && has_action)272 res=FALSE;273 DocUnlock(doc);274 }275 }276 }277 doc_e=doc->head.next;278 while (doc_e!=doc) {279 if (doc_e->de_flags&DOCEF_REMALLOC_DATA) {280 *doc_e->user_data(U8 **)=doc_e->data;281 doc_e->data=NULL;282 }283 doc_e=doc_e->next;284 }285 DocDel(doc);286 Fs->border_src=old_border_src;287 return res;288}289 290U0 DocMenuEndTaskCB()291{292 WinToTop;293 throw;294}295 296public I64 DocMenu(CDoc *m,I64 dof_flags=0)297{//Run menu chooser doc. Returns menu doc unlocked.298 U8 *old_end_cb=Fs->task_end_cb;299 Bool old_break_shift_esc=LBts(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC);300 CDocEntry *doc_e;301 I64 old_border_src=Fs->border_src,res=DOCM_CANCEL,has_action;302 Fs->task_end_cb=&DocMenuEndTaskCB;303 try {304 if (m) {305 m->desc='Menu';306 Fs->border_src=BDS_CONST;307dm_restart:308 if (DocEd(m,dof_flags)) {309 doc_e=m->cur_entry;310 if (doc_e!=m) {311 res=DocEntryRun(m,doc_e,TRUE,&has_action);312 DocUnlock(m);313 if (!has_action) {314 res=DOCM_CANCEL;315 dof_flags|=DOF_DONT_HOME;316 goto dm_restart;317 }318 }319 }320 }321 } catch {322 if (!Fs->except_ch) {323 if (!(dof_flags & DOF_INTERCEPT_TASK_END))324 Exit;325 Fs->catch_except=TRUE;326 }327 }328 LBEqu(&Fs->task_flags,TASKf_BREAK_TO_SHIFT_ESC,old_break_shift_esc);329 Fs->border_src=old_border_src;330 Fs->task_end_cb=old_end_cb;331 return res;332}333 334public I64 PopUpMenu(CDoc *doc,I64 dof_flags=0)335{//Run menu chooser doc in PopUp win task.336 doc->flags|=DOCF_SIZE_MIN | DOCF_FORM;337 return PopUpPrint("DocMenu(0x%X,0x%X);",doc,dof_flags);338}339 340public Bool PopUpForm(U8 *_d,U8 *class_name=lastclass,341 I64 dof_flags=DOF_SIZE_MIN,U8 *header=NULL,U8 *footer=NULL)342{//See ::/Demo/DolDoc/Form.HC and ::/Demo/LastClass.HC.343 return PopUpPrint("DocForm(0x%X,0x%X,0x%X,0x%X,0x%X);",_d,class_name,344 dof_flags,header,footer);345}346 