6379
6963
return (DialoG) p;
6967
/* ExistingText handling dialog and structures */
6968
typedef struct existingtextdlg
6972
} ExistingTextDlgData, PNTR ExistingTextDlgPtr;
6974
static void ChangePreAppIgnoreChoice (GrouP g)
6976
ExistingTextDlgPtr etdp;
6979
etdp = (ExistingTextDlgPtr) GetObjectExtra (g);
6985
handle_choice = GetValue (etdp->pre_app_grp);
6986
if (handle_choice == 1 || handle_choice == 2)
6988
Enable (etdp->delim_grp);
6992
Disable (etdp->delim_grp);
6996
extern ExistingTextPtr GetExistingTextHandlerInfo (Int4 num_found, Boolean non_text)
7000
ExistingTextDlgData etdd;
7002
ModalAcceptCancelData acd;
7003
ExistingTextPtr etp;
7014
sprintf (txt, "%d affected fields already contain a value. Do you wish to overwrite existing text?",
7016
ans = Message (MSG_YNC, txt, 0, dialogTextHeight, systemFont, 'l');
7017
if (ans == ANS_CANCEL)
7019
etp = (ExistingTextPtr) MemNew (sizeof (ExistingTextData));
7020
etp->existing_text_choice = eExistingTextChoiceCancel;
7023
else if (ans == ANS_YES)
7025
etp = (ExistingTextPtr) MemNew (sizeof (ExistingTextData));
7026
etp->existing_text_choice = eExistingTextChoiceReplaceOld;
7030
w = MovableModalWindow(-20, -13, -10, -10, "How to Add New Text", NULL);
7031
h = HiddenGroup (w, -1, 0, NULL);
7032
SetGroupSpacing (h, 10, 10);
7033
etdd.pre_app_grp = HiddenGroup (h, 0, 3, ChangePreAppIgnoreChoice);
7034
SetGroupSpacing (etdd.pre_app_grp, 10, 10);
7035
RadioButton (etdd.pre_app_grp, "Append");
7036
RadioButton (etdd.pre_app_grp, "Prefix");
7037
RadioButton (etdd.pre_app_grp, "Ignore new text");
7038
SetValue (etdd.pre_app_grp, 1);
7039
SetObjectExtra (etdd.pre_app_grp, &etdd, NULL);
7041
ppt = StaticPrompt (h, "Separate new text and old text with",
7042
0, dialogTextHeight, programFont, 'c');
7043
etdd.delim_grp = HiddenGroup (h, 0, 4, NULL);
7044
SetGroupSpacing (etdd.delim_grp, 10, 10);
7045
RadioButton (etdd.delim_grp, "Semicolon");
7046
RadioButton (etdd.delim_grp, "Space");
7047
RadioButton (etdd.delim_grp, "Colon");
7048
RadioButton (etdd.delim_grp, "Do not separate");
7049
SetValue (etdd.delim_grp, 1);
7051
c = HiddenGroup (h, 2, 0, NULL);
7052
SetGroupSpacing (c, 10, 10);
7053
b = PushButton (c, "Accept", ModalAcceptButton);
7054
SetObjectExtra (b, &acd, NULL);
7055
b = PushButton (c, "Cancel", ModalCancelButton);
7056
SetObjectExtra (b, &acd, NULL);
7057
AlignObjects (ALIGN_CENTER, (HANDLE) etdd.pre_app_grp,
7059
(HANDLE) etdd.delim_grp,
7064
acd.accepted = FALSE;
7065
acd.cancelled = FALSE;
7066
while (!acd.accepted && ! acd.cancelled)
7068
ProcessExternalEvent ();
7072
etp = (ExistingTextPtr) MemNew (sizeof (ExistingTextData));
7075
etp->existing_text_choice = eExistingTextChoiceCancel;
7079
handle_choice = GetValue (etdd.pre_app_grp);
7080
if (handle_choice == 1)
7082
switch (GetValue (etdd.delim_grp))
7085
etp->existing_text_choice = eExistingTextChoiceAppendSemi;
7088
etp->existing_text_choice = eExistingTextChoiceAppendSpace;
7091
etp->existing_text_choice = eExistingTextChoiceAppendColon;
7094
etp->existing_text_choice = eExistingTextChoiceAppendNone;
7098
else if (handle_choice == 2)
7100
switch (GetValue (etdd.delim_grp))
7103
etp->existing_text_choice = eExistingTextChoicePrefixSemi;
7106
etp->existing_text_choice = eExistingTextChoicePrefixSpace;
7109
etp->existing_text_choice = eExistingTextChoicePrefixColon;
7112
etp->existing_text_choice = eExistingTextChoicePrefixNone;
7118
etp->existing_text_choice = eExistingTextChoiceLeaveOld;
7125
extern CharPtr HandleExistingText (CharPtr existing_text, CharPtr new_text, ExistingTextPtr etp)
7127
CharPtr rstring = NULL;
7130
if (StringHasNoText (existing_text) || etp == NULL)
7132
MemFree (existing_text);
7135
switch (etp->existing_text_choice)
7137
case eExistingTextChoiceReplaceOld:
7138
/* replace current text with new text */
7139
MemFree (existing_text);
7142
case eExistingTextChoiceLeaveOld:
7143
/* do not change current text */
7145
rstring = existing_text;
7147
case eExistingTextChoiceAppendSemi:
7148
/* Append new text to current text, separated by semicolon */
7149
len = StringLen (new_text) + StringLen (existing_text) + 4;
7150
rstring = MemNew (len);
7151
if (rstring != NULL) {
7152
StringCpy (rstring, existing_text);
7153
StringCat (rstring, "; ");
7154
StringCat (rstring, new_text);
7156
MemFree (existing_text);
7159
case eExistingTextChoiceAppendSpace:
7160
/* Append new text to current text, separated by space */
7161
len = StringLen (new_text) + StringLen (existing_text) + 3;
7162
rstring = MemNew (len);
7163
if (rstring != NULL) {
7164
StringCpy (rstring, existing_text);
7165
StringCat (rstring, " ");
7166
StringCat (rstring, new_text);
7168
MemFree (existing_text);
7171
case eExistingTextChoiceAppendColon:
7172
/* Append new text to current text, separated by colon */
7173
len = StringLen (new_text) + StringLen (existing_text) + 4;
7174
rstring = MemNew (len);
7175
if (rstring != NULL) {
7176
StringCpy (rstring, existing_text);
7177
StringCat (rstring, ": ");
7178
StringCat (rstring, new_text);
7180
MemFree (existing_text);
7183
case eExistingTextChoiceAppendNone:
7184
/* Append new text to current text, no delimiter */
7185
len = StringLen (new_text) + StringLen (existing_text) + 1;
7186
rstring = MemNew (len);
7187
if (rstring != NULL) {
7188
StringCpy (rstring, existing_text);
7189
StringCat (rstring, new_text);
7191
MemFree (existing_text);
7194
case eExistingTextChoicePrefixSemi:
7195
/* Prepend new text to current text, separated by semicolon */
7196
len = StringLen (new_text) + StringLen (existing_text) + 4;
7197
rstring = MemNew (len);
7198
if (rstring != NULL) {
7199
StringCpy (rstring, new_text);
7200
StringCat (rstring, "; ");
7201
StringCat (rstring, existing_text);
7203
MemFree (existing_text);
7206
case eExistingTextChoicePrefixSpace:
7207
/* Prepend new text to current text, separated by space */
7208
len = StringLen (new_text) + StringLen (existing_text) + 3;
7209
rstring = MemNew (len);
7210
if (rstring != NULL) {
7211
StringCpy (rstring, new_text);
7212
StringCat (rstring, " ");
7213
StringCat (rstring, existing_text);
7215
MemFree (existing_text);
7218
case eExistingTextChoicePrefixColon:
7219
/* Prepend new text to current text, separated by colon */
7220
len = StringLen (new_text) + StringLen (existing_text) + 4;
7221
rstring = MemNew (len);
7222
if (rstring != NULL) {
7223
StringCpy (rstring, new_text);
7224
StringCat (rstring, ": ");
7225
StringCat (rstring, existing_text);
7227
MemFree (existing_text);
7230
case eExistingTextChoicePrefixNone:
7231
/* prefix current text with new text */
7232
len = StringLen (new_text) + StringLen (existing_text) + 1;
7233
rstring = MemNew (len);
7234
if (rstring != NULL) {
7235
StringCpy (rstring, new_text);
7236
StringCat (rstring, existing_text);
7238
MemFree (existing_text);
7246
/* Move EditApply data and dialog here */
7247
extern EditApplyPtr EditApplyFree (EditApplyPtr eap)
7251
eap->find_txt = MemFree (eap->find_txt);
7252
eap->repl_txt = MemFree (eap->repl_txt);
7253
eap->apply_txt = MemFree (eap->apply_txt);
7254
eap = MemFree (eap);
7260
extern EditApplyPtr EditApplyNew (void)
7264
eap = (EditApplyPtr) MemNew (sizeof (EditApplyData));
7265
eap->find_location = EditApplyFindLocation_anywhere;
7270
typedef struct EditApplydlg
7272
DIALOG_MESSAGE_BLOCK
7282
GrouP location_choice;
7283
Nlm_ChangeNotifyProc change_notify;
7284
Pointer change_userdata;
7285
} EditApplyDlgData, PNTR EditApplyDlgPtr;
7287
static void ResetEditApplyDlg (EditApplyDlgPtr dlg)
7291
if (dlg->find_txt != NULL)
7293
SetTitle (dlg->find_txt, "");
7295
if (dlg->repl_txt != NULL)
7297
SetTitle (dlg->repl_txt, "");
7299
if (dlg->apply_txt != NULL)
7301
SetTitle (dlg->apply_txt, "");
7303
if (dlg->location_choice != NULL) {
7304
SetValue (dlg->location_choice, EditApplyFindLocation_anywhere);
7307
PointerToDialog (dlg->find_dlg, NULL);
7308
PointerToDialog (dlg->repl_dlg, NULL);
7309
PointerToDialog (dlg->apply_dlg, NULL);
7314
static void EditApplyDialogChangeText (TexT t)
7316
EditApplyDlgPtr dlg;
7318
dlg = (EditApplyDlgPtr) GetObjectExtra (t);
7319
if (dlg != NULL && dlg->change_notify != NULL)
7321
(dlg->change_notify)(dlg->change_userdata);
7325
static void EditApplyToDialog (DialoG d, Pointer userdata)
7327
EditApplyDlgPtr dlg;
7331
dlg = (EditApplyDlgPtr) GetObjectExtra (d);
7337
ResetEditApplyDlg (dlg);
7338
data = (EditApplyPtr) userdata;
7345
if (!StringHasNoText (data->find_txt))
7347
if (dlg->find_txt != NULL)
7349
SetTitle (dlg->find_txt, data->find_txt);
7351
else if (dlg->find_dlg != NULL)
7353
vn.data.ptrvalue = data->find_txt;
7354
PointerToDialog (dlg->find_dlg, &vn);
7358
if (!StringHasNoText (data->repl_txt))
7360
if (dlg->repl_txt != NULL)
7362
SetTitle (dlg->repl_txt, data->repl_txt);
7364
else if (dlg->repl_dlg != NULL)
7366
vn.data.ptrvalue = data->repl_txt;
7367
PointerToDialog (dlg->repl_dlg, &vn);
7371
if (!StringHasNoText (data->apply_txt))
7373
if (dlg->apply_txt != NULL)
7375
SetTitle (dlg->apply_txt, data->apply_txt);
7377
else if (dlg->apply_dlg != NULL)
7379
vn.data.ptrvalue = data->apply_txt;
7380
PointerToDialog (dlg->apply_dlg, &vn);
7384
if (dlg->location_choice != NULL) {
7385
SetValue (dlg->location_choice, data->find_location);
7390
static Pointer DialogToEditApply (DialoG d)
7392
EditApplyDlgPtr dlg;
7396
dlg = (EditApplyDlgPtr) GetObjectExtra (d);
7402
data = (EditApplyPtr) MemNew (sizeof (EditApplyData));
7405
if (dlg->find_txt != NULL)
7407
data->find_txt = JustSaveStringFromText (dlg->find_txt);
7409
else if (dlg->find_dlg != NULL)
7411
vnp = (ValNodePtr) DialogToPointer (dlg->find_dlg);
7414
data->find_txt = StringSave (vnp->data.ptrvalue);
7416
vnp = ValNodeFreeData (vnp);
7419
if (dlg->repl_txt != NULL)
7421
data->repl_txt = JustSaveStringFromText (dlg->repl_txt);
7423
else if (dlg->repl_dlg != NULL)
7425
vnp = (ValNodePtr) DialogToPointer (dlg->repl_dlg);
7428
data->repl_txt = StringSave (vnp->data.ptrvalue);
7430
vnp = ValNodeFreeData (vnp);
7433
if (dlg->apply_txt != NULL)
7435
data->apply_txt = JustSaveStringFromText (dlg->apply_txt);
7437
else if (dlg->apply_dlg != NULL)
7439
vnp = (ValNodePtr) DialogToPointer (dlg->apply_dlg);
7442
data->apply_txt = StringSave (vnp->data.ptrvalue);
7444
vnp = ValNodeFreeData (vnp);
7447
if (dlg->location_choice != NULL) {
7448
data->find_location = (EditApplyFindLocation) GetValue (dlg->location_choice);
7450
data->find_location = EditApplyFindLocation_anywhere;
7457
static void EditApplyMessage (DialoG d, Int2 mssg)
7460
EditApplyDlgPtr dlg;
7462
dlg = (EditApplyDlgPtr) GetObjectExtra (d);
7468
ResetEditApplyDlg (dlg);
7470
case VIB_MSG_ENTER :
7471
if (dlg->find_txt != NULL)
7473
Select (dlg->find_txt);
7475
else if (dlg->apply_txt != NULL)
7477
Select (dlg->apply_txt);
7479
else if (dlg->find_dlg != NULL)
7481
Select (dlg->find_dlg);
7483
else if (dlg->apply_dlg != NULL)
7485
Select (dlg->apply_dlg);
7494
static ValNodePtr TestEditApply (DialoG d)
7496
EditApplyDlgPtr dlg;
7497
ValNodePtr total_err_list = NULL, err_list;
7499
dlg = (EditApplyDlgPtr) GetObjectExtra (d);
7505
if (dlg->action_choice == eEditApplyChoice_Apply)
7507
if (dlg->apply_dlg == NULL)
7509
if (TextHasNoText (dlg->apply_txt))
7511
ValNodeAddPointer (&total_err_list, 0, StringSave ("apply text"));
7516
total_err_list = TestDialog (dlg->apply_dlg);
7519
else if (dlg->action_choice == eEditApplyChoice_Edit)
7521
if (dlg->find_dlg == NULL)
7523
if (TextHasNoText (dlg->find_txt))
7525
ValNodeAddPointer (&total_err_list, 0, StringSave ("find text"));
7530
total_err_list = TestDialog (dlg->find_dlg);
7531
err_list = TestDialog (dlg->repl_dlg);
7532
ValNodeLink (&total_err_list, err_list);
7535
return total_err_list;
7538
static void EditApplyDialogCopy (ButtoN b)
7540
EditApplyDlgPtr dlg;
7543
dlg = (EditApplyDlgPtr) GetObjectExtra (b);
7548
str = JustSaveStringFromText (dlg->find_txt);
7549
SetTitle (dlg->repl_txt, str);
7550
str = MemFree (str);
7553
extern DialoG EditApplyDialog
7556
CharPtr apply_label,
7557
ValNodePtr choice_list,
7558
Nlm_ChangeNotifyProc change_notify,
7559
Pointer change_userdata)
7561
EditApplyDlgPtr dlg;
7566
dlg = (EditApplyDlgPtr) MemNew (sizeof (EditApplyDlgData));
7572
p = HiddenGroup (h, -1, 0, NULL);
7573
SetObjectExtra (p, dlg, StdCleanupExtraProc);
7574
SetGroupSpacing (p, 10, 10);
7576
dlg->dialog = (DialoG) p;
7577
dlg->todialog = EditApplyToDialog;
7578
dlg->fromdialog = DialogToEditApply;
7579
dlg->dialogmessage = EditApplyMessage;
7580
dlg->testdialog = TestEditApply;
7581
dlg->action_choice = action_choice;
7582
dlg->change_notify = change_notify;
7583
dlg->change_userdata = change_userdata;
7585
if (choice_list == NULL)
7587
p1 = HiddenGroup (p, 3, 0, NULL);
7588
SetGroupSpacing (p1, 10, 10);
7590
if (action_choice == eEditApplyChoice_Apply)
7592
StaticPrompt (p1, apply_label, 0, dialogTextHeight, systemFont, 'r');
7593
dlg->apply_txt = DialogText (p1, "", 20, EditApplyDialogChangeText);
7594
SetObjectExtra (dlg->apply_txt, dlg, NULL);
7595
dlg->location_choice = NULL;
7597
else if (action_choice == eEditApplyChoice_Edit)
7599
StaticPrompt (p1, "Find", 0, dialogTextHeight, systemFont, 'r');
7600
dlg->find_txt = DialogText (p1, "", 18, EditApplyDialogChangeText);
7601
SetObjectExtra (dlg->find_txt, dlg, NULL);
7602
b = PushButton (p1, "Copy", EditApplyDialogCopy);
7603
SetObjectExtra (b, dlg, NULL);
7605
StaticPrompt (p1, "Replace", 0, dialogTextHeight, systemFont, 'r');
7606
dlg->repl_txt = DialogText (p1, "", 18, EditApplyDialogChangeText);
7607
SetObjectExtra (dlg->repl_txt, dlg, NULL);
7608
b = PushButton (p1, "Copy", EditApplyDialogCopy);
7609
SetObjectExtra (b, dlg, NULL);
7611
dlg->location_choice = HiddenGroup (p, 3, 0, NULL);
7612
RadioButton (dlg->location_choice, "Anywhere in field");
7613
RadioButton (dlg->location_choice, "At the beginning of the field");
7614
RadioButton (dlg->location_choice, "At the end of the field");
7615
SetValue (dlg->location_choice, EditApplyFindLocation_anywhere);
7620
if (action_choice == eEditApplyChoice_Apply)
7622
p1 = HiddenGroup (p, 1, 0, NULL);
7623
SetGroupSpacing (p1, 10, 10);
7624
if (!StringHasNoText (apply_label))
7626
StaticPrompt (p1, apply_label, 0, dialogTextHeight, systemFont, 'r');
7628
cpy = ValNodeDupStringList (choice_list);
7629
dlg->apply_dlg = ValNodeSelectionDialog (p1, cpy, 6,
7631
ValNodeSimpleDataFree,
7635
dlg->change_notify, dlg->change_userdata, FALSE);
7637
else if (action_choice == eEditApplyChoice_Edit)
7639
p1 = HiddenGroup (p, 2, 0, NULL);
7640
SetGroupSpacing (p1, 10, 10);
7641
StaticPrompt (p1, "From", 0, dialogTextHeight, systemFont, 'r');
7642
StaticPrompt (p1, "To", 0, dialogTextHeight, systemFont, 'r');
7644
cpy = ValNodeDupStringList (choice_list);
7645
dlg->find_dlg = ValNodeSelectionDialog (p1, cpy, 6,
7647
ValNodeSimpleDataFree,
7651
dlg->change_notify, dlg->change_userdata, FALSE);
7652
cpy = ValNodeDupStringList (choice_list);
7653
dlg->repl_dlg = ValNodeSelectionDialog (p1, cpy, 6,
7655
ValNodeSimpleDataFree,
7659
dlg->change_notify, dlg->change_userdata, FALSE);
7662
dlg->location_choice = NULL;
7664
AlignObjects (ALIGN_CENTER, (HANDLE) p1, (HANDLE) dlg->location_choice, NULL);
7670
/* Global Inference Editor Dialog */
7672
extern InferenceParsePtr ParseInferenceText (CharPtr inference)
7676
InferenceParsePtr ipp;
7678
if (StringHasNoText (inference))
7683
cp1 = StringChr (inference, ':');
7688
cp2 = StringChr (cp1 + 1, ':');
7694
ipp = (InferenceParsePtr) MemNew (sizeof (InferenceParseData));
7695
ipp->second_field = StringSave (cp2 + 1);
7698
ipp->first_field = (CharPtr) MemNew (sizeof (Char) * len);
7699
StringNCpy (ipp->first_field, cp1 + 1, len - 1);
7700
ipp->first_field[len - 1] = 0;
7702
/* look for same species */
7703
cp2 = StringISearch (inference, "(same species)");
7704
if (cp2 != NULL && cp2 < cp1)
7706
ipp->same_species = TRUE;
7711
ipp->same_species = FALSE;
7713
len = cp1 - inference + 1;
7714
ipp->category = (CharPtr) MemNew (sizeof (Char) * len);
7715
StringNCpy (ipp->category, inference, len - 1);
7716
ipp->category[len - 1] = 0;
7717
TrimSpacesAroundString (ipp->category);
7718
TrimSpacesAroundString (ipp->first_field);
7719
TrimSpacesAroundString (ipp->second_field);
7725
extern CharPtr InferenceTextFromStruct (InferenceParsePtr ipp)
7728
CharPtr inference = NULL;
7729
CharPtr same_sp = " (same species)";
7731
if (ipp == NULL) return NULL;
7733
len = StringLen (ipp->category) + StringLen (ipp->first_field) + StringLen (ipp->second_field)
7735
if (ipp->same_species)
7737
len += StringLen (same_sp);
7740
inference = (CharPtr) MemNew (sizeof (Char) * len);
7741
sprintf (inference, "%s%s:%s:%s", ipp->category == NULL ? "" : ipp->category,
7742
ipp->same_species ? same_sp : "",
7743
ipp->first_field == NULL ? "" : ipp->first_field,
7744
ipp->second_field == NULL ? "" : ipp->second_field);
7750
eInferenceCategorySimilarTo = 0,
7751
eInferenceCategoryProgram,
7752
eInferenceCategoryAbInitio,
7753
eNumInferenceCategories } EInferenceCategoryType;
7756
static Int4 GetCategoryTypeFromNum (Int4 num)
7758
if (num > 0 && num < 8)
7760
return eInferenceCategorySimilarTo;
7762
else if (num > 7 && num < 11)
7764
return eInferenceCategoryProgram;
7768
return eInferenceCategoryAbInitio;
7777
static Int4 GetCategoryNumFromName (CharPtr category)
7781
if (StringHasNoText (category))
7786
for (i = 0; inference_alist[i].name != NULL; i++)
7788
if (StringICmp (inference_alist[i].name, category) == 0)
7797
extern InferenceFieldEditPtr InferenceFieldEditFree (InferenceFieldEditPtr ifep)
7801
ifep->edit_apply = EditApplyFree (ifep->edit_apply);
7802
ifep = MemFree (ifep);
7807
extern InferenceEditPtr InferenceEditFree (InferenceEditPtr iep)
7811
iep->field_edit = InferenceFieldEditFree (iep->field_edit);
7812
iep = MemFree (iep);
7817
typedef struct inferencefieldeditdialog
7819
DIALOG_MESSAGE_BLOCK
7821
PopuP field_category;
7822
PopuP field_list[eNumInferenceCategories];
7823
DialoG field_editors[eNumInferenceCategories * 2];
7824
Nlm_ChangeNotifyProc change_notify;
7825
Pointer change_userdata;
7827
} InferenceFieldEditDialogData, PNTR InferenceFieldEditDialogPtr;
7830
static Pointer InferenceFieldEditDataFromDialog (DialoG d)
7832
InferenceFieldEditDialogPtr dlg;
7835
InferenceFieldEditPtr data = NULL;
7837
dlg = (InferenceFieldEditDialogPtr) GetObjectExtra (d);
7838
if (dlg == NULL) return NULL;
7840
if (GetEnumPopup (dlg->field_category, inference_alist, &val)
7842
&& (i = GetCategoryTypeFromNum (val)) > -1
7843
&& (j = GetValue (dlg->field_list[i])) > 0
7846
data = (InferenceFieldEditPtr) MemNew (sizeof (InferenceFieldEditData));
7847
data->field_category = inferencePrefix[val];
7848
data->field_choice = j - 1;
7849
data->edit_apply = DialogToPointer (dlg->field_editors[2 * i + j - 1]);
7855
static void ChangeInferenceFieldChoice (PopuP p)
7857
InferenceFieldEditDialogPtr dlg;
7861
dlg = (InferenceFieldEditDialogPtr) GetObjectExtra (p);
7862
if (dlg == NULL) return;
7864
for (i = eInferenceCategorySimilarTo;
7865
i <= eInferenceCategoryAbInitio;
7868
Hide (dlg->field_list[i]);
7869
Hide (dlg->field_editors[2 * i]);
7870
Hide (dlg->field_editors[2 * i + 1]);
7873
if (GetEnumPopup (dlg->field_category, inference_alist, &val)
7875
&& (i = GetCategoryTypeFromNum (val)) > -1)
7877
Show (dlg->field_list[i]);
7878
j = GetValue (dlg->field_list[i]);
7881
Show (dlg->field_editors[2 * i + j - 1]);
7885
if (dlg->change_notify != NULL)
7887
(dlg->change_notify)(dlg->change_userdata);
7891
static ValNodePtr MakeValNodeListFromEnum ( EnumFieldAssocPtr al)
7893
EnumFieldAssocPtr efap;
7898
while (efap->name != NULL)
7900
ValNodeAddStr (&list, efap->value, StringSave (efap->name));
7908
CreateInferenceFieldEditApplyDialog
7911
Nlm_ChangeNotifyProc change_notify,
7912
Pointer change_userdata)
7914
InferenceFieldEditDialogPtr dlg;
7917
ValNodePtr choice_list;
7919
dlg = (InferenceFieldEditDialogPtr) MemNew (sizeof (InferenceFieldEditDialogData));
7924
p = HiddenGroup (h, 3, 0, NULL);
7925
SetObjectExtra (p, dlg, StdCleanupExtraProc);
7926
SetGroupSpacing (p, 10, 10);
7928
dlg->dialog = (DialoG) p;
7929
dlg->todialog = NULL;
7930
dlg->fromdialog = InferenceFieldEditDataFromDialog;
7931
dlg->dialogmessage = NULL;
7932
dlg->testdialog = NULL;
7934
dlg->change_notify = change_notify;
7935
dlg->change_userdata = change_userdata;
7937
StaticPrompt (p, "Category", 0, popupMenuHeight, programFont, 'c');
7938
StaticPrompt (p, "Field", 0, popupMenuHeight, programFont, 'c');
7939
if (action_choice == eEditApplyChoice_Apply)
7941
StaticPrompt (p, "New Value", 0, popupMenuHeight, programFont, 'c');
7945
StaticPrompt (p, "Convert", 0, popupMenuHeight, programFont, 'c');
7948
dlg->field_category = PopupList (p, TRUE, ChangeInferenceFieldChoice);
7949
SetObjectExtra (dlg->field_category, dlg, NULL);
7950
InitEnumPopup (dlg->field_category, inference_alist, NULL);
7953
k = HiddenGroup (p, 0, 0, NULL);
7954
dlg->field_list[eInferenceCategorySimilarTo] = PopupList (k, TRUE, ChangeInferenceFieldChoice);
7955
SetObjectExtra (dlg->field_list[eInferenceCategorySimilarTo], dlg, NULL);
7956
PopupItem (dlg->field_list[eInferenceCategorySimilarTo], "Database");
7957
PopupItem (dlg->field_list[eInferenceCategorySimilarTo], "Accession");
7959
dlg->field_list[eInferenceCategoryProgram] = PopupList (k, TRUE, ChangeInferenceFieldChoice);
7960
SetObjectExtra (dlg->field_list[eInferenceCategoryProgram], dlg, NULL);
7961
PopupItem (dlg->field_list[eInferenceCategoryProgram], "Program or Database");
7962
PopupItem (dlg->field_list[eInferenceCategoryProgram], "Version or Accession");
7964
dlg->field_list[eInferenceCategoryAbInitio] = PopupList (k, TRUE, ChangeInferenceFieldChoice);
7965
SetObjectExtra (dlg->field_list[eInferenceCategoryAbInitio], dlg, NULL);
7966
PopupItem (dlg->field_list[eInferenceCategoryAbInitio], "Program");
7967
PopupItem (dlg->field_list[eInferenceCategoryAbInitio], "Program Version");
7969
k = HiddenGroup (p, 0, 0, NULL);
7971
choice_list = MakeValNodeListFromEnum (accn_type_alist);
7972
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", choice_list, change_notify, change_userdata);
7973
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", NULL, change_notify, change_userdata);
7974
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", NULL, change_notify, change_userdata);
7975
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", NULL, change_notify, change_userdata);
7976
choice_list = MakeValNodeListFromEnum (program_alist);
7977
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", choice_list, change_notify, change_userdata);
7978
dlg->field_editors[i++] = EditApplyDialog (k, action_choice, "", NULL, change_notify, change_userdata);
7980
ChangeInferenceFieldChoice (dlg->field_category);
7985
typedef struct inferenceeditdialog {
7986
DIALOG_MESSAGE_BLOCK
7988
GrouP action_pages[eNumInferenceEditActions];
7989
PopuP category_from;
7995
Nlm_ChangeNotifyProc change_notify;
7996
Pointer change_userdata;
7998
} InferenceEditDialogData, PNTR InferenceEditDialogPtr;
8001
static Pointer InferenceEditDataFromDialog (DialoG d)
8003
InferenceEditDialogPtr dlg;
8004
InferenceEditPtr data;
8007
dlg = (InferenceEditDialogPtr) GetObjectExtra (d);
8008
if (dlg == NULL) return NULL;
8010
data = (InferenceEditPtr) MemNew (sizeof (InferenceEditData));
8011
if (data == NULL) return NULL;
8013
data->action = (EInferenceEditAction) (GetValue (dlg->action) - 1);
8015
switch (data->action)
8017
case eInferenceRemove:
8018
/* no other data needed */
8020
case eInferenceEditCategory:
8021
i = GetValue (dlg->category_from);
8024
data->category_from = NULL;
8028
data->category_from = inferencePrefix[i - 2];
8030
i = GetValue (dlg->category_to);
8033
data->category_to = NULL;
8037
data->category_to = inferencePrefix[i - 1];
8040
case eInferenceApplyCategoryFields:
8041
data->field_edit = DialogToPointer (dlg->apply_field);
8043
case eInferenceEditCategoryFields:
8044
data->field_edit = DialogToPointer (dlg->edit_field);
8054
static void ChangeInferenceEditAction (PopuP p)
8056
InferenceEditDialogPtr dlg;
8059
dlg = (InferenceEditDialogPtr) GetObjectExtra (p);
8060
if (dlg == NULL) return;
8063
for (i = 0; i < eNumInferenceEditActions; i++)
8065
Hide (dlg->action_pages[i]);
8068
i = GetValue (dlg->action);
8069
if (i > 0 && i <= eNumInferenceEditActions)
8071
Show (dlg->action_pages[i - 1]);
8074
if (dlg->change_notify != NULL)
8076
(dlg->change_notify) (dlg->change_userdata);
8081
static void ChangeInferenceCategoryChoice (PopuP p)
8083
InferenceEditDialogPtr dlg;
8085
dlg = (InferenceEditDialogPtr) GetObjectExtra (p);
8086
if (dlg == NULL) return;
8088
if (dlg->change_notify != NULL)
8090
(dlg->change_notify) (dlg->change_userdata);
8095
static ValNodePtr TestInferenceEditDialog (DialoG d)
8097
ValNodePtr err_list = NULL;
8098
InferenceEditPtr iep;
8100
iep = DialogToPointer (d);
8103
ValNodeAddPointer (&err_list, 0, "no values");
8107
switch (iep->action)
8109
case eInferenceRemove:
8110
/* nothing to check */
8112
case eInferenceEditCategory:
8113
if (StringHasNoText (iep->category_from))
8115
ValNodeAddPointer (&err_list, 0, "missing category from");
8117
if (StringHasNoText (iep->category_to))
8119
ValNodeAddPointer (&err_list, 0, "missing category to");
8122
case eInferenceApplyCategoryFields:
8123
case eInferenceEditCategoryFields:
8124
if (iep->field_edit == NULL)
8126
ValNodeAddPointer (&err_list, 0, "missing edit data");
8133
iep = InferenceEditFree (iep);
8139
extern DialoG CreateInferenceEditDialog
8141
Nlm_ChangeNotifyProc change_notify,
8142
Pointer change_userdata)
8144
InferenceEditDialogPtr dlg;
8147
Nlm_EnumFieldAssocPtr eap;
8149
dlg = (InferenceEditDialogPtr) MemNew (sizeof (InferenceEditDialogData));
8154
p = HiddenGroup (h, -1, 0, NULL);
8155
SetObjectExtra (p, dlg, StdCleanupExtraProc);
8156
SetGroupSpacing (p, 10, 10);
8158
dlg->dialog = (DialoG) p;
8159
dlg->todialog = NULL;
8160
dlg->fromdialog = InferenceEditDataFromDialog;
8161
dlg->dialogmessage = NULL;
8162
dlg->testdialog = TestInferenceEditDialog;
8164
dlg->change_notify = change_notify;
8165
dlg->change_userdata = change_userdata;
8167
dlg->action = PopupList (p, TRUE, ChangeInferenceEditAction);
8168
SetObjectExtra (dlg->action, dlg, NULL);
8169
PopupItem (dlg->action, "Remove");
8170
PopupItem (dlg->action, "Change Category");
8171
PopupItem (dlg->action, "Apply Category Fields");
8172
PopupItem (dlg->action, "Edit Category Fields");
8173
SetValue (dlg->action, eInferenceRemove + 1);
8175
g = HiddenGroup (p, 0, 0, NULL);
8179
dlg->action_pages[i] = HiddenGroup (g, -1, 0, NULL);
8180
StaticPrompt (dlg->action_pages[i], "Hit Accept to Remove Inferences", 0, popupMenuHeight, programFont, 'c');
8183
/* edit category group */
8184
dlg->action_pages[i] = HiddenGroup (g, 2, 0, NULL);
8185
StaticPrompt (dlg->action_pages[i], "Original Category", 0, popupMenuHeight, programFont, 'c');
8186
dlg->category_from = PopupList (dlg->action_pages[i], TRUE, ChangeInferenceCategoryChoice);
8187
SetObjectExtra (dlg->category_from, dlg, NULL);
8188
PopupItem (dlg->category_from, "Any");
8189
eap = inference_alist;
8190
while (eap->name != NULL) {
8191
PopupItem (dlg->category_from, eap->name);
8195
StaticPrompt (dlg->action_pages[i], "New Category", 0, popupMenuHeight, programFont, 'c');
8196
dlg->category_to = PopupList (dlg->action_pages[i], TRUE, ChangeInferenceCategoryChoice);
8197
SetObjectExtra (dlg->category_to, dlg, NULL);
8198
InitEnumPopup (dlg->category_to, inference_alist, NULL);
8201
dlg->action_pages[i] = HiddenGroup (g, 0, 0, NULL);
8202
dlg->apply_field = CreateInferenceFieldEditApplyDialog (dlg->action_pages[i], eEditApplyChoice_Apply, change_notify, change_userdata);
8205
dlg->action_pages[i] = HiddenGroup (g, 0, 0, NULL);
8206
dlg->edit_field = CreateInferenceFieldEditApplyDialog (dlg->action_pages[i], eEditApplyChoice_Edit, change_notify, change_userdata);
8209
AlignObjects (ALIGN_CENTER, (HANDLE) dlg->action_pages[0],
8210
(HANDLE) dlg->action_pages[1],
8211
(HANDLE) dlg->action_pages[2],
8212
(HANDLE) dlg->action_pages[3],
8215
AlignObjects (ALIGN_CENTER, (HANDLE) dlg->action, (HANDLE) g, NULL);
8217
ChangeInferenceEditAction (dlg->action);
8223
/* This section of code is for handling ClickableLists */
8225
typedef struct clickablelist
8227
DIALOG_MESSAGE_BLOCK
8229
DoC clickable_item_list;
8236
ClickableCallback item_single_click_callback;
8237
ClickableCallback item_double_click_callback;
8238
Pointer item_click_callback_data;
8239
GetClickableItemText get_item_text;
8245
ValNodePtr list_list;
8246
Nlm_ColPtr PNTR col_fmt_array_array;
8248
Int2 text_select_item_start;
8249
Int2 text_select_row_start;
8250
Int2 text_select_char_start;
8251
Int2 text_select_item_stop;
8252
Int2 text_select_row_stop;
8253
Int2 text_select_char_stop;
8254
Int2 text_select_item_anchor;
8255
Int2 text_select_row_anchor;
8256
Int2 text_select_char_anchor;
8258
} ClickableListData, PNTR ClickableListPtr;
8261
static Nlm_ParData clickableParFmt = {FALSE, FALSE, FALSE, FALSE, FALSE, 0, 0};
8262
static Nlm_ColData clickableColFmt[2] = {{16, 0, 0, 0, NULL, 'l', 0,0,0,0, FALSE},
8263
{1000, 0, 0, 0, NULL, 'l', 1,0,0,0, TRUE}};
8265
static Nlm_ParData clickableItemParFmt = {FALSE, FALSE, FALSE, FALSE, FALSE, 0, 0};
8266
static Nlm_ColData clickableItemColFmt [4] = {{0, 5, 10, 0, NULL, 'l', 1,0,0,0, FALSE},
8267
{0, 0, 10, 0, NULL, 'l', 1,0,0,0, FALSE},
8268
{0, 0, 10, 0, NULL, 'l', 1,0,0,0, FALSE},
8269
{0, 0, 10, 0, NULL, 'l', 1,0,0,0, TRUE}};
8273
static Nlm_ColPtr PNTR FreeColumnFormatArrays (Nlm_ColPtr PNTR col_fmt_array_array, Int4 num_levels)
8277
if (col_fmt_array_array == NULL || num_levels < 1)
8281
for (n = 0; n < num_levels; n++)
8283
col_fmt_array_array [n] = MemFree (col_fmt_array_array [n]);
8285
col_fmt_array_array = MemFree (col_fmt_array_array);
8286
return col_fmt_array_array;
8289
static void CleanupClickableListDialog (GraphiC g, VoidPtr data)
8292
ClickableListPtr dlg;
8294
dlg = (ClickableListPtr) data;
8296
dlg->col_fmt_array_array = FreeColumnFormatArrays (dlg->col_fmt_array_array, dlg->num_levels);
8298
StdCleanupExtraProc (g, data);
8302
static ClickableItemPtr GetSubItem (ValNodePtr item_list, Int2Ptr pitem)
8304
ClickableItemPtr cip = NULL;
8306
if (item_list == NULL || pitem == NULL)
8310
while (*pitem > 0 && item_list != NULL)
8313
cip = (ClickableItemPtr) item_list->data.ptrvalue;
8316
if (cip != NULL && cip->expanded)
8318
cip = GetSubItem (cip->subcategories, pitem);
8321
item_list = item_list->next;
8330
static Int4 CountLevels (ValNodePtr item_list)
8332
Int4 num, num_sublevels = 0;
8334
ClickableItemPtr cip;
8336
if (item_list == NULL)
8341
for (vnp = item_list; vnp != NULL; vnp = vnp->next)
8343
cip = (ClickableItemPtr) vnp->data.ptrvalue;
8344
if (cip == NULL || cip->subcategories == NULL || !cip->expanded)
8348
num = CountLevels (cip->subcategories);
8349
if (num > num_sublevels) num_sublevels = num;
8352
/* one level for the top plus levels for the subcategories */
8354
return 1 + num_sublevels;
8358
static ClickableItemPtr GetSelectedClickableList (ValNodePtr item_list, Int2 item)
8360
ClickableItemPtr cip = NULL;
8362
cip = GetSubItem (item_list, &item);
8368
static Nlm_ColPtr PNTR GetColumnFormatArrays (Int4 num_levels, DoC doc)
8371
Nlm_ColPtr PNTR col_fmt_array_array = NULL;
8375
if (num_levels == 0)
8380
ObjectRect (doc, &r);
8381
InsetRect (&r, 4, 4);
8382
doc_width = r.right - r.left;
8384
col_fmt_array_array = (Nlm_ColPtr PNTR) MemNew (sizeof (Nlm_ColPtr) * num_levels);
8385
for (n = 0; n < num_levels; n++)
8387
col_fmt_array_array[n] = (Nlm_ColPtr) MemNew (sizeof (Nlm_ColData) * (n + 3));
8388
for (k = 0; k < n + 2; k++)
8390
col_fmt_array_array[n][k].pixWidth = 16;
8391
col_fmt_array_array[n][k].pixInset = 0;
8392
col_fmt_array_array[n][k].charWidth = 0;
8393
col_fmt_array_array[n][k].charInset = 0;
8394
col_fmt_array_array[n][k].font = programFont;
8395
col_fmt_array_array[n][k].just = 'l';
8396
col_fmt_array_array[n][k].wrap = 0;
8397
col_fmt_array_array[n][k].bar = 0;
8398
col_fmt_array_array[n][k].underline = 0;
8399
col_fmt_array_array[n][k].left = 0;
8400
col_fmt_array_array[n][k].last = 0;
8402
col_fmt_array_array[n][k].pixWidth = doc_width - ((n + 2) * 16);
8403
col_fmt_array_array[n][k].pixInset = 0;
8404
col_fmt_array_array[n][k].charWidth = 0;
8405
col_fmt_array_array[n][k].charInset = 0;
8406
col_fmt_array_array[n][k].font = programFont;
8407
col_fmt_array_array[n][k].just = 'l';
8408
col_fmt_array_array[n][k].wrap = 1;
8409
col_fmt_array_array[n][k].bar = 0;
8410
col_fmt_array_array[n][k].underline = 0;
8411
col_fmt_array_array[n][k].left = 0;
8412
col_fmt_array_array[n][k].last = 1;
8414
return col_fmt_array_array;
8418
static void AddClickableItem (ClickableListPtr dlg, ClickableItemPtr cip, Int4 level)
8428
item_text = (CharPtr) MemNew (sizeof (Char) * (StringLen (cip->description) + 6 + level));
8429
for (n = 0; n < level; n++)
8431
StringCat (item_text, "\t");
8433
StringCat (item_text, " \t \t");
8434
StringCat (item_text, cip->description);
8435
StringCat (item_text, "\n");
8436
AppendText (dlg->doc, item_text, &clickableParFmt, dlg->col_fmt_array_array [level], programFont);
8439
for (vnp = cip->subcategories; vnp != NULL; vnp = vnp->next)
8441
AddClickableItem (dlg, vnp->data.ptrvalue, level + 1);
8446
static void PopulateClickableList (ClickableListPtr dlg, ValNodePtr list_list)
8451
if (dlg == NULL || dlg->doc == NULL)
8458
num_levels = CountLevels (dlg->list_list);
8459
if (num_levels != dlg->num_levels)
8461
dlg->col_fmt_array_array = FreeColumnFormatArrays (dlg->col_fmt_array_array, dlg->num_levels);
8462
dlg->num_levels = num_levels;
8463
dlg->col_fmt_array_array = GetColumnFormatArrays (dlg->num_levels, dlg->doc);
8466
while (list_list != NULL)
8468
AddClickableItem (dlg, list_list->data.ptrvalue, 0);
8469
list_list = list_list->next;
8471
GetDocParams (dlg->doc, &numItems, NULL);
8472
UpdateDocument (dlg->doc, 0, numItems);
8477
NLM_EXTERN Int2 PanelOffsetFromCharOffsetEx (DoC doc, FonT font, Int2 item, Int2 col, Int2 char_offset)
8479
Int2 numRows, numCols, lineHeight;
8480
Int2 left_start, width, inset, char_width;
8482
if (doc == NULL) return 0;
8483
GetItemParams4 (doc, item, NULL, &numRows, &numCols, &lineHeight, NULL);
8484
GetColParams (doc, item, col, &left_start, &width, &inset, NULL);
8486
/* need to set font so that Nlm_CharWidth works properly */
8488
char_width = Nlm_CharWidth ('A');
8489
return left_start + inset + char_offset * char_width;
8493
static Int2 PanelOffsetFromCharOffset (ClickableListPtr dlg, Int2 item, Int2 char_offset)
8496
if (dlg == NULL) return 0;
8497
GetItemParams4 (dlg->doc, item, NULL, NULL, &numCols, NULL, NULL);
8499
return PanelOffsetFromCharOffsetEx (dlg->doc, dlg->col_fmt_array_array[0][0].font, item, numCols, char_offset);
8503
NLM_EXTERN Int2 GetTextSelectCharOffsetEx (PoinT pt, DoC doc, FonT font, Int2 item, Int2 row, Int2 col)
8505
Int2 pixPos, pixInset;
8506
Int2 one_char_width;
8511
if (doc == NULL) return 0;
8513
GetColParams (doc, item, col, &pixPos,
8514
NULL, &pixInset, NULL);
8517
one_char_width = Nlm_CharWidth ('A');
8518
if (one_char_width == 0) return 0;
8520
char_offset = (pt.x - pixPos - pixInset) / one_char_width;
8521
if (char_offset > 0) {
8522
txt = GetDocText (doc, item, row, col);
8523
len = StringLen (txt);
8524
if (char_offset >= len) {
8533
static Int2 GetTextSelectCharOffset (PoinT pt, ClickableListPtr dlg, Int2 item, Int2 row, Int2 col)
8535
if (dlg == NULL) return 0;
8537
return GetTextSelectCharOffsetEx (pt, dlg->doc, dlg->col_fmt_array_array[0][0].font, item, row, col);
8541
static void ClickList (DoC d, PoinT pt)
8544
Int2 item, numItems;
8547
ClickableListPtr dlg;
8548
ClickableItemPtr cip;
8554
dlg = GetObjectExtra (d);
8556
MapDocPoint (d, pt, &item, &row, &col, NULL);
8557
if (item > 0 && row > 0 && dlg->clicked == item) {
8558
dlg->dblClick = dblClick;
8560
dlg->dblClick = FALSE;
8563
if (item > 0 && row > 0) {
8564
dlg->clicked = item;
8566
if (item > 0 && row > 0 && !dblClick)
8568
cip = GetSelectedClickableList (dlg->list_list, item);
8571
if (col == cip->level + 1)
8573
cip->chosen = !cip->chosen;
8574
GetDocParams (d, &numItems, NULL);
8575
UpdateDocument (d, 0, numItems);
8577
else if (col == cip->level + 2)
8579
cip->expanded = !cip->expanded;
8580
rsult = GetScrlParams4 (dlg->doc, &offset, &first_shown, NULL);
8581
PopulateClickableList (dlg, dlg->list_list);
8583
GetItemParams4 (dlg->doc, first_shown, &offset, NULL, NULL, NULL, NULL);
8584
SetScrlParams4 (dlg->doc, offset);
8586
ObjectRect (dlg->doc, &r);
8587
InsetRect (&r, -1, -1);
8590
dlg->text_select_item_anchor = item;
8591
dlg->text_select_row_anchor = row;
8592
dlg->text_select_char_anchor = GetTextSelectCharOffset (pt, dlg, item, row, col);
8594
dlg->text_select_char_start = dlg->text_select_char_anchor;
8595
dlg->text_select_char_stop = dlg->text_select_char_start;
8596
if (dlg->text_select_char_start < 0) {
8597
dlg->text_select_item_start = -1;
8598
dlg->text_select_row_start = -1;
8599
dlg->text_select_item_stop = -1;
8600
dlg->text_select_row_stop = -1;
8602
dlg->text_select_item_start = item;
8603
dlg->text_select_row_start = row;
8604
dlg->text_select_item_stop = item;
8605
dlg->text_select_row_stop = row;
8607
GetDocParams (dlg->doc, &numItems, NULL);
8608
UpdateDocument (dlg->doc, 0, numItems);
8615
static void UpdateClickableListTextSelection (ClickableListPtr dlg, Int2 item, Int2 row, Int2 col, PoinT pt)
8617
Int2 char_start, numCols;
8619
if (dlg == NULL || item < 1 || row < 1) return;
8621
/* only update for positions in the text area */
8622
GetItemParams4 (dlg->doc, item, NULL, NULL, &numCols, NULL, NULL);
8623
if (col != numCols) {
8627
char_start = GetTextSelectCharOffset (pt, dlg, item, row, col);
8628
if (char_start < 0) {
8629
/* no updates unless mouse is in text area */
8633
if (item < dlg->text_select_item_anchor) {
8634
/* mouse is before anchor */
8635
dlg->text_select_item_start = item;
8636
dlg->text_select_row_start = row;
8637
dlg->text_select_char_start = char_start;
8638
dlg->text_select_item_stop = dlg->text_select_item_anchor;
8639
dlg->text_select_row_stop = dlg->text_select_row_anchor;
8640
dlg->text_select_char_stop = dlg->text_select_char_anchor;
8641
} else if (item == dlg->text_select_item_anchor) {
8642
/* start and stop in the anchor item */
8643
dlg->text_select_item_start = item;
8644
dlg->text_select_item_stop = item;
8645
if (row < dlg->text_select_row_anchor) {
8646
/* mouse is before anchor */
8647
dlg->text_select_row_start = row;
8648
dlg->text_select_char_start = char_start;
8649
dlg->text_select_row_stop = dlg->text_select_row_anchor;
8650
dlg->text_select_char_stop = dlg->text_select_char_anchor;
8651
} else if (row == dlg->text_select_row_anchor) {
8652
/* start and stop in the anchor row */
8653
dlg->text_select_row_start = row;
8654
dlg->text_select_row_stop = row;
8655
if (char_start <= dlg->text_select_char_anchor) {
8656
/* mouse is before anchor */
8657
dlg->text_select_char_start = char_start;
8658
dlg->text_select_char_stop = dlg->text_select_char_anchor;
8660
dlg->text_select_char_start = dlg->text_select_char_anchor;
8661
dlg->text_select_char_stop = char_start;
8665
/* mouse is after anchor */
8666
dlg->text_select_item_start = dlg->text_select_item_anchor;
8667
dlg->text_select_row_start = dlg->text_select_row_anchor;
8668
dlg->text_select_char_start = dlg->text_select_char_anchor;
8669
dlg->text_select_item_stop = item;
8670
dlg->text_select_row_stop = row;
8671
dlg->text_select_char_stop = char_start;
8673
InvalDocRows (dlg->doc, 0, 0, 0);
8676
static void DragClickableList (DoC d, PoinT pt)
8678
Int2 item, row, col, numCols;
8680
ClickableListPtr dlg;
8682
dlg = GetObjectExtra (d);
8684
MapDocPoint (d, pt, &item, &row, &col, NULL);
8685
GetItemParams4 (d, item, NULL, NULL, &numCols, NULL, NULL);
8686
if (col == numCols) {
8687
UpdateClickableListTextSelection (dlg, item, row, col, pt);
8693
static void InvalBorder (DoC d, Int2 item)
8701
InsetRect (&r, 4, 4);
8702
if (ItemIsVisible (d, item, &top, &bottom, NULL)) {
8705
r.right = r.left + 4;
8706
InsetRect (&r, -1, -1);
8711
static void ActOnClickableList (ValNodePtr list_list, Int2 item)
8713
ClickableItemPtr cip;
8715
cip = GetSelectedClickableList (list_list, item);
8716
if (cip != NULL && cip->callback_func != NULL)
8718
(cip->callback_func) (cip->item_list, cip->callback_data);
8723
static void PopulateClickableItemList (DoC doc, ClickableItemPtr cip, GetClickableItemText get_item_text)
8730
if (doc == NULL || get_item_text == NULL)
8741
if (cip->item_list == NULL)
8743
AppendText (doc, "No items listed", NULL, NULL, programFont);
8746
ObjectRect (doc, &r);
8747
InsetRect (&r, 4, 4);
8749
clickableItemColFmt[0].pixWidth = 5 * stdCharWidth;
8750
clickableItemColFmt[1].pixWidth = (r.right - r.left - clickableItemColFmt[0].pixWidth) / 3;
8751
clickableItemColFmt[2].pixWidth = (r.right - r.left - clickableItemColFmt[0].pixWidth) / 3;
8752
clickableItemColFmt[3].pixWidth = (r.right - r.left - clickableItemColFmt[0].pixWidth) / 3;
8754
vnp = cip->item_list;
8758
row_text = get_item_text (vnp);
8759
if (row_text != NULL)
8761
if (vnp->choice == OBJ_SEQFEAT)
8763
AppendText (doc, row_text, &clickableItemParFmt, clickableItemColFmt, programFont);
8767
AppendText (doc, row_text, &clickableItemParFmt, NULL, programFont);
8769
row_text = MemFree (row_text);
8773
GetDocParams (doc, &numItems, NULL);
8774
UpdateDocument (doc, 0, numItems);
8777
static void ReleaseClickableList (DoC d, PoinT pt)
8783
ClickableListPtr dlg;
8785
dlg = GetObjectExtra (d);
8788
MapDocPoint (d, pt, &item, &row, &col, NULL);
8789
/* update text selection */
8790
UpdateClickableListTextSelection (dlg, item, row, col, pt);
8792
if (item > 0 && row > 0) {
8794
if (item == dlg->clicked) {
8795
old = dlg->selected;
8796
dlg->selected = item;
8799
UpdateDocument (d, item, item);
8801
UpdateDocument (d, old, old);
8802
UpdateDocument (d, item, item);
8807
} else if (dlg->clicked == 0) {
8808
if (dlg->selected != 0) {
8809
old = dlg->selected;
8811
InvalBorder (d, old);
8815
if (dlg->selected > 0 && dlg->dblClick)
8817
ActOnClickableList (dlg->list_list, dlg->selected);
8819
else if (dlg->selected > 0)
8821
dlg->item_selected = 0;
8822
PopulateClickableItemList (dlg->clickable_item_list,
8823
GetSelectedClickableList (dlg->list_list,
8825
dlg->get_item_text);
8832
static void DrawTextSelection (ClickableListPtr dlg, Int2 item, RectPtr r)
8834
Int2 lineHeight, numRows, numCols;
8840
if (dlg == NULL || r == NULL
8841
|| item < dlg->text_select_item_start
8842
|| item > dlg->text_select_item_stop) {
8846
if (dlg->text_select_item_start == dlg->text_select_item_stop
8847
&& dlg->text_select_row_start == dlg->text_select_row_stop
8848
&& dlg->text_select_char_start == dlg->text_select_char_stop) {
8849
/* if we've only selected one char, and it's blank, don't draw it. */
8850
txt = GetSelectedClickableListText (dlg->dialog);
8851
if (StringHasNoText (txt)) {
8858
GetItemParams4 (dlg->doc, item, &top, &numRows, &numCols, &lineHeight, NULL);
8860
/* calculate missing rows from end first */
8861
if (dlg->text_select_item_stop == item) {
8862
numRows = dlg->text_select_row_stop;
8863
last_right = PanelOffsetFromCharOffset (dlg, item, dlg->text_select_char_stop + 1);
8865
last_right = r->right;
8868
if (dlg->text_select_item_start == item) {
8869
left_start = PanelOffsetFromCharOffset (dlg, item, dlg->text_select_char_start);
8870
line_y = r->top + (dlg->text_select_row_start) * lineHeight - 1;
8871
numRows -= dlg->text_select_row_start - 1;
8873
left_start = PanelOffsetFromCharOffset (dlg, item, 0);
8874
line_y = r->top + lineHeight - 1;
8877
while (numRows > 1) {
8878
MoveTo (left_start, line_y);
8879
left_start = PanelOffsetFromCharOffset (dlg, item, 0);
8880
LineTo (r->right, line_y);
8881
line_y += lineHeight;
8884
MoveTo (left_start, line_y);
8885
LineTo (last_right, line_y);
8889
static void DrawClickableList (DoC d, RectPtr r, Int2 item, Int2 firstLine)
8892
ClickableListPtr dlg;
8894
ClickableItemPtr cip;
8897
dlg = (ClickableListPtr) GetObjectExtra (d);
8898
if (dlg != NULL && r != NULL && item > 0 && firstLine == 0) {
8901
cip = GetSelectedClickableList (dlg->list_list, item);
8904
level_offset = cip->level * 16;
8905
rct.left += level_offset;
8906
rct.right += level_offset;
8909
/* draw text selection */
8910
DrawTextSelection (dlg, item, &rct);
8912
/* draw selection */
8913
if (item == dlg->selected) {
8914
rct.right = rct.left + 4;
8918
/* draw chosen checkboxes */
8920
rct.right = rct.left + 10;
8921
rct.bottom = rct.top + (rct.right - rct.left);
8924
if (cip != NULL && cip->chosen) {
8925
MoveTo (rct.left, rct.top);
8926
LineTo (rct.right - 1, rct.bottom - 1);
8927
MoveTo (rct.left, rct.bottom - 1);
8928
LineTo (rct.right - 1, rct.top);
8931
/* draw open/closed checkboxes */
8932
if (cip!= NULL && cip->subcategories != NULL)
8935
rct.right = rct.left + 10;
8936
rct.bottom = rct.top + (rct.right - rct.left);
8938
MoveTo (rct.left, (rct.top + rct.bottom) / 2);
8939
LineTo (rct.right - 1, (rct.top + rct.bottom) / 2);
8942
MoveTo ((rct.left + rct.right) / 2, rct.top);
8943
LineTo ((rct.left + rct.right) / 2, rct.bottom - 1);
8952
static void DrawClickableListItem (DoC d, RectPtr r, Int2 item, Int2 firstLine)
8955
ClickableListPtr dlg;
8958
dlg = (ClickableListPtr) GetObjectExtra (d);
8959
if (dlg != NULL && r != NULL && item > 0 && firstLine == 0) {
8962
/* draw selection */
8963
if (item == dlg->item_selected) {
8965
rct.right = rct.left + 4;
8972
static void ClickClickableListItem (DoC d, PoinT pt)
8975
Int2 item, last_selected, numItems;
8977
ClickableListPtr dlg;
8978
ClickableItemPtr cip;
8981
dlg = GetObjectExtra (d);
8983
MapDocPoint (d, pt, &item, &row, NULL, NULL);
8984
if (item > 0 && row > 0) {
8985
cip = GetSelectedClickableList (dlg->list_list, dlg->selected);
8986
if (cip != NULL && cip->item_list != NULL)
8988
vnp = cip->item_list;
8990
last_selected = dlg->item_selected;
8991
dlg->item_selected = item;
8993
if (item != last_selected)
8995
GetDocParams (d, &numItems, NULL);
8996
UpdateDocument (d, 0, numItems);
8999
/* find item in list */
9000
while (item > 1 && vnp != NULL)
9008
if (dlg->item_double_click_callback != NULL) {
9009
(dlg->item_double_click_callback) (vnp, dlg->item_click_callback_data);
9012
if (dlg->item_single_click_callback != NULL) {
9013
(dlg->item_single_click_callback) (vnp, dlg->item_click_callback_data);
9022
static void ClickableListToDialog (DialoG d, Pointer userdata)
9024
ClickableListPtr dlg;
9026
dlg = (ClickableListPtr) GetObjectExtra (d);
9032
dlg->list_list = (ValNodePtr) userdata;
9034
PopulateClickableList (dlg, dlg->list_list);
9035
if (dlg->list_list != NULL) {
9037
dlg->item_selected = 0;
9038
PopulateClickableItemList (dlg->clickable_item_list,
9039
GetSelectedClickableList (dlg->list_list,
9041
dlg->get_item_text);
9043
Reset (dlg->clickable_item_list);
9047
static void FindClickableText (ButtoN b)
9049
ClickableListPtr dlg;
9052
dlg = (ClickableListPtr) GetObjectExtra (b);
9058
find_txt = SaveStringFromText (dlg->find_txt);
9059
ScrollToNextClickableTextDescription (find_txt, dlg->dialog);
9060
find_txt = MemFree (find_txt);
9064
static void FindPreviousClickableText (ButtoN b)
9066
ClickableListPtr dlg;
9069
dlg = (ClickableListPtr) GetObjectExtra (b);
9075
find_txt = SaveStringFromText (dlg->find_txt);
9076
ScrollToPreviousClickableTextDescription (find_txt, dlg->dialog);
9077
find_txt = MemFree (find_txt);
9081
static void ClickableListCopyToClipboard (DialoG d)
9083
ClickableListPtr dlg;
9086
dlg = (ClickableListPtr) GetObjectExtra (d);
9088
if (dlg == NULL) return;
9090
txt = GetSelectedClickableListText (d);
9091
Nlm_StringToClipboard (txt);
9092
txt = MemFree (txt);
9095
static void ClickableListMessage (DialoG d, Int2 mssg)
9098
ClickableListPtr dlg;
9100
dlg = (ClickableListPtr) GetObjectExtra (d);
9102
if (mssg == VIB_MSG_COPY) {
9103
ClickableListCopyToClipboard(d);
9108
static void ClickableListOnKey (SlatE s, Char ch)
9111
ClickableListPtr clp;
9118
if ( (int) ch == 0 ) return;
9121
clp = (ClickableListPtr) GetObjectExtra (d);
9123
CaptureSlateFocus (s);
9124
/* later, handle control key combos */
9128
ClickableListCopyToClipboard (clp->dialog);
9132
/* PageUp key pressed */
9133
if (GetScrlParams4 (d, &offset, &first_shown, NULL) && first_shown > 0)
9135
sb = GetSlateVScrollBar (s);
9136
Nlm_Scroll (sb, SCROLL_PAGEUP);
9141
/* PageDown key pressed */
9142
if (GetScrlParams4 (d, &offset, &first_shown, NULL))
9144
sb = GetSlateVScrollBar (s);
9145
Nlm_Scroll (sb, SCROLL_PAGEDN);
9150
/* Up Arrow key pressed */
9151
if (GetScrlParams4 (d, &offset, &first_shown, NULL) && first_shown > 0)
9153
GetItemParams4 (d, first_shown - 1, &offset, NULL, NULL, NULL, NULL);
9154
SetScrlParams4 (d, offset);
9159
/* Down Arrow key pressed */
9160
if (GetScrlParams4 (d, &offset, &first_shown, NULL)) {
9161
sb = GetSlateVScrollBar (s);
9162
if (offset < GetBarMax (sb))
9164
GetItemParams4 (d, first_shown + 1, &offset, NULL, NULL, NULL, NULL);
9165
SetScrlParams4 (d, offset);
9174
CreateClickableListDialogEx
9180
ClickableCallback item_single_click_callback,
9181
ClickableCallback item_double_click_callback,
9182
Pointer item_click_callback_data,
9183
GetClickableItemText get_item_text,
9189
GrouP p, pnl_grp, find_grp = NULL;
9190
ClickableListPtr dlg;
9194
dlg = (ClickableListPtr) MemNew (sizeof (ClickableListData));
9199
p = HiddenGroup (h, -1, 0, NULL);
9200
SetObjectExtra (p, dlg, CleanupClickableListDialog);
9201
SetGroupSpacing (p, 10, 10);
9203
dlg->dialog = (DialoG) p;
9204
dlg->todialog = ClickableListToDialog;
9205
dlg->fromdialog = NULL;
9206
dlg->dialogmessage = ClickableListMessage;
9207
dlg->testdialog = NULL;
9209
dlg->item_single_click_callback = item_single_click_callback;
9210
dlg->item_double_click_callback = item_double_click_callback;
9211
dlg->item_click_callback_data = item_click_callback_data;
9213
dlg->get_item_text = get_item_text;
9216
pnl_grp = HiddenGroup (p, 2, 0, NULL);
9218
if (label1 || label2) {
9219
dlg->title1 = StaticPrompt (pnl_grp, label1, left_width, popupMenuHeight, programFont, 'c');
9220
dlg->title2 = StaticPrompt (pnl_grp, label2, right_width, popupMenuHeight, programFont, 'c');
9222
dlg->doc = DocumentPanel (pnl_grp, left_width, stdLineHeight * 20);
9223
dlg->clickable_item_list = DocumentPanel (pnl_grp, right_width, stdLineHeight * 20);
9224
if (help1 || help2) {
9225
dlg->help1 = StaticPrompt (pnl_grp, help1, left_width, popupMenuHeight, programFont, 'c');
9226
dlg->help2 = StaticPrompt (pnl_grp, help2, right_width, popupMenuHeight, programFont, 'c');
9229
pnl_grp = HiddenGroup (p, -1, 0, NULL);
9230
dlg->title1 = StaticPrompt (pnl_grp, label1, left_width, popupMenuHeight, programFont, 'c');
9231
dlg->doc = DocumentPanel (pnl_grp, left_width, stdLineHeight * 20);
9232
if (help1 || help2) {
9233
dlg->help1 = StaticPrompt (pnl_grp, help1, left_width, popupMenuHeight, programFont, 'c');
9235
dlg->title2 = StaticPrompt (pnl_grp, label2, right_width, popupMenuHeight, programFont, 'c');
9236
dlg->clickable_item_list = DocumentPanel (pnl_grp, right_width, stdLineHeight * 20);
9237
if (help1 || help2) {
9238
dlg->help2 = StaticPrompt (pnl_grp, help2, right_width, popupMenuHeight, programFont, 'c');
9240
AlignObjects (ALIGN_CENTER, (HANDLE) dlg->title1, (HANDLE) dlg->doc, (HANDLE) dlg->title2, (HANDLE) dlg->clickable_item_list,
9241
(HANDLE) (dlg->help1 == NULL ? dlg->help2 : dlg->help1), (HANDLE) (dlg->help1 == NULL ? NULL : dlg->help2), NULL);
9244
SetObjectExtra (dlg->doc, dlg, NULL);
9245
SetDocAutoAdjust (dlg->doc, FALSE);
9246
SetDocProcs (dlg->doc, ClickList, DragClickableList, ReleaseClickableList, NULL);
9247
SetDocShade (dlg->doc, DrawClickableList, NULL, NULL, NULL);
9249
SetSlateChar ((SlatE) dlg->doc, ClickableListOnKey);
9251
SetObjectExtra (dlg->clickable_item_list, dlg, NULL);
9252
SetDocAutoAdjust (dlg->clickable_item_list, FALSE);
9253
SetDocProcs (dlg->clickable_item_list, ClickClickableListItem, NULL, NULL, NULL);
9254
SetDocShade (dlg->clickable_item_list, DrawClickableListItem, NULL, NULL, NULL);
9256
/* adjust column width for discrepancy list */
9257
ObjectRect (dlg->doc, &r);
9258
InsetRect (&r, 4, 4);
9259
clickableColFmt[1].pixWidth = r.right - r.left - clickableColFmt[0].pixWidth;
9262
find_grp = HiddenGroup (p, 4, 0, NULL);
9263
SetGroupSpacing (find_grp, 10, 10);
9264
StaticPrompt (find_grp, "Find Text", 0, popupMenuHeight, programFont, 'l');
9265
dlg->find_txt = DialogText (find_grp, "", 20, NULL);
9266
b = PushButton (find_grp, "<<", FindPreviousClickableText);
9267
SetObjectExtra (b, dlg, NULL);
9268
b = PushButton (find_grp, ">>", FindClickableText);
9269
SetObjectExtra (b, dlg, NULL);
9272
AlignObjects (ALIGN_CENTER, (HANDLE) pnl_grp, (HANDLE) find_grp, NULL);
9276
extern void SetClickableListDialogTitles (DialoG d, CharPtr title1, CharPtr title2, CharPtr help1, CharPtr help2)
9278
ClickableListPtr dlg;
9280
dlg = (ClickableListPtr) GetObjectExtra (d);
9285
SafeSetTitle (dlg->title1, title1);
9286
SafeSetTitle (dlg->title2, title2);
9287
SafeSetTitle (dlg->help1, help1);
9288
SafeSetTitle (dlg->help2, help2);
9293
CreateClickableListDialog
9297
ClickableCallback item_single_click_callback,
9298
ClickableCallback item_double_click_callback,
9299
Pointer item_click_callback_data,
9300
GetClickableItemText get_item_text)
9302
return CreateClickableListDialogEx (h, label1, label2, NULL, NULL,
9303
item_single_click_callback,
9304
item_double_click_callback,
9305
item_click_callback_data,
9308
stdCharWidth * 30 + 5,
9313
static Int4 CountExpandedSublevels (ValNodePtr subcategories)
9317
ClickableItemPtr cip;
9319
for (vnp = subcategories; vnp != NULL; vnp = vnp->next) {
9320
cip = (ClickableItemPtr) vnp->data.ptrvalue;
9323
if (cip->expanded && cip->subcategories != NULL) {
9324
num += CountExpandedSublevels(cip->subcategories);
9332
/* First, need to locate items that have description that contains txt.
9333
* Then need to make sure that they are visible.
9334
* Then need to figure out how to scroll to them.
9336
static Boolean FindInClickableItemDescriptions (CharPtr txt, ValNodePtr clickable_item_list, ValNodePtr PNTR row_list, Int4Ptr row_offset)
9339
ClickableItemPtr cip;
9340
Boolean found = FALSE;
9343
if (StringHasNoText (txt) || clickable_item_list == NULL || row_list == NULL || row_offset == NULL) return FALSE;
9345
vnp = clickable_item_list;
9346
while (vnp != NULL) {
9348
cip = (ClickableItemPtr) vnp->data.ptrvalue;
9349
if (StringStr (cip->description, txt) != NULL) {
9350
ValNodeAddInt (row_list, 0, *row_offset);
9353
lower_levels = *row_offset;
9354
if (cip->subcategories != NULL) {
9355
if (FindInClickableItemDescriptions (txt, cip->subcategories, row_list, &lower_levels)) {
9356
cip->expanded = TRUE;
9359
if (cip->expanded) {
9360
(*row_offset) += CountExpandedSublevels (cip->subcategories);
9370
extern void ScrollToNextClickableTextDescription (CharPtr txt, DialoG d)
9372
ClickableListPtr dlg;
9373
ValNodePtr found_list = NULL, vnp;
9374
Int4 row_offset = 0, startsAt;
9375
Int2 numRows, numCols, lineHeight;
9377
dlg = (ClickableListPtr) GetObjectExtra (d);
9383
if (!FindInClickableItemDescriptions (txt, dlg->list_list, &found_list, &row_offset)
9384
|| found_list == NULL) {
9385
Message (MSG_OK, "Text not found!");
9389
/* find first found txt after current selection */
9391
while (vnp != NULL && vnp->data.intvalue <= dlg->selected) {
9395
row_offset = found_list->data.intvalue;
9397
row_offset = vnp->data.intvalue;
9400
dlg->selected = row_offset;
9401
PopulateClickableList (dlg, dlg->list_list);
9402
SetDocAutoAdjust (dlg->doc, TRUE);
9403
UpdateDocument (dlg->doc, 0, 0);
9404
SetDocAutoAdjust (dlg->doc, FALSE);
9405
dlg->item_selected = 0;
9406
PopulateClickableItemList (dlg->clickable_item_list,
9407
GetSelectedClickableList (dlg->list_list,
9409
dlg->get_item_text);
9411
GetItemParams4 (dlg->doc, row_offset, &startsAt, &numRows,
9412
&numCols, &lineHeight, NULL);
9413
SetScrlParams4 (dlg->doc, startsAt);
9417
extern void ScrollToPreviousClickableTextDescription (CharPtr txt, DialoG d)
9419
ClickableListPtr dlg;
9420
ValNodePtr found_list = NULL, vnp, vnp_prev = NULL;
9421
Int4 row_offset = 0, startsAt;
9422
Int2 numRows, numCols, lineHeight;
9424
dlg = (ClickableListPtr) GetObjectExtra (d);
9430
if (!FindInClickableItemDescriptions (txt, dlg->list_list, &found_list, &row_offset)
9431
|| found_list == NULL) {
9432
Message (MSG_OK, "Text not found!");
9436
/* find first found txt before current selection */
9438
while (vnp != NULL && vnp->data.intvalue < dlg->selected) {
9442
if (vnp_prev == NULL) {
9443
/* use last item in list */
9445
while (vnp != NULL && vnp->next != NULL) {
9448
row_offset = vnp->data.intvalue;
9450
row_offset = vnp_prev->data.intvalue;
9453
dlg->selected = row_offset;
9454
PopulateClickableList (dlg, dlg->list_list);
9455
SetDocAutoAdjust (dlg->doc, TRUE);
9456
UpdateDocument (dlg->doc, 0, 0);
9457
SetDocAutoAdjust (dlg->doc, FALSE);
9458
dlg->item_selected = 0;
9459
PopulateClickableItemList (dlg->clickable_item_list,
9460
GetSelectedClickableList (dlg->list_list,
9462
dlg->get_item_text);
9464
GetItemParams4 (dlg->doc, row_offset, &startsAt, &numRows,
9465
&numCols, &lineHeight, NULL);
9466
SetScrlParams4 (dlg->doc, startsAt);
9470
static CharPtr GetClickableTextFromItemList (ValNodePtr item_list, CharPtr separator)
9476
for (vnp = item_list; vnp != NULL; vnp = vnp->next) {
9477
text_len += StringLen (vnp->data.ptrvalue) + StringLen (separator);
9480
txt = (CharPtr) MemNew (sizeof(Char) * text_len);
9481
for (vnp = item_list; vnp != NULL; vnp = vnp->next) {
9482
StringCat (txt, vnp->data.ptrvalue);
9483
if (vnp->next != NULL) {
9484
StringCat (txt, separator);
9492
GetFragmentFromDocRow
9497
Int2 char_start, Int2 char_stop)
9499
CharPtr txt = NULL, cp_txt;
9502
txt = GetDocText (doc, item, row, col);
9504
if (char_start == 0 && char_stop < 0) {
9505
/* take all of row */
9508
len = StringLen (txt);
9509
if (char_stop >= len) {
9510
/* selection was drawn beyond length of text */
9511
char_stop = len - 1;
9512
} else if (char_stop < 0) {
9513
/* take all of row */
9514
char_stop = len - 1;
9516
if (char_start >= len) {
9517
/* do nothing - selection is not within text */
9518
txt = MemFree (txt);
9520
cp_txt = (CharPtr) MemNew (sizeof (Char) * (2 + char_stop - char_start));
9521
StringNCpy (cp_txt, txt + char_start, 1 + char_stop - char_start);
9522
cp_txt[1 + char_stop - char_start] = 0;
9523
txt = MemFree (txt);
9532
GetFragmentsFromDocCol
9536
Int2 row_start, Int2 row_stop,
9537
Int2 char_start, Int2 char_stop)
9541
ValNodePtr fragments = NULL;
9543
if (row_start == row_stop) {
9544
txt = GetFragmentFromDocRow (doc, item, col, row_start, char_start, char_stop);
9545
if (StringHasNoText (txt)) {
9546
txt = MemFree (txt);
9548
ValNodeAddPointer (&fragments, 0, txt);
9551
txt = GetFragmentFromDocRow (doc, item, col, row_start, char_start, -1);
9552
if (StringHasNoText (txt)) {
9553
txt = MemFree (txt);
9555
ValNodeAddPointer (&fragments, 0, txt);
9557
row = row_start + 1;
9558
while (row < row_stop) {
9559
txt = GetFragmentFromDocRow (doc, item, col, row, 0, -1);
9560
if (StringHasNoText (txt)) {
9561
txt = MemFree (txt);
9563
ValNodeAddPointer (&fragments, 0, txt);
9567
txt = GetFragmentFromDocRow (doc, item, col, row_stop, 0, char_stop);
9568
if (StringHasNoText (txt)) {
9569
txt = MemFree (txt);
9571
ValNodeAddPointer (&fragments, 0, txt);
9574
txt = GetClickableTextFromItemList (fragments, " ");
9575
fragments = ValNodeFreeData (fragments);
9580
static Boolean CollectFromThisColumn (Int2 col, Int2Ptr only_these_columns, Int2 num_col)
9583
Boolean rval = FALSE;
9585
if (only_these_columns == NULL) {
9588
for (i = 0; i < num_col; i++) {
9589
if (only_these_columns[i] == col) {
9599
GetFragmentsFromDocItem
9602
Int2 col_start, Int2 col_stop,
9603
Int2 row_start, Int2 row_stop,
9604
Int2 char_start, Int2 char_stop,
9605
Int2Ptr only_these_columns, Int2 num_col)
9609
Int2 num_rows, num_cols;
9610
ValNodePtr fragments = NULL;
9612
GetItemParams4 (doc, item, NULL, &num_rows, &num_cols, NULL, NULL);
9614
col_stop = num_cols;
9617
row_stop = num_rows;
9620
if (col_start == col_stop) {
9621
if (CollectFromThisColumn (col_start, only_these_columns, num_col)) {
9622
txt = GetFragmentsFromDocCol (doc, item, col_start, row_start, row_stop, char_start, char_stop);
9623
ValNodeAddPointer (&fragments, 0, txt);
9626
if (CollectFromThisColumn (col_start, only_these_columns, num_col)) {
9627
txt = GetFragmentsFromDocCol (doc, item, col_start, row_start, num_rows, char_start, -1);
9628
ValNodeAddPointer (&fragments, 0, txt);
9630
col = col_start + 1;
9631
while (col < col_stop) {
9632
if (CollectFromThisColumn (col, only_these_columns, num_col)) {
9633
txt = GetFragmentsFromDocCol (doc, item, col, 1, num_rows, 0, -1);
9634
ValNodeAddPointer (&fragments, 0, txt);
9638
if (CollectFromThisColumn (col_stop, only_these_columns, num_col)) {
9639
txt = GetFragmentsFromDocCol (doc, item, col_stop, 1, row_stop, 0, char_stop);
9640
ValNodeAddPointer (&fragments, 0, txt);
9643
txt = GetClickableTextFromItemList (fragments, "\t");
9644
fragments = ValNodeFreeData (fragments);
9650
NLM_EXTERN CharPtr GetSelectedDocText (DoC doc, Int2 item_start, Int2 row_start, Int2 col_start, Int2 char_start,
9651
Int2 item_stop, Int2 row_stop, Int2 col_stop, Int2 char_stop,
9652
Int2Ptr only_these_columns, Int2 num_col)
9656
ValNodePtr fragment_list = NULL;
9658
if (doc == NULL || item_start < 1)
9663
if (char_start < 0) char_start = 0;
9665
if (item_start == item_stop) {
9666
txt = GetFragmentsFromDocItem (doc, item_start, col_start, col_stop, row_start, row_stop, char_start, char_stop, only_these_columns, num_col);
9667
ValNodeAddPointer (&fragment_list, 0, txt);
9669
txt = GetFragmentsFromDocItem (doc, item_start, col_start, -1, row_start, -1, char_start, -1, only_these_columns, num_col);
9670
ValNodeAddPointer (&fragment_list, 0, txt);
9671
item = item_start + 1;
9672
while (item < item_stop) {
9673
txt = GetFragmentsFromDocItem (doc, item, 1, -1, 1, -1, 0, -1, only_these_columns, num_col);
9674
ValNodeAddPointer (&fragment_list, 0, txt);
9677
txt = GetFragmentsFromDocItem (doc, item, 1, col_stop, 1, row_stop, 0, char_stop, only_these_columns, num_col);
9678
ValNodeAddPointer (&fragment_list, 0, txt);
9681
txt = GetClickableTextFromItemList (fragment_list, "\r\n");
9682
fragment_list = ValNodeFreeData (fragment_list);
9686
extern CharPtr GetSelectedClickableListText (DialoG d)
9688
ClickableListPtr dlg;
9690
Int2 item, row, col, char_offset;
9691
Int4 text_len = 0, len = 0;
9692
CharPtr txt, cp_txt;
9693
ValNodePtr fragment_list = NULL, item_list = NULL;
9695
dlg = (ClickableListPtr) GetObjectExtra (d);
9696
if (dlg == NULL || dlg->text_select_item_start < 1)
9701
item = dlg->text_select_item_start;
9702
row = dlg->text_select_row_start;
9703
char_offset = dlg->text_select_char_start;
9705
while (item <= dlg->text_select_item_stop) {
9706
if (item == dlg->text_select_item_start) {
9707
if (item == dlg->text_select_item_stop) {
9708
/* all text from one item */
9709
/* all text will be from last column in item */
9710
GetItemParams4 (dlg->doc, item, NULL, NULL, &col, NULL, NULL);
9711
if (row == dlg->text_select_row_stop) {
9712
/* all text from one row */
9713
txt = GetDocText (dlg->doc, item, row, col);
9714
len = StringLen (txt);
9715
if (dlg->text_select_char_stop >= len) {
9716
/* selection was drawn beyond length of text */
9717
dlg->text_select_char_stop = len - 1;
9719
if (dlg->text_select_char_start >= len) {
9720
/* do nothing - selection is not within text */
9722
cp_txt = (CharPtr) MemNew (sizeof (Char) * (2 + dlg->text_select_char_stop - dlg->text_select_char_start));
9723
StringNCpy (cp_txt, txt + dlg->text_select_char_start, 1 + dlg->text_select_char_stop - dlg->text_select_char_start);
9724
cp_txt[1 + dlg->text_select_char_stop - dlg->text_select_char_start] = 0;
9725
ValNodeAddPointer (&fragment_list, 0, cp_txt);
9727
/* free txt read from Doc */
9728
txt = MemFree (txt);
9730
/* take text from several rows */
9732
while (row < dlg->text_select_row_stop) {
9733
txt = GetDocText (dlg->doc, item, row, col);
9734
len = StringLen (txt);
9735
if (row == dlg->text_select_row_start && dlg->text_select_char_start >= len) {
9736
/* do nothing - selection is not within text */
9737
txt = MemFree (txt);
9739
if (row == dlg->text_select_row_start && dlg->text_select_char_start > 0) {
9740
cp_txt = (CharPtr) MemNew (sizeof (Char) * (1 + StringLen (txt) - dlg->text_select_char_start));
9741
StringCpy (cp_txt, txt + dlg->text_select_char_start);
9742
txt = MemFree (txt);
9745
ValNodeAddPointer (&item_list, 0, txt);
9749
txt = GetDocText (dlg->doc, item, row, col);
9750
if (dlg->text_select_char_stop < len) {
9751
txt[dlg->text_select_char_stop] = 0;
9753
ValNodeAddPointer (&item_list, 0, txt);
9754
txt = GetClickableTextFromItemList (item_list, " ");
9755
ValNodeAddPointer (&fragment_list, 0, txt);
9756
item_list = ValNodeFreeData (item_list);
9759
/* take all text after first row and char offset */
9761
GetItemParams4 (dlg->doc, item, NULL, &numRows, &col, NULL, NULL);
9762
while (row <= numRows) {
9763
txt = GetDocText (dlg->doc, item, row, col);
9764
len = StringLen (txt);
9765
if (row == dlg->text_select_row_start && dlg->text_select_char_start >= len) {
9766
/* do nothing = selection is outside text */
9767
txt = MemFree (txt);
9769
if (row == dlg->text_select_row_start && dlg->text_select_char_start > 0) {
9770
cp_txt = (CharPtr) MemNew (sizeof (Char) * (1 + StringLen (txt) - dlg->text_select_char_start));
9771
StringCpy (cp_txt, txt + dlg->text_select_char_start);
9772
txt = MemFree (txt);
9775
ValNodeAddPointer (&item_list, 0, txt);
9779
txt = GetClickableTextFromItemList (item_list, " ");
9780
ValNodeAddPointer (&fragment_list, 0, txt);
9781
item_list = ValNodeFreeData (item_list);
9783
} else if (item == dlg->text_select_item_stop) {
9784
/* take all text until last row and char offset */
9787
GetItemParams4 (dlg->doc, item, NULL, NULL, &col, NULL, NULL);
9788
while (row < dlg->text_select_row_stop) {
9789
txt = GetDocText (dlg->doc, item, row, col);
9790
ValNodeAddPointer (&item_list, 0, txt);
9792
txt = GetDocText (dlg->doc, item, row, col);
9793
if (dlg->text_select_char_stop + 1 < StringLen (txt)) {
9794
txt[dlg->text_select_char_stop + 1] = 0;
9796
ValNodeAddPointer (&item_list, 0, txt);
9797
txt = GetClickableTextFromItemList (item_list, " ");
9798
ValNodeAddPointer (&fragment_list, 0, txt);
9799
item_list = ValNodeFreeData (item_list);
9801
GetItemParams4 (dlg->doc, item, NULL, NULL, &col, NULL, NULL);
9802
txt = GetDocText (dlg->doc, item, 0, col);
9803
if (txt != NULL && txt[StringLen(txt) - 1] == '\n') {
9804
/* remove terminal carriage return */
9805
txt[StringLen(txt) - 1] = 0;
9807
ValNodeAddPointer (&fragment_list, 0, txt);
9808
text_len += StringLen (txt) + 1;
9812
txt = GetClickableTextFromItemList (fragment_list, "\r\n");
9813
fragment_list = ValNodeFreeData (fragment_list);
9817
typedef struct basegbqualeditor {
9818
DIALOG_MESSAGE_BLOCK
9819
TaglistCallback tlp_callback;
9820
Pointer callback_data;
9821
} BaseGBQualEditor, PNTR BaseGBQualEditorPtr;
9823
static void ChangeGBQualEditorPopup (PopuP p)
9825
BaseGBQualEditorPtr dlg;
9827
dlg = (BaseGBQualEditorPtr) GetObjectExtra (p);
9828
if (dlg != NULL && dlg->tlp_callback != NULL) {
9829
(dlg->tlp_callback)(dlg->callback_data);
9833
static void ChangeGBQualEditorButton (ButtoN b)
9835
BaseGBQualEditorPtr dlg;
9837
dlg = (BaseGBQualEditorPtr) GetObjectExtra (b);
9838
if (dlg != NULL && dlg->tlp_callback != NULL) {
9839
(dlg->tlp_callback)(dlg->callback_data);
9843
static void ChangeGBQualEditorText (TexT t)
9845
BaseGBQualEditorPtr dlg;
9847
dlg = (BaseGBQualEditorPtr) GetObjectExtra (t);
9848
if (dlg != NULL && dlg->tlp_callback != NULL) {
9849
(dlg->tlp_callback)(dlg->callback_data);
9854
/* collection_date has a controlled format.
9855
* It is YYYY or Mmm-YYYY or DD-Mmm-YYYY where Mmm = Jan, Feb, Mar, Apr, May,
9856
* Jun, Jul, Aug, Sep, Oct,
9858
* This function will convert other formats to this format.
9859
* For instance, September 12, 2004 should be converted to 12-Sep-2004
9860
* 12/15/2003 should be converted to 15-Dec-2003.
9862
* If the date supplied is ambiguous (01/03/05), can you allow the indexer to choose which field goes in Mmm and which in DD.
9865
static Int4 ReadNumberFromToken (CharPtr token, Int4 token_len)
9869
if (token == NULL || !isdigit (*token))
9873
while (token_len > 0)
9876
val += *token - '0';
9884
static Int4 GetYearFromNumber(Int4 year)
9891
if (year + 2000 > dt.tm_year + 1901)
9903
static Int4 GetYearFromToken (CharPtr token, Int4 token_len)
9907
if (token == NULL || token_len == 0 || token_len > 4)
9912
year = GetYearFromNumber(ReadNumberFromToken (token, token_len));
9917
static CharPtr month_abbrevs [12] =
9919
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
9920
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
9923
static Int4 days_in_month [12] =
9925
31, 29, 31, 30, 31, 30,
9926
31, 31, 30, 31, 30, 31
9929
static Int4 GetMonthNumFromAbbrev (CharPtr month_abbrev)
9933
for (i = 0; i < 12; i++) {
9934
if (StringICmp (month_abbrev, month_abbrevs[i]) == 0) {
9941
static Int4 GetDaysInMonth (CharPtr month)
9945
for (month_num = 0; month_num < 12; month_num++)
9947
if (StringCmp (month, month_abbrevs [month_num]) == 0)
9949
return days_in_month [month_num];
9955
static CharPtr GetMonthFromToken (CharPtr token, Int4 token_len)
9959
if (token == NULL || token_len == 0)
9964
if (isdigit (*token))
9972
month_num = ReadNumberFromToken (token, token_len);
9973
if (month_num == 0 || month_num > 12)
9979
return month_abbrevs [month_num - 1];
9985
for (month_num = 0; month_num < 12; month_num++)
9987
if (StringNICmp (token, month_abbrevs[month_num], 3) == 0)
9989
return month_abbrevs[month_num];
10001
Boolean year_first,
10005
if (day == NULL || year == NULL)
10010
if (num_1 == 0 && num_2 == 0)
10014
else if (num_1 == 0)
10019
else if (num_2 == 0)
10024
else if (num_1 > GetDaysInMonth (month))
10029
else if (num_2 > GetDaysInMonth (month))
10034
else if (year_first)
10052
Boolean month_first,
10053
CharPtr PNTR month,
10055
BoolPtr month_ambiguous)
10057
if (year == NULL || month == NULL
10058
|| (num_1 == 0 && num_2 == 0)
10059
|| (num_1 > 12 && num_2 > 12)
10060
|| (num_1 == 0 && num_2 > 12)
10061
|| (num_2 == 0 && num_1 > 12))
10069
*month = month_abbrevs[num_2 - 1];
10071
else if (num_2 == 0)
10074
*month = month_abbrevs[num_1 - 1];
10076
else if (num_1 > 12)
10078
*year = GetYearFromNumber(num_1);
10079
*month = month_abbrevs [num_2 - 1];
10081
else if (num_2 > 12)
10083
*year = GetYearFromNumber(num_2);
10084
*month = month_abbrevs [num_1 - 1];
10086
else if (month_first)
10088
if (month_ambiguous != NULL)
10090
*month_ambiguous = TRUE;
10092
*year = GetYearFromNumber(num_2);
10093
*month = month_abbrevs [num_1 - 1];
10097
if (month_ambiguous != NULL)
10099
*month_ambiguous = TRUE;
10101
*year = GetYearFromNumber(num_1);
10102
*month = month_abbrevs [num_2 - 1];
10108
static Boolean ChooseMonthAndDay
10111
Boolean month_first,
10112
CharPtr PNTR month,
10114
BoolPtr month_ambiguous)
10116
if (day == NULL || month == NULL || num_1 == 0 || num_2 == 0
10117
|| (num_1 > 12 && num_2 > 12))
10125
*month = month_abbrevs [num_2 - 1];
10127
else if (num_2 > 12)
10130
*month = month_abbrevs [num_1 - 1];
10132
else if (month_first)
10134
if (month_ambiguous != NULL)
10136
*month_ambiguous = TRUE;
10139
*month = month_abbrevs [num_1 - 1];
10143
if (month_ambiguous != NULL)
10145
*month_ambiguous = TRUE;
10148
*month = month_abbrevs [num_2 - 1];
10153
extern CharPtr ReformatDateStringEx (CharPtr orig_date, Boolean month_first, BoolPtr month_ambiguous)
10155
CharPtr reformatted_date = NULL, cp;
10156
Int4 year = 0, day = 0;
10157
CharPtr month = NULL;
10158
CharPtr token_list[3];
10159
Int4 token_lens[3];
10160
CharPtr numbers = "0123456789";
10161
CharPtr letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
10162
Int4 num_tokens = 0;
10164
Int4 month_token = -1;
10166
Int4 num_1, num_2, num_3;
10168
if (StringHasNoText (orig_date))
10173
/* divide our original date into tokens */
10174
/* skip over any leading spaces */
10176
while (*cp != 0 && num_tokens < 3)
10179
token_len = StringSpn (cp, numbers);
10180
if (token_len == 0)
10182
token_len = StringSpn (cp, letters);
10188
if (token_len == 0)
10196
if (month_token == -1)
10198
month_token = num_tokens;
10202
/* already found a month string */
10206
token_list [num_tokens] = cp;
10207
token_lens [num_tokens] = token_len;
10213
if (num_tokens == 0 || *cp != 0)
10218
if (num_tokens == 1)
10220
if (month_token == 0)
10224
year = GetYearFromToken (token_list [0], token_lens [0]);
10226
else if (num_tokens == 2)
10228
if (month_token == 0)
10230
month = GetMonthFromToken (token_list [0], token_lens [0]);
10231
year = GetYearFromToken (token_list [1], token_lens [1]);
10233
else if (month_token == 1)
10235
month = GetMonthFromToken (token_list [1], token_lens [1]);
10236
year = GetYearFromToken (token_list [0], token_lens [0]);
10240
num_1 = ReadNumberFromToken (token_list [0], token_lens [0]);
10241
num_2 = ReadNumberFromToken (token_list [1], token_lens [1]);
10242
if (! ChooseMonthAndYear (num_1, num_2, month_first, &month, &year, month_ambiguous))
10248
else if (num_tokens == 3)
10250
if (month_token == 0)
10252
month = GetMonthFromToken (token_list [0], token_lens [0]);
10253
num_1 = ReadNumberFromToken (token_list [1], token_lens [1]);
10254
num_2 = ReadNumberFromToken (token_list [2], token_lens [2]);
10255
if (!ChooseDayAndYear (num_1, num_2, month, FALSE, &day, &year))
10260
else if (month_token == 1)
10262
month = GetMonthFromToken (token_list [1], token_lens [1]);
10263
num_1 = ReadNumberFromToken (token_list [0], token_lens [0]);
10264
num_2 = ReadNumberFromToken (token_list [2], token_lens [2]);
10265
if (!ChooseDayAndYear (num_1, num_2, month, FALSE, &day, &year))
10270
else if (month_token == 2)
10272
month = GetMonthFromToken (token_list [2], token_lens [2]);
10273
num_1 = ReadNumberFromToken (token_list [0], token_lens [0]);
10274
num_2 = ReadNumberFromToken (token_list [1], token_lens [1]);
10275
if (!ChooseDayAndYear (num_1, num_2, month, FALSE, &day, &year))
10282
num_1 = ReadNumberFromToken (token_list [0], token_lens [0]);
10283
num_2 = ReadNumberFromToken (token_list [1], token_lens [1]);
10284
num_3 = ReadNumberFromToken (token_list [2], token_lens [2]);
10286
if (num_1 > 31 || num_1 == 0)
10289
if (! ChooseMonthAndDay (num_2, num_3, month_first, &month, &day, month_ambiguous))
10294
else if (num_2 > 31 || num_2 == 0)
10297
if (! ChooseMonthAndDay (num_1, num_3, month_first, &month, &day, month_ambiguous))
10302
else if (num_3 > 31 || num_3 == 0)
10305
if (! ChooseMonthAndDay (num_1, num_2, month_first, &month, &day, month_ambiguous))
10310
else if (num_1 > 0 && num_1 < 13 && num_2 > days_in_month [num_1] && num_3 <= days_in_month [num_1])
10312
month = month_abbrevs [num_1 - 1];
10316
else if (num_1 > 0 && num_1 < 13 && num_3 > days_in_month [num_1] && num_2 <= days_in_month [num_1])
10318
month = month_abbrevs [num_1 - 1];
10322
else if (num_2 > 0 && num_2 < 13 && num_1 > days_in_month [num_2] && num_3 <= days_in_month [num_1])
10324
month = month_abbrevs [num_2 - 1];
10328
else if (num_2 > 0 && num_2 < 13 && num_3 > days_in_month [num_2] && num_1 <= days_in_month [num_1])
10330
month = month_abbrevs [num_2 - 1];
10334
else if (num_3 > 0 && num_3 < 13 && num_1 > days_in_month [num_3] && num_2 <= days_in_month [num_1])
10336
month = month_abbrevs [num_3 - 1];
10340
else if (num_3 > 0 && num_3 < 13 && num_2 > days_in_month [num_3] && num_1 <= days_in_month [num_1])
10342
month = month_abbrevs [num_3 - 1];
10349
if (! ChooseMonthAndDay (num_1, num_2, month_first, &month, &day, month_ambiguous))
10352
if (!ChooseMonthAndDay (num_2, num_3, month_first, &month, &day, month_ambiguous))
10360
year = GetYearFromNumber(year);
10363
if (month == NULL && day > 0)
10368
reformatted_date = (CharPtr) MemNew (sizeof (Char) * 12);
10369
if (reformatted_date == NULL)
10376
sprintf (reformatted_date, "%d", year);
10380
sprintf (reformatted_date, "%s-%d", month, year);
10384
sprintf (reformatted_date, "%02d-%s-%d", day, month, year);
10386
return reformatted_date;
10389
typedef struct collectiondatedlg {
10390
DIALOG_MESSAGE_BLOCK
10391
TaglistCallback tlp_callback;
10392
Pointer callback_data;
10397
} CollectionDateDlgData, PNTR CollectionDateDlgPtr;
10399
static void PopulateDayPopup (PopuP p, Int4 month);
10401
static void PointerToCollectionDateDialog (DialoG d, Pointer data)
10403
CollectionDateDlgPtr dlg;
10404
CharPtr val, reformatted;
10405
Boolean ambiguous = FALSE;
10406
CharPtr cp, cp2, month_abbrev;
10407
Int4 year = 1, month = 1, day = 1;
10409
dlg = (CollectionDateDlgPtr) GetObjectExtra (d);
10410
if (dlg == NULL) return;
10412
SetValue (dlg->year, 1);
10413
SetValue (dlg->month, 1);
10414
SetValue (dlg->day, 1);
10415
Disable (dlg->month);
10416
Disable (dlg->day);
10418
val = (CharPtr) data;
10420
reformatted = ReformatDateStringEx (val, TRUE, &ambiguous);
10421
if (StringHasNoText (reformatted) || ambiguous) {
10424
cp = StringChr (reformatted, '-');
10426
year = GetYearFromToken (reformatted, StringLen (reformatted));
10427
year = year - dlg->start_year + 2;
10429
if (isdigit (*reformatted)) {
10430
day = ReadNumberFromToken (reformatted, cp - reformatted);
10433
cp2 = StringChr (cp, '-');
10434
month_abbrev = GetMonthFromToken (cp, cp2 - cp);
10435
month = GetMonthNumFromAbbrev (month_abbrev);
10441
year = GetYearFromToken (cp2 + 1, StringLen (cp2 + 1));
10442
year = year - dlg->start_year + 2;
10446
month_abbrev = GetMonthFromToken (reformatted, cp - reformatted);
10447
month = GetMonthNumFromAbbrev (month_abbrev);
10453
year = GetYearFromToken (cp + 1, StringLen (cp + 1));
10454
year = year - dlg->start_year + 2;
10457
SetValue (dlg->year, year);
10458
Enable (dlg->month);
10459
SetValue (dlg->month, month);
10461
PopulateDayPopup (dlg->day, month);
10464
SetValue (dlg->day, day);
10468
static Pointer CollectionDateDialogToPointer (DialoG d)
10470
CollectionDateDlgPtr dlg;
10471
Int4 year, month = -1, day = 0;
10472
CharPtr year_fmt = "%d";
10473
CharPtr mon_year_fmt = "%s-%d";
10474
CharPtr day_mon_year_fmt = "%d-%s-%d";
10475
Char date_str[100];
10477
dlg = (CollectionDateDlgPtr) GetObjectExtra (d);
10480
year = GetValue (dlg->year);
10484
year = year + dlg->start_year - 2;
10485
month = GetValue (dlg->month);
10487
sprintf (date_str, year_fmt, year);
10489
day = GetValue (dlg->day);
10491
sprintf (date_str, mon_year_fmt, month_abbrevs[month - 2], year);
10493
sprintf (date_str, day_mon_year_fmt, day - 1, month_abbrevs[month - 2], year);
10499
return StringSave (date_str);
10502
static void PopulateDayPopup (PopuP p, Int4 month)
10511
for (i = 1; i <= days_in_month [month - 2]; i++) {
10512
sprintf (day, "%d", i);
10513
PopupItem (p, day);
10518
static void PopulateMonthPopup (PopuP p)
10523
for (i = 0; i < 12; i++) {
10524
PopupItem (p, month_abbrevs[i]);
10528
static void ChangeCollectionDateMonth (PopuP p)
10530
CollectionDateDlgPtr dlg;
10533
dlg = (CollectionDateDlgPtr) GetObjectExtra (p);
10534
if (dlg == NULL) return;
10536
month = GetValue (p);
10538
Disable (dlg->day);
10540
PopulateDayPopup (dlg->day, month);
10543
if (dlg->tlp_callback != NULL) {
10544
(dlg->tlp_callback) (dlg->callback_data);
10548
static Int4 PopulateYearPopup (PopuP p)
10552
Int4 start_year, i, end_year;
10555
start_year = dt.tm_year + 1901 - 10;
10556
end_year = start_year + 20;
10557
PopupItem (p, " ");
10558
for (i=start_year; i <= end_year; i++) {
10559
sprintf (year_str, "%d", i);
10560
PopupItem (p, year_str);
10565
static void ChangeCollectionDateYear (PopuP p)
10567
CollectionDateDlgPtr dlg;
10569
dlg = (CollectionDateDlgPtr) GetObjectExtra (p);
10570
if (dlg == NULL) return;
10572
if (GetValue (p) < 2) {
10573
Disable (dlg->month);
10574
Disable (dlg->day);
10576
Enable (dlg->month);
10577
ChangeCollectionDateMonth (dlg->month);
10579
if (dlg->tlp_callback != NULL) {
10580
(dlg->tlp_callback) (dlg->callback_data);
10584
extern DialoG CollectionDateDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
10585
TaglistCallback tlp_callback,
10586
Pointer callback_data)
10588
CollectionDateDlgPtr dlg;
10591
p = HiddenGroup (h, 4, 0, NULL);
10592
dlg = (CollectionDateDlgPtr) MemNew (sizeof(CollectionDateDlgData));
10594
SetObjectExtra (p, dlg, StdCleanupExtraProc);
10595
dlg->dialog = (DialoG) p;
10596
dlg->todialog = PointerToCollectionDateDialog;
10597
dlg->fromdialog = CollectionDateDialogToPointer;
10598
dlg->testdialog = NULL;
10599
dlg->tlp_callback = tlp_callback;
10600
dlg->callback_data = callback_data;
10602
dlg->year = PopupList (p, TRUE, ChangeCollectionDateYear);
10603
SetObjectExtra (dlg->year, dlg, NULL);
10604
dlg->start_year = PopulateYearPopup (dlg->year);
10605
SetValue (dlg->year, 1);
10607
dlg->month = PopupList (p, TRUE, ChangeCollectionDateMonth);
10608
SetObjectExtra (dlg->month, dlg, NULL);
10609
PopulateMonthPopup (dlg->month);
10610
SetValue (dlg->month, 1);
10612
dlg->day = PopupList (p, TRUE, ChangeGBQualEditorPopup);
10613
SetObjectExtra (dlg->day, dlg, NULL);
10618
extern Boolean ParseCollectionDateOk (CharPtr txt)
10621
Boolean ambiguous = FALSE;
10622
Boolean rval = FALSE;
10624
if (StringHasNoText (txt)) {
10627
date_str = ReformatDateStringEx (txt, TRUE, &ambiguous);
10628
if (date_str != NULL && !ambiguous) {
10631
date_str = MemFree (date_str);
10636
typedef struct rptunitrangedlg {
10637
DIALOG_MESSAGE_BLOCK
10638
TaglistCallback tlp_callback;
10639
Pointer callback_data;
10642
} RptUnitRangeDlgData, PNTR RptUnitRangeDlgPtr;
10644
static Boolean ParseRptUnitRangeOkEx (CharPtr txt, Int4Ptr pstart, Int4Ptr pstop)
10647
Int4 start = -1, stop = -1;
10649
Boolean rval = FALSE;
10651
if (StringHasNoText (txt)) {
10656
while (*cp != 0 && isdigit (*cp)) {
10662
start = atoi (txt);
10665
while (*cp == ch) {
10669
while (isdigit (*cp)) {
10677
if (start > -1 && stop > -1) {
10678
if (pstart != NULL) {
10681
if (pstop != NULL) {
10689
static void StringToRptUnitRangeDialog (DialoG d, Pointer data)
10691
RptUnitRangeDlgPtr dlg;
10693
Int4 start = -1, stop = -1;
10696
dlg = (RptUnitRangeDlgPtr) GetObjectExtra (d);
10697
if (dlg == NULL) return;
10699
val = (CharPtr) data;
10701
ParseRptUnitRangeOkEx (val, &start, &stop);
10702
if (start > -1 && stop > -1) {
10703
sprintf (num_str, "%d", start);
10704
SetTitle (dlg->range_start, num_str);
10705
sprintf (num_str, "%d", stop);
10706
SetTitle (dlg->range_stop, num_str);
10708
SetTitle (dlg->range_start, "");
10709
SetTitle (dlg->range_stop, "");
10713
static Pointer RptUnitRangeDialogToString (DialoG d)
10715
RptUnitRangeDlgPtr dlg;
10716
CharPtr val = NULL;
10717
CharPtr start, stop;
10719
dlg = (RptUnitRangeDlgPtr) GetObjectExtra (d);
10720
if (dlg == NULL) return NULL;
10722
start = SaveStringFromText (dlg->range_start);
10723
stop = SaveStringFromText (dlg->range_stop);
10725
if (StringHasNoText (start) && StringHasNoText (stop)) {
10726
return StringSave ("");
10728
val = (CharPtr) MemNew (sizeof (Char) * (StringLen (start) + StringLen (stop) + 3));
10729
sprintf (val, "%s..%s", start == NULL ? "" : start, stop == NULL ? "" : stop);
10731
start = MemFree (start);
10732
stop = MemFree (stop);
10737
extern DialoG CreateRptUnitRangeDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
10738
TaglistCallback tlp_callback,
10739
Pointer callback_data)
10741
RptUnitRangeDlgPtr dlg;
10744
p = HiddenGroup (h, 6, 0, NULL);
10745
dlg = (RptUnitRangeDlgPtr) MemNew (sizeof(RptUnitRangeDlgData));
10747
SetObjectExtra (p, dlg, StdCleanupExtraProc);
10748
dlg->dialog = (DialoG) p;
10749
dlg->todialog = StringToRptUnitRangeDialog;
10750
dlg->fromdialog = RptUnitRangeDialogToString;
10751
dlg->testdialog = NULL;
10753
dlg->tlp_callback = tlp_callback;
10754
dlg->callback_data = callback_data;
10756
StaticPrompt (p, "Start", 0, dialogTextHeight, programFont, 'l');
10757
dlg->range_start = DialogText (p, "", 5, ChangeGBQualEditorText);
10758
SetObjectExtra (dlg->range_start, dlg, NULL);
10759
StaticPrompt (p, "Stop", 0, dialogTextHeight, programFont, 'l');
10760
dlg->range_stop = DialogText (p, "", 5, ChangeGBQualEditorText);
10761
SetObjectExtra (dlg->range_stop, dlg, NULL);
10767
static Boolean ParseRptUnitRangeOk (CharPtr txt)
10769
return ParseRptUnitRangeOkEx (txt, NULL, NULL);
10773
typedef struct mobileelementdlg {
10774
DIALOG_MESSAGE_BLOCK
10775
TaglistCallback tlp_callback;
10776
Pointer callback_data;
10777
PopuP element_type;
10779
} MobileElementDlgData, PNTR MobileElementDlgPtr;
10781
CharPtr mobile_element_keywords[] =
10786
"insertion sequence",
10787
"non-LTR retrotransposon",
10794
static Int2 GetMobileElementNum (CharPtr txt, CharPtr PNTR desc_start)
10800
if (desc_start != NULL) {
10801
*desc_start = NULL;
10803
if (StringHasNoText (txt)) {
10806
/* skip over any leading spaces */
10807
while (isspace (*txt)) {
10810
cp = StringChr (txt, ':');
10812
for (i = 1; mobile_element_keywords[i] != NULL; i++) {
10813
if (StringICmp (txt, mobile_element_keywords[i]) == 0) {
10819
keyword_len = cp - txt;
10820
while (keyword_len > 0 && isspace (txt[keyword_len - 1])) {
10823
if (keyword_len == 0) {
10826
for (i = 1; mobile_element_keywords[i] != NULL; i++) {
10827
if (StringNICmp (txt, mobile_element_keywords[i], keyword_len) == 0) {
10828
if (desc_start != NULL && !StringHasNoText (cp + 1)) {
10829
*desc_start = cp + 1;
10830
while (isspace(**desc_start)) {
10841
static Boolean ParseMobileElementOk (CharPtr txt)
10844
if (GetMobileElementNum(txt, NULL) > -1) {
10851
static void ChangeMobileElementType (PopuP p)
10853
MobileElementDlgPtr dlg;
10855
dlg = (MobileElementDlgPtr) GetObjectExtra (p);
10856
if (dlg == NULL) return;
10858
if (GetValue (dlg->element_type) <= 1) {
10859
Disable (dlg->description);
10861
Enable (dlg->description);
10863
ChangeGBQualEditorPopup (p);
10866
static void StringToMobileElementDialog (DialoG d, Pointer data)
10868
MobileElementDlgPtr dlg;
10870
CharPtr desc_start = NULL;
10873
dlg = (MobileElementDlgPtr) GetObjectExtra (d);
10874
if (dlg == NULL) return;
10876
val = (CharPtr) data;
10878
num = GetMobileElementNum (val, &desc_start);
10881
SetValue (dlg->element_type, num + 1);
10882
SetTitle (dlg->description, desc_start == NULL ? "" : desc_start);
10886
static Pointer MobileElementDialogToString (DialoG d)
10888
MobileElementDlgPtr dlg;
10889
CharPtr val = NULL;
10890
CharPtr desc_start = NULL;
10893
dlg = (MobileElementDlgPtr) GetObjectExtra (d);
10894
if (dlg == NULL) return NULL;
10896
num = GetValue (dlg->element_type);
10899
desc_start = SaveStringFromText (dlg->description);
10900
if (StringHasNoText (desc_start)) {
10901
val = StringSave (mobile_element_keywords[num - 1]);
10903
val = (CharPtr) MemNew (sizeof (Char) * (StringLen (mobile_element_keywords[num - 1]) + StringLen (desc_start) + 2));
10904
sprintf (val, "%s:%s", mobile_element_keywords[num - 1], desc_start);
10907
return (Pointer) val;
10911
static DialoG CreateMobileElementDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
10912
TaglistCallback tlp_callback,
10913
Pointer callback_data)
10915
MobileElementDlgPtr dlg;
10919
p = HiddenGroup (h, 3, 0, NULL);
10920
dlg = (MobileElementDlgPtr) MemNew (sizeof(MobileElementDlgData));
10922
SetObjectExtra (p, dlg, StdCleanupExtraProc);
10923
dlg->dialog = (DialoG) p;
10924
dlg->todialog = StringToMobileElementDialog;
10925
dlg->fromdialog = MobileElementDialogToString;
10926
dlg->testdialog = NULL;
10928
dlg->tlp_callback = tlp_callback;
10929
dlg->callback_data = callback_data;
10931
dlg->element_type = PopupList (p, TRUE, ChangeMobileElementType);
10932
for (i = 0; mobile_element_keywords[i] != NULL; i++) {
10933
PopupItem (dlg->element_type, mobile_element_keywords[i]);
10935
SetValue (dlg->element_type, 1);
10936
SetObjectExtra (dlg->element_type, dlg, NULL);
10938
dlg->description = DialogText (p, "", 15, ChangeGBQualEditorText);
10939
SetObjectExtra (dlg->description, dlg, NULL);
10944
static void CopyTextToMobileElementDialog (DialoG d, CharPtr txt)
10946
MobileElementDlgPtr dlg;
10948
dlg = (MobileElementDlgPtr) GetObjectExtra (d);
10950
if (dlg == NULL || StringHasNoText (txt)) return;
10952
SetTitle (dlg->description, txt);
10956
typedef struct truefalsedlg {
10957
DIALOG_MESSAGE_BLOCK
10958
TaglistCallback tlp_callback;
10959
Pointer callback_data;
10961
} TrueFalseDlgData, PNTR TrueFalseDlgPtr;
10963
static void PointerToTrueFalseDialog (DialoG d, Pointer data)
10965
TrueFalseDlgPtr dlg;
10968
dlg = (TrueFalseDlgPtr) GetObjectExtra (d);
10969
if (dlg == NULL) return;
10971
val = (CharPtr) data;
10973
if (StringICmp (val, "TRUE") == 0) {
10974
SetStatus (dlg->is_true, TRUE);
10976
SetStatus (dlg->is_true, FALSE);
10980
static Pointer TrueFalseDialogToPointer (DialoG d)
10982
TrueFalseDlgPtr dlg;
10984
dlg = (TrueFalseDlgPtr) GetObjectExtra (d);
10985
if (dlg == NULL) return StringSave ("FALSE");
10987
if (GetStatus (dlg->is_true)) {
10988
return StringSave ("TRUE");
10990
return StringSave ("FALSE");
10994
static DialoG TrueFalseDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
10995
TaglistCallback tlp_callback,
10996
Pointer callback_data)
10998
TrueFalseDlgPtr dlg;
11001
p = HiddenGroup (h, 2, 0, NULL);
11002
dlg = (TrueFalseDlgPtr) MemNew (sizeof(TrueFalseDlgData));
11004
SetObjectExtra (p, dlg, StdCleanupExtraProc);
11005
dlg->dialog = (DialoG) p;
11006
dlg->todialog = PointerToTrueFalseDialog;
11007
dlg->fromdialog = TrueFalseDialogToPointer;
11008
dlg->testdialog = NULL;
11009
dlg->tlp_callback = tlp_callback;
11010
dlg->callback_data = callback_data;
11012
dlg->is_true = CheckBox (p, "", ChangeGBQualEditorButton);
11013
SetObjectExtra (dlg->is_true, dlg, NULL);
11018
static Boolean ParseTrueFalseOk (CharPtr txt)
11020
if (StringHasNoText (txt) || StringICmp (txt, "TRUE") == 0 || StringICmp (txt, "FALSE") == 0) {
11027
typedef struct simplelistqualdlg {
11028
DIALOG_MESSAGE_BLOCK
11029
TaglistCallback tlp_callback;
11030
Pointer callback_data;
11032
CharPtr PNTR val_list;
11033
} SimpleListQualDlgData, PNTR SimpleListQualDlgPtr;
11035
static Int2 GetListNum (CharPtr val, CharPtr PNTR val_list)
11038
if (StringHasNoText (val)) return 0;
11039
for (i = 1; val_list[i] != NULL; i++) {
11040
if (StringICmp (val, val_list[i]) == 0) {
11047
static void StringToSimpleListQualDialog (DialoG d, Pointer data)
11049
SimpleListQualDlgPtr dlg;
11053
dlg = (SimpleListQualDlgPtr) GetObjectExtra (d);
11054
if (dlg == NULL) return;
11055
val = (CharPtr) data;
11056
num = GetListNum (val, dlg->val_list);
11058
SetValue (dlg->list, num + 1);
11060
SetValue (dlg->list, 1);
11064
static Pointer SimpleListQualDialogToString (DialoG d)
11066
SimpleListQualDlgPtr dlg;
11067
CharPtr val = NULL;
11070
dlg = (SimpleListQualDlgPtr) GetObjectExtra (d);
11071
if (dlg == NULL) return NULL;
11073
num = GetValue (dlg->list);
11075
val = StringSave (dlg->val_list[num - 1]);
11077
return (Pointer) val;
11080
static DialoG SimpleListQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name, CharPtr PNTR list,
11081
TaglistCallback tlp_callback,
11082
Pointer callback_data)
11084
SimpleListQualDlgPtr dlg;
11088
p = HiddenGroup (h, 2, 0, NULL);
11089
dlg = (SimpleListQualDlgPtr) MemNew (sizeof(SimpleListQualDlgData));
11091
SetObjectExtra (p, dlg, StdCleanupExtraProc);
11092
dlg->dialog = (DialoG) p;
11093
dlg->todialog = StringToSimpleListQualDialog;
11094
dlg->fromdialog = SimpleListQualDialogToString;
11095
dlg->testdialog = NULL;
11096
dlg->tlp_callback = tlp_callback;
11097
dlg->callback_data = callback_data;
11099
dlg->list = PopupList (p, TRUE, ChangeGBQualEditorPopup);
11100
SetObjectExtra (dlg->list, dlg, NULL);
11101
dlg->val_list = list;
11102
if (dlg->val_list != NULL) {
11103
for (i = 0; dlg->val_list[i] != NULL; i++) {
11104
PopupItem (dlg->list, dlg->val_list[i]);
11106
SetValue (dlg->list, 1);
11111
typedef struct multilistqualdlg {
11112
DIALOG_MESSAGE_BLOCK
11113
TaglistCallback tlp_callback;
11114
Pointer callback_data;
11115
ButtoN *button_list;
11118
CharPtr PNTR val_list;
11119
} MultiListQualDlgData, PNTR MultiListQualDlgPtr;
11121
static void CleanupMultiListQualDlg (GraphiC g, VoidPtr data)
11124
MultiListQualDlgPtr dlg;
11126
dlg = (MultiListQualDlgPtr) data;
11128
dlg->button_list = MemFree (dlg->button_list);
11130
StdCleanupExtraProc (g, data);
11133
static void CheckMultiListLast (ButtoN b)
11135
MultiListQualDlgPtr dlg;
11137
dlg = (MultiListQualDlgPtr) GetObjectExtra (b);
11138
if (dlg == NULL) return;
11140
if (GetStatus (b)) {
11141
Enable (dlg->last_txt);
11143
Disable (dlg->last_txt);
11145
if (dlg->tlp_callback) {
11146
(dlg->tlp_callback) (dlg->callback_data);
11150
static void ApplyOneValToMultiListQualDialog (MultiListQualDlgPtr dlg, CharPtr val, CharPtr PNTR other_text)
11155
if (dlg == NULL || StringHasNoText (val) || other_text == NULL) return;
11157
i = GetListNum (val, dlg->val_list);
11159
SetStatus (dlg->button_list[i - 1], TRUE);
11161
if (*other_text == NULL) {
11162
*other_text = StringSave (val);
11164
tmp = (CharPtr) MemNew (sizeof (Char) * (StringLen (*other_text) + StringLen (val) + 2));
11165
sprintf (tmp, "%s,%s", *other_text, val);
11166
*other_text = MemFree (*other_text);
11172
static void StringToMultiListQualDialog (DialoG d, Pointer data)
11174
MultiListQualDlgPtr dlg;
11175
CharPtr val, cp, other_text = NULL;
11178
dlg = (MultiListQualDlgPtr) GetObjectExtra (d);
11179
if (dlg == NULL) return;
11180
for (i = 1; dlg->val_list[i] != NULL; i++) {
11181
SetStatus (dlg->button_list[i - 1], FALSE);
11183
SetStatus (dlg->button_list[i - 1], FALSE);
11184
SetTitle (dlg->last_txt, "");
11186
val = (CharPtr) data;
11187
if (StringHasNoText (val)) {
11191
if (*val == '(' && val[StringLen(val) - 1] == ')') {
11192
/* parentheses list */
11194
cp = StringChr (val, ',');
11195
while (cp != NULL) {
11197
ApplyOneValToMultiListQualDialog (dlg, val, &other_text);
11200
while (isspace(*val)) {
11203
cp = StringChr (val, ',');
11205
val[StringLen(val) - 1] = 0;
11206
ApplyOneValToMultiListQualDialog (dlg, val, &other_text);
11207
val[StringLen(val) - 1] = ')';
11209
ApplyOneValToMultiListQualDialog (dlg, val, &other_text);
11211
if (dlg->last_txt != NULL)
11213
if (!StringHasNoText (other_text)) {
11214
SetTitle (dlg->last_txt, other_text);
11215
SetStatus (dlg->button_list[i - 1], TRUE);
11216
Enable (dlg->last_txt);
11218
Disable (dlg->last_txt);
11221
other_text = MemFree (other_text);
11224
static Pointer MultiListQualDialogToString (DialoG d)
11226
MultiListQualDlgPtr dlg;
11227
CharPtr val = NULL, tmp;
11230
dlg = (MultiListQualDlgPtr) GetObjectExtra (d);
11231
if (dlg == NULL) return NULL;
11232
for (i = 1; dlg->val_list[i] != NULL; i++) {
11233
if (GetStatus (dlg->button_list[i - 1])) {
11235
val = StringSave (dlg->val_list[i]);
11237
tmp = StringSave (dlg->val_list[i]);
11238
val = CombineSplitGBQual (val, tmp);
11242
if (dlg->last_txt != NULL
11243
&& GetStatus (dlg->button_list[i - 1])
11244
&& !TextHasNoText (dlg->last_txt)) {
11246
val = SaveStringFromText (dlg->last_txt);
11248
tmp = SaveStringFromText (dlg->last_txt);
11249
val = CombineSplitGBQual (val, tmp);
11250
tmp = MemFree (tmp);
11256
static DialoG MultiListQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name, CharPtr PNTR list,
11257
Boolean allow_not_in_list,
11258
TaglistCallback tlp_callback,
11259
Pointer callback_data)
11261
MultiListQualDlgPtr dlg;
11262
GrouP p, g, last_button = NULL;
11263
Int2 i, num_buttons = 1; /* start with one, for the type-in wildcard value */
11265
p = HiddenGroup (h, -1, 0, NULL);
11266
dlg = (MultiListQualDlgPtr) MemNew (sizeof(MultiListQualDlgData));
11268
SetObjectExtra (p, dlg, CleanupMultiListQualDlg);
11269
dlg->dialog = (DialoG) p;
11270
dlg->todialog = StringToMultiListQualDialog;
11271
dlg->fromdialog = MultiListQualDialogToString;
11272
dlg->testdialog = NULL;
11273
dlg->tlp_callback = tlp_callback;
11274
dlg->callback_data = callback_data;
11275
dlg->val_list = list;
11277
/* start with 1, skip blank at start of list */
11278
for (i = 1; dlg->val_list[i] != NULL; i++) {
11282
dlg->button_list = (ButtoN *) MemNew (num_buttons * sizeof (ButtoN));
11284
g = HiddenGroup (p, 4, 0, NULL);
11285
for (i = 1; dlg->val_list [i] != NULL; i++) {
11286
dlg->button_list[i - 1] = CheckBox (g, dlg->val_list[i], ChangeGBQualEditorButton);
11287
SetObjectExtra (dlg->button_list[i - 1], dlg, NULL);
11289
if (allow_not_in_list)
11291
last_button = HiddenGroup (p, 2, 0, NULL);
11292
dlg->button_list[i - 1] = CheckBox (last_button, "", CheckMultiListLast);
11293
SetObjectExtra (dlg->button_list[i - 1], dlg, NULL);
11294
dlg->last_txt = DialogText (last_button, "", 20, ChangeGBQualEditorText);
11295
SetObjectExtra (dlg->last_txt, dlg, NULL);
11296
Disable (dlg->last_txt);
11299
AlignObjects (ALIGN_CENTER, (HANDLE) g, (HANDLE) last_button, NULL);
11304
static Boolean ParseMultiListQualOk (CharPtr val)
11309
CharPtr codon_start_values[] = {" ", "1", "2", "3", NULL};
11310
static DialoG CodonStartQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11311
TaglistCallback tlp_callback,
11312
Pointer callback_data)
11315
return SimpleListQualDialog (h, sep, name, codon_start_values, tlp_callback, callback_data);
11317
static Boolean ParseCodonStartOk (CharPtr val)
11319
if (GetListNum (val, codon_start_values) > -1) {
11326
CharPtr mol_type_values[] = {" ", "genomic DNA", "genomic RNA", "mRNA", "tRNA", "rRNA",
11327
"snoRNA", "snRNA", "scRNA", "pre-RNA", "other RNA",
11328
"other DNA", "viral cRNA", "unassigned DNA", "unassigned RNA", NULL};
11329
static DialoG MolTypeQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11330
TaglistCallback tlp_callback,
11331
Pointer callback_data)
11333
return SimpleListQualDialog (h, sep, name, mol_type_values, tlp_callback, callback_data);
11335
static Boolean ParseMolTypeOk (CharPtr val)
11337
if (GetListNum (val, mol_type_values) > -1) {
11344
CharPtr organelle_values[] = {" ", "mitochondrion", "nucleomorph", "plastid",
11345
"mitochondrion:kinetoplast",
11346
"plastid:chloroplast", "plastid:apicoplast",
11347
"plastid:chromoplast", "plastid:cyanelle",
11348
"plastid:leucoplast", "plastid:proplastid", NULL};
11349
static DialoG OrganelleQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11350
TaglistCallback tlp_callback,
11351
Pointer callback_data)
11353
return SimpleListQualDialog (h, sep, name, organelle_values, tlp_callback, callback_data);
11355
static Boolean ParseOrganelleOk (CharPtr val)
11357
if (GetListNum (val, organelle_values) > -1) {
11364
CharPtr rpt_type_values[] = {" ", "tandem", "inverted", "flanking", "terminal",
11365
"direct", "dispersed", "other", NULL};
11366
static DialoG RptTypeQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11367
TaglistCallback tlp_callback,
11368
Pointer callback_data)
11372
return MultiListQualDialog (h, sep, name, rpt_type_values, FALSE, tlp_callback, callback_data);
11375
static Boolean ParseRptTypeOk (CharPtr val)
11377
CharPtr cpy, cp, check;
11378
Boolean rval = TRUE;
11380
if (StringHasNoText (val))
11384
else if (val[0] == '(' && val[StringLen(val) - 1] == ')')
11386
cpy = StringSave (val + 1);
11387
cpy [StringLen (cpy) - 1] = 0;
11389
cp = StringChr (cpy, ',');
11390
while (cp != NULL && rval)
11393
TrimSpacesAroundString (check);
11394
if (GetListNum (check, rpt_type_values) < 0)
11399
cp = StringChr (check, ',');
11403
TrimSpacesAroundString (check);
11404
if (GetListNum (check, rpt_type_values) < 0)
11409
cpy = MemFree (cpy);
11411
else if (GetListNum (val, rpt_type_values) < 0)
11418
CharPtr direction_values[] = {" ", "LEFT", "RIGHT", "BOTH", NULL};
11419
static DialoG DirectionQualDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11420
TaglistCallback tlp_callback,
11421
Pointer callback_data)
11423
return SimpleListQualDialog (h, sep, name, direction_values, tlp_callback, callback_data);
11425
static Boolean ParseDirectionOk (CharPtr val)
11427
if (GetListNum (val, direction_values) > -1) {
11434
typedef DialoG (*BuildQualEditorDialog) PROTO ((GrouP, SeqEntryPtr, CharPtr,
11435
TaglistCallback, Pointer));
11436
typedef void (*CopyTextToEditor) PROTO ((DialoG, CharPtr));
11438
typedef struct gbqualeditlist {
11440
BuildQualEditorDialog build_dlg;
11442
CopyTextToEditor copy_txt;
11443
} GBQualEditListData, PNTR GBQualEditListPtr;
11445
GBQualEditListData gbqual_edit_list[] = {
11446
{"chloroplast", TrueFalseDialog, ParseTrueFalseOk, NULL },
11447
{"chromoplast", TrueFalseDialog, ParseTrueFalseOk, NULL },
11448
{"codon_start", CodonStartQualDialog, ParseCodonStartOk, NULL },
11449
{"collection_date", CollectionDateDialog, ParseCollectionDateOk, NULL },
11450
{"cyanelle", TrueFalseDialog, ParseTrueFalseOk, NULL },
11451
{"direction", DirectionQualDialog, ParseDirectionOk, NULL },
11452
{"germline", TrueFalseDialog, ParseTrueFalseOk, NULL },
11453
{"kinetoplast", TrueFalseDialog, ParseTrueFalseOk, NULL },
11454
{"macronuclear", TrueFalseDialog, ParseTrueFalseOk, NULL },
11455
{"mitochondrion", TrueFalseDialog, ParseTrueFalseOk, NULL },
11456
{"mobile_element", CreateMobileElementDialog, ParseMobileElementOk, CopyTextToMobileElementDialog },
11457
{"mol_type", MolTypeQualDialog, ParseMolTypeOk, NULL },
11458
{"organelle", OrganelleQualDialog, ParseOrganelleOk, NULL },
11459
{"partial", TrueFalseDialog, ParseTrueFalseOk, NULL },
11460
{"proviral", TrueFalseDialog, ParseTrueFalseOk, NULL },
11461
{"pseudo", TrueFalseDialog, ParseTrueFalseOk, NULL },
11462
{"rearranged", TrueFalseDialog, ParseTrueFalseOk, NULL },
11463
{"rpt_type", RptTypeQualDialog, ParseRptTypeOk, NULL },
11464
{"rpt_unit_range", CreateRptUnitRangeDialog, ParseRptUnitRangeOk, NULL } ,
11465
{"virion", TrueFalseDialog, ParseTrueFalseOk, NULL },
11466
{"focus", TrueFalseDialog, ParseTrueFalseOk, NULL },
11467
{"transgenic", TrueFalseDialog, ParseTrueFalseOk, NULL },
11468
{"environmental_sample", TrueFalseDialog, ParseTrueFalseOk, NULL },
11469
{"ribosomal_slippage", TrueFalseDialog, ParseTrueFalseOk, NULL },
11470
{"trans_splicing", TrueFalseDialog, ParseTrueFalseOk, NULL },
11471
{"metagenomic", TrueFalseDialog, ParseTrueFalseOk, NULL },
11472
{NULL, NULL, NULL}};
11475
typedef struct singlegbqualedit {
11476
DIALOG_MESSAGE_BLOCK
11477
TaglistCallback tlp_callback;
11478
Pointer callback_data;
11485
GBQualEditListPtr edit_list;
11487
Boolean force_string;
11488
} SingleGBQualEditData, PNTR SingleGBQualEditPtr;
11490
static void ChangeSingleQualEdit (GrouP g)
11492
SingleGBQualEditPtr dlg;
11494
dlg = (SingleGBQualEditPtr) GetObjectExtra (g);
11496
if (GetValue (dlg->choice_grp) == 1) {
11497
SafeEnable (dlg->editor);
11498
Disable (dlg->txt);
11500
SetValue (dlg->choice_grp, 2);
11501
SafeDisable (dlg->editor);
11504
if (dlg->tlp_callback != NULL) {
11505
(dlg->tlp_callback) (dlg->callback_data);
11510
static void StringToSingleGBQualEditDialog (DialoG d, Pointer data)
11512
SingleGBQualEditPtr dlg;
11515
dlg = (SingleGBQualEditPtr) GetObjectExtra (d);
11516
if (dlg == NULL) return;
11518
val = (CharPtr) data;
11520
if (StringHasNoText (val) || (!dlg->force_string && dlg->edit_list != NULL && (dlg->edit_list->parse_ok(val)))) {
11521
SetTitle (dlg->txt, "");
11522
if (dlg->choice_grp != NULL) {
11523
SetValue (dlg->choice_grp, 1);
11524
Hide (dlg->use_editor);
11525
Hide (dlg->use_text);
11527
Hide (dlg->copy_text);
11528
PointerToDialog (dlg->editor, val);
11529
Enable (dlg->editor);
11530
Disable (dlg->txt);
11533
SetTitle (dlg->txt, val);
11534
if (dlg->choice_grp != NULL) {
11535
SetValue (dlg->choice_grp, 2);
11536
Show (dlg->use_editor);
11537
Show (dlg->use_text);
11539
Show (dlg->copy_text);
11540
PointerToDialog (dlg->editor, NULL);
11542
Disable (dlg->editor);
11547
static Pointer SingleGBQualEditDialogToString (DialoG d)
11549
SingleGBQualEditPtr dlg;
11552
dlg = (SingleGBQualEditPtr) GetObjectExtra (d);
11553
if (dlg == NULL) return NULL;
11554
if (dlg->choice_grp == NULL || GetValue (dlg->choice_grp) == 2) {
11555
val = SaveStringFromText (dlg->txt);
11557
val = DialogToPointer (dlg->editor);
11563
static void GBQualEditDialogMessage (DialoG d, Int2 mssg)
11566
SingleGBQualEditPtr dlg;
11568
dlg = (SingleGBQualEditPtr) GetObjectExtra (d);
11570
if (mssg == VIB_MSG_INIT
11571
|| mssg == VIB_MSG_ENTER) {
11572
if (dlg->choice_grp == NULL || GetValue (dlg->choice_grp) == 2) {
11575
Select (dlg->editor);
11581
static void GBQualEditDialogCopyText (ButtoN b)
11583
SingleGBQualEditPtr dlg;
11586
dlg = (SingleGBQualEditPtr) GetObjectExtra (b);
11587
if (dlg != NULL && dlg->edit_list != NULL && dlg->edit_list->copy_txt != NULL) {
11588
txt = SaveStringFromText (dlg->txt);
11589
(dlg->edit_list->copy_txt)(dlg->editor, txt);
11590
txt = MemFree (txt);
11594
static DialoG CreateSingleGBQualEditDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
11595
Boolean force_string,
11596
TaglistCallback tlp_callback,
11597
Pointer callback_data)
11599
SingleGBQualEditPtr dlg;
11603
p = HiddenGroup (h, 2, 0, NULL);
11604
SetGroupSpacing (p, 10, 10);
11605
dlg = (SingleGBQualEditPtr) MemNew (sizeof(SingleGBQualEditData));
11607
SetObjectExtra (p, dlg, StdCleanupExtraProc);
11608
dlg->dialog = (DialoG) p;
11609
dlg->todialog = StringToSingleGBQualEditDialog;
11610
dlg->fromdialog = SingleGBQualEditDialogToString;
11611
dlg->testdialog = NULL;
11612
dlg->dialogmessage = GBQualEditDialogMessage;
11613
dlg->tlp_callback = tlp_callback;
11614
dlg->callback_data = callback_data;
11615
dlg->force_string = force_string;
11618
dlg->edit_list = NULL;
11619
for (i = 0; gbqual_edit_list[i].name != NULL && dlg->edit_list == NULL; i++) {
11620
if (StringICmp (gbqual_edit_list[i].name, name) == 0) {
11621
dlg->edit_list = gbqual_edit_list + i;
11625
dlg->copy_text = NULL;
11627
if (dlg->edit_list == NULL || dlg->edit_list->build_dlg == NULL || force_string) {
11628
dlg->txt = DialogText (p, "", 20, ChangeGBQualEditorText);
11629
SetObjectExtra (dlg->txt, dlg, NULL);
11630
dlg->editor = NULL;
11631
dlg->choice_grp = NULL;
11633
dlg->choice_grp = HiddenGroup (p, 0, 2, ChangeSingleQualEdit);
11634
SetObjectExtra (dlg->choice_grp, dlg, NULL);
11635
dlg->use_editor = RadioButton (dlg->choice_grp, "");
11636
dlg->use_text = RadioButton (dlg->choice_grp, "");
11637
dlg->editor = (dlg->edit_list->build_dlg) (dlg->choice_grp, sep, name, tlp_callback, callback_data);
11638
dlg->txt = DialogText (dlg->choice_grp, "", 20, ChangeGBQualEditorText);
11639
SetObjectExtra (dlg->txt, dlg, NULL);
11640
SetValue (dlg->choice_grp, 1);
11641
if (dlg->edit_list->copy_txt != NULL) {
11642
dlg->copy_text = PushButton (dlg->choice_grp, "Copy Text", GBQualEditDialogCopyText);
11643
SetObjectExtra (dlg->copy_text, dlg, NULL);
11645
// AlignObjects (ALIGN_LOWER, (HANDLE) dlg->use_text, (HANDLE) dlg->txt, NULL);
11646
AlignObjects (ALIGN_LOWER, (HANDLE) dlg->txt, (HANDLE) dlg->use_text, NULL);
11647
ChangeSingleQualEdit (dlg->choice_grp);
11653
typedef struct newfieldpage {
11654
DIALOG_MESSAGE_BLOCK
11656
DialoG PNTR editors;
11660
Boolean allowProductGBQual;
11662
} NewFieldPage, PNTR NewFieldPagePtr;
11664
static void CleanupNewFieldsPage (GraphiC g, VoidPtr data)
11667
NewFieldPagePtr fpf;
11669
fpf = (NewFieldPagePtr) data;
11671
MemFree (fpf->editors);
11672
fpf->new_gbq = GBQualFree (fpf->new_gbq);
11677
static CharPtr GetDisplayQualName (CharPtr qual_name, Boolean is_legal)
11679
CharPtr display_name;
11682
display_name = StringSave (qual_name);
11684
display_name = (CharPtr) MemNew (sizeof (Char) * (StringLen (qual_name) + 2));
11685
sprintf (display_name, "*%s", qual_name);
11687
return display_name;
11690
static Boolean QualNamesMatch (CharPtr qual_name1, CharPtr qual_name2)
11692
if (StringICmp (qual_name1, qual_name2) == 0) {
11694
} else if (qual_name1 != NULL
11695
&& *(qual_name1) == '*'
11696
&& StringICmp (qual_name1 + 1, qual_name2) == 0) {
11698
} else if (qual_name2 != NULL
11699
&& *qual_name2 == '*'
11700
&& StringICmp (qual_name1, qual_name2 + 1) == 0) {
11707
static Boolean IsCombinableQual (Int2 qual)
11709
Boolean combine_qual = FALSE;
11711
if (qual == GBQUAL_rpt_type
11712
|| qual == GBQUAL_rpt_unit
11713
|| qual == GBQUAL_rpt_unit_range
11714
|| qual == GBQUAL_rpt_unit_seq
11715
|| qual == GBQUAL_replace
11716
|| qual == GBQUAL_compare
11717
|| qual == GBQUAL_old_locus_tag
11718
|| qual == GBQUAL_usedin) {
11719
combine_qual = TRUE;
11721
return combine_qual;
11724
static void AddTemporaryGBQual (GBQualPtr PNTR gbq_list, CharPtr qual_name, GBQualPtr gbq_feat, Boolean is_legal)
11727
GBQualPtr gbq_last = NULL;
11728
GBQualPtr gbq_new = NULL;
11729
Boolean found = FALSE;
11730
Boolean combine_qual = FALSE;
11731
CharPtr blank_val = "\"\"";
11733
if (gbq_list == NULL) return;
11735
gbq_last = *gbq_list;
11736
while (gbq_last != NULL && gbq_last->next != NULL) {
11737
if (QualNamesMatch (gbq_last->qual, qual_name)) {
11738
/* already added */
11741
gbq_last = gbq_last->next;
11743
if (gbq_last != NULL && QualNamesMatch (gbq_last->qual, qual_name)) {
11744
/* already added */
11748
/* add value. If none in feature, if true/false, add TRUE or FALSE, else use blank. */
11749
qual = GBQualNameValid (qual_name);
11751
combine_qual = IsCombinableQual (qual);
11753
while (gbq_feat != NULL) {
11754
if (StringICmp (qual_name, gbq_feat->qual) == 0) {
11755
if (StringHasNoText (gbq_feat->val)) {
11756
if (qual > -1 && ParFlat_GBQual_names [qual].gbclass == Class_none && !found) {
11757
/* if this is a true-false, only add one qualifier */
11758
gbq_new = GBQualNew ();
11759
gbq_new->qual = GetDisplayQualName (qual_name, is_legal);
11760
gbq_new->val = StringSave ("TRUE");
11761
if (gbq_last == NULL) {
11762
*gbq_list = gbq_new;
11764
gbq_last->next = gbq_new;
11766
gbq_last = gbq_new;
11768
} else if (qual == GBQUAL_replace) {
11769
/* save blank values */
11771
if (found && combine_qual) {
11772
gbq_new = *gbq_list;
11773
while (gbq_new != NULL && !QualNamesMatch (gbq_feat->qual, gbq_new->qual)) {
11774
gbq_new = gbq_new->next;
11777
if (gbq_new == NULL) {
11778
/* make new qualifier */
11779
gbq_new = GBQualNew ();
11780
gbq_new->qual = GetDisplayQualName (qual_name, is_legal);
11781
gbq_new->val = StringSave (blank_val);
11783
if (gbq_last == NULL) {
11784
*gbq_list = gbq_new;
11786
gbq_last->next = gbq_new;
11788
gbq_last = gbq_new;
11790
/* combine with previous value */
11791
gbq_new->val = CombineSplitGBQual (gbq_new->val, blank_val);
11795
/* if not true-false or already have true-false, we'll just be adding a blank value later */
11796
/* so do nothing here */
11800
if (found && combine_qual) {
11801
gbq_new = *gbq_list;
11802
while (gbq_new != NULL && !QualNamesMatch (gbq_feat->qual, gbq_new->qual)) {
11803
gbq_new = gbq_new->next;
11806
if (gbq_new == NULL) {
11807
/* make new qualifier */
11808
gbq_new = GBQualNew ();
11809
gbq_new->qual = GetDisplayQualName (qual_name, is_legal);
11810
gbq_new->val = StringSave (gbq_feat->val);
11812
if (gbq_last == NULL) {
11813
*gbq_list = gbq_new;
11815
gbq_last->next = gbq_new;
11817
gbq_last = gbq_new;
11819
/* combine with previous value */
11820
gbq_new->val = CombineSplitGBQual (gbq_new->val, gbq_feat->val);
11825
gbq_feat = gbq_feat->next;
11829
gbq_new = GBQualNew ();
11830
gbq_new->qual = GetDisplayQualName (qual_name, is_legal);
11831
if (qual > -1 && ParFlat_GBQual_names [qual].gbclass == Class_none) {
11832
gbq_new->val = StringSave ("FALSE");
11834
gbq_new->val = StringSave ("");
11836
if (gbq_last == NULL) {
11837
*gbq_list = gbq_new;
11839
gbq_last->next = gbq_new;
11844
static Boolean IsRarelyUsed (Int2 qual)
11846
if (qual == GBQUAL_allele
11847
|| qual == GBQUAL_function
11848
|| qual == GBQUAL_map
11849
|| qual == GBQUAL_standard_name
11850
|| qual == GBQUAL_old_locus_tag) {
11857
static Pointer NewDialogToImportFields (DialoG d)
11859
NewFieldPagePtr fpf;
11860
GBQualPtr gbq_list = NULL, gbq_last = NULL, gbq_new, gbq_it;
11862
CharPtr val, qual_name;
11864
fpf = (NewFieldPagePtr) GetObjectExtra (d);
11865
if (fpf == NULL) return NULL;
11867
for (gbq_it = fpf->new_gbq, i = 0; gbq_it != NULL; gbq_it = gbq_it->next, i++) {
11868
gbq_it->val = MemFree (gbq_it->val);
11869
gbq_it->val = DialogToPointer (fpf->editors[i]);
11872
for (gbq_it = fpf->new_gbq; gbq_it != NULL; gbq_it = gbq_it->next) {
11873
if (StringHasNoText (gbq_it->val)) {
11876
qual_name = gbq_it->qual;
11877
if (qual_name != NULL && *qual_name == '*') {
11880
qual = GBQualNameValid (qual_name);
11883
if (qual > -1 && ParFlat_GBQual_names [qual].gbclass == Class_none) {
11884
if (StringICmp (val, "TRUE") == 0) {
11885
/* don't put "true" in qual, just use empty string */
11887
} else if (StringICmp (val, "FALSE") == 0) {
11888
/* don't add FALSE qual */
11891
/* any other values, add as they are */
11894
gbq_new = GBQualNew();
11895
gbq_new->qual = StringSave (qual_name);
11896
gbq_new->val = StringSave (val);
11897
if (gbq_last == NULL) {
11898
gbq_list = gbq_new;
11900
gbq_last->next = gbq_new;
11902
gbq_last = gbq_new;
11904
return (Pointer) gbq_list;
11908
AddMandatoryAndOptionalQuals
11910
NewFieldPagePtr fpf,
11912
Boolean use_rarely_used)
11914
Int2 index, i, qual;
11915
SematicFeatPtr sefp;
11917
if (name == NULL) return;
11919
index = GBFeatKeyNameValid (&name, FALSE);
11920
if (index < 0) return;
11922
sefp = &(ParFlat_GBFeat [index]);
11923
/* add mandatory quals first */
11924
for (i = 0; i < sefp->mand_num; i++) {
11925
qual = sefp->mand_qual [i];
11927
&& ShouldBeAGBQual (fpf->subtype, qual, fpf->allowProductGBQual)
11928
&& ((use_rarely_used && IsRarelyUsed (qual))
11929
|| (!use_rarely_used && ! IsRarelyUsed (qual)))) {
11930
AddTemporaryGBQual (&(fpf->new_gbq), ParFlat_GBQual_names [qual].name, gbq, TRUE);
11933
/* add optional quals next */
11934
for (i = 0; i < sefp->opt_num; i++) {
11935
qual = sefp->opt_qual [i];
11937
&& ShouldBeAGBQual (fpf->subtype, qual, fpf->allowProductGBQual)
11938
&& ((use_rarely_used && IsRarelyUsed (qual))
11939
|| (!use_rarely_used && ! IsRarelyUsed (qual)))) {
11940
AddTemporaryGBQual (&(fpf->new_gbq), ParFlat_GBQual_names [qual].name, gbq, TRUE);
11946
extern DialoG NewCreateImportFields (GrouP h, CharPtr name, SeqFeatPtr sfp, Boolean allowProductGBQual)
11948
NewFieldPagePtr fpf;
11949
GrouP g, g1, g2 = NULL;
11950
GBQualPtr gbq = NULL, gbq_it;
11953
Int2 num = 0, num_legal = 0;
11957
PrompT ill_q = NULL;
11959
p = HiddenGroup (h, -1, 0, NULL);
11960
fpf = (NewFieldPagePtr) MemNew (sizeof (NewFieldPage));
11963
SetObjectExtra (p, fpf, CleanupNewFieldsPage);
11964
fpf->dialog = (DialoG) p;
11965
fpf->todialog = NULL;
11966
fpf->fromdialog = NewDialogToImportFields;
11967
fpf->testdialog = NULL;
11969
fpf->allowProductGBQual = allowProductGBQual;
11971
fpf->subtype = FEATDEF_ANY;
11973
fpf->subtype = sfp->idx.subtype;
11977
fpf->last_viewed = -1;
11979
/* create list of temporary GBQuals */
11980
/* list mandatory/optional quals that are not rarely used first */
11981
AddMandatoryAndOptionalQuals (name, fpf, gbq, FALSE);
11983
/* add rarely used quals here */
11984
AddMandatoryAndOptionalQuals (name, fpf, gbq, TRUE);
11986
/* count legal values - all others to be listed as simple strings */
11987
for (gbq_it = fpf->new_gbq; gbq_it != NULL; gbq_it = gbq_it->next) {
11991
/* add legal added qualifiers next */
11993
while (gbq_it != NULL) {
11994
qual = GBQualNameValid (gbq_it->qual);
11995
if (qual > -1 && ShouldBeAGBQual (fpf->subtype, qual, fpf->allowProductGBQual)) {
11996
AddTemporaryGBQual (&(fpf->new_gbq), ParFlat_GBQual_names [qual].name, gbq, FALSE);
11998
gbq_it = gbq_it->next;
12001
/* add remaining qualifiers last */
12003
while (gbq_it != NULL) {
12004
if (!ShouldSuppressGBQual(fpf->subtype, gbq_it->qual)) {
12005
AddTemporaryGBQual (&(fpf->new_gbq), gbq_it->qual, gbq, FALSE);
12007
gbq_it = gbq_it->next;
12010
/* calculate maximum name width */
12011
SelectFont (systemFont);
12013
for (gbq_it = fpf->new_gbq; gbq_it != NULL; gbq_it = gbq_it->next) {
12015
wid = StringWidth (gbq_it->qual) + 2;
12020
SelectFont (systemFont);
12022
fpf->numfields = num;
12025
g1 = HiddenGroup (p, 2, 0, NULL);
12027
fpf->editors = MemNew (sizeof (DialoG) * (num + 1));
12028
for (gbq_it = fpf->new_gbq, j = 0; gbq_it != NULL; gbq_it = gbq_it->next) {
12029
if (j == num_legal) {
12030
ill_q = StaticPrompt (p, "*** Illegal Qualifiers ***", 0, dialogTextHeight, programFont, 'l');
12031
g2 = HiddenGroup (p, 2, 0, NULL);
12034
StaticPrompt (g, gbq_it->qual, 0, dialogTextHeight, programFont, 'l');
12035
fpf->editors[j] = CreateSingleGBQualEditDialog (g, NULL, gbq_it->qual,
12036
j < num_legal ? FALSE : TRUE,
12038
PointerToDialog (fpf->editors[j], gbq_it->val);
12041
AlignObjects (ALIGN_CENTER, (HANDLE) g1, (HANDLE) ill_q, (HANDLE) g2, NULL);
12043
fpf->editors = NULL;
12044
StaticPrompt (p, "See Attributes page to set legal qualifiers for this feature.",
12045
0, 0, programFont, 'c');
12052
typedef struct specialcharacterdialog
12054
TexT PNTR text_list;
12057
ValNodePtr find_list;
12058
} SpecialCharacterDialogData, PNTR SpecialCharacterDialogPtr;
12061
static void EnableSpecialCharacterAccept (TexT t)
12063
SpecialCharacterDialogPtr sd;
12066
Boolean has_bad = FALSE;
12068
sd = (SpecialCharacterDialogPtr) GetObjectExtra (t);
12069
if (sd == NULL) return;
12071
for (pos = 0; pos < sd->num_chars && !has_bad; pos++)
12073
str = SaveStringFromText (sd->text_list[pos]);
12074
SpecialCharFind (&str, NULL, &has_bad, NULL);
12075
str = MemFree (str);
12079
Disable (sd->accept_btn);
12083
Enable (sd->accept_btn);
12088
static void SetWindowsSpecialCharacterDefaults (ButtoN b)
12090
SpecialCharacterDialogPtr sd;
12095
sd = (SpecialCharacterDialogPtr) GetObjectExtra (b);
12096
if (sd == NULL) return;
12098
for (vnp = sd->find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
12100
str = GetSpecialWinCharacterReplacement ((unsigned char) vnp->choice);
12101
SetTitle (sd->text_list[pos], str);
12106
static void SetMacSpecialCharacterDefaults (ButtoN b)
12108
SpecialCharacterDialogPtr sd;
12113
sd = (SpecialCharacterDialogPtr) GetObjectExtra (b);
12114
if (sd == NULL) return;
12116
for (vnp = sd->find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
12118
str = GetSpecialMacCharacterReplacement ((unsigned char) vnp->choice);
12119
SetTitle (sd->text_list[pos], str);
12125
extern Boolean FixSpecialCharactersForStringsInList (ValNodePtr find_list, CharPtr exp_text, Boolean force_fix)
12127
ValNodePtr vnp, context_list, vnp_c;
12131
GrouP h, c, g, p1, g2;
12135
SpecialCharacterDialogData sd;
12136
ModalAcceptCancelData acd;
12139
Boolean rval = FALSE;
12141
if (find_list == NULL) {
12148
sd.find_list = find_list;
12149
sd.num_chars = ValNodeLen (find_list);
12151
acd.accepted = FALSE;
12152
acd.cancelled = FALSE;
12154
w = ModalWindow(-20, -13, -10, -10, NULL);
12155
h = HiddenGroup (w, -1, 0, NULL);
12156
SetGroupSpacing (h, 10, 10);
12158
p1 = MultiLinePrompt (h, exp_text, 27 * stdCharWidth, programFont);
12159
p2 = StaticPrompt (h, "Choose replacement characters.", 0, 0, programFont, 'l');
12161
g = HiddenGroup (h, 3, 0, NULL);
12162
StaticPrompt (g, "Character", 0, 0, programFont, 'l');
12163
StaticPrompt (g, "Replacement", 0, 0, programFont, 'l');
12164
StaticPrompt (g, "Contexts", 0, 0, programFont, 'l');
12166
sd.text_list = MemNew (sizeof (TexT) * sd.num_chars);
12168
for (vnp = find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
12170
label[0] = vnp->choice;
12171
StaticPrompt (g, label, 0, 0, programFont, 'l');
12172
repl = GetSpecialCharacterReplacement (vnp->choice);
12173
sd.text_list[pos] = DialogText (g, repl, 5, EnableSpecialCharacterAccept);
12174
SetObjectExtra (sd.text_list[pos], &sd, NULL);
12175
context_list = vnp->data.ptrvalue;
12176
num_contexts = ValNodeLen (context_list);
12177
if (num_contexts == 0)
12179
StaticPrompt (g, "", 0, 0, programFont, 'l');
12181
else if (num_contexts == 1)
12183
StaticPrompt (g, *((CharPtr PNTR)context_list->data.ptrvalue), 0, 0, programFont, 'l');
12187
contexts = SingleList (g, 16, MIN (num_contexts, 5), NULL);
12188
for (vnp_c = context_list; vnp_c != NULL; vnp_c = vnp_c->next)
12190
ListItem (contexts, *((CharPtr PNTR)vnp_c->data.ptrvalue));
12192
SetValue (contexts, 1);
12196
g2 = HiddenGroup (h, 2, 0, NULL);
12197
SetGroupSpacing (g2, 10, 10);
12198
b = PushButton (g2, "Suggest Windows Replacements", SetWindowsSpecialCharacterDefaults);
12199
SetObjectExtra (b, &sd, NULL);
12200
b = PushButton (g2, "Suggest Mac Replacements", SetMacSpecialCharacterDefaults);
12201
SetObjectExtra (b, &sd, NULL);
12203
c = HiddenGroup (h, 3, 0, NULL);
12204
SetGroupSpacing (c, 10, 10);
12205
sd.accept_btn = PushButton (c, "Replace Characters", ModalAcceptButton);
12206
SetObjectExtra (sd.accept_btn, &acd, NULL);
12207
b = PushButton (c, "Cancel", ModalCancelButton);
12208
SetObjectExtra (b, &acd, NULL);
12209
AlignObjects (ALIGN_CENTER, (HANDLE) p1, (HANDLE) p2, (HANDLE) g, (HANDLE) g2, (HANDLE) c, NULL);
12213
while (!acd.accepted && ! acd.cancelled)
12215
ProcessExternalEvent ();
12221
for (vnp = find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
12223
repl = JustSaveStringFromText (sd.text_list[pos]);
12224
label[0] = vnp->choice;
12225
for (vnp_c = vnp->data.ptrvalue; vnp_c != NULL; vnp_c = vnp_c->next)
12227
FindReplaceString (vnp_c->data.ptrvalue, label, repl, TRUE, FALSE);
12229
repl = MemFree (repl);
12234
else if (force_fix)
12236
for (vnp = find_list; vnp != NULL; vnp = vnp->next)
12238
label[0] = vnp->choice;
12239
for (vnp_c = vnp->data.ptrvalue; vnp_c != NULL; vnp_c = vnp_c->next)
12241
FindReplaceString (vnp_c->data.ptrvalue, label, "#", TRUE, FALSE);
12253
NLM_EXTERN Boolean FixSpecialCharacters (Uint2 entityID)
12255
ValNodePtr find_list = NULL;
12258
StringActionInEntity (entityID, FALSE, UPDATE_NEVER, NULL, NULL, NULL, TRUE,
12259
SpecialCharFindWithContext, NULL, &find_list);
12261
rval = FixSpecialCharactersForStringsInList (find_list,
12262
"The ASN.1 contains special characters.\nIf you save it without stripping them,\nyou will be unable to load the file in Sequin.",
12265
find_list = FreeContextList (find_list);
12268
ObjMgrSetDirtyFlag (entityID, TRUE);
12269
ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
12275
NLM_EXTERN Boolean FixSpecialCharactersForObject (Uint2 datatype, Pointer objdata, CharPtr msg, Boolean force_fix, BoolPtr changed)
12277
ValNodePtr find_list = NULL;
12280
StringActionForObject (datatype, objdata, 0, FALSE, UPDATE_NEVER,
12281
SpecialCharFindWithContext, NULL, &find_list);
12283
rval = FixSpecialCharactersForStringsInList (find_list,
12285
"The ASN.1 contains special characters.\nIf you save it without stripping them,\nyou will be unable to load the file in Sequin."
12289
if (changed != NULL)
12291
if (find_list == NULL)
12301
find_list = FreeContextList (find_list);