PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/Main/SharpMap.Wpf/LayersListView.cs

#
C# | 347 lines | 267 code | 62 blank | 18 comment | 32 complexity | 93e37b4dd879b065b4fb7276578095e0 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Input;
  9. using Microsoft.Win32;
  10. using SharpMap.Layers;
  11. using SharpMap.Presentation;
  12. using SharpMap.Presentation.Views;
  13. using SharpMap.Presentation.Wpf;
  14. namespace SharpMap.Wpf
  15. {
  16. /// <summary>
  17. /// Presents list of layers in the Map which can be set explicity through
  18. /// the Map property,
  19. /// or through DataContext
  20. /// </summary>
  21. public class LayersListView : ListView, ILayersView
  22. //TODO: the Command handeling should be moved to the LayerListViewModel
  23. {
  24. static LayersListView()
  25. {
  26. DefaultStyleKeyProperty.OverrideMetadata(typeof(LayersListView), new FrameworkPropertyMetadata(typeof(LayersListView)));
  27. DataContextProperty.OverrideMetadata(typeof(LayersListView),
  28. new FrameworkPropertyMetadata(DataContextPropertyChanged));
  29. }
  30. static void DataContextPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
  31. {
  32. LayersListView This = target as LayersListView;
  33. if (This != null)
  34. {
  35. LayerListViewModel llvm = e.NewValue as LayerListViewModel;
  36. if (llvm != null)
  37. {
  38. return;
  39. }
  40. SharpMap.Map map = e.NewValue as SharpMap.Map;
  41. if(map != null)
  42. {
  43. This.Map = map; //there will be created LayerListViewModel
  44. //and will be set as the data context
  45. }
  46. }
  47. }
  48. public LayersListView()
  49. {
  50. WireUpBindings();
  51. WireUpCommandBinding();
  52. }
  53. private void WireUpCommandBinding()
  54. {
  55. CommandBinding cb = new CommandBinding(MapViewCommands.ShowOpenLayerDialog,
  56. OpenLayerHadler, canExecuteOpenDialog);
  57. CommandBindings.Add(cb);
  58. cb = new CommandBinding(LayerCommands.BringForward,moveUpHandler,canExecuteBringFarward);
  59. CommandBindings.Add(cb);
  60. cb = new CommandBinding(LayerCommands.SendBackward, moveDownHandler, canExecuteSendBackward);
  61. CommandBindings.Add(cb);
  62. }
  63. private void WireUpBindings()
  64. {
  65. Binding b = new Binding("Layers");
  66. b.Mode = BindingMode.OneWay;
  67. SetBinding(ItemsSourceProperty, b);
  68. //b = new Binding("Map");
  69. //b.Mode = BindingMode.OneWay;
  70. //SetBinding(MapProperty, b);
  71. }
  72. public static readonly DependencyProperty MapProperty =
  73. DependencyProperty.Register("Map", typeof(SharpMap.Map), typeof(LayersListView)
  74. , new FrameworkPropertyMetadata(default(SharpMap.Map),mapPropertyChanged));
  75. public SharpMap.Map Map
  76. {
  77. get { return (SharpMap.Map)GetValue(MapProperty); }
  78. set { SetValue(MapProperty, value); }
  79. }
  80. static void mapPropertyChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
  81. {
  82. LayersListView This = target as LayersListView;
  83. SharpMap.Map map = e.NewValue as SharpMap.Map;
  84. if (This != null && map != null)
  85. {
  86. This._presenter = new LayerListViewModel(map, This);
  87. This.DataContext = This._presenter;
  88. }
  89. }
  90. protected override void OnSelectionChanged(SelectionChangedEventArgs e)
  91. {
  92. base.OnSelectionChanged(e);
  93. if (e.AddedItems.Count != 0)
  94. {
  95. var layerNames = from SharpMap.Layers.ILayer item in e.AddedItems
  96. select item.LayerName;
  97. onRequestLayersSelectionChanged(layerNames, LayerAction.Selected);
  98. }
  99. if (e.RemovedItems.Count != 0)
  100. {
  101. var layerNames = from SharpMap.Layers.ILayer item in e.RemovedItems
  102. select item.LayerName;
  103. onRequestLayersSelectionChanged(layerNames, LayerAction.Deselected);
  104. }
  105. }
  106. #region ILayersView Members
  107. IBindingList ILayersView.Layers
  108. {
  109. set { throw new NotImplementedException(); }
  110. }
  111. IList<String> ILayersView.SelectedLayers
  112. {
  113. get { throw new NotImplementedException(); }
  114. set { throw new NotImplementedException(); }
  115. }
  116. public void DisableLayer(String layer)
  117. {
  118. onRequestLayerEnableChanged(layer, LayerAction.Disabled);
  119. }
  120. public void EnableLayer(String layer)
  121. {
  122. onRequestLayerEnableChanged(layer, LayerAction.Enabled);
  123. }
  124. public event EventHandler<LayerActionEventArgs> LayersSelectionChangeRequested;
  125. public event EventHandler<LayerActionEventArgs> LayersEnabledChangeRequested;
  126. #endregion
  127. #region IView Members
  128. public System.Boolean Visible
  129. {
  130. get
  131. {
  132. return this.Visibility == Visibility.Visible;
  133. }
  134. set
  135. {
  136. this.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
  137. }
  138. }
  139. public System.Boolean Enabled
  140. {
  141. get
  142. {
  143. return IsEnabled;
  144. }
  145. set
  146. {
  147. IsEnabled = value;
  148. }
  149. }
  150. public void Hide()
  151. {
  152. Visibility = Visibility.Collapsed;
  153. }
  154. public void Show()
  155. {
  156. Visibility = Visibility.Visible;
  157. }
  158. public String Title
  159. {
  160. get
  161. {
  162. throw new Exception("The method or operation is not implemented.");
  163. }
  164. set
  165. {
  166. throw new Exception("The method or operation is not implemented.");
  167. }
  168. }
  169. #endregion
  170. #region event invokers
  171. void onRequestLayersSelectionChanged(IEnumerable<string> layers, LayerAction action)
  172. {
  173. EventHandler<LayerActionEventArgs> handler = LayersSelectionChangeRequested;
  174. if (handler != null)
  175. {
  176. LayerActionEventArgs args = new LayerActionEventArgs(layers, action);
  177. handler(this, args);
  178. }
  179. }
  180. void onRequestLayerEnableChanged(string name, LayerAction action)
  181. {
  182. EventHandler<LayerActionEventArgs> handler = LayersEnabledChangeRequested;
  183. if (handler != null)
  184. {
  185. LayerActionEventArgs args = new LayerActionEventArgs(name, action);
  186. handler(this, args);
  187. }
  188. }
  189. #endregion
  190. void OpenLayerHadler(object sender, RoutedEventArgs e)
  191. {
  192. OpenFileDialog dlg = new OpenFileDialog();
  193. dlg.DefaultExt = ".shp";
  194. dlg.Filter = "Shape Files (.shp)|*.shp";
  195. dlg.Multiselect = true;
  196. Nullable<System.Boolean> result = dlg.ShowDialog();
  197. foreach (String fileName in dlg.FileNames)
  198. {
  199. GeometryLayer l = LoadLayer(fileName, null);
  200. l.DataSource.Open();
  201. Map.AddLayer(l);
  202. }
  203. }
  204. void RemoveLayerHandler(object sender, RoutedEventArgs e)
  205. {
  206. if (SelectedLayer != null)
  207. {
  208. //m_mapControl.Map.RemoveLayer((ILayer)_layerList.SelectedItem);
  209. SelectedLayer.DataSource.Close();
  210. Map.Layers.Remove(SelectedLayer);
  211. }
  212. }
  213. void moveUpHandler(object sender, RoutedEventArgs e)
  214. {
  215. if (SelectedLayer != null)
  216. {
  217. int selectedIndex = Map.Layers.IndexOf(SelectedLayer);
  218. ILayer layerToMove = SelectedLayer;
  219. //m_mapControl.Map.RemoveLayer((ILayer)_layerList.SelectedItem);
  220. //((ILayer)_layerList.SelectedItem).DataSource.Close();
  221. Map.Layers.RaiseListChangedEvents = false;
  222. Map.Layers.Remove(layerToMove);
  223. Map.Layers.Insert(selectedIndex - 1, layerToMove);
  224. //_layerList.SelectedItem = selectedIndex - 1;
  225. Map.Layers.RaiseListChangedEvents = true;
  226. Map.Layers.ResetBindings();
  227. }
  228. }
  229. void moveDownHandler(object sender, RoutedEventArgs e)
  230. {
  231. //////////////////////////////////////////////
  232. if (SelectedLayer != null)
  233. {
  234. int selectedIndex = Map.Layers.IndexOf(SelectedLayer);
  235. ILayer layerToMove = SelectedLayer;
  236. //int rowIndex = (ILayer) _layerList.SelectedItems[0].
  237. Map.DeselectLayers(new int[] { selectedIndex });
  238. Map.RemoveLayer(layerToMove);
  239. //((ILayer)_layerList.SelectedItem).DataSource.Close();
  240. if (selectedIndex < Map.Layers.Count)
  241. {
  242. Map.Layers.Insert(selectedIndex + 1, layerToMove);
  243. }
  244. else
  245. {
  246. Map.Layers.Add(layerToMove);
  247. }
  248. //_layerList.SelectedItem = (selectedIndex + 1);
  249. }
  250. }
  251. private SharpMap.Layers.GeometryLayer LoadLayer(String fileName, string givenLayerName)
  252. {
  253. SharpMap.Data.Providers.ShapeFile.ShapeFileProvider shapFile =
  254. new SharpMap.Data.Providers.ShapeFile.ShapeFileProvider(fileName);
  255. String layerName = givenLayerName ?? fileName.Substring(fileName.LastIndexOf('\\') + 1);
  256. SharpMap.Layers.GeometryLayer layer = new SharpMap.Layers.GeometryLayer(layerName, shapFile);
  257. return layer;
  258. }
  259. void canExecuteOpenDialog(Object sender, CanExecuteRoutedEventArgs e)
  260. {
  261. e.CanExecute = Map != null;
  262. }
  263. void canExecuteRemove(Object sender, CanExecuteRoutedEventArgs e)
  264. {
  265. e.CanExecute = (SelectedItem != null && Items.Count >= 1);
  266. }
  267. void canExecuteBringFarward(Object sender, CanExecuteRoutedEventArgs e)
  268. {
  269. e.CanExecute = (SelectedItem != null &&
  270. SelectedIndex > 0);
  271. }
  272. void canExecuteSendBackward(Object sender, CanExecuteRoutedEventArgs e)
  273. {
  274. e.CanExecute = (SelectedItem != null &&
  275. SelectedIndex < Items.Count - 1);
  276. }
  277. ILayer SelectedLayer
  278. {
  279. get { return SelectedItem as ILayer; }
  280. }
  281. #region fields
  282. private LayerListViewModel _presenter;
  283. #endregion //fields
  284. }
  285. }