summaryrefslogtreecommitdiff
path: root/desktop/dlgutil2.c
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/dlgutil2.c')
-rw-r--r--desktop/dlgutil2.c1263
1 files changed, 1143 insertions, 120 deletions
diff --git a/desktop/dlgutil2.c b/desktop/dlgutil2.c
index 22827785..b3d604bd 100644
--- a/desktop/dlgutil2.c
+++ b/desktop/dlgutil2.c
@@ -29,7 +29,7 @@
*
* Version Creation Date: 1/22/95
*
-* $Revision: 6.164 $
+* $Revision: 6.186 $
*
* File Description:
*
@@ -54,6 +54,7 @@
#include <objseq.h>
#include <toasn3.h>
#include <explore.h>
+#include <findrepl.h>
#ifdef WIN_MOTIF
#include <netscape.h>
#endif
@@ -100,6 +101,56 @@ extern CharPtr SaveStringFromTextAndStripNewlines (TexT t)
}
}
+
+extern CharPtr StripNewlines (CharPtr str)
+
+{
+ Char ch;
+ size_t len;
+ CharPtr ptr;
+
+ if (str == NULL) return str;
+ len = StringLen (str);
+ if (len > 0) {
+ ptr = str;
+ ch = *ptr;
+ while (ch != '\0') {
+ if (ch < ' ') {
+ *ptr = ' ';
+ }
+ ptr++;
+ ch = *ptr;
+ }
+ TrimSpacesAroundString (str);
+ if (StringHasNoText (str)) {
+ str = MemFree (str);
+ }
+ } else {
+ str = MemFree (str);
+ }
+ return str;
+}
+
+
+extern void NewlinesToTildes (CharPtr str)
+
+{
+ Uchar ch;
+ CharPtr ptr;
+
+ if (StringHasNoText (str)) return;
+ ptr = str;
+ ch = *ptr;
+ while (ch != '\0') {
+ if (ch < ' ') {
+ *ptr = '~';
+ }
+ ptr++;
+ ch = *ptr;
+ }
+}
+
+
static void DatePtrToDatePage (DialoG d, Pointer data)
{
@@ -1000,6 +1051,37 @@ typedef struct fieldpage {
ButtoN PNTR boxes;
} FieldPage, PNTR FieldPagePtr;
+
+static Boolean ShouldSuppressGBQual(Uint1 subtype, CharPtr qual_name)
+{
+ if (StringHasNoText (qual_name)) {
+ return FALSE;
+ }
+
+ /* always suppress experiment and inference quals */
+ if (StringCmp (qual_name, "experiment") == 0 || StringCmp (qual_name, "inference") == 0) {
+ return TRUE;
+ }
+
+ if (subtype == FEATDEF_ncRNA) {
+ if (StringCmp (qual_name, "product") == 0
+ || StringCmp (qual_name, "ncRNA_class") == 0) {
+ return TRUE;
+ }
+ } else if (subtype == FEATDEF_tmRNA) {
+ if (StringCmp (qual_name, "product") == 0
+ || StringCmp (qual_name, "tag_peptide") == 0) {
+ return TRUE;
+ }
+ } else if (subtype == FEATDEF_otherRNA) {
+ if (StringCmp (qual_name, "product") == 0) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
static Boolean ShouldBeAGBQual (Uint1 subtype, Int2 qual, Boolean allowProductGBQual)
{
@@ -1020,6 +1102,8 @@ static Boolean ShouldBeAGBQual (Uint1 subtype, Int2 qual, Boolean allowProductGB
qual == GBQUAL_rpt_unit ||
qual == GBQUAL_transposon ||
qual == GBQUAL_experiment ||
+ qual == GBQUAL_trans_splicing ||
+ qual == GBQUAL_ribosomal_slippage ||
qual == GBQUAL_inference) {
return FALSE;
}
@@ -1030,6 +1114,11 @@ static Boolean ShouldBeAGBQual (Uint1 subtype, Int2 qual, Boolean allowProductGB
return FALSE;
}
}
+
+ if (qual > -1 && ShouldSuppressGBQual (subtype, ParFlat_GBQual_names [qual].name)) {
+ return FALSE;
+ }
+
return TRUE;
}
@@ -1517,6 +1606,35 @@ static DialoG CreateInferenceDialog (GrouP h, Uint2 rows, Int2 spacing, Int2 wid
static DialoG NewCreateInferenceDialog (GrouP prnt);
extern void Nlm_LaunchGeneFeatEd (ButtoN b);
+
+static CharPtr GetNameForFeature (SeqFeatPtr sfp)
+{
+ FeatDefPtr curr;
+ Uint1 key;
+ CharPtr label = NULL;
+ CharPtr featname = NULL;
+ CharPtr ptr;
+ Char ch;
+
+ if (sfp != NULL) {
+ curr = FeatDefFindNext (NULL, &key, &label, sfp->idx.subtype, TRUE);
+ if (curr != NULL) {
+ featname = StringSave (label);
+ ptr = featname;
+ ch = *ptr;
+ while (ch != '\0') {
+ if (IS_UPPER (ch)) {
+ *ptr = TO_LOWER (ch);
+ }
+ ptr++;
+ ch = *ptr;
+ }
+ }
+ }
+ return featname;
+}
+
+
extern GrouP CreateCommonFeatureGroupEx (GrouP h, FeatureFormPtr ffp,
SeqFeatPtr sfp, Boolean hasGeneControl,
Boolean hasCitationTab, Boolean hasGeneSuppress)
@@ -1544,14 +1662,15 @@ extern GrouP CreateCommonFeatureGroupEx (GrouP h, FeatureFormPtr ffp,
GrouP v;
GrouP x;
GrouP y;
+ CharPtr featname;
c = NULL;
if (ffp != NULL) {
hasQuals = FALSE;
cdsQuals = FALSE;
if (ffp->gbquals == NULL && sfp != NULL && sfp->qual != NULL) {
- for (gbq = sfp->qual; gbq != NULL; gbq = gbq->next) {
- if (StringCmp (gbq->qual, "experiment") != 0 && StringCmp (gbq->qual, "inference") != 0) {
+ for (gbq = sfp->qual; gbq != NULL && !hasQuals; gbq = gbq->next) {
+ if (!ShouldSuppressGBQual(sfp->idx.subtype, gbq->qual)) {
hasQuals = TRUE;
}
}
@@ -1812,7 +1931,9 @@ extern GrouP CreateCommonFeatureGroupEx (GrouP h, FeatureFormPtr ffp,
x = NULL;
if (hasQuals && ffp->gbquals == NULL) {
x = HiddenGroup (c, -1, 0, NULL);
- ffp->gbquals = CreateImportFields (x, NULL, sfp, FALSE);
+ featname = GetNameForFeature (sfp);
+ ffp->gbquals = NewCreateImportFields (x, featname, sfp, FALSE);
+ featname = MemFree (featname);
}
ffp->commonSubGrp [page] = c;
Hide (ffp->commonSubGrp [page]);
@@ -4950,14 +5071,16 @@ static ValNodePtr TestSequenceSelectionDialog (DialoG d)
}
-extern DialoG SequenceSelectionDialog
+extern DialoG SequenceSelectionDialogEx
(GrouP h,
Nlm_ChangeNotifyProc change_notify,
Pointer change_userdata,
Boolean allow_multi,
+ Boolean allow_none,
Boolean show_nucs,
Boolean show_prots,
- Uint2 entityID)
+ Uint2 entityID,
+ Int4 list_height)
{
SequenceSelectionPtr dlg;
@@ -4994,23 +5117,47 @@ extern DialoG SequenceSelectionDialog
dlg->dialogmessage = SequenceSelectionDialogMessage;
dlg->testdialog = TestSequenceSelectionDialog;
- dlg->sequence_choice_list = NULL;
+ if (allow_none) {
+ dlg->sequence_choice_list = ValNodeNew (NULL);
+ dlg->sequence_choice_list->choice = 0;
+ dlg->sequence_choice_list->data.ptrvalue = NULL;
+ } else {
+ dlg->sequence_choice_list = NULL;
+ }
GetSequenceChoiceList (sep, &dlg->sequence_choice_list, show_nucs, show_prots);
for (vnp = dlg->sequence_choice_list; vnp != NULL; vnp = vnp->next) {
sip = SeqIdFindWorst ((SeqIdPtr) vnp->data.ptrvalue);
- SeqIdWrite (sip, tmp, PRINTID_REPORT, sizeof (tmp));
+ if (sip == NULL) {
+ sprintf (tmp, " ");
+ } else {
+ SeqIdWrite (sip, tmp, PRINTID_REPORT, sizeof (tmp));
+ }
ValNodeAddPointer (&choice_name_list, 0, StringSave (tmp));
}
dlg->sequence_list_dlg = SelectionDialog (p, change_notify, change_userdata,
allow_multi, "sequence",
- choice_name_list, TALL_SELECTION_LIST);
+ choice_name_list, list_height);
ValNodeFreeData (choice_name_list);
return (DialoG) p;
}
+
+extern DialoG SequenceSelectionDialog
+(GrouP h,
+ Nlm_ChangeNotifyProc change_notify,
+ Pointer change_userdata,
+ Boolean allow_multi,
+ Boolean show_nucs,
+ Boolean show_prots,
+ Uint2 entityID)
+{
+ return SequenceSelectionDialogEx (h, change_notify, change_userdata, allow_multi, FALSE, show_nucs, show_prots, entityID, TALL_SELECTION_LIST);
+}
+
+
extern DialoG SubSourceTypeDialog
(GrouP h,
Int2 list_height,
@@ -5304,6 +5451,320 @@ static DialoG CreateInferenceDialog (GrouP h, Uint2 rows, Int2 spacing, Int2 wid
/* inference dialog controls, utility functions */
+Uint2 accessionlist_types [] = {
+ TAGLIST_POPUP, TAGLIST_TEXT
+};
+
+Uint2 accessionlist_widths [] = {
+ 0, 10
+};
+
+ENUM_ALIST(accn_type_alist)
+ { " ", 0 },
+ { "GenBank", 1 },
+ { "EMBL", 2 },
+ { "DDBJ", 3 },
+ { "INSD", 4 },
+ { "RefSeq", 5 },
+ { "UniProt", 6 },
+ { "Other", 7 },
+END_ENUM_ALIST
+
+static EnumFieldAssocPtr accessionlist_popups [] = {
+ accn_type_alist, NULL
+};
+
+static CharPtr accnTypePrefix [] = {
+ "",
+ "GenBank",
+ "EMBL",
+ "DDBJ",
+ "INSD",
+ "RefSeq",
+ "UniProt",
+ "?",
+ NULL
+};
+
+const Int4 numAccnTypePrefixes = sizeof (accnTypePrefix) / sizeof (CharPtr);
+
+static Int4 GetAccnTypeNum (CharPtr str)
+{
+ Int4 i;
+
+ if (StringHasNoText (str)) return 0;
+
+ for (i = 1; i < numAccnTypePrefixes; i++)
+ {
+ if (StringCmp (accnTypePrefix[i], str) == 0)
+ {
+ return i;
+ }
+ }
+ return 0;
+}
+
+
+static CharPtr ValForOneAccession (CharPtr str)
+{
+ CharPtr cp, val_buf = NULL;
+ CharPtr val_fmt = "%d\t%s";
+ Int4 db;
+
+ if (!StringHasNoText (str))
+ {
+ cp = StringChr (str, '|');
+ if (cp == NULL)
+ {
+ if ((db = GetAccnTypeNum(str)) > 0)
+ {
+ val_buf = MemNew (sizeof (Char) * StringLen (val_fmt));
+ sprintf (val_buf, val_fmt, db, " ");
+ }
+ else
+ {
+ val_buf = MemNew (sizeof (Char) * (StringLen (val_fmt) + StringLen (str)));
+ sprintf (val_buf, val_fmt, 0, str);
+ }
+ }
+ else
+ {
+ *cp = 0;
+ db = GetAccnTypeNum (str);
+ val_buf = MemNew (sizeof (Char) * (StringLen (val_fmt) + StringLen (cp + 1)));
+ sprintf (val_buf, val_fmt, db, cp + 1);
+ *cp = '|';
+ }
+ }
+ return val_buf;
+}
+
+static void AccessionListDataToDialog (DialoG d, Pointer data)
+{
+ TagListPtr tlp;
+ CharPtr str, cp, val_buf;
+ ValNodePtr new_list = NULL, vnp;
+ Int4 j;
+ Int2 scroll_pos;
+
+ tlp = (TagListPtr) GetObjectExtra (d);
+
+ if (tlp == NULL) return;
+ str = (CharPtr) data;
+
+ cp = StringChr (str, ',');
+ while (cp != NULL)
+ {
+ *cp = 0;
+ val_buf = ValForOneAccession (str);
+ if (val_buf != NULL)
+ {
+ ValNodeAddPointer (&new_list, 0, val_buf);
+ }
+ *cp = ',';
+ str = cp + 1;
+ cp = StringChr (str, ',');
+ }
+ val_buf = ValForOneAccession (str);
+ if (val_buf != NULL)
+ {
+ ValNodeAddPointer (&new_list, 0, val_buf);
+ }
+
+ scroll_pos = 0;
+ if (tlp->bar != NULL)
+ {
+ scroll_pos = GetBarValue (tlp->bar);
+ }
+ else if (tlp->left_bar != NULL)
+ {
+ scroll_pos = GetBarValue (tlp->left_bar);
+ }
+
+ SendMessageToDialog (tlp->dialog, VIB_MSG_RESET);
+ tlp->vnp = new_list;
+ for (j = 0, vnp = tlp->vnp; vnp != NULL; j++, vnp = vnp->next) {
+ }
+ tlp->max = MAX ((Int2) 0, (Int2) (j - tlp->rows + 1));
+ CorrectBarMax (tlp->bar, tlp->max);
+ CorrectBarPage (tlp->bar, (Int2) (tlp->rows-1), (Int2) (tlp->rows-1));
+
+ /* retain scroll position */
+ if (scroll_pos > tlp->max) {
+ scroll_pos = tlp->max;
+ }
+
+ if (tlp->bar != NULL)
+ {
+ CorrectBarValue (tlp->bar, scroll_pos);
+ }
+ if (tlp->left_bar != NULL)
+ {
+ CorrectBarValue (tlp->left_bar, scroll_pos);
+ }
+
+ SendMessageToDialog (tlp->dialog, VIB_MSG_REDRAW);
+ Update ();
+
+}
+
+
+static Pointer AccessionListDialogToData (DialoG d)
+{
+ TagListPtr tlp;
+ ValNodePtr vnp;
+ Int4 result_len = 0, db;
+ CharPtr str, acc_str, result_str = NULL;
+ Boolean first_item = TRUE;
+
+ tlp = (TagListPtr) GetObjectExtra (d);
+
+ if (tlp == NULL) return NULL;
+
+ for (vnp = tlp->vnp;
+ vnp != NULL;
+ vnp = vnp->next)
+ {
+ acc_str = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 1);
+ str = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 0);
+ if (!StringHasNoText (acc_str) || !StringHasNoText (str))
+ {
+ result_len += StringLen (acc_str);
+ result_len += 1; /* comma */
+ db = atoi (str);
+ if (db >= 0 && db < numAccnTypePrefixes)
+ {
+ result_len += MAX (StringLen (accnTypePrefix[db]), 1);
+ }
+ else
+ {
+ result_len ++; /* will represent with ? */
+ }
+ result_len ++; /* for db/accession separator */
+ }
+ acc_str = MemFree (acc_str);
+ str = MemFree (str);
+ }
+
+ if (result_len > 0)
+ {
+ result_str = (CharPtr) MemNew (sizeof (Char) * (result_len + 1));
+ for (vnp = tlp->vnp;
+ vnp != NULL;
+ vnp = vnp->next)
+ {
+ acc_str = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 1);
+ str = ExtractTagListColumn ((CharPtr) vnp->data.ptrvalue, 0);
+ db = (str == NULL ? 0 : atoi (str));
+ str = MemFree (str);
+ if (!StringHasNoText (acc_str) || db > 0)
+ {
+ if (first_item)
+ {
+ first_item = FALSE;
+ }
+ else
+ {
+ StringCat (result_str, ",");
+ }
+
+ if (db > 0 && db < numAccnTypePrefixes)
+ {
+ StringCat (result_str, accnTypePrefix[db]);
+ }
+ else
+ {
+ StringCat (result_str, "?");
+ }
+ StringCat (result_str, "|");
+ if (!StringHasNoText (result_str)) {
+ StringCat (result_str, acc_str);
+ }
+ }
+ acc_str = MemFree (acc_str);
+ }
+ result_str[result_len] = 0;
+ }
+
+ return result_str;
+}
+
+
+static void RemoveEmptyAccessionStrings (CharPtr acc_list)
+{
+ CharPtr cp_prev_end = NULL, cp_src, cp_dst;
+
+ if (acc_list == NULL) return;
+
+ cp_src = acc_list;
+ cp_dst = acc_list;
+ cp_prev_end = acc_list;
+ while (*cp_src != 0)
+ {
+ if (*cp_src == '|' && (*(cp_src + 1) == ',' || *(cp_src + 1) == 0))
+ {
+ cp_dst = cp_prev_end;
+ cp_prev_end = cp_dst;
+ cp_src++;
+ }
+ else
+ {
+ *cp_dst = *cp_src;
+ if (*cp_src == ',')
+ {
+ cp_prev_end = cp_dst;
+ }
+ cp_dst++;
+ cp_src++;
+ }
+ }
+ *cp_dst = 0;
+}
+
+
+static CharPtr insdmessage =
+"GenBank, EMBL, and DDBJ records are part of the International Nucleotide " \
+"Sequence Database collaboration.\nThe database prefix for the /inference " \
+"qualifier in these cases is INSD by collaboration policy.";
+
+
+static Boolean ReplaceDatabaseStrings (CharPtr PNTR str)
+{
+ Boolean changed_db = FALSE;
+
+ if (str == NULL || *str == NULL) return FALSE;
+
+ if (StringSearch (*str, "GenBank|") != NULL)
+ {
+ changed_db = TRUE;
+ FindReplaceString (str, "GenBank|", "INSD|", TRUE, FALSE);
+ }
+ if (StringSearch (*str, "EMBL|") != NULL)
+ {
+ changed_db = TRUE;
+ FindReplaceString (str, "EMBL|", "INSD|", TRUE, FALSE);
+ }
+ if (StringSearch (*str, "DDBJ|") != NULL)
+ {
+ changed_db = TRUE;
+ FindReplaceString (str, "DDBJ|", "INSD|", TRUE, FALSE);
+ }
+
+ if (changed_db)
+ {
+ if (GetAppProperty ("InternalNcbiSequin") == NULL) {
+ Message (MSG_OK, "%s", insdmessage);
+ }
+ }
+
+ return changed_db;
+}
+
+
+static void ChangeInferAccessionList (Pointer data);
+static TaglistCallback AccessionListCallbacks[] =
+{ ChangeInferAccessionList, ChangeInferAccessionList };
+
typedef struct inferevid {
CharPtr prefix; /* from inferencePrefix */
Boolean species; /* optional (same species) */
@@ -5315,6 +5776,7 @@ typedef struct inferevid {
CharPtr version; /* program version */
CharPtr basis1; /* profile or motif */
CharPtr basis2; /* evidence_basis texts */
+ CharPtr accession_list; /* accession list for alignment */
} InferEvid, PNTR InferEvidPtr;
typedef struct inferdialog {
@@ -5333,6 +5795,12 @@ typedef struct inferdialog {
TexT version;
TexT basis1;
TexT basis2;
+ PrompT inf_free_program_prompt;
+ PrompT inf_free_version_prompt;
+ PrompT accession_list_program_prompt;
+ PrompT accession_list_version_prompt;
+ PrompT accession_list_prompt;
+ DialoG accession_list;
GrouP inf_accn_group;
GrouP other_db_group;
@@ -5372,6 +5840,7 @@ static InferEvidPtr InferEvidFree (
MemFree (iep->version);
MemFree (iep->basis1);
MemFree (iep->basis2);
+ MemFree (iep->accession_list);
return MemFree (iep);
}
@@ -5430,6 +5899,7 @@ static CharPtr inferencePrefix [] = {
"nucleotide motif",
"protein motif",
"ab initio prediction",
+ "alignment",
NULL
};
@@ -5446,29 +5916,7 @@ ENUM_ALIST(inference_alist)
{ "nucleotide motif", 9 },
{ "protein motif", 10 },
{ "ab initio prediction", 11 },
-END_ENUM_ALIST
-
-static CharPtr accnTypePrefix [] = {
- "",
- "GenBank",
- "EMBL",
- "DDBJ",
- "INSD",
- "RefSeq",
- "UniProt",
- "?",
- NULL
-};
-
-ENUM_ALIST(accn_type_alist)
- { " ", 0 },
- { "GenBank", 1 },
- { "EMBL", 2 },
- { "DDBJ", 3 },
- { "INSD", 4 },
- { "RefSeq", 5 },
- { "UniProt", 6 },
- { "Other", 7 },
+ { "alignment", 12 },
END_ENUM_ALIST
static CharPtr programPrefix [] = {
@@ -5505,7 +5953,7 @@ static CharPtr PrintInferTable (
len = StringLen (iep->prefix) + StringLen (iep->database) + StringLen (iep->db_other) + StringLen (iep->accession) +
StringLen (iep->program) + StringLen (iep->pr_other) + StringLen (iep->version) + StringLen (iep->basis1) +
- StringLen (iep->basis2) + 50;
+ StringLen (iep->basis2) + StringLen (iep->accession_list) + 50;
buf = MemNew (len);
if (buf == NULL) return NULL;
@@ -5552,6 +6000,11 @@ static CharPtr PrintInferTable (
if (StringDoesHaveText (iep->basis2)) {
StringCat (buf, ":");
StringCat (buf, iep->basis2);
+ if (StringCmp (iep->prefix, "alignment") == 0 &&
+ StringDoesHaveText (iep->accession_list)) {
+ StringCat (buf, ":");
+ StringCat (buf, iep->accession_list);
+ }
}
} else {
StringCat (buf, " ");
@@ -5588,6 +6041,12 @@ static void ShowInferenceGroup (
SafeHide (idp->species);
SafeHide (idp->inf_prog_group);
SafeShow (idp->inf_free_group);
+ SafeHide (idp->accession_list);
+ SafeShow (idp->inf_free_program_prompt);
+ SafeShow (idp->inf_free_version_prompt);
+ SafeHide (idp->accession_list_program_prompt);
+ SafeHide (idp->accession_list_version_prompt);
+ SafeHide (idp->accession_list_prompt);
} else if (val == 11) {
SafeHide (idp->inf_accn_group);
SafeHide (idp->species);
@@ -5600,6 +6059,17 @@ static void ShowInferenceGroup (
SafeHide (idp->other_pr_group);
}
MemFree (str);
+ } else if (val == 12) {
+ SafeHide (idp->inf_accn_group);
+ SafeHide (idp->species);
+ SafeHide (idp->inf_prog_group);
+ SafeShow (idp->inf_free_group);
+ SafeShow (idp->accession_list);
+ SafeHide (idp->inf_free_program_prompt);
+ SafeHide (idp->inf_free_version_prompt);
+ SafeShow (idp->accession_list_program_prompt);
+ SafeShow (idp->accession_list_version_prompt);
+ SafeShow (idp->accession_list_prompt);
} else {
SafeHide (idp->inf_accn_group);
SafeHide (idp->species);
@@ -5665,6 +6135,9 @@ static void ChangeInferTableSelect (
SafeSetTitle (idp->basis1, iep->basis1);
SafeSetTitle (idp->basis2, iep->basis2);
+ ReplaceDatabaseStrings (&(iep->accession_list));
+ PointerToDialog (idp->accession_list, iep->accession_list);
+
ShowInferenceGroup (idp);
}
@@ -5741,11 +6214,6 @@ static void ChangeSameSpecies (
CheckExtendInferTable (idp);
}
-static CharPtr insdmessage =
-"GenBank, EMBL, and DDBJ records are part of the International Nucleotide " \
-"Sequence Database collaboration.\nThe database prefix for the /inference " \
-"qualifier in these cases is INSD by collaboration policy.";
-
static void ChangeInferDatabase (
PopuP p
)
@@ -5960,6 +6428,34 @@ static void ChangeInferBasis2 (
CheckExtendInferTable (idp);
}
+
+static void ChangeInferAccessionList (Pointer data)
+{
+ InferDialogPtr idp;
+ InferEvidPtr iep;
+
+ idp = (InferDialogPtr) data;
+ if (idp == NULL) return;
+ iep = GetInferEvid (idp, idp->currItem);
+ if (iep == NULL) return;
+
+ iep->accession_list = MemFree (iep->accession_list);
+ iep->accession_list = DialogToPointer (idp->accession_list);
+
+ if (ReplaceDatabaseStrings (&(iep->accession_list)))
+ {
+ PointerToDialog (idp->accession_list, iep->accession_list);
+ }
+
+ ShowInferenceGroup (idp);
+
+ UpdateDocument (idp->inferdoc, idp->currItem, idp->currItem);
+ Update ();
+
+ CheckExtendInferTable (idp);
+}
+
+
static Boolean StringInList (CharPtr str, CharPtr PNTR list)
{
@@ -5986,7 +6482,7 @@ extern void GBQualsToInferenceDialog (DialoG d, SeqFeatPtr sfp)
size_t len;
CharPtr rest;
CharPtr str;
- CharPtr tmp;
+ CharPtr tmp, tmp2;
idp = (InferDialogPtr) GetObjectExtra (d);
if (idp == NULL) return;
@@ -6111,8 +6607,19 @@ extern void GBQualsToInferenceDialog (DialoG d, SeqFeatPtr sfp)
} else {
iep->basis1 = MemFree (iep->basis1);
iep->basis1 = StringSaveNoNull (str);
+ tmp2 = NULL;
+ if (StringCmp (iep->prefix, "alignment") == 0)
+ {
+ tmp2 = StringChr (tmp, ':');
+ if (tmp2 != NULL) {
+ *tmp2 = 0;
+ tmp2++;
+ }
+ }
iep->basis2 = MemFree (iep->basis2);
iep->basis2 = StringSaveNoNull (tmp);
+ iep->accession_list = MemFree (iep->accession_list);
+ iep->accession_list = StringSaveNoNull (tmp2);
}
} else {
@@ -6163,7 +6670,7 @@ extern void GBQualsToInferenceDialog (DialoG d, SeqFeatPtr sfp)
extern void InferenceDialogToGBQuals (DialoG d, SeqFeatPtr sfp, Boolean convertBadToNote)
{
- CharPtr first = NULL, second = NULL;
+ CharPtr first = NULL, second = NULL, accession_list = NULL;
GBQualPtr gbq, lastgbq;
InferDialogPtr idp;
InferEvidPtr iep;
@@ -6194,7 +6701,7 @@ extern void InferenceDialogToGBQuals (DialoG d, SeqFeatPtr sfp, Boolean convertB
gbq->qual = StringSave ("inference");
if (WhereInEnumPopup (inference_alist, iep->prefix, &val)) {
- if (val > 0 && val <= 11) {
+ if (val > 0 && val <= 12) {
prefix = inferencePrefix [(int) val];
}
}
@@ -6225,11 +6732,16 @@ extern void InferenceDialogToGBQuals (DialoG d, SeqFeatPtr sfp, Boolean convertB
if (StringDoesHaveText (iep->basis1)) {
first = iep->basis1;
second = iep->basis2;
+ if (StringCmp (iep->prefix, "alignment") == 0) {
+ accession_list = iep->accession_list;
+ RemoveEmptyAccessionStrings (accession_list);
+ ReplaceDatabaseStrings (&accession_list);
+ }
}
}
- len = StringLen (prefix) + StringLen (speciesies) + StringLen (first) + StringLen (second);
- str = MemNew (len + 5);
+ len = StringLen (prefix) + StringLen (speciesies) + StringLen (first) + StringLen (second) + StringLen (accession_list);
+ str = MemNew (len + 6);
if (str != NULL) {
StringCpy (str, prefix);
StringCat (str, speciesies);
@@ -6237,6 +6749,10 @@ extern void InferenceDialogToGBQuals (DialoG d, SeqFeatPtr sfp, Boolean convertB
StringCat (str, first);
StringCat (str, ":");
StringCat (str, second);
+ if (StringCmp (prefix, "alignment") == 0 && accession_list != NULL) {
+ StringCat (str, ":");
+ StringCat (str, accession_list);
+ }
gbq->val = StringSave (str);
MemFree (str);
} else {
@@ -6276,6 +6792,7 @@ extern void InferenceDialogToGBQuals (DialoG d, SeqFeatPtr sfp, Boolean convertB
lastgbq->next = gbq;
}
lastgbq = gbq;
+ accession_list = NULL;
}
}
@@ -6302,7 +6819,7 @@ static DialoG NewCreateInferenceDialog (
)
{
- GrouP cts, tbl, g0, g1, g2, g3, g4, g5, p;
+ GrouP cts, tbl, g0, g1, g2, g3, g4, g5, p, prompt_grp;
FonT fnt;
Int2 i, hgt, wid;
InferDialogPtr idp;
@@ -6414,14 +6931,26 @@ static DialoG NewCreateInferenceDialog (
g5 = HiddenGroup (g2, 2, 0, NULL);
SetGroupSpacing (g5, 5, 5);
- StaticPrompt (g5, "Program or Database", 0, dialogTextHeight, programFont, 'l');
+ prompt_grp = HiddenGroup (g5, 0, 0, NULL);
+ idp->inf_free_program_prompt = StaticPrompt (prompt_grp, "Program or Database", 0, dialogTextHeight, programFont, 'l');
+ idp->accession_list_program_prompt = StaticPrompt (prompt_grp, "Program", 0, dialogTextHeight, programFont, 'l');
idp->basis1 = DialogText (g5, "", 10, ChangeInferBasis1);
SetObjectExtra (idp->basis1, idp, NULL);
- StaticPrompt (g5, "Version or Accession", 0, dialogTextHeight, programFont, 'l');
+ prompt_grp = HiddenGroup (g5, 0, 0, NULL);
+ idp->inf_free_version_prompt = StaticPrompt (prompt_grp, "Version or Accession", 0, dialogTextHeight, programFont, 'l');
+ idp->accession_list_version_prompt = StaticPrompt (prompt_grp, "Version", 0, dialogTextHeight, programFont, 'l');
+
idp->basis2 = DialogText (g5, "", 10, ChangeInferBasis2);
SetObjectExtra (idp->basis2, idp, NULL);
+ idp->accession_list_prompt = StaticPrompt (g5, "Accessions", 0, dialogTextHeight, programFont, 'l');
+ idp->accession_list = CreateTagListDialogEx3 (g5, 3, 2, 2,
+ accessionlist_types, accessionlist_widths,
+ accessionlist_popups, TRUE, FALSE, AccessionListDataToDialog, AccessionListDialogToData,
+ AccessionListCallbacks, idp,
+ FALSE, FALSE);
+
idp->inf_free_group = g5;
Hide (idp->inf_free_group);
@@ -6727,6 +7256,17 @@ extern EditApplyPtr EditApplyFree (EditApplyPtr eap)
return eap;
}
+
+extern EditApplyPtr EditApplyNew (void)
+{
+ EditApplyPtr eap;
+
+ eap = (EditApplyPtr) MemNew (sizeof (EditApplyData));
+ eap->find_location = EditApplyFindLocation_anywhere;
+ return eap;
+}
+
+
typedef struct EditApplydlg
{
DIALOG_MESSAGE_BLOCK
@@ -6905,7 +7445,7 @@ static Pointer DialogToEditApply (DialoG d)
}
if (dlg->location_choice != NULL) {
- data->find_location = GetValue (dlg->location_choice);
+ data->find_location = (EditApplyFindLocation) GetValue (dlg->location_choice);
} else {
data->find_location = EditApplyFindLocation_anywhere;
}
@@ -6968,7 +7508,7 @@ static ValNodePtr TestEditApply (DialoG d)
{
if (TextHasNoText (dlg->apply_txt))
{
- ValNodeAddPointer (&total_err_list, 0, "apply text");
+ ValNodeAddPointer (&total_err_list, 0, StringSave ("apply text"));
}
}
else
@@ -6982,7 +7522,7 @@ static ValNodePtr TestEditApply (DialoG d)
{
if (TextHasNoText (dlg->find_txt))
{
- ValNodeAddPointer (&total_err_list, 0, "find text");
+ ValNodeAddPointer (&total_err_list, 0, StringSave ("find text"));
}
}
else
@@ -7010,30 +7550,6 @@ static void EditApplyDialogCopy (ButtoN b)
str = MemFree (str);
}
-static ValNodePtr ValNodeDupStringList (ValNodePtr vnp)
-{
- ValNodePtr cpy = NULL, last = NULL, tmp;
-
- while (vnp != NULL)
- {
- tmp = ValNodeNew (NULL);
- tmp->choice = vnp->choice;
- tmp->data.ptrvalue = StringSave (vnp->data.ptrvalue);
- if (last == NULL)
- {
- cpy = tmp;
- }
- else
- {
- last->next = tmp;
- }
- last = tmp;
- vnp = vnp->next;
- }
- return cpy;
-}
-
-
extern DialoG EditApplyDialog
(GrouP h,
Int4 action_choice,
@@ -7710,7 +8226,11 @@ typedef struct clickablelist
{
DIALOG_MESSAGE_BLOCK
DoC doc;
- DoC clickable_item_list;
+ DoC clickable_item_list;
+ PrompT title1;
+ PrompT title2;
+ PrompT help1;
+ PrompT help2;
TexT find_txt;
ClickableCallback item_single_click_callback;
@@ -7809,7 +8329,7 @@ static ClickableItemPtr GetSubItem (ValNodePtr item_list, Int2Ptr pitem)
static Int4 CountLevels (ValNodePtr item_list)
{
- Int4 num_levels = 1, num, num_sublevels = 0;
+ Int4 num, num_sublevels = 0;
ValNodePtr vnp;
ClickableItemPtr cip;
@@ -7953,22 +8473,34 @@ static void PopulateClickableList (ClickableListPtr dlg, ValNodePtr list_list)
}
-static Int2 PanelOffsetFromCharOffset (ClickableListPtr dlg, Int2 item, Int2 char_offset)
+
+NLM_EXTERN Int2 PanelOffsetFromCharOffsetEx (DoC doc, FonT font, Int2 item, Int2 col, Int2 char_offset)
{
Int2 numRows, numCols, lineHeight;
Int2 left_start, width, inset, char_width;
- if (dlg == NULL) return 0;
- GetItemParams4 (dlg->doc, item, NULL, &numRows, &numCols, &lineHeight, NULL);
- GetColParams (dlg->doc, item, numCols, &left_start, &width, &inset, NULL);
+ if (doc == NULL) return 0;
+ GetItemParams4 (doc, item, NULL, &numRows, &numCols, &lineHeight, NULL);
+ GetColParams (doc, item, col, &left_start, &width, &inset, NULL);
/* need to set font so that Nlm_CharWidth works properly */
- SelectFont (dlg->col_fmt_array_array[0][0].font);
+ SelectFont (font);
char_width = Nlm_CharWidth ('A');
return left_start + inset + char_offset * char_width;
}
-static Int2 GetTextSelectCharOffset (PoinT pt, ClickableListPtr dlg, Int2 item, Int2 row, Int2 col)
+
+static Int2 PanelOffsetFromCharOffset (ClickableListPtr dlg, Int2 item, Int2 char_offset)
+{
+ Int2 numCols;
+ if (dlg == NULL) return 0;
+ GetItemParams4 (dlg->doc, item, NULL, NULL, &numCols, NULL, NULL);
+
+ return PanelOffsetFromCharOffsetEx (dlg->doc, dlg->col_fmt_array_array[0][0].font, item, numCols, char_offset);
+}
+
+
+NLM_EXTERN Int2 GetTextSelectCharOffsetEx (PoinT pt, DoC doc, FonT font, Int2 item, Int2 row, Int2 col)
{
Int2 pixPos, pixInset;
Int2 one_char_width;
@@ -7976,18 +8508,18 @@ static Int2 GetTextSelectCharOffset (PoinT pt, ClickableListPtr dlg, Int2 item,
Int4 len;
Int2 char_offset;
- if (dlg == NULL) return 0;
+ if (doc == NULL) return 0;
- GetColParams (dlg->doc, item, col, &pixPos,
+ GetColParams (doc, item, col, &pixPos,
NULL, &pixInset, NULL);
- SelectFont (dlg->col_fmt_array_array[0][0].font);
+ SelectFont (font);
one_char_width = Nlm_CharWidth ('A');
if (one_char_width == 0) return 0;
char_offset = (pt.x - pixPos - pixInset) / one_char_width;
if (char_offset > 0) {
- txt = GetDocText (dlg->doc, item, row, col);
+ txt = GetDocText (doc, item, row, col);
len = StringLen (txt);
if (char_offset >= len) {
char_offset = - 1;
@@ -7998,6 +8530,14 @@ static Int2 GetTextSelectCharOffset (PoinT pt, ClickableListPtr dlg, Int2 item,
}
+static Int2 GetTextSelectCharOffset (PoinT pt, ClickableListPtr dlg, Int2 item, Int2 row, Int2 col)
+{
+ if (dlg == NULL) return 0;
+
+ return GetTextSelectCharOffsetEx (pt, dlg->doc, dlg->col_fmt_array_array[0][0].font, item, row, col);
+}
+
+
static void ClickList (DoC d, PoinT pt)
{
@@ -8635,19 +9175,21 @@ CreateClickableListDialogEx
(GrouP h,
CharPtr label1,
CharPtr label2,
+ CharPtr help1,
+ CharPtr help2,
ClickableCallback item_single_click_callback,
ClickableCallback item_double_click_callback,
Pointer item_click_callback_data,
GetClickableItemText get_item_text,
Int4 left_width,
Int4 right_width,
- Boolean horizontal)
+ Boolean horizontal,
+ Boolean show_find)
{
- GrouP p, pnl_grp, find_grp;
+ GrouP p, pnl_grp, find_grp = NULL;
ClickableListPtr dlg;
RecT r;
ButtoN b;
- PrompT p1, p2;
dlg = (ClickableListPtr) MemNew (sizeof (ClickableListData));
if (dlg == NULL)
@@ -8673,18 +9215,30 @@ CreateClickableListDialogEx
if (horizontal) {
pnl_grp = HiddenGroup (p, 2, 0, NULL);
- StaticPrompt (pnl_grp, label1, 0, popupMenuHeight, programFont, 'c');
- StaticPrompt (pnl_grp, label2, 0, popupMenuHeight, programFont, 'c');
-
+ if (label1 || label2) {
+ dlg->title1 = StaticPrompt (pnl_grp, label1, left_width, popupMenuHeight, programFont, 'c');
+ dlg->title2 = StaticPrompt (pnl_grp, label2, right_width, popupMenuHeight, programFont, 'c');
+ }
dlg->doc = DocumentPanel (pnl_grp, left_width, stdLineHeight * 20);
dlg->clickable_item_list = DocumentPanel (pnl_grp, right_width, stdLineHeight * 20);
+ if (help1 || help2) {
+ dlg->help1 = StaticPrompt (pnl_grp, help1, left_width, popupMenuHeight, programFont, 'c');
+ dlg->help2 = StaticPrompt (pnl_grp, help2, right_width, popupMenuHeight, programFont, 'c');
+ }
} else {
pnl_grp = HiddenGroup (p, -1, 0, NULL);
- p1 = StaticPrompt (pnl_grp, label1, 0, popupMenuHeight, programFont, 'c');
+ dlg->title1 = StaticPrompt (pnl_grp, label1, left_width, popupMenuHeight, programFont, 'c');
dlg->doc = DocumentPanel (pnl_grp, left_width, stdLineHeight * 20);
- p2 = StaticPrompt (pnl_grp, label2, 0, popupMenuHeight, programFont, 'c');
+ if (help1 || help2) {
+ dlg->help1 = StaticPrompt (pnl_grp, help1, left_width, popupMenuHeight, programFont, 'c');
+ }
+ dlg->title2 = StaticPrompt (pnl_grp, label2, right_width, popupMenuHeight, programFont, 'c');
dlg->clickable_item_list = DocumentPanel (pnl_grp, right_width, stdLineHeight * 20);
- AlignObjects (ALIGN_CENTER, (HANDLE) p1, (HANDLE) dlg->doc, (HANDLE) p2, (HANDLE) dlg->clickable_item_list, NULL);
+ if (help1 || help2) {
+ dlg->help2 = StaticPrompt (pnl_grp, help2, right_width, popupMenuHeight, programFont, 'c');
+ }
+ AlignObjects (ALIGN_CENTER, (HANDLE) dlg->title1, (HANDLE) dlg->doc, (HANDLE) dlg->title2, (HANDLE) dlg->clickable_item_list,
+ (HANDLE) (dlg->help1 == NULL ? dlg->help2 : dlg->help1), (HANDLE) (dlg->help1 == NULL ? NULL : dlg->help2), NULL);
}
SetObjectExtra (dlg->doc, dlg, NULL);
@@ -8704,19 +9258,37 @@ CreateClickableListDialogEx
InsetRect (&r, 4, 4);
clickableColFmt[1].pixWidth = r.right - r.left - clickableColFmt[0].pixWidth;
- find_grp = HiddenGroup (p, 4, 0, NULL);
- SetGroupSpacing (find_grp, 10, 10);
- StaticPrompt (find_grp, "Find Text", 0, popupMenuHeight, programFont, 'l');
- dlg->find_txt = DialogText (find_grp, "", 20, NULL);
- b = PushButton (find_grp, "<<", FindPreviousClickableText);
- SetObjectExtra (b, dlg, NULL);
- b = PushButton (find_grp, ">>", FindClickableText);
- SetObjectExtra (b, dlg, NULL);
+ if (show_find) {
+ find_grp = HiddenGroup (p, 4, 0, NULL);
+ SetGroupSpacing (find_grp, 10, 10);
+ StaticPrompt (find_grp, "Find Text", 0, popupMenuHeight, programFont, 'l');
+ dlg->find_txt = DialogText (find_grp, "", 20, NULL);
+ b = PushButton (find_grp, "<<", FindPreviousClickableText);
+ SetObjectExtra (b, dlg, NULL);
+ b = PushButton (find_grp, ">>", FindClickableText);
+ SetObjectExtra (b, dlg, NULL);
+ }
AlignObjects (ALIGN_CENTER, (HANDLE) pnl_grp, (HANDLE) find_grp, NULL);
return (DialoG) p;
}
+extern void SetClickableListDialogTitles (DialoG d, CharPtr title1, CharPtr title2, CharPtr help1, CharPtr help2)
+{
+ ClickableListPtr dlg;
+
+ dlg = (ClickableListPtr) GetObjectExtra (d);
+ if (dlg == NULL)
+ {
+ return;
+ }
+ SafeSetTitle (dlg->title1, title1);
+ SafeSetTitle (dlg->title2, title2);
+ SafeSetTitle (dlg->help1, help1);
+ SafeSetTitle (dlg->help2, help2);
+}
+
+
extern DialoG
CreateClickableListDialog
(GrouP h,
@@ -8727,14 +9299,14 @@ CreateClickableListDialog
Pointer item_click_callback_data,
GetClickableItemText get_item_text)
{
- return CreateClickableListDialogEx (h, label1, label2,
+ return CreateClickableListDialogEx (h, label1, label2, NULL, NULL,
item_single_click_callback,
item_double_click_callback,
item_click_callback_data,
get_item_text,
stdCharWidth * 30,
stdCharWidth * 30 + 5,
- TRUE);
+ TRUE, TRUE);
}
@@ -8915,6 +9487,202 @@ static CharPtr GetClickableTextFromItemList (ValNodePtr item_list, CharPtr separ
return txt;
}
+
+static CharPtr
+GetFragmentFromDocRow
+(DoC doc,
+ Int2 item,
+ Int2 col,
+ Int2 row,
+ Int2 char_start, Int2 char_stop)
+{
+ CharPtr txt = NULL, cp_txt;
+ Int4 len;
+
+ txt = GetDocText (doc, item, row, col);
+
+ if (char_start == 0 && char_stop < 0) {
+ /* take all of row */
+ return txt;
+ } else {
+ len = StringLen (txt);
+ if (char_stop >= len) {
+ /* selection was drawn beyond length of text */
+ char_stop = len - 1;
+ } else if (char_stop < 0) {
+ /* take all of row */
+ char_stop = len - 1;
+ }
+ if (char_start >= len) {
+ /* do nothing - selection is not within text */
+ txt = MemFree (txt);
+ } else {
+ cp_txt = (CharPtr) MemNew (sizeof (Char) * (2 + char_stop - char_start));
+ StringNCpy (cp_txt, txt + char_start, 1 + char_stop - char_start);
+ cp_txt[1 + char_stop - char_start] = 0;
+ txt = MemFree (txt);
+ txt = cp_txt;
+ }
+ }
+ return txt;
+}
+
+
+static CharPtr
+GetFragmentsFromDocCol
+(DoC doc,
+ Int2 item,
+ Int2 col,
+ Int2 row_start, Int2 row_stop,
+ Int2 char_start, Int2 char_stop)
+{
+ Int2 row;
+ CharPtr txt;
+ ValNodePtr fragments = NULL;
+
+ if (row_start == row_stop) {
+ txt = GetFragmentFromDocRow (doc, item, col, row_start, char_start, char_stop);
+ if (StringHasNoText (txt)) {
+ txt = MemFree (txt);
+ } else {
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ } else {
+ txt = GetFragmentFromDocRow (doc, item, col, row_start, char_start, -1);
+ if (StringHasNoText (txt)) {
+ txt = MemFree (txt);
+ } else {
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ row = row_start + 1;
+ while (row < row_stop) {
+ txt = GetFragmentFromDocRow (doc, item, col, row, 0, -1);
+ if (StringHasNoText (txt)) {
+ txt = MemFree (txt);
+ } else {
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ row++;
+ }
+ txt = GetFragmentFromDocRow (doc, item, col, row_stop, 0, char_stop);
+ if (StringHasNoText (txt)) {
+ txt = MemFree (txt);
+ } else {
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ }
+ txt = GetClickableTextFromItemList (fragments, " ");
+ fragments = ValNodeFreeData (fragments);
+ return txt;
+}
+
+
+static Boolean CollectFromThisColumn (Int2 col, Int2Ptr only_these_columns, Int2 num_col)
+{
+ Int2 i;
+ Boolean rval = FALSE;
+
+ if (only_these_columns == NULL) {
+ rval = TRUE;
+ } else {
+ for (i = 0; i < num_col; i++) {
+ if (only_these_columns[i] == col) {
+ rval = TRUE;
+ }
+ }
+ }
+ return rval;
+}
+
+
+static CharPtr
+GetFragmentsFromDocItem
+(DoC doc,
+ Int2 item,
+ Int2 col_start, Int2 col_stop,
+ Int2 row_start, Int2 row_stop,
+ Int2 char_start, Int2 char_stop,
+ Int2Ptr only_these_columns, Int2 num_col)
+{
+ Int2 col;
+ CharPtr txt;
+ Int2 num_rows, num_cols;
+ ValNodePtr fragments = NULL;
+
+ GetItemParams4 (doc, item, NULL, &num_rows, &num_cols, NULL, NULL);
+ if (col_stop < 0) {
+ col_stop = num_cols;
+ }
+ if (row_stop < 0) {
+ row_stop = num_rows;
+ }
+
+ if (col_start == col_stop) {
+ if (CollectFromThisColumn (col_start, only_these_columns, num_col)) {
+ txt = GetFragmentsFromDocCol (doc, item, col_start, row_start, row_stop, char_start, char_stop);
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ } else {
+ if (CollectFromThisColumn (col_start, only_these_columns, num_col)) {
+ txt = GetFragmentsFromDocCol (doc, item, col_start, row_start, num_rows, char_start, -1);
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ col = col_start + 1;
+ while (col < col_stop) {
+ if (CollectFromThisColumn (col, only_these_columns, num_col)) {
+ txt = GetFragmentsFromDocCol (doc, item, col, 1, num_rows, 0, -1);
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ col++;
+ }
+ if (CollectFromThisColumn (col_stop, only_these_columns, num_col)) {
+ txt = GetFragmentsFromDocCol (doc, item, col_stop, 1, row_stop, 0, char_stop);
+ ValNodeAddPointer (&fragments, 0, txt);
+ }
+ }
+ txt = GetClickableTextFromItemList (fragments, "\t");
+ fragments = ValNodeFreeData (fragments);
+
+ return txt;
+}
+
+
+NLM_EXTERN CharPtr GetSelectedDocText (DoC doc, Int2 item_start, Int2 row_start, Int2 col_start, Int2 char_start,
+ Int2 item_stop, Int2 row_stop, Int2 col_stop, Int2 char_stop,
+ Int2Ptr only_these_columns, Int2 num_col)
+{
+ Int2 item;
+ CharPtr txt;
+ ValNodePtr fragment_list = NULL;
+
+ if (doc == NULL || item_start < 1)
+ {
+ return NULL;
+ }
+
+ if (char_start < 0) char_start = 0;
+
+ if (item_start == item_stop) {
+ txt = GetFragmentsFromDocItem (doc, item_start, col_start, col_stop, row_start, row_stop, char_start, char_stop, only_these_columns, num_col);
+ ValNodeAddPointer (&fragment_list, 0, txt);
+ } else {
+ txt = GetFragmentsFromDocItem (doc, item_start, col_start, -1, row_start, -1, char_start, -1, only_these_columns, num_col);
+ ValNodeAddPointer (&fragment_list, 0, txt);
+ item = item_start + 1;
+ while (item < item_stop) {
+ txt = GetFragmentsFromDocItem (doc, item, 1, -1, 1, -1, 0, -1, only_these_columns, num_col);
+ ValNodeAddPointer (&fragment_list, 0, txt);
+ item++;
+ }
+ txt = GetFragmentsFromDocItem (doc, item, 1, col_stop, 1, row_stop, 0, char_stop, only_these_columns, num_col);
+ ValNodeAddPointer (&fragment_list, 0, txt);
+ }
+
+ txt = GetClickableTextFromItemList (fragment_list, "\r\n");
+ fragment_list = ValNodeFreeData (fragment_list);
+ return txt;
+}
+
extern CharPtr GetSelectedClickableListText (DialoG d)
{
ClickableListPtr dlg;
@@ -9146,12 +9914,6 @@ static Int4 GetYearFromToken (CharPtr token, Int4 token_len)
return year;
}
-static CharPtr months [12] =
-{
- "January", "February", "March", "April", "May", "June",
- "July", "August", "September", "October", "November", "December"
-};
-
static CharPtr month_abbrevs [12] =
{
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
@@ -9395,7 +10157,6 @@ extern CharPtr ReformatDateStringEx (CharPtr orig_date, Boolean month_first, Boo
CharPtr month = NULL;
CharPtr token_list[3];
Int4 token_lens[3];
- CharPtr delimiters = " \t,-/";
CharPtr numbers = "0123456789";
CharPtr letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Int4 num_tokens = 0;
@@ -9880,7 +10641,7 @@ typedef struct rptunitrangedlg {
TexT range_stop;
} RptUnitRangeDlgData, PNTR RptUnitRangeDlgPtr;
-Boolean ParseRptUnitRangeOkEx (CharPtr txt, Int4Ptr pstart, Int4Ptr pstop)
+static Boolean ParseRptUnitRangeOkEx (CharPtr txt, Int4Ptr pstart, Int4Ptr pstop)
{
CharPtr cp;
Int4 start = -1, stop = -1;
@@ -10003,7 +10764,7 @@ extern DialoG CreateRptUnitRangeDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
return (DialoG) p;
}
-Boolean ParseRptUnitRangeOk (CharPtr txt)
+static Boolean ParseRptUnitRangeOk (CharPtr txt)
{
return ParseRptUnitRangeOkEx (txt, NULL, NULL);
}
@@ -10147,7 +10908,7 @@ static Pointer MobileElementDialogToString (DialoG d)
}
-extern DialoG CreateMobileElementDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
+static DialoG CreateMobileElementDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
TaglistCallback tlp_callback,
Pointer callback_data)
{
@@ -10230,7 +10991,7 @@ static Pointer TrueFalseDialogToPointer (DialoG d)
}
}
-extern DialoG TrueFalseDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
+static DialoG TrueFalseDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
TaglistCallback tlp_callback,
Pointer callback_data)
{
@@ -10254,7 +11015,7 @@ extern DialoG TrueFalseDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
return (DialoG) p;
}
-Boolean ParseTrueFalseOk (CharPtr txt)
+static Boolean ParseTrueFalseOk (CharPtr txt)
{
if (StringHasNoText (txt) || StringICmp (txt, "TRUE") == 0 || StringICmp (txt, "FALSE") == 0) {
return TRUE;
@@ -10830,7 +11591,7 @@ static void GBQualEditDialogCopyText (ButtoN b)
}
}
-extern DialoG CreateSingleGBQualEditDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
+static DialoG CreateSingleGBQualEditDialog (GrouP h, SeqEntryPtr sep, CharPtr name,
Boolean force_string,
TaglistCallback tlp_callback,
Pointer callback_data)
@@ -11143,7 +11904,12 @@ static Pointer NewDialogToImportFields (DialoG d)
return (Pointer) gbq_list;
}
-static void AddMandatoryAndOptionalQuals (CharPtr name, NewFieldPagePtr fpf, GBQualPtr gbq, Boolean use_rarely_used)
+static void
+AddMandatoryAndOptionalQuals
+(CharPtr name,
+ NewFieldPagePtr fpf,
+ GBQualPtr gbq,
+ Boolean use_rarely_used)
{
Int2 index, i, qual;
SematicFeatPtr sefp;
@@ -11234,8 +12000,10 @@ extern DialoG NewCreateImportFields (GrouP h, CharPtr name, SeqFeatPtr sfp, Bool
/* add remaining qualifiers last */
gbq_it = gbq;
- while (gbq_it != NULL) {
- AddTemporaryGBQual (&(fpf->new_gbq), gbq_it->qual, gbq, FALSE);
+ while (gbq_it != NULL) {
+ if (!ShouldSuppressGBQual(fpf->subtype, gbq_it->qual)) {
+ AddTemporaryGBQual (&(fpf->new_gbq), gbq_it->qual, gbq, FALSE);
+ }
gbq_it = gbq_it->next;
}
@@ -11281,3 +12049,258 @@ extern DialoG NewCreateImportFields (GrouP h, CharPtr name, SeqFeatPtr sfp, Bool
}
+typedef struct specialcharacterdialog
+{
+ TexT PNTR text_list;
+ ButtoN accept_btn;
+ Int4 num_chars;
+ ValNodePtr find_list;
+} SpecialCharacterDialogData, PNTR SpecialCharacterDialogPtr;
+
+
+static void EnableSpecialCharacterAccept (TexT t)
+{
+ SpecialCharacterDialogPtr sd;
+ Int4 pos;
+ CharPtr str;
+ Boolean has_bad = FALSE;
+
+ sd = (SpecialCharacterDialogPtr) GetObjectExtra (t);
+ if (sd == NULL) return;
+
+ for (pos = 0; pos < sd->num_chars && !has_bad; pos++)
+ {
+ str = SaveStringFromText (sd->text_list[pos]);
+ SpecialCharFind (&str, NULL, &has_bad, NULL);
+ str = MemFree (str);
+ }
+ if (has_bad)
+ {
+ Disable (sd->accept_btn);
+ }
+ else
+ {
+ Enable (sd->accept_btn);
+ }
+}
+
+
+static void SetWindowsSpecialCharacterDefaults (ButtoN b)
+{
+ SpecialCharacterDialogPtr sd;
+ Int4 pos;
+ CharPtr str;
+ ValNodePtr vnp;
+
+ sd = (SpecialCharacterDialogPtr) GetObjectExtra (b);
+ if (sd == NULL) return;
+
+ for (vnp = sd->find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
+ {
+ str = GetSpecialWinCharacterReplacement ((unsigned char) vnp->choice);
+ SetTitle (sd->text_list[pos], str);
+ }
+}
+
+
+static void SetMacSpecialCharacterDefaults (ButtoN b)
+{
+ SpecialCharacterDialogPtr sd;
+ Int4 pos;
+ CharPtr str;
+ ValNodePtr vnp;
+
+ sd = (SpecialCharacterDialogPtr) GetObjectExtra (b);
+ if (sd == NULL) return;
+
+ for (vnp = sd->find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
+ {
+ str = GetSpecialMacCharacterReplacement ((unsigned char) vnp->choice);
+ SetTitle (sd->text_list[pos], str);
+ }
+
+}
+
+
+extern Boolean FixSpecialCharactersForStringsInList (ValNodePtr find_list, CharPtr exp_text, Boolean force_fix)
+{
+ ValNodePtr vnp, context_list, vnp_c;
+ Int4 pos;
+ CharPtr repl;
+ WindoW w;
+ GrouP h, c, g, p1, g2;
+ PrompT p2;
+ LisT contexts;
+ ButtoN b;
+ SpecialCharacterDialogData sd;
+ ModalAcceptCancelData acd;
+ Char label[2];
+ Int4 num_contexts;
+ Boolean rval = FALSE;
+
+ if (find_list == NULL) {
+ return TRUE;
+ }
+
+ ArrowCursor();
+ Update();
+
+ sd.find_list = find_list;
+ sd.num_chars = ValNodeLen (find_list);
+
+ acd.accepted = FALSE;
+ acd.cancelled = FALSE;
+
+ w = ModalWindow(-20, -13, -10, -10, NULL);
+ h = HiddenGroup (w, -1, 0, NULL);
+ SetGroupSpacing (h, 10, 10);
+
+ p1 = MultiLinePrompt (h, exp_text, 27 * stdCharWidth, programFont);
+ p2 = StaticPrompt (h, "Choose replacement characters.", 0, 0, programFont, 'l');
+
+ g = HiddenGroup (h, 3, 0, NULL);
+ StaticPrompt (g, "Character", 0, 0, programFont, 'l');
+ StaticPrompt (g, "Replacement", 0, 0, programFont, 'l');
+ StaticPrompt (g, "Contexts", 0, 0, programFont, 'l');
+
+ sd.text_list = MemNew (sizeof (TexT) * sd.num_chars);
+ label[1] = 0;
+ for (vnp = find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
+ {
+ label[0] = vnp->choice;
+ StaticPrompt (g, label, 0, 0, programFont, 'l');
+ repl = GetSpecialCharacterReplacement (vnp->choice);
+ sd.text_list[pos] = DialogText (g, repl, 5, EnableSpecialCharacterAccept);
+ SetObjectExtra (sd.text_list[pos], &sd, NULL);
+ context_list = vnp->data.ptrvalue;
+ num_contexts = ValNodeLen (context_list);
+ if (num_contexts == 0)
+ {
+ StaticPrompt (g, "", 0, 0, programFont, 'l');
+ }
+ else if (num_contexts == 1)
+ {
+ StaticPrompt (g, *((CharPtr PNTR)context_list->data.ptrvalue), 0, 0, programFont, 'l');
+ }
+ else
+ {
+ contexts = SingleList (g, 16, MIN (num_contexts, 5), NULL);
+ for (vnp_c = context_list; vnp_c != NULL; vnp_c = vnp_c->next)
+ {
+ ListItem (contexts, *((CharPtr PNTR)vnp_c->data.ptrvalue));
+ }
+ SetValue (contexts, 1);
+ }
+ }
+
+ g2 = HiddenGroup (h, 2, 0, NULL);
+ SetGroupSpacing (g2, 10, 10);
+ b = PushButton (g2, "Suggest Windows Replacements", SetWindowsSpecialCharacterDefaults);
+ SetObjectExtra (b, &sd, NULL);
+ b = PushButton (g2, "Suggest Mac Replacements", SetMacSpecialCharacterDefaults);
+ SetObjectExtra (b, &sd, NULL);
+
+ c = HiddenGroup (h, 3, 0, NULL);
+ SetGroupSpacing (c, 10, 10);
+ sd.accept_btn = PushButton (c, "Replace Characters", ModalAcceptButton);
+ SetObjectExtra (sd.accept_btn, &acd, NULL);
+ b = PushButton (c, "Cancel", ModalCancelButton);
+ SetObjectExtra (b, &acd, NULL);
+ AlignObjects (ALIGN_CENTER, (HANDLE) p1, (HANDLE) p2, (HANDLE) g, (HANDLE) g2, (HANDLE) c, NULL);
+
+ Show(w);
+ Select (w);
+ while (!acd.accepted && ! acd.cancelled)
+ {
+ ProcessExternalEvent ();
+ Update ();
+ }
+ ProcessAnEvent ();
+ if (acd.accepted)
+ {
+ for (vnp = find_list, pos = 0; vnp != NULL; vnp = vnp->next, pos++)
+ {
+ repl = JustSaveStringFromText (sd.text_list[pos]);
+ label[0] = vnp->choice;
+ for (vnp_c = vnp->data.ptrvalue; vnp_c != NULL; vnp_c = vnp_c->next)
+ {
+ FindReplaceString (vnp_c->data.ptrvalue, label, repl, TRUE, FALSE);
+ }
+ repl = MemFree (repl);
+ }
+
+ rval = TRUE;
+ }
+ else if (force_fix)
+ {
+ for (vnp = find_list; vnp != NULL; vnp = vnp->next)
+ {
+ label[0] = vnp->choice;
+ for (vnp_c = vnp->data.ptrvalue; vnp_c != NULL; vnp_c = vnp_c->next)
+ {
+ FindReplaceString (vnp_c->data.ptrvalue, label, "#", TRUE, FALSE);
+ }
+ }
+ rval = TRUE;
+ }
+
+ Remove (w);
+ return rval;
+
+}
+
+
+NLM_EXTERN Boolean FixSpecialCharacters (Uint2 entityID)
+{
+ ValNodePtr find_list = NULL;
+ Boolean rval;
+
+ StringActionInEntity (entityID, FALSE, UPDATE_NEVER, NULL, NULL, NULL, TRUE,
+ SpecialCharFindWithContext, NULL, &find_list);
+
+ rval = FixSpecialCharactersForStringsInList (find_list,
+ "The ASN.1 contains special characters.\nIf you save it without stripping them,\nyou will be unable to load the file in Sequin.",
+ FALSE);
+
+ find_list = FreeContextList (find_list);
+ if (rval)
+ {
+ ObjMgrSetDirtyFlag (entityID, TRUE);
+ ObjMgrSendMsg (OM_MSG_UPDATE, entityID, 0, 0);
+ }
+ return rval;
+}
+
+
+NLM_EXTERN Boolean FixSpecialCharactersForObject (Uint2 datatype, Pointer objdata, CharPtr msg, Boolean force_fix, BoolPtr changed)
+{
+ ValNodePtr find_list = NULL;
+ Boolean rval;
+
+ StringActionForObject (datatype, objdata, 0, FALSE, UPDATE_NEVER,
+ SpecialCharFindWithContext, NULL, &find_list);
+
+ rval = FixSpecialCharactersForStringsInList (find_list,
+ msg == NULL ?
+ "The ASN.1 contains special characters.\nIf you save it without stripping them,\nyou will be unable to load the file in Sequin."
+ : msg,
+ force_fix);
+
+ if (changed != NULL)
+ {
+ if (find_list == NULL)
+ {
+ *changed = FALSE;
+ }
+ else
+ {
+ *changed = rval;
+ }
+ }
+
+ find_list = FreeContextList (find_list);
+ return rval;
+}
+
+
+