From 3eaae12f6828d1a22491a26686cd6b7c46e96d8c Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Wed, 31 Jan 2024 01:22:48 +0300
Subject: [PATCH 01/11] Experimental support for locations hierarchy
---
projects/GKCore/GDModel/GDMDateValue.cs | 5 +
projects/GKCore/GDModel/GDMLocationRecord.cs | 90 ++++++++++-
.../GKTests/GDModel/GDMLocationRecordTests.cs | 145 +++++++++++++++++-
3 files changed, 230 insertions(+), 10 deletions(-)
diff --git a/projects/GKCore/GDModel/GDMDateValue.cs b/projects/GKCore/GDModel/GDMDateValue.cs
index fb76ccad7..d3c940b40 100644
--- a/projects/GKCore/GDModel/GDMDateValue.cs
+++ b/projects/GKCore/GDModel/GDMDateValue.cs
@@ -164,5 +164,10 @@ public override string GetDisplayStringExt(DateFormat format, bool sign, bool sh
string result = (fValue == null) ? string.Empty : fValue.GetDisplayStringExt(format, sign, showCalendar, shorten);
return result;
}
+
+ public override string ToString()
+ {
+ return GetDisplayStringExt(DateFormat.dfDD_MM_YYYY, true, true, false);
+ }
}
}
diff --git a/projects/GKCore/GDModel/GDMLocationRecord.cs b/projects/GKCore/GDModel/GDMLocationRecord.cs
index 670343b19..d12a0c7db 100644
--- a/projects/GKCore/GDModel/GDMLocationRecord.cs
+++ b/projects/GKCore/GDModel/GDMLocationRecord.cs
@@ -19,6 +19,7 @@
*/
using System;
+using System.Collections.Generic;
using GDModel.Providers.GEDCOM;
using GKCore.Calendar;
using GKCore.Types;
@@ -29,6 +30,7 @@ public sealed class GDMLocationRecord : GDMRecord
{
private readonly GDMMap fMap;
private GDMList fNames;
+ private GDMList fTopLevels;
public string LocationName
@@ -56,6 +58,11 @@ public GDMList Names
get { return fNames; }
}
+ public GDMList TopLevels
+ {
+ get { return fTopLevels; }
+ }
+
public GDMLocationRecord(GDMTree tree) : base(tree)
{
@@ -63,6 +70,7 @@ public GDMLocationRecord(GDMTree tree) : base(tree)
fMap = new GDMMap();
fNames = new GDMList();
+ fTopLevels = new GDMList();
}
internal override void TrimExcess()
@@ -71,6 +79,7 @@ internal override void TrimExcess()
fMap.TrimExcess();
fNames.TrimExcess();
+ fTopLevels.TrimExcess();
}
public override void Assign(GDMTag source)
@@ -83,6 +92,7 @@ public override void Assign(GDMTag source)
fMap.Assign(otherLoc.fMap);
AssignList(otherLoc.fNames, Names);
+ AssignList(otherLoc.fTopLevels, TopLevels);
}
public override void Clear()
@@ -91,11 +101,12 @@ public override void Clear()
fMap.Clear();
fNames.Clear();
+ fTopLevels.Clear();
}
public override bool IsEmpty()
{
- return base.IsEmpty() && fMap.IsEmpty() && (fNames.Count == 0);
+ return base.IsEmpty() && fMap.IsEmpty() && (fNames.Count == 0) && (fTopLevels.Count == 0);
}
// TODO: connect to use
@@ -113,6 +124,67 @@ public override void ReplaceXRefs(GDMXRefReplacer map)
base.ReplaceXRefs(map);
fMap.ReplaceXRefs(map);
fNames.ReplaceXRefs(map);
+ fTopLevels.ReplaceXRefs(map);
+ }
+
+ public IList GetFullNames(GDMTree tree)
+ {
+ var result = new List();
+
+ if (fTopLevels.Count > 0) {
+ var buffer = new List();
+
+ for (int j = 0; j < fTopLevels.Count; j++) {
+ var topLevel = fTopLevels[j];
+ var topLoc = tree.GetPtrValue(topLevel);
+ if (topLoc == null) continue;
+
+ var topNames = topLoc.GetFullNames(tree);
+ for (int i = 0; i < topNames.Count; i++) {
+ var topName = topNames[i];
+ if (topName.Date.IsEmpty()) continue;
+
+ var interDate = GDMCustomDate.GetIntersection(topLevel.Date.Value, topName.Date.Value);
+ if (!interDate.IsEmpty()) {
+ var newLocName = new GDMLocationName();
+ newLocName.StringValue = topName.StringValue;
+ newLocName.Date.ParseString(interDate.StringValue);
+ buffer.Add(newLocName);
+ }
+ }
+ //buffer.AddRange(topNames);
+ }
+
+ for (int j = 0; j < buffer.Count; j++) {
+ var topLocName = buffer[j];
+ var topName = topLocName.StringValue;
+ var topDate = topLocName.Date.Value;
+
+ for (int i = 0; i < fNames.Count; i++) {
+ var locName = fNames[i];
+ if (locName.Date.IsEmpty()) continue;
+
+ var interDate = GDMCustomDate.GetIntersection(topDate, locName.Date.Value);
+ if (!interDate.IsEmpty()) {
+ string newName = locName.StringValue + ", " + topName;
+
+ var newLocName = new GDMLocationName();
+ newLocName.StringValue = newName;
+ newLocName.Date.ParseString(interDate.StringValue);
+ result.Add(newLocName);
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < fNames.Count; i++) {
+ var locName = fNames[i];
+ if (locName.Date.IsEmpty()) continue;
+
+ result.Add(locName);
+ }
+ }
+
+ return result;
}
public string GetNameByDate(GDMCustomDate date)
@@ -150,10 +222,22 @@ public bool ValidateNames()
public void SortNames()
{
- fNames.Sort(ChildrenEventsCompare);
+ fNames.Sort(NamesCompare);
+ }
+
+ private static int NamesCompare(GDMLocationName cp1, GDMLocationName cp2)
+ {
+ UDN udn1 = cp1.Date.GetUDN();
+ UDN udn2 = cp2.Date.GetUDN();
+ return -udn1.CompareTo(udn2);
+ }
+
+ public void SortTopLevels()
+ {
+ fTopLevels.Sort(TopLevelsCompare);
}
- private static int ChildrenEventsCompare(GDMLocationName cp1, GDMLocationName cp2)
+ private static int TopLevelsCompare(GDMLocationLink cp1, GDMLocationLink cp2)
{
UDN udn1 = cp1.Date.GetUDN();
UDN udn2 = cp2.Date.GetUDN();
diff --git a/projects/GKTests/GDModel/GDMLocationRecordTests.cs b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
index fbec046d1..5a2e969df 100644
--- a/projects/GKTests/GDModel/GDMLocationRecordTests.cs
+++ b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
@@ -19,6 +19,8 @@
*/
using System;
+using System.Collections.Generic;
+using System.Linq;
using GDModel.Providers.GEDCOM;
using GKCore;
using GKCore.Types;
@@ -34,6 +36,8 @@ public class GDMLocationRecordTests
public GDMLocationRecordTests()
{
+ TestUtils.InitUITest();
+
fContext = TestUtils.CreateContext();
}
@@ -109,13 +113,6 @@ public void Test_Names()
locName.StringValue = "Казанская губ., Вятская пров., Слободской уезд, Верховская вол., д. Мокрая Слободка";
locName.Date.ParseString("FROM 1727 TO 1764");
- // Сибирская губерния, 18 DEC 1708 - 18 JAN 1782
- // Казанская губерния, 1796 - 1920
- // Вятская провинция, to Sib 29 MAY 1719 — 28 APR 1727, to Kazan 29 APR 1727 — 10 SEP 1780
-
- // Вятское наместничество, 11 SEP 1780 - 30 DEC 1796
- // Вятская губерния, 31 DEC 1796 - 13 DEC 1929
-
string buf = GEDCOMProvider.GetTagStreamText(locRec, 0);
Assert.AreEqual("0 @L4@ _LOC\r\n" +
"1 NAME РФ, Кировская обл., Верхнекамский р-н, д. Прислонская\r\n" +
@@ -185,6 +182,122 @@ public void Test_NamesByDate()
}
}
+ [Test]
+ public void Test_Hierarchy()
+ {
+ var tree = new GDMTree();
+
+ var locRus = tree.CreateLocation();
+ locRus.AddLocName("Россия", "FROM 862 TO 9999");
+
+ IList fullNames = locRus.GetFullNames(tree);
+ string result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'__.__._862 [G] - __.__.9999 [G]': 'Россия'",
+ result);
+
+ var locSibGub = tree.CreateLocation();
+ locSibGub.AddLocName("Сибирская губерния", "FROM 18 DEC 1708 TO 18 JAN 1782");
+ locSibGub.AddLocLink(locRus, "FROM 18 DEC 1708 TO 18 JAN 1782");
+
+ fullNames = locSibGub.GetFullNames(tree);
+ result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'18.12.1708 [G] - 18.01.1782 [G]': 'Сибирская губерния, Россия'",
+ result);
+
+ var locKazGub = tree.CreateLocation();
+ locKazGub.AddLocName("Казанская губерния", "FROM 18 DEC 1708 TO 27 SEP 1781");
+ locKazGub.AddLocName("Казанское наместничество", "FROM 28 SEP 1781 TO 11 DEC 1796");
+ locKazGub.AddLocName("Казанская губерния", "FROM 12 DEC 1796 TO 27 MAY 1920");
+ locKazGub.AddLocLink(locRus, "FROM 18 DEC 1708 TO 27 MAY 1920");
+
+ fullNames = locKazGub.GetFullNames(tree);
+ result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'18.12.1708 [G] - 27.09.1781 [G]': 'Казанская губерния, Россия'\n"+
+ "'28.09.1781 [G] - 11.12.1796 [G]': 'Казанское наместничество, Россия'\n" +
+ "'12.12.1796 [G] - 27.05.1920 [G]': 'Казанская губерния, Россия'",
+ result);
+
+ var locVyatGub = tree.CreateLocation();
+ locVyatGub.AddLocName("Вятская провинция", "FROM 29 MAY 1719 TO 10 SEP 1780");
+ locVyatGub.AddLocName("Вятское наместничество", "FROM 11 SEP 1780 TO 30 DEC 1796");
+ locVyatGub.AddLocName("Вятская губерния", "FROM 31 DEC 1796 TO 13 DEC 1929");
+ locVyatGub.AddLocLink(locSibGub, "FROM 29 MAY 1719 TO 28 APR 1727");
+ locVyatGub.AddLocLink(locKazGub, "FROM 29 APR 1727 TO 10 SEP 1780");
+ locVyatGub.AddLocLink(locRus, "FROM 11 SEP 1780 TO 13 DEC 1929");
+
+ fullNames = locVyatGub.GetFullNames(tree);
+ result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'29.05.1719 [G] - 28.04.1727 [G]': 'Вятская провинция, Сибирская губерния, Россия'\n" +
+ "'29.04.1727 [G] - 10.09.1780 [G]': 'Вятская провинция, Казанская губерния, Россия'\n"+
+ "'11.09.1780 [G] - 30.12.1796 [G]': 'Вятское наместничество, Россия'\n"+
+ "'31.12.1796 [G] - 13.12.1929 [G]': 'Вятская губерния, Россия'",
+ result);
+
+ var locSlobUezd = tree.CreateLocation();
+ locSlobUezd.AddLocName("Слободской уезд", "FROM 1646 TO 1719");
+ locSlobUezd.AddLocName("Слободской дистр.", "FROM 1719 TO 1726");
+ locSlobUezd.AddLocName("Слободской уезд", "FROM 1727 TO 1929");
+ locSlobUezd.AddLocLink(locRus, "TO 1718");
+ locSlobUezd.AddLocLink(locVyatGub, "FROM 1719 TO 1726");
+ locSlobUezd.AddLocLink(locKazGub, "FROM 1727 TO 10 SEP 1780");
+ locSlobUezd.AddLocLink(locVyatGub, "FROM 11 SEP 1780 TO 10 JUN 1929");
+
+ fullNames = locSlobUezd.GetFullNames(tree);
+ result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'__.__.1646 [G] - __.__.1718 [G]': 'Слободской уезд, Россия'\n" +
+ "'29.05.1719 [G] - __.__.1726 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Россия'\n" +
+ "'__.__.1727 [G] - 10.09.1780 [G]': 'Слободской уезд, Казанская губерния, Россия'\n" +
+ "'11.09.1780 [G] - 30.12.1796 [G]': 'Слободской уезд, Вятское наместничество, Россия'\n" +
+ "'31.12.1796 [G] - __.__.1929 [G]': 'Слободской уезд, Вятская губерния, Россия'",
+ result);
+
+ var locVerhVol = tree.CreateLocation();
+ locVerhVol.AddLocName("Верховская вол.", "FROM 1720 TO 1764");
+ locVerhVol.AddLocLink(locSlobUezd, "FROM 1720 TO 1764");
+
+ var locLoinVol = tree.CreateLocation();
+ locLoinVol.AddLocName("Лоинская вол.", "FROM 1802 TO 1884");
+ locLoinVol.AddLocLink(locSlobUezd, "FROM 1802 TO 1884");
+
+ var locKirsVol = tree.CreateLocation();
+ locKirsVol.AddLocName("Кирсинская вол.", "FROM 1884 TO 1926");
+ locKirsVol.AddLocLink(locSlobUezd, "FROM 1884 TO 1926");
+
+ var locPrislon = tree.CreateLocation();
+ locPrislon.AddLocName("поч. Старое раменье", "FROM 1678 TO 1719");
+ locPrislon.AddLocName("д. Прислонская", "FROM 1720 TO 1726");
+ locPrislon.AddLocName("д. Мокрая Слободка", "FROM 1727 TO 1926");
+ locPrislon.AddLocLink(locSlobUezd, "FROM 1678 TO 1719");
+ locPrislon.AddLocLink(locVerhVol, "FROM 1720 TO 1801");
+ locPrislon.AddLocLink(locLoinVol, "FROM 1802 TO 1883");
+ locPrislon.AddLocLink(locKirsVol, "FROM 1884 TO 1926");
+
+ fullNames = locPrislon.GetFullNames(tree);
+ result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
+ Assert.AreEqual("'__.__.1678 [G] - __.__.1718 [G]': 'поч. Старое раменье, Слободской уезд, Россия'\n" +
+ "'__.__.1720 [G] - __.__.1726 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Россия'\n" +
+ "'__.__.1727 [G] - __.__.1764 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Казанская губерния, Россия'\n" +
+ "'__.__.1802 [G] - __.__.1883 [G]': 'д. Мокрая Слободка, Лоинская вол., Слободской уезд, Вятская губерния, Россия'\n" +
+ "'__.__.1884 [G] - __.__.1926 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Россия'",
+ result);
+
+ /*var dateVal = new GDMDate();
+ dateVal.ParseString("10 JAN 1701");
+ Assert.AreEqual("Российское царство, Вятка, Слободской уезд, Екатерининского мон. вотч., поч. Старое раменье", locPrislon.GetNameByDate(dateVal));
+
+ //
+ dateVal.ParseString("1711");
+ Assert.AreEqual("Сибирская губерния, Вятка, Слободской уезд, Екатерининского мон. вотч., поч. Старое раменье", locPrislon.GetNameByDate(dateVal));
+
+ //
+ dateVal.ParseString("1726");
+ Assert.AreEqual("Сибирская губ., Вятская пров., Слободской дистр., Верховская вол., д. Прислонская", locPrislon.GetNameByDate(dateVal));
+
+ //
+ dateVal.ParseString("1747");
+ Assert.AreEqual("Казанская губ., Вятская пров., Слободской уезд, Верховская вол., д. Мокрая Слободка", locPrislon.GetNameByDate(dateVal));*/
+ }
+
[Test]
public void Test_DateIntersections()
{
@@ -206,4 +319,22 @@ private static GDMDatePeriod GetRange(string strDateRange)
return result;
}
}
+
+ public static class LocExts
+ {
+ public static void AddLocName(this GDMLocationRecord locRec, string name, string date)
+ {
+ var locName = locRec.Names.Add(new GDMLocationName());
+ locName.StringValue = name;
+ locName.Date.ParseString(date);
+ }
+
+ public static void AddLocLink(this GDMLocationRecord locRec, GDMLocationRecord topLevel, string date)
+ {
+ var locLink = locRec.TopLevels.Add(new GDMLocationLink());
+ locLink.XRef = topLevel.XRef;
+ locLink.Date.ParseString(date);
+ }
+
+ }
}
From 2d12cf164d2fbbfaf84d1d577635fa1a3c005968 Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Wed, 31 Jan 2024 18:43:21 +0300
Subject: [PATCH 02/11] Experimental locations hierarchy
---
.../GKTests/GDModel/GDMLocationRecordTests.cs | 135 +++++++++++++-----
1 file changed, 96 insertions(+), 39 deletions(-)
diff --git a/projects/GKTests/GDModel/GDMLocationRecordTests.cs b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
index 5a2e969df..6459d9914 100644
--- a/projects/GKTests/GDModel/GDMLocationRecordTests.cs
+++ b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
@@ -187,12 +187,26 @@ public void Test_Hierarchy()
{
var tree = new GDMTree();
+ // J2G Rus transfer: 26 JAN 1918 (Julian), 1 FEB -> 14 FEB 1918
+
var locRus = tree.CreateLocation();
- locRus.AddLocName("Россия", "FROM 862 TO 9999");
+ locRus.AddLocName("Россия", "FROM 862 TO 1546");
+ locRus.AddLocName("Российское царство", "FROM 1547 TO 21 OCT 1721");//++
+ locRus.AddLocName("Российская империя", "FROM 22 OCT 1721 TO 31 AUG 1917");//++
+ locRus.AddLocName("Российская республика", "FROM 01 SEP 1917 TO 18 JUL 1918");//++
+ locRus.AddLocName("РСФСР", "FROM 19 JUL 1918 TO 29 DEC 1922");//++
+ locRus.AddLocName("СССР", "FROM 30 DEC 1922 TO 26 DEC 1991");//++
+ locRus.AddLocName("РФ", "FROM 27 DEC 1991 TO 9999");//++
IList fullNames = locRus.GetFullNames(tree);
string result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'__.__._862 [G] - __.__.9999 [G]': 'Россия'",
+ Assert.AreEqual("'__.__._862 [G] - __.__.1546 [G]': 'Россия'\n" +
+ "'__.__.1547 [G] - 21.10.1721 [G]': 'Российское царство'\n" +
+ "'22.10.1721 [G] - 31.08.1917 [G]': 'Российская империя'\n" +
+ "'01.09.1917 [G] - 18.07.1918 [G]': 'Российская республика'\n" +
+ "'19.07.1918 [G] - 29.12.1922 [G]': 'РСФСР'\n" +
+ "'30.12.1922 [G] - 26.12.1991 [G]': 'СССР'\n" +
+ "'27.12.1991 [G] - __.__.9999 [G]': 'РФ'",
result);
var locSibGub = tree.CreateLocation();
@@ -201,7 +215,8 @@ public void Test_Hierarchy()
fullNames = locSibGub.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'18.12.1708 [G] - 18.01.1782 [G]': 'Сибирская губерния, Россия'",
+ Assert.AreEqual("'18.12.1708 [G] - 21.10.1721 [G]': 'Сибирская губерния, Российское царство'\n" +
+ "'22.10.1721 [G] - 18.01.1782 [G]': 'Сибирская губерния, Российская империя'",
result);
var locKazGub = tree.CreateLocation();
@@ -212,43 +227,86 @@ public void Test_Hierarchy()
fullNames = locKazGub.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'18.12.1708 [G] - 27.09.1781 [G]': 'Казанская губерния, Россия'\n"+
- "'28.09.1781 [G] - 11.12.1796 [G]': 'Казанское наместничество, Россия'\n" +
- "'12.12.1796 [G] - 27.05.1920 [G]': 'Казанская губерния, Россия'",
+ Assert.AreEqual("'18.12.1708 [G] - 21.10.1721 [G]': 'Казанская губерния, Российское царство'\n" +
+ "'22.10.1721 [G] - 27.09.1781 [G]': 'Казанская губерния, Российская империя'\n" +
+ "'28.09.1781 [G] - 11.12.1796 [G]': 'Казанское наместничество, Российская империя'\n" +
+ "'12.12.1796 [G] - 31.08.1917 [G]': 'Казанская губерния, Российская империя'\n" +
+ "'01.09.1917 [G] - 18.07.1918 [G]': 'Казанская губерния, Российская республика'\n" +
+ "'19.07.1918 [G] - 27.05.1920 [G]': 'Казанская губерния, РСФСР'",
result);
+ var locNizhNovgGub = tree.CreateLocation();
+ locNizhNovgGub.AddLocName("Нижегородская губерния", "FROM JAN 1714 TO 1717");
+ locNizhNovgGub.AddLocName("Нижегородская губерния", "FROM 29 MAY 1719 TO 04 SEP 1779");
+ locNizhNovgGub.AddLocName("Нижегородское наместничество", "FROM 05 SEP 1779 TO 11 DEC 1796");
+ locNizhNovgGub.AddLocName("Нижегородская губерния", "FROM 12 DEC 1796 TO 13 JAN 1929");
+ locNizhNovgGub.AddLocName("Нижегородская область", "FROM 14 JAN 1929 TO 14 JUL 1929");
+ locNizhNovgGub.AddLocName("Нижегородский край", "FROM 15 JUL 1929 TO 06 OCT 1932");
+ locNizhNovgGub.AddLocName("Горьковский край", "FROM 07 OCT 1932 TO 04 DEC 1936");
+ locNizhNovgGub.AddLocName("Горьковская область", "FROM 05 DEC 1936 TO 21 OCT 1990");
+ locNizhNovgGub.AddLocName("Нижегородская область", "FROM 22 OCT 1990 TO 9999");
+ locNizhNovgGub.AddLocLink(locRus, "FROM JAN 1714 TO 9999");
+
var locVyatGub = tree.CreateLocation();
locVyatGub.AddLocName("Вятская провинция", "FROM 29 MAY 1719 TO 10 SEP 1780");
locVyatGub.AddLocName("Вятское наместничество", "FROM 11 SEP 1780 TO 30 DEC 1796");
- locVyatGub.AddLocName("Вятская губерния", "FROM 31 DEC 1796 TO 13 DEC 1929");
+ locVyatGub.AddLocName("Вятская губерния", "FROM 31 DEC 1796 TO 14 JUL 1929");
+ locVyatGub.AddLocName("Вятский округ", "FROM 15 JUL 1929 TO 29 JUL 1930");
+ locVyatGub.AddLocName("Кировский край", "FROM 07 DEC 1934 TO 04 DEC 1936");
+ locVyatGub.AddLocName("Кировская область", "FROM 05 DEC 1936 TO 9999");
locVyatGub.AddLocLink(locSibGub, "FROM 29 MAY 1719 TO 28 APR 1727");
locVyatGub.AddLocLink(locKazGub, "FROM 29 APR 1727 TO 10 SEP 1780");
- locVyatGub.AddLocLink(locRus, "FROM 11 SEP 1780 TO 13 DEC 1929");
+ locVyatGub.AddLocLink(locRus, "FROM 11 SEP 1780 TO 14 JUL 1929");
+ locVyatGub.AddLocLink(locNizhNovgGub, "FROM 15 JUL 1929 TO 29 JUL 1930");
+ locVyatGub.AddLocLink(locRus, "FROM 30 JUL 1930 TO 9999");
fullNames = locVyatGub.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'29.05.1719 [G] - 28.04.1727 [G]': 'Вятская провинция, Сибирская губерния, Россия'\n" +
- "'29.04.1727 [G] - 10.09.1780 [G]': 'Вятская провинция, Казанская губерния, Россия'\n"+
- "'11.09.1780 [G] - 30.12.1796 [G]': 'Вятское наместничество, Россия'\n"+
- "'31.12.1796 [G] - 13.12.1929 [G]': 'Вятская губерния, Россия'",
+ Assert.AreEqual("'29.05.1719 [G] - 21.10.1721 [G]': 'Вятская провинция, Сибирская губерния, Российское царство'\n" +
+ "'22.10.1721 [G] - 28.04.1727 [G]': 'Вятская провинция, Сибирская губерния, Российская империя'\n" +
+ "'29.04.1727 [G] - 10.09.1780 [G]': 'Вятская провинция, Казанская губерния, Российская империя'\n" +
+ "'11.09.1780 [G] - 30.12.1796 [G]': 'Вятское наместничество, Российская империя'\n" +
+ "'31.12.1796 [G] - 31.08.1917 [G]': 'Вятская губерния, Российская империя'\n" +
+ "'01.09.1917 [G] - 18.07.1918 [G]': 'Вятская губерния, Российская республика'\n" +
+ "'19.07.1918 [G] - 29.12.1922 [G]': 'Вятская губерния, РСФСР'\n" +
+ "'30.12.1922 [G] - 14.07.1929 [G]': 'Вятская губерния, СССР'\n" +
+ "'15.07.1929 [G] - 29.07.1930 [G]': 'Вятский округ, Нижегородский край, СССР'\n" +
+ "'07.12.1934 [G] - 04.12.1936 [G]': 'Кировский край, СССР'\n" +
+ "'05.12.1936 [G] - 26.12.1991 [G]': 'Кировская область, СССР'\n" +
+ "'27.12.1991 [G] - __.__.9999 [G]': 'Кировская область, РФ'",
result);
var locSlobUezd = tree.CreateLocation();
locSlobUezd.AddLocName("Слободской уезд", "FROM 1646 TO 1719");
locSlobUezd.AddLocName("Слободской дистр.", "FROM 1719 TO 1726");
- locSlobUezd.AddLocName("Слободской уезд", "FROM 1727 TO 1929");
+ locSlobUezd.AddLocName("Слободской уезд", "FROM 1727 TO 09 JUN 1929");
+ locSlobUezd.AddLocName("Слободской район", "FROM 10 JUN 1929 TO 9999");
locSlobUezd.AddLocLink(locRus, "TO 1718");
locSlobUezd.AddLocLink(locVyatGub, "FROM 1719 TO 1726");
locSlobUezd.AddLocLink(locKazGub, "FROM 1727 TO 10 SEP 1780");
locSlobUezd.AddLocLink(locVyatGub, "FROM 11 SEP 1780 TO 10 JUN 1929");
+ var locOmutUezd = tree.CreateLocation();
+ locOmutUezd.AddLocName("Омутнинский уезд", "FROM 05 JAN 1921 TO 09 JUN 1929");
+ locOmutUezd.AddLocName("Омутнинский район", "FROM 10 JUN 1929 TO 9999");
+ locOmutUezd.AddLocLink(locVyatGub, "FROM 05 JAN 1921 TO 9999");
+
+ var locVerhkamRn = tree.CreateLocation();
+ locVerhkamRn.AddLocName("Верхнекамский район", "FROM 12 JAN 1965 TO 9999");
+ locVerhkamRn.AddLocLink(locVyatGub, "FROM 12 JAN 1965 TO 9999");
+
fullNames = locSlobUezd.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'__.__.1646 [G] - __.__.1718 [G]': 'Слободской уезд, Россия'\n" +
- "'29.05.1719 [G] - __.__.1726 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Россия'\n" +
- "'__.__.1727 [G] - 10.09.1780 [G]': 'Слободской уезд, Казанская губерния, Россия'\n" +
- "'11.09.1780 [G] - 30.12.1796 [G]': 'Слободской уезд, Вятское наместничество, Россия'\n" +
- "'31.12.1796 [G] - __.__.1929 [G]': 'Слободской уезд, Вятская губерния, Россия'",
+ Assert.AreEqual("'__.__.1646 [G] - __.__.1718 [G]': 'Слободской уезд, Российское царство'\n" +
+ "'29.05.1719 [G] - 21.10.1721 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Российское царство'\n" +
+ "'22.10.1721 [G] - __.__.1726 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Российская империя'\n" +
+ "'__.__.1727 [G] - 10.09.1780 [G]': 'Слободской уезд, Казанская губерния, Российская империя'\n" +
+ "'11.09.1780 [G] - 30.12.1796 [G]': 'Слободской уезд, Вятское наместничество, Российская империя'\n" +
+ "'31.12.1796 [G] - 31.08.1917 [G]': 'Слободской уезд, Вятская губерния, Российская империя'\n" +
+ "'01.09.1917 [G] - 18.07.1918 [G]': 'Слободской уезд, Вятская губерния, Российская республика'\n" +
+ "'19.07.1918 [G] - 29.12.1922 [G]': 'Слободской уезд, Вятская губерния, РСФСР'\n" +
+ "'30.12.1922 [G] - 09.06.1929 [G]': 'Слободской уезд, Вятская губерния, СССР'\n" +
+ "'10.06.1929 [G] - 10.06.1929 [G]': 'Слободской район, Вятская губерния, СССР'",
result);
var locVerhVol = tree.CreateLocation();
@@ -262,40 +320,39 @@ public void Test_Hierarchy()
var locKirsVol = tree.CreateLocation();
locKirsVol.AddLocName("Кирсинская вол.", "FROM 1884 TO 1926");
locKirsVol.AddLocLink(locSlobUezd, "FROM 1884 TO 1926");
+ locKirsVol.AddLocLink(locOmutUezd, "FROM 1926 TO 1926");
var locPrislon = tree.CreateLocation();
locPrislon.AddLocName("поч. Старое раменье", "FROM 1678 TO 1719");
locPrislon.AddLocName("д. Прислонская", "FROM 1720 TO 1726");
locPrislon.AddLocName("д. Мокрая Слободка", "FROM 1727 TO 1926");
+ locPrislon.AddLocName("д. Колегово", "FROM 1927 TO 1978");
locPrislon.AddLocLink(locSlobUezd, "FROM 1678 TO 1719");
locPrislon.AddLocLink(locVerhVol, "FROM 1720 TO 1801");
locPrislon.AddLocLink(locLoinVol, "FROM 1802 TO 1883");
locPrislon.AddLocLink(locKirsVol, "FROM 1884 TO 1926");
+ locPrislon.AddLocLink(locOmutUezd, "FROM 1927 TO 1964");
+ locPrislon.AddLocLink(locVerhkamRn, "FROM 1965 TO 9999");
fullNames = locPrislon.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
- Assert.AreEqual("'__.__.1678 [G] - __.__.1718 [G]': 'поч. Старое раменье, Слободской уезд, Россия'\n" +
- "'__.__.1720 [G] - __.__.1726 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Россия'\n" +
- "'__.__.1727 [G] - __.__.1764 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Казанская губерния, Россия'\n" +
- "'__.__.1802 [G] - __.__.1883 [G]': 'д. Мокрая Слободка, Лоинская вол., Слободской уезд, Вятская губерния, Россия'\n" +
- "'__.__.1884 [G] - __.__.1926 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Россия'",
+ Assert.AreEqual("'__.__.1678 [G] - __.__.1718 [G]': 'поч. Старое раменье, Слободской уезд, Российское царство'\n" +
+ "'__.__.1720 [G] - 21.10.1721 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Российское царство'\n" +
+ "'22.10.1721 [G] - __.__.1726 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Российская империя'\n" +
+ "'__.__.1727 [G] - __.__.1764 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Казанская губерния, Российская империя'\n" +
+ "'__.__.1802 [G] - __.__.1883 [G]': 'д. Мокрая Слободка, Лоинская вол., Слободской уезд, Вятская губерния, Российская империя'\n" +
+ "'__.__.1884 [G] - 31.08.1917 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Российская империя'\n" +
+ "'01.09.1917 [G] - 18.07.1918 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Российская республика'\n" +
+ "'19.07.1918 [G] - 29.12.1922 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, РСФСР'\n" +
+ "'30.12.1922 [G] - __.__.1926 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, СССР'\n" +
+ "'__.__.1926 [G] - __.__.1926 [G]': 'д. Мокрая Слободка, Кирсинская вол., Омутнинский уезд, Вятская губерния, СССР'\n" +
+ "'__.__.1927 [G] - 09.06.1929 [G]': 'д. Колегово, Омутнинский уезд, Вятская губерния, СССР'\n" +
+ "'10.06.1929 [G] - 14.07.1929 [G]': 'д. Колегово, Омутнинский район, Вятская губерния, СССР'\n" +
+ "'15.07.1929 [G] - 29.07.1930 [G]': 'д. Колегово, Омутнинский район, Вятский округ, Нижегородский край, СССР'\n" +
+ "'07.12.1934 [G] - 04.12.1936 [G]': 'д. Колегово, Омутнинский район, Кировский край, СССР'\n" +
+ "'05.12.1936 [G] - __.__.1964 [G]': 'д. Колегово, Омутнинский район, Кировская область, СССР'\n" +
+ "'12.01.1965 [G] - __.__.1978 [G]': 'д. Колегово, Верхнекамский район, Кировская область, СССР'",
result);
-
- /*var dateVal = new GDMDate();
- dateVal.ParseString("10 JAN 1701");
- Assert.AreEqual("Российское царство, Вятка, Слободской уезд, Екатерининского мон. вотч., поч. Старое раменье", locPrislon.GetNameByDate(dateVal));
-
- //
- dateVal.ParseString("1711");
- Assert.AreEqual("Сибирская губерния, Вятка, Слободской уезд, Екатерининского мон. вотч., поч. Старое раменье", locPrislon.GetNameByDate(dateVal));
-
- //
- dateVal.ParseString("1726");
- Assert.AreEqual("Сибирская губ., Вятская пров., Слободской дистр., Верховская вол., д. Прислонская", locPrislon.GetNameByDate(dateVal));
-
- //
- dateVal.ParseString("1747");
- Assert.AreEqual("Казанская губ., Вятская пров., Слободской уезд, Верховская вол., д. Мокрая Слободка", locPrislon.GetNameByDate(dateVal));*/
}
[Test]
From 6a1dc1f873d311f58415dbb6fd58b4418aacc9d6 Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Thu, 1 Feb 2024 21:53:48 +0300
Subject: [PATCH 03/11] Minor improvements
---
projects/GKCore/GDModel/GDMCustomDate.cs | 29 +++--------
projects/GKCore/GDModel/GDMDate.cs | 8 +++
projects/GKCore/GDModel/GDMDatePeriod.cs | 6 +++
projects/GKCore/GDModel/GDMDateRange.cs | 6 +++
projects/GKCore/GDModel/GDMDateValue.cs | 10 ++++
.../Providers/GEDCOM/GEDCOMProvider.cs | 34 ++++++++++++
.../GKTests/GDModel/GDMLocationRecordTests.cs | 52 +++++++++++++------
7 files changed, 107 insertions(+), 38 deletions(-)
diff --git a/projects/GKCore/GDModel/GDMCustomDate.cs b/projects/GKCore/GDModel/GDMCustomDate.cs
index b4a4e20b0..088cf6919 100644
--- a/projects/GKCore/GDModel/GDMCustomDate.cs
+++ b/projects/GKCore/GDModel/GDMCustomDate.cs
@@ -157,6 +157,8 @@ public bool Equals(GDMCustomDate other)
return abs1.Equals(abs2);
}
+ public abstract void GetDateRange(out GDMDate dateStart, out GDMDate dateEnd);
+
public static GDMDate CreateApproximated(GDMDate date, GDMApproximated approximated)
{
GDMDate result = new GDMDate();
@@ -181,36 +183,17 @@ public static GDMDateRange CreateRange(GDMDate dateAfter, GDMDate dateBefore)
return result;
}
-
- public static void GetDateRange(GDMCustomDate date, out GDMDate dateStart, out GDMDate dateEnd)
- {
- if (date is GDMDateRange) {
- GDMDateRange dtRange = date as GDMDateRange;
- dateStart = dtRange.After;
- dateEnd = dtRange.Before;
- } else if (date is GDMDatePeriod) {
- GDMDatePeriod dtPeriod = date as GDMDatePeriod;
- dateStart = dtPeriod.DateFrom;
- dateEnd = dtPeriod.DateTo;
- } else {
- var dt = date as GDMDate;
- dateStart = dt;
- dateEnd = dt;
- }
- }
-
public static GDMDatePeriod GetIntersection(GDMCustomDate range1, GDMCustomDate range2)
{
if (range1 == null || range1.IsEmpty() || range2 == null || range2.IsEmpty())
return GDMDatePeriod.Empty;
GDMDate r1start, r1end, r2start, r2end;
+ range1.GetDateRange(out r1start, out r1end);
+ range2.GetDateRange(out r2start, out r2end);
- GetDateRange(range1, out r1start, out r1end);
- GetDateRange(range2, out r2start, out r2end);
-
- GDMDate greatestStart = r1start.CompareTo(r2start) > 0 ? r1start : r2start;
- GDMDate smallestEnd = r1end.CompareTo(r2end) < 0 ? r1end : r2end;
+ GDMDate greatestStart = r1start.IsEmpty() ? r2start : (r2start.IsEmpty() ? r1start : (r1start.CompareTo(r2start) > 0) ? r1start : r2start);
+ GDMDate smallestEnd = r1end.IsEmpty() ? r2end : (r2end.IsEmpty() ? r1end : (r1end.CompareTo(r2end) < 0) ? r1end : r2end);
// no intersection
if (greatestStart.CompareTo(smallestEnd) > 0) {
diff --git a/projects/GKCore/GDModel/GDMDate.cs b/projects/GKCore/GDModel/GDMDate.cs
index 7f8671bbd..5cc8e1b8c 100644
--- a/projects/GKCore/GDModel/GDMDate.cs
+++ b/projects/GKCore/GDModel/GDMDate.cs
@@ -36,6 +36,8 @@ namespace GDModel
///
public class GDMDate : GDMCustomDate
{
+ public static readonly GDMDate Empty = new GDMDate();
+
public const int UNKNOWN_YEAR = -1;
private GDMApproximated fApproximated;
@@ -585,5 +587,11 @@ public override string GetDisplayStringExt(DateFormat format, bool sign, bool sh
}
#endregion
+
+ public override void GetDateRange(out GDMDate dateStart, out GDMDate dateEnd)
+ {
+ dateStart = this;
+ dateEnd = this;
+ }
}
}
diff --git a/projects/GKCore/GDModel/GDMDatePeriod.cs b/projects/GKCore/GDModel/GDMDatePeriod.cs
index 5092e9fdf..704903c0f 100644
--- a/projects/GKCore/GDModel/GDMDatePeriod.cs
+++ b/projects/GKCore/GDModel/GDMDatePeriod.cs
@@ -155,5 +155,11 @@ public override string GetDisplayStringExt(DateFormat format, bool sign, bool sh
return result;
}
+
+ public override void GetDateRange(out GDMDate dateStart, out GDMDate dateEnd)
+ {
+ dateStart = fDateFrom;
+ dateEnd = fDateTo;
+ }
}
}
diff --git a/projects/GKCore/GDModel/GDMDateRange.cs b/projects/GKCore/GDModel/GDMDateRange.cs
index fb64d2572..40d79022f 100644
--- a/projects/GKCore/GDModel/GDMDateRange.cs
+++ b/projects/GKCore/GDModel/GDMDateRange.cs
@@ -168,5 +168,11 @@ public override string GetDisplayStringExt(DateFormat format, bool sign, bool sh
return result;
}
+
+ public override void GetDateRange(out GDMDate dateStart, out GDMDate dateEnd)
+ {
+ dateStart = fDateAfter;
+ dateEnd = fDateBefore;
+ }
}
}
diff --git a/projects/GKCore/GDModel/GDMDateValue.cs b/projects/GKCore/GDModel/GDMDateValue.cs
index d3c940b40..49cddb5cc 100644
--- a/projects/GKCore/GDModel/GDMDateValue.cs
+++ b/projects/GKCore/GDModel/GDMDateValue.cs
@@ -169,5 +169,15 @@ public override string ToString()
{
return GetDisplayStringExt(DateFormat.dfDD_MM_YYYY, true, true, false);
}
+
+ public override void GetDateRange(out GDMDate dateStart, out GDMDate dateEnd)
+ {
+ if (fValue == null) {
+ dateStart = null;
+ dateEnd = null;
+ } else {
+ fValue.GetDateRange(out dateStart, out dateEnd);
+ }
+ }
}
}
diff --git a/projects/GKCore/GDModel/Providers/GEDCOM/GEDCOMProvider.cs b/projects/GKCore/GDModel/Providers/GEDCOM/GEDCOMProvider.cs
index 35aa5c38c..3c81c71b4 100644
--- a/projects/GKCore/GDModel/Providers/GEDCOM/GEDCOMProvider.cs
+++ b/projects/GKCore/GDModel/Providers/GEDCOM/GEDCOMProvider.cs
@@ -1814,6 +1814,10 @@ private StackTuple AddLocationRecordTag(GDMTag owner, int tagLevel, int tagId, s
curTag = locRec.Names.Add(new GDMLocationName());
curTag.ParseString(tagValue);
addHandler = AddLocationNameTag;
+ } else if (tagType == GEDCOMTagType._LOC) {
+ curTag = locRec.TopLevels.Add(new GDMLocationLink());
+ curTag.ParseString(tagValue);
+ addHandler = AddLocationLinkTag;
} else if (tagType == GEDCOMTagType.MAP) {
curTag = locRec.Map;
addHandler = AddMapTag;
@@ -1834,6 +1838,7 @@ private static void WriteLocationRecord(StreamWriter stream, int level, GDMTag t
WriteMap(stream, level, locRec.Map);
WriteList(stream, level, locRec.Names, WriteLocationName);
+ WriteList(stream, level, locRec.TopLevels, WriteLocationLink);
}
@@ -1873,6 +1878,35 @@ private static bool WriteLocationName(StreamWriter stream, int level, GDMTag tag
}
+ private StackTuple AddLocationLinkTag(GDMTag owner, int tagLevel, int tagId, string tagValue)
+ {
+ GDMLocationLink locLink = (GDMLocationLink)owner;
+ GDMTag curTag = null;
+ AddTagHandler addHandler = null;
+
+ GEDCOMTagType tagType = (GEDCOMTagType)tagId;
+ if (tagType == GEDCOMTagType.DATE) {
+ curTag = locLink.Date;
+ GEDCOMUtils.ParseDateValue(fTree, locLink.Date, tagValue);
+ } else {
+ return AddBaseTag(owner, tagLevel, tagId, tagValue);
+ }
+
+ return CreateReaderStackTuple(tagLevel, curTag, addHandler);
+ }
+
+ private static bool WriteLocationLink(StreamWriter stream, int level, GDMTag tag)
+ {
+ GDMLocationLink locLink = (GDMLocationLink)tag;
+
+ if (!WriteBaseTag(stream, level, locLink)) return false;
+
+ level += 1;
+ WriteBaseTag(stream, level, locLink.Date);
+ return true;
+ }
+
+
private static StackTuple AddPlaceTag(GDMTag owner, int tagLevel, int tagId, string tagValue)
{
GDMPlace place = (GDMPlace)owner;
diff --git a/projects/GKTests/GDModel/GDMLocationRecordTests.cs b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
index 6459d9914..0a0076ceb 100644
--- a/projects/GKTests/GDModel/GDMLocationRecordTests.cs
+++ b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
@@ -20,6 +20,7 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using GDModel.Providers.GEDCOM;
using GKCore;
@@ -196,7 +197,7 @@ public void Test_Hierarchy()
locRus.AddLocName("Российская республика", "FROM 01 SEP 1917 TO 18 JUL 1918");//++
locRus.AddLocName("РСФСР", "FROM 19 JUL 1918 TO 29 DEC 1922");//++
locRus.AddLocName("СССР", "FROM 30 DEC 1922 TO 26 DEC 1991");//++
- locRus.AddLocName("РФ", "FROM 27 DEC 1991 TO 9999");//++
+ locRus.AddLocName("РФ", "FROM 27 DEC 1991");//++
IList fullNames = locRus.GetFullNames(tree);
string result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
@@ -206,17 +207,17 @@ public void Test_Hierarchy()
"'01.09.1917 [G] - 18.07.1918 [G]': 'Российская республика'\n" +
"'19.07.1918 [G] - 29.12.1922 [G]': 'РСФСР'\n" +
"'30.12.1922 [G] - 26.12.1991 [G]': 'СССР'\n" +
- "'27.12.1991 [G] - __.__.9999 [G]': 'РФ'",
+ "'27.12.1991 [G] >': 'РФ'",
result);
var locSibGub = tree.CreateLocation();
- locSibGub.AddLocName("Сибирская губерния", "FROM 18 DEC 1708 TO 18 JAN 1782");
- locSibGub.AddLocLink(locRus, "FROM 18 DEC 1708 TO 18 JAN 1782");
+ locSibGub.AddLocName("Сибирская губерния", "FROM 18 DEC 1708 TO 19 JAN 1782");
+ locSibGub.AddLocLink(locRus, "FROM 18 DEC 1708 TO 19 JAN 1782");
fullNames = locSibGub.GetFullNames(tree);
result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
Assert.AreEqual("'18.12.1708 [G] - 21.10.1721 [G]': 'Сибирская губерния, Российское царство'\n" +
- "'22.10.1721 [G] - 18.01.1782 [G]': 'Сибирская губерния, Российская империя'",
+ "'22.10.1721 [G] - 19.01.1782 [G]': 'Сибирская губерния, Российская империя'",
result);
var locKazGub = tree.CreateLocation();
@@ -253,7 +254,7 @@ public void Test_Hierarchy()
locVyatGub.AddLocName("Вятская губерния", "FROM 31 DEC 1796 TO 14 JUL 1929");
locVyatGub.AddLocName("Вятский округ", "FROM 15 JUL 1929 TO 29 JUL 1930");
locVyatGub.AddLocName("Кировский край", "FROM 07 DEC 1934 TO 04 DEC 1936");
- locVyatGub.AddLocName("Кировская область", "FROM 05 DEC 1936 TO 9999");
+ locVyatGub.AddLocName("Кировская область", "FROM 05 DEC 1936");
locVyatGub.AddLocLink(locSibGub, "FROM 29 MAY 1719 TO 28 APR 1727");
locVyatGub.AddLocLink(locKazGub, "FROM 29 APR 1727 TO 10 SEP 1780");
locVyatGub.AddLocLink(locRus, "FROM 11 SEP 1780 TO 14 JUL 1929");
@@ -280,19 +281,19 @@ public void Test_Hierarchy()
locSlobUezd.AddLocName("Слободской уезд", "FROM 1646 TO 1719");
locSlobUezd.AddLocName("Слободской дистр.", "FROM 1719 TO 1726");
locSlobUezd.AddLocName("Слободской уезд", "FROM 1727 TO 09 JUN 1929");
- locSlobUezd.AddLocName("Слободской район", "FROM 10 JUN 1929 TO 9999");
+ locSlobUezd.AddLocName("Слободской район", "FROM 10 JUN 1929");
locSlobUezd.AddLocLink(locRus, "TO 1718");
locSlobUezd.AddLocLink(locVyatGub, "FROM 1719 TO 1726");
- locSlobUezd.AddLocLink(locKazGub, "FROM 1727 TO 10 SEP 1780");
+ locSlobUezd.AddLocLink(locVyatGub, "FROM 1727 TO 10 SEP 1780");
locSlobUezd.AddLocLink(locVyatGub, "FROM 11 SEP 1780 TO 10 JUN 1929");
var locOmutUezd = tree.CreateLocation();
locOmutUezd.AddLocName("Омутнинский уезд", "FROM 05 JAN 1921 TO 09 JUN 1929");
- locOmutUezd.AddLocName("Омутнинский район", "FROM 10 JUN 1929 TO 9999");
+ locOmutUezd.AddLocName("Омутнинский район", "FROM 10 JUN 1929");
locOmutUezd.AddLocLink(locVyatGub, "FROM 05 JAN 1921 TO 9999");
var locVerhkamRn = tree.CreateLocation();
- locVerhkamRn.AddLocName("Верхнекамский район", "FROM 12 JAN 1965 TO 9999");
+ locVerhkamRn.AddLocName("Верхнекамский район", "FROM 12 JAN 1965");
locVerhkamRn.AddLocLink(locVyatGub, "FROM 12 JAN 1965 TO 9999");
fullNames = locSlobUezd.GetFullNames(tree);
@@ -300,7 +301,8 @@ public void Test_Hierarchy()
Assert.AreEqual("'__.__.1646 [G] - __.__.1718 [G]': 'Слободской уезд, Российское царство'\n" +
"'29.05.1719 [G] - 21.10.1721 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Российское царство'\n" +
"'22.10.1721 [G] - __.__.1726 [G]': 'Слободской дистр., Вятская провинция, Сибирская губерния, Российская империя'\n" +
- "'__.__.1727 [G] - 10.09.1780 [G]': 'Слободской уезд, Казанская губерния, Российская империя'\n" +
+ "'__.__.1727 [G] - 28.04.1727 [G]': 'Слободской уезд, Вятская провинция, Сибирская губерния, Российская империя'\n" +
+ "'29.04.1727 [G] - 10.09.1780 [G]': 'Слободской уезд, Вятская провинция, Казанская губерния, Российская империя'\n" +
"'11.09.1780 [G] - 30.12.1796 [G]': 'Слободской уезд, Вятское наместничество, Российская империя'\n" +
"'31.12.1796 [G] - 31.08.1917 [G]': 'Слободской уезд, Вятская губерния, Российская империя'\n" +
"'01.09.1917 [G] - 18.07.1918 [G]': 'Слободской уезд, Вятская губерния, Российская республика'\n" +
@@ -339,7 +341,8 @@ public void Test_Hierarchy()
Assert.AreEqual("'__.__.1678 [G] - __.__.1718 [G]': 'поч. Старое раменье, Слободской уезд, Российское царство'\n" +
"'__.__.1720 [G] - 21.10.1721 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Российское царство'\n" +
"'22.10.1721 [G] - __.__.1726 [G]': 'д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Российская империя'\n" +
- "'__.__.1727 [G] - __.__.1764 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Казанская губерния, Российская империя'\n" +
+ "'__.__.1727 [G] - 28.04.1727 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Вятская провинция, Сибирская губерния, Российская империя'\n" +
+ "'29.04.1727 [G] - __.__.1764 [G]': 'д. Мокрая Слободка, Верховская вол., Слободской уезд, Вятская провинция, Казанская губерния, Российская империя'\n" +
"'__.__.1802 [G] - __.__.1883 [G]': 'д. Мокрая Слободка, Лоинская вол., Слободской уезд, Вятская губерния, Российская империя'\n" +
"'__.__.1884 [G] - 31.08.1917 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Российская империя'\n" +
"'01.09.1917 [G] - 18.07.1918 [G]': 'д. Мокрая Слободка, Кирсинская вол., Слободской уезд, Вятская губерния, Российская республика'\n" +
@@ -353,6 +356,9 @@ public void Test_Hierarchy()
"'05.12.1936 [G] - __.__.1964 [G]': 'д. Колегово, Омутнинский район, Кировская область, СССР'\n" +
"'12.01.1965 [G] - __.__.1978 [G]': 'д. Колегово, Верхнекамский район, Кировская область, СССР'",
result);
+
+ //var gedcomProvider = new GEDCOMProvider(tree);
+ //gedcomProvider.SaveToStreamExt(new FileStream("d:\\Russia.ged", FileMode.CreateNew), GEDCOMCharacterSet.csUTF8);
}
[Test]
@@ -364,9 +370,25 @@ public void Test_DateIntersections()
var r3 = GetRange("FROM 1701 TO 1780");
var r4 = GetRange("FROM 1780 TO 1936");
- Assert.AreEqual("FROM 1719 TO 1727", GDMCustomDate.GetIntersection(r1, r2).StringValue);
- Assert.AreEqual("FROM 1708 TO 1780", GDMCustomDate.GetIntersection(r1, r3).StringValue);
- Assert.AreEqual("FROM 1780 TO 1929", GDMCustomDate.GetIntersection(r1, r4).StringValue);
+ Assert.AreEqual("FROM 1719 TO 1727", GDMCustomDate.GetIntersection(r1, r2).StringValue); // r2 inside r1
+ Assert.AreEqual("FROM 1708 TO 1780", GDMCustomDate.GetIntersection(r1, r3).StringValue); // r3 to left of r1
+ Assert.AreEqual("FROM 1780 TO 1929", GDMCustomDate.GetIntersection(r1, r4).StringValue); // r4 to right of r1
+
+ Assert.AreEqual("FROM 1747 TO 1764", GDMCustomDate.GetIntersection(GetRange("TO 1764"), GetRange("FROM 1747 TO 1834")).StringValue);
+ Assert.AreEqual("FROM 1747 TO 1764", GDMCustomDate.GetIntersection(GetRange("FROM 1747 TO 1834"), GetRange("TO 1764")).StringValue);
+
+ Assert.AreEqual("FROM 1782 TO 1834", GDMCustomDate.GetIntersection(GetRange("FROM 1782"), GetRange("FROM 1747 TO 1834")).StringValue);
+ Assert.AreEqual("FROM 1782 TO 1834", GDMCustomDate.GetIntersection(GetRange("FROM 1747 TO 1834"), GetRange("FROM 1782")).StringValue);
+
+ Assert.AreEqual("FROM 1782 TO 1834", GDMCustomDate.GetIntersection(GetRange("FROM 1782"), GetRange("TO 1834")).StringValue);
+ Assert.AreEqual("FROM 1782 TO 1834", GDMCustomDate.GetIntersection(GetRange("TO 1834"), GetRange("FROM 1782")).StringValue);
+
+ Assert.AreEqual("", GDMCustomDate.GetIntersection(GetRange("FROM 1858"), GetRange("TO 1834")).StringValue); // no intersects
+ Assert.AreEqual("", GDMCustomDate.GetIntersection(GetRange("TO 1834"), GetRange("FROM 1858")).StringValue); // no intersects
+
+ Assert.AreEqual("", GDMCustomDate.GetIntersection(GetRange(""), GetRange("FROM 1747 TO 1834")).StringValue); // no intersects
+
+ Assert.AreEqual("", GDMCustomDate.GetIntersection(GetRange("FROM 1719 TO 1727"), GetRange("FROM 1747 TO 1834")).StringValue); // no intersects
}
private static GDMDatePeriod GetRange(string strDateRange)
From 27faa1f15c3195a84f6ccf7e4e4d68e8e5e887cf Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Fri, 2 Feb 2024 22:14:14 +0300
Subject: [PATCH 04/11] Finished location hierarchy support
---
projects/GKCore/GDModel/GDMLocationLink.cs | 2 +-
projects/GKCore/GDModel/GDMLocationName.cs | 2 +-
projects/GKCore/GDModel/GDMLocationRecord.cs | 52 +++--
projects/GKCore/GKCore.csproj | 3 +
.../GKCore/Controllers/BaseController.cs | 35 ++++
.../Controllers/LocationEditDlgController.cs | 6 +
.../LocationLinkEditDlgController.cs | 103 +++++++++
.../GKCore/Design/Views/ILocationEditDlg.cs | 1 +
.../Design/Views/ILocationLinkEditDlg.cs | 35 ++++
projects/GKCore/GKCore/GKUtils.cs | 14 ++
.../GKCore/Lists/LocationLinksListModel.cs | 124 +++++++++++
.../GKCore/Operations/OrdinaryOperation.cs | 28 +++
projects/GKv2/GEDKeeper2/GEDKeeper2.csproj | 6 +
.../GKUI/Forms/LocationEditDlg.Designer.cs | 39 +++-
.../GEDKeeper2/GKUI/Forms/LocationEditDlg.cs | 10 +-
.../Forms/LocationLinkEditDlg.Designer.cs | 115 ++++++++++
.../GKUI/Forms/LocationLinkEditDlg.cs | 70 +++++++
.../GEDKeeper2/GKUI/Platform/WFAppHost.cs | 1 +
.../GEDKeeper3/GKUI/Forms/LocationEditDlg.cs | 8 +
.../GKUI/Forms/LocationEditDlg.xeto | 9 +-
.../GKUI/Forms/LocationLinkEditDlg.cs | 82 ++++++++
.../GKUI/Forms/LocationLinkEditDlg.xeto | 37 ++++
.../GEDKeeper3/GKUI/Platform/EtoAppHost.cs | 1 +
.../GKUI/Forms/LocationEditDlg.xaml | 11 +-
.../GKUI/Forms/LocationEditDlg.xaml.cs | 5 +
.../GKUI/Forms/LocationLinkEditDlg.xaml | 37 ++++
.../GKUI/Forms/LocationLinkEditDlg.xaml.cs | 65 ++++++
.../GEDKeeperX/GKUI/Platform/XFAppHost.cs | 1 +
.../GEDKeeperX/GKUI/Platform/XFStdDialogs.cs | 6 +
samples/RussiaLocations.ged | 196 ++++++++++++++++++
30 files changed, 1076 insertions(+), 28 deletions(-)
create mode 100644 projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
create mode 100644 projects/GKCore/GKCore/Design/Views/ILocationLinkEditDlg.cs
create mode 100644 projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
create mode 100644 projects/GKv2/GEDKeeper2/GKUI/Forms/LocationLinkEditDlg.Designer.cs
create mode 100644 projects/GKv2/GEDKeeper2/GKUI/Forms/LocationLinkEditDlg.cs
create mode 100644 projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.cs
create mode 100644 projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.xeto
create mode 100644 projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml
create mode 100644 projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml.cs
create mode 100644 samples/RussiaLocations.ged
diff --git a/projects/GKCore/GDModel/GDMLocationLink.cs b/projects/GKCore/GDModel/GDMLocationLink.cs
index b0e296a95..6e9d23090 100644
--- a/projects/GKCore/GDModel/GDMLocationLink.cs
+++ b/projects/GKCore/GDModel/GDMLocationLink.cs
@@ -29,7 +29,7 @@ public enum GDMLocationRelationship
}
- public sealed class GDMLocationLink : GDMPointer
+ public sealed class GDMLocationLink : GDMPointer, IGDMLocationElement
{
private readonly GDMDateValue fDate;
private GDMLocationRelationship fRelationship;
diff --git a/projects/GKCore/GDModel/GDMLocationName.cs b/projects/GKCore/GDModel/GDMLocationName.cs
index 21e9533fc..10e64c3f9 100644
--- a/projects/GKCore/GDModel/GDMLocationName.cs
+++ b/projects/GKCore/GDModel/GDMLocationName.cs
@@ -23,7 +23,7 @@
namespace GDModel
{
- public sealed class GDMLocationName : GDMValueTag
+ public sealed class GDMLocationName : GDMValueTag, IGDMLocationElement
{
private string fAbbreviation;
private readonly GDMDateValue fDate;
diff --git a/projects/GKCore/GDModel/GDMLocationRecord.cs b/projects/GKCore/GDModel/GDMLocationRecord.cs
index d12a0c7db..640ca3c1d 100644
--- a/projects/GKCore/GDModel/GDMLocationRecord.cs
+++ b/projects/GKCore/GDModel/GDMLocationRecord.cs
@@ -142,7 +142,6 @@ public IList GetFullNames(GDMTree tree)
var topNames = topLoc.GetFullNames(tree);
for (int i = 0; i < topNames.Count; i++) {
var topName = topNames[i];
- if (topName.Date.IsEmpty()) continue;
var interDate = GDMCustomDate.GetIntersection(topLevel.Date.Value, topName.Date.Value);
if (!interDate.IsEmpty()) {
@@ -152,7 +151,6 @@ public IList GetFullNames(GDMTree tree)
buffer.Add(newLocName);
}
}
- //buffer.AddRange(topNames);
}
for (int j = 0; j < buffer.Count; j++) {
@@ -162,7 +160,6 @@ public IList GetFullNames(GDMTree tree)
for (int i = 0; i < fNames.Count; i++) {
var locName = fNames[i];
- if (locName.Date.IsEmpty()) continue;
var interDate = GDMCustomDate.GetIntersection(topDate, locName.Date.Value);
if (!interDate.IsEmpty()) {
@@ -192,11 +189,10 @@ public string GetNameByDate(GDMCustomDate date)
if (date != null && !date.IsEmpty()) {
for (int i = 1; i < fNames.Count; i++) {
var locName = fNames[i];
- if (!locName.Date.IsEmpty()) {
- var interDate = GDMCustomDate.GetIntersection(date, locName.Date.Value);
- if (!interDate.IsEmpty()) {
- return locName.StringValue;
- }
+
+ var interDate = GDMCustomDate.GetIntersection(date, locName.Date.Value);
+ if (!interDate.IsEmpty()) {
+ return locName.StringValue;
}
}
}
@@ -209,39 +205,53 @@ public bool ValidateNames()
GDMCustomDate prevDate = null;
for (int i = 0; i < fNames.Count; i++) {
var locName = fNames[i];
- if (!locName.Date.IsEmpty()) {
- var interDate = GDMCustomDate.GetIntersection(prevDate, locName.Date.Value);
- if (!interDate.IsEmpty()) {
- return false;
- }
+
+ var interDate = GDMCustomDate.GetIntersection(prevDate, locName.Date.Value);
+ if (!interDate.IsEmpty()) {
+ return false;
}
+
prevDate = locName.Date.Value;
}
return true;
}
- public void SortNames()
+ public bool ValidateLinks()
{
- fNames.Sort(NamesCompare);
+ GDMCustomDate prevDate = null;
+ for (int i = 0; i < fTopLevels.Count; i++) {
+ var locLink = fTopLevels[i];
+
+ var interDate = GDMCustomDate.GetIntersection(prevDate, locLink.Date.Value);
+ if (!interDate.IsEmpty()) {
+ return false;
+ }
+
+ prevDate = locLink.Date.Value;
+ }
+ return true;
}
- private static int NamesCompare(GDMLocationName cp1, GDMLocationName cp2)
+ public void SortNames()
{
- UDN udn1 = cp1.Date.GetUDN();
- UDN udn2 = cp2.Date.GetUDN();
- return -udn1.CompareTo(udn2);
+ fNames.Sort(ElementsCompare);
}
public void SortTopLevels()
{
- fTopLevels.Sort(TopLevelsCompare);
+ fTopLevels.Sort(ElementsCompare);
}
- private static int TopLevelsCompare(GDMLocationLink cp1, GDMLocationLink cp2)
+ private static int ElementsCompare(IGDMLocationElement cp1, IGDMLocationElement cp2)
{
UDN udn1 = cp1.Date.GetUDN();
UDN udn2 = cp2.Date.GetUDN();
return -udn1.CompareTo(udn2);
}
}
+
+ public interface IGDMLocationElement
+ {
+ GDMDateValue Date { get; }
+ }
}
diff --git a/projects/GKCore/GKCore.csproj b/projects/GKCore/GKCore.csproj
index e7fd267ba..9538b29e1 100644
--- a/projects/GKCore/GKCore.csproj
+++ b/projects/GKCore/GKCore.csproj
@@ -64,6 +64,8 @@
GlobalSuppressions.cs
+
+
@@ -528,6 +530,7 @@
+
diff --git a/projects/GKCore/GKCore/Controllers/BaseController.cs b/projects/GKCore/GKCore/Controllers/BaseController.cs
index 098451710..76948bf49 100644
--- a/projects/GKCore/GKCore/Controllers/BaseController.cs
+++ b/projects/GKCore/GKCore/Controllers/BaseController.cs
@@ -514,6 +514,41 @@ public static async Task> ModifyLocationName
return result;
}
+ public static async Task> ModifyLocationLink(IView owner, IBaseWindow baseWin, ChangeTracker undoman,
+ GDMLocationRecord locRec, GDMLocationLink locLink)
+ {
+ var result = new ModificationResult();
+
+ try {
+ baseWin.Context.BeginUpdate();
+
+ bool exists = locLink != null;
+ if (!exists) {
+ locLink = new GDMLocationLink();
+ }
+
+ using (var dlg = AppHost.ResolveDialog(baseWin)) {
+ dlg.LocationLink = locLink;
+ result.Result = await AppHost.Instance.ShowModalAsync(dlg, owner, false);
+ }
+
+ if (!exists) {
+ if (result.Result) {
+ result.Result = undoman.DoOrdinaryOperation(OperationType.otLocationLinkAdd, locRec, locLink);
+ } else {
+ locLink.Dispose();
+ locLink = null;
+ }
+ }
+
+ result.Record = locLink;
+ } finally {
+ baseWin.Context.EndUpdate();
+ }
+
+ return result;
+ }
+
private static async Task PostProcessPerson(IBaseWindow baseWin, GDMIndividualRecord indivRec)
{
baseWin.Context.ImportNames(indivRec);
diff --git a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
index ba15eb206..3bbc508dd 100644
--- a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
@@ -62,6 +62,8 @@ public override void Init(IBaseWindow baseWin)
base.Init(baseWin);
fView.NamesList.ListModel = new LocationNamesListModel(fView, baseWin, fLocalUndoman);
+ fView.LinksList.ListModel = new LocationLinksListModel(fView, baseWin, fLocalUndoman);
+
fView.NotesList.ListModel = new NoteLinksListModel(fView, baseWin, fLocalUndoman);
fView.MediaList.ListModel = new MediaLinksListModel(fView, baseWin, fLocalUndoman);
}
@@ -99,6 +101,8 @@ public override void UpdateView()
fView.Longitude.Text = GEDCOMUtils.CoordToStr(fLocationRecord.Map.Long);
fView.NamesList.ListModel.DataOwner = fLocationRecord;
+ fView.LinksList.ListModel.DataOwner = fLocationRecord;
+
fView.NotesList.ListModel.DataOwner = fLocationRecord;
fView.MediaList.ListModel.DataOwner = fLocationRecord;
@@ -202,6 +206,8 @@ public override void SetLocale()
fView.GeoCoordsList.AddColumn(LangMan.LS(LSID.Longitude), 80, false);
GetControl("pageHistory").Text = LangMan.LS(LSID.History);
+ GetControl("pageHistNames").Text = LangMan.LS(LSID.Names);
+ GetControl("pageHistLinks").Text = LangMan.LS(LSID.Links);
}
}
}
diff --git a/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
new file mode 100644
index 000000000..8649b40df
--- /dev/null
+++ b/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
@@ -0,0 +1,103 @@
+/*
+ * "GEDKeeper", the personal genealogical database editor.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
+ *
+ * This file is part of "GEDKeeper".
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using GDModel;
+using GKCore.Design;
+using GKCore.Design.Controls;
+using GKCore.Design.Views;
+
+namespace GKCore.Controllers
+{
+ ///
+ ///
+ ///
+ public sealed class LocationLinkEditDlgController : DialogController
+ {
+ private GDMLocationLink fLocationLink;
+ private GDMLocationRecord fTempLocation;
+
+ public GDMLocationLink LocationLink
+ {
+ get { return fLocationLink; }
+ set {
+ if (fLocationLink != value) {
+ fLocationLink = value;
+ fTempLocation = fBase.Context.Tree.GetPtrValue(fLocationLink);
+ UpdateView();
+ }
+ }
+ }
+
+
+ public LocationLinkEditDlgController(ILocationLinkEditDlg view) : base(view)
+ {
+ fView.TopLevelText.Activate();
+ }
+
+ public override bool Accept()
+ {
+ try {
+ fBase.Context.Tree.SetPtrValue(fLocationLink, fTempLocation);
+
+ try {
+ GDMCustomDate dt = fView.DateCtl.Date;
+ if (dt == null) throw new ArgumentNullException("dt");
+
+ fLocationLink.Date.ParseString(dt.StringValue);
+ } catch (Exception ex) {
+ AppHost.StdDialogs.ShowError(LangMan.LS(LSID.DateInvalid));
+ throw ex;
+ }
+
+ fLocalUndoman.Commit();
+
+ return true;
+ } catch (Exception ex) {
+ Logger.WriteError("LocationLinkEditDlgController.Accept()", ex);
+ return false;
+ }
+ }
+
+ public override void UpdateView()
+ {
+ fView.DateCtl.FixedDateType = GDMDateType.PeriodBetween;
+
+ fView.TopLevelText.Text = (fTempLocation == null) ? "" : fTempLocation.GetNameByDate(fView.DateCtl.Date);
+ fView.DateCtl.Date = fLocationLink.Date.Value;
+ }
+
+ public async void SetLocation()
+ {
+ fTempLocation = await fBase.Context.SelectRecord(fView, GDMRecordType.rtLocation, null) as GDMLocationRecord;
+ fView.TopLevelText.Text = (fTempLocation == null) ? "" : fTempLocation.GetNameByDate(fView.DateCtl.Date);
+ }
+
+ public override void SetLocale()
+ {
+ fView.Title = LangMan.LS(LSID.Location);
+
+ GetControl("btnAccept").Text = LangMan.LS(LSID.DlgAccept);
+ GetControl("btnCancel").Text = LangMan.LS(LSID.DlgCancel);
+ GetControl("lblLocation").Text = LangMan.LS(LSID.Location);
+ GetControl("lblDate").Text = LangMan.LS(LSID.Date);
+ }
+ }
+}
diff --git a/projects/GKCore/GKCore/Design/Views/ILocationEditDlg.cs b/projects/GKCore/GKCore/Design/Views/ILocationEditDlg.cs
index 94c42ee73..7dca237d1 100644
--- a/projects/GKCore/GKCore/Design/Views/ILocationEditDlg.cs
+++ b/projects/GKCore/GKCore/Design/Views/ILocationEditDlg.cs
@@ -33,6 +33,7 @@ public interface ILocationEditDlg : ICommonDialog, IBaseEditor
ISheetList MediaList { get; }
ISheetList NotesList { get; }
ISheetList NamesList { get; }
+ ISheetList LinksList { get; }
IListView GeoCoordsList { get; }
ITextBox Name { get; }
ITextBox Latitude { get; }
diff --git a/projects/GKCore/GKCore/Design/Views/ILocationLinkEditDlg.cs b/projects/GKCore/GKCore/Design/Views/ILocationLinkEditDlg.cs
new file mode 100644
index 000000000..f8b387175
--- /dev/null
+++ b/projects/GKCore/GKCore/Design/Views/ILocationLinkEditDlg.cs
@@ -0,0 +1,35 @@
+/*
+ * "GEDKeeper", the personal genealogical database editor.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
+ *
+ * This file is part of "GEDKeeper".
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using GDModel;
+using GKCore.Design.Controls;
+using GKCore.Interfaces;
+
+namespace GKCore.Design.Views
+{
+ public interface ILocationLinkEditDlg : ICommonDialog, IBaseEditor
+ {
+ GDMLocationLink LocationLink { get; set; }
+
+ ITextBox TopLevelText { get; }
+
+ IDateControl DateCtl { get; }
+ }
+}
diff --git a/projects/GKCore/GKCore/GKUtils.cs b/projects/GKCore/GKCore/GKUtils.cs
index 70e698b2a..1edd589bf 100644
--- a/projects/GKCore/GKCore/GKUtils.cs
+++ b/projects/GKCore/GKCore/GKUtils.cs
@@ -3020,6 +3020,20 @@ public static void ShowLocationInfo(IBaseContext baseContext, GDMLocationRecord
GDMTree tree = baseContext.Tree;
+ var fullNames = locRec.GetFullNames(tree);
+ if (fullNames.Count > 0) {
+ //linkList.Sort();
+
+ summary.Add("");
+ summary.Add(LangMan.LS(LSID.History) + ":");
+
+ int num = fullNames.Count;
+ for (int i = 0; i < num; i++) {
+ var xName = fullNames[i];
+ summary.Add(" " + string.Format("{0}: {1}", xName.Date.GetDisplayStringExt(glob.DefDateFormat, glob.ShowDatesSign, glob.ShowDatesCalendar, false), xName.StringValue));
+ }
+ }
+
linkList = GetLocationLinks(tree, locRec);
if (linkList.Count > 0) {
diff --git a/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
new file mode 100644
index 000000000..fdf0353d8
--- /dev/null
+++ b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
@@ -0,0 +1,124 @@
+/*
+ * "GEDKeeper", the personal genealogical database editor.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
+ *
+ * This file is part of "GEDKeeper".
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using System.Threading.Tasks;
+using BSLib;
+using GDModel;
+using GKCore.Controllers;
+using GKCore.Design;
+using GKCore.Interfaces;
+using GKCore.Operations;
+using GKCore.Types;
+
+namespace GKCore.Lists
+{
+ public sealed class LocationLinksListModel : SheetModel
+ {
+ private GDMLocationRecord fRelLocation;
+
+ public LocationLinksListModel(IView owner, IBaseWindow baseWin, ChangeTracker undoman) : base(owner, baseWin, undoman)
+ {
+ AllowedActions = EnumSet.Create(RecordAction.raAdd, RecordAction.raEdit, RecordAction.raDelete);
+
+ fListColumns.AddColumn(LSID.NumberSym, 25, false);
+ fListColumns.AddColumn(LSID.Name, 300, false);
+ fListColumns.AddColumn(LSID.Date, 140, false);
+ fListColumns.ResetDefaults();
+ }
+
+ public override void Fetch(GDMLocationLink aRec)
+ {
+ base.Fetch(aRec);
+ fRelLocation = fBaseContext.Tree.GetPtrValue(fFetchedRec);
+ }
+
+ protected override object GetColumnValueEx(int colType, int colSubtype, bool isVisible)
+ {
+ object result = null;
+ switch (colType) {
+ case 0:
+ result = fStructList.IndexOf(fFetchedRec) + 1;
+ break;
+ case 1:
+ result = (fRelLocation == null) ? string.Empty : fRelLocation.GetNameByDate(fFetchedRec.Date.Value);
+ break;
+ case 2:
+ result = new GDMDateItem(fFetchedRec.Date.Value);
+ break;
+ }
+ return result;
+ }
+
+ public override void UpdateContents()
+ {
+ var dataOwner = fDataOwner as GDMLocationRecord;
+ if (dataOwner == null) return;
+
+ try {
+ UpdateStructList(dataOwner.TopLevels);
+ } catch (Exception ex) {
+ Logger.WriteError("LocationLinksListModel.UpdateContents()", ex);
+ }
+ }
+
+ public override async Task Modify(object sender, ModifyEventArgs eArgs)
+ {
+ var dataOwner = fDataOwner as GDMLocationRecord;
+ if (fBaseWin == null || dataOwner == null) return;
+
+ var locLink = eArgs.ItemData as GDMLocationLink;
+
+ bool result = false;
+
+ switch (eArgs.Action) {
+ case RecordAction.raAdd:
+ case RecordAction.raEdit: {
+ var locLinkRes = await BaseController.ModifyLocationLink(fOwner, fBaseWin, fUndoman, dataOwner, locLink);
+ locLink = locLinkRes.Record;
+ result = locLinkRes.Result;
+
+ if (result) {
+ if (!dataOwner.ValidateLinks()) {
+ AppHost.StdDialogs.ShowError(LangMan.LS(LSID.ThePeriodsOfPlaceNamesOverlap));
+ }
+ dataOwner.SortNames();
+ }
+ }
+ break;
+
+ case RecordAction.raDelete:
+ if (await AppHost.StdDialogs.ShowQuestion(LangMan.LS(LSID.RemoveNameQuery))) {
+ result = fUndoman.DoOrdinaryOperation(OperationType.otLocationNameRemove, dataOwner, locLink);
+ }
+ break;
+ }
+
+ if (result) {
+ if (eArgs.Action == RecordAction.raAdd) {
+ eArgs.ItemData = locLink;
+ }
+
+ fBaseWin.Context.Modified = true;
+ eArgs.IsChanged = true;
+ }
+ }
+ }
+}
diff --git a/projects/GKCore/GKCore/Operations/OrdinaryOperation.cs b/projects/GKCore/GKCore/Operations/OrdinaryOperation.cs
index 94469cbf0..291124213 100644
--- a/projects/GKCore/GKCore/Operations/OrdinaryOperation.cs
+++ b/projects/GKCore/GKCore/Operations/OrdinaryOperation.cs
@@ -75,6 +75,9 @@ public enum OperationType
otLocationNameAdd,
otLocationNameRemove,
+
+ otLocationLinkAdd,
+ otLocationLinkRemove,
}
///
@@ -213,6 +216,11 @@ private bool ProcessOperation(bool redo)
result = ProcessLocationName(redo);
break;
+ case OperationType.otLocationLinkAdd:
+ case OperationType.otLocationLinkRemove:
+ result = ProcessLocationLink(redo);
+ break;
+
default:
result = false;
break;
@@ -636,5 +644,25 @@ private bool ProcessLocationName(bool redo)
}
return true;
}
+
+ private bool ProcessLocationLink(bool redo)
+ {
+ GDMLocationRecord locRec = fObj as GDMLocationRecord;
+ GDMLocationLink locLink = fNewVal as GDMLocationLink;
+
+ if (locRec == null || locLink == null) {
+ return false;
+ }
+
+ if (fType == OperationType.otLocationLinkRemove) {
+ redo = !redo;
+ }
+ if (redo) {
+ locRec.TopLevels.Add(locLink);
+ } else {
+ locRec.TopLevels.Extract(locLink);
+ }
+ return true;
+ }
}
}
diff --git a/projects/GKv2/GEDKeeper2/GEDKeeper2.csproj b/projects/GKv2/GEDKeeper2/GEDKeeper2.csproj
index e26f72ffd..77d6806ba 100644
--- a/projects/GKv2/GEDKeeper2/GEDKeeper2.csproj
+++ b/projects/GKv2/GEDKeeper2/GEDKeeper2.csproj
@@ -155,6 +155,12 @@
LocationEditDlg.cs
+
+ Form
+
+
+ LocationLinkEditDlg.cs
+
Form
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
index 24368d815..0be0116ad 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
@@ -25,6 +25,9 @@ partial class LocationEditDlg
private System.Windows.Forms.ColumnHeader ColumnHeader2;
private System.Windows.Forms.ColumnHeader ColumnHeader3;
private System.Windows.Forms.TabPage pageHistory;
+ private GKUI.Components.GKTabControl tabsHistory;
+ private System.Windows.Forms.TabPage pageHistNames;
+ private System.Windows.Forms.TabPage pageHistLinks;
private void InitializeComponent()
{
@@ -51,8 +54,12 @@ private void InitializeComponent()
this.pageNotes = new System.Windows.Forms.TabPage();
this.pageMultimedia = new System.Windows.Forms.TabPage();
this.pageHistory = new System.Windows.Forms.TabPage();
+ this.tabsHistory = new GKUI.Components.GKTabControl();
+ this.pageHistNames = new System.Windows.Forms.TabPage();
+ this.pageHistLinks = new System.Windows.Forms.TabPage();
this.tabsData.SuspendLayout();
- this.pageCommon.SuspendLayout();
+ this.tabsHistory.SuspendLayout();
+ this.pageCommon.SuspendLayout();
this.grpSearch.SuspendLayout();
this.SuspendLayout();
//
@@ -245,8 +252,35 @@ private void InitializeComponent()
this.btnShowOnMap.Text = "btnShowOnMap";
this.btnShowOnMap.Click += new System.EventHandler(this.btnShowOnMap_Click);
//
+ // pageHistNames
+ //
+ this.pageHistNames.Location = new System.Drawing.Point(4, 26);
+ this.pageHistNames.Name = "pageHistNames";
+ this.pageHistNames.Size = new System.Drawing.Size(777, 486);
+ this.pageHistNames.TabIndex = 0;
+ this.pageHistNames.Text = "pageHistNames";
+ //
+ // pageHistLinks
+ //
+ this.pageHistLinks.Location = new System.Drawing.Point(4, 26);
+ this.pageHistLinks.Name = "pageHistLinks";
+ this.pageHistLinks.Size = new System.Drawing.Size(777, 486);
+ this.pageHistLinks.TabIndex = 1;
+ this.pageHistLinks.Text = "pageHistLinks";
+ //
+ // tabsHistory
+ //
+ this.tabsHistory.Controls.Add(this.pageHistNames);
+ this.tabsHistory.Controls.Add(this.pageHistLinks);
+ this.tabsHistory.Location = new System.Drawing.Point(0, 0);
+ this.tabsHistory.Name = "tabsHistory";
+ this.tabsHistory.SelectedIndex = 0;
+ this.tabsHistory.Size = new System.Drawing.Size(785, 516);
+ this.tabsHistory.TabIndex = 0;
+ //
// pageHistory
//
+ this.pageHistory.Controls.Add(this.tabsHistory);
this.pageHistory.Location = new System.Drawing.Point(4, 26);
this.pageHistory.Name = "pageHistory";
this.pageHistory.Size = new System.Drawing.Size(777, 486);
@@ -287,7 +321,8 @@ private void InitializeComponent()
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "LocationEditDlg";
- this.tabsData.ResumeLayout(false);
+ this.tabsHistory.ResumeLayout(false);
+ this.tabsData.ResumeLayout(false);
this.pageCommon.ResumeLayout(false);
this.pageCommon.PerformLayout();
this.grpSearch.ResumeLayout(false);
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
index 93d0ac555..31b9ed851 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
@@ -36,6 +36,7 @@ public sealed partial class LocationEditDlg : CommonDialog .
+ */
+
+using System;
+using GDModel;
+using GKCore.Controllers;
+using GKCore.Design.Controls;
+using GKCore.Design.Views;
+using GKCore.Interfaces;
+using GKUI.Components;
+
+namespace GKUI.Forms
+{
+ public sealed partial class LocationLinkEditDlg : CommonDialog, ILocationLinkEditDlg
+ {
+ public GDMLocationLink LocationLink
+ {
+ get { return fController.LocationLink; }
+ set { fController.LocationLink = value; }
+ }
+
+ #region View Interface
+
+ ITextBox ILocationLinkEditDlg.TopLevelText
+ {
+ get { return GetControlHandler(txtTopLevel); }
+ }
+
+ IDateControl ILocationLinkEditDlg.DateCtl
+ {
+ get { return GetControlHandler(dateCtl); }
+ }
+
+ #endregion
+
+ public LocationLinkEditDlg(IBaseWindow baseWin)
+ {
+ InitializeComponent();
+
+ btnLocationAdd.Image = UIHelper.LoadResourceImage("Resources.btn_rec_new.gif");
+ btnAccept.Image = UIHelper.LoadResourceImage("Resources.btn_accept.gif");
+ btnCancel.Image = UIHelper.LoadResourceImage("Resources.btn_cancel.gif");
+
+ fController = new LocationLinkEditDlgController(this);
+ fController.Init(baseWin);
+ }
+
+ private void btnLocationAdd_Click(object sender, EventArgs e)
+ {
+ fController.SetLocation();
+ }
+ }
+}
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Platform/WFAppHost.cs b/projects/GKv2/GEDKeeper2/GKUI/Platform/WFAppHost.cs
index 1144fa4d4..b63211a5c 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Platform/WFAppHost.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Platform/WFAppHost.cs
@@ -468,6 +468,7 @@ public static void ConfigureBootstrap()
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
+ container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
index e122115f1..80f1a5485 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
@@ -57,7 +57,10 @@ public sealed partial class LocationEditDlg : CommonDialog
-
+
+
+
+
+
+
+
+
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.cs b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.cs
new file mode 100644
index 000000000..f1ddc2e55
--- /dev/null
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.cs
@@ -0,0 +1,82 @@
+/*
+ * "GEDKeeper", the personal genealogical database editor.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
+ *
+ * This file is part of "GEDKeeper".
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using Eto.Forms;
+using Eto.Serialization.Xaml;
+using GDModel;
+using GKCore.Controllers;
+using GKCore.Design.Controls;
+using GKCore.Design.Views;
+using GKCore.Interfaces;
+using GKUI.Components;
+
+namespace GKUI.Forms
+{
+ public sealed partial class LocationLinkEditDlg : CommonDialog, ILocationLinkEditDlg
+ {
+ #region Design components
+#pragma warning disable CS0169, CS0649, IDE0044, IDE0051
+
+ private Button btnAccept;
+ private Button btnCancel;
+ private Label lblLocation;
+ private TextBox txtTopLevel;
+ private Button btnLocationAdd;
+ private Label lblDate;
+ private GKDateControl dateCtl;
+
+#pragma warning restore CS0169, CS0649, IDE0044, IDE0051
+ #endregion
+
+ public GDMLocationLink LocationLink
+ {
+ get { return fController.LocationLink; }
+ set { fController.LocationLink = value; }
+ }
+
+ #region View Interface
+
+ ITextBox ILocationLinkEditDlg.TopLevelText
+ {
+ get { return GetControlHandler(txtTopLevel); }
+ }
+
+ IDateControl ILocationLinkEditDlg.DateCtl
+ {
+ get { return GetControlHandler(dateCtl); }
+ }
+
+ #endregion
+
+ public LocationLinkEditDlg(IBaseWindow baseWin)
+ {
+ XamlReader.Load(this);
+
+ fController = new LocationLinkEditDlgController(this);
+ fController.Init(baseWin);
+ }
+
+ private void btnLocationAdd_Click(object sender, EventArgs e)
+ {
+ fController.SetLocation();
+ }
+ }
+}
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.xeto b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.xeto
new file mode 100644
index 000000000..e57972935
--- /dev/null
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationLinkEditDlg.xeto
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Platform/EtoAppHost.cs b/projects/GKv3/GEDKeeper3/GKUI/Platform/EtoAppHost.cs
index bd2338872..0c608a27d 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Platform/EtoAppHost.cs
+++ b/projects/GKv3/GEDKeeper3/GKUI/Platform/EtoAppHost.cs
@@ -512,6 +512,7 @@ public static void ConfigureBootstrap()
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
+ container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
index 73382e11a..3008cd449 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
@@ -47,7 +47,16 @@
-
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml.cs b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml.cs
index c22f5c8bd..46944779b 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml.cs
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml.cs
@@ -49,6 +49,11 @@ ISheetList ILocationEditDlg.NamesList
get { return fNamesList; }
}
+ ISheetList ILocationEditDlg.LinksList
+ {
+ get { return fLinksList; }
+ }
+
ISheetList ILocationEditDlg.MediaList
{
get { return fMediaList; }
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml
new file mode 100644
index 000000000..7f09e22b1
--- /dev/null
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml.cs b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml.cs
new file mode 100644
index 000000000..982e3c3ee
--- /dev/null
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationLinkEditDlg.xaml.cs
@@ -0,0 +1,65 @@
+/*
+ * "GEDKeeper", the personal genealogical database editor.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
+ *
+ * This file is part of "GEDKeeper".
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+using System;
+using GDModel;
+using GKCore.Controllers;
+using GKCore.Design.Controls;
+using GKCore.Design.Views;
+using GKCore.Interfaces;
+
+namespace GKUI.Forms
+{
+ public sealed partial class LocationLinkEditDlg : CommonDialog, ILocationLinkEditDlg
+ {
+ public GDMLocationLink LocationLink
+ {
+ get { return fController.LocationLink; }
+ set { fController.LocationLink = value; }
+ }
+
+ #region View Interface
+
+ ITextBox ILocationLinkEditDlg.TopLevelText
+ {
+ get { return GetControlHandler(txtTopLevel); }
+ }
+
+ IDateControl ILocationLinkEditDlg.DateCtl
+ {
+ get { return GetControlHandler(dateCtl); }
+ }
+
+ #endregion
+
+ public LocationLinkEditDlg(IBaseWindow baseWin)
+ {
+ InitializeComponent();
+
+ fController = new LocationLinkEditDlgController(this);
+ fController.Init(baseWin);
+ }
+
+ private void btnLocationAdd_Click(object sender, EventArgs e)
+ {
+ fController.SetLocation();
+ }
+ }
+}
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Platform/XFAppHost.cs b/projects/GKvX/GEDKeeperX/GKUI/Platform/XFAppHost.cs
index f32529add..5c096bd6e 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Platform/XFAppHost.cs
+++ b/projects/GKvX/GEDKeeperX/GKUI/Platform/XFAppHost.cs
@@ -276,6 +276,7 @@ public static void ConfigureBootstrap()
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
+ container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
container.Register(LifeCycle.Transient);
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Platform/XFStdDialogs.cs b/projects/GKvX/GEDKeeperX/GKUI/Platform/XFStdDialogs.cs
index f161b7344..92377c2a4 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Platform/XFStdDialogs.cs
+++ b/projects/GKvX/GEDKeeperX/GKUI/Platform/XFStdDialogs.cs
@@ -74,6 +74,12 @@ public async Task GetOpenFile(string title, string context, string filte
return string.Empty;
}
+ public async Task GetOpenFiles(string title, string context, string filter,
+ int filterIndex, string defaultExt)
+ {
+ return new string[0];
+ }
+
public async Task GetSaveFile(string filter)
{
return await GetSaveFile("", "", filter, 1, "", "");
diff --git a/samples/RussiaLocations.ged b/samples/RussiaLocations.ged
new file mode 100644
index 000000000..4fec173c2
--- /dev/null
+++ b/samples/RussiaLocations.ged
@@ -0,0 +1,196 @@
+0 HEAD
+1 SOUR
+1 CHAR ASCII
+1 GEDC
+1 FILE
+2 _UID DEA202410126A7429E31A402BEC0BD5BDE83
+2 _REV 0
+0 @L1@ _LOC
+1 _UID DE3B3AFB328575409467979A1337FA608A63
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.5
+1 NAME Россия
+2 DATE FROM 862 TO 1546
+1 NAME Российское царство
+2 DATE FROM 1547 TO 21 OCT 1721
+1 NAME Российская империя
+2 DATE FROM 22 OCT 1721 TO 31 AUG 1917
+1 NAME Российская республика
+2 DATE FROM 01 SEP 1917 TO 18 JUL 1918
+1 NAME РСФСР
+2 DATE FROM 19 JUL 1918 TO 29 DEC 1922
+1 NAME СССР
+2 DATE FROM 30 DEC 1922 TO 26 DEC 1991
+1 NAME РФ
+2 DATE FROM 27 DEC 1991
+0 @L2@ _LOC
+1 _UID F396573164EA634F99568B584C51F06BDB26
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.7
+1 NAME Сибирская губерния
+2 DATE FROM 18 DEC 1708 TO 19 JAN 1782
+1 _LOC @L1@
+2 DATE FROM 18 DEC 1708 TO 19 JAN 1782
+0 @L3@ _LOC
+1 _UID DE7CC60EC5ACCA4CA63BA99022CDBB6BE441
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Казанская губерния
+2 DATE FROM 18 DEC 1708 TO 27 SEP 1781
+1 NAME Казанское наместничество
+2 DATE FROM 28 SEP 1781 TO 11 DEC 1796
+1 NAME Казанская губерния
+2 DATE FROM 12 DEC 1796 TO 27 MAY 1920
+1 _LOC @L1@
+2 DATE FROM 18 DEC 1708 TO 27 MAY 1920
+0 @L4@ _LOC
+1 _UID 5BAE555596892D488DC9B1E79652BAA07700
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Нижегородская губерния
+2 DATE FROM JAN 1714 TO 1717
+1 NAME Нижегородская губерния
+2 DATE FROM 29 MAY 1719 TO 04 SEP 1779
+1 NAME Нижегородское наместничество
+2 DATE FROM 05 SEP 1779 TO 11 DEC 1796
+1 NAME Нижегородская губерния
+2 DATE FROM 12 DEC 1796 TO 13 JAN 1929
+1 NAME Нижегородская область
+2 DATE FROM 14 JAN 1929 TO 14 JUL 1929
+1 NAME Нижегородский край
+2 DATE FROM 15 JUL 1929 TO 06 OCT 1932
+1 NAME Горьковский край
+2 DATE FROM 07 OCT 1932 TO 04 DEC 1936
+1 NAME Горьковская область
+2 DATE FROM 05 DEC 1936 TO 21 OCT 1990
+1 NAME Нижегородская область
+2 DATE FROM 22 OCT 1990 TO 9999
+1 _LOC @L1@
+2 DATE FROM JAN 1714 TO 9999
+0 @L5@ _LOC
+1 _UID 550B945546B1174788C4D101E390B60BF0E0
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Вятская провинция
+2 DATE FROM 29 MAY 1719 TO 10 SEP 1780
+1 NAME Вятское наместничество
+2 DATE FROM 11 SEP 1780 TO 30 DEC 1796
+1 NAME Вятская губерния
+2 DATE FROM 31 DEC 1796 TO 14 JUL 1929
+1 NAME Вятский округ
+2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
+1 NAME Кировский край
+2 DATE FROM 07 DEC 1934 TO 04 DEC 1936
+1 NAME Кировская область
+2 DATE FROM 05 DEC 1936
+1 _LOC @L2@
+2 DATE FROM 29 MAY 1719 TO 28 APR 1727
+1 _LOC @L3@
+2 DATE FROM 29 APR 1727 TO 10 SEP 1780
+1 _LOC @L1@
+2 DATE FROM 11 SEP 1780 TO 14 JUL 1929
+1 _LOC @L4@
+2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
+1 _LOC @L1@
+2 DATE FROM 30 JUL 1930 TO 9999
+0 @L6@ _LOC
+1 _UID C5DAF2645DCC9449BCF79EAED432C40ACE12
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Слободской уезд
+2 DATE FROM 1646 TO 1719
+1 NAME Слободской дистр.
+2 DATE FROM 1719 TO 1726
+1 NAME Слободской уезд
+2 DATE FROM 1727 TO 09 JUN 1929
+1 NAME Слободской район
+2 DATE FROM 10 JUN 1929
+1 _LOC @L1@
+2 DATE TO 1718
+1 _LOC @L5@
+2 DATE FROM 1719 TO 1726
+1 _LOC @L5@
+2 DATE FROM 1727 TO 10 SEP 1780
+1 _LOC @L5@
+2 DATE FROM 11 SEP 1780 TO 10 JUN 1929
+0 @L7@ _LOC
+1 _UID C14C218B7645884B90BC82A1B38CB2731AEF
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Омутнинский уезд
+2 DATE FROM 05 JAN 1921 TO 09 JUN 1929
+1 NAME Омутнинский район
+2 DATE FROM 10 JUN 1929
+1 _LOC @L5@
+2 DATE FROM 05 JAN 1921 TO 9999
+0 @L8@ _LOC
+1 _UID 26C6B9700A12F64D868F8CA838467229D6BF
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Верхнекамский район
+2 DATE FROM 12 JAN 1965
+1 _LOC @L5@
+2 DATE FROM 12 JAN 1965 TO 9999
+0 @L9@ _LOC
+1 _UID BDB1932A427CCF40828ECBCE4EE08A358EF8
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Верховская вол.
+2 DATE FROM 1720 TO 1764
+1 _LOC @L6@
+2 DATE FROM 1720 TO 1764
+0 @L10@ _LOC
+1 _UID 690AF4DF740C5B42B91140F6FB741A412DEF
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Лоинская вол.
+2 DATE FROM 1802 TO 1884
+1 _LOC @L6@
+2 DATE FROM 1802 TO 1884
+0 @L11@ _LOC
+1 _UID AF8436E4BB271C4DB57887D0CE98BA054115
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME Кирсинская вол.
+2 DATE FROM 1884 TO 1926
+1 _LOC @L6@
+2 DATE FROM 1884 TO 1926
+1 _LOC @L7@
+2 DATE FROM 1926 TO 1926
+0 @L12@ _LOC
+1 _UID E89A71989AD1144D8D0CB48650BE0186BFB0
+1 CHAN
+2 DATE 02 FEB 2024
+3 TIME 10:06:38.8
+1 NAME поч. Старое раменье
+2 DATE FROM 1678 TO 1719
+1 NAME д. Прислонская
+2 DATE FROM 1720 TO 1726
+1 NAME д. Мокрая Слободка
+2 DATE FROM 1727 TO 1926
+1 NAME д. Колегово
+2 DATE FROM 1927 TO 1978
+1 _LOC @L6@
+2 DATE FROM 1678 TO 1719
+1 _LOC @L9@
+2 DATE FROM 1720 TO 1801
+1 _LOC @L10@
+2 DATE FROM 1802 TO 1883
+1 _LOC @L11@
+2 DATE FROM 1884 TO 1926
+1 _LOC @L7@
+2 DATE FROM 1927 TO 1964
+1 _LOC @L8@
+2 DATE FROM 1965 TO 9999
+0 TRLR
From 9c9a818aab815d3112e2589a14568cfd226435a0 Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Fri, 2 Feb 2024 22:35:19 +0300
Subject: [PATCH 05/11] Minor fixes
---
locales/Belarusian.lng | 2 +-
locales/Chinese Simplified.lng | 2 +-
locales/Dutch.lng | 2 +-
locales/English.lng | 2 +-
locales/Hungarian.lng | 2 +-
locales/Icelandic.lng | 2 +-
locales/Japanese.lng | 2 +-
locales/Kazakh (Cyrillic).lng | 2 +-
locales/Portuguese.lng | 2 +-
locales/Serbian (Latin).lng | 2 +-
locales/Spanish.lng | 2 +-
locales/czech.lng | 2 +-
locales/french.lng | 2 +-
locales/german.lng | 2 +-
locales/italian.lng | 2 +-
locales/polish.lng | 2 +-
locales/russian.lng | 2 +-
locales/ukrainian.lng | 2 +-
projects/GKCore/GKCore/LangMan.cs | 4 +-
.../GKCore/Lists/LocationLinksListModel.cs | 6 +-
.../GKCore/Lists/LocationNamesListModel.cs | 6 +-
samples/RussiaLocations.ged | 166 +++++++++---------
22 files changed, 112 insertions(+), 106 deletions(-)
diff --git a/locales/Belarusian.lng b/locales/Belarusian.lng
index dff54a583..212119d0e 100644
--- a/locales/Belarusian.lng
+++ b/locales/Belarusian.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Chinese Simplified.lng b/locales/Chinese Simplified.lng
index 8f0189dd6..168dce666 100644
--- a/locales/Chinese Simplified.lng
+++ b/locales/Chinese Simplified.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Dutch.lng b/locales/Dutch.lng
index af7b4f8e2..e2c26e841 100644
--- a/locales/Dutch.lng
+++ b/locales/Dutch.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/English.lng b/locales/English.lng
index 90b32e35b..e98724638 100644
--- a/locales/English.lng
+++ b/locales/English.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Hungarian.lng b/locales/Hungarian.lng
index 23dc9f496..edc58b4d8 100644
--- a/locales/Hungarian.lng
+++ b/locales/Hungarian.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Icelandic.lng b/locales/Icelandic.lng
index 5512f44cd..c2ba6a9f3 100644
--- a/locales/Icelandic.lng
+++ b/locales/Icelandic.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Japanese.lng b/locales/Japanese.lng
index 8e37f3b68..90a70831e 100644
--- a/locales/Japanese.lng
+++ b/locales/Japanese.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Kazakh (Cyrillic).lng b/locales/Kazakh (Cyrillic).lng
index bf0325590..07ba13860 100644
--- a/locales/Kazakh (Cyrillic).lng
+++ b/locales/Kazakh (Cyrillic).lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Portuguese.lng b/locales/Portuguese.lng
index 525da1e9b..0fc6dcb23 100644
--- a/locales/Portuguese.lng
+++ b/locales/Portuguese.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Serbian (Latin).lng b/locales/Serbian (Latin).lng
index 91051a1ed..6a7a9a179 100644
--- a/locales/Serbian (Latin).lng
+++ b/locales/Serbian (Latin).lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/Spanish.lng b/locales/Spanish.lng
index cffd81016..29b7bd226 100644
--- a/locales/Spanish.lng
+++ b/locales/Spanish.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/czech.lng b/locales/czech.lng
index b68da0f7f..71876bb5e 100644
--- a/locales/czech.lng
+++ b/locales/czech.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/french.lng b/locales/french.lng
index bc6ef6eac..28ba2238d 100644
--- a/locales/french.lng
+++ b/locales/french.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/german.lng b/locales/german.lng
index 619c7a171..1cffd334c 100644
--- a/locales/german.lng
+++ b/locales/german.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/italian.lng b/locales/italian.lng
index 67ca8d99c..a87f3cdcc 100644
--- a/locales/italian.lng
+++ b/locales/italian.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/polish.lng b/locales/polish.lng
index 5349d4151..ce494358a 100644
--- a/locales/polish.lng
+++ b/locales/polish.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/locales/russian.lng b/locales/russian.lng
index db0500ada..860eb1c4b 100644
--- a/locales/russian.lng
+++ b/locales/russian.lng
@@ -944,7 +944,7 @@
936=Анализ переписей
937=Персона может быть найдена в переписи `{0}`
938=История
-939=Периоды названий места пересекаются. Это приведет к ошибкам при поиске названия места по дате.
+939=Периоды пересекаются. Это приведет к ошибкам при поиске названия места по дате.
940=Расширенная обработка мест
941=Пакетное добавление фотографий
942=Добавлено {0} фотографий из {1}.
diff --git a/locales/ukrainian.lng b/locales/ukrainian.lng
index 6a30f7bbf..b202076d3 100644
--- a/locales/ukrainian.lng
+++ b/locales/ukrainian.lng
@@ -944,7 +944,7 @@
936=Census analysis
937=The person can be found in the census `{0}`
938=History
-939=The periods of place names overlap. This will cause errors when searching for a place name by date.
+939=The periods overlap. This will cause errors when searching for a place name by date.
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
diff --git a/projects/GKCore/GKCore/LangMan.cs b/projects/GKCore/GKCore/LangMan.cs
index 9da4ebff4..d9060bc69 100644
--- a/projects/GKCore/GKCore/LangMan.cs
+++ b/projects/GKCore/GKCore/LangMan.cs
@@ -1008,7 +1008,7 @@ public enum LSID
/* 936 */ CensusAnalysis,
/* 937 */ PersonCanBeFoundInCensus,
/* 938 */ History,
- /* 939 */ ThePeriodsOfPlaceNamesOverlap,
+ /* 939 */ PeriodsOverlap,
/* 940 */ ExtendedLocations,
/* 941 */ PhotosBatchAdding,
/* 942 */ AddedNPhotos,
@@ -1975,7 +1975,7 @@ public static class LangMan
/* 936 */ "Census analysis",
/* 937 */ "The person can be found in the census `{0}`",
/* 938 */ "History",
- /* 939 */ "The periods of place names overlap. This will cause errors when searching for a place name by date.",
+ /* 939 */ "The periods overlap. This will cause errors when searching for a place name by date.",
/* 940 */ "Extended locations",
/* 941 */ "Photos batch adding",
/* 942 */ "Added {0} photos from {1}.",
diff --git a/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
index fdf0353d8..dc450ff32 100644
--- a/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
+++ b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
@@ -40,7 +40,7 @@ public LocationLinksListModel(IView owner, IBaseWindow baseWin, ChangeTracker un
fListColumns.AddColumn(LSID.NumberSym, 25, false);
fListColumns.AddColumn(LSID.Name, 300, false);
- fListColumns.AddColumn(LSID.Date, 140, false);
+ fListColumns.AddColumn(LSID.Date, 160, false);
fListColumns.ResetDefaults();
}
@@ -97,9 +97,9 @@ public override async Task Modify(object sender, ModifyEventArgs eArgs)
if (result) {
if (!dataOwner.ValidateLinks()) {
- AppHost.StdDialogs.ShowError(LangMan.LS(LSID.ThePeriodsOfPlaceNamesOverlap));
+ AppHost.StdDialogs.ShowError(LangMan.LS(LSID.PeriodsOverlap));
}
- dataOwner.SortNames();
+ dataOwner.SortTopLevels();
}
}
break;
diff --git a/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs b/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
index 7d4bdad2c..c28b67a38 100644
--- a/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
+++ b/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
@@ -38,8 +38,8 @@ public LocationNamesListModel(IView owner, IBaseWindow baseWin, ChangeTracker un
fListColumns.AddColumn(LSID.NumberSym, 25, false);
fListColumns.AddColumn(LSID.Name, 300, false);
- fListColumns.AddColumn(LSID.ShortTitle, 100, false);
- fListColumns.AddColumn(LSID.Date, 140, false);
+ fListColumns.AddColumn(LSID.ShortTitle, 80, false);
+ fListColumns.AddColumn(LSID.Date, 160, false);
fListColumns.ResetDefaults();
}
@@ -107,7 +107,7 @@ public override async Task Modify(object sender, ModifyEventArgs eArgs)
if (result) {
if (!dataOwner.ValidateNames()) {
- AppHost.StdDialogs.ShowError(LangMan.LS(LSID.ThePeriodsOfPlaceNamesOverlap));
+ AppHost.StdDialogs.ShowError(LangMan.LS(LSID.PeriodsOverlap));
}
dataOwner.SortNames();
}
diff --git a/samples/RussiaLocations.ged b/samples/RussiaLocations.ged
index 4fec173c2..b8a91e201 100644
--- a/samples/RussiaLocations.ged
+++ b/samples/RussiaLocations.ged
@@ -1,29 +1,35 @@
0 HEAD
-1 SOUR
-1 CHAR ASCII
+1 SOUR GEDKeeper
+2 VERS 45
+1 DEST GEDKeeper
+1 CHAR UTF-8
1 GEDC
-1 FILE
+2 VERS 5.5.1
+2 FORM LINEAGE-LINKED
+1 FILE RussiaLocations.ged
2 _UID DEA202410126A7429E31A402BEC0BD5BDE83
-2 _REV 0
+2 _REV 2
+1 DATE 02 FEB 2024
+2 TIME 22:33:26.8
0 @L1@ _LOC
1 _UID DE3B3AFB328575409467979A1337FA608A63
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.5
+3 TIME 22:29:03.9
1 NAME Россия
-2 DATE FROM 862 TO 1546
-1 NAME Российское царство
-2 DATE FROM 1547 TO 21 OCT 1721
-1 NAME Российская империя
-2 DATE FROM 22 OCT 1721 TO 31 AUG 1917
-1 NAME Российская республика
-2 DATE FROM 01 SEP 1917 TO 18 JUL 1918
-1 NAME РСФСР
-2 DATE FROM 19 JUL 1918 TO 29 DEC 1922
+2 DATE FROM 27 DEC 1991
1 NAME СССР
2 DATE FROM 30 DEC 1922 TO 26 DEC 1991
-1 NAME РФ
-2 DATE FROM 27 DEC 1991
+1 NAME РСФСР
+2 DATE FROM 19 JUL 1918 TO 29 DEC 1922
+1 NAME Российская республика
+2 DATE FROM 01 SEP 1917 TO 18 JUL 1918
+1 NAME Российская империя
+2 DATE FROM 22 OCT 1721 TO 31 AUG 1917
+1 NAME Российское царство
+2 DATE FROM 1547 TO 21 OCT 1721
+1 NAME Россия
+2 DATE FROM 862 TO 1546
0 @L2@ _LOC
1 _UID F396573164EA634F99568B584C51F06BDB26
1 CHAN
@@ -37,97 +43,97 @@
1 _UID DE7CC60EC5ACCA4CA63BA99022CDBB6BE441
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:29:27.3
1 NAME Казанская губерния
-2 DATE FROM 18 DEC 1708 TO 27 SEP 1781
+2 DATE FROM 12 DEC 1796 TO 27 MAY 1920
1 NAME Казанское наместничество
2 DATE FROM 28 SEP 1781 TO 11 DEC 1796
1 NAME Казанская губерния
-2 DATE FROM 12 DEC 1796 TO 27 MAY 1920
+2 DATE FROM 18 DEC 1708 TO 27 SEP 1781
1 _LOC @L1@
2 DATE FROM 18 DEC 1708 TO 27 MAY 1920
0 @L4@ _LOC
1 _UID 5BAE555596892D488DC9B1E79652BAA07700
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:29:43.1
1 NAME Нижегородская губерния
-2 DATE FROM JAN 1714 TO 1717
+2 DATE FROM 22 OCT 1990 TO 9999
+1 NAME Горьковская область
+2 DATE FROM 05 DEC 1936 TO 21 OCT 1990
+1 NAME Горьковский край
+2 DATE FROM 07 OCT 1932 TO 04 DEC 1936
+1 NAME Нижегородский край
+2 DATE FROM 15 JUL 1929 TO 06 OCT 1932
+1 NAME Нижегородская область
+2 DATE FROM 14 JAN 1929 TO 14 JUL 1929
1 NAME Нижегородская губерния
-2 DATE FROM 29 MAY 1719 TO 04 SEP 1779
+2 DATE FROM 12 DEC 1796 TO 13 JAN 1929
1 NAME Нижегородское наместничество
2 DATE FROM 05 SEP 1779 TO 11 DEC 1796
1 NAME Нижегородская губерния
-2 DATE FROM 12 DEC 1796 TO 13 JAN 1929
-1 NAME Нижегородская область
-2 DATE FROM 14 JAN 1929 TO 14 JUL 1929
-1 NAME Нижегородский край
-2 DATE FROM 15 JUL 1929 TO 06 OCT 1932
-1 NAME Горьковский край
-2 DATE FROM 07 OCT 1932 TO 04 DEC 1936
-1 NAME Горьковская область
-2 DATE FROM 05 DEC 1936 TO 21 OCT 1990
-1 NAME Нижегородская область
-2 DATE FROM 22 OCT 1990 TO 9999
+2 DATE FROM 29 MAY 1719 TO 04 SEP 1779
+1 NAME Нижегородская губерния
+2 DATE FROM JAN 1714 TO 1717
1 _LOC @L1@
2 DATE FROM JAN 1714 TO 9999
0 @L5@ _LOC
1 _UID 550B945546B1174788C4D101E390B60BF0E0
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:31:10.4
1 NAME Вятская провинция
-2 DATE FROM 29 MAY 1719 TO 10 SEP 1780
-1 NAME Вятское наместничество
-2 DATE FROM 11 SEP 1780 TO 30 DEC 1796
-1 NAME Вятская губерния
-2 DATE FROM 31 DEC 1796 TO 14 JUL 1929
-1 NAME Вятский округ
-2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
+2 DATE FROM 05 DEC 1936
1 NAME Кировский край
2 DATE FROM 07 DEC 1934 TO 04 DEC 1936
-1 NAME Кировская область
-2 DATE FROM 05 DEC 1936
-1 _LOC @L2@
-2 DATE FROM 29 MAY 1719 TO 28 APR 1727
-1 _LOC @L3@
-2 DATE FROM 29 APR 1727 TO 10 SEP 1780
+1 NAME Вятский округ
+2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
+1 NAME Вятская губерния
+2 DATE FROM 31 DEC 1796 TO 14 JUL 1929
+1 NAME Вятское наместничество
+2 DATE FROM 11 SEP 1780 TO 30 DEC 1796
+1 NAME Вятская провинция
+2 DATE FROM 29 MAY 1719 TO 10 SEP 1780
1 _LOC @L1@
-2 DATE FROM 11 SEP 1780 TO 14 JUL 1929
+2 DATE FROM 30 JUL 1930 TO 9999
1 _LOC @L4@
2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
1 _LOC @L1@
-2 DATE FROM 30 JUL 1930 TO 9999
+2 DATE FROM 11 SEP 1780 TO 14 JUL 1929
+1 _LOC @L3@
+2 DATE FROM 29 APR 1727 TO 10 SEP 1780
+1 _LOC @L2@
+2 DATE FROM 29 MAY 1719 TO 28 APR 1727
0 @L6@ _LOC
1 _UID C5DAF2645DCC9449BCF79EAED432C40ACE12
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:31:58.3
+1 NAME Слободской уезд
+2 DATE FROM 10 JUN 1929
1 NAME Слободской уезд
-2 DATE FROM 1646 TO 1719
+2 DATE FROM 1727 TO 09 JUN 1929
1 NAME Слободской дистр.
2 DATE FROM 1719 TO 1726
1 NAME Слободской уезд
-2 DATE FROM 1727 TO 09 JUN 1929
-1 NAME Слободской район
-2 DATE FROM 10 JUN 1929
-1 _LOC @L1@
-2 DATE TO 1718
+2 DATE FROM 1646 TO 1718
1 _LOC @L5@
-2 DATE FROM 1719 TO 1726
+2 DATE FROM 11 SEP 1780 TO 10 JUN 1929
1 _LOC @L5@
2 DATE FROM 1727 TO 10 SEP 1780
1 _LOC @L5@
-2 DATE FROM 11 SEP 1780 TO 10 JUN 1929
+2 DATE FROM 1719 TO 1726
+1 _LOC @L1@
+2 DATE TO 1718
0 @L7@ _LOC
1 _UID C14C218B7645884B90BC82A1B38CB2731AEF
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:32:12
1 NAME Омутнинский уезд
-2 DATE FROM 05 JAN 1921 TO 09 JUN 1929
-1 NAME Омутнинский район
2 DATE FROM 10 JUN 1929
+1 NAME Омутнинский уезд
+2 DATE FROM 05 JAN 1921 TO 09 JUN 1929
1 _LOC @L5@
2 DATE FROM 05 JAN 1921 TO 9999
0 @L8@ _LOC
@@ -161,36 +167,36 @@
1 _UID AF8436E4BB271C4DB57887D0CE98BA054115
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+3 TIME 22:32:57.1
1 NAME Кирсинская вол.
2 DATE FROM 1884 TO 1926
-1 _LOC @L6@
-2 DATE FROM 1884 TO 1926
1 _LOC @L7@
2 DATE FROM 1926 TO 1926
+1 _LOC @L6@
+2 DATE FROM 1884 TO 1925
0 @L12@ _LOC
1 _UID E89A71989AD1144D8D0CB48650BE0186BFB0
1 CHAN
2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
-1 NAME поч. Старое раменье
-2 DATE FROM 1678 TO 1719
-1 NAME д. Прислонская
-2 DATE FROM 1720 TO 1726
-1 NAME д. Мокрая Слободка
-2 DATE FROM 1727 TO 1926
+3 TIME 22:33:12.5
1 NAME д. Колегово
2 DATE FROM 1927 TO 1978
-1 _LOC @L6@
+1 NAME д. Мокрая Слободка
+2 DATE FROM 1727 TO 1926
+1 NAME д. Прислонская
+2 DATE FROM 1720 TO 1726
+1 NAME поч. Старое раменье
2 DATE FROM 1678 TO 1719
-1 _LOC @L9@
-2 DATE FROM 1720 TO 1801
-1 _LOC @L10@
-2 DATE FROM 1802 TO 1883
-1 _LOC @L11@
-2 DATE FROM 1884 TO 1926
-1 _LOC @L7@
-2 DATE FROM 1927 TO 1964
1 _LOC @L8@
2 DATE FROM 1965 TO 9999
+1 _LOC @L7@
+2 DATE FROM 1927 TO 1964
+1 _LOC @L11@
+2 DATE FROM 1884 TO 1926
+1 _LOC @L10@
+2 DATE FROM 1802 TO 1883
+1 _LOC @L9@
+2 DATE FROM 1720 TO 1801
+1 _LOC @L6@
+2 DATE FROM 1678 TO 1719
0 TRLR
From a56369dee53bac114aa2de2505571f3a953a431d Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Sat, 3 Feb 2024 22:20:30 +0300
Subject: [PATCH 06/11] Minor fixes
---
locales/Belarusian.lng | 2 +
locales/Chinese Simplified.lng | 2 +
locales/Dutch.lng | 2 +
locales/English.lng | 2 +
locales/Hungarian.lng | 2 +
locales/Icelandic.lng | 2 +
locales/Japanese.lng | 2 +
locales/Kazakh (Cyrillic).lng | 2 +
locales/Portuguese.lng | 2 +
locales/Serbian (Latin).lng | 2 +
locales/Spanish.lng | 2 +
locales/czech.lng | 2 +
locales/french.lng | 2 +
locales/german.lng | 2 +
locales/italian.lng | 2 +
locales/polish.lng | 2 +
locales/russian.lng | 2 +
locales/ukrainian.lng | 2 +
projects/GKCore/GDModel/GDMLocationRecord.cs | 2 +-
.../Controllers/LocationEditDlgController.cs | 9 +-
projects/GKCore/GKCore/LangMan.cs | 6 +-
.../GKCore/Lists/LocationLinksListModel.cs | 4 +-
projects/GKCore/GKCore/Lists/SheetModel.cs | 2 +
samples/RussiaLocations.ged | 216 +++++++++---------
24 files changed, 162 insertions(+), 113 deletions(-)
diff --git a/locales/Belarusian.lng b/locales/Belarusian.lng
index 212119d0e..704757da8 100644
--- a/locales/Belarusian.lng
+++ b/locales/Belarusian.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Chinese Simplified.lng b/locales/Chinese Simplified.lng
index 168dce666..c33aa9da1 100644
--- a/locales/Chinese Simplified.lng
+++ b/locales/Chinese Simplified.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Dutch.lng b/locales/Dutch.lng
index e2c26e841..ce256a9b5 100644
--- a/locales/Dutch.lng
+++ b/locales/Dutch.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/English.lng b/locales/English.lng
index e98724638..4ef0de02f 100644
--- a/locales/English.lng
+++ b/locales/English.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Hungarian.lng b/locales/Hungarian.lng
index edc58b4d8..a2d3b8e76 100644
--- a/locales/Hungarian.lng
+++ b/locales/Hungarian.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Icelandic.lng b/locales/Icelandic.lng
index c2ba6a9f3..f7970842e 100644
--- a/locales/Icelandic.lng
+++ b/locales/Icelandic.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Japanese.lng b/locales/Japanese.lng
index 90a70831e..14523239b 100644
--- a/locales/Japanese.lng
+++ b/locales/Japanese.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Kazakh (Cyrillic).lng b/locales/Kazakh (Cyrillic).lng
index 07ba13860..f96a8d3fc 100644
--- a/locales/Kazakh (Cyrillic).lng
+++ b/locales/Kazakh (Cyrillic).lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Portuguese.lng b/locales/Portuguese.lng
index 0fc6dcb23..7ae35e6fb 100644
--- a/locales/Portuguese.lng
+++ b/locales/Portuguese.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Serbian (Latin).lng b/locales/Serbian (Latin).lng
index 6a7a9a179..0ecadb26b 100644
--- a/locales/Serbian (Latin).lng
+++ b/locales/Serbian (Latin).lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/Spanish.lng b/locales/Spanish.lng
index 29b7bd226..a53f36277 100644
--- a/locales/Spanish.lng
+++ b/locales/Spanish.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/czech.lng b/locales/czech.lng
index 71876bb5e..f5caa261b 100644
--- a/locales/czech.lng
+++ b/locales/czech.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/french.lng b/locales/french.lng
index 28ba2238d..5f92a27a9 100644
--- a/locales/french.lng
+++ b/locales/french.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/german.lng b/locales/german.lng
index 1cffd334c..c87bb3b85 100644
--- a/locales/german.lng
+++ b/locales/german.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/italian.lng b/locales/italian.lng
index a87f3cdcc..81c1b3f30 100644
--- a/locales/italian.lng
+++ b/locales/italian.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/polish.lng b/locales/polish.lng
index ce494358a..51a7b44db 100644
--- a/locales/polish.lng
+++ b/locales/polish.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/locales/russian.lng b/locales/russian.lng
index 860eb1c4b..9fb4ad25c 100644
--- a/locales/russian.lng
+++ b/locales/russian.lng
@@ -948,3 +948,5 @@
940=Расширенная обработка мест
941=Пакетное добавление фотографий
942=Добавлено {0} фотографий из {1}.
+943=Ссылки на верхний уровень
+944=Удалить ссылку на верхний уровень?
diff --git a/locales/ukrainian.lng b/locales/ukrainian.lng
index b202076d3..122b79e67 100644
--- a/locales/ukrainian.lng
+++ b/locales/ukrainian.lng
@@ -948,3 +948,5 @@
940=Extended locations
941=Photos batch adding
942=Added {0} photos from {1}.
+943=Top level links
+944=Remove top level link?
diff --git a/projects/GKCore/GDModel/GDMLocationRecord.cs b/projects/GKCore/GDModel/GDMLocationRecord.cs
index 640ca3c1d..0b845ee51 100644
--- a/projects/GKCore/GDModel/GDMLocationRecord.cs
+++ b/projects/GKCore/GDModel/GDMLocationRecord.cs
@@ -246,7 +246,7 @@ private static int ElementsCompare(IGDMLocationElement cp1, IGDMLocationElement
{
UDN udn1 = cp1.Date.GetUDN();
UDN udn2 = cp2.Date.GetUDN();
- return -udn1.CompareTo(udn2);
+ return udn1.CompareTo(udn2);
}
}
diff --git a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
index 3bbc508dd..c1a1a7c13 100644
--- a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
@@ -66,6 +66,13 @@ public override void Init(IBaseWindow baseWin)
fView.NotesList.ListModel = new NoteLinksListModel(fView, baseWin, fLocalUndoman);
fView.MediaList.ListModel = new MediaLinksListModel(fView, baseWin, fLocalUndoman);
+
+ fView.NamesList.OnModify += ModifyNamesSheet;
+ }
+
+ private void ModifyNamesSheet(object sender, ModifyEventArgs eArgs)
+ {
+ fView.Name.Text = fLocationRecord.LocationName;
}
public override bool Accept()
@@ -207,7 +214,7 @@ public override void SetLocale()
GetControl("pageHistory").Text = LangMan.LS(LSID.History);
GetControl("pageHistNames").Text = LangMan.LS(LSID.Names);
- GetControl("pageHistLinks").Text = LangMan.LS(LSID.Links);
+ GetControl("pageHistLinks").Text = LangMan.LS(LSID.TopLevelLinks);
}
}
}
diff --git a/projects/GKCore/GKCore/LangMan.cs b/projects/GKCore/GKCore/LangMan.cs
index d9060bc69..280ec012b 100644
--- a/projects/GKCore/GKCore/LangMan.cs
+++ b/projects/GKCore/GKCore/LangMan.cs
@@ -1012,8 +1012,10 @@ public enum LSID
/* 940 */ ExtendedLocations,
/* 941 */ PhotosBatchAdding,
/* 942 */ AddedNPhotos,
+ /* 943 */ TopLevelLinks,
+ /* 944 */ RemoveTopLevelLinkQuery,
- /* 000 */ Last = AddedNPhotos
+ /* 000 */ Last = RemoveTopLevelLinkQuery
}
@@ -1979,6 +1981,8 @@ public static class LangMan
/* 940 */ "Extended locations",
/* 941 */ "Photos batch adding",
/* 942 */ "Added {0} photos from {1}.",
+ /* 943 */ "Top level links",
+ /* 944 */ "Remove top level link?",
};
private static readonly LangManager fLangMan = new LangManager();
diff --git a/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
index dc450ff32..2b213e4d3 100644
--- a/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
+++ b/projects/GKCore/GKCore/Lists/LocationLinksListModel.cs
@@ -105,8 +105,8 @@ public override async Task Modify(object sender, ModifyEventArgs eArgs)
break;
case RecordAction.raDelete:
- if (await AppHost.StdDialogs.ShowQuestion(LangMan.LS(LSID.RemoveNameQuery))) {
- result = fUndoman.DoOrdinaryOperation(OperationType.otLocationNameRemove, dataOwner, locLink);
+ if (await AppHost.StdDialogs.ShowQuestion(LangMan.LS(LSID.RemoveTopLevelLinkQuery))) {
+ result = fUndoman.DoOrdinaryOperation(OperationType.otLocationLinkRemove, dataOwner, locLink);
}
break;
}
diff --git a/projects/GKCore/GKCore/Lists/SheetModel.cs b/projects/GKCore/GKCore/Lists/SheetModel.cs
index 3c9d98d62..e262b83c8 100644
--- a/projects/GKCore/GKCore/Lists/SheetModel.cs
+++ b/projects/GKCore/GKCore/Lists/SheetModel.cs
@@ -99,6 +99,8 @@ public interface ISheetList : IBaseControl
IListView ListView { get; }
bool ReadOnly { get; set; }
+ event ModifyEventHandler OnModify;
+
void UpdateButtons();
void UpdateSheet();
}
diff --git a/samples/RussiaLocations.ged b/samples/RussiaLocations.ged
index b8a91e201..b4c4f4e93 100644
--- a/samples/RussiaLocations.ged
+++ b/samples/RussiaLocations.ged
@@ -7,196 +7,196 @@
2 VERS 5.5.1
2 FORM LINEAGE-LINKED
1 FILE RussiaLocations.ged
-2 _UID DEA202410126A7429E31A402BEC0BD5BDE83
+2 _UID 1FED9A011B5AFA4AAED1C2C28CB076BFD434
2 _REV 2
-1 DATE 02 FEB 2024
-2 TIME 22:33:26.8
+1 DATE 03 FEB 2024
+2 TIME 22:15:42.9
0 @L1@ _LOC
-1 _UID DE3B3AFB328575409467979A1337FA608A63
+1 _UID 259212A7C781634B851B7F4C19FE40CFF7BD
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:29:03.9
-1 NAME Россия
-2 DATE FROM 27 DEC 1991
-1 NAME СССР
-2 DATE FROM 30 DEC 1922 TO 26 DEC 1991
-1 NAME РСФСР
-2 DATE FROM 19 JUL 1918 TO 29 DEC 1922
-1 NAME Российская республика
-2 DATE FROM 01 SEP 1917 TO 18 JUL 1918
-1 NAME Российская империя
-2 DATE FROM 22 OCT 1721 TO 31 AUG 1917
+2 DATE 03 FEB 2024
+3 TIME 22:15:11.7
+1 NAME Русь
+2 DATE FROM 862 TO 1546
1 NAME Российское царство
2 DATE FROM 1547 TO 21 OCT 1721
-1 NAME Россия
-2 DATE FROM 862 TO 1546
+1 NAME Российская империя
+2 DATE FROM 22 OCT 1721 TO 31 AUG 1917
+1 NAME Российская республика
+2 DATE FROM 01 SEP 1917 TO 18 JUL 1918
+1 NAME РСФСР
+2 DATE FROM 19 JUL 1918 TO 29 DEC 1922
+1 NAME СССР
+2 DATE FROM 30 DEC 1922 TO 26 DEC 1991
+1 NAME РФ
+2 DATE FROM 27 DEC 1991
0 @L2@ _LOC
-1 _UID F396573164EA634F99568B584C51F06BDB26
+1 _UID 3BB93C35B72481409409E9D73E7D00A8C189
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 10:06:38.7
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Сибирская губерния
2 DATE FROM 18 DEC 1708 TO 19 JAN 1782
1 _LOC @L1@
2 DATE FROM 18 DEC 1708 TO 19 JAN 1782
0 @L3@ _LOC
-1 _UID DE7CC60EC5ACCA4CA63BA99022CDBB6BE441
+1 _UID E1D3F931207E144EBCC7CED0029D38CBA147
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:29:27.3
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Казанская губерния
-2 DATE FROM 12 DEC 1796 TO 27 MAY 1920
+2 DATE FROM 18 DEC 1708 TO 27 SEP 1781
1 NAME Казанское наместничество
2 DATE FROM 28 SEP 1781 TO 11 DEC 1796
1 NAME Казанская губерния
-2 DATE FROM 18 DEC 1708 TO 27 SEP 1781
+2 DATE FROM 12 DEC 1796 TO 27 MAY 1920
1 _LOC @L1@
2 DATE FROM 18 DEC 1708 TO 27 MAY 1920
0 @L4@ _LOC
-1 _UID 5BAE555596892D488DC9B1E79652BAA07700
+1 _UID A986270E44CD0048BDB302BE8ACDFDD112B2
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:29:43.1
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Нижегородская губерния
-2 DATE FROM 22 OCT 1990 TO 9999
-1 NAME Горьковская область
-2 DATE FROM 05 DEC 1936 TO 21 OCT 1990
-1 NAME Горьковский край
-2 DATE FROM 07 OCT 1932 TO 04 DEC 1936
-1 NAME Нижегородский край
-2 DATE FROM 15 JUL 1929 TO 06 OCT 1932
-1 NAME Нижегородская область
-2 DATE FROM 14 JAN 1929 TO 14 JUL 1929
+2 DATE FROM JAN 1714 TO 1717
1 NAME Нижегородская губерния
-2 DATE FROM 12 DEC 1796 TO 13 JAN 1929
+2 DATE FROM 29 MAY 1719 TO 04 SEP 1779
1 NAME Нижегородское наместничество
2 DATE FROM 05 SEP 1779 TO 11 DEC 1796
1 NAME Нижегородская губерния
-2 DATE FROM 29 MAY 1719 TO 04 SEP 1779
-1 NAME Нижегородская губерния
-2 DATE FROM JAN 1714 TO 1717
+2 DATE FROM 12 DEC 1796 TO 13 JAN 1929
+1 NAME Нижегородская область
+2 DATE FROM 14 JAN 1929 TO 14 JUL 1929
+1 NAME Нижегородский край
+2 DATE FROM 15 JUL 1929 TO 06 OCT 1932
+1 NAME Горьковский край
+2 DATE FROM 07 OCT 1932 TO 04 DEC 1936
+1 NAME Горьковская область
+2 DATE FROM 05 DEC 1936 TO 21 OCT 1990
+1 NAME Нижегородская область
+2 DATE FROM 22 OCT 1990 TO 9999
1 _LOC @L1@
2 DATE FROM JAN 1714 TO 9999
0 @L5@ _LOC
-1 _UID 550B945546B1174788C4D101E390B60BF0E0
+1 _UID 8964C320EC2B1D44B932D8F57216439C6750
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:31:10.4
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Вятская провинция
-2 DATE FROM 05 DEC 1936
-1 NAME Кировский край
-2 DATE FROM 07 DEC 1934 TO 04 DEC 1936
-1 NAME Вятский округ
-2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
-1 NAME Вятская губерния
-2 DATE FROM 31 DEC 1796 TO 14 JUL 1929
+2 DATE FROM 29 MAY 1719 TO 10 SEP 1780
1 NAME Вятское наместничество
2 DATE FROM 11 SEP 1780 TO 30 DEC 1796
-1 NAME Вятская провинция
-2 DATE FROM 29 MAY 1719 TO 10 SEP 1780
+1 NAME Вятская губерния
+2 DATE FROM 31 DEC 1796 TO 14 JUL 1929
+1 NAME Вятский округ
+2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
+1 NAME Кировский край
+2 DATE FROM 07 DEC 1934 TO 04 DEC 1936
+1 NAME Кировская область
+2 DATE FROM 05 DEC 1936
+1 _LOC @L2@
+2 DATE FROM 29 MAY 1719 TO 28 APR 1727
+1 _LOC @L3@
+2 DATE FROM 29 APR 1727 TO 10 SEP 1780
1 _LOC @L1@
-2 DATE FROM 30 JUL 1930 TO 9999
+2 DATE FROM 11 SEP 1780 TO 14 JUL 1929
1 _LOC @L4@
2 DATE FROM 15 JUL 1929 TO 29 JUL 1930
1 _LOC @L1@
-2 DATE FROM 11 SEP 1780 TO 14 JUL 1929
-1 _LOC @L3@
-2 DATE FROM 29 APR 1727 TO 10 SEP 1780
-1 _LOC @L2@
-2 DATE FROM 29 MAY 1719 TO 28 APR 1727
+2 DATE FROM 30 JUL 1930 TO 9999
0 @L6@ _LOC
-1 _UID C5DAF2645DCC9449BCF79EAED432C40ACE12
+1 _UID C91FDF98420D2C40BBEC9C3739880F3599C0
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:31:58.3
-1 NAME Слободской уезд
-2 DATE FROM 10 JUN 1929
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Слободской уезд
-2 DATE FROM 1727 TO 09 JUN 1929
+2 DATE FROM 1646 TO 1719
1 NAME Слободской дистр.
2 DATE FROM 1719 TO 1726
1 NAME Слободской уезд
-2 DATE FROM 1646 TO 1718
+2 DATE FROM 1727 TO 09 JUN 1929
+1 NAME Слободской район
+2 DATE FROM 10 JUN 1929
+1 _LOC @L1@
+2 DATE TO 1718
1 _LOC @L5@
-2 DATE FROM 11 SEP 1780 TO 10 JUN 1929
+2 DATE FROM 1719 TO 1726
1 _LOC @L5@
2 DATE FROM 1727 TO 10 SEP 1780
1 _LOC @L5@
-2 DATE FROM 1719 TO 1726
-1 _LOC @L1@
-2 DATE TO 1718
+2 DATE FROM 11 SEP 1780 TO 10 JUN 1929
0 @L7@ _LOC
-1 _UID C14C218B7645884B90BC82A1B38CB2731AEF
+1 _UID 3C0C6AF12B675743A36858FF1DEE5D3FD8E1
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:32:12
-1 NAME Омутнинский уезд
-2 DATE FROM 10 JUN 1929
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Омутнинский уезд
2 DATE FROM 05 JAN 1921 TO 09 JUN 1929
+1 NAME Омутнинский район
+2 DATE FROM 10 JUN 1929
1 _LOC @L5@
2 DATE FROM 05 JAN 1921 TO 9999
0 @L8@ _LOC
-1 _UID 26C6B9700A12F64D868F8CA838467229D6BF
+1 _UID 3E9F90E7098FEB43828590710C9FBC4FD802
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Верхнекамский район
2 DATE FROM 12 JAN 1965
1 _LOC @L5@
2 DATE FROM 12 JAN 1965 TO 9999
0 @L9@ _LOC
-1 _UID BDB1932A427CCF40828ECBCE4EE08A358EF8
+1 _UID D422B8D7B080B44E85BA559FFEB88DCEFB1E
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Верховская вол.
2 DATE FROM 1720 TO 1764
1 _LOC @L6@
2 DATE FROM 1720 TO 1764
0 @L10@ _LOC
-1 _UID 690AF4DF740C5B42B91140F6FB741A412DEF
+1 _UID 24E4E2FF25ECD9458DA6BCD755509D5D7D1A
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 10:06:38.8
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Лоинская вол.
2 DATE FROM 1802 TO 1884
1 _LOC @L6@
2 DATE FROM 1802 TO 1884
0 @L11@ _LOC
-1 _UID AF8436E4BB271C4DB57887D0CE98BA054115
+1 _UID 32E8C35B9EA92F47A3B41DC2E590E4961A1F
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:32:57.1
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
1 NAME Кирсинская вол.
2 DATE FROM 1884 TO 1926
+1 _LOC @L6@
+2 DATE FROM 1884 TO 1926
1 _LOC @L7@
2 DATE FROM 1926 TO 1926
-1 _LOC @L6@
-2 DATE FROM 1884 TO 1925
0 @L12@ _LOC
-1 _UID E89A71989AD1144D8D0CB48650BE0186BFB0
+1 _UID 0C423E95F3DE0E4EB47D0B21FF8666B349CA
1 CHAN
-2 DATE 02 FEB 2024
-3 TIME 22:33:12.5
-1 NAME д. Колегово
-2 DATE FROM 1927 TO 1978
-1 NAME д. Мокрая Слободка
-2 DATE FROM 1727 TO 1926
+2 DATE 03 FEB 2024
+3 TIME 21:59:10.7
+1 NAME поч. Старое раменье
+2 DATE FROM 1678 TO 1719
1 NAME д. Прислонская
2 DATE FROM 1720 TO 1726
-1 NAME поч. Старое раменье
+1 NAME д. Мокрая Слободка
+2 DATE FROM 1727 TO 1926
+1 NAME д. Колегово
+2 DATE FROM 1927 TO 1978
+1 _LOC @L6@
2 DATE FROM 1678 TO 1719
-1 _LOC @L8@
-2 DATE FROM 1965 TO 9999
-1 _LOC @L7@
-2 DATE FROM 1927 TO 1964
-1 _LOC @L11@
-2 DATE FROM 1884 TO 1926
-1 _LOC @L10@
-2 DATE FROM 1802 TO 1883
1 _LOC @L9@
2 DATE FROM 1720 TO 1801
-1 _LOC @L6@
-2 DATE FROM 1678 TO 1719
+1 _LOC @L10@
+2 DATE FROM 1802 TO 1883
+1 _LOC @L11@
+2 DATE FROM 1884 TO 1926
+1 _LOC @L7@
+2 DATE FROM 1927 TO 1964
+1 _LOC @L8@
+2 DATE FROM 1965 TO 9999
0 TRLR
From ed7944f4ce56273bbf9731a6f50ddd77f2d25be6 Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Sat, 3 Feb 2024 23:41:24 +0300
Subject: [PATCH 07/11] Minor fixes (2)
---
.../Controllers/LocationEditDlgController.cs | 9 +++
.../GEDKeeper2/GKUI/Forms/LocationEditDlg.cs | 11 ++++
.../GEDKeeper3/GKUI/Forms/LocationEditDlg.cs | 12 ++++
samples/RussiaLocations.ged | 66 ++++++++++++++++++-
4 files changed, 96 insertions(+), 2 deletions(-)
diff --git a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
index c1a1a7c13..f3565eea1 100644
--- a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
@@ -75,6 +75,15 @@ private void ModifyNamesSheet(object sender, ModifyEventArgs eArgs)
fView.Name.Text = fLocationRecord.LocationName;
}
+ public void CheckPrimaryName()
+ {
+ if (!string.IsNullOrEmpty(fView.Name.Text) && string.IsNullOrEmpty(fLocationRecord.LocationName)) {
+ // new record
+ fLocationRecord.LocationName = fView.Name.Text;
+ fView.NamesList.UpdateSheet();
+ }
+ }
+
public override bool Accept()
{
try {
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
index 31b9ed851..bfa3964be 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.cs
@@ -98,6 +98,8 @@ public LocationEditDlg(IBaseWindow baseWin)
{
InitializeComponent();
+ tabsData.SelectedIndexChanged += tabsData_SelectedIndexChanged;
+
btnAccept.Image = UIHelper.LoadResourceImage("Resources.btn_accept.gif");
btnCancel.Image = UIHelper.LoadResourceImage("Resources.btn_cancel.gif");
@@ -116,6 +118,15 @@ public LocationEditDlg(IBaseWindow baseWin)
fController.Init(baseWin);
}
+ private void tabsData_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ var tabCtl = (TabControl)sender;
+ var selectedTab = tabCtl.SelectedIndex;
+ if (selectedTab == 1) {
+ fController.CheckPrimaryName();
+ }
+ }
+
private void EditName_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down && e.Control) {
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
index 80f1a5485..1aceb5d97 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
@@ -39,6 +39,7 @@ public sealed partial class LocationEditDlg : CommonDialog
Date: Mon, 5 Feb 2024 21:57:12 +0300
Subject: [PATCH 08/11] Minor fixes (3)
---
projects/GKCore/GDModel/GDMInterfaces.cs | 3 +-
projects/GKCore/GDModel/GDMLocationRecord.cs | 26 ++++++++++-------
projects/GKCore/GDModel/GDMRecord.cs | 7 ++++-
.../LocationLinkEditDlgController.cs | 15 ++++++++--
.../GKCore/Design/Controls/IDateControl.cs | 3 ++
projects/GKCore/GKCore/GKUtils.cs | 2 +-
.../GKTests/GDModel/GDMLocationRecordTests.cs | 28 +++++++++++++++++--
.../Platform/Handlers/DateControlHandler.cs | 9 +++++-
.../Platform/Handlers/DateControlHandler.cs | 9 +++++-
9 files changed, 82 insertions(+), 20 deletions(-)
diff --git a/projects/GKCore/GDModel/GDMInterfaces.cs b/projects/GKCore/GDModel/GDMInterfaces.cs
index 7a9c8efc2..57c4d7360 100644
--- a/projects/GKCore/GDModel/GDMInterfaces.cs
+++ b/projects/GKCore/GDModel/GDMInterfaces.cs
@@ -1,6 +1,6 @@
/*
* "GEDKeeper", the personal genealogical database editor.
- * Copyright (C) 2009-2022 by Sergey V. Zhdanovskih.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
*
* This file is part of "GEDKeeper".
*
@@ -149,6 +149,7 @@ public interface IGDMRecord : IGDMPointerHost, IGDMUIDHolder, IGDMStructWithList
string AutomatedRecordID { get; }
GDMChangeDate ChangeDate { get; }
GDMRecordType RecordType { get; }
+ GDMTree Tree { get; }
}
diff --git a/projects/GKCore/GDModel/GDMLocationRecord.cs b/projects/GKCore/GDModel/GDMLocationRecord.cs
index 0b845ee51..55acb64b2 100644
--- a/projects/GKCore/GDModel/GDMLocationRecord.cs
+++ b/projects/GKCore/GDModel/GDMLocationRecord.cs
@@ -29,20 +29,24 @@ namespace GDModel
public sealed class GDMLocationRecord : GDMRecord
{
private readonly GDMMap fMap;
- private GDMList fNames;
- private GDMList fTopLevels;
+ private readonly GDMList fNames;
+ private readonly GDMList fTopLevels;
public string LocationName
{
- get { return (fNames.Count == 0) ? string.Empty : fNames[0].StringValue; }
+ get {
+ int num = fNames.Count;
+ return (num == 0) ? string.Empty : fNames[num - 1].StringValue;
+ }
set {
GDMLocationName locName;
- if (fNames.Count == 0) {
+ int num = fNames.Count;
+ if (num == 0) {
locName = new GDMLocationName();
fNames.Add(locName);
} else {
- locName = fNames[0];
+ locName = fNames[num - 1];
}
locName.StringValue = value;
}
@@ -127,9 +131,9 @@ public override void ReplaceXRefs(GDMXRefReplacer map)
fTopLevels.ReplaceXRefs(map);
}
- public IList GetFullNames(GDMTree tree)
+ public GDMList GetFullNames(GDMTree tree)
{
- var result = new List();
+ var result = new GDMList();
if (fTopLevels.Count > 0) {
var buffer = new List();
@@ -184,11 +188,13 @@ public IList GetFullNames(GDMTree tree)
return result;
}
- public string GetNameByDate(GDMCustomDate date)
+ public string GetNameByDate(GDMCustomDate date, bool full = false)
{
if (date != null && !date.IsEmpty()) {
- for (int i = 1; i < fNames.Count; i++) {
- var locName = fNames[i];
+ var namesList = !full ? fNames : GetFullNames(Tree);
+
+ for (int i = 0; i < namesList.Count; i++) {
+ var locName = namesList[i];
var interDate = GDMCustomDate.GetIntersection(date, locName.Date.Value);
if (!interDate.IsEmpty()) {
diff --git a/projects/GKCore/GDModel/GDMRecord.cs b/projects/GKCore/GDModel/GDMRecord.cs
index b85ab1cc1..3eee9b693 100644
--- a/projects/GKCore/GDModel/GDMRecord.cs
+++ b/projects/GKCore/GDModel/GDMRecord.cs
@@ -1,6 +1,6 @@
/*
* "GEDKeeper", the personal genealogical database editor.
- * Copyright (C) 2009-2022 by Sergey V. Zhdanovskih.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
*
* This file is part of "GEDKeeper".
*
@@ -126,6 +126,11 @@ public GDMList SourceCitations
}
}
+ public GDMTree Tree
+ {
+ get { return fTree; }
+ }
+
public string UID
{
get {
diff --git a/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
index 8649b40df..22344324e 100644
--- a/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/LocationLinkEditDlgController.cs
@@ -50,6 +50,8 @@ public GDMLocationLink LocationLink
public LocationLinkEditDlgController(ILocationLinkEditDlg view) : base(view)
{
fView.TopLevelText.Activate();
+
+ fView.DateCtl.DateChanged += new EventHandler(OnDateChanged);
}
public override bool Accept()
@@ -79,17 +81,26 @@ public override bool Accept()
public override void UpdateView()
{
fView.DateCtl.FixedDateType = GDMDateType.PeriodBetween;
-
- fView.TopLevelText.Text = (fTempLocation == null) ? "" : fTempLocation.GetNameByDate(fView.DateCtl.Date);
fView.DateCtl.Date = fLocationLink.Date.Value;
+ UpdateLocationName();
}
public async void SetLocation()
{
fTempLocation = await fBase.Context.SelectRecord(fView, GDMRecordType.rtLocation, null) as GDMLocationRecord;
+ UpdateLocationName();
+ }
+
+ public void UpdateLocationName()
+ {
fView.TopLevelText.Text = (fTempLocation == null) ? "" : fTempLocation.GetNameByDate(fView.DateCtl.Date);
}
+ private void OnDateChanged(object sender, EventArgs e)
+ {
+ UpdateLocationName();
+ }
+
public override void SetLocale()
{
fView.Title = LangMan.LS(LSID.Location);
diff --git a/projects/GKCore/GKCore/Design/Controls/IDateControl.cs b/projects/GKCore/GKCore/Design/Controls/IDateControl.cs
index 69b133160..e392d7f7a 100644
--- a/projects/GKCore/GKCore/Design/Controls/IDateControl.cs
+++ b/projects/GKCore/GKCore/Design/Controls/IDateControl.cs
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+using System;
using GDModel;
namespace GKCore.Design.Controls
@@ -30,6 +31,8 @@ public interface IDateControl : IBaseControl
GDMCustomDate Date { get; set; }
GDMDateType FixedDateType { get; set; }
+ event EventHandler DateChanged;
+
void PasteValue(string value);
}
}
diff --git a/projects/GKCore/GKCore/GKUtils.cs b/projects/GKCore/GKCore/GKUtils.cs
index 1edd589bf..9f74667ef 100644
--- a/projects/GKCore/GKCore/GKUtils.cs
+++ b/projects/GKCore/GKCore/GKUtils.cs
@@ -1409,7 +1409,7 @@ public static string GetLocationNameExt(GDMLocationRecord locRec, GDMCustomDate
{
try {
if (GlobalOptions.Instance.ExtendedLocations) {
- return locRec.GetNameByDate(date);
+ return locRec.GetNameByDate(date, true);
} else {
return locRec.LocationName;
}
diff --git a/projects/GKTests/GDModel/GDMLocationRecordTests.cs b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
index 0a0076ceb..1bde2b1cb 100644
--- a/projects/GKTests/GDModel/GDMLocationRecordTests.cs
+++ b/projects/GKTests/GDModel/GDMLocationRecordTests.cs
@@ -136,9 +136,11 @@ public void Test_Names()
public void Test_NamesByDate()
{
using (GDMLocationRecord locRec = new GDMLocationRecord(null)) {
- locRec.LocationName = "РФ, Кировская обл., Верхнекамский р-н, д. Прислонская";
-
var locName = locRec.Names.Add(new GDMLocationName());
+ locName.StringValue = locRec.LocationName = "РФ, Кировская обл., Верхнекамский р-н, д. Прислонская";
+ locName.Date.ParseString("FROM 1765");
+
+ locName = locRec.Names.Add(new GDMLocationName());
locName.StringValue = "Российское царство, Вятка, Слободской уезд, Екатерининского мон. вотч., поч. Старое раменье";
locName.Date.ParseString("FROM 1678 TO 1708");
@@ -154,6 +156,8 @@ public void Test_NamesByDate()
locName.StringValue = "Казанская губ., Вятская пров., Слободской уезд, Верховская вол., д. Мокрая Слободка";
locName.Date.ParseString("FROM 1727 TO 1764");
+ locRec.SortNames();
+
// null date -> default name
Assert.AreEqual("РФ, Кировская обл., Верхнекамский р-н, д. Прислонская", locRec.GetNameByDate(null));
@@ -199,7 +203,7 @@ public void Test_Hierarchy()
locRus.AddLocName("СССР", "FROM 30 DEC 1922 TO 26 DEC 1991");//++
locRus.AddLocName("РФ", "FROM 27 DEC 1991");//++
- IList fullNames = locRus.GetFullNames(tree);
+ var fullNames = locRus.GetFullNames(tree);
string result = string.Join("\n", fullNames.Select(x => string.Format("'{0}': '{1}'", x.Date.ToString(), x.StringValue)));
Assert.AreEqual("'__.__._862 [G] - __.__.1546 [G]': 'Россия'\n" +
"'__.__.1547 [G] - 21.10.1721 [G]': 'Российское царство'\n" +
@@ -357,6 +361,24 @@ public void Test_Hierarchy()
"'12.01.1965 [G] - __.__.1978 [G]': 'д. Колегово, Верхнекамский район, Кировская область, СССР'",
result);
+ var dateVal = new GDMDate();
+
+ // null or empty date
+ Assert.AreEqual("д. Колегово", locPrislon.GetNameByDate(null));
+ Assert.AreEqual("д. Колегово", locPrislon.GetNameByDate(dateVal, true));
+
+ dateVal.ParseString("10 JAN 1701");
+ Assert.AreEqual("поч. Старое раменье, Слободской уезд, Российское царство", locPrislon.GetNameByDate(dateVal, true));
+
+ dateVal.ParseString("1724");
+ Assert.AreEqual("д. Прислонская, Верховская вол., Слободской дистр., Вятская провинция, Сибирская губерния, Российская империя", locPrislon.GetNameByDate(dateVal, true));
+
+ dateVal.ParseString("1834");
+ Assert.AreEqual("д. Мокрая Слободка, Лоинская вол., Слободской уезд, Вятская губерния, Российская империя", locPrislon.GetNameByDate(dateVal, true));
+
+ dateVal.ParseString("1930");
+ Assert.AreEqual("д. Колегово, Омутнинский район, Вятский округ, Нижегородский край, СССР", locPrislon.GetNameByDate(dateVal, true));
+
//var gedcomProvider = new GEDCOMProvider(tree);
//gedcomProvider.SaveToStreamExt(new FileStream("d:\\Russia.ged", FileMode.CreateNew), GEDCOMCharacterSet.csUTF8);
}
diff --git a/projects/GKv2/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs b/projects/GKv2/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
index 399f6a075..9abb3e193 100644
--- a/projects/GKv2/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
+++ b/projects/GKv2/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
@@ -1,6 +1,6 @@
/*
* "GEDKeeper", the personal genealogical database editor.
- * Copyright (C) 2009-2023 by Sergey V. Zhdanovskih.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
*
* This file is part of "GEDKeeper".
*
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+using System;
using GDModel;
using GKCore.Design.Controls;
using GKUI.Components;
@@ -38,6 +39,12 @@ public GDMDateType FixedDateType
set { Control.FixedDateType = value; }
}
+ public event EventHandler DateChanged
+ {
+ add { Control.DateChanged += value; }
+ remove { Control.DateChanged -= value; }
+ }
+
public DateControlHandler(GKDateControl control) : base(control)
{
}
diff --git a/projects/GKv3/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs b/projects/GKv3/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
index 399f6a075..9abb3e193 100644
--- a/projects/GKv3/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
+++ b/projects/GKv3/GKComponents/GKUI/Platform/Handlers/DateControlHandler.cs
@@ -1,6 +1,6 @@
/*
* "GEDKeeper", the personal genealogical database editor.
- * Copyright (C) 2009-2023 by Sergey V. Zhdanovskih.
+ * Copyright (C) 2009-2024 by Sergey V. Zhdanovskih.
*
* This file is part of "GEDKeeper".
*
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+using System;
using GDModel;
using GKCore.Design.Controls;
using GKUI.Components;
@@ -38,6 +39,12 @@ public GDMDateType FixedDateType
set { Control.FixedDateType = value; }
}
+ public event EventHandler DateChanged
+ {
+ add { Control.DateChanged += value; }
+ remove { Control.DateChanged -= value; }
+ }
+
public DateControlHandler(GKDateControl control) : base(control)
{
}
From 4d0cbde05aba765938ef6e747e363daa3fa466f3 Mon Sep 17 00:00:00 2001
From: "Sergey V. Zhdanovskih"
Date: Tue, 6 Feb 2024 00:12:14 +0300
Subject: [PATCH 09/11] Minor fixes (4)
---
.../GKCore/GKCore/Lists/LocationNamesListModel.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs b/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
index c28b67a38..abecfc184 100644
--- a/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
+++ b/projects/GKCore/GKCore/Lists/LocationNamesListModel.cs
@@ -75,12 +75,11 @@ public override void UpdateContents()
}
}
- public override void OnItemSelected(int itemIndex, object rowData)
+ private void UpdateButtons()
{
var actions = AllowedActions;
- itemIndex = fStructList.IndexOf(rowData as GDMLocationName);
- if (itemIndex == 0) {
+ if (fStructList.Count <= 1) {
actions.Exclude(RecordAction.raDelete);
} else {
actions.Include(RecordAction.raDelete);
@@ -89,6 +88,11 @@ public override void OnItemSelected(int itemIndex, object rowData)
AllowedActions = actions;
}
+ public override void OnItemSelected(int itemIndex, object rowData)
+ {
+ UpdateButtons();
+ }
+
public override async Task Modify(object sender, ModifyEventArgs eArgs)
{
var dataOwner = fDataOwner as GDMLocationRecord;
@@ -122,6 +126,8 @@ public override async Task Modify(object sender, ModifyEventArgs eArgs)
}
if (result) {
+ UpdateButtons();
+
if (eArgs.Action == RecordAction.raAdd) {
eArgs.ItemData = locName;
}
From 88d41f8a7333c8d3e9244ace9a9b4e84c949c355 Mon Sep 17 00:00:00 2001
From: "Sergey V. Zhdanovskih"
Date: Tue, 6 Feb 2024 22:50:33 +0300
Subject: [PATCH 10/11] Minor fixes (5)
---
.../Controllers/LocationEditDlgController.cs | 4 +-
projects/GKCore/GKCore/Lists/ListSource.cs | 27 +-
.../GKCore/GKCore/Lists/LocationListModel.cs | 16 +
.../GKUI/Forms/LocationEditDlg.Designer.cs | 594 +++++++++---------
.../GEDKeeper3/GKUI/Forms/LocationEditDlg.cs | 4 +-
.../GKUI/Forms/LocationEditDlg.xeto | 21 +-
.../GKUI/Forms/LocationEditDlg.xaml | 18 +-
samples/RussiaLocations.ged | 540 +++++++++++++++-
8 files changed, 887 insertions(+), 337 deletions(-)
diff --git a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
index f3565eea1..0fc2ae565 100644
--- a/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/LocationEditDlgController.cs
@@ -222,8 +222,8 @@ public override void SetLocale()
fView.GeoCoordsList.AddColumn(LangMan.LS(LSID.Longitude), 80, false);
GetControl("pageHistory").Text = LangMan.LS(LSID.History);
- GetControl("pageHistNames").Text = LangMan.LS(LSID.Names);
- GetControl("pageHistLinks").Text = LangMan.LS(LSID.TopLevelLinks);
+ GetControl("pageHistNames").Text = LangMan.LS(LSID.Names);
+ GetControl("pageHistLinks").Text = LangMan.LS(LSID.TopLevelLinks);
}
}
}
diff --git a/projects/GKCore/GKCore/Lists/ListSource.cs b/projects/GKCore/GKCore/Lists/ListSource.cs
index dadac4343..9d18da1cc 100644
--- a/projects/GKCore/GKCore/Lists/ListSource.cs
+++ b/projects/GKCore/GKCore/Lists/ListSource.cs
@@ -335,24 +335,16 @@ public void AddCondition(byte columnId, ConditionKind condition, string value)
fFilter.Conditions.Add(fltCond);
}
- private bool CheckCondition(FilterCondition fcond)
+ protected bool CheckCondition(FilterCondition fcond, object dataval)
{
bool res = true;
try {
- object dataval;
- try {
- dataval = GetColumnValueEx(fcond.ColumnIndex, -1, false);
- } catch (Exception ex) {
- Logger.WriteError("ListSource.CheckCondition()", ex);
- dataval = null;
- }
-
if (dataval == null)
return true;
int compRes = 0;
- if (fcond.Condition != ConditionKind.ck_Contains) {
+ if (fcond.Condition < ConditionKind.ck_Contains) {
compRes = ((IComparable)dataval).CompareTo(fcond.Value);
}
@@ -397,6 +389,19 @@ private bool CheckCondition(FilterCondition fcond)
return res;
}
+ protected virtual bool CheckCommonCondition(FilterCondition fcond)
+ {
+ object dataval;
+ try {
+ dataval = GetColumnValueEx(fcond.ColumnIndex, -1, false);
+ } catch (Exception ex) {
+ Logger.WriteError("ListSource.CheckCommonCondition()", ex);
+ dataval = null;
+ }
+
+ return CheckCondition(fcond, dataval);
+ }
+
protected bool CheckCommonFilter()
{
bool res = true;
@@ -405,7 +410,7 @@ protected bool CheckCommonFilter()
var conditions = fFilter.Conditions;
for (int i = 0, num = conditions.Count; i < num; i++) {
FilterCondition fcond = conditions[i];
- res = res && CheckCondition(fcond);
+ res = res && CheckCommonCondition(fcond);
if (!res) break;
}
} catch (Exception ex) {
diff --git a/projects/GKCore/GKCore/Lists/LocationListModel.cs b/projects/GKCore/GKCore/Lists/LocationListModel.cs
index 235c8d44e..1ee0827ef 100644
--- a/projects/GKCore/GKCore/Lists/LocationListModel.cs
+++ b/projects/GKCore/GKCore/Lists/LocationListModel.cs
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*/
+using System;
using BSLib;
using GDModel;
using GDModel.Providers.GEDCOM;
@@ -91,6 +92,21 @@ public override bool CheckFilter()
return res;
}
+ protected override bool CheckCommonCondition(FilterCondition fcond)
+ {
+ if ((ColumnType)fcond.ColumnIndex == ColumnType.ctName) {
+ var names = fFetchedRec.Names;
+ for (int i = 0; i < names.Count; i++) {
+ if (CheckCondition(fcond, names[i].StringValue)) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return base.CheckCommonCondition(fcond);
+ }
+ }
+
protected override object GetColumnValueEx(int colType, int colSubtype, bool isVisible)
{
object result = null;
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
index 0be0116ad..e199d06b4 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/LocationEditDlg.Designer.cs
@@ -1,282 +1,256 @@
namespace GKUI.Forms
{
- partial class LocationEditDlg
- {
- private System.Windows.Forms.Button btnAccept;
- private System.Windows.Forms.Button btnCancel;
- private GKUI.Components.GKTabControl tabsData;
- private System.Windows.Forms.TabPage pageNotes;
- private System.Windows.Forms.TabPage pageMultimedia;
- private System.Windows.Forms.TabPage pageCommon;
- private System.Windows.Forms.Label lblName;
- private System.Windows.Forms.TextBox txtName;
- private System.Windows.Forms.Label lblLatitude;
- private System.Windows.Forms.TextBox txtLatitude;
- private System.Windows.Forms.Label lblLongitude;
- private System.Windows.Forms.TextBox txtLongitude;
- private System.Windows.Forms.GroupBox grpSearch;
- private GKUI.Components.GKListView ListGeoCoords;
- private System.Windows.Forms.Button btnSearch;
- private System.Windows.Forms.Button btnSelect;
- private System.Windows.Forms.Button btnSelectName;
- private System.Windows.Forms.Button btnShowOnMap;
- private System.Windows.Forms.Panel panMap;
- private System.Windows.Forms.ColumnHeader ColumnHeader1;
- private System.Windows.Forms.ColumnHeader ColumnHeader2;
- private System.Windows.Forms.ColumnHeader ColumnHeader3;
+ partial class LocationEditDlg
+ {
+ private System.Windows.Forms.Button btnAccept;
+ private System.Windows.Forms.Button btnCancel;
+ private GKUI.Components.GKTabControl tabsData;
+ private System.Windows.Forms.TabPage pageNotes;
+ private System.Windows.Forms.TabPage pageMultimedia;
+ private System.Windows.Forms.TabPage pageCommon;
+ private System.Windows.Forms.Label lblName;
+ private System.Windows.Forms.TextBox txtName;
+ private System.Windows.Forms.Label lblLatitude;
+ private System.Windows.Forms.TextBox txtLatitude;
+ private System.Windows.Forms.Label lblLongitude;
+ private System.Windows.Forms.TextBox txtLongitude;
+ private System.Windows.Forms.GroupBox grpSearch;
+ private GKUI.Components.GKListView ListGeoCoords;
+ private System.Windows.Forms.Button btnSearch;
+ private System.Windows.Forms.Button btnSelect;
+ private System.Windows.Forms.Button btnSelectName;
+ private System.Windows.Forms.Button btnShowOnMap;
+ private System.Windows.Forms.Panel panMap;
+ private System.Windows.Forms.ColumnHeader ColumnHeader1;
+ private System.Windows.Forms.ColumnHeader ColumnHeader2;
+ private System.Windows.Forms.ColumnHeader ColumnHeader3;
private System.Windows.Forms.TabPage pageHistory;
- private GKUI.Components.GKTabControl tabsHistory;
- private System.Windows.Forms.TabPage pageHistNames;
- private System.Windows.Forms.TabPage pageHistLinks;
+ private System.Windows.Forms.TableLayoutPanel tabsHistory;
+ private System.Windows.Forms.GroupBox pageHistNames;
+ private System.Windows.Forms.GroupBox pageHistLinks;
private void InitializeComponent()
- {
- this.btnAccept = new System.Windows.Forms.Button();
- this.btnCancel = new System.Windows.Forms.Button();
- this.tabsData = new GKUI.Components.GKTabControl();
- this.pageCommon = new System.Windows.Forms.TabPage();
- this.lblName = new System.Windows.Forms.Label();
- this.lblLatitude = new System.Windows.Forms.Label();
- this.lblLongitude = new System.Windows.Forms.Label();
- this.txtName = new System.Windows.Forms.TextBox();
- this.txtLatitude = new System.Windows.Forms.TextBox();
- this.txtLongitude = new System.Windows.Forms.TextBox();
- this.grpSearch = new System.Windows.Forms.GroupBox();
- this.ListGeoCoords = new GKUI.Components.GKListView();
- this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader();
- this.ColumnHeader2 = new System.Windows.Forms.ColumnHeader();
- this.ColumnHeader3 = new System.Windows.Forms.ColumnHeader();
- this.btnSearch = new System.Windows.Forms.Button();
- this.btnSelect = new System.Windows.Forms.Button();
- this.btnSelectName = new System.Windows.Forms.Button();
- this.panMap = new System.Windows.Forms.Panel();
- this.btnShowOnMap = new System.Windows.Forms.Button();
- this.pageNotes = new System.Windows.Forms.TabPage();
- this.pageMultimedia = new System.Windows.Forms.TabPage();
+ {
+ this.btnAccept = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.tabsData = new GKUI.Components.GKTabControl();
+ this.pageCommon = new System.Windows.Forms.TabPage();
+ this.lblName = new System.Windows.Forms.Label();
+ this.lblLatitude = new System.Windows.Forms.Label();
+ this.lblLongitude = new System.Windows.Forms.Label();
+ this.txtName = new System.Windows.Forms.TextBox();
+ this.txtLatitude = new System.Windows.Forms.TextBox();
+ this.txtLongitude = new System.Windows.Forms.TextBox();
+ this.grpSearch = new System.Windows.Forms.GroupBox();
+ this.ListGeoCoords = new GKUI.Components.GKListView();
+ this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader();
+ this.ColumnHeader2 = new System.Windows.Forms.ColumnHeader();
+ this.ColumnHeader3 = new System.Windows.Forms.ColumnHeader();
+ this.btnSearch = new System.Windows.Forms.Button();
+ this.btnSelect = new System.Windows.Forms.Button();
+ this.btnSelectName = new System.Windows.Forms.Button();
+ this.panMap = new System.Windows.Forms.Panel();
+ this.btnShowOnMap = new System.Windows.Forms.Button();
+ this.pageNotes = new System.Windows.Forms.TabPage();
+ this.pageMultimedia = new System.Windows.Forms.TabPage();
this.pageHistory = new System.Windows.Forms.TabPage();
- this.tabsHistory = new GKUI.Components.GKTabControl();
- this.pageHistNames = new System.Windows.Forms.TabPage();
- this.pageHistLinks = new System.Windows.Forms.TabPage();
+ this.tabsHistory = new System.Windows.Forms.TableLayoutPanel();
+ this.pageHistNames = new System.Windows.Forms.GroupBox();
+ this.pageHistLinks = new System.Windows.Forms.GroupBox();
this.tabsData.SuspendLayout();
this.tabsHistory.SuspendLayout();
this.pageCommon.SuspendLayout();
- this.grpSearch.SuspendLayout();
- this.SuspendLayout();
- //
- // btnAccept
- //
- this.btnAccept.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.btnAccept.Location = new System.Drawing.Point(538, 534);
- this.btnAccept.Name = "btnAccept";
- this.btnAccept.Size = new System.Drawing.Size(113, 31);
- this.btnAccept.TabIndex = 1;
- this.btnAccept.Text = "btnAccept";
- this.btnAccept.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.btnAccept.Click += new System.EventHandler(this.AcceptClickHandler);
- //
- // btnCancel
- //
- this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.btnCancel.Location = new System.Drawing.Point(661, 534);
- this.btnCancel.Name = "btnCancel";
- this.btnCancel.Size = new System.Drawing.Size(113, 31);
- this.btnCancel.TabIndex = 2;
- this.btnCancel.Text = "btnCancel";
- this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.btnCancel.Click += new System.EventHandler(this.CancelClickHandler);
- //
- // tabsData
- //
- this.tabsData.Controls.Add(this.pageCommon);
+ this.grpSearch.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // btnAccept
+ //
+ this.btnAccept.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnAccept.Location = new System.Drawing.Point(538, 534);
+ this.btnAccept.Name = "btnAccept";
+ this.btnAccept.Size = new System.Drawing.Size(113, 31);
+ this.btnAccept.TabIndex = 1;
+ this.btnAccept.Text = "btnAccept";
+ this.btnAccept.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnAccept.Click += new System.EventHandler(this.AcceptClickHandler);
+ //
+ // btnCancel
+ //
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(661, 534);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(113, 31);
+ this.btnCancel.TabIndex = 2;
+ this.btnCancel.Text = "btnCancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.Click += new System.EventHandler(this.CancelClickHandler);
+ //
+ // tabsData
+ //
+ this.tabsData.Controls.Add(this.pageCommon);
this.tabsData.Controls.Add(this.pageHistory);
this.tabsData.Controls.Add(this.pageNotes);
- this.tabsData.Controls.Add(this.pageMultimedia);
- this.tabsData.Location = new System.Drawing.Point(0, 0);
- this.tabsData.Name = "tabsData";
- this.tabsData.SelectedIndex = 0;
- this.tabsData.Size = new System.Drawing.Size(785, 516);
- this.tabsData.TabIndex = 0;
- //
- // pageCommon
- //
- this.pageCommon.Controls.Add(this.lblName);
- this.pageCommon.Controls.Add(this.lblLatitude);
- this.pageCommon.Controls.Add(this.lblLongitude);
- this.pageCommon.Controls.Add(this.txtName);
- this.pageCommon.Controls.Add(this.txtLatitude);
- this.pageCommon.Controls.Add(this.txtLongitude);
- this.pageCommon.Controls.Add(this.grpSearch);
- this.pageCommon.Controls.Add(this.btnShowOnMap);
- this.pageCommon.Location = new System.Drawing.Point(4, 26);
- this.pageCommon.Name = "pageCommon";
- this.pageCommon.Size = new System.Drawing.Size(777, 486);
- this.pageCommon.TabIndex = 0;
- this.pageCommon.Text = "pageCommon";
- //
- // lblName
- //
- this.lblName.AutoSize = true;
- this.lblName.Location = new System.Drawing.Point(22, 10);
- this.lblName.Name = "lblName";
- this.lblName.Size = new System.Drawing.Size(55, 17);
- this.lblName.TabIndex = 0;
- this.lblName.Text = "lblName";
- //
- // lblLatitude
- //
- this.lblLatitude.AutoSize = true;
- this.lblLatitude.Location = new System.Drawing.Point(402, 10);
- this.lblLatitude.Name = "lblLatitude";
- this.lblLatitude.Size = new System.Drawing.Size(69, 17);
- this.lblLatitude.TabIndex = 2;
- this.lblLatitude.Text = "lblLatitude";
- //
- // lblLongitude
- //
- this.lblLongitude.AutoSize = true;
- this.lblLongitude.Location = new System.Drawing.Point(525, 10);
- this.lblLongitude.Name = "lblLongitude";
- this.lblLongitude.Size = new System.Drawing.Size(81, 17);
- this.lblLongitude.TabIndex = 4;
- this.lblLongitude.Text = "lblLongitude";
- //
- // txtName
- //
- this.txtName.Location = new System.Drawing.Point(22, 29);
- this.txtName.Name = "txtName";
- this.txtName.Size = new System.Drawing.Size(371, 24);
- this.txtName.TabIndex = 1;
- this.txtName.TextChanged += new System.EventHandler(this.EditName_TextChanged);
- this.txtName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EditName_KeyDown);
- //
- // txtLatitude
- //
- this.txtLatitude.Location = new System.Drawing.Point(402, 29);
- this.txtLatitude.Name = "txtLatitude";
- this.txtLatitude.Size = new System.Drawing.Size(113, 24);
- this.txtLatitude.TabIndex = 3;
- //
- // txtLongitude
- //
- this.txtLongitude.Location = new System.Drawing.Point(525, 29);
- this.txtLongitude.Name = "txtLongitude";
- this.txtLongitude.Size = new System.Drawing.Size(113, 24);
- this.txtLongitude.TabIndex = 5;
- //
- // grpSearch
- //
- this.grpSearch.Controls.Add(this.ListGeoCoords);
- this.grpSearch.Controls.Add(this.btnSearch);
- this.grpSearch.Controls.Add(this.btnSelect);
- this.grpSearch.Controls.Add(this.btnSelectName);
- this.grpSearch.Controls.Add(this.panMap);
- this.grpSearch.Location = new System.Drawing.Point(0, 62);
- this.grpSearch.Name = "grpSearch";
- this.grpSearch.Size = new System.Drawing.Size(774, 420);
- this.grpSearch.TabIndex = 7;
- this.grpSearch.TabStop = false;
- this.grpSearch.Text = "grpSearch";
- //
- // ListGeoCoords
- //
- this.ListGeoCoords.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
- this.ColumnHeader1,
- this.ColumnHeader2,
- this.ColumnHeader3});
- this.ListGeoCoords.FullRowSelect = true;
- this.ListGeoCoords.Location = new System.Drawing.Point(22, 19);
- this.ListGeoCoords.Name = "ListGeoCoords";
- this.ListGeoCoords.Size = new System.Drawing.Size(563, 109);
- this.ListGeoCoords.TabIndex = 1;
- this.ListGeoCoords.UseCompatibleStateImageBehavior = false;
- this.ListGeoCoords.View = System.Windows.Forms.View.Details;
- this.ListGeoCoords.Click += new System.EventHandler(this.ListGeoCoords_Click);
- //
- // ColumnHeader1
- //
- this.ColumnHeader1.Text = "Name";
- this.ColumnHeader1.Width = 200;
- //
- // ColumnHeader2
- //
- this.ColumnHeader2.Text = "Latitude";
- this.ColumnHeader2.Width = 80;
- //
- // ColumnHeader3
- //
- this.ColumnHeader3.Text = "Longitude";
- this.ColumnHeader3.Width = 80;
- //
- // btnSearch
- //
- this.btnSearch.Location = new System.Drawing.Point(601, 19);
- this.btnSearch.Name = "btnSearch";
- this.btnSearch.Size = new System.Drawing.Size(147, 31);
- this.btnSearch.TabIndex = 2;
- this.btnSearch.Text = "btnSearch";
- this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
- //
- // btnSelect
- //
- this.btnSelect.Location = new System.Drawing.Point(601, 58);
- this.btnSelect.Name = "btnSelect";
- this.btnSelect.Size = new System.Drawing.Size(147, 31);
- this.btnSelect.TabIndex = 3;
- this.btnSelect.Text = "btnSelect";
- this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
- //
- // btnSelectName
- //
- this.btnSelectName.Location = new System.Drawing.Point(601, 97);
- this.btnSelectName.Name = "btnSelectName";
- this.btnSelectName.Size = new System.Drawing.Size(147, 31);
- this.btnSelectName.TabIndex = 4;
- this.btnSelectName.Text = "btnSelectName";
- this.btnSelectName.Click += new System.EventHandler(this.btnSelectName_Click);
- //
- // panMap
- //
- this.panMap.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
- this.panMap.Location = new System.Drawing.Point(3, 135);
- this.panMap.Name = "panMap";
- this.panMap.Size = new System.Drawing.Size(768, 283);
- this.panMap.TabIndex = 0;
- //
- // btnShowOnMap
- //
- this.btnShowOnMap.Location = new System.Drawing.Point(650, 29);
- this.btnShowOnMap.Name = "btnShowOnMap";
- this.btnShowOnMap.Size = new System.Drawing.Size(98, 26);
- this.btnShowOnMap.TabIndex = 6;
- this.btnShowOnMap.Text = "btnShowOnMap";
- this.btnShowOnMap.Click += new System.EventHandler(this.btnShowOnMap_Click);
+ this.tabsData.Controls.Add(this.pageMultimedia);
+ this.tabsData.Location = new System.Drawing.Point(0, 0);
+ this.tabsData.Name = "tabsData";
+ this.tabsData.SelectedIndex = 0;
+ this.tabsData.Size = new System.Drawing.Size(785, 516);
+ this.tabsData.TabIndex = 0;
//
- // pageHistNames
+ // pageCommon
//
- this.pageHistNames.Location = new System.Drawing.Point(4, 26);
- this.pageHistNames.Name = "pageHistNames";
- this.pageHistNames.Size = new System.Drawing.Size(777, 486);
- this.pageHistNames.TabIndex = 0;
- this.pageHistNames.Text = "pageHistNames";
+ this.pageCommon.Controls.Add(this.lblName);
+ this.pageCommon.Controls.Add(this.lblLatitude);
+ this.pageCommon.Controls.Add(this.lblLongitude);
+ this.pageCommon.Controls.Add(this.txtName);
+ this.pageCommon.Controls.Add(this.txtLatitude);
+ this.pageCommon.Controls.Add(this.txtLongitude);
+ this.pageCommon.Controls.Add(this.grpSearch);
+ this.pageCommon.Controls.Add(this.btnShowOnMap);
+ this.pageCommon.Location = new System.Drawing.Point(4, 26);
+ this.pageCommon.Name = "pageCommon";
+ this.pageCommon.Size = new System.Drawing.Size(777, 486);
+ this.pageCommon.TabIndex = 0;
+ this.pageCommon.Text = "pageCommon";
//
- // pageHistLinks
+ // lblName
//
- this.pageHistLinks.Location = new System.Drawing.Point(4, 26);
- this.pageHistLinks.Name = "pageHistLinks";
- this.pageHistLinks.Size = new System.Drawing.Size(777, 486);
- this.pageHistLinks.TabIndex = 1;
- this.pageHistLinks.Text = "pageHistLinks";
+ this.lblName.AutoSize = true;
+ this.lblName.Location = new System.Drawing.Point(22, 10);
+ this.lblName.Name = "lblName";
+ this.lblName.Size = new System.Drawing.Size(55, 17);
+ this.lblName.TabIndex = 0;
+ this.lblName.Text = "lblName";
//
- // tabsHistory
+ // lblLatitude
//
- this.tabsHistory.Controls.Add(this.pageHistNames);
- this.tabsHistory.Controls.Add(this.pageHistLinks);
- this.tabsHistory.Location = new System.Drawing.Point(0, 0);
- this.tabsHistory.Name = "tabsHistory";
- this.tabsHistory.SelectedIndex = 0;
- this.tabsHistory.Size = new System.Drawing.Size(785, 516);
- this.tabsHistory.TabIndex = 0;
+ this.lblLatitude.AutoSize = true;
+ this.lblLatitude.Location = new System.Drawing.Point(402, 10);
+ this.lblLatitude.Name = "lblLatitude";
+ this.lblLatitude.Size = new System.Drawing.Size(69, 17);
+ this.lblLatitude.TabIndex = 2;
+ this.lblLatitude.Text = "lblLatitude";
+ //
+ // lblLongitude
+ //
+ this.lblLongitude.AutoSize = true;
+ this.lblLongitude.Location = new System.Drawing.Point(525, 10);
+ this.lblLongitude.Name = "lblLongitude";
+ this.lblLongitude.Size = new System.Drawing.Size(81, 17);
+ this.lblLongitude.TabIndex = 4;
+ this.lblLongitude.Text = "lblLongitude";
+ //
+ // txtName
+ //
+ this.txtName.Location = new System.Drawing.Point(22, 29);
+ this.txtName.Name = "txtName";
+ this.txtName.Size = new System.Drawing.Size(371, 24);
+ this.txtName.TabIndex = 1;
+ this.txtName.TextChanged += new System.EventHandler(this.EditName_TextChanged);
+ this.txtName.KeyDown += new System.Windows.Forms.KeyEventHandler(this.EditName_KeyDown);
+ //
+ // txtLatitude
+ //
+ this.txtLatitude.Location = new System.Drawing.Point(402, 29);
+ this.txtLatitude.Name = "txtLatitude";
+ this.txtLatitude.Size = new System.Drawing.Size(113, 24);
+ this.txtLatitude.TabIndex = 3;
+ //
+ // txtLongitude
+ //
+ this.txtLongitude.Location = new System.Drawing.Point(525, 29);
+ this.txtLongitude.Name = "txtLongitude";
+ this.txtLongitude.Size = new System.Drawing.Size(113, 24);
+ this.txtLongitude.TabIndex = 5;
+ //
+ // grpSearch
+ //
+ this.grpSearch.Controls.Add(this.ListGeoCoords);
+ this.grpSearch.Controls.Add(this.btnSearch);
+ this.grpSearch.Controls.Add(this.btnSelect);
+ this.grpSearch.Controls.Add(this.btnSelectName);
+ this.grpSearch.Controls.Add(this.panMap);
+ this.grpSearch.Location = new System.Drawing.Point(0, 62);
+ this.grpSearch.Name = "grpSearch";
+ this.grpSearch.Size = new System.Drawing.Size(774, 420);
+ this.grpSearch.TabIndex = 7;
+ this.grpSearch.TabStop = false;
+ this.grpSearch.Text = "grpSearch";
+ //
+ // ListGeoCoords
+ //
+ this.ListGeoCoords.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
+ this.ColumnHeader1,
+ this.ColumnHeader2,
+ this.ColumnHeader3});
+ this.ListGeoCoords.FullRowSelect = true;
+ this.ListGeoCoords.Location = new System.Drawing.Point(22, 19);
+ this.ListGeoCoords.Name = "ListGeoCoords";
+ this.ListGeoCoords.Size = new System.Drawing.Size(563, 109);
+ this.ListGeoCoords.TabIndex = 1;
+ this.ListGeoCoords.UseCompatibleStateImageBehavior = false;
+ this.ListGeoCoords.View = System.Windows.Forms.View.Details;
+ this.ListGeoCoords.Click += new System.EventHandler(this.ListGeoCoords_Click);
+ //
+ // ColumnHeader1
+ //
+ this.ColumnHeader1.Text = "Name";
+ this.ColumnHeader1.Width = 200;
+ //
+ // ColumnHeader2
+ //
+ this.ColumnHeader2.Text = "Latitude";
+ this.ColumnHeader2.Width = 80;
+ //
+ // ColumnHeader3
+ //
+ this.ColumnHeader3.Text = "Longitude";
+ this.ColumnHeader3.Width = 80;
+ //
+ // btnSearch
+ //
+ this.btnSearch.Location = new System.Drawing.Point(601, 19);
+ this.btnSearch.Name = "btnSearch";
+ this.btnSearch.Size = new System.Drawing.Size(147, 31);
+ this.btnSearch.TabIndex = 2;
+ this.btnSearch.Text = "btnSearch";
+ this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
+ //
+ // btnSelect
+ //
+ this.btnSelect.Location = new System.Drawing.Point(601, 58);
+ this.btnSelect.Name = "btnSelect";
+ this.btnSelect.Size = new System.Drawing.Size(147, 31);
+ this.btnSelect.TabIndex = 3;
+ this.btnSelect.Text = "btnSelect";
+ this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
+ //
+ // btnSelectName
+ //
+ this.btnSelectName.Location = new System.Drawing.Point(601, 97);
+ this.btnSelectName.Name = "btnSelectName";
+ this.btnSelectName.Size = new System.Drawing.Size(147, 31);
+ this.btnSelectName.TabIndex = 4;
+ this.btnSelectName.Text = "btnSelectName";
+ this.btnSelectName.Click += new System.EventHandler(this.btnSelectName_Click);
+ //
+ // panMap
+ //
+ this.panMap.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.panMap.Location = new System.Drawing.Point(3, 135);
+ this.panMap.Name = "panMap";
+ this.panMap.Size = new System.Drawing.Size(768, 283);
+ this.panMap.TabIndex = 0;
+ //
+ // btnShowOnMap
+ //
+ this.btnShowOnMap.Location = new System.Drawing.Point(650, 29);
+ this.btnShowOnMap.Name = "btnShowOnMap";
+ this.btnShowOnMap.Size = new System.Drawing.Size(98, 26);
+ this.btnShowOnMap.TabIndex = 6;
+ this.btnShowOnMap.Text = "btnShowOnMap";
+ this.btnShowOnMap.Click += new System.EventHandler(this.btnShowOnMap_Click);
//
// pageHistory
//
@@ -290,43 +264,73 @@ private void InitializeComponent()
// pageNotes
//
this.pageNotes.Location = new System.Drawing.Point(4, 26);
- this.pageNotes.Name = "pageNotes";
- this.pageNotes.Size = new System.Drawing.Size(777, 486);
- this.pageNotes.TabIndex = 2;
- this.pageNotes.Text = "pageNotes";
- //
- // pageMultimedia
- //
- this.pageMultimedia.Location = new System.Drawing.Point(4, 26);
- this.pageMultimedia.Name = "pageMultimedia";
- this.pageMultimedia.Size = new System.Drawing.Size(777, 486);
- this.pageMultimedia.TabIndex = 3;
- this.pageMultimedia.Text = "pageMultimedia";
+ this.pageNotes.Name = "pageNotes";
+ this.pageNotes.Size = new System.Drawing.Size(777, 486);
+ this.pageNotes.TabIndex = 2;
+ this.pageNotes.Text = "pageNotes";
+ //
+ // pageMultimedia
+ //
+ this.pageMultimedia.Location = new System.Drawing.Point(4, 26);
+ this.pageMultimedia.Name = "pageMultimedia";
+ this.pageMultimedia.Size = new System.Drawing.Size(777, 486);
+ this.pageMultimedia.TabIndex = 3;
+ this.pageMultimedia.Text = "pageMultimedia";
+ //
+ // pageHistNames
+ //
+ this.pageHistNames.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pageHistNames.Location = new System.Drawing.Point(4, 26);
+ this.pageHistNames.Name = "pageHistNames";
+ this.pageHistNames.Size = new System.Drawing.Size(777, 250);
+ this.pageHistNames.TabIndex = 0;
+ this.pageHistNames.Text = "pageHistNames";
+ //
+ // pageHistLinks
+ //
+ this.pageHistLinks.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pageHistLinks.Location = new System.Drawing.Point(4, 26);
+ this.pageHistLinks.Name = "pageHistLinks";
+ this.pageHistLinks.Size = new System.Drawing.Size(777, 250);
+ this.pageHistLinks.TabIndex = 1;
+ this.pageHistLinks.Text = "pageHistLinks";
+ //
+ // tabsHistory
+ //
+ this.tabsHistory.Controls.Add(this.pageHistNames, 0, 0);
+ this.tabsHistory.Controls.Add(this.pageHistLinks, 0, 1);
+ this.tabsHistory.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50));
+ this.tabsHistory.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50));
+ this.tabsHistory.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tabsHistory.Location = new System.Drawing.Point(0, 0);
+ this.tabsHistory.Name = "tabsHistory";
+ this.tabsHistory.Size = new System.Drawing.Size(785, 516);
+ this.tabsHistory.TabIndex = 0;
//
// LocationEditDlg
//
this.AcceptButton = this.btnAccept;
- this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
- this.CancelButton = this.btnCancel;
- this.ClientSize = new System.Drawing.Size(784, 578);
- this.Controls.Add(this.tabsData);
- this.Controls.Add(this.btnAccept);
- this.Controls.Add(this.btnCancel);
- this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
- this.MaximizeBox = false;
- this.MinimizeBox = false;
- this.Name = "LocationEditDlg";
- this.ShowInTaskbar = false;
- this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
- this.Text = "LocationEditDlg";
+ this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(784, 578);
+ this.Controls.Add(this.tabsData);
+ this.Controls.Add(this.btnAccept);
+ this.Controls.Add(this.btnCancel);
+ this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "LocationEditDlg";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "LocationEditDlg";
this.tabsHistory.ResumeLayout(false);
this.tabsData.ResumeLayout(false);
- this.pageCommon.ResumeLayout(false);
- this.pageCommon.PerformLayout();
- this.grpSearch.ResumeLayout(false);
- this.ResumeLayout(false);
- }
- }
+ this.pageCommon.ResumeLayout(false);
+ this.pageCommon.PerformLayout();
+ this.grpSearch.ResumeLayout(false);
+ this.ResumeLayout(false);
+ }
+ }
}
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
index 1aceb5d97..fd0ccfec6 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/LocationEditDlg.cs
@@ -60,8 +60,8 @@ public sealed partial class LocationEditDlg : CommonDialog
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
index 3008cd449..0f60873dd 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/LocationEditDlg.xaml
@@ -47,16 +47,14 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
diff --git a/samples/RussiaLocations.ged b/samples/RussiaLocations.ged
index ed9f19f5b..2cb13ffaa 100644
--- a/samples/RussiaLocations.ged
+++ b/samples/RussiaLocations.ged
@@ -8,9 +8,9 @@
2 FORM LINEAGE-LINKED
1 FILE RussiaLocations.ged
2 _UID 1FED9A011B5AFA4AAED1C2C28CB076BFD434
-2 _REV 8
-1 DATE 03 FEB 2024
-2 TIME 23:10:00.4
+2 _REV 24
+1 DATE 06 FEB 2024
+2 TIME 20:58:12.9
0 @L1@ _LOC
1 _UID 259212A7C781634B851B7F4C19FE40CFF7BD
1 CHAN
@@ -177,15 +177,15 @@
0 @L12@ _LOC
1 _UID 0C423E95F3DE0E4EB47D0B21FF8666B349CA
1 CHAN
-2 DATE 03 FEB 2024
-3 TIME 21:59:10.7
-1 NAME поч. Старое раменье
+2 DATE 06 FEB 2024
+3 TIME 00:22:13.4
+1 NAME Старое раменье поч.
2 DATE FROM 1678 TO 1719
-1 NAME д. Прислонская
+1 NAME Прислонская д.
2 DATE FROM 1720 TO 1726
-1 NAME д. Мокрая Слободка
+1 NAME Мокрая Слободка д.
2 DATE FROM 1727 TO 1926
-1 NAME д. Колегово
+1 NAME Колегово д.
2 DATE FROM 1927 TO 1978
1 _LOC @L6@
2 DATE FROM 1678 TO 1719
@@ -261,4 +261,526 @@
2 DATE FROM 15 JUL 1919 TO 02 NOV 1923
1 _LOC @L14@
2 DATE FROM 03 NOV 1923 TO 30 JUL 1930
+0 @L16@ _LOC
+1 _UID DF70190CB963D04D8174DE1DCB424307F4B4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:18:37.1
+1 NAME Архангельская губерния
+0 @L18@ _LOC
+1 _UID E86CA4E9BA504B409993827382B325D0C14A
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:14:35.5
+1 NAME Або-Бьёрнеборгская губерния
+2 DATE FROM 1811 TO 1997
+1 _LOC @L93@
+2 DATE FROM 1811 TO 1917
+0 @L19@ _LOC
+1 _UID 4B3EF66CD3CC6947A74230E33E39C2B928F8
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:19:35.1
+1 NAME Астраханская губерния
+0 @L20@ _LOC
+1 _UID E40E1BA37A0A1A408C5151562BA0C4F2936E
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:19:48.5
+1 NAME Бакинская губерния
+0 @L21@ _LOC
+1 _UID 813D710D4D748D49B03A8F421D27F21DE1C9
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:19:56.5
+1 NAME Бессарабская губерния
+0 @L22@ _LOC
+1 _UID 81CF1E6A91A4594B9EC5224883C49508623D
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:13:42.8
+1 NAME Вазаская губерния
+2 DATE FROM 1809 TO 1997
+1 _LOC @L93@
+2 DATE FROM 1809 TO 1917
+0 @L23@ _LOC
+1 _UID 15E689AE24AB764CBC174948693CF3440390
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:12:25.2
+1 NAME Варшавская губерния
+2 DATE FROM 1837 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1837 TO 1917
+0 @L24@ _LOC
+1 _UID 68E2FAF6BFAE82499793FD5DFBAA0407A670
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:20:23.7
+1 NAME Виленская губерния
+0 @L25@ _LOC
+1 _UID F215652E50DE974888D7AFECB09F29657E1A
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:20:35.4
+1 NAME Витебская губерния
+0 @L26@ _LOC
+1 _UID E4A97FD9079B3044B2FCDE0E0FE11CB45518
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:20:48.1
+1 NAME Владимирская губерния
+0 @L27@ _LOC
+1 _UID 48C2974CB8E17E488A4573677F35AD398FD1
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:21:07.2
+1 NAME Вологодская губерния
+0 @L28@ _LOC
+1 _UID 74E55FEBED50C64ABE3840D14D25BFD5FDB1
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:22:43.2
+1 NAME Волынская губерния
+0 @L29@ _LOC
+1 _UID D314543EA7D0DC46BC0BE6C5EB1F5FF8E515
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:22:54.7
+1 NAME Воронежская губерния
+0 @L30@ _LOC
+1 _UID 83C1283460DE9347A89EE72DEAEEC6E7975C
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:11:40.2
+1 NAME Выборгская губерния
+2 DATE FROM 1744 TO 1917
+1 _LOC @L93@
+2 DATE FROM 1744
+0 @L31@ _LOC
+1 _UID 9022A74317CD3747A173DFDB68B2E96B3AB0
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:23:51.5
+1 NAME Гродненская губерния
+0 @L32@ _LOC
+1 _UID E3C71D2619B52147B38725C22A09DCB80B3D
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:25:10.7
+1 NAME Екатеринославская губерния
+0 @L33@ _LOC
+1 _UID 784C668EC9F84743B51915A061CED5C65046
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:25:27.3
+1 NAME Елизаветпольская губерния
+0 @L34@ _LOC
+1 _UID 204936E6FD04204CB6E7AD0A3AD8E2FF3951
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:26:54.3
+1 NAME Енисейская губерния
+0 @L35@ _LOC
+1 _UID 5FA9EEA326ED954296E2843F01A572A87EED
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:27:06.8
+1 NAME Иркутская губерния
+0 @L36@ _LOC
+1 _UID 150494032AF14C45BBFF685B7B0EAD9EAD99
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:07:49.4
+1 NAME Калишская губерния
+2 DATE FROM 1837 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1837 TO 1917
+0 @L37@ _LOC
+1 _UID 51F58AB684929648A6784C424859A0AF16B3
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:27:34.3
+1 NAME Калужская губерния
+0 @L38@ _LOC
+1 _UID A1F658A0B72E7249916CF3F12F22FCEE4BE8
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:07:12.5
+1 NAME Келецкая губерния
+2 DATE FROM 1842 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1842 TO 1917
+0 @L39@ _LOC
+1 _UID 1F2952B795675B42A8AFF1A1F6966E03D0B4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:27:55.8
+1 NAME Киевская губерния
+0 @L40@ _LOC
+1 _UID 9C49FA2B4A139B4D854624E043CD9C7F4962
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:28:05.5
+1 NAME Ковенская губерния
+0 @L41@ _LOC
+1 _UID 4F72132B3877A944965D1B072DC2D3259757
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:28:17.1
+1 NAME Костромская губерния
+0 @L42@ _LOC
+1 _UID 021BAB30384FFC41961FEFF3AA79D4C00A02
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:28:27.4
+1 NAME Курляндская губерния
+0 @L43@ _LOC
+1 _UID 7AEF73B72D4ED24CA153D5C5D0D392BBAA48
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:06:08.1
+1 NAME Куопиоская губерния
+2 DATE FROM 1831 TO 1997
+1 _LOC @L93@
+2 DATE FROM 1831 TO 1997
+0 @L44@ _LOC
+1 _UID 08555F2E03D44545BD02489B98F8D8287D2F
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:28:53.8
+1 NAME Курская губерния
+0 @L45@ _LOC
+1 _UID 834407ECDA6D6042B609C34E309AC82D32D5
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:29:05.7
+1 NAME Кутаисская губерния
+0 @L46@ _LOC
+1 _UID 7ABF5EDBBB308346A87EF6AAC1AEDC094013
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:29:14.8
+1 NAME Лифляндская губерния
+0 @L47@ _LOC
+1 _UID 3C0C6F47E884F441BE0D0DBE68B6903316E2
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:04:44
+1 NAME Ломжинская губерния
+2 DATE FROM 1867 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1867 TO 1917
+0 @L48@ _LOC
+1 _UID C4BBDA51FE480C46B593D7D6295004F5A9A2
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:04:17.2
+1 NAME Люблинская губерния
+2 DATE FROM 1837 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1837 TO 1917
+0 @L49@ _LOC
+1 _UID 4326E9A5AE4BCA4E9D3C7B12ADC61F8F8F27
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:29:44.5
+1 NAME Минская губерния
+0 @L50@ _LOC
+1 _UID EFFBAD09EEBBC64D815663994ADBA2A99F89
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:29:54.2
+1 NAME Могилёвская губерния
+0 @L51@ _LOC
+1 _UID B0A22330B3EA2E499CDA8D14B6B3FF40785E
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:30:04
+1 NAME Московская губерния
+0 @L52@ _LOC
+1 _UID 614888BE93FCCE48879BAD779DCB60D779EC
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:30:26.6
+1 NAME Новгородская губерния
+0 @L53@ _LOC
+1 _UID B1E120DC00E49247A2F4ABD60CE266893F41
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:03:35.1
+1 NAME Нюландская губерния
+2 DATE FROM 1831 TO 1917
+1 _LOC @L93@
+2 DATE FROM 1831 TO 1917
+0 @L54@ _LOC
+1 _UID F59D93713DC02F4592347FECC73209B2ECB1
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:30:47
+1 NAME Олонецкая губерния
+0 @L55@ _LOC
+1 _UID 868AD62D9EFBE544B016C54BA1804E324CFB
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:30:56.7
+1 NAME Оренбургская губерния
+0 @L56@ _LOC
+1 _UID 5FBEC756774A1D4DB0E0E41FACD1B596C0A1
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:31:07.3
+1 NAME Орловская губерния
+0 @L57@ _LOC
+1 _UID F84CF13A233C2F42A9F351F08ADEC4EC342D
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:31:17.3
+1 NAME Пензенская губерния
+0 @L58@ _LOC
+1 _UID E5053D013D463D4BA9F8B095CFFD5EFD40E6
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:01:48.3
+1 NAME Петроковская губерния
+2 DATE FROM 1867 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1867 TO 1917
+0 @L59@ _LOC
+1 _UID C9149787B1A3FA4180CCEA8C01260ACE4B57
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 01:00:45.8
+1 NAME Плоцкая губерния
+2 DATE FROM 1837 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1837 TO 1917
+0 @L60@ _LOC
+1 _UID B7246B200D4380419F337FCC66ECBF22C71B
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:31:58.6
+1 NAME Подольская губерния
+0 @L61@ _LOC
+1 _UID C881A880F493404C974EDD55E6E96D6138EB
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:32:08.3
+1 NAME Полтавская губерния
+0 @L62@ _LOC
+1 _UID FDCE58794A217C448A7109C870213A09671B
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:32:19.7
+1 NAME Псковская губерния
+0 @L63@ _LOC
+1 _UID 28F3F98E4B6B9544A25304A7A9FE2F24CBB4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:59:53.5
+1 NAME Радомская губерния
+2 DATE FROM 1844 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1844 TO 1917
+0 @L64@ _LOC
+1 _UID F21B1A9CDAD7B14083D5751F678925B61C27
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:32:39.8
+1 NAME Рязанская губерния
+0 @L65@ _LOC
+1 _UID A0FCA9E416DBF041B837D197537DD995E0D4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:32:54.6
+1 NAME Самарская губерния
+0 @L66@ _LOC
+1 _UID 7E213CE8C97E4C4A9A936B5043AC9A6C7DDE
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:58:48.8
+1 NAME Санкт-Михельская губерния
+2 DATE FROM 1831 TO 1997
+1 _LOC @L93@
+2 DATE FROM 1831 TO 1997
+0 @L67@ _LOC
+1 _UID 4BDEBC52E2926740898B35EB14C391776564
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:33:16.9
+1 NAME Санкт-Петербургская губерния
+0 @L68@ _LOC
+1 _UID 8888403D853E5A4ABEB7C278F13AA244B4E4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:33:25.6
+1 NAME Саратовская губерния
+0 @L69@ _LOC
+1 _UID 8D794E2391969B4CBE53C85139BD984885F7
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:57:13.1
+1 NAME Седлецкая губерния
+2 DATE FROM 1867 TO 1912
+1 _LOC @L92@
+2 DATE FROM 1867 TO 1912
+0 @L70@ _LOC
+1 _UID EFBF054507A1664588FA5F043ABEC3DAC576
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:33:44.7
+1 NAME Симбирская губерния
+0 @L71@ _LOC
+1 _UID FE7FA68194256743BB7DAC3486F9ABE62F68
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:33:53.6
+1 NAME Смоленская губерния
+0 @L72@ _LOC
+1 _UID 4F4C5CAEB1BB7247B57E0CE4CBBA66906816
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:34:08.3
+1 NAME Ставропольская губерния
+0 @L73@ _LOC
+1 _UID D1BA42E80CFC99469ED5D78327218B7EBA1D
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:55:39
+1 NAME Сувалкская губерния
+2 DATE FROM 1867 TO 1917
+1 _LOC @L92@
+2 DATE FROM 1867 TO 1917
+0 @L74@ _LOC
+1 _UID 3C91F5EA499B8E419E9870F9D14FAD3803C9
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 20:58:09.3
+1 NAME Тавастгусская губерния
+2 DATE FROM 1831 TO 1917
+1 _LOC @L93@
+2 DATE FROM 1831 TO 1997
+0 @L75@ _LOC
+1 _UID 1F657BEFE4E0B64FA9E01A157F871B710190
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:34:41.4
+1 NAME Таврическая губерния
+0 @L76@ _LOC
+1 _UID B921FD62170A4743976C36019D711C0E56F4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:34:51.2
+1 NAME Тамбовская губерния
+0 @L77@ _LOC
+1 _UID EB684C69AE6348489F9FF633EBFC9861F04B
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:35:01.7
+1 NAME Тверская губерния
+0 @L78@ _LOC
+1 _UID 48ACFC1FBAA47F48BE9AF077E25A14B1F4B9
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:35:12.8
+1 NAME Тифлисская губерния
+0 @L79@ _LOC
+1 _UID 9577F1316F10CD46B81B54E1B7A7AC491B9C
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:35:21.5
+1 NAME Тобольская губерния
+0 @L80@ _LOC
+1 _UID 3D15CB69EB827145BF5087E45FEE6EECCABF
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:35:40.4
+1 NAME Томская губерния
+0 @L81@ _LOC
+1 _UID A5BE19893796D640820B871B9A7B47D346AF
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:35:50.3
+1 NAME Тульская губерния
+0 @L82@ _LOC
+1 _UID 48B4EC9E41C7B5438ADF6CC2F644ED8BCFC4
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:52:48.7
+1 NAME Улеаборгская губерния
+2 DATE FROM 1775 TO 2009
+1 _LOC @L93@
+2 DATE FROM 1775 TO 2009
+0 @L83@ _LOC
+1 _UID FBC50D089165504D8443E43D3AB5877E4462
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:36:10.2
+1 NAME Уфимская губерния
+0 @L84@ _LOC
+1 _UID 82B009755C189A4DB13144C9527834F6EE62
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:36:20.6
+1 NAME Харьковская губерния
+0 @L85@ _LOC
+1 _UID 3AE680F964F1254CB4631DD137E1FFF16C6E
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:36:30.7
+1 NAME Херсонская губерния
+0 @L86@ _LOC
+1 _UID 744F91B7D9EE7E4082E195E57B6A2CD2502E
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:36:42.5
+1 NAME Холмская губерния
+0 @L87@ _LOC
+1 _UID 1A44954260A54F4E8A0F063A23B9E53CAD43
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:36:52.6
+1 NAME Черниговская губерния
+0 @L88@ _LOC
+1 _UID 71ACB6DCC21E7148A981D27EE88B486FEC09
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:37:02.8
+1 NAME Черноморская губерния
+0 @L89@ _LOC
+1 _UID 2E6DCAFA18554B489B4B0BEEF5E880D46F6B
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:37:12.7
+1 NAME Эриванская губерния
+0 @L90@ _LOC
+1 _UID 7AFB01148C35D049A7D60B03050D6EEB5A54
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:37:22.8
+1 NAME Эстляндская губерния
+0 @L91@ _LOC
+1 _UID BAAC08C4C1045E46980ED894DDC0F8F93B25
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:37:31.7
+1 NAME Ярославская губерния
+0 @L92@ _LOC
+1 _UID 4C45D37F8C30D949B31FD645E5A66A2ED1C9
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:47:02.8
+1 NAME Царство Польское
+2 DATE FROM 03 MAY 1815 TO OCT 1918
+1 _LOC @L1@
+2 DATE FROM FEB 1813 TO 1915
+0 @L93@ _LOC
+1 _UID 08D56D9B85E8B047B01BE7BFFF01FD9E555C
+1 CHAN
+2 DATE 06 FEB 2024
+3 TIME 00:50:50.6
+1 NAME Финляндия
+2 DATE FROM 1775
+1 _LOC @L1@
+2 DATE FROM 05 SEP 1809 TO 1918
0 TRLR
From 1b953493b3b41ad29ea4116f32d5f985ba0b3290 Mon Sep 17 00:00:00 2001
From: "Serg V. Zhdanovskih (Norseman)"
Date: Sun, 11 Feb 2024 22:38:43 +0300
Subject: [PATCH 11/11] Minor fixes (6)
---
locales/help_enu/gkhHistory.html | 1 +
locales/help_rus/gkhHistory.html | 1 +
locales/help_rus/gkhOptions.html | 4 ++
locales/help_rus/gkhRec_Place.html | 41 ++++++++++++++++++
locales/help_rus/images/dlgLocHistSample.png | Bin 0 -> 25939 bytes
locales/help_rus/images/dlgLocHistory.png | Bin 0 -> 12770 bytes
locales/help_rus/images/dlgLocLink.png | Bin 0 -> 4127 bytes
locales/help_rus/images/dlgLocName.png | Bin 0 -> 4026 bytes
.../Controllers/EventEditDlgController.cs | 15 ++++---
projects/GKCore/GKCore/GKUtils.cs | 3 +-
.../GKCore/GKCore/Lists/EventsListModel.cs | 2 +-
projects/GKCore/GKCore/SysUtils.cs | 21 +--------
.../GKUI/Forms/EventEditDlg.Designer.cs | 1 -
.../GEDKeeper2/GKUI/Forms/EventEditDlg.cs | 5 ---
.../GKUI/Components/GKDateControl.cs | 1 -
.../GEDKeeper3/GKUI/Forms/EventEditDlg.cs | 5 ---
.../GEDKeeper3/GKUI/Forms/EventEditDlg.xeto | 2 +-
.../GKUI/Components/GKDateControl.cs | 1 -
.../GKUI/Components/GKDateControl.cs | 1 -
.../GEDKeeperX/GKUI/Forms/EventEditDlg.xaml | 2 +-
.../GKUI/Forms/EventEditDlg.xaml.cs | 5 ---
21 files changed, 62 insertions(+), 49 deletions(-)
create mode 100644 locales/help_rus/images/dlgLocHistSample.png
create mode 100644 locales/help_rus/images/dlgLocHistory.png
create mode 100644 locales/help_rus/images/dlgLocLink.png
create mode 100644 locales/help_rus/images/dlgLocName.png
diff --git a/locales/help_enu/gkhHistory.html b/locales/help_enu/gkhHistory.html
index 3c3358ad6..72916b433 100644
--- a/locales/help_enu/gkhHistory.html
+++ b/locales/help_enu/gkhHistory.html
@@ -12,6 +12,7 @@ Change log
??.??.2024 [v2.29.0 & v3.5.0]
+
+
+
+ Данный диалог предназначен для ввода и управления историческими сведениями о месте: привязками названий мест и ссылок на верхние уровни
+ иерархии административно-территориального деления к периоду действия. Т.е. если определенный нас.пункт на протяжении истории несколько раз менял своё название -
+ в данном диалоге можно ввести все названия и указать в какие интервалы времени они действовали. Если некая деревня или город в разные периоды входили в разные
+ волости или районы - это можно ввести в нижней секции диалога - "Ссылки на верхние уровни".
+
+
+ Возможно использование различных подходов к ведению справочника мест:
+ не использовать исторические привязки имен и иерархию;
+ использовать только одноуровневую модель: в список имен вводятся длинные полные имена, от самого нижнего уровня - до верхнего (или наоборот), и их периоды;
+ использовать полную многоуровневую модель: в имя вводится только непосредственная часть (название города или волости, или губернии, и т.д.), прочие части
+ распределяются по уровням, каждое конкретное место получает собственную запись, со своими названиями и ссылками на верхние уровни.
+
+
+
+ Внимание: при включении опции "Настройки \ Особое \ Расширенная обработка мест" и подключении иерархически организованных мест к датам в диалоге редактирования событий -
+ места начинают автоматически подстраиваться при изменении даты (определяется полное длинное название места в конкретную дату события). Также этот механизм будет работать
+ при использовании инструмента управления местами и на этапе верификации загружаемых файлов.
+
+
+
+
+
+ Диалог предназначен для редактирования названия места и его периода действия. Например: "Вятское наместничество", период действия названия с 11/09/1780 по 30/12/1796.
+
+
+
+
+
+ Диалог предназначен для редактирования ссылки на запись места более высокого уровня и периода подчинения. Например, "Вятская провинция/наместничество" входила
+ в "Сибирская губерния" с 29/05/1719 по 28/04/1727 и в "Казанская губерния" с 29/04/1727 по 10/09/1780.
+
+
+
+
+ Пример полного заполнения истории:
+
+
+
Также смотрите: События/факты , Заметки , Мультимедиа-материалы ,
diff --git a/locales/help_rus/images/dlgLocHistSample.png b/locales/help_rus/images/dlgLocHistSample.png
new file mode 100644
index 0000000000000000000000000000000000000000..b07752a420e559648dec0ce5b3c920b320106e69
GIT binary patch
literal 25939
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
PoMEXbXvo*dnuq@zYYyh#
literal 0
HcmV?d00001
diff --git a/locales/help_rus/images/dlgLocHistory.png b/locales/help_rus/images/dlgLocHistory.png
new file mode 100644
index 0000000000000000000000000000000000000000..52a95d1fe227d45d187979bb79882ff0c74a925b
GIT binary patch
literal 12770
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
Gx%m$+F$tsq
literal 0
HcmV?d00001
diff --git a/locales/help_rus/images/dlgLocName.png b/locales/help_rus/images/dlgLocName.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cb7ed7856b414d34893ccc13dff2709b0e20b6c
GIT binary patch
literal 4026
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
Bvi1M~
literal 0
HcmV?d00001
diff --git a/projects/GKCore/GKCore/Controllers/EventEditDlgController.cs b/projects/GKCore/GKCore/Controllers/EventEditDlgController.cs
index 879bb581d..ff0ecc9fa 100644
--- a/projects/GKCore/GKCore/Controllers/EventEditDlgController.cs
+++ b/projects/GKCore/GKCore/Controllers/EventEditDlgController.cs
@@ -57,6 +57,7 @@ public EventEditDlgController(IEventEditDlg view) : base(view)
{
fTempLocation = null;
fView.EventType.Activate();
+ fView.Date.DateChanged += new EventHandler(dateCtl_DateChanged);
}
public override void Init(IBaseWindow baseWin)
@@ -166,19 +167,19 @@ public override void UpdateView()
fView.Agency.Text = fEvent.Agency;
fTempLocation = fBase.Context.Tree.GetPtrValue(fEvent.Place.Location);
- UpdatePlace();
+ UpdatePlace(true);
fView.NotesList.UpdateSheet();
fView.MediaList.UpdateSheet();
fView.SourcesList.UpdateSheet();
}
- private void UpdatePlace()
+ private void UpdatePlace(bool forced)
{
if (fTempLocation != null) {
fView.Place.Text = GKUtils.GetLocationNameExt(fTempLocation, fView.Date.Date);
SetLocationMode(true);
- } else {
+ } else if (forced) {
fView.Place.Text = fEvent.Place.StringValue;
SetLocationMode(false);
}
@@ -202,13 +203,13 @@ private void SetLocationMode(bool active)
public async void AddPlace()
{
fTempLocation = await fBase.Context.SelectRecord(fView, GDMRecordType.rtLocation, new object[] { fView.Place.Text }) as GDMLocationRecord;
- UpdatePlace();
+ UpdatePlace(true);
}
public void RemovePlace()
{
fTempLocation = null;
- UpdatePlace();
+ UpdatePlace(true);
}
public async void ModifyAddress()
@@ -282,9 +283,9 @@ public void SendData(string signature, string data)
}
}
- public void OnDateChanged()
+ private void dateCtl_DateChanged(object sender, System.EventArgs e)
{
- UpdatePlace();
+ UpdatePlace(false);
}
public override void SetLocale()
diff --git a/projects/GKCore/GKCore/GKUtils.cs b/projects/GKCore/GKCore/GKUtils.cs
index 9f74667ef..2105e10fa 100644
--- a/projects/GKCore/GKCore/GKUtils.cs
+++ b/projects/GKCore/GKCore/GKUtils.cs
@@ -736,7 +736,8 @@ public static string GetEventDesc(GDMTree tree, GDMCustomEvent evt, bool hyperLi
if (evt == null)
throw new ArgumentNullException("evt");
- string dt = GEDCOMEventToDateStr(evt, GlobalOptions.Instance.DefDateFormat, false);
+ var globOpts = GlobalOptions.Instance;
+ string dt = GEDCOMEventToDateStr(evt, globOpts.DefDateFormat, globOpts.ShowDatesSign);
string place = string.Empty;
if (evt.HasPlace) {
diff --git a/projects/GKCore/GKCore/Lists/EventsListModel.cs b/projects/GKCore/GKCore/Lists/EventsListModel.cs
index 271309da0..a145e5ded 100644
--- a/projects/GKCore/GKCore/Lists/EventsListModel.cs
+++ b/projects/GKCore/GKCore/Lists/EventsListModel.cs
@@ -44,7 +44,7 @@ public EventsListModel(IView owner, IBaseWindow baseWin, ChangeTracker undoman,
fListColumns.AddColumn(LSID.NumberSym, 25, false);
fListColumns.AddColumn(LSID.Event, 90, false);
- fListColumns.AddColumn(LSID.Date, 80, false);
+ fListColumns.AddColumn(LSID.Date, 90, false);
if (!fPersonsMode) {
fListColumns.AddColumn(LSID.Place, 200, false);
} else {
diff --git a/projects/GKCore/GKCore/SysUtils.cs b/projects/GKCore/GKCore/SysUtils.cs
index 3120f1d8a..2d440f6e0 100644
--- a/projects/GKCore/GKCore/SysUtils.cs
+++ b/projects/GKCore/GKCore/SysUtils.cs
@@ -25,6 +25,7 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
+using System.Text.RegularExpressions;
using BSLib;
namespace GKCore
@@ -337,25 +338,7 @@ public static OSType GetOSType()
public static string StripHTML(string source)
{
- char[] array = new char[source.Length];
- int arrayIndex = 0;
- bool inside = false;
- for (int i = 0; i < source.Length; i++) {
- char let = source[i];
- if (let == '<') {
- inside = true;
- continue;
- }
- if (let == '>') {
- inside = false;
- continue;
- }
- if (!inside) {
- array[arrayIndex] = let;
- arrayIndex++;
- }
- }
- return new string(array, 0, arrayIndex);
+ return source == null ? string.Empty : Regex.Replace(source, "<.*?>", string.Empty);
}
public static void Shuffle(this T[] array)
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.Designer.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.Designer.cs
index d6fe6ba1e..40529fb83 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.Designer.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.Designer.cs
@@ -121,7 +121,6 @@ private void InitializeComponent()
this.dateCtl.Name = "dateCtl";
this.dateCtl.Size = new System.Drawing.Size(474, 63);
this.dateCtl.TabIndex = 10;
- this.dateCtl.DateChanged += new System.EventHandler(this.dateCtl_DateChanged);
//
// lblEvent
//
diff --git a/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.cs b/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.cs
index 8a885f43c..b5b8a8f67 100644
--- a/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.cs
+++ b/projects/GKv2/GEDKeeper2/GKUI/Forms/EventEditDlg.cs
@@ -152,10 +152,5 @@ public void SendData(string signature, string data)
{
fController.SendData(signature, data);
}
-
- private void dateCtl_DateChanged(object sender, System.EventArgs e)
- {
- fController.OnDateChanged();
- }
}
}
diff --git a/projects/GKv2/GKComponents/GKUI/Components/GKDateControl.cs b/projects/GKv2/GKComponents/GKUI/Components/GKDateControl.cs
index 37c3bc63f..a7f5b875f 100644
--- a/projects/GKv2/GKComponents/GKUI/Components/GKDateControl.cs
+++ b/projects/GKv2/GKComponents/GKUI/Components/GKDateControl.cs
@@ -297,7 +297,6 @@ private void SetDate(GDMCustomDate date)
cmbDateType.SelectedIndex = (int)fFixedDateType;
cmbDateType.Enabled = false;
} else {
- cmbDateType.SelectedIndex = 0;
cmbDateType.Enabled = true;
}
}
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.cs b/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.cs
index e88d8a046..faa3be082 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.cs
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.cs
@@ -173,10 +173,5 @@ public void SendData(string signature, string data)
{
fController.SendData(signature, data);
}
-
- private void dateCtl_DateChanged(object sender, System.EventArgs e)
- {
- fController.OnDateChanged();
- }
}
}
diff --git a/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.xeto b/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.xeto
index f32360bfe..9e55613a9 100644
--- a/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.xeto
+++ b/projects/GKv3/GEDKeeper3/GKUI/Forms/EventEditDlg.xeto
@@ -36,7 +36,7 @@
-
+
diff --git a/projects/GKv3/GKComponents/GKUI/Components/GKDateControl.cs b/projects/GKv3/GKComponents/GKUI/Components/GKDateControl.cs
index d7d5cd0bd..37483445e 100644
--- a/projects/GKv3/GKComponents/GKUI/Components/GKDateControl.cs
+++ b/projects/GKv3/GKComponents/GKUI/Components/GKDateControl.cs
@@ -258,7 +258,6 @@ private void SetDate(GDMCustomDate date)
cmbDateType.SelectedIndex = (int)fFixedDateType;
cmbDateType.Enabled = false;
} else {
- cmbDateType.SelectedIndex = 0;
cmbDateType.Enabled = true;
}
}
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Components/GKDateControl.cs b/projects/GKvX/GEDKeeperX/GKUI/Components/GKDateControl.cs
index 6ff31da22..5c8985baa 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Components/GKDateControl.cs
+++ b/projects/GKvX/GEDKeeperX/GKUI/Components/GKDateControl.cs
@@ -247,7 +247,6 @@ private void SetDate(GDMCustomDate date)
cmbDateType.SelectedIndex = (int)fFixedDateType;
cmbDateType.IsEnabled = false;
} else {
- cmbDateType.SelectedIndex = 0;
cmbDateType.IsEnabled = true;
}
}
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml b/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml
index 1dbf35b05..bee3c9ead 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml
@@ -49,7 +49,7 @@
-
+
diff --git a/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml.cs b/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml.cs
index 6e205c1bb..2c6f81f82 100644
--- a/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml.cs
+++ b/projects/GKvX/GEDKeeperX/GKUI/Forms/EventEditDlg.xaml.cs
@@ -128,10 +128,5 @@ public void SendData(string signature, string data)
{
fController.SendData(signature, data);
}
-
- private void dateCtl_DateChanged(object sender, System.EventArgs e)
- {
- fController.OnDateChanged();
- }
}
}