public LexConfiguration()
        {
            Tasks = new Dictionary <string, LexTask>
            {
                { LexTask.View, new LexTask() },
                { LexTask.Dashboard, new LexTaskDashboard() },
                { LexTask.GatherTexts, new LexTask() },
                { LexTask.Semdom, new LexTaskSemdom() },
                { LexTask.Wordlist, new LexTask() },
                { LexTask.Dbe, new LexTask() },
                { LexTask.AddMeanings, new LexTask() },
                { LexTask.AddGrammar, new LexTask() },
                { LexTask.AddExamples, new LexTask() },
                { LexTask.Review, new LexTask() },
                { LexTask.ImportExport, new LexTask() },
                { LexTask.Configuration, new LexTask() }
            };

            Entry = new LexConfigFieldList
            {
                FieldOrder =
                {
                    LexConfig.Lexeme,
                    LexConfig.CitationForm,
                    // LexConfig.Environments, // Disabled 05-2016
                    LexConfig.Pronunciation,
                    LexConfig.CVPattern,
                    LexConfig.Tone,
                    LexConfig.Location,
                    LexConfig.Etymology,
                    LexConfig.EtymologyGloss,
                    LexConfig.EtymologyComment,
                    LexConfig.EtymologySource,
                    LexConfig.Note,
                    LexConfig.LiteralMeaning,
                    LexConfig.EntryBibliography,
                    LexConfig.EntryRestrictions,
                    LexConfig.SummaryDefinition,
                    LexConfig.EntryImportResidue,

                    LexConfig.SensesList
                },
                Fields =
                {
                    { LexConfig.Lexeme,                 new LexConfigMultiText("Word",                                 "th") },
                    // { LexConfig.CustomFieldsList, new LexConfigFieldList() },
                    { LexConfig.SensesList,             new LexConfigFieldList
                                            {
                                                FieldOrder =
                                                {
                                                    LexConfig.Definition,
                                                    LexConfig.Gloss,
                                                    LexConfig.Pictures,
                                                    LexConfig.Pos,
                                                    LexConfig.Semdom,
                                                    LexConfig.ScientificName,
                                                    LexConfig.AnthropologyNote,
                                                    LexConfig.SenseBibliography,
                                                    LexConfig.DiscourseNote,
                                                    LexConfig.EncyclopedicNote,
                                                    LexConfig.GeneralNote,
                                                    LexConfig.GrammarNote,
                                                    LexConfig.PhonologyNote,
                                                    LexConfig.SenseRestrictions,
                                                    LexConfig.SemanticsNote,
                                                    LexConfig.SociolinguisticsNote,
                                                    LexConfig.Source,
                                                    LexConfig.Usages,
                                                    // LexConfig.ReversalEntries, // Disabled 05-2016
                                                    LexConfig.SenseType,
                                                    LexConfig.AcademicDomains,
                                                    LexConfig.AnthropologyCategories,
                                                    LexConfig.SenseImportResidue,
                                                    LexConfig.Status,
                                                    LexConfig.ExamplesList
                                                },
                                                Fields =
                                                {
                                                    { LexConfig.Definition,             new LexConfigMultiText("Definition",                           "en")                             },
                                                    { LexConfig.Pos,                    new LexConfigOptionList(LexConfig.Pos) },
                                                    { LexConfig.Semdom,                 new LexConfigMultiOptionList(LexConfig.Semdom) },
                                                    { LexConfig.ExamplesList,           new LexConfigFieldList
                                            {
                                                FieldOrder =
                                                {
                                                    LexConfig.ExampleSentence,
                                                    LexConfig.ExampleTranslation,
                                                    LexConfig.Reference
                                                },
                                                Fields =
                                                {
                                                    { LexConfig.ExampleSentence,    new LexConfigMultiText("Sentence",               "th")                                                         },
                                                    { LexConfig.ExampleTranslation, new LexConfigMultiText("Translation",            "en")                                                         },
                                                    // { LexConfig.CustomFieldsList, new LexConfigFieldList() },

                                                    // Configuration for less common fields (mostly used in FLEx are defined below)
                                                    { LexConfig.Reference,          new LexConfigMultiText("Reference",              "en", true)                                                   }
                                                }
                                            } },
                                                    // { LexConfig.CustomFieldsList, new LexConfigFieldList() },

                                                    // Configuration for less common fields (mostly used in FLEx are defined below)
                                                    { LexConfig.Gloss,                  new LexConfigMultiText("Gloss",                                "en", true)                       },
                                                    { LexConfig.Pictures,               new LexConfigPictures()
                                            {
                                                HideIfEmpty = true
                                            } },
                                                    { LexConfig.ScientificName,         new LexConfigMultiText("Scientific Name",                      "en", true)                       },
                                                    { LexConfig.AnthropologyNote,       new LexConfigMultiText("Anthropology Note",                    "en", true)                       },
                                                    { LexConfig.SenseBibliography,      new LexConfigMultiText("Bibliography",                         "en", true)                       },
                                                    { LexConfig.DiscourseNote,          new LexConfigMultiText("Discourse Note",                       "en", true)                       },
                                                    { LexConfig.EncyclopedicNote,       new LexConfigMultiText("Encyclopedic Note",                    "en", true)                       },
                                                    { LexConfig.GeneralNote,            new LexConfigMultiText("General Note",                         "en", true)                       },
                                                    { LexConfig.GrammarNote,            new LexConfigMultiText("Grammar Note",                         "en", true)                       },
                                                    { LexConfig.PhonologyNote,          new LexConfigMultiText("Phonology Note",                       "en", true)                       },
                                                    { LexConfig.SenseRestrictions,      new LexConfigMultiText("Restrictions",                         "en", true)                       },
                                                    { LexConfig.SemanticsNote,          new LexConfigMultiText("Semantics Note",                       "en", true)                       },
                                                    { LexConfig.SociolinguisticsNote,   new LexConfigMultiText("Sociolinguistics Note",                "en", true)                       },
                                                    { LexConfig.Source,                 new LexConfigMultiText("Source",                               "en", true)                       },
                                                    { LexConfig.Usages,                 new LexConfigMultiOptionList(LexConfig.Usages,                 true)                             },
                                                    // { LexConfig.ReversalEntries, new LexConfigMultiOptionList(LexConfig.ReversalEntries, true) }, // Disabled 05-2016
                                                    { LexConfig.SenseType,              new LexConfigOptionList(LexConfig.SenseType,                   true)                             },
                                                    { LexConfig.AcademicDomains,        new LexConfigMultiOptionList(LexConfig.AcademicDomains,        true)                             },
                                                    { LexConfig.AnthropologyCategories, new LexConfigMultiOptionList(LexConfig.AnthropologyCategories, true)                             },
                                                    { LexConfig.SenseImportResidue,     new LexConfigMultiText("Import Residue",                       "en", true)                       },
                                                    { LexConfig.Status,                 new LexConfigOptionList(LexConfig.Status,                      true)                             }
                                                }
                                            } },

                    // Configuration for less common fields (mostly used in FLEx are defined below)
                    { LexConfig.CitationForm,           new LexConfigMultiText("Citation Form",                        "th", true)},
                    // { LexConfig.Environments, new LexConfigMultiOptionList(LexConfig.Environments, true) }, // Disabled 05-2016
                    { LexConfig.Pronunciation,          new LexConfigMultiText("Pronunciation",                        "en", true)},
                    { LexConfig.CVPattern,              new LexConfigMultiText("CV Pattern",                           "en", true)},
                    { LexConfig.Tone,                   new LexConfigMultiText("Tone",                                 "en", true)},
                    { LexConfig.Location,               new LexConfigOptionList(LexConfig.Location,                    true) },
                    { LexConfig.Etymology,              new LexConfigMultiText("Etymology",                            "en", true)},
                    { LexConfig.EtymologyGloss,         new LexConfigMultiText("Etymology Gloss",                      "en", true)},
                    { LexConfig.EtymologyComment,       new LexConfigMultiText("Etymology Comment",                    "en", true)},
                    { LexConfig.EtymologySource,        new LexConfigMultiText("Etymology Source",                     "en", true)},
                    { LexConfig.Note,                   new LexConfigMultiText("Note",                                 "en", true)},
                    { LexConfig.LiteralMeaning,         new LexConfigMultiText("Literal Meaning",                      "en", true)},
                    { LexConfig.EntryBibliography,      new LexConfigMultiText("Bibliography",                         "en", true)},
                    { LexConfig.EntryRestrictions,      new LexConfigMultiText("Restrictions",                         "en", true)},
                    { LexConfig.SummaryDefinition,      new LexConfigMultiText("Summary Definition",                   "en", true)},
                    { LexConfig.EntryImportResidue,     new LexConfigMultiText("Import Residue",                       "en", true)}
                }
            };

            var observerViewConfig = new LexRoleViewConfig
            {
                Fields =
                {
                    { LexConfig.Lexeme,                 new LexViewMultiTextFieldConfig() },
                    { LexConfig.Definition,             new LexViewMultiTextFieldConfig() },
                    { LexConfig.Pos,                    new LexViewFieldConfig()          },
                    { LexConfig.Semdom,                 new LexViewFieldConfig()          },
                    { LexConfig.ExampleSentence,        new LexViewMultiTextFieldConfig() },
                    { LexConfig.ExampleTranslation,     new LexViewMultiTextFieldConfig() },

                    // Less common fields that are visible by default
                    { LexConfig.Gloss,                  new LexViewMultiTextFieldConfig() },
                    { LexConfig.Pictures,               new LexViewMultiTextFieldConfig() },
                    { LexConfig.CitationForm,           new LexViewMultiTextFieldConfig() },
                    // { LexConfig.Environments, new LexViewFieldConfig() }, // Disabled 05-2016
                    { LexConfig.Pronunciation,          new LexViewMultiTextFieldConfig() },
                    { LexConfig.CVPattern,              new LexViewMultiTextFieldConfig() },
                    { LexConfig.Tone,                   new LexViewMultiTextFieldConfig() },
                    { LexConfig.Location,               new LexViewFieldConfig()          },
                    { LexConfig.Etymology,              new LexViewMultiTextFieldConfig() },
                    { LexConfig.EtymologyGloss,         new LexViewMultiTextFieldConfig() },
                    { LexConfig.EtymologyComment,       new LexViewMultiTextFieldConfig() },
                    { LexConfig.EtymologySource,        new LexViewMultiTextFieldConfig() },
                    { LexConfig.Note,                   new LexViewMultiTextFieldConfig() },
                    { LexConfig.LiteralMeaning,         new LexViewMultiTextFieldConfig() },
                    { LexConfig.EntryBibliography,      new LexViewMultiTextFieldConfig() },
                    { LexConfig.EntryRestrictions,      new LexViewMultiTextFieldConfig() },
                    { LexConfig.SummaryDefinition,      new LexViewMultiTextFieldConfig() },
                    { LexConfig.EntryImportResidue,     new LexViewMultiTextFieldConfig() },
                    { LexConfig.ScientificName,         new LexViewMultiTextFieldConfig() },
                    { LexConfig.AnthropologyNote,       new LexViewMultiTextFieldConfig() },
                    { LexConfig.SenseBibliography,      new LexViewMultiTextFieldConfig() },
                    { LexConfig.DiscourseNote,          new LexViewMultiTextFieldConfig() },
                    { LexConfig.EncyclopedicNote,       new LexViewMultiTextFieldConfig() },
                    { LexConfig.GeneralNote,            new LexViewMultiTextFieldConfig() },
                    { LexConfig.GrammarNote,            new LexViewMultiTextFieldConfig() },
                    { LexConfig.PhonologyNote,          new LexViewMultiTextFieldConfig() },
                    { LexConfig.SenseRestrictions,      new LexViewMultiTextFieldConfig() },
                    { LexConfig.SemanticsNote,          new LexViewMultiTextFieldConfig() },
                    { LexConfig.SociolinguisticsNote,   new LexViewMultiTextFieldConfig() },
                    { LexConfig.Source,                 new LexViewMultiTextFieldConfig() },
                    { LexConfig.Usages,                 new LexViewFieldConfig()          },
                    // { LexConfig.ReversalEntries, new LexViewFieldConfig() }, // Disabled 05-2016
                    { LexConfig.SenseType,              new LexViewFieldConfig()          },
                    { LexConfig.AcademicDomains,        new LexViewFieldConfig()          },
                    { LexConfig.AnthropologyCategories, new LexViewFieldConfig()          },
                    { LexConfig.SenseImportResidue,     new LexViewMultiTextFieldConfig() },
                    { LexConfig.Status,                 new LexViewFieldConfig()          },
                    { LexConfig.Reference,              new LexViewMultiTextFieldConfig() }
                },
                ShowTasks =
                {
                    { LexTask.View,        true  },
                    { LexTask.Dashboard,   true  },
                    { LexTask.GatherTexts, false },
                    { LexTask.Semdom,      false },
                    { LexTask.Wordlist,    false },
                    { LexTask.Dbe,         true  },
                    { LexTask.AddMeanings, false },
                    { LexTask.AddGrammar,  false },
                    { LexTask.AddExamples, false },
                    { LexTask.Review,      false }
                }
            };

            var observerWithCommentViewConfig = new LexRoleViewConfig(observerViewConfig);

            var contributorViewConfig = new LexRoleViewConfig(observerViewConfig);

            contributorViewConfig.ShowTasks[LexTask.AddMeanings] = true;
            contributorViewConfig.ShowTasks[LexTask.AddGrammar]  = true;
            contributorViewConfig.ShowTasks[LexTask.AddExamples] = true;

            var managerViewConfig = new LexRoleViewConfig(contributorViewConfig);

            contributorViewConfig.ShowTasks[LexTask.GatherTexts] = true;
            contributorViewConfig.ShowTasks[LexTask.Semdom]      = true;
            contributorViewConfig.ShowTasks[LexTask.Wordlist]    = true;
            contributorViewConfig.ShowTasks[LexTask.Review]      = true;

            RoleViews = new Dictionary <string, LexRoleViewConfig>
            {
                { LexRoles.Observer, observerViewConfig },
                { LexRoles.ObserverWithComment, observerWithCommentViewConfig },
                { LexRoles.Contributor, contributorViewConfig },
                { LexRoles.Manager, managerViewConfig }
            };
        }
 public LexRoleViewConfig(LexRoleViewConfig other)
 {
     Fields    = other.Fields.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Clone());
     ShowTasks = new Dictionary <string, bool>(other.ShowTasks);
 }