31240
typedef struct uniquevaluecollection {
31241
ValNodePtr requested_field;
31242
GetFeatureFieldString fieldstring_func;
31243
GetDescriptorFieldString descrstring_func;
31244
FreeValNodeProc free_vn_proc;
31245
CopyValNodeDataProc copy_vn_proc;
31246
ValNodePtr value_lists;
31247
} UniqueValueCollectionData, PNTR UniqueValueCollectionPtr;
31250
static ClickableItemPtr FindExistingCategory (CharPtr description, ValNodePtr category_list)
31252
ClickableItemPtr cip;
31254
while (category_list != NULL) {
31255
cip = (ClickableItemPtr) category_list->data.ptrvalue;
31257
(StringCmp (description, cip->description) == 0
31258
|| (StringHasNoText (description) && StringHasNoText (cip->description)))) {
31261
category_list = category_list->next;
31267
static ValNodePtr DataInValNodeList (ValNodePtr list, Uint1 choice, Pointer ptrvalue)
31269
while (list != NULL) {
31270
if (choice == list->choice && ptrvalue == list->data.ptrvalue) {
31279
static void CombineClickableItemLists (ValNodePtr PNTR list1, ValNodePtr list2)
31281
ValNodePtr add_vnp, prev_vnp = NULL, next_vnp;
31283
if (*list1 == NULL) {
31286
} else if (list2 == NULL) {
31291
while (add_vnp != NULL) {
31292
next_vnp = add_vnp->next;
31293
if (DataInValNodeList (*list1, add_vnp->choice, add_vnp->data.ptrvalue)) {
31294
if (prev_vnp == NULL) {
31297
prev_vnp->next = next_vnp;
31299
add_vnp->next = NULL;
31300
ValNodeFree (add_vnp);
31302
prev_vnp = add_vnp;
31304
add_vnp = next_vnp;
31306
ValNodeLink (list1, list2);
31310
static void CombineClickableLists (ValNodePtr PNTR list1, ValNodePtr list2)
31312
ClickableItemPtr cip1, cip2;
31314
for (vnp = list2; vnp != NULL; vnp = vnp->next) {
31315
cip2 = vnp->data.ptrvalue;
31316
if (cip2 != NULL) {
31317
cip1 = FindExistingCategory (cip2->description, *list1);
31318
if (cip1 == NULL) {
31319
ValNodeAddPointer (list1, 0, cip2);
31320
vnp->data.ptrvalue = NULL;
31322
CombineClickableItemLists (&(cip1->item_list), cip2->item_list);
31323
cip2->item_list = NULL;
31327
list2 = FreeClickableList (list2);
31331
static void GetUniqueValuesFeatureCallback (SeqFeatPtr sfp, Pointer userdata, FilterSetPtr fsp)
31333
UniqueValueCollectionPtr uvcp;
31335
ValNodePtr check_vnp;
31336
ClickableItemPtr cip;
31338
if (sfp == NULL || userdata == NULL)
31343
uvcp = (UniqueValueCollectionPtr) userdata;
31344
if (uvcp->fieldstring_func == NULL)
31349
str = uvcp->fieldstring_func (sfp, uvcp->requested_field, NULL);
31350
cip = FindExistingCategory (str, uvcp->value_lists);
31352
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31353
MemSet (cip, 0, sizeof (ClickableItemData));
31354
cip->description = str;
31355
ValNodeAddPointer (&cip->item_list, OBJ_SEQFEAT, sfp);
31356
ValNodeAddPointer (&(uvcp->value_lists), 0, cip);
31358
str = MemFree (str);
31359
/* make sure feature isn't already in the list */
31360
for (check_vnp = cip->item_list; check_vnp != NULL; check_vnp = check_vnp->next) {
31361
if (check_vnp->choice == OBJ_SEQFEAT && sfp == check_vnp->data.ptrvalue) break;
31363
if (check_vnp == NULL) {
31364
ValNodeAddPointer (&cip->item_list, OBJ_SEQFEAT, sfp);
31369
static void GetUniqueValuesDescriptorCallback (SeqDescrPtr sdp, Pointer userdata, FilterSetPtr fsp)
31371
UniqueValueCollectionPtr uvcp;
31372
ClickableItemPtr cip;
31374
ValNodePtr check_vnp;
31376
if (sdp == NULL || userdata == NULL)
31381
uvcp = (UniqueValueCollectionPtr) userdata;
31382
if (uvcp->descrstring_func == NULL)
31387
str = uvcp->descrstring_func (sdp, uvcp->requested_field, NULL);
31389
cip = FindExistingCategory (str, uvcp->value_lists);
31392
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31393
MemSet (cip, 0, sizeof (ClickableItemData));
31394
cip->description = str;
31395
ValNodeAddPointer (&cip->item_list, OBJ_SEQDESC, sdp);
31396
ValNodeAddPointer (&(uvcp->value_lists), 0, cip);
31398
str = MemFree (str);
31399
/* make sure feature isn't already in the list */
31400
for (check_vnp = cip->item_list; check_vnp != NULL; check_vnp = check_vnp->next) {
31401
if (check_vnp->choice == OBJ_SEQDESC && sdp == check_vnp->data.ptrvalue) break;
31403
if (check_vnp == NULL) {
31404
ValNodeAddPointer (&cip->item_list, OBJ_SEQDESC, sdp);
31410
static ValNodePtr CheckForUniqueValuesInSeqEntry
31412
ValNodePtr requested_field,
31413
GetFeatureFieldString fieldstring_func,
31414
GetDescriptorFieldString descrstring_func,
31415
FreeValNodeProc free_vn_proc,
31416
CopyValNodeDataProc copy_vn_proc,
31418
Uint1 seqfeat_choice,
31419
Uint1 featdef_choice,
31420
Uint1 descr_choice)
31422
UniqueValueCollectionData uvcd;
31424
uvcd.fieldstring_func = fieldstring_func;
31425
uvcd.descrstring_func = descrstring_func;
31426
uvcd.free_vn_proc = free_vn_proc;
31427
uvcd.copy_vn_proc = copy_vn_proc;
31428
uvcd.requested_field = (copy_vn_proc) (requested_field);
31429
uvcd.value_lists = NULL;
31430
OperateOnSeqEntryConstrainedObjects (sep, fsp, GetUniqueValuesFeatureCallback,
31431
GetUniqueValuesDescriptorCallback,
31432
seqfeat_choice, featdef_choice,
31433
descr_choice, &uvcd);
31434
return uvcd.value_lists;
31439
GetUniqueValueListForSeqEntry
31442
ParseFieldPtr dst_field_data,
31445
ValNodePtr unique_values = NULL;
31446
ValNodePtr requested_field = NULL, vnp;
31447
SeqEntryPtr orig_sep;
31449
if (sep == NULL || dst_field_data == NULL)
31454
switch (dst_field_data->parse_field_type)
31456
case PARSE_FIELD_SOURCE_QUAL :
31457
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31458
dst_field_data->feature_field,
31459
GetSourceQualFeatureString,
31460
GetSourceQualDescrString,
31461
ValNodeSimpleDataFree,
31462
SourceQualValNodeDataCopy,
31467
case PARSE_FIELD_DEFLINE:
31468
requested_field = ValNodeNew (NULL);
31469
requested_field->data.intvalue = Seq_descr_title;
31470
unique_values = CheckForUniqueValuesInSeqEntry (sep, requested_field,
31472
GetStringFromStringDescriptor,
31473
NULL, IntValNodeCopy,
31474
fsp, 0, 0, Seq_descr_title);
31475
requested_field = ValNodeFree (requested_field);
31477
case PARSE_FIELD_BIOSRC_STRING:
31478
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31479
dst_field_data->feature_field,
31480
GetSourceFeatureString,
31481
GetSourceDescriptorString,
31482
NULL, IntValNodeCopy,
31487
case PARSE_FIELD_DBXREF:
31488
unique_values = CheckForUniqueValuesInSeqEntry (sep, dst_field_data->feature_field,
31489
GetBioSourceFeatureDbxrefString,
31490
GetBioSourceDescriptorDbxrefString,
31491
ValNodeSimpleDataFree,
31494
SEQFEAT_BIOSRC, 0, Seq_descr_source);
31496
case PARSE_FIELD_GENE_FIELD:
31497
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31498
dst_field_data->feature_field,
31499
GetGeneFieldString,
31501
NULL, IntValNodeCopy,
31503
SEQFEAT_GENE, 0, 0);
31505
case PARSE_FIELD_RNA_FIELD:
31506
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31507
dst_field_data->feature_field,
31510
NULL, IntValNodeCopy,
31513
dst_field_data->feature_subtype == NULL ? 0 : dst_field_data->feature_subtype->data.intvalue,
31516
case PARSE_FIELD_CDS_COMMENT:
31517
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31521
NULL, IntValNodeCopy,
31523
SEQFEAT_CDREGION, FEATDEF_CDS, 0);
31525
case PARSE_FIELD_COMMENT_DESC:
31526
requested_field = ValNodeNew (NULL);
31527
requested_field->data.intvalue = Seq_descr_comment;
31529
unique_values = CheckForUniqueValuesInSeqEntry (sep, requested_field,
31531
GetStringFromStringDescriptor,
31532
NULL, IntValNodeCopy,
31533
fsp, 0, 0, Seq_descr_comment);
31534
requested_field = ValNodeFree (requested_field);
31536
case PARSE_FIELD_PROTEIN_FIELD:
31537
unique_values = CheckForUniqueValuesInSeqEntry (sep,
31538
dst_field_data->feature_field,
31539
GetProteinFieldString,
31541
NULL, IntValNodeCopy,
31543
SEQFEAT_PROT, 0, 0);
31545
case PARSE_FIELD_IMPORT_QUAL:
31547
for (vnp = dst_field_data->feature_subtype; vnp != NULL; vnp = vnp->next)
31549
CombineClickableLists (&unique_values,
31550
CheckForUniqueValuesInSeqEntry (sep,
31551
dst_field_data->feature_field,
31554
NULL, IntValNodeCopy,
31555
fsp, 0, vnp->choice, 0));
31556
/* if we are also looking at features other than mat_peptides, use
31557
* original SeqEntry */
31561
case PARSE_FIELD_FEATURE_NOTE:
31563
for (vnp = dst_field_data->feature_field; vnp != NULL; vnp = vnp->next)
31565
CombineClickableLists (&unique_values,
31566
CheckForUniqueValuesInSeqEntry (sep, vnp,
31569
ValNodeSimpleDataFree,
31571
fsp, 0, vnp->choice, 0));
31572
/* if we are also looking at features other than mat_peptides, use
31573
* original SeqEntry */
31578
return unique_values;
31582
static SeqEntryPtr GetBestSeqEntryForItem (ValNodePtr vnp)
31587
SeqEntryPtr sep = NULL;
31590
if (vnp == NULL || vnp->data.ptrvalue == NULL) return NULL;
31592
if (vnp->choice == OBJ_SEQFEAT) {
31593
sfp = vnp->data.ptrvalue;
31594
sep = GetBestTopParentForData (sfp->idx.entityID, BioseqFindFromSeqLoc (sfp->location));
31595
} else if (vnp->choice == OBJ_SEQDESC) {
31596
sdp = vnp->data.ptrvalue;
31597
if (sdp->extended != 0) {
31598
ovp = (ObjValNodePtr) sdp;
31599
if (ovp->idx.parenttype == OBJ_BIOSEQSET) {
31600
sep = SeqMgrGetSeqEntryForData (ovp->idx.parentptr);
31601
} else if (ovp->idx.parenttype == OBJ_BIOSEQ) {
31602
sep = GetBestTopParentForData (ovp->idx.entityID, ovp->idx.parentptr);
31605
} else if (vnp->choice == OBJ_BIOSEQ) {
31606
bsp = (BioseqPtr) vnp->data.ptrvalue;
31607
sep = GetBestTopParentForData (bsp->idx.entityID, bsp);
31608
} else if (vnp->choice == OBJ_SEQENTRY) {
31609
sep = vnp->data.ptrvalue;
31614
static ValNodePtr GetSeqEntryListForItem (ValNodePtr vnp)
31619
SeqEntryPtr sep = NULL;
31622
ValNodePtr sep_list = NULL;
31624
if (vnp == NULL || vnp->data.ptrvalue == NULL) return NULL;
31626
if (vnp->choice == OBJ_SEQFEAT) {
31627
sfp = vnp->data.ptrvalue;
31628
sep = GetBestTopParentForData (sfp->idx.entityID, BioseqFindFromSeqLoc (sfp->location));
31629
ValNodeAddPointer (&sep_list, OBJ_SEQENTRY, sep);
31630
} else if (vnp->choice == OBJ_SEQDESC) {
31631
sdp = vnp->data.ptrvalue;
31632
if (sdp->extended != 0) {
31633
ovp = (ObjValNodePtr) sdp;
31634
if (ovp->idx.parenttype == OBJ_BIOSEQSET) {
31635
bssp = (BioseqSetPtr) ovp->idx.parentptr;
31636
if (bssp != NULL) {
31637
/* nuc_prot sets, segsets, and members of parts should travel together */
31638
if (bssp->_class == BioseqseqSet_class_nuc_prot) {
31639
sep = SeqMgrGetSeqEntryForData (bssp);
31641
ValNodeAddPointer (&sep_list, OBJ_SEQENTRY, sep);
31643
} else if (bssp->_class == BioseqseqSet_class_segset
31644
|| bssp->_class == BioseqseqSet_class_parts) {
31645
sep = bssp->seq_set;
31646
if (sep != NULL && IS_Bioseq (sep)) {
31647
bsp = sep->data.ptrvalue;
31648
sep = GetBestTopParentForData (bsp->idx.entityID, bsp);
31650
ValNodeAddPointer (&sep_list, OBJ_SEQENTRY, sep);
31654
sep = bssp->seq_set;
31655
while (sep != NULL) {
31656
ValNodeAddPointer (&sep_list, OBJ_SEQENTRY, sep);
31661
} else if (ovp->idx.parenttype == OBJ_BIOSEQ) {
31662
sep = GetBestTopParentForData (ovp->idx.entityID, ovp->idx.parentptr);
31664
ValNodeAddPointer (&sep_list, OBJ_SEQENTRY, sep);
31668
} else if (vnp->choice == OBJ_BIOSEQ) {
31669
bsp = (BioseqPtr) vnp->data.ptrvalue;
31670
sep = GetBestTopParentForData (bsp->idx.entityID, bsp);
31671
} else if (vnp->choice == OBJ_SEQENTRY) {
31672
sep = vnp->data.ptrvalue;
31678
static Boolean RemoveItemAndCategory (ClickableItemPtr cip, Uint1 choice, Pointer ptrvalue)
31680
ValNodePtr vnp, prev = NULL;
31681
Boolean found = FALSE;
31682
CharPtr description = NULL;
31683
ClickableItemPtr subcat;
31685
vnp = cip->item_list;
31686
while (vnp != NULL) {
31687
if (vnp->choice == choice && vnp->data.ptrvalue == ptrvalue) {
31689
if (prev == NULL) {
31690
cip->item_list = vnp->next;
31692
prev->next = vnp->next;
31695
description = GetDiscrepancyItemText (vnp);
31696
vnp = ValNodeFree (vnp);
31703
/* also remove subcategory */
31705
vnp = cip->subcategories;
31706
while (vnp != NULL) {
31707
subcat = (ClickableItemPtr) vnp->data.ptrvalue;
31708
if (subcat != NULL && StringCmp (subcat->description, description) == 0) {
31709
if (prev == NULL) {
31710
cip->subcategories = vnp->next;
31712
prev->next = vnp->next;
31715
vnp = FreeClickableList (vnp);
31725
static ValNodePtr RearrangeForSeqEntriesInMultipleCategories (ValNodePtr value_lists)
31727
ClickableItemPtr cip1, cip2, existing_cat;
31728
ValNodePtr vnp, check_vnp, last_vnp, vnp_item1, prev, vnp_next;
31730
CharPtr new_description;
31732
/* now check for SeqEntries that appear in multiple lists */
31733
for (vnp = value_lists; vnp != NULL && vnp->next != NULL; vnp = vnp->next) {
31734
if (vnp->data.ptrvalue == NULL) continue;
31735
last_vnp = vnp->next;
31736
while (last_vnp->next != NULL) {
31737
last_vnp = last_vnp->next;
31739
cip1 = (ClickableItemPtr) vnp->data.ptrvalue;
31740
for (vnp_item1 = cip1->item_list;
31742
vnp_item1 = vnp_next) {
31743
vnp_next = vnp_item1->next;
31745
if (vnp_item1->data.ptrvalue != NULL && vnp_item1->choice == OBJ_SEQENTRY) {
31746
check_vnp = vnp->next;
31747
while (check_vnp != NULL && !found) {
31748
if (check_vnp->data.ptrvalue != NULL) {
31749
cip2 = check_vnp->data.ptrvalue;
31750
found = RemoveItemAndCategory (cip2, vnp_item1->choice, vnp_item1->data.ptrvalue);
31753
if (check_vnp == last_vnp) {
31756
check_vnp = check_vnp->next;
31762
/* need to take this SeqEntry out of both lists, put in new category */
31763
new_description = (CharPtr) MemNew (sizeof (Char) * (StringLen (cip1->description)
31764
+ StringLen (cip2->description) + 6));
31765
if (StringCmp (cip1->description, cip2->description) < 0) {
31766
sprintf (new_description, "%s AND %s", cip1->description, cip2->description);
31768
sprintf (new_description, "%s AND %s", cip2->description, cip1->description);
31770
existing_cat = FindExistingCategory (new_description, check_vnp->next);
31771
if (existing_cat == NULL) {
31772
/* make new category, add to end of list */
31773
existing_cat = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31774
MemSet (existing_cat, 0, sizeof (ClickableItemData));
31775
existing_cat->description = new_description;
31776
ValNodeAddPointer (&value_lists, 0, existing_cat);
31778
new_description = MemFree (new_description);
31780
/* don't add item twice */
31781
if (!DataInValNodeList (existing_cat->item_list, vnp_item1->choice, vnp_item1->data.ptrvalue)) {
31782
ValNodeAddPointer (&(existing_cat->item_list), vnp_item1->choice, vnp_item1->data.ptrvalue);
31784
/* remove from cip1 */
31785
RemoveItemAndCategory (cip1, vnp_item1->choice, vnp_item1->data.ptrvalue);
31790
/* remove empty categories */
31791
for (vnp = value_lists, prev = NULL; vnp != NULL; vnp = vnp_next) {
31792
vnp_next = vnp->next;
31793
cip1 = (ClickableItemPtr) vnp->data.ptrvalue;
31794
if (cip1 == NULL || cip1->item_list == NULL) {
31795
if (prev == NULL) {
31796
value_lists = vnp->next;
31798
prev->next = vnp->next;
31801
vnp = FreeClickableList (vnp);
31806
return value_lists;
31810
static ValNodePtr ChangeUniqueValueListsToSeqEntryLists (ValNodePtr value_lists)
31812
ValNodePtr vnp, vnp_item, new_item_list, new_vnp, sep_list, sep_vnp;
31813
ClickableItemPtr cip, subcat;
31815
CharPtr description;
31817
/* First, add SeqEntry for each feature or descriptor to the item list */
31818
for (vnp = value_lists; vnp != NULL; vnp = vnp->next) {
31819
cip = (ClickableItemPtr) vnp->data.ptrvalue;
31820
new_item_list = NULL;
31822
for (vnp_item = cip->item_list; vnp_item != NULL; vnp_item = vnp_item->next) {
31823
if (vnp_item->data.ptrvalue == NULL) continue;
31824
sep_list = GetSeqEntryListForItem (vnp_item);
31825
for (sep_vnp = sep_list; sep_vnp != NULL; sep_vnp = sep_vnp->next) {
31826
sep = sep_vnp->data.ptrvalue;
31827
new_vnp = DataInValNodeList (new_item_list, OBJ_SEQENTRY, sep);
31828
/* add to list for this category */
31829
if (new_vnp == NULL) {
31830
new_vnp = ValNodeAddPointer (&new_item_list, OBJ_SEQENTRY, sep);
31832
description = GetDiscrepancyItemText(new_vnp);
31833
subcat = FindExistingCategory (description, cip->subcategories);
31834
if (subcat == NULL) {
31835
subcat = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31836
MemSet (subcat, 0, sizeof (ClickableItemData));
31837
subcat->description = description;
31838
ValNodeAddPointer (&(cip->subcategories), 0, subcat);
31840
description = MemFree (description);
31842
/* don't add item twice */
31843
if (!DataInValNodeList (subcat->item_list, vnp_item->choice, vnp_item->data.ptrvalue)) {
31844
ValNodeAddPointer (&(subcat->item_list), vnp_item->choice, vnp_item->data.ptrvalue);
31847
sep_list = ValNodeFree (sep_list);
31850
cip->item_list = ValNodeFree (cip->item_list);
31851
cip->item_list = new_item_list;
31854
value_lists = RearrangeForSeqEntriesInMultipleCategories (value_lists);
31855
return value_lists;
31859
static void GetMolTypes (SeqDescrPtr sdp, Pointer userdata)
31861
ValNodePtr PNTR type_list;
31862
ClickableItemPtr cip;
31866
if (sdp == NULL || sdp->choice != Seq_descr_molinfo || sdp->data.ptrvalue == NULL || userdata == NULL)
31871
type_list = (ValNodePtr PNTR) userdata;
31873
mip = (MolInfoPtr) sdp->data.ptrvalue;
31874
/* don't look for peptides */
31875
if (mip->biomol == 8) return;
31877
str = GetMoleculeTypeName (mip->biomol);
31879
cip = FindExistingCategory (str, *type_list);
31882
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31883
MemSet (cip, 0, sizeof (ClickableItemData));
31884
cip->description = StringSave (str);
31885
ValNodeAddPointer (&cip->item_list, OBJ_SEQDESC, sdp);
31886
ValNodeAddPointer (type_list, 0, cip);
31888
/* make sure feature isn't already in the list */
31889
if (DataInValNodeList (cip->item_list, OBJ_SEQDESC, sdp) == NULL) {
31890
ValNodeAddPointer (&cip->item_list, OBJ_SEQDESC, sdp);
31895
static void GetMolClasses (BioseqPtr bsp, Pointer userdata)
31897
ValNodePtr PNTR type_list;
31898
ClickableItemPtr cip;
31901
if (bsp == NULL || ISA_aa(bsp->mol) || userdata == NULL)
31906
type_list = (ValNodePtr PNTR) userdata;
31908
str = GetMoleculeClassName (bsp->mol);
31910
cip = FindExistingCategory (str, *type_list);
31913
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
31914
MemSet (cip, 0, sizeof (ClickableItemData));
31915
cip->description = StringSave (str);
31916
ValNodeAddPointer (&cip->item_list, OBJ_BIOSEQ, bsp);
31917
ValNodeAddPointer (type_list, 0, cip);
31919
/* make sure feature isn't already in the list */
31920
if (DataInValNodeList (cip->item_list, OBJ_BIOSEQ, bsp) == NULL) {
31921
ValNodeAddPointer (&cip->item_list, OBJ_BIOSEQ, bsp);
31927
typedef struct segfeatures {
31929
ValNodePtr feature_list;
31930
} SegFeaturesData, PNTR SegFeaturesPtr;
31932
static void FindFeaturesForSeg (SeqFeatPtr sfp, Pointer userdata)
31936
if (sfp == NULL || userdata == NULL) return;
31938
fp = (SegFeaturesPtr) userdata;
31940
if (sfp->idx.subtype == fp->featdef) {
31941
ValNodeAddPointer (&(fp->feature_list), OBJ_SEQFEAT, sfp);
31945
typedef struct segdescriptors {
31947
ValNodePtr descriptor_list;
31948
} SegDescriptorsData, PNTR SegDescriptorsPtr;
31950
static void FindDescriptorsForSeg (SeqDescrPtr sdp, Pointer userdata)
31952
SegDescriptorsPtr fp;
31954
if (sdp == NULL || userdata == NULL) return;
31956
fp = (SegDescriptorsPtr) userdata;
31958
if (sdp->choice == fp->desc_type) {
31959
ValNodeAddPointer (&(fp->descriptor_list), OBJ_SEQDESC, sdp);
31965
CreateSeqEntryListsForUniqueValues
31968
ParseFieldPtr dst_field_data,
31971
ValNodePtr value_lists;
31973
value_lists = GetUniqueValueListForSeqEntry (sep, entityID, dst_field_data, fsp);
31975
value_lists = ChangeUniqueValueListsToSeqEntryLists (value_lists);
31976
return value_lists;
31979
static void AddPubFeatureWithText (SeqFeatPtr sfp, Pointer userdata)
31981
ValNodePtr PNTR pub_list;
31983
if (sfp == NULL || userdata == NULL) return;
31984
pub_list = (ValNodePtr PNTR) userdata;
31986
ValNodeAddPointer (pub_list, OBJ_SEQFEAT, sfp);
31989
static void AddPubDescriptorWithText (SeqDescrPtr sdp, Pointer userdata)
31991
ValNodePtr PNTR pub_list;
31993
if (sdp == NULL || userdata == NULL || sdp->choice != Seq_descr_pub) return;
31994
pub_list = (ValNodePtr PNTR) userdata;
31996
ValNodeAddPointer (pub_list, OBJ_SEQDESC, sdp);
31999
static ValNodePtr GetTextPubListsForSeqEntry (SeqEntryPtr sep, CharPtr search_text)
32001
FeaturesWithTextData ftd;
32002
DescriptorsWithTextData dtd;
32003
ValNodePtr obj_list = NULL;
32005
ftd.seqFeatChoice = SEQFEAT_PUB;
32006
ftd.featDefChoice = FEATDEF_PUB;
32007
ftd.search_text = search_text;
32008
ftd.act_when_string_not_present = FALSE;
32009
ftd.case_insensitive = TRUE;
32010
ftd.whole_word = FALSE;
32011
ftd.no_text = FALSE;
32012
ftd.callback = AddPubFeatureWithText;
32013
ftd.userdata = &obj_list;
32015
dtd.search_text = search_text;
32016
dtd.act_when_string_not_present = FALSE;
32017
dtd.case_insensitive = TRUE;
32018
dtd.whole_word = FALSE;
32019
dtd.no_text = FALSE;
32020
dtd.callback = AddPubDescriptorWithText;
32021
dtd.userdata = &obj_list;
32023
OperateOnSeqEntryFeaturesWithText (sep, &ftd);
32024
OperateOnSeqEntryDescriptorsWithText (sep, &dtd);
32029
static ValNodePtr GetTextSeqEntryListForSeqEntry (SeqEntryPtr sep, Uint2 entityID, CharPtr search_text, ParseFieldPtr dst_field_data)
32031
ValNodePtr value_lists = NULL;
32032
ValNodePtr obj_list = NULL, tmp_list, vnp;
32033
ClickableItemPtr cip;
32034
CharPtr desc_fmt = "%d sequences contain %s";
32035
StringConstraintData scd;
32036
ChoiceConstraintData ccd;
32039
if (dst_field_data == NULL) {
32041
} else if (dst_field_data->parse_field_type == SEARCH_FIELD_PUBLICATION) {
32042
obj_list = GetTextPubListsForSeqEntry(sep, search_text);
32044
scd.match_text = search_text;
32045
scd.match_location = 1;
32046
scd.insensitive = TRUE;
32047
scd.whole_word = FALSE;
32048
scd.not_present = FALSE;
32050
ccd.constraint_type = CHOICE_CONSTRAINT_STRING;
32052
ccd.qual_choice_match = NULL;
32053
ccd.string_constraint = &scd;
32054
ccd.pseudo_constraint = NULL;
32055
ccd.free_vn_proc = NULL;
32056
ccd.copy_vn_proc = NULL;
32058
MemSet (&fsd, 0, sizeof (FilterSetData));
32061
tmp_list = GetUniqueValueListForSeqEntry (sep, entityID, dst_field_data, NULL);
32063
for (vnp = tmp_list; vnp != NULL; vnp = vnp->next) {
32064
cip = (ClickableItemPtr) vnp->data.ptrvalue;
32065
if (cip != NULL && StringISearch (cip->description, search_text) != NULL) {
32066
ValNodeLink (&obj_list, cip->item_list);
32067
cip->item_list = NULL;
32070
tmp_list = FreeClickableList (tmp_list);
32072
if (obj_list != NULL) {
32073
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
32074
MemSet (cip, 0, sizeof (ClickableItemData));
32075
cip->description = StringSave (search_text);
32076
cip->item_list = obj_list;
32077
cip->chosen = TRUE;
32078
ValNodeAddPointer (&value_lists, 0, cip);
32079
value_lists = ChangeUniqueValueListsToSeqEntryLists (value_lists);
32080
/* rename description */
32081
if (value_lists != NULL) {
32082
cip = value_lists->data.ptrvalue;
32084
cip->description = MemFree (cip->description);
32085
cip->description = (CharPtr) MemNew (sizeof(Char) * (StringLen (desc_fmt) + StringLen (search_text) + 15));
32086
sprintf (cip->description, desc_fmt, ValNodeLen (cip->item_list), search_text);
32091
return value_lists;
32094
static void AddNewUniqueDescriptors (SeqDescrPtr PNTR new_set, SeqDescrPtr parent_set)
32096
SeqDescrPtr sdp, sdp_next, sdp_tmp, sdp_tmp_next;
32097
Boolean found_match;
32099
if (new_set == NULL || parent_set == NULL) return;
32101
if (*new_set == NULL) {
32102
ValNodeLink (new_set,
32103
AsnIoMemCopy ((Pointer) parent_set,
32104
(AsnReadFunc) SeqDescrAsnRead,
32105
(AsnWriteFunc) SeqDescrAsnWrite));
32108
while (sdp != NULL) {
32109
sdp_next = sdp->next;
32111
for (sdp_tmp = *new_set, found_match = FALSE;
32112
sdp_tmp != NULL && !found_match;
32113
sdp_tmp = sdp_tmp->next) {
32114
sdp_tmp_next = sdp_tmp->next;
32115
sdp_tmp->next = NULL;
32116
if (AsnIoMemComp (sdp, sdp_tmp, (AsnWriteFunc) SeqDescrAsnWrite)) {
32117
found_match = TRUE;
32119
sdp_tmp->next = sdp_tmp_next;
32121
if (!found_match) {
32122
ValNodeLink (new_set,
32123
AsnIoMemCopy ((Pointer) sdp,
32124
(AsnReadFunc) SeqDescrAsnRead,
32125
(AsnWriteFunc) SeqDescrAsnWrite));
32127
sdp->next = sdp_next;
32133
static void AddNewUniqueDescriptorsToSeqEntry (SeqEntryPtr sep, SeqDescrPtr parent_set)
32138
if (IS_Bioseq(sep)) {
32139
bsp = (BioseqPtr) sep->data.ptrvalue;
32141
AddNewUniqueDescriptors (&(bsp->descr), parent_set);
32143
} else if (IS_Bioseq_set (sep)) {
32144
bssp = (BioseqSetPtr) sep->data.ptrvalue;
32145
if (bssp != NULL) {
32146
AddNewUniqueDescriptors (&(bssp->descr), parent_set);
32151
static void AddNewUniqueAnnotations (SeqAnnotPtr PNTR new_set, SeqAnnotPtr parent_set)
32153
SeqAnnotPtr sap, sap_next, sap_tmp, sap_tmp_next, sap_copy, last_sap;
32154
Boolean found_match;
32156
if (new_set == NULL || parent_set == NULL) return;
32159
while (sap != NULL) {
32160
sap_next = sap->next;
32163
for (sap_tmp = *new_set, found_match = FALSE;
32164
sap_tmp != NULL && !found_match;
32165
sap_tmp = sap_tmp->next) {
32166
sap_tmp_next = sap_tmp->next;
32167
sap_tmp->next = NULL;
32168
if (AsnIoMemComp (sap, sap_tmp, (AsnWriteFunc) SeqAnnotAsnWrite)) {
32169
found_match = TRUE;
32171
sap_tmp->next = sap_tmp->next;
32172
last_sap = sap_tmp;
32174
if (!found_match) {
32175
sap_copy = (SeqAnnotPtr) AsnIoMemCopy ((Pointer) sap, (AsnReadFunc) SeqAnnotAsnRead, (AsnWriteFunc) SeqAnnotAsnWrite);
32176
if (last_sap == NULL) {
32177
*new_set = sap_copy;
32179
last_sap->next = sap_copy;
32182
sap->next = sap_next;
32188
static void AddNewUniqueAnnotationsToSeqEntry (SeqEntryPtr sep, SeqAnnotPtr parent_set)
32193
if (IS_Bioseq(sep)) {
32194
bsp = (BioseqPtr) sep->data.ptrvalue;
32196
AddNewUniqueAnnotations (&(bsp->annot), parent_set);
32198
} else if (IS_Bioseq_set (sep)) {
32199
bssp = (BioseqSetPtr) sep->data.ptrvalue;
32200
if (bssp != NULL) {
32201
AddNewUniqueAnnotations (&(bssp->annot), parent_set);
32207
static void AddCategorySeqEntriesToSet (BioseqSetPtr newset, ClickableItemPtr category)
32209
ValNodePtr vnp_item;
32210
SeqEntryPtr sep, last_sep, prev_sep, remove_sep;
32211
BioseqSetPtr bssp, orig_parent;
32214
if (newset == NULL || category == NULL || category->item_list == NULL) return;
32216
if (category->chosen) {
32217
last_sep = newset->seq_set;
32218
while (last_sep != NULL && last_sep->next != NULL) {
32219
last_sep = last_sep->next;
32222
for (vnp_item = category->item_list; vnp_item != NULL; vnp_item = vnp_item->next) {
32223
sep = GetBestSeqEntryForItem (vnp_item);
32224
if (sep == NULL || sep->data.ptrvalue == NULL) continue;
32225
orig_parent = NULL;
32226
if (IS_Bioseq (sep)) {
32227
bsp = sep->data.ptrvalue;
32228
if (bsp->idx.parenttype == OBJ_BIOSEQSET) {
32229
orig_parent = bsp->idx.parentptr;
32230
bsp->idx.parentptr = NULL;
32232
} else if (IS_Bioseq_set (sep)) {
32233
bssp = sep->data.ptrvalue;
32234
if (bssp->idx.parenttype == OBJ_BIOSEQSET) {
32235
orig_parent = bssp->idx.parentptr;
32236
bssp->idx.parentptr = NULL;
32242
if (orig_parent != NULL) {
32243
/* remove this seq-entry from the original parent */
32245
for (remove_sep = orig_parent->seq_set;
32246
remove_sep != NULL && remove_sep != sep;
32247
remove_sep = remove_sep->next) {
32248
prev_sep = remove_sep;
32250
if (remove_sep == sep) {
32251
if (prev_sep == NULL) {
32252
orig_parent->seq_set = orig_parent->seq_set->next;
32253
if (orig_parent->seq_set == NULL) {
32254
orig_parent->idx.deleteme = TRUE;
32257
prev_sep->next = sep->next;
32260
/* set class type if not already set */
32261
if (newset->_class == BioseqseqSet_class_genbank) {
32262
newset->_class = orig_parent->_class;
32265
/* add descriptors from the orig_parent to the new parent */
32266
AddNewUniqueDescriptors (&(newset->descr), orig_parent->descr);
32268
/* add annotations from the orig_parent to the new parent */
32269
AddNewUniqueAnnotations (&(newset->annot), orig_parent->annot);
32271
/* add to new parent */
32273
if (last_sep == NULL) {
32274
newset->seq_set = sep;
32276
last_sep->next = sep;
32279
SeqMgrLinkSeqEntry (sep, OBJ_BIOSEQSET, newset);
32282
for (vnp_item = category->subcategories; vnp_item != NULL; vnp_item = vnp_item->next) {
32283
AddCategorySeqEntriesToSet (newset, vnp_item->data.ptrvalue);
32288
static Boolean AnyDiscrepanciesChosen (ValNodePtr cip_list)
32290
ClickableItemPtr cip;
32291
Boolean any_chosen = FALSE;
32293
while (cip_list != NULL && !any_chosen) {
32294
cip = (ClickableItemPtr) cip_list->data.ptrvalue;
32297
|| (cip->expanded && AnyDiscrepanciesChosen (cip->subcategories)))) {
32300
cip_list = cip_list->next;
32305
static Boolean NeedsNewSet (SeqEntryPtr sep)
32308
while (sep != NULL) {
32309
if (IS_Bioseq (sep)) {
32311
} else if (IS_Bioseq_set (sep)) {
32312
bssp = (BioseqSetPtr) sep->data.ptrvalue;
32314
&& (bssp->_class == BioseqseqSet_class_nuc_prot
32315
|| bssp->_class == BioseqseqSet_class_segset)) {
32324
static BioseqSetPtr MakeGroupsForUniqueValues
32325
(BioseqSetPtr bssp,
32326
ValNodePtr value_lists)
32328
ObjMgrDataPtr omdptop;
32332
BioseqSetPtr parent_set;
32333
SeqEntryPtr sep, first_new_sep = NULL;
32335
BioseqSetPtr newset;
32337
ClickableItemPtr cip;
32340
Boolean child_became_parent = FALSE;
32342
if (bssp == NULL) return NULL;
32343
entityID = bssp->idx.entityID;
32345
sep = SeqMgrGetSeqEntryForData (bssp);
32349
SaveSeqEntryObjMgrData (sep, &omdptop, &omdata);
32350
GetSeqEntryParent (sep, &parentptr, &parenttype);
32352
parent_set = (BioseqSetPtr)(bssp->idx.parentptr);
32354
if (parent_set == NULL || parent_set->seq_set == NULL) {
32355
/* this set has no parent, so make it the parent set, class GenBank,
32356
* and create two new sets using the original set class as members of this set
32359
child_class = parent_set->_class;
32360
child_became_parent = TRUE;
32362
/* we already have a parent set. */
32363
child_class = bssp->_class;
32366
for (vnp = value_lists; vnp != NULL; vnp = vnp->next) {
32367
cip = (ClickableItemPtr) vnp->data.ptrvalue;
32368
if (cip == NULL || (!cip->chosen && ! AnyDiscrepanciesChosen (cip->subcategories))) {
32372
newset = BioseqSetNew ();
32373
newset->_class = child_class;
32374
/* add SeqEntries for this category here */
32375
AddCategorySeqEntriesToSet (newset, cip);
32377
/* check - is any member of the newset also a set? */
32378
tmp = newset->seq_set;
32379
while (tmp != NULL && IS_Bioseq (tmp)) {
32383
/* add to members for parent_set */
32384
tmp = SeqEntryNew ();
32386
tmp->data.ptrvalue = (Pointer) newset;
32388
tmp->next = parent_set->seq_set;
32389
parent_set->seq_set = tmp;
32391
if (parent_set->idx.deleteme) {
32392
parent_set->idx.deleteme = FALSE;
32394
if (first_new_sep == NULL) {
32395
first_new_sep = tmp;
32398
SeqMgrLinkSeqEntry (tmp, OBJ_BIOSEQSET, parent_set);
32401
RestoreSeqEntryObjMgrData (sep, omdptop, &omdata);
32402
DeleteMarkedObjects (entityID, 0, NULL);
32404
if (child_became_parent) {
32405
if (NeedsNewSet (first_new_sep->next)) {
32406
/* make new set to hold what wasn't moved */
32407
newset = BioseqSetNew ();
32408
/* contents of set are unmoved sequences */
32409
newset->seq_set = first_new_sep->next;
32410
/* set class type */
32411
newset->_class = parent_set->_class;
32412
/* add descriptors from the parent */
32413
ValNodeLink (&(newset->descr),
32414
AsnIoMemCopy ((Pointer) parent_set->descr,
32415
(AsnReadFunc) SeqDescrAsnRead,
32416
(AsnWriteFunc) SeqDescrAsnWrite));
32419
tmp = SeqEntryNew();
32421
tmp->data.ptrvalue = (Pointer) newset;
32423
first_new_sep->next = tmp;
32424
SeqMgrLinkSeqEntry (tmp, OBJ_BIOSEQSET, parent_set);
32426
sep = first_new_sep->next;
32427
while (sep != NULL) {
32428
AddNewUniqueDescriptorsToSeqEntry (sep, parent_set->descr);
32432
/* set parent class to GenBank set */
32433
parent_set->_class = BioseqseqSet_class_genbank;
32434
/* remove descriptors on parent, they will all have been copied down */
32435
parent_set->descr = SeqDescrFree (parent_set->descr);
32438
ObjMgrSetDirtyFlag (entityID, TRUE);
32439
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
32451
eSegPageFeatureType,
32452
eSegPageDescriptorType,
32456
typedef struct segbyfield {
32458
GrouP seg_choice_grp;
32460
GrouP pages[eNumSegPages];
32461
/* for segregating by field */
32463
DialoG group_list_dlg;
32465
/* for segregating by molinfo */
32466
ButtoN mol_type_btn;
32467
ButtoN mol_class_btn;
32469
/* for segregating by feature */
32470
DialoG feature_select;
32472
/* for segregating by descriptor */
32473
DialoG descriptor_select;
32475
/* for segregating by text */
32476
DialoG search_field;
32479
/* for segregating by ID */
32480
DialoG id_constraint;
32483
ButtoN leave_dlg_up;
32484
BioseqSetPtr target_set;
32485
ValNodePtr value_lists;
32486
} SegByFieldData, PNTR SegByFieldPtr;
32488
static void ChooseAllDiscrepancies (ValNodePtr cip_list)
32490
ClickableItemPtr cip;
32492
while (cip_list != NULL) {
32493
cip = cip_list->data.ptrvalue;
32495
cip->chosen = TRUE;
32497
cip_list = cip_list->next;
32501
static void ChangeSegChoice (GrouP g);
32504
static void PullChosenIntoOneGroup (ValNodePtr PNTR value_list, ClickableItemPtr chosen)
32506
ValNodePtr vnp_prev = NULL, vnp_next, vnp_this;
32507
ClickableItemPtr cip;
32509
if (value_list == NULL || chosen == NULL) return;
32511
vnp_this = *value_list;
32512
while (vnp_this != NULL)
32514
vnp_next = vnp_this->next;
32515
cip = (ClickableItemPtr) vnp_this->data.ptrvalue;
32518
vnp_this->next = NULL;
32519
if (vnp_prev == NULL)
32521
*value_list = vnp_next;
32525
vnp_prev->next = vnp_next;
32527
vnp_this = ValNodeFree (vnp_this);
32529
else if (cip->chosen)
32531
vnp_this->next = NULL;
32532
if (vnp_prev == NULL)
32534
*value_list = vnp_next;
32538
vnp_prev->next = vnp_next;
32540
ValNodeLink (&(chosen->item_list), cip->item_list);
32541
cip->item_list = NULL;
32542
vnp_this = FreeClickableList (vnp_this);
32546
PullChosenIntoOneGroup (&(cip->subcategories), chosen);
32547
vnp_prev = vnp_this;
32549
vnp_this = vnp_next;
32554
static void SegregateByField_Callback (ButtoN b)
32557
Int4 num_chosen = 0;
32558
ClickableItemPtr cip;
32560
sfp = (SegByFieldPtr) GetObjectExtra (b);
32561
if (sfp == NULL) return;
32563
num_chosen = CountChosenDiscrepancies (sfp->value_lists, FALSE);
32564
if (num_chosen < 1) {
32565
if (ANS_OK == Message (MSG_OKC, "You have not chosen any groups. Create all?")) {
32566
ChooseAllDiscrepancies (sfp->value_lists);
32572
if (GetValue (sfp->seg_choice_grp) == eSegPageId) {
32573
/* put all selected sequences into one group */
32574
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
32575
cip->chosen = TRUE;
32576
PullChosenIntoOneGroup (&(sfp->value_lists), cip);
32577
ValNodeAddPointer (&(sfp->value_lists), 0, cip);
32580
sfp->target_set = MakeGroupsForUniqueValues (sfp->target_set, sfp->value_lists);
32582
if (GetStatus (sfp->leave_dlg_up)) {
32583
ChangeSegChoice (sfp->seg_choice_grp);
32585
Remove (sfp->form);
32589
static void ChangeSegField (Pointer userdata)
32591
SegByFieldPtr sfp = (SegByFieldPtr) userdata;
32593
ParseFieldPtr dst_field_data;
32595
if (sfp == NULL || sfp->target_set == NULL) return;
32599
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32601
PointerToDialog (sfp->group_list_dlg, NULL);
32602
sfp->value_lists = FreeClickableList (sfp->value_lists);
32604
dst_field_data = DialogToPointer (sfp->field_dlg);
32605
if (dst_field_data == NULL) {
32606
Disable (sfp->accept);
32610
sfp->value_lists = CreateSeqEntryListsForUniqueValues (sep, sfp->target_set->idx.entityID, dst_field_data, NULL);
32611
dst_field_data = ParseFieldFree (dst_field_data);
32612
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32613
if (ValNodeLen (sfp->value_lists) < 2) {
32614
Disable(sfp->accept);
32616
Enable (sfp->accept);
32622
static void SegTextChangeNotify (Pointer userdata)
32624
SegByFieldPtr sfp = (SegByFieldPtr) userdata;
32626
ParseFieldPtr dst_field_data;
32627
CharPtr search_text;
32629
if (sfp == NULL || sfp->target_set == NULL) return;
32633
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32635
PointerToDialog (sfp->group_list_dlg, NULL);
32636
sfp->value_lists = FreeClickableList (sfp->value_lists);
32638
if (TextHasNoText (sfp->search_text)) {
32639
Disable (sfp->accept);
32644
dst_field_data = DialogToPointer (sfp->search_field);
32645
if (dst_field_data == NULL) {
32646
Disable (sfp->accept);
32651
search_text = SaveStringFromText (sfp->search_text);
32653
sfp->value_lists = GetTextSeqEntryListForSeqEntry (sep, sfp->target_set->idx.entityID, search_text, dst_field_data);
32655
search_text = MemFree (search_text);
32657
dst_field_data = ParseFieldFree (dst_field_data);
32658
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32659
if (sfp->value_lists == NULL) {
32660
Disable(sfp->accept);
32662
Enable (sfp->accept);
32668
static void SegTextChange (TexT t)
32672
sfp = (SegByFieldPtr) GetObjectExtra (t);
32674
SegTextChangeNotify (sfp);
32679
extern void ListAllSequences (BioseqPtr bsp, Pointer userdata)
32681
ClickableItemPtr cip;
32684
if (bsp != NULL && userdata != NULL && ! ISA_aa (bsp->mol))
32686
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
32687
SeqIdWrite (SeqIdFindBest (bsp->id, SEQID_GENBANK), id_str, PRINTID_REPORT, sizeof (id_str) - 1);
32688
cip->description = StringSave (id_str);
32690
ValNodeAddPointer (&(cip->item_list), OBJ_BIOSEQ, bsp);
32691
ValNodeAddPointer ((ValNodePtr PNTR) userdata, 0, cip);
32696
static void ChooseSegId (Pointer userdata)
32698
SegByFieldPtr sfp = (SegByFieldPtr) userdata;
32701
if (sfp == NULL || sfp->target_set == NULL) return;
32705
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32707
PointerToDialog (sfp->group_list_dlg, NULL);
32708
sfp->value_lists = FreeClickableList (sfp->value_lists);
32710
VisitBioseqsInSep (sep, &sfp->value_lists, ListAllSequences);
32712
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32713
if (sfp->value_lists == NULL) {
32714
Disable(sfp->accept);
32716
Enable (sfp->accept);
32723
static void ChangeMol (ButtoN b)
32728
sfp = (SegByFieldPtr) GetObjectExtra (b);
32730
if (sfp == NULL) return;
32734
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32736
PointerToDialog (sfp->group_list_dlg, NULL);
32737
sfp->value_lists = FreeClickableList (sfp->value_lists);
32739
if (GetStatus (sfp->mol_class_btn)) {
32740
VisitBioseqsInSep (sep, &(sfp->value_lists), GetMolClasses);
32742
if (GetStatus (sfp->mol_type_btn)) {
32743
VisitDescriptorsInSep (sep, &(sfp->value_lists), GetMolTypes);
32746
sfp->value_lists = ChangeUniqueValueListsToSeqEntryLists (sfp->value_lists);
32748
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32749
if (ValNodeLen (sfp->value_lists) < 2) {
32750
Disable(sfp->accept);
32752
Enable (sfp->accept);
32759
static void SegFeatureChangeNotify (Pointer userdata)
32761
SegByFieldPtr sfp = (SegByFieldPtr) userdata;
32763
SegFeaturesData sfd;
32764
ClickableItemPtr cip;
32766
CharPtr desc_fmt = "%d %ss";
32768
if (sfp == NULL) return;
32770
vnp = DialogToPointer (sfp->feature_select);
32772
PointerToDialog (sfp->group_list_dlg, NULL);
32773
sfp->value_lists = FreeClickableList (sfp->value_lists);
32774
Disable (sfp->accept);
32780
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32782
PointerToDialog (sfp->group_list_dlg, NULL);
32783
sfp->value_lists = FreeClickableList (sfp->value_lists);
32785
sfd.featdef = vnp->choice;
32786
sfd.feature_list = NULL;
32787
VisitFeaturesInSep (sep, &sfd, FindFeaturesForSeg);
32789
if (sfd.feature_list != NULL) {
32790
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
32791
MemSet (cip, 0, sizeof (ClickableItemData));
32792
cip->description = (CharPtr) MemNew (sizeof(Char) * (StringLen (desc_fmt) + StringLen (vnp->data.ptrvalue) + 15));
32793
sprintf (cip->description, desc_fmt, ValNodeLen (sfd.feature_list), vnp->data.ptrvalue);
32794
cip->item_list = sfd.feature_list;
32795
cip->chosen = TRUE;
32796
ValNodeAddPointer (&(sfp->value_lists), 0, cip);
32797
sfp->value_lists = ChangeUniqueValueListsToSeqEntryLists (sfp->value_lists);
32799
vnp = ValNodeFree (vnp);
32801
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32803
if (sfp->value_lists == NULL) {
32804
Disable (sfp->accept);
32806
Enable (sfp->accept);
32812
static void SegDescriptorChangeNotify (Pointer data)
32816
SegDescriptorsData sdd;
32817
ClickableItemPtr cip;
32818
CharPtr desc_fmt = "%d %ss";
32821
sfp = (SegByFieldPtr) data;
32822
if (sfp == NULL) return;
32824
vnp = DialogToPointer (sfp->descriptor_select);
32826
PointerToDialog (sfp->group_list_dlg, NULL);
32827
sfp->value_lists = FreeClickableList (sfp->value_lists);
32828
Disable (sfp->accept);
32834
sep = SeqMgrGetSeqEntryForData (sfp->target_set);
32836
PointerToDialog (sfp->group_list_dlg, NULL);
32837
sfp->value_lists = FreeClickableList (sfp->value_lists);
32839
sdd.desc_type = vnp->choice;
32840
sdd.descriptor_list = NULL;
32841
VisitDescriptorsInSep (sep, &sdd, FindDescriptorsForSeg);
32843
if (sdd.descriptor_list != NULL) {
32844
cip = (ClickableItemPtr) MemNew (sizeof (ClickableItemData));
32845
MemSet (cip, 0, sizeof (ClickableItemData));
32846
cip->description = (CharPtr) MemNew (sizeof(Char) * (StringLen (desc_fmt) + StringLen (vnp->data.ptrvalue) + 15));
32847
sprintf (cip->description, desc_fmt, ValNodeLen (sdd.descriptor_list), vnp->data.ptrvalue);
32848
cip->item_list = sdd.descriptor_list;
32849
cip->chosen = TRUE;
32850
ValNodeAddPointer (&(sfp->value_lists), 0, cip);
32851
sfp->value_lists = ChangeUniqueValueListsToSeqEntryLists (sfp->value_lists);
32853
vnp = ValNodeFree (vnp);
32855
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32857
if (sfp->value_lists == NULL) {
32858
Disable (sfp->accept);
32860
Enable (sfp->accept);
32867
static void ChangeSegChoice (GrouP g)
32870
Int4 seg_choice, i;
32872
sfp = (SegByFieldPtr) GetObjectExtra (g);
32873
if (sfp == NULL) return;
32875
seg_choice = GetValue (sfp->seg_choice_grp);
32877
for (i = 0; i < eNumSegPages; i++) {
32878
if (i == seg_choice - 1) {
32879
Show (sfp->pages[i]);
32881
Hide (sfp->pages[i]);
32884
switch (seg_choice) {
32885
case eSegPageField:
32886
ChangeSegField (sfp);
32888
case eSegPageMolInfo:
32889
ChangeMol(sfp->mol_class_btn);
32891
case eSegPageFeatureType:
32892
SegFeatureChangeNotify (sfp);
32894
case eSegPageDescriptorType:
32895
SegDescriptorChangeNotify (sfp);
32898
SegTextChangeNotify (sfp);
32904
if (seg_choice == eSegPageId) {
32905
SetClickableListDialogTitles (sfp->group_list_dlg, "Sequences for New Set", "",
32906
"Use checkbox to mark sequences for new set",
32907
"Single click to navigate to sequence in record");
32909
SetClickableListDialogTitles (sfp->group_list_dlg, "New Sets", "Sequences in Highlighted Set",
32910
"Use checkbox to mark sets to create",
32916
extern void ChooseCategories (ValNodePtr value_list, Boolean do_choose)
32918
ClickableItemPtr cip;
32920
while (value_list != NULL) {
32921
cip = (ClickableItemPtr) value_list->data.ptrvalue;
32923
cip->chosen = do_choose;
32924
ChooseCategories (cip->subcategories, FALSE);
32926
value_list = value_list->next;
32931
extern void ChooseCategoriesByStringConstraint (ValNodePtr value_list, StringConstraintXPtr scp, Boolean do_choose)
32933
ClickableItemPtr cip;
32935
while (value_list != NULL) {
32936
cip = (ClickableItemPtr) value_list->data.ptrvalue;
32938
if (cip->item_list != NULL
32939
&& cip->item_list->choice == OBJ_BIOSEQ
32940
&& cip->item_list->data.ptrvalue != NULL
32941
&& DoesIDListMeetStringConstraint (((BioseqPtr) cip->item_list->data.ptrvalue)->id, scp)) {
32942
cip->chosen = do_choose;
32944
ChooseCategoriesByStringConstraint (cip->subcategories, scp, do_choose);
32947
value_list = value_list->next;
32952
static void SelectSegCategories (ButtoN b)
32956
sfp = (SegByFieldPtr) GetObjectExtra (b);
32958
ChooseCategories (sfp->value_lists, TRUE);
32959
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32964
static void UnselectSegCategories (ButtoN b)
32968
sfp = (SegByFieldPtr) GetObjectExtra (b);
32970
ChooseCategories (sfp->value_lists, FALSE);
32971
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32976
static void SelectSequenceIDsForSegregate (ButtoN b)
32979
StringConstraintXPtr scp;
32981
sfp = (SegByFieldPtr) GetObjectExtra (b);
32982
if (sfp == NULL) return;
32984
scp = DialogToPointer (sfp->id_constraint);
32985
ChooseCategoriesByStringConstraint (sfp->value_lists, scp, TRUE);
32986
PointerToDialog (sfp->group_list_dlg, sfp->value_lists);
32987
scp = StringConstraintXFree (scp);
32991
static void CleanupSegregateByFieldForm (GraphiC g, VoidPtr data)
32996
sfp = (SegByFieldPtr) data;
32998
sfp->value_lists = FreeClickableList (sfp->value_lists);
33000
StdCleanupFormProc (g, data);
33005
extern Int2 LIBCALLBACK SegregateSetsByField (Pointer data)
33009
GrouP h, k, page_grp, g1, g2, g3;
33010
OMProcControlPtr ompcp;
33012
StdEditorProcsPtr sepp;
33015
StringConstraintData scd;
33017
/* Check parameters and get a pointer to the current data */
33019
ompcp = (OMProcControlPtr) data;
33021
|| ompcp->input_itemtype != OBJ_BIOSEQSET
33022
|| ompcp->input_data == NULL) {
33023
Message (MSG_ERROR, "You must select a set to segregate!");
33024
return OM_MSG_RET_ERROR;
33027
/* Create a new window, and a struct */
33028
/* to pass around the data in. */
33030
cfp = (SegByFieldPtr) MemNew (sizeof (SegByFieldData));
33032
return OM_MSG_RET_ERROR;
33033
cfp->target_set = (BioseqSetPtr)ompcp->input_data;
33035
w = FixedWindow (-50, -33, -10, -10, "Segregate By Field",
33036
StdCloseWindowProc);
33037
SetObjectExtra (w, cfp, CleanupSegregateByFieldForm);
33038
cfp->form = (ForM) w;
33040
sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
33041
if (sepp != NULL) {
33042
SetActivate (w, sepp->activateForm);
33043
cfp->appmessage = sepp->handleMessages;
33046
cfp->input_entityID = ompcp->input_entityID;
33047
cfp->input_itemID = ompcp->input_itemID;
33048
cfp->input_itemtype = ompcp->input_itemtype;
33050
sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
33051
if (sepp != NULL) {
33052
SetActivate (w, sepp->activateForm);
33053
cfp->appmessage = sepp->handleMessages;
33056
h = HiddenGroup (w, -1, 0, NULL);
33057
SetGroupSpacing (h, 10, 10);
33059
cfp->group_list_dlg = CreateClickableListDialogEx (h, "New Sets", "Sequences for New Set",
33060
"Use checkbox to mark sets to create",
33062
ScrollToDiscrepancyItem, EditDiscrepancyItem, NULL,
33063
GetDiscrepancyItemText,
33065
stdCharWidth * 30 + 5,
33068
g3 = NormalGroup (h, 2, 0, "", programFont, NULL);
33069
SetGroupSpacing (g3, 10, 10);
33070
StaticPrompt (g3, "Segregate Based on", 0, dialogTextHeight, programFont, 'c');
33071
cfp->seg_choice_grp = HiddenGroup (g3, eNumSegPages, 0, ChangeSegChoice);
33072
SetObjectExtra (cfp->seg_choice_grp, cfp, NULL);
33073
SetGroupSpacing (cfp->seg_choice_grp, 10, 10);
33075
RadioButton (cfp->seg_choice_grp, "ID");
33076
RadioButton (cfp->seg_choice_grp, "Text");
33077
RadioButton (cfp->seg_choice_grp, "Field");
33078
RadioButton (cfp->seg_choice_grp, "MolInfo");
33079
RadioButton (cfp->seg_choice_grp, "Feature Type");
33080
RadioButton (cfp->seg_choice_grp, "Descriptor Type");
33082
page_grp = HiddenGroup (h, 0, 0, NULL);
33083
/* identical fields */
33084
cfp->pages[eSegPageField - 1] = HiddenGroup (page_grp, 2, 0, NULL);
33085
SetGroupSpacing (cfp->pages[eSegPageField - 1], 10, 10);
33086
p = StaticPrompt (cfp->pages[eSegPageField - 1], "Segregate sequences with identical", 0, dialogTextHeight,
33088
cfp->field_dlg = ParseFieldDestDialog (cfp->pages[eSegPageField - 1], ChangeSegField, cfp);
33091
cfp->pages[eSegPageMolInfo - 1] = HiddenGroup (page_grp, 0, 2, NULL);
33092
SetGroupSpacing (cfp->pages[eSegPageMolInfo - 1], 10, 10);
33093
cfp->mol_class_btn = CheckBox (cfp->pages[eSegPageMolInfo - 1], "Molecule Class", ChangeMol);
33094
SetObjectExtra (cfp->mol_class_btn, cfp, NULL);
33095
SetStatus (cfp->mol_class_btn, TRUE);
33096
cfp->mol_type_btn = CheckBox (cfp->pages[eSegPageMolInfo - 1], "Molecule Type", ChangeMol);
33097
SetObjectExtra (cfp->mol_type_btn, cfp, NULL);
33098
SetStatus (cfp->mol_type_btn, TRUE);
33101
cfp->pages[eSegPageFeatureType - 1] = HiddenGroup (page_grp, 2, 0, NULL);
33102
SetGroupSpacing (cfp->pages[eSegPageFeatureType - 1], 10, 10);
33103
StaticPrompt (cfp->pages[eSegPageFeatureType - 1], "Segregate by Feature", 0, dialogTextHeight,
33105
cfp->feature_select = FeatureSelectionDialogEx (cfp->pages[eSegPageFeatureType - 1], FALSE, NULL,
33106
SegFeatureChangeNotify,
33110
cfp->pages[eSegPageDescriptorType - 1] = HiddenGroup (page_grp, 2, 0, NULL);
33111
SetGroupSpacing (cfp->pages[eSegPageDescriptorType - 1], 10, 10);
33112
StaticPrompt (cfp->pages[eSegPageDescriptorType - 1], "Segregate by Descriptor", 0, dialogTextHeight,
33114
cfp->descriptor_select = DescriptorSelectionDialog (cfp->pages[eSegPageDescriptorType - 1], FALSE,
33115
SegDescriptorChangeNotify, cfp);
33118
cfp->pages[eSegPageText - 1] = HiddenGroup (page_grp, 4, 0, NULL);
33119
SetGroupSpacing (cfp->pages[eSegPageText - 1], 10, 10);
33120
StaticPrompt (cfp->pages[eSegPageText - 1], "Create set with sequences where", 0, dialogTextHeight, programFont, 'l');
33121
cfp->search_text = DialogText (cfp->pages[eSegPageText - 1], "", 10, SegTextChange);
33122
SetObjectExtra (cfp->search_text, cfp, NULL);
33123
StaticPrompt (cfp->pages[eSegPageText - 1], "appears in", 0, dialogTextHeight, programFont, 'l');
33124
cfp->search_field = SearchFieldDialog (cfp->pages[eSegPageText - 1], SegTextChangeNotify, cfp);
33127
cfp->pages[eSegPageId - 1] = HiddenGroup (page_grp, -1, 0, NULL);
33128
SetGroupSpacing (cfp->pages[eSegPageId - 1], 10, 10);
33129
p2 = StaticPrompt (cfp->pages[eSegPageId - 1], "Create set with marked sequences", 0, dialogTextHeight, programFont, 'l');
33130
g1 = HiddenGroup (cfp->pages[eSegPageId - 1], 3, 0, NULL);
33131
g2 = HiddenGroup (cfp->pages[eSegPageId - 1], 2, 0, NULL);
33132
cfp->id_constraint = StringConstraintDialogX (g2, "Mark sequences where sequence ID", TRUE);
33133
scd.insensitive = TRUE;
33134
scd.match_location = eStringConstraintInList;
33135
scd.match_text = NULL;
33136
scd.not_present = FALSE;
33137
scd.whole_word = FALSE;
33138
PointerToDialog (cfp->id_constraint, &scd);
33139
b = PushButton (g2, "Mark", SelectSequenceIDsForSegregate);
33140
SetObjectExtra (b, cfp, NULL);
33141
AlignObjects (ALIGN_CENTER, (HANDLE) p2, (HANDLE) g1, (HANDLE) g2, NULL);
33143
AlignObjects (ALIGN_CENTER, (HANDLE) cfp->pages[0],
33144
(HANDLE) cfp->pages[1],
33145
(HANDLE) cfp->pages[2],
33146
(HANDLE) cfp->pages[3],
33147
(HANDLE) cfp->pages[4],
33148
(HANDLE) cfp->pages[5],
33151
SetValue (cfp->seg_choice_grp, 1);
33153
/* add select all/unselect all buttons */
33154
k = HiddenGroup (h, 2, 0, NULL);
33155
b = PushButton (k, "Mark All", SelectSegCategories);
33156
SetObjectExtra (b, cfp, NULL);
33157
b = PushButton (k, "Unmark All", UnselectSegCategories);
33158
SetObjectExtra (b, cfp, NULL);
33161
/* Add Accept and Cancel buttons */
33163
c = HiddenGroup (h, 3, 0, NULL);
33164
cfp->accept = DefaultButton (c, "Accept", SegregateByField_Callback);
33165
SetObjectExtra (cfp->accept, cfp, NULL);
33166
Disable (cfp->accept);
33167
PushButton (c, "Cancel", StdCancelButtonProc);
33168
cfp->leave_dlg_up = CheckBox (c, "Leave Dialog Up", NULL);
33170
/* Line things up nicely */
33172
AlignObjects (ALIGN_CENTER, (HANDLE) g3,
33173
(HANDLE) cfp->group_list_dlg,
33178
/* initialize the display */
33179
ChangeSegChoice (cfp->seg_choice_grp);
33181
/* Display the window now */
33186
Select (cfp->accept);
33188
return OM_MSG_RET_OK;
33191
typedef struct fixcase {
33196
ButtoN leave_dlg_up;
33198
ValNodePtr requested_field;
33199
GetFeatureFieldString fieldstring_func;
33200
GetDescriptorFieldString descrstring_func;
33201
SetFeatureFieldString feature_apply_action;
33202
SetDescriptorFieldString descriptor_apply_action;
33203
FreeValNodeProc free_vn_proc;
33204
CopyValNodeDataProc copy_vn_proc;
33206
ValNodePtr orgnames;
33207
} FixCaseData, PNTR FixCasePtr;
33210
static void FixCaseFeatureCallback (SeqFeatPtr sfp, Pointer userdata, FilterSetPtr fsp)
33214
ApplyValueData avd;
33216
if (sfp == NULL || userdata == NULL) return;
33217
fcp = (FixCasePtr) userdata;
33218
if (fcp->fieldstring_func == NULL || fcp->feature_apply_action == NULL
33219
|| fcp->ccp == NULL || fcp->ccp->change == eChangeCaseNone)
33224
str = fcp->fieldstring_func (sfp, fcp->requested_field, fsp);
33225
if (StringHasNoText (str)) {
33226
str = MemFree (str);
33229
avd.text_to_replace = NULL;
33230
avd.where_to_replace = EditApplyFindLocation_anywhere;
33232
avd.field_list = fcp->requested_field;
33233
ChangeCase (&str, fcp->ccp, fcp->orgnames);
33234
avd.new_text = str;
33235
(fcp->feature_apply_action) (sfp, &avd, fsp);
33239
static void FixCaseDescriptorCallback (SeqDescrPtr sdp, Pointer userdata, FilterSetPtr fsp)
33243
ApplyValueData avd;
33245
if (sdp == NULL || userdata == NULL) return;
33246
fcp = (FixCasePtr) userdata;
33247
if (fcp->descrstring_func == NULL || fcp->descriptor_apply_action == NULL
33248
|| fcp->ccp == NULL || fcp->ccp->change == eChangeCaseNone)
33253
str = fcp->descrstring_func (sdp, fcp->requested_field, fsp);
33254
if (StringHasNoText (str)) {
33255
str = MemFree (str);
33258
avd.text_to_replace = NULL;
33259
avd.where_to_replace = EditApplyFindLocation_anywhere;
33261
avd.field_list = fcp->requested_field;
33262
ChangeCase (&str, fcp->ccp, fcp->orgnames);
33263
avd.new_text = str;
33264
(fcp->descriptor_apply_action) (sdp, &avd, fsp);
33269
static void FixCaseByFieldCallback (ButtoN b)
33273
ParseFieldPtr dst_field_data;
33274
FilterSetPtr fsp = NULL;
33277
fcp = (FixCasePtr) GetObjectExtra (b);
33278
if (fcp == NULL) return;
33280
sep = GetTopSeqEntryForEntityID (fcp->input_entityID);
33282
if (sep == NULL) return;
33284
dst_field_data = DialogToPointer (fcp->field_dlg);
33285
if (dst_field_data == NULL) return;
33286
fcp->ccp = DialogToPointer (fcp->case_dlg);
33287
if (fcp->ccp == NULL || fcp->ccp->change == eChangeCaseNone) {
33288
dst_field_data = ParseFieldFree (dst_field_data);
33289
fcp->ccp = MemFree (fcp->ccp);
33296
/* if we will be fixing capitalization, get org names to use in fixes */
33297
if (dst_field_data->parse_field_type != PARSE_FIELD_BIOSRC_STRING
33298
|| dst_field_data->feature_field == NULL
33299
|| dst_field_data->feature_field->data.intvalue != PARSE_FIELD_BIOSRC_TAXNAME) {
33300
VisitBioSourcesInSep (sep, &(fcp->orgnames), GetOrgNamesInRecordCallback);
33303
switch (dst_field_data->parse_field_type)
33305
case PARSE_FIELD_SOURCE_QUAL :
33306
fcp->fieldstring_func = GetSourceQualFeatureString;
33307
fcp->descrstring_func = GetSourceQualDescrString;
33308
fcp->feature_apply_action = ApplySourceQualFeatureCallback;
33309
fcp->descriptor_apply_action = ApplySourceQualDescriptorCallback,
33310
fcp->free_vn_proc = ValNodeSimpleDataFree;
33311
fcp->copy_vn_proc = SourceQualValNodeDataCopy;
33312
fcp->requested_field = dst_field_data->feature_field;
33313
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33314
FixCaseDescriptorCallback,
33316
Seq_descr_source, fcp);
33319
case PARSE_FIELD_DEFLINE:
33320
fcp->fieldstring_func = NULL;
33321
fcp->descrstring_func = GetStringFromStringDescriptor;
33322
fcp->feature_apply_action = NULL;
33323
fcp->descriptor_apply_action = ApplyTitleDescriptorCallback;
33324
fcp->free_vn_proc = NULL;
33325
fcp->copy_vn_proc = IntValNodeCopy;
33326
fcp->requested_field = ValNodeNew (NULL);
33327
fcp->requested_field->data.intvalue = Seq_descr_title;
33328
OperateOnSeqEntryConstrainedObjects (sep, fsp, NULL,
33329
FixCaseDescriptorCallback,
33331
Seq_descr_title, fcp);
33332
fcp->requested_field = ValNodeFree (fcp->requested_field);
33335
case PARSE_FIELD_BIOSRC_STRING:
33336
fcp->fieldstring_func = GetSourceFeatureString;
33337
fcp->descrstring_func = GetSourceDescriptorString;
33338
fcp->feature_apply_action = ApplySourceStringFeatureCallback;
33339
fcp->descriptor_apply_action = ApplySourceStringDescriptorCallback;
33340
fcp->free_vn_proc = NULL;
33341
fcp->copy_vn_proc = IntValNodeCopy;
33342
fcp->requested_field = dst_field_data->feature_field;
33343
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33344
FixCaseDescriptorCallback,
33346
Seq_descr_source, fcp);
33348
case PARSE_FIELD_DBXREF:
33349
fcp->fieldstring_func = GetBioSourceFeatureDbxrefString;
33350
fcp->descrstring_func = GetBioSourceDescriptorDbxrefString;
33351
fcp->feature_apply_action = ApplyBioSourceDbxrefFeatureCallback;
33352
fcp->descriptor_apply_action = ApplyBioSourceDbxrefDescriptorCallback;
33353
fcp->free_vn_proc = ValNodeSimpleDataFree;
33354
fcp->copy_vn_proc = ValNodeStringCopy;
33355
fcp->requested_field = dst_field_data->feature_field;
33356
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33357
FixCaseDescriptorCallback,
33359
Seq_descr_source, fcp);
33361
case PARSE_FIELD_GENE_FIELD:
33362
fcp->fieldstring_func = GetGeneFieldString;
33363
fcp->descrstring_func = NULL;
33364
fcp->feature_apply_action = SetGeneFieldString;
33365
fcp->descriptor_apply_action = NULL;
33366
fcp->free_vn_proc = NULL;
33367
fcp->copy_vn_proc = IntValNodeCopy;
33368
fcp->requested_field = dst_field_data->feature_field;
33369
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33374
case PARSE_FIELD_RNA_FIELD:
33375
fcp->fieldstring_func = GetRNAFieldString;
33376
fcp->descrstring_func = NULL;
33377
fcp->feature_apply_action = SetRNAFieldString;
33378
fcp->descriptor_apply_action = NULL;
33379
fcp->free_vn_proc = NULL;
33380
fcp->copy_vn_proc = IntValNodeCopy;
33381
fcp->requested_field = dst_field_data->feature_field;
33382
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33385
dst_field_data->feature_subtype == NULL ? 0 : dst_field_data->feature_subtype->data.intvalue,
33388
case PARSE_FIELD_CDS_COMMENT:
33389
fcp->fieldstring_func = GetCDSComment;
33390
fcp->descrstring_func = NULL;
33391
fcp->feature_apply_action = SetCDSComment;
33392
fcp->descriptor_apply_action = NULL;
33393
fcp->free_vn_proc = NULL;
33394
fcp->copy_vn_proc = IntValNodeCopy;
33395
fcp->requested_field = dst_field_data->feature_field;
33396
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33398
SEQFEAT_CDREGION, FEATDEF_CDS,
33401
case PARSE_FIELD_COMMENT_DESC:
33402
fcp->requested_field = ValNodeNew (NULL);
33403
fcp->requested_field->data.intvalue = Seq_descr_comment;
33404
fcp->fieldstring_func = NULL;
33405
fcp->descrstring_func = GetStringFromStringDescriptor;
33406
fcp->feature_apply_action = NULL;
33407
fcp->descriptor_apply_action = ApplyTitleDescriptorCallback;
33408
fcp->free_vn_proc = NULL;
33409
fcp->copy_vn_proc = IntValNodeCopy;
33410
OperateOnSeqEntryConstrainedObjects (sep, fsp, NULL,
33411
FixCaseDescriptorCallback,
33413
Seq_descr_comment, fcp);
33414
fcp->requested_field = ValNodeFree (fcp->requested_field);
33416
case PARSE_FIELD_PROTEIN_FIELD:
33417
fcp->fieldstring_func = GetProteinFieldString;
33418
fcp->descrstring_func = NULL;
33419
fcp->feature_apply_action = SetProteinFieldString;
33420
fcp->descriptor_apply_action = NULL;
33421
fcp->free_vn_proc = NULL;
33422
fcp->copy_vn_proc = IntValNodeCopy;
33423
fcp->requested_field = dst_field_data->feature_field;
33424
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33429
case PARSE_FIELD_IMPORT_QUAL:
33430
fcp->requested_field = dst_field_data->feature_field;
33431
fcp->fieldstring_func = GetGBQualString;
33432
fcp->descrstring_func = NULL;
33433
fcp->feature_apply_action = SetGBQualString;
33434
fcp->descriptor_apply_action = NULL;
33435
fcp->free_vn_proc = NULL;
33436
fcp->copy_vn_proc = IntValNodeCopy;
33438
for (vnp = dst_field_data->feature_subtype; vnp != NULL; vnp = vnp->next)
33440
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33446
case PARSE_FIELD_FEATURE_NOTE:
33447
fcp->fieldstring_func = GetFeatureNote;
33448
fcp->descrstring_func = NULL;
33449
fcp->feature_apply_action = SetFeatureNote;
33450
fcp->descriptor_apply_action = NULL;
33451
fcp->free_vn_proc = ValNodeSimpleDataFree;
33452
fcp->copy_vn_proc = ValNodeStringCopy;
33454
for (vnp = dst_field_data->feature_field; vnp != NULL; vnp = vnp->next)
33456
fcp->requested_field = vnp;
33457
OperateOnSeqEntryConstrainedObjects (sep, fsp, FixCaseFeatureCallback,
33464
fcp->orgnames = ValNodeFree (fcp->orgnames);
33465
dst_field_data = ParseFieldFree (dst_field_data);
33466
fcp->ccp = MemFree (fcp->ccp);
33468
ObjMgrSetDirtyFlag (fcp->input_entityID, TRUE);
33469
ObjMgrSendMsg (OM_MSG_UPDATE, fcp->input_entityID, 0, 0);
33473
if (!GetStatus (fcp->leave_dlg_up)) {
33474
Remove (fcp->form);
33478
extern void FixCaseByField (IteM i)
33482
ChangeCaseData ccd;
33488
bfp = currentFormDataPtr;
33490
bfp = GetObjectExtra (i);
33492
if (bfp == NULL) return;
33494
/* Create a new window, and a struct */
33495
/* to pass around the data in. */
33497
cfp = (FixCasePtr) MemNew (sizeof (FixCaseData));
33501
w = FixedWindow (-50, -33, -10, -10, "Fix Case By Field",
33502
StdCloseWindowProc);
33503
SetObjectExtra (w, cfp, StdCleanupFormProc);
33504
cfp->form = (ForM) w;
33505
cfp->input_entityID = bfp->input_entityID;
33507
h = HiddenGroup (w, -1, 0, NULL);
33508
SetGroupSpacing (h, 10, 10);
33510
cfp->field_dlg = ParseFieldDestDialogEx (h, NULL, NULL, FALSE, TRUE);
33512
cfp->case_dlg = ChangeCaseDialog (h);
33513
ccd.change = eChangeCaseAllLower;
33514
PointerToDialog (cfp->case_dlg, &ccd);
33516
/* Add Accept and Cancel buttons */
33518
c = HiddenGroup (h, 3, 0, NULL);
33519
cfp->accept = DefaultButton (c, "Accept", FixCaseByFieldCallback);
33520
SetObjectExtra (cfp->accept, cfp, NULL);
33521
PushButton (c, "Cancel", StdCancelButtonProc);
33522
cfp->leave_dlg_up = CheckBox (c, "Leave Dialog Up", NULL);
33524
/* Line things up nicely */
33526
AlignObjects (ALIGN_CENTER, (HANDLE) cfp->field_dlg,
33527
(HANDLE) cfp->case_dlg,
33531
/* Display the window now */
33536
Select (cfp->accept);
33540
static void FormatBoxColumn (ColPtr col)
33542
if (col == NULL) return;
33543
col->pixWidth = stdCharWidth;
33545
col->charWidth = 0;
33546
col->charInset = 0;
33551
col->underline = 0;
33556
static ColPtr AllocateDocColumnsForFieldList (BulkEdFieldPtr field_list, Int4Ptr p_len, Int4 last_sorted_col)
33558
Int4 i, num_columns = 3, len = 0, col;
33561
if (field_list == NULL) {
33565
/* set the font so that the pixwidth will be correct */
33566
SelectFont (programFont);
33568
/* start with 3 columns, one for expand/collapse and one for checkbox for row selection and one for final blank */
33569
for (i = 0; field_list[i].name != NULL; i++) {
33572
col_list = (ColPtr) MemNew (num_columns * sizeof (ColData));
33574
FormatBoxColumn (col_list + col);
33575
len += col_list[col].pixWidth;
33578
for (i = 0; field_list[i].name != NULL; i++) {
33579
if (i == last_sorted_col) {
33580
FormatBoxColumn (col_list + col);
33581
len += col_list[col].pixWidth;
33584
len += (field_list[i].format_col_func) (col_list + col, field_list[i].name);
33585
col_list[col].last = FALSE;
33589
/* final blank column */
33590
col_list[col].pixWidth = 0;
33591
col_list[col].pixInset = 0;
33592
col_list[col].charWidth = 0;
33593
col_list[col].charInset = 0;
33594
col_list[col].font = NULL;
33595
col_list[col].just = 'l';
33596
col_list[col].wrap = 1;
33597
col_list[col].bar = 0;
33598
col_list[col].underline = 0;
33599
col_list[col].left = 0;
33600
col_list[col].last = TRUE;
33601
if (p_len != NULL) {
33607
typedef struct bulkeditorrow {
33608
ValNodePtr values_list;
33609
ValNodePtr object_list;
33610
struct bulkeditorrow PNTR subrows;
33611
Int4 copied_to_meta;
33612
Int4 copied_to_sub;
33615
} BulkEditorRowData, PNTR BulkEditorRowPtr;
33617
static ValNodePtr FreeBulkEditorValues (ValNodePtr values, BulkEdFieldPtr field_list)
33622
for (col = 0, vnp = values;
33624
col++, vnp = vnp->next) {
33625
if (field_list[col].free_func == NULL) {
33626
vnp->data.ptrvalue = MemFree (vnp->data.ptrvalue);
33628
(field_list[col].free_func) (vnp->data.ptrvalue);
33629
vnp->data.ptrvalue = NULL;
33632
values = ValNodeFree (values);
33636
static void FreeBulkEditorValuesList (ValNodePtr PNTR values_list, Int4 num_rows, BulkEdFieldPtr field_list)
33640
if (values_list == NULL || field_list == NULL) return;
33641
for (i = 0; i < num_rows; i++) {
33642
values_list[i] = FreeBulkEditorValues (values_list[i], field_list);
33644
values_list = MemFree (values_list);
33647
static BulkEditorRowPtr FreeBulkEditorRows (BulkEditorRowPtr rows, BulkEdFieldPtr field_list)
33651
if (rows == NULL) return NULL;
33652
for (row_num = 0; rows[row_num].object_list != NULL; row_num++) {
33653
rows[row_num].values_list = FreeBulkEditorValues (rows[row_num].values_list, field_list);
33654
rows[row_num].object_list = ValNodeFree (rows[row_num].object_list);
33655
FreeBulkEditorRows (rows[row_num].subrows, field_list);
33656
rows[row_num].subrows = NULL;
33658
rows = MemFree (rows);
33662
static void CopyToSingleBulkEditRow (BulkEditorRowPtr dst, BulkEditorRowPtr src, BulkEdFieldPtr field_list)
33667
if (dst == NULL || src == NULL) return;
33670
dst->values_list = NULL;
33671
for (vnp = src->values_list, col = 0; vnp != NULL; vnp = vnp->next, col++) {
33672
ValNodeAddPointer (&(dst->values_list), vnp->choice, field_list[col].copy_func(vnp->data.ptrvalue));
33676
dst->object_list = NULL;
33677
ValNodeAddPointer (&(dst->object_list), src->object_list->choice, src->object_list->data.ptrvalue);
33679
/* copy selection */
33680
dst->selected = src->selected;
33683
static void ExpandAllBulkEditRows (BulkEditorRowPtr row_list)
33687
if (row_list == NULL) return;
33688
for (row_num = 0; row_list[row_num].object_list != NULL; row_num++) {
33689
if (row_list[row_num].subrows != NULL) {
33690
row_list[row_num].expanded = TRUE;
33695
static void CollapseAllBulkEditRows (BulkEditorRowPtr row_list)
33699
if (row_list == NULL) return;
33700
for (row_num = 0; row_list[row_num].object_list != NULL; row_num++) {
33701
if (row_list[row_num].subrows != NULL) {
33702
row_list[row_num].expanded = FALSE;
33708
/* sort_col is zero-based data column, already corrected for selection and expansion columns */
33709
static CharPtr GetTextForBulkEditorRow (BulkEditorRowPtr berp, BulkEdFieldPtr field_list, Int4 sort_col)
33711
ValNodePtr column_values = NULL, vnp;
33712
Int4 text_len = 6, col;
33713
CharPtr str, line_text = NULL, tmp_str;
33715
if (berp == NULL) return NULL;
33716
for (vnp = berp->values_list, col = 0; vnp != NULL; vnp = vnp->next, col++) {
33717
if (field_list[col].display_func == NULL) {
33720
str = (field_list[col].display_func)(vnp->data.ptrvalue);
33723
str = StringSave ("");
33725
if (berp->subrows != NULL && col == sort_col) {
33726
tmp_str = (CharPtr) MemNew (sizeof (Char) * (18 + StringLen (str)));
33727
sprintf (tmp_str, "%s%s(%d)", field_list[col].draw_col_func == NULL ? "" : " ",
33728
str, ValNodeLen (berp->object_list));
33729
str = MemFree (str);
33732
ValNodeAddPointer (&column_values, 0, str);
33733
text_len += StringLen (str) + 1;
33735
line_text = (CharPtr) MemNew (text_len * sizeof (Char));
33737
/* add blank column for row selector */
33738
StringCat (line_text, "\t");
33739
for (vnp = column_values, col = 0; vnp != NULL; vnp = vnp->next, col++) {
33740
if (col == sort_col) {
33741
/* add blank column for expand/collapse */
33742
StringCat (line_text, "\t");
33744
StringCat (line_text, vnp->data.ptrvalue);
33745
StringCat (line_text, "\t");
33747
column_values = ValNodeFreeData (column_values);
33748
/* add blank column at end, to allow last real column to be highlighted when blank */
33749
StringCat (line_text, "\t\n");
33754
static Boolean DataPosFromBulkEdDlgRow (Int2 row, BulkEditorRowPtr row_list, Int4Ptr pRowNum, Int4Ptr pSubNum)
33756
Int4 row_num = 0, sub_num;
33757
Int2 display_row = 1;
33759
if (row < 1 || row_list == NULL || pRowNum == NULL || pSubNum == NULL) return FALSE;
33761
while (row_list[row_num].object_list != NULL) {
33762
if (display_row == row) {
33763
*pRowNum = row_num;
33768
if (row_list[row_num].subrows != NULL && row_list[row_num].expanded) {
33770
while (display_row != row && row_list[row_num].subrows[sub_num].object_list != NULL) {
33774
if (row_list[row_num].subrows[sub_num].object_list == NULL) {
33777
if (display_row == row) {
33778
*pRowNum = row_num;
33779
*pSubNum = sub_num;
33792
static Int4 BulkEdDlgRowFromDataPos (Int4 row_num, Int4 sub_num, BulkEditorRowPtr row_list)
33794
Int4 i, j, display_row = 1;
33796
if (row_list == NULL) return 0;
33797
/* count subrows also passed */
33798
for (i = 0; row_list[i].object_list != NULL && i < row_num; i++) {
33800
if (row_list[i].subrows != NULL && row_list[i].expanded) {
33801
for (j = 0; row_list[i].subrows[j].object_list != NULL; j++) {
33806
if (sub_num > -1) {
33807
display_row += sub_num + 1;
33809
return display_row;
33813
static Int4 BulkEdDataColumnFromDocColumn (Int4 doc_col, Int4 sort_col)
33815
/* subtract offset (document maps first column to 1) */
33817
/* subtract selection column */
33820
/* subtract expand/collapse column */
33821
if (doc_col > sort_col && sort_col > -1) {
33828
static ValNodePtr GetBulkEditorRowValueByColumn (BulkEditorRowPtr berp, Int4 col)
33833
if (col < 0) return NULL;
33835
for (i = 0, vnp = berp->values_list;
33836
i < col && vnp != NULL;
33837
i++, vnp = vnp->next) {}
33842
static void SelectBulkEditorRows (BulkEditorRowPtr berp, Boolean val)
33844
if (berp == NULL) return;
33846
while (berp->object_list != NULL) {
33847
berp->selected = val;
33848
SelectBulkEditorRows (berp->subrows, val);
33854
static Int4 CountBulkEditorRowsSelected (BulkEditorRowPtr berp)
33857
if (berp == NULL) return 0;
33859
while (berp->object_list != NULL) {
33860
if (berp->subrows == NULL) {
33861
if (berp->selected) {
33865
num+= CountBulkEditorRowsSelected (berp->subrows);
33873
static void GetBulkEditorSelectedObjects (BulkEditorRowPtr berp, ValNodePtr PNTR object_list)
33876
if (berp == NULL || object_list == NULL) return;
33878
while (berp->object_list != NULL) {
33879
if (berp->subrows == NULL) {
33880
if (berp->selected) {
33881
for (vnp = berp->object_list; vnp != NULL; vnp = vnp->next) {
33882
ValNodeAddPointer (object_list, vnp->choice, vnp->data.ptrvalue);
33886
GetBulkEditorSelectedObjects (berp->subrows, object_list);
33893
static Boolean AllBulkEditorRowsSelected (BulkEditorRowPtr berp)
33895
if (berp == NULL) return FALSE;
33897
while (berp->object_list != NULL) {
33898
/* note - don't need to check subrows, because metarow would
33899
* have been unselected if any subrows were unselected */
33900
if (!berp->selected) {
33909
static void SelectBulkEditorRowsByStringConstraint (BulkEditorRowPtr berp, BulkEdFieldPtr field_list, Int4 col, StringConstraintXPtr scp, Boolean val)
33912
CharPtr str = NULL;
33915
if (berp == NULL || field_list == NULL || col < 0 || field_list[col].display_func == NULL) return;
33917
while (berp->object_list != NULL) {
33918
if (berp->subrows == NULL) {
33919
vnp = GetBulkEditorRowValueByColumn (berp, col);
33921
str = field_list[col].display_func(vnp->data.ptrvalue);
33923
match = DoesStringMatchConstraintX (str, scp);
33924
str = MemFree (str);
33925
if (scp != NULL && scp->not_present) {
33929
berp->selected = val;
33932
SelectBulkEditorRowsByStringConstraint (berp->subrows, field_list, col, scp, val);
33933
berp->selected = AllBulkEditorRowsSelected (berp->subrows);
33940
/* call nulls and null values bigger */
33941
/* return 0 if a and b are equal, -1 if a is smaller, and 1 if b is smaller */
33942
static Int4 CompareBulkRowValues (Pointer val_a, Pointer val_b, BulkDisplayFieldFunc display_func)
33944
CharPtr str_a, str_b;
33947
if (val_a == NULL && val_b == NULL) {
33949
} else if (val_a == NULL) {
33951
} else if (val_b == NULL) {
33953
} else if (display_func == NULL) {
33956
str_a = display_func(val_a);
33957
str_b = display_func(val_b);
33958
rval = StringCmp (str_a, str_b);
33963
/* call nulls and null values bigger */
33964
/* return 0 if a and b are equal, -1 if a is smaller, and 1 if b is smaller */
33965
static Int4 CompareBulkRows (BulkEditorRowPtr row_a, BulkEditorRowPtr row_b, Int4 sort_column, BulkEdFieldPtr field_list)
33968
ValNodePtr vnp_a, vnp_b;
33971
if (row_a == NULL && row_b == NULL) {
33973
} else if (row_a == NULL) {
33975
} else if (row_b == NULL) {
33977
} else if (row_a->values_list == NULL && row_b->values_list == NULL) {
33979
} else if (row_a->values_list == NULL) {
33981
} else if (row_b->values_list == NULL) {
33985
vnp_a = GetBulkEditorRowValueByColumn (row_a, sort_column);
33986
vnp_b = GetBulkEditorRowValueByColumn (row_b, sort_column);
33988
if (vnp_a == NULL && vnp_b == NULL) {
33990
} else if (vnp_a == NULL) {
33992
} else if (vnp_b == NULL) {
33995
rval = CompareBulkRowValues (vnp_a->data.ptrvalue, vnp_b->data.ptrvalue, field_list[sort_column].display_func);
34001
static Int4 CountIndividualRows (BulkEditorRowPtr row_list)
34003
Int4 num_rows = 0, row_num;
34005
if (row_list == NULL) return 0;
34007
for (row_num = 0; row_list[row_num].object_list != NULL; row_num++) {
34008
if (row_list[row_num].subrows == NULL) {
34011
num_rows += CountIndividualRows(row_list[row_num].subrows);
34018
static void SetDefaultCopiedToValues (BulkEditorRowPtr row_list)
34022
if (row_list == NULL) return;
34024
for (row_num = 0; row_list[row_num].object_list != NULL; row_num++) {
34025
row_list[row_num].copied_to_meta = -1;
34026
row_list[row_num].copied_to_sub = -1;
34027
if (row_list[row_num].subrows != NULL) {
34028
SetDefaultCopiedToValues(row_list[row_num].subrows);
34034
static BulkEditorRowPtr ResortBulkEditorRows (BulkEditorRowPtr orig_rows, BulkEdFieldPtr field_list, Int4 new_sort_column)
34036
Int4 num_individual_rows = 0;
34037
Int4 row_num, sub_num, last_inserted = 0, comp, col;
34038
BulkEditorRowPtr new_rows = NULL, smallest, berp;
34039
ValNodePtr matches, vnp;
34040
Boolean any_left, all_selected;
34042
/* count individual rows (will need this many or fewer) */
34043
num_individual_rows = CountIndividualRows(orig_rows);
34045
/* set default copied_to values */
34046
SetDefaultCopiedToValues (orig_rows);
34048
new_rows = (BulkEditorRowPtr) MemNew (sizeof (BulkEditorRowData) * (num_individual_rows + 1));
34049
MemSet (new_rows, 0, sizeof (BulkEditorRowData) * (num_individual_rows + 1));
34054
for (row_num = 0; orig_rows[row_num].object_list != NULL; row_num++) {
34055
if (orig_rows[row_num].subrows != NULL) {
34056
/* look in subrows */
34057
for (sub_num = 0; orig_rows[row_num].subrows[sub_num].object_list != NULL; sub_num++) {
34058
if (orig_rows[row_num].subrows[sub_num].copied_to_meta > -1) continue; /* already copied to other list */
34059
if (smallest == NULL) {
34060
smallest = orig_rows[row_num].subrows + sub_num;
34061
ValNodeAddPointer (&matches, 0, orig_rows[row_num].subrows + sub_num);
34063
comp = CompareBulkRows (orig_rows[row_num].subrows + sub_num, smallest, new_sort_column, field_list);
34065
/* equal - add to list of matches */
34066
ValNodeAddPointer (&matches, 0, orig_rows[row_num].subrows + sub_num);
34067
} else if (comp < 0) {
34068
/* smaller - make new smallest and list of matches */
34069
smallest = orig_rows[row_num].subrows + sub_num;
34070
matches = ValNodeFree (matches);
34071
ValNodeAddPointer (&matches, 0, orig_rows[row_num].subrows + sub_num);
34073
/* if it's bigger, leave it alone for now */
34077
/* look at just this row */
34078
if (orig_rows[row_num].copied_to_meta > -1) continue; /* already copied to other list */
34079
if (smallest == NULL) {
34080
smallest = orig_rows + row_num;
34081
ValNodeAddPointer (&matches, 0, orig_rows + row_num);
34083
comp = CompareBulkRows (orig_rows + row_num, smallest, new_sort_column, field_list);
34085
/* equal - add to list of matches */
34086
ValNodeAddPointer (&matches, 0, orig_rows + row_num);
34087
} else if (comp < 0) {
34088
/* smaller - make new smallest and list of matches */
34089
smallest = orig_rows + row_num;
34090
matches = ValNodeFree (matches);
34091
ValNodeAddPointer (&matches, 0, orig_rows + row_num);
34093
/* if it's bigger, leave it alone for now */
34097
if (smallest == NULL) {
34100
if (ValNodeLen (matches) > 1) {
34102
/* add value for only sort column */
34103
for (col = 0, vnp = smallest->values_list; vnp != NULL; col++, vnp = vnp->next) {
34104
if (col == new_sort_column) {
34105
ValNodeAddPointer (&(new_rows[last_inserted].values_list), vnp->choice, field_list[col].copy_func(vnp->data.ptrvalue));
34107
ValNodeAddPointer (&(new_rows[last_inserted].values_list), 0, NULL);
34110
/* add features and subrows */
34111
new_rows[last_inserted].subrows = (BulkEditorRowPtr) MemNew (sizeof(BulkEditorRowData) * (ValNodeLen(matches) + 1));
34112
MemSet (new_rows[last_inserted].subrows, 0, sizeof(BulkEditorRowData) * (ValNodeLen(matches) + 1));
34113
all_selected = TRUE;
34114
for (vnp = matches, sub_num = 0; vnp != NULL; vnp = vnp->next, sub_num++) {
34115
berp = (vnp->data.ptrvalue);
34116
ValNodeAddPointer (&(new_rows[last_inserted].object_list), berp->object_list->choice, berp->object_list->data.ptrvalue);
34117
CopyToSingleBulkEditRow (new_rows[last_inserted].subrows + sub_num, berp, field_list);
34118
berp->copied_to_meta = last_inserted;
34119
berp->copied_to_sub = sub_num;
34120
if (!berp->selected) {
34121
all_selected = FALSE;
34124
new_rows[last_inserted].selected = all_selected;
34126
CopyToSingleBulkEditRow (new_rows + last_inserted, smallest, field_list);
34127
smallest->copied_to_meta = last_inserted;
34128
smallest->copied_to_sub = 0;
34131
matches = ValNodeFree (matches);
34138
/* sort_column is zero-based data column, already corrected for selection and expansion columns */
34139
static Boolean AllSubrowsSameValue (BulkEditorRowPtr berp, BulkEdFieldPtr field_list, Int4 sort_column)
34142
Boolean all_same = TRUE;
34144
if (berp == NULL || berp->subrows == NULL || berp->subrows[0].object_list == NULL) {
34148
for (i = 1; berp->subrows[i].object_list != NULL && all_same; i++) {
34149
if (CompareBulkRows (berp->subrows + i - 1, berp->subrows + i, sort_column, field_list) != 0) {
34158
/* sort_column is zero-based data column, already corrected for selection and expansion columns */
34159
/* look to see if data in columns is different from data in editor */
34160
static Boolean AnyChangeInBulkFields (BulkEditorRowPtr berp, BulkEdFieldPtr field_list, DialoG editor, Int4 sort_column)
34166
if (berp == NULL || berp->subrows == NULL || berp->subrows[0].object_list == NULL) return FALSE;
34167
if (field_list == NULL || editor == NULL) return FALSE;
34169
if (!AllSubrowsSameValue (berp, field_list, sort_column)) {
34173
/* find value for sort_column from first subrow */
34174
vnp = GetBulkEditorRowValueByColumn (berp, sort_column);
34176
if (vnp == NULL) return TRUE;
34178
/* compare with data from editor */
34179
m_data = DialogToPointer (editor);
34181
comp = CompareBulkRowValues (m_data, vnp->data.ptrvalue, field_list[sort_column].display_func);
34183
/* free data from editor */
34184
if (field_list[sort_column].free_func) {
34185
(field_list[sort_column].free_func)(m_data);
34196
/* col is zero-based data column, already corrected for selection and expansion columns */
34197
static void ApplyValueToOneBulkEditorRow (BulkEditorRowPtr berp, Int2 col, BulkEdFieldPtr field_list, DialoG editor)
34201
if (berp == NULL || field_list == NULL || editor == NULL) return;
34203
vnp = GetBulkEditorRowValueByColumn (berp, col);
34206
if (field_list[col].free_func == NULL) {
34207
vnp->data.ptrvalue = MemFree (vnp->data.ptrvalue);
34209
(field_list[col].free_func) (vnp->data.ptrvalue);
34210
vnp->data.ptrvalue = NULL;
34212
vnp->data.ptrvalue = DialogToPointer (editor);
34217
static void PopulateSingleBulkEditRowFromData (BulkEditorRowPtr berp, Uint1 data_choice, Pointer data, BulkEdFieldPtr field_list, Pointer metadata)
34221
/* add values for all columns */
34222
for (col = 0; field_list[col].name != NULL; col++) {
34223
ValNodeAddPointer (&(berp->values_list), 0, (field_list[col].get_func (data_choice, data, metadata)));
34226
ValNodeAddPointer (&(berp->object_list), data_choice, data);
34229
static BulkEditorRowPtr MakeBulkEditorRowsFromObjectList (ValNodePtr object_list, BulkEdFieldPtr field_list, Int4 sort_column, Pointer metadata)
34232
BulkEditorRowPtr bulk_ed_rows = NULL, sorted_rows = NULL;
34233
Int4 num_rows, row_num;
34235
if (object_list == NULL || field_list == NULL) return NULL;
34237
/* first, create list with one row per object */
34238
num_rows = ValNodeLen (object_list);
34240
bulk_ed_rows = (BulkEditorRowPtr) MemNew (sizeof (BulkEditorRowData) * (num_rows + 1));
34241
MemSet (bulk_ed_rows, 0, sizeof (BulkEditorRowData) * (num_rows + 1));
34243
for (vnp = object_list, row_num = 0; vnp != NULL; vnp = vnp->next, row_num++)
34245
PopulateSingleBulkEditRowFromData (bulk_ed_rows + row_num, vnp->choice, vnp->data.ptrvalue, field_list, metadata);
34248
if (sort_column >= 0)
34250
/* Now resort rows for column */
34251
sorted_rows = ResortBulkEditorRows (bulk_ed_rows, field_list, sort_column);
34252
bulk_ed_rows = FreeBulkEditorRows (bulk_ed_rows, field_list);
34253
bulk_ed_rows = sorted_rows;
34255
return bulk_ed_rows;
34260
AddRowsToListBySelection
34261
(BulkEditorRowPtr dest,
34262
BulkEditorRowPtr src,
34263
BulkEdFieldPtr field_list,
34264
Int4 last_inserted,
34269
if (dest == NULL || src == NULL) return last_inserted;
34271
for (row_num = 0; src[row_num].object_list != NULL; row_num++) {
34272
if (src[row_num].subrows == NULL) {
34273
if ((src[row_num].selected && selected)
34274
|| (!src[row_num].selected && !selected)) {
34275
CopyToSingleBulkEditRow (dest + last_inserted, src + row_num, field_list);
34276
src[row_num].copied_to_meta = last_inserted;
34277
src[row_num].copied_to_sub = 0;
34281
last_inserted = AddRowsToListBySelection(dest, src[row_num].subrows, field_list, last_inserted, selected);
34284
return last_inserted;
34287
static BulkEditorRowPtr ResortBulkEditorRowsBySelected (BulkEditorRowPtr orig_rows, BulkEdFieldPtr field_list)
34289
Int4 num_individual_rows;
34290
Int4 last_inserted = 0;
34291
BulkEditorRowPtr new_rows = NULL;
34293
/* count individual rows (will need this many or fewer) */
34294
num_individual_rows = CountIndividualRows(orig_rows);
34296
/* set default copied_to values */
34297
SetDefaultCopiedToValues (orig_rows);
34299
new_rows = (BulkEditorRowPtr) MemNew (sizeof (BulkEditorRowData) * (num_individual_rows + 1));
34300
MemSet (new_rows, 0, sizeof (BulkEditorRowData) * (num_individual_rows + 1));
34302
/* add selected rows first */
34303
last_inserted = AddRowsToListBySelection(new_rows, orig_rows, field_list, last_inserted, TRUE);
34305
/* add unselected rows */
34306
last_inserted = AddRowsToListBySelection(new_rows, orig_rows, field_list, last_inserted, FALSE);
34316
eBulkApplyField = 1,
34322
eBulkCapitalizeField
34325
static Int4 GetFieldNumFromPopupValue (Int4 popup_val, BulkEdFieldPtr field_list, Boolean edit_only)
34329
for (i = 0; field_list[i].name != NULL; i++) {
34330
if (field_list[i].create_dlg_func != NULL || (!edit_only && field_list[i].display_func != NULL)) {
34331
if (pval == popup_val) {
34341
static Int4 GetPopupValueFromFieldNum (Int4 field_num, BulkEdFieldPtr field_list, Boolean edit_only)
34345
for (i = 0; field_list[i].name != NULL; i++) {
34346
if (field_list[i].create_dlg_func != NULL || (!edit_only && field_list[i].display_func != NULL)) {
34347
if (i == field_num) {
34358
static PopuP MakeBulkEditorFieldListPopup (GrouP g, BulkEdFieldPtr field_list, Boolean edit_only)
34363
if (field_list == NULL) return NULL;
34365
p = PopupList (g, TRUE, NULL);
34366
for (i = 0; field_list[i].name != NULL; i++) {
34367
if (field_list[i].create_dlg_func != NULL || (!edit_only && field_list[i].display_func != NULL)) {
34368
PopupItem (p, field_list[i].name);
34375
typedef struct onefieldbulkedit
34378
EditApplyPtr edit_apply;
34379
ChangeCasePtr capitalization;
34380
} OneFieldBulkEditData, PNTR OneFieldBulkEditPtr;
34382
static OneFieldBulkEditPtr OneFieldBulkEditFree (OneFieldBulkEditPtr ofp)
34385
ofp->edit_apply = EditApplyFree (ofp->edit_apply);
34386
ofp->capitalization = MemFree (ofp->capitalization);
34387
ofp = MemFree (ofp);
34392
typedef struct onefieldbulkeditdlg
34394
DIALOG_MESSAGE_BLOCK
34395
Nlm_ChangeNotifyProc change_notify;
34396
Pointer change_userdata;
34397
BulkEdFieldPtr field_list;
34399
DialoG capitalization;
34402
} OneFieldBulkEditDialogData, PNTR OneFieldBulkEditDialogPtr;
34405
static void OneFieldBulkEditToDialog (DialoG d, Pointer data)
34407
OneFieldBulkEditDialogPtr dlg;
34408
OneFieldBulkEditPtr dlg_data;
34410
dlg = (OneFieldBulkEditDialogPtr) GetObjectExtra (d);
34411
if (dlg == NULL) return;
34413
dlg_data = (OneFieldBulkEditPtr) data;
34414
if (dlg_data == NULL) {
34415
SetValue (dlg->field, 1);
34416
PointerToDialog (dlg->edit_apply, NULL);
34417
PointerToDialog (dlg->capitalization, NULL);
34419
SetValue (dlg->field, GetPopupValueFromFieldNum(dlg_data->field, dlg->field_list, TRUE));
34420
PointerToDialog (dlg->edit_apply, dlg_data->edit_apply);
34421
PointerToDialog (dlg->capitalization, dlg_data->capitalization);
34423
if (dlg->change_notify != NULL) {
34424
(dlg->change_notify) (dlg->change_userdata);
34429
static Pointer OneFieldBulkEditDialogToPointer (DialoG d)
34431
OneFieldBulkEditDialogPtr dlg;
34432
OneFieldBulkEditPtr dlg_data;
34434
dlg = (OneFieldBulkEditDialogPtr) GetObjectExtra (d);
34435
if (dlg == NULL) return NULL;
34437
dlg_data = (OneFieldBulkEditPtr) MemNew (sizeof (OneFieldBulkEditData));
34438
dlg_data->field = GetFieldNumFromPopupValue(GetValue (dlg->field), dlg->field_list, TRUE);
34439
dlg_data->edit_apply = DialogToPointer (dlg->edit_apply);
34440
dlg_data->capitalization = DialogToPointer (dlg->capitalization);
34445
static DialoG OneFieldBulkEditDialog
34447
EBulkAction action_choice,
34448
Nlm_ChangeNotifyProc change_notify,
34449
Pointer change_userdata,
34450
BulkEdFieldPtr field_list)
34453
OneFieldBulkEditDialogPtr dlg;
34456
dlg = (OneFieldBulkEditDialogPtr) MemNew (sizeof (OneFieldBulkEditDialogData));
34462
p = HiddenGroup (h, 2, 0, NULL);
34463
SetObjectExtra (p, dlg, StdCleanupExtraProc);
34464
SetGroupSpacing (p, 10, 10);
34466
dlg->dialog = (DialoG) p;
34467
dlg->todialog = OneFieldBulkEditToDialog;
34468
dlg->fromdialog = OneFieldBulkEditDialogToPointer;
34469
dlg->dialogmessage = NULL;
34470
dlg->testdialog = NULL;
34472
dlg->field_list = field_list;
34474
dlg->field = MakeBulkEditorFieldListPopup (p, field_list, TRUE);
34475
SetValue (dlg->field, 1);
34477
if (action_choice == eBulkApplyField)
34479
dlg->edit_apply = EditApplyDialog (p, eEditApplyChoice_Apply, NULL, NULL, NULL, NULL);
34481
else if (action_choice == eBulkEditField)
34483
dlg->edit_apply = EditApplyDialog (p, eEditApplyChoice_Edit, NULL, NULL, NULL, NULL);
34485
else if (action_choice == eBulkCapitalizeField)
34487
dlg->capitalization = ChangeCaseDialog (p);
34494
typedef struct twofieldbulkedit
34498
Boolean strip_name;
34499
Boolean leave_on_original;
34500
Boolean remove_parsed;
34501
TextPortionXPtr text_portion;
34502
} TwoFieldBulkEditData, PNTR TwoFieldBulkEditPtr;
34505
static TwoFieldBulkEditPtr TwoFieldBulkEditFree (TwoFieldBulkEditPtr tfp)
34508
tfp->text_portion = TextPortionXFree (tfp->text_portion);
34509
tfp = MemFree (tfp);
34515
typedef struct twofieldbulkeditdlg
34517
DIALOG_MESSAGE_BLOCK
34518
Nlm_ChangeNotifyProc change_notify;
34519
Pointer change_userdata;
34520
BulkEdFieldPtr field_list;
34522
ButtoN leave_on_original;
34523
ButtoN remove_parsed;
34524
DialoG text_portion;
34528
} TwoFieldBulkEditDialogData, PNTR TwoFieldBulkEditDialogPtr;
34531
static void TwoFieldBulkEditToDialog (DialoG d, Pointer data)
34533
TwoFieldBulkEditDialogPtr dlg;
34534
TwoFieldBulkEditPtr dlg_data;
34536
dlg = (TwoFieldBulkEditDialogPtr) GetObjectExtra (d);
34537
if (dlg == NULL) return;
34539
dlg_data = (TwoFieldBulkEditPtr) data;
34540
if (dlg_data == NULL) {
34541
SetValue (dlg->field_from, 1);
34542
SetValue (dlg->field_to, 1);
34543
if (dlg->leave_on_original != NULL) {
34544
SetStatus (dlg->leave_on_original, FALSE);
34546
if (dlg->strip_name != NULL) {
34547
SetStatus (dlg->strip_name, FALSE);
34549
if (dlg->remove_parsed != NULL) {
34550
SetStatus (dlg->remove_parsed, FALSE);
34552
PointerToDialog (dlg->text_portion, NULL);
34554
SetValue (dlg->field_from, GetPopupValueFromFieldNum(dlg_data->field_from, dlg->field_list, TRUE));
34555
SetValue (dlg->field_to, GetPopupValueFromFieldNum(dlg_data->field_to, dlg->field_list, TRUE));
34556
if (dlg->leave_on_original != NULL) {
34557
SetStatus (dlg->leave_on_original, dlg_data->leave_on_original);
34559
if (dlg->strip_name != NULL) {
34560
SetStatus (dlg->strip_name, dlg_data->strip_name);
34562
if (dlg->remove_parsed != NULL) {
34563
SetStatus (dlg->remove_parsed, dlg_data->remove_parsed);
34565
PointerToDialog (dlg->text_portion, dlg_data->text_portion);
34567
if (dlg->change_notify != NULL) {
34568
(dlg->change_notify) (dlg->change_userdata);
34573
static Pointer TwoFieldBulkEditDialogToPointer (DialoG d)
34575
TwoFieldBulkEditDialogPtr dlg;
34576
TwoFieldBulkEditPtr dlg_data;
34578
dlg = (TwoFieldBulkEditDialogPtr) GetObjectExtra (d);
34579
if (dlg == NULL) return NULL;
34581
dlg_data = (TwoFieldBulkEditPtr) MemNew (sizeof (TwoFieldBulkEditData));
34582
dlg_data->field_from = GetFieldNumFromPopupValue(GetValue (dlg->field_from), dlg->field_list, TRUE);
34583
dlg_data->field_to = GetFieldNumFromPopupValue(GetValue (dlg->field_to), dlg->field_list, TRUE);
34584
dlg_data->leave_on_original = dlg->leave_on_original == NULL ? FALSE : GetStatus (dlg->leave_on_original);
34585
dlg_data->strip_name = dlg->strip_name == NULL ? FALSE : GetStatus (dlg->strip_name);
34586
dlg_data->remove_parsed = dlg->remove_parsed == NULL ? FALSE : GetStatus (dlg->remove_parsed);
34587
dlg_data->text_portion = DialogToPointer (dlg->text_portion);
34592
static DialoG TwoFieldBulkEditDialog
34594
EBulkAction action_choice,
34595
Nlm_ChangeNotifyProc change_notify,
34596
Pointer change_userdata,
34597
BulkEdFieldPtr field_list,
34598
Boolean strip_name)
34601
TwoFieldBulkEditDialogPtr dlg;
34604
dlg = (TwoFieldBulkEditDialogPtr) MemNew (sizeof (TwoFieldBulkEditDialogData));
34610
p = HiddenGroup (h, -1, 0, NULL);
34611
SetObjectExtra (p, dlg, StdCleanupExtraProc);
34612
SetGroupSpacing (p, 10, 10);
34614
dlg->dialog = (DialoG) p;
34615
dlg->todialog = TwoFieldBulkEditToDialog;
34616
dlg->fromdialog = TwoFieldBulkEditDialogToPointer;
34617
dlg->dialogmessage = NULL;
34618
dlg->testdialog = NULL;
34620
dlg->field_list = field_list;
34622
g1 = HiddenGroup (p, 2, 0, NULL);
34623
StaticPrompt (g1, "From", 0, dialogTextHeight, systemFont, 'l');
34624
StaticPrompt (g1, "To", 0, dialogTextHeight, systemFont, 'l');
34626
dlg->field_from = MakeBulkEditorFieldListPopup (g1, field_list, TRUE);
34627
SetValue (dlg->field_from, 1);
34628
dlg->field_to = MakeBulkEditorFieldListPopup (g1, field_list, TRUE);
34629
SetValue (dlg->field_to, 1);
34631
if (action_choice == eBulkParseField)
34633
dlg->text_portion = TextPortionXDialog(p);
34636
g2 = HiddenGroup (p, 3, 0, NULL);
34638
if (action_choice == eBulkParseField)
34640
dlg->remove_parsed = CheckBox (g2, "Remove from parsed field", NULL);
34643
if (action_choice == eBulkConvertField)
34645
dlg->leave_on_original = CheckBox (g2, "Leave on original", NULL);
34649
dlg->strip_name = CheckBox (g2, "Strip name from text", NULL);
34652
AlignObjects (ALIGN_CENTER, (HANDLE) g1, (HANDLE)g2, (HANDLE) dlg->text_portion, NULL);
34657
static void BulkDrawCollapseExpand (Boolean val, RectPtr r)
34661
if (r == NULL) return;
34664
rct.bottom = rct.top + stdLineHeight - 4;
34665
rct.right = rct.left + stdLineHeight - 4;
34666
InsetRect (&rct, 2, 2);
34671
MoveTo (rct.left, (rct.top + rct.bottom) / 2);
34672
LineTo (rct.right - 1, (rct.top + rct.bottom) / 2);
34675
MoveTo (rct.left, (rct.top + rct.bottom) / 2);
34676
LineTo (rct.right - 1, (rct.top + rct.bottom) / 2);
34677
MoveTo ((rct.left + rct.right) / 2, rct.top);
34678
LineTo ((rct.left + rct.right) / 2, rct.bottom);
34683
static void BulkDrawSelect (Boolean val, RectPtr r)
34687
if (r == NULL) return;
34690
rct.bottom = rct.top + stdLineHeight - 4;
34691
rct.right = rct.left + stdLineHeight - 4;
34692
InsetRect (&rct, 2, 2);
34697
MoveTo (rct.left, rct.top);
34698
LineTo (rct.right - 1, rct.bottom - 1);
34699
MoveTo (rct.right, rct.top);
34700
LineTo (rct.left, rct.bottom - 1);
34705
typedef struct bulkeditordlg {
34706
DIALOG_MESSAGE_BLOCK
34709
BulkEdFieldPtr field_list;
34712
BulkEditorRowPtr row_list;
34713
DialoG PNTR editor_list;
34715
Int2 last_viewed_row;
34716
Int2 last_viewed_col; /* this will always refer to the data column */
34717
Int2 last_sorted_col; /* this will always refer to the data column */
34719
/* These are for the bulk edit actions */
34721
GrouP action_pages[8];
34725
DialoG bulk_convert;
34728
DialoG bulk_remove;
34729
DialoG bulk_capitalize;
34731
GrouP sel_unsel_grp;
34732
PopuP check_constraint_field;
34733
DialoG check_constraint;
34734
PrompT check_status;
34736
Boolean any_editing;
34737
Boolean collapse_by_default;
34738
ClickableCallback single_click_func;
34739
ClickableCallback double_click_func;
34741
} BulkEditorDlgData, PNTR BulkEditorDlgPtr;
34744
static void InitBulkEdTitleDoc (BulkEditorDlgPtr dlg, DoC doc)
34746
Int4 i, text_len = 5;
34749
if (dlg == NULL || doc == NULL) {
34754
for (i = 0; i < dlg->num_columns; i++) {
34755
text_len += StringLen (dlg->field_list[i].name) + 1;
34758
line_text = (CharPtr) MemNew (text_len * sizeof (Char));
34760
/* add blank column for row selection */
34761
StringCat (line_text, "\t");
34763
for (i = 0; i < dlg->num_columns - 1; i++) {
34764
if (i == dlg->last_sorted_col) {
34765
/* add blank column for expand/collapse */
34766
StringCat (line_text, "\t");
34768
StringCat (line_text, dlg->field_list[i].name);
34769
StringCat (line_text, "\t");
34771
if (i == dlg->last_sorted_col) {
34772
/* add blank column for expand/collapse */
34773
StringCat (line_text, "\t");
34775
StringCat (line_text, dlg->field_list[i].name);
34776
/* add blank column at end */
34777
StringCat (line_text, "\t\n");
34779
AppendText (doc, line_text, &(dlg->par_fmt), dlg->col_list, programFont);
34780
line_text = MemFree (line_text);
34784
/* redraw, set scroll position */
34785
static void UpdateBulkEdDisplay (BulkEditorDlgPtr dlg)
34787
Int4 i, text_len = 0, sub_num;
34791
Int2 first_shown = 0;
34797
/* Get original scroll position */
34798
sb = GetSlateVScrollBar ((SlatE)dlg->doc);
34800
GetScrlParams4 (dlg->doc, &offset, &first_shown, NULL);
34804
if (dlg->row_list == NULL) {
34808
for (i = 0; dlg->row_list[i].object_list != NULL; i++) {
34809
line_text = GetTextForBulkEditorRow(dlg->row_list + i, dlg->field_list, dlg->last_sorted_col);
34810
AppendText (dlg->doc, line_text, &(dlg->par_fmt), dlg->col_list, programFont);
34811
line_text = MemFree (line_text);
34812
if (dlg->row_list[i].subrows != NULL && dlg->row_list[i].expanded) {
34813
for (sub_num = 0; dlg->row_list[i].subrows[sub_num].object_list != NULL; sub_num++) {
34814
line_text = GetTextForBulkEditorRow(dlg->row_list[i].subrows + sub_num, dlg->field_list, dlg->last_sorted_col);
34815
AppendText (dlg->doc, line_text, &(dlg->par_fmt), dlg->col_list, programFont);
34816
line_text = MemFree (line_text);
34821
/* restore original scroll position */
34822
GetItemParams4 (dlg->doc, first_shown, &offset, NULL, NULL, NULL, NULL);
34823
offset = MIN (offset, GetBarMax (sb));
34824
SetScrlParams4 (dlg->doc, offset);
34827
/* col is zero-based data column, already corrected for selection and expansion columns */
34828
static void BulkEdDlgToField (Int2 row, Int2 col, BulkEditorDlgPtr dlg)
34831
Int4 bulk_row, sub_num;
34833
if (row < 1 || col < 0 || dlg == NULL) return;
34834
if (dlg->editor_list[col] == NULL) return;
34836
if (!DataPosFromBulkEdDlgRow (row, dlg->row_list, &bulk_row, &sub_num)) return;
34838
/* don't apply values if editing master row and column other than sort */
34839
if (sub_num < 0 && col != dlg->last_sorted_col && dlg->row_list[bulk_row].subrows != NULL) return;
34842
/* if applying to all, get confirmation */
34843
if (dlg->row_list[bulk_row].subrows != NULL) {
34844
/* if nothing changed, no need to ask, nothing to do */
34845
if (!AnyChangeInBulkFields(dlg->row_list + bulk_row, dlg->field_list, dlg->editor_list[dlg->last_sorted_col], dlg->last_sorted_col)) {
34847
} else if (ANS_CANCEL == Message (MSG_OKC, "Apply value to all features in collapsible group?")) {
34851
ApplyValueToOneBulkEditorRow (dlg->row_list + bulk_row, col, dlg->field_list, dlg->editor_list[col]);
34852
if (dlg->row_list[bulk_row].subrows != NULL) {
34853
for (i = 0; dlg->row_list[bulk_row].subrows[i].object_list != NULL; i++) {
34854
ApplyValueToOneBulkEditorRow (dlg->row_list[bulk_row].subrows + i, col, dlg->field_list, dlg->editor_list[col]);
34858
ApplyValueToOneBulkEditorRow (dlg->row_list[bulk_row].subrows + sub_num, col, dlg->field_list, dlg->editor_list[col]);
34860
UpdateBulkEdDisplay (dlg);
34864
/* col is zero-based data column, already corrected for selection and expansion columns */
34865
/* if col is -1, hide everything (sorted by selection) */
34866
static void ShowBulkFieldEditor (BulkEditorDlgPtr dlg, Int4 bulk_row, Int4 sub_num, Int2 col)
34868
BulkEditorRowPtr berp;
34872
for (i = 0; i < dlg->num_columns; i++) {
34873
SafeHide (dlg->editor_list[i]);
34876
if (col < 0) return;
34879
berp = dlg->row_list + bulk_row;
34881
berp = dlg->row_list[bulk_row].subrows + sub_num;
34884
/* only show editor dialog if sorted column or not master row */
34885
if (col == dlg->last_sorted_col || berp->subrows == NULL) {
34886
vnp = GetBulkEditorRowValueByColumn (berp, col);
34889
PointerToDialog (dlg->editor_list[col], NULL);
34891
PointerToDialog (dlg->editor_list[col], vnp->data.ptrvalue);
34894
SafeShow (dlg->editor_list[col]);
34899
/* clicking on a column in the title indicates that we should sort by this column. */
34900
static void ClickBulkTitle (DoC d, PoinT pt)
34902
BulkEditorDlgPtr dlg;
34906
Int4 bulk_row_num = -1, bulk_sub_num = -1;
34908
Int4 offset = 0, i;
34909
BulkEditorRowPtr sorted_rows;
34911
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
34912
if (dlg == NULL) return;
34914
MapDocPoint (d, pt, &item, &row, &col, NULL);
34916
if (col - 2 == dlg->last_sorted_col) {
34917
/* clicked on checkbox column */
34920
col = BulkEdDataColumnFromDocColumn(col, dlg->last_sorted_col);
34923
if (item < 1 || col < -1 || col >= dlg->num_columns) return;
34924
BulkEdDlgToField (dlg->last_viewed_row, dlg->last_viewed_col, dlg);
34927
/* save value of column listed */
34928
dlg->last_sorted_col = col;
34931
sorted_rows = ResortBulkEditorRowsBySelected (dlg->row_list, dlg->field_list);
34933
sorted_rows = ResortBulkEditorRows (dlg->row_list, dlg->field_list, dlg->last_sorted_col);
34934
if (dlg->collapse_by_default) {
34935
CollapseAllBulkEditRows (sorted_rows);
34937
ExpandAllBulkEditRows (sorted_rows);
34940
/* get new position from old row */
34941
if (DataPosFromBulkEdDlgRow (dlg->last_viewed_row, dlg->row_list, &bulk_row_num, &bulk_sub_num)) {
34942
if (bulk_sub_num > -1) {
34943
dlg->last_viewed_row = BulkEdDlgRowFromDataPos (dlg->row_list[bulk_row_num].subrows[bulk_sub_num].copied_to_meta,
34944
dlg->row_list[bulk_row_num].subrows[bulk_sub_num].copied_to_sub,
34947
dlg->last_viewed_row = BulkEdDlgRowFromDataPos (dlg->row_list[bulk_row_num].copied_to_meta,
34948
dlg->row_list[bulk_row_num].copied_to_sub,
34951
dlg->last_viewed_col = dlg->last_sorted_col;
34954
dlg->row_list = FreeBulkEditorRows (dlg->row_list, dlg->field_list);
34955
dlg->row_list = sorted_rows;
34958
/* reformat the columns */
34959
dlg->col_list = AllocateDocColumnsForFieldList (dlg->field_list, NULL, dlg->last_sorted_col);
34961
InitBulkEdTitleDoc (dlg, dlg->title_doc);
34962
ObjectRect (dlg->title_doc, &r);
34965
UpdateBulkEdDisplay (dlg);
34967
if (dlg->last_viewed_row > 0) {
34968
/* show appropriate editor for highlighted item */
34969
if (DataPosFromBulkEdDlgRow (dlg->last_viewed_row, dlg->row_list, &bulk_row_num, &bulk_sub_num)) {
34970
ShowBulkFieldEditor (dlg, bulk_row_num, bulk_sub_num, dlg->last_sorted_col);
34972
dlg->last_viewed_row = 0;
34973
dlg->last_viewed_col = 0;
34974
for (i = 0; i < dlg->num_columns; i++) {
34975
SafeHide (dlg->editor_list[i]);
34979
/* scroll to new position of last_viewed */
34980
GetItemParams4 (dlg->doc, dlg->last_viewed_row, &offset, NULL, NULL, NULL, NULL);
34981
SetScrlParams4 (dlg->doc, offset);
34984
/* redraw highlight etc. */
34985
ObjectRect (dlg->title_doc, &r);
34987
ObjectRect (dlg->doc, &r);
34992
static void UpdateCheckStatus (BulkEditorDlgPtr dlg)
34995
CharPtr status_fmt = "%d feature%s currently checked";
34996
Char status_str[50];
34998
if (dlg == NULL) return;
35000
num_selected = CountBulkEditorRowsSelected (dlg->row_list);
35001
sprintf (status_str, status_fmt, num_selected, num_selected == 1 ? "" : "s");
35002
SetTitle (dlg->check_status, status_str);
35006
/* when clicking on field, show editor (if available), change selection, collapse/expand,
35007
* set last viewed row, populate data from previously displayed editor
35009
static void ClickBulkEdField (DoC d, PoinT pt)
35011
BulkEditorDlgPtr dlg;
35012
BulkEditorRowPtr berp;
35018
Int4 bulk_row = -1, sub_num = -1;
35019
Boolean dblclick = dblClick;
35021
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35022
if (dlg == NULL) return;
35024
MapDocPoint (d, pt, &item, &row, &col, NULL);
35026
if (!DataPosFromBulkEdDlgRow (item, dlg->row_list, &bulk_row, &sub_num)) {
35031
berp = dlg->row_list + bulk_row;
35033
berp = dlg->row_list[bulk_row].subrows + sub_num;
35038
berp->selected = !berp->selected;
35039
if (berp->subrows != NULL) {
35040
SelectBulkEditorRows (berp->subrows, berp->selected);
35041
} else if (sub_num > -1) {
35042
/* this is a subrow - metarow can no longer be selected
35043
* if this is not selected.
35045
if (dlg->row_list[bulk_row].selected && !berp->selected) {
35046
dlg->row_list[bulk_row].selected = FALSE;
35047
} else if (AllBulkEditorRowsSelected(dlg->row_list[bulk_row].subrows)) {
35048
/* all child rows are now selected, so select metarow */
35049
dlg->row_list[bulk_row].selected = TRUE;
35052
UpdateCheckStatus (dlg);
35053
ObjectRect (dlg->doc, &r);
35057
} else if (col == dlg->last_sorted_col + 2) {
35058
/* do expand/collapse */
35059
if (berp->subrows != NULL) {
35060
berp->expanded = !berp->expanded;
35061
UpdateBulkEdDisplay (dlg);
35062
ObjectRect (dlg->doc, &r);
35068
/* adjust to account for checkbox column */
35069
col = BulkEdDataColumnFromDocColumn(col, dlg->last_sorted_col);
35071
if (item < 1 || col < 0 || col >= dlg->num_columns) return;
35072
BulkEdDlgToField (dlg->last_viewed_row, dlg->last_viewed_col, dlg);
35075
ShowBulkFieldEditor (dlg, bulk_row, sub_num, col);
35077
if (dlg->field_list[col].release_cell_func != NULL) {
35078
vnp = GetBulkEditorRowValueByColumn (berp, col);
35080
vnp->data.ptrvalue = (dlg->field_list[col].release_cell_func) (vnp->data.ptrvalue);
35083
dlg->last_viewed_row = item;
35084
dlg->last_viewed_col = col;
35086
/* redraw highlight etc. */
35087
ObjectRect (dlg->doc, &r);
35093
if (dlg->double_click_func != NULL) {
35094
(dlg->double_click_func) (berp->object_list, NULL);
35097
if (dlg->single_click_func != NULL) {
35098
(dlg->single_click_func) (berp->object_list, NULL);
35103
static Boolean HighlightBulkEdField (DoC d, Int2 item, Int2 row, Int2 col)
35106
BulkEditorDlgPtr dlg;
35108
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35109
if (dlg == NULL) return FALSE;
35111
if (col == 1 || col == dlg->last_sorted_col + 1) {
35112
/* don't highlight selection column or expansion column */
35116
col = BulkEdDataColumnFromDocColumn (col, dlg->last_sorted_col);
35118
if (item == dlg->last_viewed_row && col == dlg->last_viewed_col) {
35125
static void DrawBulkEdCell (DoC d, RectPtr r, Int2 item, Int2 firstLine)
35130
Int2 format_col, data_col;
35131
BulkEditorDlgPtr dlg;
35132
BulkEditorRowPtr berp;
35134
Int4 bulk_row_num = -1, bulk_sub_num = -1;
35136
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35137
if (dlg == NULL || r == NULL || item <= 0 || firstLine != 0) {
35141
GetItemParams (d, item, NULL, NULL, NULL, &lineHeight, NULL);
35144
if (!DataPosFromBulkEdDlgRow (item, dlg->row_list, &bulk_row_num, &bulk_sub_num)) {
35148
/* draw lines at top of each row after the first that does not have subrows */
35149
if (bulk_row_num > 0 && bulk_sub_num < 0) {
35150
MoveTo (rct.left, rct.top);
35151
LineTo (rct.right, rct.top);
35154
if (bulk_sub_num < 0) {
35155
berp = dlg->row_list + bulk_row_num;
35157
berp = dlg->row_list[bulk_row_num].subrows + bulk_sub_num;
35160
/* for column 0, draw selection box */
35162
rct.right = rct.left + dlg->col_list[format_col].pixWidth - 1;
35163
BulkDrawSelect (berp->selected, &rct);
35164
rct.left = rct.right + 1;
35167
for (data_col = 0, vnp = berp->values_list;
35168
data_col < dlg->num_columns && vnp != NULL;
35169
data_col++, vnp = vnp->next) {
35170
rct.right = rct.left + dlg->col_list[format_col].pixWidth - 1;
35171
if (data_col == dlg->last_sorted_col) {
35172
/* draw box if expandable */
35173
if (bulk_sub_num == -1
35174
&& dlg->row_list[bulk_row_num].subrows != NULL) {
35175
BulkDrawCollapseExpand (dlg->row_list[bulk_row_num].expanded, &rct);
35177
rct.left = rct.right + 1;
35179
rct.right = rct.left + dlg->col_list[format_col].pixWidth - 1;
35181
if (dlg->field_list[data_col].draw_col_func != NULL) {
35182
(dlg->field_list[data_col].draw_col_func)(vnp->data.ptrvalue, &rct);
35184
rct.left = rct.right + 1;
35189
static void CleanupBulkEditorDialog (GraphiC g, VoidPtr data)
35191
BulkEditorDlgPtr dlg;
35193
dlg = (BulkEditorDlgPtr) data;
35195
dlg->row_list = FreeBulkEditorRows(dlg->row_list, dlg->field_list);
35197
StdCleanupExtraProc (g, data);
35200
static void ApplyBulkEditorRowToObject (BulkEditorRowPtr berp, Pointer target, BulkEdFieldPtr field_list)
35202
ValNodePtr vnp_val;
35205
if (berp == NULL || target == NULL || field_list == NULL) return;
35207
for (i = 0, vnp_val = berp->values_list;
35209
i++, vnp_val = vnp_val->next) {
35210
if (field_list[i].set_func != NULL) {
35211
(field_list[i].set_func) (target, vnp_val->data.ptrvalue);
35216
static void ApplyBulkEditorToObjectList (DialoG d)
35218
BulkEditorDlgPtr dlg;
35221
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35222
if (dlg == NULL) return;
35224
BulkEdDlgToField (dlg->last_viewed_row, dlg->last_viewed_col, dlg);
35226
for (row = 0; dlg->row_list[row].object_list != NULL; row++) {
35227
if (dlg->row_list[row].subrows == NULL) {
35228
ApplyBulkEditorRowToObject (dlg->row_list + row,
35229
dlg->row_list[row].object_list->data.ptrvalue,
35232
for (i = 0; dlg->row_list[row].subrows[i].object_list != NULL; i++) {
35233
ApplyBulkEditorRowToObject (dlg->row_list[row].subrows + i,
35234
dlg->row_list[row].subrows[i].object_list->data.ptrvalue,
35241
static void ChangeBulkEditorAction (PopuP p)
35243
BulkEditorDlgPtr dlg;
35247
dlg = (BulkEditorDlgPtr) GetObjectExtra (p);
35248
if (dlg == NULL || !dlg->any_editing) return;
35250
num_pages = sizeof (dlg->action_pages) / sizeof (GrouP);
35251
for (page_num = 0; page_num < num_pages; page_num++) {
35252
Hide (dlg->action_pages[page_num]);
35254
page_num = GetValue (dlg->bulk_action) - 1;
35255
if (page_num > -1 && page_num < num_pages) {
35256
Show (dlg->action_pages[page_num]);
35260
static void RemoveColumnFromSelectedBulkEditRows (BulkEditorRowPtr row_list, Int4 col, BulkEdFieldPtr field_list)
35264
if (row_list == NULL || col < 0 || field_list == NULL) return;
35265
while (row_list->object_list != NULL) {
35266
if (row_list->selected) {
35267
if (row_list->subrows == NULL || AllBulkEditorRowsSelected(row_list->subrows)) {
35268
vnp = GetBulkEditorRowValueByColumn (row_list, col);
35270
field_list[col].free_func(vnp->data.ptrvalue);
35271
vnp->data.ptrvalue = NULL;
35275
RemoveColumnFromSelectedBulkEditRows (row_list->subrows, col, field_list);
35281
ApplyEditColumnFromSelectedBulkEditRows
35282
(BulkEditorRowPtr berp,
35283
BulkEdFieldPtr field_list,
35289
if (berp == NULL) return;
35291
while (berp->object_list != NULL) {
35292
if (berp->selected) {
35293
if (berp->subrows == NULL || AllBulkEditorRowsSelected(berp->subrows)) {
35294
vnp = GetBulkEditorRowValueByColumn (berp, col);
35296
vnp->data.ptrvalue = (field_list[col].set_str_func) (vnp->data.ptrvalue, avp);
35300
ApplyEditColumnFromSelectedBulkEditRows (berp->subrows, field_list, col, avp);
35307
CapitalizeColumnsForSelectedBulkEditRows
35308
(BulkEditorRowPtr berp,
35309
BulkEdFieldPtr field_list,
35311
ChangeCasePtr capitalization)
35315
ApplyValueData avd;
35317
SeqEntryPtr sep, last_sep = NULL;
35318
ValNodePtr orgname_list = NULL;
35320
if (berp == NULL) return;
35322
avd.field_list = NULL;
35323
avd.text_to_replace = NULL;
35324
avd.where_to_replace = EditApplyFindLocation_anywhere;
35327
while (berp->object_list != NULL) {
35328
if (berp->selected) {
35329
if (berp->subrows == NULL || AllBulkEditorRowsSelected(berp->subrows)) {
35330
vnp = GetBulkEditorRowValueByColumn (berp, col);
35332
val_str = (field_list[col].display_func)(vnp->data.ptrvalue);
35333
if (!StringHasNoText (val_str)) {
35334
if (berp->object_list->choice == OBJ_SEQFEAT && berp->object_list->data.ptrvalue != NULL) {
35335
sfp = (SeqFeatPtr) berp->object_list->data.ptrvalue;
35336
sep = GetTopSeqEntryForEntityID (sfp->idx.entityID);
35337
if (sep != last_sep) {
35338
orgname_list = ValNodeFree (orgname_list);
35339
/* get org names to use in fixes */
35340
VisitBioSourcesInSep (sep, &orgname_list, GetOrgNamesInRecordCallback);
35344
ChangeCase (&val_str, capitalization, orgname_list);
35345
avd.new_text = val_str;
35346
vnp->data.ptrvalue = (field_list[col].set_str_func) (vnp->data.ptrvalue, &avd);
35348
val_str = MemFree (val_str);
35352
CapitalizeColumnsForSelectedBulkEditRows (berp->subrows, field_list, col, capitalization);
35355
orgname_list = ValNodeFree (orgname_list);
35358
static void RemoveNameFromText (CharPtr orig, CharPtr remove)
35360
CharPtr cp, cp_dst;
35363
if (StringHasNoText (orig) || StringHasNoText (remove)) {
35366
cp = StringISearch (orig, remove);
35368
len = StringLen (remove);
35371
while (*cp != 0 && len > 0) {
35381
static void ConvertColumnsForSelectedBulkEditRows
35382
(BulkEditorRowPtr berp,
35383
BulkEdFieldPtr field_list,
35384
TwoFieldBulkEditPtr tfp,
35385
ExistingTextPtr etp)
35387
ValNodePtr vnp_from, vnp_to;
35389
ApplyValueData avd;
35390
if (berp == NULL || tfp == NULL) return;
35392
avd.field_list = NULL;
35393
avd.text_to_replace = NULL;
35394
avd.where_to_replace = EditApplyFindLocation_anywhere;
35397
while (berp->object_list != NULL) {
35398
if (berp->selected && berp->subrows == NULL) {
35399
vnp_from = GetBulkEditorRowValueByColumn (berp, tfp->field_from);
35400
vnp_to = GetBulkEditorRowValueByColumn (berp, tfp->field_to);
35401
if (vnp_from != NULL && vnp_to != NULL) {
35402
val_from = (field_list[tfp->field_from].display_func)(vnp_from->data.ptrvalue);
35403
if (StringDoesHaveText (val_from)) {
35404
if (tfp->strip_name) {
35405
RemoveNameFromText (val_from, field_list[tfp->field_to].name);
35408
avd.new_text = val_from;
35409
vnp_to->data.ptrvalue = (field_list[tfp->field_to].set_str_func) (vnp_to->data.ptrvalue, &avd);
35411
if (!tfp->leave_on_original) {
35412
(field_list[tfp->field_from].free_func)(vnp_from->data.ptrvalue);
35413
vnp_from->data.ptrvalue = NULL;
35417
val_from = MemFree (val_from);
35420
ConvertColumnsForSelectedBulkEditRows (berp->subrows, field_list, tfp, etp);
35426
static void ParseColumnsForSelectedBulkEditRows
35427
(BulkEditorRowPtr berp,
35428
BulkEdFieldPtr field_list,
35429
TwoFieldBulkEditPtr tfp,
35430
ExistingTextPtr etp)
35432
ValNodePtr vnp_from, vnp_to;
35433
CharPtr val_from, val_to;
35434
ApplyValueData avd;
35435
if (berp == NULL || tfp == NULL) return;
35437
avd.field_list = NULL;
35438
avd.text_to_replace = NULL;
35439
avd.where_to_replace = EditApplyFindLocation_anywhere;
35442
while (berp->object_list != NULL) {
35443
if (berp->selected && berp->subrows == NULL) {
35444
vnp_from = GetBulkEditorRowValueByColumn (berp, tfp->field_from);
35445
vnp_to = GetBulkEditorRowValueByColumn (berp, tfp->field_to);
35446
if (vnp_from != NULL && vnp_to != NULL) {
35447
val_from = (field_list[tfp->field_from].display_func)(vnp_from->data.ptrvalue);
35449
if (StringDoesHaveText (val_from)) {
35450
val_to = ReplaceStringForParse(val_from, tfp->text_portion);
35451
if (StringDoesHaveText (val_to)) {
35452
avd.new_text = val_to;
35453
vnp_to->data.ptrvalue = (field_list[tfp->field_to].set_str_func) (vnp_to->data.ptrvalue, &avd);
35455
if (tfp->remove_parsed) {
35456
avd.new_text = val_from;
35458
vnp_from->data.ptrvalue = (field_list[tfp->field_from].set_str_func) (vnp_from->data.ptrvalue, &avd);
35462
val_from = MemFree (val_from);
35463
val_to = MemFree (val_to);
35466
ParseColumnsForSelectedBulkEditRows (berp->subrows, field_list, tfp, etp);
35472
static void SwapColumnsForSelectedBulkEditRows
35473
(BulkEditorRowPtr berp,
35474
BulkEdFieldPtr field_list,
35478
ValNodePtr vnp_from, vnp_to;
35479
CharPtr val_from, val_to;
35480
ApplyValueData avd;
35481
if (berp == NULL) return;
35484
avd.field_list = NULL;
35485
avd.text_to_replace = NULL;
35486
avd.where_to_replace = EditApplyFindLocation_anywhere;
35488
while (berp->object_list != NULL) {
35489
if (berp->selected && berp->subrows == NULL) {
35490
vnp_from = GetBulkEditorRowValueByColumn (berp, col_from);
35491
vnp_to = GetBulkEditorRowValueByColumn (berp, col_to);
35492
if (vnp_from != NULL && vnp_to != NULL) {
35493
val_from = (field_list[col_from].display_func)(vnp_from->data.ptrvalue);
35494
val_to = (field_list[col_to].display_func)(vnp_to->data.ptrvalue);
35495
if (StringDoesHaveText (val_from) || StringDoesHaveText (val_to)) {
35496
avd.new_text = val_to;
35497
vnp_from->data.ptrvalue = (field_list[col_from].set_str_func) (vnp_from->data.ptrvalue, &avd);
35499
avd.new_text = val_from;
35500
vnp_to->data.ptrvalue = (field_list[col_to].set_str_func) (vnp_to->data.ptrvalue, &avd);
35502
val_from = MemFree (val_from);
35503
val_to = MemFree (val_to);
35506
SwapColumnsForSelectedBulkEditRows (berp->subrows, field_list, col_from, col_to);
35514
AddSampleDataForBulkEditorSelectedFeatures
35515
(BulkEditorRowPtr berp,
35516
BulkEdFieldPtr field_list,
35520
TextPortionXPtr text_portion)
35522
CharPtr str, str_src, str_parse;
35523
ValNodePtr vnp, vnp_src;
35526
if (berp == NULL || field_list == NULL || col < 0 || field_list[col].display_func == NULL || gsp == NULL) return;
35528
while (berp->object_list != NULL) {
35529
if (berp->subrows == NULL && berp->selected) {
35530
vnp = GetBulkEditorRowValueByColumn (berp, col);
35532
str = (field_list[col]).display_func (vnp->data.ptrvalue);
35533
if (!StringHasNoText (str)) {
35535
/* only add values if col_src < 0 or data in col_src is not blank */
35536
if (col_src >= 0) {
35538
vnp_src = GetBulkEditorRowValueByColumn (berp, col_src);
35539
if (vnp_src != NULL) {
35540
str_src = (field_list[col_src]).display_func(vnp_src->data.ptrvalue);
35541
if (StringDoesHaveText (str_src)) {
35542
if (text_portion == NULL) {
35545
str_parse = ReplaceStringForParse(str_src, text_portion);
35546
if (StringDoesHaveText (str_parse)) {
35549
str_parse = MemFree (str_parse);
35552
str_src = MemFree (str_src);
35557
if (gsp->sample_text == NULL) {
35558
gsp->sample_text = str;
35560
} else if (StringCmp (str, gsp->sample_text) != 0) {
35561
gsp->all_same = FALSE;
35565
str = MemFree (str);
35568
AddSampleDataForBulkEditorSelectedFeatures (berp->subrows, field_list, col, col_src, gsp, text_portion);
35574
static GetSamplePtr
35575
GetSampleDataForBulkEditorSelectedFeatures
35576
(BulkEditorRowPtr berp,
35577
BulkEdFieldPtr field_list,
35580
TextPortionXPtr text_portion)
35584
if (berp == NULL || field_list == NULL || col < 0) return NULL;
35586
gsp = GetSampleNew ();
35588
AddSampleDataForBulkEditorSelectedFeatures(berp, field_list, col, col_src, gsp, text_portion);
35594
static void ApplyBulkEdit (ButtoN b)
35596
BulkEditorDlgPtr dlg;
35598
GetSamplePtr gsp = NULL;
35599
ExistingTextPtr etp = NULL;
35600
ApplyValueData avd;
35601
OneFieldBulkEditPtr ofp = NULL;
35602
TwoFieldBulkEditPtr tfp = NULL;
35604
dlg = (BulkEditorDlgPtr) GetObjectExtra (b);
35605
if (dlg == NULL) return;
35607
switch (GetValue (dlg->bulk_action)) {
35608
case eBulkRemoveField:
35609
ofp = (OneFieldBulkEditPtr) DialogToPointer (dlg->bulk_remove);
35611
RemoveColumnFromSelectedBulkEditRows (dlg->row_list, ofp->field, dlg->field_list);
35614
case eBulkApplyField:
35615
ofp = (OneFieldBulkEditPtr) DialogToPointer (dlg->bulk_apply);
35617
gsp = GetSampleDataForBulkEditorSelectedFeatures (dlg->row_list, dlg->field_list, ofp->field, -1, NULL);
35618
etp = GetExistingTextHandlerInfo (gsp == NULL ? 0 : gsp->num_found, FALSE);
35619
if (etp == NULL || etp->existing_text_choice != eExistingTextChoiceCancel) {
35621
avd.field_list = NULL;
35622
AddEditApplyDataToApplyValue (AECR_APPLY, ofp->edit_apply, &avd);
35623
ApplyEditColumnFromSelectedBulkEditRows (dlg->row_list, dlg->field_list, ofp->field, &avd);
35627
case eBulkEditField:
35628
ofp = (OneFieldBulkEditPtr) DialogToPointer (dlg->bulk_edit);
35631
avd.field_list = NULL;
35632
AddEditApplyDataToApplyValue (AECR_EDIT, ofp->edit_apply, &avd);
35633
ApplyEditColumnFromSelectedBulkEditRows (dlg->row_list, dlg->field_list, ofp->field, &avd);
35636
case eBulkConvertField:
35637
tfp = (TwoFieldBulkEditPtr) DialogToPointer (dlg->bulk_convert);
35639
gsp = GetSampleDataForBulkEditorSelectedFeatures (dlg->row_list, dlg->field_list, tfp->field_to, tfp->field_from, NULL);
35640
etp = GetExistingTextHandlerInfo (gsp == NULL ? 0 : gsp->num_found, FALSE);
35641
if (etp == NULL || etp->existing_text_choice != eExistingTextChoiceCancel) {
35642
ConvertColumnsForSelectedBulkEditRows (dlg->row_list, dlg->field_list, tfp, etp);
35646
case eBulkParseField:
35647
tfp = (TwoFieldBulkEditPtr) DialogToPointer (dlg->bulk_parse);
35649
gsp = GetSampleDataForBulkEditorSelectedFeatures (dlg->row_list, dlg->field_list, tfp->field_to, tfp->field_from, tfp->text_portion);
35650
etp = GetExistingTextHandlerInfo (gsp == NULL ? 0 : gsp->num_found, FALSE);
35651
if (etp == NULL || etp->existing_text_choice != eExistingTextChoiceCancel) {
35652
ParseColumnsForSelectedBulkEditRows (dlg->row_list, dlg->field_list, tfp, etp);
35656
case eBulkSwapField:
35657
tfp = (TwoFieldBulkEditPtr) DialogToPointer (dlg->bulk_swap);
35659
SwapColumnsForSelectedBulkEditRows (dlg->row_list, dlg->field_list, tfp->field_from, tfp->field_to);
35662
case eBulkCapitalizeField:
35663
ofp = (OneFieldBulkEditPtr) DialogToPointer (dlg->bulk_capitalize);
35664
if (ofp != NULL && ofp->capitalization != NULL && ofp->capitalization->change != eChangeCaseNone) {
35665
CapitalizeColumnsForSelectedBulkEditRows (dlg->row_list, dlg->field_list, ofp->field, ofp->capitalization);
35670
ofp = OneFieldBulkEditFree (ofp);
35671
tfp = TwoFieldBulkEditFree (tfp);
35672
gsp = GetSampleFree (gsp);
35673
etp = MemFree (etp);
35675
UpdateBulkEdDisplay (dlg);
35676
ObjectRect (dlg->doc, &r);
35682
static void BulkEditorCheckAll (ButtoN b)
35684
BulkEditorDlgPtr dlg;
35687
dlg = (BulkEditorDlgPtr) GetObjectExtra (b);
35688
if (dlg == NULL) return;
35690
SelectBulkEditorRows (dlg->row_list, TRUE);
35691
UpdateCheckStatus (dlg);
35692
ObjectRect (dlg->doc, &r);
35698
static void BulkEditorUncheckAll (ButtoN b)
35700
BulkEditorDlgPtr dlg;
35703
dlg = (BulkEditorDlgPtr) GetObjectExtra (b);
35704
if (dlg == NULL) return;
35706
SelectBulkEditorRows (dlg->row_list, FALSE);
35707
UpdateCheckStatus (dlg);
35708
ObjectRect (dlg->doc, &r);
35713
static void BulkEditorStringConstraintCheck (ButtoN b)
35715
BulkEditorDlgPtr dlg;
35718
StringConstraintXPtr scp;
35721
dlg = (BulkEditorDlgPtr) GetObjectExtra (b);
35722
if (dlg == NULL) return;
35724
field_num = GetFieldNumFromPopupValue(GetValue (dlg->check_constraint_field), dlg->field_list, FALSE);
35725
scp = DialogToPointer (dlg->check_constraint);
35727
if (GetValue (dlg->sel_unsel_grp) == 1) {
35733
SelectBulkEditorRowsByStringConstraint (dlg->row_list, dlg->field_list, field_num, scp, val);
35735
scp = StringConstraintXFree (scp);
35736
UpdateCheckStatus (dlg);
35738
ObjectRect (dlg->doc, &r);
35744
static void ObjectListToBulkEditorDialog (DialoG d, Pointer data)
35746
BulkEditorDlgPtr dlg;
35747
ValNodePtr object_list;
35749
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35750
if (dlg == NULL) return;
35751
object_list = (ValNodePtr) data;
35753
dlg->row_list = FreeBulkEditorRows(dlg->row_list, dlg->field_list);
35754
dlg->row_list = MakeBulkEditorRowsFromObjectList (object_list, dlg->field_list, dlg->last_sorted_col, dlg->metadata);
35755
if (dlg->collapse_by_default) {
35756
CollapseAllBulkEditRows (dlg->row_list);
35758
ExpandAllBulkEditRows (dlg->row_list);
35761
UpdateBulkEdDisplay (dlg);
35762
UpdateCheckStatus (dlg);
35766
static Pointer GetSelectedObjectsFromBulkEditorDialog (DialoG d)
35768
BulkEditorDlgPtr dlg;
35769
ValNodePtr object_list = NULL;
35771
dlg = (BulkEditorDlgPtr) GetObjectExtra (d);
35772
if (dlg == NULL) return NULL;
35774
GetBulkEditorSelectedObjects (dlg->row_list, &object_list);
35775
return (Pointer) object_list;
35780
CreateBulkEditorDialogEx
35782
BulkEdFieldPtr field_list,
35783
ValNodePtr feat_list,
35785
Boolean collapse_by_default,
35786
ClickableCallback single_click_func,
35787
ClickableCallback double_click_func,
35791
BulkEditorDlgPtr dlg;
35792
Int4 width, num_columns = 0;
35794
GrouP ed_grp, check_grp, action_grp, page_grp, box_grp;
35798
p = HiddenGroup (h, -1, 0, NULL);
35799
dlg = (BulkEditorDlgPtr) MemNew (sizeof (BulkEditorDlgData));
35801
SetObjectExtra (p, dlg, CleanupBulkEditorDialog); /* need to cleanup values_list */
35802
dlg->dialog = (DialoG) p;
35803
dlg->todialog = ObjectListToBulkEditorDialog;
35804
dlg->fromdialog = GetSelectedObjectsFromBulkEditorDialog;
35805
dlg->testdialog = NULL;
35807
dlg->collapse_by_default = collapse_by_default;
35808
dlg->single_click_func = single_click_func;
35809
dlg->double_click_func = double_click_func;
35810
dlg->field_list = field_list;
35811
dlg->metadata = metadata;
35813
dlg->last_viewed_row = 0;
35814
dlg->last_viewed_col = 0;
35815
dlg->last_sorted_col = 0;
35816
dlg->row_list = MakeBulkEditorRowsFromObjectList(feat_list, dlg->field_list, dlg->last_sorted_col, dlg->metadata);
35817
if (dlg->collapse_by_default) {
35818
CollapseAllBulkEditRows (dlg->row_list);
35820
ExpandAllBulkEditRows (dlg->row_list);
35823
/* count columns, look for editing functions */
35824
dlg->any_editing = FALSE;
35825
for (i = 0; field_list[i].name != NULL; i++) {
35826
if (field_list[i].create_dlg_func != NULL) {
35827
dlg->any_editing = TRUE;
35831
dlg->num_columns = num_columns;
35832
/* populate values list */
35834
SelectFont (systemFont);
35835
dlg->col_list = AllocateDocColumnsForFieldList (field_list, &width, dlg->last_sorted_col);
35836
dlg->par_fmt.minLines = 1;
35837
dlg->par_fmt.minHeight = 1;
35839
dlg->title_doc = DocumentPanel (p, width, stdLineHeight);
35840
InitBulkEdTitleDoc (dlg, dlg->title_doc);
35841
SetObjectExtra (dlg->title_doc, dlg, NULL);
35842
SetDocProcs (dlg->title_doc, ClickBulkTitle, NULL, NULL, NULL);
35844
dlg->doc = DocumentPanel (p, width, 10 * stdLineHeight);
35845
SetObjectExtra (dlg->doc, dlg, NULL);
35846
SetDocProcs (dlg->doc, ClickBulkEdField, NULL, NULL, NULL);
35847
SetDocShade (dlg->doc, DrawBulkEdCell, NULL, HighlightBulkEdField, NULL);
35849
ed_grp = HiddenGroup (p, 0, 0, NULL);
35850
dlg->editor_list = (DialoG PNTR) MemNew (sizeof(DialoG) * dlg->num_columns);
35851
for (i = 0; field_list[i].name != NULL; i++) {
35852
if (dlg->field_list[i].create_dlg_func == NULL) {
35853
dlg->editor_list[i] = NULL;
35855
dlg->editor_list[i] = (dlg->field_list[i].create_dlg_func) (ed_grp, field_list[i].name, sep);
35856
Hide (dlg->editor_list[i]);
35860
box_grp = HiddenGroup (p, 0, 2, NULL);
35862
/* group that contains controls for checking and unchecking features */
35863
check_grp = NormalGroup (box_grp, -1, 0, "Check Features", programFont, NULL);
35864
SetGroupSpacing (check_grp, 10, 10);
35865
g1 = HiddenGroup (check_grp, 3, 0, NULL);
35866
SetGroupSpacing (g1, 10, 10);
35867
b = PushButton (g1, "Check All Features", BulkEditorCheckAll);
35868
SetObjectExtra (b, dlg, NULL);
35869
b = PushButton (g1, "Uncheck All Features", BulkEditorUncheckAll);
35870
SetObjectExtra (b, dlg, NULL);
35871
dlg->check_status = StaticPrompt (g1, "0 features are checked", 20 * stdCharWidth, dialogTextHeight, programFont, 'l');
35873
g2 = HiddenGroup (check_grp, 4, 0, NULL);
35874
dlg->sel_unsel_grp = HiddenGroup (g2, 0, 2, NULL);
35875
RadioButton (dlg->sel_unsel_grp, "Check features where");
35876
RadioButton (dlg->sel_unsel_grp, "Uncheck features where");
35877
SetValue (dlg->sel_unsel_grp, 1);
35878
dlg->check_constraint_field = MakeBulkEditorFieldListPopup (g2, dlg->field_list, FALSE);
35879
dlg->check_constraint = StringConstraintDialogX (g2, NULL, FALSE);
35880
b = PushButton (g2, "Apply", BulkEditorStringConstraintCheck);
35881
SetObjectExtra (b, dlg, NULL);
35883
if (dlg->any_editing) {
35884
/* group that contains controls for applying actions to check features */
35885
action_grp = NormalGroup (box_grp, -1, 0, "Action for Checked Features", programFont, NULL);
35886
a = HiddenGroup (action_grp, 2, 0, NULL);
35887
SetGroupSpacing (a, 10, 10);
35888
dlg->bulk_action = PopupList (a, TRUE, ChangeBulkEditorAction);
35889
SetObjectExtra (dlg->bulk_action, dlg, NULL);
35890
PopupItem (dlg->bulk_action, "Apply");
35891
PopupItem (dlg->bulk_action, "Edit");
35892
PopupItem (dlg->bulk_action, "Convert");
35893
PopupItem (dlg->bulk_action, "Parse");
35894
PopupItem (dlg->bulk_action, "Swap");
35895
PopupItem (dlg->bulk_action, "Remove");
35896
PopupItem (dlg->bulk_action, "Change Case");
35897
SetValue (dlg->bulk_action, 2);
35898
page_grp = HiddenGroup (a, 0, 0, NULL);
35900
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35901
dlg->bulk_apply = OneFieldBulkEditDialog (dlg->action_pages[page_num], eBulkApplyField, NULL, NULL, dlg->field_list);
35904
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35905
dlg->bulk_edit = OneFieldBulkEditDialog (dlg->action_pages[page_num], eBulkEditField, NULL, NULL, dlg->field_list);
35908
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35909
dlg->bulk_convert = TwoFieldBulkEditDialog (dlg->action_pages[page_num], eBulkConvertField, NULL, NULL, dlg->field_list, FALSE);
35912
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35913
dlg->bulk_parse = TwoFieldBulkEditDialog (dlg->action_pages[page_num], eBulkParseField, NULL, NULL, dlg->field_list, FALSE);
35916
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35917
dlg->bulk_swap = TwoFieldBulkEditDialog (dlg->action_pages[page_num], eBulkSwapField, NULL, NULL, dlg->field_list, FALSE);
35920
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35921
dlg->bulk_remove = OneFieldBulkEditDialog (dlg->action_pages[page_num], eBulkRemoveField, NULL, NULL, dlg->field_list);
35924
dlg->action_pages[page_num] = HiddenGroup (page_grp, 2, 0, NULL);
35925
dlg->bulk_capitalize = OneFieldBulkEditDialog (dlg->action_pages[page_num], eBulkCapitalizeField, NULL, NULL, dlg->field_list);
35927
AlignObjects (ALIGN_CENTER, (HANDLE) dlg->action_pages[0],
35928
(HANDLE) dlg->action_pages[1],
35929
(HANDLE) dlg->action_pages[2],
35930
(HANDLE) dlg->action_pages[3],
35931
(HANDLE) dlg->action_pages[4],
35932
(HANDLE) dlg->action_pages[5],
35933
(HANDLE) dlg->action_pages[6],
35936
b = PushButton (action_grp, "Apply to Checked Features", ApplyBulkEdit);
35937
SetObjectExtra (b, dlg, NULL);
35938
AlignObjects (ALIGN_CENTER, (HANDLE) a, (HANDLE) b, NULL);
35942
AlignObjects (ALIGN_CENTER, (HANDLE) dlg->title_doc, (HANDLE) dlg->doc, (HANDLE) ed_grp, (HANDLE) box_grp, NULL);
35944
UpdateBulkEdDisplay (dlg);
35945
UpdateCheckStatus (dlg);
35946
ChangeBulkEditorAction (dlg->bulk_action);
35953
CreateBulkEditorDialog
35955
BulkEdFieldPtr field_list,
35956
ValNodePtr feat_list,
35958
Boolean collapse_by_default,
35959
ClickableCallback single_click_func,
35960
ClickableCallback double_click_func)
35962
return CreateBulkEditorDialogEx (h, field_list, feat_list, sep, collapse_by_default,
35963
single_click_func, double_click_func, NULL);
35967
static Pointer BulkGetLocation (Uint1 data_choice, Pointer data, Pointer metadata)
35970
SeqFeatPtr sfp = (SeqFeatPtr) data;
35972
if (sfp == NULL) return NULL;
35973
slp = (SeqLocPtr) AsnIoMemCopy (sfp->location, (AsnReadFunc) SeqLocAsnRead, (AsnWriteFunc) SeqLocAsnWrite);
35977
static void BulkSetLocation (Pointer target, Pointer data)
35979
SeqFeatPtr sfp = (SeqFeatPtr) target;
35980
SeqLocPtr slp = (SeqLocPtr) data;
35981
if (sfp == NULL) return;
35982
sfp->location = SeqLocFree (sfp->location);
35983
sfp->location = (SeqLocPtr) AsnIoMemCopy (slp, (AsnReadFunc) SeqLocAsnRead, (AsnWriteFunc) SeqLocAsnWrite);
35986
static Int4 BulkFormatLocation (ColPtr col, CharPtr name)
35988
if (col == NULL) return 0;
35990
col->pixWidth = MAX (15, StringLen (name)) * stdCharWidth;
35992
col->charWidth = 0;
35993
col->charInset = 0;
35998
col->underline = 0;
36000
return col->pixWidth;
36003
static void BulkFreeLocation (Pointer data)
36005
SeqLocPtr slp = (SeqLocPtr) data;
36007
slp = SeqLocFree (slp);
36010
static CharPtr BulkDisplayLocation (Pointer data)
36012
SeqLocPtr slp = (SeqLocPtr) data;
36014
return SeqLocPrint (slp);
36017
static DialoG BulkNucLocationDialog (GrouP g, CharPtr name, SeqEntryPtr sep)
36019
return CreateIntervalEditorDialog (g, NULL, 4, 2, sep, TRUE, FALSE);
36022
static Pointer BulkCopyLocation (Pointer data)
36024
SeqLocPtr orig = (SeqLocPtr) data;
36027
if (orig == NULL) return NULL;
36028
new_loc = (SeqLocPtr) AsnIoMemCopy ((Pointer) orig,
36029
(AsnReadFunc) SeqLocAsnRead,
36030
(AsnWriteFunc) SeqLocAsnWrite);
36035
NLM_EXTERN Int4 BulkFormatSimpleText (ColPtr col, CharPtr name)
36037
if (col == NULL) return 0;
36039
col->pixWidth = (MAX (15, StringLen (name)) + 3) * MaxCharWidth();
36041
col->charWidth = 0;
36042
col->charInset = 0;
36047
col->underline = 0;
36049
return col->pixWidth;
36052
NLM_EXTERN void BulkFreeSimpleText (Pointer data)
36054
CharPtr str = (CharPtr) data;
36056
str = MemFree (str);
36059
NLM_EXTERN CharPtr BulkDisplaySimpleText (Pointer data)
36061
CharPtr str = (CharPtr) data;
36062
if (StringHasNoText (str)) {
36065
return StringSave ((CharPtr) data);
36069
typedef struct bulksimpletext {
36070
DIALOG_MESSAGE_BLOCK
36072
} BulkSimpleTextData, PNTR BulkSimpleTextPtr;
36074
static void StringToBulkSimpleTextDialog (DialoG d, Pointer data)
36076
BulkSimpleTextPtr dlg;
36079
dlg = (BulkSimpleTextPtr) GetObjectExtra (d);
36080
if (dlg == NULL) return;
36082
str = (CharPtr) data;
36084
SetTitle (dlg->txt, "");
36086
SetTitle (dlg->txt, str);
36090
static Pointer BulkSimpleTextDialogToString (DialoG d)
36092
BulkSimpleTextPtr dlg;
36094
dlg = (BulkSimpleTextPtr) GetObjectExtra (d);
36095
if (dlg == NULL) return NULL;
36097
return (Pointer) SaveStringFromText (dlg->txt);
36102
static DialoG BulkSimpleTextDialogEx (GrouP g, CharPtr name, SeqEntryPtr sep, Boolean use_scroll)
36104
BulkSimpleTextPtr dlg;
36107
p = HiddenGroup (g, 2, 0, NULL);
36108
SetGroupSpacing (p, 10, 10);
36109
dlg = (BulkSimpleTextPtr) MemNew (sizeof(BulkSimpleTextData));
36111
SetObjectExtra (p, dlg, StdCleanupExtraProc);
36112
dlg->dialog = (DialoG) p;
36113
dlg->todialog = StringToBulkSimpleTextDialog;
36114
dlg->fromdialog = BulkSimpleTextDialogToString;
36115
dlg->testdialog = NULL;
36117
StaticPrompt (p, name, 0, dialogTextHeight, programFont, 'l');
36119
dlg->txt = ScrollText (p, 30, 4, programFont, TRUE, NULL);
36121
dlg->txt = DialogText (p, "", 20, NULL);
36127
NLM_EXTERN DialoG BulkSimpleTextDialog (GrouP g, CharPtr name, SeqEntryPtr sep)
36129
return BulkSimpleTextDialogEx (g, name, sep, FALSE);
36132
static DialoG BulkSimpleTextScrollDialog (GrouP g, CharPtr name, SeqEntryPtr sep)
36134
return BulkSimpleTextDialogEx (g, name, sep, TRUE);
36137
NLM_EXTERN Pointer BulkSimpleTextCopy (Pointer data)
36139
CharPtr orig = (CharPtr) data;
36140
CharPtr new_str = StringSave (orig);
36144
static Int4 BulkFormatTrueFalse (ColPtr col, CharPtr name)
36146
size_t box_width = stdLineHeight - 3;
36147
if (col == NULL) return 0;
36149
col->pixWidth = MAX (box_width, (StringLen (name) + 2) * MaxCharWidth());
36151
col->charWidth = 0;
36152
col->charInset = 0;
36157
col->underline = 0;
36159
return col->pixWidth;
36162
static void BulkDrawTrueFalse (Pointer p, RectPtr r)
36166
if (r == NULL) return;
36169
rct.bottom = rct.top + stdLineHeight - 4;
36170
rct.right = rct.left + stdLineHeight - 4;
36171
InsetRect (&rct, 2, 2);
36175
MoveTo (rct.left, rct.top);
36176
LineTo (rct.right - 1, rct.bottom - 1);
36177
MoveTo (rct.left, rct.bottom - 1);
36178
LineTo (rct.right - 1, rct.top);
36182
static Pointer BulkReleaseTrueFalse (Pointer p)
36185
p = (Pointer) StringSave ("TRUE");
36193
static void BulkSetPseudo (Pointer target, Pointer val)
36195
SeqFeatPtr sfp = (SeqFeatPtr) target;
36196
if (sfp == NULL) return;
36197
if (StringHasNoText ((CharPtr)val)) {
36198
sfp->pseudo = FALSE;
36200
sfp->pseudo = TRUE;
36204
static Pointer BulkGetPseudo (Pointer data)
36206
SeqFeatPtr sfp = (SeqFeatPtr) data;
36207
if (sfp == NULL || ! sfp->pseudo) {
36210
return StringSave ("TRUE");
36214
static void BulkSetComment (Pointer target, Pointer data)
36216
CharPtr str = (CharPtr) data;
36217
SeqFeatPtr sfp = (SeqFeatPtr) target;
36218
if (sfp == NULL) return;
36220
sfp->comment = MemFree (sfp->comment);
36222
sfp->comment = StringSave (str);
36226
static Pointer BulkGetComment (Uint1 data_choice, Pointer data, Pointer metadata)
36228
SeqFeatPtr sfp = (SeqFeatPtr) data;
36229
if (sfp == NULL || StringHasNoText (sfp->comment)) {
36232
return (Pointer) StringSave (sfp->comment);
36236
static void BulkCDSSetProtein (Pointer target, Pointer data)
36238
SeqFeatXrefPtr xref;
36239
ProtRefPtr prp = NULL;
36240
BioseqPtr prot_bsp;
36241
SeqFeatPtr prot_feat;
36242
SeqMgrFeatContext fcontext;
36243
ValNodePtr prot_name_list = NULL, vnp;
36244
SeqFeatPtr sfp = (SeqFeatPtr) target;
36245
if (sfp == NULL) return;
36247
prot_name_list = (ValNodePtr) data;
36250
while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
36253
if (xref != NULL) {
36254
prp = xref->data.value.ptrvalue;
36258
if (sfp->data.choice == SEQFEAT_PROT) {
36259
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
36260
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
36261
prot_bsp = BioseqFindFromSeqLoc (sfp->product);
36262
prot_feat = SeqMgrGetNextFeature (prot_bsp, NULL, SEQFEAT_PROT, FEATDEF_PROT, &fcontext);
36263
if (prot_feat == NULL && prot_name_list != NULL) {
36264
prot_feat = CreateNewFeatureOnBioseq (prot_bsp, SEQFEAT_PROT, NULL);
36265
prp = ProtRefNew ();
36266
prot_feat->data.value.ptrvalue = prp;
36267
SeqMgrIndexFeatures (prot_bsp->idx.entityID, NULL);
36269
if (prot_feat != NULL) {
36270
prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
36275
if (prp == NULL && prot_name_list != NULL) {
36276
xref = SeqFeatXrefNew ();
36277
prp = ProtRefNew ();
36278
xref->data.choice = SEQFEAT_PROT;
36279
xref->data.value.ptrvalue = prp;
36280
xref->next = sfp->xref;
36284
prp->name = ValNodeFreeData (prp->name);
36285
for (vnp = prot_name_list; vnp != NULL; vnp = vnp->next) {
36286
ValNodeAddPointer (&prp->name, vnp->choice, StringSave (vnp->data.ptrvalue));
36292
static Pointer BulkCDSGetProtein (Uint1 data_choice, Pointer data, Pointer metadata)
36294
SeqFeatXrefPtr xref;
36295
ProtRefPtr prp = NULL;
36296
BioseqPtr prot_bsp;
36297
SeqFeatPtr prot_feat;
36298
SeqMgrFeatContext fcontext;
36299
ValNodePtr prot_name_list = NULL, vnp;
36300
SeqFeatPtr sfp = (SeqFeatPtr) data;
36302
if (sfp == NULL) return NULL;
36305
while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
36308
if (xref != NULL) {
36309
prp = xref->data.value.ptrvalue;
36313
if (sfp->data.choice == SEQFEAT_PROT) {
36314
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
36315
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
36316
prot_bsp = BioseqFindFromSeqLoc (sfp->product);
36317
prot_feat = SeqMgrGetNextFeature (prot_bsp, NULL, SEQFEAT_PROT, FEATDEF_PROT, &fcontext);
36318
if (prot_feat != NULL) {
36319
prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
36325
for (vnp = prp->name; vnp != NULL; vnp = vnp->next) {
36326
ValNodeAddPointer (&prot_name_list, vnp->choice, StringSave (vnp->data.ptrvalue));
36330
return prot_name_list;
36333
static Pointer BulkCDSCopyProtein (Pointer data)
36335
ValNodePtr new_prot_name_list = NULL, prot_name_list, vnp;
36337
prot_name_list = (ValNodePtr) data;
36339
for (vnp = prot_name_list; vnp != NULL; vnp = vnp->next) {
36340
ValNodeAddPointer (&new_prot_name_list, vnp->choice, StringSave (vnp->data.ptrvalue));
36342
return new_prot_name_list;
36345
static Int4 BulkCDSFormatProtein (ColPtr col, CharPtr name)
36347
if (col == NULL) return 0;
36349
col->pixWidth = MAX (15, StringLen (name)) * MaxCharWidth();
36351
col->charWidth = 0;
36352
col->charInset = 0;
36357
col->underline = 0;
36359
return col->pixWidth;
36362
static CharPtr BulkCDSDisplayProtein (Pointer data)
36364
ValNodePtr prot_name_list, vnp;
36368
if (data == NULL) return NULL;
36369
prot_name_list = (ValNodePtr) data;
36370
for (vnp = prot_name_list; vnp != NULL; vnp = vnp->next) {
36371
text_len += StringLen (vnp->data.ptrvalue) + 1;
36373
prot_text = (CharPtr) MemNew (sizeof (Char) * text_len);
36375
for (vnp = prot_name_list; vnp != NULL; vnp = vnp->next) {
36376
StringCat (prot_text, vnp->data.ptrvalue);
36377
if (vnp->next != NULL) {
36378
StringCat (prot_text, ";");
36385
static Pointer BulkCDSSetProteinString (Pointer curr_val, ApplyValuePtr avp)
36387
CharPtr curr_val_str;
36388
CharPtr new_str, name_str, cp;
36389
ValNodePtr name_list;
36391
name_list = (ValNodePtr) curr_val;
36392
curr_val_str = BulkCDSDisplayProtein (name_list);
36393
name_list = ValNodeFreeData (name_list);
36395
new_str = HandleApplyValue (curr_val_str, avp);
36397
name_str = new_str;
36398
cp = StringChr (name_str, ';');
36399
while (cp != NULL) {
36401
ValNodeAddPointer (&name_list, 0, StringSave (name_str));
36404
cp = StringChr (name_str, ';');
36406
ValNodeAddPointer (&name_list, 0, StringSave (name_str));
36407
new_str = MemFree (new_str);
36413
static void BulkCDSFreeProtein (Pointer data)
36415
ValNodePtr prot_name_list = (ValNodePtr) data;
36417
ValNodeFreeData (prot_name_list);
36420
static DialoG BulkCDSProteinDialog (GrouP g, CharPtr name, SeqEntryPtr sep)
36422
return CreateVisibleStringDialog (g, 3, -1, 25);
36425
static void BulkCDSSetProteinDesc (Pointer target, Pointer data)
36427
SeqFeatXrefPtr xref;
36428
ProtRefPtr prp = NULL;
36429
BioseqPtr prot_bsp;
36430
SeqFeatPtr prot_feat;
36431
SeqMgrFeatContext fcontext;
36433
SeqFeatPtr sfp = (SeqFeatPtr) target;
36434
if (sfp == NULL) return;
36436
prot_desc = (CharPtr) data;
36439
while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
36442
if (xref != NULL) {
36443
prp = xref->data.value.ptrvalue;
36447
if (sfp->data.choice == SEQFEAT_PROT) {
36448
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
36449
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
36450
prot_bsp = BioseqFindFromSeqLoc (sfp->product);
36451
prot_feat = SeqMgrGetNextFeature (prot_bsp, NULL, SEQFEAT_PROT, FEATDEF_PROT, &fcontext);
36452
if (prot_feat == NULL && !StringHasNoText (prot_desc)) {
36453
prot_feat = CreateNewFeatureOnBioseq (prot_bsp, SEQFEAT_PROT, NULL);
36454
prp = ProtRefNew ();
36455
prot_feat->data.value.ptrvalue = prp;
36456
SeqMgrIndexFeatures (prot_bsp->idx.entityID, NULL);
36458
if (prot_feat != NULL) {
36459
prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
36464
if (prp == NULL && !StringHasNoText (prot_desc)) {
36465
xref = SeqFeatXrefNew ();
36466
prp = ProtRefNew ();
36467
xref->data.choice = SEQFEAT_PROT;
36468
xref->data.value.ptrvalue = prp;
36469
xref->next = sfp->xref;
36473
prp->desc = StringSave (prot_desc);
36479
static Pointer BulkCDSGetProteinDesc (Uint1 data_choice, Pointer data, Pointer metadata)
36481
SeqFeatXrefPtr xref;
36482
ProtRefPtr prp = NULL;
36483
BioseqPtr prot_bsp;
36484
SeqFeatPtr prot_feat;
36485
SeqMgrFeatContext fcontext;
36486
CharPtr prot_desc = NULL;
36487
SeqFeatPtr sfp = (SeqFeatPtr) data;
36489
if (sfp == NULL) return NULL;
36492
while (xref != NULL && xref->data.choice != SEQFEAT_PROT) {
36495
if (xref != NULL) {
36496
prp = xref->data.value.ptrvalue;
36500
if (sfp->data.choice == SEQFEAT_PROT) {
36501
prp = (ProtRefPtr) sfp->data.value.ptrvalue;
36502
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
36503
prot_bsp = BioseqFindFromSeqLoc (sfp->product);
36504
prot_feat = SeqMgrGetNextFeature (prot_bsp, NULL, SEQFEAT_PROT, FEATDEF_PROT, &fcontext);
36505
if (prot_feat != NULL) {
36506
prp = (ProtRefPtr) prot_feat->data.value.ptrvalue;
36512
prot_desc = StringSave (prp->desc);
36519
static void BulkGeneSetLocus (Pointer target, Pointer data)
36521
CharPtr str = (CharPtr) data;
36523
SeqFeatPtr sfp = (SeqFeatPtr) target;
36525
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE) return;
36527
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36529
grp = GeneRefNew();
36530
sfp->data.value.ptrvalue = grp;
36532
grp->locus = MemFree (grp->locus);
36534
grp->locus = StringSave (str);
36538
static Pointer BulkGeneGetLocus (Uint1 data_choice, Pointer data, Pointer metadata)
36541
SeqFeatPtr sfp = (SeqFeatPtr) data;
36543
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE || sfp->data.value.ptrvalue == NULL) {
36546
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36547
if (StringHasNoText (grp->locus)) {
36550
return (Pointer) StringSave (grp->locus);
36554
static void BulkGeneSetLocusTag (Pointer target, Pointer data)
36556
CharPtr str = (CharPtr) data;
36558
SeqFeatPtr sfp = (SeqFeatPtr) target;
36560
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE) return;
36562
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36564
grp = GeneRefNew();
36565
sfp->data.value.ptrvalue = grp;
36567
grp->locus_tag = MemFree (grp->locus_tag);
36569
grp->locus_tag = StringSave (str);
36573
static Pointer BulkGeneGetLocusTag (Uint1 data_choice, Pointer data, Pointer metadata)
36576
SeqFeatPtr sfp = (SeqFeatPtr) data;
36578
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE || sfp->data.value.ptrvalue == NULL) {
36581
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36582
if (StringHasNoText (grp->locus_tag)) {
36585
return (Pointer) StringSave (grp->locus_tag);
36589
static void BulkGeneSetDescription (Pointer target, Pointer data)
36591
CharPtr str = (CharPtr) data;
36593
SeqFeatPtr sfp = (SeqFeatPtr) target;
36595
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE) return;
36597
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36599
grp = GeneRefNew();
36600
sfp->data.value.ptrvalue = grp;
36602
grp->desc = MemFree (grp->desc);
36604
grp->desc = StringSave (str);
36608
static Pointer BulkGeneGetDescription (Uint1 data_choice, Pointer data, Pointer metadata)
36611
SeqFeatPtr sfp = (SeqFeatPtr) data;
36613
if (sfp == NULL || sfp->idx.subtype != FEATDEF_GENE || sfp->data.value.ptrvalue == NULL) {
36616
grp = (GeneRefPtr) sfp->data.value.ptrvalue;
36617
if (StringHasNoText (grp->desc)) {
36620
return (Pointer) StringSave (grp->desc);
36625
static void BulkRNASetProduct (Pointer target, Pointer data)
36628
CharPtr rna_product;
36629
SeqFeatPtr sfp = (SeqFeatPtr) target;
36631
if (sfp == NULL || sfp->data.choice != SEQFEAT_RNA) return;
36633
rna_product = (CharPtr) data;
36635
rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
36636
if (rrp == NULL && !StringHasNoText (rna_product)) {
36637
rrp = RnaRefNew ();
36638
rrp->ext.choice = 1;
36639
sfp->data.value.ptrvalue = rrp;
36641
if (rrp->ext.choice == 0 && !StringHasNoText (rna_product)) {
36642
rrp->ext.choice = 1;
36643
} else if (rrp->ext.choice == 1 && StringHasNoText (rna_product)) {
36644
rrp->ext.choice = 0;
36645
rrp->ext.value.ptrvalue = MemFree (rrp->ext.value.ptrvalue);
36648
if (rrp != NULL && rrp->ext.choice == 1) {
36649
rrp->ext.value.ptrvalue = MemFree (rrp->ext.value.ptrvalue);
36650
rrp->ext.value.ptrvalue = StringSave (rna_product);
36654
static Pointer BulkRNAGetProduct (Uint1 data_choice, Pointer data, Pointer metadata)
36657
CharPtr rna_product = NULL;
36658
SeqFeatPtr sfp = (SeqFeatPtr) data;
36660
if (sfp == NULL || sfp->data.choice != SEQFEAT_RNA) return NULL;
36662
rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
36664
if (rrp->ext.choice == 1) {
36665
rna_product = StringSave( rrp->ext.value.ptrvalue);
36670
return rna_product;
36673
static Boolean IsBulkEditableRNA (SeqFeatPtr sfp)
36677
if (sfp == NULL || sfp->data.choice != SEQFEAT_RNA) {
36680
rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
36681
if (rrp != NULL && rrp->ext.choice != 1 && rrp->ext.choice != 0) {
36689
/* template for setting simple text strings */
36690
NLM_EXTERN Pointer BulkSetSimpleTextString (Pointer curr_val, ApplyValuePtr avp)
36692
CharPtr curr_val_str;
36694
curr_val_str = (CharPtr)curr_val;
36695
return HandleApplyValue (curr_val_str, avp);
36698
/* for now, disallow pseudo editing and display. To add back, put in this line:
36699
{ "pseudo", BulkSetPseudo, BulkGetPseudo, NULL, NULL, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, BulkReleaseTrueFalse },
36701
/* for now, disallow location editing (but continue display). To add back, use BulkNucLocationDialog in dialog. */
36702
static BulkEdFieldData bulk_cds_fields[] = {
36703
{ "protein name", BulkCDSSetProtein, BulkCDSSetProteinString, BulkCDSGetProtein, BulkCDSDisplayProtein, BulkCDSFreeProtein, BulkCDSProteinDialog, BulkCDSFormatProtein, NULL, NULL, BulkCDSCopyProtein },
36704
{ "protein description", BulkCDSSetProteinDesc, BulkSetSimpleTextString, BulkCDSGetProteinDesc, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36705
{ "location", BulkSetLocation, NULL, BulkGetLocation, BulkDisplayLocation, BulkFreeLocation, NULL, BulkFormatLocation, NULL, NULL, BulkCopyLocation },
36706
{ "comment", BulkSetComment, BulkSetSimpleTextString, BulkGetComment, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextScrollDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36707
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
36709
static BulkEdFieldData bulk_gene_fields[] = {
36710
{ "locus", BulkGeneSetLocus, BulkSetSimpleTextString, BulkGeneGetLocus, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36711
{ "locus_tag", BulkGeneSetLocusTag, BulkSetSimpleTextString, BulkGeneGetLocusTag, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36712
{ "description", BulkGeneSetDescription, BulkSetSimpleTextString, BulkGeneGetDescription, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36713
{ "location", BulkSetLocation, NULL, BulkGetLocation, BulkDisplayLocation, BulkFreeLocation, NULL, BulkFormatLocation, NULL, NULL, BulkCopyLocation },
36714
{ "comment", BulkSetComment, BulkSetSimpleTextString, BulkGetComment, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextScrollDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36715
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
36717
static BulkEdFieldData bulk_rna_fields[] = {
36718
{ "product", BulkRNASetProduct, BulkSetSimpleTextString, BulkRNAGetProduct, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36719
{ "location", BulkSetLocation, NULL, BulkGetLocation, BulkDisplayLocation, BulkFreeLocation, NULL, BulkFormatLocation, NULL, NULL, BulkCopyLocation },
36720
{ "comment", BulkSetComment, BulkSetSimpleTextString, BulkGetComment, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextScrollDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36721
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
36724
static BulkEdFieldPtr GetBulkEditorFieldListForFeature (SeqFeatPtr sfp)
36728
} else if (sfp->data.choice == SEQFEAT_CDREGION) {
36729
return bulk_cds_fields;
36730
} else if (sfp->data.choice == SEQFEAT_GENE) {
36731
return bulk_gene_fields;
36732
} else if (sfp->data.choice == SEQFEAT_RNA && IsBulkEditableRNA(sfp)) {
36733
/* Note - using FEATDEF_rRNA to represent all editable rRNA features */
36734
return bulk_rna_fields;
36741
static void BulkSrcSetTaxNameDesc (Pointer target, Pointer data)
36744
SeqDescrPtr sdp = (SeqDescrPtr) target;
36747
if (sdp == NULL || sdp->choice != Seq_descr_source || sdp->data.ptrvalue == NULL) return;
36749
biop = (BioSourcePtr) sdp->data.ptrvalue;
36751
taxname = (CharPtr) data;
36753
if (biop->org == NULL) {
36754
biop->org = OrgRefNew();
36756
SetTaxNameAndRemoveTaxRef (biop->org, StringSave (taxname));
36760
NLM_EXTERN BioSourcePtr GetBioSourceFromObject (Uint1 choice, Pointer data);
36762
static Pointer BulkSrcGetTaxNameDesc (Uint1 data_choice, Pointer data, Pointer metadata)
36764
CharPtr taxname = NULL;
36765
BioSourcePtr biop = NULL;
36767
biop = GetBioSourceFromObject (data_choice, data);
36768
if (biop == NULL) return NULL;
36770
if (biop->org != NULL) {
36771
taxname = StringSave (biop->org->taxname);
36778
static void BulkSrcSetTaxNameFeat (Pointer target, Pointer data)
36781
SeqFeatPtr sfp = (SeqFeatPtr) target;
36784
if (sfp == NULL || sfp->data.choice != SEQFEAT_BIOSRC || sfp->data.value.ptrvalue == NULL) return;
36786
biop = (BioSourcePtr) sfp->data.value.ptrvalue;
36788
taxname = (CharPtr) data;
36790
if (biop->org == NULL) {
36791
biop->org = OrgRefNew();
36793
SetTaxNameAndRemoveTaxRef (biop->org, StringSave (taxname));
36797
static Pointer BulkSrcGetTaxNameFeat (Uint1 data_choice, Pointer data, Pointer metadata)
36799
CharPtr taxname = NULL;
36800
SeqFeatPtr sfp = (SeqFeatPtr) data;
36803
if (sfp == NULL || sfp->data.choice != SEQFEAT_BIOSRC || sfp->data.value.ptrvalue == NULL) return NULL;
36805
biop = (BioSourcePtr) sfp->data.value.ptrvalue;
36807
if (biop->org != NULL) {
36808
taxname = StringSave (biop->org->taxname);
36815
static BulkEdFieldData bulk_src_desc_fields[] = {
36816
{ "tax name", BulkSrcSetTaxNameDesc, BulkSetSimpleTextString, BulkSrcGetTaxNameDesc, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36817
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
36819
static BulkEdFieldData bulk_src_feat_fields[] = {
36820
{ "tax name", BulkSrcSetTaxNameFeat, BulkSetSimpleTextString, BulkSrcGetTaxNameFeat, BulkDisplaySimpleText, BulkFreeSimpleText, BulkSimpleTextDialog, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
36821
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
36823
typedef struct bulkeditor {
36826
BulkEdFieldPtr field_list;
36827
} BulkEditorData, PNTR BulkEditorPtr;
36829
typedef struct collectfeat {
36832
ValNodePtr feat_list;
36833
} CollectFeatData, PNTR CollectFeatPtr;
36835
static void CollectFeaturesForBulkEditor (BioseqPtr bsp, Pointer data)
36837
CollectFeatPtr cfp;
36839
SeqMgrFeatContext fcontext;
36841
if (bsp == NULL || data == NULL) return;
36842
cfp = (CollectFeatPtr) data;
36844
for (sfp = SeqMgrGetNextFeature (bsp, NULL, cfp->featchoice, cfp->featdef, &fcontext);
36846
sfp = SeqMgrGetNextFeature (bsp, sfp, cfp->featchoice, cfp->featdef, &fcontext)) {
36847
ValNodeAddPointer (&(cfp->feat_list), OBJ_SEQFEAT, sfp);
36851
static void AcceptBulkEditor (ButtoN b)
36855
bep = (BulkEditorPtr) GetObjectExtra (b);
36856
if (bep == NULL) return;
36861
ApplyBulkEditorToObjectList (bep->bulk_ed);
36863
ObjMgrSetDirtyFlag (bep->input_entityID, TRUE);
36864
ObjMgrSendMsg (OM_MSG_UPDATE, bep->input_entityID, 0, 0);
36867
Remove (bep->form);
36870
extern Uint1 GetSubtypeForBulkEdit (ValNodePtr feat_list)
36872
ValNodePtr vnp_check;
36874
Uint1 subtype = FEATDEF_BAD;
36876
for (vnp_check = feat_list; vnp_check != NULL; vnp_check = vnp_check->next) {
36877
if (vnp_check->choice != OBJ_SEQFEAT) continue;
36878
sfp = vnp_check->data.ptrvalue;
36879
if (sfp->data.choice == SEQFEAT_RNA) {
36880
/* note - using FEATDEF_rRNA to represent all editable RNA features */
36881
if (!IsBulkEditableRNA(sfp)) {
36882
return FEATDEF_BAD;
36883
} else if (subtype == FEATDEF_BAD) {
36884
subtype = FEATDEF_rRNA;
36885
} else if (subtype != FEATDEF_rRNA) {
36886
return FEATDEF_BAD;
36888
} else if (subtype == FEATDEF_BAD) {
36889
subtype = sfp->idx.subtype;
36890
} else if (subtype != sfp->idx.subtype) {
36891
return FEATDEF_BAD;
36897
extern void BulkEditorFeatList (Uint2 entityID, ValNodePtr feat_list)
36905
BulkEdFieldPtr field_list = NULL;
36908
if (feat_list == NULL) {
36909
Message (MSG_ERROR, "No features found!");
36912
/* Create a new window, and a struct */
36913
/* to pass around the data in. */
36915
sep = GetTopSeqEntryForEntityID (entityID);
36917
subtype = GetSubtypeForBulkEdit (feat_list);
36918
if (subtype == FEATDEF_BAD) {
36919
Message (MSG_ERROR, "Can't bulk edit a list of mixed feature types!");
36922
if (subtype == FEATDEF_CDS) {
36923
field_list = bulk_cds_fields;
36924
} else if (subtype == FEATDEF_GENE) {
36925
field_list = bulk_gene_fields;
36926
} else if (subtype == FEATDEF_rRNA) {
36927
/* Note - using FEATDEF_rRNA to represent all editable rRNA features */
36928
field_list = bulk_rna_fields;
36929
} else if (subtype == FEATDEF_BIOSRC) {
36930
field_list = bulk_src_feat_fields;
36932
Message (MSG_ERROR, "No bulk editor for this feature type!");
36936
bep = (BulkEditorPtr) MemNew (sizeof (BulkEditorData));
36940
bep->field_list = field_list;
36942
w = FixedWindow (-50, -33, -10, -10, "Bulk Editor",
36943
StdCloseWindowProc);
36944
SetObjectExtra (w, bep, StdCleanupFormProc);
36945
bep->form = (ForM) w;
36946
bep->input_entityID = entityID;
36948
h = HiddenGroup (w, -1, 0, NULL);
36949
SetGroupSpacing (h, 10, 10);
36951
/* want: Document with columns for pseudo (when appropriate), location, fields */
36952
/* when user clicks on field, should be able to edit contents */
36954
bep->bulk_ed = CreateBulkEditorDialog (h, bep->field_list, feat_list, sep, TRUE, NULL, NULL);
36956
/* Add Accept and Cancel buttons */
36958
c = HiddenGroup (h, 3, 0, NULL);
36959
b = PushButton (c, "Accept", AcceptBulkEditor);
36960
SetObjectExtra (b, bep, NULL);
36961
PushButton (c, "Cancel", StdCancelButtonProc);
36963
/* Line things up nicely */
36965
AlignObjects (ALIGN_CENTER, (HANDLE) bep->bulk_ed,
36969
/* Display the window now */
36978
extern Uint1 GetSubtypeForBulkDescrEdit (ValNodePtr descr_list)
36980
ValNodePtr vnp_check;
36984
for (vnp_check = descr_list; vnp_check != NULL; vnp_check = vnp_check->next) {
36985
if (vnp_check->choice != OBJ_SEQDESC) continue;
36986
sdp = vnp_check->data.ptrvalue;
36987
if (subtype == 0) {
36988
subtype = sdp->choice;
36989
} else if (sdp->choice != subtype) {
36997
extern void BulkEditorDescrList (Uint2 entityID, ValNodePtr descr_list)
37005
BulkEdFieldPtr field_list = NULL;
37008
if (descr_list == NULL) {
37009
Message (MSG_ERROR, "No descriptors found!");
37012
/* Create a new window, and a struct */
37013
/* to pass around the data in. */
37015
sep = GetTopSeqEntryForEntityID (entityID);
37017
subtype = GetSubtypeForBulkDescrEdit (descr_list);
37018
if (subtype == 0) {
37019
Message (MSG_ERROR, "Can't bulk edit a list of mixed descriptor types!");
37022
if (subtype == Seq_descr_source) {
37023
field_list = bulk_src_desc_fields;
37025
Message (MSG_ERROR, "No bulk editor for this descriptor type!");
37029
bep = (BulkEditorPtr) MemNew (sizeof (BulkEditorData));
37033
bep->field_list = field_list;
37035
w = FixedWindow (-50, -33, -10, -10, "Bulk Editor",
37036
StdCloseWindowProc);
37037
SetObjectExtra (w, bep, StdCleanupFormProc);
37038
bep->form = (ForM) w;
37039
bep->input_entityID = entityID;
37041
h = HiddenGroup (w, -1, 0, NULL);
37042
SetGroupSpacing (h, 10, 10);
37044
/* want: Document with columns for pseudo (when appropriate), location, fields */
37045
/* when user clicks on field, should be able to edit contents */
37047
bep->bulk_ed = CreateBulkEditorDialog (h, bep->field_list, descr_list, sep, TRUE, NULL, NULL);
37049
/* Add Accept and Cancel buttons */
37051
c = HiddenGroup (h, 3, 0, NULL);
37052
b = PushButton (c, "Accept", AcceptBulkEditor);
37053
SetObjectExtra (b, bep, NULL);
37054
PushButton (c, "Cancel", StdCancelButtonProc);
37056
/* Line things up nicely */
37058
AlignObjects (ALIGN_CENTER, (HANDLE) bep->bulk_ed,
37062
/* Display the window now */
37071
NLM_EXTERN void BulkEditorObjectList (Uint2 entityID, CharPtr title, ValNodePtr feat_list, BulkEdFieldPtr field_list)
37081
if (feat_list == NULL) {
37082
Message (MSG_ERROR, "No features found!");
37085
/* Create a new window, and a struct */
37086
/* to pass around the data in. */
37088
sep = GetTopSeqEntryForEntityID (entityID);
37090
bep = (BulkEditorPtr) MemNew (sizeof (BulkEditorData));
37094
bep->field_list = field_list;
37096
w = FixedWindow (-50, -33, -10, -10, title,
37097
StdCloseWindowProc);
37098
SetObjectExtra (w, bep, StdCleanupFormProc);
37099
bep->form = (ForM) w;
37100
bep->input_entityID = entityID;
37102
h = HiddenGroup (w, -1, 0, NULL);
37103
SetGroupSpacing (h, 10, 10);
37105
/* want: Document with columns for pseudo (when appropriate), location, fields */
37106
/* when user clicks on field, should be able to edit contents */
37108
bep->bulk_ed = CreateBulkEditorDialog (h, bep->field_list, feat_list, sep, TRUE, NULL, NULL);
37110
/* Add Accept and Cancel buttons */
37112
c = HiddenGroup (h, 3, 0, NULL);
37113
b = PushButton (c, "Accept", AcceptBulkEditor);
37114
SetObjectExtra (b, bep, NULL);
37115
PushButton (c, "Cancel", StdCancelButtonProc);
37117
/* Line things up nicely */
37119
AlignObjects (ALIGN_CENTER, (HANDLE) bep->bulk_ed,
37123
/* Display the window now */
37132
static void BulkEditor (IteM i, Uint1 featchoice, Uint1 featdef)
37136
CollectFeatData cfd;
37137
BulkEdFieldPtr field_list = NULL;
37140
bfp = currentFormDataPtr;
37142
bfp = GetObjectExtra (i);
37144
if (bfp == NULL) return;
37146
/* Create a new window, and a struct */
37147
/* to pass around the data in. */
37149
sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
37151
if (featchoice == SEQFEAT_CDREGION || featdef == FEATDEF_CDS) {
37152
field_list = bulk_cds_fields;
37153
} else if (featchoice == SEQFEAT_GENE || featdef == FEATDEF_GENE) {
37154
field_list = bulk_gene_fields;
37155
} else if (featchoice == SEQFEAT_RNA) {
37156
field_list = bulk_rna_fields;
37158
Message (MSG_ERROR, "No bulk editor for this feature type!");
37162
cfd.featchoice = featchoice;
37163
cfd.featdef = featdef;
37164
cfd.feat_list = NULL;
37165
VisitBioseqsInSep (sep, &cfd, CollectFeaturesForBulkEditor);
37167
if (cfd.feat_list == NULL) {
37168
Message (MSG_ERROR, "No features found!");
37172
BulkEditorFeatList (bfp->input_entityID, cfd.feat_list);
37175
extern void BulkEditCDS (IteM i)
37177
BulkEditor (i, SEQFEAT_CDREGION, FEATDEF_CDS);
37180
extern void BulkEditGene (IteM i)
37182
BulkEditor (i, SEQFEAT_GENE, FEATDEF_GENE);
37185
extern void BulkEditRNA (IteM i)
37187
BulkEditor (i, SEQFEAT_RNA, 0);
37191
static Pointer GetBarcodeTestBarcodeID (Uint1 data_choice, Pointer data, Pointer metadata)
37193
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37194
if (res == NULL || res->bsp == NULL) {
37197
return BarcodeTestBarcodeIdString (res->bsp);
37202
static Pointer GetBarcodeTestGenbankID (Uint1 data_choice, Pointer data, Pointer metadata)
37204
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37205
if (res == NULL || res->bsp == NULL) {
37208
return BarcodeTestGenbankIdString (res->bsp);
37213
static Pointer GetBarcodeTestLengthResult (Uint1 data_choice, Pointer data, Pointer metadata)
37215
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37216
if (res == NULL || !res->failed_tests[eBarcodeTest_Length]) {
37219
return StringSave ("TRUE");
37224
static Pointer GetBarcodeTestPrimersResult (Uint1 data_choice, Pointer data, Pointer metadata)
37226
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37227
if (res == NULL || !res->failed_tests[eBarcodeTest_Primers]) {
37230
return StringSave ("TRUE");
37235
static Pointer GetBarcodeTestCountryResult (Uint1 data_choice, Pointer data, Pointer metadata)
37237
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37238
if (res == NULL || !res->failed_tests[eBarcodeTest_Country]) {
37241
return StringSave ("TRUE");
37246
static Pointer GetBarcodeTestSpecimenVoucherResult (Uint1 data_choice, Pointer data, Pointer metadata)
37248
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37249
if (res == NULL || !res->failed_tests[eBarcodeTest_SpecimenVoucher]) {
37252
return StringSave ("TRUE");
37257
static Pointer GetBarcodeTestPercentNsResult (Uint1 data_choice, Pointer data, Pointer metadata)
37259
BarcodeTestResultsPtr res = (BarcodeTestResultsPtr) data;
37261
if (res == NULL || !res->failed_tests[eBarcodeTest_PercentN]) {
37264
sprintf (txt, "%.1f", res->n_percent);
37265
return StringSave (txt);
37270
static Int4 BarcodeFormatBarcodeID (ColPtr col, CharPtr name)
37272
if (col == NULL) return 0;
37274
col->pixWidth = MAX (21, StringLen (name)) * MaxCharWidth();
37276
col->charWidth = 0;
37277
col->charInset = 0;
37282
col->underline = 0;
37284
return col->pixWidth;
37288
static Int4 BarcodeFormatGenbankID (ColPtr col, CharPtr name)
37290
if (col == NULL) return 0;
37292
col->pixWidth = MAX (10, StringLen (name)) * MaxCharWidth();
37294
col->charWidth = 0;
37295
col->charInset = 0;
37300
col->underline = 0;
37302
return col->pixWidth;
37306
static Int4 BarcodeFormatPercentN (ColPtr col, CharPtr name)
37308
if (col == NULL) return 0;
37310
col->pixWidth = MAX (5, StringLen (name)) * MaxCharWidth();
37312
col->charWidth = 0;
37313
col->charInset = 0;
37318
col->underline = 0;
37320
return col->pixWidth;
37324
static BulkEdFieldData barcode_test_fields[] = {
37325
{ "Barcode ID", NULL, NULL, GetBarcodeTestBarcodeID, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BarcodeFormatBarcodeID, NULL, NULL, BulkSimpleTextCopy },
37326
{ "Genbank Accession", NULL, NULL, GetBarcodeTestGenbankID, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BarcodeFormatGenbankID, NULL, NULL, BulkSimpleTextCopy },
37327
{ "Length", NULL, NULL, GetBarcodeTestLengthResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37328
{ "Primers", NULL, NULL, GetBarcodeTestPrimersResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37329
{ "Country", NULL, NULL, GetBarcodeTestCountryResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37330
{ "Specimen Voucher", NULL, NULL, GetBarcodeTestSpecimenVoucherResult, NULL, BulkFreeSimpleText, NULL, BulkFormatTrueFalse, BulkDrawTrueFalse, NULL, BulkSimpleTextCopy },
37331
{ "Percent Ns", NULL, NULL, GetBarcodeTestPercentNsResult, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BarcodeFormatPercentN, NULL, NULL, BulkSimpleTextCopy },
37332
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
37334
static void NavigateToBarcodeTestResultBioseq (ValNodePtr object, Pointer userdata)
37337
BarcodeTestResultsPtr res;
37339
if (object == NULL) return;
37341
res = (BarcodeTestResultsPtr) object->data.ptrvalue;
37343
if (res == NULL || res->bsp == NULL) return;
37344
bfp = GetBaseFormForEntityID (res->bsp->idx.entityID);
37346
Select (bfp->form);
37347
SetBioseqViewTargetByBioseq (bfp, res->bsp);
37352
extern DialoG BarcodeTestResultsDisplay (GrouP h, BarcodeTestConfigPtr cfg)
37354
return CreateBulkEditorDialog (h, barcode_test_fields, NULL, NULL, FALSE, NavigateToBarcodeTestResultBioseq, NULL);
37357
extern SubSourcePtr FindBadLatLon (BioSourcePtr biop)
37359
SubSourcePtr ssp, ssp_bad = NULL;
37360
Boolean format_ok, lat_in_range, lon_in_range;
37367
for (ssp = biop->subtype; ssp != NULL && ssp_bad == NULL; ssp = ssp->next)
37369
if (ssp->subtype == SUBSRC_lat_lon)
37371
IsCorrectLatLonFormat (ssp->name, &format_ok, &lat_in_range, &lon_in_range);
37372
if (!format_ok || !lat_in_range || !lon_in_range)
37382
static Pointer GetCurrentLatLon (Uint1 data_choice, Pointer data, Pointer metadata)
37384
SubSourcePtr bad_ssp;
37387
biop = GetBioSourceFromObject (data_choice, data);
37388
if (biop == NULL) return NULL;
37390
bad_ssp = FindBadLatLon (biop);
37391
if (bad_ssp == NULL)
37397
return StringSave (bad_ssp->name);
37402
static Pointer GetCorrectedLatLon (Uint1 data_choice, Pointer data, Pointer metadata)
37404
SubSourcePtr bad_ssp;
37408
biop = GetBioSourceFromObject (data_choice, data);
37409
if (biop == NULL) return NULL;
37411
bad_ssp = FindBadLatLon (biop);
37412
if (bad_ssp == NULL)
37418
fix = FixLatLonFormat (bad_ssp->name);
37421
return StringSave ("Unable to autocorrect");
37431
static BulkEdFieldData latlon_fields[] = {
37432
{ "Current Lat-lon", NULL, NULL, GetCurrentLatLon, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37433
{ "Suggested Correction", NULL, NULL, GetCorrectedLatLon, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37434
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
37436
extern DialoG LatLonTestResultsDisplay (GrouP h)
37438
return CreateBulkEditorDialog (h, latlon_fields, NULL, NULL, FALSE, ScrollToDiscrepancyItem, EditDiscrepancyItem);
37442
static CharPtr GetSubSource (Uint1 data_choice, Pointer data, Uint1 subtype)
37447
biop = GetBioSourceFromObject (data_choice, data);
37448
if (biop == NULL) return NULL;
37450
for (ssp = biop->subtype; ssp != NULL && ssp->subtype != subtype; ssp = ssp->next)
37459
return StringSave (ssp->name);
37464
static Pointer GetCountry (Uint1 data_choice, Pointer data, Pointer metadata)
37466
return GetSubSource (data_choice, data, SUBSRC_country);
37469
static Pointer GetLatLon (Uint1 data_choice, Pointer data, Pointer metadata)
37471
return GetSubSource (data_choice, data, SUBSRC_lat_lon);
37475
extern Pointer GetLatLonCountryCorrection (Uint1 data_choice, Pointer data, Pointer metadata)
37479
CharPtr country = NULL, cp;
37481
Boolean found_lat_lon = FALSE;
37482
CharPtr msg = NULL;
37483
CharPtr guess_fmt = "Lat_lon does not map to '%s', but may be in '%s'";
37486
biop = GetBioSourceFromObject (data_choice, data);
37487
if (biop == NULL) return NULL;
37489
for (ssp = biop->subtype; ssp != NULL && (country == NULL || !found_lat_lon); ssp = ssp->next)
37491
if (ssp->subtype == SUBSRC_country && !StringHasNoText (ssp->name))
37493
country = StringSave (ssp->name);
37495
else if (ssp->subtype == SUBSRC_lat_lon)
37497
if (ParseLatLon (ssp->name, &lat, &lon))
37499
found_lat_lon = TRUE;
37504
cp = StringChr (country, ':');
37510
if (country == NULL && !found_lat_lon)
37512
msg = StringSave ("Country and lat-lon not specified");
37514
else if (country == NULL)
37516
msg = StringSave ("Country not specified");
37518
else if (!found_lat_lon)
37520
msg = StringSave ("Lat-lon not specified.");
37522
else if (!IsCountryInLatLonList (country))
37524
msg = StringSave ("Country not in lat-lon list");
37526
else if (TestLatLonForCountry (country, lat, lon))
37528
msg = StringSave ("No conflict");
37530
else if (TestLatLonForCountry (country, -lat, lon))
37533
msg = StringSave ("Latitude should be set to N (northern hemisphere)");
37535
msg = StringSave ("Latitude should be set to S (southern hemisphere)");
37537
} else if (TestLatLonForCountry (country, lat, -lon)) {
37539
msg = StringSave ("Longitude should be set to E (eastern hemisphere)");
37541
msg = StringSave ("Longitude should be set to W (western hemisphere)");
37543
} else if (TestLatLonForCountry (country, lon, lat)) {
37544
msg = StringSave ("Latitude and longitude values appear to be exchanged");
37546
guess = GuessCountryForLatLon (lat, lon);
37549
msg = StringSave ("Lat-lon does not map to country");
37553
msg = (CharPtr) MemNew (sizeof (Char) * (StringLen (guess_fmt) + StringLen (country) + StringLen (guess)));
37554
sprintf (msg, guess_fmt, country, guess);
37560
static BulkEdFieldData latloncountry_fields[] = {
37561
{ "Lat-lon", NULL, NULL, GetLatLon, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37562
{ "Country", NULL, NULL, GetCountry, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37563
{ "Suggested Correction", NULL, NULL, GetLatLonCountryCorrection, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37564
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
37566
extern DialoG LatLonCountryResultsDisplay (GrouP h)
37568
return CreateBulkEditorDialog (h, latloncountry_fields, NULL, NULL, FALSE, ScrollToDiscrepancyItem, EditDiscrepancyItem);
37572
static Pointer GetCurrentSpecificHost (Uint1 data_choice, Pointer data, Pointer metadata)
37574
SpecificHostFixPtr s = (SpecificHostFixPtr) data;
37576
if (s == NULL || StringHasNoText (s->bad_specific_host))
37582
return StringSave (s->bad_specific_host);
37587
static Pointer GetCorrectedSpecificHost (Uint1 data_choice, Pointer data, Pointer metadata)
37589
SpecificHostFixPtr s = (SpecificHostFixPtr) data;
37590
CharPtr new_spec_host;
37592
if (s == NULL || StringHasNoText (s->bad_specific_host) || StringHasNoText (s->old_taxname))
37596
else if (StringHasNoText (s->new_taxname))
37598
return StringSave ("Unable to suggest correction");
37602
new_spec_host = StringSave (s->bad_specific_host);
37603
FindReplaceString (&new_spec_host, s->old_taxname, s->new_taxname, TRUE, TRUE);
37604
return new_spec_host;
37609
static void ScrollToSpecificHostFix (ValNodePtr vnp, Pointer userdata)
37611
SpecificHostFixPtr s;
37613
if (vnp == NULL || vnp->data.ptrvalue == NULL) return;
37615
s = (SpecificHostFixPtr) vnp->data.ptrvalue;
37616
ScrollToDiscrepancyItem (s->feat_or_desc, NULL);
37620
static void EditSpecificHostFix (ValNodePtr vnp, Pointer userdata)
37622
SpecificHostFixPtr s;
37624
if (vnp == NULL || vnp->data.ptrvalue == NULL) return;
37626
s = (SpecificHostFixPtr) vnp->data.ptrvalue;
37627
EditDiscrepancyItem (s->feat_or_desc, NULL);
37631
static BulkEdFieldData specifichost_fields[] = {
37632
{ "Current Specific-host", NULL, NULL, GetCurrentSpecificHost, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37633
{ "Suggested Correction", NULL, NULL, GetCorrectedSpecificHost, BulkDisplaySimpleText, BulkFreeSimpleText, NULL, BulkFormatSimpleText, NULL, NULL, BulkSimpleTextCopy },
37634
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}};
37636
extern DialoG SpecificHostResultsDisplay (GrouP h)
37638
return CreateBulkEditorDialog (h, specifichost_fields, NULL, NULL, FALSE, ScrollToSpecificHostFix, EditSpecificHostFix);