~ubuntu-branches/ubuntu/maverick/ncbi-tools6/maverick

« back to all changes in this revision

Viewing changes to sequin/sequin5.c

  • Committer: Bazaar Package Importer
  • Author(s): Aaron M. Ucko
  • Date: 2005-03-27 12:00:15 UTC
  • mfrom: (2.1.2 hoary)
  • Revision ID: james.westby@ubuntu.com-20050327120015-embhesp32nj73p9r
Tags: 6.1.20041020-3
* Fix FTBFS under GCC 4.0 caused by inconsistent use of "static" on
  functions.  (Closes: #295110.)
* Add a watch file, now that we can.  (Upstream's layout needs version=3.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
*
30
30
* Version Creation Date:   8/26/97
31
31
*
32
 
* $Revision: 6.135 $
 
32
* $Revision: 6.181 $
33
33
*
34
34
* File Description:
35
35
*
73
73
#include <salpedit.h>
74
74
#include <salptool.h>
75
75
#include <rpsutil.h>
 
76
#include <subutil.h>
 
77
#include <explore.h>
 
78
#include <import.h>
 
79
#include <salutil.h>
76
80
 
77
81
static void CommonLaunchBioseqViewer (SeqEntryPtr sep, CharPtr path, Boolean directToEditor)
78
82
 
453
457
  if (IS_Bioseq_set (sep)) {
454
458
    bssp = (BioseqSetPtr) sep->data.ptrvalue;
455
459
    if (bssp != NULL && (bssp->_class == 7 ||
456
 
                         (bssp->_class >= 13 && bssp->_class <= 16))) {
 
460
                         (IsPopPhyEtcSet (bssp->_class)))) {
457
461
      for (sep = bssp->seq_set; sep != NULL; sep = sep->next) {
458
462
        ProcessOligo (sep, sequence, title);
459
463
      }
816
820
  StaticPrompt (g, "Accession: ", 0, stdLineHeight, systemFont, 'l');
817
821
  elp->accnnumber = StaticPrompt (g, "", 20 * stdCharWidth, stdLineHeight, systemFont, 'l');
818
822
  c = HiddenGroup (w, 2, 0, NULL);
819
 
  b = PushButton (c, "Accept", StdAcceptFormButtonProc);
 
823
  b = DefaultButton (c, "Accept", StdAcceptFormButtonProc);
820
824
  SetObjectExtra (b, elp, NULL);
821
825
  PushButton (c, "Cancel", StdCancelButtonProc);
822
826
  AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) c, NULL);
1073
1077
static SeqIdPtr SeqIdFindBestForPromotion (SeqIdPtr sip)
1074
1078
 
1075
1079
{
1076
 
  Uint1  order [NUM_ORDER];
1077
 
 
1078
 
  SeqIdBestRank (order, NUM_ORDER);
1079
 
  order [SEQID_OTHER] = 52;
1080
 
  return SeqIdSelect (sip, order, NUM_ORDER);
1081
 
}
1082
 
 
1083
 
static void PromoteSeqId (SeqIdPtr sip, Boolean alsoCheckLocalAccn)
 
1080
  return SeqIdFindBest (sip, 0);
 
1081
}
 
1082
 
 
1083
static SeqIdPtr SeqIdFindWorstForPromotion (SeqIdPtr sip)
 
1084
 
 
1085
{
 
1086
  return SeqIdFindWorst (sip);
 
1087
}
 
1088
 
 
1089
static void PromoteSeqId (SeqIdPtr sip, Boolean alsoCheckLocalAccn, Boolean findWorst)
1084
1090
 
1085
1091
{
1086
1092
  SeqIdPtr     bestid, newid, oldid;
1103
1109
  }
1104
1110
  if (bsp == NULL) return;
1105
1111
 
1106
 
  bestid = SeqIdFindBestForPromotion (bsp->id);
 
1112
  if (findWorst) {
 
1113
    bestid = SeqIdFindWorstForPromotion (bsp->id);
 
1114
  } else {
 
1115
    bestid = SeqIdFindBestForPromotion (bsp->id);
 
1116
  }
1107
1117
  if (bestid == NULL) return;
1108
1118
  newid = SeqIdDup (bestid);
1109
1119
  if (newid == NULL) return;
1123
1133
  SeqIdStripLocus (sip);
1124
1134
}
1125
1135
 
1126
 
static void PromoteSeqIdList (SeqIdPtr sip, Boolean alsoCheckLocalAccn)
 
1136
static void PromoteSeqIdList (SeqIdPtr sip, Boolean alsoCheckLocalAccn, Boolean findWorst)
1127
1137
 
1128
1138
{
1129
1139
  while (sip != NULL) {
1130
 
    PromoteSeqId (sip, alsoCheckLocalAccn);
 
1140
    PromoteSeqId (sip, alsoCheckLocalAccn, findWorst);
1131
1141
    sip = sip->next;
1132
1142
  }
1133
1143
}
1134
1144
 
1135
 
static void PromoteSeqLocList (SeqLocPtr slp, Boolean alsoCheckLocalAccn)
 
1145
static void PromoteSeqLocList (SeqLocPtr slp, Boolean alsoCheckLocalAccn, Boolean findWorst)
1136
1146
 
1137
1147
{
1138
1148
  SeqLocPtr      loc;
1149
1159
      case SEQLOC_EMPTY :
1150
1160
      case SEQLOC_WHOLE :
1151
1161
        sip = (SeqIdPtr) slp->data.ptrvalue;
1152
 
        PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1162
        PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1153
1163
        break;
1154
1164
      case SEQLOC_INT :
1155
1165
        sinp = (SeqIntPtr) slp->data.ptrvalue;
1156
1166
        if (sinp != NULL) {
1157
1167
          sip = sinp->id;
1158
 
          PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1168
          PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1159
1169
        }
1160
1170
        break;
1161
1171
      case SEQLOC_PNT :
1162
1172
        spp = (SeqPntPtr) slp->data.ptrvalue;
1163
1173
        if (spp != NULL) {
1164
1174
          sip = spp->id;
1165
 
          PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1175
          PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1166
1176
        }
1167
1177
        break;
1168
1178
      case SEQLOC_PACKED_PNT :
1169
1179
        psp = (PackSeqPntPtr) slp->data.ptrvalue;
1170
1180
        if (psp != NULL) {
1171
1181
          sip = psp->id;
1172
 
          PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1182
          PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1173
1183
        }
1174
1184
        break;
1175
1185
      case SEQLOC_PACKED_INT :
1177
1187
      case SEQLOC_EQUIV :
1178
1188
        loc = (SeqLocPtr) slp->data.ptrvalue;
1179
1189
        while (loc != NULL) {
1180
 
          PromoteSeqLocList (loc, alsoCheckLocalAccn);
 
1190
          PromoteSeqLocList (loc, alsoCheckLocalAccn, findWorst);
1181
1191
          loc = loc->next;
1182
1192
        }
1183
1193
        break;
1187
1197
          spp = (SeqPntPtr) sbp->a;
1188
1198
          if (spp != NULL) {
1189
1199
            sip = spp->id;
1190
 
            PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1200
            PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1191
1201
          }
1192
1202
          spp = (SeqPntPtr) sbp->b;
1193
1203
          if (spp != NULL) {
1194
1204
            sip = spp->id;
1195
 
            PromoteSeqIdList (sip, alsoCheckLocalAccn);
 
1205
            PromoteSeqIdList (sip, alsoCheckLocalAccn, findWorst);
1196
1206
          }
1197
1207
        }
1198
1208
        break;
1205
1215
  }
1206
1216
}
1207
1217
 
1208
 
static Boolean PromoteIDsProc (GatherObjectPtr gop)
 
1218
static Boolean PromoteIDsProc (GatherObjectPtr gop, Boolean findWorst)
1209
1219
 
1210
1220
{
1211
1221
  CodeBreakPtr  cbp;
1218
1228
  sfp = (SeqFeatPtr) gop->dataptr;
1219
1229
  if (sfp == NULL) return TRUE;
1220
1230
 
1221
 
  PromoteSeqLocList (sfp->location, FALSE);
 
1231
  PromoteSeqLocList (sfp->location, FALSE, findWorst);
1222
1232
 
1223
 
  PromoteSeqLocList (sfp->product, FALSE);
 
1233
  PromoteSeqLocList (sfp->product, FALSE, findWorst);
1224
1234
 
1225
1235
  switch (sfp->data.choice) {
1226
1236
    case SEQFEAT_CDREGION :
1227
1237
      crp = (CdRegionPtr) sfp->data.value.ptrvalue;
1228
1238
      if (crp != NULL && crp->code_break != NULL) {
1229
1239
        for (cbp = crp->code_break; cbp != NULL; cbp = cbp->next) {
1230
 
          PromoteSeqLocList (cbp->loc, FALSE);
 
1240
          PromoteSeqLocList (cbp->loc, FALSE, findWorst);
1231
1241
        }
1232
1242
      }
1233
1243
      break;
1236
1246
      if (rrp != NULL && rrp->type == 3 && rrp->ext.choice == 2) {
1237
1247
        trp = rrp->ext.value.ptrvalue;
1238
1248
        if (trp != NULL && trp->anticodon != NULL) {
1239
 
          PromoteSeqLocList (trp->anticodon, FALSE);
 
1249
          PromoteSeqLocList (trp->anticodon, FALSE, findWorst);
1240
1250
        }
1241
1251
      }
1242
1252
      break;
1247
1257
  return TRUE;
1248
1258
}
1249
1259
 
 
1260
static Boolean PromoteBestIDsProc (GatherObjectPtr gop)
 
1261
 
 
1262
{
 
1263
  return PromoteIDsProc (gop, FALSE);
 
1264
}
 
1265
 
1250
1266
void PromoteToBestIDProc (IteM i)
1251
1267
 
1252
1268
{
1264
1280
 
1265
1281
  oldscope = SeqEntrySetScope (sep);
1266
1282
 
1267
 
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, PromoteIDsProc, NULL, NULL);
 
1283
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, PromoteBestIDsProc, NULL, NULL);
 
1284
 
 
1285
  SeqEntrySetScope (oldscope);
 
1286
 
 
1287
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
1288
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
1289
}
 
1290
 
 
1291
static Boolean PromoteWorstIDsProc (GatherObjectPtr gop)
 
1292
 
 
1293
{
 
1294
  return PromoteIDsProc (gop, TRUE);
 
1295
}
 
1296
 
 
1297
void PromoteToWorstIDProc (IteM i)
 
1298
 
 
1299
{
 
1300
  BaseFormPtr  bfp;
 
1301
  SeqEntryPtr  oldscope, sep;
 
1302
 
 
1303
#ifdef WIN_MAC
 
1304
  bfp = currentFormDataPtr;
 
1305
#else
 
1306
  bfp = GetObjectExtra (i);
 
1307
#endif
 
1308
  if (bfp == NULL) return;
 
1309
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
1310
  if (sep == NULL) return;
 
1311
 
 
1312
  oldscope = SeqEntrySetScope (sep);
 
1313
 
 
1314
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, PromoteWorstIDsProc, NULL, NULL);
1268
1315
 
1269
1316
  SeqEntrySetScope (oldscope);
1270
1317
 
1289
1336
  switch (sap->segtype) {
1290
1337
    case SAS_DENDIAG :
1291
1338
      for (ddp = sap->segs; ddp != NULL; ddp = ddp->next) {
1292
 
        PromoteSeqIdList (ddp->id, TRUE);
 
1339
        PromoteSeqIdList (ddp->id, TRUE, FALSE);
1293
1340
      }
1294
1341
      break;
1295
1342
    case SAS_DENSEG :
1296
1343
      dsp = sap->segs;
1297
1344
      if (dsp != NULL) {
1298
 
        PromoteSeqIdList (dsp->ids, TRUE);
 
1345
        PromoteSeqIdList (dsp->ids, TRUE, FALSE);
1299
1346
      }
1300
1347
      break;
1301
1348
    case SAS_STD :
1302
1349
      for (ssp = sap->segs; ssp != NULL; ssp = ssp->next) {
1303
 
        PromoteSeqIdList (ssp->ids, TRUE);
 
1350
        PromoteSeqIdList (ssp->ids, TRUE, FALSE);
1304
1351
        for (slp = ssp->loc; slp != NULL; slp = slp->next) {
1305
 
          PromoteSeqLocList (slp, TRUE);
 
1352
          PromoteSeqLocList (slp, TRUE, FALSE);
1306
1353
        }
1307
1354
      }
1308
1355
      break;
1309
1356
    case SAS_PACKED :
1310
1357
      psp = (PackSegPtr) sap->segs;
1311
1358
      if (psp != NULL) {
1312
 
        PromoteSeqIdList (psp->ids, TRUE);
 
1359
        PromoteSeqIdList (psp->ids, TRUE, FALSE);
1313
1360
      }
1314
1361
      break;
1315
1362
    case SAS_COMPSEQ :
1347
1394
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
1348
1395
}
1349
1396
 
1350
 
static Boolean RemoveIDsProc (GatherObjectPtr gop)
1351
 
 
1352
 
{
1353
 
  BioseqPtr      bsp;
1354
 
  SeqIdPtr       nextid, sip;
1355
 
  SeqIdPtr PNTR  previd;
1356
 
 
1357
 
  if (gop->itemtype != OBJ_BIOSEQ) return TRUE;
1358
 
  bsp = (BioseqPtr) gop->dataptr;
1359
 
  if (bsp == NULL) return TRUE;
1360
 
 
1361
 
  previd = (SeqIdPtr PNTR) &(bsp->id);
1362
 
  sip = bsp->id;
1363
 
  while (sip != NULL) {
1364
 
    nextid = sip->next;
1365
 
    if (sip->choice == SEQID_GENBANK) {
1366
 
      *previd = sip->next;
1367
 
      sip->next = NULL;
1368
 
      SeqIdFree (sip);
1369
 
    } else {
1370
 
      previd = (SeqIdPtr PNTR) &(sip->next);
1371
 
    }
1372
 
    sip = sip->next;
1373
 
  }
1374
 
 
1375
 
  return TRUE;
1376
 
}
1377
 
 
1378
 
void RemoveIDsFromBioseqs (IteM i)
1379
 
 
1380
 
{
1381
 
  MsgAnswer    ans;
1382
 
  BaseFormPtr  bfp;
1383
 
 
1384
 
#ifdef WIN_MAC
1385
 
  bfp = currentFormDataPtr;
1386
 
#else
1387
 
  bfp = GetObjectExtra (i);
1388
 
#endif
1389
 
  if (bfp == NULL) return;
1390
 
 
1391
 
  ans = Message (MSG_OKC, "Currently deletes all GenBank/EMBL/DDBJ SeqIDs");
1392
 
  if (ans == ANS_CANCEL) return;
1393
 
 
1394
 
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, RemoveIDsProc, NULL, NULL);
 
1397
static Boolean RemoveGBIDsProc (GatherObjectPtr gop)
 
1398
 
 
1399
{
 
1400
  BioseqPtr      bsp;
 
1401
  SeqIdPtr       nextid, sip;
 
1402
  SeqIdPtr PNTR  previd;
 
1403
 
 
1404
  if (gop->itemtype != OBJ_BIOSEQ) return TRUE;
 
1405
  bsp = (BioseqPtr) gop->dataptr;
 
1406
  if (bsp == NULL) return TRUE;
 
1407
 
 
1408
  previd = (SeqIdPtr PNTR) &(bsp->id);
 
1409
  sip = bsp->id;
 
1410
  while (sip != NULL) {
 
1411
    nextid = sip->next;
 
1412
    if (sip->choice == SEQID_GENBANK) {
 
1413
      *previd = sip->next;
 
1414
      sip->next = NULL;
 
1415
      SeqIdFree (sip);
 
1416
    } else {
 
1417
      previd = (SeqIdPtr PNTR) &(sip->next);
 
1418
    }
 
1419
    sip = sip->next;
 
1420
  }
 
1421
 
 
1422
  return TRUE;
 
1423
}
 
1424
 
 
1425
void RemoveGBIDsFromBioseqs (IteM i)
 
1426
 
 
1427
{
 
1428
  MsgAnswer    ans;
 
1429
  BaseFormPtr  bfp;
 
1430
 
 
1431
#ifdef WIN_MAC
 
1432
  bfp = currentFormDataPtr;
 
1433
#else
 
1434
  bfp = GetObjectExtra (i);
 
1435
#endif
 
1436
  if (bfp == NULL) return;
 
1437
 
 
1438
  ans = Message (MSG_OKC, "Currently deletes all GenBank SeqIDs");
 
1439
  if (ans == ANS_CANCEL) return;
 
1440
 
 
1441
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, RemoveGBIDsProc, NULL, NULL);
 
1442
 
 
1443
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
1444
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
1445
}
 
1446
 
 
1447
static Boolean RemoveGBProtIDsProc (GatherObjectPtr gop)
 
1448
 
 
1449
{
 
1450
  BioseqPtr      bsp;
 
1451
  SeqIdPtr       nextid, sip;
 
1452
  SeqIdPtr PNTR  previd;
 
1453
 
 
1454
  if (gop->itemtype != OBJ_BIOSEQ) return TRUE;
 
1455
  bsp = (BioseqPtr) gop->dataptr;
 
1456
  if (bsp == NULL) return TRUE;
 
1457
  if (! ISA_aa (bsp->mol)) return TRUE;
 
1458
 
 
1459
  previd = (SeqIdPtr PNTR) &(bsp->id);
 
1460
  sip = bsp->id;
 
1461
  while (sip != NULL) {
 
1462
    nextid = sip->next;
 
1463
    if (sip->choice == SEQID_GENBANK) {
 
1464
      *previd = sip->next;
 
1465
      sip->next = NULL;
 
1466
      SeqIdFree (sip);
 
1467
    } else {
 
1468
      previd = (SeqIdPtr PNTR) &(sip->next);
 
1469
    }
 
1470
    sip = sip->next;
 
1471
  }
 
1472
 
 
1473
  return TRUE;
 
1474
}
 
1475
 
 
1476
void RemoveGBIDsFromProteins (IteM i)
 
1477
 
 
1478
{
 
1479
  MsgAnswer    ans;
 
1480
  BaseFormPtr  bfp;
 
1481
 
 
1482
#ifdef WIN_MAC
 
1483
  bfp = currentFormDataPtr;
 
1484
#else
 
1485
  bfp = GetObjectExtra (i);
 
1486
#endif
 
1487
  if (bfp == NULL) return;
 
1488
 
 
1489
  ans = Message (MSG_OKC, "Currently deletes all GenBank SeqIDs");
 
1490
  if (ans == ANS_CANCEL) return;
 
1491
 
 
1492
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, RemoveGBProtIDsProc, NULL, NULL);
 
1493
 
 
1494
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
1495
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
1496
}
 
1497
 
 
1498
static Boolean RemoveGIProc (GatherObjectPtr gop)
 
1499
 
 
1500
{
 
1501
  BioseqPtr      bsp;
 
1502
  SeqIdPtr       nextid, sip;
 
1503
  SeqIdPtr PNTR  previd;
 
1504
 
 
1505
  if (gop->itemtype != OBJ_BIOSEQ) return TRUE;
 
1506
  bsp = (BioseqPtr) gop->dataptr;
 
1507
  if (bsp == NULL) return TRUE;
 
1508
 
 
1509
  previd = (SeqIdPtr PNTR) &(bsp->id);
 
1510
  sip = bsp->id;
 
1511
  while (sip != NULL) {
 
1512
    nextid = sip->next;
 
1513
    if (sip->choice == SEQID_GI) {
 
1514
      *previd = sip->next;
 
1515
      sip->next = NULL;
 
1516
      SeqIdFree (sip);
 
1517
    } else {
 
1518
      previd = (SeqIdPtr PNTR) &(sip->next);
 
1519
    }
 
1520
    sip = sip->next;
 
1521
  }
 
1522
 
 
1523
  return TRUE;
 
1524
}
 
1525
 
 
1526
void RemoveGIsFromBioseqs (IteM i)
 
1527
 
 
1528
{
 
1529
  MsgAnswer    ans;
 
1530
  BaseFormPtr  bfp;
 
1531
 
 
1532
#ifdef WIN_MAC
 
1533
  bfp = currentFormDataPtr;
 
1534
#else
 
1535
  bfp = GetObjectExtra (i);
 
1536
#endif
 
1537
  if (bfp == NULL) return;
 
1538
 
 
1539
  ans = Message (MSG_OKC, "Currently deletes all GI SeqIDs");
 
1540
  if (ans == ANS_CANCEL) return;
 
1541
 
 
1542
  GatherObjectsInEntity (bfp->input_entityID, 0, NULL, RemoveGIProc, NULL, NULL);
1395
1543
 
1396
1544
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
1397
1545
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
2061
2209
{
2062
2210
#ifdef USE_BLAST3
2063
2211
  PSeqAlignInfoPtr   alip;
2064
 
  Int2               beg = 0;
2065
2212
  ValNodePtr         error_returns;
2066
2213
  PSeqAlignInfoPtr   head_alip = NULL;
2067
2214
  PSeqAlignInfoPtr   head_t_alip = NULL;
3051
3198
    AlignObjects (ALIGN_MIDDLE, (HANDLE) ppt4, (HANDLE) pfp->stringency, NULL);
3052
3199
 
3053
3200
    c = HiddenGroup (w, 4, 0, NULL);
3054
 
    pfp->accept = PushButton (c, "Accept", PowBlastFormAcceptProc);
 
3201
    pfp->accept = DefaultButton (c, "Accept", PowBlastFormAcceptProc);
3055
3202
    SetObjectExtra (pfp->accept, pfp, NULL);
3056
3203
    Disable (pfp->accept);
3057
3204
    PushButton (c, "Cancel", StdCancelButtonProc);
3102
3249
 
3103
3250
#define EXPECT_VALUE 0.01
3104
3251
 
3105
 
static void SearchCDD (BioseqPtr bsp, Pointer userdata)
 
3252
static void BlastCDD (BioseqPtr bsp, Pointer userdata)
3106
3253
 
3107
3254
{
3108
3255
  BlastFieldsPtr       bfp;
3119
3266
 
3120
3267
  /* do blast search */
3121
3268
 
3122
 
  salp = BlastBioseqNet (bl3hp, bsp, "blastp", "oasis_sap", options,
 
3269
  salp = BlastBioseqNet (bl3hp, bsp, "blastp", "cdd", options,
3123
3270
                         NULL, &error_returns, NULL);
3124
3271
 
3125
3272
  /* BlastErrorPrintExtra (error_returns, TRUE, stdout); */
3133
3280
  SeqAlignSetFree (salp);
3134
3281
}
3135
3282
 
3136
 
void SimpleCDDBlastProc (IteM i)
 
3283
extern void SimpleCDDBlastProc (IteM i)
3137
3284
 
3138
3285
{
3139
3286
  BaseFormPtr          bfp;
3167
3314
 
3168
3315
  /* blast fetch enable needed to retrieve by general SeqID */
3169
3316
 
3170
 
  BlastNetBioseqFetchEnable (bl3hp, "oasis_sap", FALSE, TRUE);
 
3317
  BlastNetBioseqFetchEnable (bl3hp, "cdd", FALSE, TRUE);
3171
3318
 
3172
3319
  bf.bl3hp = bl3hp;
3173
3320
  bf.options = options;
3177
3324
 
3178
3325
  FreeCDDRegions (sep);
3179
3326
 
3180
 
  VisitBioseqsInSep (sep, (Pointer) &bf, SearchCDD);
 
3327
  VisitBioseqsInSep (sep, (Pointer) &bf, BlastCDD);
3181
3328
 
3182
3329
  RemoveDuplicateCDDs (sep);
3183
3330
 
3184
3331
  BlastFini (bl3hp);
3185
3332
  options = BLASTOptionDelete (options);
3186
 
  BlastNetBioseqFetchDisable (bl3hp, "oasis_sap", FALSE);
 
3333
  BlastNetBioseqFetchDisable (bl3hp, "cdd", FALSE);
3187
3334
 
3188
3335
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
3189
3336
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
3842
3989
          subtype != FEATDEF_virion &&
3843
3990
          subtype != FEATDEF_mutation &&
3844
3991
          subtype != FEATDEF_allele &&
3845
 
          subtype != FEATDEF_site_ref) {
 
3992
          subtype != FEATDEF_site_ref &&
 
3993
          subtype != FEATDEF_gap) {
3846
3994
        if (StringICmp (featType, curr->typelabel) == 0) {
3847
3995
          str = curr->typelabel;
3848
3996
        }
4293
4441
              subtype != FEATDEF_virion &&
4294
4442
              subtype != FEATDEF_mutation &&
4295
4443
              subtype != FEATDEF_allele &&
4296
 
              subtype != FEATDEF_site_ref) {
 
4444
              subtype != FEATDEF_site_ref &&
 
4445
              subtype != FEATDEF_gap) {
4297
4446
            if (StringICmp (feat, curr->typelabel) == 0) {
4298
4447
              found = curr;
4299
4448
            }
5398
5547
    }
5399
5548
 
5400
5549
    c = HiddenGroup (w, 4, 0, NULL);
5401
 
    b = PushButton (c, "Accept", AutoParseAcceptProc);
 
5550
    b = DefaultButton (c, "Accept", AutoParseAcceptProc);
5402
5551
    SetObjectExtra (b, afp, NULL);
5403
5552
    PushButton (c, "Cancel", StdCancelButtonProc);
5404
5553
 
5709
5858
    SetValue (ppp->tabDelimited, 1);
5710
5859
 
5711
5860
    c = HiddenGroup (w, 4, 0, NULL);
5712
 
    b = PushButton (c, "Accept", PreParseAcceptProc);
 
5861
    b = DefaultButton (c, "Accept", PreParseAcceptProc);
5713
5862
    SetObjectExtra (b, ppp, NULL);
5714
5863
    PushButton (c, "Cancel", StdCancelButtonProc);
5715
5864
 
5779
5928
  return TRUE;
5780
5929
}
5781
5930
 
 
5931
static void DoParseTrinomial (BioSourcePtr biop, Pointer userdata)
 
5932
 
 
5933
{
 
5934
  BinomialOrgNamePtr  bonp;
 
5935
  OrgModPtr           omp;
 
5936
  OrgNamePtr          onp;
 
5937
  OrgRefPtr           orp;
 
5938
  CharPtr             str;
 
5939
 
 
5940
  if (biop == NULL) return;
 
5941
  orp = biop->org;
 
5942
  if (orp == NULL) return;
 
5943
  onp = orp->orgname;
 
5944
  if (onp == NULL) return;
 
5945
  if (onp->choice != 1) return;
 
5946
  bonp = (BinomialOrgNamePtr) onp->data;
 
5947
  if (bonp == NULL) return;
 
5948
  if (StringHasNoText (bonp->subspecies)) return;
 
5949
  for (omp = onp->mod; omp != NULL; omp = omp->next) {
 
5950
    if (omp->subtype == ORGMOD_sub_species) return;
 
5951
  }
 
5952
  str = bonp->subspecies;
 
5953
  if (StringNICmp (str, "subsp. ", 7) == 0) {
 
5954
    str += 7;
 
5955
    if (StringHasNoText (str)) return;
 
5956
  }
 
5957
  omp = OrgModNew ();
 
5958
  if (omp == NULL) return;
 
5959
  omp->subtype = ORGMOD_sub_species;
 
5960
  omp->subname = StringSave (str);
 
5961
  omp->next = onp->mod;
 
5962
  onp->mod = omp;
 
5963
}
 
5964
 
 
5965
extern void ParseTrinomial (IteM i);
 
5966
extern void ParseTrinomial (IteM i)
 
5967
 
 
5968
{
 
5969
  BaseFormPtr  bfp;
 
5970
  SeqEntryPtr  sep;
 
5971
 
 
5972
#ifdef WIN_MAC
 
5973
  bfp = currentFormDataPtr;
 
5974
#else
 
5975
  bfp = GetObjectExtra (i);
 
5976
#endif
 
5977
  if (bfp == NULL) return;
 
5978
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
5979
  if (sep == NULL) return;
 
5980
 
 
5981
  VisitBioSourcesInSep (sep, NULL, DoParseTrinomial);
 
5982
 
 
5983
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
5984
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
5985
  Update ();
 
5986
}
 
5987
 
 
5988
#define REMOVE_QUAL   1
 
5989
#define CONVERT_FEAT  2
 
5990
#define CONVERT_QUAL  3
 
5991
#define EDIT_QUAL     4
 
5992
#define ADD_QUAL      5
 
5993
 
 
5994
typedef struct qualformdata {
 
5995
  FEATURE_FORM_BLOCK
 
5996
 
 
5997
  Int2           type;
 
5998
  LisT           fromfeatlist;
 
5999
  LisT           tofeatlist;
 
6000
  LisT           fromquallist;
 
6001
  LisT           toquallist;
 
6002
  TexT           findthis;
 
6003
  TexT           replacewith;
 
6004
  Uint2          itemtype;
 
6005
  Uint2          subtype;
 
6006
  ObjMgrPtr      omp;
 
6007
  ObjMgrTypePtr  omtp;
 
6008
  Boolean        stringfound;
 
6009
  Boolean        abortconvert;
 
6010
  CharPtr        findStr;
 
6011
  CharPtr        replaceStr;
 
6012
  EnumFieldAssoc PNTR realalist;
 
6013
  EnumFieldAssoc PNTR alist;
 
6014
  ValNodePtr     bsplist;
 
6015
  ButtoN         leaveDlgUp;
 
6016
} QualFormData, PNTR QualFormPtr;
 
6017
 
 
6018
static void LIBCALLBACK AsnWriteQualifierForDCallBack (AsnExpOptStructPtr pAEOS)
 
6019
 
 
6020
{
 
6021
  CharPtr      pchFind;
 
6022
  CharPtr      pchSource;
 
6023
  QualFormPtr  qfp;
 
6024
 
 
6025
  qfp = (QualFormPtr) pAEOS->data;
 
6026
  if (ISA_STRINGTYPE (AsnFindBaseIsa (pAEOS->atp))) {
 
6027
        pchSource = (CharPtr) pAEOS->dvp->ptrvalue;
 
6028
        pchFind = qfp->findStr;
 
6029
        if (StringSearch (pchSource, pchFind) != NULL) {
 
6030
          qfp->stringfound = TRUE;
 
6031
        }
 
6032
  }
 
6033
}
 
6034
 
 
6035
static Boolean QualifierHasSubstring (ObjMgrTypePtr omtp, AsnIoPtr aip, Pointer ptr, QualFormPtr qfp)
 
6036
 
 
6037
{
 
6038
  qfp->stringfound = FALSE;
 
6039
  (omtp->asnwrite) (ptr, aip, NULL);
 
6040
  return qfp->stringfound;
 
6041
}
 
6042
 
 
6043
static void CommentToNote (SeqFeatPtr sfp)
 
6044
 
 
6045
{
 
6046
  GBQualPtr  gbqual;
 
6047
 
 
6048
  if (sfp == NULL || sfp->comment == NULL) return;
 
6049
  gbqual = GBQualNew ();
 
6050
  if (gbqual == NULL) return;
 
6051
  gbqual->qual = StringSave ("note");
 
6052
  gbqual->val = sfp->comment;
 
6053
  sfp->comment = NULL;
 
6054
  gbqual->next = sfp->qual;
 
6055
  sfp->qual = gbqual;
 
6056
}
 
6057
 
 
6058
static void NoteToComment (SeqFeatPtr sfp)
 
6059
 
 
6060
{
 
6061
  GBQualPtr       gbqual;
 
6062
  size_t          len;
 
6063
  GBQualPtr       nextqual;
 
6064
  GBQualPtr PNTR  prevqual;
 
6065
  CharPtr         str;
 
6066
 
 
6067
  if (sfp == NULL) return;
 
6068
  gbqual = sfp->qual;
 
6069
  prevqual = (GBQualPtr PNTR) &(sfp->qual);
 
6070
  while (gbqual != NULL) {
 
6071
    nextqual = gbqual->next;
 
6072
    if (StringICmp (gbqual->qual, "note") == 0) {
 
6073
       *(prevqual) = gbqual->next;
 
6074
       gbqual->next = NULL;
 
6075
       if (sfp->comment == NULL) {
 
6076
         sfp->comment = gbqual->val;
 
6077
       } else {
 
6078
         len = StringLen (sfp->comment) + StringLen (gbqual->val) + 5;
 
6079
         str = MemNew (sizeof (Char) * len);
 
6080
         StringCpy (str, sfp->comment);
 
6081
         StringCat (str, "; ");
 
6082
         StringCat (str, gbqual->val);
 
6083
         sfp->comment = MemFree (sfp->comment);
 
6084
         gbqual->val = MemFree (gbqual->val);
 
6085
         sfp->comment = str;
 
6086
       }
 
6087
       gbqual->val = NULL;
 
6088
       GBQualFree (gbqual);
 
6089
    } else {
 
6090
      prevqual = (GBQualPtr PNTR) &(gbqual->next);
 
6091
    }
 
6092
    gbqual = nextqual;
 
6093
  }
 
6094
}
 
6095
 
 
6096
static void EditQualifierString (QualFormPtr qfp, GBQualPtr gbqual, CharPtr foundit)
 
6097
 
 
6098
{
 
6099
  size_t   diff;
 
6100
  size_t   foundlen;
 
6101
  size_t   replen;
 
6102
  CharPtr  newstring;
 
6103
  CharPtr  tmp;
 
6104
  CharPtr  tmp2;
 
6105
 
 
6106
  if (qfp == NULL || gbqual == NULL || foundit == NULL) return;
 
6107
  foundlen = StringLen (qfp->findStr);
 
6108
  replen = StringLen (qfp->replaceStr);
 
6109
  if (replen > foundlen) {
 
6110
    diff = replen - foundlen;
 
6111
  } else {
 
6112
    diff = foundlen - replen;
 
6113
  }
 
6114
  newstring = MemNew (StringLen (gbqual->val) + diff + 1);
 
6115
  tmp = gbqual->val;
 
6116
  tmp2 = newstring;
 
6117
  while (tmp != foundit) {
 
6118
    *tmp2 = *tmp;
 
6119
    tmp++;
 
6120
    tmp2++;
 
6121
  }
 
6122
  if (qfp->replaceStr != NULL) {
 
6123
    tmp2 = MemCopy (tmp2, qfp->replaceStr, replen);
 
6124
  }
 
6125
  tmp2 += replen;
 
6126
  tmp += foundlen;
 
6127
  tmp2 = StringMove (tmp2, tmp);
 
6128
  gbqual->val = MemFree (gbqual->val);
 
6129
  gbqual->val = newstring;
 
6130
}
 
6131
 
 
6132
#define NUM_SITES 26
 
6133
static CharPtr siteString [NUM_SITES] = {
 
6134
  "", "active site", "binding site", "cleavage site", "inhibition site", "modified site",
 
6135
  "glycosylation site", "myristoylation site", "mutagenized site", "metal binding site",
 
6136
  "phosphorylation site", "acetylation site", "amidation site", "methylation site",
 
6137
  "hydroxylation site", "sulfatation site", "oxidative deamination site",
 
6138
  "pyrrolidone carboxylic acid site", "gamma carboxyglutamic acid site",
 
6139
  "blocked site", "lipid binding site", "np binding site", "DNA binding site",
 
6140
  "signal peptide", "transit peptide", "transmembrane region"
 
6141
};
 
6142
 
 
6143
/*=========================================================================*/
 
6144
/*                                                                         */
 
6145
/* SeqLocAdjustByOffset ()                                                 */
 
6146
/*                                                                         */
 
6147
/*=========================================================================*/
 
6148
 
 
6149
extern void SeqLocAdjustByOffset (SeqLocPtr slp,
 
6150
                                  Int4      offset)
 
6151
{
 
6152
  SeqIntPtr sinp;
 
6153
 
 
6154
  switch (slp->choice) {
 
6155
  case SEQLOC_INT :
 
6156
    sinp = (SeqIntPtr) slp->data.ptrvalue;
 
6157
    if (NULL == sinp)
 
6158
      break;
 
6159
    sinp->from += offset;
 
6160
    sinp->to   += offset;
 
6161
    break;
 
6162
  case SEQLOC_EMPTY :
 
6163
  case SEQLOC_NULL :
 
6164
  case SEQLOC_WHOLE :
 
6165
  case SEQLOC_PNT :
 
6166
  case SEQLOC_PACKED_PNT :
 
6167
  case SEQLOC_PACKED_INT :
 
6168
  case SEQLOC_MIX :
 
6169
  case SEQLOC_EQUIV :
 
6170
  case SEQLOC_BOND :
 
6171
  case SEQLOC_FEAT :
 
6172
  default :
 
6173
    break;
 
6174
  }
 
6175
}
 
6176
 
 
6177
/*=========================================================================*/
 
6178
/*                                                                         */
 
6179
/* MoveProteinFeatures ()                                                  */
 
6180
/*                                                                         */
 
6181
/*=========================================================================*/
 
6182
 
 
6183
static void MoveProteinFeatures (SeqFeatPtr destSfp,
 
6184
                                 SeqFeatPtr srcSfp,
 
6185
                                 Int4Ptr    offsetPtr)
 
6186
{
 
6187
  SeqFeatPtr copySfp;
 
6188
  SeqIdPtr   destSip;
 
6189
 
 
6190
  while (NULL != srcSfp) {
 
6191
 
 
6192
    /* Make a copy of the source feature */
 
6193
    
 
6194
    copySfp = SeqFeatCopy (srcSfp);
 
6195
    copySfp->next = NULL;
 
6196
    
 
6197
    /* Adjust the location of the source feature */
 
6198
    
 
6199
    destSip = SeqLocId (destSfp->location);
 
6200
    SeqLocReplaceLocalID (copySfp->location, destSip);
 
6201
    SeqLocAdjustByOffset (copySfp->location, *offsetPtr);
 
6202
 
 
6203
    /* Attach it to the end of the linked */
 
6204
    /* list of destination features.      */
 
6205
 
 
6206
    if (NULL == destSfp)
 
6207
      destSfp = copySfp;
 
6208
    else {
 
6209
      while (destSfp->next != NULL)
 
6210
        destSfp = destSfp->next;
 
6211
      destSfp->next = copySfp;
 
6212
    }
 
6213
 
 
6214
    /* Mark the source feature to be deleted */
 
6215
    
 
6216
    srcSfp->idx.deleteme = TRUE;
 
6217
 
 
6218
    /* Go to the next source feature */
 
6219
 
 
6220
    srcSfp = srcSfp->next;
 
6221
  }
 
6222
    
 
6223
  /* Return successfully */
 
6224
  
 
6225
  return;
 
6226
}
 
6227
      
 
6228
/*=========================================================================*/
 
6229
/*                                                                         */
 
6230
/* MoveProteinAnnots ()                                                    */
 
6231
/*                                                                         */
 
6232
/*=========================================================================*/
 
6233
 
 
6234
static void MoveProteinAnnots (BioseqPtr destBsp,
 
6235
                               BioseqPtr sourceBsp,
 
6236
                               Int4Ptr   offsetPtr)
 
6237
{
 
6238
  SeqAnnotPtr sourceSap;
 
6239
  SeqAnnotPtr destSap;
 
6240
  SeqAnnotPtr lastDestSap;
 
6241
  SeqFeatPtr  destSfp;
 
6242
  SeqFeatPtr  sourceSfp;
 
6243
 
 
6244
  /* Find end of destination annotation list */
 
6245
 
 
6246
  if (NULL == destBsp->annot)
 
6247
    lastDestSap = destBsp->annot;
 
6248
  else
 
6249
    for (lastDestSap = destBsp->annot;
 
6250
         lastDestSap->next != NULL;
 
6251
         lastDestSap = lastDestSap->next) {
 
6252
    }
 
6253
 
 
6254
  /* For each source SeqAnnot ... */
 
6255
 
 
6256
  sourceSap = sourceBsp->annot;
 
6257
  while (NULL != sourceSap) {
 
6258
 
 
6259
    /* ... if not feature table then */
 
6260
    /*     add to end of dest annots */
 
6261
    
 
6262
    if (sourceBsp->annot->type != 1) {
 
6263
      if (NULL == lastDestSap)
 
6264
        lastDestSap = sourceBsp->annot;
 
6265
      else {
 
6266
        lastDestSap->next = sourceBsp->annot;
 
6267
        lastDestSap = lastDestSap->next;
 
6268
      }
 
6269
      lastDestSap->next = NULL;
 
6270
    }
 
6271
    
 
6272
    /* ... Else if feature table then  */
 
6273
    /*     if there is a dest feature  */
 
6274
    /*     table merge them, otherwise */
 
6275
    /*     add to end of dest annots   */
 
6276
 
 
6277
    else {
 
6278
 
 
6279
      /* Find a destination feature table to merge with */
 
6280
 
 
6281
      destSap = destBsp->annot;
 
6282
      while ((destSap != NULL) && (destSap->type != 1))
 
6283
        destSap = destSap->next;
 
6284
 
 
6285
      /* If no destination feature table found */
 
6286
      /* then just add to end of list.         */
 
6287
 
 
6288
      if (NULL == destSap) {
 
6289
        if (NULL == lastDestSap)
 
6290
          lastDestSap = sourceBsp->annot;
 
6291
        else {
 
6292
          lastDestSap->next = sourceBsp->annot;
 
6293
          lastDestSap = lastDestSap->next;
 
6294
        }
 
6295
        lastDestSap->next = NULL;
 
6296
      }
 
6297
 
 
6298
      /* Otherwise, move all the features */
 
6299
      /* from the source feature table to */
 
6300
      /* the destination one.             */
 
6301
 
 
6302
      else {
 
6303
        sourceSfp = (SeqFeatPtr) sourceBsp->annot->data;
 
6304
        destSfp   = (SeqFeatPtr) destSap->data;
 
6305
        MoveProteinFeatures (destSfp, sourceSfp, offsetPtr);
 
6306
      }
 
6307
    }
 
6308
 
 
6309
    sourceSap->idx.deleteme = TRUE;
 
6310
    sourceSap = sourceSap->next;
 
6311
  }
 
6312
    
 
6313
  return;
 
6314
}
 
6315
 
 
6316
/*=========================================================================*/
 
6317
/*                                                                         */
 
6318
/* ConvertProtsToMatPeptides ()                                            */
 
6319
/*                                                                         */
 
6320
/*=========================================================================*/
 
6321
 
 
6322
static void ConvertProtsToMatPeptides (BioseqPtr bsp)
 
6323
{
 
6324
  SeqAnnotPtr sap;
 
6325
  SeqFeatPtr  sfp;
 
6326
  ProtRefPtr  prp;
 
6327
  SeqLocPtr   slp;
 
6328
 
 
6329
  /* Make sure that it's a protein Bioseq */
 
6330
 
 
6331
  if (! ISA_aa (bsp->mol))
 
6332
    return;
 
6333
 
 
6334
  /* Find all the protein features and */
 
6335
  /* convert them to mat_peptides.     */
 
6336
 
 
6337
  sap = bsp->annot;
 
6338
  while (NULL != sap) {
 
6339
    if (1 == sap->type) {
 
6340
      sfp = (SeqFeatPtr) sap->data;
 
6341
      while (NULL != sfp) {
 
6342
        if (sfp->data.choice == SEQFEAT_PROT) {
 
6343
          prp = (ProtRefPtr) sfp->data.value.ptrvalue;
 
6344
          prp->processed = 2;
 
6345
        }
 
6346
        sfp = sfp->next;
 
6347
      }
 
6348
    }
 
6349
    sap = sap->next;
 
6350
  }
 
6351
  
 
6352
  /* Add a new full-length protein feature */
 
6353
 
 
6354
  prp = ProtRefNew ();
 
6355
  slp = SeqLocIntNew (0, bsp->length-1, 1, bsp->id);
 
6356
  sfp = CreateNewFeatureOnBioseq (bsp, SEQFEAT_PROT, slp);
 
6357
  sfp->data.value.ptrvalue = (Pointer) prp;
 
6358
  sfp->next = NULL;
 
6359
 
 
6360
  /* Return successfully */
 
6361
 
 
6362
  return;
 
6363
}
 
6364
 
 
6365
static void ConvertFirstMatProteinToPolyProtein (
 
6366
  BioseqPtr nucBsp,
 
6367
  SeqFeatPtr firstMatCDS
 
6368
)
 
6369
{
 
6370
 
 
6371
  SeqLocPtr firstMatLoc;
 
6372
  BioseqPtr firstMatBsp;
 
6373
  Uint1     strand;
 
6374
 
 
6375
  if (nucBsp == NULL
 
6376
    || firstMatCDS == NULL)
 
6377
  {
 
6378
    return;
 
6379
  }
 
6380
 
 
6381
  firstMatBsp = BioseqFindFromSeqLoc (firstMatCDS->product);
 
6382
  if (firstMatBsp == NULL) return;
 
6383
 
 
6384
  strand = SeqLocStrand (firstMatCDS->location);
 
6385
  firstMatLoc = firstMatCDS->location;
 
6386
  firstMatCDS->location = SeqLocMerge (nucBsp, firstMatLoc, NULL, FALSE, TRUE, FALSE);
 
6387
  expand_seq_loc (0, nucBsp->length - 1, strand, firstMatCDS->location);
 
6388
 
 
6389
  SetSeqLocPartial (firstMatCDS->location, TRUE, TRUE);
 
6390
  firstMatCDS->partial = TRUE;
 
6391
  SeqLocFree (firstMatLoc);
 
6392
 
 
6393
  firstMatBsp->seq_data = BSFree (firstMatBsp->seq_data);
 
6394
  firstMatBsp->seq_data = ProteinFromCdRegion (firstMatCDS, FALSE);
 
6395
  firstMatBsp->length = BSLen (firstMatBsp->seq_data);
 
6396
  SetSeqFeatProduct (firstMatCDS, firstMatBsp);
 
6397
 
 
6398
}
 
6399
 
 
6400
/*=========================================================================*/
 
6401
/*                                                                         */
 
6402
/* MergeProteinBioseqs ()                                                  */
 
6403
/*                                                                         */
 
6404
/*=========================================================================*/
 
6405
 
 
6406
static Boolean MergeProteinBioseqs (BioseqSetPtr bssp)
 
6407
{
 
6408
  BioseqPtr          firstProtBsp = NULL;
 
6409
  BioseqPtr          bsp;
 
6410
  BioseqPtr          protBsp;
 
6411
  SeqEntryPtr        sep;
 
6412
  Int4               offset;
 
6413
  SeqFeatPtr         cdsSfp;
 
6414
  Boolean            found;
 
6415
  SeqMgrFeatContext  fcontext;
 
6416
 
 
6417
  /* Find the nucleotide bioseq */
 
6418
 
 
6419
  found = FALSE;
 
6420
  for (sep = bssp->seq_set; (sep != NULL) && (found != TRUE); sep = sep->next)
 
6421
    {
 
6422
 
 
6423
      if (!IS_Bioseq (sep))
 
6424
        continue;
 
6425
 
 
6426
      bsp = (BioseqPtr) sep->data.ptrvalue;
 
6427
      if (ISA_na (bsp->mol))
 
6428
        found = TRUE;
 
6429
    }
 
6430
 
 
6431
  if (FALSE == found)
 
6432
    return FALSE;
 
6433
 
 
6434
  /* Use the the CDS features to loop through the protein Bioseqs */
 
6435
 
 
6436
  cdsSfp = SeqMgrGetNextFeature (bsp, NULL, SEQFEAT_CDREGION, 0, &fcontext);
 
6437
  while (NULL != cdsSfp)
 
6438
    {
 
6439
      protBsp = BioseqFindFromSeqLoc (cdsSfp->product);
 
6440
      
 
6441
      /* If it's the first Bioseq then */
 
6442
      /* just save a pointer to it and */
 
6443
      /* get its length to use as an   */
 
6444
      /* offset for the next Bioseq.   */
 
6445
      
 
6446
      if (NULL == firstProtBsp) {
 
6447
        ConvertFirstMatProteinToPolyProtein (bsp, cdsSfp);
 
6448
        protBsp = BioseqFindFromSeqLoc (cdsSfp->product);
 
6449
        firstProtBsp = protBsp;
 
6450
        offset = firstProtBsp->length;
 
6451
      }
 
6452
      
 
6453
      /* Otherwise, move all of its features to */
 
6454
      /* the first prot Bioseq and delete it.   */
 
6455
      
 
6456
      else {
 
6457
 
 
6458
        /* Move all features to 1st protein Bioseq */
 
6459
        offset = fcontext.left / 3;
 
6460
 
 
6461
        MoveProteinAnnots (firstProtBsp, protBsp, &offset);
 
6462
 
 
6463
        /* Mark for deletion the original Bioseq */
 
6464
        protBsp->idx.deleteme = TRUE;
 
6465
        /* Mark for deletion the CDS */
 
6466
        /* pointing to this Bioseq.  */
 
6467
        cdsSfp->idx.deleteme = TRUE;
 
6468
 
 
6469
      }
 
6470
 
 
6471
    cdsSfp = SeqMgrGetNextFeature (protBsp, cdsSfp, SEQFEAT_CDREGION,
 
6472
                                   0, &fcontext);
 
6473
  }
 
6474
 
 
6475
  /* Convert the protein features on the combined */
 
6476
  /* protein bioseq to mat_peptides.              */
 
6477
 
 
6478
  ConvertProtsToMatPeptides (firstProtBsp);
 
6479
 
 
6480
  /* Return successfully */
 
6481
 
 
6482
  return TRUE;
 
6483
}
 
6484
 
 
6485
/*----------------------------------------------------------------------*/
 
6486
/*                                                                      */
 
6487
/* MergeCDSForOneSet ()                                                 */
 
6488
/*                                                                      */
 
6489
/*----------------------------------------------------------------------*/
 
6490
 
 
6491
static Boolean LIBCALLBACK MergeCDSForOneSet (BioseqSetPtr bssp)
 
6492
{
 
6493
  SeqEntryPtr  childSep;
 
6494
  BioseqSetPtr childBssp;
 
6495
 
 
6496
  /* Recurse down from the top until */
 
6497
  /* we find a nuc/prot set.         */
 
6498
 
 
6499
  if (bssp->_class != BioseqseqSet_class_nuc_prot)
 
6500
    {
 
6501
      childSep = bssp->seq_set;
 
6502
      
 
6503
      while (NULL != childSep)
 
6504
        {
 
6505
          if (IS_Bioseq_set (childSep))
 
6506
            {
 
6507
              childBssp = (BioseqSetPtr) childSep->data.ptrvalue;
 
6508
              MergeCDSForOneSet (childBssp);
 
6509
            }
 
6510
          childSep = childSep->next;
 
6511
        }
 
6512
      return FALSE;
 
6513
    }
 
6514
 
 
6515
  /* Combine all of a nucleotide Bioseq's product */
 
6516
  /* protein Bioseqs into one Bioseq.             */
 
6517
 
 
6518
  MergeProteinBioseqs (bssp);
 
6519
 
 
6520
  /* Return successfully */
 
6521
 
 
6522
  return TRUE;
 
6523
}
 
6524
 
 
6525
/*=========================================================================*/
 
6526
/*                                                                         */
 
6527
/* MergeCDS ()                                                             */
 
6528
/*                                                                         */
 
6529
/*=========================================================================*/
 
6530
 
 
6531
extern void MergeCDS (IteM i);
 
6532
 
 
6533
extern void MergeCDS (IteM i)
 
6534
{
 
6535
  BaseFormPtr  bfp;
 
6536
  SeqEntryPtr  sep;
 
6537
  BioseqSetPtr bssp;
 
6538
 
 
6539
  /* Get the top level BioseqSet */
 
6540
 
 
6541
#ifdef WIN_MAC
 
6542
  bfp = currentFormDataPtr;
 
6543
#else
 
6544
  bfp = GetObjectExtra (i);
 
6545
#endif
 
6546
 
 
6547
  if (NULL == bfp)
 
6548
    return;
 
6549
 
 
6550
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
6551
  if (NULL == sep)
 
6552
    return;
 
6553
 
 
6554
  WatchCursor ();
 
6555
  Update ();
 
6556
 
 
6557
  if (IS_Bioseq (sep))
 
6558
    return;
 
6559
  else
 
6560
    bssp = (BioseqSetPtr) sep->data.ptrvalue;
 
6561
 
 
6562
  /* Loop through all the Nuc-Prot sets */
 
6563
 
 
6564
  MergeCDSForOneSet (bssp);
 
6565
 
 
6566
  /* Do an update and return successfully */
 
6567
 
 
6568
  DeleteMarkedObjects (bfp->input_entityID, 0, NULL);
 
6569
  ObjMgrSetDirtyFlag (bfp->input_entityID, TRUE);
 
6570
  ObjMgrSendMsg (OM_MSG_UPDATE, bfp->input_entityID, 0, 0);
 
6571
  ArrowCursor ();
 
6572
  Update ();
 
6573
 
 
6574
  return;
 
6575
}
 
6576
 
 
6577
static void FeatConvertImpToSpecialRNA (SeqFeatPtr sfp,
 
6578
                                        Int2       toFeatSubType)
 
6579
{
 
6580
  RnaRefPtr          rrp;
 
6581
 
 
6582
  rrp = RnaRefNew ();
 
6583
  if (rrp != NULL) {
 
6584
    sfp->data.value.ptrvalue = ImpFeatFree ((ImpFeatPtr) sfp->data.value.ptrvalue);
 
6585
    sfp->data.choice = SEQFEAT_RNA;
 
6586
    sfp->data.value.ptrvalue = (Pointer) rrp;
 
6587
    if (toFeatSubType == FEATDEF_precursor_RNA) {
 
6588
      rrp->type = 1;
 
6589
    } else {
 
6590
      rrp->type = 255;
 
6591
    }
 
6592
  }
 
6593
}
 
6594
 
 
6595
static void FeatConvertGeneToRNA (SeqFeatPtr  sfp,
 
6596
                                  Int2        toFeatSubType,
 
6597
                                  Int2        fromFeat,
 
6598
                                  QualFormPtr qfp)
 
6599
{
 
6600
  Int2               j;
 
6601
  Char               label [256];
 
6602
  BioseqPtr          productbsp;
 
6603
  RnaRefPtr          rrp;
 
6604
  SeqIdPtr           sip;
 
6605
  tRNAPtr            trp;
 
6606
 
 
6607
  rrp = RnaRefNew ();
 
6608
  if (NULL == rrp)
 
6609
    return;
 
6610
 
 
6611
  FeatDefLabel (sfp, label, sizeof (label), OM_LABEL_CONTENT);
 
6612
  if (fromFeat == SEQFEAT_GENE) {
 
6613
    sfp->data.value.ptrvalue =
 
6614
      GeneRefFree ((GeneRefPtr) sfp->data.value.ptrvalue);
 
6615
  } else if (fromFeat == SEQFEAT_CDREGION) {
 
6616
    if (sfp->product != NULL) {
 
6617
      sip = SeqLocId (sfp->product);
 
6618
      if (sip != NULL) {
 
6619
        productbsp = BioseqFind (sip);
 
6620
        if (productbsp != NULL) {
 
6621
          ValNodeAddPointer (&(qfp->bsplist), 0, (Pointer) productbsp);
 
6622
        }
 
6623
      }
 
6624
    }
 
6625
    sfp->data.value.ptrvalue =
 
6626
      CdRegionFree ((CdRegionPtr) sfp->data.value.ptrvalue);
 
6627
  }
 
6628
 
 
6629
  sfp->data.choice = SEQFEAT_RNA;
 
6630
  sfp->data.value.ptrvalue = (Pointer) rrp;
 
6631
  switch (toFeatSubType) {
 
6632
  case FEATDEF_preRNA :
 
6633
    rrp->type = 1;
 
6634
    break;
 
6635
  case FEATDEF_mRNA :
 
6636
    rrp->type = 2;
 
6637
    break;
 
6638
  case FEATDEF_tRNA :
 
6639
    rrp->type = 3;
 
6640
    break;
 
6641
  case FEATDEF_rRNA :
 
6642
    rrp->type = 4;
 
6643
    break;
 
6644
  case FEATDEF_snRNA :
 
6645
    rrp->type = 5;
 
6646
    break;
 
6647
  case FEATDEF_scRNA :
 
6648
    rrp->type = 6;
 
6649
    break;
 
6650
  case FEATDEF_snoRNA :
 
6651
    rrp->type = 7;
 
6652
    break;
 
6653
  case FEATDEF_otherRNA :
 
6654
    rrp->type = 255;
 
6655
    break;
 
6656
  default :
 
6657
    break;
 
6658
  }
 
6659
 
 
6660
  if (toFeatSubType == FEATDEF_tRNA) {
 
6661
    trp = (tRNAPtr) MemNew (sizeof (tRNA));
 
6662
    rrp->ext.choice = 2;
 
6663
    rrp->ext.value.ptrvalue = (Pointer) trp;
 
6664
    if (trp != NULL) {
 
6665
      trp->aa = ParseTRnaString (label, NULL, NULL, FALSE);
 
6666
      trp->aatype = 2;
 
6667
      for (j = 0; j < 6; j++) {
 
6668
        trp->codon [j] = 255;
 
6669
      }
 
6670
    }
 
6671
  } else if (! StringHasNoText (label)) {
 
6672
    rrp->ext.choice = 1;
 
6673
    rrp->ext.value.ptrvalue = StringSave (label);
 
6674
  }
 
6675
}
 
6676
 
 
6677
static void FeatConvertRegionToImp (SeqFeatPtr sfp,
 
6678
                                    Int2       toFeatSubType,
 
6679
                                    EnumFieldAssoc PNTR alist)
 
6680
{
 
6681
  EnumFieldAssocPtr  ap;
 
6682
  GBQualPtr          gbqual;
 
6683
  Int2               i;
 
6684
  ImpFeatPtr         ifp;
 
6685
  CharPtr            str;
 
6686
 
 
6687
  ifp = ImpFeatNew ();
 
6688
  if (NULL == ifp)
 
6689
    return;
 
6690
 
 
6691
  str = (CharPtr) sfp->data.value.ptrvalue;
 
6692
  sfp->data.choice = SEQFEAT_IMP;
 
6693
  sfp->data.value.ptrvalue = (Pointer) ifp;
 
6694
  for (i = 1, ap = alist; ap->name != NULL; i++, ap++) {
 
6695
    if (ap->value == toFeatSubType) {
 
6696
      ifp->key = MemFree (ifp->key);
 
6697
      ifp->key = StringSave (ap->name);
 
6698
    }
 
6699
  }
 
6700
 
 
6701
  if (ifp->key == NULL) {
 
6702
    ifp->key = StringSave ("misc_feature");
 
6703
  }
 
6704
 
 
6705
  if (! StringHasNoText (str)) {
 
6706
    gbqual = GBQualNew ();
 
6707
    if (gbqual != NULL) {
 
6708
      gbqual->qual = StringSave ("note");
 
6709
      gbqual->val = str;
 
6710
      gbqual->next = sfp->qual;
 
6711
      sfp->qual = gbqual;
 
6712
    }
 
6713
  }
 
6714
  
 
6715
}
 
6716
 
 
6717
static void FeatConvertRegionToRNA (SeqFeatPtr sfp,
 
6718
                                    Int2       toFeatSubType)
 
6719
{
 
6720
  RnaRefPtr  rrp;
 
6721
  CharPtr    str;
 
6722
 
 
6723
  rrp = RnaRefNew ();
 
6724
  if (NULL == rrp)
 
6725
    return;
 
6726
 
 
6727
  str = (CharPtr) sfp->data.value.ptrvalue;
 
6728
  sfp->data.choice = SEQFEAT_RNA;
 
6729
  sfp->data.value.ptrvalue = (Pointer) rrp;
 
6730
 
 
6731
  if (toFeatSubType == FEATDEF_precursor_RNA) {
 
6732
    rrp->type = 1;
 
6733
  } else {
 
6734
    rrp->type = 255;
 
6735
  }
 
6736
 
 
6737
  if (! StringHasNoText (str)) {
 
6738
    rrp->ext.choice = 1;
 
6739
    rrp->ext.value.ptrvalue = str;
 
6740
  }
 
6741
 
 
6742
}
 
6743
 
 
6744
static void FeatConvertImpToRNA (SeqFeatPtr sfp,
 
6745
                                 Int2       toFeatSubType)
 
6746
{
 
6747
  RnaRefPtr  rrp;
 
6748
 
 
6749
  rrp = RnaRefNew ();
 
6750
  if (NULL == rrp)
 
6751
    return;
 
6752
 
 
6753
  sfp->data.value.ptrvalue =
 
6754
    ImpFeatFree ((ImpFeatPtr) sfp->data.value.ptrvalue);
 
6755
  sfp->data.choice = SEQFEAT_RNA;
 
6756
  sfp->data.value.ptrvalue = (Pointer) rrp;
 
6757
 
 
6758
  switch (toFeatSubType) {
 
6759
  case FEATDEF_preRNA :
 
6760
    rrp->type = 1;
 
6761
    break;
 
6762
  case FEATDEF_mRNA :
 
6763
    rrp->type = 2;
 
6764
    break;
 
6765
  case FEATDEF_tRNA :
 
6766
    rrp->type = 3;
 
6767
    break;
 
6768
  case FEATDEF_rRNA :
 
6769
    rrp->type = 4;
 
6770
    break;
 
6771
  case FEATDEF_snRNA :
 
6772
    rrp->type = 5;
 
6773
    break;
 
6774
  case FEATDEF_scRNA :
 
6775
    rrp->type = 6;
 
6776
    break;
 
6777
  case FEATDEF_snoRNA :
 
6778
    rrp->type = 7;
 
6779
    break;
 
6780
  case FEATDEF_otherRNA :
 
6781
    rrp->type = 255;
 
6782
    break;
 
6783
  default :
 
6784
    break;
 
6785
  }
 
6786
 
 
6787
}
 
6788
 
 
6789
static void FeatConvertCommentToMiscFeature (SeqFeatPtr sfp)
 
6790
{
 
6791
  ImpFeatPtr ifp;
 
6792
 
 
6793
  if (sfp->data.value.ptrvalue == NULL) {
 
6794
    ifp = ImpFeatNew ();
 
6795
    if (ifp != NULL) {
 
6796
      ifp->key = StringSave ("misc_feature");
 
6797
      sfp->data.choice = SEQFEAT_IMP;
 
6798
      sfp->data.value.ptrvalue = (Pointer) ifp;
 
6799
    }
 
6800
  }
 
6801
}
 
6802
 
 
6803
static void FeatConvertGeneToMiscFeature (SeqFeatPtr sfp)
 
6804
{
 
6805
  ImpFeatPtr  ifp;
 
6806
  GBQualPtr   gbqual;
 
6807
  CharPtr     genelocus;
 
6808
  GeneRefPtr  grp;
 
6809
 
 
6810
  ifp = ImpFeatNew ();
 
6811
  if (NULL == ifp)
 
6812
    return;
 
6813
 
 
6814
  genelocus = NULL;
 
6815
  grp = (GeneRefPtr) sfp->data.value.ptrvalue;
 
6816
  if (grp != NULL) {
 
6817
    genelocus = grp->locus;
 
6818
    grp->locus = NULL;
 
6819
  }
 
6820
 
 
6821
  sfp->data.value.ptrvalue =
 
6822
    GeneRefFree ((GeneRefPtr) sfp->data.value.ptrvalue);
 
6823
  sfp->data.choice = SEQFEAT_IMP;
 
6824
  sfp->data.value.ptrvalue = (Pointer) ifp;
 
6825
  ifp->key = StringSave ("misc_feature");
 
6826
 
 
6827
  if (! StringHasNoText (genelocus)) {
 
6828
    gbqual = GBQualNew ();
 
6829
    if (gbqual != NULL) {
 
6830
      gbqual->qual = StringSave ("gene");
 
6831
      gbqual->val = genelocus;
 
6832
      gbqual->next = sfp->qual;
 
6833
      sfp->qual = gbqual;
 
6834
    }
 
6835
  }
 
6836
 
 
6837
}
 
6838
 
 
6839
static void FeatConvertRNAToMiscFeature (SeqFeatPtr sfp)
 
6840
{
 
6841
  GBQualPtr  gbqual;
 
6842
  ImpFeatPtr ifp;
 
6843
  CharPtr    rnaname;
 
6844
  RnaRefPtr  rrp;
 
6845
 
 
6846
  ifp = ImpFeatNew ();
 
6847
  if (NULL == ifp)
 
6848
    return;
 
6849
 
 
6850
  rnaname = NULL;
 
6851
  rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
 
6852
  if (rrp != NULL) {
 
6853
    if (rrp->ext.choice == 1) {
 
6854
      rnaname = (CharPtr) rrp->ext.value.ptrvalue;
 
6855
      rrp->ext.value.ptrvalue = NULL;
 
6856
    }
 
6857
  }
 
6858
 
 
6859
  sfp->data.value.ptrvalue =
 
6860
    RnaRefFree ((RnaRefPtr) sfp->data.value.ptrvalue);
 
6861
  sfp->data.choice = SEQFEAT_IMP;
 
6862
  sfp->data.value.ptrvalue = (Pointer) ifp;
 
6863
  ifp->key = StringSave ("misc_feature");
 
6864
 
 
6865
  if (! StringHasNoText (rnaname)) {
 
6866
    gbqual = GBQualNew ();
 
6867
    if (gbqual != NULL) {
 
6868
      gbqual->qual = StringSave ("product");
 
6869
      gbqual->val = rnaname;
 
6870
      gbqual->next = sfp->qual;
 
6871
      sfp->qual = gbqual;
 
6872
    }
 
6873
  }
 
6874
 
 
6875
}
 
6876
 
 
6877
static void FeatConvertSiteToMiscFeature (SeqFeatPtr sfp)
 
6878
{
 
6879
  GBQualPtr  gbqual;
 
6880
  ImpFeatPtr ifp;
 
6881
  Int2       sitetype;
 
6882
 
 
6883
  ifp = ImpFeatNew ();
 
6884
  if (NULL == ifp)
 
6885
    return;
 
6886
 
 
6887
  sitetype = (Int2) sfp->data.value.intvalue;
 
6888
  sfp->data.choice = SEQFEAT_IMP;
 
6889
  sfp->data.value.ptrvalue = (Pointer) ifp;
 
6890
  ifp->key = StringSave ("misc_feature");
 
6891
  if (sitetype > 0 && sitetype < NUM_SITES) {
 
6892
    gbqual = GBQualNew ();
 
6893
    if (gbqual != NULL) {
 
6894
      gbqual->qual = StringSave ("note");
 
6895
      gbqual->val = StringSave (siteString [sitetype]);
 
6896
      gbqual->next = sfp->qual;
 
6897
      sfp->qual = gbqual;
 
6898
    }
 
6899
  }
 
6900
 
 
6901
}
 
6902
 
 
6903
static void FeatConvertPeptideToRegion (SeqFeatPtr sfp)
 
6904
{
 
6905
  ProtRefPtr prp;
 
6906
  ValNodePtr vnp;
 
6907
  CharPtr    str;
 
6908
 
 
6909
  prp = (ProtRefPtr) sfp->data.value.ptrvalue;
 
6910
  if (NULL == prp)
 
6911
    return;
 
6912
 
 
6913
  vnp = prp->name;
 
6914
  if (vnp != NULL && vnp->next == NULL) {
 
6915
    str = (CharPtr) vnp->data.ptrvalue;
 
6916
    if (! StringHasNoText (str)) {
 
6917
      vnp->data.ptrvalue = NULL;
 
6918
      sfp->data.value.ptrvalue = ProtRefFree (prp);
 
6919
      sfp->data.choice = SEQFEAT_REGION;
 
6920
      sfp->data.value.ptrvalue = (Pointer) str;
 
6921
    }
 
6922
  }
 
6923
 
 
6924
}
 
6925
 
 
6926
 
 
6927
static void FeatConvertImpToImp (SeqFeatPtr     sfp,
 
6928
                                 Int2           toFeatSubType,
 
6929
                                 EnumFieldAssoc PNTR alist)
 
6930
{
 
6931
  EnumFieldAssocPtr  ap;
 
6932
  Int2               i;
 
6933
  ImpFeatPtr         ifp;
 
6934
 
 
6935
  ifp = (ImpFeatPtr) sfp->data.value.ptrvalue;
 
6936
  if (NULL == ifp)
 
6937
    return;
 
6938
 
 
6939
  for (i = 1, ap = alist; ap->name != NULL; i++, ap++) {
 
6940
    if (ap->value == toFeatSubType) {
 
6941
      ifp->key = MemFree (ifp->key);
 
6942
      ifp->key = StringSave (ap->name);
 
6943
    }
 
6944
  }
 
6945
 
 
6946
}
 
6947
 
 
6948
static void FeatConvertRNAToRNA (SeqFeatPtr sfp,
 
6949
                                 Int2       toFeatSubType)
 
6950
{
 
6951
  RnaRefPtr  rrp;
 
6952
 
 
6953
  rrp = (RnaRefPtr) sfp->data.value.ptrvalue;
 
6954
  if (NULL == rrp)
 
6955
    return;
 
6956
 
 
6957
  switch (toFeatSubType) {
 
6958
  case FEATDEF_preRNA :
 
6959
    rrp->type = 1;
 
6960
    break;
 
6961
  case FEATDEF_mRNA :
 
6962
    rrp->type = 2;
 
6963
    break;
 
6964
  case FEATDEF_tRNA :
 
6965
    rrp->type = 3;
 
6966
    break;
 
6967
  case FEATDEF_rRNA :
 
6968
    rrp->type = 4;
 
6969
    break;
 
6970
  case FEATDEF_snRNA :
 
6971
    rrp->type = 5;
 
6972
    break;
 
6973
  case FEATDEF_scRNA :
 
6974
    rrp->type = 6;
 
6975
    break;
 
6976
  case FEATDEF_snoRNA :
 
6977
    rrp->type = 7;
 
6978
    break;
 
6979
  case FEATDEF_otherRNA :
 
6980
    rrp->type = 255;
 
6981
    break;
 
6982
  default:
 
6983
    break;
 
6984
  }
 
6985
 
 
6986
}
 
6987
 
 
6988
static void FeatConvertProtToProt (SeqFeatPtr sfp,
 
6989
                                   Int2       toFeatSubType)
 
6990
{
 
6991
  ProtRefPtr prp;
 
6992
 
 
6993
  prp = (ProtRefPtr) sfp->data.value.ptrvalue;
 
6994
  if (NULL == prp)
 
6995
    return;
 
6996
 
 
6997
  switch (toFeatSubType) {
 
6998
  case FEATDEF_PROT :
 
6999
    prp->processed = 0;
 
7000
    break;
 
7001
  case FEATDEF_preprotein :
 
7002
    prp->processed = 1;
 
7003
    break;
 
7004
  case FEATDEF_mat_peptide_aa :
 
7005
    prp->processed = 2;
 
7006
    break;
 
7007
  case FEATDEF_sig_peptide_aa :
 
7008
    prp->processed = 3;
 
7009
    break;
 
7010
  case FEATDEF_transit_peptide_aa :
 
7011
    prp->processed = 4;
 
7012
    break;
 
7013
  default :
 
7014
    break;
 
7015
  }
 
7016
 
 
7017
}
 
7018
 
 
7019
/*---------------------------------------------------------------------*/
 
7020
/*                                                                     */
 
7021
/* FeatConvertImpToPeptide () - Convert a given import feature to a    */
 
7022
/*                           protein feature.                          */
 
7023
/*                                                                     */
 
7024
/*    Note : Any of the Import feature's gbquals that can be converted */
 
7025
/*           to protein fields are caught in the automatic cleanup     */
 
7026
/*           called during reindexing, so they don't need to be        */
 
7027
/*           converted here.                                           */
 
7028
/*                                                                     */
 
7029
/*---------------------------------------------------------------------*/
 
7030
 
 
7031
static void FeatConvertImpToPeptide (SeqFeatPtr  sfp,
 
7032
                                     Int2        toFeatSubType,
 
7033
                                     QualFormPtr qfp)
 
7034
{
 
7035
  ImpFeatPtr ifp;
 
7036
  SeqFeatPtr cds;
 
7037
  SeqLocPtr  slp;
 
7038
  SeqFeatPtr newSfp;
 
7039
  Int4       frame;
 
7040
  ProtRefPtr prp;
 
7041
  SeqIdPtr   sip;
 
7042
  BioseqPtr  bsp;
 
7043
 
 
7044
  /* Get the Import Feature */
 
7045
 
 
7046
  ifp = (ImpFeatPtr) sfp->data.value.ptrvalue;
 
7047
  if (NULL == ifp)
 
7048
    return;
 
7049
 
 
7050
  /* Convert the location to a protein location */
 
7051
 
 
7052
  cds = FindBestCds (qfp->input_entityID, sfp->location, NULL, NULL);
 
7053
  if (cds == NULL)
 
7054
    return;
 
7055
 
 
7056
  slp = dnaLoc_to_aaLoc (cds, sfp->location, TRUE, &frame, FALSE);
 
7057
  if (slp == NULL)
 
7058
    return;
 
7059
 
 
7060
  /* Create a new generic feature */
 
7061
 
 
7062
  sip = SeqLocId (cds->product);
 
7063
  if (sip == NULL)
 
7064
    return;
 
7065
 
 
7066
  bsp = BioseqLockById (sip);
 
7067
  if (bsp == NULL)
 
7068
    return;
 
7069
 
 
7070
  newSfp = CreateNewFeatureOnBioseq (bsp, SEQFEAT_PROT, slp);
 
7071
  BioseqUnlock (bsp);
 
7072
  if (newSfp == NULL)
 
7073
    return;
 
7074
 
 
7075
  /* Make it into a protein feature */
 
7076
 
 
7077
  prp = ProtRefNew ();
 
7078
  newSfp->data.value.ptrvalue = (Pointer) prp;
 
7079
  if (NULL == prp)
 
7080
    return;
 
7081
 
 
7082
  switch (toFeatSubType) {
 
7083
    case FEATDEF_mat_peptide_aa :
 
7084
      prp->processed = 2;
 
7085
      break;
 
7086
    case FEATDEF_sig_peptide_aa :
 
7087
      prp->processed = 3;
 
7088
      break;
 
7089
    case FEATDEF_transit_peptide_aa :
 
7090
      prp->processed = 4;
 
7091
      break;
 
7092
  }
 
7093
 
 
7094
  sfp->idx.subtype = toFeatSubType;
 
7095
 
 
7096
  /* Transfer unchanged fields from old feature */
 
7097
 
 
7098
  newSfp->partial     = sfp->partial;
 
7099
  newSfp->excpt       = sfp->excpt;
 
7100
  newSfp->exp_ev      = sfp->exp_ev;
 
7101
  newSfp->pseudo      = sfp->pseudo;
 
7102
  newSfp->comment     = sfp->comment;
 
7103
  newSfp->qual        = sfp->qual;
 
7104
  newSfp->title       = sfp->title;
 
7105
  newSfp->ext         = sfp->ext;
 
7106
  newSfp->cit         = sfp->cit;
 
7107
  newSfp->xref        = sfp->xref;
 
7108
  newSfp->dbxref      = sfp->dbxref;
 
7109
  newSfp->except_text = sfp->except_text;
 
7110
 
 
7111
  /* Null out pointers to transferred fields from old feature  */
 
7112
  /* so that they don't get deleted when the feature does,     */
 
7113
 
 
7114
  sfp->comment     = NULL;
 
7115
  sfp->qual        = NULL;
 
7116
  sfp->title       = NULL;
 
7117
  sfp->ext         = NULL;
 
7118
  sfp->cit         = NULL;
 
7119
  sfp->xref        = NULL;
 
7120
  sfp->dbxref      = NULL;
 
7121
  sfp->except_text = NULL;
 
7122
 
 
7123
  /* Mark the old feature for deletion */
 
7124
 
 
7125
  sfp->idx.deleteme = TRUE;
 
7126
}
 
7127
 
 
7128
/*---------------------------------------------------------------------*/
 
7129
/*                                                                     */
 
7130
/* FeatConvertPeptideToImp () -                                        */
 
7131
/*                                                                     */
 
7132
/*---------------------------------------------------------------------*/
 
7133
 
 
7134
static void FeatConvertPeptideToImp (SeqFeatPtr  sfp,
 
7135
                                     QualFormPtr qfp)
 
7136
{
 
7137
  ProtRefPtr    prp;
 
7138
  SeqFeatPtr    cds;
 
7139
  SeqLocPtr     slp;
 
7140
  ImpFeatPtr    ifp;
 
7141
  CharPtr       name;
 
7142
  CharPtr       ec;
 
7143
  CharPtr       activity;
 
7144
  ValNodePtr    vnp;
 
7145
  GBQualPtr     gbqual;
 
7146
  GBQualPtr     prevGbq;
 
7147
  GBQualPtr     topOfGbqList;
 
7148
  DbtagPtr      dbt;
 
7149
  Char          idStr[64];
 
7150
  ObjectIdPtr   oip;
 
7151
 
 
7152
  /* Make sure that we have a matching peptide feature */
 
7153
 
 
7154
  if (sfp->data.choice != SEQFEAT_PROT)
 
7155
    return;
 
7156
 
 
7157
  prp = (ProtRefPtr) sfp->data.value.ptrvalue;
 
7158
  if (NULL == prp)
 
7159
    return;
 
7160
 
 
7161
  switch (qfp->subtype) {
 
7162
    case FEATDEF_mat_peptide_aa :
 
7163
      if (2 != prp->processed)
 
7164
        return;
 
7165
      break;
 
7166
    case FEATDEF_sig_peptide_aa :
 
7167
      if (3 != prp->processed)
 
7168
        return;
 
7169
      break;
 
7170
    case FEATDEF_transit_peptide_aa :
 
7171
      if (4 != prp->processed)
 
7172
        return;
 
7173
      break;
 
7174
  }
 
7175
 
 
7176
  /* Convert the location from the protein */
 
7177
  /* to the nucleotide Bioseq.             */
 
7178
 
 
7179
  cds = FindBestCds (qfp->input_entityID, NULL, sfp->location, NULL);
 
7180
  if (NULL == cds)
 
7181
    return;
 
7182
 
 
7183
  slp = aaLoc_to_dnaLoc (cds, sfp->location);
 
7184
  if (NULL == slp)
 
7185
    return;
 
7186
  sfp->location = SeqLocFree (sfp->location);
 
7187
  sfp->location = slp;
 
7188
 
 
7189
  /* Create a new import feature and */
 
7190
  /* attach it to the feature.       */
 
7191
 
 
7192
  ifp = ImpFeatNew ();
 
7193
  if (NULL == ifp)
 
7194
    return;
 
7195
 
 
7196
  switch (qfp->subtype) {
 
7197
    case FEATDEF_mat_peptide_aa :
 
7198
      ifp->key = StringSave ("mat_peptide");
 
7199
      break;
 
7200
    case FEATDEF_sig_peptide_aa :
 
7201
      ifp->key = StringSave ("sig_peptide");
 
7202
      break;
 
7203
    case FEATDEF_transit_peptide_aa :
 
7204
      ifp->key = StringSave ("transit_peptide");
 
7205
      break;
 
7206
  }
 
7207
 
 
7208
  sfp->data.choice = SEQFEAT_IMP;
 
7209
  sfp->data.value.ptrvalue = (Pointer) ifp;
 
7210
 
 
7211
  /* Store the protein fields as  */
 
7212
  /* gbqual qualifier/value pairs */
 
7213
 
 
7214
  name = NULL;
 
7215
  vnp = prp->name;
 
7216
  if (vnp != NULL)
 
7217
    name = vnp->data.ptrvalue;
 
7218
  if (name == NULL) 
 
7219
    name = prp->desc;
 
7220
 
 
7221
  if (name != NULL) {
 
7222
    gbqual = GBQualNew ();
 
7223
    if (NULL == gbqual)
 
7224
      return;
 
7225
    topOfGbqList = gbqual;
 
7226
    gbqual->qual = StringSave ("product");
 
7227
    gbqual->val = StringSave (name);
 
7228
  }
 
7229
 
 
7230
  prevGbq = gbqual;
 
7231
 
 
7232
  ec = NULL;
 
7233
  vnp = prp->ec;
 
7234
  if (vnp != NULL)
 
7235
    ec = (CharPtr) vnp->data.ptrvalue;
 
7236
  
 
7237
  if (ec != NULL) {
 
7238
    gbqual = GBQualNew ();
 
7239
    if (NULL == gbqual)
 
7240
      return;
 
7241
    prevGbq->next = gbqual;
 
7242
    gbqual->qual = StringSave ("EC_number");
 
7243
    gbqual->val = StringSave (ec);
 
7244
  }
 
7245
 
 
7246
  prevGbq = gbqual;
 
7247
 
 
7248
  activity = NULL;
 
7249
  vnp = prp->activity;
 
7250
  if (vnp != NULL)
 
7251
    activity = (CharPtr) vnp->data.ptrvalue;
 
7252
  
 
7253
  if (NULL != activity) {
 
7254
    gbqual = GBQualNew ();
 
7255
    if (NULL == gbqual)
 
7256
      return;
 
7257
    prevGbq->next = gbqual;
 
7258
    gbqual->qual = StringSave ("function");
 
7259
    gbqual->val = StringSave (activity);
 
7260
  }
 
7261
 
 
7262
  prevGbq = gbqual;
 
7263
 
 
7264
  for (vnp = prp->db; vnp != NULL; vnp = vnp->next) {
 
7265
    dbt = (DbtagPtr) vnp->data.ptrvalue;
 
7266
    if (NULL == dbt ) 
 
7267
      return;
 
7268
    if (! StringHasNoText (dbt->db)) {
 
7269
      gbqual = GBQualNew ();
 
7270
      if (NULL == gbqual)
 
7271
        return;
 
7272
      prevGbq->next = gbqual;
 
7273
      oip = dbt->tag;
 
7274
      if (oip->str != NULL && (! StringHasNoText (oip->str))) {
 
7275
        sprintf (idStr, "%s:%s", dbt->tag, oip->str);
 
7276
        gbqual->qual = StringSave ("db_xref");
 
7277
        gbqual->val = StringSave (idStr);
 
7278
      } else {
 
7279
        sprintf (idStr, "%s:%ld", dbt->tag, (long) oip->id);
 
7280
        gbqual->qual = StringSave ("db_xref");
 
7281
        gbqual->val = StringSave (idStr);
 
7282
      }
 
7283
      prevGbq = gbqual;
 
7284
    }
 
7285
  }
 
7286
 
 
7287
  /* Insert the new qualifiers in front of any existing ones */
 
7288
 
 
7289
  gbqual->next = sfp->qual;
 
7290
  sfp->qual = topOfGbqList;
 
7291
 
 
7292
  /* Free the obsolete Protein reference */
 
7293
 
 
7294
  ProtRefFree (prp);
 
7295
}
 
7296
 
 
7297
/*---------------------------------------------------------------------*/
 
7298
/*                                                                     */
 
7299
/* FeatConvertBioSrcToRepeatRegion ()                                  */
 
7300
/*                                                                     */
 
7301
/* 9/28/2004: Changed to convert all BioSource features with notes     */
 
7302
/* instead of ones with transposon or insertion_seq qualifiers.        */
 
7303
/*---------------------------------------------------------------------*/
 
7304
 
 
7305
static void FeatConvertBioSrcToRepeatRegion (SeqFeatPtr sfp)
 
7306
{
 
7307
  BioSourcePtr  biop;
 
7308
  GBQualPtr     gbqual;
 
7309
  ImpFeatPtr    ifp;
 
7310
  OrgModPtr     omp = NULL;
 
7311
  SubSourcePtr  ssp = NULL;
 
7312
  CharPtr       text_to_use = NULL;
 
7313
  Int4          text_len = 0;
 
7314
 
 
7315
  /* Only convert transposon and insertion_seq features */
 
7316
 
 
7317
  biop = (BioSourcePtr) sfp->data.value.ptrvalue;
 
7318
  for (ssp = biop->subtype; 
 
7319
       ssp != NULL && ssp->subtype != SUBSRC_other; 
 
7320
       ssp = ssp->next)
 
7321
  {
 
7322
  }
 
7323
  if (biop->org != NULL && biop->org->orgname != NULL)
 
7324
  {
 
7325
    for (omp = biop->org->orgname->mod; 
 
7326
         omp != NULL && omp->subtype != ORGMOD_other; 
 
7327
         omp = omp->next)
 
7328
    {
 
7329
    }
 
7330
  }
 
7331
 
 
7332
  
 
7333
  /* Create a new Import Feature */
 
7334
 
 
7335
  ifp = ImpFeatNew ();
 
7336
  if (NULL == ifp)
 
7337
    return;
 
7338
  ifp->key = StringSave ("repeat_region");
 
7339
 
 
7340
  /* Copy relevant info from the BioSource */
 
7341
  /* feature to the Import feature.        */
 
7342
 
 
7343
  if (ssp != NULL)
 
7344
  {
 
7345
    text_len += StringLen (ssp->name) + 1;
 
7346
  }
 
7347
  if (omp != NULL)
 
7348
  {
 
7349
    text_len += StringLen (omp->subname) + 1;
 
7350
  }
 
7351
  if (text_len > 0)
 
7352
  {
 
7353
    text_to_use = (CharPtr) MemNew (text_len * sizeof (Char));
 
7354
    if (text_to_use != NULL)
 
7355
    {
 
7356
      text_to_use [0] = 0;
 
7357
      if (ssp != NULL)
 
7358
      {
 
7359
        StringCat (text_to_use, ssp->name);
 
7360
      }
 
7361
      if (omp != NULL)
 
7362
      {
 
7363
        if (!StringHasNoText (text_to_use))
 
7364
        {
 
7365
          StringCat (text_to_use, ";");
 
7366
        }
 
7367
        StringCat (text_to_use, omp->subname);
 
7368
      }
 
7369
            gbqual = GBQualNew ();
 
7370
            if (gbqual != NULL) 
 
7371
            {
 
7372
                    gbqual->qual = StringSave ("note");
 
7373
                    gbqual->val = text_to_use;
 
7374
              gbqual->next = sfp->qual;
 
7375
                    sfp->qual = gbqual;
 
7376
            }
 
7377
    }
 
7378
  }
 
7379
    
 
7380
  /* Delete the old BioSource feature */
 
7381
 
 
7382
  sfp->data.value.ptrvalue = BioSourceFree (biop);
 
7383
 
 
7384
  /* Attach the new Import feature in its place */
 
7385
 
 
7386
  sfp->data.choice = SEQFEAT_IMP;
 
7387
  sfp->data.value.ptrvalue = ifp;
 
7388
}
 
7389
 
 
7390
/*-------------------------------------------------------------------------*/
 
7391
/*                                                                         */
 
7392
/* FeatConvert () -- Convert a given feature from one type to another.     */
 
7393
/*                                                                         */
 
7394
/*-------------------------------------------------------------------------*/
 
7395
 
 
7396
static Boolean FeatConvert (QualFormPtr qfp, 
 
7397
                            SeqFeatPtr  sfp,
 
7398
                            Int2        toFeatSubType)
 
7399
{
 
7400
  Uint2 fromFeat;
 
7401
  Uint2 toFeat;
 
7402
 
 
7403
  fromFeat = FindFeatFromFeatDefType (qfp->subtype);
 
7404
  toFeat   = FindFeatFromFeatDefType (toFeatSubType);
 
7405
 
 
7406
  if (fromFeat == SEQFEAT_IMP &&
 
7407
      toFeat   == SEQFEAT_PROT)
 
7408
    FeatConvertImpToPeptide (sfp, toFeatSubType, qfp);
 
7409
  else if (fromFeat == SEQFEAT_PROT &&
 
7410
           toFeat   == SEQFEAT_IMP &&
 
7411
           qfp->subtype == FEATDEF_mat_peptide_aa)
 
7412
    FeatConvertPeptideToImp (sfp, qfp);
 
7413
  else if (fromFeat == SEQFEAT_PROT &&
 
7414
           toFeat   == SEQFEAT_IMP &&
 
7415
           qfp->subtype == FEATDEF_sig_peptide_aa)
 
7416
    FeatConvertPeptideToImp (sfp, qfp);
 
7417
  else if (fromFeat == SEQFEAT_PROT &&
 
7418
           toFeat   == SEQFEAT_IMP &&
 
7419
           qfp->subtype == FEATDEF_transit_peptide_aa)
 
7420
    FeatConvertPeptideToImp (sfp, qfp);
 
7421
  else if (fromFeat == SEQFEAT_IMP &&
 
7422
           (toFeatSubType == FEATDEF_misc_RNA ||
 
7423
            toFeatSubType == FEATDEF_precursor_RNA))
 
7424
    FeatConvertImpToSpecialRNA (sfp, toFeatSubType);
 
7425
  else if ((fromFeat == SEQFEAT_GENE ||
 
7426
            fromFeat == SEQFEAT_CDREGION) &&
 
7427
           toFeat == SEQFEAT_RNA)
 
7428
    FeatConvertGeneToRNA (sfp, toFeatSubType, fromFeat, qfp);
 
7429
  else if (fromFeat == SEQFEAT_REGION &&
 
7430
           toFeat == SEQFEAT_IMP)
 
7431
    FeatConvertRegionToImp (sfp, toFeatSubType, qfp->alist);
 
7432
  else if (fromFeat == SEQFEAT_REGION &&
 
7433
           (toFeatSubType == FEATDEF_misc_RNA ||
 
7434
            toFeatSubType == FEATDEF_precursor_RNA))
 
7435
    FeatConvertRegionToRNA (sfp, toFeatSubType);
 
7436
  else if (fromFeat == SEQFEAT_IMP &&
 
7437
           toFeat == SEQFEAT_RNA)
 
7438
    FeatConvertImpToRNA (sfp, toFeatSubType);
 
7439
  else if (fromFeat == SEQFEAT_COMMENT &&
 
7440
           toFeatSubType == FEATDEF_misc_feature)
 
7441
    FeatConvertCommentToMiscFeature (sfp);
 
7442
  else if (fromFeat == SEQFEAT_GENE &&
 
7443
           toFeatSubType == FEATDEF_misc_feature)
 
7444
    FeatConvertGeneToMiscFeature (sfp);
 
7445
  else if (fromFeat == SEQFEAT_RNA &&
 
7446
           toFeatSubType == FEATDEF_misc_feature)
 
7447
    FeatConvertRNAToMiscFeature (sfp);
 
7448
  else if (fromFeat == SEQFEAT_SITE &&
 
7449
           toFeatSubType == FEATDEF_misc_feature)
 
7450
    FeatConvertSiteToMiscFeature (sfp);
 
7451
  else if (fromFeat == SEQFEAT_PROT &&
 
7452
           (qfp->subtype == FEATDEF_mat_peptide_aa ||
 
7453
            qfp->subtype == FEATDEF_sig_peptide_aa ||
 
7454
            qfp->subtype == FEATDEF_transit_peptide_aa) &&
 
7455
           toFeat == SEQFEAT_REGION)
 
7456
    FeatConvertPeptideToRegion (sfp);
 
7457
  else if (fromFeat == SEQFEAT_BIOSRC &&
 
7458
           toFeat == SEQFEAT_IMP &&
 
7459
           toFeatSubType == FEATDEF_repeat_region)
 
7460
    FeatConvertBioSrcToRepeatRegion (sfp);
 
7461
  else if (fromFeat != toFeat)
 
7462
    {
 
7463
      ArrowCursor ();
 
7464
      Message (MSG_OK, "This conversion not supported - contact"
 
7465
               " sequindev for instructions.");
 
7466
      qfp->abortconvert = TRUE;
 
7467
      return FALSE;
 
7468
    }
 
7469
  else if (fromFeat == SEQFEAT_IMP)
 
7470
    FeatConvertImpToImp (sfp, toFeatSubType, qfp->alist);
 
7471
  else if (fromFeat == SEQFEAT_RNA)
 
7472
    FeatConvertRNAToRNA (sfp, toFeatSubType);
 
7473
  else if (fromFeat == SEQFEAT_PROT)
 
7474
    FeatConvertProtToProt (sfp, toFeatSubType);
 
7475
 
 
7476
  return TRUE;
 
7477
}
 
7478
 
 
7479
static GbFeatName AddQualifierList[] = {
 
7480
 {"allele", Class_text}, {"anticodon", Class_pos_aa},
 
7481
 {"bound_moiety", Class_text},
 
7482
 {"chromosome", Class_text},
 
7483
 {"citation", Class_bracket_int},
 
7484
 {"codon", Class_seq_aa},
 
7485
 {"codon_start", Class_int_or}, {"cons_splice", Class_site},
 
7486
 {"db_xref", Class_text},
 
7487
 {"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
 
7488
 {"evidence", Class_exper}, {"exception", Class_text},
 
7489
 {"frequency", Class_text}, {"function", Class_text},
 
7490
 {"gene", Class_text}, {"gdb_xref", Class_text},
 
7491
 {"insertion_seq", Class_text},
 
7492
 {"label", Class_token},
 
7493
 {"map", Class_text},
 
7494
 {"mod_base", Class_token}, {"note", Class_note},
 
7495
 {"number", Class_number}, {"organism", Class_text},
 
7496
 {"partial", Class_none}, {"PCR_conditions", Class_text},
 
7497
 {"phenotype", Class_text},
 
7498
 {"plasmid", Class_text}, {"product", Class_text},
 
7499
 {"pseudo", Class_none},
 
7500
 {"rearranged", Class_none}, { "replace", Class_text},
 
7501
 {"rpt_family", Class_text}, {"rpt_type", Class_rpt},
 
7502
 {"rpt_unit", Class_token},
 
7503
 {"sequenced_mol", Class_text},
 
7504
 {"standard_name", Class_text},
 
7505
 {"translation", Class_text}, {"transl_except", Class_pos_aa},
 
7506
 {"transl_table", Class_int}, {"transposon", Class_text},
 
7507
 {"usedin", Class_token},
 
7508
 {"focus", Class_none},
 
7509
 {"protein_id", Class_text},
 
7510
 {"organelle", Class_text}, {"transcript_id", Class_text},
 
7511
 {"transgenic", Class_none}, {"environmental_sample", Class_none},
 
7512
 {"locus_tag", Class_text}, {"mol_type", Class_text},
 
7513
};
 
7514
 
 
7515
const Int4 NumAddQualifiers = sizeof (AddQualifierList) / sizeof (GbFeatName);
 
7516
 
 
7517
static Int2 AddQualifierNameValid (CharPtr qual)
 
7518
{
 
7519
   Int2  i;
 
7520
 
 
7521
   for (i = 0; i < NumAddQualifiers && qual != NULL; i++) {
 
7522
       if (StringCmp(qual, AddQualifierList[i].name) == 0)
 
7523
          return (i);
 
7524
   }
 
7525
 
 
7526
   return (-1);
 
7527
 
 
7528
}
 
7529
 
 
7530
static void QualAdd (QualFormPtr qfp,
 
7531
                     SeqFeatPtr  sfp,
 
7532
                     Int2        fromFeatSubType)
 
7533
{
 
7534
  GBQualPtr  gbqual;
 
7535
 
 
7536
  if (fromFeatSubType - 1 > NumAddQualifiers || fromFeatSubType < 1) return;
 
7537
  if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "partial") == 0)
 
7538
  {
 
7539
    sfp->partial = FALSE;
 
7540
  }
 
7541
  else if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
 
7542
  {
 
7543
    sfp->exp_ev = 0;
 
7544
  }
 
7545
  else {
 
7546
    gbqual = GBQualNew ();
 
7547
    if (gbqual != NULL) {
 
7548
      gbqual->qual = 
 
7549
        StringSave (AddQualifierList[fromFeatSubType - 1].name);
 
7550
      gbqual->val = StringSave (qfp->findStr);
 
7551
      gbqual->next = sfp->qual;
 
7552
      sfp->qual = gbqual;
 
7553
      if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7554
        NoteToComment (sfp);
 
7555
    }
 
7556
  }
 
7557
}
 
7558
 
 
7559
static GbFeatName RemoveQualifierList[] = {
 
7560
 {"allele", Class_text}, {"anticodon", Class_pos_aa},
 
7561
 {"bound_moiety", Class_text}, {"citation", Class_bracket_int},
 
7562
 {"codon", Class_seq_aa}, {"codon_start", Class_int_or},
 
7563
 {"cons_splice", Class_site}, {"db_xref", Class_text},
 
7564
 {"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
 
7565
 {"evidence", Class_exper}, {"exception", Class_text},
 
7566
 {"frequency", Class_text}, {"function", Class_text},
 
7567
 {"gene", Class_text}, {"gdb_xref", Class_text},
 
7568
 {"insertion_seq", Class_text}, {"label", Class_token},
 
7569
 {"map", Class_text}, {"mod_base", Class_token},
 
7570
 {"note", Class_note}, {"number", Class_number}, {"organism", Class_text},
 
7571
 {"partial", Class_none}, {"PCR_conditions", Class_text},
 
7572
 {"phenotype", Class_text}, {"plasmid", Class_text},
 
7573
 {"product", Class_text}, {"pseudo", Class_none},
 
7574
 {"rearranged", Class_none}, { "replace", Class_text},
 
7575
 {"rpt_family", Class_text}, {"rpt_type", Class_rpt},
 
7576
 { "rpt_unit", Class_token}, {"sequenced_mol", Class_text},
 
7577
 {"standard_name", Class_text}, {"translation", Class_text},
 
7578
 {"transl_except", Class_pos_aa}, {"transl_table", Class_int},
 
7579
 {"transposon", Class_text}, {"usedin", Class_token},
 
7580
 {"focus", Class_none}, {"protein_id", Class_text},
 
7581
 {"organelle", Class_text}, {"transcript_id", Class_text},
 
7582
 {"transgenic", Class_none}, {"environmental_sample", Class_none},
 
7583
 {"locus_tag", Class_text}, {"mol_type", Class_text},
 
7584
};
 
7585
 
 
7586
const Int4 NumRemoveQualifiers = sizeof (RemoveQualifierList) / sizeof (GbFeatName);
 
7587
 
 
7588
static Int2 RemoveQualifierNameValid (CharPtr qual)
 
7589
{
 
7590
   Int2  i;
 
7591
 
 
7592
   for (i = 0; i < NumRemoveQualifiers && qual != NULL; i++) {
 
7593
       if (StringCmp(qual, RemoveQualifierList[i].name) == 0)
 
7594
          return (i);
 
7595
   }
 
7596
 
 
7597
   return (-1);
 
7598
 
 
7599
}
 
7600
 
 
7601
static GbFeatName ConvertQualifierList[] = {
 
7602
 {"allele", Class_text}, {"anticodon", Class_pos_aa},
 
7603
 {"bound_moiety", Class_text},
 
7604
 {"chromosome", Class_text},
 
7605
 {"citation", Class_bracket_int},
 
7606
 {"codon", Class_seq_aa},
 
7607
 {"codon_start", Class_int_or}, {"cons_splice", Class_site},
 
7608
 {"db_xref", Class_text},
 
7609
 {"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
 
7610
 {"evidence", Class_exper}, {"exception", Class_text},
 
7611
 {"frequency", Class_text}, {"function", Class_text},
 
7612
 {"gene", Class_text}, {"gdb_xref", Class_text},
 
7613
 {"insertion_seq", Class_text},
 
7614
 {"label", Class_token},
 
7615
 {"map", Class_text},
 
7616
 {"mod_base", Class_token}, {"note", Class_note},
 
7617
 {"number", Class_number}, {"organism", Class_text},
 
7618
 {"partial", Class_none}, {"PCR_conditions", Class_text},
 
7619
 {"phenotype", Class_text},
 
7620
 {"plasmid", Class_text}, {"product", Class_text},
 
7621
 {"pseudo", Class_none},
 
7622
 {"rearranged", Class_none}, { "replace", Class_text},
 
7623
 {"rpt_family", Class_text}, {"rpt_type", Class_rpt},
 
7624
 { "rpt_unit", Class_token},
 
7625
 {"sequenced_mol", Class_text},
 
7626
 {"standard_name", Class_text},
 
7627
 {"translation", Class_text}, {"transl_except", Class_pos_aa},
 
7628
 {"transl_table", Class_int}, {"transposon", Class_text},
 
7629
 {"usedin", Class_token},
 
7630
 {"focus", Class_none},
 
7631
 {"protein_id", Class_text},
 
7632
 {"organelle", Class_text}, {"transcript_id", Class_text},
 
7633
 {"transgenic", Class_none}, {"environmental_sample", Class_none},
 
7634
 {"locus_tag", Class_text}, {"mol_type", Class_text},
 
7635
 {"segment", Class_text}
 
7636
};
 
7637
 
 
7638
const Int4 NumConvertQualifiers = sizeof (ConvertQualifierList) / sizeof (GbFeatName);
 
7639
 
 
7640
static Int2 ConvertQualifierNameValid (CharPtr qual)
 
7641
{
 
7642
   Int2  i;
 
7643
 
 
7644
   for (i = 0; i < NumConvertQualifiers && qual != NULL; i++) {
 
7645
       if (StringCmp(qual, ConvertQualifierList[i].name) == 0)
 
7646
          return (i);
 
7647
   }
 
7648
 
 
7649
   return (-1);
 
7650
 
 
7651
}
 
7652
 
 
7653
static GbFeatName EditQualifierList[] = {
 
7654
 {"allele", Class_text}, {"anticodon", Class_pos_aa},
 
7655
 {"bound_moiety", Class_text},
 
7656
 {"chromosome", Class_text},
 
7657
 {"citation", Class_bracket_int},
 
7658
 {"codon", Class_seq_aa},
 
7659
 {"codon_start", Class_int_or}, {"cons_splice", Class_site},
 
7660
 {"db_xref", Class_text},
 
7661
 {"direction", Class_L_R_B}, {"EC_number", Class_ecnum},
 
7662
 {"evidence", Class_exper}, {"exception", Class_text},
 
7663
 {"frequency", Class_text}, {"function", Class_text},
 
7664
 {"gene", Class_text}, {"gdb_xref", Class_text},
 
7665
 {"insertion_seq", Class_text},
 
7666
 {"label", Class_token},
 
7667
 {"map", Class_text},
 
7668
 {"mod_base", Class_token}, {"note", Class_note},
 
7669
 {"number", Class_number}, {"organism", Class_text},
 
7670
 {"partial", Class_none}, {"PCR_conditions", Class_text},
 
7671
 {"phenotype", Class_text},
 
7672
 {"plasmid", Class_text}, {"product", Class_text},
 
7673
 {"pseudo", Class_none},
 
7674
 {"rearranged", Class_none}, { "replace", Class_text},
 
7675
 {"rpt_family", Class_text}, {"rpt_type", Class_rpt},
 
7676
 { "rpt_unit", Class_token},
 
7677
 {"sequenced_mol", Class_text},
 
7678
 {"standard_name", Class_text},
 
7679
 {"translation", Class_text}, {"transl_except", Class_pos_aa},
 
7680
 {"transl_table", Class_int}, {"transposon", Class_text},
 
7681
 {"usedin", Class_token},
 
7682
 {"focus", Class_none},
 
7683
 {"protein_id", Class_text},
 
7684
 {"organelle", Class_text}, {"transcript_id", Class_text},
 
7685
 {"transgenic", Class_none}, {"environmental_sample", Class_none},
 
7686
 {"locus_tag", Class_text}, {"mol_type", Class_text},
 
7687
 {"segment", Class_text}
 
7688
};
 
7689
 
 
7690
const Int4 NumEditQualifiers = sizeof (EditQualifierList) / sizeof (GbFeatName);
 
7691
 
 
7692
static Int2 EditQualifierNameValid (CharPtr qual)
 
7693
{
 
7694
   Int2  i;
 
7695
 
 
7696
   for (i = 0; i < NumEditQualifiers && qual != NULL; i++) {
 
7697
       if (StringCmp(qual, EditQualifierList[i].name) == 0)
 
7698
          return (i);
 
7699
   }
 
7700
 
 
7701
   return (-1);
 
7702
 
 
7703
}
 
7704
 
 
7705
static void QualConvertEditRemove (QualFormPtr qfp,
 
7706
                                   SeqFeatPtr  sfp,
 
7707
                                   Int2        fromFeatSubType,
 
7708
                                   Int2        toFeatSubType)
 
7709
{
 
7710
  CharPtr         foundit;
 
7711
  GBQualPtr       gbqual;
 
7712
  GBQualPtr       nextqual;
 
7713
  GBQualPtr PNTR  prevqual;
 
7714
  Int2            qual;
 
7715
 
 
7716
  if (qfp->type == REMOVE_QUAL)
 
7717
  {
 
7718
    if ( fromFeatSubType < NumRemoveQualifiers
 
7719
        && StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7720
      CommentToNote (sfp);
 
7721
  }
 
7722
  else if (qfp->type == ADD_QUAL)
 
7723
  {
 
7724
    if (fromFeatSubType < NumAddQualifiers
 
7725
        && StringCmp (AddQualifierList[fromFeatSubType -1].name, "note") == 0)
 
7726
      CommentToNote (sfp);
 
7727
  }
 
7728
  else if (qfp->type == CONVERT_QUAL)
 
7729
  {
 
7730
    if (fromFeatSubType < NumConvertQualifiers
 
7731
        && StringCmp (ConvertQualifierList[fromFeatSubType -1].name, "note") == 0)
 
7732
      CommentToNote (sfp);
 
7733
  }
 
7734
  else if (qfp->type == EDIT_QUAL)
 
7735
  {
 
7736
    if (fromFeatSubType < NumEditQualifiers
 
7737
        && StringCmp (EditQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7738
      CommentToNote (sfp);
 
7739
  }
 
7740
  else
 
7741
  {
 
7742
    if (fromFeatSubType - 1 == GBQUAL_note ||
 
7743
        toFeatSubType - 1   == GBQUAL_note)
 
7744
      CommentToNote (sfp);
 
7745
  }
 
7746
 
 
7747
  if (qfp->type != CONVERT_QUAL) {
 
7748
    if (qfp->type == REMOVE_QUAL)
 
7749
    {
 
7750
      if (fromFeatSubType < NumRemoveQualifiers)
 
7751
      {
 
7752
        if (StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "partial") == 0)
 
7753
          sfp->partial = FALSE;
 
7754
        else if (StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
 
7755
          sfp->exp_ev = 0;
 
7756
      }
 
7757
    }
 
7758
    else if (qfp->type == ADD_QUAL)
 
7759
    {
 
7760
      if (fromFeatSubType < NumAddQualifiers)
 
7761
      {
 
7762
        if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "partial") == 0)
 
7763
          sfp->partial = FALSE;
 
7764
        else if (StringCmp (AddQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
 
7765
          sfp->exp_ev = 0;
 
7766
      }
 
7767
    }
 
7768
    else if (qfp->type == EDIT_QUAL)
 
7769
    {
 
7770
      if (fromFeatSubType < NumEditQualifiers)
 
7771
      {
 
7772
        if (StringCmp (EditQualifierList[fromFeatSubType - 1].name, "partial") == 0)
 
7773
          sfp->partial = FALSE;
 
7774
        else if (StringCmp (EditQualifierList[fromFeatSubType - 1].name, "evidence") == 0)
 
7775
          sfp->exp_ev = 0;
 
7776
      }
 
7777
    }
 
7778
    else
 
7779
    {
 
7780
      if (fromFeatSubType - 1 == GBQUAL_partial)
 
7781
        sfp->partial = FALSE;
 
7782
      else if (fromFeatSubType - 1 == GBQUAL_evidence)
 
7783
        sfp->exp_ev = 0;
 
7784
    }
 
7785
  }
 
7786
 
 
7787
  gbqual = sfp->qual;
 
7788
  prevqual = (GBQualPtr PNTR) &(sfp->qual);
 
7789
 
 
7790
  while (gbqual != NULL) {
 
7791
    nextqual = gbqual->next;
 
7792
    if (qfp->type == REMOVE_QUAL)
 
7793
      qual = RemoveQualifierNameValid (gbqual->qual);
 
7794
    else if (qfp->type == ADD_QUAL)
 
7795
      qual = AddQualifierNameValid (gbqual->qual);
 
7796
    else if (qfp->type == CONVERT_QUAL)
 
7797
      qual = ConvertQualifierNameValid (gbqual->qual);
 
7798
    else if (qfp->type == EDIT_QUAL)
 
7799
      qual = EditQualifierNameValid (gbqual->qual);
 
7800
    else
 
7801
      qual = GBQualNameValid (gbqual->qual);
 
7802
    if (qual > -1 && qual == fromFeatSubType - 1) {
 
7803
      if (qfp->type == CONVERT_QUAL) {
 
7804
        gbqual->qual = MemFree (gbqual->qual);
 
7805
        gbqual->qual = StringSave (ConvertQualifierList [toFeatSubType - 1].name);
 
7806
        prevqual = (GBQualPtr PNTR) &(gbqual->next);
 
7807
      } else if (qfp->type == EDIT_QUAL) {
 
7808
        foundit = StringStr (gbqual->val, qfp->findStr);
 
7809
        if (foundit != NULL) {
 
7810
          EditQualifierString (qfp, gbqual, foundit);
 
7811
        }
 
7812
        prevqual = (GBQualPtr PNTR) &(gbqual->next);
 
7813
      } else {
 
7814
        *(prevqual) = gbqual->next;
 
7815
        gbqual->next = NULL;
 
7816
        GBQualFree (gbqual);
 
7817
      }
 
7818
    } else {
 
7819
      prevqual = (GBQualPtr PNTR) &(gbqual->next);
 
7820
    }
 
7821
    gbqual = nextqual;
 
7822
  }
 
7823
 
 
7824
  if (qfp->type == REMOVE_QUAL)
 
7825
  {
 
7826
    if ( fromFeatSubType < NumRemoveQualifiers
 
7827
        && StringCmp (RemoveQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7828
      NoteToComment (sfp);
 
7829
  }
 
7830
  else if (qfp->type == ADD_QUAL)
 
7831
  {
 
7832
    if ( fromFeatSubType < NumAddQualifiers
 
7833
        && StringCmp (AddQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7834
      NoteToComment (sfp);
 
7835
  }
 
7836
  else if (qfp->type == CONVERT_QUAL)
 
7837
  {
 
7838
    if ( fromFeatSubType < NumConvertQualifiers
 
7839
        && StringCmp (ConvertQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7840
      NoteToComment (sfp);
 
7841
  }
 
7842
  else if (qfp->type == EDIT_QUAL)
 
7843
  {
 
7844
    if ( fromFeatSubType < NumEditQualifiers
 
7845
        && StringCmp (EditQualifierList[fromFeatSubType - 1].name, "note") == 0)
 
7846
      NoteToComment (sfp);
 
7847
  }
 
7848
  else
 
7849
  {
 
7850
    if (fromFeatSubType - 1 == GBQUAL_note ||
 
7851
        toFeatSubType - 1   == GBQUAL_note) {
 
7852
      NoteToComment (sfp);
 
7853
    }
 
7854
  }
 
7855
}
 
7856
 
 
7857
static void CommonQualifierCallback (SeqEntryPtr sep, Pointer mydata, Int4 index, Int2 indent)
 
7858
 
 
7859
{
 
7860
  AsnExpOptPtr       aeop;
 
7861
  AsnIoPtr           aip;
 
7862
  BioseqPtr          bsp;
 
7863
  BioseqSetPtr       bssp;
 
7864
  UIEnum             enumval;
 
7865
  Int2               lookfor;
 
7866
  Int2               newval;
 
7867
  SeqAnnotPtr        nextsap;
 
7868
  SeqFeatPtr         nextsfp;
 
7869
  Boolean            notext;
 
7870
  ObjMgrTypePtr      omtp;
 
7871
  QualFormPtr        qfp;
 
7872
  SeqAnnotPtr        sap;
 
7873
  SeqFeatPtr         sfp;
 
7874
  Uint2              subtype;
 
7875
  Int2               val;
 
7876
 
 
7877
  if (mydata == NULL) return;
 
7878
  if (sep == NULL || sep->data.ptrvalue == NULL) return;
 
7879
  qfp = (QualFormPtr) mydata;
 
7880
  if (qfp == NULL) return;
 
7881
  if (qfp->abortconvert) return;
 
7882
  omtp = qfp->omtp;
 
7883
  if (omtp == NULL || omtp->subtypefunc == NULL) return;
 
7884
  if (IS_Bioseq (sep)) {
 
7885
    bsp = (BioseqPtr) sep->data.ptrvalue;
 
7886
    sap = bsp->annot;
 
7887
  } else if (IS_Bioseq_set (sep)) {
 
7888
    bssp = (BioseqSetPtr) sep->data.ptrvalue;
 
7889
    sap = bssp->annot;
 
7890
  } else return;
 
7891
  val = 0;
 
7892
  newval = 0;
 
7893
  switch (qfp->type) {
 
7894
    case REMOVE_QUAL :
 
7895
      val = GetValue (qfp->fromquallist);
 
7896
      if (val == 0) return;
 
7897
      break;
 
7898
    case CONVERT_FEAT :
 
7899
      if (GetEnumPopup ((PopuP) qfp->tofeatlist, qfp->alist, &enumval)) {
 
7900
        newval = (Int2) enumval;
 
7901
      }
 
7902
      if (newval == 0) return;
 
7903
      break;
 
7904
    case CONVERT_QUAL :
 
7905
      val = GetValue (qfp->fromquallist);
 
7906
      if (val == 0) return;
 
7907
      newval = GetValue (qfp->toquallist);
 
7908
      if (newval == 0) return;
 
7909
      break;
 
7910
    case EDIT_QUAL :
 
7911
      val = GetValue (qfp->fromquallist);
 
7912
      if (val == 0) return;
 
7913
      break;
 
7914
    case ADD_QUAL :
 
7915
      val = GetValue (qfp->fromquallist);
 
7916
      if (val == 0) return;
 
7917
      break;
 
7918
    default :
 
7919
      return;
 
7920
  }
 
7921
  qfp->findStr = JustSaveStringFromText (qfp->findthis);
 
7922
  notext = StringHasNoText (qfp->findStr);
 
7923
  qfp->replaceStr = JustSaveStringFromText (qfp->replacewith);
 
7924
  if (qfp->type == EDIT_QUAL && notext) return;
 
7925
  if (qfp->type == ADD_QUAL && notext) return;
 
7926
  aip = AsnIoNullOpen ();
 
7927
  aeop = AsnExpOptNew (aip, NULL, NULL, AsnWriteQualifierForDCallBack);
 
7928
  if (aeop != NULL) {
 
7929
    aeop->user_data = (Pointer) qfp;
 
7930
  }
 
7931
  while (sap != NULL) 
 
7932
  {
 
7933
    nextsap = sap->next;
 
7934
    if (sap->type == 1) 
 
7935
    {
 
7936
      sfp = (SeqFeatPtr) sap->data;
 
7937
      while (sfp != NULL) 
 
7938
      {
 
7939
        nextsfp = sfp->next;
 
7940
        subtype = (*(omtp->subtypefunc)) ((Pointer) sfp);
 
7941
        lookfor = qfp->subtype;
 
7942
 
 
7943
              if ((SEQFEAT_IMP == sfp->data.choice) &&
 
7944
                  ((subtype == FEATDEF_mat_peptide ||
 
7945
                    subtype == FEATDEF_sig_peptide ||
 
7946
                    subtype == FEATDEF_transit_peptide)))
 
7947
              {
 
7948
                lookfor = subtype;              
 
7949
              }
 
7950
 
 
7951
        if (qfp->type != CONVERT_FEAT)
 
7952
        {
 
7953
          if (qfp->subtype == 0)
 
7954
            lookfor = subtype;
 
7955
        }
 
7956
 
 
7957
        if (subtype == lookfor) 
 
7958
        {
 
7959
          if (qfp->type == ADD_QUAL)
 
7960
          {
 
7961
                  QualAdd (qfp, sfp, val);            
 
7962
          }
 
7963
                else if (notext || QualifierHasSubstring (omtp, aip,
 
7964
                                                      (Pointer) sfp, qfp)) 
 
7965
                                  {
 
7966
            if (qfp->type == CONVERT_FEAT) 
 
7967
            {
 
7968
                    if (FeatConvert (qfp, sfp, newval) == FALSE)
 
7969
                    {
 
7970
                            return;
 
7971
                    }
 
7972
                  }
 
7973
                  else
 
7974
                  {
 
7975
                    QualConvertEditRemove (qfp, sfp, val, newval);
 
7976
                  }
 
7977
          }
 
7978
          if (qfp->type == REMOVE_QUAL
 
7979
              && val < NumRemoveQualifiers
 
7980
              && StringCmp (RemoveQualifierList[val - 1].name, "citation") == 0) 
 
7981
          {
 
7982
            sfp->cit = PubSetFree (sfp->cit);
 
7983
          }
 
7984
        }
 
7985
        sfp = nextsfp;
 
7986
      }
 
7987
    }
 
7988
    sap = nextsap;
 
7989
  }
 
7990
  AsnIoClose (aip);
 
7991
}
 
7992
 
 
7993
static void DoProcessQualifier (ButtoN b)
 
7994
 
 
7995
{
 
7996
  BioseqPtr      bsp;
 
7997
  Uint2          choice;
 
7998
  UIEnum         enumval;
 
7999
  Uint2          itemID;
 
8000
  Uint2          newchoice;
 
8001
  OMProcControl  ompc;
 
8002
  QualFormPtr    qfp;
 
8003
  SeqEntryPtr    sep;
 
8004
  ValNodePtr     tmp;
 
8005
  Int2           val;
 
8006
 
 
8007
  /* Check for valid conditions */
 
8008
 
 
8009
  qfp = (QualFormPtr) GetObjectExtra (b);
 
8010
  if (qfp == NULL) return;
 
8011
  sep = GetTopSeqEntryForEntityID (qfp->input_entityID);
 
8012
  if (sep == NULL) return;
 
8013
 
 
8014
  /* Hide the popup and initialize */
 
8015
 
 
8016
  Hide (qfp->form);
 
8017
  WatchCursor ();
 
8018
  Update ();
 
8019
  qfp->itemtype = OBJ_SEQFEAT;
 
8020
  qfp->subtype = 0;
 
8021
  qfp->abortconvert = FALSE;
 
8022
  qfp->bsplist = NULL;
 
8023
 
 
8024
  /* Get the 'from' feature type */
 
8025
 
 
8026
  val = 0;
 
8027
  if (GetEnumPopup ((PopuP) qfp->fromfeatlist, qfp->alist, &enumval)) {
 
8028
    val = (Int2) enumval;
 
8029
  }
 
8030
  if (val > 0) {
 
8031
    qfp->subtype = val;
 
8032
  }
 
8033
 
 
8034
  /**/
 
8035
 
 
8036
  if (qfp->subtype != 0 || qfp->type != CONVERT_FEAT) {
 
8037
    qfp->omp = ObjMgrGet ();
 
8038
    qfp->omtp = NULL;
 
8039
    if (qfp->omp != NULL) {
 
8040
      qfp->omtp = ObjMgrTypeFind (qfp->omp, OBJ_SEQFEAT, NULL, NULL);
 
8041
    }
 
8042
    if (qfp->type == CONVERT_FEAT) {
 
8043
      val = 0;
 
8044
      if (GetEnumPopup ((PopuP) qfp->tofeatlist, qfp->alist, &enumval)) {
 
8045
        val = (Int2) enumval;
 
8046
      }
 
8047
      if (val > 0) {
 
8048
        choice = FindFeatFromFeatDefType (qfp->subtype);
 
8049
        newchoice = FindFeatFromFeatDefType (val);
 
8050
 
 
8051
        if (choice == SEQFEAT_IMP && newchoice == SEQFEAT_CDREGION) {
 
8052
          ArrowCursor ();
 
8053
          Update ();
 
8054
          qfp->findStr = JustSaveStringFromText (qfp->findthis);
 
8055
          PrepareToConvertToCDS (sep, qfp->input_entityID,
 
8056
                                 qfp->subtype, qfp->findStr);
 
8057
          if (GetStatus (qfp->leaveDlgUp)) {
 
8058
            Show (qfp->form);
 
8059
          } else {
 
8060
            Remove (qfp->form);
 
8061
          }
 
8062
          return;
 
8063
        }
 
8064
      }
 
8065
    }
 
8066
    if (qfp->itemtype != 0 && qfp->omtp != NULL) {
 
8067
      SeqEntryExplore (sep, (Pointer) qfp, CommonQualifierCallback);
 
8068
    }
 
8069
  }
 
8070
 
 
8071
  /**/
 
8072
 
 
8073
  ArrowCursor ();
 
8074
  Update ();
 
8075
  if (qfp->bsplist != NULL) {
 
8076
    if (Message (MSG_YN, "Remove protein products?") == ANS_YES) {
 
8077
      for (tmp = qfp->bsplist; tmp != NULL; tmp = tmp->next) {
 
8078
        bsp = (BioseqPtr) tmp->data.ptrvalue;
 
8079
        itemID = GetItemIDGivenPointer (qfp->input_entityID, OBJ_BIOSEQ, (Pointer) bsp);
 
8080
        if (itemID > 0) {
 
8081
          MemSet ((Pointer) (&ompc), 0, sizeof (OMProcControl));
 
8082
          ompc.do_not_reload_from_cache = TRUE;
 
8083
          ompc.input_entityID = qfp->input_entityID;
 
8084
          ompc.input_itemID = itemID;
 
8085
          ompc.input_itemtype = OBJ_BIOSEQ;
 
8086
          if (! DetachDataForProc (&ompc, FALSE)) {
 
8087
            Message (MSG_POSTERR, "DetachDataForProc failed");
 
8088
          }
 
8089
        }
 
8090
      }
 
8091
    }
 
8092
    RenormalizeNucProtSets (sep, TRUE);
 
8093
  }
 
8094
 
 
8095
  /* Force an update */
 
8096
 
 
8097
  DeleteMarkedObjects (qfp->input_entityID, 0, NULL);
 
8098
  ObjMgrSetDirtyFlag (qfp->input_entityID, TRUE);
 
8099
  ObjMgrSendMsg (OM_MSG_UPDATE, qfp->input_entityID, 0, 0);
 
8100
  if (GetStatus (qfp->leaveDlgUp)) {
 
8101
    Show (qfp->form);
 
8102
  } else {
 
8103
    Remove (qfp->form);
 
8104
  }
 
8105
}
 
8106
 
 
8107
static void QualMessageProc (ForM f, Int2 mssg)
 
8108
 
 
8109
{
 
8110
  QualFormPtr  qfp;
 
8111
 
 
8112
  qfp = (QualFormPtr) GetObjectExtra (f);
 
8113
  if (qfp != NULL) {
 
8114
    if (qfp->appmessage != NULL) {
 
8115
      qfp->appmessage (f, mssg);
 
8116
    }
 
8117
  }
 
8118
}
 
8119
 
 
8120
static void CleanupQualForm (GraphiC g, VoidPtr data)
 
8121
 
 
8122
{
 
8123
  Int2         j;
 
8124
  QualFormPtr  qfp;
 
8125
 
 
8126
  qfp = (QualFormPtr) data;
 
8127
  if (qfp != NULL) {
 
8128
    MemFree (qfp->findStr);
 
8129
    MemFree (qfp->replaceStr);
 
8130
    if (qfp->alist != NULL
 
8131
      && qfp->alist != qfp->realalist
 
8132
      && qfp->alist != qfp->realalist + 1)
 
8133
    {
 
8134
      for (j = 0; qfp->alist [j].name != NULL; j++) {
 
8135
        MemFree (qfp->alist [j].name);
 
8136
      }
 
8137
      MemFree (qfp->alist);
 
8138
    }
 
8139
    if (qfp->realalist != NULL) {
 
8140
      for (j = 0; qfp->realalist [j].name != NULL; j++) {
 
8141
        MemFree (qfp->realalist [j].name);
 
8142
      }
 
8143
    }
 
8144
    MemFree (qfp->realalist);
 
8145
    ValNodeFree (qfp->bsplist);
 
8146
  }
 
8147
  StdCleanupFormProc (g, data);
 
8148
}
 
8149
 
 
8150
static void ProcessQualifier (IteM i, Int2 type)
 
8151
 
 
8152
{
 
8153
  EnumFieldAssocPtr  ap;
 
8154
  BaseFormPtr        bfp;
 
8155
  ButtoN             b;
 
8156
  GrouP              c;
 
8157
  GrouP              g;
 
8158
  GrouP              h;
 
8159
  Int2               j;
 
8160
  GrouP              k;
 
8161
  Int2               listHeight;
 
8162
  QualFormPtr        qfp;
 
8163
  SeqEntryPtr        sep;
 
8164
  StdEditorProcsPtr  sepp;
 
8165
  CharPtr            str;
 
8166
  CharPtr            title;
 
8167
  WindoW             w;
 
8168
 
 
8169
#ifdef WIN_MAC
 
8170
  bfp = currentFormDataPtr;
 
8171
#else
 
8172
  bfp = GetObjectExtra (i);
 
8173
#endif
 
8174
  if (bfp == NULL) return;
 
8175
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
8176
  if (sep == NULL) return;
 
8177
  qfp = (QualFormPtr) MemNew (sizeof (QualFormData));
 
8178
  if (qfp == NULL) return;
 
8179
  qfp->type = type;
 
8180
  switch (type) {
 
8181
    case REMOVE_QUAL :
 
8182
      title = "Qualifier Removal";
 
8183
      break;
 
8184
    case CONVERT_FEAT :
 
8185
      title = "Feature Conversion";
 
8186
      break;
 
8187
    case CONVERT_QUAL :
 
8188
      title = "Qualifier Conversion";
 
8189
      break;
 
8190
    case EDIT_QUAL :
 
8191
      title = "Edit Qualifier";
 
8192
      break;
 
8193
    case ADD_QUAL :
 
8194
      title = "Add Qualifier";
 
8195
      break;
 
8196
    default :
 
8197
      title = "?";
 
8198
      break;
 
8199
  }
 
8200
  w = FixedWindow (-50, -33, -10, -10, title, StdCloseWindowProc);
 
8201
  SetObjectExtra (w, qfp, CleanupQualForm);
 
8202
  qfp->form = (ForM) w;
 
8203
  qfp->formmessage = QualMessageProc;
 
8204
 
 
8205
  sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
 
8206
  if (sepp != NULL) {
 
8207
    SetActivate (w, sepp->activateForm);
 
8208
    qfp->appmessage = sepp->handleMessages;
 
8209
  }
 
8210
 
 
8211
  qfp->input_entityID = bfp->input_entityID;
 
8212
  qfp->input_itemID = bfp->input_itemID;
 
8213
  qfp->input_itemtype = bfp->input_itemtype;
 
8214
 
 
8215
  if (type == CONVERT_FEAT) {
 
8216
    ap = import_featdef_alist (TRUE, FALSE, TRUE);
 
8217
  } else {
 
8218
    ap = import_featdef_alist (FALSE, FALSE, FALSE);
 
8219
  }
 
8220
  SortEnumFieldAssocPtrArray (ap, CompareImpFeatEnumFieldAssoc);
 
8221
  qfp->realalist = ap;
 
8222
  if (type == CONVERT_FEAT) {
 
8223
    ap++;
 
8224
  } else {
 
8225
    ap->name = MemFree (ap->name);
 
8226
    ap->name = StringSave ("[ALL FEATURES]");
 
8227
  }
 
8228
 
 
8229
  if (type == CONVERT_FEAT)
 
8230
  { 
 
8231
    qfp->alist = InsertMostUsedFeatureEnumFieldAssoc (ap);
 
8232
  }
 
8233
  else
 
8234
  {
 
8235
    qfp->alist = ap;
 
8236
  }
 
8237
 
 
8238
  h = HiddenGroup (w, -1, 0, NULL);
 
8239
  SetGroupSpacing (h, 10, 10);
 
8240
 
 
8241
  g = HiddenGroup (h, 0, 2, NULL);
 
8242
 
 
8243
  if (type == CONVERT_FEAT) {
 
8244
    StaticPrompt (g, "From Feature", 0, 0, programFont, 'c');
 
8245
  } else {
 
8246
    StaticPrompt (g, "Feature", 0, 0, programFont, 'c');
 
8247
  }
 
8248
  if (indexerVersion) {
 
8249
    listHeight = 16;
 
8250
  } else {
 
8251
    listHeight = 8;
 
8252
  }
 
8253
  qfp->fromfeatlist = SingleList (g, 10, listHeight, NULL);
 
8254
  for (ap = qfp->alist; ap->name != NULL; ap++) {
 
8255
    ListItem (qfp->fromfeatlist, ap->name);
 
8256
  }
 
8257
 
 
8258
  if (type == CONVERT_FEAT) {
 
8259
    StaticPrompt (g, "To Feature", 0, 0, programFont, 'c');
 
8260
    qfp->tofeatlist = SingleList (g, 10, listHeight, NULL);
 
8261
    for (ap = qfp->alist; ap->name != NULL; ap++) {
 
8262
      ListItem (qfp->tofeatlist, ap->name);
 
8263
    }
 
8264
  } else {
 
8265
    if (type == CONVERT_QUAL) {
 
8266
      StaticPrompt (g, "From Qualifier", 0, 0, programFont, 'c');
 
8267
    } else {
 
8268
      StaticPrompt (g, "Qualifier", 0, 0, programFont, 'c');
 
8269
    }
 
8270
    qfp->fromquallist = SingleList (g, 10, listHeight, NULL);
 
8271
    if (type == REMOVE_QUAL)
 
8272
    {
 
8273
      for (j = 0; j < NumRemoveQualifiers; j++) {
 
8274
        ListItem (qfp->fromquallist, RemoveQualifierList [j].name);
 
8275
      }
 
8276
    }
 
8277
    else if (type == ADD_QUAL)
 
8278
    {
 
8279
      for (j = 0; j < NumAddQualifiers; j++) {
 
8280
        ListItem (qfp->fromquallist, AddQualifierList [j].name);
 
8281
      }
 
8282
    }
 
8283
    else if (type == CONVERT_QUAL)
 
8284
    {
 
8285
      for (j = 0; j < NumConvertQualifiers; j++) {
 
8286
        ListItem (qfp->fromquallist, ConvertQualifierList [j].name);
 
8287
      }
 
8288
    }
 
8289
    else if (type == EDIT_QUAL)
 
8290
    {
 
8291
      for (j = 0; j < NumEditQualifiers; j++) {
 
8292
        ListItem (qfp->fromquallist, EditQualifierList [j].name);
 
8293
      }
 
8294
    }
 
8295
    else
 
8296
    {
 
8297
      for (j = 0; j < ParFlat_TOTAL_GBQUAL; j++) {
 
8298
        ListItem (qfp->fromquallist, ParFlat_GBQual_names [j].name);
 
8299
      }
 
8300
    }
 
8301
    if (type == CONVERT_QUAL) {
 
8302
      StaticPrompt (g, "To Qualifier", 0, 0, programFont, 'c');
 
8303
      qfp->toquallist = SingleList (g, 10, listHeight, NULL);
 
8304
      for (j = 0; j < NumConvertQualifiers; j++) {
 
8305
        ListItem (qfp->toquallist, ConvertQualifierList [j].name);
 
8306
      }
 
8307
    }
 
8308
  }
 
8309
 
 
8310
  if (type == EDIT_QUAL) {
 
8311
    k = HiddenGroup (h, 2, 0, NULL);
 
8312
  } else {
 
8313
    k = HiddenGroup (h, 0, 2, NULL);
 
8314
  }
 
8315
  if (type == EDIT_QUAL) {
 
8316
    StaticPrompt (k, "Find", 0, dialogTextHeight, programFont, 'l');
 
8317
  } else if (type == ADD_QUAL) {
 
8318
    StaticPrompt (k, "Text", 0, dialogTextHeight, programFont, 'l');
 
8319
  } else {
 
8320
    StaticPrompt (k, "Optional string constraint", 0, dialogTextHeight, programFont, 'c');
 
8321
  }
 
8322
  qfp->findthis = DialogText (k, "", 14, NULL);
 
8323
  if (type == EDIT_QUAL) {
 
8324
    StaticPrompt (k, "Replace", 0, dialogTextHeight, programFont, 'l');
 
8325
    qfp->replacewith = DialogText (k, "", 14, NULL);
 
8326
  }
 
8327
 
 
8328
  for (ap = qfp->alist; ap->name != NULL; ap++) {
 
8329
    str = ap->name;
 
8330
    if (*str == '~') {
 
8331
      *str = '-';
 
8332
    }
 
8333
  }
 
8334
 
 
8335
  c = HiddenGroup (h, 4, 0, NULL);
 
8336
  b = DefaultButton (c, "Accept", DoProcessQualifier);
 
8337
  SetObjectExtra (b, qfp, NULL);
 
8338
  PushButton (c, "Cancel", StdCancelButtonProc);
 
8339
  qfp->leaveDlgUp = CheckBox (c, "Leave Dialog Up", NULL);
 
8340
 
 
8341
  AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) k, (HANDLE) c, NULL);
 
8342
  RealizeWindow (w);
 
8343
  Show (w);
 
8344
  Select (qfp->findthis);
 
8345
  Update ();
 
8346
}
 
8347
 
 
8348
extern void RemoveQualifier (IteM i);
 
8349
extern void ConvertFeatures (IteM i);
 
8350
extern void ConvertQualifier (IteM i);
 
8351
extern void EditQualifier (IteM i);
 
8352
extern void AddQualifier (IteM i);
 
8353
 
 
8354
extern void RemoveQualifier (IteM i)
 
8355
 
 
8356
{
 
8357
  ProcessQualifier (i, REMOVE_QUAL);
 
8358
}
 
8359
 
 
8360
extern void ConvertFeatures (IteM i)
 
8361
 
 
8362
{
 
8363
  ProcessQualifier (i, CONVERT_FEAT);
 
8364
}
 
8365
 
 
8366
extern void ConvertQualifier (IteM i)
 
8367
 
 
8368
{
 
8369
  ProcessQualifier (i, CONVERT_QUAL);
 
8370
}
 
8371
 
 
8372
extern void EditQualifier (IteM i)
 
8373
 
 
8374
{
 
8375
  ProcessQualifier (i, EDIT_QUAL);
 
8376
}
 
8377
 
 
8378
extern void AddQualifier (IteM i)
 
8379
 
 
8380
{
 
8381
  ProcessQualifier (i, ADD_QUAL);
 
8382
}
 
8383
 
 
8384
#define REMOVE_SOURCE    1
 
8385
#define CONVERT_SOURCE   2
 
8386
#define EDIT_SOURCE      3
 
8387
#define ADD_SOURCE       4
 
8388
 
 
8389
/* Note that any changes to this alist should also be made to */
 
8390
/* the (subsource_and_orgmod_subtype_remove_alistX list which */
 
8391
/* follows.                                                   */
 
8392
 
 
8393
static ENUM_ALIST(subsource_and_orgmod_subtype_alistX)
 
8394
  {" ",                       0},
 
8395
  {"Acronym",                19},
 
8396
  {"Anamorph",               29},
 
8397
  {"Authority",              24},
 
8398
  {"Biotype",                14},
 
8399
  {"Biovar",                 13},
 
8400
  {"Breed",                  31},
 
8401
  {"Cell-line",             108},
 
8402
  {"Cell-type",             109},
 
8403
  {"Chemovar",               12},
 
8404
  {"Chromosome",            101},
 
8405
  {"Clone",                 103},
 
8406
  {"Clone-lib",             111},
 
8407
  {"Common",                 18},
 
8408
  {"Country",               123},
 
8409
  {"Cultivar",               10},
 
8410
  {"Dev-stage",             112},
 
8411
  {"Dosage",                 20},
 
8412
  {"Ecotype",                27},
 
8413
  {"Endogenous_virus-name", 125},
 
8414
  {"Environmental-sample",  127},
 
8415
  {"Forma",                  25},
 
8416
  {"Forma-specialis",        26},
 
8417
  {"Frequency",             113},
 
8418
  {"Genotype",              106},
 
8419
  {"Germline",              114},
 
8420
  {"Group",                  15},
 
8421
  {"Haplotype",             105},
 
8422
  {"Ins-seq-name",          121},
 
8423
  {"Isolate",                17},
 
8424
  {"Isolation-source",      128},
 
8425
  {"Lab-host",              116},
 
8426
  {"Map",                   102},
 
8427
  {"Note - OrgMod",          55},
 
8428
  {"Note - SubSource",      155},
 
8429
  {"Old Lineage",            53}, /* 253 */
 
8430
  {"Old Name",               54}, /* 254 */
 
8431
  {"Pathovar",               11},
 
8432
  {"Plasmid-name",          119},
 
8433
  {"Plastid-name",          122},
 
8434
  {"Pop-variant",           117},
 
8435
  {"Rearranged",            115},
 
8436
  {"Segment",               124},
 
8437
  {"Serogroup",               8},
 
8438
  {"Serotype",                7},
 
8439
  {"Serovar",                 9},
 
8440
  {"Sex",                   107},
 
8441
  {"Specific-host",          21},
 
8442
  {"Specimen-voucher",       23},
 
8443
  {"Strain",                  2},
 
8444
  {"Sub-species",            22},
 
8445
  {"Subclone",              104},
 
8446
  {"Subgroup",               16},
 
8447
  {"Substrain",               3},
 
8448
  {"Subtype",                 5},
 
8449
  {"Synonym",                28},
 
8450
  {"Teleomorph",             30},
 
8451
  {"Tissue-lib",            118},
 
8452
  {"Tissue-type",           110},
 
8453
  {"Transgenic",            126},
 
8454
  {"Transposon-name",       120},
 
8455
  {"Type",                    4},
 
8456
  {"Variety",                 6},
 
8457
END_ENUM_ALIST
 
8458
 
 
8459
static ENUM_ALIST(subsource_and_orgmod_subtype_remove_alistX)
 
8460
  {" ",                       0},
 
8461
  {"Acronym",                19},
 
8462
  {"All Notes",             999},
 
8463
  {"Anamorph",               29},
 
8464
  {"Authority",              24},
 
8465
  {"Biotype",                14},
 
8466
  {"Biovar",                 13},
 
8467
  {"Breed",                  31},
 
8468
  {"Cell-line",             108},
 
8469
  {"Cell-type",             109},
 
8470
  {"Chemovar",               12},
 
8471
  {"Chromosome",            101},
 
8472
  {"Clone",                 103},
 
8473
  {"Clone-lib",             111},
 
8474
  {"Common",                 18},
 
8475
  {"Country",               123},
 
8476
  {"Cultivar",               10},
 
8477
  {"Dev-stage",             112},
 
8478
  {"Dosage",                 20},
 
8479
  {"Ecotype",                27},
 
8480
  {"Endogenous_virus-name", 125},
 
8481
  {"Environmental-sample",  127},
 
8482
  {"Forma",                  25},
 
8483
  {"Forma-specialis",        26},
 
8484
  {"Frequency",             113},
 
8485
  {"Genotype",              106},
 
8486
  {"Germline",              114},
 
8487
  {"Group",                  15},
 
8488
  {"Haplotype",             105},
 
8489
  {"Ins-seq-name",          121},
 
8490
  {"Isolate",                17},
 
8491
  {"Isolation-source",      128},
 
8492
  {"Lab-host",              116},
 
8493
  {"Map",                   102},
 
8494
  {"Note - OrgMod",          55},
 
8495
  {"Note - SubSource",      155},
 
8496
  {"Old Lineage",            53}, /* 253 */
 
8497
  {"Old Name",               54}, /* 254 */
 
8498
  {"Pathovar",               11},
 
8499
  {"Plasmid-name",          119},
 
8500
  {"Plastid-name",          122},
 
8501
  {"Pop-variant",           117},
 
8502
  {"Rearranged",            115},
 
8503
  {"Segment",               124},
 
8504
  {"Serogroup",               8},
 
8505
  {"Serotype",                7},
 
8506
  {"Serovar",                 9},
 
8507
  {"Sex",                   107},
 
8508
  {"Specific-host",          21},
 
8509
  {"Specimen-voucher",       23},
 
8510
  {"Strain",                  2},
 
8511
  {"Sub-species",            22},
 
8512
  {"Subclone",              104},
 
8513
  {"Subgroup",               16},
 
8514
  {"Substrain",               3},
 
8515
  {"Subtype",                 5},
 
8516
  {"Synonym",                28},
 
8517
  {"Teleomorph",             30},
 
8518
  {"Tissue-lib",            118},
 
8519
  {"Tissue-type",           110},
 
8520
  {"Transgenic",            126},
 
8521
  {"Transposon-name",       120},
 
8522
  {"Type",                    4},
 
8523
  {"Variety",                 6},
 
8524
END_ENUM_ALIST
 
8525
 
 
8526
static ENUM_ALIST(biosource_genome_alistX)
 
8527
  {" ",                    0},
 
8528
  {"Apicoplast",          16},
 
8529
  {"Chloroplast",          2},
 
8530
  {"Chromoplast",          3},
 
8531
  {"Cyanelle",            12},
 
8532
  {"Endogenous-virus",    19},
 
8533
  {"Extrachromosomal",     8},
 
8534
  {"Genomic",              1},
 
8535
  {"Insertion Sequence",  11},
 
8536
  {"Kinetoplast",          4},
 
8537
  {"Leucoplast",          17},
 
8538
  {"Macronuclear",         7},
 
8539
  {"Mitochondrion",        5},
 
8540
  {"Nucleomorph",         15},
 
8541
  {"Plasmid",              9},
 
8542
  {"Plastid",              6},
 
8543
  {"Proplastid",          18},
 
8544
  {"Proviral",            13},
 
8545
  {"Transposon",          10},
 
8546
  {"Virion",              14},
 
8547
END_ENUM_ALIST
 
8548
 
 
8549
static ENUM_ALIST(orgref_textfield_alist)
 
8550
  {" ",                    0},
 
8551
  {"Scientific Name",      1},
 
8552
  {"Common Name",          2},
 
8553
  {"Lineage",              3},
 
8554
  {"Division",             4},
 
8555
END_ENUM_ALIST
 
8556
 
 
8557
typedef struct sourceformdata {
 
8558
  FEATURE_FORM_BLOCK
 
8559
 
 
8560
  Int2           type;
 
8561
  ButtoN         applyToParts;
 
8562
  TexT           onlyThisPart;
 
8563
  GrouP          sourceGroup;
 
8564
  GrouP          modGrp;
 
8565
  GrouP          genGrp;
 
8566
  GrouP          refGrp;
 
8567
  GrouP          txtGrp;
 
8568
  GrouP          originGrp;
 
8569
  PopuP          frommod;
 
8570
  PopuP          tomod;
 
8571
  PopuP          fromgen;
 
8572
  PopuP          togen;
 
8573
  PopuP          fromref;
 
8574
  PopuP          toref;
 
8575
  PopuP          toorigin;
 
8576
  PopuP          fromorigin;
 
8577
  TexT           findthis;
 
8578
  TexT           replacewith;
 
8579
  GrouP          applyChoiceGrp;  /* This is the group for the radio buttons for the
 
8580
                                   * constraint on which biosources to operate on.
 
8581
                                   */
 
8582
  PopuP          qual_to_have;    /* This is the control that indicates which qualifier
 
8583
                                   * should be present to operate on a biosource.
 
8584
                                   */
 
8585
  TexT           text_to_have;    /* This is the control that indicates the text that
 
8586
                                   * should be present in the biosource to be operated on.
 
8587
                                   */
 
8588
  Int4           applyChoiceVal;  /* This is the value of the applyChoiceGrp choice. */
 
8589
  CharPtr        text_to_have_str;/* This is the contents of the text_to_have box. */
 
8590
  Int4           qual_to_have_val;/* This is the subtype for the qual to have. */
 
8591
 
 
8592
  Int2           choice;
 
8593
  Int2           fromval;
 
8594
  Int2           toval;
 
8595
  Int2           onlythis;
 
8596
  CharPtr        findStr;
 
8597
  CharPtr        replaceStr;
 
8598
 
 
8599
  Boolean        replaceOldAsked;
 
8600
  Boolean        doReplaceAll;
 
8601
  Boolean        use_semicolon;
 
8602
  ButtoN         leaveDlgUp;
 
8603
} SourceFormData, PNTR SourceFormPtr;
 
8604
 
 
8605
static ValNodePtr EnumToValNode (EnumFieldAssocPtr al) 
 
8606
{
 
8607
  EnumFieldAssocPtr efap;
 
8608
  ValNodePtr list = NULL, vnp;
 
8609
  
 
8610
  for (efap = al; efap->name != NULL; efap++)
 
8611
  {
 
8612
        vnp = ValNodeNew (list);
 
8613
        if (list == NULL) list = vnp;
 
8614
        if (vnp != NULL)
 
8615
        {
 
8616
          vnp->choice = efap->value;
 
8617
          vnp->data.ptrvalue = efap->name;
 
8618
        }
 
8619
  }
 
8620
  return list;
 
8621
}
 
8622
 
 
8623
extern ValNodePtr GetQualList (void)
 
8624
{
 
8625
  ValNodePtr list;
 
8626
  
 
8627
  list = EnumToValNode (subsource_and_orgmod_subtype_alistX);
 
8628
  return list;
 
8629
}
 
8630
 
 
8631
Uint2 mod_widths [] = {
 
8632
  0, 25
 
8633
};
 
8634
 
 
8635
Uint2 mod_types [] = {
 
8636
  TAGLIST_POPUP, TAGLIST_TEXT
 
8637
};
 
8638
 
 
8639
extern Uint1 FindTypeForModNameText (CharPtr cp)
 
8640
{
 
8641
  EnumFieldAssocPtr  ap;
 
8642
  
 
8643
  for (ap = subsource_and_orgmod_subtype_alistX; ap->name != NULL; ap++) 
 
8644
  {
 
8645
    if (StringICmp (ap->name, cp) == 0)
 
8646
    {
 
8647
      return ap->value;
 
8648
    }
 
8649
  }
 
8650
  return 255;
 
8651
}
 
8652
 
 
8653
static void ModListToModDialog (DialoG d, Pointer data)
 
8654
 
 
8655
{
 
8656
  ValNodePtr  head;
 
8657
  Int2        j;
 
8658
  size_t      len;
 
8659
  ListPairPtr lpp;
 
8660
  CharPtr     str;
 
8661
  TagListPtr  tlp;
 
8662
  ValNodePtr  name_vnp;
 
8663
  ValNodePtr  value_vnp;
 
8664
  ValNodePtr  vnp;
 
8665
 
 
8666
  tlp = (TagListPtr) GetObjectExtra (d);
 
8667
  lpp = (ListPairPtr) data;
 
8668
  head = NULL;
 
8669
  if (tlp != NULL) {
 
8670
    name_vnp = lpp->selected_names_list;
 
8671
    value_vnp = lpp->selected_values_list;
 
8672
    while (name_vnp != NULL) {
 
8673
      if (!StringHasNoText (name_vnp->data.ptrvalue))
 
8674
      {
 
8675
        vnp = ValNodeNew (head);
 
8676
        if (head == NULL) {
 
8677
          head = vnp;
 
8678
        }
 
8679
        len = StringLen (name_vnp->data.ptrvalue) + 4;
 
8680
        if (value_vnp != NULL)
 
8681
        {
 
8682
          len += StringLen (value_vnp->data.ptrvalue);
 
8683
        }
 
8684
        str = MemNew (len);
 
8685
        if (str != NULL)
 
8686
        {
 
8687
          if (value_vnp != NULL && ! StringHasNoText (value_vnp->data.ptrvalue))
 
8688
          {
 
8689
                sprintf (str, "%d\t%s\n", 
 
8690
                         name_vnp->choice,
 
8691
                         value_vnp->data.ptrvalue);
 
8692
          }
 
8693
          else
 
8694
          {
 
8695
                sprintf (str, "%d\t\n", name_vnp->choice);
 
8696
          }
 
8697
        }
 
8698
        vnp->data.ptrvalue = str;
 
8699
      }
 
8700
      name_vnp = name_vnp->next;
 
8701
      if (value_vnp != NULL)
 
8702
      {
 
8703
        value_vnp = value_vnp->next;
 
8704
      }
 
8705
    }
 
8706
    SendMessageToDialog (tlp->dialog, VIB_MSG_RESET);
 
8707
    tlp->vnp = head;
 
8708
    SendMessageToDialog (tlp->dialog, VIB_MSG_REDRAW);
 
8709
    for (j = 0, vnp = tlp->vnp; vnp != NULL; j++, vnp = vnp->next) {
 
8710
    }
 
8711
    tlp->max = MAX ((Int2) 0, (Int2) (j - tlp->rows + 1));
 
8712
    CorrectBarMax (tlp->bar, tlp->max);
 
8713
    CorrectBarPage (tlp->bar, tlp->rows - 1, tlp->rows - 1);
 
8714
  }
 
8715
}
 
8716
 
 
8717
static CharPtr GetValueNameFromEnum (Int4 val, EnumFieldAssocPtr list)
 
8718
 
8719
  EnumFieldAssocPtr ap;
 
8720
  
 
8721
  for (ap = list; ap != NULL && ap->name != NULL; ap++)
 
8722
  {
 
8723
        if (ap->value == val)
 
8724
        {
 
8725
          return ap->name;
 
8726
        }
 
8727
  }
 
8728
  return NULL;
 
8729
}
 
8730
 
 
8731
static Pointer ModDialogToModList (DialoG d)
 
8732
 
 
8733
{
 
8734
  Char        ch;
 
8735
  OrgModPtr   head;
 
8736
  Int2        j;
 
8737
  Int2        len;
 
8738
  Boolean     okay;
 
8739
  CharPtr     str;
 
8740
  TagListPtr  tlp;
 
8741
  CharPtr     mod_name;
 
8742
  CharPtr     mod_value;
 
8743
  ValNodePtr  vnp, name_vnp, value_vnp;
 
8744
  ListPairPtr lpp;
 
8745
  CharPtr     tmp;
 
8746
  int         val;
 
8747
 
 
8748
  head = NULL;
 
8749
  tlp = (TagListPtr) GetObjectExtra (d);
 
8750
 
 
8751
  lpp = (ListPairPtr) MemNew (sizeof (ListPairData));
 
8752
  if (lpp == NULL) return NULL;
 
8753
  lpp->selected_names_list = NULL;
 
8754
  lpp->selected_values_list = NULL;
 
8755
 
 
8756
  if (tlp != NULL && tlp->vnp != NULL) {
 
8757
    for (vnp = tlp->vnp; vnp != NULL; vnp = vnp->next) {
 
8758
      str = (CharPtr) vnp->data.ptrvalue;
 
8759
      okay = FALSE;
 
8760
      len = StringLen (str);
 
8761
      for (j = 0; j < len; j++) {
 
8762
        ch = str [j];
 
8763
        if (ch != ' ' && ch != '\t' && ch != '\n') {
 
8764
          okay = TRUE;
 
8765
        }
 
8766
      }
 
8767
      if (okay) {
 
8768
        tmp = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 0);
 
8769
        if (tmp != NULL && sscanf (tmp, "%d", &val) == 1 && val != 0) {
 
8770
          mod_name = GetValueNameFromEnum (val, subsource_and_orgmod_subtype_alistX);
 
8771
          if (mod_name != NULL && ! StringHasNoText (mod_name)) {
 
8772
            mod_value = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 1);
 
8773
            name_vnp = ValNodeNew (lpp->selected_names_list);
 
8774
            value_vnp = ValNodeNew (lpp->selected_values_list);
 
8775
            if (lpp->selected_names_list == NULL)
 
8776
            {
 
8777
              lpp->selected_names_list = name_vnp;
 
8778
            }
 
8779
            if (lpp->selected_values_list == NULL)
 
8780
            {
 
8781
                  lpp->selected_values_list = value_vnp;
 
8782
            }
 
8783
            if (name_vnp != NULL)
 
8784
            {
 
8785
              name_vnp->choice = val;
 
8786
              name_vnp->data.ptrvalue = mod_name;
 
8787
            }
 
8788
            if (value_vnp != NULL)
 
8789
            {
 
8790
                  value_vnp->data.ptrvalue = mod_value;
 
8791
            }
 
8792
            
 
8793
          }
 
8794
        } 
 
8795
        MemFree (tmp);
 
8796
      }
 
8797
    }
 
8798
  }
 
8799
  return (Pointer) lpp;
 
8800
}
 
8801
 
 
8802
static EnumFieldAssocPtr mod_lists[] = 
 
8803
  { subsource_and_orgmod_subtype_alistX, NULL };
 
8804
 
 
8805
extern DialoG CreateModifierTagList (GrouP g, ListPairPtr lpp)
 
8806
 
8807
  DialoG d;
 
8808
  
 
8809
  if (lpp == NULL) return NULL;
 
8810
  d = CreateTagListDialog (g, 4, 2, STD_TAG_SPACING, mod_types,
 
8811
                           mod_widths, mod_lists,
 
8812
                           ModListToModDialog,
 
8813
                           ModDialogToModList);
 
8814
  PointerToDialog (d, lpp);
 
8815
  return d;
 
8816
}
 
8817
 
 
8818
extern ListPairPtr GetModifierList (DialoG d)
 
8819
{
 
8820
  ListPairPtr lpp;
 
8821
  
 
8822
  lpp = DialogToPointer (d);
 
8823
  return lpp;
 
8824
}
 
8825
 
 
8826
extern void AppendOrReplaceString (
 
8827
  CharPtr PNTR string_loc,
 
8828
  CharPtr new_value,
 
8829
  Boolean PNTR asked_question,
 
8830
  Boolean PNTR do_replace,
 
8831
  Boolean PNTR use_semicolon
 
8832
)
 
8833
{
 
8834
  MsgAnswer ans;
 
8835
  CharPtr   tmp_value, tmp_new_value;
 
8836
 
 
8837
  if (string_loc == NULL
 
8838
    || new_value == NULL
 
8839
    || asked_question == NULL
 
8840
    || do_replace == NULL
 
8841
    || use_semicolon == NULL)
 
8842
  {
 
8843
    return;
 
8844
  }
 
8845
 
 
8846
  if (! *asked_question && !StringHasNoText (*string_loc))
 
8847
  {
 
8848
    *asked_question = TRUE;
 
8849
    ArrowCursor ();
 
8850
    ans = Message (MSG_YN, "Do you wish to overwrite existing content?");
 
8851
    *do_replace = (Boolean) (ans == ANS_YES);
 
8852
    if (! *use_semicolon)
 
8853
    {
 
8854
      if (! *do_replace)
 
8855
      {
 
8856
        ans = Message (MSG_YN, "Separate items with semicolon?");
 
8857
        *use_semicolon = (Boolean) (ans == ANS_YES);
 
8858
      }
 
8859
    }
 
8860
    WatchCursor ();
 
8861
    Update ();
 
8862
  }
 
8863
  if (*do_replace || StringHasNoText (*string_loc))
 
8864
  {
 
8865
    MemFree (*string_loc);
 
8866
    *string_loc = StringSave (new_value);
 
8867
  }
 
8868
  else
 
8869
  {
 
8870
    tmp_value = MemNew (StringLen (*string_loc) + StringLen ( new_value) + 3);
 
8871
    if (tmp_value == NULL) return;
 
8872
    StringCpy (tmp_value, *string_loc);
 
8873
    TrimSpacesAroundString (tmp_value);
 
8874
    if (*use_semicolon)
 
8875
    {
 
8876
      StringCat (tmp_value, "; ");
 
8877
    }
 
8878
    else
 
8879
    {
 
8880
      StringCat (tmp_value, " ");
 
8881
    }
 
8882
    tmp_new_value = StringSave (new_value);
 
8883
    TrimSpacesAroundString (tmp_new_value);
 
8884
    StringCat (tmp_value, tmp_new_value);
 
8885
    MemFree (tmp_new_value);
 
8886
    MemFree (*string_loc);
 
8887
    *string_loc = tmp_value;
 
8888
  }
 
8889
}
 
8890
 
 
8891
static SubSourcePtr FindSubSource (BioSourcePtr biop, Uint1 subtype, SourceFormPtr sfp,
 
8892
                                   Boolean forceRemove, Boolean convertNote, Boolean is_feat)
 
8893
 
 
8894
{
 
8895
  SubSourcePtr  PNTR  prev;
 
8896
  SubSourcePtr  ssp;
 
8897
  SubSourcePtr  tmp;
 
8898
 
 
8899
  if (subtype == 55 || subtype == 155) {
 
8900
    subtype = 255;
 
8901
  }
 
8902
  prev = &(biop->subtype);
 
8903
  for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
 
8904
    if (ssp->subtype == subtype) {
 
8905
      if (sfp->type == REMOVE_SOURCE || forceRemove) {
 
8906
        if (StringHasNoText (sfp->findStr) ||
 
8907
            StringISearch (ssp->name, sfp->findStr) != NULL) {
 
8908
          *prev = ssp->next;
 
8909
          SubSourceFree (ssp);
 
8910
          return NULL;
 
8911
        }
 
8912
      } else {
 
8913
        return ssp;
 
8914
      }
 
8915
    }
 
8916
    prev = &(ssp->next);
 
8917
  }
 
8918
  if (sfp->type == REMOVE_SOURCE || forceRemove) return NULL;
 
8919
  if (sfp->type != ADD_SOURCE && (! convertNote)) return NULL;
 
8920
  if (subtype == SUBSRC_transgenic && is_feat) return NULL;
 
8921
  ssp = SubSourceNew ();
 
8922
  if (biop->subtype == NULL) {
 
8923
    biop->subtype = ssp;
 
8924
  } else {
 
8925
    tmp = biop->subtype;
 
8926
    while (tmp->next != NULL) {
 
8927
      tmp = tmp->next;
 
8928
    }
 
8929
    tmp->next = ssp;
 
8930
  }
 
8931
  if (ssp != NULL) {
 
8932
    ssp->subtype = subtype;
 
8933
  }
 
8934
  return ssp;
 
8935
}
 
8936
 
 
8937
static OrgModPtr FindOrgMod (BioSourcePtr biop, Uint1 subtype, SourceFormPtr sfp, Boolean forceRemove, Boolean convertNote)
 
8938
 
 
8939
{
 
8940
  OrgModPtr   mod;
 
8941
  OrgNamePtr  onp;
 
8942
  OrgRefPtr   orp;
 
8943
  OrgModPtr   PNTR  prev;
 
8944
  OrgModPtr   tmp;
 
8945
 
 
8946
  if (subtype == 55 || subtype == 155) {
 
8947
    subtype = 255;
 
8948
  } else if (subtype == 53) {
 
8949
    subtype = 253;
 
8950
  } else if (subtype == 54) {
 
8951
    subtype = 254;
 
8952
  }
 
8953
  mod = NULL;
 
8954
  orp = biop->org;
 
8955
  if (orp == NULL) {
 
8956
    if (sfp->type != ADD_SOURCE) return NULL;
 
8957
    orp = OrgRefNew ();
 
8958
    biop->org = orp;
 
8959
  }
 
8960
  if (orp == NULL) return NULL;
 
8961
  onp = orp->orgname;
 
8962
  if (onp == NULL) {
 
8963
    if ((sfp->type != ADD_SOURCE) &&
 
8964
        (sfp->type != CONVERT_SOURCE))
 
8965
      return NULL;
 
8966
    onp = OrgNameNew ();
 
8967
    orp->orgname = onp;
 
8968
  }
 
8969
  if (onp == NULL) return NULL;
 
8970
  prev = &(onp->mod);
 
8971
  for (mod = onp->mod; mod != NULL; mod = mod->next) {
 
8972
    if (mod->subtype == subtype) {
 
8973
      if (sfp->type == REMOVE_SOURCE || forceRemove) {
 
8974
        if (StringHasNoText (sfp->findStr) ||
 
8975
            StringISearch (mod->subname, sfp->findStr) != NULL) {
 
8976
          *prev = mod->next;
 
8977
          OrgModFree (mod);
 
8978
          return NULL;
 
8979
        }
 
8980
      } else {
 
8981
        return mod;
 
8982
      }
 
8983
    }
 
8984
    prev = &(mod->next);
 
8985
  }
 
8986
  if (sfp->type == REMOVE_SOURCE || forceRemove) return NULL;
 
8987
  if (sfp->type != ADD_SOURCE && (! convertNote)) return NULL;
 
8988
  mod = OrgModNew ();
 
8989
  if (onp->mod == NULL) {
 
8990
    onp->mod = mod;
 
8991
  } else {
 
8992
    tmp = onp->mod;
 
8993
    while (tmp->next != NULL) {
 
8994
      tmp = tmp->next;
 
8995
    }
 
8996
    tmp->next = mod;
 
8997
  }
 
8998
  if (mod != NULL) {
 
8999
    mod->subtype = subtype;
 
9000
  }
 
9001
  return mod;
 
9002
}
 
9003
 
 
9004
static void ConvertSourceString (OrgRefPtr orp, Int2 fromval, Int2 toval)
 
9005
{
 
9006
  CharPtr     tmp;
 
9007
  OrgNamePtr  onp;
 
9008
 
 
9009
  if (orp == NULL || fromval == toval) return;
 
9010
 
 
9011
  tmp = NULL;
 
9012
  onp = orp->orgname;
 
9013
 
 
9014
  switch (fromval) {
 
9015
    case 1 :
 
9016
      tmp = StringSave (orp->taxname);
 
9017
      SetTaxNameAndRemoveTaxRef (orp, NULL);
 
9018
      break;
 
9019
    case 2 :
 
9020
      tmp = orp->common; 
 
9021
      orp->common = NULL;
 
9022
      break;
 
9023
    case 3 :
 
9024
      if (onp != NULL) {
 
9025
         tmp = onp->lineage ;
 
9026
         onp->lineage = NULL;
 
9027
      }
 
9028
      break;
 
9029
    case 4 :
 
9030
      if (onp != NULL) {
 
9031
         tmp = onp->div ;
 
9032
         onp->div = NULL;
 
9033
      }
 
9034
      break;
 
9035
    default :
 
9036
      break;
 
9037
  }
 
9038
 
 
9039
  if (tmp == NULL) return;
 
9040
 
 
9041
  switch (toval) {
 
9042
    case 1 :
 
9043
      SetTaxNameAndRemoveTaxRef (orp, tmp);
 
9044
      break;
 
9045
    case 2 :
 
9046
      orp->common = tmp;
 
9047
      break;
 
9048
    case 3 :
 
9049
      if (onp == NULL) {
 
9050
         onp = OrgNameNew ();
 
9051
         orp->orgname = onp;
 
9052
      }
 
9053
      onp->lineage = tmp;
 
9054
      break;
 
9055
    case 4 :
 
9056
      onp = orp->orgname;
 
9057
      if (onp == NULL) {
 
9058
         onp = OrgNameNew ();
 
9059
         orp->orgname = onp;
 
9060
      }
 
9061
      onp->div = tmp;
 
9062
      break;
 
9063
    default :
 
9064
      break;
 
9065
  }
 
9066
 
 
9067
  return;
 
9068
 
 
9069
} /* ConvertSourceString */
 
9070
 
 
9071
static void EditSourceString (CharPtr PNTR strptr, SourceFormPtr sfp, CharPtr foundit)
 
9072
 
 
9073
{
 
9074
  size_t   diff;
 
9075
  size_t   foundlen;
 
9076
  size_t   replen;
 
9077
  CharPtr  newstring;
 
9078
  CharPtr  tmp;
 
9079
  CharPtr  tmp2;
 
9080
 
 
9081
  if (sfp == NULL || strptr == NULL || foundit == NULL) return;
 
9082
  foundlen = StringLen (sfp->findStr);
 
9083
  replen = StringLen (sfp->replaceStr);
 
9084
  if (replen > foundlen) {
 
9085
    diff = replen - foundlen;
 
9086
  } else {
 
9087
    diff = foundlen - replen;
 
9088
  }
 
9089
  newstring = MemNew (StringLen (*strptr) + diff + 1);
 
9090
  tmp = *strptr;
 
9091
  tmp2 = newstring;
 
9092
  while (tmp != foundit) {
 
9093
    *tmp2 = *tmp;
 
9094
    tmp++;
 
9095
    tmp2++;
 
9096
  }
 
9097
  if (sfp->replaceStr != NULL) {
 
9098
    tmp2 = MemCopy (tmp2, sfp->replaceStr, replen);
 
9099
  }
 
9100
  tmp2 += replen;
 
9101
  tmp += foundlen;
 
9102
  tmp2 = StringMove (tmp2, tmp);
 
9103
  *strptr = MemFree (*strptr);
 
9104
  *strptr = newstring;
 
9105
}
 
9106
 
 
9107
static Uint1 AssignSubtype (Uint1 subtype)
 
9108
 
 
9109
{
 
9110
  if (subtype >= 100) {
 
9111
    subtype -= 100;
 
9112
  }
 
9113
  if (subtype == 55) {
 
9114
    subtype = 255;
 
9115
  }
 
9116
  return subtype;
 
9117
}
 
9118
 
 
9119
static void RemoveSubSourceByPtr (BioSourcePtr biop, SubSourcePtr to_remove)
 
9120
{
 
9121
  SubSourcePtr ssp, prev;
 
9122
 
 
9123
  if (biop == NULL || to_remove == NULL) return;
 
9124
  
 
9125
  prev = NULL;
 
9126
  ssp = biop->subtype;
 
9127
  while (ssp != NULL)
 
9128
  {
 
9129
    if (ssp == to_remove)
 
9130
    {
 
9131
      if (prev == NULL)
 
9132
      {
 
9133
        biop->subtype = ssp->next;
 
9134
        ssp->next = NULL;
 
9135
        SubSourceFree (ssp);
 
9136
        ssp = biop->subtype;
 
9137
      }
 
9138
      else
 
9139
      {
 
9140
        prev->next = ssp->next;
 
9141
        ssp->next = NULL;
 
9142
        SubSourceFree (ssp);
 
9143
        ssp = prev->next;
 
9144
      }
 
9145
    }
 
9146
    else
 
9147
    {
 
9148
      prev = ssp;
 
9149
      ssp = ssp->next;
 
9150
    }
 
9151
  }
 
9152
}
 
9153
 
 
9154
static void ConvertSubSourceModifier (
 
9155
  BioSourcePtr  biop,
 
9156
  SourceFormPtr sfp,
 
9157
  Boolean       is_feat,
 
9158
  SubSourcePtr  ssp_from
 
9159
)
 
9160
{
 
9161
  SubSourcePtr ssp_to;
 
9162
 
 
9163
  if (biop == NULL || sfp == NULL || ssp_from == NULL) return;
 
9164
  ssp_to = FindSubSource (biop, sfp->toval - 100, sfp, TRUE, FALSE, is_feat);
 
9165
  if (ssp_to != NULL)
 
9166
  {
 
9167
    AppendOrReplaceString (&(ssp_to->name), ssp_from->name,
 
9168
                           &(sfp->replaceOldAsked),
 
9169
                           &(sfp->doReplaceAll),
 
9170
                           &(sfp->use_semicolon));
 
9171
    RemoveSubSourceByPtr (biop, ssp_from);
 
9172
  }
 
9173
  else
 
9174
  {
 
9175
    ssp_from->subtype = AssignSubtype (sfp->toval);
 
9176
  }
 
9177
}
 
9178
 
 
9179
static void RemoveOrgModByPtr (BioSourcePtr biop, OrgModPtr to_remove)
 
9180
{
 
9181
  OrgModPtr mod, prev;
 
9182
  
 
9183
  if (biop == NULL
 
9184
    || biop->org == NULL
 
9185
    || biop->org->orgname == NULL
 
9186
    || biop->org->orgname->mod == NULL
 
9187
    || to_remove == NULL)
 
9188
  {
 
9189
    return;
 
9190
  }
 
9191
 
 
9192
  prev = NULL;
 
9193
  mod = biop->org->orgname->mod;
 
9194
  while (mod != NULL)
 
9195
  {
 
9196
    if (mod == to_remove)
 
9197
    {
 
9198
      if (prev == NULL)
 
9199
      {
 
9200
        biop->org->orgname->mod = mod->next;
 
9201
        mod->next = NULL;
 
9202
        OrgModFree (mod);
 
9203
        mod = biop->org->orgname->mod;
 
9204
      }
 
9205
      else
 
9206
      {
 
9207
        prev->next = mod->next;
 
9208
        mod->next = NULL;
 
9209
        OrgModFree (mod);
 
9210
        mod = prev->next;
 
9211
      }
 
9212
    }
 
9213
    else
 
9214
    {
 
9215
      prev = mod;
 
9216
      mod = mod->next;
 
9217
    }
 
9218
  }
 
9219
}
 
9220
 
 
9221
static void ConvertOrganismModifier (
 
9222
  BioSourcePtr  biop,
 
9223
  SourceFormPtr sfp,
 
9224
  Boolean       is_feat,
 
9225
  OrgModPtr     mod_from
 
9226
)
 
9227
{
 
9228
  OrgModPtr mod_to;
 
9229
 
 
9230
  if (biop == NULL || sfp == NULL || mod_from == NULL) return;
 
9231
  mod_to = FindOrgMod (biop, sfp->toval, sfp, FALSE, FALSE);
 
9232
  if (mod_to != NULL)
 
9233
  {
 
9234
    AppendOrReplaceString (&(mod_to->subname), mod_from->subname,
 
9235
                           &(sfp->replaceOldAsked),
 
9236
                           &(sfp->doReplaceAll),
 
9237
                           &(sfp->use_semicolon));
 
9238
    RemoveOrgModByPtr (biop, mod_from);
 
9239
  }
 
9240
  else
 
9241
  {
 
9242
    mod_from->subtype = AssignSubtype (sfp->toval);
 
9243
  }
 
9244
}
 
9245
 
 
9246
static void ConvertSubSourceToOrgMod (
 
9247
  BioSourcePtr biop,
 
9248
  SourceFormPtr sfp,
 
9249
  Boolean is_feat,
 
9250
  SubSourcePtr ssp
 
9251
)
 
9252
{
 
9253
  OrgModPtr mod;
 
9254
 
 
9255
  if (biop == NULL
 
9256
    || sfp == NULL
 
9257
    || ssp == NULL)
 
9258
  {
 
9259
    return;
 
9260
  }
 
9261
 
 
9262
  if (sfp->toval == 55)
 
9263
  {
 
9264
    mod = FindOrgMod (biop, 255, sfp, FALSE, FALSE);
 
9265
  }
 
9266
  else
 
9267
  {
 
9268
    mod = FindOrgMod (biop, sfp->toval, sfp, FALSE, FALSE);
 
9269
  }
 
9270
  if (mod == NULL)
 
9271
  {
 
9272
    if (biop->org == NULL) 
 
9273
    {
 
9274
      biop->org = OrgRefNew ();
 
9275
      if (biop->org == NULL) return;
 
9276
    } 
 
9277
    if (biop->org->orgname == NULL)
 
9278
    {
 
9279
      biop->org->orgname = OrgNameNew ();
 
9280
      if (biop->org->orgname == NULL) return;
 
9281
    }
 
9282
    mod = OrgModNew ();
 
9283
    if (sfp->toval == 55)
 
9284
    {
 
9285
      mod->subtype = 255;
 
9286
    }
 
9287
    else
 
9288
    {
 
9289
      mod->subtype = sfp->toval;
 
9290
    }
 
9291
    mod->subname = StringSave (ssp->name);
 
9292
    mod->next = biop->org->orgname->mod;
 
9293
    biop->org->orgname->mod = mod;
 
9294
  }
 
9295
  else
 
9296
  {
 
9297
    AppendOrReplaceString (&(mod->subname), ssp->name,
 
9298
                           &(sfp->replaceOldAsked),
 
9299
                           &(sfp->doReplaceAll),
 
9300
                           &(sfp->use_semicolon));
 
9301
  }
 
9302
  RemoveSubSourceByPtr (biop, ssp);
 
9303
}
 
9304
 
 
9305
static void ConvertOrgModToSubSource (
 
9306
  BioSourcePtr biop,
 
9307
  SourceFormPtr sfp,
 
9308
  Boolean is_feat,
 
9309
  OrgModPtr mod
 
9310
)
 
9311
{
 
9312
  SubSourcePtr ssp;
 
9313
 
 
9314
  if (biop == NULL
 
9315
    || sfp == NULL
 
9316
    || mod == NULL)
 
9317
  {
 
9318
    return;
 
9319
  }
 
9320
 
 
9321
  if (sfp->toval == 155)
 
9322
  {
 
9323
    ssp = FindSubSource (biop, 255, sfp, FALSE, FALSE, is_feat);
 
9324
  }
 
9325
  else
 
9326
  {
 
9327
    ssp = FindSubSource (biop, sfp->toval - 100, sfp, FALSE, FALSE, is_feat);
 
9328
  }
 
9329
  if (ssp == NULL)
 
9330
  {
 
9331
    ssp = SubSourceNew ();
 
9332
    if (sfp->toval == 155)
 
9333
    {
 
9334
      ssp->subtype = 255;
 
9335
    }
 
9336
    else
 
9337
    {
 
9338
      ssp->subtype = sfp->toval - 100;
 
9339
    }
 
9340
    ssp->name = StringSave (mod->subname);
 
9341
    ssp->next = biop->subtype;
 
9342
    biop->subtype = ssp;
 
9343
  }
 
9344
  else
 
9345
  {
 
9346
    AppendOrReplaceString (&(ssp->name), mod->subname,
 
9347
                           &(sfp->replaceOldAsked),
 
9348
                           &(sfp->doReplaceAll),
 
9349
                           &(sfp->use_semicolon));
 
9350
  }
 
9351
  RemoveOrgModByPtr (biop, mod);
 
9352
}
 
9353
 
 
9354
static Boolean DoesBioSourceQualContainString (BioSourcePtr biop, CharPtr str)
 
9355
{
 
9356
  SubSourcePtr  ssp = NULL;
 
9357
  OrgRefPtr     orp = NULL;
 
9358
  OrgNamePtr    onp = NULL;
 
9359
  OrgModPtr     mod = NULL;
 
9360
  
 
9361
  if (biop == NULL) 
 
9362
  {
 
9363
        return FALSE;
 
9364
  } 
 
9365
  if (str == NULL || StringHasNoText (str))
 
9366
  {
 
9367
        return TRUE;
 
9368
  }
 
9369
  for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
 
9370
    if (ssp->name != NULL && StringStr (ssp->name, str) != NULL) 
 
9371
    {
 
9372
      return TRUE;
 
9373
    }
 
9374
  }
 
9375
  orp = biop->org;
 
9376
  if (orp == NULL) {
 
9377
    return FALSE;
 
9378
  }
 
9379
  onp = orp->orgname;
 
9380
  if (onp == NULL) {
 
9381
    return FALSE;
 
9382
  }
 
9383
  for (mod = onp->mod; mod != NULL; mod = mod->next) {
 
9384
        if (mod->subname != NULL && StringStr (mod->subname, str) != NULL) 
 
9385
        {
 
9386
          return TRUE;
 
9387
        }
 
9388
  }
 
9389
  return FALSE;
 
9390
}
 
9391
 
 
9392
static Boolean DoesBioSourceOrgNameContainString (BioSourcePtr biop, CharPtr str)
 
9393
{
 
9394
  if (biop == NULL || str == NULL || biop->org == NULL) return FALSE;
 
9395
  if (StringStr (biop->org->taxname, str) != NULL || StringStr (biop->org->common, str) != NULL)
 
9396
  {
 
9397
        return TRUE;
 
9398
  }
 
9399
  return FALSE;
 
9400
}
 
9401
 
 
9402
static Boolean DoesBioSourceHaveQual (BioSourcePtr biop, Uint1 subtype, Boolean is_ssp)
 
9403
{
 
9404
  SubSourcePtr  ssp = NULL;
 
9405
  OrgRefPtr     orp = NULL;
 
9406
  OrgNamePtr    onp = NULL;
 
9407
  OrgModPtr     mod = NULL;
 
9408
  
 
9409
  if (biop == NULL) 
 
9410
  {
 
9411
        return FALSE;
 
9412
  }
 
9413
  if (is_ssp) 
 
9414
  {
 
9415
    if (subtype == 55 || subtype == 155) {
 
9416
      subtype = 255;
 
9417
    }
 
9418
    for (ssp = biop->subtype; ssp != NULL; ssp = ssp->next) {
 
9419
      if (ssp->subtype == subtype) {
 
9420
        return TRUE;
 
9421
      }
 
9422
    }
 
9423
  }
 
9424
  else 
 
9425
  {
 
9426
    if (subtype == 55 || subtype == 155) {
 
9427
      subtype = 255;
 
9428
    } else if (subtype == 53) {
 
9429
      subtype = 253;
 
9430
    } else if (subtype == 54) {
 
9431
      subtype = 254;
 
9432
    }
 
9433
 
 
9434
    orp = biop->org;
 
9435
    if (orp == NULL) {
 
9436
      return FALSE;
 
9437
    }
 
9438
    onp = orp->orgname;
 
9439
    if (onp == NULL) {
 
9440
      return FALSE;
 
9441
    }
 
9442
    for (mod = onp->mod; mod != NULL; mod = mod->next) {
 
9443
      if (mod->subtype == subtype) {
 
9444
            return TRUE;
 
9445
          }
 
9446
    }
 
9447
  }
 
9448
  return FALSE;
 
9449
}
 
9450
 
 
9451
static Boolean OkToOperateOnSource (BioSourcePtr biop, SourceFormPtr sfp)
 
9452
{
 
9453
  Uint1          subtype;
 
9454
  Boolean        is_ssp;
 
9455
  
 
9456
  if (biop == NULL || sfp == NULL) {
 
9457
    return FALSE;
 
9458
  }
 
9459
 
 
9460
  switch (sfp->applyChoiceVal) 
 
9461
  {
 
9462
        case 1:
 
9463
          return TRUE;
 
9464
          break;
 
9465
        case 2:
 
9466
          subtype = sfp->qual_to_have_val;
 
9467
          is_ssp = FALSE;
 
9468
          if (subtype == 999) 
 
9469
          {
 
9470
                subtype = 255;
 
9471
                is_ssp = TRUE;
 
9472
                if (DoesBioSourceHaveQual (biop, subtype, TRUE))
 
9473
                {
 
9474
              return TRUE;
 
9475
                }
 
9476
                else 
 
9477
                {
 
9478
                  return DoesBioSourceHaveQual (biop, subtype, FALSE);
 
9479
                }
 
9480
          }
 
9481
          else if (subtype >= 100)
 
9482
          {
 
9483
                subtype = subtype - 100;
 
9484
                is_ssp = TRUE;
 
9485
          }
 
9486
          return DoesBioSourceHaveQual (biop, subtype, is_ssp);
 
9487
          break;
 
9488
        case 4:
 
9489
      return DoesBioSourceQualContainString (biop, sfp->text_to_have_str) 
 
9490
          || DoesBioSourceOrgNameContainString (biop, sfp->text_to_have_str);
 
9491
      break;      
 
9492
  }
 
9493
  return FALSE; 
 
9494
}
 
9495
 
 
9496
static void ProcessBioSourceFunc (BioSourcePtr biop, SourceFormPtr sfp, Boolean is_feat)
 
9497
 
 
9498
{
 
9499
  CharPtr       foundit;
 
9500
  OrgModPtr     mod = NULL;
 
9501
  OrgNamePtr    onp;
 
9502
  OrgRefPtr     orp;
 
9503
  SubSourcePtr  ssp = NULL;
 
9504
  CharPtr       str = NULL;
 
9505
  CharPtr       str1 = NULL;
 
9506
  CharPtr       str2 = NULL;
 
9507
  CharPtr       tmp_str;
 
9508
  Int4          offset;
 
9509
 
 
9510
  if (biop == NULL || sfp == NULL) return;
 
9511
  if (! OkToOperateOnSource (biop, sfp)) return;
 
9512
  if (sfp->choice == 1) {
 
9513
    if (sfp->fromval == 999) {
 
9514
      ssp = FindSubSource (biop, 255, sfp, FALSE, FALSE, is_feat);
 
9515
      if (ssp != NULL)
 
9516
              str1 = ssp->name;
 
9517
 
 
9518
      mod = FindOrgMod (biop, 255, sfp, FALSE, FALSE);
 
9519
      if (mod != NULL)
 
9520
              str2 = mod->subname;
 
9521
    }
 
9522
    else if (sfp->fromval >= 100) {
 
9523
      ssp = FindSubSource (biop, sfp->fromval - 100, sfp, FALSE, FALSE, is_feat);
 
9524
      if (ssp == NULL) return;
 
9525
      str = ssp->name;
 
9526
    } else {
 
9527
      mod = FindOrgMod (biop, sfp->fromval, sfp, FALSE, FALSE);
 
9528
      if (mod == NULL) return;
 
9529
      str = mod->subname;
 
9530
    }
 
9531
    switch (sfp->type) {
 
9532
      case REMOVE_SOURCE :
 
9533
        break;
 
9534
      case CONVERT_SOURCE :
 
9535
        if (sfp->toval < 1) return;
 
9536
        if (StringHasNoText (sfp->findStr) || StringISearch (str, sfp->findStr) != NULL) {
 
9537
          if (sfp->toval >= 100 && ssp != NULL) {
 
9538
            ConvertSubSourceModifier (biop, sfp, is_feat, ssp);
 
9539
          } else if (sfp->toval < 100 && mod != NULL) {
 
9540
            ConvertOrganismModifier (biop, sfp, is_feat, mod);
 
9541
          } else if (sfp->toval < 100 && ssp != NULL) {
 
9542
            ConvertSubSourceToOrgMod (biop, sfp, is_feat, ssp);
 
9543
          } else if (sfp->toval >= 100 && mod != NULL) {
 
9544
            ConvertOrgModToSubSource (biop, sfp, is_feat, mod);
 
9545
          }
 
9546
        }
 
9547
        break;
 
9548
      case EDIT_SOURCE :
 
9549
        if (ssp != NULL) {
 
9550
          foundit = StringISearch (ssp->name, sfp->findStr);
 
9551
                  while (foundit != NULL) {
 
9552
                    offset = foundit - ssp->name + 1 + StringLen (sfp->replaceStr);
 
9553
            EditSourceString (&(ssp->name), sfp, foundit);
 
9554
                        foundit = StringISearch (ssp->name + offset, sfp->findStr);
 
9555
          }
 
9556
        } else if (mod != NULL) {
 
9557
          foundit = StringISearch (mod->subname, sfp->findStr);
 
9558
                  while (foundit != NULL) {
 
9559
                    offset = foundit - mod->subname + 1 + StringLen (sfp->replaceStr);
 
9560
            EditSourceString (&(mod->subname), sfp, foundit);
 
9561
                        foundit = StringISearch (mod->subname + offset, sfp->findStr);
 
9562
          }
 
9563
       }
 
9564
        break;
 
9565
      case ADD_SOURCE :
 
9566
        if (ssp != NULL) {
 
9567
          AppendOrReplaceString (&(ssp->name), sfp->findStr,
 
9568
                           &(sfp->replaceOldAsked),
 
9569
                           &(sfp->doReplaceAll),
 
9570
                           &(sfp->use_semicolon));
 
9571
          if (ssp->name == NULL &&
 
9572
              (ssp->subtype == SUBSRC_germline ||
 
9573
               ssp->subtype == SUBSRC_rearranged ||
 
9574
               ssp->subtype == SUBSRC_environmental_sample)) {
 
9575
              ssp->name = StringSave ("");
 
9576
          } else if (ssp->subtype == SUBSRC_transgenic && (! is_feat)) {
 
9577
            ssp->name = StringSave ("");
 
9578
          }
 
9579
        } else if (mod != NULL) {
 
9580
          AppendOrReplaceString (&(mod->subname), sfp->findStr,
 
9581
                           &(sfp->replaceOldAsked),
 
9582
                           &(sfp->doReplaceAll),
 
9583
                           &(sfp->use_semicolon));
 
9584
        }
 
9585
        break;
 
9586
      default :
 
9587
        break;
 
9588
    }
 
9589
  } else if (sfp->choice == 2) {
 
9590
    switch (sfp->type) {
 
9591
      case REMOVE_SOURCE :
 
9592
        if (sfp->fromval == 0 || biop->genome == sfp->fromval) {
 
9593
          biop->genome = 0;
 
9594
        }
 
9595
        break;
 
9596
      case CONVERT_SOURCE :
 
9597
        if (biop->genome == sfp->fromval) {
 
9598
          biop->genome = sfp->toval;
 
9599
        }
 
9600
        break;
 
9601
      case EDIT_SOURCE :
 
9602
      case ADD_SOURCE :
 
9603
        biop->genome = sfp->fromval;
 
9604
        break;
 
9605
      default :
 
9606
        break;
 
9607
    }
 
9608
  } else if (sfp->choice == 3) {
 
9609
    /* do origin */
 
9610
    switch (sfp->type) {
 
9611
      case REMOVE_SOURCE :
 
9612
        biop->origin = 0;
 
9613
        break;
 
9614
      case CONVERT_SOURCE :
 
9615
        if (biop->origin == sfp->fromval)
 
9616
        {
 
9617
          biop->origin = sfp->toval;
 
9618
        }
 
9619
        break;
 
9620
      case EDIT_SOURCE :
 
9621
      case ADD_SOURCE :
 
9622
        biop->origin = sfp->fromval;
 
9623
        break;
 
9624
      default :
 
9625
        break;
 
9626
    }
 
9627
  } else if (sfp->choice == 4) {
 
9628
    onp = NULL;
 
9629
    orp = biop->org;
 
9630
    if (orp != NULL) {
 
9631
      onp = orp->orgname;
 
9632
    }
 
9633
    switch (sfp->type) {
 
9634
      case REMOVE_SOURCE :
 
9635
        switch (sfp->fromval) {
 
9636
          case 1 :
 
9637
            if (orp != NULL) {
 
9638
              SetTaxNameAndRemoveTaxRef (orp, MemFree (orp->taxname));
 
9639
            }
 
9640
            break;
 
9641
          case 2 :
 
9642
            if (orp != NULL) {
 
9643
              orp->common = MemFree (orp->common);
 
9644
            }
 
9645
            break;
 
9646
          case 3 :
 
9647
            if (onp != NULL) {
 
9648
              onp->lineage = MemFree (onp->lineage);
 
9649
            }
 
9650
            break;
 
9651
          case 4 :
 
9652
            if (onp != NULL) {
 
9653
              onp->div = MemFree (onp->div);
 
9654
            }
 
9655
            break;
 
9656
          default :
 
9657
            break;
 
9658
        }
 
9659
        break;
 
9660
      case CONVERT_SOURCE :
 
9661
        ConvertSourceString (orp, sfp->fromval, sfp->toval);
 
9662
        break;
 
9663
      case EDIT_SOURCE :
 
9664
        switch (sfp->fromval) {
 
9665
          case 1 :
 
9666
            if (orp != NULL) {
 
9667
              foundit = StringISearch (orp->taxname, sfp->findStr);
 
9668
              if (foundit != NULL) {
 
9669
                tmp_str = StringSave (orp->taxname);
 
9670
                foundit = StringISearch (tmp_str, sfp->findStr);
 
9671
                EditSourceString (&(tmp_str), sfp, foundit);
 
9672
                SetTaxNameAndRemoveTaxRef (orp, tmp_str);
 
9673
              }
 
9674
            }
 
9675
            break;
 
9676
          case 2 :
 
9677
            if (orp != NULL) {
 
9678
              foundit = StringISearch (orp->common, sfp->findStr);
 
9679
              if (foundit != NULL) {
 
9680
                EditSourceString (&(orp->common), sfp, foundit);
 
9681
              }
 
9682
            }
 
9683
            break;
 
9684
          case 3 :
 
9685
            if (onp != NULL) {
 
9686
              foundit = StringISearch (onp->lineage, sfp->findStr);
 
9687
              if (foundit != NULL) {
 
9688
                EditSourceString (&(onp->lineage), sfp, foundit);
 
9689
              }
 
9690
            }
 
9691
            break;
 
9692
          case 4 :
 
9693
            if (onp != NULL) {
 
9694
              foundit = StringISearch (onp->div, sfp->findStr);
 
9695
              if (foundit != NULL) {
 
9696
                EditSourceString (&(onp->div), sfp, foundit);
 
9697
              }
 
9698
            }
 
9699
            break;
 
9700
          default :
 
9701
            break;
 
9702
        }
 
9703
        break;
 
9704
      case ADD_SOURCE :
 
9705
        break;
 
9706
      default :
 
9707
        break;
 
9708
    }
 
9709
  }
 
9710
}
 
9711
 
 
9712
static Boolean ProcessSourceGatherFunc (GatherContextPtr gcp)
 
9713
 
 
9714
{
 
9715
  BioSourcePtr   biop;
 
9716
  SeqFeatPtr     feat;
 
9717
  Boolean        is_feat = FALSE;
 
9718
  SourceFormPtr  sfp;
 
9719
  ValNodePtr     vnp;
 
9720
 
 
9721
  if (gcp == NULL) return TRUE;
 
9722
  sfp = (SourceFormPtr) gcp->userdata;
 
9723
  if (sfp == NULL) return TRUE;
 
9724
  if (gcp->thisitem == NULL) return TRUE;
 
9725
  biop = NULL;
 
9726
  if (gcp->thistype == OBJ_SEQFEAT) {
 
9727
    feat = (SeqFeatPtr) gcp->thisitem;
 
9728
    if (feat->data.choice == SEQFEAT_BIOSRC) {
 
9729
      biop = (BioSourcePtr) feat->data.value.ptrvalue;
 
9730
      is_feat = TRUE;
 
9731
    }
 
9732
  } else if (gcp->thistype == OBJ_SEQDESC) {
 
9733
    vnp = (ValNodePtr) gcp->thisitem;
 
9734
    if (vnp->choice == Seq_descr_source) {
 
9735
      biop = (BioSourcePtr) vnp->data.ptrvalue;
 
9736
    }
 
9737
  }
 
9738
  if (biop == NULL) return TRUE;
 
9739
  ProcessBioSourceFunc (biop, sfp, is_feat);
 
9740
  return TRUE;
 
9741
}
 
9742
 
 
9743
static void PutBioSourceOnPartAndProcess (SeqEntryPtr sep, Int2 onlythis, SourceFormPtr sfp)
 
9744
 
 
9745
{
 
9746
  BioSourcePtr       biop;
 
9747
  BioseqPtr          bsp;
 
9748
  BioseqSetPtr       bssp;
 
9749
  Int2               count;
 
9750
  SeqMgrDescContext  dcontext;
 
9751
  SeqEntryPtr        nsep;
 
9752
  SeqDescrPtr        sdp;
 
9753
  SeqEntryPtr        tmp;
 
9754
 
 
9755
  if (IS_Bioseq_set (sep)) {
 
9756
    bssp = (BioseqSetPtr) sep->data.ptrvalue;
 
9757
    if (bssp != NULL) {
 
9758
      if (onlythis != 0 && bssp->_class == BioseqseqSet_class_parts) {
 
9759
        for (tmp = bssp->seq_set, count = 1;
 
9760
             tmp != NULL && count != onlythis;
 
9761
             tmp = tmp->next, count++) continue;
 
9762
        if (tmp != NULL) {
 
9763
          PutBioSourceOnPartAndProcess (tmp, onlythis, sfp);
 
9764
        }
 
9765
      } else {
 
9766
        for (tmp = bssp->seq_set; tmp != NULL; tmp = tmp->next) {
 
9767
          PutBioSourceOnPartAndProcess (tmp, onlythis, sfp);
 
9768
        }
 
9769
      }
 
9770
      return;
 
9771
    }
 
9772
  }
 
9773
  nsep = FindNucSeqEntry (sep);
 
9774
  if (nsep == NULL) return;
 
9775
  bsp = (BioseqPtr) nsep->data.ptrvalue;
 
9776
  if (bsp == NULL) return;
 
9777
  if (bsp->repr == Seq_repr_raw) {
 
9778
    sdp = SeqEntryGetSeqDescr (nsep, Seq_descr_source, NULL);
 
9779
    if (sdp != NULL) {
 
9780
      biop = (BioSourcePtr) sdp->data.ptrvalue;
 
9781
      ProcessBioSourceFunc (biop, sfp, FALSE);
 
9782
      return;
 
9783
    }
 
9784
    sdp = SeqMgrGetNextDescriptor (bsp, NULL, Seq_descr_source, &dcontext);
 
9785
    if (sdp == NULL) return;
 
9786
    biop = (BioSourcePtr) sdp->data.ptrvalue;
 
9787
    if (biop != NULL) {
 
9788
      biop = (BioSourcePtr) AsnIoMemCopy ((Pointer) biop,
 
9789
                                          (AsnReadFunc) BioSourceAsnRead,
 
9790
                                          (AsnWriteFunc) BioSourceAsnWrite);
 
9791
      if (biop != NULL) {
 
9792
        sdp = CreateNewDescriptor (nsep, Seq_descr_source);
 
9793
        if (sdp != NULL) {
 
9794
          sdp->data.ptrvalue = (Pointer) biop;
 
9795
          ProcessBioSourceFunc (biop, sfp, FALSE);
 
9796
        }
 
9797
      }
 
9798
    }
 
9799
  }
 
9800
}
 
9801
 
 
9802
static ENUM_ALIST(origin_alist)
 
9803
{" ",               ORG_DEFAULT    },
 
9804
{"Natural",         ORG_NATURAL    },
 
9805
{"Natural Mutant",  ORG_NATMUT     },
 
9806
{"Mutant",          ORG_MUT        },
 
9807
{"Artificial",      ORG_ARTIFICIAL },
 
9808
{"Synthetic",       ORG_SYNTHETIC  },
 
9809
{"Other",           ORG_OTHER      },
 
9810
END_ENUM_ALIST
 
9811
 
 
9812
static void DoProcessSource (ButtoN b)
 
9813
 
 
9814
{
 
9815
  GatherScope    gs;
 
9816
  SeqEntryPtr    sep;
 
9817
  SourceFormPtr  sfp;
 
9818
  Char           str [32];
 
9819
  UIEnum         val;
 
9820
 
 
9821
  sfp = (SourceFormPtr) GetObjectExtra (b);
 
9822
  if (sfp == NULL) return;
 
9823
  Hide (sfp->form);
 
9824
  WatchCursor ();
 
9825
  Update ();
 
9826
  
 
9827
  sfp->applyChoiceVal = GetValue (sfp->applyChoiceGrp);  
 
9828
  sfp->text_to_have_str = SaveStringFromText (sfp->text_to_have);
 
9829
  if (GetEnumPopup (sfp->qual_to_have, subsource_and_orgmod_subtype_alistX, &val))
 
9830
  {
 
9831
          sfp->qual_to_have_val = (Int2) val;
 
9832
  }
 
9833
  else
 
9834
  {
 
9835
    sfp->qual_to_have_val = 0;
 
9836
  }
 
9837
 
 
9838
  
 
9839
  sfp->fromval = 0;
 
9840
  sfp->toval = 0;
 
9841
  sfp->choice = GetValue (sfp->sourceGroup);
 
9842
  if (sfp->choice == 1) {
 
9843
    if (REMOVE_SOURCE == sfp->type) {
 
9844
      if (GetEnumPopup (sfp->frommod, subsource_and_orgmod_subtype_remove_alistX,
 
9845
                        &val))
 
9846
        sfp->fromval = (Int2) val;
 
9847
      if (GetEnumPopup (sfp->tomod, subsource_and_orgmod_subtype_remove_alistX,
 
9848
                        &val))
 
9849
        sfp->toval = (Int2) val;
 
9850
    }
 
9851
    else {
 
9852
      if (GetEnumPopup (sfp->frommod, subsource_and_orgmod_subtype_alistX,
 
9853
                        &val))
 
9854
        sfp->fromval = (Int2) val;
 
9855
      if (GetEnumPopup (sfp->tomod, subsource_and_orgmod_subtype_alistX, &val))
 
9856
        sfp->toval = (Int2) val;
 
9857
    }
 
9858
  } else if (sfp->choice == 2) {
 
9859
    if (GetEnumPopup (sfp->fromgen, biosource_genome_alistX, &val)) {
 
9860
      sfp->fromval = (Int2) val;
 
9861
    }
 
9862
    if (GetEnumPopup (sfp->togen, biosource_genome_alistX, &val)) {
 
9863
      sfp->toval = (Int2) val;
 
9864
    }
 
9865
  } else if (sfp->choice == 3) {
 
9866
    if (GetEnumPopup (sfp->fromorigin, origin_alist, &val)) {
 
9867
      sfp->fromval = (Int2) val;
 
9868
    }
 
9869
    if (GetEnumPopup (sfp->toorigin, origin_alist, &val)) {
 
9870
      sfp->toval = (Int2) val;
 
9871
    }
 
9872
  } else if (sfp->choice == 4) {
 
9873
    if (GetEnumPopup (sfp->fromref, orgref_textfield_alist, &val)) {
 
9874
      sfp->fromval = (Int2) val;
 
9875
    }
 
9876
    if (GetEnumPopup (sfp->toref, orgref_textfield_alist, &val)) {
 
9877
      sfp->toval = (Int2) val;
 
9878
    }
 
9879
  }
 
9880
  if (sfp->fromval > 0 || (sfp->choice == 4 || sfp->type == REMOVE_SOURCE)) {
 
9881
    sfp->findStr = JustSaveStringFromText (sfp->findthis);
 
9882
    sfp->replaceStr = JustSaveStringFromText (sfp->replacewith);
 
9883
    if (sfp->type != EDIT_SOURCE) {
 
9884
      TrimSpacesAroundString (sfp->findStr);
 
9885
      TrimSpacesAroundString (sfp->replaceStr);
 
9886
    }
 
9887
    if (sfp->type != EDIT_SOURCE
 
9888
      || (! StringHasNoText (sfp->findStr))
 
9889
      || sfp->choice == 2
 
9890
      || sfp->choice == 3) {
 
9891
      sfp->replaceOldAsked = FALSE;
 
9892
      sfp->doReplaceAll = FALSE;
 
9893
      sfp->onlythis = 0;
 
9894
      if (sfp->applyToParts != NULL && GetStatus (sfp->applyToParts)) {
 
9895
        GetTitle (sfp->onlyThisPart, str, sizeof (str));
 
9896
        if (! StrToInt (str, &(sfp->onlythis))) {
 
9897
          sfp->onlythis = 0;
 
9898
        }
 
9899
      }
 
9900
      if (sfp->onlythis > 0) {
 
9901
        sep = GetTopSeqEntryForEntityID (sfp->input_entityID);
 
9902
        PutBioSourceOnPartAndProcess (sep, sfp->onlythis, sfp);
 
9903
      } else {
 
9904
        MemSet ((Pointer) (&gs), 0, sizeof (GatherScope));
 
9905
        gs.seglevels = 1;
 
9906
        MemSet((Pointer)(gs.ignore), (int)(TRUE), (size_t)(OBJ_MAX * sizeof(Boolean)));
 
9907
        gs.ignore[OBJ_BIOSEQ] = FALSE;
 
9908
        gs.ignore[OBJ_BIOSEQ_SEG] = FALSE;
 
9909
        gs.ignore[OBJ_SEQANNOT] = FALSE;
 
9910
        gs.ignore[OBJ_SEQFEAT] = FALSE;
 
9911
        gs.ignore[OBJ_SEQDESC] = FALSE;
 
9912
        GatherEntity (sfp->input_entityID, (Pointer) sfp, ProcessSourceGatherFunc, &gs);          
 
9913
      }
 
9914
    }
 
9915
  }
 
9916
  ArrowCursor ();
 
9917
  Update ();
 
9918
  if (indexerVersion && sfp->type == ADD_SOURCE) {
 
9919
    sep = GetTopSeqEntryForEntityID (sfp->input_entityID);
 
9920
    if (CountSeqEntryComponents (sep) == 1) {
 
9921
      Message (MSG_OK, "When only one record present, edit the BioSource directly");
 
9922
    }
 
9923
  }
 
9924
  ObjMgrSetDirtyFlag (sfp->input_entityID, TRUE);
 
9925
  ObjMgrSendMsg (OM_MSG_UPDATE, sfp->input_entityID, 0, 0);
 
9926
  if (GetStatus (sfp->leaveDlgUp)) {
 
9927
    Show (sfp->form);
 
9928
  } else {
 
9929
    Remove (sfp->form);
 
9930
  }
 
9931
}
 
9932
 
 
9933
 
 
9934
static void ChangeSourceGroup (GrouP g)
 
9935
 
 
9936
{
 
9937
  SourceFormPtr  sfp;
 
9938
  Int2           val;
 
9939
 
 
9940
  sfp = (SourceFormPtr) GetObjectExtra (g);
 
9941
  if (sfp == NULL) return;
 
9942
  val = GetValue (g);
 
9943
  switch (val) {
 
9944
    case 1 :
 
9945
      SafeHide (sfp->genGrp);
 
9946
      SafeHide (sfp->refGrp);
 
9947
      SafeShow (sfp->modGrp);
 
9948
      SafeShow (sfp->txtGrp);
 
9949
      SafeHide (sfp->originGrp);
 
9950
      break;
 
9951
    case 2 :
 
9952
      SafeHide (sfp->modGrp);
 
9953
      SafeHide (sfp->refGrp);
 
9954
      SafeHide (sfp->txtGrp);
 
9955
      SafeShow (sfp->genGrp);
 
9956
      SafeHide (sfp->originGrp);
 
9957
      break;
 
9958
    case 3 :
 
9959
      SafeHide (sfp->modGrp);
 
9960
      SafeHide (sfp->refGrp);
 
9961
      SafeHide (sfp->txtGrp);
 
9962
      SafeHide (sfp->genGrp);
 
9963
      SafeShow (sfp->originGrp);
 
9964
      break;
 
9965
    case 4 :
 
9966
      SafeHide (sfp->modGrp);
 
9967
      SafeHide (sfp->genGrp);
 
9968
      SafeShow (sfp->txtGrp);
 
9969
      SafeShow (sfp->refGrp);
 
9970
      SafeHide (sfp->originGrp);
 
9971
      break;
 
9972
    default :
 
9973
      SafeHide (sfp->modGrp);
 
9974
      SafeHide (sfp->genGrp);
 
9975
      SafeHide (sfp->refGrp);
 
9976
      SafeHide (sfp->txtGrp);
 
9977
      break;
 
9978
  }
 
9979
  Update ();
 
9980
}
 
9981
 
 
9982
static void SourceMessageProc (ForM f, Int2 mssg)
 
9983
 
 
9984
{
 
9985
  SourceFormPtr  sfp;
 
9986
 
 
9987
  sfp = (SourceFormPtr) GetObjectExtra (f);
 
9988
  if (sfp != NULL) {
 
9989
    if (sfp->appmessage != NULL) {
 
9990
      sfp->appmessage (f, mssg);
 
9991
    }
 
9992
  }
 
9993
}
 
9994
 
 
9995
static void CleanupSourceForm (GraphiC g, VoidPtr data)
 
9996
 
 
9997
{
 
9998
  SourceFormPtr  sfp;
 
9999
 
 
10000
  sfp = (SourceFormPtr) data;
 
10001
  if (sfp != NULL) {
 
10002
    MemFree (sfp->findStr);
 
10003
    MemFree (sfp->replaceStr);
 
10004
    MemFree (sfp->text_to_have_str);
 
10005
  }
 
10006
  StdCleanupFormProc (g, data);
 
10007
}
 
10008
 
 
10009
static PopuP PopupOrSingleList (GrouP prnt, Boolean macLike, PupActnProc actn, EnumFieldAssocPtr al, UIEnum val)
 
10010
 
 
10011
{
 
10012
#ifdef WIN_MOTIF
 
10013
  LisT  lst;
 
10014
 
 
10015
  lst = CreateEnumListDialog (prnt, 0, 16, (LstActnProc) actn, al, 0, NULL);
 
10016
  SetEnumPopup ((PopuP) lst, al, val);
 
10017
  return (PopuP) lst;
 
10018
#else
 
10019
  PopuP  pop;
 
10020
 
 
10021
  pop = CreateEnumPopupDialog (prnt, macLike, actn, al, 0, NULL);
 
10022
  SetEnumPopup (pop, al, val);
 
10023
  return pop;
 
10024
#endif
 
10025
}
 
10026
 
 
10027
extern Boolean HasPartsSet (SeqEntryPtr sep);
 
10028
 
 
10029
static void SourceApplyToPartsProc (ButtoN b)
 
10030
 
 
10031
{
 
10032
  SourceFormPtr  sfp;
 
10033
 
 
10034
  sfp = (SourceFormPtr) GetObjectExtra (b);
 
10035
  if (sfp == NULL) return;
 
10036
  if (GetStatus (b)) {
 
10037
    SafeEnable (sfp->onlyThisPart);
 
10038
  } else {
 
10039
    SafeDisable (sfp->onlyThisPart);
 
10040
  }
 
10041
}
 
10042
 
 
10043
static void ClearProcessSourceDlgText (ButtoN b)
 
10044
{
 
10045
  SourceFormPtr  sfp;
 
10046
 
 
10047
  sfp = (SourceFormPtr) GetObjectExtra (b);
 
10048
  if (sfp == NULL) return;
 
10049
 
 
10050
  switch (sfp->type) {
 
10051
    case REMOVE_SOURCE :
 
10052
      SetTitle (sfp->findthis, "");
 
10053
      break;
 
10054
    case CONVERT_SOURCE :
 
10055
      SetTitle (sfp->findthis, "");
 
10056
      break;
 
10057
    case EDIT_SOURCE :
 
10058
      SetTitle (sfp->findthis, "");
 
10059
      SetTitle (sfp->replacewith, "");
 
10060
      break;
 
10061
    case ADD_SOURCE :
 
10062
      SetTitle (sfp->findthis, "");
 
10063
      break;
 
10064
    default :
 
10065
      break;
 
10066
  }
 
10067
  Select (sfp->findthis);
 
10068
}
 
10069
 
 
10070
static void ClearProcessSourceDlg (ButtoN b)
 
10071
{
 
10072
  SourceFormPtr  sfp;
 
10073
 
 
10074
  sfp = (SourceFormPtr) GetObjectExtra (b);
 
10075
  if (sfp == NULL) return;
 
10076
 
 
10077
  if ( sfp->onlyThisPart != NULL) {
 
10078
    Disable (sfp->onlyThisPart);
 
10079
  }
 
10080
  SetValue (sfp->sourceGroup, 1);
 
10081
  Hide (sfp->modGrp);
 
10082
  switch (sfp->type) {
 
10083
    case REMOVE_SOURCE :
 
10084
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10085
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10086
      SetTitle (sfp->findthis, "");
 
10087
      SetValue (sfp->frommod, 1);
 
10088
      SetValue (sfp->fromorigin, 1);
 
10089
      break;
 
10090
    case CONVERT_SOURCE :
 
10091
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10092
      SetEnumPopup (sfp->togen, biosource_genome_alistX, 0);
 
10093
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10094
      SetEnumPopup (sfp->toref, orgref_textfield_alist, 0);
 
10095
      SetTitle (sfp->findthis, "");
 
10096
      SetValue (sfp->frommod, 1);
 
10097
      SetValue (sfp->tomod, 1);
 
10098
      SetValue (sfp->fromorigin, 1);
 
10099
      SetValue (sfp->toorigin, 1);
 
10100
      break;
 
10101
    case EDIT_SOURCE :
 
10102
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10103
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10104
      SetTitle (sfp->findthis, "");
 
10105
      SetTitle (sfp->replacewith, "");
 
10106
      SetValue (sfp->frommod, 1);
 
10107
      SetValue (sfp->fromorigin, 1);
 
10108
      break;
 
10109
    case ADD_SOURCE :
 
10110
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10111
      SetTitle (sfp->findthis, "");
 
10112
      SetValue (sfp->frommod, 1);
 
10113
      SetValue (sfp->fromorigin, 1);
 
10114
      break;
 
10115
    default :
 
10116
      break;
 
10117
  }
 
10118
  Hide (sfp->genGrp);
 
10119
  Hide (sfp->refGrp);
 
10120
  Show (sfp->modGrp);
 
10121
  SafeHide (sfp->originGrp);
 
10122
  Select (sfp->findthis);
 
10123
}
 
10124
 
 
10125
static void ChangeApplyTarget (GrouP g)
 
10126
{
 
10127
  SourceFormPtr  sfp;
 
10128
  Int2           val;
 
10129
 
 
10130
  sfp = (SourceFormPtr) GetObjectExtra (g);
 
10131
  if (sfp == NULL) return;
 
10132
  val = GetValue (g);
 
10133
  switch (val) {
 
10134
        case 1:
 
10135
      Disable (sfp->qual_to_have);
 
10136
      Disable (sfp->text_to_have);
 
10137
      break;
 
10138
        case 2:
 
10139
          Enable (sfp->qual_to_have);
 
10140
          Disable (sfp->text_to_have);
 
10141
          break;
 
10142
        case 4:
 
10143
          Disable (sfp->qual_to_have);
 
10144
          Enable (sfp->text_to_have);
 
10145
          break;
 
10146
  }
 
10147
}
 
10148
 
 
10149
static void ProcessSource (IteM i, Int2 type)
 
10150
 
 
10151
{
 
10152
  ButtoN             b;
 
10153
  BaseFormPtr        bfp;
 
10154
  GrouP              c;
 
10155
  GrouP              h;
 
10156
  GrouP              q;
 
10157
  SeqEntryPtr        sep;
 
10158
  StdEditorProcsPtr  sepp;
 
10159
  SourceFormPtr      sfp;
 
10160
  CharPtr            title;
 
10161
  WindoW             w;
 
10162
  GrouP              x;
 
10163
  GrouP              z;
 
10164
 
 
10165
#ifdef WIN_MAC
 
10166
  bfp = currentFormDataPtr;
 
10167
#else
 
10168
  bfp = GetObjectExtra (i);
 
10169
#endif
 
10170
  if (bfp == NULL) return;
 
10171
  sep = GetTopSeqEntryForEntityID (bfp->input_entityID);
 
10172
  if (sep == NULL) return;
 
10173
  sfp = (SourceFormPtr) MemNew (sizeof (SourceFormData));
 
10174
  if (sfp == NULL) return;
 
10175
  sfp->type = type;
 
10176
  switch (type) {
 
10177
    case REMOVE_SOURCE :
 
10178
      title = "Source Removal";
 
10179
      break;
 
10180
    case CONVERT_SOURCE :
 
10181
      title = "Source Conversion";
 
10182
      break;
 
10183
    case EDIT_SOURCE :
 
10184
      title = "Edit Source";
 
10185
      break;
 
10186
    case ADD_SOURCE :
 
10187
      title = "Add Source";
 
10188
      break;
 
10189
    default :
 
10190
      title = "?";
 
10191
      break;
 
10192
  }
 
10193
  w = FixedWindow (-50, -33, -10, -10, title, StdCloseWindowProc);
 
10194
  SetObjectExtra (w, sfp, CleanupSourceForm);
 
10195
  sfp->form = (ForM) w;
 
10196
  sfp->formmessage = SourceMessageProc;
 
10197
 
 
10198
  sepp = (StdEditorProcsPtr) GetAppProperty ("StdEditorForm");
 
10199
  if (sepp != NULL) {
 
10200
    SetActivate (w, sepp->activateForm);
 
10201
    sfp->appmessage = sepp->handleMessages;
 
10202
  }
 
10203
 
 
10204
  sfp->input_entityID = bfp->input_entityID;
 
10205
  sfp->input_itemID = bfp->input_itemID;
 
10206
  sfp->input_itemtype = bfp->input_itemtype;
 
10207
 
 
10208
  h = HiddenGroup (w, -1, 0, NULL);
 
10209
  SetGroupSpacing (h, 10, 10);
 
10210
 
 
10211
  z = HiddenGroup (h, 1, 0, NULL);
 
10212
  if (HasPartsSet (sep)) {
 
10213
    sfp->applyToParts = CheckBox (z, "Apply to segmented parts, not segmented sequence", SourceApplyToPartsProc);
 
10214
    SetObjectExtra (sfp->applyToParts, sfp, NULL);
 
10215
    x = HiddenGroup (z, 2, 0, NULL);
 
10216
    StaticPrompt (x, "Apply only to particular numbered segment", 0, dialogTextHeight, programFont, 'l');
 
10217
    sfp->onlyThisPart = DialogText (x, "", 4, NULL);
 
10218
    Disable (sfp->onlyThisPart);
 
10219
  } else {
 
10220
    sfp->onlyThisPart = NULL;
 
10221
  }
 
10222
 
 
10223
  sfp->sourceGroup = HiddenGroup (h, 4, 0, ChangeSourceGroup);
 
10224
  SetObjectExtra (sfp->sourceGroup, sfp, NULL);
 
10225
  RadioButton (sfp->sourceGroup, "Modifiers");
 
10226
  RadioButton (sfp->sourceGroup, "Location");
 
10227
  RadioButton (sfp->sourceGroup, "Origin");
 
10228
  RadioButton (sfp->sourceGroup, "Strings");
 
10229
  SetValue (sfp->sourceGroup, 1);
 
10230
 
 
10231
  q = HiddenGroup (h, 0, 0, NULL);
 
10232
 
 
10233
  sfp->modGrp = HiddenGroup (q, -4, 0, NULL);
 
10234
  switch (type) {
 
10235
    case REMOVE_SOURCE :
 
10236
      StaticPrompt (sfp->modGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
 
10237
      sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_remove_alistX, 0);
 
10238
      break;
 
10239
    case CONVERT_SOURCE :
 
10240
      StaticPrompt (sfp->modGrp, "From", 0, popupMenuHeight, programFont, 'l');
 
10241
      sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
 
10242
 
 
10243
      StaticPrompt (sfp->modGrp, "To", 0, popupMenuHeight, programFont, 'l');
 
10244
      sfp->tomod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
 
10245
      break;
 
10246
    case EDIT_SOURCE :
 
10247
      StaticPrompt (sfp->modGrp, "Type", 0, popupMenuHeight, programFont, 'l');
 
10248
      sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
 
10249
      break;
 
10250
    case ADD_SOURCE :
 
10251
      StaticPrompt (sfp->modGrp, "Type", 0, popupMenuHeight, programFont, 'l');
 
10252
      sfp->frommod = PopupOrSingleList (sfp->modGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);
 
10253
      break;
 
10254
    default :
 
10255
      break;
 
10256
  }
 
10257
  Hide (sfp->modGrp);
 
10258
 
 
10259
  sfp->genGrp = HiddenGroup (q, 4, 0, NULL);
 
10260
  switch (type) {
 
10261
    case REMOVE_SOURCE :
 
10262
      StaticPrompt (sfp->genGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
 
10263
      sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
 
10264
      InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
 
10265
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10266
      break;
 
10267
    case CONVERT_SOURCE :
 
10268
      StaticPrompt (sfp->genGrp, "From", 0, popupMenuHeight, programFont, 'l');
 
10269
      sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
 
10270
      InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
 
10271
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10272
 
 
10273
      StaticPrompt (sfp->genGrp, "To", 0, popupMenuHeight, programFont, 'l');
 
10274
      sfp->togen = PopupList (sfp->genGrp, TRUE, NULL);
 
10275
      InitEnumPopup (sfp->togen, biosource_genome_alistX, NULL);
 
10276
      SetEnumPopup (sfp->togen, biosource_genome_alistX, 0);
 
10277
      break;
 
10278
    case EDIT_SOURCE :
 
10279
      StaticPrompt (sfp->genGrp, "Type", 0, popupMenuHeight, programFont, 'l');
 
10280
      sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
 
10281
      InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
 
10282
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10283
      break;
 
10284
    case ADD_SOURCE :
 
10285
      StaticPrompt (sfp->genGrp, "Type", 0, popupMenuHeight, programFont, 'l');
 
10286
      sfp->fromgen = PopupList (sfp->genGrp, TRUE, NULL);
 
10287
      InitEnumPopup (sfp->fromgen, biosource_genome_alistX, NULL);
 
10288
      SetEnumPopup (sfp->fromgen, biosource_genome_alistX, 0);
 
10289
      break;
 
10290
    default :
 
10291
      break;
 
10292
  }
 
10293
  Hide (sfp->genGrp);
 
10294
 
 
10295
  sfp->refGrp = HiddenGroup (q, 4, 0, NULL);
 
10296
  switch (type) {
 
10297
    case REMOVE_SOURCE :
 
10298
      StaticPrompt (sfp->refGrp, "Remove", 0, popupMenuHeight, programFont, 'l');
 
10299
      sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
 
10300
      InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
 
10301
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10302
      break;
 
10303
    case CONVERT_SOURCE :
 
10304
      StaticPrompt (sfp->refGrp, "From", 0, popupMenuHeight, programFont, 'l');
 
10305
      sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
 
10306
      InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
 
10307
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10308
 
 
10309
      StaticPrompt (sfp->refGrp, "To", 0, popupMenuHeight, programFont, 'l');
 
10310
      sfp->toref = PopupList (sfp->refGrp, TRUE, NULL);
 
10311
      InitEnumPopup (sfp->toref, orgref_textfield_alist, NULL);
 
10312
      SetEnumPopup (sfp->toref, orgref_textfield_alist, 0);
 
10313
      break;
 
10314
    case EDIT_SOURCE :
 
10315
      StaticPrompt (sfp->refGrp, "Type", 0, popupMenuHeight, programFont, 'l');
 
10316
      sfp->fromref = PopupList (sfp->refGrp, TRUE, NULL);
 
10317
      InitEnumPopup (sfp->fromref, orgref_textfield_alist, NULL);
 
10318
      SetEnumPopup (sfp->fromref, orgref_textfield_alist, 0);
 
10319
      break;
 
10320
    case ADD_SOURCE :
 
10321
      break;
 
10322
    default :
 
10323
      break;
 
10324
  }
 
10325
  Hide (sfp->refGrp);
 
10326
 
 
10327
  Show (sfp->modGrp);
 
10328
 
 
10329
  sfp->txtGrp = NULL;
 
10330
  switch (type) {
 
10331
    case REMOVE_SOURCE :
 
10332
    case CONVERT_SOURCE :
 
10333
      sfp->txtGrp = HiddenGroup (h, 0, 3, NULL);
 
10334
      StaticPrompt (sfp->txtGrp, "Optional string constraint for item to change", 0, dialogTextHeight, programFont, 'c');
 
10335
      sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
 
10336
      break;
 
10337
    case ADD_SOURCE :
 
10338
      sfp->txtGrp = HiddenGroup (h, 2, 0, NULL);
 
10339
      StaticPrompt (sfp->txtGrp, "Text", 0, dialogTextHeight, programFont, 'c');
 
10340
      sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
 
10341
      break;
 
10342
    case EDIT_SOURCE :
 
10343
      sfp->txtGrp = HiddenGroup (h, 2, 0, NULL);
 
10344
      StaticPrompt (sfp->txtGrp, "Find", 0, dialogTextHeight, programFont, 'l');
 
10345
      sfp->findthis = DialogText (sfp->txtGrp, "", 14, NULL);
 
10346
      StaticPrompt (sfp->txtGrp, "Replace", 0, dialogTextHeight, programFont, 'l');
 
10347
      sfp->replacewith = DialogText (sfp->txtGrp, "", 14, NULL);
 
10348
      break;
 
10349
    default :
 
10350
      break;
 
10351
  }
 
10352
 
 
10353
  /* Build origin group */
 
10354
  switch (type) {
 
10355
    case REMOVE_SOURCE :
 
10356
      sfp->originGrp = HiddenGroup (h, 2, 0, NULL);
 
10357
      StaticPrompt (sfp->originGrp, "Remove", 0, dialogTextHeight, programFont, 'l');
 
10358
      sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
 
10359
      InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
 
10360
      break;
 
10361
    case ADD_SOURCE :
 
10362
    case EDIT_SOURCE :
 
10363
      sfp->originGrp = HiddenGroup (h, 2, 0, NULL);
 
10364
      StaticPrompt (sfp->originGrp, "Origin", 0, dialogTextHeight, programFont, 'l');
 
10365
      sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
 
10366
      InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
 
10367
      break;
 
10368
    case CONVERT_SOURCE :
 
10369
      sfp->originGrp = HiddenGroup (h, 4, 0, NULL);
 
10370
      StaticPrompt (sfp->originGrp, "From", 0, dialogTextHeight, programFont, 'l');
 
10371
      sfp->fromorigin = PopupList (sfp->originGrp, TRUE, NULL);
 
10372
      InitEnumPopup (sfp->fromorigin, origin_alist, NULL);
 
10373
      StaticPrompt (sfp->originGrp, "To", 0, dialogTextHeight, programFont, 'l');
 
10374
      sfp->toorigin = PopupList (sfp->originGrp, TRUE, NULL);
 
10375
      InitEnumPopup (sfp->toorigin, origin_alist, NULL);
 
10376
      break;
 
10377
  }
 
10378
  SafeHide (sfp->originGrp);
 
10379
  
 
10380
  sfp->applyChoiceGrp = HiddenGroup (h, 1, 3, ChangeApplyTarget);
 
10381
  SetObjectExtra (sfp->applyChoiceGrp, sfp, NULL);
 
10382
  RadioButton (sfp->applyChoiceGrp, "To every biosource");
 
10383
  RadioButton (sfp->applyChoiceGrp, "When qualifier present");
 
10384
  sfp->qual_to_have = PopupOrSingleList (sfp->applyChoiceGrp, TRUE, NULL, subsource_and_orgmod_subtype_alistX, 0);      
 
10385
  RadioButton (sfp->applyChoiceGrp, "When any qualifier or the organism name contains");
 
10386
  sfp->text_to_have = DialogText (sfp->applyChoiceGrp, "", 14, NULL);
 
10387
  SetValue (sfp->applyChoiceGrp, 1);
 
10388
  Disable (sfp->qual_to_have);
 
10389
  Disable (sfp->text_to_have);
 
10390
 
 
10391
  c = HiddenGroup (h, 5, 0, NULL);
 
10392
  b = DefaultButton (c, "Accept", DoProcessSource);
 
10393
  SetObjectExtra (b, sfp, NULL);
 
10394
  PushButton (c, "Cancel", StdCancelButtonProc);
 
10395
  b = PushButton (c, "Clear", ClearProcessSourceDlg);
 
10396
  SetObjectExtra (b, sfp, NULL);
 
10397
  b = PushButton (c, "Clear Text", ClearProcessSourceDlgText);
 
10398
  SetObjectExtra (b, sfp, NULL);
 
10399
  sfp->leaveDlgUp = CheckBox (c, "Leave Dialog Up", NULL);
 
10400
 
 
10401
  AlignObjects (ALIGN_CENTER, (HANDLE) sfp->applyChoiceGrp, (HANDLE) c, 
 
10402
                (HANDLE) sfp->sourceGroup,
 
10403
                (HANDLE) sfp->modGrp, (HANDLE) sfp->genGrp,
 
10404
                (HANDLE) sfp->refGrp, (HANDLE) sfp->txtGrp,
 
10405
                (HANDLE) sfp->originGrp, NULL);
 
10406
  RealizeWindow (w);
 
10407
  Show (w);
 
10408
  Select (sfp->findthis);
 
10409
  Update ();
 
10410
}
 
10411
 
 
10412
extern void RemoveSource (IteM i);
 
10413
extern void ConvertSource (IteM i);
 
10414
extern void EditSource (IteM i);
 
10415
extern void AddSource (IteM i);
 
10416
 
 
10417
extern void RemoveSource (IteM i)
 
10418
 
 
10419
{
 
10420
  ProcessSource (i, REMOVE_SOURCE);
 
10421
}
 
10422
 
 
10423
extern void ConvertSource (IteM i)
 
10424
 
 
10425
{
 
10426
  ProcessSource (i, CONVERT_SOURCE);
 
10427
}
 
10428
 
 
10429
extern void EditSource (IteM i)
 
10430
 
 
10431
{
 
10432
  ProcessSource (i, EDIT_SOURCE);
 
10433
}
 
10434
 
 
10435
extern void AddSource (IteM i)
 
10436
 
 
10437
{
 
10438
  ProcessSource (i, ADD_SOURCE);
 
10439
}
 
10440