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