1 /*
2  *  "GEDKeeper", the personal genealogical database editor.
3  *  Copyright (C) 2009-2021 by Sergey V. Zhdanovskih.
4  *
5  *  This file is part of "GEDKeeper".
6  *
7  *  This program is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 using System;
22 using System.Globalization;
23 using System.Windows.Forms;
24 using BSLib.Design.Handlers;
25 using BSLib.Design.MVP.Controls;
26 using GDModel;
27 using GKCore;
28 using GKCore.Controllers;
29 using GKCore.Interfaces;
30 using GKCore.MVP.Controls;
31 using GKCore.MVP.Views;
32 using GKMap;
33 using GKMap.MapObjects;
34 using GKMap.MapProviders;
35 using GKMap.WinForms;
36 using GKUI.Components;
37 
38 namespace GKUI.Forms
39 {
40     public sealed partial class MapsViewerWin : CommonWindow, IMapsViewerWin
41     {
42         private readonly MapsViewerWinController fController;
43 
44         private readonly GKMapBrowser fMapBrowser;
45 
46         #region View Interface
47 
48         IMapBrowser IMapsViewerWin.MapBrowser
49         {
50             get { return fMapBrowser; }
51         }
52 
53         IComboBox IMapsViewerWin.PersonsCombo
54         {
55             get { return GetControlHandler<IComboBox>(cmbPersons); }
56         }
57 
58         ITreeView IMapsViewerWin.PlacesTree
59         {
60             get { return GetControlHandler<ITreeView>(tvPlaces); }
61         }
62 
63         IButton IMapsViewerWin.SelectPlacesBtn
64         {
65             get { return GetControlHandler<IButton>(btnSelectPlaces); }
66         }
67 
68         ICheckBox IMapsViewerWin.BirthCheck
69         {
70             get { return GetControlHandler<ICheckBox>(chkBirth); }
71         }
72 
73         ICheckBox IMapsViewerWin.DeathCheck
74         {
75             get { return GetControlHandler<ICheckBox>(chkDeath); }
76         }
77 
78         ICheckBox IMapsViewerWin.ResidenceCheck
79         {
80             get { return GetControlHandler<ICheckBox>(chkResidence); }
81         }
82 
83         ICheckBox IMapsViewerWin.LinesVisibleCheck
84         {
85             get { return GetControlHandler<ICheckBox>(chkLinesVisible); }
86         }
87 
88         IRadioButton IMapsViewerWin.TotalRadio
89         {
90             get { return GetControlHandler<IRadioButton>(radTotal); }
91         }
92 
93         IRadioButton IMapsViewerWin.SelectedRadio
94         {
95             get { return GetControlHandler<IRadioButton>(radSelected); }
96         }
97 
98         #endregion
99 
radTotal_Click(object sender, EventArgs e)100         private void radTotal_Click(object sender, EventArgs e)
101         {
102             chkBirth.Enabled = radTotal.Checked;
103             chkDeath.Enabled = radTotal.Checked;
104             chkResidence.Enabled = radTotal.Checked;
105             cmbPersons.Enabled = radSelected.Checked;
106 
107             if (radTotal.Checked) {
108                 chkLinesVisible.Checked = false;
109             }
110             chkLinesVisible.Enabled = radSelected.Checked;
111         }
112 
MapsViewerWin_KeyDown(object sender, KeyEventArgs e)113         private void MapsViewerWin_KeyDown(object sender, KeyEventArgs e)
114         {
115             if (e.KeyCode == Keys.Escape) Close();
116         }
117 
tbSaveSnapshot_Click(object sender, EventArgs e)118         private void tbSaveSnapshot_Click(object sender, EventArgs e)
119         {
120             fController.SaveSnapshot();
121         }
122 
btnSelectPlaces_Click(object sender, EventArgs e)123         private void btnSelectPlaces_Click(object sender, EventArgs e)
124         {
125             fController.SelectPlaces();
126         }
127 
TreePlaces_DoubleClick(object sender, EventArgs e)128         private void TreePlaces_DoubleClick(object sender, EventArgs e)
129         {
130             fController.SetCenter();
131         }
132 
OnLoad(EventArgs e)133         protected override void OnLoad(EventArgs e)
134         {
135             base.OnLoad(e);
136             Activate();
137         }
138 
MapsViewerWin(IBaseWindow baseWin)139         public MapsViewerWin(IBaseWindow baseWin)
140         {
141             InitializeComponent();
142 
143             tbSaveSnapshot.Image = UIHelper.LoadResourceImage("Resources.btn_save_image.gif");
144 
145             UIHelper.FixToolStrip(ToolBar1);
146 
147             fMapBrowser = new GKMapBrowser();
148             fMapBrowser.Dock = DockStyle.Fill;
149             panClient.Controls.Add(this.fMapBrowser, 0, 0);
150 
151             fController = new MapsViewerWinController(this, baseWin.GetContentList(GDMRecordType.rtIndividual));
152             fController.Init(baseWin);
153 
154             radTotal.Checked = true;
155             radTotal_Click(null, null);
156 
157             PopulateContextMenus();
158 
159             SetLocale();
160 
161             if (!GMapControl.IsDesignerHosted) {
162                 fMapBrowser.MapControl.OnMapTypeChanged += MainMap_OnMapTypeChanged;
163                 fMapBrowser.MapControl.OnMapZoomChanged += MainMap_OnMapZoomChanged;
164 
165                 // get zoom
166                 trkZoom.Minimum = fMapBrowser.MapControl.MinZoom * 100;
167                 trkZoom.Maximum = fMapBrowser.MapControl.MaxZoom * 100;
168                 trkZoom.TickFrequency = 100;
169 
170                 if (fMapBrowser.MapControl.Zoom >= fMapBrowser.MapControl.MinZoom && fMapBrowser.MapControl.Zoom <= fMapBrowser.MapControl.MaxZoom) {
171                     trkZoom.Value = (int)fMapBrowser.MapControl.Zoom * 100;
172                 }
173 
174                 // get position
175                 txtLat.Text = fMapBrowser.MapControl.Position.Lat.ToString(CultureInfo.InvariantCulture);
176                 txtLng.Text = fMapBrowser.MapControl.Position.Lng.ToString(CultureInfo.InvariantCulture);
177             }
178         }
179 
PopulateContextMenus()180         private void PopulateContextMenus()
181         {
182             var providers = GMapProviders.List;
183             foreach (var prv in providers) {
184                 UIHelper.AddToolStripItem(MenuProviders, prv.Name, prv, miProviderX_Click);
185             }
186         }
187 
miProviderX_Click(object sender, EventArgs e)188         private void miProviderX_Click(object sender, EventArgs e)
189         {
190             var provider = UIHelper.GetMenuItemTag<GMapProvider>(MenuProviders, sender);
191             fMapBrowser.MapControl.MapProvider = provider;
192         }
193 
SetLocale()194         public override void SetLocale()
195         {
196             Title = LangMan.LS(LSID.LSID_MIMap);
197             pagePlaces.Text = LangMan.LS(LSID.LSID_RPLocations);
198             grpSelection.Text = LangMan.LS(LSID.LSID_MapSelection);
199             radTotal.Text = LangMan.LS(LSID.LSID_MapSelOnAll);
200             chkBirth.Text = LangMan.LS(LSID.LSID_MSBirthPlaces);
201             chkDeath.Text = LangMan.LS(LSID.LSID_MSDeathPlaces);
202             chkResidence.Text = LangMan.LS(LSID.LSID_MSResiPlace);
203             radSelected.Text = LangMan.LS(LSID.LSID_MapSelOnSelected);
204             //btnSaveImage.Text = LangMan.LS(LSID.LSID_SaveImage);
205             btnSelectPlaces.Text = LangMan.LS(LSID.LSID_Show);
206             chkLinesVisible.Text = LangMan.LS(LSID.LSID_LinesVisible);
207 
208             SetToolTip(tbSaveSnapshot, LangMan.LS(LSID.LSID_ImageSaveTip));
209 
210             tbLoadPlaces.Text = LangMan.LS(LSID.LSID_LoadPlaces);
211             tbProviders.Text = LangMan.LS(LSID.LSID_Providers);
212             pageCoordinates.Text = LangMan.LS(LSID.LSID_Coordinates);
213             tbClear.Text = LangMan.LS(LSID.LSID_Clear);
214             btnSearch.Text = LangMan.LS(LSID.LSID_Search);
215         }
216 
FindTreeNode(string place)217         public ITVNode FindTreeNode(string place)
218         {
219             TreeNodeEx rootNode = fController.TreeRoot as TreeNodeEx;
220 
221             int num = rootNode.Nodes.Count;
222             for (int i = 0; i < num; i++) {
223                 TreeNodeEx node = rootNode.Nodes[i] as TreeNodeEx;
224 
225                 if (node != null && node.Text == place) {
226                     return node;
227                 }
228             }
229 
230             return null;
231         }
232 
tbLoadPlaces_Click(object sender, EventArgs e)233         private void tbLoadPlaces_Click(object sender, EventArgs e)
234         {
235             fController.LoadPlaces();
236         }
237 
tbClear_Click(object sender, EventArgs e)238         private void tbClear_Click(object sender, EventArgs e)
239         {
240             fMapBrowser.Objects.Clear();
241         }
242 
tbZoomCenter_Click(object sender, EventArgs e)243         private void tbZoomCenter_Click(object sender, EventArgs e)
244         {
245             fMapBrowser.MapControl.ZoomAndCenterMarkers("objects");
246         }
247 
btnSearch_Click(object sender, EventArgs e)248         private void btnSearch_Click(object sender, EventArgs e)
249         {
250             try {
251                 double lat = double.Parse(txtLat.Text, CultureInfo.InvariantCulture);
252                 double lng = double.Parse(txtLng.Text, CultureInfo.InvariantCulture);
253 
254                 fMapBrowser.MapControl.Position = new PointLatLng(lat, lng);
255             } catch (Exception ex) {
256                 MessageBox.Show("incorrect coordinate format: " + ex.Message);
257             }
258         }
259 
txtPlace_KeyPress(object sender, KeyPressEventArgs e)260         private void txtPlace_KeyPress(object sender, KeyPressEventArgs e)
261         {
262             if ((Keys)e.KeyChar == Keys.Enter) {
263                 GeocoderStatusCode status = fMapBrowser.MapControl.SetPositionByKeywords(txtPlace.Text);
264                 if (status != GeocoderStatusCode.Success) {
265                     MessageBox.Show("Geocoder can't find: '" + txtPlace.Text + "', reason: " + status, @"GKMap", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
266                 }
267             }
268         }
269 
MainMap_OnMapTypeChanged(GMapProvider type)270         private void MainMap_OnMapTypeChanged(GMapProvider type)
271         {
272             //cmbMapType.SelectedItem = type;
273             trkZoom.Minimum = fMapBrowser.MapControl.MinZoom * 100;
274             trkZoom.Maximum = fMapBrowser.MapControl.MaxZoom * 100;
275             fMapBrowser.MapControl.ZoomAndCenterMarkers("objects");
276         }
277 
MainMap_OnMapZoomChanged()278         private void MainMap_OnMapZoomChanged()
279         {
280             trkZoom.Value = (int)(fMapBrowser.MapControl.Zoom * 100.0);
281         }
282 
trkZoom_ValueChanged(object sender, EventArgs e)283         private void trkZoom_ValueChanged(object sender, EventArgs e)
284         {
285             fMapBrowser.MapControl.Zoom = (int)Math.Floor(trkZoom.Value / 100.0);
286         }
287 
btnZoomUp_Click(object sender, EventArgs e)288         private void btnZoomUp_Click(object sender, EventArgs e)
289         {
290             fMapBrowser.MapControl.Zoom = ((int)fMapBrowser.MapControl.Zoom) + 1;
291         }
292 
btnZoomDown_Click(object sender, EventArgs e)293         private void btnZoomDown_Click(object sender, EventArgs e)
294         {
295             fMapBrowser.MapControl.Zoom = ((int)(fMapBrowser.MapControl.Zoom + 0.99)) - 1;
296         }
297 
btnAddRouteMarker_Click(object sender, EventArgs e)298         private void btnAddRouteMarker_Click(object sender, EventArgs e)
299         {
300             fMapBrowser.AddMarker(fMapBrowser.TargetPosition, GMarkerIconType.blue_small, MarkerTooltipMode.OnMouseOver, "");
301             fMapBrowser.GenerateRoute();
302         }
303 
btnAddPolygonMarker_Click(object sender, EventArgs e)304         private void btnAddPolygonMarker_Click(object sender, EventArgs e)
305         {
306             fMapBrowser.AddMarker(fMapBrowser.TargetPosition, GMarkerIconType.purple_small, MarkerTooltipMode.OnMouseOver, "");
307             fMapBrowser.GeneratePolygon();
308         }
309     }
310 }
311